squ11z1 commited on
Commit
41ab1ac
·
verified ·
1 Parent(s): 43d3954

Upload quantum_kernel_training.py: Quantum kernel training script

Browse files
Files changed (1) hide show
  1. quantum_kernel_training.py +414 -0
quantum_kernel_training.py ADDED
@@ -0,0 +1,414 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)