梯度下降和随机梯度下降 讨论区

http://zh.diveintodeeplearning.org/chapter_optimization/gd-sgd.html

不明白为什么 batch size 不一样 learning rate也不一样,trainer不是已经把grad平均了吗?

param[:] = param - lr * param.grad / batch_size

哪位能帮忙回答一下?

把epoch调大就行了

哦 明白了 因为batch size变大的时候,每一个epoch/batch_size会变小,就是sgd调用的次数会变小,所以此时learning rate要加大。

一个不明白的地方是为什么要每次除以batch_size呢?
在这个循环里:
for batch_i, data, label in data_iter(batch_size):
每次循环是针对一个样本吧?难道不是真对这个batch计算完所有的loss以后 再除以batch_size算出平均的梯度吗?这里一直弄不明白……

每次循环应该针对大小为batch_size的小批量样本。如果batch_size设为1就是随机梯度下降,只针对一个样本

多谢,明白了!

不客气,这里也有相关讨论
https://discuss.gluon.ai/t/topic/3119

楼上说的对,这里是向量表示的batch

这是我看过的关于梯度下降讲得最清楚的课程。看完之后彻底明白了为什么可以用梯度下降求目标函数最小值,为什么需要随机梯度下降,为什么可以用随机梯度下降。虽然无偏估计这样的公式我还看不懂。但是心里会明白为什么可以用随机个体的梯度下降来做替换且效果类似。谢谢!!

1赞

“训练函数的period参数说明,每次采样过该数目的数据点后,记录当前目标函数值用于作图。例如,当period和batch_size都为10时,每次迭代后均会记录目标函数值。“请问这里的period参数是指?因为在接下来的代码里没有找到period参数,我猜是指batch_i对吗?

无偏估计那个公式的意思是,对随机梯度求数学期望,就是把n个加起来再求平均,也就是原始梯度

昨天刚刚更新了这一节内容,你看看描述还有哪些不清楚的地方
http://zh.gluon.ai/chapter_optimization/gd-sgd-scratch.html

这里把period换了名字

文章里写道: 而梯度下降在迭代过程中一直使用目标函数的真实梯度,无需自我衰减学习率。 为什么真实梯度就不用衰减学习率呢? 不是越接近最优点,学习率要适当减小吗?

因为真实梯度在接近最优点时已经接近0了啊

1赞

赞, 居然没想到这点。再请问下 “由于随机梯度的方差在迭代过程中无法减小” 如何得出这个结论的?

informally:
如果每次都是用真实梯度,真实梯度永远不变,方差为0。梯度下降学习率可以是常数,收敛率是linear rate(第六课视频讲了)

如果每次都是用随机梯度,无论迭代多少次都不能令随机采样梯度越来越稳定,随机梯度的方差其实也没变,不过大于0。所以如果学习率不变,无论迭代多少次也无法收敛。为了在凸优化中收敛,我们得不断减小学习率,这样学习率与随机梯度乘积的方差随着迭代次数增加不断减小。但是不断减小学习率让sgd的收敛率变慢,是sublinear rate(第六课视频讲了)

12年后优化领域比较火的一个方向是variance reduced SGD,例如SAG, SDCA, SVRG, SAGA等。这些算法中随机梯度的方差可以在学习率不变的情况下越来越小。比如strongly convex finite sum objective + Lipchitz continuous gradient下SDCA, SVRG, SAGA都可以拿到线性收敛,比SGD的sublinear rate更好。

5赞

你好,这章里面learning rate似乎是针对单个sample 的,因为看到 SGD函数里面

def sgd(params, lr, batch_size):
    for param in params:
        param[:] = param - lr * param.grad / batch_size #这里除以batchsize#

如果这样的话,batchsize变大,那么lr也要相应变大。
所以我想问在gluon optimizer库里面,SGD的实现,learning rate是对应一个batch还是一个样本?

不用令lr随着batchsize增大而增大,因为l.backward是batch loss的和,l.sum().backward()

1赞

你好,我在 “多GPU计算——使用Gluon“ 的视频教程(约55分钟之后) https://www.bilibili.com/video/av15592207 里面看到,LR会随着GPU数量变化而变化,给的原因是收敛速度变慢,因此要增大LR。
例如,每个GPU固定batchsize=64,那么GPU从1块变到4块,LR要乘以4吗?谢谢!

你好,我在github上的一个issue当中看到了,lr和显卡的数量成正比,如果你gpu数量变为原来的4倍的话,lr确实需要变为原来的4倍