YAML Metadata Warning:empty or missing yaml metadata in repo card

Check out the documentation for more information.

DPO Phase Logic — Qwen3.5-4B

LoRA-адаптер для Qwen3.5-4B, обученный методом DPO на 200 парах "правильное рассуждение / типичная ошибка".


Что это

Модель учится не только правильным ответам, но и избегает типичных логических ошибок. Каждая пара содержит:

  • Chosen — корректное пошаговое рассуждение
  • Rejected — распространённая ошибка с неверной логикой

Архитектура: Phase Attention

Кастомный слой, добавляющий фазовое кодирование к стандартному 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 (см. код ниже).


Датасет: 200 пар

Категория Темы
Математика Арифметика, приоритет операций, проценты
Логика Дедукция, импликация, сравнения
Физика Законы Ома, Ньютона, термодинамика
Python Типы данных, индексация, операторы
Инженерия Турбины, двигатели, электричество
Аэродинамика Сверхзвук, стреловидное крыло
Робототехника Кинематика, сингулярности, PID
Математика/физика Навье-Стокс, тензоры, ОТО
Философия Канта Трансцендентальный идеализм
Адвайта-Веданта Брахман, Атман, Майя
Системное мышление Гёдель, дилемма заключённого

Примеры из датасета

1. Математика: Приоритет операций

Вопрос: Вычисли: 10 + 20 * 2

Правильно Ошибка
Сначала умножение: 20 * 2 = 40 Слева направо: 10 + 20 = 30
Затем сложение: 10 + 40 = 50 Умножаем: 30 * 2 = 60
Ответ: 50 Ответ: 60

2. Логика: Импликация

Вопрос: Если идёт дождь → асфальт мокрый. Асфальт мокрый. Идёт ли дождь?

Правильно Ошибка
Дана импликация A → B Дождь делает асфальт мокрым
Утверждается следствие Асфальт мокрый
Из B не следует A (могли полить) Значит идёт дождь
Ответ: Нет, не обязательно Ответ: Да

3. Инженерия: Газовые турбины

Вопрос: Почему при резком увеличении топлива возникает помпаж компрессора?

Правильно Ошибка
Скачок давления → противодавление Больше топлива = быстрее вращение
Снижение осевой скорости потока Всасывается больше воздуха
Срыв потока на лопатках Переохлаждение камеры сгорания
Ответ: Срыв потока от противодавления Ответ: Переохлаждение камеры

4. Робототехника: Сингулярности

Вопрос: Что произойдёт, когда оси 4 и 6 робота выстроятся в линию?

Правильно Ошибка
Теряется степень свободы Идеальный аэродинамический профиль
Якобиан вырожден Сопротивление падает до нуля
Требуется бесконечная скорость шарниров Бесконечное ускорение
Ответ: Остановка, неразрешимая кинематика Ответ: Плавление от бесконечной скорости

5. Физика: Эффект Джоуля-Томсона

Вопрос: Почему дросселирование охлаждает реальный газ, но не идеальный?

Правильно Ошибка
Энтальпия идеального газа: только температура Узкое сечение засасывает холодный воздух
Реальный газ: силы межмолекулярного притяжения Быстрая струя смешивается с атмосферой
Работа против этих сил → охлаждение Образуется абразивная пена
Ответ: Работа против сил Ван-дер-Ваальса Ответ: Подсос холодного воздуха

6. Философия Канта: Пространство и время

Вопрос: Являются ли пространство и время физическими контейнерами?

Правильно Ошибка
Мы не можем познать вещи в себе Планеты вращаются в пространстве
Это не свойства вещей Там есть объекты → из атомов вакуума
Априорные формы чувственности Это материальные газы
Ответ: Нет, это формы чувственности Ответ: Да, из атомов вакуума

7. Адвайта: Брахман и Майя

Вопрос: Как в Брахмане существует Вселенная?

Правильно Ошибка
Бесконечное не имеет "снаружи" Брахман делает вдох и сжимается
Вселенная — Майя (видимость) В вакууме формируются галактики
Как волны на поверхности океана Брахман освобождает место
Ответ: Майя, неотличная от Брахмана Ответ: Сжатие освобождает вакуум

Параметры обучения

Параметр Значение
Базовая модель 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

Ограничения

  • Датасет: 200 пар — экстремально мало для DPO
  • Язык: русские задачи
  • Phase Attention: требует monkey-patching при загрузке
  • Область: рассуждения, не общие разговоры

Лицензия

Apache 2.0

Базовая модель Qwen3.5-4B — см. её лицензию.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support