MindSpore 高阶优化器
MindSpore 高阶优化器
MindSpore自研优化器THOR(Trace-based Hardware-driven layer-ORiented Natural Gradient Descent Computation),该优化器在ImageNet上训练ResNet50,使用MindSpore+8 Ascend 910 仅需66.7分钟,当使用256节点时仅需2.7分钟!
关于一二阶优化器,其中二阶优化器与一阶优化器相比收敛速度更快,但缺点是二阶信息矩阵求逆复杂度高,为
, 其中 n 为二阶信息矩阵维度,当模型参数量为
时,对应的二阶信息矩阵的大小为 
。在深度学习模型中, 
常常在数百万的量级,此时二阶信息矩阵的逆无法计算。因此如何降低二阶信息矩阵求逆的计算复杂度成为关键问题。
MindSpore针对该问题,提出了自研算法THOR,该算法是基于自然梯度法,对Fisher矩阵做了近似,自然梯度法中的 
矩阵可以表示为:

其中
是网络模型的预测分布,
是其概率密度, 
是需要网络模型的参数。
那THOR主要做了哪些改进呢,我们一起来看一下:
1. 降低二阶信息矩阵更新频率
通过实验观察
矩阵的F范数(Frobenius norm),在前期变化剧烈,后期逐渐变稳定,从而假设
是一个马尔可夫过程,可以收敛到一个稳态分布π,其中 
代表第k个迭代时的
矩阵。因此,在训练过程中逐步增大
矩阵的更新间隔,可以在不影响收敛速度的情况下,减少训练时间。例如在ResNet50中,更新间隔步数随着训练的进行越来越大,到后期每个epoch只需更新一次二阶信息矩阵,如下图所示。

THOR受KFAC启发,将
矩阵按层解耦来降低矩阵复杂度,分别针对每一层的
矩阵做实验,发现有些层的
矩阵趋于稳态的速度更快,因此在统一的更新间隔上,更加细粒度的去调整每一层的更新频率。THOR使用矩阵的迹作为判断条件,当迹的变化情况大于某一阈值时,更新该层的二阶信息矩阵,否则沿用上一个迭代的二阶信息矩阵,并且引入了停止更新机制,当迹的变化量小于某个阈值时,停止更新该层二姐信息矩阵,具体更新公式如下:


2. 硬件感知矩阵切分
THOR在将
矩阵按层解耦的基础上,进一步假设每个网络层中的输入和输出块之间也是独立的,例如将每层网络的输入输出切分为n个块,这n个块之间即是独立的,根据该假设,对二阶信息矩阵做进一步的切分,从而提高了计算效率。THOR结合矩阵信息损失数据和矩阵性能数据确定了矩阵分块维度,从而大大提升
矩阵求逆时间。
那么如何确定矩阵分块维度的呢。具体方法为:
(1)根据
矩阵中维度最大的那一层,确定矩阵切分维度,拿ReseNet-50举例,网络层中的最大维度为2048,确定矩阵切分维度为[1,16,32,64,128,256,512,1024,2048];
(2)根据确定的矩阵维度,根据谱范数计算每个维度下的矩阵损失,具体公式为

其中 
表示矩阵 X 的最大特征值, A 表示原始未分割矩阵,
表示分割后的矩阵。然后统计在该维度下损失小于1%的矩阵数量,最后通过除以总的矩阵数量得到标准化后的矩阵损失信息。
(3)根据确定的矩阵维度,计算每个维度下的矩阵求逆时间,再通过公式
得到每个维度下标准化后性能数据,其中
表示维度最小的矩阵的性能数据,
表示第n个维度下的性能数据。
(4)根据标注化后的矩阵损失信息和标准化后的性能数据绘图,如以ResNet50为例,可得到下图,图中交叉点为106,与128最接近,最后确定矩阵切分维度为128。

3. 实验结果
下图展示了THOR在ResNet50+ImageNet,batchsize为256时一二阶上的训练曲线图。

图中的THOR,THOR_stop,THOR_NT分表表示 ,从图中可以看到THOR收敛所需迭代数大约是一阶的一半,且单step的时间与一阶相差也不大。相比一阶算法需要117min,二阶优化器端到端时间提速约40%。
THOR还测试了在不同batchsize下ResNet50+ImageNet的收敛结果,结果见下表,当batchsize为8192,使用256块Ascend 910时,只需2.7分钟精度即可收敛到75.9%,该结果在业界也是非常有竞争力的。MindSpore团队还会将THOR进一步应用到NLP领域中,如Bert和GPT-3,THOR在NLP任务上的表现。

