Semantic Redundancies in Image-Classification Datasets: The 10% You Don't Need
Vighnesh Birodkar, Hossein Mobahi, Samy Bengio
Статья: https://arxiv.org/abs/1901.11409
Ещё одна статья про избыточность датасетов, идейно перекликающаяся со статьёй из предыдущего поста.
Идея в том, чтобы посмотреть, можно ли в датасете выделить подмножество примеров, на котором с одной стороны результат обучения будет лучше, чем на случайно выбранном подмножестве такого же размера, а с другой — сопоставим с полным датасетом.
Это удалось на CIFAR-10 и ImageNet, и таким образом авторы показывают избыточность этих датасетов (порядка 10%). То есть эти самые 10% можно найти простой техникой агломеративной кластеризации.
Для этого на полном датасете обучается модель (ResNet-32 на CIFAR-10/100, ResNet-101 на ImageNet), затем с предпоследнего слоя берутся представления данных и на них проводится процедура агломеративной кластеризации, где в качестве меры близости берётся косинусная мера (вернее 1 минус косинусная близость в качестве меры непохожести). Кластеризацию проводят до образования группы кластеров нужного размера (объединяют наименее непохожие). Затем из каждого кластера оставляют точку наиболее близкую к центроиду и выбрасывают остальные. Так получаем сокращённый датасет.
Затем на сокращённом датасете обучают сетку и оценивают её качество. Сравнивают с сеткой, обученной на рандомном подмножестве такого же размера, взятого из оригинального датасета.
На CIFAR-10 оказывается, что отобранные таким образом 90% точек дают качество полного датасета. То же самое на ImageNet.
Главная интрига — CIFAR-100. На нём предложенный метод не обнаружил избыточности! И отобранный кластеризацией датасет был лишь чуть лучше рандомного. Что входит в противоречие с предыдущей статьёй, где нам явно показали, что в этом датасете полно почти-дубликатов и есть даже почти полные дубликаты, в отличие от CIFAR-10 (там в статье было также написано, что при составлении CIFAR-100, похоже, были ослаблены строгие критерии фильтрации). Там на CIFAR-100 нашли как раз порядка 10% разных дубликатов, которых не нашли здесь.
Получается серьёзная нестыковка.
Интересно, проблема в различии функций близости (здесь косинусная мера, там евклидово расстояние) или в особенности агломеративной процедуры (где в качестве меры непохожести двух кластеров берётся максимальная непохожесть между всеми парами точек этих кластеров)?
В общем всё это подозрительно!
P.S. Хотя я не совсем корректен, в предыдущей статье искали дубликаты в тесте относительно трейна, здесь же работали с трейн. Но всё равно как-то не верится.
Vighnesh Birodkar, Hossein Mobahi, Samy Bengio
Статья: https://arxiv.org/abs/1901.11409
Ещё одна статья про избыточность датасетов, идейно перекликающаяся со статьёй из предыдущего поста.
Идея в том, чтобы посмотреть, можно ли в датасете выделить подмножество примеров, на котором с одной стороны результат обучения будет лучше, чем на случайно выбранном подмножестве такого же размера, а с другой — сопоставим с полным датасетом.
Это удалось на CIFAR-10 и ImageNet, и таким образом авторы показывают избыточность этих датасетов (порядка 10%). То есть эти самые 10% можно найти простой техникой агломеративной кластеризации.
Для этого на полном датасете обучается модель (ResNet-32 на CIFAR-10/100, ResNet-101 на ImageNet), затем с предпоследнего слоя берутся представления данных и на них проводится процедура агломеративной кластеризации, где в качестве меры близости берётся косинусная мера (вернее 1 минус косинусная близость в качестве меры непохожести). Кластеризацию проводят до образования группы кластеров нужного размера (объединяют наименее непохожие). Затем из каждого кластера оставляют точку наиболее близкую к центроиду и выбрасывают остальные. Так получаем сокращённый датасет.
Затем на сокращённом датасете обучают сетку и оценивают её качество. Сравнивают с сеткой, обученной на рандомном подмножестве такого же размера, взятого из оригинального датасета.
На CIFAR-10 оказывается, что отобранные таким образом 90% точек дают качество полного датасета. То же самое на ImageNet.
Главная интрига — CIFAR-100. На нём предложенный метод не обнаружил избыточности! И отобранный кластеризацией датасет был лишь чуть лучше рандомного. Что входит в противоречие с предыдущей статьёй, где нам явно показали, что в этом датасете полно почти-дубликатов и есть даже почти полные дубликаты, в отличие от CIFAR-10 (там в статье было также написано, что при составлении CIFAR-100, похоже, были ослаблены строгие критерии фильтрации). Там на CIFAR-100 нашли как раз порядка 10% разных дубликатов, которых не нашли здесь.
Получается серьёзная нестыковка.
Интересно, проблема в различии функций близости (здесь косинусная мера, там евклидово расстояние) или в особенности агломеративной процедуры (где в качестве меры непохожести двух кластеров берётся максимальная непохожесть между всеми парами точек этих кластеров)?
В общем всё это подозрительно!
P.S. Хотя я не совсем корректен, в предыдущей статье искали дубликаты в тесте относительно трейна, здесь же работали с трейн. Но всё равно как-то не верится.
arXiv.org
Semantic Redundancies in Image-Classification Datasets: The 10%...
Large datasets have been crucial to the success of deep learning models in the recent years, which keep performing better as they are trained with more labelled data. While there have been...
Как известно, большая часть уловок в современном NLP строится вокруг unsupervised learning -- данных у нас много, а разметки мало, и она дорогая (а качественной -- так и вообще почти нет). Одним из интересных ходов является использование смайлов и эмоджи в качестве нативной разметки для сетевой коммуникации. Сегодня пара небольших работ на эту тему.
Interpretable Emoji Prediction via Label-Wise Attention LSTMs
Francesco Barbieri, Luis Espinosa-Anke, Jose Camacho-Collados, Steven Schockaert, Horacio Saggion
#NLP, #emoji, #attention, #EMNLP 2018
Статья: https://aclweb.org/anthology/D18-1508
Репозиторий: https://github.com/fvancesco/Semeval2018-Task2-Emoji-Detection
Сопроводительные материалы: https://fvancesco.github.io/label_wise_attention/
Небольшой, но забавный постер с EMNLP 2018. Авторы используют энкодер в виде двухслойного bi-LSTM со skip connections между слоями, дальше, поверх энкодера они применяют механизм внимания и его результат превращают, через проекцию и софтмакс, в предсказание эмоджи. В качестве вариации архитектуры они используют структуру, в которой на каждый эмоджи учится отдельная матрица внимания, что даёт доп. профит в качестве предсказания эмоджи. Лично я не уверен, что профит от этого больше, чем просто от кратного увеличения матрицы внимания, но так проще интерпретировать результаты. Собственно, вся идея в том, что дальше эти матрицы внимания можно использовать не только для предсказания эмоджи, но и для анализа того, от каких слов и конструкций зависит выбор эмоджи. Далее см. картинки.
И, чтоб два раза не вставать.
MOJITALK: Generating Emotional Responses at Scale
Xianda Zhou, William Yang Wang
#NLP, #emoji, #ACL 2018
Статья: https://arxiv.org/pdf/1711.04090.pdf
Код и датасет: https://github.com/Claude-Zhou/MojiTalk
Делают диалоговую RNN-модуль, учитывающую эмоджи. Точнее, используют seq2seq+attn с кондишенингом генерации ответа на конкретный символ эмоджи.
Учат три варианта диалоговой модели, отличия моделей такие: бейзлайн -- обычный seq2seq с вниманием, вторая модель -- СVAE, третья -- СVAE с REINFORCE обратной связью от предобученного классификатора эмоджи (с замороженными весами). По результатам -- СVAE всюду лучше бейзлайна, Reinforced CVAE обгоняет обычный CVAE на редких эмоджи, а на частных они работают примерно с одинаковым качеством. Отдельно делали человеческую оценку результатов, но результаты её приводят довольно странным образом. Но на приводимых cherry-picked примерах всё достаточно неплохо.
Interpretable Emoji Prediction via Label-Wise Attention LSTMs
Francesco Barbieri, Luis Espinosa-Anke, Jose Camacho-Collados, Steven Schockaert, Horacio Saggion
#NLP, #emoji, #attention, #EMNLP 2018
Статья: https://aclweb.org/anthology/D18-1508
Репозиторий: https://github.com/fvancesco/Semeval2018-Task2-Emoji-Detection
Сопроводительные материалы: https://fvancesco.github.io/label_wise_attention/
Небольшой, но забавный постер с EMNLP 2018. Авторы используют энкодер в виде двухслойного bi-LSTM со skip connections между слоями, дальше, поверх энкодера они применяют механизм внимания и его результат превращают, через проекцию и софтмакс, в предсказание эмоджи. В качестве вариации архитектуры они используют структуру, в которой на каждый эмоджи учится отдельная матрица внимания, что даёт доп. профит в качестве предсказания эмоджи. Лично я не уверен, что профит от этого больше, чем просто от кратного увеличения матрицы внимания, но так проще интерпретировать результаты. Собственно, вся идея в том, что дальше эти матрицы внимания можно использовать не только для предсказания эмоджи, но и для анализа того, от каких слов и конструкций зависит выбор эмоджи. Далее см. картинки.
И, чтоб два раза не вставать.
MOJITALK: Generating Emotional Responses at Scale
Xianda Zhou, William Yang Wang
#NLP, #emoji, #ACL 2018
Статья: https://arxiv.org/pdf/1711.04090.pdf
Код и датасет: https://github.com/Claude-Zhou/MojiTalk
Делают диалоговую RNN-модуль, учитывающую эмоджи. Точнее, используют seq2seq+attn с кондишенингом генерации ответа на конкретный символ эмоджи.
Учат три варианта диалоговой модели, отличия моделей такие: бейзлайн -- обычный seq2seq с вниманием, вторая модель -- СVAE, третья -- СVAE с REINFORCE обратной связью от предобученного классификатора эмоджи (с замороженными весами). По результатам -- СVAE всюду лучше бейзлайна, Reinforced CVAE обгоняет обычный CVAE на редких эмоджи, а на частных они работают примерно с одинаковым качеством. Отдельно делали человеческую оценку результатов, но результаты её приводят довольно странным образом. Но на приводимых cherry-picked примерах всё достаточно неплохо.
On Evaluation of Adversarial Perturbations for Sequence-to-Sequence Models
Paul Michel, Xian Li, Graham Neubig, Juan Miguel Pino
Language Technologies Institute, Carnegie Mellon University, Facebook AI
#NLP #NMT #adversarial #seq2seq #NAACL 2019
Статья: https://arxiv.org/abs/1903.06620
Код фреймворка: https://github.com/pmichel31415/teapot-nlp
Стандартный подход обучения на adversarial examples заключается в добавлении небольшого шума ко входу таким образом, чтобы вызвать неадекватные изменения выхода. Далее можно использовать такие примеры для более обучения более робастных моделей. Другими словами, можно учить сеть не слишком менять выход при небольших изменениях входа. Достаточно хорошо проработанный для изображений, этот подход в настоящее время активно переносят и на тексты. Здесь ключевым отличием является то, что для изображений можно легко генерировать слабый шум, не меняющий семантику, а для текстов как дискретных последовательностей это сложнее. Например, случайные замены букв выводят за пределы словаря, а случайные замены слов могут легко менять семантику.
Авторы статьи указывают на то, что в предшествующих работах по этой проблематике необходимость сохранения семантики при зашумлении входа в основном игнорировалась. Поэтому понятие adversarial examples они доопределяют (в контексте конкретной модели) как примеры изменения входа, сохраняющие семантику входа, но приводящие к изменению семантики выхода модели. В работе предлагается использовать поход к изменению входа с контролем сохранения семантики (на примере машинного перевода), авторы публикуют фреймворк для таких модификаций. Атака, т.е. поиск adversarial examples, проводится градиентным спуском с заменой одного слова входа на каждом шаге с сохранением семантики. Оптимизируется вероятность того, что модель ошибётся после замены.
Допустимые с точки зрения сохранения семантики замены описываются двумя стратегиями:
* kNN -- разрешается замена слова только на ближайшее из 10 в пространстве эмбеддингов,
* CharSwap -- разрешается перестановка букв, но только такая, которая гарантированно выводит из словаря (чтобы не попасть в слово с другой семантикой) -- для word-based моделей это приводит к замене слова на <unk>, если что.
Оценка успешности сохранения семантики осуществляется так:
* есть человеческая разметка (по шкале 0-5), она точнее, но дорогая и медленная, поэтому используется как способ контроля за автоматизированными метриками.
* в качестве автоматизированных метрик рассматривались BLEU, METEOR и chrF (based on character n-gram F-score)
Автоматизированные метрики оцениваются корреляцией с человеческой разметкой и, неожиданно, chrF вырывается вперёд, дальнейшие оценки приводятся в ней.
Сравниваются результаты для adversarial атак на разные NMT модели с/без ограничений на сохранение семантики. Понятно, что по chrF стратегия CharSwap будет давать наименьшую разницу входов по построению. Понятно также, что обе стратегии с ограничениями будут давать меньшую просадку в качестве выходов. Тем не менее, на основании этого выбирают CharSwap как лучшую стратегию, дальше работают с ней.
Затем показывают, что если доучивать NMT на примерах из CharSwap, то на стандартном тест-сете NMT-метрики (BLEU/charF) меняются незначительно, но на adversarial примерах из той же CharSwap, сюрприз, всё становится лучше.
Paul Michel, Xian Li, Graham Neubig, Juan Miguel Pino
Language Technologies Institute, Carnegie Mellon University, Facebook AI
#NLP #NMT #adversarial #seq2seq #NAACL 2019
Статья: https://arxiv.org/abs/1903.06620
Код фреймворка: https://github.com/pmichel31415/teapot-nlp
Стандартный подход обучения на adversarial examples заключается в добавлении небольшого шума ко входу таким образом, чтобы вызвать неадекватные изменения выхода. Далее можно использовать такие примеры для более обучения более робастных моделей. Другими словами, можно учить сеть не слишком менять выход при небольших изменениях входа. Достаточно хорошо проработанный для изображений, этот подход в настоящее время активно переносят и на тексты. Здесь ключевым отличием является то, что для изображений можно легко генерировать слабый шум, не меняющий семантику, а для текстов как дискретных последовательностей это сложнее. Например, случайные замены букв выводят за пределы словаря, а случайные замены слов могут легко менять семантику.
Авторы статьи указывают на то, что в предшествующих работах по этой проблематике необходимость сохранения семантики при зашумлении входа в основном игнорировалась. Поэтому понятие adversarial examples они доопределяют (в контексте конкретной модели) как примеры изменения входа, сохраняющие семантику входа, но приводящие к изменению семантики выхода модели. В работе предлагается использовать поход к изменению входа с контролем сохранения семантики (на примере машинного перевода), авторы публикуют фреймворк для таких модификаций. Атака, т.е. поиск adversarial examples, проводится градиентным спуском с заменой одного слова входа на каждом шаге с сохранением семантики. Оптимизируется вероятность того, что модель ошибётся после замены.
Допустимые с точки зрения сохранения семантики замены описываются двумя стратегиями:
* kNN -- разрешается замена слова только на ближайшее из 10 в пространстве эмбеддингов,
* CharSwap -- разрешается перестановка букв, но только такая, которая гарантированно выводит из словаря (чтобы не попасть в слово с другой семантикой) -- для word-based моделей это приводит к замене слова на <unk>, если что.
Оценка успешности сохранения семантики осуществляется так:
* есть человеческая разметка (по шкале 0-5), она точнее, но дорогая и медленная, поэтому используется как способ контроля за автоматизированными метриками.
* в качестве автоматизированных метрик рассматривались BLEU, METEOR и chrF (based on character n-gram F-score)
Автоматизированные метрики оцениваются корреляцией с человеческой разметкой и, неожиданно, chrF вырывается вперёд, дальнейшие оценки приводятся в ней.
Сравниваются результаты для adversarial атак на разные NMT модели с/без ограничений на сохранение семантики. Понятно, что по chrF стратегия CharSwap будет давать наименьшую разницу входов по построению. Понятно также, что обе стратегии с ограничениями будут давать меньшую просадку в качестве выходов. Тем не менее, на основании этого выбирают CharSwap как лучшую стратегию, дальше работают с ней.
Затем показывают, что если доучивать NMT на примерах из CharSwap, то на стандартном тест-сете NMT-метрики (BLEU/charF) меняются незначительно, но на adversarial примерах из той же CharSwap, сюрприз, всё становится лучше.
#Transformers #NLP #seq2seq #LM
Обнаружил, что за последний год развелось куча всяких модификаций трансформера, про которые я толком не знаю. В том числе -- Universal Transformer/Sparsed Transformer/Transformer-XL. Решил для себя разобраться, что там интересного произошло, делюсь заметками, которые по итогам получились.
1. Коротко про Transformer.
В целом, про него уже столько написано, что проще дать ссылок.
Оригинальная статья: https://arxiv.org/abs/1706.03762
Оригинальный код: https://github.com/tensorflow/tensor2tensor
Хороший разбор архитектуры: http://jalammar.github.io/illustrated-transformer/
Хороший разбор торчовой реализации: http://nlp.seas.harvard.edu/2018/04/03/attention.html
Но если коротко, то идея такая. Есть стандартная задача seq2seq, например, NMT. Известно, что RNN в целом имеют ограничения по применимости -- забывают контекст, тяжело и долго учатся и т.п.. Товарищи из Гугла в 2017 году придумали топологию, основаную только на FFNN и внимании, которая частично лишена этих недостатков.
Как устроен Трансформер: кодирующая часть состоит из стека энкодер-слоёв (топологически одинаковых, но с разными весами). Финальный стейт верхнего слоя энкодера отдаётся в декодирующую часть. Она, аналогично, есть стек декодерных слоёв. Один энкодерный слой устроен так:
* входом является набор эмбеддингов (у нижнего слоя это эмбеддинги слов, у следующих -- выход предыдущего слоя)
* выход по форме совпадает со входом
* есть два подслоя -- self-attention и за ним обычная FFNN
* мимо этих двух подслоёв есть residual connection
* self-attention смотрит на все слова входа сразу, поэтому общая длина входа сетки фиксирована, это важный момент. Вот как происходит обработка 1 входного слова:
- из входного эмбеддинга путём умножения на 3 обучаемые матрицы получаем 3 вектора (Query, Key, Value)
- сравнивая Query-вектор слова с Key-векторами всех слов входа, получаем веса внимания по этим другим словам.
- складываем их Value-вектора с весами внимания, полученный вектор и есть выход подслоя self-attention для данного слова
* multi-headed attention означает что вот эти все трюки с QKV мы параллельно независимо делаем несколько раз, это по задумке даёт сетке возможных выучить несколько разных взаимодополняющих механизмов внимания; тогда на выходе получаем несколько матриц по числу головок внимания; чтобы их смёржить, конкатенируем их и проекцируем обучаемой матрицей снова в рабочую размерность
* FFNN просто независимо обрабатывает вектор каждого из слов, полученный на выходе self-attention
* перед самым выходом делается LayerNorm
В такой схеме, однако, все позиции слов равнозначны и нет понимания, кто где стоял. Поэтому придумали к эмбеддингам входа добавлять (сложением, не конкатенацией) сигнал тайминга, условно это что-то вроде гармоник, устроенных так, что чем дальше два слова, тем меньший вес имеет произведение их позиционных сигналов. Интуиция в том, что близкие слова должны больше обращать внимания друг на друга. Этот сигнал позиции добавляется только на самом нижнем слое, дальше сетка сама решит, надо ли его пробрасывать.
Декодерный слой отличается от энкодера не очень сильно:
* есть дополнительный подслой внимания через такие же Query, Key, Value, но внимание это смотрит на выход верхнего энкодера (с любого из слоёв декодера) -- чтоб не сбиваться с мысли.
* декодеру запрещено смотреть вниманием на слова декодера справа, т.е. заглядывать в будущее. Это делается просто занулением весов внимания в нужных местах.
Наверху стека мы сворачиваем финальный стейт декодера в логиты, а из них делаем софтмаксом логпробы.
При обучении end2end оптимизируем кроссэнтропию с 1-hot векторами правильных слов.
Какие у этой конструкции важные свойства:
* быстро учится и применяется
* местами хорошо параллелится
* вход имеет фиксированную длину, дальше этой длины контекста у сети быть не может
* т.к. нет рекурсии и число операций фиксировано, то утверждается, что выразительная мощность ниже чем Turing Complete
Обнаружил, что за последний год развелось куча всяких модификаций трансформера, про которые я толком не знаю. В том числе -- Universal Transformer/Sparsed Transformer/Transformer-XL. Решил для себя разобраться, что там интересного произошло, делюсь заметками, которые по итогам получились.
1. Коротко про Transformer.
В целом, про него уже столько написано, что проще дать ссылок.
Оригинальная статья: https://arxiv.org/abs/1706.03762
Оригинальный код: https://github.com/tensorflow/tensor2tensor
Хороший разбор архитектуры: http://jalammar.github.io/illustrated-transformer/
Хороший разбор торчовой реализации: http://nlp.seas.harvard.edu/2018/04/03/attention.html
Но если коротко, то идея такая. Есть стандартная задача seq2seq, например, NMT. Известно, что RNN в целом имеют ограничения по применимости -- забывают контекст, тяжело и долго учатся и т.п.. Товарищи из Гугла в 2017 году придумали топологию, основаную только на FFNN и внимании, которая частично лишена этих недостатков.
Как устроен Трансформер: кодирующая часть состоит из стека энкодер-слоёв (топологически одинаковых, но с разными весами). Финальный стейт верхнего слоя энкодера отдаётся в декодирующую часть. Она, аналогично, есть стек декодерных слоёв. Один энкодерный слой устроен так:
* входом является набор эмбеддингов (у нижнего слоя это эмбеддинги слов, у следующих -- выход предыдущего слоя)
* выход по форме совпадает со входом
* есть два подслоя -- self-attention и за ним обычная FFNN
* мимо этих двух подслоёв есть residual connection
* self-attention смотрит на все слова входа сразу, поэтому общая длина входа сетки фиксирована, это важный момент. Вот как происходит обработка 1 входного слова:
- из входного эмбеддинга путём умножения на 3 обучаемые матрицы получаем 3 вектора (Query, Key, Value)
- сравнивая Query-вектор слова с Key-векторами всех слов входа, получаем веса внимания по этим другим словам.
- складываем их Value-вектора с весами внимания, полученный вектор и есть выход подслоя self-attention для данного слова
* multi-headed attention означает что вот эти все трюки с QKV мы параллельно независимо делаем несколько раз, это по задумке даёт сетке возможных выучить несколько разных взаимодополняющих механизмов внимания; тогда на выходе получаем несколько матриц по числу головок внимания; чтобы их смёржить, конкатенируем их и проекцируем обучаемой матрицей снова в рабочую размерность
* FFNN просто независимо обрабатывает вектор каждого из слов, полученный на выходе self-attention
* перед самым выходом делается LayerNorm
В такой схеме, однако, все позиции слов равнозначны и нет понимания, кто где стоял. Поэтому придумали к эмбеддингам входа добавлять (сложением, не конкатенацией) сигнал тайминга, условно это что-то вроде гармоник, устроенных так, что чем дальше два слова, тем меньший вес имеет произведение их позиционных сигналов. Интуиция в том, что близкие слова должны больше обращать внимания друг на друга. Этот сигнал позиции добавляется только на самом нижнем слое, дальше сетка сама решит, надо ли его пробрасывать.
Декодерный слой отличается от энкодера не очень сильно:
* есть дополнительный подслой внимания через такие же Query, Key, Value, но внимание это смотрит на выход верхнего энкодера (с любого из слоёв декодера) -- чтоб не сбиваться с мысли.
* декодеру запрещено смотреть вниманием на слова декодера справа, т.е. заглядывать в будущее. Это делается просто занулением весов внимания в нужных местах.
Наверху стека мы сворачиваем финальный стейт декодера в логиты, а из них делаем софтмаксом логпробы.
При обучении end2end оптимизируем кроссэнтропию с 1-hot векторами правильных слов.
Какие у этой конструкции важные свойства:
* быстро учится и применяется
* местами хорошо параллелится
* вход имеет фиксированную длину, дальше этой длины контекста у сети быть не может
* т.к. нет рекурсии и число операций фиксировано, то утверждается, что выразительная мощность ниже чем Turing Complete
2. Простые модификации Трансформера -- в основном, полученные усечением функциональности.
Из относительно интересных модификаций мне попались такие:
2.1. Non-Autoregressive Neural Machine Translation, Salesforce, конец 2017
Статья: https://arxiv.org/abs/1711.02281
Блогопост: https://blog.einstein.ai/fully-parallel-text-generation-for-neural-machine-translation/
Тут товарищи придумали параллелить генерацию выхода -- каждое слово выхода считается независимо, т.к. декодеры смотрят на немного переделанный вход сети, а не на то, что на прошлом шаге сгенерировали. В итоге выход генерируется за один проход, скорость растёт. Качество падает, но на их тестах не фатально.
2.2. Character-Level Language Modeling with Deeper Self-Attention, Гугл, лето 2018
Статья: https://arxiv.org/abs/1808.04444
Код: https://github.com/nadavbh12/Character-Level-Language-Modeling-with-Deeper-Self-Attention-pytorch
Грубо говоря, взяли от Трансформера только стек декодера, увеличили его глубину до 64 слоёв и сделали на его базе char based LM. Получили SOTA на ряде тестов (до этого SOTA были RNN модели)
2.3. Improving Language Understanding by Generative Pre-Training, OpenAI, лето 2018
Официальный пост про GPT-1: https://openai.com/blog/language-unsupervised/
Статья: https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf
Код: https://github.com/openai/finetune-transformer-lm
Товарищи из OpenAI тем же способом сделали свой GPT-1 aka OpenAI Transformer -- по сути своей это тоже же LM на базе декодерного стека от Трансформера, только word-based (и недавно нашумевшая GPT-2 относится сюда же, только она сильно больше размером + они поменяли схему нормализации и первичную инциализацию).
2.4 Masked BERT, Гугл, осень 2018
Подробный разбор: http://jalammar.github.io/illustrated-bert/
Если очень упрощать, то тут товарищи решили сделать bidirectional LM на базе Трансформера. Для этого они используют не декодер, а стек энкодеров, а слово под вопросом они маскируют во входной строке.
Из относительно интересных модификаций мне попались такие:
2.1. Non-Autoregressive Neural Machine Translation, Salesforce, конец 2017
Статья: https://arxiv.org/abs/1711.02281
Блогопост: https://blog.einstein.ai/fully-parallel-text-generation-for-neural-machine-translation/
Тут товарищи придумали параллелить генерацию выхода -- каждое слово выхода считается независимо, т.к. декодеры смотрят на немного переделанный вход сети, а не на то, что на прошлом шаге сгенерировали. В итоге выход генерируется за один проход, скорость растёт. Качество падает, но на их тестах не фатально.
2.2. Character-Level Language Modeling with Deeper Self-Attention, Гугл, лето 2018
Статья: https://arxiv.org/abs/1808.04444
Код: https://github.com/nadavbh12/Character-Level-Language-Modeling-with-Deeper-Self-Attention-pytorch
Грубо говоря, взяли от Трансформера только стек декодера, увеличили его глубину до 64 слоёв и сделали на его базе char based LM. Получили SOTA на ряде тестов (до этого SOTA были RNN модели)
2.3. Improving Language Understanding by Generative Pre-Training, OpenAI, лето 2018
Официальный пост про GPT-1: https://openai.com/blog/language-unsupervised/
Статья: https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf
Код: https://github.com/openai/finetune-transformer-lm
Товарищи из OpenAI тем же способом сделали свой GPT-1 aka OpenAI Transformer -- по сути своей это тоже же LM на базе декодерного стека от Трансформера, только word-based (и недавно нашумевшая GPT-2 относится сюда же, только она сильно больше размером + они поменяли схему нормализации и первичную инциализацию).
2.4 Masked BERT, Гугл, осень 2018
Подробный разбор: http://jalammar.github.io/illustrated-bert/
Если очень упрощать, то тут товарищи решили сделать bidirectional LM на базе Трансформера. Для этого они используют не декодер, а стек энкодеров, а слово под вопросом они маскируют во входной строке.
👍1
3. Сложные модификации Трансформера -- борьба с ограничениями.
Базовых ограничений у Трансформера несколько:
* не может быть контекста длиннее длины входа
* тяжело увеличивать длину входа (attention это квадрат от входа по сложности)
* не Turing Complete
Соответственно, последние полгода народ активно работает над снятием этих ограничений. Тут мне попались такие штуки:
3.1. Universal Transformers, Google, написан в прошлом году, попал на ICLR2019
Статья: https://arxiv.org/abs/1807.03819
Блогопост: https://ai.googleblog.com/2018/08/moving-beyond-translation-with.html
Свежий разбор: http://mostafadehghani.com/2019/05/05/universal-transformers/
Мотивация -- трасформеры не Turing Complete и у трасформеров нет Recurrent Inductive Bias, а оно, говорят, очень полезно для генерализации структуры.
Давайте сделаем реккурентную сеть поверх трансформерной ячейки.
Ячейка -- один энкодерный слой из трансформера, на каждом такте она обрабатывает все входы и выдаёт самой себе выход на следующий шаг.
При этом надо как-то понять когда остановиться -- делаем вычисляемый признак остановки -- отдельный для каждой позиции входа.
Такая конструкция называется Adaptive universal transformer (идея adaptive остновки взята из аналогичных более старых работ про RNN).
Если для какой-то позиции случалась остановка -- стейт этой позиции замораживаем и копируем дальше на входы внимания другим словам на более поздних итерациях.
Утверждается, что UT существенно более эффективен, чем обычный Трансформер на задачах, где мало входных данных.
3.2. Transformer-XL, начало 2019, Google Brain + CMU
Статья: https://arxiv.org/abs/1901.02860
Разбор: https://towardsdatascience.com/transformer-xl-explained-combining-transformers-and-rnns-into-a-state-of-the-art-language-model-c0cfe9e5a924
Боремся с проблемой фиксированной длины входа. Transformer-XL это модификация LM over vanilla Transformer, позволяющая откусить больше, чем в рот помещается. Полезная для понимания схема -- ниже.
Логика простая:
* Пусть у нас есть допустимый вход длины Х. И входное предложение длины Y>X.
* Порежем входное предложение на куски длины Х.
* Первый кусок пропустим как обычно, но будем сохранять промежуточные стейты.
* Дальше будем обрабатывать следующий кусок, плюс подавать на вход ещё и стейты с предыдущего куска (и запоминать новые).
Такая схема позволяет, сохраняя историю стейтов равную высоте стэка, имитировать длинное окно входа. Это не совсем честно, т.к. градиент на прошлый кусок уже не уйдёт, но всё равно не так плохо. Есть ещё одна загвоздка -- в оригинальном Трансформере у нас есть абсолютное позиционное кодирование. Здесь вместо него предлагается использовать относительное: при расчёте внимания со слова в позиции А на слово в позиции В считать вес внимания отдельно по совпадению Query/Key (без позиционного сигнала) + часть веса добавлять как функицю от разности (В-А). И такую конструкцию, в отличие от оригинального Трансформера, следует делать на каждом слое сети.
Показано, что такой подход даёт SOTA на задачах, где нужно держать длинный контекст.
Базовых ограничений у Трансформера несколько:
* не может быть контекста длиннее длины входа
* тяжело увеличивать длину входа (attention это квадрат от входа по сложности)
* не Turing Complete
Соответственно, последние полгода народ активно работает над снятием этих ограничений. Тут мне попались такие штуки:
3.1. Universal Transformers, Google, написан в прошлом году, попал на ICLR2019
Статья: https://arxiv.org/abs/1807.03819
Блогопост: https://ai.googleblog.com/2018/08/moving-beyond-translation-with.html
Свежий разбор: http://mostafadehghani.com/2019/05/05/universal-transformers/
Мотивация -- трасформеры не Turing Complete и у трасформеров нет Recurrent Inductive Bias, а оно, говорят, очень полезно для генерализации структуры.
Давайте сделаем реккурентную сеть поверх трансформерной ячейки.
Ячейка -- один энкодерный слой из трансформера, на каждом такте она обрабатывает все входы и выдаёт самой себе выход на следующий шаг.
При этом надо как-то понять когда остановиться -- делаем вычисляемый признак остановки -- отдельный для каждой позиции входа.
Такая конструкция называется Adaptive universal transformer (идея adaptive остновки взята из аналогичных более старых работ про RNN).
Если для какой-то позиции случалась остановка -- стейт этой позиции замораживаем и копируем дальше на входы внимания другим словам на более поздних итерациях.
Утверждается, что UT существенно более эффективен, чем обычный Трансформер на задачах, где мало входных данных.
3.2. Transformer-XL, начало 2019, Google Brain + CMU
Статья: https://arxiv.org/abs/1901.02860
Разбор: https://towardsdatascience.com/transformer-xl-explained-combining-transformers-and-rnns-into-a-state-of-the-art-language-model-c0cfe9e5a924
Боремся с проблемой фиксированной длины входа. Transformer-XL это модификация LM over vanilla Transformer, позволяющая откусить больше, чем в рот помещается. Полезная для понимания схема -- ниже.
Логика простая:
* Пусть у нас есть допустимый вход длины Х. И входное предложение длины Y>X.
* Порежем входное предложение на куски длины Х.
* Первый кусок пропустим как обычно, но будем сохранять промежуточные стейты.
* Дальше будем обрабатывать следующий кусок, плюс подавать на вход ещё и стейты с предыдущего куска (и запоминать новые).
Такая схема позволяет, сохраняя историю стейтов равную высоте стэка, имитировать длинное окно входа. Это не совсем честно, т.к. градиент на прошлый кусок уже не уйдёт, но всё равно не так плохо. Есть ещё одна загвоздка -- в оригинальном Трансформере у нас есть абсолютное позиционное кодирование. Здесь вместо него предлагается использовать относительное: при расчёте внимания со слова в позиции А на слово в позиции В считать вес внимания отдельно по совпадению Query/Key (без позиционного сигнала) + часть веса добавлять как функицю от разности (В-А). И такую конструкцию, в отличие от оригинального Трансформера, следует делать на каждом слое сети.
Показано, что такой подход даёт SOTA на задачах, где нужно держать длинный контекст.
🔥1