Strategy/content/score_matching_post.md
+

score_matching_post

review_statusnew
projectfminxyz
creation_date2026-02-25

@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 это оптимизация наоборот
Choose icon