采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
【LayerNormalizaiton课程视频讲到: 在每一层layer的output上做Normalization,求均值和方差的,那么它就不是在batchsize的维度上做的;它和M没有关系,它是每一条样例的每一个layer的output上求解的均值和方差】
问题:求均值的时候不是M个数据求和再除以M求出的平均值么?还是说一条数据在这一层layer的不同的节点上的output值加在一起除以这一层的节点数? (上一层不同的特征连接下一层不同的节点)
同学你好,可能是系统有些问题,才看到提问。对于你的问题,我相信你已经理解了batchnorm了(在batch 维度上做element-wise norm),我写了如下一个代码片段,可能会帮助你理解layernorm, 你可以运行debug看看:
import torch from torch import nn # 构建一个数据,假设他是上层layer的输出 N, L, C = 7, 3, 32 x = torch.randn((N, L, C)) # [N, L, C] # torch 自带layernoem ln = nn.LayerNorm(C, elementwise_affine=False, eps=1e-9) # layernorm ln_out = ln(x) # 手动来求一遍 std, mean = torch.std_mean(x, dim=-1, keepdim=True, unbiased=False) # 获取std, mean handmade_ln = (x-mean)/std print(torch.allclose(ln_out, handmade_ln)) # 可以看到两者结果是一致的
老师,谢谢您的回答。std, mean = torch.std_mean(x, dim=-1, keepdim=True, unbiased=False) # 获取std, mean 您这行代码还是调用的torch的API实现的,我是说如果不调用std_mean,自己求mean的话,将所有的x求和,再除以一个N获取均值,那么这个N是指的什么呢,是每一层网络的节点数么?
同学你好,你好,从上面代码里面可以看见,手动求mean,std是在最后一个维度,也就是C这个维度,你所说的“N”就是上面代码的32(C这个维度),不知道我说清楚了吗。
结合核心基础、算法模型设计和实用案例,系统入门深度学习
236 6
536 3
707 3
628 3
642 3