具體推倒公式及代碼參考鏈接:
My solution to cs224n assignment1(1-2)
CS224n-作業1
1. q1_softmax.py
在代碼實現過程中,不可以直接套用公式。
例如,對於x = [[1001,1002],[3,4]]這樣的數據,直接套用公式會導致softmax函數上溢。
所以在實際代碼中,讓矩陣x 減去一個最大值,使得exp裏的最大參數爲0,這排除了上溢的可能性。分母中至少有一個值爲1的項,排除了因分母下溢導致被零除的可能。
def softmax(x):
"""
Arguments:
x -- A D dimensional vector or N x D dimensional numpy matrix.
Return:
x -- You are allowed to modify x in-place
"""
orig_shape = x.shape
if len(x.shape) > 1: #如果是n維矩陣
exp_minmax = lambda x: np.exp(x - np.max(x)) #防止softmax函數上溢出(overflow)和下溢出(underflow)
denom = lambda x: 1.0 / np.sum(x)
x = np.apply_along_axis(exp_minmax, 1, x) # 0是按列切分,1是按行切分
denominator = np.apply_along_axis(denom, 1, x)
if len(denominator.shape) == 1:
denominator = denominator.reshape((denominator.shape[0], 1))
x = x * denominator
else: ##一維
x_max = np.max(x)
x = x - x_max
numerator = np.exp(x)
denominator = 1.0 / np.sum(numerator)
x = numerator.dot(denominator)
assert x.shape == orig_shape
return x
2. q2_gradcheck.py
開始做作業的時候,沒搞懂題目說的是什麼意思,所以解釋一下。
gradient check:梯度檢驗。
神經網絡算法使用反向傳播計算目標函數關於每個參數的梯度,可以看做解析梯度。由於計算過程中涉及到的參數很多,反向傳播計算的梯度很容易出現誤差,導致最後迭代得到效果很差的參數值。爲了確認代碼中反向傳播計算的梯度是否正確,可以採用梯度檢驗(gradient check)的方法。通過計算數值梯度,得到梯度的近似值,然後和反向傳播得到的梯度進行比較,若兩者相差很小的話則證明反向傳播的代碼是正確無誤的。(引自上鍊接)
數學公式爲:
3. q2_neural.py
此處涉及神經網絡的反向傳播算法,推一個知乎的答案,數學公式通俗易懂。如何理解神經網絡裏面的反向傳播算法?(第二個人的答案)
在作業代碼中,是將權重W,W`拼接爲一個矩陣,進行計算。
前向傳播,得到y_hat,定義損失函數,反向傳播,更新權重。
未完待續~