gonzo-обзоры ML статей – Telegram
gonzo-обзоры ML статей
24.1K subscribers
2.72K photos
2 videos
3 files
1.34K links
Авторы:
Гриша Сапунов, ранее руководитель разработки Яндекс-Новостей, ныне CTO Intento. Области интересов: AI/ML/DL, биоинформатика.
Лёша Тихонов, ранее аналитик в Яндексе, автор Автопоэта, Нейронной Обороны... Области интересов: discrete domain, NLP, RL.
Download Telegram
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.
👍1
Обновил немного пост про RoBERTa, добавил чуток про ERNIE 2.0 и SpanBERT для контекста
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 обе попавки побеждают бейзлайн, а их совместное использование -- лучше каждой в отдельности).
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" (группировки в батч предложений с похожей длиной) обошли и по скорости.
Астрологи объявили неделю дистилляции.

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

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

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

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.
Место DistilBERT в пантеоне
Результаты DistilBERT
Лот #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.
Сравнение с другими методами дистилляции
Transformer Distillation
Двухэтапная процедура обучения TinyBERT
Сравнения по качеству, скорости и размерам
Другие известные дистилляции BERT’а

(2019/03) “Distilling Task-Specific Knowledge from BERT into Simple Neural Networks”
Статья: https://arxiv.org/abs/1903.12136

В работе BERT дистиллируется в однослойную BiLSTM, получают результат сравнимый с EMLo при стократно меньшем числе параметров и в 15 раз меньшем времени инференса.

Как видно из таблицы в предыдущем посте, и DistilBERT, и TinyBERT этот результат бьют по качеству, хотя коэффициенты и сжатия, и ускорения здесь вроде выше.

(2019/08) “Patient Knowledge Distillation for BERT Model Compression”
Статья: https://arxiv.org/abs/1908.09355
Код: https://github.com/intersun/PKD-for-BERT-Model-Compression

Предложили метод под названием Patient Knowledge Distillation, который претендует на то что был первым (или среди первых), кто стал использовать при дистилляции не только выходное распределение, но и скрытые состояния учителя. Причём, ученик, похоже пытается имитировать только репрезентации для [CLS] токена.

Опять же в предыдущем посте есть сравнение и с ним, он получше DistilBERT, но слабее TinyBERT. Есть разные вариации по размеру (3 и 6), на 3-слойной ускорение около 4 раз относительно 12-слойной BERT-base.

(2019/09)“Extreme Language Model Compression with Optimal Subwords and Shared Projections”
Статья: https://arxiv.org/abs/1909.11687

Свежая статья из Гугла, засабмичена на ICLR 2020. Акцентировались на сокращении словаря, эмбеддинги которого занимают много места. Плюс также сокращают и размер скрытых состояний. Придумали метод дуального обучения, когда учитель одновременно с учеником пытается выучить сокращённый словарь. Если я не ошибаюсь, другие подходы не подразумевали, что учителя тоже надо обучать.

Сжали BERT-base в 60 раз, получили модель размером под 7Мб. Круто для мобильного. Тоже пробовали разные по размеру варианты, на самом разумном (среднем) с эмбеддингнами размером 96 сжатие получают под 20 раз (модель 22Мб), сокращение количества вычислений под 75 раз. По качеству результаты слабее TinyBERT.
Результаты BiLSTM_soft