深度学习基础知识
神经网络
让原始数据通过一个映射得到我们想要的数据。
BP算法
这里以三层神经网络为例进行推导,输入层2个节点,隐含层三个节点,输出层2个节点,如下图所示。激活函数采用sigmoid激活函数,损失函数为平方损失函数。
-
总误差
L t o t a l = ∑ 1 2 ( t a r g e t − o u t p u t ) 2 = 1 2 ( t a r g e t o 1 − o u t o 1 ) 2 + 1 2 ( t a r g e t o 2 − o u t o 2 ) 2 \begin{aligned} L_{total} &= \sum\frac{1}{2}(target - output)^2 \\\\ &=\frac{1}{2}(target_{o1} - out_{o1})^2 + \frac{1}{2}(target_{o2} - out_{o2})^2 \\\\ \end{aligned} Ltotal=∑21(target−output)2=21(targeto1−outo1)2+21(targeto2−outo2)2 -
隐含层–>输出层权值更新, w7为例
∂ L t o t a l ∂ w 7 = ∂ L t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ n e t o 1 ∗ ∂ n e t o 1 ∂ w 7 = − ( t a r g e t o 1 − o u t o 1 ) ∗ [ o u t o 1 ∗ ( 1 − o u t o 1 ) ] ∗ o u t h 1 = δ o 1 ∗ o u t h 1 \begin{aligned} \frac{\partial L_{total}}{\partial w_7} &= \frac{\partial L_{total}}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}} * \frac{\partial net_{o1}}{\partial w_7} \\\\ &=-(target_{o1} - out_{o1}) * [out_{o1} * (1- out_{o1})] * out_{h1} \\\\ &=\delta_{o1} * out_{h1} \end{aligned} ∂w7∂Ltotal=∂outo1∂Ltotal∗∂neto1∂outo1∗∂w7∂neto1=−(targeto1−outo1)∗[outo1∗(1−outo1)]∗outh1=δo1∗outh1 -
隐含层–>隐含层(输入层的权值更新),以w1为例,
∂ L t o t a l ∂ w 1 = ∂ L t o t a l ∂ o u t h 1 ∗ ∂ o u t h 1 ∂ n e t h 1 ∗ ∂ n e t h 1 ∂ w 1 = ∂ L t o t a l ∂ o u t h 1 ∗ [ o u t h 1 ∗ ( 1 − o u t h 1 ) ] ∗ i 1 = ( δ o 1 ∗ w 7 + δ o 2 ∗ w 1 0 ) ∗ [ o u t h 1 ∗ ( 1 − o u t h 1 ) ] ∗ i 1 = δ h 1 ∗ i 1 \begin{aligned} \frac{\partial L_{total}}{\partial w_1} &= \frac{\partial L_{total}}{\partial out_{h1}} * \frac{\partial out_{h1}}{\partial net_{h1}} * \frac{\partial net_{h1}}{\partial w_1} \\\\ &=\frac{\partial L_{total}}{\partial out_{h1}} * [out_{h1} * (1- out_{h1})] * i_1 \\\\ &= (\delta_{o1} * w_7 + \delta_{o2} * w_10) * [out_{h1} * (1- out_{h1})] * i_1 \\\\ &=\delta_{h1} * i_1 \end{aligned} ∂w1∂Ltotal=∂outh1∂Ltotal∗∂neth1∂outh1∗∂w1∂neth1=∂outh1∂Ltotal∗[outh1∗(1−outh1)]∗i1=(δo1∗w7+δo2∗w10)∗[outh1∗(1−outh1)]∗i1=δh1∗i1
激活函数
-
sigmoid
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+e−x1-
导函数是偶函数
σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) = 1 1 + e − x ∗ e − x 1 + e − x \sigma'(x) = \sigma(x)(1 - \sigma(x)) = \frac{1}{1+e^{-x}}*\frac{e^{-x}}{1+e^{-x}} σ′(x)=σ(x)(1−σ(x))=1+e−x1∗1+e−xe−x
σ ′ ( − x ) = σ ( − x ) ( 1 − σ ( − x ) ) = 1 1 + e x ∗ e x 1 + e x = ( 1 − σ ( x ) ) ∗ σ ( x ) = σ ′ ( x ) \begin{aligned} \sigma'(-x) &= \sigma(-x)(1-\sigma(-x)) \\\\ &=\frac{1}{1+e^x}*\frac{e^x}{1+e^x} \\\\ &=(1-\sigma(x))*\sigma(x) \\\\ &=\sigma'(x) \end{aligned} σ′(−x)=σ(−x)(1−σ(−x))=1+ex1∗1+exex=(1−σ(x))∗σ(x)=σ′(x) -
导函数在大于0时是减函数
σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) = 1 1 + e − x ∗ e − x 1 + e − x = e x 1 + e x ∗ e − x 1 + e − x = 1 2 + e x + e − x \begin{aligned}\sigma'(x) &= \sigma(x)(1 - \sigma(x)) \\\\ &= \frac{1}{1+e^{-x}}*\frac{e^{-x}}{1+e^{-x}} \\\\ &=\frac{e^x}{1+e^x}*\frac{e^{-x}}{1+e^{-x}} \\\\ &=\frac{1}{2 + e^x + e^{-x}} \end{aligned} σ′(x)=σ(x)(1−σ(x))=1+e−x1∗1+e−xe−x=1+exex∗1+e−xe−x=2+ex+e−x1
σ ′ ′ ( x ) = ( 1 2 + e x + e − x ) ′ = − ( e x − e − x ) ( 2 + e x + e − x ) 2 < 0 \begin{aligned} \sigma''(x) &= (\frac{1}{2 + e^x + e^{-x}})' \\\\ &=\frac{-(e^x-e^{-x})}{(2 + e^x + e^{-x})^2} < 0 \end{aligned} σ′′(x)=(2+ex+e−x1)′=(2+ex+e−x)2−(ex−e−x)<0 -
Simoid函数的两端区域的的梯度接近于9,这会导致反向传播过程中导数处于该区域的误差很难甚至无法传递至前层,进而导致整个网络无法正常训练;
-
另外,Sigmoid激活函数值域的均值并非为0,而是全为正,这并不符合我们对神经网络内数值的期望均值为0的设想。
-
-
tanh
σ ( x ) = e x − e − x e x + e − x \sigma(x) = \frac{e^x - e^{-x}}{e^x+e^{-x}} σ(x)=ex+e−xex−e−x- tanh(x)解决了Sigmod函数均值的问题
- 但没有改变导数的形状与性质,仍然会出现"梯度饱和"的现象。
-
ReLU
R e L U ( x ) = m a x ( 0 , x ) = { x x ≥ 0 0 x < 0 \begin{aligned} ReLU(x) &= max(0, x) \\\\ &=\begin{cases} x & x \geq 0 \\\\ 0 & x < 0 \end{cases} \end{aligned} ReLU(x)=max(0,x)=⎩⎪⎨⎪⎧x0x≥0x<0- ReLU函在x >= 0部分完全消除了Sigmoid函数的梯度饱和效应,在计算复杂度上,更为简单;
- 实验中发现ReLU函数有助于随机梯度下降方法收敛,收敛速度约快6倍;
- 在 x < 0时,梯度为0,将无法影响网络训练,这种现象称为"死区".
-
Leaky ReLU
L e a k y R e L U ( x ) = { x x ≥ 0 α ∗ x x < 0 Leaky ReLU(x) =\begin{cases} x & x \geq 0 \\\\ \alpha * x & x < 0 \end{cases} LeakyReLU(x)=⎩⎪⎨⎪⎧xα∗xx≥0x<0- α \alpha α为0.01或0.001数量级的较小正数;
- α \alpha α为超参数,较难设定合适的值且较为敏感,因此Leaky ReLU函数在实际应用中性能并不十分稳定.
-
参数化ReLU
- 参数化ReLU直接将 α \alpha α作为一个网络中可学习的变量融入模型的整体训练过程
- 参数化ReLU在带来更大自由度的同时,也增加了网络模型过拟合的风险,在实际应用中需格外注意.
-
随机化ReLU
R a n d o m i z e d R e L U ( x ) = { x x ≥ 0 α ′ ∗ x x < 0 Randomized ReLU(x) =\begin{cases} x & x \geq 0 \\\\ \alpha' * x & x < 0 \end{cases} RandomizedReLU(x)=⎩⎪⎨⎪⎧xα′∗xx≥0x<0
其中,
α ′ ∼ U ( l , u ) , l , u ∈ [ 0 , 1 ) \alpha' \sim U(l, u), l, u \in[0, 1) α′∼U(l,u),l,u∈[0,1)- Kaggle 2015浮游动物的图像分类一举夺冠.
-
指数化线性单元(Exponential Linear ELU)
R a n d o m i z e d R e L U ( x ) = { x x ≥ 0 λ ∗ ( e x − 1 ) x < 0 Randomized ReLU(x) =\begin{cases} x & x \geq 0 \\\\ \lambda * (e^x - 1) & x < 0 \end{cases} RandomizedReLU(x)=⎩⎪⎨⎪⎧xλ∗(ex−1)x≥0x<0- ELU局部ReLU函数的优点,同时解决了ReLU函数自身的"死区问题".
- ELU函数中的指数操作稍微增大了计算量,在实际应用中是,ELU中的超参数\lamda一般被设置为1.
损失函数
- 分类中的损失函数:
假设分类任务共有N个训练样本,针对网络最后分类层第 i i i个样本的输入特征 x i x_i xi,其对应的真实标记为 y i ∈ ( 1 , 2 , . . . , C ) y_i\in(1, 2, ..., C) yi∈(1,2,...,C),另 h = ( y 1 ^ , y 2 ^ , . . . , y C ^ ) T h=(\hat{y_1}, \hat{y_2}, ..., \hat{y_C})^T h=(y1^,y2^,...,yC^)T为网络的最终输出,即样本 i i i的预测结果,其中C为分类任务类别数.-
交叉熵损失函数
L c r o s s _ e n t r o p y _ l o s s = − 1 N ∑ i N l o g e y i ^ ∑ j C e y j L_{cross\_entropy\_loss} = -\frac{1}{N}\sum_i^Nlog\frac{e^{\hat{yi}}}{\sum_j^Ce{^{y_j}}} Lcross_entropy_loss=−N1i∑Nlog∑jCeyjeyi^ -
focal loss
F o c a l _ L o s s = − α t ∗ ( 1 − p t ) γ ∗ l o g ( p t ) Focal\_Loss = -\alpha_t*(1-p_t)^\gamma*log(p_t) Focal_Loss=−αt∗(1−pt)γ∗log(pt)
( 1 − p t ) γ (1-p_t)^\gamma (1−pt)γ被称为调制系数.- 减少易分类样本的权重,使得模型更专注于难分类样本的样本。
- 当一个样本被分错的时候,pt是很小的,此时调制系数较大,和原来的loss变化较小
- 当一个样本被分类正确且是易分类样本时,调制系数趋于0,也就是对总的loss贡献较小
- 当 γ = 0 \gamma=0 γ=0时,focal loss就是传统的交叉熵损失函数;当 γ \gamma γ增大时,调制系数也会增加.
- 实验中 γ = 2 , α = 0.25 效 果 最 好 . \gamma=2, \alpha=0.25效果最好. γ=2,α=0.25效果最好.
-
合页损失函数(hinge loss)
L h i n g e _ l o s s = 1 N m a x ( 0 , 1 − h y i ) L_{hinge\_loss} = \frac{1}{N}max(0, 1-h_{y_i}) Lhinge_loss=N1max(0,1−hyi)- SVM中应用此损失函数
-
- 回归中的损失函数
假设第 i i i个样本 x i x_i xi的真实标记为 y i = ( y 1 , y 2 , . . . , y M ) T y^i=(y_1, y_2, ..., y_M)^T yi=(y1,y2,...,yM)T, M M M为标记向量的总维度,则 l t i l_t^i lti即表示样本 i i i上网络预测值 y i ^ \hat{y^i} yi^与其真实表姐在t维的预测误差(亦称残差:
l t i = y t i − y t i ^ l_t^i = y_t^i - \hat{y_t^i} lti=yti−yti^- l1 损失函数
L l 1 _ l o s s = 1 N ∑ i N ∑ j M ∣ l t i ∣ L_{l1\_loss} = \frac{1}{N}\sum_i^N\sum_j^M|l_t^i| Ll1_loss=N1i∑Nj∑M∣lti∣ - l2 损失函数
L l 2 _ l o s s = 1 N ∑ i N ∑ j M ( l t i ) 2 L_{l2\_loss} = \frac{1}{N}\sum_i^N\sum_j^M(l_t^i)^2 Ll2_loss=N1i∑Nj∑M(lti)2- 在实际应用中,l1与l2损失函数在回归精度上几乎相差无几,不过在一些情况下l2损失函数可能会略优于l1;
- 收敛速度方面l2损失函数略快于l1损失函数.
- l1 损失函数
正则化
机器学习一个核心问题是,如何使学习算法不仅在训练样本上表现良好,并且在新数据集或测试集上同样奏效,学习算法在新数据集上的这样一种表现我们称之为"泛化能力";弱学习算法在训练集上表现良好,但在测试集上却非常糟糕,则我们说这样的学习算法并没有泛化能力,这种现象也称为"过拟合".
正则化是机器学习中通过显式地控制模型复杂度来避免模型过拟合,确保泛化能力的一种有效方式。有限空间自然对应复杂度不太高的模型,也自然对应了有限的模型表达能力,这就是“正则化能有效防止过拟合”的一种直观解释。
-
l2正则化
假设待正则化的网络参数为 w w w,则 l 2 l2 l2正则项形式为:
l 2 = 1 2 λ ∣ ∣ w ∣ ∣ 2 2 l2 = \frac{1}{2}\lambda||w||_2^2 l2=21λ∣∣w∣∣22
其中 λ \lambda λ控制正则项大小,较大的 λ \lambda λ取值将较大程度约束模型复杂度,反之亦然.- 在实际应用中,一般将正则项加入目标函数,通过整体目标函数的误差反向传播,从而达到正则项影响和指导网络训练的目的;
- l 2 l2 l2正则化在深度学习中有一个常用的叫法较"权重衰减"(weight decay),另外 l 2 l2 l2正则化在机器学习中还被称作"岭回归".
-
l1正则化
l 1 = λ ∣ ∣ w ∣ ∣ 1 = λ ∑ i ∣ w i ∣ l1 = \lambda||w||_1 = \lambda\sum_i|w_i| l1=λ∣∣w∣∣1=λi∑∣wi∣- l 1 l1 l1正则化除了同 l 2 l2 l2正则化一样能约束参数量级外,还能起到使参数更系数的作用。稀疏化的结果使优化后的参数一部分为0,另一部分为非0实值。非0实值的那部分参数可起到选择重要参数或特征维度的作用,同时也可起到去除噪声的作用。
- 此外,
l
2
l2
l2和
l
1
l1
l1也可联合使用
λ 1 ∣ ∣ w ∣ ∣ 1 + λ 2 ∣ ∣ w 2 ∣ ∣ 2 \lambda_1||w||_1 + \lambda_2||w_2||^2 λ1∣∣w∣∣1+λ2∣∣w2∣∣2
-
关于l1正则化产生稀疏解的解释
-
解释1: L 1 ( x ) L_1(x) L1(x)是连续的
L 1 ( x ) = f ( x ) + C ∣ x ∣ = { f ( x ) + C x x ≥ 0 f ( x ) − C x x < 0 \begin{aligned} L_1(x) &= f(x) + C|x| \\\\ &=\begin{cases} f(x) + Cx & x \geq 0 \\\\ f(x) - Cx & x < 0 \end{cases} \end{aligned} L1(x)=f(x)+C∣x∣=⎩⎪⎨⎪⎧f(x)+Cxf(x)−Cxx≥0x<0
则
L 1 ′ ( x ) = { f ′ ( x ) + C x ≥ 0 f ′ ( x ) − C x < 0 \begin{aligned} L_1'(x) &=\begin{cases} f'(x) + C & x \geq 0 \\\\ f'(x) - C & x < 0 \end{cases} \end{aligned} L1′(x)=⎩⎪⎨⎪⎧f′(x)+Cf′(x)−Cx≥0x<0
只要 C > ∣ f ′ ( x ) ∣ C > |f'(x)| C>∣f′(x)∣,则 x = 0 x = 0 x=0就会变成一个极小值点.而 L 2 ( x ) L_2(x) L2(x)在0点的导数等于 f ′ ( x ) f'(x) f′(x),不会因为添加了 L 2 L_2 L2正则项就改变在0点的导数. -
解释2: 优化的角度
拉格朗日乘数法:
f ( x , y ) f(x, y) f(x,y)在 g ( x , y ) = c g(x, y) = c g(x,y)=c时的极值点与 L ( x , y , λ ) = f ( x , y ) + λ ( g ( x , y ) − c ) L(x, y, \lambda) = f(x, y) + \lambda(g(x, y) - c) L(x,y,λ)=f(x,y)+λ(g(x,y)−c)的极值相同.l 1 l1 l1正则化优化的极值点就是f(x, y)在 λ ∣ ∣ w ∣ ∣ 1 \lambda||w||_1 λ∣∣w∣∣1 = 0的极值点,而 l 2 l2 l2正则化优化的极值点就是f(x, y)在 λ ∣ ∣ w ∣ ∣ 2 \lambda||w||^2 λ∣∣w∣∣2 = 0的极值点. 由绝对值函数的图像和二次函数的图像,已知 l 1 l1 l1正则化易在坐标轴处取得极值点,也就是极值点等于0.
-
-
随机失活(dropout)
随机失活在约束网络复杂度的同时,还是一种针对深度模型的高效集成学习(ensemble learning)方法.
对于某层的每个神经元,在训练阶段均以概率p随机将该神经元权重置为0,测试阶段所有神经元均称激活状态,但其权重需要乘以(1-p)以保证训练和测试阶段各自权重拥有相同的期望.
由于失活的神经元无法参与到网络训练,因此每次训练相当于面对一个新的网络,测试阶段相当于子网络的网络集成,这对于提高网络泛化性能效果显著.
随机失活在工程实现中并没有完全遵照原理,而是在训练阶段直接将随机失活后的网络响应乘以 1 1 − p \frac{1}{1-p} 1−p1,这样测试阶段便不需要做任何量级调整,这样的随机失活被称为"倒置随机失活".
模型的欠拟合(unfitting)和过拟合(overfittin)
-
欠拟合: 在验证集上的准确率一直低于训练集上的准确率,但无明显下降趋势。(在训练集和验证集效果均不好)
可通过增加层数、调整激活函数、增加网络非线性、减小模型正则化等措施增大网络复杂度.
-
过拟合: 验证集曲线不仅低于训练集,且随着训练轮数增长有明显下降趋势,则说明模型已经过拟合.
-
偏差(bias)、方差(variance)
- 偏差
偏差描述的是根据样本拟合出的模型的预测结果的期望与样本真实结果的差距,简单说就是在样本上拟合的好不好。想要在bias上表现好,low bias,就得复杂化模型,增加模型的参数,但这样容易过拟合,过拟合对应的是high variance. - variance描述的是样本训练出来的模型在测试集上的表现,要想在variance表现好,low variance,就要简化模型,减少模型的参数,但这样容易欠拟合,欠拟合对应着high bias.
- 偏差
梯度消失、梯度爆炸
- 什么是梯度消失和梯度爆炸?
设第
i
i
i层网络激活后的输出为
f
i
(
X
)
f_i(X)
fi(X),
X
X
X表示第
i
i
i层的输入,也就是第
i
−
1
i-1
i−1层的输出,
f
f
f是激活函数,那么得出
f
i
+
1
(
X
)
=
f
(
W
i
+
1
∗
f
i
+
b
i
+
1
)
f_{i+1}(X) = f(W_{i+1}*f_i + b_{i+1})
fi+1(X)=f(Wi+1∗fi+bi+1)
设网络共有n层,Loss关于第k层的某个参数
w
k
w_k
wk的导数为(下面的公式和解释不那么严谨):
∂
L
o
s
s
∂
w
k
=
∂
L
o
s
s
∂
f
n
∗
∂
f
n
∂
f
n
−
1
∗
.
.
.
∗
∂
f
k
+
1
∂
f
k
∗
∂
f
k
w
k
=
∂
L
o
s
s
∂
f
n
∗
[
w
n
−
1
∗
(
f
(
w
n
∗
f
n
−
1
+
b
n
)
∗
(
1
−
f
(
w
n
∗
f
n
−
1
+
b
n
)
)
)
]
∗
.
.
.
∗
[
f
k
−
1
∗
(
f
(
w
k
∗
f
k
−
1
+
b
k
)
∗
(
1
−
f
(
w
k
∗
f
k
−
1
+
b
k
)
)
)
]
\begin{aligned}\frac{\partial{Loss}}{\partial{w_k}} &= \frac{\partial{Loss}}{\partial{f_n}} * \frac{\partial{f_n}}{\partial{f_{n-1}}} * ... * \frac{\partial{f_{k+1}}}{\partial{f_{k}}} * \frac{\partial{f_k}}{w_k} \\\\ &=\frac{\partial{Loss}}{\partial{f_n}} * [w_{n-1}*(f(w_n*f_{n-1} + b_n)*(1-f(w_n*f_{n-1} + b_n)))]* ... \\\\ &*[f_{k-1}*(f(w_k*f_{k-1} + b_k)*(1-f(w_k*f_{k-1} + b_k)))] \end{aligned}
∂wk∂Loss=∂fn∂Loss∗∂fn−1∂fn∗...∗∂fk∂fk+1∗wk∂fk=∂fn∂Loss∗[wn−1∗(f(wn∗fn−1+bn)∗(1−f(wn∗fn−1+bn)))]∗...∗[fk−1∗(f(wk∗fk−1+bk)∗(1−f(wk∗fk−1+bk)))]
影响梯度的是累乘的
[
w
n
−
1
∗
(
f
(
w
n
∗
f
n
−
1
+
b
n
)
∗
(
1
−
f
(
w
n
∗
f
n
−
1
+
b
n
)
)
)
]
[w_{n-1}*(f(w_n*f_{n-1} + b_n)*(1-f(w_n*f_{n-1} + b_n)))]
[wn−1∗(f(wn∗fn−1+bn)∗(1−f(wn∗fn−1+bn)))],而
(
f
(
w
n
∗
f
n
−
1
+
b
n
)
∗
(
1
−
f
(
w
n
∗
f
n
−
1
+
b
n
)
)
)
(f(w_n*f_{n-1} + b_n)*(1-f(w_n*f_{n-1} + b_n)))
(f(wn∗fn−1+bn)∗(1−f(wn∗fn−1+bn)))这部分是小于等于1的,所以在
w
n
w_n
wn较大时,在深层网络反向传播是会产生很多大于1的数连乘,从而产生很大的梯度,这时就是梯度爆炸。而当
w
n
w_n
wn较小时,会出现很多小于1的数连乘,从而产生很小的梯度,这时就是梯度消失.
-
总结:
- 梯度消失一般是由于深层网络和不合适的激活函数;
- 梯度爆炸一般是由于深层网络和权值初始化太大.
- 不同的层学习的差异很大, 表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习很慢.
-
梯度消失梯度爆炸的解决方案
-
预训练 + 微调
2016 Hinton 深度信念网络
-
梯度裁剪
梯度裁剪是设置一个梯度阈值,更新梯度的时候,如果梯度超过这个阈值,将其强制在该范围内,这可以防止梯度爆炸.
-
正则
正则是通过控制权重来限制梯度爆炸的发生.
-
ReLU等激活函数
- 解决了梯度消失、爆炸问题
- 计算方便、计算速度快
- 加速了网络训练
-
batch normalization, BN
BN将输出从饱和区拉到了非饱和区.
可以这么理解,
原来 f i + 1 = f ( w f i + b ) f_{i+1} = f(wf_i + b) fi+1=f(wfi+b), 令 t = w f i + b t = wf_i + b t=wfi+b, 则
∂ f i + 1 ∂ f i = ( f ( t ) ∗ ( 1 − f ( t ) ) ) ∗ w \frac{\partial{f_{i+1}}}{\partial{f_i}} = (f(t) * (1-f(t))) * w ∂fi∂fi+1=(f(t)∗(1−f(t)))∗w加入BN后, f i + 1 = f ( B N ( w f i ) ) f_{i+1} = f(BN(wf_i)) fi+1=f(BN(wfi)), 令 t = w f i + b , z = B N ( t ) t = wf_i + b, z = BN(t) t=wfi+b,z=BN(t), 则
∂ f i + 1 ∂ f i = [ ( f ( z ) ∗ ( 1 − f ( z ) ) ) ] ∗ [ 1 σ ] ∗ w \frac{\partial{f_{i+1}}}{\partial{f_i}} = [(f(z) * (1-f(z)))] * [\frac{1}{\sigma}]*w ∂fi∂fi+1=[(f(z)∗(1−f(z)))]∗[σ1]∗w加入BN后,产生影响的有两部分,一个是 ( f ( z ) ∗ ( 1 − f ( z ) ) (f(z) * (1-f(z)) (f(z)∗(1−f(z)), 因为 z z z是BN后的,会把其从饱和区拉回到饱和区; 另外一个影响是 1 σ \frac{1}{\sigma} σ1, 产生怎样的影响待分析.
-
残差结构
f i + 1 = f ( w ∗ f i + f i ) f_{i+1} = f(w*f_i + f_i) fi+1=f(w∗fi+fi), 令 t = w ∗ f i + f i t = w*f_i + f_i t=w∗fi+fi, 则
∂ f i + 1 ∂ f i = ( f ( t ) ∗ ( 1 − f ( t ) ) ) ∗ ( 1 + w ) \frac{\partial{f_{i+1}}}{\partial{f_i}} = (f(t) * (1-f(t))) * (1 + w) ∂fi∂fi+1=(f(t)∗(1−f(t)))∗(1+w)
而 w w w 较小,因此,有1的存在,可以将梯度值扩大很多倍。
-
Batch norm
-
归一化
神经网络过程本质是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力将大大不同;另一方面,一旦每批训练数据的分布各不相同,那么网络就要在每次迭代去学习适应不同的分布,这样将会大大降低网络的训练速度,这也就是为什么需要对数据做归一化的处理.
-
BN能解决什么问题?
训练过程中,中间层的数据分布发生变化,也就是"Internal Covariate Shift", 将会影响训练的速度. BN层就是在网络每一层输入的时候,先做一个归一化处理;所不同的是,这个归一化处理是带有可学习参数的. BN为什么会引入可学习参数呢? 因为只做归一化处理,相当于每一层的输入数据都是标准正态分布,导致学习到的特征都被归一化了(搞坏了),显然是不合理的.
-
BN是怎么操作的?
BN的前向传导公式如下:
μ B ← 1 m ∑ x i \mu_B \leftarrow \frac{1}{m}\sum{x_i} μB←m1∑xi // mini-batch mean
σ B 2 ← 1 m ∑ ( x i − μ B ) 2 {\sigma_B}^2 \leftarrow \frac{1}{m}\sum{(x_i - \mu_B)^2} σB2←m1∑(xi−μB)2 // mini-batch variance
x i ^ ← x i − μ B σ B 2 + ϵ \hat{x_i} \leftarrow \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} xi^←σB2+ϵxi−μB // normalize
y i ← γ x i ^ + β y_i \leftarrow \gamma\hat{x_i} + \beta yi←γxi^+β // scale and shift
-
测试阶段的BN层
在测试阶段,一般只输入一个测试样本。这时的 μ \mu μ和 v a l val val通过以下方式获得:
E [ x ] ← E B [ μ B ] E[x] \leftarrow E_B[\mu_B] E[x]←EB[μB] //所有batch μ \mu μ 的平均值
V a r [ x ] ← m m − 1 E B σ B 2 Var[x] \leftarrow \frac{m}{m-1}E_B{\sigma_B^2} Var[x]←m−1mEBσB2 // 每个batch σ B \sigma_B σB 的无偏估计.
此时,
y = γ ∗ x − E [ x ] V a r [ x ] + ϵ + β = γ V a r [ x ] + ϵ ∗ x + ( β − E [ x ] V a r [ x ] + ϵ ) y = \gamma*\frac{x - E[x]}{\sqrt{Var[x] + \epsilon}} + \beta = \frac{\gamma}{\sqrt{Var[x] + \epsilon}} * x + (\beta - \frac{E[x]}{\sqrt{Var[x] + \epsilon}}) y=γ∗Var[x]+ϵx−E[x]+β=Var[x]+ϵγ∗x+(β−Var[x]+ϵE[x]) -
BN在卷积神经网络中的应用
在卷积层上使用BN,使用了类似权值共享的策略,把一整张特征图当做一个神经元进行处理.
假设某一层的特征图是(batch_size, channel, height, width),此时mini-batch的大小是batch_size * height * width, 对于每一张特征图只有 γ , β \gamma, \beta γ,β一对可学习参数
初始化方法
-
全零初始化
全零初始化,导致不同的神经元的输出必然相同,相同输出则导致梯度更新完全一样,这样便会令更新后的参数仍然保持一样的状态。换句话说,若对参数进行了全零初始化,那么网络神经元无能力对此做出改变,从而无法进行模型训练。
-
Xavier 初始化
# 0均值,标注方差的高斯分布 w = 0.001 * randn(n_in, n_out) / sqrt(n) # n=n_in 或 n=(n_in + n_out) / 2;
Xavier参数初始化方法维持了输入、输出数据分布方差的一致性. 设 s s s为未经过非线性变换的该层网络输出结果, w w w为该层参数, x x x为该层输入数据: 则
V a r ( s ) = V a r ( ∑ i n w i x i ) = ∑ i n ( V a r ( w i x i ) ) = ∑ i n E ( w i x i − E w i x i ) 2 = ∑ i n [ E ( w i 2 x i 2 ) − ( E w i x i ) 2 ] = ∑ i n [ E w i 2 ∗ E x i 2 − ( E w i x i ) 2 ] = ∑ i n [ ( V a r ( w i ) + ( E w i ) 2 ) ∗ ( V a r ( x i ) + ( E x i ) 2 ) ] − ( E w i x i ) 2 ] = ∑ i n [ V a r ( w i ) V a r ( x i ) + ( E w i ) 2 ∗ V a r ( x i ) + ( E x i ) 2 ∗ V a r ( w i ) ] = ∑ i n ( V a r ( x i ) V a r ( w i ) ) = ( n V a r ( w ) ) ∗ V a r ( x ) \begin{aligned} Var(s) &= Var(\sum_i^nw_ix_i) \\\\ &=\sum_i^n(Var(w_ix_i)) \\\\ &=\sum_i^nE(w_ix_i - Ew_ix_i)^2 \\\\ &=\sum_i^n[E(w_i^2x_i^2) - (Ew_ix_i)^2] \\\\ &=\sum_i^n[Ew_i^2*Ex_i^2 - (Ew_ix_i)^2] \\\\ &=\sum_i^n[(Var(w_i) + (Ew_i)^2)*(Var(x_i) + (Ex_i)^2)] - (Ew_ix_i)^2] \\\\ &=\sum_i^n[Var(w_i)Var(x_i) + (Ew_i)^2*Var(x_i) + (Ex_i)^2*Var(w_i)] \\\\ &=\sum_i^n(Var(x_i)Var(w_i)) \\\\ &=(nVar(w))*Var(x) \end{aligned} Var(s)=Var(i∑nwixi)=i∑n(Var(wixi))=i∑nE(wixi−Ewixi)2=i∑n[E(wi2xi2)−(Ewixi)2]=i∑n[Ewi2∗Exi2−(Ewixi)2]=i∑n[(Var(wi)+(Ewi)2)∗(Var(xi)+(Exi)2)]−(Ewixi)2]=i∑n[Var(wi)Var(xi)+(Ewi)2∗Var(xi)+(Exi)2∗Var(wi)]=i∑n(Var(xi)Var(wi))=(nVar(w))∗Var(x) -
Kaiming 初始化
# 0均值,标注方差的高斯分布 w = 0.001 * randn(n_in, n_out) / sqrt(n/2)
优化算法
- (batch)梯度下降法: 时间太长
- mini-batch 梯度下降
- 随机(stochastic)梯度下降: 失去向量化带来的加速; 不稳定.
在学习接下来的优化算法之前,先介绍一下指数加权平均.
指数加权平均(exponentially weighted averages), 1 1 − β \frac{1}{1-\beta} 1−β1的平均,如 β = 0.9 \beta=0.9 β=0.9时, 可看成是10个的平均.
指数加权平均相比与平均,它更节省内存,因为在实现时可以不断覆盖;
v
t
=
β
v
t
−
1
+
(
1
−
β
)
θ
t
v_t = \beta{v_{t-1}} + (1-\beta)\theta_t
vt=βvt−1+(1−β)θt
由此可得,
v
t
=
β
v
t
−
1
+
(
1
−
β
)
θ
t
=
(
1
−
β
)
θ
t
+
β
[
β
v
t
−
2
+
(
1
−
β
)
θ
t
−
1
]
=
(
1
−
β
)
θ
t
+
(
1
−
β
)
β
θ
t
−
1
+
β
2
v
t
−
2
=
.
.
.
=
(
1
−
β
)
θ
t
+
(
1
−
β
)
β
θ
t
−
1
+
(
1
−
β
)
β
2
θ
t
−
2
+
.
.
.
+
(
1
−
β
)
β
t
−
1
θ
1
\begin{aligned} v_t &= \beta{v_{t-1}} + (1-\beta)\theta_t \\\\ &=(1-\beta)\theta_t + \beta[\beta{v_{t-2}} + (1-\beta)\theta_{t-1}] \\\\ &=(1-\beta)\theta_t + (1-\beta)\beta\theta_{t-1}+{\beta}^2v_{t-2} \\\\ &=...\\\\ &=(1-\beta)\theta_t + (1-\beta)\beta\theta_{t-1} +(1-\beta){\beta}^2\theta_{t-2} \\\\ &+...+(1-\beta){\beta}^{t-1}\theta_1 \\\\ \end{aligned}
vt=βvt−1+(1−β)θt=(1−β)θt+β[βvt−2+(1−β)θt−1]=(1−β)θt+(1−β)βθt−1+β2vt−2=...=(1−β)θt+(1−β)βθt−1+(1−β)β2θt−2+...+(1−β)βt−1θ1
当
β
=
0.9
\beta=0.9
β=0.9时,
v
t
=
0.1
θ
t
+
0.1
∗
0.9
∗
θ
t
−
1
+
.
.
.
+
0.1
∗
0.
9
t
−
1
θ
1
v_t = 0.1\theta_t + 0.1*0.9*\theta_{t-1} + ... + 0.1*0.9^{t-1}\theta_1
vt=0.1θt+0.1∗0.9∗θt−1+...+0.1∗0.9t−1θ1
指数加权平均的偏差修正(bias correction in exponentially weighted average),偏差修正有利于在早期获得更好的估测.
v t = β v t − 1 + ( 1 − β ) θ t 1 − β t v_t = \frac{\beta{v_{t-1}} + (1-\beta)\theta_t}{1-\beta^t} vt=1−βtβvt−1+(1−β)θt
接下来学习其它的优化算法
-
Momentum 梯度下降法
可以减缓梯度下降的幅度, 一般情况下, $\beta=0.9; 改变梯度的方向.
V
d
w
=
β
v
d
w
+
(
1
−
β
)
d
w
V_{dw} = \beta{v_{dw}} + (1-\beta)dw
Vdw=βvdw+(1−β)dw
w
:
=
w
−
α
V
d
w
w := w - \alpha{V_{dw}}
w:=w−αVdw
-
RMSprop(root mean square prop)
在二维中, w表示水平方向,b表示竖直方向, 运行使用更大的学习率来加快算法学习速度; 改变的是不同方向的学习率; RMSprop和Momentum梯度下降法均可以消除梯度下降中的摆动.
S d w = β S d w + ( 1 − β ) ∗ ( d w ) 2 S_{dw} = \beta{S_{dw}} + (1-\beta)*(dw)^2 Sdw=βSdw+(1−β)∗(dw)2
S d b = β S d b + ( 1 − β ) ∗ ( d b ) 2 S_{db} = \beta{S_{db}} + (1-\beta)*(db)^2 Sdb=βSdb+(1−β)∗(db)2
w : = w − α ∗ d w S d w w := w - \alpha*\frac{dw}{\sqrt{S_{dw}}} w:=w−α∗Sdwdw
b : = b − α ∗ d b S d b b := b - \alpha*\frac{db}{\sqrt{S_{db}}} b:=b−α∗Sdbdb -
Adam(Adaptive moment estimation) 优化算法(Momentum 和 RMSprop 算法的结合)
β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 e − 8 \beta_1 = 0.9, \beta_2 = 0.999, \epsilon = 1e-8 β1=0.9,β2=0.999,ϵ=1e−8, α \alpha α调试.
V d w = 0 , S d w = 0 , V d b = 0 , S d b = 0 V_{dw} = 0, S_{dw} = 0, V_{db} = 0, S_{db} = 0 Vdw=0,Sdw=0,Vdb=0,Sdb=0
V d w = β 1 V d w + ( 1 − β 1 ) d W , V d b = β 1 V d b + ( 1 − β 1 ) d b V_{dw} = \beta_1V_{dw} + (1-\beta_1)dW, V_{db} = \beta_1V_{db} + (1-\beta_1)db Vdw=β1Vdw+(1−β1)dW,Vdb=β1Vdb+(1−β1)db
S d w = β 2 S d w + ( 1 − β 2 ) ∗ ( d w ) 2 , S d b = β 2 S d b + ( 1 − β 2 ) ∗ ( d b ) 2 S_{dw} = \beta_2{S_{dw}} + (1-\beta_2)*(dw)^2, S_{db} = \beta_2{S_{db}} + (1-\beta_2)*(db)^2 Sdw=β2Sdw+(1−β2)∗(dw)2,Sdb=β2Sdb+(1−β2)∗(db)2
V d w c o r r e c t = V d w 1 − β t , V d b c o r r e c t = V d b 1 − β t {V_{dw}}^{correct} = \frac{V_{dw}}{1-\beta_t}, {V_{db}}^{correct} = \frac{V_{db}}{1-\beta_t} Vdwcorrect=1−βtVdw,Vdbcorrect=1−βtVdb
S d w c o r r e c t = S d w 1 − β t , S d b c o r r e c t = S d b 1 − β t {S_{dw}}^{correct} = \frac{S_{dw}}{1-\beta^t}, {S_{db}}^{correct} = \frac{S_{db}}{1-\beta^t} Sdwcorrect=1−βtSdw,Sdbcorrect=1−βtSdb
w : = w − α ∗ V d w c o r r e c t ( S d w c o r r e c t + ϵ ) , b : = b − α ∗ V d b c o r r e c t ( S d b c o r r e c t + ϵ ) w := w - \alpha*\frac{{V_{dw}}^{correct}}{\sqrt{({S_{dw}}^{correct} + \epsilon)}}, b := b - \alpha*\frac{{V_{db}}^{correct}}{\sqrt{({S_{db}}^{correct} + \epsilon)}} w:=w−α∗(Sdwcorrect+ϵ)Vdwcorrect,b:=b−α∗(Sdbcorrect+ϵ)Vdbcorrect
最后学习一下学习率衰减(learning rate decay)
- α = 1 1 + d e c a y _ r a t e ∗ α 0 \alpha = \frac{1}{1 + decay\_rate} * \alpha_0 α=1+decay_rate1∗α0
- α = 0.9 5 e p o c h _ n u m ∗ α 0 \alpha = 0.95^{epoch\_num} * \alpha_0 α=0.95epoch_num∗α0 // 指数衰减
- α = k e p o c h _ n u m ∗ α 0 \alpha = \frac{k}{\sqrt{epoch\_num}} * \alpha_0 α=epoch_numk∗α0
- 离散阶梯下降(discreate staircase)