张量流中的 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 使用的列向量笨拙且不自然。最好让乘法顺序遵循数据流顺序。