Трудность в понимании токенизатора, используемого в модели Роберта - PullRequest
0 голосов
/ 10 апреля 2020
from transformers import AutoModel, AutoTokenizer

tokenizer1 = AutoTokenizer.from_pretrained("roberta-base")
tokenizer2 = AutoTokenizer.from_pretrained("bert-base-cased")

sequence = "A Titan RTX has 24GB of VRAM"
print(tokenizer1.tokenize(sequence))
print(tokenizer2.tokenize(sequence))

Вывод:

['A', 'Titan', 'ĠRTX', 'Ġhas', 'Ġ24', 'GB', 'Ġof', 'ĠVR', 'AM' ]

['A', 'Titan', 'R', '## T', '## X', 'has', '24', '## GB', 'of', 'V', '## RA', '## M']

В модели Берта используется токенайзер WordPiece. Любое слово, которое не встречается в словаре WordPiece, жадно разбивается на подслов. Например, «RTX» разбит на «R», «## T» и «## X», где ## указывает, что это подтокен.

Роберта использует токенайзер BPE, но я не могу понять

а) как работает токенайзер BPE?

б) что представляет G в каждом из токенов?

1 Ответ

2 голосов
/ 10 апреля 2020

Этот вопрос чрезвычайно широк, поэтому я пытаюсь дать ответ, который фокусируется на основной проблеме. Если вы чувствуете необходимость ответа на другие вопросы, откройте другой вопрос, сосредоточив внимание на один вопрос за раз , см. Правила [справки / по теме] для Stackoverflow.

По существу, как вы правильно определили, BPE занимает центральное место в любой токенизации в современных глубоких сетях. Я настоятельно рекомендую вам прочитать оригинальную статью BPE , опубликованную Sennrich et al. , в которой они также освещают немного больше истории BPE. В любом случае токенизаторы для любой из моделей объятий предварительно обучаются, что означает, что они обычно генерируются из обучающего набора алгоритма заранее. Общие реализации, такие как SentencePiece , также дают немного лучшее понимание этого, но по существу задача оформлена как ограниченная задача оптимизации, где вы указываете максимальное количество k разрешенных словарных слов (ограничение), и алгоритм затем пытается сохранить как можно больше слов без превышения k.

, если не хватает слов, чтобы охватить весь словарь, для приближения словаря используются меньшие единицы, что приводит к наблюдаемым расщеплениям в приведенном вами примере. Роберт использует вариант под названием « BPE на уровне байтов », наилучшее объяснение, вероятно, дано в этом исследовании Wang et al. . Основное преимущество заключается в том, что это приводит к уменьшению словарного запаса при сохранении качества разбиений, насколько я понимаю.

Вторая часть вашего вопроса легче объяснить; в то время как BERT выделяет слияние двух последующих токенов (с ##), вместо этого токенайзер RoBERTa выделяет начало нового токена с указанным c символом юникода (в данном случае , \u0120, Г с точкой). Лучшая причина, которую я мог найти для этого, была эта нить , которая утверждает, что она в основном избегает использования пробелов в обучении.

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