Deep Learning Systems笔记 -- Optimization & Optimization使用教学

机器学习 (x) 学习机器 (bingo) o.o

课上知识基本都学过 自行学习一下

把各种优化器算法的坑填上

学习记录(乱七八糟没有看头

先读pdf预习一下

主要讲了 Optimization 的构成

先看看手上正在改的代码里的优化器长啥样

1
optimizer = torch.optim.RMSprop(lstm.parameters(), lr=learning_rate)

查他

ok 带着问题思考下

  • 主流的优化器有哪些? 他们各自的优缺点?

  • 如何在pytorch或tensorflow中使用?

首先

主流的优化器有哪些? 他们各自的优缺点?

https://pytorch.org/docs/stable/optim.html

[torch.optim](https://pytorch.org/docs/stable/optim.html?highlight=torch optim#module-torch.optim) is a package implementing various optimization algorithms. Most commonly used methods are already supported, and the interface is general enough, so that more sophisticated ones can be also easily integrated in the future.

想我昨天看的另一个代码 用的就是 adam ( 好像被称为万金油

okk 具体每种算法的具体实现这里留个坑 毕竟还要去听课 555

然后

如何在pytorch或tensorflow中使用?

这里先讲一下pytorch

To construct an [Optimizer](https://pytorch.org/docs/stable/optim.html?highlight=torch optim#torch.optim.Optimizer) you have to give it an iterable containing the parameters (all should be Variable s) to optimize. Then, you can specify optimizer-specific options such as the learning rate, weight decay, etc.

Example:

1
2
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)

想一下梯度下降 lr 是步长 然后我们需要计算出梯度即求导 optimizer.step()

For example, this is very useful when one wants to specify per-layer learning rates:

1
2
3
4
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)

optimizer.step() 使用

结合反向传播使用

1
2
3
4
5
6
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()

优化器的进化历程

跟adam对应的基础概念是SGD,即随机梯度下降: 沿着梯度的方向不断减小模型参数,从而最小化目标函数。

但SGD有一个问题,即容易陷入局部最优解,也可能在鞍点中跳不出,影响模型性能。

所以研究人员引入了物理学中的动量思想,除了SGD中的一阶梯度,还使用梯度一阶矩(指数加权)的估计,使得模型对超参数较为鲁棒。简单来说,可以理解为惯性,相当于模型沿着原来的优化方向,有一个惯性,还有继续往前冲的趋势,从而加快了收敛速度

Adam是一个结合了Momentum与Adagrad的产物,它既考虑到了利用动量项来加速训练过程,又考虑到对于学习率的约束。利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。

如果说回答面试可能已经够了 但我们来看看历史

SGD

随机梯度下降,容易陷入局部最优解。 所以能否在学习率的设置上进行一些操作呢?

Adagrad

他是如何起作用的呢

by adapting the learning rate to the parameters, by having a low learning rate for the parameters associated to frequently occurring features and larger updates to the ones with infrequent features.

他通过对参数调整学习率来实现,对不常出现的特征采用较大的学习率,对常出现的特征采用较小的学习率。

而SGD都使用的是相同的学习率,可以一次性更新所有的参数θ,但在Adagrad中,

we try to have a different learning rate for each parameter θ at every timestamp

即在每个不同的时间设置不同的学习率,该过程是对每个参数进行更新并将其矢量化。

RMSprop

之后再来补充

Adam

主打一手校正过程。

之后再来补充