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