BP算法推导-softmax层+交叉熵(logloss)
摘要:
在之前的两篇文章中RNN训练与BP算法,BP算法心得体会都是在具体在讲bp算法在神经网络里面的推导。两篇文章都没有讲过和softmax相关的东西。而softmax作为分类任务里面重要的一层,所以打算本篇文章介绍一下softmax层。另外,一致沿用的损失函数都是均方误差,所以借这个机会也讲解下当损失函数是交叉熵时候的推导情况。
引言:
本文打算在RNN训练与BP算法文章的基础,将最后一层输出层改成softmax层,推导整个公式。
下面是前向传播的公式(来源于上面的文章,新来的读者建议新看下这篇文章)
vimv_{im}是输入层第mm个输入与隐藏层中第ii个神经元所连接的权重。
uinu_{in}是隐层自循环的权重(具体表现为上面结构图中那些紫色、绿色的线)
wkmw_{km}是隐藏层中第m个神经元与输出层第k个神经元连接的权重。
网络中共有N(i)个输入单元N_{(i)}个输入单元,N(h)个隐藏层N_{(h)}个隐藏层,N(o)个输出单元N_{(o)}个输出单元
netthinet_{hi}^{t}表示隐藏层第ii个神经元在tt时刻激活前的输入。
具体为:netthi=∑N(i)m=1(vimxtm)+∑N(h)s=1(uisht−1s)net_{hi}^{t}=\sum_{m=1}^{N_{(i)}}(v_{im}x_m^{t})+\sum_{s=1}^{N_{(h)}}(u_{is}h_s^{t-1})
经过激活后的输出为:hti=f(netthi)h_i^{t}=f(net_{hi}^{t})
nettyknet_{yk}^{t}表示输出层第kk个神经元在tt时刻激活前的输入。
具体为:nettyk=∑N(h)m=1(wkmhtm)net_{yk}^{t}=\sum_{m=1}^{N_{(h)}}(w_{km}h_m^{t})
经过激活后的输出为:otk=g(nettyk)o_k^{t}=g(net_{yk}^{t})
这里,由于我们输出层是softmax所以只需要把输出层的激活函数g(x)g(x)设计成:g(xi)=exi∑allk=1exkg(x_i)=\frac{e^{x_i}}{\sum_{k=1}^{all}{e^{x_k}}}。这样我们就能够实现输出层进行softmax的操作。
具体来说:otk=enettyk∑N(o)k′=1enettyk′o_k^{t}=\frac{e^{net_{yk}^{t}}}{\sum_{{k'}=1}^{N(o)}e^{net_{yk'}^t}}
(大家可能发现了。希望网络输出softmax的结果只需要改输出层激活函数。那么推导公式中可能变化的也只有涉及到输出层激活函数部分的偏导数)
最后定义我们的损失函数——交叉熵:
Et=−∑N(o)k=1ztk∗ln(otk)E_t=-\sum_{k=1}^{N(o)}z_{k}^{t}*ln(o_k^{t})
E=∑stept=1EtE=\sum_{t=1}^{step}E_{t}。
1.求∂E∂wkm\left.\frac{\partial E}{\partial w_{km}}\right.:
和之前讲解BP的文章套路一样,我们可以对∂E∂wkm\left.\frac{\partial E}{\partial w_{km}}\right.使用链式法则,具体如下:
∂E∂wkm=∂E∂nettyk∗∂nettyk∂wkm\left.\frac{\partial E}{\partial w_{km}}\right.=\left.\frac{\partial E}{\partial net_{yk}^{t}}\right.*\left.\frac{\partial net_{yk}^{t}}{\partial w_{km}}\right.
对于等式右边第二项很好计算,∂nettyk∂wkm=htm\left.\frac{\partial net_{yk}^{t}}{\partial w_{km}}\right.=h_{m}^{t}
和之前一样,我们定义等式右边第一项为误差信号δtyk=∂E∂nettyk\delta_{yk}^{t}=\left.\frac{\partial E}{\partial net_{yk}^{t}}\right.。
然后,下面求解误差信号,通常按照我们的思路,我们会如下推导:
δtyk=∂E∂nettyk=∂E∂otk∗∂otk∂nettyk\delta_{yk}^{t}=\left.\frac{\partial E}{\partial net_{yk}^{t}}\right.=\left.\frac{\partial E}{\partial o_k^t}\right.*\left.\frac{\partial o_k^t}{\partial net_{yk}^{t}}\right.。
但是需要注意的是!!!!这是错误的!!!!!
我们看看softmax的公式:
otk=enettyk∑N(o)k′=1enettyk′o_k^{t}=\frac{e^{net_{yk}^{t}}}{\sum_{{k'}=1}^{N(o)}e^{net_{yk'}^t}},大家需要注意的是,分母是输出层各个神经元叠加之和。也就是说和nettyknet_{yk}^t不仅仅影响当前的输出otko_k^t,还影响其余的输出oti,i=1,2,....N(o)o_i^t,i=1,2,....N(o)。所以在这里,误差信号应该改为:
δtyk=∂E∂nettyk=∑N(o)k′=1(∂E∂otk′∗∂otk′∂nettyk)\delta_{yk}^{t}=\left.\frac{\partial E}{\partial net_{yk}^{t}}\right.=\sum_{k'=1}^{N(o)}(\left.\frac{\partial E}{\partial o_{k'}^t}\right.*\left.\frac{\partial o_{k'}^t}{\partial net_{yk}^{t}}\right.)。
对于:∂E∂otk′\left.\frac{\partial E}{\partial o_{k'}^t}\right.很好求,
具体为:∂E∂otk′=−ztk′otk′\left.\frac{\partial E}{\partial o_{k'}^t}\right.=-\frac{z_{k'}^t}{o_{k'}^t}
对于:∂otk′∂nettyk\left.\frac{\partial o_{k'}^t}{\partial net_{yk}^{t}}\right.比较麻烦,下面详细推导
其中AA为sotfmax分母,即A=∑N(o)k′=1enettyk′A=\sum_{{k'}=1}^{N(o)}e^{net_{yk'}^t}。
将∂otk′∂nettyk\left.\frac{\partial o_{k'}^t}{\partial net_{yk}^{t}}\right.带入δtyk\delta_{yk}^{t}。
当然,需要在求和项中分成kk和不为kk两项。
δtyk=∂E∂nettyk=∑N(o)k′=1(∂E∂otk′∗∂otk′∂nettyk)=∂E∂otk∗∂otk∂nettyk+∑k′≠k(∂E∂otk′∗∂otk′∂nettyk)\delta_{yk}^{t}=\left.\frac{\partial E}{\partial net_{yk}^{t}}\right.=\sum_{k'=1}^{N(o)}(\left.\frac{\partial E}{\partial o_{k'}^t}\right.*\left.\frac{\partial o_{k'}^t}{\partial net_{yk}^{t}}\right.)=\left.\frac{\partial E}{\partial o_{k}^t}\right.*\left.\frac{\partial o_{k}^t}{\partial net_{yk}^{t}}\right.+\sum_{k'\neq k}^{}(\left.\frac{\partial E}{\partial o_{k'}^t}\right.*\left.\frac{\partial o_{k'}^t}{\partial net_{yk}^{t}}\right.)
因此对于第一项∂E∂otk∗∂otk∂nettyk\left.\frac{\partial E}{\partial o_{k}^t}\right.*\left.\frac{\partial o_{k}^t}{\partial net_{yk}^{t}}\right.有:
∂E∂otk∗∂otk∂nettyk=−ztkotk∗enettyk(A−enettyk)A2=−ztk∗(A−enettyk)A=−ztk+ztkenettykA\left.\frac{\partial E}{\partial o_{k}^t}\right.*\left.\frac{\partial o_{k}^t}{\partial net_{yk}^{t}}\right.=-\frac{z_{k}^t}{o_{k}^t}*\frac{e^{net_{yk}^t}(A-e^{net_{yk}^t})}{A^2}=-\frac{z_k^t*(A-e^{net_{yk}^t})}{A}=-z_k^t+z_k^t\frac{e^{net_{yk}^t}}{A}。
(这里需要意识到otk=enettykAo_k^t=\frac{e^{net_{yk}^t}}{A})
对于第二项:∑k′≠k(∂E∂otk′∗∂otk′∂nettyk)\sum_{k'\neq k}^{}(\left.\frac{\partial E}{\partial o_{k'}^t}\right.*\left.\frac{\partial o_{k'}^t}{\partial net_{yk}^{t}}\right.)有:
∑k′≠k(∂E∂otk′∗∂otk′∂nettyk)=∑k′≠k(ztk′otk′∗enettyk∗enettyk′A2)=∑k′≠kztk′∗enettykA=enettyk∑k′≠kztk′A\sum_{k'\neq k}^{}(\left.\frac{\partial E}{\partial o_{k'}^t}\right.*\left.\frac{\partial o_{k'}^t}{\partial net_{yk}^{t}}\right.)=\sum_{k'\neq k}^{}(\frac{z_{k’}^t}{o_{k'}^t}*\frac{e^{net_{yk}^t}*e^{net_{yk'}^t}}{A^2})=\sum_{k'\neq k}^{}\frac{z_{k'}^t*e^{net_{yk}^t}}{A}=e^{net_{yk}^t}\sum_{k'\neq k}^{}\frac{z_{k'}^t}{A} (注意到enettyke^{net_{yk}^t}下表不再是k′k'不需要参与求和)
把两项合在一起可以得到:
δtyk=−ztk+ztkenettykA+enettyk∑k′≠kztk′A=−ztk+enettykA∑N(o)k=1ztk\delta_{yk}^{t}=-z_k^t+z_k^t\frac{e^{net_{yk}^t}}{A}+e^{net_{yk}^t}\sum_{k'\neq k}^{}\frac{z_{k'}^t}{A}=-z_k^t+\frac{e^{net_{yk}^t}}{A}\sum_{k=1}^{N(o)}{z_{k}^t}
值得注意的是,每一次输出中只有一个目标标签为1。故∑N(o)k=1ztk=1\sum_{k=1}^{N(o)}{z_{k}^t}=1,所以有:
δtyk=−ztk+ztkenettykA+enettyk∑k′≠kztk′A=−ztk+enettykA=otk−ztk\delta_{yk}^{t}=-z_k^t+z_k^t\frac{e^{net_{yk}^t}}{A}+e^{net_{yk}^t}\sum_{k'\neq k}^{}\frac{z_{k'}^t}{A}=-z_k^t+\frac{e^{net_{yk}^t}}{A}=o_k^t-z_k^t。
至此,我们推导完毕,即:δtyk=otk−ztk\delta_{yk}^{t}=o_k^t-z_k^t。
∂E∂wkm=∂E∂nettyk∗∂nettyk∂wkm=δtyk∗htm=(otk−ztk)∗htm\left.\frac{\partial E}{\partial w_{km}}\right.=\left.\frac{\partial E}{\partial net_{yk}^{t}}\right.*\left.\frac{\partial net_{yk}^{t}}{\partial w_{km}}\right.=\delta_{yk}^{t}*h_m^t=(o_k^t-z_k^t)*h_m^t。
ok,至此后面关于其他权重的推导都和之前文章的一样,所以就不再重复了。
另外,这里是一篇关于单层神经网络softmax+交叉熵的推导,其实大多数步骤都是一样的,大家可以参考一下:
参考文章
BP算法推导-softmax层+交叉熵(logloss)相关推荐
- 神经网络适用于分类问题的最后一层-Softmax和交叉熵损失介绍及梯度推导
前言 传统机器学习中两大经典任务就是回归与分类.分类在深度学习中也很常见,令我印象最深的是图像分类.当然,在NLP中,分类也无处不在.从RNN与其变体,到Transformer.Bert等预训练模型, ...
- pytoch人工神经网络基础:最简单的分类(softmax回归+交叉熵分类)
softmax回归分类原理 对于回归问题,可以用模型预测值与真实值比较,用均方误差这样的损失函数表示误差,迭代使误差最小训练模型. 那么分类问题是否可以用线性回归模型预测呢.最简单的方法就是用soft ...
- 神经网络学习中的SoftMax与交叉熵
简 介: 对于在深度学习中的两个常见的函数SoftMax,交叉熵进行的探讨.在利用paddle平台中的反向求微分进行验证的过程中,发现结果 与数学定义有差别.具体原因还需要之后进行查找. 关键词: 交 ...
- 人脸识别-Loss-2010:Softmax Loss(Softmax激活函数 + “交叉熵损失函数”)【样本3真实标签为c_5,则样本3的损失:loss_3=-log(\hat{y}_5^3)】
一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等. 全连接层:等号左边部分就是全连接层做的事, W W W 是全连接层的参数,我们也称为权值, X X X 是全连接层的输 ...
- 度量学习(Metric learning)—— 基于分类损失函数(softmax、交叉熵、cosface、arcface)
概述 首先,我们把loss归为两类:一类是本篇讲述的基于softmax的,一类是基于pair对的(如对比损失.三元损失等). 基于pair对的,参考我的另一篇博客: https://blog.csdn ...
- tensoflow随笔——softmax和交叉熵
softmax函数 softmax函数接收一个N维向量作为输入,然后把每一维的值转换到(0, 1)之间的一个实数.假设模型全连接网络输出为a,有C个类别,则输出为a1,a2,...,aC,对于每个样本 ...
- 多层感知机Perceptron反向传播BP算法推导(Back Propagation)
看了很多BP的推导,都不够简洁直观,这里总结一下.多层Perceptron就是全连接的网络,定义第l层的输入为x(l)x^{(l)}x(l),那么全连接的线性输出z(l)=W(l)x(l)+b(l)z ...
- 【机器学习基础】Softmax与交叉熵的数学意义(信息论与概率论视角)
经过我长时间的观察,发现很多人对人工智能/机器学习的理解只停留在"这是个经典/最新棒槌,我拿这个棒槌敲钉子贼6--"这个level.当然,如果真的敲得很6,那也是一个很厉害的大佬了 ...
- 动手学深度学习——softmax回归之OneHot、softmax与交叉熵
目录 一.从回归到多类分类 1. 回归估计一个连续值 2. 分类预测一个离散类别 二.独热编码OneHot 三.校验比例--激活函数softmax 四.损失函数--交叉熵 五.总结 回归可以用于预测多 ...
- softmax与交叉熵损失
softmax基本形式 softmax是一个将实数域上取值的N维向量转化为[0,1]范围内的函数,常用用于分类问题中,接在神经网络最后一层,将输出值映射到概率区间上,其基本形式如下所示 pi=eai∑ ...
最新文章
- 麦肯锡《2020年人工智能状况》报告:企业收入增长,AI真的出了力
- 基于7个案例,分享我对“提示信息设计”的思考
- 【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验
- 如何成为一位牛逼的高手
- ResNet及其变种的结构梳理、有效性分析与代码解读(PyTorch)
- hbuilderx设置新建jsx后缀名_TypeScript编写前基本配置操作
- ROS 中文教程目录(最好不要过度依赖这种,建议养成看英文原版习惯)
- 机器学习基石笔记-Lecture 14 Regularization
- C# Cookie工具类
- 最新版云铺购ds网系统全开源可运营程序源码
- 【前端项目】<开发实战>一个小而精致的个人简历
- Matlab SVPWM仿真模型
- 分布式开源调度框架TBSchedule原理与应用
- AD(altium designer)15原理图与PCB设计教程(五)——工程编译与报表生成
- iOS小技能:iOS15适配导航条主题: 背景颜色、标题颜色
- 计算机金钱符号怎么打,€欧元符号怎么打出来?各种输入欧元的货币符号方法!...
- 游轮帆船租赁旅游响应式模板
- pandas 空数据处理和数据过滤
- 百度ai开放平台使用方法(附带例子详细步骤)
- 阿里巴巴引入字体图标的第二种方法: