XLNet: Generalized Autoregressive Pretraining for Language Understanding
Carnegie Mellon University, Google Brain
Статья: https://arxiv.org/abs/1906.08237
Код на TF: https://github.com/zihangdai/xlnet
Совсем свежая работа, пять дней от роду, побившая кучу SOTA и обогнавшая BERT.
Я уверен, с ней ещё предстоит много разбираться и будет много постов с детальным анализом от разных авторов. Я пока напишу базовые моменты, которые видно из статьи (с кодом сам пока не успел поиграть).
В некотором смысле это гибрид LM-подхода, BERT-а и Transformer-XL.
Авторы сравнивают два подхода: Autoregressive (обычная односторонняя LM) — предсказываем следующий токен по последовательности предшествующих, Autoencoding (BERT) — максируем часть токенов в [MASK] и пытаемся их восстановить.
У обоих есть недостатки: первый вариант не видит правый контекст, во втором разные токены под маской восстанавливаются независимо, а кроме того, в обучении всегда предложения с масками, в finetuning режиме -- без, это даёт смещение.
Давайте попытаемся совместить плюсы обоих подходов: будем предсказывать 1 слово, но в качестве входа рассматривать левый контекст во всех возможных перестановках слов в предложении. Так мы обязательно увидим и левый и правый контекст в оригинальном предложении, но при этом в каждом случае будем видеть только часть слов. На практике и перестановок никаких нет — слова, как обычно в трансформере, подаются с эмбеддингами позиций, и они не меняются, а просто та часть слов, которые в текущей виртуальной перестановке оказались справа, скрывается на уровне маски внимания. Другими словами сетка просто учится на разных подмножествах доступных слов из предложения предсказывать текущее слово.
Тут делаются дополнительные усилия для того, чтобы избежать подглядывания, авторы делают два потока представлений — обычный и query, в котором слово не доступно для attention с самого себя. Query-поток используется для обучения, а на этапе finetuning-а уже обычный.
Позиционные эмбеддинги используются относительные, как в Transformer-XL.
Но механизм кэширования состяния прошлого окна для поддержания псевдо-реккурентости приходиться подправить так, чтобы он не зависел от конкретной виртуальной перестановки, использованной на предыдущем окне. Также для многосегментных входов добавляют в относительный позиционный эмбеддинг компоненту, которая зависит от того, принадлежат два слова одному сегменту или разным.
Такой подход в итоге умеет смотреть на слова с обоих сторон, и при этом у него нет масок в инпутах, и нет зависимых скрытых токенов (т.к. всегда скрыт только один).
В итоге, на 20 задачах обошли BERT, на 18 задачах получили SOTA.
Общественность радуется, huggingface уже вроде пообещали добавить XLNet в свой мега-репозиторий pytorch-моделей https://github.com/huggingface/pytorch-pretrained-BERT.
Carnegie Mellon University, Google Brain
Статья: https://arxiv.org/abs/1906.08237
Код на TF: https://github.com/zihangdai/xlnet
Совсем свежая работа, пять дней от роду, побившая кучу SOTA и обогнавшая BERT.
Я уверен, с ней ещё предстоит много разбираться и будет много постов с детальным анализом от разных авторов. Я пока напишу базовые моменты, которые видно из статьи (с кодом сам пока не успел поиграть).
В некотором смысле это гибрид LM-подхода, BERT-а и Transformer-XL.
Авторы сравнивают два подхода: Autoregressive (обычная односторонняя LM) — предсказываем следующий токен по последовательности предшествующих, Autoencoding (BERT) — максируем часть токенов в [MASK] и пытаемся их восстановить.
У обоих есть недостатки: первый вариант не видит правый контекст, во втором разные токены под маской восстанавливаются независимо, а кроме того, в обучении всегда предложения с масками, в finetuning режиме -- без, это даёт смещение.
Давайте попытаемся совместить плюсы обоих подходов: будем предсказывать 1 слово, но в качестве входа рассматривать левый контекст во всех возможных перестановках слов в предложении. Так мы обязательно увидим и левый и правый контекст в оригинальном предложении, но при этом в каждом случае будем видеть только часть слов. На практике и перестановок никаких нет — слова, как обычно в трансформере, подаются с эмбеддингами позиций, и они не меняются, а просто та часть слов, которые в текущей виртуальной перестановке оказались справа, скрывается на уровне маски внимания. Другими словами сетка просто учится на разных подмножествах доступных слов из предложения предсказывать текущее слово.
Тут делаются дополнительные усилия для того, чтобы избежать подглядывания, авторы делают два потока представлений — обычный и query, в котором слово не доступно для attention с самого себя. Query-поток используется для обучения, а на этапе finetuning-а уже обычный.
Позиционные эмбеддинги используются относительные, как в Transformer-XL.
Но механизм кэширования состяния прошлого окна для поддержания псевдо-реккурентости приходиться подправить так, чтобы он не зависел от конкретной виртуальной перестановки, использованной на предыдущем окне. Также для многосегментных входов добавляют в относительный позиционный эмбеддинг компоненту, которая зависит от того, принадлежат два слова одному сегменту или разным.
Такой подход в итоге умеет смотреть на слова с обоих сторон, и при этом у него нет масок в инпутах, и нет зависимых скрытых токенов (т.к. всегда скрыт только один).
В итоге, на 20 задачах обошли BERT, на 18 задачах получили SOTA.
Общественность радуется, huggingface уже вроде пообещали добавить XLNet в свой мега-репозиторий pytorch-моделей https://github.com/huggingface/pytorch-pretrained-BERT.