Size: a a a

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

2019 June 24
gonzo-обзоры ML статей
The Curious Case of Neural Text Degeneration
Ari Holtzman, Jan Buys, Maxwell Forbes, Yejin Choi
University of Washington, Allen Institute for Artificial Intelligence

#NLP #LM #sampling #beamsearch

Статья: https://arxiv.org/abs/1904.09751

Простенькая статья, которой, однако, давно не хватало. Аккуратно разбирают различные стратегии сэмплинга уже обученной LM. Противопоставляют open-ended сэмплинг (открытый сэмплинг, например, в GPT-2) и non-open-ended — когда сэмплинг имеет фиксированную цель (например, в NMT).

Дают красивое объяснение, почему open-ended сэмплинг обычно вырождается в повторение в случае использования beamseach стратегии — с каждым повторением вероятность следующего повторения растёт, образуется петля положительной обратной связи, соответственно, бимсёрч идёт по полю с воронками и так или иначе куда-то сваливается.

Кроме того, анализ частот n-gram показывает, что в реальной речи гораздо больше "чёрных лебедей", чем даёт сэмплинг по максимизации правдоподобия, а beamsearch даёт ровную высоковероятную картину.

С другой стороны, сэмплить из всего словаря с вероятностью, предсказанной моделью тоже не очень хорошо: в хвосте слова с эпсилон-вероятностями, но их много, и суммарно они дают высокую вероятность насэмплить полной фигни, по оценке авторов обычно эта вероятность около 30%, поэтому на 20 шагах вероятность зачерпнуть из хвоста 0.9996, в результате чего мы наблюдаем мусор, сломанную грамматику и т.п..

Далее рассматриваются разные способы, улучшающие ситуацию — температура, сэмплинг из top-K слов, а также предлагается несложный способ (Nucleus (Top-p) Sampling) адаптивно выбирать топ для сэмплинга по суммарной вероятности. Показывают, что такой способ даёт наиболее похожие на человеческие частоты n-gram.
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
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.
источник
gonzo-обзоры ML статей
источник
2019 July 29
gonzo-обзоры ML статей
источник
2019 August 01
gonzo-обзоры ML статей
Обновил немного пост про RoBERTa, добавил чуток про ERNIE 2.0 и SpanBERT для контекста
источник
2019 September 22
gonzo-обзоры ML статей
Neural Text [de]Generation with Unlikelihood Training
Sean Welleck, Ilia Kulikov, Stephen Roller, Emily Dinan, Kyunghyun Cho, Jason Weston
NYU, FAIR

#NLP #LM #sampling #degeneration

Статья, родной код.

TLDR: Давайте вместо костыльных фильтров при сэмплинге из LM добавим штрафы за повторения при обучении этой LM, тогда даже небольшое доучивание с такими штрафами отучит сетку от повторений и сделает генерируемый текст более правдоподобным.

Подробнее:
Вырождение текста в повторяющиеся последовательности при open-ended сэмплинге -- общая проблема. Решать её костылями, вроде nucleus sampling, можно, но не очень эффективно, т.к. проблема в самом векторе вероятностей, возвращаемом моделью. По мнению авторов, корень проблемы — в недостаточно хорошем таргете обучения (максимизации правдоподобия следующего токена).
Авторы предлагают добавить дополнительный таргет обучения, unlikelihood training, уменьшающий вероятность появления "плохих для контекста" токенов.
Конкретнее, авторы предлагают добавить две цели обучения:

TOKEN LEVEL OBJECTIVE -- добавляем loss за предсказание каких-либо токенов, появлявшихся ранее (кроме случая, когда текущий ground truth токен действительно появлялся ранее).
SEQUENCE LEVEL OBJECTIVE -- сэмплим запись до конца, потом для каждого токена выясняем, был ли он частью повторной ngram-ы, если да -- штрафуем все такие токены на каждом из шагов.

Эксперименты показывают, что достаточно небольшого количества шагов по этим дополнительным таргетам, чтобы затюнить готовую LM до состояния, когда она перестаёт генерировать повторения, при этом потери в perplexity будут небольшими, а по асессорской оценке тексты окажутся лучше (по human evaluation обе попавки побеждают бейзлайн, а их совместное использование -- лучше каждой в отдельности).
источник
gonzo-обзоры ML статей
источник
2019 September 23
gonzo-обзоры ML статей
Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
Nils Reimers and Iryna Gurevych
Technische Universitat Darmstadt

#EMNLP2019 #BERT #siamese #sentenceembeddings

