Batch Normalization
有时一个模型error surface是凸的,但是由于两个参数对存世的斜率相差非常大,在
w
1
w_1
w1 方向上斜率变化小,在
w
2
w_2
w2 方向上斜率变化很大,也不容易训练。
产生原因
如果在一个简单的线性模型中, w 1 w_1 w1 直接乘上 x 1 x_1 x1 , w 2 w_2 w2 直接乘上 x 2 x_2 x2 。如果 x 1 x_1 x1 很小,那么 w 1 w_1 w1 的变化对 y y y 的影响就会很小,对 e e e 的影响也很小,对 L L L 的影响就很小。相反,如果 x 2 x_2 x2 很大,那么 w 2 w_2 w2 稍微变化,就会对 L L L 造成很大的影响。
前面的优化方法中都可以得到好的结果,本质都是自适应的学习率,但是另一个方向上,也可以把误差表面直接改掉。所以,在这里的目标就是把不同维度的影响统一,使不同方向的变化对
L
o
s
s
Loss
Loss 造成的变化没那么大影响,制造比较好的error surface,使训练变得更容易,这就是 特征归一化 (feature normalization)
Z-score normalization Z值归一化
Z-score normalization,Z值归一化,也成为标准化(standardization)。比较简单,就是把所有训练数据的特征向量
x
1
−
x
R
x^1 - x^R
x1−xR 中的元素
x
i
r
x_i^r
xir 同一个维度的数值取mean
m
i
m_i
mi (平均值) 和standard deviation (标准差)
σ
i
\sigma_i
σi ,然后归一化:
x
ˉ
i
r
←
x
i
r
−
m
i
σ
i
\bar{x}_{i}^{r} \leftarrow \frac{x_{i}^{r} - m_{i}}{\sigma_{i}}
xˉir←σixir−mi
归一化之后,这个维度上平均值就是 0 0 0 ,方差是 1 1 1 ,数值分布就在 0 上下。对每个维度都进行归一化,就可以构造一个比较好的error surface
深度学习方法
如图, x ~ \tilde{x} x~ 已经归一化,但是通过 W 1 W_1 W1 之后没有归一化,那么 z z z 的不同维度之间数值分布可能仍然有很大的差异,训练 W 2 W_2 W2 的参数可能会有困难,就需要对 z z z 进行特征归一化。
如何对 z z z 做特征归一化? z z z 可以看成另外一种特征。首先计算 z 1 , z 2 , z 3 z^1, z^2, z^3 z1,z2,z3 的平均值,即:
μ = 1 3 ∑ i = 1 3 z i \mu = \frac{1}{3} \sum_{i=1}^{3} z^i μ=31i=1∑3zi
接下来计算标准差:
σ = 1 3 ∑ i = 1 3 ( z i − μ ) 2 \sigma = \sqrt{\frac{1}{3} \sum_{i=1}^{3} (z^i - \mu)^2} σ=31i=1∑3(zi−μ)2
注意,式 (3.33) 中的平方就是指对每一个元素都去做平方,开根号指的是对向量里面的每一个元素开根号。
最后,根据计算出的 μ \mu μ 和 σ \sigma σ 进行归一化:
z ′ i = z i − μ σ z'^i = \frac{z^i - \mu}{\sigma} z′i=σzi−μ
[!note]
除号代表 element-wise
图像输入
做图像分类问题时,需要将代表图像的三维张量输入到网络中,需要先将向量“拉直”。面对不同尺寸的图像,会先将图像调整成相同的尺寸,再输入
Fully connected network
如果一张 100 × 100 100 \times 100 100×100 的三通道 (channel) 图片,把向量作为Fully connected network (全连接网络) 的输入,输入的特征向量的长度就是 100 × 100 × 3 100\times100\times3 100×100×3 ,当第一层有 1000 个神经元时,第一层的 weight (权重) 就需要 100 × 100 × 3 × 1000 = 3 × 1 0 7 100\times100\times3\times1000=3\times10^7 100×100×3×1000=3×107 个 weight ,非常庞大,模型有更好的弹性和更强的能力,但是有 over-fitting 的风险,弹性越大越容易过拟合。所以在做图像识别时,并不一定需要 fully connected (全连接)
Receptive filed 感受野
Observation: Need to see the whole Image?
识别某物只需要识别出一些特定的 pattern,比如识别一只鸟只需要看到鸟嘴、眼睛、鸟爪
Simplification (Implementation)
卷积神经网络设定一个区域,即 Receptive field,每个神经元只关心此 field 中的事情。只需要把这个
3
×
3
×
3
=
27
3\times3\times3=27
3×3×3=27 维的向量作为神经元输入,就只需要 27 个 weight,再加上 bias,把输出结果再送给下一层神经元。
-
一般在做图像识别时都会看全部的通道,所以不会考虑深度,高和宽合起来就叫做 kernel size (核大小) ,一般设为 3 × 3 3\times3 3×3
-
receptive field 会移动,每次移动一个步幅 (stride) ,这是一个超参数,需要人为调整,因为希望感受野之间重叠,所以一般为 1 或 2
-
感受野移动会超出图像范围,这时需要填充 (padding) 一般是零填充 (zero padding),超出范围全部补 0 ,当然也有其他方式
parameter sharing
Observation: The same patterns appears in different regions
同样的模式可能出现在图像的不同区域,但是他一定落在某一个感受野中,因为感受野覆盖整张图片
Simplification (Implementataion)
如图4.14所示,颜色相同,权重完全是一样的,比如上面神经元的第1个权重是
w
1
w_1
w1,下面神经元的第1个权重也是
w
1
w_1
w1,它们是同一个权重,用同一种颜色黄色来表示。上面神经元跟下面神经元守备的感受野是不一样的,但是它们的参数是相同的。虽然两个神经元的参数是一样的,但它们的输出不会永远还是一样的,因为它们的输入是不一样的,它们照顾的范围是不一样的。上面神经元的输入是
x
1
,
x
2
,
…
x_1, x_2, \ldots
x1,x2,…,下面神经元的输入是
x
1
′
,
x
2
′
,
…
x'_1, x'_2, \ldots
x1′,x2′,…。上面神经元的输出为
σ
(
w
1
x
1
+
w
2
x
2
+
…
+
1
)
\sigma(w_1 x_1 + w_2 x_2 + \ldots + 1)
σ(w1x1+w2x2+…+1)
下面神经元的输出为
σ ( w 1 x 1 ′ + w 2 x 2 ′ + … + 1 ) \sigma(w_1 x'_1 + w_2 x'_2 + \ldots + 1) σ(w1x1′+w2x2′+…+1)
因为输入不一样的关系,所以就算是两个神经元共用参数,它们的输出也不会是一样的。所以这是一种简化,让一些神经元可以共享参数,共享的方式完全可以自己决定。接下来介绍图像识别方面,常用的共享方法是如何设定的。
如图4.15所示,每个感受野都有一组神经元在负责守备,比如64个神经元,它们彼此之间可以共享参数。图4.16中使用一样的颜色代表这两个神经元共享一样的参数,所以每个感受野都只有一组参数,就是上面感受野的第1个神经元会跟下面感受野的第1个神经元共用参数,上面感受野的第2个神经元跟下面感受野的第2个神经元共用参数……所以每个感受野都只有一组参数而已,这些参数称为滤波器(filter)。这是第2个简化的方法。
max pooling (最大池化)
一般架构是卷积加池化,但是池化是可有可无的。
一般架构就是卷积加汇聚,汇聚是可有可无的,很多人可能会选择不用汇聚。如图4.30所示,如果做完几次卷积和汇聚以后,把汇聚的输出做扁平化(flatten),再把这个向量丢进全连接层里面,最终还要过这个softmax来得到图像识别的结果。这就是一个经典的图像识别的网络,里面有卷积、汇聚和扁平化,最后再通过几个全连接层或softmax来得到图像识别的结果。
扁平化就是把图像里面本来排成矩阵样子的东西“拉直”,即把所有的数值“拉直”变成一个向量。