Четвертое преимущество связано со способностью сети автоматически делать заключения. Если бы мы подключили наш распознаватель (который направлял бы данные с группы входных узлов на узел принятия решений) к нашему принтеру (у которого был бы узел намерений, от которого сигнал разветвлялся бы на группу выходных узлов), то получили бы простейший демон подстановок – например, на букву «В» он бы реагировал тем, что печатал бы «С». Однако если обойтись без посредника и присоединить входные узлы непосредственно к выходным узлам, можно получить очень интересный результат.
Вместо верного букве демона подстановок мы получим демона, который может делать простые обобщения. Такая сеть называется ассоциатором паттернов[111].
Предположим, что входные узлы нижнего уровня представляют внешние признаки животных: «покрытое шерстью», «четвероногое», «покрытое перьями», «зеленое», «длинношеее» и т. д. Если создать достаточное количество узлов, каждое животное можно будет представить, включив узлы, соответствующие его уникальному набору признаков. Например, попугай будет представлен включением узла «покрытое перьями», выключением узла «покрытое шерстью» и т. д. Теперь представим, что выходные узлы верхнего уровня соответствуют зоологическим категориям. Один из них представляет тот факт, что животное травоядное, другой – что оно теплокровное и т. д. При том, что у нас нет узлов, соответствующих конкретным животным (так, у нас нет блока «попугай»), весы будут автоматически представлять статистическое знание о классах животных. Они воплощают знание о том, что животные с перьями обычно бывают теплокровными, что животные, покрытые шерстью, обычно живородящие, и т. д. Любой факт, хранящийся в связях для одного животного (попугаи – теплокровные) автоматически переносится на похожих животных (волнистые попугайчики – теплокровные), потому что для сети неважно, что связи относятся к конкретному животному. Связи просто указывают, какие внешние характеристики предполагают какие внешне невидимые свойства, вообще не учитывая факт разделения животных на виды.
На концептуальном уровне ассоциатор паттернов отражает понятие о том, что если два объекта схожи в чем-то одном, то они могут быть схожи и в чем-то еще. На механическом уровне схожие объекты представлены одними и теми же узлами, поэтому любая единица информации, связанная с узлами для одного объекта, будет в силу самого факта связана с блоками для другого. Более того, классы разной степени включения накладываются друг на друга в пределах одной сети, потому что любое подмножество узлов неявным образом определяет тот или иной класс. Чем меньше узлов, тем больше класс. Скажем, у нас есть входные узлы для следующих признаков: «движется», «дышит», «покрыто шерстью», «лает», «кусается» и «задирает ногу рядом с пожарным гидрантом». Связи, исходящие из всех шести узлов, активизируют факты, касающиеся собак. Связи, исходящие из первых трех узлов, активизируют факты, касающиеся млекопитающих. Связи, исходящие из первых двух, активизируют факты, касающиеся животных. Установление подходящих весов связей позволяет распространить элемент знания, запрограммированный для одного животного, на непосредственных и дальних его родственников.
Пятая хитрость нейронных сетей в том, что они могут учиться на примерах, при этом обучение состоит в изменении весов связей. Разработчику модели (как и процессу эволюции) не приходится устанавливать вручную тысячи коэффициентов веса, необходимых для того, чтобы получить нужный выход. Представим, что «учитель» подает в ассоциатор паттернов не только вход, но и правильный выход. Механизм обучения сравнивает реальный выход, полученный сетью (а он поначалу будет достаточно произвольным), с правильным ответом и корректирует коэффициенты веса с тем, чтобы минимизировать разницу между этими двумя значениями. Если сеть тормозит выходной узел, который по версии учителя должен быть возбужден, нам нужно сделать так, чтобы текущее поступление активных входов в будущем приводило к его возбуждению. Следовательно, коэффициенты веса на активных входах к этому мятежному выходному узлу нужно немного увеличить. Кроме того, нужно слегка снизить величину порога самого выходного узла, чтобы сделать его более чувствительным к любому инициирующему сигналу. Если сеть активизирует выходной узел, а учитель говорит, что он должен быть выключен, происходит противоположное: коэффициенты весов активных на данный момент входных элементов немного снижаются (возможно даже снижение веса ниже нуля, до отрицательного значения), а величина порога нужного узла увеличивается. Благодаря этому повышается вероятность того, что «гиперактивный» выходной узел в будущем будет выключаться при получении таких входных сигналов. В сеть вновь и вновь подаются целые серии входных сигналов и соответствующих им выходов, каждый раз при этом возникают волны небольших изменений в весах связей, пока сеть не начнет выдавать правильный выход для каждого входа – по крайней мере, в той мере, в которой это возможно.
Ассоциатор паттернов, оснащенный таким методом обучения, называется персептроном. Персептроны интересны, однако у них есть один большой недостаток. Они напоминают плохого повара, который считает, что если каждый ингредиент в небольшом количестве хорош, то все ингредиенты сразу и помногу – это будет еще лучше. Решая, правомерно ли определенный набор сигнальных входов приводит к выключению выходного сигнала, персептрон взвешивает их и складывает. Это зачастую дает неверный ответ, причем даже к простой задаче. Хрестоматийный пример этого недостатка – это то, как персептрон справляется с простой логической операцией, называемой «исключающее ИЛИ», что означает «А или В, но не оба сразу».
Когда активизируется А, сеть должна включить «А исключающее или В». Когда включается В, сеть должна включить А исключающее или В. Эти факты заставят сеть увеличить вес связи, исходящей от А (скажем, до 0,6) и увеличить вес связи, исходящей от В (скажем, до 0,6), тем самым сделав каждый из этих весов достаточно большим, чтобы преодолеть пороговое значение выходного узла (скажем, 0,5). Но когда включены и А и В одновременно, получается слишком много хорошего сразу: узел «А исключающее или В» ревет белугой как раз тогда, когда нам нужно, чтобы он молчал. Если мы попытаемся применить более низкие коэффициенты весов и более высокий порог, мы можем заставить его молчать, когда включены и А и В, но, увы, он будет молчать и тогда, когда включится только А или только В. Можно экспериментировать с весами сколько угодно, но это ничего не даст. Исключающее или – лишь один из многих демонов, которых нельзя создать на основе персептронов. В числе других – демоны, определяющие, четное или нечетное число блоков активизировано; демоны, определяющие, симметрична ли последовательность активных узлов, а также демоны, выполняющие простейшие задачи на сложение[112].
Выход из этой ситуации – сделать сеть менее похожей на пресловутую собаку Павлова и добавить между уровнями входа и выхода еще один уровень: внутреннюю репрезентацию. Нужна такая репрезентация, которая эксплицирует все ключевые виды информации, связанные с входными сигналами, чтобы каждый выходной узел мог просто складывать входные значения и получать правильный ответ. Вот как это работает в случае с исключающим или:
Два скрытых узла между вводом и выводом вычисляют полезные промежуточные результаты. Узел слева вычисляет результат для простого случая «А или В», который, в свою очередь, активизирует выходной узел. Узел справа вычисляет результат для более сложного случая «А и В», и этот результат тормозит выходной узел. Выходной узел может просто вычислить «(А или В) и не (А и В)», это ему вполне по силам. Отметим, что на микроскопическом уровне построения простейших демонов из модельных нейронов без внутренних репрезентаций не обойтись; одних только связей по типу стимула и реакции не достаточно.
Более того, скрытый уровень сети можно научить самостоятельно устанавливать веса связей, используя более хитроумную версию метода обучения, чем в случае персептрона. Как и ранее, учитель задает сети правильный выход для каждого входа, а сеть подстраивает веса связей в большую или меньшую сторону, пытаясь сократить разницу. Однако в связи с этим возникает проблема, с которой не приходилось сталкиваться персептрону: как настроить связи, исходящие от узлов ввода к скрытым узлам. Проблема заключается в том, что учитель, если только он не умеет читать мысли, никак не может знать «правильные» значения для скрытых узлов, запечатанных внутри сети. Психологи Дэвид Румельхарт, Джеффри Хинтон и Рональд Уильямс пришли к хитрому решению. Узлы вывода распространяют обратно к каждому из скрытых узлов сигнал, представляющий сумму ошибок скрытого узла по всем узлам вывода, с которыми он связан («ты посылаешь слишком интенсивный сигнал возбуждения» или «ты посылаешь недостаточно интенсивный сигнал возбуждения» с количественным указанием отклонения). Этот сигнал может служить в качестве суррогата обучающего сигнала, который может использоваться для настройки вводов скрытых узлов. Связи, идущие от узлов уровня ввода к каждому из скрытых узлов, можно немного уменьшить или увеличить, чтобы сократить тенденцию скрытого узла к отклонению вверх или вниз с учетом текущего паттерна ввода. Данный метод, известный как метод обратного распространения ошибки обучения, может быть применен повторно к любому количеству уровней сети.
Мы пришли к тому, что многие психологи считают вершиной мастерства разработчика нейронных сетей. В некотором смысле мы сделали полный круг, потому что сеть, включающая скрытый уровень, напоминает ту самую условную карту логических вентилей, которую Мак-Каллок и Питтс предложили как модель нейронно-логического компьютера. На концептуальном уровне сеть со скрытыми узлами – это способ составить из совокупности суждений, которые могут быть истинными или ложными, сложную логическую функцию, скрепляемую связями «и», «или», «не» – но только с двумя отличительными особенностями