转载自:http://blog.csdn.net/jj12345jj198999/article/details/9024037
公开课地址:https://class.coursera.org/ml-003/class/index
授课老师:Andrew Ng
1、cost function(代价函数)
上一讲的最后引入了多分类问题,多分类问题与二元分类问题的区别就在于输出单元是多个,用图总结如下:
同时在前面我们也已经知道逻辑回归的代价函数如下:
前半部分代表真实值与假设值的差值,后半部分代表对系数进行规格化的偏差项。与此类似的,我们可以定义神经网络的代价函数:
真实值与假设值之间的距离定义为统计所有的样本和输出类别之间的和值,后面再加上权重的规格化偏差项。
2、backpropagation algorithm(反向传播算法)
既然我们已经给出了代价函数的形式,按照老思路就是将其最小化求出参数:
为了进行梯度下降,我们需要列出神经网络每一层的输入和输出分别是什么,表示方法和之前的一样:
在这里我们需要定义一个误差变量δ,用来表示该节点对最终误差的出现产生了多少影响。对于最后一层,我们能直接定义误差值是多少,对于前面的隐藏层,只能够通过反向推导来求解,这也是反向传播算法的由来。
具体的推导过程可以参看*:
http://en.wikipedia.org/wiki/Backpropagation
梯度下降的算法可以描述如下:
用Δ表示全局误差,每一层都对应一个Δ(l)。再引入D作为代价函数对参数的求导结果。左边j是否等于0影响的是是否有最后的偏差项。
3、backpropagation intuition(反向传播举例)
这一小节举了一个利用BP算法求解神经网络权重的例子,首先我们要定义网络的结构和一些输入输出表示:
同时我们在这里对代价函数进行简化,无须考虑最后的规格化偏差项:
对于第i个样本,cost(i)如上图那样定义,如果熟悉δ的推导过程,能发现:
同时对于每一层来说,δ分量都等于后面一层所有的δ加权和,其中权值就是参数Θ:
4、gradient checking(梯度检查)
在求解过程中,通过check梯度判断我们的code有没有问题。对于下面这个图,取Θ点左右各一点(Θ+ε),(Θ-ε),则有点Θ的导数(梯度)近似等于(J(Θ+ε)-J(Θ-ε))/(2ε):
对于每个参数的求导公式如下:
由于在BP算法中我们一直能得到J(Θ)的导数D(derivative),那么就可以将这个近似值与D进行比较,如果这两个结果相近就说明code正确,否则错误。
不过要注意以下几点:
5、random initialization(随机初始化)
对于参数theta初始化问题,最简单的想法都是先赋值为0:
不过由于这种赋值导致了一开始计算时隐藏节点没什么区别,就像上图那样a1,a2计算过程和结果都是一样的,等于是一个节点,存在浪费情况。为了打破这种局面,可以对theta进行随机初始化:
6、putting it together(总论)
为了训练一个神经网络我们需要做哪些工作呢?
首先是选择网络的结构:
然后就是训练权重了,包括初始化和BP算法:
最后是检查训练得到的参数是否正确,采用上面提到的梯度检查方法:
这样就完成了一个神经网络的训练过程。
----------------------------------------------------弱弱的分割线----------------------------------------------
这一节的重点是BP算法,不过由于视频中没有过多的推导细节,光看结论印象不深,必须要亲自推导一下才行。加入该算法后,神经网络也就拥有了自学习的过程,只需要定义神经网络的结构和初始值即可。