Вам, наверное, интересно, как Эндрю Нг приходит к формулам обратного распространения для нейронной градиентной сети на 3-й неделе первого курса своей специализации по глубокому обучению на Coursera:
Типичный студент-самоучка, вероятно, на этом этапе своей карьеры в области машинного обучения будет озадачен тем, как выглядит эта формула. Даже если вы, как и я, прошли превосходный курс линейной алгебры Гилберта Стрэнга, вам все равно будет трудно понять вывод этих формул. Различные авторы либо предполагают, что кто-то должен был пройти курс матричного исчисления, либо, по крайней мере, иметь учебник по основным операциям. Или, возможно, детали слишком утомительны, чтобы их печатать, что отвлекает от курса, основное внимание в котором уделяется приложениям.
Не бойся! Я здесь чтобы помочь.
После долгих исследований и обзоров различных вариантов обратного распространения я хотел бы поделиться простым, но нетривиальным выводом, который показывает читателю пошаговые вычисления. Это написано, чтобы свести к минимуму утомительные вычисления. Он не волнистый, однако предполагает минимальное знакомство читателя с матричным исчислением. В разделе комментариев я также могу указать вам точный справочный источник, если какой-либо шаг будет неясен.
Прежде чем мы начнем, мы будем использовать схему знаменателя и все различные производные, связанные с такой нотацией (связанные, а также по ссылке):
Давайте начнем. Доказательство вычислений начинается с цепного правила для векторов/матриц с использованием последней строки этого раздела: Матричное исчисление — Википедия.
Остановимся на каждом компоненте.
Мы вычисляем первую компоненту (∂a^[1] )/(∂z^[1]), признавая, что это производная вектора по отношению к вектору, из которого мы получим матрицу. См. ссылки внизу для более подробной информации.
Поскольку σ () является поэлементной функцией, мы берем производную по отдельным компонентам вектора . Чтобы упростить обозначения, мы обозначаем g ^ [1] через сам g:
Второе вышеприведенное равенство связано с тем, что функция g допускает только один вход за раз, а элементы Z_i не являются явными функциями друг друга
Мы можем вычислить da^[1] аналогично цепному правилу, поместив внешние функции справа, а внутренние слева. В этом случае мы имеем функциональную композицию L(z^[2] (a^[1] ))
Используя (1), (2) и (3), имеем
Где (b) исходит из того факта, что при умножении влево на диагональную матрицу вы умножаете каждую строку правой матрицы на диагональные элементы. В последнем равенстве поэлементное умножение * является коммутативным.
Вот оно! Дайте мне знать, если у вас есть какие-либо вопросы или предложения в комментарии ниже. Если вам понравилась статья и вы хотели бы видеть дальнейшие разъяснения, пожалуйста, дайте мне знать, похлопав в ладоши.
Спасибо за чтение!
Ссылки:
Получение уравнений обратного распространения с нуля (Часть 2) | Томас Курбиэль |
Матричная дифференциация — здесь вы можете найти ключевые результаты матричной дифференциации для машинного обучения и линейной регрессии.