Эндрю Нг Машинное обучение: нейронная сеть | Алгоритм обратного распространения ошибки

машинное обучение Python алгоритм
Эндрю Нг Машинное обучение: нейронная сеть | Алгоритм обратного распространения ошибки

Эндрю Нг Машинное обучение: нейронная сеть | Алгоритм обратного распространения ошибки

Мы учились на прошлой неделеНейронные сети |Задачи мультиклассификации. Мы используемлогистическая регрессияиНейронные сетидля решения задач множественной классификации и узнал, что нейронные сети более эффективны, когда количество признаков очень велико. В классе на этой неделе будет обучениеНейронные сетиИспользовалфункция стоимостии использоватьобратное распространениеалгоритм вычисления градиента. Автор даст.обратное распространениеВажные идеи и выводы в алгоритме, но не все вычислительные шаги.

нажмитеВидео курсаВы сможете изучать курсы Нг без перерыва, код Python для курсовой работы выложен на Github, нажмитекод курсаВы можете перейти на Github для просмотра (если у вас нет доступа к Github, вы можете нажатьCodingПроверьте ), ошибки и улучшения в коде приветствуются.

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

функция стоимости

Предположим, что наша задача мультиклассификации имеетKклассификации нейронная сеть имеет в общей сложностиLслоев, число нейронов в каждом слое равноs_l, то нейронная сетьфункция стоимостиза:

J(Θ)=−1мм∑i=1K∑k=1(y(i)klog(hΘ(x(i))k+(1−y(i)k)log(1−(hΘ(x(i ) )))k))+λ2mL−1∑l=1sl∑i=1sl+1∑j=1(Θ(l)ji)2

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

Расчет градиента

чтобы иметь возможность использоватьградиентный спускАлгоритм обучения сети, нам нужно вычислить градиент функции стоимости. Очень интуитивный метод заключается в использовании численного расчета для определенного\Theta_{ij}, добавить и вычесть небольшое количество к нему\epsilonдля расчета градиента:

∂J(θ)∂θj≈J(θ1,⋯,θj+ϵ,⋯,θn)−J(θ1,⋯,θj−ϵ,⋯,θn)2ϵ

Но небольшой анализ сложности алгоритма показывает, что этот метод очень медленный. Для каждого набора данных нам нужно рассчитать градиент всех значений,Общее количество вычислений = количество обучающих данных х количество весов сети х количество расчетов прямого распространения. Такая сложность неприемлема в обычных условиях, поэтому мы используем этот метод только для проверкиобратное распространениеВерен ли градиент, рассчитанный алгоритмом.

Правило цепи

Чтобы понять последующееобратное распространениеДля вывода формулы мы должны сначала понять вывод многомерной составной функции.Правило цепи. для многомерных функцийz=f(u,v)u=h(x,y),v=g(x,y),Так:

∂z∂x=∂z∂u∂u∂x+∂z∂v∂v∂x∂z∂y=∂z∂u∂u∂y+∂z∂v∂v∂y

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

На картинке выше автор намеренно добавил лишний слой, здесьpдаu,vФункция,qдаu,vФункция,zдаp,qФункция. для расчетного\frac{\partial z}{\partial x}и\frac{\partial z}{\partial y}, приведенное выше уравнение остается в силе, потому что мы можем положитьzвидеть какu,vФункция. Это эквивалентно тому, что мы поместили:

∂z∂x=∂z∂p∂p∂u∂u∂x+∂z∂p∂p∂v∂v∂x+∂z∂q∂q∂u∂u∂x+∂z∂q∂q∂v∂ v∂x

Упростите результат, рассчитанный предыдущим слоем, чтобы он был связан только с предыдущим слоем.\frac{\partial z}{\partial u}и\frac{\partial z}{\partial v}Вместо того, чтобы начинать с нуля:

∂z∂x=∂z∂u∂u∂x+∂z∂v∂v∂x

В общем, для функцийy, если его можно рассматривать какz_1,z_2 \cdots,z_nфункция, иz_iзаtфункция, то:

∂y∂t=n∑i=1∂y∂zi∂zi∂t

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

Вывод формулы

чтобы выполнитьобратное распространениемагия, нам сначала нужно ввести промежуточную переменную\delta,определяется как:

δlj=∂J∂zlj

вlпо количеству слоев,jозначает первыйlколичество нейронов в слое,zДля промежуточных переменных, упомянутых в прошлом уроке (чтобы формула выглядела понятнее,обратное распространениеНадстрочные индексы формул не используют круглые скобки).\deltaназывается первымlслойjошибка нейрона.обратное распространениеОн заключается в том, чтобы сначала вычислить ошибку каждого нейрона в каждом слое, а затем получить градиент через ошибку.

Сначала посмотрите на ошибку выходного слоя:

δLj=∂J∂zLj

используй этоПравило цепиполучить:

δLj=K∑k=1∂J∂aLk∂aLk∂zLj

и только когдаk==j, правая часть не0,так:

δLj=∂J∂aLj∂aLj∂zLj=∂J∂aLjg′(zLj)=aLj−yLj

Ошибки для других слоев:

δlj=∂J∂zlj

использоватьПравило цепи:

δlj=sl+1∑k=1∂J∂zl+1k∂zl+1k∂zlj=sl+1∑k=1δl+1k∂zl+1k∂zlj

И среди них:

zl+1k=sl∑p=1Θlkpg(zlp)+blk

Найдите частную производную:

∂zl+1k∂zlj=Θlkjg′(zlj)

так:

δlj=sl+1∑k=1Θlkjδl+1kg′(zlj)=sl+1∑k=1Θlkjδl+1kalj(1−alj)

Наконец, используйте тот жеПравило цепивычислять:

∂JΘlij=sl+1∑k=1∂J∂zl+1k∂zl+1k∂Θlij=sl∑k=1δl+1k∂zl+1k∂Θlij

так как:

zl+1k=sl∑p=1Θlkpg(zlp)+blk

только тогда, когдаk=i,p=jПри оставлении предмета:

∂JΘlij=g(zlj)δl+1i=aljδl+1i

обратное распространение

С уравнениями (1) (2) (3) можно сделатьобратное распространениеалгоритм (следует отметить, что только что выведенные формулы относятся к набору обучающих данных).

  1. для всехl, i, jинициализация\Delta_{ij}^l = 0
  2. заmнабор обучающих данных,kот1получатьm:
    • сделатьa^1 = x^{(k)}
    • Прямое распространение, рассчитать вектор активации каждого слояa^{l}
    • Используя уравнение (1), рассчитайте ошибку выходного слоя\delta^L
    • Используя уравнение (2), рассчитайте другие ошибки слоя\delta^{L-1},\delta^{L-2},...,\delta^{2}
    • Используя уравнение (3), складываем\Delta_{ij}^l,\Delta_{ij}^l:=\Delta_{ij}^l+a_j^l\delta_i^{l+1}
  3. Рассчитайте матрицу градиента: Dlij={1mΔlij+λmΘlijif j≠01mΔ(l)ijif j=0
  4. обновить веса\Theta^l := \Theta^l+ \alpha D^l

Инициализация веса

Наконец, упоминается инициализация весов. Для нейронных сетей вы не можете инициализировать с тем же значением 0, что и раньше, что приводит клогическая единицавсе так же. Поэтому мы используем рандомизированный метод инициализации, такой, что-\delta \leq \Theta_{ij}^{l} \leq \delta.

Итак~, закончил на этой неделеНейронные сетиИ его алгоритм обучения, вы думаете, что это удивительно?


hertzcat

2018-04-14