gpt4 book ai didi

python - CS231n : How to calculate gradient for Softmax loss function?

转载 作者:IT老高 更新时间:2023-10-28 20:41:36 26 4
gpt4 key购买 nike

我正在观看 Stanford CS231: Convolutional Neural Networks for Visual Recognition 的一些视频,但不太了解如何使用 numpy 计算 softmax 损失函数的分析梯度。

来自 this stackexchange答案,softmax梯度计算为:

derivative calculation

上面的 Python 实现是:

num_classes = W.shape[0]
num_train = X.shape[1]
for i in range(num_train):
for j in range(num_classes):
p = np.exp(f_i[j])/sum_i
dW[j, :] += (p-(j == y[i])) * X[:, i]

谁能解释一下上面的代码片段是如何工作的?下面还包括softmax的详细实现。

def softmax_loss_naive(W, X, y, reg):
"""
Softmax loss function, naive implementation (with loops)
Inputs:
- W: C x D array of weights
- X: D x N array of data. Data are D-dimensional columns
- y: 1-dimensional array of length N with labels 0...K-1, for K classes
- reg: (float) regularization strength
Returns:
a tuple of:
- loss as single float
- gradient with respect to weights W, an array of same size as W
"""
# Initialize the loss and gradient to zero.
loss = 0.0
dW = np.zeros_like(W)

#############################################################################
# Compute the softmax loss and its gradient using explicit loops. #
# Store the loss in loss and the gradient in dW. If you are not careful #
# here, it is easy to run into numeric instability. Don't forget the #
# regularization! #
#############################################################################

# Get shapes
num_classes = W.shape[0]
num_train = X.shape[1]

for i in range(num_train):
# Compute vector of scores
f_i = W.dot(X[:, i]) # in R^{num_classes}

# Normalization trick to avoid numerical instability, per http://cs231n.github.io/linear-classify/#softmax
log_c = np.max(f_i)
f_i -= log_c

# Compute loss (and add to it, divided later)
# L_i = - f(x_i)_{y_i} + log \sum_j e^{f(x_i)_j}
sum_i = 0.0
for f_i_j in f_i:
sum_i += np.exp(f_i_j)
loss += -f_i[y[i]] + np.log(sum_i)

# Compute gradient
# dw_j = 1/num_train * \sum_i[x_i * (p(y_i = j)-Ind{y_i = j} )]
# Here we are computing the contribution to the inner sum for a given i.
for j in range(num_classes):
p = np.exp(f_i[j])/sum_i
dW[j, :] += (p-(j == y[i])) * X[:, i]

# Compute average
loss /= num_train
dW /= num_train

# Regularization
loss += 0.5 * reg * np.sum(W * W)
dW += reg*W

return loss, dW

最佳答案

不确定这是否有帮助,但是:

y_i真的是指标函数y_i ,如 here 所述.这在代码中形成了表达式 (j == y[i])

另外,损失相对于权重的梯度是:

y_i

在哪里

y_i

这是代码中X[:,i]的出处。

关于python - CS231n : How to calculate gradient for Softmax loss function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41663874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com