Многослойный перцептрон и обратное распространение ошибок Итак, наконец-то я переосилил себя и взялся за написание этой статьи. Здесь речь пойдет о наиболее распространенной сети с обратным рпаспространением ошибок. Именно поэтому я решил написать эту статью в первую очередь. Что же такое многослойный перцептрон? Логичнее было бы сначала написать о перцептроне, показать, как работал он, а затем перейти к многослойному перцептрону. Но я сознательно этого делать не стану по нескольким причинам: 1. Простые перцептроны особого интереса не вызывают (по крайней мере, у меня) 2. Во-вторых, описание перцептрона более похоже на "историческое отступление" и является полезным для объяснения того, как было открыто обучение многослойного перцептрона. Но цель статьи - рассказать о структуре сети и о том, как происходит ее обучение, а не о том, как эта сеть появилась, и какие проблемы с ней были. Структура сети В первую очередь приведу рисунок: На этом рисунке изображена трехслойная сеть. Сразу хочу предупредить. Очень часто в литературе по нейросетям первый слой (на рисунке - черные круги) не считается первым, и вообще некоторые не считают элементы этого слоя нейронами. Объясню это позже. А сейчас договоримся, что это - трехслойная сеть, состоящая из входного слоя (в нем 3 нейрона), 1го скрытого слоя (в нем тоже 3 нейрона) и выходного слоя (здесь 2 нейрона). Средний слой называется скрытым потому, что он не имеет непосредственного "соприкосновения" с внешней средой, в отличие от входного и выходного. Связи Как можно заметить из рисунка, какжый элемент некоторого слоя связан с каждым элементом следующего слоя, но ни один элемент не связан с самим собой или с другим нейроном в том же слое, что и он сам. Это и является особенностью многослойного перцептрона. Далее. Связи в такой сети являются однонаправленными. То есть по одной связи сигнал может проходить только в одном направлении, и он идет от входного слоя к выходному; он не может, допустим, сначала дойти до 2го слоя, а затем вернуться к первому. Нейроны Первый (входной) слой Нейроны входного слоя (входные нейроны) являются особенными. У каждого из них только один вход, идущий, например, от какого-нибудь датчика. Функция активности входного нейрона – тождественная. То есть выход такого нейрона в точности равен входу. Таким образом, он распределяет неизмененный входной сигнал на все нейроны следующего (второго) слоя. Именно из-за такой их особенности их иногда не считают нейронами. Остальные слои Нейроны в остальных слоях одинаковы. Каждый нейрон некоторого слоя получает сигналы ото всех нейронов предыдущего слоя. Напомню, что работу нейрона можно условно разделить на два этапа: 1. Комбинирование входа. Он вычисляется стандартным способом – сигнал нейрона предыдущего слоя умножается на вес связи, ведущий к этому нейрону. Все эти произведения складываются (формула: , где xi – сигнал iого нейрона предыдущего слоя, wij – вес связи, ведущей от iого нейрона предыдущего слоя к j нейрону текущего слоя, netj – комбинированный вход j нейрона текущего слоя) 2. Вычисление активности. В многослойном перцептроне активационная функция обязательно должна быть нелинейной (не вдаваясь в подробности, скажу, если она будет линейной, то эта многослойная сеть будет эквивалентна однослойной, а ее возможности ограничены). Чаще всего используется сигмоидальная функция Вычисление результата Результат вычисляется "послойно". То есть, сначала вычисляются комбинированные входы и активности второго слоя. Затем для третьего и так до выходного слоя. Пример Все вышесказанное, скорее всего, трудно уловить сразу, поэтому приведу пошаговый пример работы сети. Для примера возьмем несложную сеть 2-2-2-1: (Цифры над стрелками - веса связей) Давайте теперь представим, что на вход сети подается числа 0.5 и 0.3. Наша цель - вычислить результат работы сети, если считать, что функция активности нейронов . Рассмотрим работу шаг за шагом, слой за слоем. Работа сети от слоя 1 к слою 2 (IN - комбинированный вход, OUT - активность нейрона): Работа сети от слоя 2 к слою 3: Работа сети к выходному слою: Таким образом, сеть вывела значение 0.82. Веса связей взяты случайными. Как правило, начальные значения весов берутся случайными в диапазоне от -0.5 до 0.5. Но в данном примере взяты простые числа, чтобы легче было считать. На этом, как мне кажется, можно закончить объяснение работы многослойного перцептрона. Обучение многослойного перцептрона (обратное распространие ошибок) Сеть выводит некоторое значение или несколько значений (если несколько выходных нейронов) на основе предъявленного ей входа. Этот выход заранее не известен, поскольку веса связей случайны. Наша задача – изменить веса связей таким образом, чтобы выход сети стал ближе к требуемому. То есть научить сеть выдавать определенный результат при предъявлении ей некоторых данных. В принципе, если сеть очень простая, то можно перебором подобрать веса, но в этом случае получается, что сеть не обучается. Как известно, в нашем мире мы довольно часто учимся на своих ошибках . Что касается рассматриваемой модели сети, то она в буквальном смысле учится на своих ошибках. Делается это по принципу «чем больше ошибка, тем больше надо изменить значение веса». Заранее скажу, что если нам известна фактическая ошибка нейрона, то мы можем вычислить (есть формула), насколько надо изменить вес связи для «приближения» результата к требуемому. Сначала определим ошибки выходных нейронов. В принципе, ошибка выходного нейрона равна разности требуемого результата и реально полученного. Но поскольку нам необходимо по этой ошибке для каждой связи, ведущей к этому выходному нейрону, вычислить новое значение, то нам необходимо найти зависимость ошибки от комбинированного входного сигнала. Поскольку статья рассчитана на почти нулевой уровень математики у читателья просто скажу, что после различных манипуляций получаем формулу для вычисления фактической ошибки каждого выходного нейрона: . Здесь: tj – требуемый выход jого выходного нейрона, oj – фактический выход этого нейрона. Итак, ошибки выходных нейронов нам известны. Я думаю, что вы уже видите проблему. “А как узнать фактические ошибки нейронов в скрытых слоях”, - спросите вы, - “Ведь мы же не знаем, какие значения они “должны” выдавать”. Так что перед тем, как говорить об изменении весов, необходимо рассказать о том, как вычислить ошибки скрытых слоев. Мне не известно, кто впервые предложил этот метод, но он действительно очень прост и по-своему оригинален. Что мы делаем с входным сигналом – мы “прогоняем” его через сеть от входного слоя к выходному. Суть же метода определения ошибок скрытых нейронов примерно “обратная” – мы “прогоняем” ошибки через сеть, но уже в обратном порядке, от выходного слоя к входному (отсюда и название метода – обратное распространение ошибок). Вот и вся премудрость. Есть, конечно, и незначительные изменения. Теперь рассмотрим все По-порядку и с рисунками. Вернемся к нашему примеру. Там сеть вывела значение 0.82. Допустим, что нам требовалось получить значение 1. Что же здесь происходит. Фактическая ошибка единственного нашего выходного нейрона равна 0.026 и вычислена следующим образом (1-0.82)*0.82*(1-0.82). Обратите внимание, что первая и вторая скобки совпадают, и происходит это лишь потому, что требуемый выход равен единице. Далее для нейронов третьего слоя (здесь это два левых нейрона) вычисляем комбинированный вход по стандартной схеме, т.е. ошибки нейронов следующего слоя умножаются на веса связей и эти произведения суммируются. Для верхнего нейрона на рисунке комбинированный вход – это ошибка выходного нейрона умноженная на вес связи, ведущей от верхнего нейрона к выходному. Двигаемся дальше, то есть назад. Суть таже. Очевидно, что считать ошибки для входных нейронов не имеет никакого смысла, поскольку они никак не изменяют входные сигналы, а сами сигналы – это отправная точка всех вычислений. Итак, с ошибками вроде разобрались. Теперь нам необходимо скорректировать веса связей. Для начала расмотрим простую схему из двух нейронов: нам требуется изменить вес связи между ними; нам известна ошибка одного нейрона, активность другого нейрона и текущий вес связи: Изменение связи прямопропорционально значению ошибки нейрона, к которому идет связь, значению активности нейрона, от которого идет связь, и некоторому значению , называемому коэффициентом (темпом, нормой) обучения. Формула: , где значение ошибки, O – значение активности. Пусть коэффициент обучения равен 1, тогда изменение веса будет равно 1*0.1*0.7 = 0.07. А новое значение веса равно старому значению + вычисленное изменение. В нашем примере вес станет равным 1.2. Теперь можно проверить, так ли мы все сделали. Когда вес был равен 0.5, выход этой сети был равен f(0.7*0.1) = 0.58. А поскольку достоверно известно, что ошибка выхода равна 0.1, то значит от сети требовалось вывести значение, приблизительно равное 1 (из формулы для вычисления ошибки выражаем t). Теперь новое значение веса 1.2, поэтому выход стал равным f(0.7*1.2) =0.7, что уже ближе к требуемой 1. Повторяя вычисления для новых значений мы увидим, что ошибка постепенно уменьшается (то есть выход сети приближается к 1). При этом коэффициент обучения влияет на скорость обучения. Но это не значит, что чем он больше, тем лучше. Этот коэффициент определяет примерную величину изменения веса, а это означает, что за раз вес изменится на некоторое значение, при этом чем больше коэффициент, тем больше это значение. А это означает, что при достижении примерно того значения веса, которое нужно, вес будет постоянно «скакать» около требуемого значения. Отсюда этот коэфициент берут примерно от 0.1 до 0.5. Кроме выше перечисленного при настройке весов еще добавляют так называемую инерцию, а именно: изменение веса связи на этом шаге зависит от изменения веса на предыдущем шаге. Делается это для избежания локальных минимумов. Попробую пояснить. Суть обучения сети – сведение к минимуму ошибки. При этом ошибку рассмотривают как функцию от весовых значений. Возьмем простейший случай, когда в сети только одна связь. В этом случае график функции ошибки в идеале - парабола. А у нее, как известно, один единственный минимум – ее вершина. Но на практике приходится иметь дело с функцией ошибок гораздо большего числа весов. При этом график будет уже не таким “правильным”, как парабола, в нем могут быть, условно говоря, “впадины”. Попадая в них сеть может просто застрять на месте. Суть инерции здесь очевидна - условная точка, скатываясь по поверхности ошибок, по инерции перескочит этот "холимк" и продолжит скатываться дальше. Порядок обучения нейронной сети Теперь я опишу, как же нужно работать с такой сетью, точнее как правильно ее обучать. Как уже говорилось, такая сеть является наиболее распространенной в силу своей универсальности. Такая сеть, в отличае от других специализированных, способна решать задачи различного типа. При этом она в буквальном смысле учится на примерах и на своих ошибках. В терминологии нейросетей обычно используется слово образец, а не пример. Таким образом, образец - набор входных данных и соответствующий ему набор выходных данных. В общем, обучение сети нескольким образцам можно предстваить в виде такого алгоритма: Шаг 1. Прочитать образец (набор входных данных и требуемый выходной набор) Шаг 2. Вычислить выход сети, подставив во входные нейроны входные данные образца. Шаг 2б. Проверить, попадает ли разность между выходными значениями и требуемыми в допустимые рамки. Если Да, то перейти к шагу 6. (И установить флаг Exit=TRUE) Шаг 3. Для каждого выходного элемента вычислить его ошибку Шаг 4. Вычислить ошибки всех скрытых слоев. Шаг 5. Вычислить изменения весов и обновить их. Шаг 6. Если есть еще образцы, то выбрать следующий образец и перейти к шагу 1. Шаг 7. Если образцов больше нет и Exit=TRUE, то выход из обучения. Если же Exit=FALSE то перейти к шагу 1. Заключение В этой статье я постарался рассказать о том, как работает многослойный перцептрон и вкратце рассказал о его обучении. На самом деле обучение МП - дело тонкое, здесь много о чем можно поговорить, как-то: предварительная подготовка образцов, завершение обучения и т.д. Но это уже тема отдельной статьи.