Статья: https://arxiv.org/abs/1908.10084
Код: https://github.com/UKPLab/sentence-transformers

При решении с помощью BERT-а (и других трансформеров) классификационных задач на парах предложений, например, semantic similarity или entailment, приходится подавать оба предложения вместе на вход. Расчётная сложность при этом растёт как квадрат от числа входных токенов, поэтому для задач типа массивных кластеризаций такой подход не годится. Удобнее разово построить sentence embeddings для предложений по одному, а потом уже над парами таких эмбеддингов делать классификатор или считать расстояние, такой способ сильно более эффективен.

Традиционно, в таких случаях применяется усреднение пословных эмбеддингов для получения эмбеддинга предложения. Другой известный подход -- использовать финальный эмбеддинг на специальном токене (CLS) в качестве эмбеддинга всего предложения. Так или иначе, на практике, на обычном BERT-е это работает не очень хорошо.

Авторы предлагают доучить сеть с помощью известных подходов: siamese и triplet networks. А именно: используя предобученный BERT делают двойную или тройную сеть с общими весами, получают эмбеддинг каждого предложения, и строят softmax-классификатор поверх конкатенации этих эмбеддингов (+возможно, простых функций от них). Учат на парах похожих предложений или на тройках с положительным и отрицательным примерами. В режиме использования просто считают cosine similarity между эмбеддингами.

Сравниваются со всевозможнымии эмбеддингами до кучи, как с довольно старыми типа GloVe и USE, так и с BERT-based (но без доучивания). Показывают, что даже доучивание на немного другой задаче (учились на SNLI-датасете, где разметка на логическое вытекание/противоречие, а проверялись потом на задаче семантической схожести) даёт почти столько же, сколько доучивание на целевой задаче, и это даёт почти везде лучшее качество, чем в бейзлайных.

Много сравнений на разных датасетах с разными sentence эмбеддингами по качеству и скорости, а также ablation study на тему того, какой пулинг использовать и что давать на вход финальному классификатору при обучении. В итоге, почти на всех тестах победили основных практических конкурентов InferSent и USE по качеству, а с помощью хака "smart batching" (группировки в батч предложений с похожей длиной) обошли и по скорости.
источник
gonzo-обзоры ML статей
источник
2019 September 30
gonzo-обзоры ML статей
Написал тут большой пост про ускорение BERT'а

https://blog.inten.to/speeding-up-bert-5528e18bb4ea
источник
2019 October 05
gonzo-обзоры ML статей
Астрологи объявили неделю дистилляции.

Следите за обновлениями.
источник
gonzo-обзоры ML статей
В последнее время особенно набирает обороты тема с дистилляцией. Двусмысленно получилось… Ну да ладно…

BERT оказался хорошим примером сильной модели, которую хочется использовать везде, но не везде можно, так как она тяжёлая, не на все устройства влезает и инференс на ней довольно долгий, что опять же ограничивает применение.

Направление сжатия и ускорения моделей сильно актуально и дистилляция оказалась одним из хороших вариантов этого добиться.
источник
gonzo-обзоры ML статей
Итак, первый лот:

DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter
Victor Sanh, Lysandre Debut, Julien Chaumond, Thomas Wolf
Статья: https://arxiv.org/abs/1910.01108

