squ11z1 commited on
Commit
b715983
·
verified ·
1 Parent(s): b972a7a

Delete quantum_kernel_training.py

Browse files
Files changed (1) hide show
  1. quantum_kernel_training.py +0 -414
quantum_kernel_training.py DELETED
@@ -1,414 +0,0 @@
1
- """
2
- Quantum-VibeThinker Hybrid Model - Proof of Concept
3
- ====================================================
4
- Гибридная квантово-классическая модель для анализа текста
5
-
6
- Архитектура:
7
- 1. VibeThinker-1.5B → извлечение embeddings
8
- 2. PCA сжатие → 4D для квантового слоя
9
- 3. Квантовое ядро → вычисление похожести
10
- 4. SVM классификатор → финальное решение
11
-
12
- Требования:
13
- - MacBook Pro M4 (16GB RAM)
14
- - transformers, torch, qiskit, sklearn
15
- """
16
-
17
- import numpy as np
18
- import torch
19
- import time
20
- import json
21
- from pathlib import Path
22
-
23
- print("="*70)
24
- print("🧠 QUANTUM-VIBTHINKER HYBRID MODEL")
25
- print("="*70)
26
- print("\n💻 Платформа: MacBook Pro M4")
27
- print("🔬 Режим: Proof of Concept\n")
28
-
29
- # ===== ШАГ 1: ПРОВЕРКА ОКРУЖЕНИЯ =====
30
- print("="*70)
31
- print("ШАГ 1/8: ПРОВЕРКА ОКРУЖЕНИЯ")
32
- print("="*70)
33
-
34
- # Проверка устройства
35
- if torch.backends.mps.is_available():
36
- device = torch.device("mps") # M4 GPU
37
- print("✅ Metal Performance Shaders доступен (M4 GPU)")
38
- elif torch.cuda.is_available():
39
- device = torch.device("cuda")
40
- print("✅ CUDA доступен")
41
- else:
42
- device = torch.device("cpu")
43
- print("⚠️ Используем CPU")
44
-
45
- print(f"🎯 Устройство: {device}")
46
-
47
- # ===== ШАГ 2: ЗАГРУЗКА VIBTHINKER =====
48
- print("\n" + "="*70)
49
- print("ШАГ 2/8: ЗАГРУЗКА VIBTHINKER-1.5B")
50
- print("="*70)
51
-
52
- try:
53
- from transformers import AutoModel, AutoTokenizer
54
-
55
- print("📥 Загрузка модели (может занять 1-2 минуты)...")
56
- start = time.time()
57
-
58
- model_name = "WeiboAI/VibeThinker-1.5B"
59
- tokenizer = AutoTokenizer.from_pretrained(model_name)
60
- model = AutoModel.from_pretrained(
61
- model_name,
62
- torch_dtype=torch.float16 # FP16 для экономии памяти на M4
63
- )
64
- model.to(device)
65
- model.eval()
66
-
67
- load_time = time.time() - start
68
- print(f"✅ VibeThinker загружен за {load_time:.1f} сек")
69
- print(f"📊 Параметры: ~1.5B")
70
- print(f"💾 Память: ~3GB на M4")
71
-
72
- except Exception as e:
73
- print(f"❌ Ошибка загрузки VibeThinker: {e}")
74
- print("\n💡 Установите: pip install transformers torch")
75
- exit(1)
76
-
77
- # ===== ШАГ 3: ПОДГОТОВКА ДАННЫХ =====
78
- print("\n" + "="*70)
79
- print("ШАГ 3/8: ПОДГОТОВКА ТЕСТОВЫХ ДАННЫХ")
80
- print("="*70)
81
-
82
- # Датасет для sentiment analysis
83
- texts_train = [
84
- "I absolutely love quantum computing! It's amazing!",
85
- "This is the worst experience ever, terrible.",
86
- "Quantum neural networks are fascinating and powerful.",
87
- "I hate bugs in my code, so frustrating!",
88
- "The future of AI is quantum, incredible potential!",
89
- "This product is garbage, waste of money.",
90
- "Machine learning combined with quantum is brilliant!",
91
- "Awful customer service, never coming back."
92
- ]
93
-
94
- labels_train = [1, 0, 1, 0, 1, 0, 1, 0] # 1=positive, 0=negative
95
-
96
- texts_test = [
97
- "Quantum algorithms are revolutionary!",
98
- "This is horrible, I'm disappointed.",
99
- "Amazing breakthrough in quantum ML!",
100
- "Terrible quality, very bad."
101
- ]
102
-
103
- labels_test = [1, 0, 1, 0]
104
-
105
- print(f"✅ Обучающая выборка: {len(texts_train)} образцов")
106
- print(f"✅ Тестовая выборка: {len(texts_test)} образцов")
107
- print(f"\nПримеры:")
108
- for i in range(2):
109
- label = "😊 Positive" if labels_train[i] == 1 else "😞 Negative"
110
- print(f" {label}: '{texts_train[i][:50]}...'")
111
-
112
- # ===== ШАГ 4: ИЗВЛЕЧЕНИЕ EMBEDDINGS =====
113
- print("\n" + "="*70)
114
- print("ШАГ 4/8: ИЗВЛЕЧЕНИЕ EMBEDDINGS ЧЕРЕЗ VIBTHINKER")
115
- print("="*70)
116
-
117
- def get_embeddings(texts, model, tokenizer, device):
118
- """Извлекает embeddings из VibeThinker"""
119
- embeddings = []
120
-
121
- print(f"🔄 Обработка {len(texts)} текстов...")
122
- start = time.time()
123
-
124
- with torch.no_grad():
125
- for i, text in enumerate(texts):
126
- # Токенизация
127
- inputs = tokenizer(
128
- text,
129
- return_tensors="pt",
130
- padding=True,
131
- truncation=True,
132
- max_length=128
133
- ).to(device)
134
-
135
- # Прогон через модель
136
- outputs = model(**inputs)
137
-
138
- # Усреднение по токенам
139
- embedding = outputs.last_hidden_state.mean(dim=1).cpu().numpy()[0]
140
- embeddings.append(embedding)
141
-
142
- if (i + 1) % 4 == 0:
143
- print(f" Обработано: {i + 1}/{len(texts)}")
144
-
145
- elapsed = time.time() - start
146
- print(f"✅ Готово за {elapsed:.1f} сек ({elapsed/len(texts):.2f} сек/текст)")
147
-
148
- return np.array(embeddings)
149
-
150
- # Извлечение embeddings
151
- X_train_emb = get_embeddings(texts_train, model, tokenizer, device)
152
- X_test_emb = get_embeddings(texts_test, model, tokenizer, device)
153
-
154
- print(f"\n📊 Размерность embeddings: {X_train_emb.shape[1]}D")
155
- print(f" Train: {X_train_emb.shape}")
156
- print(f" Test: {X_test_emb.shape}")
157
-
158
- # ===== ШАГ 5: СЖАТИЕ ДО 4D ДЛЯ КВАНТОВОГО СЛОЯ =====
159
- print("\n" + "="*70)
160
- print("ШАГ 5/8: СЖАТИЕ РАЗМЕРНОСТИ (PCA)")
161
- print("="*70)
162
-
163
- from sklearn.decomposition import PCA
164
-
165
- # Сжимаем до 4D для 2-кубитной QNN
166
- pca = PCA(n_components=4)
167
- X_train_4d = pca.fit_transform(X_train_emb)
168
- X_test_4d = pca.transform(X_test_emb)
169
-
170
- print(f"✅ Сжатие: {X_train_emb.shape[1]}D → 4D")
171
- print(f"📊 Объяснённая дисперсия: {pca.explained_variance_ratio_.sum():.1%}")
172
- print(f" Компоненты: {pca.explained_variance_ratio_}")
173
-
174
- # Нормализация для квантовых гейтов [0, 2π]
175
- X_train_norm = (X_train_4d - X_train_4d.min()) / (X_train_4d.max() - X_train_4d.min()) * 2 * np.pi
176
- X_test_norm = (X_test_4d - X_train_4d.min()) / (X_train_4d.max() - X_train_4d.min()) * 2 * np.pi
177
-
178
- print(f"✅ Нормализация: [0, 2π] для квантовых углов")
179
-
180
- # ===== ШАГ 6: КВАНТОВОЕ ЯДРО =====
181
- print("\n" + "="*70)
182
- print("ШАГ 6/8: ВЫЧИСЛЕНИЕ КВАНТОВОГО ЯДРА")
183
- print("="*70)
184
-
185
- from qiskit import QuantumCircuit
186
- from qiskit.circuit import ParameterVector
187
- from qiskit.primitives import StatevectorSampler
188
-
189
- def quantum_kernel(X1, X2):
190
- """
191
- Вычисляет квантовую матрицу ядра
192
- Использует 2-кубитную схему с запутыванием
193
- """
194
- n1, n2 = len(X1), len(X2)
195
- kernel_matrix = np.zeros((n1, n2))
196
-
197
- # Создаём схему
198
- input_params = ParameterVector('x', 4)
199
- qc = QuantumCircuit(2)
200
-
201
- # Кодирование данных
202
- qc.ry(input_params[0], 0)
203
- qc.ry(input_params[1], 1)
204
-
205
- # Запутывание
206
- qc.cx(0, 1)
207
-
208
- # Вариационный слой
209
- qc.ry(input_params[2], 0)
210
- qc.ry(input_params[3], 1)
211
-
212
- # Ещё запутывание
213
- qc.cx(1, 0)
214
-
215
- qc.measure_all()
216
-
217
- sampler = StatevectorSampler()
218
-
219
- print(f"🔄 Вычисление {n1}×{n2} = {n1*n2} элементов матрицы...")
220
- start = time.time()
221
-
222
- for i in range(n1):
223
- for j in range(n2):
224
- # Создаём overlap circuit
225
- qc1 = qc.assign_parameters({
226
- input_params[0]: X1[i][0],
227
- input_params[1]: X1[i][1],
228
- input_params[2]: X1[i][2],
229
- input_params[3]: X1[i][3]
230
- })
231
-
232
- qc2 = qc.assign_parameters({
233
- input_params[0]: X2[j][0],
234
- input_params[1]: X2[j][1],
235
- input_params[2]: X2[j][2],
236
- input_params[3]: X2[j][3]
237
- })
238
-
239
- # Overlap = вероятность измерить |00>
240
- result1 = sampler.run([qc1], shots=500).result()
241
- counts1 = result1[0].data.meas.get_counts()
242
-
243
- result2 = sampler.run([qc2], shots=500).result()
244
- counts2 = result2[0].data.meas.get_counts()
245
-
246
- # Фиделити через dot product распределений
247
- fidelity = sum(np.sqrt(counts1.get(k, 0) * counts2.get(k, 0))
248
- for k in set(counts1) | set(counts2)) / 500
249
-
250
- kernel_matrix[i, j] = fidelity
251
-
252
- elapsed = time.time() - start
253
- print(f"✅ Квантовое ядро вычислено за {elapsed:.1f} сек")
254
-
255
- return kernel_matrix
256
-
257
- # Вычисление матриц ядра
258
- print("\n📊 Вычисление K_train...")
259
- K_train = quantum_kernel(X_train_norm, X_train_norm)
260
-
261
- print("\n📊 Вычисление K_test...")
262
- K_test = quantum_kernel(X_test_norm, X_train_norm)
263
-
264
- print(f"\n✅ Матрицы квантового ядра готовы!")
265
- print(f" K_train: {K_train.shape}")
266
- print(f" K_test: {K_test.shape}")
267
- print(f" Среднее значение: {K_train.mean():.3f}")
268
-
269
- # ===== ШАГ 7: ОБУЧЕНИЕ И ТЕСТИРОВАНИЕ =====
270
- print("\n" + "="*70)
271
- print("ШАГ 7/8: ОБУЧЕНИЕ ГИБРИДНОЙ МОДЕЛИ")
272
- print("="*70)
273
-
274
- from sklearn.svm import SVC
275
- from sklearn.metrics import accuracy_score, classification_report
276
-
277
- # Baseline: Классический SVM на embeddings
278
- print("\n1️⃣ BASELINE: VibeThinker + Linear SVM")
279
- svm_baseline = SVC(kernel='linear')
280
- svm_baseline.fit(X_train_emb, labels_train)
281
- pred_baseline = svm_baseline.predict(X_test_emb)
282
- acc_baseline = accuracy_score(labels_test, pred_baseline)
283
- print(f" Точность: {acc_baseline:.1%}")
284
-
285
- # Hybrid: Квантовое ядро
286
- print("\n2️⃣ HYBRID: VibeThinker + Quantum Kernel + SVM")
287
- svm_quantum = SVC(kernel='precomputed')
288
- svm_quantum.fit(K_train, labels_train)
289
- pred_quantum = svm_quantum.predict(K_test)
290
- acc_quantum = accuracy_score(labels_test, pred_quantum)
291
- print(f" Точность: {acc_quantum:.1%}")
292
-
293
- # Сравнение
294
- print("\n" + "="*70)
295
- print("📊 СРАВНЕНИЕ МОДЕЛЕЙ")
296
- print("="*70)
297
- print(f"Baseline (Classical): {acc_baseline:.1%}")
298
- print(f"Hybrid (Quantum): {acc_quantum:.1%}")
299
- improvement = (acc_quantum - acc_baseline) * 100
300
- if improvement > 0:
301
- print(f"🎉 Квантовая модель лучше на {improvement:+.1f}%!")
302
- elif improvement < 0:
303
- print(f"⚖️ Классическая модель лучше на {-improvement:.1f}%")
304
- else:
305
- print(f"⚖️ Одинаковая точность")
306
-
307
- # Детальный отчёт
308
- print("\n📋 Детальный отчёт (Quantum Hybrid):")
309
- print(classification_report(labels_test, pred_quantum,
310
- target_names=['Negative', 'Positive']))
311
-
312
- # ===== ШАГ 8: ВИЗУАЛИЗАЦИЯ И СОХРАНЕНИЕ =====
313
- print("\n" + "="*70)
314
- print("ШАГ 8/8: ВИЗУАЛИЗАЦИЯ И СОХРАНЕНИЕ")
315
- print("="*70)
316
-
317
- import matplotlib.pyplot as plt
318
-
319
- # График 1: Сравнение точности
320
- fig, axes = plt.subplots(1, 3, figsize=(15, 4))
321
-
322
- # 1. Точность моделей
323
- models = ['Classical\n(Baseline)', 'Quantum\n(Hybrid)']
324
- accuracies = [acc_baseline, acc_quantum]
325
- colors = ['blue', 'red']
326
-
327
- axes[0].bar(models, accuracies, color=colors, alpha=0.7)
328
- axes[0].set_ylabel('Accuracy')
329
- axes[0].set_ylim([0, 1])
330
- axes[0].set_title('Model Comparison')
331
- axes[0].grid(True, alpha=0.3)
332
-
333
- # 2. Квантовая матрица ядра
334
- im = axes[1].imshow(K_train, cmap='hot', aspect='auto')
335
- axes[1].set_title('Quantum Kernel Matrix')
336
- axes[1].set_xlabel('Sample j')
337
- axes[1].set_ylabel('Sample i')
338
- plt.colorbar(im, ax=axes[1])
339
-
340
- # 3. Предсказания
341
- x_pos = np.arange(len(labels_test))
342
- axes[2].scatter(x_pos, labels_test, c='blue', s=200, alpha=0.5,
343
- marker='o', label='True')
344
- axes[2].scatter(x_pos, pred_quantum, c='red', s=100,
345
- marker='x', label='Predicted')
346
- axes[2].set_title('Predictions (Quantum Hybrid)')
347
- axes[2].set_xlabel('Test Sample')
348
- axes[2].set_ylabel('Class')
349
- axes[2].set_yticks([0, 1])
350
- axes[2].set_yticklabels(['Negative', 'Positive'])
351
- axes[2].legend()
352
- axes[2].grid(True, alpha=0.3)
353
-
354
- plt.tight_layout()
355
- plt.savefig('quantum_vibthinker_results.png', dpi=150, bbox_inches='tight')
356
- print("✅ График сохранён: quantum_vibthinker_results.png")
357
-
358
- # Сохранение результатов
359
- results = {
360
- 'model': 'Quantum-VibeThinker Hybrid',
361
- 'platform': 'MacBook Pro M4',
362
- 'vibthinker_model': model_name,
363
- 'quantum_qubits': 2,
364
- 'embedding_dim': X_train_emb.shape[1],
365
- 'compressed_dim': 4,
366
- 'accuracy_baseline': float(acc_baseline),
367
- 'accuracy_quantum': float(acc_quantum),
368
- 'improvement': float(improvement),
369
- 'train_samples': len(texts_train),
370
- 'test_samples': len(texts_test),
371
- 'predictions': {
372
- 'true_labels': labels_test,
373
- 'quantum_predictions': pred_quantum.tolist(),
374
- 'baseline_predictions': pred_baseline.tolist()
375
- }
376
- }
377
-
378
- with open('quantum_vibthinker_results.json', 'w') as f:
379
- json.dump(results, f, indent=2)
380
- print("✅ Результаты сохранены: quantum_vibthinker_results.json")
381
-
382
- # Сохранение матриц ядра
383
- np.save('K_train_quantum.npy', K_train)
384
- np.save('K_test_quantum.npy', K_test)
385
- print("✅ Квантовые ядра сохранены: K_*.npy")
386
-
387
- # ===== ФИНАЛЬНЫЙ ОТЧЁТ =====
388
- print("\n" + "="*70)
389
- print("🎉 PROOF OF CONCEPT ЗАВЕРШЁН!")
390
- print("="*70)
391
-
392
- print("\n📊 ИТОГИ:")
393
- print(f" ✅ VibeThinker-1.5B загружен на M4")
394
- print(f" ✅ Embeddings извлечены ({X_train_emb.shape[1]}D)")
395
- print(f" ✅ Квантовое ядро вычислено (2 кубита)")
396
- print(f" ✅ Гибридная модель обучена")
397
- print(f" ✅ Точность: {acc_quantum:.1%}")
398
-
399
- print(f"\n💾 СОХРАНЕНО:")
400
- print(f" - quantum_vibthinker_results.png (визуализация)")
401
- print(f" - quantum_vibthinker_results.json (метрики)")
402
- print(f" - K_train_quantum.npy (матрица ядра)")
403
- print(f" - K_test_quantum.npy (матрица ядра)")
404
-
405
- print(f"\n🚀 СЛЕДУЮЩИЕ ШАГИ:")
406
- print(f" 1. Увеличить количество данных")
407
- print(f" 2. Попробовать разные квантовые схемы")
408
- print(f" 3. Добавить больше кубитов (3-4)")
409
- print(f" 4. Оптимизировать параметры квантового слоя")
410
- print(f" 5. Сравнить с другими базовыми моделями")
411
-
412
- print("\n" + "="*70)
413
- print("✨ Ваша первая Quantum-Classical Hybrid модел�� готова!")
414
- print("="*70)