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

目录

 

一、前言

二、代价函数

三、反向传播算法

四、理解反向传播算法

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

2.举例

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

1.梯度检测

2.随机初始化

六、训练神经网络


一、前言

  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

 

 

 

六、训练神经网络

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

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值