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,定义损失函数,反向传播,更新权重。

未完待续~

猜你喜欢

转载自blog.csdn.net/destiny_block/article/details/84825909