Ponimash commited on
Commit
aca5916
1 Parent(s): b46980a

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +78 -21
README.md CHANGED
@@ -1,5 +1,5 @@
1
  ---
2
- license: gpl-3.0
3
  datasets:
4
  - wikimedia/wikipedia
5
  ---
@@ -9,7 +9,7 @@ datasets:
9
  * **Оригинальная модель**
10
  [[ai-forever/rugpt3small_based_on_gpt2](https://huggingface.co/ai-forever/rugpt3small_based_on_gpt2)]
11
 
12
- * **Код генерации взят частично отсюда**
13
  [[vector2text](https://github.com/Koziev/vector2text)]
14
 
15
  * Заменен эмбеддер
@@ -19,6 +19,11 @@ datasets:
19
  * Добавлен ранжировщик
20
  * Заменена модель вместо large — small
21
  * Убран top_p
 
 
 
 
 
22
 
23
  * **Пример использования**
24
 
@@ -32,6 +37,7 @@ from transformers import GPT2Tokenizer, GPT2LMHeadModel
32
  def top_filtering(logits, top_k):
33
  """
34
  Фильтрация top-k, в фильтрации top-p в этой задаче особо смысла нет
 
35
  """
36
  assert logits.dim() == 1
37
  top_k = min(top_k, logits.size(-1))
@@ -52,26 +58,48 @@ class TextEmbdGenerator:
52
  self.device = device
53
 
54
  if self.device == None:
55
- self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
56
-
57
 
58
  self.tokenizer = GPT2Tokenizer.from_pretrained(name_or_path)
59
  self.model = GPT2LMHeadModel.from_pretrained(name_or_path).to(self.device)
60
  self.sbert = sbert
61
 
62
 
63
- def generate_embedding(self, embd, prompt = '', temperature=0.26, top_k=4, max_len=100):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  """
65
  Генерация текста на основе начального эмбеддинга и заданного начального текста.
66
  """
67
- vector = np.concatenate([embd,embd**2])
68
- current_output_ids = self.tokenizer.encode(prompt)
69
 
70
- embedding = torch.FloatTensor([list(vector)]).to(self.device)
 
 
71
 
72
  while len(current_output_ids) < max_len:
73
  with torch.no_grad():
74
- token_embeddings = self.model.base_model.wte(torch.LongTensor(current_output_ids).to(self.device))
 
75
  input_vectors = torch.vstack((embedding, token_embeddings)).unsqueeze(dim=0)
76
  output_model = self.model(inputs_embeds=input_vectors)
77
 
@@ -96,12 +124,13 @@ class TextEmbdGenerator:
96
  """Вычисление косинусного сходства."""
97
  return np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y))
98
 
99
- def generate_with_ranker(self, embd, prompt = '', seq=10, temperature=0.6, top_k=10, max_len=100):
100
  """Генерация и ранжирование текста. Поумолчанию создаются 10 текстов"""
101
- sequences = [self.generate_embedding(embd, prompt, temperature, top_k, max_len) for _ in range(seq)]
102
  sequences = list(set(sequences)) # Удаление дубликатов
103
 
104
  # Ранжирование
 
105
  embeddings = self.sbert.encode(sequences)
106
  similarities = [self.cosine_similarity(embd, emb) for emb in embeddings]
107
  best_index = np.argmax(similarities)
@@ -124,16 +153,16 @@ generator = TextEmbdGenerator('FractalGPT/EmbedderDecoder', sbert)
124
 
125
  ```python
126
  embd = sbert.encode('там живут англичане')
127
- generator.generate_with_ranker(embd, prompt = 'он всегда был в')
128
  ```
129
  ```bash
130
- >>> он всегда был в Англии.
131
  ```
132
 
133
 
134
  ```python
135
  embd = sbert.encode('там живут немцы')
136
- generator.generate_with_ranker(embd, prompt = 'он всегда был в')
137
  ```
138
  ```bash
139
  >>> он всегда был в Германии
@@ -149,28 +178,56 @@ generator.generate_with_ranker(embd)
149
 
150
 
151
  ```python
152
- embd = sbert.encode('интересный фильм смотрел, фильм понравился')
153
- generator.generate_with_ranker(embd, seq=5)
154
  ```
155
  ```bash
156
- >>> фильм был снят по мотивам произведений
157
  ```
158
 
159
  ```python
160
  embd = sbert.encode('полицейский - главный герой') + sbert.encode('Произошло ужасное событие в фильме')
161
  embd /= 2
162
- generator.generate_with_ranker(embd, 'Собеседование на')
163
  ```
164
 
165
  ```bash
166
  >>> Собеседование на роль главного героя фильма — молодого лейтенанта полиции — происходит в доме
167
  ```
168
 
 
 
 
 
 
169
  ```python
170
- embd = sbert.encode('машина') - sbert.encode('колеса') + sbert.encode('крылья')
171
- generator.generate_with_ranker(embd, 'это')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  ```
173
 
174
  ```bash
175
- >>> этот самолет
176
  ```
 
1
  ---
2
+ license: apache-2.0
3
  datasets:
4
  - wikimedia/wikipedia
5
  ---
 
9
  * **Оригинальная модель**
10
  [[ai-forever/rugpt3small_based_on_gpt2](https://huggingface.co/ai-forever/rugpt3small_based_on_gpt2)]
11
 
12
+ * **Код генерации вдохновлен этим проектом**
13
  [[vector2text](https://github.com/Koziev/vector2text)]
14
 
15
  * Заменен эмбеддер
 
19
  * Добавлен ранжировщик
20
  * Заменена модель вместо large — small
21
  * Убран top_p
22
+ * Добавлен расчет среднего эмбеддинга (для ранжировщика в случае работы с массивом)
23
+ * Добавлена работа с матрицами эмбеддингов
24
+ * Добавлены 2 новых способа смеси эмбеддингов:
25
+ * Эмбеддинги в первой степени из одного текста, а квадраты из другого(в эмбеддинги и их квадраты также можно включать разную по структуре информацию)
26
+ * Передавать массив эмбеддингов и их квадратов
27
 
28
  * **Пример использования**
29
 
 
37
  def top_filtering(logits, top_k):
38
  """
39
  Фильтрация top-k, в фильтрации top-p в этой задаче особо смысла нет
40
+ код с top-p: https://github.com/ictnlp/DSTC8-AVSD/blob/master/generate.py
41
  """
42
  assert logits.dim() == 1
43
  top_k = min(top_k, logits.size(-1))
 
58
  self.device = device
59
 
60
  if self.device == None:
61
+ self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
62
+
63
 
64
  self.tokenizer = GPT2Tokenizer.from_pretrained(name_or_path)
65
  self.model = GPT2LMHeadModel.from_pretrained(name_or_path).to(self.device)
66
  self.sbert = sbert
67
 
68
 
69
+ def __get_embds(self, embds, sqr_embds):
70
+ '''Работает с матрицей эмбеддингов'''
71
+ list_emb = []
72
+ sq = embds if sqr_embds == None else sqr_embds
73
+
74
+ for i, embd in enumerate(embds):
75
+ vector = np.concatenate([embd,sq[i]**2])
76
+ list_emb.append(list(vector))
77
+
78
+ return torch.FloatTensor(list_emb).to(self.device)
79
+
80
+ def __det_mean(self, embds):
81
+ '''Получение среднего'''
82
+ m = np.zeros((384))
83
+
84
+ for embd in embds:
85
+ m += embd
86
+
87
+ m /= len(embds)
88
+ return m
89
+
90
+ def generate_embedding(self, embds, prompt = '', sqr_embds = None, temperature=0.26, top_k=4, max_len=100):
91
  """
92
  Генерация текста на основе начального эмбеддинга и заданного начального текста.
93
  """
 
 
94
 
95
+ current_output_ids = self.tokenizer.encode(prompt) # Промпт
96
+ embedding = self.__get_embds(embds, sqr_embds) # Матрица входа
97
+ word_tokens = self.model.base_model.wte # Словарь токенов
98
 
99
  while len(current_output_ids) < max_len:
100
  with torch.no_grad():
101
+ outp_ids_tensor = torch.LongTensor(current_output_ids).to(self.device) # Выходы
102
+ token_embeddings = word_tokens(outp_ids_tensor) # эмбеддинги
103
  input_vectors = torch.vstack((embedding, token_embeddings)).unsqueeze(dim=0)
104
  output_model = self.model(inputs_embeds=input_vectors)
105
 
 
124
  """Вычисление косинусного сходства."""
125
  return np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y))
126
 
127
+ def generate_with_ranker(self, embds, prompt = '', sqr_embds = None, seq=10, temperature=0.6, top_k=10, max_len=100):
128
  """Генерация и ранжирование текста. Поумолчанию создаются 10 текстов"""
129
+ sequences = [self.generate_embedding(embds, prompt, sqr_embds, temperature, top_k, max_len) for _ in range(seq)]
130
  sequences = list(set(sequences)) # Удаление дубликатов
131
 
132
  # Ранжирование
133
+ embd = self.__det_mean(embds)
134
  embeddings = self.sbert.encode(sequences)
135
  similarities = [self.cosine_similarity(embd, emb) for emb in embeddings]
136
  best_index = np.argmax(similarities)
 
153
 
154
  ```python
155
  embd = sbert.encode('там живут англичане')
156
+ generator.generate_with_ranker([embd])
157
  ```
158
  ```bash
159
+ >>> я бы его в Англию привез.
160
  ```
161
 
162
 
163
  ```python
164
  embd = sbert.encode('там живут немцы')
165
+ generator.generate_with_ranker([embd], prompt = 'он всегда был в')
166
  ```
167
  ```bash
168
  >>> он всегда был в Германии
 
178
 
179
 
180
  ```python
181
+ embd = sbert.encode('машина') - sbert.encode('колеса') + sbert.encode('крылья')
182
+ generator.generate_with_ranker([embd], 'это')
183
  ```
184
  ```bash
185
+ >>> этот самолёт
186
  ```
187
 
188
  ```python
189
  embd = sbert.encode('полицейский - главный герой') + sbert.encode('Произошло ужасное событие в фильме')
190
  embd /= 2
191
+ generator.generate_with_ranker([embd], 'Собеседование на')
192
  ```
193
 
194
  ```bash
195
  >>> Собеседование на роль главного героя фильма — молодого лейтенанта полиции — происходит в доме
196
  ```
197
 
198
+
199
+ **После дообучения**
200
+
201
+
202
+
203
  ```python
204
+ embd_1 = sbert.encode('полицейский - главный герой')
205
+ embd_2 = sbert.encode('Произошло событие в фильме')
206
+
207
+ generator.generate_with_ranker([embd_1, embd_2], 'В ')
208
+ ```
209
+
210
+ ```bash
211
+ >>> В этом фильме главный герой - полицейский.
212
+ ```
213
+
214
+ ```python
215
+ embd_1 = sbert.encode('полицейский - главный герой')
216
+ embd_2 = sbert.encode('Произошло событие в фильме')
217
+
218
+ generator.generate_with_ranker([embd_1], 'Это', [embd_2])
219
+ ```
220
+
221
+ ```bash
222
+ >>> Это полицейский, который в полицейском участке снимается в фильме.
223
+ ```
224
+
225
+ ```python
226
+ embd = sbert.encode('радиоприемник')
227
+ ans = vector_answer(embd, 'Как это устроено?')
228
+ print(ans)
229
  ```
230
 
231
  ```bash
232
+ >>> Радиоволны распространяются в воздухе, создавая электромагнитное поле, которое может быть использовано для передачи информации.
233
  ```