8.Optimizer
简介
在深度学习中,在训练模型的过程中,我们首先需要定义一个损失函数,然后使用不同的optimizer(优化器,或者称为“优化算法”)来最小化损失函数,从而一步步得到最终的模型。
基础操作
文心中,对optimizer(优化器)的定义是通过对建模核心接口类model(./wenxin/models/model.py)中的optimizer()方法的重写来实现,其功能和参数定义如下所示:
def optimizer(self, loss, is_fleet=False):
"""
必须选项forward_return_dict否则会抛出异常。
设置优化器forward_return_dict如Adamforward_return_dictAdagradforward_return_dictSGD等。
:param loss:前向计算得到的损失值。
:param is_fleet:是否为分布式训练。
:return:OrderedDict: 该dict中存放的是需要在运行过程中fetch出来的tensorforward_return_dict大多数情况下为空forward_return_dict可以按需求添加内容。
"""
raise NotImplementedError-
以分类任务预置模型cnn_classification.py为例,其优化器模块的实现如下所示:
def optimizer(self, loss, is_fleet=False): """ :param loss: :param is_fleet: :return: OrderedDict: 该dict中放的是需要在运行过程中fetch出来的tensor """ opt_param = self.model_params.get('optimization', None) if opt_param: lr = opt_param.get('learning_rate', 2e-5) else: lr = 2e-5 optimizer = fluid.optimizer.Adam(learning_rate=lr) if is_fleet: optimizer = fleet.distributed_optimizer(optimizer) optimizer.minimize(loss) optimizer_output_dict = collections.OrderedDict() return optimizer_output_dict -
在基于ERNIE的预置模型中,没有在 optimizer() 方法中指定模型的优化器,此时模型默认采用Adam,如下所示:
def optimizer(self, loss, is_fleet=False): """ :param loss: :param is_fleet: :return: OrderedDict: 该dict中放的是需要在运行过程中fetch出来的tensor """ opt_params = self.model_params.get("optimization") optimizer_output_dict = OrderedDict() optimizer_output_dict['use_ernie_opt'] = True opt_args_dict = OrderedDict() opt_args_dict["loss"] = loss opt_args_dict["warmup_steps"] = opt_params["warmup_steps"] opt_args_dict["num_train_steps"] = opt_params["max_train_steps"] opt_args_dict["learning_rate"] = opt_params["learning_rate"] opt_args_dict["weight_decay"] = opt_params["weight_decay"] opt_args_dict["scheduler"] = opt_params["lr_scheduler"] opt_args_dict["use_fp16"] = self.model_params["embedding"].get("use_fp16", False) opt_args_dict["use_dynamic_loss_scaling"] = opt_params["use_dynamic_loss_scaling"] opt_args_dict["init_loss_scaling"] = opt_params["init_loss_scaling"] opt_args_dict["incr_every_n_steps"] = opt_params["incr_every_n_steps"] opt_args_dict["decr_every_n_nan_or_inf"] = opt_params["decr_every_n_nan_or_inf"] opt_args_dict["incr_ratio"] = opt_params["incr_ratio"] opt_args_dict["decr_ratio"] = opt_params["decr_ratio"] optimizer_output_dict["opt_args"] = opt_args_dict ## 这里的opt_args_dict用来传ernie需要的一些额外参数。如果想自定义优化方式,可以直接在此处进行添加 return optimizer_output_dict
文心中使用的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 |
简介
在深度学习中,在训练模型的过程中,我们首先需要定义一个损失函数,然后使用不同的optimizer(优化器,或者称为“优化算法”)来最小化损失函数,从而一步步得到最终的模型。
基础操作
文心中,对optimizer(优化器)的定义是通过对建模核心接口类model(./wenxin/models/model.py)中的optimizer()方法的重写来实现,其功能和参数定义如下所示:
def optimizer(self, loss, is_fleet=False):
"""
必须选项forward_return_dict否则会抛出异常。
设置优化器forward_return_dict如Adamforward_return_dictAdagradforward_return_dictSGD等。
:param loss:前向计算得到的损失值。
:param is_fleet:是否为分布式训练。
:return:OrderedDict: 该dict中存放的是需要在运行过程中fetch出来的tensorforward_return_dict大多数情况下为空forward_return_dict可以按需求添加内容。
"""
raise NotImplementedError-
以分类任务预置模型cnn_classification.py为例,其优化器模块的实现如下所示:
def optimizer(self, loss, is_fleet=False): """ :param loss: :param is_fleet: :return: OrderedDict: 该dict中放的是需要在运行过程中fetch出来的tensor """ opt_param = self.model_params.get('optimization', None) if opt_param: lr = opt_param.get('learning_rate', 2e-5) else: lr = 2e-5 optimizer = fluid.optimizer.Adam(learning_rate=lr) if is_fleet: optimizer = fleet.distributed_optimizer(optimizer) optimizer.minimize(loss) optimizer_output_dict = collections.OrderedDict() return optimizer_output_dict -
在基于ERNIE的预置模型中,没有在 optimizer() 方法中指定模型的优化器,此时模型默认采用Adam,如下所示:
def optimizer(self, loss, is_fleet=False): """ :param loss: :param is_fleet: :return: OrderedDict: 该dict中放的是需要在运行过程中fetch出来的tensor """ opt_params = self.model_params.get("optimization") optimizer_output_dict = OrderedDict() optimizer_output_dict['use_ernie_opt'] = True opt_args_dict = OrderedDict() opt_args_dict["loss"] = loss opt_args_dict["warmup_steps"] = opt_params["warmup_steps"] opt_args_dict["num_train_steps"] = opt_params["max_train_steps"] opt_args_dict["learning_rate"] = opt_params["learning_rate"] opt_args_dict["weight_decay"] = opt_params["weight_decay"] opt_args_dict["scheduler"] = opt_params["lr_scheduler"] opt_args_dict["use_fp16"] = self.model_params["embedding"].get("use_fp16", False) opt_args_dict["use_dynamic_loss_scaling"] = opt_params["use_dynamic_loss_scaling"] opt_args_dict["init_loss_scaling"] = opt_params["init_loss_scaling"] opt_args_dict["incr_every_n_steps"] = opt_params["incr_every_n_steps"] opt_args_dict["decr_every_n_nan_or_inf"] = opt_params["decr_every_n_nan_or_inf"] opt_args_dict["incr_ratio"] = opt_params["incr_ratio"] opt_args_dict["decr_ratio"] = opt_params["decr_ratio"] optimizer_output_dict["opt_args"] = opt_args_dict ## 这里的opt_args_dict用来传ernie需要的一些额外参数。如果想自定义优化方式,可以直接在此处进行添加 return optimizer_output_dict
文心中使用的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 |
