«Мы протестировали Bort на 23 задачах NLU, и на 20 из них он улучшил производительность BERT - на 31% в одном случае, хотя он на 16% больше и примерно в 20 раз быстрее». - Адриан де Винтер

Цель данной статьи - показать, как преодолеть несколько проблем, с которыми вы столкнетесь при попытке запустить Bort в популярной и удобной среде Simple Transformers . Эта среда построена на основе Hugging Face Transformers.

Борт

Сначала вы создаете то, что хорошо работает, а затем оптимизируете это.

Bort оптимизирует BERT. Обратите внимание, что я использую заглавные буквы, используемые в исходных статьях о Bort, а не BORT. Чтобы узнать больше о Bort, я предлагаю начать с « Версия языковой модели BERT, которая в 20 раз быстрее » Адриана де Винтера.

Мой личный интерес заключается в следующем: мне нужна лучшая языковая модель, которая может работать на моем скромном 8-гигабайтном графическом процессоре. BERT-large и RoBERTa-large требуют больше памяти, поэтому они не работают. Bort намного меньше, но обещает аналогичную производительность, поэтому я очень хотел попробовать.

Исходный код для Bort с открытым исходным кодом доступен на github с октября 2020 года. Инструкции по началу работы ясны, но, как признает автор: Bort требует довольно необычной среды для запуска. .

Борт в среде Simple Transformers

Чтобы использовать Bort в качестве модели с моим существующим кодом, я хотел заставить его работать в среде Простые преобразователи Thilina Rajapakse. Stefan Schweter уже проделал большую работу, чтобы это стало возможным. Его пул-реквест для Bort был передан в основную ветку Hugging Face Transformers 27 января. Он должен быть частью Transformers начиная с версии 4.3.0 и доступен как тип модели bert и название модели amazon / bort.

На момент написания эта версия Transformers еще не была выпущена, поэтому давайте установим ее из основной ветки.

… И установите Простые трансформеры:

Легкий. Но есть одна загвоздка. Рассмотрим классификацию. Обычно мы инициализируем ClassificationModel в Simple Transformers, используя Bort, например:

Это дает нам модель, но она не работает из-за того, что не вызывается правильный токенизатор.

Объединение типа модели и токенизатора

Реализация Hugging Face определяет Bort как просто еще один экземпляр BERT и предлагает использовать существующий токенизатор RoBERTa. Это элегантно, потому что не было создано никаких новых типов объектов, которые функционально не отличались бы от существующих.

Однако это вызывает у нас небольшие проблемы с Простыми преобразователями. Там, в различных классах, определяющих задачи, таких как ClassificationModel, конфигурация, класс модели и токенизатор определяются вместе и идентифицируются через тип модели. Поскольку тип модели для Bort - «bert», мы получим BertTokenizer для нашей модели Bort, а не необходимый RobertaTokenizer .

К счастью, Simple Transformers готов разрешить эту ситуацию! При инициализации ClassificationModel мы можем передать следующие параметры:

tokenizer_type: используемый тип токенизатора (auto, bert, xlnet, xlm, roberta, distilbert и т. д.). Если передана строка, Simple Transformers попытается инициализировать класс токенизатора из доступного MODEL_CLASSES. В качестве альтернативы можно передать класс Tokenizer (унаследованный от PreTrainedTokenizer).

tokenizer_name: имя / путь к токенизатору. Если tokenizer_type не указан, model_type будет использоваться для определения типа токенизатора.

Что это значит для Bort? Теперь мы можем определить использование токенизатора RoBERTa с типом модели BERT:

Это работает!

Но только для ClassificationModel. Для других моделей, например MultiLabelClassificationModel, ключевые слова tokenizer_type и tokenizer_name недоступны.

Для начала, если вы хотите реализовать это самостоятельно для других классов моделей - в конце концов, вы очень нетерпеливы! - ниже приведен соответствующий код из ClassificationModel. Вы можете перенести его на другие классы модели, а затем установить Simple Transformers из измененного исходного кода.

С учетом вышесказанного я мог бы использовать Bort с моим существующим кодом, основанным на Простых преобразователях. Хороший!

Тем не мение…

Bort требует особого алгоритма тонкой настройки, называемого Agora, исходный код которого, к сожалению, еще не открыт. Было бы очень полезно для сообщества, если бы кто-то попытался реализовать алгоритм, чтобы заставить работать тонкую настройку Bort.

Что это означает на практике? Это означает, что точная настройка Bort в настоящее время даст вам результаты на несколько худшем уровне, чем BERT. Улучшения производительности, которые возможны с помощью Bort, появятся только тогда, когда будет доступен алгоритм точной настройки. Я с нетерпением жду этого!