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

本文介绍了如何在MindSpore中实现WeightNorm参数归一化,包括功能描述、实现分析、参数归一化背景及解决方案。重点讨论了在MindSpore静态图模式下封装Wrapper进行WeightNorm,并探讨了推理阶段移除WeightNorm的方法。
摘要由CSDN通过智能技术生成

1. 功能描述:
MindSpore实现WeightNorm参数归一化。

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

3. 参数归一化功能简介(背景介绍):
在深度学习中通常对卷积层的权重进行参数归一化,参数归一化功能根据以下公式对传入的 layer 中的权重参数进行归一化:
image.png
公式中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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值