Многие подходы к глубокому обучению, такие как 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. Это представляется как
По цепному правилу
- Возьмите первый элемент (частная производная от L по S):
Из уравнения 2
2.Возьмите второй элемент (частная производная от S по N):
3. Возьмите третий и последний элемент (частная производная от S по N):
Из уравнения 1:
Следовательно .,
Код для всего вышеперечисленного
Поскольку мы реализовали базовое матричное исчисление в Python, теперь мы можем попытаться реализовать нейронные сети, которые в основном основаны на обратном распространении и градиентном спуске, которые, в свою очередь, в основном полагаются на это цепное правило в исчислении.