各种导数

April 3, 2025 · View on GitHub

softmax交叉熵

forward

crossentropy=logeZtargetmax(Zi)i=1neZimax(Zi)crossentropy=-\log\frac{e^{Z_{target}-max({{Z}_i})}}{\sum_{i=1}^n e^{Z_i-max({{Z}_i})}}

backward

这里我们关注Zi变化对Loss的影响,可以看出,当i不等于target时,Zi只作用于分母 反之则同时作用于分子分母,导数为作用于分子和分母的导数之和

itargeti \neq target

L=g1(x1)=log(x1)L=g_1(x_1)=-log(x_1)

x1=g2(x2)=c1x2x_1=g_2(x_2)=\frac{c1}{x_2}

c1=eZtargetmax(Zi)c1=e^{Z_{target}-max({{Z}_i})}

x2=g3(x3)=x3+c2x_2=g_3(x_3)=x_3+c2

c2为常量

x3=g4(x4)=ex4x_3=g_4(x_4)=e^{x_4}

x4=g5(Zi)=Zimax(Zi)x_4=g_5(Z_i)=Z_i-max({{Z}_i})

sum=i=1neZimax(Zi)sum=\sum_{i=1}^n e^{Z_i-max({{Z}_i})}

LZi=g1(x1)x1g2(x2)x2g3(x3)x3g4(x4)x4g5(Zi)Zi\frac{\partial L}{\partial {Z}_i}=\frac{\partial g_1(x_1)}{\partial x_1}\frac{\partial g_2(x_2)}{\partial x_2}\frac{\partial g_3(x_3)}{\partial x_3}\frac{\partial g_4(x_4)}{\partial x_4}\frac{\partial g_5(Z_i)}{\partial Z_i}

g1(x1)x1=1x1\frac{\partial g_1(x_1)}{\partial x_1}=-\frac{1}{x1}

g2(x2)x2=c1x22\frac{\partial g_2(x_2)}{\partial x_2}=-\frac{c1}{x_2^2}

g3(x3)x3=1\frac{\partial g_3(x_3)}{\partial x_3}=1

g4(x4)x4=ex4\frac{\partial g_4(x_4)}{\partial x_4}=e^{x_4}

g5(Zi)Zi=1\frac{\partial g_5(Z_i)}{\partial Z_i}=1

x1=c1sumx1=\frac{c1}{sum}

x2=sumx2=sum

x4=Zimax(Zi)x_4=Z_i-max({{Z}_i})

LZi=c1ex4x1x22=eZimax(Zi)sum\frac{\partial L}{\partial {Z}_i}=\frac{c1e^{x_4}}{x_1x_2^2}=\frac{e^{Z_i-max({{Z}_i})}}{sum}

i=targeti = target

分母部分的导数同上

eZtargetmax(Zi)sum\frac{e^{Z_{target}-max({{Z}_i})}}{sum}

下面计算分子部分p

g1(x1)=log(x1)g_1(x_1) = -log(x_1)

x1=g2(x2)=x2sumx_1 = g_2(x_2) = \frac{x_2}{sum}

x2=g3(x3)=ex3x_2 = g_3(x_3) = e^{x_3}

x3=g4(Ztarget)=Ztargetmax(Zi)x_3 = g_4(Z_{target})=Z_{target}-max({{Z}_i})

p=g1(x1)x1g2(x2)x2g3(x3)x3g4(Ztarget)Ztargetp=\frac{\partial g_1(x_1)}{\partial x_1}\frac{\partial g_2(x_2)}{\partial x_2}\frac{\partial g_3(x_3)}{\partial x_3}\frac{\partial g_4(Z_{target})}{\partial Z_{target}}

g1(x1)x1=1x1\frac{\partial g_1(x_1)}{\partial x_1}=-\frac{1}{x_1}

g2(x2)x2=1sum\frac{\partial g_2(x_2)}{\partial x_2}=\frac{1}{sum}

g3(x3)x3=ex3\frac{\partial g_3(x_3)}{\partial x_3}=e^{x_3}

g4(Ztarget)Ztarget=1\frac{\partial g_4(Z_{target})}{\partial Z_{target}}=1

p=ex3x1sump=-\frac{e^{x_3}}{x_1sum}

x3=Ztargetmax(Zi)x_3=Z_{target}-max({{Z}_i})

x1=eZtargetmax(Zi)sumx_1=\frac{e^{Z_{target}-max({{Z}_i})}}{sum}

p=1p=-1

故整体的导数为 eZtargetmax(Zi)sum1\frac{e^{Z_{target}-max({{Z}_i})}}{sum}-1

