Size: a a a

gonzo-обзоры ML статей

2019 March 25
gonzo-обзоры ML статей
CIFAR-10
источник
gonzo-обзоры ML статей
CIFAR-100
источник
gonzo-обзоры ML статей
CIFAR-100
источник
gonzo-обзоры ML статей
источник
2019 March 29
gonzo-обзоры ML статей
Как известно, большая часть уловок в современном 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 примерах всё достаточно неплохо.
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
2019 April 14
gonzo-обзоры ML статей
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, сюрприз, всё становится лучше.
источник
gonzo-обзоры ML статей
выбираем chrF как наиболее согласованную с разметкой
источник
gonzo-обзоры ML статей
выбираем CharSwap как лучшую по chrF
источник
gonzo-обзоры ML статей
оцениваем результаты дообучения на adversarial примерах из CharSwap
источник
2019 May 08
gonzo-обзоры ML статей
#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
источник
gonzo-обзоры ML статей
схема Трансформера
источник
gonzo-обзоры ML статей
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 на базе Трансформера. Для этого они используют не декодер, а стек энкодеров, а слово под вопросом они маскируют во входной строке.
источник
gonzo-обзоры ML статей
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 на задачах, где нужно держать длинный контекст.
источник
gonzo-обзоры ML статей
схема нарезки входа Transformer-XL
источник
gonzo-обзоры ML статей
факторизация внимания в Sparced Transformer
источник
gonzo-обзоры ML статей
3.3. Sparse Transformer, 2019 april, OpenAI
Блогопост: https://openai.com/blog/sparse-transformer/
Статья: https://arxiv.org/abs/1904.10509
Код: https://github.com/openai/sparse_attention

Модификация механизма внимания, позволяющая увеличить длину входа. На self-reported тестах более эффективен чем Transformer-XL

При высчислении обычного внимания сложность вычислений Х^2, где Х -- длина входа, т.к. мы считаем внимание с каждого элемента на каждый. Другими словами, внимание это квадратная симметричная матрица. Оказывается, если долго смотреть на эти матрицы, можно узреть паттерны -- часто возникающие схемы внимания, которые сильно проще чем Х^2 и легко факторизуются. Это позволяет считать внимание не по всем элементам, а по небольшому подмножеству, перейдя от Х^2 почти к О(Х). Авторы предлагают две простые факторизации внимания -- strided и fixed. Как следствие это позволяет сильно увеличить размер окна -- обрабатывать Трансформером сырой звук и картинки, что раньше не делали именно из-за того, что в него сложно впихнуть что-то длинное. На текстах они сделали какой-то один SOTA замер, надо последить, что дальше будет.
Поясняющую картинку см выше.

На этом у меня пока всё.
Если что-то важное забыл, пишите в личку, @altsoph.@altsoph.
источник