Таблица 2. Список макрокоманд, используемых для описания учителя
Название |
Аргументы (типы) |
Выполняемые действия |
Модификация_вектора |
Указатель_на_вектор Старый_Шаг Новый_Шаг |
Генерирует запрос на модификацию вектора (см. раздел «Провести обучение (Modify)»). |
Вычислить_градиент |
|
Вычисляет градиент функции оценки. |
Установить_параметры |
Указатель_на_вектор |
Скопировать вектор, указанный в аргументе, в текущий вектор. |
Создать_вектор |
Указатель_на_вектор |
Создает экземпляр вектора с неопределенными значениями. Адрес вектора помещается в аргумент. |
Освободить_вектор |
Указатель_на_вектор |
Освобождает память занятую вектором, расположенным по адресу Указатель_на_вектор. |
Случайный_вектор |
Указатель_на_вектор |
В векторе, на который указывает Указатель_на_вектор, генерируется вектор, каждая из координат которого является случайной величиной, равномерно распределенной на интервале между значениями соответствующих координат векторов Вектор_минимумов и Вектор_максимумов. |
Оптимизация_шага |
Указатель_на_вектор Начальный_Шаг |
Производит подбор оптимального шага (см. рис. 3). |
Сохранить_вектор |
Указатель_на_вектор |
Скопировать текущий вектор в вектор, указанный в аргументе. |
Вычислить_оценку |
Оценка |
Вычисляет оценку текущего вектора. Вычисленную величину складывает в аргумент Оценка. |
Неградиентные методы обучения
Среди неградиентных методов рассмотрим следующие методы, каждый из которых является представителем целого семейства методов оптимизации:
1. Метод случайной стрельбы (представитель семейства методов Монте-Карло).
2. Метод покоординатного спуска (псевдоградиентный метод).
3. Метод случайного поиска (псевдоградиентный метод).
4. Метод Нелдера-Мида.
Метод случайной стрельбы
1. Создать_вектор В1
2. Создать_вектор В2
3. Вычислить_оценку О1
4. Сохранить_вктор В1
5. Установить_параметры В1
6. Случайный_вектор В2
7. Модификация_вектора В2, 0, 1
8. Вычислить_оценку О2
9. Если О2<���О1 то переход к шагу 11
10. Переход к шагу 5
11. О1=О2
12. Переход к шагу 4
13. Установить_параметры В1
14. Освободить_вектор В1
15. Освободить_вектор В2
Рис. 1. Простейший алгоритм метода случайной стрельбы
Идея метода случайной стрельбы состоит в генерации большой последовательности случайных точек и вычисления оценки в каждой из них. При достаточной длине последовательности минимум будет найден. Запись этой процедуры на макроязыке приведена на рис. 1
Остановка данной процедуры производится по команде пользователя или при выполнении условия, что О1 стало меньше некоторой заданной величины. Существует огромное разнообразие модификаций этого метода. Наиболее простой является метод случайной стрельбы с уменьшением радиуса. Пример процедуры, реализующей этот метод, приведен на рис. 2. В этом методе есть два параметра, задаваемых пользователем:
Число_попыток — число неудачных пробных генераций вектора при одном радиусе.
Минимальный_радиус — минимальное значение радиуса, при котором продолжает работать алгоритм.
Идея этого метода состоит в следующем. Зададимся начальным состоянием вектора параметров. Новый вектор параметров будем искать как сумму начального и случайного, умноженного на радиус, векторов. Если после Число_попыток случайных генераций не произошло уменьшения оценки, то уменьшаем радиус. Если произошло уменьшение оценки, то полученный вектор объявляем начальным и продолжаем процедуру с тем же шагом. Важно, чтобы последовательность уменьшающихся радиусов образовывала расходящийся ряд. Примером такой последовательности может служить использованный в примере на рис. 2 ряд 1/n.
1. Создать_вектор В1
2. Создать_вектор В2
3. Вычислить_оценку O1
4. Число_Смен_Радиуса=1
5. Радиус=1/Число_Смен_Радиуса
6. Попытка=0
7. Сохранить_вектор В1
8. Установить_параметры В1
9. Случайный_вектор В2
10. Модификация_вектора В2, 1, Радиус
11. Вычислить_оценку О2
12. Попытка=Попытка+1
13. Если 02<01 то переход к шагу 16
14. Если Попытка<=Число_попыток то переход к шагу 8
Читать дальше