Это связано с выбором столбца и ориентации строки для векторов.
Обратите внимание, что 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, неуклюжи и неестественны по сравнению с векторами строк. Порядок умножения лучше следовать порядку потока данных.