CS224n Assignment 1(1.1-1.2)

具體推倒公式及代碼參考鏈接:
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

開始做作業的時候,沒搞懂題目說的是什麼意思,所以解釋一下。

參考:
deeplearning系列(三)梯度檢驗

gradient check:梯度檢驗。
神經網絡算法使用反向傳播計算目標函數關於每個參數的梯度,可以看做解析梯度。由於計算過程中涉及到的參數很多,反向傳播計算的梯度很容易出現誤差,導致最後迭代得到效果很差的參數值。爲了確認代碼中反向傳播計算的梯度是否正確,可以採用梯度檢驗(gradient check)的方法。通過計算數值梯度,得到梯度的近似值,然後和反向傳播得到的梯度進行比較,若兩者相差很小的話則證明反向傳播的代碼是正確無誤的。(引自上鍊接)

數學公式爲:
在這裏插入圖片描述

3. q2_neural.py

此處涉及神經網絡的反向傳播算法,推一個知乎的答案,數學公式通俗易懂。如何理解神經網絡裏面的反向傳播算法?(第二個人的答案)
在這裏插入圖片描述
在作業代碼中,是將權重W,W`拼接爲一個矩陣,進行計算。
前向傳播,得到y_hat,定義損失函數,反向傳播,更新權重。

未完待續~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章