第九章 神经网络:学习(Neural Networks: Learning)(一)
第1节 代价函数和反向传播(Cost Function and Backpropagation)
9.1 代价函数
参考视频 : 9 - 1 - Cost Function (7 min).mkv
首先引入一些便于讨论的标记。假设神经网络的训练样本有 m m m个,每个样本包含输入 x x x和类标签 y y y。用 L L L表示神经网络层数, S l S_l Sl表示第 l l l层的神经元个数,所以 S L S_L SL就是最后一层输出层的神经元个数。
将基于神经网络的分类分为两种情况:二分类和多分类。在二分类中,输出层只有一个神经元。在多分类中,输出层有
K
K
K个神经元(K为分类的个数)。如下图,
回顾一下逻辑回归的代价函数(第二项是正则化项):
J
(
θ
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
log
h
θ
(
x
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
]
+
λ
2
m
∑
j
=
1
n
θ
j
2
J(\theta)=-\frac {1}{m}\sum_{i=1}^{m} \left[y^{(i)}\log h_{\theta}(x^{(i)}) + (1-y^{(i)}) \log(1-h_{\theta}(x^{(i)}))\right]+\frac{\lambda}{2m}\sum_{j=1}^{n}\theta_j^2
J(θ)=−m1i=1∑m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]+2mλj=1∑nθj2
在逻辑回归中,我们的输出结果 h θ ( x ) h_{\theta}(x) hθ(x)是一个标量值,类标签y也是标量值。在神经网络中,二分类也是如此。但对于多(K)分类来说,输出结果 h θ ( x ) h_{\theta}(x) hθ(x)是K维向量,所以我们训练集中的类标签 y y y也得转化为K维向量。神经网络的一般化代价函数: J ( Θ ) = − 1 m ∑ t = 1 m ∑ k = 1 K [ y k ( t ) log ( h Θ ( x ( t ) ) k ) + ( 1 − y k ( t ) ) log ( 1 − h Θ ( x ( t ) ) k ) ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( Θ j , i ( l ) ) 2 J(\Theta) = - \frac{1}{m} \sum_{t=1}^m\sum_{k=1}^K \left[ y^{(t)}_k \ \log (h_\Theta (x^{(t)})_k) + (1 - y^{(t)}_k)\ \log (1 - h_\Theta(x^{(t)})_k)\right] + \frac{\lambda}{2m}\sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_{l+1}} ( \Theta_{j,i}^{(l)})^2 J(Θ)=−m1t=1∑mk=1∑K[yk(t) log(hΘ(x(t))k)+(1−yk(t)) log(1−hΘ(x(t))k)]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θj,i(l))2
如前文所说,神经网络实现二分类用 1 1 1个输出单元即可。为了一般化,我们用 2 2 2个输出单元( K = 2 K=2 K=2)表示二分类。虽然神经网络的代价函数看起来非常复杂,但其背后的思想还是一样的:我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大。
注意: h Θ ( x ) h_\Theta (x) hΘ(x)中下标 Θ \Theta Θ表示所有的权重矩阵,表示数据 x x x做每一层权重矩阵的作用下达到最后一层输出,该值就是最后一层的输出结果。第一项中,里层的循环 k k k循环输出层的 k k k个输出值,外层循环 t t t循环所有的数据, y k ( i ) y^{(i)}_k yk(i)表示类标签向量 y ( i ) y^{(i)} y(i)中第k个元素。第二项是正则化项,它排除了每一层权重矩阵的第一列( θ 0 \theta_0 θ0不进行正则化)并计算每一层权重矩阵其他元素的元素之和,里层的循环 j j j循环所有的行( j = 1 j=1 j=1代表权重矩阵第一行),循环 i i i循环所有的列( i = 1 i=1 i=1代表权重矩阵第二列。 i = 0 i=0 i=0代表第一列,相当于回归问题中的 θ 0 \theta_0 θ0),外层的求和循环层数 1 1 1到 L − 1 L-1 L−1。
用作业中的编程题举个例子:输入数据X大小为
5000
∗
400
5000*400
5000∗400,类别y为0、1、2、3、4、5、6、7、8、9、10(10代表0)10个类别。神经网络共有3层,输入层有400个神经元(不包括偏置单元),中间层有25个神经元(不包括偏置单元),输出层有10个神经元。所以输入层的权重矩阵
Θ
1
\Theta_1
Θ1大小为
25
∗
401
25*401
25∗401,中间层的权重矩阵
Θ
2
\Theta_2
Θ2大小为
10
∗
26
10*26
10∗26。
该网络的代价函数如下,其中m=5000,K=10,而且不对 θ 0 \theta_0 θ0进行惩罚。 J ( Θ ) = − 1 m ∑ t = 1 m ∑ k = 1 K [ y k ( t ) log ( h Θ ( x ( t ) ) k ) + ( 1 − y k ( t ) ) log ( 1 − h Θ ( x ( t ) ) k ) ] + λ 2 m [ ∑ j = 1 25 ∑ i = 1 400 ( Θ j , i ( 1 ) ) 2 + ∑ j = 1 10 ∑ i = 1 25 ( Θ j , i ( 2 ) ) 2 ] J(\Theta) = - \frac{1}{m} \sum_{t=1}^m\sum_{k=1}^K \left[ y^{(t)}_k \ \log (h_\Theta (x^{(t)})_k) + (1 - y^{(t)}_k)\ \log (1 - h_\Theta(x^{(t)})_k)\right] + \frac{\lambda}{2m} \left[\sum_{j=1}^{25}\sum_{i=1}^{400}(\Theta^{(1)}_{j,i})^{2} + \sum_{j=1}^{10}\sum_{i=1}^{25}(\Theta^{(2)}_{j,i})^2\right] J(Θ)=−m1t=1∑mk=1∑K[yk(t) log(hΘ(x(t))k)+(1−yk(t)) log(1−hΘ(x(t))k)]+2mλ[j=1∑25i=1∑400(Θj,i(1))2+j=1∑10i=1∑25(Θj,i(2))2]
9.2 反向传播算法
参考视频:9 - 2 - Backpropagation Algorithm (12 min).mkv
之前在计算神经网络输出层结果时我们采用了一种正向传播算法,我们从第一层开始正向一层一层进行计算,直到得到输出层的 h θ ( x ) h_{\theta}(x) hθ(x)。
现在,为了计算代价函数的偏导数 ∂ ∂ Θ j , i ( l ) J ( Θ ) \dfrac{\partial}{\partial \Theta_{j,i}^{(l)}}J(\Theta) ∂Θj,i(l)∂J(Θ),我们需要采用一种反向传播算法。反向传播算法是神经网络中的术语,它就像线性回归和逻辑回归中的梯度下降一样,用来最小化神经网络的代价函数。
反向传播算法的大致过程为:首先计算最后一层的误差,然后再一层一层反向求出各层的误差,进而调节权重矩阵,找到使误差函数达到一个极小值的权重矩阵 Θ \Theta Θ。因为要计算最后一层的误差,所以需要借助正向传播算法计算初每一层的输出值!
我们用一条数据**(x, y)**开始讲起。下图为正向传播算法和一个四层的神经网络,以此为例。
输出层的误差是 δ ( 4 ) = a ( 4 ) − y \delta^{(4)} = a^{(4)} - y δ(4)=a(4)−y。第 l l l层的误差是 δ ( l ) δ ( l ) = a ( l ) − y ( l ) \delta^{(l)}\delta^{(l)} = a^{(l)} - y^{(l)} δ(l)δ(l)=a(l)−y(l),其中第 j j j个结点的误差是 δ j ( l ) = a j ( l ) − y j ( l ) \delta_j^{(l)}= a^{(l)}_j - y^{(l)}_j δj(l)=aj(l)−yj(l)。由当前层的误差计算前一层的误差: δ ( l ) = ( ( Θ ( l ) ) T δ ( l + 1 ) ) . ∗ g ′ ( z ( l ) ) \color{Red}{\delta^{(l)} = ((\Theta^{(l)})^T \delta^{(l+1)})\ .*\ g'(z^{(l)})} δ(l)=((Θ(l))Tδ(l+1)) .∗ g′(z(l)),其中 g ′ ( z ( l ) ) = a ( l ) . ∗ ( 1 − a ( l ) ) \color{Red}{g'(z^{(l)}) = a^{(l)}\ .*\ (1 - a^{(l)})} g′(z(l))=a(l) .∗ (1−a(l))。【数学证明参考:Coursera机器学习笔记 第5周 第九章 神经网络 相关数学公式证明】
总结一下,一条数据的反向传播为:
- 计算输出层的误差: δ ( 4 ) = a ( 4 ) − y \delta^{(4)} = a^{(4)} - y δ(4)=a(4)−y
- 计算第三层的误差: δ ( 3 ) = ( ( Θ ( 3 ) ) T δ ( 4 ) ) . ∗ a ( 3 ) . ∗ ( 1 − a ( 3 ) ) \delta^{(3)} = ((\Theta^{(3)})^T \delta^{(4)})\ .*\ a^{(3)}\ .*\ (1 - a^{(3)}) δ(3)=((Θ(3))Tδ(4)) .∗ a(3) .∗ (1−a(3))
- 计算第二层的误差: δ ( 2 ) = ( ( Θ ( 2 ) ) T δ ( 3 ) ) . ∗ a ( 2 ) . ∗ ( 1 − a ( 2 ) ) \delta^{(2)} = ((\Theta^{(2)})^T \delta^{(3)})\ .*\ a^{(2)}\ .*\ (1 - a^{(2)}) δ(2)=((Θ(2))Tδ(3)) .∗ a(2) .∗ (1−a(2))。第一层是输入变量,不存在误差,所以到第二层即可。
- 为什么计算每一层的误差 δ \delta δ ?因为经过一系列复杂的求导后,我们通过 δ \delta δ 可以计算代价函数对每一层权重矩阵的每一个参数的偏导数(无正则化处理或 λ = 0 \lambda=0 λ=0): ∂ ∂ Θ j , i ( l ) J ( Θ ) = δ j ( l + 1 ) a i ( l ) \dfrac{\partial}{\partial \Theta_{j,i}^{(l)}}J(\Theta) = \delta^{(l+1)}_j a^{(l)}_i ∂Θj,i(l)∂J(Θ)=δj(l+1)ai(l),其中每个元素都是一个实数!
现在,我们使用整个数据集来说明反向传播算法,每一条数据的处理过程与上面的 (x,y) 相同。伪代码如下:
Training set:
{
(
x
(
1
)
,
y
(
1
)
)
⋯
(
x
(
m
)
,
y
(
m
)
)
}
\lbrace (x^{(1)}, y^{(1)}) \cdots (x^{(m)}, y^{(m)})\rbrace
{(x(1),y(1))⋯(x(m),y(m))}
Set
Δ
i
,
j
(
l
)
\Delta^{(l)}_{i,j}
Δi,j(l) (for all l,i,j) // 累加m条数据的偏导数,其形状大小和
Θ
(
l
)
\Theta^{(l)}
Θ(l)相同
Set
D
i
,
j
(
l
)
D^{(l)}_{i,j}
Di,j(l) (for all l,i,j) // 得到最终的偏导数
For t = 1 to m
- Set a ( 1 ) a^{(1)} a(1) = x ( t ) x^{(t)} x(t)
- Perform forward propagation to compute a ( l ) a^{(l)} a(l) for l = 2 , 3 , … , L l=2,3,…,L l=2,3,…,L
- Using y ( i ) y^{(i)} y(i), compute δ ( l ) = a ( l ) − y ( l ) \delta^{(l)} = a^{(l)} - y^{(l)} δ(l)=a(l)−y(l)
- Compute δ ( L − 1 ) , δ ( L − 2 ) , . . . , δ ( 2 ) \delta^{(L-1)},\delta^{(L-2)},...,\delta^{(2)} δ(L−1),δ(L−2),...,δ(2) using δ ( l ) = ( ( Θ ( l ) ) T δ ( l + 1 ) ) . ∗ a ( l ) . ∗ ( 1 − a ( l ) ) \delta^{(l)} = ((\Theta^{(l)})^T \delta^{(l+1)})\ .*\ a^{(l)}\ .*\ (1 - a^{(l)}) δ(l)=((Θ(l))Tδ(l+1)) .∗ a(l) .∗ (1−a(l))
- Δ i j ( l ) : = Δ i j ( l ) + a j ( l ) δ i ( l + 1 ) \Delta^{(l)}_{ij} := \Delta^{(l)}_{ij} + a^{(l)}_{j}\delta^{(l+1)}_i Δij(l):=Δij(l)+aj(l)δi(l+1), or with vectorization, Δ ( l ) : = Δ ( l ) + δ ( l + 1 ) ( a ( l ) ) T \Delta^{(l)} := \Delta^{(l)} + \delta^{(l+1)}(a^{(l)})^T Δ(l):=Δ(l)+δ(l+1)(a(l))T
End
D
i
,
j
(
l
)
:
=
1
m
Δ
i
,
j
(
l
)
+
λ
Θ
i
j
(
j
)
i
f
j
≠
0
D^{(l)}_{i,j} := \frac{1}{m}\Delta^{(l)}_{i,j} + \lambda\Theta^{(j)}_{ij} \ \ \ if\ j \neq 0
Di,j(l):=m1Δi,j(l)+λΘij(j) if j̸=0
D
i
,
j
(
l
)
:
=
1
m
Δ
i
,
j
(
l
)
i
f
j
=
0
D^{(l)}_{i,j} := \frac{1}{m}\Delta^{(l)}_{i,j} \quad \quad \quad \quad if\ j = 0
Di,j(l):=m1Δi,j(l)if j=0
所以我们最终的偏导数矩阵结果为: ∂ ∂ Θ i j ( l ) J ( Θ ) = D i j ( l ) \frac \partial {\partial \Theta_{ij}^{(l)}} J(\Theta) = D_{ij}^{(l)} ∂Θij(l)∂J(Θ)=Dij(l),而且其中的每个元素都是一个实数!
另外在Matlab/Octave中,如果我们要使用fminuc这样的优化算法来求解权重矩阵,我们需要将矩阵展开为向量,然后利用优化算法求出最优解后再重新转化为权重矩阵。
9.3 反向传播算法的直观理解
参考视频:9 - 3 - Backpropagation Intuition (13 min).mkv
反向传播算法需要很多复杂的步骤,以致于不知道应该怎么使用。感觉反向传播算法就像一个黑箱,里面充满了复杂的东西。有这样的感觉是正常的,相比于线性回归算法和逻辑回归算法而言,反向传播在数学上一点也不简洁。我将这些复杂的步骤梳理了一遍,希望能让你有一个直观的理解,另外做编程练习作业或多或少能帮助你。
以下图中的神经网络为例:
还是从正向传播开始,只用一条训练数据 ( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)}) (x(i),y(i))。正向传播就是从训练数据 ( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)}) (x(i),y(i)),依次计算第二层 z 1 ( 2 ) , z 2 ( 2 ) , a 1 ( 2 ) , a 2 ( 2 ) z^{(2)}_1, z^{(2)}_2, a^{(2)}_1, a^{(2)}_2 z1(2),z2(2),a1(2),a2(2),第三层 z 1 ( 3 ) , z 2 ( 3 ) , a 1 ( 3 ) , a 2 ( 3 ) z^{(3)}_1, z^{(3)}_2, a^{(3)}_1, a^{(3)}_2 z1(3),z2(3),a1(3),a2(3),直到最后一层 z 1 ( 4 ) , a 1 ( 4 ) z^{(4)}_1, a^{(4)}_1 z1(4),a1(4)。
神经网络的一般化代价函数为: J ( Θ ) = − 1 m ∑ t = 1 m ∑ k = 1 K [ y k ( t ) log ( h Θ ( x ( t ) ) k ) + ( 1 − y k ( t ) ) log ( 1 − h Θ ( x ( t ) ) k ) ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( Θ j , i ( l ) ) 2 J(\Theta) = - \frac{1}{m} \sum_{t=1}^m\sum_{k=1}^K \left[ y^{(t)}_k \ \log (h_\Theta (x^{(t)})_k) + (1 - y^{(t)}_k)\ \log (1 - h_\Theta(x^{(t)})_k)\right] + \frac{\lambda}{2m}\sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_l+1} ( \Theta_{j,i}^{(l)})^2 J(Θ)=−m1t=1∑mk=1∑K[yk(t) log(hΘ(x(t))k)+(1−yk(t)) log(1−hΘ(x(t))k)]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θj,i(l))2
对一条训练数据来说,并忽略正则化,代价函数变为(下图中的公式错了): C o s t ( x ) = − [ y log ( h Θ ( x ) ) + ( 1 − y ) log ( 1 − h Θ ( x ) ) ] Cost(x) = - \left[ y \ \log (h_\Theta (x)) + (1 - y)\ \log (1 - h_\Theta(x))\right] Cost(x)=−[y log(hΘ(x))+(1−y) log(1−hΘ(x))]
记住:
h
Θ
(
x
)
=
a
(
4
)
h_\Theta (x) = a^{(4)}
hΘ(x)=a(4)。代价函数对
z
1
(
4
)
z_1^{(4)}
z1(4)求导得:
∂
∂
z
1
(
4
)
C
o
s
t
(
x
)
=
δ
1
(
4
)
\dfrac{\partial}{\partial z_1^{(4)}} Cost(x) = \delta_1^{(4)}
∂z1(4)∂Cost(x)=δ1(4)。另外
δ
1
(
4
)
\delta^{(4)}_1
δ1(4)是
a
1
(
4
)
a^{(4)}_1
a1(4)的误差(
δ
1
(
4
)
=
a
1
(
4
)
−
y
1
(
4
)
\delta^{(4)}_1 = a^{(4)}_1 - y^{(4)}_1
δ1(4)=a1(4)−y1(4)),误差
δ
(
4
)
\delta^{(4)}
δ(4)恰好是代价函数对
z
(
4
)
z^{(4)}
z(4)的偏导数!
反向传播中的误差计算:
- 最后一层, δ 1 ( 4 ) = a 1 ( 4 ) − y ( i ) \delta^{(4)}_1 =a^{(4)}_1- y^{(i)} δ1(4)=a1(4)−y(i)(图片中右上角公式错了)
- 第三层, δ 1 ( 3 ) = Θ 11 ( 3 ) ∗ δ 1 ( 4 ) , δ 2 ( 3 ) = Θ 12 ( 3 ) ∗ δ 1 ( 4 ) \delta^{(3)}_1=\Theta^{(3)}_{11}*\delta^{(4)}_1,\delta^{(3)}_2=\Theta^{(3)}_{12}*\delta^{(4)}_1 δ1(3)=Θ11(3)∗δ1(4),δ2(3)=Θ12(3)∗δ1(4)
- 第二层, δ 1 ( 2 ) = Θ 11 ( 2 ) ∗ δ 1 ( 3 ) + Θ 21 ( 2 ) ∗ δ 2 ( 3 ) , δ 2 ( 2 ) = Θ 12 ( 2 ) ∗ δ 1 ( 3 ) + Θ 22 ( 2 ) ∗ δ 2 ( 3 ) \delta^{(2)}_1=\Theta^{(2)}_{11}*\delta^{(3)}_1+\Theta^{(2)}_{21}*\delta^{(3)}_2,\delta^{(2)}_2=\Theta^{(2)}_{12}*\delta^{(3)}_1+\Theta^{(2)}_{22} *\delta^{(3)}_2 δ1(2)=Θ11(2)∗δ1(3)+Θ21(2)∗δ2(3),δ2(2)=Θ12(2)∗δ1(3)+Θ22(2)∗δ2(3)(就是加权求和)
资料: