Machine Learning笔记(十)

为神经网络拟合参数

代价函数

回顾下逻辑回归算法的代价函数:

在神经网络中使用的代价函数是逻辑回归算法中使用的代价函数的一般化形式:

m:训练集的数量

K:分类问题中输出层的神经元的数量

(h_{\Theta }(x))_{i}:表示第 i 个输出层神经元的输出,h_{\Theta }(x)是一个K维向量

L:神经网络的层数

sl:第 l 层的神经元数量

sl+1:s(l +1),第 l +1 层神经元的数量

第一个求和项求得是输出层每个神经元计算的代价函数值的和

第二个求和是正则化项的求和,每一层每个神经元每个参数矩阵(权重矩阵)的和

可以结合这样一个模拟的四层神经网络来理解,K=4,L=4,s1=3,s2=s3=5,s4=sL=4

代价函数最小化

反向传播算法

假设目前训练集的数量只有一个,先用向前传播算出神经网络每一层的输出值(关于向前传播在https://blog.csdn.net/After__today/article/details/81835011中有介绍)

接下来使用反向传播算法计算偏导数项\frac{\partial J(\theta )}{\partial \Theta _{j,i}^{(l)}}

这里引入一个误差变量 \delta _{i}^{l} 来表示第 l 层的第 i 个神经元激励值的误差,\delta _{i}^{l}会对着算法的迭代一步步更新

这里 \delta 的下标和视频中相反是因为视频中的下标与上一节课的写的反的,这里按上一节课的下标来写就好

在这个神经网络中,第四层的 \delta 计算化简得到的直观的是第四层的激励减去训练样本中的真实值

误差 \delta _{j}^{(4)} 的具体计算步骤

这里的\delta _{j}^{(4)}实际是计算\frac{\partial J(\theta )}{\partial z_{i}^{(l)}}的值(计算到最后就会发现),利用链式法则对偏导数项做处理

\frac{\partial J(\theta )}{\partial z_{i}^{(4)}}=\frac{\partial J(\theta )}{\partial a_{i}^{(4)}}\cdot \frac{\partial a_{i}^{(4)}}{\partial z_{i}^{(4)}}

右边第一项:

简化代价函数,忽略求和项和正则化项来求它的偏导

J(\theta )=-y^{(i)}\cdot log(a_{i}^{(l)})-(1-y^{(i)})\cdot log(1-a_{i}^{(l)}) (输出层中h_{\Theta }(x)就等于a^{(l)}

所以\frac{\partial J(\theta )}{\partial (a_{i}^{(4)})}=-\frac{y^{(i)}}{a_{i}^{(4)}}+\frac{1-y^{(i)}}{1-a_{i}^{(4)}}= \frac{a_{i}^{(4)}-y^{(i)}}{a_{i}^{(4)}-(a_{i}^{(4)})^2}

右边第二项:

a_{i}^{(4)}=g(z^{(4)}),所以\frac{\partial a_{i}^{(4)}}{\partial z_{i}^{(4)}}={g}'(z^{(4)})=\frac{e^{(-z)}}{(1-e^{(-z)})^2}

这里g(z)\cdot (1-g(z))恰好也等于这个式子,因此可以用这个式子来替换求导,即a_{i}^{(4)}\cdot (1-a_{i}^{(4)})

所以,\frac{\partial J(\theta )}{\partial z_{i}^{(4)}}= \frac{a_{i}^{(4)}-y^{(i)}}{a_{i}^{(4)}-(a_{i}^{(4)})^2}\cdot a_{i}^{(4)}\cdot (1-a_{i}^{(4)})=a_{i}^{(4)}-y^{(i)}

对于输出层前的每一层的\delta ^{(l)}的计算:

这里没写下标代表对层整体计算,其实就是对每层的每个单元的误差求和

\delta ^{(l)}=\frac{\partial J(\theta )}{\partial (z^{(l)})}=\frac{\partial J(\theta )}{\partial (z^{l+1})}\cdot \frac{\partial (z^{l+1})}{\partial (z^{(l)})}=\delta ^{l+1}\cdot \frac{\partial [\Theta ^{(l)}\cdot g(z^{(l)})]}{\partial (z^{l+1})}=\Theta ^{(l)}\cdot \delta ^{l+1}\cdot {g}'(z^{(l)})

\delta ^{(l)}=\Theta ^{(l)}\cdot \delta ^{l+1}\cdot a^{(l)}\cdot (1-a^{(l)})

最后回到计算最初的代价函数:

\frac{\partial J(\theta )}{\partial \Theta _{j,i}^{(l)}}=\frac{\partial J(\theta )}{\partial z_{i}^{(l+1)}}\cdot \frac{\partial z_{i}^{(l+1)}}{\partial \Theta _{j,i}^{(l)}}

很容易我们可以看出右边第一项就是上面计算的\delta _{i}^{(l+1)}

右边第二项z_{i}^{(l+1)}=\Theta _{1,j}^{(l)}\cdot a_{1}^{(l)}+\Theta _{2,j}^{(l)}\cdot a_{2}^{(l)}+......,所以\frac{\partial z_{i}^{(l+1)}}{\partial \Theta _{j,i}^{(l)}}=a_{i}^{(l)}

所以得出代价函数求偏导的最终结果:\frac{\partial J(\theta )}{\partial \Theta _{j,i}^{(l)}}=\delta _{i}^{(l+1)}\cdot a_{i}^{(l)}

计算到这里就可以理解上面计算 \delta 的计算为什么是 \frac{\partial J(\theta )}{\partial z_{i}^{(l)}} 了。

反向传播算法的实现:

(这里下标 (i,j) 和上一节课写反的,表达意思相同)

首先有m个训练集,\Delta表示全局误差,每一层对应一个\Delta ^{(l)}

遍历训练集,对每一个(x^{(i)}, y^{(i)}),设定输出层激励a^{(1)}=x^{(i)},接下来用前向传播计算每一层的激励值

使用训练集的y^{(i)}来计算网络输出层的\delta ^{(L)}

有了输出层的\delta ^{(L)},根据前面的每一层\delta的计算公式计算\delta ^{(L-1)},...,\delta ^{(2)},不计算\delta ^{(1)}是因为不需要考虑输入层的误差项

最后用\Delta ^{(l)}来累计前面计算的偏导数项。

然后得到最终的代价函数求偏导数的结果(左边为计算过程,右边是证明过程很复杂=。=),就可以应用在梯度下降法等算法的优化上了。

回顾一下向前传播的过程以及与反向传播的比较

再来看反向传播的过程,很容易可以发现其实两者的计算方法是一样的,只是方向相反

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值