概述
常见的优化算法可分为一阶优化算法和二阶优化算法。
经典的一阶优化算法如SGD等,计算量小、计算速度快,但是收敛的速度慢,所需的迭代次数多。
二阶优化算法使用目标函数的二阶导数来加速收敛,能更快地收敛到模型最优值,所需要的迭代次数少,但由于二阶优化算法过高的计算成本,导致其总体执行时间仍然慢于一阶,故目前在深度神经网络训练中二阶优化算法的应用并不普遍。
二阶优化算法的主要计算成本在于二阶信息矩阵(Hessian矩阵、FIM矩阵等)的求逆运算,时间复杂度约为𝑂(𝑛3)。
MindSpore开发团队在现有的自然梯度算法的基础上,对FIM矩阵采用近似、切分等优化加速手段,极大的降低了逆矩阵的计算复杂度,开发出了可用的二阶优化器THOR。
使用8块Atlas训练系列产品,THOR可以在72min内完成ResNet50-v1.5网络和ImageNet数据集的训练,相比于SGD+Momentum速度提升了近一倍。
由于没有相关计算资源,本次体验仅在Ascend单卡上对CIFAR-10数据集进行。
相关代码路径https://gitee.com/mindspore/models/tree/master/official/cv/ResNet
cd scripts/ bash run_standalone_train.sh [DATASET_PATH] [CONFIG_PATH]
配置文件采用 config目录下的resnet50_cifar10_config.yaml
但是该配置文件优化器默认采用"Momentum"
如果要采用二阶优化器的话,需要修改为optimizer: "Thor"
此外还需要增加几个配置项
use_label_smooth: True
label_smooth_factor: 0.1
lr_init: 0.05803
lr_decay: 4.0839
lr_end_epoch: 53
damping_init: 0.03
damping_decay: 0.50036
frequency: 834
复制
整体执行流程如下:
-
准备cifar10数据集,处理需要的数据集;
-
定义ResNet50网络;
-
定义损失函数和THOR优化器;
-
加载数据集并进行训练,训练完成后,查看结果及保存模型文件;
-
加载保存的模型,进行推理。
1、数据准备
然后是数据处理部分
if config.dataset == "cifar10":
from src.dataset import create_dataset1 as create_dataset
复制
def create_dataset1(dataset_path, do_train, batch_size=32, train_image_size=224, eval_image_size=224,
target="Ascend", distribute=False, enable_cache=False, cache_session_id=None):
"""
create a train or evaluate cifar10 dataset for resnet50
Args:
dataset_path(string): the path of dataset.
do_train(bool): whether dataset is used for train or eval.
repeat_num(int): the repeat times of dataset. Default: 1
batch_size(i