资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

模型优化器(optimizer)说明

简介

文心模型优化器(optimizer)模块可以通过在所使用模型(models)的 optimizer() 方法里自定义的方式实现。大部分模型在未指定优化器时,默认采用Adam。

在所使用模型(models)的 optimizer() 方法里自定义模型优化

模型优化器模块optimizer()

文心模型优化器模块通过对建模核心接口类model(./textone/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


        return optimizer_output_dict

其中opt_args_dict用来传ernie需要的一些额外参数。如果想自定义优化方式,可以直接在此处进行添加,如下图红框所示。

PaddlePaddle的常用optimizer接口

以下列举一些常用optimizer及其说明,如需了解更多信息请参考fluid.optimizer

优化器名称 别名 介绍 代码示例 更多详情
AdamOptimizer Adam Adam优化器出自Adam论文 的第二节,能够利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。 adam_optimizer = fluid.optimizer.AdamOptimizer(learning_rate=0.01)
adam_optimizer.minimize(loss)
AdamOptimizer
AdamaxOptimizer Adamax Adamax优化器是参考 Adam论文 第7节Adamax优化相关内容所实现的。Adamax算法是基于无穷大范数的 Adam 算法的一个变种,使学习率更新的算法更加稳定和简单。 adam = fluid.optimizer.AdamaxOptimizer(learning_rate=0.2)
adam.minimize(loss)
AdamaxOptimizer
AdagradOptimizer Adagrad Adaptive Gradient 优化器(自适应梯度优化器,简称Adagrad)可以针对不同参数样本数不平均的问题,自适应地为各个参数分配不同的学习率。相关论文:Adaptive Subgradient Methods for Online Learning and Stochastic Optimization。 optimizer = fluid.optimizer.AdagradOptimizer(learning_rate=0.2)
optimizer.minimize(loss)
AdagradOptimizer
SGDOptimizer SGD 该接口实现随机梯度下降算法的优化器 sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
sgd_optimizer.minimize(loss)
SGDOptimizer