《吴恩达机器学习》笔记——10 神经网络参数的反向传播算法
1 代价函数
参数 | 表达 |
---|---|
训练集 | { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , … , ( x ( m ) , y ( m ) ) } \{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),\dots,(x^{(m)},y^{(m)})\} {(x(1),y(1)),(x(2),y(2)),…,(x(m),y(m))} |
L L L | 神经网络结构的总层数 |
s l s_l sl | 第 l l l层的单元数(不包括第 l l l层的偏差单元) |
分类 | 二元分类 | 多元分类( K K K类) |
---|---|---|
y y y | y = 0 o r 1 y=0\;or\;1 y=0or1 |
y
∈
R
K
y\in\mathbb{R}^K
y∈RK 例 如 [ 1 0 0 0 ] , [ 0 1 0 0 ] , [ 0 0 1 0 ] , [ 0 0 0 1 ] 例如\left[\begin{matrix}1\\0\\0\\0\end{matrix}\right],\left[\begin{matrix}0\\1\\0\\0\end{matrix}\right],\left[\begin{matrix}0\\0\\1\\0\end{matrix}\right],\left[\begin{matrix}0\\0\\0\\1\end{matrix}\right] 例如⎣⎢⎢⎡1000⎦⎥⎥⎤,⎣⎢⎢⎡0100⎦⎥⎥⎤,⎣⎢⎢⎡0010⎦⎥⎥⎤,⎣⎢⎢⎡0001⎦⎥⎥⎤ |
输出单元个数 | 1 | K ( K ⩾ 3 ) K(K\geqslant3) K(K⩾3) |
- | 代价函数 |
---|---|
逻辑回归 | 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}\left[\sum\limits^m_{i=1}y^{(i)}\log h_\theta(x^{(i)})+(1-y^{(i)})\log(1-h_\theta(x^{(i)}))\right]\\+\frac{\lambda}{2m}\sum\limits^n_{j=1}\theta_j^2 J(θ)=−m1[i=1∑my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]+2mλj=1∑nθj2 |
神经网络 |
J
(
Θ
)
=
−
1
m
[
∑
i
=
1
m
∑
k
=
1
K
y
k
(
i
)
log
(
h
Θ
(
x
(
i
)
)
)
k
+
(
1
−
y
k
(
i
)
)
log
(
1
−
(
h
Θ
(
x
(
i
)
)
)
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}\left[\sum\limits^m_{i=1}\sum\limits^K_{k=1}y^{(i)}_k\log( h_\Theta(x^{(i)}))_k+(1-y^{(i)}_k)\log(1-(h_\Theta(x^{(i)}))_k)\right]\\+\frac{\lambda}{2m}\sum\limits^{L-1}_{l=1}\sum\limits^{s_l}_{i=1}\sum\limits^{s_{l+1}}_{j=1}(\Theta_{ji}^{(l)})^2
J(Θ)=−m1[i=1∑mk=1∑Kyk(i)log(hΘ(x(i)))k+(1−yk(i))log(1−(hΘ(x(i)))k)]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θji(l))2 ( h Θ ( x ) ∈ R K ( h Θ ( x ) ) i : 第 i 个 输 出 ) \left(h_\Theta(x)\in\mathbb{R}^K\quad(h_\Theta(x))_i:第i个输出\right) (hΘ(x)∈RK(hΘ(x))i:第i个输出) |
2 反向传播算法(Back Propagation Algorithm)
- | 表达 |
---|---|
J ( Θ ) J(\Theta) J(Θ) | − 1 m [ ∑ i = 1 m ∑ k = 1 K y k ( i ) log ( h Θ ( x ( i ) ) ) k + ( 1 − y k ( i ) ) log ( 1 − ( h Θ ( x ( i ) ) ) k ) ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( Θ j i ( l ) ) 2 -\frac{1}{m}\left[\sum\limits^m_{i=1}\sum\limits^K_{k=1}y^{(i)}_k\log( h_\Theta(x^{(i)}))_k+(1-y^{(i)}_k)\log(1-(h_\Theta(x^{(i)}))_k)\right]\\+\frac{\lambda}{2m}\sum\limits^{L-1}_{l=1}\sum\limits^{s_l}_{i=1}\sum\limits^{s_{l+1}}_{j=1}(\Theta_{ji}^{(l)})^2 −m1[i=1∑mk=1∑Kyk(i)log(hΘ(x(i)))k+(1−yk(i))log(1−(hΘ(x(i)))k)]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θji(l))2 |
目标 | min Θ J ( Θ ) \min\limits_\Theta J(\Theta) ΘminJ(Θ) |
计算 |
J
(
Θ
)
J(\Theta)
J(Θ) ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) ∂Θij(l)∂J(Θ) |
- | 反向传播(假设 L = 4 L=4 L=4) |
---|---|
概念 | 对于每一个结点,计算 δ j ( l ) \delta^{(l)}_j δj(l):第 l l l层的第 j j j个结点的误差 |
δ j ( 4 ) \delta^{(4)}_j δj(4) | a j ( 4 ) − y j = ( h Θ ( x ) ) j − y j a^{(4)}_j-y_j=(h_\Theta(x))_j-y_j aj(4)−yj=(hΘ(x))j−yj |
δ ( 4 ) \delta^{(4)} δ(4) | a ( 4 ) − y a^{(4)}-y a(4)−y |
δ ( 3 ) \delta^{(3)} δ(3) | ( Θ ( 3 ) ) T δ ( 4 ) . ∗ g ′ ( z ( 3 ) ) (\Theta^{(3)})^\mathrm{T}\delta^{(4)}.*g'(z^{(3)}) (Θ(3))Tδ(4).∗g′(z(3)) |
δ ( 2 ) \delta^{(2)} δ(2) | ( Θ ( 2 ) ) T δ ( 3 ) . ∗ g ′ ( z ( 2 ) ) (\Theta^{(2)})^\mathrm{T}\delta^{(3)}.*g'(z^{(2 )}) (Θ(2))Tδ(3).∗g′(z(2)) |
g ′ ( z ( 3 ) ) g'(z^{(3)}) g′(z(3)) | a ( 3 ) . ∗ ( 1 − a ( 3 ) ) a^{(3)}.*(1-a^{(3)}) a(3).∗(1−a(3)) |
g ′ ( z ( 2 ) ) g'(z^{(2)}) g′(z(2)) | a ( 2 ) . ∗ ( 1 − a ( 2 ) ) a^{(2)}.*(1-a^{(2)}) a(2).∗(1−a(2)) |
∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta^{(l)}_{ij}}J(\Theta) ∂Θij(l)∂J(Θ) | a j ( l ) δ i ( l + 1 ) a_j^{(l)}\delta_i^{(l+1)} aj(l)δi(l+1)(忽略 λ \lambda λ或者 λ = 0 \lambda=0 λ=0) |
- | 反向传播算法 |
---|---|
训练集 | { ( x ( 1 ) , y ( 1 ) ) , … , ( x ( m ) , y ( m ) ) } \{(x^{(1)},y^{(1)}),\dots,(x^{(m)},y^{(m)})\} {(x(1),y(1)),…,(x(m),y(m))} |
设 Δ i j ( l ) \Delta_{ij}^{(l)} Δij(l) | 0(用于计算 ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta^{(l)}_{ij}}J(\Theta) ∂Θij(l)∂J(Θ)) |
f o r i = 1 : m for\;i=1:m fori=1:m | 设
a
(
1
)
=
x
(
i
)
a^{(1)}=x^{(i)}
a(1)=x(i) 前向传播计算 a ( l ) , l = 2 , 3 , … , L a^{(l)},l=2,3,\dots,L a(l),l=2,3,…,L 计算 δ ( L ) = a ( L ) − y ( i ) \delta^{(L)}=a^{(L)}-y^{(i)} δ(L)=a(L)−y(i) 计算 δ ( L − 1 ) , δ ( L − 2 ) , … , δ ( 2 ) \delta^{(L-1)},\delta^{(L-2)},\dots,\delta^{(2)} δ(L−1),δ(L−2),…,δ(2) ( Δ i j ( l ) : = Δ i j ( l ) + a j ( l ) δ i ( l + 1 ) ) \left(\Delta^{(l)}_{ij}:=\Delta^{(l)}_{ij}+a_j^{(l)}\delta_i^{(l+1)}\right) (Δij(l):=Δij(l)+aj(l)δi(l+1)) Δ ( l ) : = Δ ( l ) + δ ( l + 1 ) ( a ( l ) ) T \Delta^{(l)}:=\Delta^{(l)}+\delta^{(l+1)}(a^{(l)})^\mathrm{T} Δ(l):=Δ(l)+δ(l+1)(a(l))T |
计算 | D i j ( l ) : = { 1 m Δ i j ( l ) + λ Θ i j ( l ) 若 j ≠ 0 1 m Δ i j ( l ) 若 j = 0 D^{(l)}_{ij}:=\left\{\begin{matrix}\frac{1}{m}\Delta^{(l)}_{ij}+\lambda\Theta_{ij}^{(l)}&若j\neq0\\\frac{1}{m}\Delta^{(l)}_{ij}&若j=0\end{matrix}\right. Dij(l):={m1Δij(l)+λΘij(l)m1Δij(l)若j=0若j=0 |
得到 | ∂ ∂ Θ i j ( l ) J ( Θ ) = D i j ( l ) \frac{\partial}{\partial\Theta^{(l)}_{ij}}J(\Theta)=D^{(l)}_{ij} ∂Θij(l)∂J(Θ)=Dij(l) |
3 使用注意:参数展开[code]
4 梯度检测[code]
梯度数值估计 | d d θ J ( θ ) ≈ \frac{d}{d\theta}J(\theta)\approx dθdJ(θ)≈ |
---|---|
双侧偏分[code] | J ( θ + ϵ ) − J ( θ − ϵ ) 2 ϵ , ϵ = 1 0 − 4 \frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon},\;\epsilon=10^{-4} 2ϵJ(θ+ϵ)−J(θ−ϵ),ϵ=10−4 |
单侧偏分 | J ( θ + ϵ ) − J ( θ − ϵ ) ϵ , ϵ = 1 0 − 4 \frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{\epsilon},\;\epsilon=10^{-4} ϵJ(θ+ϵ)−J(θ−ϵ),ϵ=10−4 |
步骤 | 1. 通过反向传播计算DVec 2. 实现数值上的梯度检验来计算gradApprox 3. 确保DVec和gradApprox都能得出相似的值 4. 在使用反向传播进行学习时,关闭梯度检测 |
---|---|
要点 | 在训练分类器的过程中关闭梯度检测 |
5 随机初始化
目的 | 解决对称权重问题(所有的权重都是一样的) |
---|---|
解决[code] | 初始化每一个 Θ i j ( l ) 为 \Theta_{ij}^{(l)}为 Θij(l)为 [ − ϵ , ϵ ] [-\epsilon,\epsilon] [−ϵ,ϵ]中的一个随机值 |
6 组合在一起
参数 | 训练神经网络 |
---|---|
输入单元的个数 | 特征 x ( i ) x^{(i)} x(i)的维度 |
输出单元的个数 | 分类的数目 |
隐藏层单元的个数与隐藏层的数目 | (默认合理)只使用单个隐藏层 不止一个隐藏层时,每个隐藏层通常都应有相同的单元数 |
实现步骤 | 1. 随机初始化权重 2. 前向传播,计算每个 x ( i ) x^{(i)} x(i)的 h Θ ( x ( i ) ) h_\Theta(x^{(i)}) hΘ(x(i)) 3. 计算代价函数 J ( Θ ) J(\Theta) J(Θ) 4. 反向传播,计算 ∂ ∂ Θ j k ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{jk}^{(l)}}J(\Theta) ∂Θjk(l)∂J(Θ) 5. 梯度检测,比较反向传播得到的偏导和使用梯度检测得到的梯度(然后关闭梯度检测) 6. 利用反向传播,使用梯度下降或其他优化算法来最小化 J ( Θ ) J(\Theta) J(Θ) |
P.S. Matlab
3
% 定义矩阵
Theta1 = ones(10,11);
Theta2 = 2*ones(10,11);
Theta3 = 3*ones(1,11);
% 矩阵展为向量
thetaVec = [Theta1(:); Theta2(:); Theta3(:)];
DVec = [D1(:); D2(:); D3(:)];
% 向量转换为矩阵
Theta1 = reshape(thetaVec(1:110),10,11);
Theta2 = reshape(thetaVec(111:220),10,11);
Theta3 = reshape(thetaVec(221:231),1,11);
% initialTheta->fminunc(@costFunction, initialTheta, options)
function [jVal, gradientVec] = costFunction(thetaVec)
% 从thetaVec中获取theta1,theta2,theta3
% 前向传播、反向传播,计算D1,D2,D3,J
% 将D1,D2,D3转换为gradientVec
4
for i = 1:n,
thetaPlus = theta;
thetaPlus(i) = thetaPlus(i) + EPSILON;
thetaMinus = theta;
thetaMinus(i) = thetaMinus(i) - EPSILON;
gradApprox(i) = (J(thetaPlus) - J(thetaMinus)) / (2*EPSILON);
end;
% 检验:gradApprox是否约等于DVec