Министерство образования и науки российской федерации федеральное агентство по образованию санктпетербургский государственный университет
Скачать 1.41 Mb.
|
Важное замечание. Числа нужно вводить с десятичной точкой, а не запятой. Несмотря на достигнутую высокую точность, мы легко можем выявить очевидный недостаток нейронных сетей: они не понимают, что такое синус, а просто запоминают, как нужно отвечать. Если мы введем аргумент 6, то получим результат -1 вместо ожидаемого -0,27942. Нейронная сеть правильно выдает результат только в том диапазоне существования входных данных, на котором она была обучена. Вне этого диапазона результаты непредсказуемы. Рассмотрим теперь, как применить программу NGO для прогнозирования значений временных рядов. Пусть та же самая функция синуса представлена не векторами (X, sin(X)), а последовательностью значений Sin(X), и мы хотим прогнозировать значения этого временного ряда на основе наблюдаемых предыдущих значений. Для этого создадим следующий набор данных: 107 X SinX-5 SinX-4 SinX-3 SinX-2 SinX-1 SinX 0 -0,050 -0,040 -0,030 -0,020 -0,010 0,000 0,01 -0,040 -0,030 -0,020 -0,010 0,000 0,010 0,02 -0,030 -0,020 -0,010 0,000 0,010 0,020 0,03 -0,020 -0,010 0,000 0,010 0,020 0,030 0,04 -0,010 0,000 0,010 0,020 0,030 0,040 0,05 0,000 0,010 0,020 0,030 0,040 0,050 0,06 0,010 0,020 0,030 0,040 0,050 0,060 0,07 0,020 0,030 0,040 0,050 0,060 0,070 Здесь первый столбец приведен для справки, в обучении он использоваться не будет. Загрузим данный файл в программу NGO: Переменную Х помечаем как Ignore, все остальные, кроме последней, как входные. Теперь нужно указать программе, как оперировать с этими данными. 108 Очевидно, что брать каждый второй вектор, как тестовый, нецелесообразно, так как нам важно сохранить хронологию. Использовать последние записи, как тестовые, также не годится. Здесь целесообразно использовать скольжение вдоль временного ряда: скажем, берем первые 7 строк для обучения, следующие 3 – для тестирования. После этого сдвигаемся на одну позицию вниз: 7 строк, начиная со второй – для обучения, следующие 3 – для тестирования. Сдвигаемся еще на одну позицию вниз и т.д. 109 Нажимаем кнопку “Put into Effect”, затем – “Close”. После этого устанавливаем остальные параметры, как в предыдущем примере, и запускаем обучение. После того, как точность модели нас станет удовлетворять, останавливаем процесс обучения и запускаем Predictor (View / Best Networks / Make Predictions…). В выбранной нами сети всего две входных переменных, которые нам надо ввести: SinX-5 и SinX-2, т.е. значения временного ряда, отстоящие от прогнозируемого значения на 5 и на 2 позиции. Введем соответствующие значения из какой-либо строки таблицы и получим результат. Если нужно делать прогнозы на основе данных, которые доступны путем экспорта из других источников, то необходимо формировать файл такой же структуры, как и набор данных для обучения / тестирования, и использовать опцию “Make predictions from a file of data”. Когда сеть обучена, то в дальнейшем вызывать программу прогнозирования из обучающей программы нет необходимости. Напрямую прогнозирование запускается с помощью файла PRE32150.EXE. Обученная сеть должна быть сохранена в обучающей программе пунктом меню “File / Save Network”. 110 Приложение 3. Программа Semantic. Руководство пользователя 1 Назначение и условия применения программы Программа предназначена для представления и визуализации знаний в виде семантических сетей, а также для доступа к базам знаний с помощью графического интерфейса и языка запросов. Программа может использоваться в режиме обучающей системы, в котором база знаний содержит в неявном виде некоторую гипотезу, например, диагноз, а пользователь, задавая вопросы, должен выявить данную гипотезу, затратив на это минимум вопросов. Кроме того, программа может работать в режиме экспертной системы, сопоставляя имеющиеся факты с правилами в базе знаний. Для выполнения программы требуется персональный компьютер под операционной системой Windows XP. Особых требований к ресурсам не предъявляется. Для хранения программы необходимо не менее 16Мб на жестком диске. Программа разработана для обучения студентов основам построения семантических сетей в рамках дисциплины «Искусственный интеллект». Программа написана на языке VISUAL PROLOG V 7.2 Personal Edition (www.pdc.dk). Данная программа предназначена исключительно для образовательных целей. Использование данной программы в коммерческих целях не допускается. 2 Характеристики программы Программа обеспечивает создание и использование семантических сетей, как один из способов представления знаний. В настоящей версии программы поддерживаются сети с бинарными отношениями, т.е. связывающие ровно два понятия, одно из которых является субъектом, второе – объектом. Триплет субъект-предикат-объект образует факт. Одно и то же понятие может присутствовать в нескольких фактах, что и обуславливает сетевую структуру. Программа допускает также создание семантических сетей на основе графов Растье (графов с глаголом в центре), а также комбинация обычных реляционных графов с графами Растье. Граф Растье содержит сведения не об отношениях между субъектами и объектами, а о процессах (действиях). Ниже приведен часто используемый пример описания с помощью графа Растье следующего события: Собака свирепо покусала почтальона. Сеть построена вокруг глагола КУСАТЬ. Агентом (субъектом) кусания является собака, объектом – почтальон. СВИРЕПО – манера кусания. 111 Преимущества графа Растье заключается в возможности установления свойств, относящихся не к объекту или субъекту, а к процессу. СВИРЕПО – это не свойство собаки, а свойство процесса кусания почтальона. Программа позволяет создавать семантические сети на разных языках, в том числе многоязычные сети. Текстовый интерфейс пользователя позволяет извлекать факты из базы знаний на упрощенном естественном языке. Поддерживается модульная структура представления знаний, т.е. размещение разных предметных областей в разных файлах. Визуализация знаний обеспечивается с помощью графического представления семантической сети. Графический пользовательский интерфейс позволяет развертывать граф в глубину и в ширину, а также откатываться назад, менять тему диалога, т.е. управлять контекстом. Под контекстом здесь и далее понимается набор фактов, уже извлеченных из базы знаний. Для упрощения отладки создаваемых семантических сетей все действия программы протоколируются с помощью сообщений в окне “Messages”. 3 Входные данные Базы знаний семантических сетей хранятся в текстовых файлах и содержат знания в синтаксисе языка Prolog, поскольку загружаются в программу как база фактов предикатом consult. Одна база знаний соответствует одной предметной области. На имена файлов не накладываются ограничения. Редактировать файла баз данных можно с помощью любого текстового редактора. Однако, если использовать редактор в составе компилятора Prolog, то это позволит обнаруживать ошибки, используя возможности среды отладки Prolog. Тогда для редактора в составе SWI-Prolog файлы целесообразно снабжать расширением “.pl”, а для Visual Prolog – “.pro”. Каждый файл базы знаний, описывающий предметную область, может содержать ссылки на файлы онтологий, в которых хранятся словари терминов и правила, с помощью которых из фактов могут извлекаться новые факты. Кроме того, файл базы знаний может содержать ссылки на другие файлы баз знаний, т.е. другие предметные области. В данной редакции в целях упрощения написания путей все файлы, используемые программой, должны храниться в одном и том же каталоге. В пределах одной предметной области должна соблюдаться уникальность именования понятий. С увеличением числа фактов эта проблема может 112 привести к усложнению добавления новых фактов, поскольку нужно соблюдать уникальность имен, и ухудшению читаемости знаний. Если база знаний становится слишком громоздкой, целесообразно разбить файл на несколько баз знаний, которые размещаются в отдельных файлах. Каждый файл соответствует отдельной теме диалога. Данный прием позволяет переключаться с одной темы диалога на другую аналогично тому, как это делается в реальном разговоре. Такое переключение будем называть сменой контекста. 3.1. Файл базы знаний Файл базы знаний имеет произвольное имя. В этом файле могут размещаться следующие записи: Имя Назначение Формат Пример t Наименование основной темы t(<субъект>). t(″Jack″). pic Имя стартового рисунка в формате BMP. Необязательны й. pic(<имя файла>). pic(″mailman.bmp″). onto Имя файла онтологии. onto(<имя файла>). onto(″common_eng.pro″). e Описание внешней ссылки e(<субъект>,<имя файла>). e(″engine″, ″engine.txt″). f Описание факта f(<субъект>, <предикат>, <объект>). f(″заяц″, ″есть″, ″млекопитающее″). hypo Описание гипотезы hypo(<субъект>). hypo(″anaemia″). Ниже приведены пояснения к данным описаниям. Все записи в файлах баз знаний подчиняются синтаксису предикатов языка Prolog. Каждое выражение начинается имени, начинающегося со строчной латинской буквы. В скобках через запятую размещаются аргументы. Выражение заканчивается точкой. Предикат описания факта f – основной элемент базы знаний. Все элементы триплета должны заключаться в кавычки (знак ″, но не ” или “). Не допускается использовать в них пробелы и символы-разделители, если предполагается их 113 использовать в запросах, поскольку парсинг запроса осуществляется как разбор текста на слова. Пробелы между символами-разделителями допускаются: f(″заяц″ , ″один_из″ , ″млекопитающее″ ). 3.2. Файл онтологий В файле онтологий могут также располагаться записи следующих типов. Имя Назначение Формат Пример c Описание класса с(<слово>). c ( "person" ) c("everybody"). c("thing"). o Факт. То, же, что и f(…) в файле базы знаний. o([<субъект>, <предикат>, <объект>]). d(["everybody","a_kind_of", "thing"]). d Описание объектов и субъектов (dictionary) d([<слово>, <слово>,…, <слово>]). d(["car","автомобиль", "voiture"]). p Описание предикатов (predicates) p([<слово>, <слово>,…, <слово >]). p(["ERG","КТО","Агент"]). pr Описание свойств (properties) p([<слово>, <слово>,…, <слово >]). p(["has_name"]). p(["мужской”, “male"]). g Предпочтительна я ориентация связи для лучшей читаемости графа g(<направление>, [<слово>,<слово> ,…, <слово >]). g(down,["is_parent", ”is_grandparent", "is_uncle", "is_father"]). g(side,["is_cousin", "is_sibling"]). g(up, ["is_a", "is_child"]). r Предикат описания правила r(<причина>),<сл едствие>), r([t("?x", "брат", "?y")], [ t("?x", "родственник", "?y")] ). Описание класса с необходимо для того, чтобы отличить класс от экземпляра. Запись типа o используется точно так же, как и запись f в файле базы знаний. Необходимость присвоения другого имени обусловлено ограничениями языка Пролог. Поскольку файл онтологий предназначен для хранения знаний на уровне классов, а не экземпляров, запись типа o описывает отношения между классами с свойства классов. 114 Если в составе семантической сети используются синонимы терминов, то их необходимо описать в записях типов d и p. Запись типа d описывает синонимы объектов и субъектов (dictionary), а запись типа p – синонимы предикатов (predicate). Записи типа pr необходимо создавать даже при отсутствии синонимов, поскольку граф для свойств строится иначе, чем для отношений. Если не указать свойство в записи pr, то одинаковые свойства всех объектов будут сводиться в одну вершину, например, так, как показано ниже. На левом рисунке свойства сводятся в одну вершину, на правом – нет. Кроме того, идентификация свойств полезна для фильтрации графа, если граф становится слишком плотным, целесообразно исключить отображение на нем свойств, оставив только отношения. Запись типа pr может включать как наименование свойства, так и значение, например, “has_sex” или “male” и “female”. Все синонимы одного термина должны размещаться в одном списке. Использование словарей позволяет сравнительно просто сделать семантическую сеть независимой от языка. При этом первый элемент каждого списка будет всегда использоваться для отображения на графе. Внимание: 1. Если в онтологии присутствует запись о синонимах типа d или p, программа везде будет отображать первый элемент списка в качестве идентификатора понятия. Это свойство программы можно использовать для создания многоязычных знаний. Достаточно создать онтологию с записями вида p([“один_из”,”ISA”]), и отображаться будут только русскоязычные термы. 2. В данной версии программы допускается только один список синонимов для каждого понятия. Если в разных онтологиях, подключаемых к базе знаний, будет присутствовать запись типа d или p для данного понятия, программа использует только один из них. Например, в одном файле онтологии указано p(["ISA", “is_a”]), а в другом – p([“один_из”,”ISA”]), то программа будет использовать только один из списков в зависимости от порядка следования записей onto d файле базы знаний. 115 3.3. Правила в базе знаний Правила позволяют устанавливать закономерности, на основе которых можно получать новые знания. В правилах используются переменные, которым в процессе унификации с фактами присваиваются значения. В связи с тем, что внешние файлы Пролога не допускают использование переменных, здесь принято специальное их именование. Переменные должны быть представлены текстовыми константами, начинающимися с вопросительного знака, например, ″?x″, ″?class″. Правило состоит из двух списков триплетов. Второй список содержит новые знания, которые становятся истинными, если действительны факты из первого списка. Пример: r([ t(″?x″, ″родитель″ , ″?y″), t(″?y″, ″родитель″ , ″?z″), t(″?z″, ″пол″ , ″мужской″)], t(″?z″, ″внук″ , ″?x″)] ). Данная запись эквивалентна правилу на Прологе grandchild( X, Y ) :- parent( Y, Z ), parent( Z, X ), sex( X, male ). Несмотря на то, что программа Semantic написана на Прологе, использовать такое правило напрямую невозможно, поскольку записать его можно только в текст программы, а не во внешнюю базу знаний. Во внешней базе Пролога допускается хранение только фактов. В случаях, когда требуется установить идентичность / различие двух объектов, в правиле должен использоваться специальный предикат “differs”. Приведенный ниже пример показывает правило для отношений брат или сестра: r( [t("?x","is_parent","?y"),t("?x","is_parent","?z"),t("?y","differs","?z")], [t("?y","is_sibling","?z")] ). Если в правиле требуется отрицание, то используется конструкция n(<субъект>,<предикат>,<объект>). Эта конструкция аналогична отрицанию отношения t(<субъект>,<предикат>,<объект>). Ниже показан пример правила, описывающего отношение отчим/мачеха – > пасынок/падчерица. r( [t("?x","is_parent","?y"),t("?x","is_spouse","?z"), n("?z", "is_parent", "?y")], [t("?z","is_step-parent","?y")] ). Большее количество примеров правил содержится в папке Examples. 3.4. Правила наследования В программе реализованы правила наследования отношений, которые автоматически применяются при каждом обращении к базе знаний после того, как все факты исчерпаны. Применяются следующие правила наследования: 116 Если X AKO Y и Y AKO Z то X AKO Z Если X ISA Y и Y AKO Z то X ISA Z Если X has_part Y и Y has_part Z то X has_part Z Если X ISA Y и Y has_part Z то X has_part Z Если X AKO Y и Y has_part Z то X has_part Z Если X ISA Y и Y has_a Z то X has_a Z Если X AKO Y и Y has_a Z то X has_a Z Для того, чтобы указанные правила применялись, отношения ISA, AKO и т.д. должны указываться в триплетах фактов именно так, как здесь, либо следует создавать синонимы с помощью записей типа p([“is_a”, “ISA”]). p([“a_kind_of”, “AKO”]). 3.5. Принципы идентификации объектов Используемые в фактах обозначения объектов являются их локальными идентификаторами, которые действуют только в пределах одного файла баз знаний. Например, факт f(“Sergey”,”is_parent”,”Nikita”) вовсе не обязательно относится с семейству Михалковых, даже если рядом присутствуют факты f(“Sergey”,”is_parent”,”Andrey”), f(“Andrey”,”is_parent”,”Egor”), которые у всех на слуху. Полностью идентифицируют объект такие его свойства как “has_name”, “has_surname”, “has_birth_date” и т.п., включая номер паспорта. Однако, такая строгая идентификация сильно загромоздит запросы, да и не требуется в учебных целях. Мы будем считать, что идентификация предметной области содержится в комментариях в самом тексте файла, которые доступны пользователю. Программа требует уникальной идентификации вершин графа, и, следовательно, уникальных идентификаторов объектов в пределах одного файла. В графах Растье соблюсти уникальность сложно, поскольку в центре ставиться глагол (процесс), разнообразие которых существенно меньше, чем объектов. Здесь допускается присвоение уникального идентификатора перед именем процесса. Например, в одном графе используются два глагола «жить», относящиеся к разным объектам. В этом случае вместо «жить1» и «жить2» можно записать «1:жить» и «2:жить». Префиксы перед двоеточием на графе отображаться не будут. Кроме того, в результате применения правил могут появляться объекты с одинаковыми названиями. Пусть в базе онтологий есть факт “person has_part hand” (у человека есть рука). После применения правил наследования к нескольким экземплярам могут появиться одинаковые идентификаторы: “Ivan has_part arm”, “Stepan has_part arm” и т.д. На графе, да и не только это может воспринято как факт, что все эти люди имеют одну и туже составную часть (сиамские близнецы). Для устранения неоднозначностей программа автоматически подставляет к наименованию объекта префикс – имя субъекта: “Ivan has_part Ivan:arm”, “Stepan has_part Stepan:arm”. Такая |