ceZi={eZimax(Zi)sum,if itargeteZtargetmax(Zi)sum1,if i=target\frac{\partial ce}{\partial Z_i}=\begin{cases}\frac{e^{Z_i-max({{Z}_i})}}{sum}, & \text{if } i \neq target \\ \frac{e^{Z_{target}-max({{Z}_i})}}{sum}-1, & \text{if } i = target \end{cases}

softmax

forward

softmax(Zi)=eZij=1neZjsoftmax(Z_i)=\frac{e^{Z_i}}{\sum_{j=1}^ne^{Z_j}}

backward

softmax(Zi)=g1(x1,x2)=x1x2softmax(Z_i) = g_1(x_1, x_2) = \frac{x_1}{x_2}

sum=j=1neZjsum=\sum_{j=1}^ne^{Z_j}

softmax(Zi)Zi=g1(x1,x2)x1x1Zi+g1(x1,x2)x2x2Zi\frac{\partial softmax(Z_i)}{\partial Z_i}=\frac{\partial g_1(x_1, x_2)}{\partial x_1}\frac{\partial x_1}{\partial Z_i}+\frac{\partial g_1(x_1, x_2)}{\partial x_2}\frac{\partial x_2}{\partial Z_i}

同样考虑 i 是否等于 target的两种情况

i=targeti=target

g1(x1,x2)x1=1x2\frac{\partial g_1(x_1, x_2)}{\partial x_1}=\frac{1}{x_2}

g1(x1,x2)x2=x1x22\frac{\partial g_1(x_1, x_2)}{\partial x_2}=-\frac{x_1}{x_2^2}

下面计算 x1Zi\frac{\partial x_1}{\partial Z_i}

x1=g2(x3)=ex3x_1=g_2(x_3)=e^{x_3}

x3=g3(Zi)=Zimax(Zi)x_3=g_3(Z_i)=Z_i-max({{Z}_i})

x1Zi=g2(x3)x3g3(Zi)Zi=ex31=eZimax(Zi)\frac{\partial x_1}{\partial Z_i}=\frac{\partial g_2(x_3)}{\partial x_3}\frac{\partial g_3(Z_i)}{\partial Z_i}=e^{x_3}\cdot1=e^{Z_i-max({{Z}_i})}

下面计算 x2Zi\frac{\partial x_2}{\partial Z_i}

x2=g4(x4)=x4+c1x_2=g_4(x_4)=x_4+c_1

其中 c1c_1 为常数

x4=g5(x5)=ex5x_4=g_5(x_5)=e^{x_5}

x5=g6(Zi)=Zimax(Zi)x_5=g_6(Z_i)=Z_i-max({{Z}_i})

x2Zi=g4(x4)x4g5(x5)x5g6(zt)Zi\frac{\partial x_2}{\partial Z_i}=\frac{\partial g_4(x_4)}{\partial x_4}\frac{\partial g_5(x_5)}{\partial x_5}\frac{\partial g_6(z_t)}{\partial Z_i}

g4(x4)x4=1\frac{\partial g_4(x_4)}{\partial x_4}=1

g5(x5)x5=ex5=eZimax(Zi)\frac{\partial g_5(x_5)}{\partial x_5}=e^{x_5}=e^{Z_i-max({{Z}_i})}

g6(zt)Zi=1\frac{\partial g_6(z_t)}{\partial Z_i}=1

x2Zi=eZimax(Zi)\frac{\partial x_2}{\partial Z_i}=e^{Z_i-max({{Z}_i})}

softmax(Zi)Zi=1x2eZimax(Zi)+(x1x22)eZimax(Zi)\frac{\partial softmax(Z_i)}{\partial Z_i}=\frac{1}{x_2}\cdot e^{Z_i-max({{Z}_i})}+(-\frac{x_1}{x_2^2})\cdot e^{Z_i-max({{Z}_i})}

其中

x1=eZimax(Zi)x_1=e^{Z_i-max({{Z}_i})}

x2=sumx_2=sum

softmax(Zi)Zi=eZimax(Zi)sum(1eZimax(Zi)sum)\frac{\partial softmax(Z_i)}{\partial Z_i}=\frac{e^{Z_i-max({{Z}_i})}}{sum}\cdot (1-\frac{e^{Z_i-max({{Z}_i})}}{sum})

又因为 softmax(Zi)=eZisumsoftmax(Z_i)=\frac{e^{Z_i}}{sum}

softmax(Zi)Zi=softmax(Zi)(1softmax(Zi))\frac{\partial softmax(Z_i)}{\partial Z_i}=softmax(Z_i)\cdot (1-softmax(Z_i))

itargeti \neq target

softmax(Ztarget)=g1(x1)=eZtargetmax(Zi)x1softmax(Z_{target})=g_1(x_1) = \frac{e^{Z_{target}-max({{Z}_i})}}{x_1}

x1=g2(x2)=x2+c1x_1=g_2(x_2)=x_2+c_1 其中 c1c_1 为常数

x2=g3(x3)=ex3x_2=g_3(x_3)=e^{x_3}

x3=g4(Zi)=Zimax(Zi)x_3=g_4(Z_i)=Z_i-max({{Z}_i})

softmax(Ztarget)Zi=g1(x1)x1g2(x2)x2g3(x3)x3g4(Zi)Zi\frac{\partial softmax(Z_{target})}{\partial Z_i}=\frac{\partial g_1(x_1)}{x_1}\frac{\partial g_2(x_2)}{\partial x_2}\frac{\partial g_3(x_3)}{\partial x_3}\frac{\partial g_4(Z_i)}{\partial Z_i}

g1(x1)x1=eZtargetmax(Zi)sum2\frac{\partial g_1(x_1)}{x_1}=-\frac{e^{Z_{target}-max({{Z}_i})}}{sum^2}

g2(x2)x2=1\frac{\partial g_2(x_2)}{\partial x_2}=1

g3(x3)x3=ex3=eZimax(Zi)\frac{\partial g_3(x_3)}{\partial x_3}=e^{x_3}=e^{Z_i-max({{Z}_i})}

g4(Zi)Zi=1\frac{\partial g_4(Z_i)}{\partial Z_i}=1

softmax(Ztarget)Zi=eZtargetmax(Zi)sumeZimax(Zi)sum=softmax(Ztarget)softmax(Zi)\frac{\partial softmax(Z_{target})}{\partial Z_i}=-\frac{e^{Z_{target}-max({{Z}_i})}}{sum}\cdot \frac{e^{Z_i-max({{Z}_i})}}{sum}=-softmax(Z_{target})\cdot softmax(Z_i)

最终整理

softmax(Ztarget)Zi={softmax(Ztarget)softmax(Zi),if itargetsoftmax(Zi)(1softmax(Zi)),if i=target\frac{\partial softmax(Z_{target})}{\partial Z_i}=\begin{cases}-softmax(Z_{target})\cdot softmax(Z_i), & \text{if } i \neq target \\ softmax(Z_i)\cdot (1-softmax(Z_i)), & \text{if } i = target \end{cases}

layernorm

参考 https://zhuanlan.zhihu.com/p/634644501

Layernorm(xi)=γxiμσ+βLayernorm(x_i)=\gamma\frac{x_i-\mu}{\sigma}+\beta

σ=var+ϵ\sigma=\sqrt{var+\epsilon}

var=1ni=1n(xiμ)2var=\frac{1}{n}\sum_{i=1}^n(x_i-\mu)^2

μ=1ni=1nxi\mu=\frac{1}{n}\sum_{i=1}^nx_i

xi^=xiμσ\hat{x_i}=\frac{x_i-\mu}{\sigma}

我们最关注 xi^xj\frac{\partial \hat{x_i}}{\partial x_j} ,乘以 γ\gamma 和加上 β\beta 的部分交给node.h中的矩阵乘法加法的自动求导即可

只用链式法则

xi=g1(x1,x2)x_i = g_1(x_1, x_2)

x1=xiμx_1 = x_i-\mu

x2=σx_2 = \sigma

xi^xj=g1(x1,x2)x1xiμxj+g1(x1,x2)x2σxj\frac{\partial \hat{x_i}}{\partial x_j}=\frac{\partial g_1(x_1, x_2)}{\partial x_1}\frac{\partial xi-\mu}{\partial x_j}+\frac{\partial g_1(x_1, x_2)}{\partial x_2}\frac{\partial \sigma}{\partial x_j} (1)

g1(x1,x2)x1=1x2=1σ\frac{\partial g_1(x_1, x_2)}{\partial x_1}=\frac{1}{x_2}=\frac{1}{\sigma} (2)

xiμxj=xixjμxj\frac{\partial xi-\mu}{\partial x_j}=\frac{\partial x_i}{\partial x_j}-\frac{\partial\mu}{\partial x_j}

δij=xixj\delta_{ij}=\frac{\partial x_i}{\partial x_j}

δij={0,if ij1,if i=j\delta_{ij}=\begin{cases}0, & \text{if } i \neq j \\ 1, & \text{if } i = j \end{cases}

再计算 μxj=1ni=1nxixj=1n\frac{\partial\mu}{\partial x_j}=\frac{\partial \frac{1}{n}\sum_{i=1}^nx_i}{\partial x_j}=\frac{1}{n}

xiμxj=xixjμxj=δij1n\frac{\partial xi-\mu}{\partial x_j}=\frac{\partial x_i}{\partial x_j}-\frac{\partial\mu}{\partial x_j}=\delta_{ij}-\frac{1}{n} (3)

g1(x1,x2)x2=x1x22=xiμσ2\frac{\partial g_1(x_1, x_2)}{\partial x_2}=-\frac{x_1}{x_2^2}=-\frac{x_i-\mu}{\sigma^2} (4)

σxj=sigmavarvarxj\frac{\partial \sigma}{\partial x_j}=\frac{\partial sigma}{\partial var}\frac{\partial var}{\partial x_j} (5)

varxj=1nk=1n(xkμ)2xj=1nk=1n2(xkμ)xkμxj\frac{\partial var}{\partial x_j}=\frac{\partial \frac{1}{n}\sum_{k=1}^n(x_k-\mu)^2}{\partial x_j}=\frac{1}{n}\sum_{k=1}^n2(x_k-\mu)\frac{\partial x_k-\mu}{\partial x_j}

深入分析 1nk=1n2(xkμ)xkμxj\frac{1}{n}\sum_{k=1}^n2(x_k-\mu)\frac{\partial x_k-\mu}{\partial x_j}

xkμxj={1n,if ij11n,if i=j\frac{\partial x_k-\mu}{\partial x_j}=\begin{cases}-\frac{1}{n}, & \text{if } i \neq j \\ 1-\frac{1}{n}, & \text{if } i = j \end{cases}

所以展开 k=1n2(xkμ)xkμxj=i=1ikn1n2(xkμ)+2(xjμ)(11n)=2(1ni=1iknxk+1n(n1)μ+xj1nxjμ+1nμ)\sum_{k=1}^n2(x_k-\mu)\frac{\partial x_k-\mu}{\partial x_j}=\sum_{\substack{i = 1 \\ i \neq k}}^n-\frac{1}{n}\cdot2\cdot(x_k-\mu)+2\cdot(x_j-\mu)(1-\frac{1}{n})=2\cdot(-\frac{1}{n}\sum_{\substack{i = 1 \\ i \neq k}}^nx_k+\frac{1}{n}(n-1)\mu+x_j-\frac{1}{n}\cdot x_j-\mu+\frac{1}{n}\cdot\mu)

观察第一项和第四项的和 1ni=1iknxk1nxj=μ-\frac{1}{n}\sum_{\substack{i = 1 \\ i \neq k}}^nx_k-\frac{1}{n}\cdot x_j=-\mu

观察第二项和第六项的和 1n(n1)μ+1nμ=μ\frac{1}{n}(n-1)\mu+\frac{1}{n}\cdot\mu=\mu

上面两个和相加消掉了,只剩下第三项和第五项

varxj=2n(xjμ)\frac{\partial var}{\partial x_j}=\frac{2}{n}(x_j-\mu)

又因为 σvar=(var+ϵ)var=12(var+ϵ)=12σ\frac{\partial \sigma}{\partial var}=\frac{\partial \sqrt(var+\epsilon)}{\partial var}=\frac{1}{2\sqrt(var+\epsilon)}=\frac{1}{2\sigma}

故 (5)= σxj=sigmavarvarxj=12σ2n(xjμ)=1nσ(xjμ)\frac{\partial \sigma}{\partial x_j}=\frac{\partial sigma}{\partial var}\frac{\partial var}{\partial x_j}=\frac{1}{2\sigma}\cdot\frac{2}{n}(x_j-\mu)=\frac{1}{n\sigma}(x_j-\mu)

将(2)(3)(4)(5) 带回 (1)

xi^xj=1σ(δij1n)xiμσ21nσ(xjμ)\frac{\partial \hat{x_i}}{\partial x_j}=\frac{1}{\sigma}(\delta_{ij}-\frac{1}{n})-\frac{x_i-\mu}{\sigma^2}\cdot\frac{1}{n\sigma}(x_j-\mu)

观察这里的第二项 xiμσ21nσ(xjμ)=1nσxiμσxjμσ=1nσxi^xj^\frac{x_i-\mu}{\sigma^2}\cdot\frac{1}{n\sigma}(x_j-\mu)=\frac{1}{n\sigma}\cdot\frac{x_i-\mu}{\sigma}\cdot\frac{x_j-\mu}{\sigma}=\frac{1}{n\sigma}\cdot\hat{x_i}\cdot\hat{x_j}

xi^xj=1σ(δij1n)1nσxi^xj^=δijσ1nσ1nσxi^xj^\frac{\partial \hat{x_i}}{\partial x_j}=\frac{1}{\sigma}(\delta_{ij}-\frac{1}{n})-\frac{1}{n\sigma}\cdot\hat{x_i}\cdot\hat{x_j}=\frac{\delta_{ij}}{\sigma}-\frac{1}{n\sigma}-\frac{1}{n\sigma}\hat{x_i}\hat{x_j}

其中

δij={0,if ij1,if i=j\delta_{ij}=\begin{cases}0, & \text{if } i \neq j\\ 1, & \text{if } i = j \end{cases}

具体实现参见代码, 考虑到精度问题,计算顺序有些微调整