Вам, наверное, интересно, как Эндрю Нг приходит к формулам обратного распространения для нейронной градиентной сети на 3-й неделе первого курса своей специализации по глубокому обучению на Coursera:

Типичный студент-самоучка, вероятно, на этом этапе своей карьеры в области машинного обучения будет озадачен тем, как выглядит эта формула. Даже если вы, как и я, прошли превосходный курс линейной алгебры Гилберта Стрэнга, вам все равно будет трудно понять вывод этих формул. Различные авторы либо предполагают, что кто-то должен был пройти курс матричного исчисления, либо, по крайней мере, иметь учебник по основным операциям. Или, возможно, детали слишком утомительны, чтобы их печатать, что отвлекает от курса, основное внимание в котором уделяется приложениям.

Не бойся! Я здесь чтобы помочь.

После долгих исследований и обзоров различных вариантов обратного распространения я хотел бы поделиться простым, но нетривиальным выводом, который показывает читателю пошаговые вычисления. Это написано, чтобы свести к минимуму утомительные вычисления. Он не волнистый, однако предполагает минимальное знакомство читателя с матричным исчислением. В разделе комментариев я также могу указать вам точный справочный источник, если какой-либо шаг будет неясен.

Прежде чем мы начнем, мы будем использовать схему знаменателя и все различные производные, связанные с такой нотацией (связанные, а также по ссылке):

Давайте начнем. Доказательство вычислений начинается с цепного правила для векторов/матриц с использованием последней строки этого раздела: Матричное исчисление — Википедия.

Остановимся на каждом компоненте.

Мы вычисляем первую компоненту (∂a^[1] )/(∂z^[1]), признавая, что это производная вектора по отношению к вектору, из которого мы получим матрицу. См. ссылки внизу для более подробной информации.

Поскольку σ () является поэлементной функцией, мы берем производную по отдельным компонентам вектора . Чтобы упростить обозначения, мы обозначаем g ^ [1] через сам g:

Второе вышеприведенное равенство связано с тем, что функция g допускает только один вход за раз, а элементы Z_i не являются явными функциями друг друга

Мы можем вычислить da^[1] аналогично цепному правилу, поместив внешние функции справа, а внутренние слева. В этом случае мы имеем функциональную композицию L(z^[2] (a^[1] ))

Используя (1), (2) и (3), имеем

Где (b) исходит из того факта, что при умножении влево на диагональную матрицу вы умножаете каждую строку правой матрицы на диагональные элементы. В последнем равенстве поэлементное умножение * является коммутативным.

Вот оно! Дайте мне знать, если у вас есть какие-либо вопросы или предложения в комментарии ниже. Если вам понравилась статья и вы хотели бы видеть дальнейшие разъяснения, пожалуйста, дайте мне знать, похлопав в ладоши.

Спасибо за чтение!

Ссылки:

Получение уравнений обратного распространения с нуля (Часть 2) | Томас Курбиэль |

Матричная дифференциация — здесь вы можете найти ключевые результаты матричной дифференциации для машинного обучения и линейной регрессии.