1. 反向传播的优化算法
1.1 参数更新
在通过整个神经网络的一次正向过程之后,输出就是一个预测值
y
^
\hat{y}
y^。可以计算损失函数
L
L
L,这个案例中我们使用对数损失函数(log loss):
L
(
y
^
,
y
)
=
[
−
y
log
(
y
^
)
−
(
1
−
y
)
log
(
1
−
y
^
)
]
L(\hat{y},y)=[-y\log(\hat{y})-(1-y)\log(1-\hat{y})]
L(y^,y)=[−ylog(y^)−(1−y)log(1−y^)] 对任意的一个给定的层次
l
l
l,更新方法如下所示:
W
[
l
]
=
W
[
l
]
−
α
∂
L
∂
W
[
l
]
W^{[l]} = W^{[l]} - \alpha \frac{\partial L}{\partial W^{[l]}}
W[l]=W[l]−α∂W[l]∂L
b
[
l
]
=
b
[
l
]
−
α
∂
L
∂
b
[
l
]
b^{[l]} = b^{[l]} - \alpha \frac{\partial L}{\partial b^{[l]}}
b[l]=b[l]−α∂b[l]∂L
1.2 梯度计算
1.2.1 直接计算梯度
-
计算 ∂ L ∂ W [ 3 ] \frac{\partial L}{\partial W^{[3]}} ∂W[3]∂L
∂ L ∂ W [ 3 ] = ∂ ∂ W [ 3 ] [ − y log ( y ^ ) − ( 1 − y ) log ( 1 − y ^ ) ] = − y ∂ ∂ W [ 3 ] log ( g ( z [ 3 ] ) ) − ( 1 − y ) ∂ ∂ W [ 3 ] log ( 1 − g ( z [ 3 ] ) ) = − y 1 g ( z [ 3 ] ) g ′ ( z [ 3 ] ) ( z [ 3 ] ) ′ − ( 1 − y ) 1 1 − g ( z [ 3 ] ) ( − 1 ) g ′ ( z [ 3 ] ) ( z [ 3 ] ) ′ ( here g ′ = σ ′ = σ ( 1 − σ ) , a [ 3 ] = σ ( z [ 3 ] ) and ( z [ 3 ] ) ′ = W [ 3 ] a [ 2 ] + b [ 3 ] = a [ 2 ] T ) = − y ( 1 − a [ 3 ] ) a [ 2 ] T + ( 1 − y ) a [ 3 ] a [ 2 ] T = ( a [ 3 ] − y ) a [ 2 ] T \begin{aligned} \frac{\partial L}{\partial W^{[3]}} & =\frac{\partial }{\partial W^{[3]}} [-y\log(\hat{y})-(1-y)\log(1-\hat{y}) ]\\ & = -y \frac{\partial }{\partial W^{[3]}} \log(g(z^{[3]})) -(1-y) \frac{\partial }{\partial W^{[3]}} \log(1-g(z^{[3]})) \\ & =-y \frac{1}{g(z^{[3]})} g'(z^{[3]}) (z^{[3]})' -(1-y) \frac{1}{1-g(z^{[3]})} (-1) g'(z^{[3]}) (z^{[3]})' \\ & (\text{here } g'=\sigma'=\sigma(1-\sigma) \text{ , } a^{[3]}=\sigma(z^{[3]}) \text{ and } (z^{[3]})' =W^{[3]}a^{[2]}+b^{[3]}= {a^{[2]}}^T) \\ & =-y(1-a^{[3]}) {a^{[2]}}^T + (1-y) a^{[3]}{a^{[2]}}^T \\ & =(a^{[3]}-y){a^{[2]}}^T \end{aligned} ∂W[3]∂L=∂W[3]∂[−ylog(y^)−(1−y)log(1−y^)]=−y∂W[3]∂log(g(z[3]))−(1−y)∂W[3]∂log(1−g(z[3]))=−yg(z[3])1g′(z[3])(z[3])′−(1−y)1−g(z[3])1(−1)g′(z[3])(z[3])′(here g′=σ′=σ(1−σ) , a[3]=σ(z[3]) and (z[3])′=W[3]a[2]+b[3]=a[2]T)=−y(1−a[3])a[2]T+(1−y)a[3]a[2]T=(a[3]−y)a[2]T 注意上面用的函数 g ( . ) g(.) g(.) 是S型函数(sigmoid)。 -
计算 ∂ L ∂ W [ 2 ] \frac{\partial L}{\partial W^{[2]}} ∂W[2]∂L
∂ L ∂ W [ 2 ] = ( ∂ L ∂ a [ 3 ] ∂ a [ 3 ] ∂ z [ 3 ] ) ( ∂ z [ 3 ] ∂ a [ 2 ] ) ( ∂ a [ 2 ] ∂ z [ 2 ] ) ( ∂ z [ 2 ] ∂ W [ 2 ] ) here ∂ z [ 3 ] ∂ W [ 3 ] = a [ 2 ] and ∂ L ∂ W [ 3 ] = ( a [ 3 ] − y ) ∂ z [ 3 ] ∂ W [ 3 ] ⇒ ∂ L ∂ z [ 3 ] = ( a [ 3 ] − y ) = ( a [ 3 ] − y ) ( W [ 3 ] ) ( g ′ ( z [ 2 ] ) ) ( a [ 1 ] ) = W [ 3 ] ∘ g ′ ( z [ 2 ] ) ( a [ 3 ] − y ) a [ 1 ] T \begin{aligned} \frac{\partial L}{\partial W^{[2]}} & = (\frac{\partial L}{\partial a^{[3]}}\frac{\partial a^{[3]}}{\partial z^{[3]}})(\frac{\partial z^{[3]}}{\partial a^{[2]}})(\frac{\partial a^{[2]}}{\partial z^{[2]}})(\frac{\partial z^{[2]}}{\partial W^{[2]}})\\ & \text{here } \frac{\partial z^{[3]}}{\partial W^{[3]}}=a^{[2]} \text{ and } \frac{\partial L}{\partial W^{[3]}} = (a^{[3]}-y)\frac{\partial z^{[3]}}{\partial W^{[3]}} \Rightarrow \frac{\partial L}{\partial z^{[3]}}=(a^{[3]}-y) \\ &= (a^{[3]}-y)(W^{[3]})(g'(z^{[2]}))(a^{[1]}) \\ &= W^{[3]} \circ g'(z^{[2]})(a^{[3]}-y){a^{[1]}}^T \end{aligned} ∂W[2]∂L=(∂a[3]∂L∂z[3]∂a[3])(∂a[2]∂z[3])(∂z[2]∂a[2])(∂W[2]∂z[2])here ∂W[3]∂z[3]=a[2] and ∂W[3]∂L=(a[3]−y)∂W[3]∂z[3]⇒∂z[3]∂L=(a[3]−y)=(a[3]−y)(W[3])(g′(z[2]))(a[1])=W[3]∘g′(z[2])(a[3]−y)a[1]T
1.2.2误差计算梯度
误差为损失函数的微分: δ [ l ] = ∇ z [ l ] L ( y ^ , y ) \delta^{[l]}=\nabla_{z^{[l]}}L(\hat{y},y) δ[l]=∇z[l]L(y^,y)
- 对于输出层 N N N: δ [ N ] = ∇ z [ N ] L ( y ^ , y ) \delta^{[N]}=\nabla_{z^{[N]}}L(\hat{y},y) δ[N]=∇z[N]L(y^,y)
- 若 g [ N ] g^{[N]} g[N] 是softmax,直接计算 ∇ z [ N ] L ( y ^ , y ) \nabla_{z^{[N]}}L(\hat{y},y) ∇z[N]L(y^,y)
- 若
g
[
N
]
g^{[N]}
g[N] 是sigmoid,应用链式法则
∇
z
[
N
]
L
(
y
^
,
y
)
=
∇
y
^
L
(
y
^
,
y
)
∘
g
′
(
z
[
N
]
)
\nabla_{z^{[N]}}L(\hat{y},y) = \nabla_{\hat{y}}L(\hat{y},y) \circ g'(z^{[N]})
∇z[N]L(y^,y)=∇y^L(y^,y)∘g′(z[N])
注意 g ′ ( z [ N ] ) g'(z^{[N]}) g′(z[N]) 表示的是关于 z [ N ] z^{[N]} z[N] 的按元素的导数(elementwise derivative)
- 对 l = N − 1 , N − 2 , … , 1 l=N-1,N-2,\dots,1 l=N−1,N−2,…,1 则有: δ [ l ] = ( W [ l + 1 ] T δ [ l + 1 ] ) ∘ g ′ ( z [ l ] ) \delta^{[l]}=({W^{[l+1]}}^T \delta^{[l+1]}) \circ g'(z^{[l]}) δ[l]=(W[l+1]Tδ[l+1])∘g′(z[l])
上文中的小圆圈负号
∘
\circ
∘ 表示元素积(elementwise product)。
要注意上面的过程是对应单个训练样本的。
应用到上述逻辑回归中可知:
∂
L
∂
W
[
3
]
=
(
a
[
3
]
−
y
)
a
[
2
]
T
=
δ
[
3
]
a
[
2
]
T
\frac{\partial L}{\partial W^{[3]}}=(a^{[3]}-y){a^{[2]}}^T=\delta^{[3]}{a^{[2]}}^T
∂W[3]∂L=(a[3]−y)a[2]T=δ[3]a[2]T
∂
L
∂
W
[
2
]
=
W
[
3
]
(
a
[
3
]
−
y
)
∘
g
′
(
z
[
2
]
)
a
[
1
]
T
=
δ
[
2
]
a
[
1
]
T
\frac{\partial L}{\partial W^{[2]}}=W^{[3]}(a^{[3]}-y) \circ g'(z^{[2]}){a^{[1]}}^T=\delta^{[2]}{a^{[1]}}^T
∂W[2]∂L=W[3](a[3]−y)∘g′(z[2])a[1]T=δ[2]a[1]T
1.3 优化算法
1.3.1 梯度下降(gradient descent)
对任意一个单层 l l l,更新规则的定义为: W [ l ] = W [ l ] − α ∂ J ∂ W [ l ] W^{[l]} = W^{[l]} - \alpha \frac{\partial J}{\partial W^{[l]}} W[l]=W[l]−α∂W[l]∂J
1.3.1.1 batch 梯度下降
J = 1 m ∑ i m L ( i ) J=\frac{1}{m}\sum^m_i L^{(i)} J=m1i∑mL(i) 是成本函数(cost function),而其中的 L ( i ) L^{(i)} L(i) 是对单个样本的损失函数值(loss)。
1.3.1.2 随机梯度下降(stochastic gradient descent)
J s g d = L ( i ) J_{sgd}= L^{(i)} Jsgd=L(i) 即每个epoch只计算单个样本的损失函数值(loss)
1.3.1.3 小批量梯度下降(mini-batch gradient descent)
J m b = 1 B ∑ i B L ( i ) J_{mb}=\frac{1}{B}\sum^B_i L^{(i)} Jmb=B1i∑BL(i) 即每个epoch计算 B B B 个样本的损失函数值并求均值
1.3.2 动量优化(momentum optimization)
对任意一个单层
l
l
l,更新规则的定义为:
{
ν
d
W
[
l
]
=
β
ν
d
W
[
l
]
+
(
1
−
β
)
∂
J
∂
W
[
l
]
W
[
l
]
=
W
[
l
]
−
α
ν
d
W
[
l
]
\left\{ \begin{aligned} \nu_{dW^{[l]}} & = \beta \nu_{dW^{[l]}} + (1-\beta)\frac{\partial J}{\partial W^{[l]}} \\ W^{[l]} & = W^{[l]} - \alpha \nu_{dW^{[l]}} \end{aligned} \right.
⎩⎨⎧νdW[l]W[l]=βνdW[l]+(1−β)∂W[l]∂J=W[l]−ανdW[l]
注意这里的更新规则有两步,而不是之前的单步了。
权重(weight)的更新现在依赖于在这一更新步骤的成本函数
J
J
J以及速度(velocity)
ν
d
W
[
l
]
\nu_{dW^{[l]}}
νdW[l] 相对重要程度(relative importance)受到
β
\beta
β 的控制。
设想模拟一个人开车。在动的时候,汽车有动量(momentum)。如果踩了刹车或者油门,汽车由于有动量会继续移动。回到优化上,速度(velocity)
ν
d
W
[
l
]
\nu_{dW^{[l]}}
νdW[l] 就会在时间上跟踪梯度。
这个技巧对训练阶段的神经网络有很大帮助。
1.4 参考资料
cs229笔记-优化optimization
coursera-deep learning 第二门课:改善深度神经网络 week2 优化算法
2. 参数分析
这时候已经初始化过参数了,并且也优化出了这些参数。加入我们对训练出来的模型进行应用评估发现在训练集商贸能够达到96%的准确率,但在测试集上准确率只有64%。解决的思路包括:收集更多数据,进行规范化,或者让模型更浅(shallower)。下面简单讲解一下规范化的技术。
2.1 L2正则化(Regularization)
设下面的
W
W
W 表示的是一个模型中的所有参数。对成本函数进行
L
2
L2
L2 正则化:
J
L
2
=
J
+
λ
2
∣
∣
W
∣
∣
2
=
J
+
λ
2
∑
i
j
∣
∣
W
i
j
∣
∣
2
=
J
+
λ
2
W
T
W
J_{L2} = J + \frac{\lambda}{2}||W||^2=J + \frac{\lambda}{2}\sum_{ij}||W_{ij}||^2= J + \frac{\lambda}{2}W^TW
JL2=J+2λ∣∣W∣∣2=J+2λij∑∣∣Wij∣∣2=J+2λWTW 上式中的
J
J
J 是前文提到过的标准成本函数,
λ
\lambda
λ 是一个任意值,越大表示更加规范化,而
W
W
W 包含所有的权重矩阵(weight matrices)。
这样L2规范化的更新规则更改为:
W
=
W
−
α
∂
J
∂
W
−
α
λ
2
∂
W
T
W
∂
W
=
(
1
−
α
λ
)
W
−
α
∂
J
∂
W
W=W-\alpha \frac{\partial J}{\partial W}-\alpha \frac{\lambda}{2}\frac{\partial W^TW}{\partial W}=(1-\alpha \lambda)W-\alpha \frac{\partial J}{\partial W}
W=W−α∂W∂J−α2λ∂W∂WTW=(1−αλ)W−α∂W∂J 通过L2规范化,每个更新会加入某一个惩罚项(penalization),这个惩罚项依赖于权重
W
W
W。这个惩罚项(penalization)会增加成本函数(cost)
J
J
J 的值,这样可以鼓励单个参数值在程度上(in magnitude)尽量缩小,这是一种降低过拟合(overfitting)发生概率的办法。
2.2 参数共享(Parameter Sharing)
卷积神经网络(convolutional neural networks)