В последнее время особенно набирает обороты тема с дистилляцией. Двусмысленно получилось… Ну да ладно…
BERT оказался хорошим примером сильной модели, которую хочется использовать везде, но не везде можно, так как она тяжёлая, не на все устройства влезает и инференс на ней довольно долгий, что опять же ограничивает применение.
Направление сжатия и ускорения моделей сильно актуально и дистилляция оказалась одним из хороших вариантов этого добиться.
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, 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.
arXiv.org
DistilBERT, a distilled version of BERT: smaller, faster, cheaper...
As Transfer Learning from large-scale pre-trained models becomes more prevalent in Natural Language Processing (NLP), operating these large models in on-the-edge and/or under constrained...
Лот #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.
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.
arXiv.org
TinyBERT: Distilling BERT for Natural Language Understanding
Language model pre-training, such as BERT, has significantly improved the performances of many natural language processing tasks. However, pre-trained language models are usually computationally...
Другие известные дистилляции 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.
(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.
Ну и дистилляция дистилляцией, но не забывайте, что появился ещё и весьма качественный ALBERT (тоже на ICLR 2020), который существенно легче оригинального BERT'а, но по качеству круче RoBERT'ы. И его по идее тоже можно отдистиллировать :)
Про ALBERT уже было тут: https://moocaholic.medium.com/speeding-up-bert-5528e18bb4ea
Про ALBERT уже было тут: https://moocaholic.medium.com/speeding-up-bert-5528e18bb4ea
Medium
Speeding up BERT
How to make BERT models faster
Дистилляция: матчасть
Пора немного поговорить про истоки дистилляции и её суть.
В целом, как уже было описано, идея дистилляции подразумевает обучение более лёгкой модели-ученика, воспроизводящей поведение более сложной и тяжёлой модели-учителя.
Пора немного поговорить про истоки дистилляции и её суть.
В целом, как уже было описано, идея дистилляции подразумевает обучение более лёгкой модели-ученика, воспроизводящей поведение более сложной и тяжёлой модели-учителя.
Одной из ранних работ, на которую принято ссылаться, является:
Model Compression
Rich Caruana, Cristian Bucila, Alexandru Niculescu-Mizil
https://www.cs.cornell.edu/~caruana/compression.kdd06.pdf
Это ещё не дистилляция в привычном смысле, но предтеча. В работе авторы пользуются тем, что нейросети — это универсальный аппроксиматор, и заменяют большой сложный ансамбль (не чисто нейросетевой) на маленькие быстрые модели, в качестве которых выступают нейросети. Здесь не симулируется поведение сложной модели напрямую. Вместо этого ансамбль используется для разметки большого количества новых неразмеченных данных, а потом на этом новом датасете обучается небольшая полносвязная нейросеть. Возможно, получается в каком-то смысле защита от оверфиттинга, если изначальный датасет был небольшим.
Поскольку неразмеченный датасет не всегда есть, авторы придумали метод (MUNGE) создания такого датасета (псевдо трейн сет), который лучше рандомного сэмплинга атрибутов или naive Bayes estimation.
В итоге на автоматически размеченных реальных или псевдо данных обучают нейросеть и получают сокращение размера модели и ускорение до 1000 раз, при этом не сильно теряя в качестве.
Model Compression
Rich Caruana, Cristian Bucila, Alexandru Niculescu-Mizil
https://www.cs.cornell.edu/~caruana/compression.kdd06.pdf
Это ещё не дистилляция в привычном смысле, но предтеча. В работе авторы пользуются тем, что нейросети — это универсальный аппроксиматор, и заменяют большой сложный ансамбль (не чисто нейросетевой) на маленькие быстрые модели, в качестве которых выступают нейросети. Здесь не симулируется поведение сложной модели напрямую. Вместо этого ансамбль используется для разметки большого количества новых неразмеченных данных, а потом на этом новом датасете обучается небольшая полносвязная нейросеть. Возможно, получается в каком-то смысле защита от оверфиттинга, если изначальный датасет был небольшим.
Поскольку неразмеченный датасет не всегда есть, авторы придумали метод (MUNGE) создания такого датасета (псевдо трейн сет), который лучше рандомного сэмплинга атрибутов или naive Bayes estimation.
В итоге на автоматически размеченных реальных или псевдо данных обучают нейросеть и получают сокращение размера модели и ускорение до 1000 раз, при этом не сильно теряя в качестве.