Тензорный поток embedding_lookup дифференцируем?
Некоторые из учебных пособий, с которыми я столкнулся, описаны с использованием случайно инициализированной матрицы встраивания, а затем с использованием tf.nn.embedding_lookup
функция для получения вложений для целочисленных последовательностей. У меня сложилось впечатление, что с embedding_matrix
получается через tf.get_variable
оптимизатор добавил бы соответствующие операции для его обновления.
Что я не понимаю, так это то, как обратное распространение происходит через функцию поиска, которая кажется жесткой, а не мягкой. Каков градиент этой операции относительно? один из его входных идентификаторов?
1 ответ
Внедрение поиска в матрице математически эквивалентно точечному произведению с матрицей с горячим кодированием (см. Этот вопрос), которая является гладкой линейной операцией.
Например, вот поиск по индексу 3
:
Вот формула для градиента:
... где левая часть - производная от отрицательного логарифмического правдоподобия (т. е. целевая функция), x
являются входными словами, W
это матрица вложения и delta
это сигнал ошибки.
tf.nn.embedding_lookup
оптимизирован таким образом, что не происходит одноразовое преобразование кодировки, но backprop работает по той же формуле.