MobileBERT

BERT является массивной моделью, требующей значительных ресурсов, как для обучения, так и для конечного распознавания. Естественно, как и в случае с другими моделями сразу же возникла идея пожертвовать небольшой эффективностью с целью значительного увеличения быстродействия и возможности использования на устройствах с меньшими ресурсами. Т.е. сделать «урезанные» версии модели, к которым относятся TinyBERT и MobileBERT.

Теоретическую информацию о MobileBERT  можно найти в работе:

https://www.aclweb.org/anthology/2020.acl-main.195.pdf

Авторы тестируют MobileBERT на задачах General Language Understanding Evaluation (GLUE) (см. работу Alex Wang, Amanpreet Singh, Julian Michael, Felix Hill, Omer Levy, and Samuel R Bowman. 2018. Glue: A multi-task benchmark and analysis platform for natural language understanding. arXiv preprint arXiv:1804.07461.) и обнаружили, что для данных задач эта модель даже лучше базовой модели BERT

То же самое относится и к задаче SQuAD.

Авторы делают следующие выводы:

 Можно с уверенностью заключить, что можно создать модель, которая будет одновременно эффективной и быстрой на устройствах с ограниченными ресурсами.

 MobileBERT-tiny обеспечивает немного лучшую производительность по сравнению с TinyBERT. Однако это становится еще более впечатляющим, если учесть, как TinyBERT был настроен для задач GLUE. Т.е., BERT-базу учителя TinyBERT необходимо было отрегулировать, прежде чем ее знания можно было преобразовать в TinyBERT! В случае MobileBERT дело обстоит иначе.

Интерфейс по работе MobileBERT есть здесь:

https://huggingface.co/transformers/model_doc/mobilebert.html

В GoogleColab достаточно просто проверяется его работоспособность:

Установка:

 !pip install transformers

 

Загрузка и инициализация моделей:

import torch
from transformers import MobileBertTokenizer, MobileBertForMultipleChoice

tokenizer = MobileBertTokenizer.from_pretrained('google/mobilebert-uncased')
model = MobileBertForMultipleChoice.from_pretrained('google/mobilebert-uncased')
 
Проверка на одной из задач, например, ответы на вопросы:
 
from torch.nn.functional import softmax

fact_sent = "Нейронная сеть (также искусственная нейронная сеть, ИНС) — математическая модель, а \
также её программное или аппаратное воплощение, построенная по принципу организации и\
 функционирования биологических нейронных сетей — сетей нервных клеток живого организма."
answer_1 = "Однажды, в студеную зимнюю пору, я из лесу вышел"
answer_2 = "После разработки алгоритмов обучения получаемые модели стали использовать в \
практических целях"

labels = torch.tensor(0).unsqueeze(0)

encoding = tokenizer([[fact_sent, fact_sent], [answer_1, answer_2]], return_tensors='pt', padding=True)

outputs = model(**{k: v.unsqueeze(0for k,v in encoding.items()}, labels=labels)

loss, logits = outputs[:2]

print(logits)

probabilities = softmax(logits, dim=1)

probabilities 
 
Результат:
 

tensor([[1191032., 1201238.]], grad_fn=<ViewBackward>)

tensor([[0., 1.]], grad_fn=<SoftmaxBackward>)

 

Где 1 показывает, что answer_2 наиболее вероятный ответ. Но не стоит радоваться, поскольку небольшие изменения приведут к противоположному результату.