1. 程式人生 > >CS224n Assignment 1(1.1-1.2)

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,定義損失函式,反向傳播,更新權重。

未完待續~