张量流中的 tf.matmul(X,weight) 与 tf.matmul(X,tf.traspose(weight))
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
.
的输出
但是在第二种方法中乘法是相反的。这暗示一切都在使用列向量。如果乘法是相反的,那么一切都会转置。所以这个例子使用的是列向量,之所以这样命名是因为它们只有一列。
这就是转置存在的原因。按照 GLoVe 作者完成符号的方式,乘法反转,权重矩阵 W
必须已经转置为 20x10
而不是 10x20
。他们必须期待输出的 20x1
列向量。
因此,如果输入向量 U
自然是 1x10
行向量,它也必须转置为 10x1
列向量,以适应其他所有内容。
基本上,您应该始终选择行向量或列向量,然后为您确定乘法的顺序和权重的转置。
我个人认为,与行向量相比,GloVe 使用的列向量笨拙且不自然。最好让乘法顺序遵循数据流顺序。
在完全连接层的标准 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
.
但是在第二种方法中乘法是相反的。这暗示一切都在使用列向量。如果乘法是相反的,那么一切都会转置。所以这个例子使用的是列向量,之所以这样命名是因为它们只有一列。
这就是转置存在的原因。按照 GLoVe 作者完成符号的方式,乘法反转,权重矩阵 W
必须已经转置为 20x10
而不是 10x20
。他们必须期待输出的 20x1
列向量。
因此,如果输入向量 U
自然是 1x10
行向量,它也必须转置为 10x1
列向量,以适应其他所有内容。
基本上,您应该始终选择行向量或列向量,然后为您确定乘法的顺序和权重的转置。
我个人认为,与行向量相比,GloVe 使用的列向量笨拙且不自然。最好让乘法顺序遵循数据流顺序。