摘要
本文給出 softmax 函數的定義, 並求解其在反向傳播中的梯度
相關
配套代碼, 請參考文章 :
Python 和 PyTorch 對比實現 softmax 及其反向傳播
系列文章索引 :
https://blog.csdn.net/oBrightLamp/article/details/85067981
正文
1. 定義
softmax函數常用於多分類問題的輸出層.
定義如下:
si=∑t=1kextexit=1∑kext=ex1+ex2+ex3+⋯+exki=1,2,3,⋯,k
編程實現softmax函數計算的時候, 因爲存在指數運算 exi, 數值有可能非常大, 導致大數溢出.
一般在分式的分子和分母都乘以一個常數C, 變換成:
si=C∑t=1kextCexi=∑t=1kext+logCexi+logC=∑t=1kext−mexi−mm=−logC=max(xi)
C的值可自由選擇, 不會影響計算結果. 這裏 m 取 xi 的最大值, 將數據集的最大值偏移至0.
2. 梯度求導
考慮一個 softmax 變換:
x=(x1,x2,x3,⋯,xk)s=softmax(x)
求 s1 對 x1 的導數:
s1=∑t=1kextex1=sumex1sum=t=1∑kext=ex1+t=2∑kext∂x1∂sum=∂x1∂∑t=1kext=ex1∂x1∂s1=sum2ex1⋅sum−ex1⋅∂x1∂sum=sum2ex1⋅sum−ex1⋅ex1=s1−s12
分母中 x2 對 s1 的梯度也有影響, 求 s1 對 x2 的導數:
∂x2∂s1=sum20⋅sum−ex1⋅∂x2∂sum=sum2−ex1⋅ex2=−s1s2
同理可得:
∂xj∂si={−si2+si,−sisj,i=ji=j
展開可得 softmax 的梯度矩陣:
∇s(x)=⎝⎜⎜⎜⎛∂s1/∂x1∂s2/∂x1⋮∂sk/∂x1∂s1/∂x2∂s2/∂x2⋮∂sk/∂x2⋯⋯⋱⋯∂s1/∂xk∂s2/∂xk⋮∂sk/∂xk⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎛−s1s1+s1−s2s1⋮−sks1−s1s2−s2s2+s2⋮−sks2⋯⋯⋱⋯−s1sk−s2sk⋮−sksk+sk⎠⎟⎟⎟⎞
這是一個雅可比矩陣 (Jacobian) 矩陣.
3. 反向傳播
考慮一個輸入向量 x, 經 softmax 函數歸一化處理後得到向量 s, 往前 forward 傳播得出誤差值 error (標量 e ), 求 e 關於 x 的梯度.
x=(x1,x2,x3,⋯,xk)s=softmax(x)e=forward(s)
求解過程:
∇e(s)=(∂s1∂e,∂s2∂e,∂s3∂e,⋯,∂sk∂e)∂xi∂e=∂s1∂e∂xi∂s1+∂s2∂e∂xi∂s2+∂s3∂e∂xi∂s3+⋯+∂sk∂e∂xi∂sk
展開 ∂e/∂xi 可得 e 關於 X 的梯度向量 :
∇e(x)=(∂s1∂e,∂s2∂e,∂s3∂e,⋯,∂sk∂e)⎝⎜⎜⎜⎛∂s1/∂x1∂s2/∂x1⋮∂sk/∂x1∂s1/∂x2∂s2/∂x2⋮∂sk/∂x2⋯⋯⋱⋯∂s1/∂xk∂s2/∂xk⋮∂sk/∂xk⎠⎟⎟⎟⎞=∇e(s)⎝⎜⎜⎜⎛−s1s1+s1−s2s1⋮−sks1−s1s2−s2s2+s2⋮−sks2⋯⋯⋱⋯−s1sk−s2sk⋮−sksk+sk⎠⎟⎟⎟⎞
所有的 ∂e/∂si 值都是已知的, 即是上游 forward 反向傳播回來的誤差梯度, 因此 ∇e(s) 也是已知的.
4. 有趣的性質
4.1 相對誤差
接上回例子, 觀察到 softmax 的梯度矩陣中, 同一列的元素相加 :
t=1∑k∂xi∂st=1
若 e 對 s 的梯度向量中, 每一個元素都恆等於某個實數 a :
∂si∂e≡a
則
∇e(x)≡0
即, 若上游梯度均勻, 則不傳遞誤差梯度.
4.2 收斂性質
若:
e=forward(x)=−i=1∑kyilog(si)∇e(s)=(−s1y1,−s2y2,⋯,−skyk)siyi≡a
這時就有 :
sjsi=yjyi
即 si 概率分佈收斂至 yi 的等比例概率分佈.
全文完.