Продвинутое машинное обучение с многослойным перцептроном

Содержание:

Что такое многослойный персептрон?

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

Изображение предоставлено = http: //commons.wikimedia.org/wiki/File: Perceptron.png /

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

Обратите внимание, что термин смещения теперь является вектором, а W — весовой матрицей

Изображение предоставлено = http: //www.texample.net/tikz/examples/neural-network/

Теперь мы понимаем плотный слой, давайте добавим их несколько, и эта сеть станет многослойной сетью персептрона.

Изображение предоставлено = http: //pubs.sciepub.com/ajmm/3/3/1/figure/2s

Если вы заметили, что наш плотный слой имеет только линейные функции, и любая комбинация линейных функций приводит только к линейному выходу. Поскольку мы хотим, чтобы наш MLP был гибким и изучал границы нелинейных решений, нам также необходимо ввести нелинейность в сеть. Мы достигаем задачи введения нелинейности, добавляя функцию активации. Существуют различные виды функций активации, которые можно использовать, но мы будем реализовывать Recified Linear Units (ReLu), которая является одной из популярных функций активации. Функция ReLU — это простая функция, которая равна нулю для любого входного значения ниже нуля и того же значения для значений больше нуля.Функция ReLU

Теперь мы понимаем плотный слой, а также понимаем назначение функции активации. Осталось только обучить сеть. Для обучения нейронной сети мы должны иметь функцию потерь, и каждый слой должен иметь петля прямой связи а также петля обратного распространения, Цикл обратной связи принимает входные данные и генерирует выходные данные для создания прогноза, а цикл обратного распространения помогает в обучении модели путем регулировки весов в слое для снижения потерь на выходе. При обратном распространении обновление веса выполняется с использованием градиентов с обратным распространением с использованием правила цепочки и оптимизируется с использованием алгоритма оптимизации. В нашем случае мы будем использовать SGD (стохастический градиентный спуск). Если вы не понимаете концепцию обновления градиентного веса и SGD, я рекомендую вам посмотреть первую неделю лекций Эндрю Н.Г. «Машинное обучение».

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

Плотный слой — полностью связанный слой,

  • Слой ReLU (или любая другая функция активации для введения нелинейности)
  • Функция потери — (кроссентропия в случае задачи мультиклассовой классификации)
  • Алгоритм Backprop — стохастический градиентный спуск с обратными градиентами

Давайте подойдем к ним по одному.

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

Элементарный перцептрон состоит из элементов трех типов: S-элементов, A-элементов и одного R-элемента. S-элементы — это слой сенсоров, или рецепторов. В физическом воплощении они отвечают, например, светочувствительным клеткам сетчатки глаза или фоторезисторами матрицы камеры. Каждый рецептор может находиться в одном из двух состояний — покоя или возбуждения, и только в последнем случае он передает единичный сигнал к следующий слоя, ассоциативным элементам.

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

Сигналы от возбужденных A-элементов, в свою очередь, передаются в сумматора R, причем сигнал от i-го ассоциативного элемента передается с коэффициентом. Этот коэффициент называется весом AR связи.

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

Обучение элементарного перцептрона состоит в изменении весовых коэффициентов связей AR. Весы связей SA (которые могут принимать значения (-1, 0, 1)) и значение порогов A-элементов выбираются случайным образом в самом начале и потом не меняются.

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

Perceptron Algorithm

The Perceptron is pretty straightforward. Here’s the basics:

  1. Initialize the weight vector , set a threshold for the activation function, number of time steps for computation, and a learning rate .

  2. Calculate the output at the first iteration for the first training sample for the features:

    \begin{align} \hat{y}^1_1 &=\begin{cases} 1 & \text{if }f \gt z\\ 0 & \text{otherwise}. \end{cases} \end{align}

  3. Update the weights

  4. Increment the time-step to . If the final time-step hasn’t been reached, go back to step 2., repeating the process for the next training sample .

It should be noted that this isn’t exactly identical to Rosenblatt’s original Perceptron, which used the for activation.

\begin{align} sgn(f) =\begin{cases} 1 & \text{if }f \gt 0\\ -1 & \text{if }f \lt 0. \end{cases} \end{align}

The form we’ll be implementing allows us some flexibility in choosing a threshold for our activation function. It also allows us to implement and for the outputs, which is typical for binary classification.

Новая парадигма обучения

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

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

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

Градиентный спуск

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

Рисунок 2 – Демонстрация идеи градиентного спуска

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

Функция ошибки (aka функция потерь)

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

\

где k указывает диапазон выходных узлов, t является целевым выходным значением, а o является рассчитанным выходным значением.

Нейросетевой логический элемент

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

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

Рисунок 1 – Однослойный перцептрон

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

Размерность входных данных этой нейросети равна 2, поэтому мы можем легко построить входные выборки в двухмерном графике. Допустим, что вход соответствует горизонтальной оси, а вход1 соответствует вертикальной оси. Четыре возможные комбинации входных значений будут расположены следующим образом:

Рисунок 2 – Возможные комбинации входных значений примера нейросети

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

Рисунок 3 – Разделение пространства входных значений в зависимости от требуемых выходных значений

Резюмируем информацию скрытых слоях

