【MindSpore】一种参数归一化实现方式

2023-10-27

1. 功能描述:

MindSpore实现WeightNorm参数归一化。

2. 实现分析:

在MindSpore实现高性能方案,建议采用图模式,同时也能保证动静统一。MindSpore图模式需要把归一化操作表达到整图里,可以采用自定义的方式在网络结构中实现。

3. 参数归一化功能简介(背景介绍):

在深度学习中通常对卷积层的权重进行参数归一化,参数归一化功能根据以下公式对传入的 layer 中的权重参数进行归一化: 

 公式中w是网络权重,g 代表长度变量 ,v代表方向变量。权重归一化可以将神经网络中权重w的向量长度g与其方向v解耦,将w用g和v两个变量表示。 (例如:详细可以参考论文: https://arxiv.org/pdf/1602.07868.pdf。)

4. 解决方案:

实现MindSpore的WeightNorm需要注意:

  • 4.1 MindSpore实现时,需要封装一个Wrapper,将WeightNorm和需要进行参数归一化的网络结构(如卷积)封装为一个整体,这样每次在卷积执行之前,就会先执行WeightNorm。具体伪代码如下:
class WeightNorm(nn.Cell):
    def __init__(self):
        ...
        register_w_v_g()
        self.layer = layer

    def construct(self, inputs):
        compute_weight_norm()
        result = self.layer(inputs)
        return result
复制
  • 4.2 使用参数归一化需要能够添加和删除weight norm,但MindSpore静态图编译后无法删除Weight Norm

remove_weight_norm的场景:

  - 4.2.1 inference,即推理阶段需要移除Weight Norm。

  - 4.2.2 进行一次Weight Norm计算,然后固定w(WeightNorm.remove()的执行逻辑) remove_weight_norm的使用场景,即模型进行推理时,在加载Checkpoint后进行操作,此时未涉及到静态图的编译阶段,因此可以对实例化的模型进行任意修改。 PS: 静态图不支持在训练过程中移除weight norm。

MindSpore  WeightNorm示例:

class WeightNorm (nn.Cell):

      def __init__(self, module, dim:int=0):
           super().__init__()

           if dim is None:
               dim = -1

          self.dim = dim
          self.module = module
          self.assign = P.Assign()
          # add g and v as new parameters and express w as g/||v|| * v
          self.param_g = Parameter(Tensor(norm_except_dim(self.module.weight, 2, dim)))
          self.param_v = Parameter(Tensor(self.module.weight.data))
          self.module.weight.set_data(_weight_norm(self.param_v, self.param_g, self.dim))
          self.use_weight_norm = True

     def construct(self, *inputs, **kwargs):
           if not self.use_weight_norm:
               return self.module(*inputs, **kwargs)
          self.assign(self.module.weight, _weight_norm(self.param_v, self.param_g, self.dim))
              return self.module(*inputs, **kwargs)

     def remove_weight_norm(self):
          self.assign(self.module.weight, _weight_norm(self.param_v, self.param_g, self.dim))
          self.use_weight_norm = False
复制
  • 4.3 use_weight_norm可以达到移除WeightNorm的目的。即调用remove_weight_norm方法后,将self.use_weight_norm设置为False,当再次construct函数时,就会直接调用self.module,忽略Weight Norm计算。

  • 4.4 self.param_g = Parameter(Tensor(norm_except_dim(self.module.weight, 2, dim))) 实现 w和 ||v|| 的计算,静态图不支持getattr方法,考虑到MindSpore的nn层设计,就固定module的权重为module.weight。

def norm_except_dim(v, pow, dim):
    if dim == -1:
       return mnp.norm(v, pow)
    elif dim == 0:
       output_size = (v.shape[0],) + (1,) * (v.ndim - 1)
       return mnp.norm(v.view((v.shape[0], -1)), pow, 1).view(output_size)
    elif dim == (v.ndim - 1):
       output_size = (1,) * (v.ndim - 1) + (v.shape[v.ndim - 1])
       return mnp.norm(v.view((-1, v.shape[v.ndim - 1])), pow, 0).view(output_size)
    else:
       return norm_except_dim(v.swapaxes(0, dim), pow, dim).swapaxes(0,dim)

def _weight_norm(v, g, dim):
    return v * (g / norm_except_dim(v, 2, dim))
复制
  • 4.5 上述代码WeightNorm中,self.module.weight是要进行归一化的网络权重,self.param_g是长度变量,self.param_v是方向变量, 其中norm_except_dim函数用于计算指定维度的长度。

5. MindSpore的WeightNorm简单使用方式

   # assume we need apply weight norm on nn.Dense layer
   m = WeightNorm(nn.Dense(20, 40))
   # m.param_g.shape is (40, 1)
   # m.param_v.shape is (40, 20)
   # use m as normal nn.Dense

   inputs = Tensor(np.random.randn(10, 20), mstype.float32)
   outputs = m(inputs)

   # if you want to remove weight norm, just call it
   m.remove_weight_norm()
   # m.use_weight_norm == False

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MindSpore】一种参数归一化实现方式 的相关文章

随机推荐

  • SpringBoot默认的五个静态资源位置&&自定义静态资源位置&&WebMvcCofigurer源码解析

    我们在SSM中的SpringMVC中配置静态资源过滤
  • Contest2609 - 高级语言程序实践--第8次作业--计信A2107-2113

    问题 A 统计字母数量 题目描述 有如下一段英文短文 请编写程序统计这段短文前 n 小段中每一个英文字母出现的次数 结果按次数降序排列 次数相同时 按字母表顺序输出 若 n 值大于短文行数 输出整篇文章中每一个英文字母出现的次数 大写字母按
  • Winsock属性、方法介绍

    Winsock是Mcrosoft windows提供的网络编程接口 它供了基于TCP IP协议接口实现方法 通过网络进行的数据通信 需要用地址来表示网络中的主机 TCP IP协议使用IP地址来作为主机的标识 实现的连接方式是通过IP地址来识
  • 亚信科技Java实习生(大三)面试

    亚信科技Java实习生面试 我面的挺晚的了 6 11才面 有的同学都实习几周甚至一个月了 但是同一个公司 我同学面试的时候 竟然全问的非技术问题 理想 大学经历 迷惑 可能我运气有一点好吧 看了一些面经 都是偏重基础 所以也是主要复习的基础
  • 2023华为od机试 Java 【路径步数】

    题目 小明喜欢户外运动 这个周末他打算去附近的山区探险 他面前有一张特殊的地图来帮助他找到这片区域的最高点 这张地图是一个由数字构成的网格 网格中的每一个单元格包含一个数字 代表那个点的高度 其中 数字 0 代表平地 而数字 1 到 9 则
  • 云服务器磁盘扩容后不显示,腾讯云服务器磁盘扩容问题小记

    操作系统 CentOS 7 2 文件类型 ext3 磁盘扩容前 一定要先做磁盘快照备份 1 卸载挂载点报错 umount dev vdb1 umount u01 target is busy In some cases useful inf
  • dclode mui.ajax无法发送跨域请求,type为abort

    前台 mui的ajax代码 后台java spring boot代码 后来得知原因是不能使用localhost和127 0 0 7需要使用本机的IP地址 且手机和电脑要连同一无线 修改ip地址后 程序正常 且需要注意 json要为大写 Js
  • 一道有关路由器的实验题 寻找前辈指导

    如图所示 使用Dynamips搭建网络环境由路由器R1 R5构成 路由器PC模拟PC机 R1 R2上配置Loopback地址 好像我的这个拓扑图无法显示 不过我把拓扑图传到附件那里了 如果有乐于助人的好前辈的话 那还的麻烦您把它下载来看看
  • ArrayList、ArrayDeque与LinkedList区别

    ArrayList ArrayDeque与LinkedList区别 ArrayList ArrayDeque内部以数组的形式保存集合中的元素 因此随机访问元素时有较好的性能 而LinkedList内部以链表的形式来保存集合中的元素 因此随机
  • 平均值不等式的证明

    平均值不等式的证明 需要证明的结论 对任意 n n n个正数 a 1
  • 【华为OD机试真题 JS】停车场车辆统计

    标题 停车场cars 数组表示 其中值1为有车 0为无车 车有三种大小 小车占位1 卡车占位2 货车占位3 求最少可以停多少车 输入描述 输入 整型字符串数组cars 其中1表示有车 0表示没车 数组长度小于1000 输出 整型数字字符串
  • 泛微为什么大量招人_OA市场增长乏力 泛微未来靠什么取胜?

    上周 泛微网络发布了其2019年中期财报 营收和利润均获得增长 财报显示 2019 年上半年 公司共实现营业收入 50 494 62 万元 同比增长 25 96 实现归母净利润 4 919 37 万元 比上年同期增加 35 70 尽管收入增
  • Go(五)数组

    目录 Array 数组 数组定义 数组的初始化 方法一 方法二 方法三 数组的遍历 多维数组 二维数组的定义 二维数组的遍历 数组是值类型 Array 数组 数组是同一种数据类型元素的集合 在Go语言中 数组从声明时就确定 使用时可以修改数
  • 常见凭证获取方法

    常见凭证获取方法 Windows下凭证获取 系统密文数据 原理介绍 SAM系统安全账号管理 是微软设计的一个安全机制 为了保护账号以及密码的安全性 路径是C windows system32 config SA 该文件是无法修改和删除的 它
  • Balanced Ternary String【Codeforces Round #531 (Div. 3)D】【贪心、构造】

    题目链接 一道简单的构造 我们可以分成几个状态 因为所有的状态只有8个 所以 直接写每个状态即可 哎 被hack了 烦啊 谁让我写的好烂 好菜啊 呜呜呜 include
  • 云服务器一直显示关机中,云服务器一直提示关机中

    云服务器一直提示关机中 内容精选 换一换 云服务器组是对云服务器的一种逻辑划分 云服务器组中的弹性云服务器遵从同一策略 当前仅支持反亲和性 即同一云服务器组中的弹性云服务器分散地创建在不同的主机上 提高业务的可靠性 您可以使用云服务器组将业
  • 适合上班族的兼职有哪些?上班族兼职赚钱项目

    上班族如何赚外快 其实上班族压力很大的 表面看起来衣着得体 出入高端写字楼 但一个月到手的几千元工资除去房租水电生活车马费后 基本上余不下什么钱 更别谈买车买房了 所以很多上班族都想知道 如何利用业余时间兼职钱 今天理想青年工作室就为大家分
  • Unity3D-Shader之两张图片叠加并且通过颜色调控

    最近项目需要做一个图片叠加在一个模型上 而且还需要通过调整颜色改变两个图片的颜色和透明程度 另外 还需要一个调控值 管理两张图片是否完全显示 Shader如下 Shader Unlit BlockTextrue Properties Mai
  • Nginx & 详细举例 location -> index、return、rewrite、try_files、alias 各个属性的含义和注意事项

    1 准备工作 1 1 本案例以 centos7 系统作为演示 配置文件在 etc nginx conf d test conf 中 内容如下 server listen 8000 server name 127 0 0 1 root hom
  • 【MindSpore】一种参数归一化实现方式

    1 功能描述 MindSpore实现WeightNorm参数归一化 2 实现分析 在MindSpore实现高性能方案 建议采用图模式 同时也能保证动静统一 MindSpore图模式需要把归一化操作表达到整图里 可以采用自定义的方式在网络结构