一、反向传播
1、两种分类问题
①二元分类(输出只有两个类别)
y = {0,1},SL = 1
注:SL表示最后一层中输出单元的个数。L表示神经网络的层数。
②多类别分类(输出有≥3个的类别)
y 为k维向量 (k ≥ 3),SL = k
yi = 1 表示属于第 i 类。
2、神经网络的代价函数
对比逻辑回归的代价函数:
①逻辑函数:
注:正则项不包括θ0
②神经网络:
在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量 y ,但是在神经网络中,我们可以有很多输出变量,我们的 hθ(x) 是一个维度为 k 的向量。
正则化的那一项只是排除了每一层 θ0 后,每一层的 θ 矩阵的和。最里层的 j 循环循环所有的行(由 sl +1 层的激活单元数决定),循环 i 则循环所有的列,由该层(sl 层)的激活单元数所决定。
3、反向传播的过程
反向传播是计算代价函数对所有参数的偏导数的有效方法
假设我们的神经网络是一个四层的神经网络,其中 K =4,SL = 4,L = 4:
①首先,需要写出前向传播:
②我们从最后一层的误差开始计算,误差是激活单元的预测(ak(4))与实际值(yk)之间的误差。
用来 δ 表示误差,则: δ(4) = a(4) - y
利用这个误差值来计算前一层的误差:
其中 g’() 是 sigmoid 形函数的导数:
权重导致的误差的和:
下一步是继续计算第二层的误差:
因为第一层是输入变量,不存在误差。
③算法表示为:
我们用 △ 来表示这个误差矩阵,表示第 l 层的第 i 个激活单元受到第 j 个参数影响而导致的误差。
在求出了 △ 之后,我们便可以计算代价函数的偏导数了,计算方法如下:
4、梯度检验
所以,代价函数对 θ 的偏导:
一直到θn.
算法实现:
然后,比较 gradApprox 和反向传播计算的DVec。
5、随机初始化
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。
我们通常初始参数为正负之间的随机值,假设我们要随机初始一个尺寸为10×11的参数矩阵,代码如下:
Theta1 = rand(10, 11) * (2*eps) – eps
6、总结
首先总结一下选择神经网络的步骤:
①确定有多少个隐藏层,每层有多少个单元。
②输入层单元的数量 = 特征x(i) 的维度
输出层单元的数量 = 多类别的类别数(向量形式)
③隐藏层 = 1 最好。若 >1 ,确保每个隐藏层的单元个数相同,单元个数越多越好。
其次,总结训练神经网络的步骤:
- 构建神经网络,随机初始化参数θ,接近0.
- 执行前向传播算法,计算预测值 hθ(x) (向量形式)
- 执行代价函数J(θ)
- 执行反向传播,算出代价函数对θ的偏导数
- 使用梯度检验(运行缓慢)。比较反向传播得到的偏导数与数值方法得到的梯度估计值。
- 停用梯度检验。
- 使用高级优化算法来求出使代价函数最小化的θ