0

在全连接层的标准 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)

4

1 回答 1

1

它与向量的列方向与行方向的选择有关。

请注意,这weight是这里的第二个参数:

tf.matmul(X, weight)

但是第一个参数 ,W在这里:

tf.matmul(W, tf.transpose(U))

因此,您看到的是以下矩阵转置恒等式的实际应用:

矩阵乘法转置恒等式


回到您的示例,让我们假设 10 个输入和 20 个输出。

第一种方法使用行向量。单个输入X将是一个1x10矩阵,称为行向量,因为它只有一行。为了匹配,weight矩阵需要10x20产生 size 的输出20

但是在第二种方法中,乘法是相反的。这暗示一切都在使用列向量。如果乘法反转,那么一切都会转置。所以这个例子使用了列向量,之所以这样命名是因为它们只有一列。

这就是转置存在的原因。他们 GLoVe 的作者完成他们的符号的方式,乘法反转,权重矩阵W必须已经转置为20x10而不是10x20. 他们必须期待20x1输出的列向量。

因此,如果输入向量U自然是1x10行向量,它也必须转置为10x1列向量,以适应​​其他所有内容。


基本上你应该一直选择行向量或列向量,然后为你确定乘法的顺序和权重的转置。

我个人认为 GloVe 使用的列向量与行向量相比是笨拙且不自然的。最好让乘法排序遵循数据流排序。

于 2020-04-19T22:29:47.747 回答