tf.matmul (X, вес) против tf.matmul (X, tf.traspose (вес)) в тензорном потоке - PullRequest
0 голосов
/ 19 апреля 2020

В стандартном 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)?

1 Ответ

1 голос
/ 20 апреля 2020

Это связано с выбором столбца и ориентации строки для векторов.

Обратите внимание, что weight является вторым параметром здесь:

tf.matmul(X, weight)

Но первый параметр, W, здесь:

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

Итак, вы видите практическое применение следующей матрицы транспонированной идентичности:

matrix multiplication transpose identity


Чтобы вернуться к вашему примеру, предположим, что 10 входов и 20 выходов.

В первом подходе используются векторы строк. Один вход X будет представлять собой матрицу 1x10, называемую вектором строк, потому что он имеет одну строку. Чтобы соответствовать, матрица weight должна быть 10x20, чтобы получить вывод размером 20.

Но во втором подходе умножение является обратным. Это намек на то, что все используют векторы столбцов. Если умножение перевернуто, то все становится транспонированным. Так что в этом примере используются векторы столбцов, названные так, потому что они имеют один столбец.

Вот почему есть транспонирование. То, как авторы GLoVe делали свои записи, с обратным умножением, весовая матрица W уже должна быть транспонирована в 20x10 вместо 10x20. И они должны ожидать 20x1 вектор столбца для вывода.

Так что, если входной вектор U, естественно, является 1x10 вектором строки, он также должен быть транспонирован в 10x1 вектор столбца, чтобы соответствовать всем остальным.


По сути, вы должны постоянно выбирать векторы строк или векторы столбцов, а затем определяется порядок умножений и транспонирование весов.

Лично я считаю, что векторы столбцов, используемые GloVe, неуклюжи и неестественны по сравнению с векторами строк. Порядок умножения лучше следовать порядку потока данных.

...