softmax基本形式

softmax是一个将实数域上取值的N维向量转化为[0,1]范围内的函数,常用用于分类问题中,接在神经网络最后一层,将输出值映射到概率区间上,其基本形式如下所示
pi=eai∑k=1Neak(1)p_{i}=\frac{e^{a_{i}}}{\sum_{k=1}^{N} e^{a_{k}}} \qquad(1) pi​=∑k=1N​eak​eai​​(1)

基本形式优化

从(1)式可以看到,计算时有e的指数幂运算,如果aka_{k}ak​过大,会造成溢出,优化方式如下:
pi=eai∑k=1Neak=CeaiC∑k=1Neak=eai+log⁡(C)∑k=1Neak+log⁡(C)\begin{aligned} p_{i} &=\frac{e^{a_{i}}}{\sum_{k=1}^{N} e^{a_{k}}} \\ &=\frac{C e^{a_{i}}}{C \sum_{k=1}^{N} e^{a_{k}}} \\ &=\frac{e^{a_{i}+\log (C)}}{\sum_{k=1}^{N} e^{a_{k}+\log (C)}} \end{aligned}pi​​=∑k=1N​eak​eai​​=C∑k=1N​eak​Ceai​​=∑k=1N​eak​+log(C)eai​+log(C)​​对pip_ipi​上下同乘上常数C,并将C弄到指数上,将log(c)log(c)log(c)取
log(C)=−max(a)log(C)=−max(a)log(C)=−max(a)即可在不改变值分布的情况下起到放缩作用

softmax求导

假设softmax的输入为向量A[a1,a2,..aN]A[a_1,a_2,..a_N]A[a1​,a2​,..aN​]经过softmax函数处理后输出为P[p1,p2,...pN]P[p_1,p_2,...p_N]P[p1​,p2​,...pN​]
∂pi∂aj=∂eai∑k=1Neak∂aj\frac{\partial p_{i}}{\partial a_{j}}=\frac{\partial \frac{e^{a_{i}}}{\sum_{k=1}^{N} e^{a_{k}}}}{\partial a_{j}}∂aj​∂pi​​=∂aj​∂∑k=1N​eak​eai​​​其中aja_jaj​是待求导的变量,pip_ipi​是softmax的输出值中的某一个,对于N维输出,每个维度对变量aja_{j}aj​都能求一个导数(这些导数取平均的结果用于梯度下降,下一节会说到)。
∂pi∂aj=∂eai∂eaj∂∑k=1Neak∂eaj(2)\frac{\partial p_{i}}{\partial a_{j}}=\frac{ \frac{\partial e^{a_{i}}}{\partial e^{a_{j}}} } { \frac{ \partial \sum_{k=1}^{N} e^{a_{k}}}{\partial e^{a_{j}}} } \qquad(2) ∂aj​∂pi​​=∂eaj​∂∑k=1N​eak​​∂eaj​∂eai​​​(2)
根据分式求导规则,如果f(x)=g(x)h(x)f(x)=\frac{g(x)}{h(x)}f(x)=h(x)g(x)​,那么:
f′(x)=g′(x)h(x)−h′(x)g(x)h(x)2f^{\prime}(x)=\frac{g^{\prime}(x) h(x)-h^{\prime}(x) g(x)}{h(x)^{2}}f′(x)=h(x)2g′(x)h(x)−h′(x)g(x)​这里g(x)=eaig(x)=e^{a_{i}}g(x)=eai​, h(x)=∑k=1Neakh(x)=\sum_{k=1}^{N} e^{a_{k}}h(x)=∑k=1N​eak​。再次注意这里对于每个aja_{j}aj​都有对应的N个pip_{i}pi​需要对其求导。

