┌───────────────┐ │ ...
تم الإنشاء في: ٩ أغسطس ٢٠٢٦
تم الإنشاء في: ٩ أغسطس ٢٠٢٦
text┌───────────────┐ │ │ │ x │ │ ↓
x ──→ Conv ──→ ReLU ──→ Conv ──→ (+) ──→ 输出
│ ↑
└──────────────────────────────┘
Shortcut
如何理解这些中间参数?
你画的是一个ResNet 残差块(Residual Block),里面最容易让人困惑的就是那些"中间参数"到底是什么。其实可以从数据流和**参数(权重)**两个角度来理解。
先把你的图写成数学形式:
text输入 x │ ├───────────────┐ │ │ ▼ │ Conv1 │ │ │ ReLU │ │ │ Conv2 │ ▼ │ F(x) │ │ │ └─────── + ─────┘ │ x + F(x) │ 输出
这里的 x 不是一个数字。
它通常是一个 Feature Map(特征图)。
例如:
text输入图片 224×224×3
经过前几层网络之后,可能变成
textx 56×56×64
也就是说:
x = 一个 56×56×64 的张量
卷积层真正学习的是
textWeight(卷积核) Bias(偏置)
例如:
text64 个输入通道 64 个输出通道 3×3 卷积
那么卷积核大小就是
64 × 64 × 3 × 3
这些就是网络真正训练出来的参数。
它们通常记为
textW1 W2
于是
第一层卷积
y1 = Conv(x; W1)
第二层卷积
y2 = Conv(ReLU(y1); W2)
于是
F(x)=Conv2(ReLU(Conv1(x)))
这里
F(x)
不是参数,而是经过参数计算后的结果。
没有。
ReLU只是
f(x)=max(0,x)
例如
text-3 → 0 5 → 5 -1 → 0
它没有任何需要学习的参数。
你的图里面这个 Shortcut 是
x ─────────────→
这种叫
Identity Shortcut
它什么都不做。
所以
Shortcut(x)=x
没有参数。
但有时候尺寸变了,例如
text56×56×64 ↓ 28×28×128
这时候不能直接相加。
于是 Shortcut 会变成
1×1 Conv
即
Shortcut(x)=Ws*x
这里
Ws
就是额外学习的参数。
普通网络学习的是
H(x)
ResNet 改成学习
F(x)=H(x)-x
所以最后输出
H(x)=F(x)+x
如果发现
H(x)
其实跟
x
很接近,
那么网络只需要学一个很小的
F(x)
训练就容易很多。
如果写完整一点:
text输入 x
第一层卷积
z1 = W1*x+b1
ReLU
a1 = ReLU(z1)
第二层卷积
z2 = W2*a1+b2
得到
F(x)=z2
最后
y = x + F(x)
这里:
| 符号 | 含义 | 是否训练参数 |
|---|---|---|
| x | 输入特征图 | ✗ |
| W1 | 第一层卷积核 | ✓ |
| b1 | 第一层偏置 | ✓ |
| z1 | 第一层卷积输出 | ✗ |
| a1 | ReLU输出 | ✗ |
| W2 | 第二层卷积核 | ✓ |
| b2 | 第二层偏置 | ✓ |
| F(x) | 残差分支输出 | ✗ |
| x+F(x) | 残差块输出 | ✗ |
只有 卷积层(以及可能存在的 BatchNorm 等层)的权重和偏置是需要训练的参数;中间的 z1、a1、F(x) 等都是根据这些参数和输入计算得到的中间激活(中间结果),不是参数。
假设输入特征(为便于说明,用一维表示)是:
x = [2, 5]
经过两层卷积后得到残差:
F(x) = [0.3, -0.4]
残差块输出就是:
texty = x + F(x) = [2, 5] + [0.3, -0.4] = [2.3, 4.6]
可以看到,残差分支只是对原始特征做了增量修正,而不是完全重新生成新的表示。这正是 ResNet 能够训练很深网络的核心思想:网络学习的是"需要修改多少",而不是"从头生成什么"。