Взлет и падение персептрона

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

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

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

Мы можем связать это изменение отношения с взлетом и падением одного алгоритма: перцептрона.

Алгоритм перцептрона, впервые предложенный в 1958 году Фрэнком Розенблаттом, воплотил волнение (которое, оглядываясь назад, мы называем наивностью), окружавшее ИИ в 60-х годах, и подготовило почву для общего отказа от нейронной сети до середины 80-х. Чтобы изучить эту историю, историю великих ожиданий и больших разочарований, мы должны понять, что такое перцептрон.

Что такое перцептрон?

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

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

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

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

Тогда мы получаем скалярное число. Последний шаг - мы вводим это скалярное число, которое мы можем назвать z, в функцию активации. Любой, кто знаком с нейронными сетями, знаком с концепцией нелинейной функции активации, но здесь наша функция активации может быть чем-то чужеродным. Это двоичная пошаговая функция, которая выводит 0 или 1 в зависимости от того, меньше или больше нуля z.

Этот результат 0 или 1 является результатом нашего алгоритма перцептрона.

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

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

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

Как персептроны узнают свой вес?

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

Для каждого обучающего примера в нашем обучающем наборе (каждый вектор признаков):

  • Если наш алгоритм дает правильный ответ (0 или 1), не трогайте веса.
  • Если наш алгоритм выдает ложноотрицательный результат (0 при ответе 1), добавьте входной вектор к вектору весов.
  • Если наш алгоритм выдает ложное срабатывание (1 при ответе 0), вычтите входные данные из вектора весов.

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

Геометрическое понимание персептронов

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

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

Рассматривая отдельные примеры, давайте возьмем один обучающий пример, где правильный ответ - 1. В сценарии, где правильный ответ - 1, это означает, что мы хотим, чтобы z, который мы подключаем к нашей функции step, было больше. чем 0.

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

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

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

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

Если бы желаемый ответ в этом единственном обучающем примере был равен 0, мы бы увидели ту же картину, только поменяв местами «хорошие веса» и «плохие веса».

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

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

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

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

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

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

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

Несколько примеров обучения

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

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

Представьте, что у нас есть «плохие веса».

Если бы неверный вес был направлен вниз, мы бы удовлетворили первое уравнение (скалярное произведение было бы отрицательным, выход был бы равен 0). Тогда это не сработает во втором примере, так как мы снова получим на выходе 0.

Нашим средством от этого ложного отрицательного результата было бы добавление входных данных (из второго примера) к весам. Это приведет нас внутрь или ближе к нашему конусу правильных ответов.

Теперь представьте, что у вас есть другой неверный вектор веса, который указывает вверх. В первом примере мы получили бы неправильный ответ, получив 1, когда хотели бы 0. Это было бы ложным срабатыванием. Затем мы вычтем входные данные (из первого примера) из весов. Точно так же мы видим, что это приблизит нас к конусу, хотя все еще довольно далеко в неправильном направлении.

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

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

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

Где персептроны ошибаются: линейная разделимость и вычисления И

Эти последние два раздела основаны на примерах и интуитивных выводах из лекций Джеффри Хинтона в Университете Торонто. Вы можете просмотреть их здесь.

Оказывается, решение (некий гиперконус) существует тогда и только тогда, когда данные линейно разделимы. Проще говоря, это означает, что если бы вы изобразили все входные данные в некотором «пространстве данных», вы могли бы разделить примеры y = 1 и y = 0 одной линией.

Прежде чем я объясню, что это означает еще немного, давайте сначала рассмотрим пример.

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

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

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

К сожалению, складывая первые два и последние два неравенства, мы получаем нечто явно невозможное.

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

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

Последний гвоздь в гроб: теорема групповой инвариантности

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

Скажем, у нас есть какое-то одномерное изображение длиной десять пикселей. Каждый из этих пикселей может быть включен или выключен, черный (включен) или белый (выключен). Мы попытаемся различить две заметные закономерности. Мы хотим посмотреть, может ли наш алгоритм взять это изображение размером 1 x 10 и классифицировать, какой шаблон он показывает.

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

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

Если бы вы создали обучающий набор из всех возможных переводов шаблона 0 (включая циклический переход), каждый пиксель был бы «активирован» четыре раза, четырьмя разными переводы. Это означает, что если вы суммируете взвешенные суммы для каждого примера тренировки, вы получите ровно четыре раза каждый вес.

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

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

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

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

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

К сожалению, сообщение перцептронов было неправильно понято. Академические круги (и промышленность) рассматривали персептроны как доказательство того, что любое стремление не только к перцептронам, но и к алгоритмам, отдаленно напоминающим нейронные сети, было бесплодным. Финансирование и реинтеграция начались только в 1986 году - но в чем разница между перцептронами и современными нейронными сетями?

Нейронные сети - это всего лишь многослойные персептроны

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

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

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

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

Это не было выяснено в течение почти 17 лет после публикации Персептронов до 1986 года, когда в статье Дэвида Рамелхарта, Джеффри Хинтона и Рональда Уильямса был описан алгоритм обратного распространения ошибки.

Адам Дхалла - ученик средней школы из Ванкувера, Британская Колумбия. Он увлечен миром активного отдыха и в настоящее время изучает новейшие технологии в экологических целях. Посетите его веб-сайт adamdhalla.com.