Python 为什么softmax分类器梯度除以批次大小(CS231n)? 问题:

Python 为什么softmax分类器梯度除以批次大小(CS231n)? 问题:,python,machine-learning,gradient-descent,softmax,Python,Machine Learning,Gradient Descent,Softmax,在首先实现Softmax分类器的CS231中,将(Softmax+对数损失)的梯度除以批量大小(在训练中正向成本计算和反向传播的循环中使用的数据数量) 请帮助我理解为什么它需要除以批量大小 获得梯度的链式法则应该在下面。我应该在哪里合并该部门 代码 N=100#每类分数 D=2#维数 K=3#课程数 X=np.zeros((N*K,D))#数据矩阵(每行=单个示例) y=np.zero(N*K,dtype='uint8')#类标签 #训练线性分类器 #随机初始化参数 W=0.01*

在首先实现Softmax分类器的CS231中,将(Softmax+对数损失)的梯度除以批量大小(在训练中正向成本计算和反向传播的循环中使用的数据数量)

请帮助我理解为什么它需要除以批量大小

获得梯度的链式法则应该在下面。我应该在哪里合并该部门

代码
N=100#每类分数
D=2#维数
K=3#课程数
X=np.zeros((N*K,D))#数据矩阵(每行=单个示例)
y=np.zero(N*K,dtype='uint8')#类标签
#训练线性分类器
#随机初始化参数
W=0.01*np.随机随机随机数n(D,K)
b=np.零((1,K))
#一些超参数
台阶尺寸=1e-0
reg=1e-3#正则化强度
#梯度下降回路
num_examples=X.shape[0]
对于范围(200)内的i:
#评估班级分数,[N x K]
分数=np.点(X,W)+b
#计算类概率
经验分数=np.exp(分数)
probs=exp_分数/np.sum(exp_分数,axis=1,keepdims=True)#[N x K]
#计算损失:平均交叉熵损失和正则化
correct_logprobs=-np.log(probs[range(num_示例),y])
数据丢失=np.sum(正确的logprobs)/num\u示例
注册损失=0.5*reg*np.总和(W*W)
丢失=数据丢失+注册丢失
如果i%10==0:
打印“迭代%d:损失%f”%(i,损失)
#计算分数的梯度
dscores=probs
dscores[范围(num_示例),y]=1

dscores/=num_examples#这是因为您要平均梯度,而不是直接获取所有梯度的总和

当然,你可以不分大小,但这种划分有很多优势。主要原因是它是一种正则化(以避免过度拟合)。使用较小的渐变时,权重不能超出比例

这种标准化允许在不同的实验中比较不同的批次大小配置(如果两个批次的性能依赖于批次大小,我如何比较它们?)

如果将梯度总和除以该大小,则可以使用更高的学习率来加快培训速度


非常有用。

注意到dW=np中的。点(X.T,dscores)对于
W
处的梯度,在num\u样本实例上是
的∑
。由于dscore,即概率(softmax输出),被num_样本除以,因此不理解这是代码后面的部分的标准化。现在已经理解,需要除以num_样本(如果学习率经过训练,则可能仍然可以正常工作)

我相信下面的代码解释得更好

# compute the gradient on scores
dscores = probs
dscores[range(num_examples),y] -= 1

# backpropate the gradient to the parameters (W,b)
dW = np.dot(X.T, dscores) / num_examples
db = np.sum(dscores, axis=0, keepdims=True) / num_examples

谢谢您的跟进,但我仍然不清楚。softmax输出p(k)介于0和1之间,这是dscore的每个元素,即形状矩阵(num_samples,3)。如果将dscore除以num_samples,它将分割矩阵中的每个元素,从而分割p(k),这将导致非常小的值。仍然不明白为什么要这样做。dscores是梯度,而不是softmax的纯输出(
dscores[range(num_示例),y]=1
)。你是在平均梯度,而不是概率
# compute the gradient on scores
dscores = probs
dscores[range(num_examples),y] -= 1

# backpropate the gradient to the parameters (W,b)
dW = np.dot(X.T, dscores) / num_examples
db = np.sum(dscores, axis=0, keepdims=True) / num_examples