score_matching_post
@fminxyz — Пост: Score Matching — поле градиентов вместо плотности
Серия 2 | Пост 2 из 5 | Дата: 5 марта 2026, 19:30 MSK
Текст поста (~1800 символов)
Нейросеть не знает p(x). Но знает ∇log p(x) — и этого хватает 🧭
Вчера мы разобрали DDPM: нейросеть учится убирать шум шаг за шагом. Но почему это работает? Что именно она выучивает?
Ответ: score function.
Что такое score?
Score = ∇log p(x) — градиент логарифма плотности распределения.
В каждой точке x это вектор, который показывает: “куда двигаться, чтобы p стала больше”. Как поле ветра, где каждая стрелка ведёт к ближайшей “горе” в пространстве данных.
Ключевая идея: нам не нужна сама p(x) (вычислить её нормализацию = интеграл по всему пространству = невозможно). Достаточно знать направление — score.
Score matching:
Учим нейросеть sₜ(x) ≈ ∇log p(xₜ), где xₜ — зашумлённые данные.
Fisher divergence:
J(θ) = 𝔼[||sθ(x) − ∇log p(x)||²]
Хитрость: это можно переписать через интегрирование по частям — без явного знания p(x):
J(θ) = 𝔼[||sθ(x)||² + 2·div(sθ(x))]
(Практически — используют denoising score matching, что эквивалентно лоссу DDPM ε-prediction)
Langevin dynamics:
Когда score выучен, генерация = “ходьба по полю”:
xₜ₊₁ = xₜ + α·∇log p(xₜ) + √(2α)·ξ, ξ ~ N(0, I)
Это SGLD (Stochastic Gradient Langevin Dynamics) — тот же алгоритм, что SGD с шумом. Только вместо лосса — log p(x). Минимизируешь отрицательный log-likelihood = сэмплируешь из распределения.
В анимации: стрелки показывают score field для смеси двух гауссиан. Оранжевые точки — частицы, идущие по Ланжевену.
🔜 Завтра: DDIM — как превратить 1000 шагов в 50
Метаданные
- Файлы: score_matching_animation.py → score_matching_animation.mp4
- Хэштеги: #нейросети #диффузия #scoreMatching #Langevin #deeplearning
- CTA: “Score field — это что-то знакомое из оптимизации. Что?”
- Связь с каналом: Langevin = SGD + noise → score matching это оптимизация наоборот