Книга: Учебное пособие по курсу «Нейроинформатика»

Язык описания учителя

Язык описания учителя

В отличие от таких компонентов как оценка, сеть и интерпретатор ответа, учитель не является составным объектом. Однако учитель может состоять из множества функций, вызывающих друг друга. Собственно учитель — это процедура, управляющая обучением сети. Ключевые слова, специфические для языка описания учителя приведены в табл. 37.

Библиотеки функций учителя

Библиотеки функций учителя содержат описание функций, необходимых для работы одного или нескольких учителей. Использование библиотек позволяет избежать дублирования функций в различных учителях. Описание библиотеки функций аналогично описанию учителя, но не содержит главной процедуры.

Таблица 37. Ключевые слова специфические для языка описания учителя

Идентификатор Краткое описание
Main Начало главной процедуры
Instructor Заголовок описания учителя
InstrLib Заголовок описания библиотеки функций
Used Подключение библиотек функций
Init Начало блока инициации
InstrStep Начало блока одного шага обучения
Close Начало блока завершения обучения

БНФ языка описания учителя

Обозначения, принятые в данном расширении БНФ и описание ряда конструкций приведены в разделе «Описание языка описания компонентов».

<Описание библиотеки>::= <Заголовок библиотеки> <Описание глобальных переменных> <Описание функций> <Конец описания библиотеки>
<Заголовок библиотеки>::= InstrLib <Имя библиотеки> [Used <Список имен библиотек>]
<Имя библиотеки>::= <Идентификатор>
<Список имен библиотек>::= <Имя используемой библиотеки> [,<Список имен библиотек>]
<Имя используемой библиотеки>::= <Идентификатор>
<Конец описания библиотеки>::= EndInstrLib
<Описание учителя>::= <Заголовок учителя> <Описание глобальных переменных> <Описание функций> <Главная процедура> <Конец описания учителя>
<Заголовок учителя>::= Instructor <Имя библиотеки> [Used <Список имен библиотек>]
<Главная процедура>::= Main<Описание статических переменных> <Описание переменных> <Блок инициации> <Блок шага обучения> <Блок завершения>
<Блок инициации>::= Init <Тело функции>
<Блок шага обучения>::= InstrStep <Выражение типа Logic> <Тело функции>
<Блок завершения>::= Close<Тело функции>
<Конец описания учителя> End Instructor

Описание языка описания учителя

Язык описания учителя является наиболее простым из всех языков описания компонент. Фактически все синтаксические конструкции этого языка описаны в разделе «Общий стандарт». В теле функции, являющемся частью главной процедуры недопустим оператор возврата значения, поскольку главная процедура не является функцией. Три раздела главной функции — блок инициации, блок одного шага обучения и блок завершения являются фрагментами одной процедуры. Выделение этих разделов необходимо для выполнения запроса «Выполнить N шагов обучения». Выполнение главной процедуры происходит следующим образом. Выполняется блок инициации. Выполнение блока одного шага обучения сети производится до тех пор, пока не наступит одно из следующих событий:

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

2. нарушится условие, указанное в конструкции InstStep;

3. компонент учитель получит запрос «Прервать обучение сети»;

4. в случае выполнения запроса «Выполнить N шагов обучения» блок одного шага обучения сети выполнен N раз.

Далее выполняется блок завершения обучения.

Пример описания учителя

В данном разделе приведены описания некоторых методов обучения, описанных в разделе «Описание алгоритмов обучения».

Пример 1.

Instructor RandomFire;  {Метод случайной стрельбы с уменьшением радиуса}
Main                                         {Обучение ведется по всему обучающему множеству}
 Label Exit, Exit1;
 Static
  Integer Try Name "Число попыток при одном радиусе" Default 5;
  Real MinRadius Name "Минимальный радиус, при котором + "продолжается работа"Default 0.001;
  String NetName Name "Имя сети" Default "";
  Integer What Name "Что обучать" Default Parameters;
  Color InstColor Name "Цвет примеров обучающего множества" Default HFFFF; {По умолчанию}
  Integer OperColor Name "Операция для отбора цветов" Default CIn;
 Var {все примеры, в цвете которых есть хоть один единичный бит}
  PRealArray Map, DirectMap; {Для хранения текущего и случайного массивов параметров}
  Real Est1, Est2; {Для хранения текущей и случайной оценки}
  Real Radius; {Текущий радиус}
  Integer TryNum, RadiusNum; {Число попыток, номер использованного радиуса}
  Integer Handle; {Номер сеанса задачника}
  String QName; {Имя запроса}
