Трансформеры PreTrainedTokenizer add_tokens Функциональность - PullRequest
1 голос
/ 05 февраля 2020

Обращаясь к документации потрясающей библиотеки Transformers от Huggingface, я натолкнулся на функции add_tokens.

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
num_added_toks = tokenizer.add_tokens(['new_tok1', 'my_new-tok2'])
model.resize_token_embeddings(len(tokenizer))

Я попробовал вышеописанное, добавив ранее отсутствующие слова в словарь по умолчанию. Однако, сохраняя все остальное постоянным, я заметил снижение точности тонко настроенного классификатора, использующего это обновленное tokenizer. Мне удалось воспроизвести подобное поведение, даже когда было добавлено только 10% ранее отсутствовавших слов.

Мои вопросы

  1. Я что-то упустил?
  2. Вместо В целом, ожидает ли функция add_tokens ожидания замаскированных токенов, например: '##ah', '##red', '##ik', '##si ', et c.? Если да, есть ли процедура для генерации таких замаскированных токенов?

Буду признателен за любую помощь.

Заранее спасибо.

1 Ответ

1 голос
/ 05 февраля 2020

Если вы добавляете токены в токенизатор, вы действительно заставляете токенизатор токенизировать текст по-другому, но это не тот токен, с которым обучался BERT, поэтому вы в основном добавляете шум к входным данным. Вложения слова не обучены, и остальная часть сети никогда не видела их в контексте. Вам понадобится много данных, чтобы научить BERT работать с вновь добавленными словами.

Есть также несколько способов вычисления встраивания одного слова, чтобы он не повредил BERT, как в this paper , но это кажется довольно сложным и не должно иметь никакого значения.

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

Что касается ## -префиксированных токенов, то эти токены могут быть добавлены только в качестве суффикса другого слова. Например, walrus разделяется на ['wal', '##rus'], и вам нужно, чтобы оба словаря были в словаре, но не ##wal или rus.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...