Разное

Обучение нейронной сети методом обратного распространения ошибки: Алгоритм обучения многослойной нейронной сети методом обратного распространения ошибки (Backpropagation)

Содержание

НОУ ИНТУИТ | Лекция | Процедура обратного распространения (описание алгоритма)

Аннотация: В лекции рассматривается архитектура многослойного обобщенного персептрона, описывается процедура обратного распространения — алгоритм обучения многослойного персептрона с учителем.

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

Среди различных структур нейронных сетей (НС) одной из наиболее
известных является многослойная структура, в которой каждый нейрон
произвольного
слоя связан со всеми аксонами нейронов предыдущего слоя или,
в случае первого слоя, со всеми входами НС. Такие НС называются полносвязными.
Когда в сети только один слой, алгоритм ее обучения с учителем
довольно очевиден, так как правильные выходные состояния нейронов единственного
слоя заведомо известны и подстройка синаптических связей идет в
направлении, минимизирующем ошибку на выходе сети. По этому принципу
строится, например, алгоритм обучения однослойного персептрона. В многослойных
же сетях оптимальные выходные значения нейронов всех слоев,
кроме последнего, как правило, не известны, и двух- или более слойный
персептрон
уже невозможно обучить, руководствуясь только величинами ошибок на выходах
НС.

Один из вариантов решения этой проблемы — разработка наборов выходных
сигналов, соответствующих входным, для каждого слоя НС, что, конечно,
является очень трудоемкой операцией и не всегда осуществимо. Второй
вариант — динамическая подстройка весовых коэффициентов синапсов,
в ходе которой выбираются, как правило, наиболее слабые связи и изменяются
на малую величину в ту или иную сторону, а сохраняются только те изменения,
которые повлекли уменьшение ошибки на выходе всей сети. Очевидно,
что данный «метод тыка», несмотря на свою кажущуюся простоту,
требует громоздких рутинных вычислений. И, наконец, третий, более приемлемый
вариант — распространение сигналов ошибки от выходов НС к ее
входам, в направлении, обратном прямому распространению сигналов в
обычном режиме работы. Этот алгоритм обучения НС получил название процедуры обратного распространения.
Разработка алгоритма обратного распространения сыграла
важную роль в возрождении интереса к искусственным нейронным сетям.
Обратное распространение — это систематический метод для обучения
многослойных искусственных нейронных сетей. Он имеет солидное математическое
обоснование. Несмотря на некоторые ограничения, процедура обратного
распространения сильно расширила область проблем, в которых
могут быть использованы искусственные нейронные сети, и убедительно
продемонстрировала богатые возможности этой методики.

Обучающий алгоритм обратного распространения

Сетевые конфигурации:

Нейрон. На рис. 4.1 показан нейрон, используемый в качестве основного
строительного блока в сетях обратного распространения. Подается множество
входов, идущих либо извне, либо от предшествующего
слоя. Каждый из них умножается на вес, и произведения суммируются:

Рис.
4.1.

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

(
1)

Как показывает уравнение (1), эта функция, называемая сигмоидом, весьма удобна, так как имеет
простую производную, что используется
при реализации алгоритма обратного распространения:

(
2)

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

Алгоритм обучения многослойной нейронной сети методом обратного распространения ошибки

Прудников Иван Алексеевич

МИРЭА(МТУ)


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

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


Теоретическая часть


Данный материал предполагает знакомство с основами нейронных сетей, однако я считаю возможным ввести читателя в курс темы без излишних мытарств по теории нейронных сетей. Итак, для тех, кто впервые слышит словосочетание «нейронная сеть», предлагаю воспринимать нейронную сеть в качестве взвешенного направленного графа, узлы ( нейроны ) которого расположены слоями. Кроме того, узел одного слоя имеет связи со всеми узлами предыдущего слоя. В нашем случае у такого графа будут иметься входной и выходной слои, узлы которых выполняют роль входов и выходов соответственно. Каждый узел ( нейрон ) обладает активационной функцией — функцией, ответственной за вычисление сигнала на выходе узла ( нейрона ). Также существует понятие смещения, представляющего из себя узел, на выходе которого всегда появляется единица. В данной статье мы будем рассматривать процесс обучения нейронной сети, предполагающий наличие «учителя», то есть процесс обучения, при котором обучение происходит путем предоставления сети последовательности обучающих примеров с правильными откликами. 

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

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


Архитектура


На рисунке 1 показана многослойная нейронная сеть с одним слоем скрытых нейронов ( элементы Z ).



Нейроны, представляющие собой выходы сети ( обозначены Y ), и скрытые нейроны могут иметь смещение( как показано на изображении ). Смещение, соответствующий выходу Yk обозначен wok, скрытому элементу Zj — Voj. Эти смещения служат в качестве весов на связях, исходящих от нейронов, на выходе которых всегда появляется 1 ( на рисунке 1 они показаны, но обычно явно не отображаются, подразумеваясь). Кроме того, на рисунке 1 стрелками показано перемещение информации в ходе фазы распространения данных от входов к выходам. В процессе обучения сигналы распространяются в обратном направлении.

Описание алгоритма


Алгоритм, представленный далее, применим к нейронной сети с одним скрытым слоем, что является допустимой и адекватной ситуацией для большинства приложений. Как уже было сказано ранее, обучение сети включает в себя три стадии: подача на входы сети обучающих данных, обратное распространение ошибки и корректировка весов. В ходе первого этапа каждый входной нейрон Xполучает сигнал и широковещательно транслирует его каждому из скрытых нейронов Z1,Z2…,Zp. Каждый скрытый нейрон затем вычисляет результат его активационной функции ( сетевой функции ) и рассылает свой сигнал Zj всем выходным нейронам. Каждый выходной нейрон Yk, в свою очередь, вычисляет результат своей активационной функции Yk, который представляет собой ничто иное, как выходной сигнал данного нейрона для соответствующих входных данных. В процессе обучения, каждый нейрон на выходе сети сравнивает вычисленное значение Yk с предоставленным учителем tk ( целевым значением ), определяя соответствующее значение ошибки для данного входного шаблона. На основании этой ошибки вычисляется σk (k = 1,2,…m). σиспользуется при распространении ошибки от Yk до всех элементов сети предыдущего слоя (скрытых нейронов, связанных с Yk), а также позже при изменении весов связей между выходными нейронами и скрытыми. Аналогичным образом вычисляется σj (j = 1,2,…p) для каждого скрытого нейрона Zj. Несмотря на то, что распространять ошибку до входного слоя необходимости нет, σj используется для изменения весов связей между нейронами скрытого слоя и входными нейронами. После того как все σ были определены, происходит одновременная корректировка весов всех связей.

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


В алгоритме обучения сети используются следующие обозначения: 

X Входной вектор обучающих данных X = (X1, X2,…,Xi,…,Xn). 

t Вектор целевых выходных значений, предоставляемых учителем t = (t1, t2,…,tk,…,tm)

σk Составляющая корректировки весов связей wjk, соответствующая ошибке выходного нейрона Yk; также, информация об ошибке нейрона Yk, которая распространяется тем нейронам скрытого слоя, которые связаны с Yk.

σj Составляющая корректировки весов связей vij, соответствующая распространяемой от выходного слоя к скрытому нейрону Zинформации об ошибке.

a Скорость обучения.

Xi Нейрон на входе с индексом i. Для входных нейронов входной и выходной сигналы одинаковы — Xi.

voj Смещение скрытого нейрона j.

Zj Скрытый нейрон j; Суммарное значение подаваемое на вход скрытого элемента Zj обозначается Z_inj: Z_inj = voj +∑xi*vij

Сигнал на выходе Zj ( результат применения к Z_inj активационной функции ) обозначается Zj: Zj =  f (Z_inj)

wok Смещение нейрона на выходе.

Yk Нейрон на выходе под индексом k; Суммарное значение подаваемое на вход выходного элемента Yk обозначается Y_ink: Y_ink = wok + ∑ Zj*wjk. Сигнал на выходе Yk ( результат применения к Y_ink активационной функции ) обозначается Yk:


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


Функция активация в алгоритме обратного распространения ошибки должна обладать несколькими важными характеристиками: непрерывностью, дифференцируемостью и являться монотонно неубывающей. Более того, ради эффективности вычислений, желательно, чтобы ее производная легко находилась. Зачастую, активационная функция также является функцией с насыщением. Одной из наиболее часто используемых активационных функций является бинарная сигмоидальная функция с областью значений в ( 0, 1 ) и определенная как:


Другой широко распространенной активационной функцией является биполярный сигмоид с областью значений ( -1, 1 ) и определенный как:



Алгоритм обучения


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


Шаг 0.


Инициализация весов ( веса всех связей инициализируются случайными небольшими значениями ).


Шаг 1.


До тех пор пока условие прекращения работы алгоритма неверно, выполняются шаги 2 — 9.


Шаг 2.


Для каждой пары { данные, целевое значение } выполняются шаги 3 — 8.


Распространение данных от входов к выходам:


Шаг 3.

Каждый входной нейрон ( Xi, i = 1,2,…,n ) отправляет полученный сигнал Xi всем нейронам в следующем слое ( скрытом ).


Шаг 4.


Каждый скрытый нейрон (Zj, j = 1,2,…,p) суммирует взвешенные входящие сигналы: z_inj = voj + ∑ xi*vij и применяет активационную функцию: zj = f (z_inj) После чего посылает результат всем элементам следующего слоя ( выходного ).


Шаг 5.


Каждый выходной нейрон ( Yk, k = 1,2,…m ) суммирует взвешенные входящие сигналы: Y_in= wok + ∑ Zj*wjk и применяет активационную функцию, вычисляя выходной сигнал: Y= f (Y_ink).


Обратное распространение ошибки:


Шаг 6.


Каждый выходной нейрон (Yk, k = 1,2,…m) получает целевое значение — то выходное значение, которое является правильным для данного входного сигнала, и вычисляет ошибку: σ= (tk — yk)*f ‘ (y_ink), так же вычисляет величину, на которую изменится вес связи wjk : Δwjk = a * σk * zj. Помимо этого, вычисляет величину корректировки смещения: Δwok = a*σk и посылает σk нейронам в предыдущем слое.


Шаг 7.


Каждый скрытый нейрон (zj, j = 1,2,…p) суммирует входящие ошибки ( от нейронов в последующем слое ) σ_in= ∑ σk * wjk и вычисляет величину ошибки, умножая полученное значение на производную активационной функции: σj = σ_inj * f ‘ (z_inj), так же вычисляет величину, на которую изменится вес связи vij: Δvij = a * σj * xi. Помимо этого, вычисляет величину корректировки смещения: voj = a * σj


