mon*_*mon 5 python machine-learning gradient-descent softmax
在 CS231使用反向传播计算解析梯度中,它首先实现了 Softmax 分类器,将 (softmax + log loss) 的梯度除以批量大小(在训练中前向成本计算和反向传播的循环中使用的数据数量) )。
请帮助我理解为什么需要除以批量大小。
获得梯度的链式法则应该如下。我应该在哪里合并该部门?
N = 100 # number of points per class
D = 2 # dimensionality
K = 3 # number of classes
X = np.zeros((N*K,D)) # data matrix (each row = single example)
y = np.zeros(N*K, dtype='uint8') # class labels
#Train a Linear Classifier
# initialize parameters randomly
W = 0.01 * np.random.randn(D,K)
b = np.zeros((1,K))
# some hyperparameters
step_size = 1e-0
reg = 1e-3 # regularization strength
# gradient descent loop
num_examples = X.shape[0]
for i in range(200):
# evaluate class scores, [N x K]
scores = np.dot(X, W) + b
# compute the class probabilities
exp_scores = np.exp(scores)
probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) # [N x K]
# compute the loss: average cross-entropy loss and regularization
correct_logprobs = -np.log(probs[range(num_examples),y])
data_loss = np.sum(correct_logprobs)/num_examples
reg_loss = 0.5*reg*np.sum(W*W)
loss = data_loss + reg_loss
if i % 10 == 0:
print "iteration %d: loss %f" % (i, loss)
# compute the gradient on scores
dscores = probs
dscores[range(num_examples),y] -= 1
dscores /= num_examples # <---------------------- Why?
# backpropate the gradient to the parameters (W,b)
dW = np.dot(X.T, dscores)
db = np.sum(dscores, axis=0, keepdims=True)
dW += reg*W # regularization gradient
# perform a parameter update
W += -step_size * dW
b += -step_size * db
Run Code Online (Sandbox Code Playgroud)
这是因为您正在平均梯度,而不是直接取所有梯度的总和。
当然,你不能按照这个大小来划分,但是这种划分有很多优点。主要原因是它是一种正则化(以避免过度拟合)。在梯度较小的情况下,权重不会不成比例地增长。
这种归一化允许在不同实验中比较不同批次大小的配置(如果两个批次性能依赖于批次大小,我如何比较它们?)
如果将梯度总和除以该大小,则使用更大的学习率以使训练更快可能会很有用。
这个答案在交叉验证社区中非常有用。