Qwen2.5-1.5B + Opus-4.6 Reasoning LoRA
LoRA-адаптер для Qwen/Qwen2.5-1.5B-Instruct, дообученный на датасете chain-of-thought рассуждений, сгенерированных Claude Opus 4.6.
🎯 Цель
Дистилляция reasoning-способностей из большой модели (Claude Opus 4.6) в маленькую (1.5B параметров). Модель учится не просто давать ответ, а рассуждать перед ответом — показывать цепочку мыслей (chain-of-thought).
📊 Датасет
- Источник: DarkyMan/Opus-4.6-RU-Reasoning-8000x-not-filtered
- Размер: 7,758 примеров
- Формат: User prompt → Reasoning (цепочка рассуждений) + Answer (развёрнутый ответ)
- Язык: Русский
- Домены: TypeScript, Python, Go, Rust, архитектура ПО, алгоритмы, системный дизайн
📈 Результаты обучения
| Step | Training Loss | Validation Loss |
|---|---|---|
| 100 | 1.0310 | 1.0309 |
| 200 | 0.9550 | 0.9557 |
| 300 | 0.8724 | 0.9172 |
| 400 | 0.8579 | 0.8938 |
- Снижение validation loss: 13.3% (с 1.031 до 0.894)
- Переобучение: минимальное (разница train/val ~0.04)
- Эпохи: 2
⚙️ Параметры обучения
| Параметр | Значение |
|---|---|
| Base model | Qwen/Qwen2.5-1.5B-Instruct |
| Method | QLoRA (4-bit NF4) |
| LoRA rank (r) | 16 |
| LoRA alpha | 32 |
| Target modules | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj |
| LoRA dropout | 0.05 |
| Trainable params | 18.5M / 1.56B (1.18%) |
| Batch size | 4 × 8 grad_acc = 32 effective |
| Learning rate | 2e-4 |
| Scheduler | Cosine |
| Max seq length | 2048 |
| Optimizer | paged_adamw_8bit |
| Hardware | NVIDIA A100 40GB |
| Training time | ~1.5 часа |
🚀 Использование
import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
# Загрузка базовой модели + LoRA
base_model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen2.5-1.5B-Instruct",
torch_dtype=torch.bfloat16,
device_map="auto"
)
model = PeftModel.from_pretrained(base_model, "DarkyMan/Qwen2.5-1.5B-Opus46-Reasoning-LoRA")
tokenizer = AutoTokenizer.from_pretrained("DarkyMan/Qwen2.5-1.5B-Opus46-Reasoning-LoRA")
# Генерация
messages = [{"role": "user", "content": "Объясни TypeScript conditional types"}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=2048,
temperature=0.7,
top_p=0.9,
do_sample=True
)
response = tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(response)
⚠️ Ограничения
- Модель не тестировалась на бенчмарках — это исследовательский эксперимент
- Качество ответов может быть нестабильным из-за маленького размера базовой модели (1.5B)
- Датасет не проходил ручную фильтрацию
- Максимальная длина при обучении 2048 токенов — длинные ответы из датасета были обрезаны
📝 Контекст
Это эксперимент по дистилляции reasoning-способностей из большой модели в маленькую. Датасет был сгенерирован с помощью Claude Opus 4.6 — каждый пример содержит внутреннюю цепочку рассуждений (reasoning) и финальный развёрнутый ответ (content).
Гипотеза: даже маленькая модель (1.5B) может научиться паттерну "сначала думай, потом отвечай", если обучить её на примерах рассуждений от большой модели.
📄 Лицензия
Apache 2.0 (следует лицензии базовой модели Qwen2.5)
- Downloads last month
- 2