Шаг 8. Изменение весов.


Каждый выходной нейрон ( yk, k = 1,2,…,m) изменяет веса своих связей с элементом смещения и скрытыми нейронами: wjk(new) = wjk(old) + Δwjk 

Каждый скрытый нейрон (zj, j = 1,2,…p) изменяет веса своих связей с элементом смещения и выходными нейронами: vij(new) = vij(old) + Δvij 


Шаг 9.


Проверка условия прекращения работы алгоритма.

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

Перевод «Создай свою нейросеть» — 6 – Нейронные сети

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

В 6 части перевода выкладываю сразу 4 раздела книги. Все они посвящены одной из самых важных тем в области нейросетей — методу обратного распространения ошибки. Вы научитесь рассчитывать погрешность всех нейронов нейросети основываясь только на итоговой погрешности сети и весах связей.

Материал сложный, так что смело задавайте свои вопросы на форуме.

Вы можете скачать PDF версию перевода.

Приятного чтения!

Оглавление

1 Глава. Как они работают.

1.10 Калибровка весов нескольких связей

Ранее мы настраивали линейный классификатор с помощью изменения постоянного коэффициента уравнения прямой. Мы использовали погрешность, разность между полученным и желаемым результатами, для настройки классификатора.

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

Но как нам калибровать веса связей, когда на получаемый результат, а значит и на погрешность, влияют сразу несколько нейронов? Рисунок ниже демонстрирует проблему:

Очень легко работать с погрешностью, когда вход у нейрона всего один. Но сейчас уже два нейрона подают сигналы на два входа рассматриваемого нейрона. Что же делать с погрешностью?

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

Конечно, существует очень маленькая вероятность того, что только один вес внес погрешность, а второй был идеально откалиброван. Но даже если мы немного поменяем вес, который и так не вносит погрешность, то в процессе дальнейшего обучения сети он все равно придет в норму, так что ничего страшного.

Можно попытаться разделить погрешность одинаково на все нейроны:

Классная идея. Хотя я никогда не пробовал подобный вариант использования погрешности в реальных нейросетях, я уверен, что результаты вышли бы очень достойными.

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

На рисунке изображены два нейрона, которые подают сигналы третьему, выходному нейрону. Веса связей: ​\( 3 \)​ и ​\( 1 \)​. Согласно нашей идее о переносе погрешности на нейроны мы используем ​\( \frac{3}{4} \)​ погрешности на корректировку первого (большего) веса и ​\( \frac{1}{4} \)​ на корректировку второго (меньшего) веса.

Идею легко развить до любого количества нейронов. Пусть у нас есть 100 нейронов и все они соединены с результирующим нейроном. В таком случае, мы распределяем погрешность на все 100 связей так, чтобы на каждую связь пришлась часть погрешности, соответствующая ее весу.

Как видно, мы используем веса связей для двух задач. Во-первых, мы используем веса в процессе распространения сигнала от входного до выходного слоя. Мы уже разобрались, как это делается. Во-вторых, мы используем веса для распространения ошибки в обратную сторону: от выходного слоя к входному. Из-за этого данный метод использования погрешности называют методом обратного распространения ошибки.

Если у нашей сети 2 нейрона выходного слоя, то нам пришлось бы использовать этот метод еще раз, но уже для связей, которые повлияли на выход второго нейрона выходного слоя. Рассмотрим эту ситуацию подробнее.

1.11 Обратное распространение ошибки от выходных нейронов

На диаграмме ниже изображена нейросеть с двумя нейронами во входном слое, как и в предыдущем примере. Но теперь у сети имеется два нейрона и в выходном слое.

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

То, что сейчас у нас больше одного выходного нейрона по сути ни на что не влияет. Мы просто используем наш метод дважды: для первого и второго нейронов. Почему так просто? Потому что связи с конкретным выходным нейроном никак не влияют на остальные выходные нейроны. Их изменение повлияет только на конкретный выходной нейрон. На диаграмме выше изменение весов ​\( w_{1,2} \)​ и ​\( w_{2,2} \)​ не повлияет на результат ​\( o_1 \)​.

Погрешность первого нейрона выходного слоя мы обозначили за ​\( e_1 \)​. Погрешность равна разнице между желаемым выходом нейрона ​\( t_1 \)​, который мы имеем в обучающей выборке и полученным реальным результатом ​\( o_1 \)​.

\[ e_1 = t_1 — o_1 \]

Погрешность второго нейрона выходного слоя равна ​\( e_2 \)​.

На диаграмме выше погрешность ​\( e_1 \)​ разделяется на веса ​\( w_{1,1} \)​ и ​\( w_{2,1} \)​ соответственно их вкладу в эту погрешность. Аналогично, погрешность ​\( e_2 \)​ разделяется на веса ​\( w_{1,2} \)​ и ​\( w_{2,2} \)​.

Теперь надо определить, какой вес оказал большее влияние на выход нейрона. Например, мы можем определить, какая часть ошибки ​\( e_1 \)​ пойдет на исправление веса ​\( w_{1,1} \)​:

\[ \frac{w_{1,1}}{w_{1,1}+w_{2,1}} \]

А вот так находится часть ​\( e_1 \)​, которая пойдет на корректировку веса ​\( w_{2,1} \)​:

\[ \frac{w_{2,1}}{w_{1,1} + w_{2,1}} \]

Теперь разберемся, что означают два этих выражения выше. Изначально наша идея заключается в том, что мы хотим сильнее изменить связи с большим весом и слегка изменить связи с меньшим весом.

А как нам понять величину веса относительно всех остальных весов? Для этого мы должны сравнить какой-то конкретный вес (например ​\( w_{1,1} \)​) с абстрактной «общей» суммой всех весов, повлиявших на выход нейрона. На выход нейрона повлияли два веса: ​\( w_{1,1} \)​ и ​\( w_{2,1} \)​. Мы складываем их и смотрим, какая часть от общего вклада приходится на ​\( w_{1,1} \)​ с помощью деления этого веса на полученную ранее общую сумму:

\[ \frac{w_{1,1}}{w_{1,1}+w_{2,1}} \]

Пусть ​\( w_{1,1} \)​ в два раза больше, чем ​\( w_{2,1} \)​: ​\( w_{1,1} = 6 \)​ и ​\( w_{2,1} = 3 \)​. Тогда имеем ​\( 6/(6+3) = 6/9 = 2/3 \)​, а значит ​\( 2/3 \)​ погрешности ​\( e_1 \)​ пойдет на корректировку ​\( w_{1,1} \)​, а ​\( 1/3 \)​ на корректировку ​\( w_{2,1} \)​.

В случае, когда оба веса равны, то каждому достанется по половине погрешности. Пусть ​\( w_{1,1} = 4 \)​ и ​\( w_{2,1}=4 \)​. Тогда имеем ​\( 4/(4+4)=4/8=1/2 \)​, а значит на каждый вес пойдет ​\( 1/2 \)​ погрешности ​\( e_1 \)​.

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

Но есть еще одна проблема. Сейчас мы знаем, что делать с весами связей слое, который находится прямо перед выходным слоем сети. А что если наша нейросеть имеет больше 2 слоев? Что делать с весами связей в слоях, которые находятся за предпоследним слоем сети?

1.12 Обратное распространение ошибки на множество слоев

На диаграмме ниже изображена простая трехслойная нейросеть с входным, скрытым и выходным слоями.

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

Для простоты обозначения были обобщены. Погрешности нейронов выходного слоя мы в целом назвали ​\( e_{\text{out}} \)​, а все веса связей между скрытым и выходным слоем обозначили за ​\( w_{\text{ho}} \)​.

Еще раз повторю, что для корректировки весов ​\( w_{\text{ho}} \)​ мы распределяем погрешность нейрона выходного слоя по всем весам в зависимости от их вклада в выход нейрона.

Как видно из диаграммы ниже, для корректировки весов связей между входным и скрытым слоем нам надо повторить ту же операцию еще раз. Мы берем погрешности нейронов скрытого слоя ​\( e_{\text{hi}} \)​ и распределяем их по весам связей между входным и скрытым слоем ​\( w_{\text{ih}} \)​:

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

Для корректировки связей между предпоследним и выходным слоем мы использовали погрешность выходов сети ​\( e_{\text{out}} \)​. А чему же равна погрешность выходов нейронов скрытых слоев ​\( e_{\text{hi}} \)​? Это отличный вопрос потому что сходу на этот вопрос ответить трудно. Когда сигнал распространяется по сети от входного к выходному слою мы точно знаем значения выходных нейронов скрытых слоев. Мы получали эти значения с помощью функции активации, у которой в качестве аргумента использовалась сумма взвешенных сигналов, поступивших на вход нейрона. Но как из выходного значения нейрона скрытого слоя получить его погрешность?

У нас нет никаких ожидаемых или заранее подготовленных правильных ответов для выходов нейронов скрытого слоя. У нас есть готовые правильные ответы только для выходов нейронов выходного слоя. Эти выходы мы сравниваем с заранее правильными ответами из обучающей выборки и получаем погрешность. Давайте вновь проанализируем диаграмму выше.

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

Уже из рисунка можно понять, что делать дальше. Но давайте все-таки еще раз пройдемся по всему алгоритму. Нам нужно получить погрешность выхода нейрона скрытого слоя для того, чтобы скорректировать веса связей между текущим и предыдущим слоями. Назовем эту погрешность ​\( e_{\text{hi}} \)​. Но мы не можем получить значение погрешности напрямую. Погрешность равна разности между ожидаемым и полученным значениями, но проблема заключается в том, что у нас есть ожидаемые значения только для нейронов выходного слоя нейросети.

В невозможности прямого нахождения погрешности нейронов скрытого слоя и заключается основная сложность.

Но выход есть. Мы умеем распределять погрешность нейронов выходного слоя по весам связей. Значит на каждый вес связи идет часть погрешности. Поэтому мы складываем части погрешностей, которые относятся к весам связей, исходящих из данного скрытого нейрона. Полученная сумма и будем считать за погрешность выхода данного нейрона. На диаграмме выше часть погрешности ​\( e_{\text{out 1}} \)​ идет на вес ​\( w_{1,1} \)​, а часть погрешности ​\( e_{\text{out 2}} \)​ идет на вес ​\( w_{1,2} \)​. Оба этих веса относятся к связям, исходящим из первого нейрона скрытого слоя. А значит мы можем найти его погрешность:

