diff --git a/docs/mindspore/programming_guide/source_zh_cn/optim.md b/docs/mindspore/programming_guide/source_zh_cn/optim.md index 08a897d3ffee219a5a3b421daf4dc48623a78271..95db6bfd4c26656f6727f981a2ff816aa7495074 100644 --- a/docs/mindspore/programming_guide/source_zh_cn/optim.md +++ b/docs/mindspore/programming_guide/source_zh_cn/optim.md @@ -20,8 +20,8 @@ -## 概述 - +## 概述 + 优化器在模型训练过程中,用于计算和更新网络参数,合适的优化器可以有效减少训练时间,提高最终模型性能。最基本的优化器是梯度下降(SGD),在此基础上,很多其他的优化器进行了改进,以实现目标函数能更快速更有效地收敛到全局最优点。 `mindspore.nn.optim`是MindSpore框架中实现各种优化算法的模块,包含常用的优化器、学习率等,接口具备较好的通用性,可以将以后更新、更复杂的方法集成到模块里。`mindspore.nn.optim`为模型提供常用的优化器,如`mindspore.nn.SGD`、`mindspore.nn.Adam`、`mindspore.nn.Ftrl`、`mindspore.nn.LazyAdam`、`mindspore.nn.Momentum`、`mindspore.nn.RMSProp`、`mindspore.nn.LARS`、`mindspore.nn.ProximalAadagrad`和`mindspore.nn.Lamb`等。同时`mindspore.nn`提供了动态学习率的模块,分为`dynamic_lr`和`learning_rate_schedule`,学习率的灵活设置可以有效支撑目标函数的收敛和模型的训练。 @@ -31,13 +31,13 @@ 以下内容分别从权重学习率、权重衰减、参数分组、混合精度等方面的配置分别进行详细介绍。 ## 权重配置 - -在构建Optimizer实例时,通过`params`配置模型网络中要训练和更新的权重。`params`必须配置,常见的配置方法有以下两种。 - -### 使用Cell的网络权重获取函数 - -`Parameter`类中包含了一个`requires_grad`的布尔型的类属性,表征了模型网络中的权重是否需要梯度来进行更新(详情可参考:https://gitee.com/mindspore/mindspore/blob/master/mindspore/common/parameter.py )。其中大部分权重的`requires_grad`的默认值都为True;少数默认为False,例如BatchNormalize中的`moving_mean`和`moving_variance`。用户可以根据需要,自行对`requires_grad`的值进行修改。 - + +在构建Optimizer实例时,通过`params`配置模型网络中要训练和更新的权重。`params`必须配置,常见的配置方法有以下两种。 + +### 使用Cell的网络权重获取函数 + +`Parameter`类中包含了一个`requires_grad`的布尔型的类属性,表征了模型网络中的权重是否需要梯度来进行更新(详情可参考:https://gitee.com/mindspore/mindspore/blob/master/mindspore/common/parameter.py )。其中大部分权重的`requires_grad`的默认值都为True;少数默认为False,例如BatchNormalize中的`moving_mean`和`moving_variance`。用户可以根据需要,自行对`requires_grad`的值进行修改。 + MindSpore提供了`get_parameters`方法来获取模型网络中所有权重,该方法返回了`Parameter`类型的网络权重;`trainable_params`方法本质是一个filter,过滤了`requires grad=True`的`Parameter`。用户在构建优化器时,可以通过配置`params`为`net.trainable_params()`来指定需要优化和更新的权重。 代码样例如下: @@ -98,7 +98,7 @@ model = Model(net, loss_fn=loss, optimizer=optim) ### 动态学习率 模块提供了动态学习率的两种不同的实现方式,`dynamic_lr`和`learning_rate_schedule`: - + - `dynamic_lr`: 预生成长度为`total_step`的学习率列表,将列表传入优化器中使用, 训练过程中, 第i步使用第i个学习率的值作为当前step的学习率,其中,`total_step`的设置值不能小于训练的总步数; - `learning_rate_schedule`: 优化器学习率指定一个LearningRateSchedule的Cell实例,学习率会和训练网络一起组成计算图,在执行过程中,根据step计算出当前学习率。 @@ -125,12 +125,12 @@ model = Model(net, loss_fn=loss, optimizer=optim) 以`piecewise_constant_lr`为例: -```python +```python from mindspore import nn milestone = [2, 5, 10] learning_rates = [0.1, 0.05, 0.01] -lr = nn..dynamic_lr.piecewise_constant_lr(milestone, learning_rates) +lr = nn.dynamic_lr.piecewise_constant_lr(milestone, learning_rates) print(lr) ``` @@ -160,7 +160,7 @@ print(lr) 例如`ExponentialDecayLR`类代码样例如下: -```python +```python from mindspore import nn from mindspore import Tensor from mindspore import dtype as mstype @@ -182,7 +182,7 @@ print(result) ``` ## 权重衰减 - + 一般情况下,weight_decay取值范围为[0, 1),实现对(BatchNorm以外的)参数使用权重衰减的策略,以避免模型过拟合问题;weight_decay的默认值为0.0,此时不使用权重衰减策略。 ```python @@ -191,7 +191,7 @@ optimizer = nn.Momentum(net.trainable_params(), learning_rate=0.01, momentum=0.9 ``` ## 参数分组 - + 优化器也支持为不同参数单独设置选项,此时不直接传入变量,而是传入一个字典的列表,每个字典定义一个参数组别的设置值,key可以为“params”,“lr”,“weight_decay”,”grad_centralizaiton”,value为对应的设定值。`params`必须配置,其余参数可以选择配置,未配置的参数项,将采用定义优化器时设置的参数值。 分组时,学习率可以使用固定学习率,也可以使用dynamic_lr和learningrate_schedule动态学习率。 @@ -215,7 +215,7 @@ net = Net() conv_params = list(filter(lambda x: 'conv' in x.name, net.trainable_params())) no_conv_params = list(filter(lambda x: 'conv' not in x.name, net.trainable_params())) -fix_lr = 0.01 +fix_lr = 0.01 polynomial_decay_lr = nn.learning_rate_schedule.PolynomialDecayLR(learning_rate=0.1, end_learning_rate=0.01, decay_steps=4, @@ -231,7 +231,7 @@ optim = nn.Momentum(group_params, learning_rate=0.1, momentum=0.9, weight_decay= ## 混合精度 深度神经网络存在使用混合精度训练的场景,这种方法通过混合使用单精度和半精度数据格式来加速网络训练,同时保持了单精度训练所能达到的网络精度。混合精度训练能够加速计算过程,减少内存使用和存取,并使得在特定的硬件上可以训练更大的模型或batch size。 - + 在混合精度训练过程中,经常使用溢出检测功能,MindSpore提供了`FixedLossScaleManager`和`DynamicLossScaleManager`用于溢出检测。一般情况下优化器不需要与溢出检测功能配合使用,但使用`FixedLossScaleManager`进行溢出检测,并且`drop_overflow_update`为False时,优化器需设置`loss_scale`的值,且`loss_scale`值与`FixedLossScaleManager`的相同,如下, ```python