Init
 Begin
  If Not SetInstructionObject(What, @NetName) Then GoTo Exit; {Задаем объекты обучения}
  QName = "InitSession"; {Задаем имя запроса}
  Map = NewArray(mRealArray, 3); {Создаем массив для аргументов запроса}
  If Map = Null Then GoTo Exit;
  TPointer(Map^[1]) = @InstColor; {Заносим адрес первого аргумента}
  TPointer(Map^[2]) = @OperColor; {Заносим адрес второго аргумента}
  TPointer(Map^[3]) = @Handle; {Заносим адрес третьего аргумента}
  If Not GenerateQuest(@QName, Map) Then GoTo Exit;{Открываем сеанс работы с задачником}
  If Not FreeArray(mRealArray, Map) Then GoTo Exit;  {Освобождаем массив для аргументов}
  {Собственно начало обучения}
  Map = CreateArray; {Создаем вспомогательные массивы}
  DirectMap= CreateArray;
  If Map = Null Then GoTo Exit;
  If DirectMap= Null Then GoTo Exit;
  Est1 = Estimate(Handle, True);
  If Error <> 0 Then GoTo Exit;
  RadiusNum = 1; {Обрабатываем первый радиус}
  Radius = 1 / RadiusNum; {Вычисляем первый радиус}
  If Not SaveArray(Map) Then GoTo Exit; {Сохраняем начальный массив параметров}
 End
InstrStep Radius > MinRadius {Обработка с одним радиусом – один шаг обучения}
 Begin 
  TryNum = 0;
  While TryNum < Try Do Begin
   If Not SetArray(Map) Then GoTo Exit; {Устанавливаем лучший массив параметров}
   If Not RandomArray(DirectMap) Then GoTo Exit; {Генерируется новый массив параметров}
   If Not Modify(DirectMap, 1, Radius) Then GoTo Exit; {Модифицируем массив параметров}
   Est2 = Estimate(Handle, True);
   If Error <> 0 Then GoTo Exit;
   If Est1>Est2 Then Begin
    If Not SaveArray(Map) Then GoTo Exit; {Сохраняем лучший массив параметров}
    Est1 = Est2;
    TryNum = 0;
   End Else TryNum = TryNum + 1; {Увеличиваем счетчик отказов}
  End
  RadiusNum = RadiusNum + 1; {Обрабатываем следующий радиус}
  Radius = 1 / RadiusNum; {Вычисляем следующий радиус}
 End
Close
 Begin
Exit:
  If Not SetArray(Map) Then; {Восстанавливаем лучший массив параметров}
  If Not EraseArray(Мар1) Then; {Освобождаем вспомогательные массивы}
  If Not EraseArray(Мар2) Then;
  QName = "CloseSession"; {Задаем имя запроса}
  Map = NewArray(mRealArray, 1); {Создаем массив для аргументов запроса}
  If Map = Null Then GoTo Exit1;
  TPointer(Map^[1]) = @Handle; {Заносим адрес единственного аргумента}
  If Not GenerateQuest(@QName, Map) Then;{Открываем сеанс работы с задачником}
  If Not FreeArray(mRealArray, Map) Then; {Освобождаем массив для аргументов}
Exit1:
 End
End Instructor

Пример 2. Библиотека функций

InstrLib Library1; {Библиотека содержит функции для следующего учителя}
{Метод наискорейшего спуска}
 Function SDM( Handle : Integer; Step : Real) : Real;
 Label Exit, Endd;
 Var
  Real Est;
 Begin
  Est = CalcGradient(Handle, True);
  If Error <> 0 Then GoTo Exit;
  Est =Optimize(Null, Step); {Вызываем функцию подбора оптимального шага}
  If Error <> 0Then GoTo Exit;
  SDM = Est;
  GoTo Endd;
Exit:
  SDM = 0;
Endd:
 End
{Метод случайного поиска}
 Function RDM( Handle : Integer; Step : Real) : Real;
 Label Exit, Endd;
 Var
  Real Est;
  PRealArray : Direction;
 Begin
  Direction = CreateArray; {Создаем вспомогательный массив}
  If Direction = Null Then GoTo Exit;
  If Not RandomArray(Direction) Then GoTo Exit; {Генерируется новый массив параметров}
  If Error <> 0 Then GoTo Exit;
  Est =Optimize(Direction, Step); {Вызываем функцию подбора оптимального шага}
  If Error <> 0 Then GoTo Exit;
  RDM = Est;
  GoTo Endd;
