机器学习(七)——神经网络参数的反向传播算法

目录

 

一、前言

二、代价函数

三、反向传播算法

四、理解反向传播算法

1.链式求导法则(高等数学多元微分学求导)

2.举例

五、梯度检测、随机初始化

1.梯度检测

2.随机初始化

扫描二维码关注公众号,回复: 8729945 查看本文章

六、训练神经网络


一、前言

  1. 吴恩达机器学习第十章神经网络参数的反向传播算法
  2. 需要的数学知识:多元函数求导、链式求导法则

二、代价函数

L=神经网络的层数

S_l=第l层的的单元数

K=输出层的单元数

h_\Theta (x)\in R^k

(h_\Theta (x))_i=ith \, output

\small J(\theta )=-\frac{1}{m}[\sum_{i=1}^{m}\sum _{k=1}^{K}y_{(k)}^i\log(h_\theta(x^{(i)}))_k+(1-y_k^{(i)})\log(1-(h_\theta(x^{(i)}))_k)]+\frac{\lambda }{2m}\sum _{l=1}^{L-1}\sum _{i=1}^{S_l}\sum _{j=1}^{S_{l+1}}(\theta_{ji})^2

三、反向传播算法


首先需要实现正向传播算法

\small \delta _j^{(l)}:第l层的第j个结点的误差

\small \alpha _j^{(l)}:第l层第j个单元的激活值

那么对于输出层的每个输出单元(以上图神经网络来说)

\delta _j^{(4)}=a_j^{(4)}-y_j 

a_j^{(4)}=(h_\theta(x))_j

如果用向量表示,则可以误差可以表示为

\small \delta ^{(4)}=a^{(4)}-y

数学警告!!!

接下来的内容需要一定的多元微分学的知识,稍微看看就好,有兴趣的可以查一下高数下册的资料

由此可以得出接下来隐藏层中的误差值

输入层不需要求误差也不存在误差所以不需要计算

\delta _j^{(3)}=(\Theta^{(3)})\delta^{(4)} .*g'(z^{(3)})

\delta _j^{(2)}=(\Theta^{(2)})\delta^{(3)} .*g'(z^{(2)})

其中

g'(z^{(3)})=a^{(3)}.*(1-a^{(3)})

g'(z^{(2)})=a^{(2)}.*(1-a^{(2)})

同时经过一定的数学运算,每一个参数的偏导数可以通过大致的通过以下这个公式求出来,注意此处忽略了正规化λ

\frac{\partial J(\Theta )}{\partial \Theta _{ij}^{(l)}}=a_j^{l}\delta _{i}^{(l+1)}

接下来将上面的内容整合起来就是一个完整的反向传播算法(\Delta其实就是\delta) 

   

四、理解反向传播算法

1.链式求导法则(高等数学多元微分学求导)

为了更好理解反向传播公式的推导,需要一点多元微分学的知识。

由高数课本,设一个多元函数为z=f(u,v),而其中u=h(x,y)v=g(x,y),则

\frac{\partial z}{\partial x}=\frac{\partial z}{\partial u}\frac{\partial u}{\partial x}+\frac{\partial z}{\partial v}\frac{\partial v}{\partial x}

\frac{\partial z}{\partial y}=\frac{\partial z}{\partial u}\frac{\partial u}{\partial y}+\frac{\partial z}{\partial v}\frac{\partial v}{\partial y}

有了上面的介绍

\frac{\partial z}{\partial x}=\frac{\partial z}{\partial p}\frac{\partial p}{\partial u}\frac{\partial u}{\partial x}+\frac{\partial z}{\partial p}\frac{\partial p}{\partial v}\frac{\partial v}{\partial x}+\frac{\partial z}{\partial q}\frac{\partial q}{\partial u}\frac{\partial u}{\partial x}+\frac{\partial z}{\partial q}\frac{\partial q}{\partial v}\frac{\partial v}{\partial x}

简化以下就可以得到

\frac{\partial z}{\partial x}=\frac{\partial z}{\partial u}\frac{\partial u}{\partial x}+\frac{\partial z}{\partial v}\frac{\partial v}{\partial x}

2.举例

因为代价函数扮演的是一个计算误差的角色,这里可以近似的将cost(i)\approx(h_\theta(x^{(i)}-y^{(i)})^2

根据微积分的知识

  \delta _j^{(l)}=\frac{\partial Cost(i)}{\partial z_j^{(i)}}  

cost(i)=y^{(i)} \log(h_\(x^{(i)}))+(1-y^{(i)})\log(h_\theta(x^{(i)}))

前面这些是为了更好理解,接下来就不需要数学知识了

如上图给出各个位置的参数,根据以上的推导

\delta _1^{(4)}=y^{(i)}-a_1^{(4)}

\delta _2^{(2)}=\Theta _{12}^{(2)}\delta _1^{3}+\Theta _{22}^{(2)}\delta _2^{3}

\delta _2^{(3)}=\Theta _{12}^{(3)}\delta _1^{4}

\frac{\partial J(\Theta )}{\partial \Theta _{ij}^{(l)}}=a_j^{l}\delta _{i}^{(l+1)} 

五、梯度检测、随机初始化

1.梯度检测

 前面已经讲述了如何正向传播、反向传播以及计算偏导数的值,但是反向传播还有很多细节,因此实现起来比较困难,并且有一些不好的特性,很容以产生一些bug,当它去梯度下降或者其他算法结合起来的时候,或许代价函数可能会不断减小,但到最后就得到的神经网络在没有bug的情况下可能会高出一个量级,此时就需要梯度检测。

其实从微积分的基本定理可以检测梯度,但又有一点不同

\frac{\partial J(\theta)}{\partial \theta}\approx\frac{J(\theta+\epsilon)-J(\theta-\epsilon )}{2\epsilon }

\epsilon的取值通常为10^{-4}左右

而根据高等数学书上导数的定义为

\frac{\partial J(\theta)}{\partial \theta}\approx\frac{J(\theta+\epsilon)-J(\theta)}{\epsilon }

但在这里这个称为单侧差分,而上一个公式称为双侧差分,相比单侧差分,双侧差分更加精准(视频课是这么说的)

2.随机初始化

对于梯度下降法,需要对θ初始化。若同一层的参数初始化的值相同,那么每次梯度下降以后参数依然是相同的,那么就获得不到比较好的神经网络,因此需要随机对每个参数初始化使得-\epsilon < \Theta _{ij} < \epsilon

六、训练神经网络

就是将之前的整合在一起,获得最佳的参数

发布了22 篇原创文章 · 获赞 0 · 访问量 590

猜你喜欢

转载自blog.csdn.net/SampsonTse/article/details/103840465