本博客基本上是这个问题的翻译,英文好的同学建议直接看原回答:
How does minibatch gradient descent update the weights for each example in a batch?
1. 提出问题
已知有一个size为k的minibatch,把它扔进神经网络之后,经过一系列变化,网络中的权重weights就会更新。但是,具体是怎么样更新的呢?
2. 解答
假设有5个权重,然后我们的mini batch 大小是2(里面有两个数据x1,x2),扔到神经网络之后,会先对每一个数据求出loss (l1, l2),然后,针对每一个数据对应的loss,各自求五个权重的梯度:
数据1(x1): Loss = l1,gradients1=(1.5,−2.0,1.1,0.4,−0.9)
数据2(x2): Loss = l2, gradients2=(1.2,2.3,−1.1,−0.8,−0.7)
如果要求五个权重的梯度,实际上是求上面两个数据所求出来的梯度(gradients1, gradients2) 的平均值:
gradients_result = ( gradients1, gradients2)/2 = (1.35, 0.15, 0, -0.2, -0.8)
具体到公式:
其中,L是loss,w是权重,w的下标j是指第几个权重(有五个权重的话,j就等于1,2,3,4,5),k是mini batch的大小, i就是指mini batch里第几个数据啦(这里有两个数据,那么i等于1,2)。
值得一提的是,我们可以推出:
因此,就有:
相对于之前的“先对每个例子的loss(l1, l2)求导得到梯度(gradients1, gradients2),然后求这些梯度的平均值”,上面的公式首先求所有loss的平均值,再对这个平均值求相对于权重(weights)的梯度。计算上简单了一些。
TensorFlow就是这样做的。