Это 8-й день моего участия в августовском испытании обновлений.Подробности о событии:Испытание августовского обновления
Эта статья является второй в серии заметок по курсу машинного обучения Эндрю Нг. В ней в основном изучаются принципы алгоритма и вывод прямого и обратного распространения нейронной сети.
Основы нейронной сети
Введение концепции
Искусственная нейронная сеть для краткостиНейронная сеть (NN). Нейронная сеть представляет собой математическую модель, имитирующую структуру нейронов человека, а соединения ее нейронов фиксируются. Нейроны обновляются путем прямого и обратного распространения. Проще говоря, нейронная сеть состоит из ряда нейронных слоев, каждый из которых содержит множество нейронов.
Нейронную сеть можно логически разделить на три слоя:
- Входной слой: первый слой, получающий функцииx.
- Выходной слой: последний слой, который выводит гипотезу для окончательного прогноза.h.
- Скрытые слои: промежуточные слои, которые не видны напрямую.
Функции:
- Каждая нейронная сеть имеет входные и выходные значения
- Как пройти обучение:
- массивный набор данных
- тысячи тренировок
- Учитесь на ошибках, сравнивайте разницу между предсказанным ответом и реальным ответом и применяйте обратное распространение, чтобы улучшить распознавание.
Ниже приводится подробное введение в простейшую двухслойную нейронную сеть в качестве примера:
В приведенной выше нейронной сети запишите вектор входных признаков какx, матрица весовых параметровW, параметр смещенияb,aУказывает выход каждого нейрона, а верхний индекс указывает количество слоев нейронной сети (скрытый слой равен 1).
формула:
- z=WTx+b
- a=g(z)=1+e−z1
Шаги расчета нейронной сети:
- Сначала вычислите число корреляции каждого узла в сети первого уровня.z[1]=W[1]Tx+b
- Рассчитано с использованием функции активацииa[1]=g(z[1])
- То же самое верно и для следующего слоя, и этот расчет выполняется до тех пор, пока не будет получен окончательный вывод.a[2]
- Окончательную функцию потерь можно получить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
⎣⎢⎢⎡a1[1]a2[1]a3[1]⎦⎥⎥⎤3×1=⎣⎢⎢⎡g(z1[1])g(z2[1])g(z3[1])⎦⎥⎥⎤3×1
Формула второго слоя:
[z[2]]1×1=[W11[2]T...]1×3*⎣⎢⎢⎡a1[1]a2[1]a3[1]⎦⎥⎥⎤3×1+[b[2]]1×1
[a[2]]1×1=[g(z[2])]1×1
выходной слой:
Loss(a[2],y)=−ylog(a[2])−(1−y)log(1−a[2])
Эта формула очень похожа на функцию затрат в логистической регрессии.
прямое распространение
Популярное понимание, начиная с входного слоя, каждый слой вычисляетa[i](z)значение, продолжайте вычислять слой за слоем, пока выходной слой не выведет окончательное значение, а затем вычислите ошибку со значением метки.LossЭтот процесс называется прямым распространением.
Процесс прямого распространения в приведенном выше примере:
- z[1]=W[1]x+b[1]
- a[1]=g(z[1])
- z[2]=W[2]a[1]+b[2]
- a[2]=g(z[2])
- Loss(a[2],y)=−ylog(a[2])−(1−y)log(1−a[2])
Многовыборочная векторизация
Так называемая мультивыборка — это когда входной признак уже не простой вектор, а матрица. Принцип на самом деле тот же, единственная оговорка в том, чтоРазмеры матрицы, чтобы соответствовать.
Предположим, что обучающие выборкиmСоответственно, приведенную выше формулу необходимо обновить следующим образом:
- Z=WTX+b
- Для одного образца:z[1](i)=WTx(i)+b[1]
- X=⎣⎢⎢⎢⎡⋮x(1)⋮⋮x(2)⋮⋮x(m)⋮⎦⎥⎥⎥⎤
- Z[1]=⎣⎢⎢⎢⎡⋮z[1](1)⋮⋮z[1](2)⋮⋮z[1](m)⋮⎦⎥⎥⎥⎤
- A[1]=⎣⎢⎢⎢⎡⋮a[1](1)⋮⋮a[1](2)⋮⋮a[1](m)⋮⎦⎥⎥⎥⎤
функция активации
Зачем нужна нелинейная функция активации?
Если функция активации удалена или функция активации является линейной, комбинация любых двух линейных функций по-прежнему будет линейной, что приведет к тому, что независимо от того, сколько слоев нейронной сети, операция, которую вы выполняете, всегда будет вычислять линейную функцию. , и скрытый слой будет бесполезен.
Вот три общие функции активации:
Sigmoidфункция
- о(z)=1+e−z1
-
о'(z)=о(z)(1−о(z))очень полезные свойства
tanhфункция
- tanh(z)=ez+e−zez−e−z
- Очевидно, что диапазон[−1,1]
- tanh'(z)=1−(tanh(z))2
Relu функция
-
g(z)=max(0,z)
-
g'(z)=⎩⎪⎪⎨⎪⎪⎧01undefinedifz<0ifz>0ifz=0
-
LeakyReluфункция
- g(z)=max(0.01z,z)
- g'(z)=⎩⎪⎪⎨⎪⎪⎧0.011undefinedifz<0ifz>0ifz=0
-
-
наиболее широко используется
Механизм градиентного спуска нейронной сети
Мы знаем, что нейронная сеть может содержать несколько скрытых слоев, нейроны в каждом слое будут давать прогнозы, а окончательная ошибка вычисляется в выходном слое, поэтому как оптимизировать окончательную функцию потерьL(a[i],y)?
Очевидно, что правило градиентного спуска традиционных задач регрессии, таких как логистическая регрессия, здесь не может быть применено напрямую, потому что нам нужно рассматривать ошибку слой за слоем и оптимизировать слой за слоем.Алгоритм обратного распространения(Алгоритм обратного распространения) для оптимизации ошибки.
Вывод обратного распространения
Сначала рассмотрим функцию потерьloss function:
- Loss(a[L],y)=−ylog(a[L])−(1−y)log(1−a[L])
Мы знаем, что прямое распространение вычисляет окончательное значение от начала к концу шаг за шагом из входного слоя.Обратное распространение, как следует из названия, на самом деле является производным от заднего к переднему, но этот процесс вывода основан на окончательной функции потерь. предвзятость перед. Метод вывода основан наПравило цепи.
Спереди мы знаем процесс прямого распространения:
- z[1]=W[1]x+b[1]
- a[1]=g(z[1])
- z[2]=W[2]a[1]+b[2]
- a[2]=g(z[2])
- Loss(a[2],y)=−ylog(a[2])−(1−y)log(1−a[2])
Тогда процесс обратного распространения выглядит следующим образом:
выходной слой:
- da[2]=∂a[2]∂Loss=−a[2]y+1−a[2]1−y
- dz[2]=∂a[2]∂Loss⋅dz[2]da[2]=(−a[2]y+1−a[2]1−y)⋅a[2](1−a[2])=a[2]−y
- dW[2]=∂a[2]∂Loss⋅dz[2]da[2]⋅dW[2]dz[2]=dz[2]a[1]T
- db[2]=∂a[2]∂Loss⋅dz[2]da[2]⋅db[2]dz[2]=dz[2]
Второй этаж:
- da[1]=∂a[2]∂Loss⋅dz[2]da[2]⋅da[1]dz[2]=W[2]Tdz[2]
- dz[1]=∂a[2]∂Loss⋅dz[2]da[2]⋅da[1]dz[2]⋅dz[1]da[1]=W[2]Tdz[2]*g'(z[1])
- dW[1]=∂a[2]∂Loss⋅dz[2]da[2]⋅da[1]dz[2]⋅dz[1]da[1]⋅dW[1]dz[1]=dz[1]xT
- db[1]=∂a[2]∂Loss⋅dz[2]da[2]⋅da[1]dz[2]⋅dz[1]da[1]⋅db[1]dz[1]=dz[1]
Входной слой не нужно вычислять.
Определим ошибку каждого слоя как векторδ(l),lУказывает количество слоев,LУказывает общее количество слоев. Из приведенного выше вывода мы можем получить:
δ(l)={a(l)−yW[l+1]Tdz[l+1]*g[l]'(z[l])l=Ll=2,3,...,L−1
Для m выборок тогда
- dz[2]=A[2]−y
- dW[2]=m1dz[2]a[1]T
- db[2]=m1np.sum(dZ[2],axis=1,keepdims=True)
Вышеизложенное является подробным выводом обратного распространения.Если вы можете понять вывод цепи, принцип вывода обратного распространения будет очень прост для понимания.