对于在计算机中矩阵左乘右乘的思考

对于在计算机中矩阵左乘右乘的思考

在学习CS224n assignment的过程中,遇到了这么一句话:

Note: In this assignment, the inputs to neural network layers will be row vectors because this is standard practice for TensorFlow(some built-in TensorFlow functions assume the inputs are row vectors). This means the weight matrix of a hidden layer will right-multiply instead of left-multiply its input(i.e., xW + b instead of Wx + b)

解析

学过矩阵的都知道,对于矩阵运算,我们喜欢使用列向量。对于一个矩阵,我们通常都习惯于将其按照列向量为单位来进行拆分。
但是在计算的大部分语言中,内存中的分配是习惯按行来进行存储的,如果以列为单位来进行拆分矩阵,那么会影响计算机的计算效率。
因此,在计算机中,我们常常按照行的方式来拆分一个矩阵。因而,我们要将原本按列分的东西,默认转置为行,然后再来进行计算。

也就是说,对于W*x + b(也就是x中的每一列代表一个输入样本的情况下),矩阵W中的每一列代表着样本中的单一个元素需要乘的权重(由于下一层的神经元个数为3,所以这里的权重个数为3)。
最后得到的结果一列(对应于下一层神经网络的神经元输入)。
毫无疑问,加上的系数b也是一列。

总结:也就是说矩阵的行列主要标志为[种类数量,样本数量]。
[num_ classes, batch_ size]

此外,也可看成W的第一行是下一层的单个神经元的所有权重。这样一行乘出来的结果就正好是下一层单个神经元的结果。
但是我们不常常这样看,因为我们更习惯于将一列看成一个整体。尽管有的时候将行看成一个整体会更好进行理解。

x*W + b

对于在计算机中,很多时候我们使用的编程语言都倾向于将一行视为一个整体,因为这样可以方便计算机的查找和运算。
所以在实际的编程中(大部分情况下),我们按行来对矩阵进行拆分。
其实也就是相当于将原本按列的进行了一下转置。使得原本的每一列W代表单个神经元需要乘的系数转换成每一行W代表单个神经元需要乘的系数。同样,最后加上的b也是一行而不是一列。

你可能感兴趣的:(矩阵)