Осуществление внимания - PullRequest
0 голосов
/ 18 июня 2020

Я реализую Внимание в PyTorch. У меня возникли вопросы при внедрении механизма внимания.

  1. Какое начальное состояние декодера $ s_0 $? Некоторые сообщения представляют его как нулевой вектор, а некоторые реализуют его как окончательное скрытое состояние кодировщика. Так что же на самом деле $ s_0 $? В исходной статье об этом не упоминается.

  2. Можно ли чередовать слой maxout со слоем dropout? В исходной статье используется слой maxout Goodfellow.

  3. Есть ли какие-либо различия между вероятностью пропадания кодировщика и декодером? Некоторая реализация устанавливает разные вероятности отсева для кодировщика и декодера.

  4. При вычислении $ a_ {ij} $ в модели выравнивания (concat) есть два обучаемых веса $ W $ и $ U $. Я думаю, что лучший способ реализовать это - использовать два линейных слоя. Если я использую линейный слой, следует ли мне удалить член смещения в линейных слоях?

  5. Размер вывода кодировщика (= $ H $) не соответствует скрытому декодеру штат. $ H $ объединяется, поэтому должно быть 2000 (для исходной статьи). Однако скрытый размер декодера также равен 1000. Нужно ли мне добавлять линейный слой после кодировщика, чтобы он соответствовал размеру кодировщика и размеру декодера?

1 Ответ

1 голос
/ 18 июня 2020

В общем, ответов много: в разных реализациях он разный. Исходная реализация из статьи - https://github.com/lisa-groundhog/GroundHog/tree/master/experiments/nmt. Для более поздних реализаций, которые достигли лучшего качества перевода, вы можете проверить:

Теперь к вашему баллов:

  1. В исходной статье это был нулевой вектор. Более поздние реализации используют проекцию либо конечного состояния кодировщика, либо среднего состояния кодировщика. Аргументом в пользу использования среднего является то, что оно более непосредственно передает градиенты в состояния кодировщика. Однако это решение, похоже, не сильно влияет на качество перевода.

  2. Слой Maxout - это вариант нелинейного слоя. Это как бы два слоя ReLU в одном: вы делаете две независимые линейные проекции и берете максимум из них. Вы можете с радостью заменить Maxout на ReLU (современные реализации так и делают), но вы все равно должны использовать dropout.

  3. Я не знаю ни одного значимого варианта использования в MT, когда я бы установил процент отсева по-разному. Обратите внимание, однако, что модели seq2seq используются во многих диких сценариях ios, когда это может иметь смысл.

  4. Большинство реализаций действительно используют смещение при вычислении энергии внимания. Если вы используете два линейных слоя, смещение будет разделено на две переменные. Смещения обычно инициализируются нулем, поэтому они получают одинаковые градиенты и одинаковые обновления. Однако вы всегда можете отключить смещение в линейном слое.

  5. Да, если вы хотите инициализировать s 0 с состояниями декодера. В механизме внимания об этом заботится матрица U .

...