Pytorch: Как реализовать вложенные преобразователи: преобразователь уровня символов для слов и преобразователь уровня слов для предложений? - PullRequest
1 голос
/ 14 июня 2019

Я имею в виду модель, но мне трудно понять, как на самом деле реализовать ее в Pytorch, особенно когда дело доходит до обучения модели (например, как определить мини-пакеты и т. Д.).Прежде всего, позвольте мне быстро представить контекст:

Я работаю над VQA (визуальный ответ на вопросы), в котором задача состоит в том, чтобы отвечать на вопросы об изображениях, например:

enter image description here

Итак, оставляя в стороне многие детали, я просто хочу сосредоточиться здесь на аспекте / ветви НЛП модели.Чтобы обработать вопрос на естественном языке, я хочу использовать вложения на уровне символов (вместо традиционных вложения на уровне слов ), потому что они более устойчивы в том смысле, что их легкоприспособиться к морфологическим изменениям в словах (например, префиксы, суффиксы, множественное число, спряжения глаголов, дефисы и т. д.).Но в то же время я не хочу терять индуктивный уклон рассуждений на уровне слов.Поэтому я придумал следующий дизайн:

enter image description here

Как вы можете видеть на картинке выше, я хочу использовать трансформаторы (или даже лучше, универсальные трансформаторы ), но с небольшим поворотом.Я хочу использовать 2 преобразователя: первый будет обрабатывать каждое слово в отдельности (преобразователь на уровне символов ), чтобы создать начальное вложение на уровне слов для каждого слова в вопросе.Как только мы получим все эти начальные вложения на уровне слов, второй преобразователь на уровне слов улучшит эти вложения, чтобы обогатить их представление контекстом, получив таким образом контекстно-зависимые вложения на уровне слов .

Полная модель для всей задачи VQA, очевидно, является более сложной, но я просто хочу сосредоточиться здесь на этой части НЛП.Поэтому мой вопрос в основном о том, на какие функции Pytorch мне следует обратить внимание при реализации этого.Например, поскольку я буду использовать встраивания на уровне символов , я должен определить матрицу встраивания на уровне символов , но затем я должен выполнить поиск по этой матрице для генерации входных данныхдля преобразователя на уровне символов повторите это для каждого слова в вопросе, а затем введите все эти векторы в преобразователь на уровне слов .Кроме того, слова в одном вопросе могут иметь разную длину, а вопросы в одном мини-пакете также могут иметь разную длину.Так что в моем коде я должен каким-то образом учитывать разные длины слова и уровня вопроса одновременно в одном мини-пакете (во время обучения), и я понятия не имею, как это сделать в Pytorch или вообще возможно ли это ввсе.

Буду очень признателен за любые советы по реализации этого в Pytorch, которые могут привести меня в правильном направлении.

1 Ответ

2 голосов
/ 17 июня 2019

Для реализации того, что вы говорите в pyTorch, потребуется адаптация преобразователя Transformer:

1) Определить пользовательский токенизатор, который разбивает слова на вложения символов (вместо вложения слов или кусочков)

2) Определить маску для каждого слова (аналогично тому, как использовалась оригинальная бумага для маскировки будущих токенов в декодере), чтобы заставить модель ограничиваться контекстом слова (на первом этапе)

3) Затем используйте традиционный Transformer с маской (эффективно ограничивающей контекст на уровне слов).

4) Затем отбросьте маску и снова примените Transformer (контекст уровня предложения).

.

О чем следует быть осторожным:

1) Помните, что длина выходного сигнала кодировщика Transformer всегда равна размеру входного сигнала (декодер способен генерировать более длинные или более короткие последовательности). Таким образом, на первом этапе у вас будут не вложения на уровне слов (как показано на диаграмме), а вложения на уровне символов. Если вы хотите объединить их в вложения на уровне слов, вам понадобится дополнительный промежуточный шаг декодера или слияние встраиваний с использованием пользовательской стратегии (например, выученная взвешенная сумма или использование чего-то похожего на токен BERT).

2) Вы можете столкнуться с проблемами эффективности. Помните, что Transformer - это O (n ^ 2), поэтому чем длиннее последовательность, тем она дороже в вычислительном отношении. В оригинальном Transformer, если у вас было предложение длиной 10 слов, то Thansformer должен был иметь дело с последовательностью из 10 токенов. Если вы используете вложения по частям, ваша модель будет работать с ~ 15 последовательностями токенов. Но если вы используете встраивания на уровне символов, я предполагаю, что вы будете иметь дело с ~ 50 последовательностями токенов, которые могут оказаться неосуществимыми для длинных предложений, поэтому вам, возможно, придется усечь свой ввод (и вы потеряете все длинные термин сила зависимости внимания моделей).

3) Вы уверены, что у вас будет представительный вклад, добавив Transformer уровня персонажа? Transformer стремится обогащать встраивания на основе контекста (окружающих встраиваний), поэтому в оригинальной реализации использовались встраивания на уровне слов. BERT использует встраивания по частям, чтобы использовать языковые закономерности в связанных словах, а GPT-2 использует Byte-Pais-Embeddings (BPE), которые я не рекомендую в вашем случае, потому что он больше подходит для предсказания следующего токена , В каком случае, по вашему мнению, какая информация будет захвачена при встраивании изученных символов, чтобы ее можно было эффективно разделить между символами слова? Как вы думаете, это будет богаче, чем использование выученного вложения для каждого слова или части слова? Я думаю, это то, что вы пытаетесь выяснить ... верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...