单个sample的Linear数学表达式
![pytorch nn.Linear的理解 pytorch nn.Linear的理解](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzExNy9mOTk2NGNlM2UyMWM5ODNiMjZjZTY1YTcxZTU3NTdiZC5KUEVH)
上图是前向传播的一个简单示例图。首先说明下该图中各个数学符号的含义:
X:单个sample的向量表达;
xi:输入sample向量的第i维;
W(l):Layerl−1到Layerl的前向传播权重矩阵;
wij(l):权重矩阵W(l)的元素,j表示Layerl−1中第j个元素,i表示Layerl中第i个元素,wij表示j到i的连接权重;
Z(l):Layerl接受到的刺激信号向量;
zi(l):Layerl接受到的刺激信号向量中的第i个值;
A(l):Layerl的**值向量;
ai(l):Layerl对应zi(l)的**值;
这里主要写一下Layer 1到Layer 2的前向传播数学表达式:
z1(2)=w11(2)x1+w12(2)x2+w13(2)x3z2(2)=w21(2)x1+w22(2)x2+w23(2)x3z3(2)=w31(2)x1+w32(2)x2+w33(2)x3
在深度学习中,这样的表达式过于繁琐,通常使用矩阵来进行简洁的表达。上述表达式的矩阵表达为:
⎣⎢⎡z1(2)z2(2)z3(2)⎦⎥⎤=⎣⎢⎡w11(2)w21(2)w31(2)w12(2)w22(2)w32(2)w13(2)w23(2)w33(2)⎦⎥⎤⎣⎡x1x2x3⎦⎤+⎣⎢⎡b1(2)b2(2)b3(3)⎦⎥⎤(1)
Z(l)=W(l)X+B(l)(2)
公式(2)中的Z(l)和X都是列向量。
pytorch nn.Linear
torch.nn.Linear(in_features, out_features, bias=True)
官方文档的注释:
Applies a linear transformation to the incoming data:y=xAT+b
对比公式(2),可以发现A其实就是W,但是两者的表达还是有些不同的。
个人理解:公式(2)是针对单个sample的数学推导,其中单个sample是以列向量的形式表达的,但是在神经网络的训练中一般是使用batch train,这个时候就要使用sample matrix了。x表示sample matrix,矩阵的每一行表示一个sample,即x的size为batchsize∗in_features,in_features表示上一层的输出维度。y的size为batch_size∗out_features,out_features表示该层的输出维度,即该层的隐藏神经元个数。单个sample时,我们用列向量来表示sample,但是在sample matrix时,我们有行向量表示一个sample,所以矩阵A需要转置。
batch_size∗in_features∗in_features∗out_features=batch_size∗out_features
矩阵A的维度是out_features∗in_features,这和W的形式是相同的。
之所以要转置,估计是因为batch train的原因。
![pytorch nn.Linear的理解 pytorch nn.Linear的理解](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzYxNy85ZjBlOTgwYzhlYmY2NmZlYTkyZGU3ODBlYzg1YTA4MS5wbmc=)
关于shape的理解:
对于二维sample matrix,∗表示batch_size,三维sample matrix,N可以理解为channel;不管有多少维,理解的时候从最后一维开始理解,最后一维表示一个样本的维度,前一维表示多少个样本,最后两维表示构成一个sample matrix;再往前一维表示有多少个这样的sample matrix;更多的维度按照这样的方式去理解就比较容易了。
#preference:
1、https://zhuanlan.zhihu.com/p/71892752
2、https://pytorch.org/docs/stable/nn.html#linear-layers