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_stopTHOR_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 高阶优化器的更多相关文章

  1. Python进阶-IV-Wrapper高阶

    一.装饰器回顾: 1.标准的装饰器示例 def trapper(func): def inner(*args, **kwargs): print('插入到被装饰函数前的功能!') res = func ...

  2. ES 6 装饰器与 React 高阶组件

    关于 Decorator 到底是 ES 6 引入的还是 ES 7 引入的我也不是很明白了,两种说法都有,这种问题懒得纠结了--在用的时候发现这个东西很好用,平常用处可能不大,但是结合 React 就很 ...

  3. 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 #与函 ...

  4. python 函数式编程 高阶函数 装饰器

    # -*- coding:gb2312 -*- #coding=utf-8 # 高阶函数 import math def is_sqr(x): y = int(math.sqrt(x)) return ...

  5. python 高阶函数与装饰器

    高阶函数定义1.函数接收的参数是一个函数名2.函数的返回值是一个函数名以上两者满足任意一个,就是高阶函数装饰器定义本质就是函数,功能是为其他函数添加新功能 装饰器的原则 1.不修改被装饰函数的源代码( ...

  6. python笔记十三(高阶函数、装饰器)

    一.高阶函数 函数只要有以下两个特征中一个就可以称为高阶函数: a:函数名作为一个实参传入另一个函数中 b:函数的返回值中包含函数名 下面我们用代码来感受一下这两种形式: import time # ...

  7. Python高阶函数之 - 装饰器

    高阶函数:  1. 函数名可以作为参数传入     2. 函数名可以作为返回值. python装饰器是用于拓展原来函数功能的一种函数 , 这个函数的特殊之处在于它的返回值也是一个函数 , 使用pyth ...

  8. Python学习笔记【第六篇】:迭代器、生成器、高阶函数、装饰器

    迭代器 迭代器是访问集合元素的一种方式,迭代器从对象的第一个元素开始访问,知道所有元素被访问完成.迭代器只能往前访问,不能通过索引访问. 类型内部使用__iter__()方法转为迭代器,使用__nex ...

  9. Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】

    装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...

随机推荐

  1. 08- adb常用命令以及模拟器链接adb命令

    adb 命令简介 ADB即 Android debug bridge.是Android下面一个通用的调试工具. 熟练使用adb命令会大大增加开发效率,作为测试人员,熟练掌握adb,我们可以管理设备或手 ...

  2. 『政善治』Postman工具 — 2、Postman主界面详细介绍

    目录 1.Postman菜单栏 (1)File 菜单 (2)Edit 菜单 (3)View 菜单 (4)Help 菜单 2.Postman工具栏 3.Postman工具栏中的系统设置 4.Postma ...

  3. 【JVM】Java8 和 Java7中JVM内存模型有什么区别

    规范和实现 针对Java虚拟机的实现有专门的<Java虚拟机规范>,在遵守规范的前提下,不同的厂商会对虚拟机进行不同的实现. 就好比开发的过程中定义了接口,具体的接口实现大家可以根据不同的 ...

  4. 从苏宁电器到卡巴斯基第26篇:难忘的三年硕士时光 IV

    录课,录课,还是录课 开题结束以后,已经是三月的下旬,当时我在考虑要不要回家,毕竟学校这里也没什么事了,我待在学校还得付出一定的花销.后来我考虑到在家的话,只有晚上才能够录课,而在学校的话,整个白天都 ...

  5. UVA11078开放式学分制(前面-后面的最大值)

    题意:       给你一个长度为n的整数序列a0 a1 a2..找出两个整数ai,aj(i<j),使得ai-aj最大. 思路:       简单题目,想象一下,对于每一个数我们只要用他前面的最 ...

  6. PhpStorm 配置本地文件自动上传至服务器

    目的:本地文件夹下的文件实时同步至指定服务器的文件夹,减少代码移植的成本和风险 添加一个SFTP连接 Tools - Deployment - Browse Remote Host 配置连接参数 Co ...

  7. IDEA 新建 Java 项目 (图文讲解, 良心教程)

    IDEA 新建 Java 项目 (图文讲解, 良心教程) 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载 ...

  8. ROS之初见Hello World

    前言 最近在玩ROS,笔记中断了一段时间. ROS即Robot Operating System,机器人操作系统,是一个开源框架,主力语言是C++和python,提供了硬件抽象.设备驱动.库函数.可视 ...

  9. MySQL之数据定义语言(DDL)

    写在前面 本文中 [ 内容 ] 代表啊可选项,即可写可不写. SQL语言的基本功能介绍 SQL是一种结构化查询语言,主要有如下几个功能: 数据定义语言(DDL):全称Data Definition L ...

  10. jQ的隐式迭代和设置样式属性

    jQ中的隐式迭代 意义:不需要原生迭代了,在jQ内部自动帮你实现了循环 代码实现: let arr = document.querySelectorAll('li') for(let i = 0;i ...