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(
本文介绍了如何在MindSpore中实现WeightNorm参数归一化,包括功能描述、实现分析、参数归一化背景及解决方案。重点讨论了在MindSpore静态图模式下封装Wrapper进行WeightNorm,并探讨了推理阶段移除WeightNorm的方法。
最低0.47元/天 解锁文章
1699

被折叠的 条评论
为什么被折叠?



