Нейронные сети и обратное распространение для введения в машинное обучение

машинное обучение

Это 8-й день моего участия в августовском испытании обновлений.Подробности о событии:Испытание августовского обновления

Эта статья является второй в серии заметок по курсу машинного обучения Эндрю Нг. В ней в основном изучаются принципы алгоритма и вывод прямого и обратного распространения нейронной сети.

Основы нейронной сети

Введение концепции

Искусственная нейронная сеть для краткостиНейронная сеть (NN). Нейронная сеть представляет собой математическую модель, имитирующую структуру нейронов человека, а соединения ее нейронов фиксируются. Нейроны обновляются путем прямого и обратного распространения. Проще говоря, нейронная сеть состоит из ряда нейронных слоев, каждый из которых содержит множество нейронов.

Нейронную сеть можно логически разделить на три слоя:

  • Входной слой: первый слой, получающий функцииxx.
  • Выходной слой: последний слой, который выводит гипотезу для окончательного прогноза.hh.
  • Скрытые слои: промежуточные слои, которые не видны напрямую.

Функции:

  • Каждая нейронная сеть имеет входные и выходные значения
  • Как пройти обучение:
    • массивный набор данных
    • тысячи тренировок
    • Учитесь на ошибках, сравнивайте разницу между предсказанным ответом и реальным ответом и применяйте обратное распространение, чтобы улучшить распознавание.

Ниже приводится подробное введение в простейшую двухслойную нейронную сеть в качестве примера:

请添加图片描述

В приведенной выше нейронной сети запишите вектор входных признаков какxx, матрица весовых параметровWW, параметр смещенияbb,aaУказывает выход каждого нейрона, а верхний индекс указывает количество слоев нейронной сети (скрытый слой равен 1).

формула:

  • z=WTx+bz=W^Tx+b
  • a=g(z)=11+eza=g(z)=\dfrac{1}{1+e^{-z}}

Шаги расчета нейронной сети:

  • Сначала вычислите число корреляции каждого узла в сети первого уровня.z[1]=W[1]Tx+bz^{[1]}=W^{[1]^T} x+b
  • Рассчитано с использованием функции активацииa[1]=g(z[1])a^{[1]} = g(z^{[1]})
  • То же самое верно и для следующего слоя, и этот расчет выполняется до тех пор, пока не будет получен окончательный вывод.a[2]a^{[2]}
  • Окончательную функцию потерь можно получитьLoss(a[2],y)Loss(a^{[2]},y)

векторизованное вычисление

Формула первого слоя:

[z1[1]z2[1]z3[1]]3×1=[W11[1]T...W21[1]T...W31[1]T...]3×3*[x1x2x3]3×1+[b1[1]b2[1]b3[1]]3×1\begin{bmatrix}z_1^{[1]} \\z_2^{[1]} \\z_3^{[1]} \end{bmatrix}_{3\times1}=\begin{bmatrix}W_{11}^{[1]^T}...\\W_{21}^{[1]^T}...\\W_{31}^{[1]^T}...\\\end{bmatrix}_{3\times3}*\begin{bmatrix}x_1\\x_2\\x_3\\ \end{bmatrix}_{3\times1}+\begin{bmatrix}b_1^{[1]}\\b_2^{[1]}\\b_3^{[1]}\\\end{bmatrix}_{3\times1}

[a1[1]a2[1]a3[1]]3×1=[g(z1[1])g(z2[1])g(z3[1])]3×1\begin{bmatrix}a_1^{[1]} \\a_2^{[1]} \\a_3^{[1]} \end{bmatrix}_{3\times1}=\begin{bmatrix}g(z_1^{[1]})\\g(z_2^{[1]}) \\g(z_3^{[1]}) \end{bmatrix}_{3\times1}

Формула второго слоя:

[z[2]]1×1=[W11[2]T...]1×3*[a1[1]a2[1]a3[1]]3×1+[b[2]]1×1\begin{bmatrix}z^{[2]}\end{bmatrix}_{1\times1}=\begin{bmatrix}W_{11}^{[2]^T}...\end{bmatrix}_{1\times3}*\begin{bmatrix}a_1^{[1]} \\a_2^{[1]} \\a_3^{[1]} \end{bmatrix}_{3\times1}+\begin{bmatrix}b^{[2]}\end{bmatrix}_{1\times1}

[a[2]]1×1=[g(z[2])]1×1\begin{bmatrix}a^{[2]}\end{bmatrix}_{1\times1}=\begin{bmatrix}g(z^{[2]})\end{bmatrix}_{1\times1}

выходной слой:

Loss(a[2],y)=ylog(a[2])(1y)log(1a[2])Loss(a^{[2]},y)=-ylog(a^{[2]})-(1-y)log(1-a^{[2]})

Эта формула очень похожа на функцию затрат в логистической регрессии.

прямое распространение

