если они бесполезны.
Уроки для человека
Первый урок: как и булевы функции, сложность человеческого интеллекта возникает из комбинации очень простых элементов. Это – качественно новое свойство мозга.
Урок второй: врожденное знание является необходимым для дальнейшего обучения. В нашем мозгу с самого рождения должны существовать какие-то структуры связей. Если мы можем учиться, то это потому, что мозг достаточно специализирован, чтобы позволить нам обрабатывать информацию, то есть составлять правила с небольшими пробами и ошибками. Если бы мы представляли собой tabula rasa (чистый лист бумаги – в общем, поверхность, предназначенная для записи, на которой еще ничего не написано), если бы наш мозг был полностью универсальным, мы могли бы изучить что угодно (так как очень сложные модели могут изучать очень большой объем данных), но это заняло бы у нас огромное количество времени, потому что нам пришлось бы все заучивать наизусть.
Урок третий: все описанные здесь методы машинного обучения минимизируют функцию стоимости. Машины пытаются это сделать, у них ничего не получается, и они перестраиваются, чтобы приблизиться к ожидаемому результату. Могут ли методы обучения людей и животных также интерпретироваться как минимизация функций стоимости? Хотел бы я знать ответ на этот вопрос…
Глава 5
Глубокие сети и обратное распространение
Столкнувшись с пределами возможностей перцептрона и подобных ему устройств, научное сообщество нашло наиболее подходящее решение, заключавшееся в наложении нескольких слоев нейронов друг на друга, чтобы позволить системам решать более сложные задачи.
Мы должны были найти способ обучать такие системы от начала до конца. Решение оказалось простым, но вначале его никто не увидел, и в поэтому в конце 1960-х научное сообщество отказалось от дальнейших исследований. Все изменилось в середине 1980-х, когда разные ученые независимо друг от друга открыли обратное распространение градиента. Этот метод эффективно вычислял градиент стоимости в многослойной сети. Он регулировал параметры слоев сети, чтобы минимизировать затраты от вывода до ввода, и, в конечном итоге, первые слои сами определяли правильные шаблоны изображений, необходимые для выполнения задачи.
Таким образом, нейронные сети могли обучаться решению сложных задач и тренироваться на большом количестве данных. Здесь мы говорим о глубоком обучении, имея в виду сети, состоящие из нескольких слоев нейронов.
Торт «Наполеон»
Несмотря на то, что создание основных принципов и первых приложений многослойных сетей относится к 1980-м гг., революция глубокого обучения произошла только к 2010 г., благодаря появлению мощных программируемых графических процессоров (GPU) и доступности больших баз данных.
На сегодняшний момент алгоритмы обратного распространения – это основа глубокого обучения. Практически все системы искусственного интеллекта используют данный метод.
Рис. 5.1a. Многослойная нейронная сеть с прямой связью
Каждая единица сети вычисляет взвешенную сумму своих входов, обрабатывает результат с помощью передаточной функции и отправляет рассчитанные выходные данные на вход других единиц на следующем слое. Таким образом, сеть состоит из чередования двух типов слоев: линейных слоев, вычисляющих взвешенные суммы, и нелинейных слоев, применяющих передаточную функцию. Как и в случае с перцептроном, обучение включает в себя изменение весов, соединяющих единицы таким образом, чтобы минимизировать показатель ошибки (функцию стоимости), измеряя разницу между выходом сети и желаемым выходом. Обратное распространение, которое является темой данной главы, вычисляет градиент этой функции стоимости по всем весам в сети.
Многослойная нейронная сеть – это своего рода «торт» из нескольких типов слоев. Входные данные каждого слоя можно рассматривать как вектор (список чисел), который представляет собой выходные параметры предыдущего слоя. Выходным результатом рассматриваемого слоя также является вектор, который не обязательно имеет ту же размерность, что и входящий.
Многослойная сеть с прямой связью – это тип сети, в которой каждый следующий слой принимает свои входные данные от предыдущего слоя или слоев. Если существуют соединения, идущие от верхних слоев (которые находятся рядом с выходом) к нижним слоям (которые находятся рядом с входом), то тогда речь идет о рекуррентной сети (ее называют еще сетью с обратной связью). Но давайте пока остановимся на сетях с прямой связью.
В «классических» многослойных нейронных сетях чередуются два типа слоев (см. рисунок 5.1а).
Рис. 5.1b. Функции нейронов в сети
Нейрон i вычисляет свою взвешенную сумму s[i] по выходным сигналам связанных с ним нейронов предыдущего слоя. Набор нейронов перед нейроном i обозначается UP[i], а вес w[i, j] соединяет нейрон j с нейроном i. Эта сумма рассчитывается по следующей формуле:
За суммой следует нелинейная передаточная функция h, производящая выходной сигнал нейрона:
z[i] = h(s[i])
1. Линейные слои: каждый выход представляет собой взвешенную сумму входов. Количество входов и выходов может быть разным. Они называются линейными, потому что если мы зададим сумму двух входных сигналов, то такой слой создаст ту же сумму выходов, какую бы он произвел, если бы обрабатывал те же сигналы по отдельности.
2. Нелинейные слои: каждый выход создается путем применения нелинейной функции к соответствующему входу. Это может быть квадратичная функция, сигмоида, извлечение абсолютного значения и т. д. У такого слоя столько же входов, сколько и выходов. Именно нелинейные операции являются основой мощности многослойных сетей. Мы вернемся к этому чуть позже (см. рис. 5.2).
Конкретный выход линейного слоя – это взвешенная сумма s[i] (с использованием весов w[i, j]), соединяющая ее с выходом z[j] единицы в предыдущем слое:
Символ UP[i] обозначает набор нейронов, или входных датчиков – в общем, каких-то функциональных единиц, от которых i принимает свои входные данные. Конкретный выходной сигнал z[i] нелинейного слоя, следующего за линейным слоем, является результатом применения к взвешенной сумме той или иной нелинейной функции h, которая называется «передаточной функцией»:
z[i] = h(s[i])
Последовательность этих двух операций и представляет собой функциональную единицу нейронной сети, иными словами – нейрон. Таким образом, последовательность линейного слоя и слоя передаточных функций образует слой нейронов.
Передаточная функция отправляет свой вывод единицам, т. е. нейронам, находящимся на следующем слое. Следующий слой принимает выходные данные единиц предыдущего слоя и выполняет аналогичные вычисления, и так далее: линейный слой – нелинейный слой, вплоть до выходного слоя.
Зачем нужно чередовать линейные и нелинейные операции? Если бы все слои были линейными, то вся операция была бы композицией нескольких линейных операций. Но такая композиция была бы попросту эквивалентна одной линейной операции, что сделало бы многослойность совершенно бесполезной. Линейная сеть может вычислять только линейные функции.
Однако функции, которые мы хотим