这里要分两种情况,i是否等于j
(1)i=ji=ji=j时
∂pi∂aj=eai∑k=1Neak−eajeai(∑k=1Neak)2=eai(∑k=1Neak−eaj)(∑k=1Neak)2=eaj∑k=1Neak×(∑k=1Neak−eaj)∑k=1Neak=pi(1−pj)(3)\begin{aligned} \frac{\partial p_{i}}{\partial a_{j}}&=\frac{e^{a_{i}} \sum_{k=1}^{N} e^{a_{k}}-e^{a_{j}} e^{a_{i}}}{\left(\sum_{k=1}^{N} e^{a_{k}}\right)^{2}} \\ &=\frac{e^{a_{i}}\left(\sum_{k=1}^{N} e^{a_{k}}-e^{a_{j}}\right)}{\left(\sum_{k=1}^{N} e^{a_{k}}\right)^{2}} \\ &=\frac{e^{a_{j}}}{\sum_{k=1}^{N} e^{a_{k}}} \times \frac{\left(\sum_{k=1}^{N} e^{a_{k}}-e^{a_{j}}\right)}{\sum_{k=1}^{N} e^{a_{k}}} \\ &=p_{i}\left(1-p_{j}\right) \qquad \end{aligned} \qquad (3)∂aj​∂pi​​​=(∑k=1N​eak​)2eai​∑k=1N​eak​−eaj​eai​​=(∑k=1N​eak​)2eai​(∑k=1N​eak​−eaj​)​=∑k=1N​eak​eaj​​×∑k=1N​eak​(∑k=1N​eak​−eaj​)​=pi​(1−pj​)​(3)
(2)i≠ji\neq ji​=j时:
∂pi∂aj=0−eajeai(∑k=1Neak)2=−eaj∑k=1Neak×eai∑k=1Neak=−pj⋅pi(4)\begin{aligned} \frac{\partial p_{i}}{\partial a_{j}}&=\frac{0-e^{a_{j}} e^{a_{i}}}{\left(\sum_{k=1}^{N} e^{a_{k}}\right)^{2}} \\ &=\frac{-e^{a_{j}}}{\sum_{k=1}^{N} e^{a_{k}}} \times \frac{e^{a_{i}}}{\sum_{k=1}^{N} e^{a_{k}}} \\ &=-p_{j} \cdot p_{i} \end{aligned}\qquad(4)∂aj​∂pi​​​=(∑k=1N​eak​)20−eaj​eai​​=∑k=1N​eak​−eaj​​×∑k=1N​eak​eai​​=−pj​⋅pi​​(4)
所以综上:
∂pi∂aj={pi(1−pj)if i=j−pj⋅piif i≠j\frac{\partial p_{i}}{\partial a_{j}}=\left\{\begin{array}{lll} p_{i}\left(1-p_{j}\right) & \text { if } & i=j \\ -p_{j \cdot p_{i}} & \text { if } & i \neq j \end{array}\right.∂aj​∂pi​​={pi​(1−pj​)−pj⋅pi​​​ if  if ​i=ji​=j​

交叉熵作为损失函数时

在分类问题(二分类或者多分类)中,常常使用交叉熵作为损失函数,交叉熵基本形式如下
H(y,p)=−∑ylog⁡(p)H(y, p)=-\sum y \log \left(p \right)H(y,p)=−∑ylog(p)yyy表示真实类别,p表示预测类别概率。
假设这里输入是aia_{i}ai​输出是pip_{i}pi​(在实际中aia_iai​一般为神经网络最后一层的输出,由真实输入xxx到aia_iai​这里并不是我们要考虑的,其链式求导不影响我们的推导),损失函数为L,求损失函数对输入的偏导
L=−∑ylog⁡(p)∂L∂ai=−∑kyk∂log⁡(pk)∂ai=−∑kyk∂log⁡(pk)∂pk×∂pk∂ai=−∑yk1pk×∂pk∂ai(5)\begin{aligned} L &=-\sum y \log \left(p\right) \\ \frac{\partial L}{\partial a_{i}} &=-\sum_{k} y_{k} \frac{\partial \log \left(p_{k}\right)}{\partial a_{i}} \\ &=-\sum_{k} y_{k} \frac{\partial \log \left(p_{k}\right)}{\partial p_{k}} \times \frac{\partial p_{k}}{\partial a_{i}} \\ &=-\sum y_{k} \frac{1}{p_{k}} \times \frac{\partial p_{k}}{\partial a_{i}} \end{aligned} \qquad (5)L∂ai​∂L​​=−∑ylog(p)=−k∑​yk​∂ai​∂log(pk​)​=−k∑​yk​∂pk​∂log(pk​)​×∂ai​∂pk​​=−∑yk​pk​1​×∂ai​∂pk​​​(5) k=1,2,3..i..N,aik=1,2,3..i..N, a_ik=1,2,3..i..N,ai​是特定位置的参数

可以将式子(5)拆分成k=ik=ik=i和k≠ik\neq ik​=i两部分:
∂L∂oi=−yi(1−pi)−∑k≠iyk1pk(−pk⋅pi)=−yi(1−pi)+∑k≠iyk⋅pi=−yi+yipi+∑k≠iyk⋅pi=pi(yi+∑k≠iyk)−yi=pi∑kyk−yi\begin{aligned} \frac{\partial L}{\partial o_{i}} &=-y_{i}\left(1-p_{i}\right)-\sum_{k \neq i} y_{k} \frac{1}{p_{k}}\left(-p_{k} \cdot p_{i}\right) \\ &=-y_{i}\left(1-p_{i}\right)+\sum_{k \neq i} y_{k} \cdot p_{i} \\ &=-y_{i}+y_{i} p_{i}+\sum_{k \neq i} y_{k} \cdot p_{i} \\ &=p_{i}\left(y_{i}+\sum_{k \neq i} y_{k}\right)-y_{i} \\ &=p_{i}\sum_{k} y_{k}-y_{i} \end{aligned}∂oi​∂L​​=−yi​(1−pi​)−k​=i∑​yk​pk​1​(−pk​⋅pi​)=−yi​(1−pi​)+k​=i∑​yk​⋅pi​=−yi​+yi​pi​+k​=i∑​yk​⋅pi​=pi​⎝⎛​yi​+k​=i∑​yk​⎠⎞​−yi​=pi​k∑​yk​−yi​​因为∑kyk=1\sum_{k}y_{k} =1∑k​yk​=1,所以
∂L∂ai=pi−yi\frac{\partial L}{\partial a_{i}}=p_{i}-y_{i}∂ai​∂L​=pi​−yi​

softmax与交叉熵损失相关推荐

  1. 图像分类_03分类器及损失:线性分类+ SVM损失+Softmax 分类+交叉熵损失

    2.3.1 线性分类 2.3.1.1 线性分类解释 上图图中的权重计算结果结果并不好,权重会给我们的猫图像分配⼀个⾮常低的猫分数.得出的结果偏向于狗. 如果可视化分类,我们为了⽅便,将⼀个图⽚理解成⼀ ...

  2. 神经网络适用于分类问题的最后一层-Softmax和交叉熵损失介绍及梯度推导

    前言 传统机器学习中两大经典任务就是回归与分类.分类在深度学习中也很常见,令我印象最深的是图像分类.当然,在NLP中,分类也无处不在.从RNN与其变体,到Transformer.Bert等预训练模型, ...

  3. 【机器学习】 二次损失函数的不足及交叉熵损失softmax详解

    二次代价函数的不足: 以sigmoid激活函数为例,由于初始化是随机的,假设目标值为0,第一次随机初始化使得输入为0.82,那么还可以,多次迭代之后可以收敛到0.09,但如果第一次随机初始化到0.98 ...

  4. 人脸识别-Loss-2010:Softmax Loss(Softmax激活函数 + “交叉熵损失函数”)【样本3真实标签为c_5,则样本3的损失:loss_3=-log(\hat{y}_5^3)】

    一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等. 全连接层:等号左边部分就是全连接层做的事, W W W 是全连接层的参数,我们也称为权值, X X X 是全连接层的输 ...

  5. Softmax函数下的交叉熵损失含义与求导

    交叉熵损失函数(CrossEntropy Function)是分类任务中十分常用的损失函数,但若仅仅看它的形式,我们不容易直接靠直觉来感受它的正确性,因此我查阅资料写下本文,以求彻底搞懂. 1.Sof ...

  6. softmax回归与交叉熵损失

    前言 回归与分类是机器学习中的两个主要问题,二者有着紧密的联系,但又有所不同.在一个预测任务中,回归问题解决的是多少的问题,如房价预测问题,而分类问题用来解决是什么的问题,如猫狗分类问题.分类问题又以 ...

  7. 【机器学习基础】Softmax与交叉熵的数学意义(信息论与概率论视角)

    经过我长时间的观察,发现很多人对人工智能/机器学习的理解只停留在"这是个经典/最新棒槌,我拿这个棒槌敲钉子贼6--"这个level.当然,如果真的敲得很6,那也是一个很厉害的大佬了 ...

  8. 为什么使用交叉熵代替二次代价函数_Softmax回归与交叉熵损失的理解

    0.sigmoid.softmax和交叉熵损失函数的概念理解 sigmoid.softmax和交叉熵损失函数 1.使用场景 在二分类问题中,神经网络输出层只有一个神经元,表示预测输出 是正类 的概率 ...

  9. 【损失函数】NLLLoss损失、CrossEntropy_Loss交叉熵损失以及Label Smoothing示例与代码

      机缘巧合下,近期又详细学习了一遍各损失函数的计算,特此记录以便后续回顾.   为了公式表示更加清晰,我们设 y n ∈ { 1 , 2 , - , K } {{y_n} \in \{ 1,2, \ ...

最新文章

  1. SQLite数据转换成sql server数据
  2. android捕获方法,android捕获Home键的方法
  3. 将带空格的字符串去掉空格.join()函数
  4. 《JAVA与模式》之访问者模式
  5. java基本语句回文数实验_实验二 java基本数据类型与把持语句.doc
  6. AHP层次分析法解决用户价值评估
  7. 天猫整站SSM-分页-herf(做个人学习笔记整理用)
  8. 计算机汉字的输入和编辑教案,计算机汉字录入教案
  9. 【全面完美方案】iPhone 4S WiFi变灰 DIY修复方式
  10. linux shell脚本 可以全局使用
  11. 如何利用Keras中的权重约束减少深度神经网络中的过拟合
  12. js中的Math对象及属性
  13. 190703每日一句
  14. 查看程序用运时占用的内存
  15. 如何快速统计多条线段的长度和?
  16. 如何应对微软的强制黑屏(转)
  17. 冒泡排序python_冒出来是什么意思
  18. 猫眼电影票房爬取到MySQL中_Scrapy爬取猫眼电影并存入MongoDB数据库
  19. 三维游戏中的角色动画
  20. EDA项目 出租车计价器 赏析

热门文章

  1. Linux中制作本地yum源
  2. malloc/calloc/realloc
  3. Django-03.静态文件与模板详解(一)
  4. 1100C NN and the Optical Illusion
  5. 异度之刃 Xenoblade 后感
  6. OUC2021软件工程“e拼“校园拼车程序小组第九周Scrum Meeting记录
  7. S4(GT-I9500)root后不能连接kies
  8. [NSSCTF 2022 Spring Recruit] Crypto wp
  9. DigitalOcean 中的浮动 IP 是什么?
  10. 竞品分析|京东和美团如何看待优惠券