koziev ilya commited on
Commit
cda61f2
1 Parent(s): eff57c5

adding readme with model information

Browse files
Files changed (1) hide show
  1. README.md +72 -0
README.md CHANGED
@@ -1,3 +1,75 @@
1
  ---
2
  license: cc-by-nc-4.0
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  license: cc-by-nc-4.0
3
  ---
4
+
5
+ ## Поэтический перефразировщик
6
+
7
+ Это генеративная модель на основе ```sberbank-ai/rugpt3large_based_on_gpt2```, дообученной
8
+ на датасете перефразировок [inkoziev/paraphrases](https://huggingface.co/datasets/inkoziev/paraphrases).
9
+ Она разработана для использования в проекте [генеративной поэзии](https://github.com/Koziev/verslibre).
10
+
11
+
12
+ ### Особенности перефразировки
13
+
14
+ Обращаю внимание, что модель **не предназначена** для использования там, где требуется
15
+ особо аккуратная работа с именованными сущностями. Так как в стихах не возникает особых проблем (более того,
16
+ в некоторых сценариях использования это даже желательно), если перефразировки теряют или добавляют некоторую семантику в исходный текст, то обучающий датасет
17
+ и модель на его основе может путать дни недели, имена, добавлять что-то от себя, быть метафоричной или иносказательной.
18
+
19
+ ### Методика файнтюна
20
+
21
+ В обучающем датасете есть негативные примеры перефразировок, и я использую их вместе с правильными примерами в ходе файнтюна,
22
+ подавая на классификационную голову в [GPT2DoubleHeadsModel](https://huggingface.co/docs/transformers/model_doc/gpt2#transformers.GPT2DoubleHeadsModel).
23
+ Код, выполняющий файнтюн, доступен [тут](https://gist.github.com/Koziev/791febec6613a2ae744da52d2a3ec067).
24
+
25
+ Такой подход к файнтюну оказался лучше, чем два других подхода:
26
+
27
+ 1) дефолтный способ файнтюна, когда GPT дообучается просто на текстах, состоящих из исходного текста и перефразировки,
28
+ разделенных специальным токеном. В этом подходе модель обучается также на токенах затравки, что может быть нежелательным.
29
+ 2) вариация первого способа, в котором токены затравки (исходного текста) исключаются из обратного распространения с помощью
30
+ задания labels=-100.
31
+
32
+ В качестве метрики для сравнения подходов и для подбора числа неверных вариантов перефразировки в GPT2DoubleHeadsModel
33
+ использована комбинация из:
34
+ 1) близость векторов эмбеддингов исходного текста и сгенерированной перефразировки. Векторы получаются с помощью
35
+ модели ```sberbank-ai/sbert_large_mt_nlu_ru```. Я не стал использовать [модель-критик](https://huggingface.co/inkoziev/sbert_synonymy),
36
+ поскольку она обучалась на таком же датасете.
37
+ 2) дисконтируем результаты п.1 символьной близостью (3-граммы) по коэффициенту Жаккара. Это штрафует перестановочные
38
+ перефразировки, воспроизведение исходного текста и небольшие переписывания.
39
+
40
+ ### Пример использования
41
+
42
+ Следующий код позволяет ввести в консоли короткое предложение
43
+ и видеть результат ее перефразировки моделью:
44
+ ```
45
+ import torch
46
+ from transformers import AutoTokenizer, AutoModelForCausalLM
47
+
48
+
49
+ device = "cuda" if torch.cuda.is_available() else "cpu"
50
+
51
+ model_name = "inkoziev/paraphraser"
52
+
53
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
54
+ model = AutoModelForCausalLM.from_pretrained(model_name)
55
+ model.to(device)
56
+ model.eval()
57
+
58
+ while True:
59
+ seed = input(':> ').strip()
60
+ encoded_prompt = tokenizer.encode("<s>" + seed + "<sep>", add_special_tokens=False, return_tensors="pt").to(device)
61
+ output_sequences = model.generate(input_ids=encoded_prompt,
62
+ max_length=100,
63
+ typical_p=0.85,
64
+ top_k=0,
65
+ top_p=1.0,
66
+ do_sample=True,
67
+ num_return_sequences=10,
68
+ pad_token_id=tokenizer.pad_token_id)
69
+
70
+ for o in output_sequences:
71
+ text = tokenizer.decode(o.tolist(), clean_up_tokenization_spaces=True)
72
+ text = text[text.index('<sep>') + 5:]
73
+ text = text[: text.find('</s>')]
74
+ print(text)
75
+ ```