为何nn.LayerNorm有两个可训练参数,但weight张量仅含单个元素?
问题代码及现象
import torch.nn as nn print(nn.LayerNorm(1, elementwise_affine=True).weight) # Output: # Parameter containing: # tensor([1.], device='cuda:0', requires_grad=True)
疑问
当elementwise_affine设置为True时,nn.LayerNorm拥有两个可训练参数,但打印其weight时仅得到一个元素的张量,这是为什么?该张量本应包含两个元素。
解答
你混淆了「参数的数量」和「单个参数的元素数量」:
nn.LayerNorm的第一个参数normalized_shape定义了要归一化的维度的形状,你传入的1表示要归一化的维度是单元素维度。- 当
elementwise_affine=True时,LayerNorm会为归一化维度的每个元素分别创建一个weight和bias参数。也就是说,weight的形状和normalized_shape完全一致,bias同理。 - 你这里
normalized_shape=1,所以weight是形状为[1]的单元素张量,bias也是形状为[1]的单元素张量——总共是两个可训练参数,而不是一个参数包含两个元素。
举个直观的例子:如果设置normalized_shape=2,那么weight会是形状为[2]的张量(包含两个元素),bias同样是[2]的张量,此时每个参数有两个元素,但依然是两个独立的参数。
内容的提问来源于stack exchange,提问作者JobHunter69
相关产品推荐
相关产品推荐

