Ответ вслух Middle Производные и градиент обновлено

Как проверить, что градиент посчитан верно

Вопрос

Вы реализовали свой слой с ручным backward. Как убедиться, что градиенты правильные?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Стандартный способ это gradient checking. Для каждого параметра (или случайной выборки параметров) считаю численную производную центральной разностью (L(w + h) - L(w - h)) / 2h и сравниваю с аналитической через относительную ошибку a - n / max(a, n, ε).

Что должно прозвучать в ответе

  • Gradient checking: сравнить с численным градиентом центральной разностью

  • float64 и h порядка 1e-5..1e-6, относительная ошибка

  • Проверять на маленьких входах и нескольких случайных точках

  • Отключить недифференцируемые места и стохастику (dropout) на время проверки

  • Инструменты: torch.autograd.gradcheck

Что могут спросить следом

  • Почему нельзя взять h = 1e-12?
  • Как проверка ведёт себя около изломов ReLU?

Разбор

Стандартный способ это gradient checking. Для каждого параметра (или случайной выборки параметров) считаю численную производную центральной разностью (L(w + h) - L(w - h)) / 2h и сравниваю с аналитической через относительную ошибку |a - n| / max(|a|, |n|, ε). Делаю это в float64 с h около 1e-5..1e-6: при меньшем h вычитание почти равных чисел даёт ошибку округления, при большем растёт ошибка самой формулы, она порядка h². Значение около 1e-7 и меньше считаю нормой, около 1e-3 и больше ищу баг. Проверяю на маленьких тензорах в нескольких случайных точках, выключаю dropout и другую случайность, держусь подальше от изломов вроде нуля у ReLU, где численная разность врёт. В PyTorch для этого есть готовый torch.autograd.gradcheck, который сравнивает аналитический якобиан с численным.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.