\[ e_{\text{hi 1}} = \text{сумма частей погрешностей для весов } w_{1,1} \text{ и } w_{1,2} \]

\[ e_{\text{hi 1}} = \left(e_{\text{out 1}}\cdot\frac{w_{1,1}}{w_{1,1} + w_{2,1}}\right) + \left(e_{\text{out 2}}\cdot\frac{w_{1,2}}{w_{1,2} + w_{2,2}}\right) \]

Рассмотрим алгоритм на реальной трехслойной нейросети с двумя нейронами в каждом слое:

Давайте отследим обратное распространение одной ошибки/погрешности. Погрешность второго выходного нейрона равна ​\( 0.5 \)​ и она распределяется на два веса. На вес ​\( w_{12} \)​ идет погрешность ​\( 0.1 \)​, а на вес ​\( w_{22} \)​ идет погрешность ​\( 0.4 \)​. Дальше у нас идет второй нейрон скрытого слоя. От него отходят две связи с весами ​\( w_{21} \)​ и ​\( w_{22} \)​. На эти веса связей также распределяется погрешность как от ​\( e_1 \)​, так и от ​\( e_2 \)​. На вес ​\( w_{21} \)​ идет погрешность ​\( 0.9 \)​, а на вес ​\( w_{22} \)​ идет погрешность ​\( 0.4 \)​. Сумма этих погрешностей и дает нам погрешность выхода второго нейрона скрытого слоя: ​\( 0.4 + 0.9 = 1.3 \)​.

Но это еще не конец. Теперь надо распределить погрешность нейронов выходного слоя на веса связей между входным и скрытым слоями. Проиллюстрируем этот процесс дальнейшего распространения ошибки:

Ключевые моменты

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

1.13 Обратное распространение ошибки и произведение матриц

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

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

Начинаем мы с самого конца нейросети — с матрицы погрешностей ее выходов. В примере выше у нас имеется две погрешности сети: ​\( e_1 \)​ и ​\( e_2 \)​.

\[ \mathbf{E}_{\text{out}} = \left(\begin{matrix}e_1 \\ e_2\end{matrix}\right) \]

Теперь нам надо получить матрицу погрешностей выходов нейронов скрытого слоя. Звучит довольно жутко, поэтому давайте действовать по шагам. Из предыдущего раздела вы помните, что погрешность нейрона скрытого слоя высчитывается как сумма частей погрешностей весов связей, исходящих из этого нейрона.

Сначала рассматриваем первый нейрон скрытого слоя. Как было показано в предыдущем разделе, погрешность этого нейрона высчитывается так:

\[ e_{\text{hi 1}} = \left(e_1\cdot\frac{w_{11}}{w_{11} + w_{21}}\right) + \left(e_2\cdot\frac{w_{12}}{w_{12} + w_{22}}\right) \]

Погрешность второго нейрона скрытого слоя высчитывается так:

\[ e_{\text{hi 2}} = \left(e_1\cdot\frac{w_{21}}{w_{11} + w_{21}}\right) + \left(e_2\cdot\frac{w_{22}}{w_{12} + w_{22}}\right) \]

Получаем матрицу погрешностей скрытого слоя:

\[ \mathbf{E}_{\text{hid}} = \left(\begin{matrix}e_{\text{hid 1}} \\ e_{\text{hid 2}}\end{matrix}\right) = \left(\begin{matrix} e_1\cdot\dfrac{w_{11}}{w_{11} + w_{21}} \hspace{5pt} + \hspace{5pt} e_2\cdot\dfrac{w_{12}}{w_{12} + w_{22}} \\ e_1\cdot\dfrac{w_{21}}{w_{11} + w_{21}} \hspace{5pt} + \hspace{5pt} e_2\cdot\dfrac{w_{22}}{w_{12} + w_{22}} \end{matrix}\right) \]

Многие из вас уже заметили произведение матриц:

\[ \mathbf{E}_{\text{hid}} = \left(\begin{matrix} \dfrac{w_{11}}{w_{11} + w_{21}} & \dfrac{w_{12}}{w_{12} + w_{22}} \\ \dfrac{w_{21}}{w_{11} + w_{21}} & \dfrac{w_{22}}{w_{12} + w_{22}} \end{matrix}\right)\times \left(\begin{matrix} e_1 \\ e_2 \end{matrix}\right) \]

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

В формуле выше мы используем большую и неудобную матрицу, в которой делим каждый вес связи на сумму весов, приходящих в данный нейрон. Мы самостоятельно сконструировали эту матрицу.

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

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

Но нам очень нужно получить простую формулу для удобного и быстрого расчета матрицы погрешностей.

Пора немного пошалить!

Вновь обратим взор на формулу выше. Можно заметить, что самым главным является умножение погрешности выходного нейрона ​\( e_n \)​ на вес связи ​\( w_{ij} \)​, которая к этому выходному нейрону подсоединена. Чем больше вес, тем большую погрешность получит нейрон скрытого слоя. Эту важную деталь мы сохраняем. А вот знаменатели дробей служат лишь нормализующим фактором. Если их убрать, то мы лишимся масштабирования ошибки на предыдущие слои, что не так уж и страшно. Таким образом, мы можем избавиться от знаменателей:

\[ e_1\cdot \frac{w_{11}}{w_{11} + w_{21}} \hspace{5pt} \longrightarrow \hspace{5pt} e_1 \cdot w_{11} \]

Запишем теперь формулу для получения матрицы погрешностей, но без знаменателей в левой матрице:

\[ \mathbf{E}_{\text{hid}} = \left(\begin{matrix} w_{11} & w_{12} \\ w_{21} & w_{22} \end{matrix}\right)\times \left(\begin{matrix} e_1 \\ e_2 \end{matrix}\right) \]

Так гораздо лучше!

В разделе по использованию матриц при расчетах прохода сигнала по сети мы использовали следующую матрицу весов:

\[ \left(\begin{matrix} w_{11} & w_{21} \\ w_{12} & w_{22} \end{matrix}\right) \]

Сейчас, для расчета матрицы погрешностей мы используем такую матрицу:

\[ \left(\begin{matrix} w_{11} & w_{12} \\ w_{21} & w_{22} \end{matrix}\right) \]

Можно заметить, что во второй матрице элементы как бы отражены относительно диагонали матрицы, идущей от левого верхнего до правого нижнего края матрицы: ​\( w_{21} \)​ и ​\( w_{12} \)​ поменялись местами. Такая операция над матрицами существует и называется она \textbf{транспонированием} матрицы. Ранее мы использовали матрицу весов ​\( \mathbf{W} \)​. Транспонированные матрицы имеют специальный значок справа сверху: ​\( ^\intercal \)​. В расчете матрицы погрешностей мы используем транспонированную матрицу весов: ​\( \mathbf{W}^\intercal \)​.

Вот два примера для иллюстрации транспонирования матриц. Заметьте, что данную операцию можно выполнять даже для матриц, в которых число столбцов и строк различно.

\[ \left(\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{matrix}\right)^\intercal = \left(\begin{matrix} 1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9 \end{matrix}\right) \]

\[ \left(\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{matrix}\right)^\intercal = \left(\begin{matrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{matrix}\right) \]

Мы получили то, что хотели — простую формулу для расчета матрицы погрешностей нейронов скрытого слоя:

\[ \mathbf{E}_{\text{hid}} = \mathbf{W}^\intercal \times \mathbf{E}_{\text{out}} \]

Это все конечно отлично, но правильно ли мы поступили, просто проигнорировав знаменатели? Да.

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

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

Убрав знаменатели, мы сохранили общую суть обратного распространения ошибки — чем больше вес, тем больше его надо скорректировать. Мы просто убрали смягчающий фактор.

Ключевые моменты

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

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

Нейросеть — обучение без учителя. Метод Policy Gradient / Хабр

Доброго времени суток, Хабр

Настоящей статьей открываю цикл статей о том, как обучать нейронные сети без учителя.
(Reinforcement Learning for Neuron Networks)

В цикле планирую сделать три статьи по теории и реализации в коде трех алгоритмов обучения нейронных сетей без учителя. Первая статья будет по Policy Gradient, вторая по Q-learning, третья статья заключительная будет по методу Actor-Critic.

Приятного чтения.

Статья Первая — Обучение без учителя методом Policy Gradient

(Policy Gradient for Reinforcement Learning)

Введение

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

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

Алгоритму обучающемуся без учителя достаточно только давать обратный отклик на его действия или решения — хороши они были или нет.

Глава 1. Обучение с учителем

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

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

На примере задачи классификации для датасета Mnist правильным ответом который дает человек алгоритму — это будет метка класса цифры в обучающей выборке.

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

Таким образом можно обобщить следующую мысль — алгоритмом обучения с учителем является любой алгоритм машинного обучения, где мы выдаем алгоритму как ему нужно с нашей точки зрения правильно поступить.

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

Это и есть ключ к пониманию того, чем принципиально алгоритм обучения с учителем отличается от алгоритма обучения без учителя.

Глава 2. Обучение без учителя

Разобравшись что же это такое — обучение с учителем, разберемся теперь, что же это такое — обучение без учителя.

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

Но тогда возникает вопрос, если мы не даем алгоритму явного указания как поступать правильно, то чему же алгоритм научится? Как алгоритм будет обучаться не зная куда ему корректировать свои внутренние параметры, чтобы поступать правильно и в конечном итоге решить задачу так как нам бы хотелось.

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

Поэтому конечному результату мы и дадим алгоритму понять, хорошо он решил нашу задачу или нет.

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

На примере игры где ракетка пытается поймать кубики падающие сверху мы не говорим алгоритму управляющему ракеткой в какой конкретно момент времени куда двигать ракетку. Мы скажем алгоритму только результат его действий — поймал он ракеткой кубик или нет.

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

Глава 3. Агент, Среда и Награда

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

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

Агентом мы будем называть наш алгоритм который умеет анализировать состояние среды и совершать в ней какие-то действия.

Среда — виртуальный мир в котором существует наш Агент и своими действиями может менять его состояние…

Награда — обратная связь от Среды к Агенту как ответ на его действия.

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

Если более подробно рассмотреть процесс взаимодействия агента со средой то его можно выразить следующей схемой

St — состояние среды (state) на шаге t

at — действие агента (action) на шаге t

rt — награда (reward) на шаге t

В каждый момент времени t наш агент наблюдает состояние среды — St, выполняет действие — at, за что получает от среды награду — rt, поле чего среда переходит в состояние St+1, которое наблюдает наш агент, выполняет действие — at+1, за что получает от среды награду — rt+1 и таких состояний t у нас может быть бесконечное множество — n.

Глава 4. Параметризация задачи обучения без учителя

Для того чтобы обучать агента нам нужно его как-то параметризовать задачу обучения без учителя, другими словами понять что за функции мы собираемся оптимизировать. В reinforcement learning — в дальнейшем мы так будем называть обучение без учителя, существует три таких основных функции:

1) p(a|s) — policy function

