Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Теперь пояснения, почему именно так





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

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

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

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

Кстати, вы, может, задумывались, при изучении нейронных сетей, насчёт того, чтобы заставить их работать не только на основе входных данных, но ещё и обучить переваривать внутреннее состояние и выполнять сложные программы? Мне вот было интересно. Правда, тогда давно, я так и не придумал ничего путного, как такую сеть обучать. Зато теперь есть ответ с немного другой стороны.

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

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

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

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

Генетический алгоритм случайно генерирует набор правил (нейронных сетей), и набор программ. Все правила располагаются в общем хранилище. Каждая из этих программ состоит из своего, конкретного набора правил, взятых из общего хранилища. Сами правила в хранилище, программа только ссылается на них. Для оценки эффективности все программы запускаются параллельно (каждая имеет своё состояние и набор входов-выходов). Лучшую оценку получают те программы, которые сработают быстрее и эффективнее. Штрафуются те программы, которые долго думают, или совсем не выносят решения.

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

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

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

Каким эволюционным изменениям можно подвергать правила (нейронные сети). Как уже говорилось, одно из таких изменений, это изменение количества ячеек внутреннего состояния, которое затрагивает все правила. Потребность в увеличении или уменьшении количества ячеек состояния можно более-менее оценить по динамике работы программы, по тому, насколько часто состояния изменяются, насколько они коррелируют друг с другом, насколько воздействуют на выходные значения, и насколько в целом эффективна популяция программ. Следующие эволюционные изменения, это клонирование правил, случайное изменение правил (а именно, "встряхивание весов" нейронной сети, как при отжиге, чем ниже эффективность, тем сильнее встряхивание). Клонирование совместно с последующим изменением правил может цеплять за собой и клонирование программ. Например, в исходной программе остаётся ссылка на исходное правило, в клонированной программе - ссылка на клонированное правило. Или в исходной программе появляется ссылка дополнительно и на клон правила. Правила могут скрещиваться, когда от двух нейронных сетей берутся по куску и склеиваются в третью сеть. В правилах (нейронных сетях) может случайно меняться количество выходов, как описано выше, может меняться количество и структура внутренних связей.

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

Но самое интересно, похоже, что для каждого правила можно рассчитать не только эффективность, но и ошибку! А именно, понять, как это правило должно было бы действовать правильно при заданных входных условиях. Ведь у нас есть примеры срабатывания правил (нейронных сетей) в хороших программах (считаем, что это были правильные решения составляющих программу правил) и примеры работы в плохих программах (считаем, что это были неправильные решения составляющих программу правил). Соответственно можно попытаться усилить хорошие решения, которые выдавала каждая нейронная сеть, и минимизировать плохие решения. Значения входов и выходов можно без проблем воспроизвести, и на их основе построить обучающую выборку, которую отдать в алгоритм обратного распространения ошибки. Главная здесь проблема - это развернуть временную последовательность того, что было на входах и выходах в обучающую выборку, вот здесь и могут быть неоднозначности. Ведь мы не можем считать, что все решения (пары вход-выход) в правильной сети были идеально правильными, а в неправильной - идеально неправильными. Может это вина совсем другого правила, которое на самом финише "затёрло" правильное решение? Ввязываться в разворачивание всей последовательности решений - безнадёжная затея. Поэтому придётся подумать над формированием выборки на основе этих временных последовательностей. И даже если при формировании обучающей выборки мы выкинем многие примеры, оставив только самые однозначные, всё равно это будет прогресс.

Посмотрим теперь, что мы имеем. А имеем мы теперь средство для автоматического написания программ, которые могут ориентироваться в задачах реального мира, гибко действовать в широком диапазоне ситуаций, восстанавливаться после ошибок, иметь кое-какую внутреннюю логику и прогнозирование/моделирование ситуации. Чего они не могут, так это развивать тонкие логические цепочки, делать длинные умозаключения. Хотя для многих задач, такой интеллект сможет делать вид, что у него происходили глубокие логические процессы, хотя на самом деле он лишь применял заготовки, полученные в ходе обучения. Не хватает такому интеллекту и самостоятельности, многое в нём ещё надо делать человеку. Да и в аппаратной части то, что мы получили, не совсем похоже на то, что придумала природа.

Date: 2015-09-05; view: 370; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию