Как проверить, что градиент посчитан верно
Вопрос
Вы реализовали свой слой с ручным backward. Как убедиться, что градиенты правильные?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
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 ошибок.