Size: a a a

Natural Language Processing

2021 December 07

В

Валентин👾 in Natural Language Processing
понятно, спасибо)
источник

A

Alex in Natural Language Processing
Здравствуйте. Подскажите, пожалуйста, в чем может быть проблема при генерации контента. Использую дотренированную модель GPT на своих данных в библиотеку от HuggingFace. Модель неплохо генерирует нужный текст, но практически всегда в конце добавляет набор кракозябр, т.е. выглядит это так
Хороший текст + 5-10 строчек кракозябр вида

:// �c:// � � and 1 – have s, it were ( be and The take the This link | with ( link — and�,�D to take the are ( ��Kander he, new�n‴, and�. square The And�� � y �ens square up � (�. �_ square to in andh �what has ‚

Т.е. абсолютно бессмысленного текста. И так практически всегда. Можно ли этого как то избежать,  чтобы модель заканчивала обычным текстом, а не добавляла в конец непонятно что? Размер токенов задаю от 512 до 1024, температура 0.8, top_p 1.0, top_k 50
источник

IG

Ilya Gusev in Natural Language Processing
tokenizer.eos_token_id стоит? На обучении добавляется в конец? Почти точно в нём проблема
источник

IG

Ilya Gusev in Natural Language Processing
более того, я ловил баг с тем, что при add_special_tokens=True он не добавлялся
источник

A

Alex in Natural Language Processing
Спасибо за ответ.

tokenizer = GPT2Tokenizer.from_pretrained("gpt-2", bos_token='<startoftext>',                                           eos_token='<endoftext>', pad_token='<pad>')

Вот так выглядит токенайзер в скрипте обучения. Таким же образом его загружаю для генерации. Все ли я правильно понимаю для ответа на ваш вопрос?
источник

d

dePuff in Natural Language Processing
Думаю, нужно именно токены посмотреть после токенайзера
источник

IG

Ilya Gusev in Natural Language Processing
Да, нужно прям глазами убедиться, что id eos токена есть в input_ids
источник

A

Alex in Natural Language Processing
Подскажите, а что вывести для этого?
источник

IG

Ilya Gusev in Natural Language Processing
Вызов tokenizer'а возвращает словарь с ключами input_ids, attention_mask и token_type_ids. Нужно вывести значения под ключом input_ids
источник

IG

Ilya Gusev in Natural Language Processing
У английской gpt кстати и не надо переопределять спецтокены, там с ними было всё нормально
источник

A

Alex in Natural Language Processing
PreTrainedTokenizer(name_or_path='gpt-2', vocab_size=50257, model_max_len=2048, is_fast=False, padding_side='right', special_tokens={'bos_token': AddedToken("<startoftext>", rstrip=False, lstrip=False, single_word=False, normalized=True), 'eos_token': AddedToken("<endoftext>", rstrip=False, lstrip=False, single_word=False, normalized=True), 'unk_token': '<|endoftext|>', 'pad_token': '<pad>'})

Получается такой объект. Если вывести
источник

IG

Ilya Gusev in Natural Language Processing
это не вызов токенизатора
источник

IG

Ilya Gusev in Natural Language Processing
это сам токенизатор
источник

A

Alex in Natural Language Processing
Т.е. на каком то тексте вызвать?
источник

d

dePuff in Natural Language Processing
+
источник

IG

Ilya Gusev in Natural Language Processing
Дефолтный eos_token у gpt2: <|endoftext|>. Именно с палочками. Сам по себе он не добавляется к текстами, и даже не добавляется с add_special_tokens=True по каким-то причинам. Поэтому в обучающей выборке его надо к каждому тексту добавить руками.
источник

IG

Ilya Gusev in Natural Language Processing
источник

IG

Ilya Gusev in Natural Language Processing
источник

A

Alex in Natural Language Processing
prep_txt = '<startoftext>Title: Test title\nGenerated Text: I love apples very much<endoftext>'
encodings_dict = tokenizer(prep_txt, truncation=True, max_length=20, padding="max_length")
encodings_dict.input_ids [50257, 19160, 25, 6208, 3670, 198, 8645, 515, 8255, 25, 314, 1842, 5413, 845, 881, 50258, 50259, 50259, 50259, 50259]

Получается вот такой выход
источник

IG

Ilya Gusev in Natural Language Processing
если ты всё-таки настаиваешь на своём кастомном <endoftext>, то тогда и в generate замени eos_token_id на 50258
источник