Downloads · 30 days
0
IImasterII/dpo-phase-logic
dpo-phase-logic is a machine learning model from IImasterII. Use it for the machine learning task on the model card, and read the license before you ship it in a product.
LoRA-адаптер для Qwen3.5-4B, обученный методом DPO на 200 парах "правильное рассуждение / типичная ошибка".
Downloads · 30 days
0
Access
Public
Updated Apr 16, 2026
Repo size
1.3 MB
Likes
0
Public
Click a slice to open those files.
.safetensors1.3 MB · 99%
From the Hugging Face model README
LoRA-адаптер для Qwen3.5-4B, обученный методом DPO на 200 парах "правильное рассуждение / типичная ошибка".
Модель учится не только правильным ответам, но и избегает типичных логических ошибок. Каждая пара содержит:
Кастомный слой, добавляющий фазовое кодирование к стандартному attention. LoRA обучает только phase_q и phase_k.
# Фазовые тензоры
phase_q = Linear(hidden_size, num_heads)
phase_k = Linear(hidden_size, num_heads)
# Модуляция attention
phase_factor = cos(phase_q - phase_k)
attn_output = attn_output * (1.0 + 0.1 * phase_mod)
Важно: Phase Attention не встроен в базовую модель. Для инференса требуется monkey-patching (см. код ниже).
| Категория | Темы |
|---|---|
| Математика | Арифметика, приоритет операций, проценты |
| Логика | Дедукция, импликация, сравнения |
| Физика | Законы Ома, Ньютона, термодинамика |
| Python | Типы данных, индексация, операторы |
| Инженерия | Турбины, двигатели, электричество |
| Аэродинамика | Сверхзвук, стреловидное крыло |
| Робототехника | Кинематика, сингулярности, PID |
| Математика/физика | Навье-Стокс, тензоры, ОТО |
| Философия Канта | Трансцендентальный идеализм |
| Адвайта-Веданта | Брахман, Атман, Майя |
| Системное мышление | Гёдель, дилемма заключённого |
Вопрос: Вычисли: 10 + 20 * 2
| Правильно | Ошибка |
|---|---|
| Сначала умножение: 20 * 2 = 40 | Слева направо: 10 + 20 = 30 |
| Затем сложение: 10 + 40 = 50 | Умножаем: 30 * 2 = 60 |
| Ответ: 50 | Ответ: 60 |
Вопрос: Если идёт дождь → асфальт мокрый. Асфальт мокрый. Идёт ли дождь?
| Правильно | Ошибка |
|---|---|
| Дана импликация A → B | Дождь делает асфальт мокрым |
| Утверждается следствие | Асфальт мокрый |
| Из B не следует A (могли полить) | Значит идёт дождь |
| Ответ: Нет, не обязательно | Ответ: Да |
Вопрос: Почему при резком увеличении топлива возникает помпаж компрессора?
| Правильно | Ошибка |
|---|---|
| Скачок давления → противодавление | Больше топлива = быстрее вращение |
| Снижение осевой скорости потока | Всасывается больше воздуха |
| Срыв потока на лопатках | Переохлаждение камеры сгорания |
| Ответ: Срыв потока от противодавления | Ответ: Переохлаждение камеры |
Вопрос: Что произойдёт, когда оси 4 и 6 робота выстроятся в линию?
| Правильно | Ошибка |
|---|---|
| Теряется степень свободы | Идеальный аэродинамический профиль |
| Якобиан вырожден | Сопротивление падает до нуля |
| Требуется бесконечная скорость шарниров | Бесконечное ускорение |
| Ответ: Остановка, неразрешимая кинематика | Ответ: Плавление от бесконечной скорости |
Вопрос: Почему дросселирование охлаждает реальный газ, но не идеальный?
| Правильно | Ошибка |
|---|---|
| Энтальпия идеального газа: только температура | Узкое сечение засасывает холодный воздух |
| Реальный газ: силы межмолекулярного притяжения | Быстрая струя смешивается с атмосферой |
| Работа против этих сил → охлаждение | Образуется абразивная пена |
| Ответ: Работа против сил Ван-дер-Ваальса | Ответ: Подсос холодного воздуха |
Вопрос: Являются ли пространство и время физическими контейнерами?
| Правильно | Ошибка |
|---|---|
| Мы не можем познать вещи в себе | Планеты вращаются в пространстве |
| Это не свойства вещей | Там есть объекты → из атомов вакуума |
| Априорные формы чувственности | Это материальные газы |
| Ответ: Нет, это формы чувственности | Ответ: Да, из атомов вакуума |
Вопрос: Как в Брахмане существует Вселенная?
| Правильно | Ошибка |
|---|---|
| Бесконечное не имеет "снаружи" | Брахман делает вдох и сжимается |
| Вселенная — Майя (видимость) | В вакууме формируются галактики |
| Как волны на поверхности океана | Брахман освобождает место |
| Ответ: Майя, неотличная от Брахмана | Ответ: Сжатие освобождает вакуум |
| Параметр | Значение |
|---|---|
| Базовая модель | Qwen/Qwen3.5-4B |
| Метод | DPO |
| LoRA rank | 16 |
| LoRA alpha | 32 |
| LoRA dropout | 0.05 |
| Target modules | phase_q, phase_k |
| Обучаемых параметров | ~50K |
| Датасет | 200 пар |
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
BASE = "Qwen/Qwen3.5-4B"
ADAPTER = "IImasterII/dpo-phase-logic"
# === 1. PHASE ATTENTION LAYER (обязательно для инференса) ===
class PhaseAttentionHybrid(torch.nn.Module):
def __init__(self, base_attn, config):
super().__init__()
self.base_attn = base_attn
self.config = config
self.num_heads = getattr(config, "num_attention_heads", getattr(config, "num_heads", 16))
self.hidden_size = getattr(config, "hidden_size", 2048)
self.phase_q = torch.nn.Linear(self.hidden_size, self.num_heads, bias=False)
self.phase_k = torch.nn.Linear(self.hidden_size, self.num_heads, bias=False)
def forward(self, *args, **kwargs):
hidden_states = args[0] if len(args) > 0 else kwargs.get("hidden_states")
base_out = self.base_attn(*args, **kwargs)
if isinstance(base_out, tuple):
attn_output, past = base_out[0], base_out[1:]
else:
attn_output, past = base_out, None
phase_q = self.phase_q(hidden_states)
phase_k = self.phase_k(hidden_states)
p_q = phase_q.unsqueeze(2)
p_k = phase_k.unsqueeze(1)
phase_factor = torch.cos(p_q - p_k)
phase_mod = phase_factor.mean(dim=(2, 3)).unsqueeze(-1)
attn_output = attn_output * (1.0 + 0.1 * phase_mod)
return (attn_output, *past) if past else attn_output
# === 2. ЗАГРУЗКА БАЗОВОЙ МОДЕЛИ ===
tokenizer = AutoTokenizer.from_pretrained(BASE, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
BASE,
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True
)
# === 3. PATCHING (внедрение Phase Attention) ===
for layer in model.model.layers:
if hasattr(layer, 'self_attn') and layer.self_attn is not None:
if 'Phase' not in layer.self_attn.__class__.__name__:
old_attn = layer.self_attn
new_attn = PhaseAttentionHybrid(old_attn, model.config).to(model.device)
layer.self_attn = new_attn
# === 4. ЗАГРУЗКА LORA АДАПТЕРА ===
model = PeftModel.from_pretrained(model, ADAPTER)
model.eval()
# === 5. ГЕНЕРАЦИЯ (формат Alpaca, использованный при обучении) ===
question = "В цепи ток 2 А, сопротивление 5 Ом. Какое напряжение?"
text = f"### Instruction:\n{question}\n### Response:\n"
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(**inputs, max_new_tokens=256)
input_length = inputs.input_ids.shape[1]
response = outputs[0][input_length:]
print(tokenizer.decode(response, skip_special_tokens=True))
| Файл | Размер |
|---|---|
| adapter_config.json | ~1 KB |
| adapter_model.safetensors | ~1.3 MB |
Apache 2.0
Базовая модель Qwen3.5-4B — см. её лицензию.