一、代价函数
首先我们定义:
L = 神经网络的总层数
si = 第L层的单元数量(不含偏置单元)
K = 输出单元/类型的数量
hΘ(x)k = 假设函数中的第k个输出
因为逻辑回归里的代价函数为:
推广到神经网络中:
二、代价函数的优化算法——反向传播算法(backpropagation algorithm)
1、含义
神经网络的代价函数已经求出来了,那么现在要进行min J也就是优化算法。这一节的主要目的是计算J的偏导数。
每当模型预测发生错误时,就需要调整模型参数,进行提高识别精度,这种情况中最有代表性的就是“误差反向传播”。
反向传播算法从直观上说,就是对每一个节点,我们计算这样一项:
当得到最后一层的预测误差后,我们便通过取微分调整,使得上一层的误差变小。这样逐层递推回去,就使得总体的误差变小了。
2、简要步骤
首先我们可以得到最后一层的误差项和激活项的关系:
然后我们可以得到前几层的误差项:
PS:因为第一层没有误差,因此第一个误差项不存在。
3、一般步骤
对于一个给定的训练集:
结束for循环后:
三、理解反向传播
反向传播和前向传播的过程其实极为类似,只是计算方向不一样而已,都是权重乘以单元值。
前向传播:
反向传播:
PS:一些编程小技巧:矩阵和向量的转换:octave中使用reshape命令。
四、梯度检测(gradient checking)
1、目的:
反向传播算法有许多细节,实现起来比较困难,而且有一个不好的特性,就是容易产生bug。有时候神经网络可能在迭代过程中确实得到了很好的结果,但是有bug的情况下会比无bug高出一个量级。梯度检测就是专门解决这种bug的存在的。它将完全保证你的前向传播和反向传播是百分百正确。
2、数学方法
使用双侧差分算法:
3、伪代码:
一般的,epsolon被设置为10-4.
PS:注意!一旦使用梯度检测算法验证正确,就要关闭,不然会导致神经网络算法的速度减慢。
五、随机初始化(random initialization)
在神经网络开始梯度下降之前,我们都要Θ设置一个初始值。如果都设置为0,就会出现对称问题(symmetry breaking),即所有的单元值相等。
随机初始化就是解决这种问题的方法。
具体做法:
六、总体回顾
总而言之,训练一个神经网络的方法:首先要将权重随机初始化为一个接近0的数,然后进行反向传播,再进行梯度检验,最后使用梯度下降或者其他高级优化算法来最小化代价函数J。
具体步骤如下:
1、选择一种网络构架:
输入单元是由特征数目决定的。
输出单元是由所要区分的类别个数确定
隐藏层单元个数与数目:只使用单个隐藏层,如果隐藏层大于1 ,那么默认每一
个隐藏层都有相同数目的单元数(单元数越多越
好)。
2、训练一个神经网络:
(1)随机初始化权重
for循环:
(2)前向传播,得到h值
(3)计算代价函数J
(4)反向传播,得到偏导值
结束循环
(5)梯度检测
(6)停用梯度检测,梯度下降法计算J的最小值
PS第四次作业:1.求代价函数时,是X和对应的Y相乘,也就是对应元素相乘。