Функция вероятности оптимальности действия — a в зависимости от состояния среды -s. Она показывает нам насколько действие a при состоянии среды s оптимально.

2) v(s) — value function

Функция ценности состояния — s. Она показывает нам насколько состояние s вообще ценно для нас с точки зрения награды

3) Q(s,a) — Q-function

Q функция оптимальной стратегии. Она позволяет нам согласно данной оптимальной стратегии в состоянии — s выбрать оптимальное для этого состояния действие — a

Первой рассмотрим функцию — policy function, как наиболее простую и интуитивно понятную для понимания функцию reinforcement learning.

Поскольку мы собираемся решать задачи reinforcement learning посредством нейронных сетей. То схематично мы можем параметризовать policy function через нейронную сеть следующим образом.

На вход нейронной сети, будем подавать состояния — s, а выход нейросети сконструируем таким образом, чтобы выходным слоем нейросети был слой SoftMax, с количеством выходов равным количеству действий возможных для агента в нашей среде. Таким образом пропустив через слои нейросети состояние s на выходе мы получим распределение вероятностей для действий агента в состоянии s. Что собственно нам и требуется для того чтобы начать через алгоритм обратного распространения ошибки обучать нашу нейросеть и итеративно улучшать policy function, которая теперь по сути является нашей нейронной сетью.

Глава 5. Улучшение policy function через обучение нейросети

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

где:

1 — истинные метки * log(предсказанные метки)

2 — сумма по всем примерам

Однако как же нам обучать нейросеть если у нас пока нет правильных меток для действий агента в состояниях S0-Sj? А они нам и не нужны, мы вместо правильных меток будем использовать награду которую агент получил от среды выполнив действие которое ему предсказала нейросеть.

Имеем полное право так сделать потому что, для Cross Entropy Loss — yj — это истинные метки и для правильного класса и они равны единице, а для Policy Function Loss — rj — награда которую среда начислила агенту за действие которое он совершил. То есть rj служит как бы весом для градиентов при обратном распространении ошибки когда мы обучаем нейросеть.

Получена положительная награда — значит нужно увеличить веса нейросети куда градиент направлен.

Если полученная награда отрицательная, значит соответствующие веса в нейросети, согласно направления градиента куда направлена ошибка уменьшаем.

Глава 6. Сборка ДатаСета для обучения

Для того чтобы обучать нашего Агента — нейросеть средствами классического Machine Learning — через метод обратного распространения ошибки, нам нужно собрать датасет.

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

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

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

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

Как же решить проблему с нулевой наградой в большей части датасета который собирается для обучения агента?

Выйти из данной ситуации можно двумя способами:

первый — присвоить всем действиям агента которые он предпринимал за время пока кубик падал одну и туже финальную награду эпизода +1 или -1, в зависимости от того поймал агент кубик или не поймал.

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

второй — финальную награду с определенным шагом дисконта по убыванию распространить на все действия агента в этом эпизоде. Иначе говоря, чем ближе к финалу действие агента тем ближе к +1 или -1 награда за это действие.

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

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

Гамма — коэффициент дисконтирования (убывания награды). Он всегда находится в диапазоне от 0 до 1. Обычно гамму берут в районе 0.95

После того как определились с тем какие данные мы собираем в ДатаСет, запускаем симулятор среды и проигрывая подряд несколько раз игру с несколькими эпизодами, собираем данные о:

  • состоянии Среды,
  • действиях которые предпринял Агент,
  • награду которую Агент получил.

Для простоты понимания назовем падение одного кубика через колодец — эпизодом игры, примем также, что сама игра будет состоять из нескольких эпизодов. Это значит, что за одну игру мы будем сбрасывать в колодец несколько кубиков по очереди, а ракетка будет пытаться их поймать. За каждый пойманный кубик агенту будет начисляться +1 балл, за каждый кубик что упал на дно и ракетка его не поймала, агенту будет начисляться -1 балл.

Глава 7. Внутреннее устройство агента и среды

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

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

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

Глава 8. Обучение Агента

Для того чтобы обучать Агента нам нужно накопить статистику по данным от нашего симулятора и действий предпринятым агентом. Статистический данные для обучения мы будем собирать тройками значений — состояние среды, действие агента и награда за это действие.

Немного кода как собираем статистику

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

Код для организации буфера памяти:

Проведя серию игр нашего Агента со Средой и накопив статистику мы можем переходить к обучению Агента.

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

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

Этап 1

Этап 2

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

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

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

Это и есть петля обучения при обучении без учителя методом Policy Gradient.

  1. Накопление статистических данных
  2. Обучение Агента
  3. Сброс статистических данных

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

Глава 9. Эксперименты с Агентом и Средой

Запустим серию экспериментов по обучению нашего Агента.

Для экспериментов выберем следующие параметры среды:

Для Агента выберем — сконструируем нейросеть — она будет сверточной (т.к. работаем с изображением) на выходе у нее будет 9 выходов (1-вправо, 2-влево, 3-вверх, 4-вниз, 5-вправо-вверх, 6-влево-вверх, 7-вправо-вниз, 8-влево-вниз, 9-ничего не делать) и SoftMax, чтобы получать вероятность для каждого действия.

Архитектура нейросети

Первый Conv2d слой 32 нейрона размер изображения 1*32*16
MaxPool2d слой размер изображения 32*16*8
Второй Conv2d слой 32 нейрона размер изображения 32*16*8
MaxPool2d слой размер изображения 32*8*4
Flatten — выпрямляем изображение в размер 1024
Linear слой на 1024 нейрона
Dropout(0.25) слой
Linear слой на 512 нейронов
Linear слой на 256 нейронов
Linear слой на 9 нейронов и SoftMax

Код создания нейросети на Pytorch

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

Эксперимент № 1 — Агент научился решать задачу за 13600 циклов игры

Начальное состояние Агента

График тренировки Агента

Обученное состояние Агента

Эксперимент № 2 — Агент научился решать задачу за 8250 циклов игры

Начальное состояние Агента

График тренировки Агента

Обученное состояние Агента

Эксперимент № 3 — Агент научился решать задачу за 19800 циклов игры

Начальное состояние Агента

График тренировки Агента

Обученное состояние Агента

Глава 10. Выводы

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

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

Также хочется отметить большую потребность в вычислениях для обучения Агента методом Policy Gradient, т.к. основное время работы алгоритма происходит набор статистики ходов Агента а не его обучение. Набрав статистику по ходам из всего массива мы используем только один батч данных для обучения Агента, а все остальные данные выбрасываем, как уже непригодные к обучению. И опять собираем новые данные.

Можно еще много экспериментировать с данным алгоритмом и средой — изменяя глубину и ширину колодца, увеличивая или уменьшая количество кубиков падающих за игру, делая эти кубики разного цвета. Чтобы пронаблюдать какое это влияние окажет на эффективность и скорость обучения Агента.

Также обширное поле для экспериментов — параметры нейросети, по сути нашего Агента которого мы и обучаем, можно менять слои, ядра свертки, включать и подстраивать регуляризацию. Да и много чего еще другого можно пробовать, чтобы повысить эффективность обучения Агента.

Таким образом запустив на практике эксперименты с обучением без учителя по методу Policy Gradient мы убедились, что обучение без учителя имеет место быть, и оно реально работает.

Агент самостоятельно обучился максимизировать свою награду в игре.

Ссылка на GitHub c кодом, адаптированным под работу в ноутбуке Google Colab

пятиминутный гид для новичков / Блог компании Neurodata Lab / Хабр

С момента описания первого искусственного нейрона Уорреном Мак-Каллоком и Уолтером Питтсом прошло более пятидесяти лет. С тех пор многое изменилось, и сегодня нейросетевые алгоритмы применяются повсеместно. И хотя нейронные сети способны на многое, исследователи при работе с ними сталкиваются с рядом трудностей: от переобучения до проблемы «черного ящика».

Если термины «катастрофическая забывчивость» и «регуляризация весов» вам пока ни о чем не говорят, читайте дальше: попробуем разобраться во всем по порядку.

/ Фотография Jun / CC-SA

За что мы любим нейросети

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

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

Обучение нейросетей 101

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

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

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

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

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

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

Ну и третий вариант — обучение с подкреплением — стратегия, построенная на наблюдениях. Представьте себе мышь, бегущую по лабиринту. Если она повернет налево, то получит кусочек сыра, а если направо — удар током. Со временем мышь учится поворачивать только налево. Нейронная сеть действует точно так же, подстраивая веса, если итоговый результат — «болезненный». Обучение с подкреплением активно применяется в робототехнике: «ударился ли робот в стену или остался невредим?». Все задачи, имеющие отношение к играм, в том числе самая известная из них — AlphaGo, основаны именно на обучении с подкреплением.

Переобучение: в чем проблема и как ее решить

Главная проблема нейросетей — переобучение. Оно заключается в том, что сеть «запоминает» ответы вместо того, чтобы улавливать закономерности в данных. Наука поспособствовала появлению на свет нескольких методов борьбы с переобучением: сюда относятся, например, регуляризация, нормализация батчей, наращивание данных и другие. Иногда переобученная модель характеризуется большими абсолютными значениями весов.

Механизм этого явления примерно такой: исходные данные нередко сильно многомерны (одна точка из обучающей выборки изображается большим набором чисел), и вероятность того, что наугад взятая точка окажется неотличимой от выброса, будет тем больше, чем больше размерность. Вместо того, чтобы «вписывать» новую точку в имеющуюся модель, корректируя веса, нейросеть как будто придумывает сама себе исключение: эту точку мы классифицируем по одним правилам, а другие — по другим. И таких точек обычно много.

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

Второй способ основан на ограничении выходного сигнала, а не значений весов, — речь о нормализации батчей. На этапе обучения данные подаются нейросети пачками — батчами. Выходные значения для них могут быть какими угодно, и тем их абсолютные значения больше, чем выше значения весов. Если из каждого из них мы вычтем какое-то одно значение и поделим результат на другое, одинаково для всего батча, то мы сохраним качественные соотношения (максимальное, например, все равно останется максимальным), но выход будет более удобным для обработки его следующим слоем.

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

Эффект от удаления аномального значения из тренировочного свода данных (источник)

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

