Многие подходы к глубокому обучению, такие как DNN, CNN, RNN, всегда были черными ящиками, дающими потрясающие результаты. Но математика, стоящая за этими встроенными функциями NN, всегда была менее интересной областью для изучения из-за требуемого терпения. Но понимание математики, стоящей за этими нейронными сетями, прокладывает путь для многих инновационных подходов к их использованию.

Еще одна трудность — отставание от понимания того, как чисто математическое понятие преобразуется в код, и связанных с этим проблем программирования. Я бы попытался восполнить этот пробел, объяснив математические концепции вместе с кодом.

Общие обозначения:

Базовое исчисление (перейдите к части кода, если вы уже это знаете)

Рассмотрим простое уравнение:

График для уравнения

Допустим, наша цель — вычислить значение f’(2). Наш интуитивный способ — сначала вывести f’(x), а затем вычислить f’(2)

Но этот подход с первым вычислением производной и подстановкой значений становится трудным для реализации кода, когда речь идет о некоторых неполиномиальных функциях, таких как сигмоидальная функция, круговые функции и т. д.

поэтому мы углубимся в значение производной как наклона кривой в конкретной точке, которая

Поэтому,

Код, реализующий f’(x) для функций f(x)=square(x) и

f (x) = сигмоид (x) выглядит следующим образом

Сетевое правило:

Пусть f(x)=u(v(x)), которая является функцией функции.

Фрагмент кода для того же

Для расчета f’(n) в этом случае используется общая формула

Фрагмент кода для вычисления того же и результат

Точно так же его можно расширить для длины цепочки 3.

Несколько входных данных для функции:

Значение частной производной z по x в точке (x_0,y_0) вычисляется как

Код для вышеизложенного

Матричный расчет

С,

Следовательно ,

Другой пример, когда X и W являются многомерными массивами, а расчет сигмоида (X, Y) выглядит следующим образом.

В этом случае, если матрицы X, W и (X ×W) имеют разные размеры, вычисление частной производной матрицы (X ×W) по X будет сделано с помощью лямбда-функции.

Следовательно ,

Наконец, сводка составных функций из

Теперь у нас есть L, который возвращает единственное значение, которое можно рассматривать как функцию X и W. Теперь мы можем вычислить, как изменится значение L при изменении элемента этих входных матриц (x₁₁,w₁₁ и т. д.), который равен не что иное, как его производная по X. Это представляется как

По цепному правилу

  1. Возьмите первый элемент (частная производная от L по S):

Из уравнения 2

2.Возьмите второй элемент (частная производная от S по N):

3. Возьмите третий и последний элемент (частная производная от S по N):

Из уравнения 1:

Следовательно .,

Код для всего вышеперечисленного

Поскольку мы реализовали базовое матричное исчисление в Python, теперь мы можем попытаться реализовать нейронные сети, которые в основном основаны на обратном распространении и градиентном спуске, которые, в свою очередь, в основном полагаются на это цепное правило в исчислении.