Эту модель все уже давно знают по посту от Hugging Face (https://medium.com/huggingface/distilbert-8cf3380435b5) и по их же реализации в библиотеке transformers (бывшая pytorch-transformers, которая теперь стала достаточно универсальной, чтобы обеспечить interoperability моделей между как раз только что вышедшим TF 2.0 и PyTorch), тоже на днях вместе с переименованием обновившейся до версии 2.0.0 (https://github.com/huggingface/transformers/releases). Кажется, это самая популярная быблиотека, сожержащая наиболее популярные предобученные модели на трансформерах (https://github.com/huggingface/transformers#model-architectures).

В предверии NeuralIPS 2019 вышла наконец и статья на arxiv.

Собственно DistilBERT — это дистиллированный BERT, примерно на 40% меньший по размеру, на 60% более быстрый и сохраняющий 97% качества оригинального BERT’а (BERT-base на самом деле).

Идея дистиллирования весьма проста. Давайте обучим более простую модель (ученика), воспроизводящую поведение более сложной модели (учителя).

Модель-студент в DistilBERT — это модель, где слоёв в два раза меньше, а их размерность остаётся прежней (типа, все BLAS вычисления настолько оптимизированы, что это слабо влияет). Слои студента инициализируются весами из модели-учителя.

В случае DistilBERT мы воспроизводим финальное распределение вероятностей после softmax в задаче masked language modeling (MLM).

Функция потерь — это комбинация обычного MLM loss с новым кросс-энтропийным лоссом, штрафующим за непохожесть предсказаний ученика на предсказания учителя. Также добавляется косинусный лосс на эмбеддинги, чтобы вектора скрытых состояний обеих моделей смотрели в одинаковых направлениях.

Кроме того в DistilBERT применены улучшения из недавней RoBERTa: обучение на больших батчах (4К), динамические маски и отсутствие Next Sentence Prediction (NSP) задачи.

Обучали DistilBERT на том же датасете, что и BERT. 90 часов на 8xV100 (16Gb) против 1 дня на 1024xV100 (32 Gb) в случае обучения RoBERT’ы.

Дистиллировали только предобучение. Отдельным экспериментом попробовали сделать дополнительное дистиллирование для fine-tuning под SQuAD, оказалось ещё получше.

В целом результат достойный, работает хорошо, времени требует меньше (и на обучении, и на инференсе). Пробовали даже загонять модель в iPhone 7 Plus, этот код живёт тут: https://github.com/huggingface/swift-coreml-transformers.
источник
gonzo-обзоры ML статей
Место DistilBERT в пантеоне
источник
gonzo-обзоры ML статей
Результаты DistilBERT
источник
2019 October 07
gonzo-обзоры ML статей
Лот #2

TinyBERT: Distilling BERT for Natural Language Understanding
Xiaoqi Jiao, Yichun Yin, Lifeng Shang, Xin Jiang, Xiao Chen, Linlin Li, Fang Wang, Qun Liu
Статья: https://arxiv.org/abs/1909.10351

Статья от команды из Huawei про более продвинутую дистилляцию BERT’а (здесь тоже используют BERT-base) по сравнению с DistilBERT. Засабмичена на ICLR 2020. Код вроде пока не выложен, но обещан.

DistilBERT использовал распределение вероятностей предсказывамых классов плюс косинусный лосс на вектора скрытых состояний, но в модели есть много чего ещё интересного. Например, различные исследования показывают, что веса внимания содержат в себе важную лингвистическую информацию, так что было бы неплохо их тоже учитывать в модели-студенте. TinyBERT делает этот (и другие) шаги. Новый метод называется дистилляцией трансформера (transformer distillation).

Transformer distillation подразумевает, что и модель учитель, и модель студент являются трансформерами. В учителе N слоёв, в студенте меньшее M, вводится функция маппинга слоёв студента на слои учителя (могут быть разные стратегии выбора слоёв для дистилляции). Вес лосса за каждый из слоёв студента также является гиперпараметром (можно взвешивать неодинаково).

Собственно дистилляция слоя трансформера включает дистилляцию матриц внимания (по MSE) и дистилялцию скрытых состояний (тоже MSE, но с линейным преобразованием, так как размер скрытых слоёв студента может быть меньше). В последнюю включаются также дистилляция эмбеддинг слоя (входной, лосс аналогичен скрытым слоям) и слоя предсказаний (выходной, кросс-энтропийный лосс). Слой предсказаний дистиллируется после предыдущих слоёв.

В работе предложен двухстадийный фреймворк, включающий общую дистилляцию (general distillation) и задаче-специфичную дистилляцию (task-specific distillation). На первой стадии авторы дистиллируют обычный предобученный BERT без файн-тюнинга (он получается довольно посредственным относительно оригинального BERT’а), На второй стадии проводится аугментация данных (с помощью BERT’а все слова в предложении заменяются на других предсказанных кандидатов, а в случае слов, состоящих из нескольких sub-word pieces, делают замену на близкие по косинусу из GloVe) и студент обучается под конкретную задачу вместе с дистилляцией файнтюненного BERT’а. После второго этапа получаем лёгкую модель хорошего качества под конкретную задачу.

В экспериментах TinyBERT даёт качество выше DistilBERT даже в случае более лёгких моделей.

На GLUE получают сравнимую с BERT’ом модель в 7.5 раз меньшую и в 9.4 раз более быструю на инференсе.

Кажется, хороший вариант, чтобы попробовать в тех местах, где уже пробуют DistilBERT.
источник
gonzo-обзоры ML статей
Сравнение с другими методами дистилляции
источник
gonzo-обзоры ML статей
Transformer Distillation
источник
gonzo-обзоры ML статей
Двухэтапная процедура обучения TinyBERT
источник