Одна сеть – одна задача или «проблема катастрофической забывчивости»

Работа в динамически изменяющихся средах (например, в финансовых) сложна для нейронных сетей. Даже если вам удалось успешно натренировать сеть, нет гарантий, что она не перестанет работать в будущем. Финансовые рынки постоянно трансформируются, поэтому то, что работало вчера, может с тем же успехом «сломаться» сегодня.

Здесь исследователям или приходится тестировать разнообразные архитектуры сетей и выбирать из них лучшую, или использовать динамические нейронные сети. Последние «следят» за изменениями среды и подстраивают свою архитектуру в соответствии с ними. Одним из используемых в этом случае алгоритмов является метод MSO (multi-swarm optimization).

Более того, нейросети обладают определенной особенностью, которую называют катастрофической забывчивостью (catastrophic forgetting). Она сводится к тому, что нейросеть нельзя последовательно обучить нескольким задачам — на каждой новой обучающей выборке все веса нейронов будут переписаны, и прошлый опыт будет «забыт».

Безусловно, ученые трудятся над решением и этой проблемы. Разработчики из DeepMind недавно предложили способ борьбы с катастрофической забывчивостью, который заключается в том, что наиболее важные веса в нейронной сети при выполнении некой задачи А искусственно делаются более устойчивыми к изменению в процессе обучения на задаче Б.

Новый подход получил название Elastic Weight Consolidation (упругое закрепление весов) из-за аналогии с упругой пружинкой. Технически он реализуется следующим образом: каждому весу в нейронной сети присваивается параметр F, который определяет его значимость только в рамках определенной задачи. Чем больше F для конкретного нейрона, тем сложнее будет изменить его вес при обучении новой задаче. Это позволяет сети «запоминать» ключевые навыки. Технология уступила «узкоспециализированным» сетям в отдельных задачах, но показала себя с лучшей стороны по сумме всех этапов.

Армированный черный ящик

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

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

Поэтому разработчики нейросетей ищут способы обойти это ограничение. Например, работа ведется над так называемыми алгоритмами изъятия правил (rule-extraction algorithms), чтобы повысить прозрачность архитектур. Эти алгоритмы извлекают информацию из нейросетей либо в виде математических выражений и символьной логики, либо в виде деревьев решений.

Нейронные сети — это лишь инструмент

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

Вместе с тем порой нейронная есть — не лучший способ решить задачу. Например, сети «отстают» по таким направлениям, как создание изображений высокого разрешения, генерация человеческой речи и глубокий анализ видеопотоков. Работа с символами и рекурсивными структурами также даётся нейросистемам нелегко. Верно это и для вопросно-ответных систем.

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

При этом ученые до сих пор не до конца определились, в каком направлении следует развивать нейросети. Индустрия старается как максимально приблизить нейросети к модели человеческого мозга, так и генерировать технологии и концептуальные схемы, абстрагируясь ото всех «аспектов человеческой природы». На сегодняшний день — это что-то вроде «открытого произведения» (если воспользоваться термином Умберто Эко), где практически любые опыты допустимы, а фантазии – приемлемы.

Деятельность ученых и разработчиков, занимающихся нейросетями, требует глубокой подготовки, обширных знаний, использования нестандартных методик, поскольку нейросеть сама по себе — это не «серебряная пуля», способная решить любые проблемы и задачи без участия человека. Это комплексный инструмент, который в умелых руках может делать удивительные вещи. И у него еще всё впереди.

