本文参考于(https://zhuanlan.zhihu.com/p/105758059)
大家可以参考上述链接,更加详细。
- softmax之前的输入为
z=[z1,z2,...,zn]
- 经过softmax之后,
ai=ezi∑nk=1ezk
可得a向量a=[ez1∑nk=1ezk,ez2∑nk=1ezk,...,ezn∑nk=1ezk]
- 目标向量为
y = [0,0,0,...,1,..0],假设yj=1其余均为0
- 损失函数为交叉熵损失
L=−∑ni=1yi∗lnai,又其他均为0,故可以简写成L=−yj∗lnaj=−lnaj
目标是标量L对向量z求导,∂L∂Z=∂L∂a∗∂a∂z
1 求∂L∂a
由L=−lnaj得,loss只与a_j有关
∂L∂a=[0,0,...,−1aj,..0]
2 求∂a∂z
a是一个向量,z是一个向量,∂a∂z=⎡⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢⎣∂a1∂z1∂a1∂z2⋯∂a1∂zn∂a2∂z1∂a2∂z2⋯∂a2∂zn⋮⋮⋮⋮∂an∂z1∂an∂z2⋯∂an∂zn⎤⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥⎦
由于∂l∂a只有第j列不为0,我们只需要求∂a∂z的第行,即∂aj∂z
∂L∂Z=−1aj∗∂aj∂Z,其中aj=ezj∑ni=1ezk
- 当i≠j
∂aj∂zi=0−ezj∗ezi(∑ni=1ezk)2=−aj∗ai
∂L∂zi=−1aj∗∂aj∂z=−1aj∗(−aj∗ai)=ai
- 当i=j
∂aj∂zj=ezj∗∑ni=1ezk−ezj∗ezj(∑ni=1ezk)2=aj−a2j
∂L∂zj=(aj−a2j)∗(−1aj)=aj−1
所以∂L∂Z=[a1,a2,...aj−1,..an]=[a1,a2,,,,aj,...,an]−[0,0,...,1,..0]=a−y
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署