请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

LayerNormalizaiton

【LayerNormalizaiton课程视频讲到:
在每一层layer的output上做Normalization,求均值和方差的,那么它就不是在batchsize的维度上做的;它和M没有关系,它是每一条样例的每一个layer的output上求解的均值和方差】

问题:求均值的时候不是M个数据求和再除以M求出的平均值么?还是说一条数据在这一层layer的不同的节点上的output值加在一起除以这一层的节点数?
(上一层不同的特征连接下一层不同的节点)

正在回答 回答被采纳积分+3

1回答

Markov_Xi 2022-07-15 14:35:37

同学你好,可能是系统有些问题,才看到提问。对于你的问题,我相信你已经理解了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)) # 可以看到两者结果是一致的


0 回复 有任何疑惑可以回复我~
  • 提问者 慕九州7272337 #1
    老师,谢谢您的回答。std, mean = torch.std_mean(x, dim=-1, keepdim=True, unbiased=False) # 获取std, mean 
    您这行代码还是调用的torch的API实现的,我是说如果不调用std_mean,自己求mean的话,将所有的x求和,再除以一个N获取均值,那么这个N是指的什么呢,是每一层网络的节点数么?
    回复 有任何疑惑可以回复我~ 2022-07-15 19:37:34
  • Markov_Xi 回复 提问者 慕九州7272337 #2
    同学你好,你好,从上面代码里面可以看见,手动求mean,std是在最后一个维度,也就是C这个维度,你所说的“N”就是上面代码的32(C这个维度),不知道我说清楚了吗。
    回复 有任何疑惑可以回复我~ 2022-07-25 15:49:36
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信