Популярное понимание, начиная с входного слоя, каждый слой вычисляетa[i](z)a^{[i]}(z)значение, продолжайте вычислять слой за слоем, пока выходной слой не выведет окончательное значение, а затем вычислите ошибку со значением метки.LossLossЭтот процесс называется прямым распространением.

Процесс прямого распространения в приведенном выше примере:

  1. z[1]=W[1]x+b[1]z^{[1]}=W^{[1]}x+b^{[1]}
  2. a[1]=g(z[1])a^{[1]}=g(z^{[1]})
  3. z[2]=W[2]a[1]+b[2]z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}
  4. a[2]=g(z[2])a^{[2]}=g(z^{[2]})
  5. Loss(a[2],y)=ylog(a[2])(1y)log(1a[2])Loss(a^{[2]},y)=-ylog(a^{[2]})-(1-y)log(1-a^{[2]})

Многовыборочная векторизация

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

Предположим, что обучающие выборкиmmСоответственно, приведенную выше формулу необходимо обновить следующим образом:

  • Z=WTX+bZ=W^TX+b
  • Для одного образца:z[1](i)=WTx(i)+b[1]z^{[1](i)}=W^Tx^{(i)}+b^{[1]}
  • X=[x(1)x(2)x(m)]X=\begin{bmatrix} \vdots&\vdots&\vdots\\x^{(1)}&x^{(2)}&x^{(m)}\\\vdots&\vdots&\vdots\end{bmatrix}
  • Z[1]=[z[1](1)z[1](2)z[1](m)]Z^{[1]}=\begin{bmatrix} \vdots&\vdots&\vdots\\z^{[1](1)}&z^{[1](2)}&z^{[1](m)}\\\vdots&\vdots&\vdots\end{bmatrix}
  • A[1]=[a[1](1)a[1](2)a[1](m)]A^{[1]}=\begin{bmatrix} \vdots&\vdots&\vdots\\a^{[1](1)}&a^{[1](2)}&a^{[1](m)}\\\vdots&\vdots&\vdots\end{bmatrix}

функция активации

Зачем нужна нелинейная функция активации?

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

Вот три общие функции активации:

Sigmoid\mathbf {Sigmoid}функция

  • о(z)=11+ez\sigma(z)=\dfrac{1}{1+e^{-z}}
  • о'(z)=о(z)(1о(z))\sigma'(z)=\sigma(z)(1-\sigma(z))очень полезные свойства
  • 在这里插入图片描述

tanh\mathbf {tanh}функция

  • tanh(z)=ezezez+eztanh(z)=\dfrac{e^z-e^{-z}}{e^z+e^{-z}}
  • Очевидно, что диапазон[1,1][-1,1]
  • tanh'(z)=1(tanh(z))2tanh'(z)=1-(tanh(z))^2
  • 在这里插入图片描述

Relu\mathbf {Relu} функция

  • g(z)=max(0,z)g(z)=max(0,z)

  • g'(z)={0if  z<01if  z>0undefinedif  z=0g'(z)=\begin{cases}0&if\;z<0 \\1&if\;z>0\\undefined&if\;z=0\end{cases}

  • LeakyReluLeaky Reluфункция

    • g(z)=max(0.01z,z)g(z)=max(0.01z,z)
    • g'(z)={0.01if  z<01if  z>0undefinedif  z=0g'(z)=\begin{cases}0.01&if\;z<0 \\1&if\;z>0\\undefined&if\;z=0\end{cases}
  • 在这里插入图片描述

  • наиболее широко используется

Механизм градиентного спуска нейронной сети

Мы знаем, что нейронная сеть может содержать несколько скрытых слоев, нейроны в каждом слое будут давать прогнозы, а окончательная ошибка вычисляется в выходном слое, поэтому как оптимизировать окончательную функцию потерьL(a[i],y)L(a^{[i]},y)?

Очевидно, что правило градиентного спуска традиционных задач регрессии, таких как логистическая регрессия, здесь не может быть применено напрямую, потому что нам нужно рассматривать ошибку слой за слоем и оптимизировать слой за слоем.Алгоритм обратного распространения(Алгоритм обратного распространения) для оптимизации ошибки.

Вывод обратного распространения

Сначала рассмотрим функцию потерьloss function:

  • Loss(a[L],y)=ylog(a[L])(1y)log(1a[L])Loss(a^{[L]},y)=-ylog(a^{[L]})-(1-y)log(1-a^{[L]})

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

Спереди мы знаем процесс прямого распространения:

  1. z[1]=W[1]x+b[1]z^{[1]}=W^{[1]}x+b^{[1]}
  2. a[1]=g(z[1])a^{[1]}=g(z^{[1]})
  3. z[2]=W[2]a[1]+b[2]z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}
  4. a[2]=g(z[2])a^{[2]}=g(z^{[2]})
  5. Loss(a[2],y)=ylog(a[2])(1y)log(1a[2])Loss(a^{[2]},y)=-ylog(a^{[2]})-(1-y)log(1-a^{[2]})