Нейронная сеть с обратным распространением: объяснение на простом примере

  • Home
  • Testing

      • Back
      • Agile Testing
      • BugZilla
      • Cucumber
      • 000 Testing
      • 000 JB
        • Назад
        • JUnit
        • LoadRunner
        • Ручное тестирование
        • Мобильное тестирование
        • Mantis
        • Почтальон
        • QTP
        • Назад
        • Центр качества
        • 0003000300030003 SoapUI
        • Управление тестированием
        • TestLink
    • SAP

        • Назад 900 04
        • ABAP
        • APO
        • Начинающий
        • Basis
        • BODS
        • BI
        • BPC
        • CO
        • Назад
        • CRM
        • Crystal Reports
        • Crystal Reports
        • QM
        • Заработная плата
        • Назад
        • PI / PO
        • PP
        • SD
        • SAPUI5
        • Безопасность
        • Менеджер решений
        • Successfactors
        • SAP Tutorials
      • 000
      • 9000
      • 9000
      • 9000 9000 Web Назад

      • Apache
      • AngularJS
      • ASP.Net
      • C
      • C #
      • C ++
      • CodeIgniter
      • СУБД
      • JavaScript
      • Назад
      • Java
      • JSP
      • Kotlin
      • Linux
      • Linux
      • Kotlin
      • Linux
      • js

      • Perl
      • Назад
      • PHP
      • PL / SQL
      • PostgreSQL
      • Python
      • ReactJS
      • Ruby & Rails
      • Scala
      • SQL
      • 000

      • SQL
      • 000

        0003 SQL

        000

        0003 SQL

        000

      • UML
      • VB.Net
      • VBScript
      • Веб-службы
      • WPF
  • Обязательно учите!

      • Назад
      • Бухгалтерский учет
      • Алгоритмы
      • Android
      • Блокчейн
      • Business Analyst
      • Создание веб-сайта
      • CCNA
      • Облачные вычисления
      • 00030003 COBOL 9000 Compiler
          9000 Встроенные системы

        • 00030002 9000 Compiler 9000
        • Ethical Hacking
        • Учебники по Excel
        • Программирование на Go
        • IoT
        • ITIL
        • Jenkins
        • MIS
        • Сеть
        • Операционная система
        • Назад
        • Управление проектами Обзоры
        • Salesforce
        • SEO
        • Разработка программного обеспечения
        • VB A
    • Big Data

        • Назад
        • AWS
        • BigData
        • Cassandra
        • Cognos
        • Хранилище данных
        • 0003

        • HBOps
        • 0003

        • HBOps
        • MicroStrategy
        • MongoDB
        • NiFi

    .

    Frontiers | Обучение нейронных сетей с глубокими пиками с использованием обратного распространения ошибки

    1. Введение

    Глубокое обучение позволяет достичь выдающихся результатов в различных задачах машинного обучения (He et al., 2015a; LeCun et al., 2015), но для приложений, требующих взаимодействия в реальном времени с реальной средой, повторное и часто избыточное обновление больших количество единиц становится узким местом для эффективности. Альтернатива была предложена в виде нейронных сетей (SNN), которые являются основной темой исследований в теоретической нейробиологии и нейроморфной инженерии.SNN используют обновления на основе событий и данных для повышения эффективности, особенно если они комбинируются с входными данными от датчиков, основанных на событиях, которые сокращают избыточную информацию на основе асинхронной обработки событий (Camunas-Mesa et al., 2012; O’Connor et al. al., 2013; Merolla et al., 2014; Neil, Liu, 2016). Эта функция делает системы пиков привлекательными для приложений реального времени, где важными факторами являются скорость и энергопотребление, особенно после того, как адекватные нейроморфные аппаратные платформы станут более доступными.Хотя теоретически (Maass and Markram, 2004) было показано, что SNN обладают такой же вычислительной мощностью, как и обычные искусственные нейронные сети (ANN; этот термин будет использоваться для описания традиционных глубоких нейронных сетей в отличие от SNN), на практике SNN не совсем достигли тех же уровней точности ИНС в традиционных задачах машинного обучения. Основной причиной этого является отсутствие адекватных алгоритмов обучения для глубоких SNN, поскольку спайковые сигналы (т. Е. Дискретные события, производимые импульсным нейроном всякий раз, когда его внутреннее состояние пересекает пороговое условие) не дифференцируемы, но дифференцируемые функции активации являются фундаментальными для использования обратное распространение ошибок, которое до сих пор остается наиболее широко используемым алгоритмом для обучения глубоких нейронных сетей.

    Недавно предложенное решение заключается в использовании различных представлений данных между обучением и обработкой, т. Е. Обучением обычной ИНС и разработкой алгоритмов преобразования, которые переводят веса в эквивалентные глубокие SNN (O’Connor et al., 2013; Diehl et al., 2015 ; Esser et al., 2015; Hunsberger, Eliasmith, 2015). Однако в этих методах детали статистики в последовательностях шипов, которые выходят за рамки моделирования идеальной средней скорости, такие как необходимые для обработки практических данных датчиков на основе событий, не могут быть точно представлены сигналами, используемыми для обучения.Поэтому желательно разработать правила обучения, действующие непосредственно на цепочки всплесков, но до сих пор было возможно обучать только отдельные слои и использовать правила обучения без учителя, что приводит к ухудшению точности (Masquelier and Thorpe, 2007; Neftci et al. ., 2014; Диль, Кук, 2015). Альтернативный подход был недавно представлен О’Коннором и Веллингом (2016), в котором SNN обучается на всплесках, но требует хранения статистики для вычисления обновлений стохастического градиентного спуска (SGD), чтобы аппроксимировать обычную ANN.

    В этой статье мы представляем новый метод контролируемого обучения для SNN, который точно следует успешному алгоритму обратного распространения ошибки для глубоких ANN, но здесь используется для обучения общих форм глубоких SNN непосредственно на основе пиковых сигналов. Эта структура включает в себя как полностью связанные, так и сверточные SNN, SNN с потенциалом утечки мембран и уровни, реализующие схемы «победитель получает все» (WTA). Ключевая идея нашего подхода состоит в том, чтобы сгенерировать непрерывный и дифференцируемый сигнал, на котором может работать SGD, используя отфильтрованные нижними частотами пиковые сигналы, добавленные к мембранному потенциалу и рассматривая резкие изменения мембранного потенциала как шум во время обратного распространения ошибки.Представлены дополнительные методы, которые решают особые задачи обучения SNN: нейроны с импульсами обычно требуют больших пороговых значений для достижения стабильности и разумной скорости срабатывания, но большие пороги могут привести к тому, что многие «мертвые» нейроны не участвуют в оптимизации во время обучения. Предлагаются новые методы регуляризации и нормализации, которые способствуют стабильному и сбалансированному обучению. Наши методы закладывают основы для устранения разрыва в производительности между SNN и ANN и способствуют их использованию в практических приложениях.

    1.1. Связанные работы

    Методы градиентного спуска для SNN не были глубоко исследованы, потому что и последовательности спайков, и нижележащие мембранные потенциалы не дифференцируются во время спайков. В наиболее успешных на сегодняшний день подходах использовались косвенные методы, такие как обучение сети в области непрерывной скорости и преобразование ее в версию с пиками. О’Коннор и др. (2013) были первыми в этой области, обучив сеть глубоких убеждений, основанную на приближенной модели частоты событий Зигерта.Однако в задаче классификации рукописных цифр MNIST (LeCun et al., 1998), которая в настоящее время почти идеально решается ИНС (коэффициент ошибок 0,21% в Wan et al., 2013), их подход достиг точности только около 94,09%. . Hunsberger и Eliasmith (2015) использовали модель смягченной скорости, в которой жесткий порог в функции отклика нейрона дырявого интегрирования и огня (LIF) заменен непрерывной дифференцируемой функцией, чтобы сделать его пригодным для использования при обратном распространении. После обучения ИНС с помощью модели скорости они преобразовали ее в СНС, состоящую из нейронов LIF.С помощью предварительного обучения на основе шумоподавляющих автоэнкодеров они достигли 98,6% в задаче MNIST, инвариантной к перестановкам (PI) (см. Раздел 3.1). Diehl et al. (2015) обучили глубокие нейронные сети традиционным методам глубокого обучения и дополнительным ограничениям, необходимым для преобразования в SNN. После обучения блоки ИНС были преобразованы в нейроны с импульсными импульсами без утечки, и производительность была оптимизирована путем нормализации весовых параметров. Этот подход привел к современной точности для сетей SNN 98.64% в задаче PI MNIST. Esser et al. (2015) использовали дифференцируемую вероятностную модель нейрона с импульсами для обучения и статистически выбрали обученную сеть для развертывания. Во всех этих методах обучение проводилось косвенно с использованием непрерывных сигналов, которые могут не фиксировать важную статистику выбросов, генерируемых реальными датчиками, используемыми во время обработки. Несмотря на то, что SNN хорошо подходят для обработки сигналов от датчиков, основанных на событиях, таких как датчик динамического зрения (DVS) (Lichtsteiner et al., 2008), предыдущие модели обучения SNN требовали удаления информации о времени и создания кадров изображения из потоков событий. Вместо этого в этой статье мы используем тот же формат сигнала для обучения и обработки глубоких SNN и, таким образом, можем обучать SNN непосредственно на пространственно-временных потоках событий с учетом неидеальных факторов, таких как изменение пикселей в датчиках. Это продемонстрировано на наборе нейроморфных эталонных данных N-MNIST (Orchard et al., 2015), достигая более высокой точности с меньшим количеством нейронов, чем все предыдущие попытки, которые игнорировали время спайков, с использованием моделей аппроксимации частоты событий для обучения.

    2. Материалы и методы

    2.1. Пик нейронных сетей

    В этой статье мы изучаем два типа сетей: полносвязные SNN с несколькими скрытыми уровнями и сверточные SNN. Пусть M и N будут количеством синапсов нейрона и количеством нейронов в слое соответственно. С другой стороны, m и n — это количество активных синапсов (т. Е. Синапсов, принимающих импульсные входы) нейрона и количество активных нейронов (отправляющих выходные импульсы) в слое во время представления входного образца. .Мы также будем использовать упрощенную форму индексов для активных синапсов и нейронов на протяжении всей статьи как

    Активные синапсы: {v1, ⋯, vm} → {1, ⋯, m} Активные нейроны: {u1, ⋯, un} → {1, ⋯, n}

    Таким образом, если индекс i , j или k используется для синапса над [1, m ] или нейрона над [1, n ] (например, в уравнении 5), тогда он фактически представляет собой индекс активного синапса ( v i ) или активного нейрона ( u j ).

    2.1.1. Дырявый Neuron

    с интеграцией и огнем (LIF)

    Нейрон LIF — одна из простейших моделей, используемых для описания динамики импульсных нейронов (Gerstner and Kistler, 2002). Поскольку состояния нейронов LIF могут обновляться асинхронно, основываясь исключительно на времени событий ввода (то есть без пошаговой интеграции), LIF является эффективным с точки зрения вычислений. Для заданного входного импульса мембранный потенциал нейрона LIF может быть обновлен до

    .
    Vmp (tp) = Vmp (tp-1) etp-1-tpτmp + wi (p) wdyn, (1)

    где V mp — мембранный потенциал, τ mp — постоянная времени мембраны, t p и t p −1 — настоящее и времена предыдущих импульсов ввода, wi (p) — это синаптический вес i -го синапса (через который поступает текущий импульс p на входе).Мы вводим здесь динамический вес w dyn , который контролирует период огнеупора после

    wdyn = {(Δt / Tref) 2, если Δt , где Т исх является длительность максимума рефрактерного периода, и Δ т = т из т р , где т из это время последнего всплеска на выходе, произведенного нейроном, или внешнего триггерного сигнала посредством бокового торможения, как описано в разделе 2.1.2. Таким образом, влияние всплесков напряжения на входе V mp подавляется на короткий период времени T ref после всплеска выходного сигнала. w dyn восстанавливается квадратично до 1 после скачка выходного сигнала при t out . Поскольку w dyn является параметром нейрона и одинаково применяется ко всем синапсам, он отличается от краткосрочной пластичности, которая является специфическим для синапса механизмом.Мотивация к использованию динамических весов вместо более простых огнеупорных механизмов, таких как простая блокировка генерации всплесков на выходе, заключается в том, что это позволяет управлять рефрактерными состояниями с помощью внешних механизмов. Одним из примеров является введение схем WTA в разделе 2.1.2, где латеральное ингибирование одновременно переводит все нейроны, участвующие в WTA, в рефрактерное состояние. Это гарантирует, что нейрон-победитель получит еще один шанс выиграть соревнование, поскольку в противном случае другой нейрон мог бы сработать, а только победитель должен сбросить свой мембранный потенциал после генерации спайка.

    Когда V mp пересекает пороговое значение V th , нейрон LIF генерирует выходной пик, и V mp уменьшается на величину порога:

    Vmp (tp +) = Vmp (tp) -Vth, (3)

    , где tp + — время сразу после сброса. Нижняя граница для мембранного потенциала устанавливается равной — В th , а В mp обрезается всякий раз, когда оно падает ниже этого значения.Эта стратегия помогает уравновесить участие нейронов во время тренировки, не позволяя нейронам иметь крайне отрицательные мембранные потенциалы. Мы вернемся к этому вопросу, когда представим регуляризацию пороговых значений в Разделе 2.3.2.

    2.1.2. Гонка «Победитель забирает все» (WTA), трасса

    Мы обнаружили, что точность SNN может быть улучшена путем введения конкурентной повторяющейся архитектуры в форме добавления цепей WTA на определенных уровнях. В цепи WTA несколько нейронов образуют группу с боковыми тормозными связями.Таким образом, как только какой-либо нейрон производит импульс на выходе, он подавляет все другие нейроны в цепи и предотвращает их выброс (Rozell et al., 2008; Oster et al., 2009). В этой работе все боковые соединения в схеме WTA имеют одинаковую прочность, что снижает затраты на память и вычислительные ресурсы для их реализации. Величина бокового ингибирования, применяемого к мембранному потенциалу, пропорциональна порогу мембранного потенциала ингибированного нейрона (точная форма определена в уравнении 5 в разделе 2.2.2). При этой схеме латеральные связи слабо подавляют нейроны с малым V th , а с большим — V th — сильно. Это улучшает баланс активности нейронов во время обучения, поскольку нейроны с более высокой активностью имеют больше V th из-за схемы пороговой регуляризации, описанной в разделе 2.3.2. Кроме того, как описано ранее в разделе 2.1.1, латеральное торможение используется для перевода динамических весов всех ингибированных нейронов в цепи WTA в рефрактерное состояние.Как показано на рисунке 3 и обсуждается позже в разделе 3.1, мы обнаружили, что добавление схем WTA улучшает точность классификации и улучшает стабильность и скорость сходимости во время обучения.

    2.2. Использование обратного распространения ошибки в SNN

    Чтобы вывести и применить уравнения обратного распространения для обучения SNN, после обобщения классического метода обратного распространения (Rumelhart and Zipser, 1985) мы выводим дифференцируемые передаточные функции для нейронов с импульсами в конфигурации WTA.Кроме того, мы вводим простые методы для инициализации параметров и нормализации ошибок обратного распространения для устранения исчезающих или увеличивающихся градиентов, а также для стабилизации обучения. Это варианты успешных методов, обычно используемых в глубоком обучении, но адаптированных к конкретным требованиям сетей SNN.

    2.2.1. Возвращение к обратному распространению

    Нейронные сети обычно оптимизируются SGD, что означает, что вектор сетевых параметров или весов θ перемещается в направлении отрицательного градиента некоторой функции потерь L согласно θ = θ — η ∂L / ∂θ, где η — скорость обучения.Алгоритм обратного распространения ошибки использует цепное правило для вычисления частных производных ∂ L / ∂θ. Для полноты изложения мы приводим здесь сводку обратного распространения для обычных полносвязных глубоких нейронных сетей:

    1. Входные данные распространения в прямом направлении для расчета предварительных активаций ( z ( l ) ) и активаций ( a ( l ) = f ( l ) ( z ( l ) )) для всех слоев до выходного слоя l n l , где f — передаточная функция единиц.

    2. Рассчитайте ошибку на выходном слое:

    δ (nl) = ∂L (a (nl), y) ∂z (nl) = ∂L (a (nl), y) ∂a (nl) · f ′ (z (nl))

    , где y — вектор метки, указывающий на желаемую активацию вывода, а · — поэлементное умножение.

    3. Распространение ошибки на нижние уровни l = n l — 1, n l — 2,…, 2:

    δ (l) = ((W (l)) Tδ (l + 1)) · f ′ (z (l))

    , где W ( l ) — весовая матрица слоя l .

    4. Вычислить частные производные для обновления:

    ∇W (l) L = δ (l + 1) (a (l)) T∇b (l) L = δ (l + 1)

    , где b ( l ) — вектор смещения слоя l .

    5. Обновите параметры:

    W (l) = W (l) −η∇W (l) Lb (l) = b (l) −η∇b (l) L

    2.2.2. Передаточная функция и производные инструменты

    Начиная с основанного на событиях обновления мембранных потенциалов в уравнении (1), мы можем определить накопленный эффект (нормализованный по синаптическому весу) k -го активного входного синапса на мембранный потенциал целевого нейрона как x к ( т ).Точно так же генерация спайков в нейроне i воздействует на его собственный мембранный потенциал через член a i , который возникает из-за сброса в уравнении (3) (нормализовано на V th ). И x k , и a i могут быть выражены как суммы экспоненциально убывающих членов

    xk (t) = ∑pexp (tp − tτmp), ai (t) = ∑qexp (tq − tτmp), (4)

    , где первая сумма соответствует всем временам всплеска на входе t p < t в k -м входном синапсе, а вторая сумма превышает времена всплеска на выходе t q < т для a i .Накопленные эффекты боковых тормозных сигналов в цепях WTA могут быть выражены аналогично уравнению (4). Действия в уравнении (4) являются действительными и непрерывными, за исключением моментов времени, когда возникают всплески и активность увеличивается. Мы используем эти численно вычисленные действия с фильтром нижних частот для обратного распространения вместо прямого использования пиковых сигналов.

    Игнорируя пока влияние рефрактерных периодов, мембранный потенциал i -го активного нейрона в цепи WTA можно записать в терминах x k и a i определено в уравнении (4) как

    Vmp, i (t) = ∑k = 1mwikxk (t) -Vth, iai (t) + σVth, i∑j = 1, j ≠ inκijaj (t).(5)

    Члены справа представляют вход, сброс мембранного потенциала и латеральное ингибирование, соответственно. κ ij — сила бокового торможения (−1 ≤ κ ij ≤ 0) от j -го активного нейрона к i -ому активному нейрону, а σ — ожидаемая эффективность бокового торможения. σ должно быть меньше 1, так как латеральные ингибирования могут влиять на мембранный потенциал только до его нижней границы (т.е., — В ). Мы обнаружили, что значение σ ≈ 0,5 хорошо работает на практике. Уравнение (5) показывает взаимосвязь между входами и выходами нейронов с импульсами, которая не показана четко в уравнениях (1) и (3). Нелинейная активация нейронов учитывается в уравнении (5) путем включения только активных синапсов и нейронов. На рисунке 1 показана взаимосвязь между сигналами, представленными в уравнениях (4) и (5). Поскольку выход ( a i ) текущего слоя становится входом ( x k ) следующего слоя, если все нейроны имеют одинаковые τ mp , Уравнение (5 ) обеспечивает основу для вывода алгоритма обратного распространения через цепное правило.

    Рис. 1. Концептуальная диаграмма, показывающая взаимосвязь между сигналами в предлагаемой модели нейронной сети с пиками. Градиенты ошибки распространяются в обратном направлении через компоненты мембранного потенциала, определенные в уравнении (4).

    Дифференциация не определяется в уравнении (4) в момент каждого всплеска, потому что существует прерывистый скачок шага. Однако мы предлагаем здесь игнорировать эти флуктуации и рассматривать уравнения (4) и (5), как если бы они были дифференцируемыми непрерывными сигналами, чтобы получить необходимые градиенты ошибок для обратного распространения.В предыдущих работах (O’Connor et al., 2013; Diehl et al., 2015; Esser et al., 2015; Hunsberger, Eliasmith, 2015) непрерывные переменные вводились как суррогат для x k и a i в уравнении (5) для обратного распространения. Однако в этой работе мы напрямую используем вклад импульсных сигналов в мембранный потенциал, как это определено в уравнении (4). Таким образом, реальная статистика пиковых сигналов, включая временные эффекты, такие как синхронность между входами, может влиять на процесс обучения.Игнорирование скачков шага, вызванных всплесками при вычислении градиентов, конечно, может привести к ошибкам, но, как показывают наши результаты, на практике это, похоже, очень мало влияет на обучение SNN. Возможное объяснение этой устойчивости нашей схемы обучения состоит в том, что, рассматривая сигналы в уравнении (4) как непрерывные сигналы, которые внезапно колеблются во время всплесков, мы достигаем положительного эффекта, аналогичного широко используемому подходу инжекции шума во время обучения, который может улучшить способность нейронных сетей к обобщению (Винсент и др., 2008). В случае SNN в нескольких работах использовался прием, согласно которому резкие изменения, вызванные всплесками, рассматриваются как шум для оптимизации градиентного спуска (Bengio et al., 2015; Hunsberger and Eliasmith, 2015). Однако в этих случаях модель добавляла гауссовский случайный шум вместо возмущений, вызванных выбросами. В этой работе мы напрямую используем реальный вклад спайковых сигналов в мембранный потенциал, как описано в уравнении (4) для обучения SNN. Наши результаты эмпирически показывают, что этот подход хорошо работает для обучения в сетях SNN, где информация закодирована с частотой всплесков.Важно отметить, что представленная структура также обеспечивает основу для использования конкретных пространственно-временных кодов, которые мы демонстрируем на задаче с использованием входных данных от датчиков на основе событий.

    Для уравнений обратного распространения необходимо получить передаточные функции нейронов LIF в схемах WTA (которые обобщаются на слои без WTA, устанавливая κ ij = 0 для всех i и j ). Для этого мы устанавливаем остаточный член V mp в левой части уравнения (5) равным нулю (поскольку он не имеет отношения к передаточной функции), в результате чего передаточная функция

    ai≈siVth, i + σ∑j = 1, j ≠ inκijaj, где si = ∑k = 1mwikxk.(6)

    Рефрактерные периоды здесь не рассматриваются, так как в активности нейронов в SNN редко доминируют рефрактерные периоды в нормальном рабочем режиме. Например, мы использовали рефрактерный период 1 мс, а частота событий отдельных нейронов была в пределах нескольких десятков событий в секунду (eps). Уравнение (6) согласуется с (4.9) в работе Герстнера и Кистлера (2002) без членов WTA. Уравнение также можно упростить до версии выпрямленного линейного блока с добавлением пиков, введя единичный порог и мембранный потенциал без утечки, как в O’Connor and Welling (2016).

    Прямое дифференцирование уравнения (6) дает уравнения обратного распространения ошибки

    ∂ai∂si≈1Vth, i, ∂ai∂wik≈∂ai∂sixk, ∂ai∂Vth, i≈∂ai∂si (-ai + σ∑j ≠ inκijaj), ∂ai∂κih≈∂ai∂si (σVth, iah), (7)
    [∂a1∂xk ⋮ ∂a1∂xk] ≈1σ [q ⋯ −κ1n ⋮ ⋱ ⋮ −κn1 ⋯ q] −1 [w1kVth, 1 ⋮ wnkVth, n] (8)

    , где q = 1 / σ. Когда все боковые тормозные соединения имеют одинаковую прочность (κ ij = μ, ∀ i, j ) и не изучены, ∂ a i / ∂κ ih является не требуется, и уравнение (8) можно упростить до

    ∂ai∂xk≈∂ai∂si1 (1-μσ) (wik-μσVth, i1 + μσ (n-1) ∑j = 1nwjkVth, j).(9)

    Вставляя вышеуказанные производные в уравнения (7) и (9) в алгоритм обратного распространения стандартной ошибки, мы получаем эффективное правило обучения для SNN. Мы рассматриваем только эффект первого порядка боковых связей при выводе градиентов. Члены более высокого порядка, распространяющиеся обратно через множественные боковые соединения, для простоты не учитываются. Это главным образом потому, что все рассматриваемые здесь боковые связи являются тормозящими. Для тормозящих боковых соединений влияние небольших изменений параметров быстро спадает с увеличением расстояния соединения.Таким образом, приближение первого порядка экономит большие вычислительные затраты без потери точности.

    2.2.3. Инициализация веса и нормализация ошибки обратного распространения

    Хорошая инициализация весовых параметров в контролируемом обучении имеет решающее значение для решения проблемы растущих или исчезающих градиентов в глубоких нейронных сетях (Glorot and Bengio, 2010; He et al., 2015b). Основная идея, лежащая в основе этих методов, заключается в поддержании баланса между прямыми активациями и обратным распространением ошибок между уровнями.Недавно была предложена методика пакетной нормализации, чтобы гарантировать, что такой баланс поддерживается на протяжении всего тренировочного процесса (Иоффе и Сегеди, 2015). Однако нормализация действий, как в схеме пакетной нормализации, трудна для SNN, потому что не существует эффективного метода для увеличения частоты событий выше входной скорости. Методы инициализации, предложенные в Glorot and Bengio (2010) или He et al. (2015b) также не подходят для SNN, потому что SNN имеют положительные пороги, которые обычно намного превышают индивидуальные значения веса.В этой работе мы предлагаем простые методы инициализации параметров и нормализации ошибок обратного распространения для обучения глубоких SNN. Несмотря на то, что предложенная методика не гарантирует баланс прямых активаций, она эффективна для решения проблем взрывающихся и исчезающих градиентов. Нормализация ошибок не критична для обучения SNN с одним скрытым слоем. Однако мы заметили, что обучение глубоких SNN без нормализации ошибок обратного распространения в основном не удавалось из-за резких градиентов. Мы описываем здесь метод в случае полносвязных глубоких сетей для простоты.Однако тот же метод также используется для обучения сверточных SNN.

    Весовые и пороговые параметры нейронов в слое l инициализируются как

    w (l) ~ U [-3 / M (l), 3 / M (l)], Vth (l) = α3 / M (l), α> 1, (10)

    , где U [- a, a ] — равномерное распределение в интервале (- a, a ), M ( l ) — количество синапсов каждого нейрона, а α является константой. α должен быть достаточно большим, чтобы стабилизировать пикирующие нейроны, но достаточно маленьким, чтобы нейроны реагировали на входные сигналы через несколько слоев.В общем, слои с меньшим количеством единиц должны иметь меньшее α, чтобы генерировать больше всплесков на нейрон и поддерживать достаточно высокую входную активность для следующего слоя. Мы использовали значения от 3 до 10 для α и настроили их для каждого слоя, чтобы увеличить скорость обучения, хотя другой выбор α приведет к аналогичным результатам. Веса, инициализированные уравнением (10), удовлетворяют следующему условию:

    E [∑iM (l) (wji (l)) 2] = 1 или E [(wji (l)) 2] = 1M (l). (11)

    Это условие используется для нормализации ошибки обратного распространения в следующем абзаце.Кроме того, для обеспечения стабильности весовые параметры регулируются путем их уменьшения, чтобы они не слишком сильно отклонялись от уравнения (11) на протяжении всего обучения. Мы подробно обсудим регуляризацию веса в разделе 2.3.1.

    Основная идея нормализации ошибки обратного распространения состоит в том, чтобы сбалансировать величину обновлений весовых (и пороговых) параметров между слоями. В слое l ( N ( l ) = M ( l +1) , n ( l ) = м ( l +1) ), мы определяем ошибку, распространяющуюся обратно через i -й активный нейрон как

    δi (l) = gi (l) ḡ (l) M (l + 1) m (l + 1) ∑jn (l + 1) wji (l + 1) δj (l + 1), (12)

    , где gi (l) = 1 / Vth, i (l), ḡ (l) = E [(gi (l)) 2] ≅1n (l) ∑in (l) (gi (l)) 2.Таким образом, с помощью уравнения (11) математическое ожидание квадрата суммы ошибок может поддерживаться постоянным через слои (то есть E [∑in (l) (δi (l)) 2] = 1 для всех слоев). Хотя это было подтверждено для случая без схемы WTA, мы обнаружили, что это примерно верно для сетей, использующих WTA. Несоответствие можно легко исправить, введя дополнительные параметры в уравнение (12), но все результаты, представленные в этой статье, были получены с помощью более простой версии. Параметры веса и порога обновляются как:

    Δwij (l) = — ηwN (l) m (l) δi (l) x ^ j (l), ΔVth, i (l) = — ηthN (l) m (l) M (l) δi (l) âi (l), (13)

    , где η w и η th — скорости обучения для весовых и пороговых параметров, соответственно.j = xj, âi = γai-σ∑j ≠ inκijaj. При использовании уравнения (13) на начальном этапе обучения количество обновлений зависит от ожидаемой активности активных входов для каждого синапса, независимо от количества активных синапсов или нейронов. Таким образом, мы можем сбалансировать обновления между уровнями в глубоких SNN.

    2.3. Регуляризация

    Как и в обычных ИНС, методы регуляризации, такие как уменьшение веса во время обучения, важны для улучшения возможности обобщения SNN. Другая проблема в обучении SNN заключается в том, что, поскольку пороговые значения должны быть инициализированы большими значениями, как описано в уравнении (10), только несколько нейронов реагируют на входные стимулы, и многие из них остаются безмолвными.Это серьезная проблема, особенно в схемах WTA. В этом разделе мы представляем методы регуляризации весовых и пороговых значений для решения этих проблем.

    2.3.1. Регуляризация веса

    Регуляризация спада веса используется для повышения стабильности SNN, а также их способности к обобщению. В частности, мы хотим сохранить условие в уравнении (11). Обычная L2-регуляризация оказалась неадекватной для этой цели, потому что она приводит к начальному быстрому росту с последующим постоянным уменьшением весов.Для решения этой проблемы вводится новый метод экспоненциальной регуляризации, который основан на регуляризации максимальной нормы (Srivastava et al., 2014). Функция стоимости экспоненциальной регуляризации для нейрона i слоя l определяется как:

    Lw (l, i) = 12λeβ (∑jM (l) (wij (l)) 2-1), (14)

    , где β и λ — параметры для управления балансом между исправлением ошибок и регуляризацией. Его производная по весовому параметру может быть записана как (для сравнения с L2 и регуляризацией максимальной нормы):

    ∂Lw (l, i) ∂wij (l) = βλ × wij (l) × eβ (∑jM (l) (wij (l)) 2-1) (15)

    L2-регуляризация имеет постоянную скорость убывания независимо от значений веса, тогда как регуляризация максимальной нормы накладывает верхнюю границу увеличения веса.Экспоненциальная регуляризация — это компромисс между ними. Скорость распада экспоненциально пропорциональна квадрату суммы весов. Таким образом, он категорически запрещает увеличение веса, такое как регуляризация максимальной нормы. Весовые параметры всегда уменьшаются в любом диапазоне значений для улучшения возможности обобщения, как в L2-регуляризации. Однако экспоненциальная регуляризация предотвращает слишком сильное уменьшение весов за счет уменьшения скорости спада. Таким образом, величину весов можно легко поддерживать на определенном уровне.

    2.3.2. Регуляризация порога

    Пороговая регуляризация используется для балансировки активности N нейронов, получающих одни и те же входные стимулы. Этот механизм предотвращает появление слишком большого количества мертвых нейронов и тем самым повышает точность. Пороговая регуляризация особенно важна при использовании схем WTA, поскольку возбуждение нейронов дополнительно подавляется боковым торможением. Когда N w нейроны срабатывают после получения входного импульса, их пороги увеличиваются на ρ N .Впоследствии для всех нейронов N порог уменьшается на? N w . Таким образом, высокоактивные нейроны становятся менее чувствительными к входным стимулам из-за повышения их пороговых значений. С другой стороны, редко активные нейроны могут легче реагировать на последующие стимулы. Поскольку мембранные потенциалы ограничены диапазоном [- В th , V th ], нейроны с меньшими порогами из-за их жесткой нижней границы, как правило, меньше подвержены влиянию отрицательных входных сигналов. .Пороговая регуляризация активно предотвращает мертвые нейроны и побуждает все нейроны в равной степени участвовать в оптимизации. Этот вид регуляризации ранее использовался для соревновательного обучения (Rumelhart and Zipser, 1985; Afshar et al., 2014). Мы устанавливаем нижнюю границу пороговых значений, чтобы нейроны не срабатывали слишком часто из-за чрезвычайно малых пороговых значений. Если предполагается, что порог нейрона опускается ниже нижней границы, тогда вместо уменьшения порога все значения веса нейрона увеличиваются на ту же величину.Пороговая регуляризация проводилась во время прямого распространения при обучении.

    2,4. Цель функции и процедура обучения

    Используя член регуляризации из уравнения (14), целевая функция для каждой обучающей выборки (с использованием размера пакета = 1) задается как

    L = 12‖o − y‖2 + ∑l∈hidden∑iLw (l, i) (16)

    , где y — вектор метки, а o — вектор вывода. Каждый элемент o определяется как oi = # spikei / maxj (#spikej), где #spike i — количество выходных всплесков, генерируемых i -м нейроном выходного слоя.Выход нормализуется по максимальному значению вместо суммы всех выходов. В этой схеме нет необходимости использовать регуляризацию веса для выходного слоя.

    Процедуру обучения можно резюмировать следующим образом: для каждой обучающей выборки, например изображения из базы данных MNIST, генерируется набор событий. События распространяются вперед по сети с использованием правила обновления, управляемого событиями, описанного в уравнении (1), с регуляризацией порога. Это моделирование чисто событийно и не использует дискретные временные шаги.Значения вспомогательной активности, определенные в уравнении (4), также вычисляются для обучения во время прямого распространения. Значения пороговой регуляризации и вспомогательной активности используются только для обучения. Таким образом, они не нужны, если обученная сеть будет использоваться позже для вывода. После того, как все события из набора завершили распространение вперед по сети, события выходного слоя подсчитываются для получения выходного вектора, как описано выше в уравнении (16). Это используется для вычисления вектора ошибок, который нормализуется как (o-y) / Nnze, где N nze — количество ненулевых элементов в ( o y ).Ошибка распространяется в обратном направлении по сети с использованием цепного правила для обновления весовых и пороговых параметров. Таким образом, обратная фаза выполняется один раз для каждой входной выборки, как в обычном обратном распространении на основе кадров.

    3. Результаты

    MNIST — это рукописный набор данных классификации цифр, состоящий из 60 000 обучающих образцов и 10 000 тестовых образцов (LeCun et al., 1998). В настоящее время MNIST является слабым эталоном для глубокого обучения, но он по-прежнему широко используется для тестирования новых концепций и, что важно, единственный набор данных, для которого доступны результаты SNN для сравнения.Для всех результатов в этой статье мы обучили все 60 тыс. Обучающих выборок (за исключением случая CNN, где мы использовали только 50 тыс. Выборок и зарезервировали 10 тыс. Выборок в качестве набора для проверки для определения лучших параметров сети). Для оценки точности классификации мы использовали только 10 тыс. Тестовых выборок.

    3.1. Инвариант перестановки (PI) MNIST

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

    На рисунке 2A показана архитектура полностью подключенной SNN с одним скрытым уровнем (HL). Поток событий генерируется из изображения 28 × 28 пикселей рукописной цифры на входном уровне, что является стандартной практикой для SNN (O’Connor et al., 2013; Diehl et al., 2015). Интенсивность каждого пикселя определяет частоту событий Пуассона. Мы нормализовали общую частоту событий до 5 кэпов (в среднем ~ 43 eps на ненулевой пиксель). Точность SNN имеет тенденцию улучшаться по мере увеличения времени интегрирования (то есть длительности входных стимулов). Мы использовали длительность входного потока событий в течение 1 секунды во время измерения точности, чтобы получить стабильные результаты. Дальнейшее увеличение времени интегрирования улучшило точность лишь незначительно (<0,1%).Во время обучения использовалось только 50 мс презентаций на цифру, чтобы сократить время обучения. На начальном этапе обучения глубоких SNN активность нейронов имеет тенденцию быстро снижаться и распространяться на более высокие уровни из-за неоптимальных весов и больших пороговых значений. Таким образом, для сетей с 2 ​​HL первая эпоха использовалась в качестве начальной фазы обучения путем увеличения длительности входных стимулов до 200 мс. Скорость обучения и пороговая регуляризация снижались на exp (-1/35) каждую эпоху. Типичные значения параметров приведены в таблице 1.

    Рисунок 2. (A) SNN с одним скрытым слоем. (B) Обученные значения веса скрытого слоя 784-100-10 SNN со схемой WTA. Длина красных полос под изображением весов указывает пороговые значения нейронов.

    Таблица 1. Значения параметров, использованных в экспериментах .

    Мы обучили и оценили SNN со скрытыми слоями разного размера (784- N -10, где N = 100, 200, 300) и варьировали силу боковых тормозных связей в схемах WTA (в HL и выходном слое). ), чтобы найти их оптимальное значение.Все сети были инициализированы с одинаковыми значениями веса и обучены в течение 150 эпох. Сообщаемая точность — это среднее значение за эпохи [131, 150], что уменьшает колебания, вызванные случайным временем всплеска во входном потоке всплесков и обучением. На рисунке 2B показаны обученные значения веса и порога (ширина красной полосы) HL сети 784-100-10 с цепью WTA. Ясно видно, что цепь WTA приводит к разреженному представлению

    .

    java — Проблемы с пониманием алгоритма обратного распространения в нейронной сети

    Переполнение стека

    1. Около
    2. Продукты

    3. Для команд
    1. Переполнение стека
      Общественные вопросы и ответы

    2. Переполнение стека для команд
      Где разработчики и технологи делятся частными знаниями с коллегами

    3. Вакансии
      Программирование и связанные с ним технические возможности карьерного роста

    4. Талант
      Нанимайте технических специалистов и создавайте свой бренд работодателя

    5. Реклама
      Обратитесь к разработчикам и технологам со всего мира

    6. О компании

    .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *