上一周说到神经网络的表示:
有如下公式: |
如果增加隐藏层,就是增加
如果是多元分类的话,就是在最后hθ(x)变多。如,三类的分类:
现在,要做学习了,所以需要看成本函数。回顾逻辑回归中的成本函数:
在hθ(x)部分,有k类;θ部分,有L层,是第l层第i个单元到l+1层第j个单元的θ。
根据上面的成本函数,我们要求minJ(θ)
过程是每求一个J(θ),求导,得到新的θ,再求新的J(θ)。直到成本函数收敛到一个值附近才停。
按照前一week的前馈网络,hθ(x)在输出层。如果梯度下降也按照一层一层向前的方式,在前面几层,根本就没法算出准确的成本,因为成本要用到误差,隐藏层的误差其实是不知道的。
所以,引入反向传播算法。
从上面的前向传播可以看出,误差产生来自每一层。
如上图,只做三层的神经网络:
有n个输入,即x=x1……xn;隐藏层有m个单元。在hθ(x)部分,有k类;θ部分,有L层,是第l层第i个单元到l+1层第j个单元的θ。
其中ak是输出层第k个输入,yk是输出层第k的输出,即第k类。
误差展开到输入层:
梯度下降:err就是J(θ)。(J(θ)就是实际与估计的误差)
我们定义残差为
输出层的残差为:
所以隐藏层的残差为:
至此,推导了残差的求解过程。
如果隐藏层不止一层,方法也是一样的,只要在“误差展开到隐藏层”时,多展几层就可以了。
四层神经网络就是:
由上可以看出,总的误差是个累积的值,是每一层误差的和。而每一层的误差是该层上的每个单元的误差的累积。所以令每一个单元的误差为
是误差矩阵
前面也推过梯度与残差的关系
到这里,神经网络的梯度下降算法清晰了
现在举个例子,说明反向传播算法的工作过程
(1)首先,我们根据前向反馈传播,求出
(2)我们简化成本函数,忽略正规项,且求只有一个样本(xi,yi)时的成本
前一层的残差是后一层的残差得的加权和,权值就是θ
更正式的说,就是当输入是(xi,yi)时,在第l层第j个单元输出是的成本误差
实现注意事项Implementation note: Unrolling parameters
要把矩阵展开成向量
梯度下降过程中,怎么知道对不对呢?要进行检验。
思路就是这个截图,感觉很清晰。就是在θ求梯度,同时在它左右找两个特别靠近的点,特别靠近就是ε特别小,大概10^-4。求这两个值的平均值再和梯度比较
然后再分别比较这些平均值和梯度是否近似,如果近似就说明用反向传播算法进行梯度下降算得没错。
实现反向传播算法的注意事项:
(1)要展开梯度的矩阵展开
(2)梯度和平均值要近似
(3)梯度检验用于学习,训练分类器要关掉,否则算法变慢
输出层的误差是一个非凸函数,初始化参数后,可能得到局部最优,
之前初始化的时候,用的都是全0。
如果神经网络初始化也都是全0的话,这样g(z)也相同,上面的,用下面的式子来计算残差,得到的残差很显然也相同
而且梯度也相同。这就出现了,同一层,你不管怎么迭代权重都一样。这就是对称权重。对称权重有什么危害?我们知道,设置权重的目的就是,对不同特征值对分类结果进行评分,有的特征重要,分数给高点,有的特征没那么重要,分数低点。如果,给的分数都一样,根本区分不了特征之间的重要程度。
所以初始化的目的就是打破这种对称性,使对称失效。那么,怎么做呢?就是在初始化的时候,随机初始化。通常,就是随机初始化θ∈[-ε,ε]。比如要随机初始一个10×11的参数矩阵:
讲了各方面的要点和事项,现在,是时候训练一个神经网络分类器了。
第一步就是,如何选择一个神经网络?(神经元之间的连接模式)确定有多少层以及每层有多少个神经元。
(1)输入单元数:特征的维数
(2)输出单元数:分类数
(3)隐藏层的设计:比较合理的是一层隐藏层。如果隐藏层层数大于1,要确保每一层的单元数都一样。通常每层单元数越多越好。
我们就是要决定隐藏层有多少层及每层多少个单元。实际上,隐藏层有多少层和每层个数并没有确切的规则,真正开发的时候还是靠经验或者尝试。据一些有经验的开发者的说法是一层就够了,去确定这一层的单元数比较关键。
如果选好了神经网络结构,接下去就是训练了。
(1)随机初始化参数
(2)实现前向反馈算法,求出hθ(x)
(3)实现成本函数J(θ)
对于m对的输入{(x1,y1),(x2,y2),(x3,y3)……(xm,ym)}
使用前向反馈算法和反向传播说法都要用到样本(xi,yi)
分别得到每一个
(5)使用梯度检验法比较用反向传播算法求出的和数值估计求出的J(θ)的梯度。如果二者比较接近,则要关掉梯度检验
(6)在反向传播算法基础上使用梯度下降或者其他高级的优化方法最小化J(θ)