Machine learning 小批量SGD梯度计算-平均值或总和

Machine learning 小批量SGD梯度计算-平均值或总和,machine-learning,tensorflow,deep-learning,caffe,Machine Learning,Tensorflow,Deep Learning,Caffe,我试图了解在使用miinibatch SGD时如何计算梯度。我已经在CS231在线课程中实现了它,但我才意识到,在中间层中,梯度基本上是为每个样本计算的所有梯度的总和(Caffe或Tensorflow中的实现也是如此)。只有在最后一层(损耗)中,它们才被样本数平均。 这是正确的吗?如果是这样的话,这是否意味着因为在最后一层中,它们是平均的,所以在进行backprop时,所有的梯度也会自动平均? 谢谢 最后一层取平均值,前一层求和。前一层中求和的渐变在下一层的不同节点上求和,而不是通过示例。进行这

我试图了解在使用miinibatch SGD时如何计算梯度。我已经在CS231在线课程中实现了它,但我才意识到,在中间层中,梯度基本上是为每个样本计算的所有梯度的总和(Caffe或Tensorflow中的实现也是如此)。只有在最后一层(损耗)中,它们才被样本数平均。 这是正确的吗?如果是这样的话,这是否意味着因为在最后一层中,它们是平均的,所以在进行backprop时,所有的梯度也会自动平均?
谢谢

最后一层取平均值,前一层求和。前一层中求和的渐变在下一层的不同节点上求和,而不是通过示例。进行这种平均只是为了在更改批量大小时使学习过程表现出类似的行为——如果对所有层进行求和,则所有操作都应相同,但适当降低学习速率。

最好理解为什么SGD首先工作

通常,神经网络实际上是一个非常复杂的复合函数,由输入向量x、标签y(或目标变量,根据问题是分类还是回归而变化)和一些参数向量w组成。假设我们正在进行分类。我们实际上是在尝试对变量向量w进行最大似然估计(实际上是映射估计,因为我们肯定会使用L2或L1正则化,但现在这太过技术化)。假设样本是独立的;然后我们有以下成本函数:

p(y1|w,x1)p(y2|w,x2) ... p(yN|w,xN)
将wrt优化为w是一个混乱的过程,因为所有这些概率都是乘法的(这将产生极其复杂的wrt w导数)。我们使用对数概率代替(取对数不会改变极值点,我们除以N,因此我们可以将训练集视为经验概率分布p(x))

这是我们的实际成本函数。神经网络实际做的是对概率函数p(yi | w,xi)建模。这可以是一个非常复杂的1000+分层ResNet,也可以只是一个简单的感知器

现在w的导数很容易陈述,因为我们现在有一个加法:

dJ(X,Y,w)/dw = -(1/N)(dlog p(y1|w,x1)/dw + dlog p(y2|w,x2)/dw + ... + dlog p(yN|w,xN)/dw)
理想情况下,以上是实际坡度。但这种批量计算并不容易计算。如果我们正在处理一个包含1M个训练样本的数据集呢?更糟糕的是,训练集可能是样本x的流,其大小是无限的


新加坡元的随机部分在这里起作用。用m选择m个示例这与TensorFlow有什么关系?我给它加了标签,因为在TensorFlow实现中是这样做的,而且该社区的人通常知道低级别的实现(可能不是你),并且可能有助于回答这个问题。例如,假设我有一个完全连接的层,比如:y=XW,其中X是Nxd矩阵(N个维度为d的样本),W是dxM(M个输出节点)。然后y是NxM。现在如果我们有dL/dy(NxM),那么dL/dW=dy/dW*dL/dy,然后dL/dW=X_transpose*dL/dy;在这种情况下,我认为dL/dW是在为每个样本添加梯度。对吗?不,它是在为y(M)中的每个节点添加梯度。假设L是样本的平均值,dL/dy也是平均值,但它根据输出层中的节点数有一些维度。感谢您的帮助,我有点困惑,很抱歉,但是如果dL/dy是平均值,为什么它的大小为NxM(比如每个样本有一个渐变)?作为一个平均值只是一个常数的问题。它不会改变形状。我对这里的形状也有点困惑,但我认为如果L将N个示例映射到1个值(求和或求平均),dL/dy的形状将不会依赖于N。例如,如果L=sum_I y_I(M->1),那么dL/dy=[1,…,1](M->1)。y的形状在这里并不重要。这个答案非常有帮助,解决了我的另一个问题:为什么我们应该最大化对数可能性而不仅仅是可能性。非常感谢!超级流行的深度学习.ai课程似乎每一层都除以m。请看我的问题,了解更多详细信息,如果你继续看的话每层除以1/m,第一层中肯定没有任何有意义的导数。如果有L层,第一层的导数将按(1/m)^L进行缩放。想象一下ResNet-50,L=50。肯定不会留下任何错误信号。这很可能是一种符号滥用。
dJ(X,Y,w)/dw = -(1/N)(dlog p(y1|w,x1)/dw + dlog p(y2|w,x2)/dw + ... + dlog p(yN|w,xN)/dw)
 dJ(X,Y,w)/dw =(approx) dJ'/dw = -(1/m)(dlog p(y1|w,x1)/dw + dlog p(y2|w,x2)/dw + ... + dlog p(ym|w,xm)/dw)