7.Optimizer
更新时间:2022-07-27
简介
在深度学习中,在训练模型的过程中,我们首先需要定义一个损失函数,然后使用不同的optimizer(优化器,或者称为“优化算法”)来最小化损失函数,从而一步步得到最终的模型。
基础操作
文心中,对optimizer(优化器)的定义是通过对建模核心接口类model(./wenxin/models/model.py)中的set_optimizer() 方法的重写来实现,其功能和参数定义如下所示:
def set_optimizer(self):
"""
:return Optimizer
"""
raise NotImplementedError
- 以分类任务预置模型base_cls.py为例介绍一下最简单的优化器实现, 如下所示:
def set_optimizer(self):
"""
:return Optimizer
"""
opt_param = self.model_params.get('optimization', None)
if opt_param:
self.lr = opt_param.get('learning_rate', 2e-5)
else:
self.lr = 2e-5
self.optimizer = paddle.optimizer.Adam(learning_rate=self.lr, parameters=self.parameters())
return self.optimizer
-
以ernie_classification.py为例介绍一下ERNIE最常用的优化器,使用了学习率衰减、权重衰减特性。
def set_optimizer(self): """ :return Optimizer """ opt_param = self.model_params.get('optimization', None) self.lr = opt_param.get("learning_rate", 2e-5) weight_decay = opt_param.get("weight_decay", 0.01) use_lr_decay = opt_param.get("use_lr_decay", False) epsilon = opt_param.get("epsilon", 1e-6) g_clip = paddle.nn.ClipGradByGlobalNorm(1.0) param_name_to_exclue_from_weight_decay = re.compile(r'.*layer_norm_scale|.*layer_norm_bias|.*b_0') if use_lr_decay: max_train_steps = opt_param.get("max_train_steps", 0) warmup_steps = opt_param.get("warmup_steps", 0) self.lr_scheduler = LinearWarmupDecay(base_lr=self.lr, end_lr=0.0, warmup_steps=warmup_steps, decay_steps=max_train_steps, num_train_steps=max_train_steps) self.optimizer = paddle.optimizer.AdamW(learning_rate=self.lr_scheduler, parameters=self.parameters(), weight_decay=weight_decay, apply_decay_param_fun=lambda n: not param_name_to_exclue_from_weight_decay.match(n), epsilon=epsilon, grad_clip=g_clip) else: self.optimizer = paddle.optimizer.AdamW(self.lr, parameters=self.parameters(), weight_decay=weight_decay, apply_decay_param_fun=lambda n: not param_name_to_exclue_from_weight_decay.match(n), epsilon=epsilon, grad_clip=g_clip) return self.optimizer
文心中使用的Optimizer
文心中使用的optimizer为飞桨PaddlePaddle提供的optimizer接口,常用的optimizer接口如下所示:
优化器名称 | 别名 | 简介 | 更多详情 |
---|---|---|---|
AdamOptimizer | Adam | Adam优化器出自 Adam论文 的第二节,能够利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。 | AdamOptimizer |
AdamaxOptimizer | Adamax | Adamax优化器是参考 Adam论文 第7节Adamax优化相关内容所实现的。Adamax算法是基于无穷大范数的 Adam 算法的一个变种,使学习率更新的算法更加稳定和简单。 | AdamaxOptimizer |
AdagradOptimizer | Adagrad | Adaptive Gradient 优化器(自适应梯度优化器,简称Adagrad)可以针对不同参数样本数不平均的问题,自适应地为各个参数分配不同的学习率。相关论文:Adaptive Subgradient Methods for Online Learning and Stochastic Optimization。 | AdagradOptimizer |
SGDOptimizer | SGD | 该接口实现随机梯度下降算法的优化器 | SGDOptimizer |