具体推倒公式及代码参考链接:
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,定义损失函数,反向传播,更新权重。
未完待续~