Exit:
  RDM = 0;
Endd:
 End
End InstrLib

Пример 3. Антиовражная процедура обучения.

Instructor kParTan Used Library1; {Антиовражная процедура обучения kParTan}
Main {Обучение ведется по всему обучающему множеству}
 Label Exit, Exit1;
 Static
  Color InstColor Name "Цвет примеров обучающего множества"
  Default HFFFF; {По умолчанию}
  Integer OperColor Name "Операция для отбора цветов" Default CIn;
  {все примеры, в цвете которых есть хоть один единичный бит }
  String NetName Name "Имя сети" Default "";
  Integer What Name "Что обучать" Default Parameters;
  {По умолчанию 2ParTan}
  Integer k Name "Число шагов между ParTan шагами" Default 2;  
  Real AccuracyName "Требуемый минимум оценки"Default 0.00001;
  Logic Direction Name "Случайное направление или антиградиент"
  11 Default True; {Если истина,то антиградиент }
 Var
  Integer Handle; {Номер сеанса задачника}
  String QName; {Имя запроса}
  PRealArray Map1, DirectMap; {Для текущего массива параметров и ParTan направления}
  Real Step, ParTanStep; {Длины шагов для оптимизации шага}
  Real Est1, Est2; {Для хранения текущей и случайной оценки}
  Long I;
Init
 Begin
  If Not SetInstructionObject(What, @NetName) Then GoTo Exit; {Задаем объекты обучения}
  QName = "InitSession"; {Задаем имя запроса}
  Map1 = NewArray(mRealArray, 3);{Создаем массив для аргументов запроса}
  If Map = Null Then GoTo Exit;
  TPointer(Map^[1]) = @InstColor; {Заносим адрес первого аргумента}
  TPointer(Map^[2]) = @OperColor; {Заносим адрес второго аргумента}
  TPointer(Map^[3]) = @Handle; {Заносим адрес третьего аргумента}
  If Not GenerateQuMap(@QName, Map) Then GoTo Exit;{Открываем сеанс работы с задачником}
  If Not FreeArray(mRealArray, Map) Then GoTo Exit;{Освобождаем массив для аргументов}
  {Собственно начало обучения}
  Map = CreateArray; {Создаем вспомогательные массивы}
  DirectMap= CreateArray;
  If Map = Null Then GoTo Exit;
  If DirectMap = Null Then GoTo Exit;
  Est1 = Accuracy*10; {Задаем оценку, не удовлетворяющую требованию точности}
  Step = 0.005; {Задаем начальное значение шагу}
 End
InstrStep Est > Accuracy
 Begin
  If Not SaveArray(Map1) Then GoTo Exit; {Сохраняем начальный массив параметров}
  For I = 1 To k Do Begin {Выполняем k межпартанных шагов}
   If Direct Then Est = SDM(Handle, Step) Else Est = RDM(Handle, Step);
   If Error <> 0 Then GoTo Exit;
  End;
  If Not SaveArray(DirectMap) Then GoTo Exit; {Сохраняем конечный массив параметров}
  For I = 1 To TLong(Map^[0]) Do
   DirectMap^[I] = DirectMap^[I] - Map^[I]; {Вычисляем направление ParTan шага}
  ParTanStep = 1; {Задаем начальное значение ParTan шагу}
  Est =Optimize(DirectMap, ParTanStep); {Вызываем функцию подбора оптимального шага}
  If Error <> 0 Then GoTo Exit;
 End
Close
 Begin
Exit:
  If Not EraseArray(Мар) Then; {Освобождаем вспомогательные массивы}
  If Not EraseArray(DirectMap) Then;
  QName = "CloseSession"; {Задаем имя запроса}
  Map = NewArray(mRealArray, 1); {Создаем массив для аргументов запроса}
  If Map = Null Then GoTo Exit1;
  TPointer(Map^[1]) = @Handle; {Заносим адрес единственного аргумента}
  If Not GenerateQuest(@QName, Map) Then;{Открываем сеанс работы с задачником}
  If Not FreeArray(mRealArray, Map) Then; {Освобождаем массив для аргументов}
Exit1:
 End
End Instructor

Оглавление книги


Генерация: 1.618. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз