Softmax梯度推導

  • 2019 年 10 月 5 日
  • 筆記

Softmax梯度推導

0.說在前面

今天來學習Softmax梯度推導及實現!

1.損失函數

矩陣乘法

矩陣相乘,矩陣A的一行乘以矩陣B的每一列,不用循環B矩陣乘法公式:

對於下面這個,則不用循環W矩陣,否則通常做法還得循環W矩陣的每一列!

score = np.dot(X[i],W)  

損失函數

具體的描述看程式碼,有一點需要注意,損失函數Loss也就是cross-entropy!

在實際計算的時候,需要給分子分母同時乘以常熟C,一般C取-maxfj,目的是防止數值爆炸,所產生的導致電腦記憶體不足,計算不穩定!

def softmax_loss_naive(W, X, y, reg):    loss = 0.0    dW = np.zeros_like(W)    num_train = X.shape[0]    num_class = W.shape[1]    for i in range(num_train):        # 得到S矩陣每一行        score = np.dot(X[i],W)        # 防止數值爆炸,保持穩定性        score-=max(score)        # 分子 去指數        score = np.exp(score)        # 分母,S矩陣每一行求和        softmax_sum = np.sum(score)        # broadcast:向量除以標量        score /= softmax_sum        # 得到交叉熵,也就是softmax的loss        loss -= np.log(score[y[i]])     # 平均     loss/=num_train     # 加上正則項     loss+=reg*np.sum(W*W)    return loss, dW  

2.梯度推導

shape查看

X為(D,N),W為(N,C)

梯度求導推論

這裡Xi與Wj轉置均是行向量!

記作(2)式:

記作(3)式:

pm = [0,…1…,0]是一個是一個one hot vector

梯度求導:

利用鏈式求導法則:記作(4)式:

觀察shape:

對Wj求導後shape是(1,D),後面三個分別是(1,C),(C,C),(C,D),最終是(1,D),記作(5)式:

記作(6)式:

上面求導分為兩種情況,記作(7)式:

Si表示S矩陣中每一行數據,那Sj對Wj求導如下:

現在取X矩陣第一行[X11,X12,…..X1n]

取W矩陣第一列[W11,W21….Wn1]

X與W矩陣相乘得S矩陣,上面X第一行與W第一列相乘得到S矩陣第一個元素,記作S01,同理我們可以得到S矩陣每一行得所有元素,分別為Si1,Si2,…..,SiC。

Wj代表W矩陣得列向量,每一列為Wj,第一列W1,後面依此類推!

那麼我們現在來分析一下Si對Wj求導,這裡推導:

對於最上面wj代表行向量,如下面所示是W矩陣(D,C)表示:記作(8)式:

回顧一下(1)式,那麼W轉置得矩陣(C,D)則為:記作(9)式:

而X矩陣(N,D)則是:記作(10)式:

而S矩陣(N,C)表示為(記作):記作(11)式:

也就是,記作(12)式::

S1表示第一行,Si表示第i行

現在回到求導,那麼當Si對Wj進行求導得時候,我們從列向量表示得S矩陣(12)與原始矩陣S(11)相比較,我們知道,Si對wj求導為xi,其餘全為0,得到下面結果,記作(13)式(C,D):

帶入鏈式求導法則,得到:

梯度實現

在上述交叉熵下面添加如下程式碼即可!

# 計算梯度  for j in range(num_class):    if j!=y[i]:      dw[:,j]+=score[j]*X[i]    else:      dw[:,j]+=(score[j]-1)*X[i]