Backward для своего слоя
Вопрос
Вас просят реализовать backward для полносвязного слоя с батчем на numpy. Проговорите формулы и размерности.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Вход X (B×d_in), веса W (d_in×d_out), выход Y = XW + b
dW = Xᵀ·dY (d_in×d_out), db = сумма dY по батчу
dX = dY·Wᵀ (B×d_in)
Сумма или среднее по батчу согласована с loss
Проверка численным градиентом на маленьком примере
Что могут спросить следом
- Как изменятся формулы для ReLU после слоя?
- Почему db это сумма по строкам?
Разбор
Пусть X размера B×d_in, W размера d_in×d_out, b длины d_out, Y = XW + b размера B×d_out, и сверху пришёл dY той же формы. Тогда dW = Xᵀ·dY: размер d_in×d_out, совпадает с W, и это сумма вкладов всех объектов батча. db = сумма dY по батчу (по строкам), потому что смещение добавляется к каждому объекту. dX = dY·Wᵀ размера B×d_in, его передаём в предыдущий слой. Если loss усреднён по батчу, деление на B уже сидит в dY. Для ReLU после слоя dY умножается на маску (вход > 0). Проверяю размерности на каждом шаге и сверяю с численным градиентом центральной разностью на маленьком примере в float64.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.