Большой хороший пост про BERT word embeddings, и второй пост, где больше упор на получившиеся матрицы, которые поступают на вход модели. В них подробно описано, как BERT превращает входящие слова в token ids, зачем при этом нужны special tokens, как выглядят segment ids в случае разбиения текста на две части. Отдельно описывается работа токенайзера – есть ощущение, что далеко не все знают, что токенайзер не всегда бьет предложение по пробелам, и что в случае неизвестных берту слов генерируются сабтокены (например, 'embeddings' – ['em', '##bed', '##ding', '##s']). Дальше показывается, как выглядят хиддент стейты берта, какая у них размерность, за что каждое измерение отвечает, и как из последних хидден стейтов можно собрать эмбеддинги слов. Что приколько, автор первого поста показывает, как эмбеддинги одного и того же слова на практике отличаются в зависимости от контекста. Например, для слова bank:
bank vault tensor([ 3.3596, -2.9805, -1.5421, 0.7065, 2.0031])
bank robber tensor([ 2.7359, -2.5577, -1.3094, 0.6797, 1.6633])
river bank tensor([ 1.5266, -0.8895, -0.5152, -0.9298, 2.8334])
До меня вообще только недавно дошло понимание, что эмбеддинги, получаемые при переводе из token ids – это такая же тренируемая часть берта, а не рандомная инициализация. Что также важно, segment ids (индикаторы того, к какой части текста принадлежит каждый токен) также переводятся в эмбеддинги, и эти эмбеддинги также тренируемые. You live and you learn как говорится.
Post #709
1.47K