第10章 神经网络参数的反向传播算法
1、代价函数
神经网络的代价函数类似于逻辑回归的代价函数:
J
(
θ
)
=
−
1
m
[
∑
i
=
1
m
∑
k
=
1
k
y
k
(
i
)
l
o
g
(
h
θ
(
x
(
i
)
)
)
k
+
(
1
−
y
k
(
i
)
)
l
o
g
(
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(θ)=-\frac{1}{m}\left[\sum_{i=1}^m\sum_{k=1}^ky^{(i)}_klog(h_θ(x^{(i)}))_k+(1-y_k^{(i)})log(1-(h_θ(x^{(i)}))_k)\right]+\frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_l+1}(θ_{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 ) h_θ(x) hθ(x)。
下面介绍一下函数中各个函数的含义:
- m:代表样本的数量,i代表某个样本的下标, x ( i ) x^{(i)} x(i)代表某个样本对应的所有特征, y ( i ) y^{(i)} y(i)代表某个样本对应的实际分类结果,而 h θ ( x ( i ) ) h_θ(x^{(i)}) hθ(x(i))代表预测的结果。
- k:代表分类的数量,神经网络的输出层的节点数=k。 y k ( i ) y_k^{(i)} yk(i)代表第k个节点的实际分类结果,而 ( h θ ( x ( i ) ) ) k (h_θ(x^{(i)}))_k (hθ(x(i)))k代表第k个节点预测的结果。
- λ \lambda λ是正则化参数。
- L代表神经网络的层的总数,之前我们介绍神经网络 θ ( i ) θ^{(i)} θ(i)的时候提起过,它是第i层到第i+1层的权重矩阵,所以 θ θ θ所对应的的层数是(1,L-1)。
- s l s_l sl代表是第 l l l层的激活项的数量,所以 ∑ i = 1 s l \sum_{i=1}^{s_l} ∑i=1sl代表的是第l层的每一项的和。i代表的是特征的数量,在这里因为 s l s_l sl代表的就是该层的输入项的数量,也就是特征的数量,所以i的取值范围是(0, s l s_l sl),不过一般会省略 θ 0 θ_0 θ0,所以i的取值范围就是(1, s l s_l sl)。
- s l + 1 s_l+1 sl+1:应该是包含上 θ 0 \theta_0 θ0的意思。 θ j i ( l ) \theta_{ji}^{(l)} θji(l) 中的上标l的指的是网络的层数,j指的是节点的下标,i指的是 θ \theta θ的下标。
2、反向传播算法
在这之前,我们先回顾一下前向传播算法。
假设只有一个训练集(x,y)、神经网络为4层的情况,则:
- 第一层的激活项就是: a ( 1 ) = x a^{(1)} = x a(1)=x
- z ( 2 ) = θ ( 1 ) a ( 1 ) z^{(2)}=θ^{(1)}a^{(1)} z(2)=θ(1)a(1)
- a ( 2 ) = g ( z ( 2 ) ) a^{(2)}=g(z^{(2)}) a(2)=g(z(2))
- z ( 3 ) = θ ( 2 ) a ( 2 ) z^{(3)}=θ^{(2)}a^{(2)} z(3)=θ(2)a(2)
- a ( 3 ) = g ( z ( 3 ) ) a^{(3)}=g(z^{(3)}) a(3)=g(z(3))
- z ( 4 ) = θ ( 3 ) a ( 3 ) z^{(4)}=θ^{(3)}a^{(3)} z(4)=θ(3)a(3)
- a ( 4 ) = g ( z ( 4 ) ) = h θ ( x ) a^{(4)}=g(z^{(4)})=h_θ(x) a(4)=g(z(4))=hθ(x)
2.1 定义
前向传递输入信号直至输出产生误差,反向传播误差信息更新权重矩阵。
在不断重复前后传递的过程中,优化权重矩阵,得到最优模型。
2.2 原理
下面通过两个例子来说明反向传播的原理。
两人猜数字:
- input:代表输入。
- output:代表输出。
- 机器猫:代表预测结果与实际值的差距。
计算过程是这样的:
- 输入数据,经过小黄帽的计算,输出结果(前向传播)。
- 机器猫计算预测结果与真实结果的差。
- 小黄帽根据误差值,调整权重矩阵(反向传播)。
- 小黄帽根据最新的权重矩阵,重新进行结果(前向传播)。
- 重复上述步骤,直到误差值满足要求为止。
可以看出,反向传播就是把误差传递到上一层,推动上一层对权重矩阵进行优化。
三人猜数字
下面我们增加一个参与人员,即增加一个隐藏层。这时候计算过程就变成了如下的过程:
- 输入值经过小红帽、小黄帽的计算,输出结果(前向传播)。
- 机器猫计算预测值与实际值的误差 δ 1 \delta_1 δ1。
- 小黄帽根据误差值,调整权重矩阵(反向传播)。
- 小黄帽调整完权重矩阵后,如果还有误差 δ 2 \delta_2 δ2,就把这个误差 δ 2 \delta_2 δ2再传递给小红帽(反向传播)。
- 小红帽根据误差值,调整权重矩阵(反向传播)。
- 由于小红帽是第一层,所以小红帽根据最新的权重矩阵进行计算(前向传播)。
- 小黄帽根据最新的权重矩阵,重新进行结果(前向传播)。
- 重复上述步骤,直到误差值满足要求为止。
值得注意的是第4步,我认为小黄帽传递给小红帽的误差值 δ 2 \delta_2 δ2,与机器猫传递给小黄帽的误差值 δ 1 \delta_1 δ1是不同的。 δ 2 \delta_2 δ2是在更新权重矩阵后重新计算出来的误差值。
2.3 模型
δ
(
l
)
=
(
θ
(
l
)
)
T
δ
(
l
+
1
)
.
∗
g
′
(
z
(
l
)
)
\delta^{(l)}=(\theta^{(l)})^T\delta^{(l+1)}.*g^{'}(z^{(l)})
δ(l)=(θ(l))Tδ(l+1).∗g′(z(l))
推导过程就算了,没那个能力,下面介绍下各个参数的含义:
- δ ( l ) \delta^{(l)} δ(l):代表第 l l l 层的误差。
- θ ( l ) \theta^{(l)} θ(l):代表第 l l l 层的权重矩阵。
- “ . ∗ .* .∗”:是前后两个向量的乘法。
- g ′ ( z ( l ) ) g^{'}(z^{(l)}) g′(z(l)):是对激活函数的求导。
2.4 反向传播的理解
下面用示意图的形式解释一下反向传播误差计算的大概原理,注意这只是示意,为了理解原理,实际上并没有这么简单:
如上图所示,该神经网络共有4层:
- s 1 s_1 s1:第一层为输入层,输入样本为 x 1 , x 2 x_1, x_2 x1,x2。
- s 2 s_2 s2:第二层为隐藏层,预估结果为 a ( 2 ) a^{(2)} a(2),误差项为 δ ( 2 ) \delta^{(2)} δ(2),权重矩阵为 θ ( 2 ) \theta^{(2)} θ(2)。
- s 3 s_3 s3:第三层为隐藏层,预估结果为 a ( 3 ) a^{(3)} a(3),误差项为 δ ( 3 ) \delta^{(3)} δ(3),权重矩阵为 θ ( 3 ) \theta^{(3)} θ(3)。
- s 4 s_4 s4:第四层为输出层,预估结果为 a ( 4 ) a^{(4)} a(4),误差项为 δ ( 4 ) \delta^{(4)} δ(4)。
我们知道误差=实际值-预估值,从第四层反向来看,实际结果为 y ( i ) y^{(i)} y(i),可以得出各层的误差计算结果为:
- δ 1 ( 4 ) = y ( i ) − a 1 ( 4 ) \delta_1^{(4)}=y^{(i)}-a^{(4)}_1 δ1(4)=y(i)−a1(4)
- 第三层的误差计算方式与前向传播类似,但是方向是反的,所以可以得出:说实话,不知道为什么能推导出这个公式来?
δ 1 ( 3 ) = θ 11 ( 3 ) ∗ δ 1 ( 4 ) \delta^{(3)}_1=\theta^{(3)}_{11}*\delta^{(4)}_1 δ1(3)=θ11(3)∗δ1(4)
δ 2 ( 3 ) = θ 12 ( 3 ) ∗ δ 1 ( 4 ) \delta^{(3)}_2=\theta^{(3)}_{12}*\delta^{(4)}_1 δ2(3)=θ12(3)∗δ1(4) - 第二层的误差为:
δ 1 ( 2 ) = θ 11 ( 2 ) ∗ δ 1 ( 3 ) + θ 21 ( 2 ) ∗ δ 2 ( 3 ) \delta^{(2)}_1=\theta^{(2)}_{11}*\delta^{(3)}_1+\theta^{(2)}_{21}*\delta^{(3)}_2 δ1(2)=θ11(2)∗δ1(3)+θ21(2)∗δ2(3)
δ 2 ( 2 ) = θ 12 ( 2 ) ∗ δ 1 ( 3 ) + θ 22 ( 2 ) ∗ δ 2 ( 3 ) \delta^{(2)}_2=\theta^{(2)}_{12}*\delta^{(3)}_1+\theta^{(2)}_{22}*\delta^{(3)}_2 δ2(2)=θ12(2)∗δ1(3)+θ22(2)∗δ2(3)
3、展开参数
本章介绍矩阵和向量的相互转换。
假设 T i T_i Ti是矩阵, V V V是向量。
矩阵转向量:
V = [ T 1 ( : ) ; T 2 ( : ) ; T 3 ( : ) ; ] V=[T_1(:);T_2(:);T_3(:);] V=[T1(:);T2(:);T3(:);]
这样把每个矩阵的所有数据平铺形成一个向量。
向量转矩阵:
T 1 = r e s h a p e ( V ( 1 : 110 ) , 10 , 11 ) T_1=reshape(V(1:110),10,11) T1=reshape(V(1:110),10,11)
取1-110元素,形成10*11的矩阵。
4、梯度检测
4.1 目的
反向传播在使用过程中非常容易出错,而且不容易发现,梯度检测就是一种校验反向传播结果的有效方式。
4.2 原理
使用梯度下降的方式求导,然后比较梯度检测的结果与反向传播的结果是否类似,如果类似则说明反向传播的计算结果无误,否则则应该进行优化。
先看一下梯度下降的求导方式:
如上图所示,是求导数的一种方式。
假设 ϵ \epsilon ϵ 是一个非常小的值,接近于0,则 ∂ ∂ θ ≈ J ( θ + ϵ ) − J ( θ − ϵ ) 2 ϵ \frac{\partial}{\partial\theta}\approx\frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon} ∂θ∂≈2ϵJ(θ+ϵ)−J(θ−ϵ)
下面把该公式引入到 θ \theta θ为向量的情况下:
∂ ∂ θ 1 ≈ J ( θ 1 + ϵ , θ 2 , θ 3 , . . . . . . θ n ) − J ( θ 1 − ϵ , θ 2 , θ 3 , . . . . . . θ n ) 2 ϵ \frac{\partial}{\partial\theta_1}\approx\frac{J(\theta_1+\epsilon,\theta_2,\theta_3,......\theta_n)-J(\theta_1-\epsilon,\theta_2,\theta_3,......\theta_n)}{2\epsilon} ∂θ1∂≈2ϵJ(θ1+ϵ,θ2,θ3,......θn)−J(θ1−ϵ,θ2,θ3,......θn)
∂ ∂ θ m ≈ J ( θ 1 , θ 2 , θ 3 , . . . . . . θ m + ϵ . . . . . . θ n ) − J ( θ 1 , θ 2 , θ 3 , . . . . . . θ m − ϵ . . . . . . θ n ) 2 ϵ \frac{\partial}{\partial\theta_m}\approx\frac{J(\theta_1,\theta_2,\theta_3,......\theta_m+\epsilon......\theta_n)-J(\theta_1,\theta_2,\theta_3,......\theta_m-\epsilon......\theta_n)}{2\epsilon} ∂θm∂≈2ϵJ(θ1,θ2,θ3,......θm+ϵ......θn)−J(θ1,θ2,θ3,......θm−ϵ......θn)
注意:梯度校验计算量非常大,校验完成后需要关闭掉。
5、随机初始化
参数 θ \theta θ需要设置初始值,一般采用随机方式: r a n d ( 10 , 11 ) ∗ ( 2 ∗ ϵ ) − ϵ rand(10,11)*(2*\epsilon)-\epsilon rand(10,11)∗(2∗ϵ)−ϵ,产生的随机数界于( − ϵ , ϵ -\epsilon,\epsilon −ϵ,ϵ)之间。
6、处理流程
6.1 选择网络架构
神经网络的第一步是选择网络架构,选择网络架构需要遵循几个原则:
- 输入项的数目=特征的数量
- 输出项的数据=类别的数量
- 隐藏层的数目:一般选择 1
- 隐藏层单元的数目:各个隐藏层保持一致。单元的数目越多效果越好,但是计算量响应变大。
6.2 处理流程
神经网络整体的处理流程是:
- 构建神经网络架构。
- 前向传播计算。
- 计算 J ( θ ) J(\theta) J(θ)。
- 反向传播。
- 梯度检测。
- 停用梯度检测。
- 计算 m i n J ( θ ) minJ(\theta) minJ(θ)。
7、资料
参考一文搞懂反向传播算法,本文对于反向传递的介绍非常容易理解。