由于最近在看有关spanbert的repo(用于抽取式的QA),顺便阅读了一下pytorch_pretrained_bert的源码,在这里记录一下pytorch_pretrained_bert中有用的内容。
1. 关于optimization.py
所有的优化器都是基于Optimizer这个类写的,主要是得实现step函数。
def __init__(self, params, lr=required, warmup=-1, t_total=-1, schedule='warmup_linear',
b1=0.9, b2=0.999, e=1e-6, weight_decay=0.01,
max_grad_norm=1.0):
__init__参数
第一个形参是待优化的参数,在主程序中一般是以model.parameter()传入
lr:learning_rate
warmup:用于调整学习率(只与学习率有关,在第一阶段学习率逐渐上升,在第二阶段学习率再逐渐减小)
t_total:表示的是training阶段的最大step数,大于这个数,学习率会变为0,因此训练结束
schedule:warmup第二阶段lr下降的策略,有线性下降、余弦下降等等
b1、b2、e:这些参数都是Adam优化器所必须的参数
weight_decay:表示每次参数更新时,在减去梯度时,还应该减去原始参数值的多少(这个参数在SGD条件下等价于L2正则化,主要目的是防止过拟合)
max_grad_norm:给梯度设置一个bound
关于weight_decay可参考这一篇文章都9102年了,别再用Adam + L2 regularization了 - 知乎 (zhihu.com),要注意的是,Adam使用weight_decay时,不用直接加在梯度上(如下红色),具体的原因看文章吧,懒得写了。
下面这部分写一下model.parameter和model.state_dict这两个属性的区别,可参考model.parameters()与model.state_dict() - 知乎 (zhihu.com)。
另外说一下,model.parameter的结果是一个列表,其中每一个元素记为p,则p有下面的属性。
p.data 直接看这个参数的值
p.grad 看这个参数是否存在,不存在为None
p.grad.data 看这个参数的梯度
p.required_grad 看这个参数是否能被更新