MindSpore 高阶优化器的更多相关文章
- Python进阶-IV-Wrapper高阶
一.装饰器回顾: 1.标准的装饰器示例 def trapper(func): def inner(*args, **kwargs): print('插入到被装饰函数前的功能!') res = func ...
- ES 6 装饰器与 React 高阶组件
关于 Decorator 到底是 ES 6 引入的还是 ES 7 引入的我也不是很明白了,两种说法都有,这种问题懒得纠结了--在用的时候发现这个东西很好用,平常用处可能不大,但是结合 React 就很 ...
- python开发基础04-函数、递归、匿名函数、高阶函数、装饰器
匿名函数 lamba lambda x,y,z=1:x+y+z 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函 ...
- python 函数式编程 高阶函数 装饰器
# -*- coding:gb2312 -*- #coding=utf-8 # 高阶函数 import math def is_sqr(x): y = int(math.sqrt(x)) return ...
- python 高阶函数与装饰器
高阶函数定义1.函数接收的参数是一个函数名2.函数的返回值是一个函数名以上两者满足任意一个,就是高阶函数装饰器定义本质就是函数,功能是为其他函数添加新功能 装饰器的原则 1.不修改被装饰函数的源代码( ...
- python笔记十三(高阶函数、装饰器)
一.高阶函数 函数只要有以下两个特征中一个就可以称为高阶函数: a:函数名作为一个实参传入另一个函数中 b:函数的返回值中包含函数名 下面我们用代码来感受一下这两种形式: import time # ...
- Python高阶函数之 - 装饰器
高阶函数: 1. 函数名可以作为参数传入 2. 函数名可以作为返回值. python装饰器是用于拓展原来函数功能的一种函数 , 这个函数的特殊之处在于它的返回值也是一个函数 , 使用pyth ...
- Python学习笔记【第六篇】:迭代器、生成器、高阶函数、装饰器
迭代器 迭代器是访问集合元素的一种方式,迭代器从对象的第一个元素开始访问,知道所有元素被访问完成.迭代器只能往前访问,不能通过索引访问. 类型内部使用__iter__()方法转为迭代器,使用__nex ...
- Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】
装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...
随机推荐
- SQL 查询的执行顺序
SELECT语句的完整语法如下 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN & ...
- 鼠标右键添加vscode
实现效果 右键文件夹,可以使用vscode打开 右键文件,可以使用vscode打开 右键空白处,可以使用vscode打开 进行实现 下载压缩包 为了方便操作,和减少错误,将.reg文件上传到网盘中,点 ...
- Ubuntu20.04连接WiFi
电脑安装了Ubuntu20.04后发现没办法连接WiFi,也找不到WiFi图标,一般来说是因为Ubuntu系统没有网卡驱动,安装一下即可 解决办法如下: 先用网线或者手机开热点连接到到电脑,让电脑有网 ...
- Java常见异常类型
在Java学习过程中,我们会碰到各种各样的异常,现将面试过程中遇到的常见异常做一罗列并举例: 1.NullPointerException: 空指针异常.菜鸟编程经验发现这个异常是经常会发生的,属于运 ...
- RabbitMQ实现延时消息的两种方法
目录 RabbitMQ实现延时消息的两种方法 1.死信队列 1.1消息什么时候变为死信(dead-letter) 1.2死信队列的原理 1.3 代码实现 1.4死信队列的一个小坑 2 .延时插件 2. ...
- java数组 简单了解
一.关于集合 1.数组,链表和哈希表(散列表)的存储方式 (1)传统的数组结构存储数据会在内存中开辟连续得空间,结合下标从而使得可以快速访问数据,但是删除和添加数据就很浪费资源 (2)链表不需要开辟连 ...
- 【js】Leetcode每日一题-二叉树的堂兄弟节点
[js]Leetcode每日一题-二叉树的堂兄弟节点 [题目描述] 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处. 如果二叉树的两个节点深度相同,但 父节点不 ...
- FHE-Toolkit 安装
什么是FHE-Toolkit? FHE-Toolkit-linux是用于Linux的IBM全同态加密工具包, 该工具包是一个基于Linux的Docker容器,可演示对加密数据的计算而无需解密, 该工具 ...
- 项目展示$\beta$
项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 要求 Beta阶段项目展示 我们在这个课程的目标是 提升团队管理及合作能力,开发一项满意的工程项目 这个作业在哪个具体方面帮助我们实现目 ...
- Pytorch_Part3_模型模块
VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...