torch.nn.Parameter可以将tensor变成可训练的,如在transformer的self-attention等一些attention机制中,会用到一些可训练的权重矩阵,这时用torch.nn.Parameter在模型中创建这些矩阵即可随着模型的训练不断更新最优化。
使用方法:
self.w = torch.nn.Parameter(torch.FloatTensor(hidden_size))
含义是将一个固定不可训练的tensor转换成可以训练的类型parameter,并将这个parameter绑定到这个module里面(net.parameter()中就有这个绑定的parameter,所以在参数优化的时候可以进行优化的),所以经过类型转换这个self.w变成了模型的一部分,成为了模型中根据训练可以改动的参数了。使用这个函数的目的也是想让某些变量在学习的过程中不断的修改其值以达到最优化。
可以初始化其值:
nn.init.uniform_(self.w, -0.1, 0.1)
不过,这操作不是也可以直接用全连接层 nn.Linear 实现吗???一脸懵逼,nn.Linear 里面的weight和bias也是nn.Parameter类型喔。
于是我打开transformer的self-attention看了看,哦他用的是nn.Linear。我看别的一些注意里机制有的也用nn.Parameter。所以应该都是可以的,都是做了一个线性变化而已。