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