Встретив знакомого на улице, мы вспоминаем его имя и профессию. Это пример отображения «вход-выход». Одна из ключевых целей как нашего разума, так и искусственной нейронной сети – научиться строить точные отображения «вход-выход». Здесь мы опишем, как это происходит согласно принципу, который мы называем обучением с коррекцией ошибок.
Нам предстоит изучить два ключевых вопроса. Первый: как нейронная сеть учится строить более точные отображения «вход-выход» с помощью обучения с коррекцией ошибок? Второй: как обучение с коррекцией ошибок позволяет получить полезные распределенные представления для объектов окружающего мира? Начнем с первого вопроса.
Основная идея обучения с коррекцией ошибок заключается в изменении силы связей (разработчики моделей называют их весами) таким образом, чтобы эти изменения уменьшали ошибку в отображении «вход-выход». Чтобы наглядно понять, о чем идет речь, представим, что мы хотим создать нейронную сеть, которая принимает на вход рукописную цифру (порой трудноразличимую) и выдает свою оценку того, что это за цифра.

Рисунок 7.3. Эта нейронная сеть принимает на вход рукописные цифры и определяет, что это за цифра. В данном случае входная семерка ошибочно распознана как тройка (на выходных элементах). При обучении с коррекцией ошибок сеть изменила бы свои веса так, чтобы уменьшить вероятность выдачи тройки и увеличить вероятность выдачи семерки
Рукописный текст бывает неоднозначным. Одна и та же цифра может быть написана по-разному, и иногда написанное может походить сразу на несколько цифр. Изображение на рисунке 7.3 напоминает семерку (перечеркнутую горизонтальной линией), но отчасти похоже и на тройку. Предположим, что это действительно семерка. Как создать нейронную сеть и научить ее правильно распознавать эту цифру?
Начнем с того, что обозначим некоторые элементы – крайний левый столбец нейронной сети на рисунке 7.3 – как входные элементы. Они принимают входные данные – в нашем случае изображение рукописной цифры. Обычно изображение разбивают на пиксели и каждому пикселю назначают отдельный элемент. Каждый элемент получает сигнал, пропорциональный степени закрашенности соответствующего пикселя. Многие элементы получат нулевой сигнал, поскольку их пиксели не закрашены, а некоторые могут получить максимальный сигнал – скажем, 1, если их пиксели полностью черные. В изображении 784 пикселя, поэтому нам потребовалось бы 784 входных элемента, но мы показали только 18, чтобы не перегружать рисунок. На рисунке 7.3 элементы, получающие ненулевой сигнал, выделены ореолом.
Входные элементы соединены с промежуточным слоем элементов, называемых скрытыми элементами, которые, в свою очередь, соединены со слоем выходных элементов. Выходных элементов 10 – по одному для каждой цифры. Скрытые элементы не получают сигналы извне сети и не передают их наружу – в этом смысле они и являются скрытыми. В некоторых сетях может быть несколько слоев скрытых элементов. Их назначение – дать сети возможность выявлять сложные взаимосвязи между входными паттернами и требуемым результатом. Подробнее мы обсудим это в главе 9.
В нашей сети каждый входной элемент связан с каждым скрытым, а каждый скрытый – с каждым выходным. Хотя в мозге существуют двусторонние связи, рассматриваемая нами сеть, как и многие искусственные сети, имеет только однонаправленные связи. Иначе говоря, входные элементы влияют на активацию скрытых, но скрытые не могут влиять на активацию входных. Точно так же скрытые элементы влияют на активацию выходных, но выходные не могут влиять на активацию скрытых. Такие сети часто называют сетями прямого распространения.
Когда мы подаем сигнал на входные элементы (соответствующий закрашенности пикселей входного изображения), можно представить, как активация распространяется на скрытые элементы. Чтобы вычислить активацию отдельного скрытого элемента, нужно умножить каждый входной сигнал на вес соответствующей связи с этим скрытым элементом и сложить все произведения. Множество скрытых элементов активируется в разной степени, и эта активация, в свою очередь, вызывает активацию в выходном слое. И вновь многие выходные элементы получают некоторую активацию. Допустим, выбор сети определяется элементом с наивысшей активацией. В нашем примере сеть активирует элемент «3» сильнее, чем элемент «7». Следовательно, тройка – это текущий результат обработки входного изображения.
Хотя тройка – вполне разумное предположение, правильный ответ все же семерка. Мы хотим научить сеть работать лучше. Как это сделать? Что в сети можно изменить?
Входные данные есть входные данные, они остаются прежними. Мы также не можем напрямую изменить активацию произвольного элемента, поскольку активация на каждом слое определяется активацией элементов предыдущих слоев. Зато мы можем изменять силу связей между элементами. Сила связей определяет степень влияния одних элементов на активацию других. Изменение этих сил, если мы сделаем это правильно, приведет к тому, что нужный элемент в выходном слое будет активироваться сильнее при следующей подаче того же входного сигнала. Дополнительный плюс: эти изменения улучшат обработку схожих примеров.
Итак, как мы обсуждали в главе 3, обучение в нейронной сети происходит путем изменения силы связей (или весов). Как мы отмечали, хеббовское обучение усиливает связи между двумя элементами, если они активируются одновременно (нейроны, которые возбуждаются вместе, связываются вместе). Обучение с коррекцией ошибок меняет силу связей, стремясь минимизировать ошибку сети.
Как же изменить силу связей для минимизации ошибки? Конкретнее, как заставить сеть с рисунка 7.3 сильнее активировать правильный ответ «7» и слабее – неправильный «3»? Первым делом можно попробовать случайные значения силы связей (представьте себе ручки настройки, которые делают связи сильнее или слабее). Но тут есть проблема. В нашей демонстрационной сети сотни связей, и перебор всех возможных значений силы (во всех возможных комбинациях) займет очень много времени. В более поздних нейронных сетях, которые мы рассмотрим в главе 8, миллиарды и даже триллионы связей, а количество комбинаций настроек превысило бы число атомов во Вселенной.
Поэтому нам нужен принцип, который направит наши изменения. Обучение с коррекцией ошибок – именно такой принцип. Его основная идея – настраивать силу связей так, чтобы уменьшить ошибку сети, то есть разницу между фактическим выходом сети и заданным извне целевым выходом. Мы определяем целевой выход как 1 для правильного ответа и 0 для всех остальных вариантов. Например, на рисунке 7.3 правильному ответу соответствовал бы выход 1 для элемента «7» и 0 для всех остальных элементов. Уменьшение ошибки сети означает подбор таких сил связей, которые снижают активацию элемента «3» и повышают активацию элемента «7». Затем сеть получает следующий входной сигнал – допустим, рукописную четверку, – и, если сильнее всего активируется выходной элемент «9», это опять неверно. Мы снова корректируем силу связей, чтобы скорректированная сеть выдавала чуть больше активации для «4» и чуть меньше для «9». Появляется следующий входной сигнал – скажем, рукописный ноль, – и на этот раз сильнее всего активируется элемент «0». Но даже если активация элемента «0» меньше единицы, обучение с коррекцией ошибок настроит силу связей так, чтобы правильный элемент «0» получал еще больше активации, а все остальные элементы с активацией больше нуля – еще меньше. По мере многократного повторения этого процесса, называемого тренировкой, сеть останавливается на таких значениях силы связей, которые все точнее позволяют правильно классифицировать входные данные. Если тренировочные данные содержат представительную выборку всех 10 цифр, этот процесс позволит сети распознавать цифры, которые она не видела во время обучения.
Заметим, что ошибка сети – величина относительная: даже если правильный выход активирован сильнее остальных, некоторая погрешность все равно может присутствовать. Допустим, следующий паттерн – четверка, которая немного напоминает девятку. Предположим, выходная активация сети для «4» составляет 0.9, а для «9» – 0.3. Обучение с коррекцией ошибок все равно скорректирует веса связей так, чтобы активация элемента «4» немного приблизилась к целевому значению 1, а активация элемента «9» снизилась к целевому значению 0.
Наша задача в этой и следующей главах – описать важные последствия, к которым может привести обучение с коррекцией ошибок. Когда вы поймете эти последствия, мы надеемся, у вас появится желание разобраться, как именно реализуется принцип обучения с коррекцией ошибок. Мы вернемся к этому в главе 9 и опишем, как сеть может эффективно снижать свою суммарную ошибку. Пока же важно понять, что обучение с коррекцией ошибок способно создавать полезные распределенные представления, – это и есть второй из двух ключевых вопросов, которые мы намеревались изучить в этом разделе.
Чтобы продвинуться в этом направлении, представим, что сеть с рисунка 7.3 обучена на тысячах рукописных цифр. Чего нам следует ожидать от скрытого слоя элементов при подаче конкретного входного сигнала – скажем, цифры «2» – после завершения обучения? Обратите внимание: нас интересует именно представление в скрытом слое.
Заметьте, что связи между входным и скрытым слоями должны быть настроены так, чтобы при встрече с цифрой – в данном случае с двойкой – они выделяли те особенности входного сигнала, которые наиболее полезны для отличения двоек от других цифр. Поскольку различные двойки похожи друг на друга и отличаются от других цифр сходным образом, разные варианты двоек будут активировать в скрытом слое паттерны, которые окажутся более схожими между собой, чем сами двойки на входном уровне. А поскольку определенные признаки двоек могут быть особенно важны для их отличия от троек, скрытые паттерны двоек и троек будут перекрываться меньше, чем на входном уровне.
Таким образом, после достаточного обучения сеть, получив определенный входной паттерн, создаст распределенное представление, схожее с представлениями других объектов того же класса и отличное от представлений объектов других классов. Распределенные представления всех рукописных двоек (или троек, или четверок…) будут похожи друг на друга и отличаться от представлений других цифр. Вполне возможно, что, изучив паттерн активации в скрытом слое, мы смогли бы определить, какой именно входной сигнал его породил. Любопытно, что схожим образом можно анализировать паттерны активации в человеческом мозге (с помощью нейровизуализации) и определять, смотрит ли человек, например, на изображение лица или дома.
Для наших целей главный вывод таков: обучение с коррекцией ошибок позволяет эффективно создавать в нейронной сети распределенные представления, которые схожи для объектов одного класса и различны для объектов разных классов. Распределенные представления откроют путь к значительному прогрессу в понимании природы разума – как человеческого (об этом пойдет речь в оставшейся части главы), так и искусственного интеллекта (это мы рассмотрим в главе 8).