Во-первых, давайте повторим некоторые важные моменты о скрытых узлах в нейронных сетях.

  • Перцептроны, состоящие только из входных узлов и выходных узлов (называемые однослойными перцептронами), не очень полезны, потому что они не могут аппроксимировать сложные связи вход-выход, которые характеризуют многие типы реальных явлений. Более конкретно, однослойные перцептроны ограничены линейно разделимыми задачами. Как мы видели в седьмой статье («Продвинутое машинное обучение с многослойным перцептроном»), даже такая базовая функция, как логическая функция «исключающее ИЛИ» (XOR), не является линейно разделимой.
  • Добавление скрытого слоя между входным и выходным слоями превращает перцептрон в универсальный аппроксиматор, что, по сути, означает, что он способен захватывать и воспроизводить чрезвычайно сложные связи вход-выход.
  • Наличие скрытого слоя делает обучение немного более сложным, потому что весовые коэффициенты между входным и скрытым слоями косвенным образом влияют на конечную ошибку (этот термин я использую для обозначения разницы между выходным значением нейросети и целевым значением, заданным обучающими данными).
  • Методика, которую мы используем для обучения многослойного перцептрона, называется обратным распространением: мы распространяем конечную ошибку обратно в сторону входа нейросети таким образом, который позволяет нам эффективно изменять веса, которые не подключены непосредственно к выходному узлу. Процедура обратного распространения является расширяемой, т.е. та же самая процедура позволяет нам обучать веса, связанные с произвольным числом скрытых слоев.

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

Рисунок 1 – Нейронная сеть многослойный перцептрон, или MLP (multilayer perceptron)

Stochastic Gradient Descent

It’s interesting to note that the Perceptron is identical to Stochastic Gradient Descent (SGD) on the following Sum-Of-Squared Error (SSE) loss function where is the true output, is the predicted output, and is the weight:

We start by approximating the gradient at a single point using SGD:

As with the Perceptron, is the learning rate, is a training sample, and is a given iteration. We can reshape this by taking the partial derivative of the loss function at a particular training sample with respect to .

Now we can plug this back into the original SGD equation.

If we plug in for the first iteration and for the training sample, then the form is identical to the Perceptron in the previous section.

Depending on the loss function used, SGD can take on many other forms. For additional details about SGD using other loss functions and variations, here is a good resource.

Совершенствование персептрона

Важно отметить, что программное обеспечение и аппаратные средства существуют на блок-схеме: программное обеспечение может быть представлено как аппаратное, так и наоборот. Когда программируются микросхемы (такие как FPGA) или конструируются интегральные схемы (например, ISIC), путем вытравливания определенного алгоритма в кремнии, мы всего навсего реализуем программное обеспечение на одном уровне ниже для увеличения скорости его работы

Аналогично, то, что вытравлено в кремнии или связано с лампами и потенциометрами (например, «Mark I» Розенблатта), также может быть выражено в виде кода. Вот почему Алан Кей сказал: «Люди, которые действительно серьезно относятся к программному обеспечению, должны создавать собственное оборудование». Но бесплатный сыр бывает только в мышеловке: выигрывая в скорости работы путем вытравливания алгоритмов, вы проигрываете в возможности их модификации. Это является реальной проблемой в машинном обучении, где алгоритмы самопроизвольно изменяются по мере обработки данных. Задача состоит в том, чтобы найти те части алгоритма, которые остаются стабильными даже при изменении параметров, например, операции с линейной алгеброй, которые в настоящее время обрабатываются GPU быстрее всего.

Дальнейшее изучение вопроса может привести вас к потребности разработки все более и более сложных и полезных алгоритмов. Мы переходим от одного нейрона к совокупности нескольких, называемой слоем; затем переходим от одного слоя к совокупности нескольких, называемой многослойным персептроном. Можем ли мы перейти от одного МП к нескольким, или же мы просто будем дальше нагромождать слои, как это сделала Microsoft со своим лидером ImageNet, ResNet, в котором было более 150 слоев? Или же правильным является комбинирование МП – ансамбля многих алгоритмов, голосующих в своего рода вычислительной демократии за лучший прогноз? Или это по сути лишь встраивание одного алгоритма в другой, как это происходит со сверточными графовыми сетями?

Упрощение

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

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

Биологическая структура → схема

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

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

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

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

Электрические сигналы → числа

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

Электрический сигнал всегда будет электрическим сигналом. Концептуально ничего не изменяется. Но что же тогда меняется? Меняется величина этого электрического сигнала (сильнее/слабее). А любую величину всегда можно выразить числом (больше/меньше).

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

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

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

Синапсы → веса связей

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

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

Это ключевой момент в концепции искусственных нейронных сетей, я объясню его подробнее. Посмотрите на картинку ниже. Теперь каждой черной стрелке (связи) на этой картинке соответствует некоторое число ​\( w_i \)​ (вес связи). И когда сигнал проходит по этой связи, его величина умножается на вес этой связи.

На приведенном выше рисунке вес стоит не у каждой связи лишь потому, что там нет места для обозначений. В реальности у каждой ​\( i \)​-ой связи свой собственный ​\( w_i \)​-ый вес.

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

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