Тогда процесс обратного распространения выглядит следующим образом:

выходной слой:

  1. da[2]=Lossa[2]=ya[2]+1y1a[2]da^{[2]}=\dfrac{\partial Loss}{\partial a^{[2]}}=-\dfrac{y}{a^{[2]}}+\dfrac{1-y}{1-a^{[2]}}
  2. dz[2]=Lossa[2]da[2]dz[2]=(ya[2]+1y1a[2])a[2](1a[2])=a[2]ydz^{[2]}=\dfrac{\partial Loss}{\partial a^{[2]}}\cdot\dfrac{d a^{[2]}}{d z^{[2]}}=(-\dfrac{y}{a^{[2]}}+\dfrac{1-y}{1-a^{[2]}})\cdot a^{[2]}(1-a^{[2]})=a^{[2]}-y
  3. dW[2]=Lossa[2]da[2]dz[2]dz[2]dW[2]=dz[2]a[1]TdW^{[2]}=\dfrac{\partial Loss}{\partial a^{[2]}}\cdot\dfrac{d a^{[2]}}{d z^{[2]}}\cdot\dfrac{d z^{[2]}}{d W^{[2]}}=dz^{[2]}a^{[1]^T}
  4. db[2]=Lossa[2]da[2]dz[2]dz[2]db[2]=dz[2]db^{[2]}=\dfrac{\partial Loss}{\partial a^{[2]}}\cdot\dfrac{d a^{[2]}}{d z^{[2]}}\cdot\dfrac{d z^{[2]}}{d b^{[2]}}=dz^{[2]}

Второй этаж:

  1. da[1]=Lossa[2]da[2]dz[2]dz[2]da[1]=W[2]Tdz[2]da^{[1]}=\dfrac{\partial Loss}{\partial a^{[2]}}\cdot\dfrac{d a^{[2]}}{d z^{[2]}}\cdot\dfrac{d z^{[2]}}{d a^{[1]}}=W^{[2]^T}dz^{[2]}
  2. dz[1]=Lossa[2]da[2]dz[2]dz[2]da[1]da[1]dz[1]=W[2]Tdz[2]*g'(z[1])dz^{[1]}=\dfrac{\partial Loss}{\partial a^{[2]}}\cdot\dfrac{d a^{[2]}}{d z^{[2]}}\cdot\dfrac{d z^{[2]}}{d a^{[1]}}\cdot\dfrac{d a^{[1]}}{d z^{[1]}}=W^{[2]^T}dz^{[2]}*g'(z^{[1]})
  3. dW[1]=Lossa[2]da[2]dz[2]dz[2]da[1]da[1]dz[1]dz[1]dW[1]=dz[1]xTdW^{[1]}=\dfrac{\partial Loss}{\partial a^{[2]}}\cdot\dfrac{d a^{[2]}}{d z^{[2]}}\cdot\dfrac{d z^{[2]}}{d a^{[1]}}\cdot\dfrac{d a^{[1]}}{d z^{[1]}}\cdot\dfrac{d z^{[1]}}{d W^{[1]}}=dz^{[1]}x^T
  4. db[1]=Lossa[2]da[2]dz[2]dz[2]da[1]da[1]dz[1]dz[1]db[1]=dz[1]db^{[1]}=\dfrac{\partial Loss}{\partial a^{[2]}}\cdot\dfrac{d a^{[2]}}{d z^{[2]}}\cdot\dfrac{d z^{[2]}}{d a^{[1]}}\cdot\dfrac{d a^{[1]}}{d z^{[1]}}\cdot\dfrac{d z^{[1]}}{d b^{[1]}}=dz^{[1]}

Входной слой не нужно вычислять.

Определим ошибку каждого слоя как векторδ(l)\delta^{(l)} ,llУказывает количество слоев,LLУказывает общее количество слоев. Из приведенного выше вывода мы можем получить:

δ(l)={a(l)yl=LW[l+1]Tdz[l+1]*g[l]'(z[l])l=2,3,...,L1\delta^{(l)}=\begin{cases}a^{(l)}-y&l=L\\W^{[l+1]^T}dz^{[l+1]}*g^{[l]\prime}(z^{[l]}) &l=2,3,...,L-1 \end{cases}

Для m выборок тогда

  1. dz[2]=A[2]ydz^{[2]}=A^{[2]}-y
  2. dW[2]=1mdz[2]a[1]TdW^{[2]}=\dfrac{1}{m}dz^{[2]}a^{[1]^T}
  3. db[2]=1mnp.sum(dZ[2],axis=1,keepdims=True)db^{[2]}=\dfrac{1}{m} np.sum(dZ^{[2]},axis=1,keepdims=True)

Вышеизложенное является подробным выводом обратного распространения.Если вы можете понять вывод цепи, принцип вывода обратного распространения будет очень прост для понимания.