[英]tf.matmul(X,weight) vs tf.matmul(X,tf.traspose(weight)) in tensorflow
在全连接层的标准 ANN 中,我们使用以下公式: tf.matmul(X,weight) + bias
。 我很清楚,因为我们使用矩阵乘法来连接输入和隐藏层。
但在 GloVe 实现( https://nlp.stanford.edu/projects/glove/ )中,我们使用以下公式进行嵌入乘法: tf.matmul(W, tf.transpose(U))
让我感到困惑的是tf.transpose(U)
部分。 为什么我们使用tf.matmul(W, tf.transpose(U))
而不是tf.matmul(W, U)
?
它与向量的列方向与行方向的选择有关。
请注意, weight
是这里的第二个参数:
tf.matmul(X, weight)
但是第一个参数W
在这里:
tf.matmul(W, tf.transpose(U))
因此,您看到的是以下矩阵转置恒等式的实际应用:
回到您的示例,让我们假设 10 个输入和 20 个输出。
第一种方法使用行向量。 单个输入X
将是一个1x10
矩阵,称为行向量,因为它只有一行。 为了匹配, weight
矩阵需要为10x20
才能生成大小为20
的 output 。
但是在第二种方法中,乘法是相反的。 这暗示一切都在使用列向量。 如果乘法反转,那么一切都会转置。 所以这个例子使用了列向量,之所以这样命名是因为它们只有一列。
这就是转置存在的原因。 他们 GLoVe 的作者完成他们的符号的10x20
,乘法反转,权重矩阵W
必须已经转置为 20x10 而不是20x10
。 他们必须期待 output 的20x1
列向量。
因此,如果输入向量U
自然是1x10
行向量,它也必须转置为10x1
列向量,以适应其他所有内容。
基本上你应该一直选择行向量或列向量,然后为你确定乘法的顺序和权重的转置。
我个人认为 GloVe 使用的列向量与行向量相比是笨拙且不自然的。 最好让乘法排序遵循数据流排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.