Приложение 7 2.2. Лабораторные работы 2.2.1. Лабораторная работа №1. Классификация образов Цель работы: Изучение основ моделирования искусственных нейронных сетей (ИНС) с помощью программного пакета SNNS на примере моделирования системы распознавания образов. Формируемые знания, умения и навыки: 1) знания и умения по работе систем распознавания образов, реализованных с использованием технологии нейронных сетей. 2) практические навыки использования системы SNNS. Для выполнения лабораторной работы необходимо знание общих сведений о работе с ПЭВМ IBM PC AT в операционной среде Windows. Желательно также перед выполнением лабораторной работы пройти «Вводный курс» и «Продвинутый курс» обучения по ИНС. Теоретическая часть. Классификация образов Задача классификации образов состоит в указании принадлежности входного образа (например, сигнала или рукописного символа), представленного вектором атрибутов, одному или нескольким предварительно определенным классам. К известным приложениям относятся распознавание букв и речи, классификация сигналов электрокардиограммы, классификация клеток крови и т.д. В настоящее время, кроме программных пакетов оптического распознавания символов (OCR – Optical Character Recognition), существуют еще множество коммерческих продуктов, использующих способности ИНС к классификации. В данной работе Вы построите сеть, которая сможет распознавать заглавные буквы латинского алфавита («A»… «Z»), нарисованные в матрице 5х7 элементов. Безусловно, эта задача несколько искусственна (для реальных систем разрешающая способность матрицы должна быть хотя бы на порядок больше), но ее решение позволит освоить основы пользовательского интерфейса инструментальной системы SNNS, а также понять основы функционирования некоторых систем распознавания образов. Набор обучающих образов для системы распознавания образов: SNNS pattern definition file V3.2 generated at Mon Apr 25 18:08:50 1994 No. of patterns : 26 No. of input units : 35 No. of output units : 26 # Input pattern 1: 0111010001 1000111111 1000110001 10001 # Output pattern 1: 1000000000 0000000000 000000 # Input pattern 2: 1111010001 1000111110 1000110001 11110 # Output pattern 2: 0100000000 0000000000 000000 # Input pattern 3: 0111010001 1000010000 1000010001 01110 # Output pattern 3: 0010000000 0000000000 000000 # Input pattern 4: 1111010001 1000110001 1000110001 11110 # Output pattern 4: 0001000000 0000000000 000000 # Input pattern 5: 1111110000 1000011110 1000010000 11111 # Output pattern 5: 0000100000 0000000000 000000 # Input pattern 6: 1111110000 1000011110 1000010000 10000 # Output pattern 6: 0000010000 0000000000 000000 # Input pattern 7: 0111010001 1000010111 1000110001 01110 # Output pattern 7: 0000001000 0000000000 000000 # Input pattern 8: 1000110001 1000111111 1000110001 10001 # Output pattern 8: 0000000100 0000000000 000000 # Input pattern 9: 0111000100 0010000100 0010000100 01110 # Output pattern 9: 0000000010 0000000000 000000 # Input pattern 10: 1111100001 0000100001 0000110001 01110 # Output pattern 10: 0000000001 0000000000 000000 # Input pattern 11: 1000110010 1010011000 1010010010 10001 # Output pattern 11: 0000000000 1000000000 000000 # Input pattern 12: 1000010000 1000010000 1000010000 11111 # Output pattern 12: 0000000000 0100000000 000000 # Input pattern 13: 1000111011 1010110001 1000110001 10001 # Output pattern 13: 0000000000 0010000000 000000 # Input pattern 14: 1000110001 1100110101 1001110001 10001 # Output pattern 14: 0000000000 0001000000 000000 # Input pattern 15: 0111010001 1000110001 1000110001 01110 0000000100 000000 # Input pattern 19: 0111010001 1000001110 0000110001 01110 # Output pattern 15: 0000000000 0000100000 000000 # Input pattern 16: 1111010001 1000111110 1000010000 10000 # Output pattern 16: 0000000000 0000010000 000000 # Input pattern 17: 0111010001 1000110001 1010110011 01111 # Output pattern 17: 0000000000 0000001000 000000 # Input pattern 18: 1111010001 1000111110 1010010010 10001 # Output pattern 18: 0000000000 # Output pattern 19: 0000000000 0000000010 000000 # Input pattern 20: 1111100100 0010000100 0010000100 00100 # Output pattern 20: 0000000000 0000000001 000000 # Input pattern 21: 1000110001 1000110001 1000110001 01110 # Output pattern 21: 0000000000 0000000000 100000 # Input pattern 22: 1000110001 1000110001 1000101010 00100 # Output pattern 22: 0000000000 0000000000 010000 # Input pattern 23: 1000110001 1000110001 1010110101 01010 # Output pattern 23: 0000000000 0000000000 001000 # Input pattern 24: 1000110001 0101000100 0101010001 10001 # Output pattern 24: 0000000000 0000000000 000100 # Input pattern 25: 1000110001 0101000100 0010000100 00100 # Output pattern 25: 0000000000 0000000000 000010 # Input pattern 26: 1111100001 0001000100 0100010000 11111 # Output pattern 26: 0000000000 0000000000 000001 Работа с программой Рис.2.31. Окна SNNS после запуска. Для запуска системы SNNS следует сначала запустить служебную программу X-Win32 (это верно только для варианта SNNS для Windows). Затем следует запустить файл «snns.bat». После запуска появятся несколько окон (рис.2.31). Окно «banner» (логотип) пропадет после щелчка мышью по нему. После этого можно начать работу с программой. Создание сети Менеджер SNNS дает доступ ко всем возможностям пакета. Ниже представлен рис.2.32, объясняющий функции основных кнопок. Работа с файлами Управление обучением и контроль Подсказка Информация о нейронах и весах Диаграмма сети Выхо д График ошибок Определение сети Рис.2.32. Панель менеджера SNNS. Считывание и запись файлов SNNS использует файлы пяти типов. Самыми важными из них являются: NET – Файлы с описанием сетей содержат информацию о топологии сети и правилах обучения. Файлы заканчиваются символами ‘.net’. PAT – файлы обучающих наборов (образцов, образов), содержащие данные для тренировки и тестирования сетей. Все файлы образов заканчиваются символами ‘.pat’. RES – файлы результатов. Выход сети может быть интерпретирован множеством различных путей в зависимости от решаемой проблемы. SNNS позволяет пользователям делать дамп выходов сети в отдельном файле для последующего анализа. Остальные два типа файлов не важны для первого ознакомления с SNNS. Для открытия файлов сетей и образов используется опция FILE на панели менеджера SNNS. Появится окно загрузки файлов (рис.2.33). Текущий каталог Список имеющихся файлов Имя файла Выбор типа файлов Линейка листания Загрузить Завершить Со хранить Рис.2.33.Файловый проводник SNNS. Верхнее текстовое поле показывает текущий каталог. Главное полесписок показывает все файлы в соответствии с выбранным типом файла, понимаемым SNNS. Каталоги заключены в квадратные скобки. Создание новой сети SNNS позволяет создавать нейронные сети многих различных типов. Здесь приведен пример создания обычной полносвязной сети прямого распространения информации. Эта сеть сможет распознавать большие буквы латинского алфавита. Выберите опцию FEEDFORWARD из меню кнопки BIGNET на панели менеджера. На экране появилась панель, показанная на рис.2.34. Необходимы только две части панели. Определить (создать) слой Определение топологии слоя Выбор типа и расположения нейронов Не обращайте внимания на эти параметры Сделать сеть полносвязной Создать сеть Рис.2.34. Панель построения сети прямого распространения информации BigNet. Верхняя часть позволяет задать топологию сети, т.е. требуемое количество нейронов на каждом уровне и способ вывода нейронов в сети на экран. Нижняя часть формы позволяет соединить нейроны и создать сеть. Примите к сведению, что многое из того, что Вы вводите, носит чисто косметический характер. Файл с обучающими последовательностями образов содержит заранее заданное число входов и выходов сети и они должны совпадать с топологией. Для симулятора неважно, как они расположены на дисплее. Сначала Вы должны определить входной уровень путем заполнения полей ввода в верхнем правом углу формы. Форма показывает текущие установки для каждой группы нейронов (в терминологии SNNS – плоскость, plane). Каждая группа имеет свой тип (входной – input, скрытый – hidden или выходной – output) и каждая плоскость содержит некоторое количество нейронов (в оригинале – unit), распределенных в координатной системе x-y-z. Это распределение используется только при изображении сети! Значения полей ввода можно менять, вводя значения в поле или нажимая на кнопки TYPE и POS для изменения типа и относительной позиции нейрона соответственно. Относительная позиция не используется для первой плоскости нейронов (не к чему привязать относительную позицию). Следующие уровни будут расположены снизу от предыдущего уровня, если поле ‘Rel. Position’ будет изменено на ‘below’ нажатием на кнопку POS. Попробуем проделать работу по созданию простой сети с матрицей ввода 5х7, десятью скрытыми и 26 выходными нейронами: Оставьте тип (‘Type’) входным (input). Установите номер по ‘x’ в 5. То же с ‘y’ – в 7. Нажмите на кнопку ENTER (кнопку формы, а не на клавиатуре). Если Вы все сделали правильно, вход будет скопирован в колонку слева. Следующий шаг – создать скрытый слой, содержащий 10 нейронов и помещенный справа от входного. Измените ‘Type’ с входного (input) на скрытый (hidden), нажимая на кнопку TYPE. Установите по ‘x’ – 1. И по ‘y’ – 10. Смените ‘Rel. Position’ на ‘right’, нажимая на кнопку POS и нажмите на кнопку ENTER. Теперь Вы готовы создать выходной слой, где мы хотим иметь 26 выходных нейронов справа от входа. Для того, чтобы нейронная сеть уместилась на экране, мы построим эти нейроны в две колонки по 13 нейронов в каждой. Смените тип со скрытого (hidden) на выходной (output), нажимая на кнопку POS. Установите по ‘x’ – 2. И по ‘y’ – 13. Нажмите на кнопку ENTER. После определения топологии слоев необходимо обозначить связи в сети. Просто щелкните по кнопке FULL CONNECTION (она находится внизу слева на нижней панели формы). Теперь выберите CREATE NET и DONE. Если перед упражнениями была загружена какая-нибудь сеть, появится сообщение о ее уничтожении. Рис.2.35. Окно просмотра сети SNNS. Если теперь нажать на кнопку DISPLAY менеджера SNNS, мы увидим только что созданную нами нейронную сеть (рис.2.35.). Обычно линии, показывающие веса, не видны, но их можно включить, выбрав SETUP и затем нажав на кнопку ON рядом с опцией ‘связи’ (‘links’). Вы заметите, что SNNS не допускает больше ввода до тех пор, пока Вы не нажмете на кнопку DONE. После создания сети и загрузки файла обучающих последовательностей (он должен соответствовать топологии сети) можно приступать к обучению сети. Сеть, которую мы только что создали, должна соответствовать файлу ‘letters.pat’, расположенному в каталоге примеров SNNS. Существует также альтернативный путь для создания сетей – через графический редактор сетей, встроенный в SNNS. Он хорошо приспособлен для внесения изменений в существующие большие сети или для создания новых небольших сетей. Для создания больших сетей используйте инструмент bignet. Редактор сетей будет описан ниже. Обучение сети Загрузите из каталога примеров SNNS файл с обучающими последовательностями ‘letter’ (предварительно нажмите на кнопку PAT). Сеть – это инструмент для ассоциации учебных примеров и она может быть обучена для отображения входных изображений (в палитре 5х7 представлены буквы) на выходные нейроны, где каждой из 26 букв латинского алфавита соответствует один выходной нейрон. Все обучение и тестирование производится через опцию CONTROL. (рис.2.36) Количество циклов обучения Начать/Остановить обучение Инициализация сети Контрольные параметры Параметры обучения Готово Случайный порядок Обучающая функция Рис.2.36. Панель управления обучением и контролем сетей SNNS. Рассмотрим наиболее важные возможности одну за одной. Форма состоит из двух частей. Верхняя часть управляет определениями параметров процесса обучения, а три нижние строки – это бланк, который должен быть заполнен для определения интенсивности обучения и т.д., а также диапазон, в котором веса будут случайно распределены при инициализации сети. По умолчанию параметры обучения установлены в (0.2 0 0 0 0), а веса по умолчанию – между 1 и –1 (1.0 –1.0 0 0 0). Инициализация Многие сети должны быть инициализированы перед тем, как их можно использовать. Для того, чтобы выполнить инициализацию, щелкните INIT (в верхней линии кнопок в форме). Можно также изменить диапазон случайных чисел, используемых при инициализации, вводя соответствующие значения в поля, расположенные справа от ‘INIT’ (нижний край формы). Выбор алгоритма обучения Для сетей с прямым распространением информации (feedforward) по умолчанию применяется алгоритм обучения Std_Backpropagation (стандартный алгоритм обратного распространения). Для выбора иных алгоритмов щелкните SEL_FUNC (рядом с параметрами распространения ошибки) и выберите функцию, которую хотите использовать. Алгоритмы, которые можно сейчас использовать: Std_Backpropagation, BackpropMomentum или Rprop. Для примера letters используйте BackpropMomentum. Каждый алгоритм обучения требует установки различных параметров. Приведем наиболее важные: Std_Backpropagation 1: - скорость обучения (коэффициент коррекции)– learning rate (0-1) 2: dmax – максимальная ошибка, которая может быть допущена. Используйте 0 или меньшее значение. BackpropMomentum 1: - скорость обучения (коэффициент коррекции) (0-1) 2: - выражение момента – momentum term (0-0.99), 3: с – уничтожение плоской области - flat spot elimination (проигнорируйте пока этот параметр) и 4: dmax – максимальная ошибка, которая может быть допущена. Используйте 0 или небольшое значение. Rprop 1: начальные значения ij (0-0.2) 2: max – максимальное значение для обновления (хорошо работает значение 30) 3: разложение весов по экспоненте (для большинства проблем подходит 5) x=10-=0.00001. После того, как все параметры установлены, можно начинать обучение сети. Обучение производится за определенное количество циклов (CYCLES). Введите номер, например 200. В каждом цикле тренировок используются все обучающие образы. Иногда бывает предпочтительно выбрать образы обучающей последовательности в случайном порядке: для этого нажмите SHUFFLE. Для примера сети – ассоциатора оставьте скорость обучения (learning rate) или коэффициент коррекции 0.2 и установите momentum term (второе поле) в 0.5; остальные поля оставьте с нулями. Перед тем, как начать процесс обучения, откройте окно графиков (нажмите GRAPH в окне менеджера) для того, чтобы можно было наблюдать за процессом тренировки. Теперь нажмите на ALL для начала обучения и затем STOP для его остановки. График начнется из левого положения каждый раз, когда сеть инициализируется, поэтому легко сопоставлять различные параметры алгоритма обучения. Текущая ошибка также показана на экране и может быть использована в любой программе рисования. Невозможно судить о корректности работы сети только по тренировочным данным. Поэтому целесообразно загружать тестовый набор, чтобы убедиться в том, что сеть не перетренирована и проводит обобщения корректно. Для нашего примера тестовый пример не приведен. Возможно иметь одновременно до 5 активных тестовых наборов одновременно. Две кнопки USE на форме позволяют выбрать тестовые наборы для обучения и контроля. Верхняя кнопка соответствует обучающей, а нижняя – контролирующей последовательности. Если ввести ненулевое значение в поле VALID, каждые N циклов (N – введенное значение) будет проводиться проверка на тестовом наборе и среднеквадратичное отклонение ошибки будет нарисовано на графике красным цветом. Можно пройти также по всем образам в наборе и рассчитать выходную активацию без изменения весов связей. Для этого надо щелкать по кнопке TEST. Можно перейти к любому образу обучающей последовательности одним из двух путей: указанием номера образа в поле, обозначенном ‘PATTERN’, и нажатием GOTO. Выходы, рассчитанные сетью во время прохода по данным – это цели, а не вычисленные выводы! Рабочее задание 1. Ознакомиться с описанием лабораторной работы. 2. Изучить действия, приведенные в описании, и последовательно выполнить все шаги. В результате у Вас получится обученная нейронная сеть, способная решать задачу распознавания символов. 3. По окончании п.2 показать преподавателю результаты: 4. дисплей с изображением структуры нейронной сети; 5. панель управления обучением с установленными параметрами алгоритма обучения; 6. график обучения; 7. Создать сеть и обучающую последовательность для решения следующей задачи классификации: 8. для четных вариантов: по аналогии с приведенным примером реализовать распознавание цифр 0-9. 9. для нечетных вариантов: по аналогии с приведенным примером реализовать распознавание первых 10 строчных букв греческого алфавита: . 10.Обучить полученную сеть. Результаты показать преподавателю в виде, аналогичном п. 3 задания. Сохранить обучающую последовательность и обученную сеть в файлы с произвольными именами. 11.Подготовить набор искаженных символов и проверить способность нейронных сетей к обобщению. Отчет должен содержать все файлы обучающих последовательностей и всех обученных сетей, полученные в п. 3 и п. 5 задания (эти файлы находятся в текущем каталоге, имеют текстовый формат и расширения .pat и .net соответственно). Контрольные вопросы Контрольные вопросы представлены в виде теста (см. приложение 2). 2.2.2. Лабораторная работа №2. Решение задач автоматической классификации самоорганизующимися картами Кохонена Цель работы: Изучение способов решения задач автоматической классификации (кластеризации) с помощью самоорганизующихся карт Кохонена; приобретение практических навыков работы с пакетом моделирования SNNS для ИНС. Формируемые знания, умения и навыки: o Знания и умения по решению задач автоматической классификации (кластеризации) объектов с помощью нейронных сетей. o Навыки использования системы SNNS. Для выполнения работы необходимо знание общих сведений о ПЭВМ IBM PC AT и операционной системе Windows. Теоретическая часть. Общие положения по сетям Кохонена Сети Кохонена (Kohonen-Netze, self-organizing maps = SOM, Kohonen maps, Kohonen feature maps) или самоорганизующиеся карты предназначены для решения задач автоматической классификации, когда обучающая последовательность образов отсутствует. Соответственно невозможна и фиксация ошибки, на минимизации которой основаны алгоритмы обучения (например, алгоритм обратного распространения ошибки - Backpropagation). Сеть Кохонена - это двухслойная нейросеть, содержащая входной слой (слой входных нейронов) и слой Кохонена (слой активных нейронов, соревновательный слой). В силу отсутствия обучающей последовательности образов, для каждого из которых известна от учителя принадлежность к тому или иному классу образов, определение весов нейронов слоя Кохонена (Referenz - Codebook Vektoren) основано на использовании алгоритмов автоматической классификации (кластеризации или самообучения). На рис.2.37 приведен пример топологической карты сети Кохонена, содержащей входной слой и слой Кохонена. Нейроны входного слоя служат для ввода значений признаков распознаваемых образов. Активные нейроны слоя Кохонена предназначены для формирования областей (кластеров) различных классов образов. На этом рисунке показаны связи всех входных нейронов лишь с одним нейроном слоя Кохонена. Каждый нейрон слоя Кохонена соединен также с соседними нейронами. Рис. 2.37. Топологическая карта сети Кохонена. Поясним основной принцип работы сети Кохонена, используя следующие обозначения: wj = (wj1, wj2, …, wjn)T , j = 1,2,…,m (2.1) - вектор весовых коэффициентов j-го нейрона слоя Кохонена, x = (x1, x2, … , xn)T (2.2) - входной вектор или вектор значений признаков некоторого образца. На стадии обучения (точнее самообучения) сети входной вектор x попарно сравнивается со всеми векторами wj всех нейронов слоя Кохонена. Вводится некоторая функция близости (например, в виде евклидова расстояния). Активный нейрон с номером c слоя Кохонена, для которого значение функции близости d (x, wc) между входным вектором x, характеризующим некоторый образ, и вектором wc максимально, объявляется "победителем". При этом образ, характеризующийся вектором x, относится к классу, который представляется нейроном-"победителем". В результате осуществляется преобразование n-мерного входного пространства Rn на m-мерную сетку (слой Кохонена). Следует еще раз подчеркнуть, что это отображение реализуется в результате рекуррентной (итеративной) процедуры самообучения (unsupervised learning, nicht ueberwachtes Lernen). Отличительная особенность этого отображения - формирование кластеров (cluster) или классов. По завершении процесса самообучения на стадии реального использования сети Кохонена неизвестные входные образы относятся к одному из выявленных кластеров (классов). На стадии самообучения сети Кохонена осуществляется коррекция весового вектора не только нейрона-"победителя", но и весовых векторов остальных активных нейронов слоя Кохонена, однако естественно в существенно меньшей степени - в зависимости от удаления от нейрона"победителя". При этом форма и величина окрестности вокруг нейрона"победителя", весовые коэффициенты нейронов которой также корректируются, в процессе обучения изменяются. Сначала начинают с очень большой области - она, в частности, может включать все нейроны слоя Кохонена. Изменение весовых векторов осуществляется по правилу: wj(t+1) = wj(t) + (t) dcj (t) [x(t) - wj (t)], j=1,2,…,m (2.3) где wj(t) - значение j–го весового вектора на t-м шаге самообучения сети, dcj(t) - функция близости между нейронами слоя Кохонена (neighborhood Kernel) с номерами c и j и (t) - изменяемый во времени коэффициент коррекции. В качестве (t) обычно выбирается монотонно уменьшающаяся функция (0 < (t) < 1), т. е. алгоритм самообучения начинается сравнительно большими шагами адаптации и заканчивается относительно небольшими изменениями. Обратим внимание, что в соответствии с (2.3) изменение того или иного весового вектора wj пропорционально расстоянию между входным вектором x и этим весовым вектором wj. В качестве примера рассмотрим сеть Кохонена с одномерным слоем Кохонена (рис.2.38). На рис.2.38 отображено движение весовых векторов нейронов слоя Кохонена. К входному вектору x ближе всех расположен весовой вектор w5 для нейрона c=5. Этот весовой вектор изменяется соответственно наиболее сильно: он в большей степени приближается к входному вектору x. На втором месте по степени близости находятся весовые векторы w4 и w6. Изменение их - второе по силе (степени). Весовые векторы w3 и w7 также изменяются - однако в существенно меньшей степени. Нейроны 1, 2, 8 и 9 расположены вне окрестности вокруг нейрона"победителя" c=5, поэтому их весовые векторы оставляются без изменения после показа сети образца, характеризующегося вектором x. Рис.2.38. Сеть Кохонена с одномерным слоем Кохонена. Приведем примеры функций близости (применительно к двумерному слою Кохонена). При этом евклидово расстояние между нейронами i и j в двумерном пространстве равно: z ( k i1 k j1 )2 ( k i 2 k j2 )2 (2.4) где ki1 и ki2 - координаты по оси x и оси y нейрона i, kj1 и kj2 - аналогично для нейрона j. При этом можно использовать следующие функции близости: d Gauss ( z ) e z 2 d mexican hat ( z ) (1 z 2 ) e z (2.5) 2 cos(z 2), для z 1 d cos ( z ) 0 (2.6) (2.7) Как отмечено выше, изменение весовых векторов wj осуществляется в направлении входного вектора x, и эти изменения осуществляются многократно. В процессе самообучения варьируется как коэффициент коррекции , так и радиус d, задающий окрестность вокруг нейрона"победителя". В результате самообучения сети Кохонена весовые векторы нейронов слоя Кохонена равномерно распределяются во входном пространстве. В работе используется следующий набор образов для системы распознавания в режиме обучения без поощрения: SNNS pattern definition file V3.2 generated at Thu Apr 21 19:56:37 1994 No. of patterns : 8 No. of input units : 3 # Input pattern 1: 111 # Input pattern 2: -1 1 1 # Input pattern 3: 1 -1 1 # Input pattern 4: 1 1 -1 # Input pattern 5: -1 -1 1 # Input pattern 6: -1 1 -1 # Input pattern 7: 1 -1 -1 # Input pattern 8: -1 -1 -1 Эта простая последовательность образов отображает вершины гиперкуба с центром в начале координат. Эти вершины отображаются на двумерную плоскость размером 16x16 или 20х20. Заметьте, что в файле образов примеры содержат только входы, выход определяется самой нейросетью! Реализация карт Кохонена в SNNS Близость между нормализованным (т.е. имеющим единичную длину) входным вектором x = (xi) и весами нейронов w = (wij) в SNNS рассчитывается с помощью скалярного произведения: n Net j ( t ) x w j x i ( t ) w ij ( t ) (2.8) i 1 Вектор wc , наиболее близкий к x, имеет наибольшее скалярное произведение с x: Net c ( t ) max Net j ( t ) x w c (2.9) Изменение весов связей входного и соревновательного слоев вычисляется следующим образом: w ij ( t ) e j ( t ) ( x i ( t ) w ij ( t )) , при j N c w ij ( t ) 0 , при j N c (2.10) ( d j r ( t )) 2 где e j ( t ) h ( t ) e - функция Гаусса; dj - расстояние между wj и победителем wc; h(t) - вес адаптации в момент времени t (0 h( t ) 1) ; r(t) - радиус множества соседей Nc в момент времени t. Вес и радиус адаптации обычно уменьшаются на каждом шаге алгоритма обучения без поощрения или самообучения для обеспечения его сходимости: h( t 1) h( t ) mult _ H ; r( t 1) r( t ) mult _ R , где mult_H и mult_R - факторы уменьшения, задаваемые из диапазона (0, 1]. Работа с программой самоорганизующихся карт Кохонена Создание самоорганизующихся карт Кохонена. В системе SNNS самоорганизующиеся карты (в отличие от сетей других типов) нельзя создавать или модифицировать при помощи встроенного графического редактора сетей. Это объясняется тем, что первоначально SNNS не был предназначен для моделирования нейронов, геометрическое положение которых несет семантическую информацию. Создание новых карт должно осуществляться с использованием инструмента BIGNET (Kohonen) , расположенного на панели менеджера SNNS. Для запуска SNNS следует сначала запустить служебную программу X-Win32, а затем файл «snns.bat» (см. лабораторную работу №1). После запуска SNNS, выберите из выпадающего списка BIGNET на панели менеджера строку (опцию) Kohonen, при этом появится диалоговое окно «Карта Кохонена» (рис.2.39): Рис.2.39. Панель создания сети Кохонена. Здесь в поле Components необходимо задать число входных нейронов сети, совпадающее с размерностью исследуемых образов; в полях X-size и Y-size соответственно горизонтальный и вертикальный размер плоского соревновательного слоя. Карты Кохонена могут иметь и объемный соревновательный слой, однако в SNNS реализованы только двумерные SOM. В поле Components введите число входных нейронов 3, соревновательный слой Кохонена задайте 20 х 20. Нажмите Create net, затем Done. Нажмите кнопку Display на панели менеджера, в открывшемся окне редактора появится графическое изображение SOM. Для удобства визуализации результатов отключите надписи сверху и снизу нейронов, а также уменьшите масштаб сетки прорисовки нейронов. Для этого в меню Setup окна редактора установите параметр grid width в 16 и отожмите утопленные кнопки ON опций units top и bottom (рис.2.40). Рис.2.40. Панель экранных настроек. Выбор функции обновления Щелкните кнопку SEL_FUNC как показано на рис.2.41: Рис.2.41. Кнопка функции обновления. В SNNS также реализована специальная функция обновления (Kohonen_Order). Нужно использовать именно эту функцию, так как только она обеспечивает особый порядок элементов в соревновательном слое. Если выбрана другая функция обновления, то могут выдаваться сообщения вида "Error: Dead units in the network". Выбор функции инициализации. Щелкните последнюю кнопку SEL_FUNC. Прежде, чем SOM могут быть обучены, их веса надо проинициализировать, используя функцию инициализации Kohonen_Weight. Эта функция сначала инициализирует все веса со случайными значениями в указанных границах, затем нормализует все связи. Два используемых параметра, которые представляют минимум (a) и максимум (b) диапазона, вне которого начальные значения для второго i - передача весов к модулю i Kohonen уровня инициализирован как нормализованный вектор (длина 1) выведенный наугад из части гипер тела, используется согласно табл.2.3. Таблица 2.3 Влияние минимума и максимума на инициализацию весовых векторов для SOM. min (a) a0 a0 a<0 a<0 max (b) b0 b<0 b0 b<0 векторы в ... положительном секторе целой гиперсфере целой гиперсфере отрицательном секторе Далее активируйте панель управления SNNS. Выберите функцию обучения - Kohonen, функцию обновления - Kohonen_Order и функцию инициализации - Kohonen_Weights. До того, как начать тренировку SOM, веса нейронов соревновательного слоя должны быть инициализированы с помощью функции Kohonen_Weights. Эта функция сначала инициализирует все веса случайными значениями из заданного диапазона. Затем она нормализует все связи между нейронами. Задайте диапазон весов [-1,1] и нажмите кнопку INIT в панели управления. Выбор алгоритма обучения Для сетей с прямым распространением информации (feedforward) по умолчанию применяется Std_Backpropagation (стандартный алгоритм обратного распространения ошибки). Для выбора других алгоритмов обучения просто щелкните SEL_FUNC и выберите алгоритм, который вы хотите использовать. Для примера Som_cube используйте kohonen (алгоритм обучения Кохонена). Каждая обучающая функция требует установки различных параметров: Алгоритм обучения Кохонена Обучение SOM в SNNS можно выполнить на основе алгоритма обучения Кохонена. Для этого его следует выбрать из списка функций в панели управления. Этому алгоритму необходимо передать пять параметров: Высота (вес) адаптации (высота обучения). Начальный вес адаптации (вес обучения) h(0). Он определяет общую способность сети к адаптации; может назначаться из диапазона (0,1). Для работы установим 0,85. Радиус адаптации (радиус обучения). Начальный радиус адаптации (радиус обучения) r(0) задает множество соседей победившего нейрона, весовые векторы которых адаптируются. Значение может выбираться от 1 до размера карты. Фактор уменьшения веса адаптации mult_H. Высота адаптации уменьшается монотонно, причем это уменьшение управляется фактором уменьшения mult_H:= h(t) · mult_H. Фактор уменьшения радиуса адаптации mult_R. Радиус адаптации также уменьшается после каждого шага обучения сети, причем это уменьшение управляется фактором уменьшения mult_R: r(t+1) := r(t) · mult_R. Горизонтальный размер. Внутреннее представление сети не позволяет задать двухмерную сеть, поэтому алгоритму обучения следует задать горизонтальный размер в числе нейронов (у нас 20). Факторы уменьшения должны задаваться из диапазона (0,1]. Значение “1” сохраняет параметры адаптации на неизменном уровне. Замечание: После завершения каждого цикла обучения параметры высота адаптации и радиус адаптации модифицируются в панели управления, чтобы отразить их новые значения. Таким образом, когда обучение продолжается, оно начинается с той точки, где было остановлено в предшествующий раз. И mult_H, и mult_R должны находиться в диапазоне (0,1]. Единичное значение сохраняет значения адаптации на постоянном уровне. После того, как все параметры установлены, можно начинать обучение сети. Обучение производится за определенное количество циклов (CYCLES). Введите номер, например 200. В каждом цикле тренировок используются все обучающие образы. Иногда бывает предпочтительно выбрать образы обучающей последовательности (тренировочного выбора) в случайном порядке: для этого нажмите SHUFFLE. В панели управления SNNS эти параметры заносятся в пять горизонтальных полей ввода, расположенных справа от надписи LEARN (рис.2.42): Рис.2.42. Панель управления SNNS. Занесите в эти поля значения, как показано выше. Поле CYCLES (число эпох обучения ) установите в 10. Обучение сети Далее посредством кнопки FILE на панели менеджера вызовите диалоговое окно работы с файлами; утопите кнопку PAT и в директории examples дважды щелкните мышью на файле som_cube. Для загрузки файла образцов som_cube.pat нажмите LOAD, затем DONE. Примите к сведению, что SNNS распознает файлы только в том случае, если их расширения записаны в нижнем регистре. Многие оболочки DOS при копировании файлов записывают их имена большими буквами. Все обучение и тестирование производится через опцию CONTROL. Рассмотрим наиболее важные возможности одну за другой. Форма состоит из двух частей. Верхняя часть управляет определениями параметров процесса обучения, а три нижние строки – это бланк, который должен быть заполнен для определения интенсивности обучения и т.д., а также диапазон, в котором веса будут случайно распределены при инициализации сети. По умолчанию параметры обучения установлены в (0.2 0 0 0 0), а веса по умолчанию – между 1 и –1 (1.0 –1.0 0 0 0). Для запуска процесса обучения сети нажмите кнопку ALL на панели управления и STOP для его остановки. Предварительно можно утопить переключатель SHUFFLE для предъявления сети входных образцов в случайном порядке. Текущая ошибка также показывается на экране и может быть использована в любой программе рисования. После прохождения всех эпох обучения кнопкой TEST можно предъявлять сети образцы, наблюдая в графическом окне активацию соревновательного слоя. По умолчанию для нейронов этого слоя задана функция активации Act_Euclid (рис.2.43): Рис.2.43. Панель с функцией активации Act_Euclid. Она копирует евклидово расстояние между входным вектором сети и вектором весов связей входных нейронов с нейроном соревновательного слоя на выход этого нейрона. Это основной режим функционирования карты Кохонена. При правильно обученной сети в соревновательном слое должны сформироваться компактные непересекающиеся группы нейронов, веса связей которых близки различным подмножествам входных векторов. Это и позволяет карте кластеризировать множество входных образов на непересекающиеся подмножества (кластеры, группы). На период обучения сети нейронам соревновательного слоя можно назначить другую функцию активации Act_Component (рис.2.44): Рис.2.44. Панель с функцией активации Act_Component. Она просто записывает вес определенной связи нейрона в его выходную переменную. Для назначения этой функции необходимо проделать следующее: в окне Display выделить нейроны соревновательноого слоя (мышью при нажатой левой кнопке), выделенные нейроны окрашиваются в желтый цвет; не выводя указатель мыши из окна, нажать и удерживать левую кнопку при нажатой клавише Ctrl, в позиции указателя возникнет контекстное меню; из меню выбрать пункт Units. повторять п.2, последовательно выбирая из новых меню пункты: Set, Function, Activation Func, Act_Component. для снятия выделения нейронов щелкнуть правой кнопкой мыши на свободном месте окна Display. Выбор связи, вес которой визуализируется картой, осуществляется при помощи инструмента Kohonen, который вызывается из панели менеджера SNNS (рис.2.45): Рис.2.45. Панель выбора компонента входного вектора. В поле LAYER вводится номер компонента входного вектора (номер нейрона), веса связей которого с соревновательным слоем показываются картой. Этот режим функционирования карты Кохонена можно назвать отладочным, поскольку он используется лишь на этапе обучения сети: в процессе обучения веса связей изменяются сначала значительно, затем все менее заметно. Этот процесс можно визуально контролировать. О корректности работы сети невозможно судить только по тренировочным данным. Поэтому целесообразно загружать тестовый набор, чтобы убедиться в том, что сеть не перетренирована и проводит обобщения корректно. Для нашего примера тестовый пример не приведен. Возможно иметь до 5 активных тестовых наборов одновременно. Две кнопки USE на форме позволяют выбрать тестовые наборы для обучения и контроля. Верхняя кнопка соответствует обучающему набору, а нижняя – контролирующему. Если ввести ненулевое значение в поле VALID, то каждые N циклов (N – введенное значение) будет проводиться проверка на тестовом наборе и среднеквадратичная ошибка будет нарисована на графике красным цветом (рис.2.46). Рис.2.46. Пример заполнения параметров контрольной панели. Не забудьте поставить значение циклов от 100 и выше! Можно пройти также по всем образам в наборе и рассчитать выходную активацию без изменения весов связей. Для этого надо щелкать по кнопке TEST. Для контроля обучения карт Кохонена в SNNS предусмотрен еще один инструмент: можно наблюдать победившие нейроны. Для этого в меню Setup окна Display в выпадающем меню SHOW справа от опции Units top необходимо выбрать пункт winner; затем утопить кнопку ON. Далее нажмите кнопку WINNER в панели Kohonen. Над каждым победившим нейроном появится номер входного образца, при предъявлении которого победил данный нейрон. Наблюдая множество нейронов-победителей, можно оценить распределение кластеров по карте (рис.2.47). Рис.2.47. Пример распространения кластеров по карте. Рабочее задание 1. Ознакомиться с описанием лабораторной работы. 2. Изучить действия, приведенные в описании, и последовательно выполнить все шаги, описанные в разделе 2.3.3. В результате у Вас получится обученная карта Кохонена, способная решать задачу автоматической классификации (кластеризации). 3. Создать обучающую последовательность нормализованных векторов и карту Кохонена: для четных вариантов: размерность входного вектора 4, размер конкурирующего слоя подобрать, исходя из требования непересечения кластеров и минимального числа нейронов в слое; для нечетных вариантов: размерность входного вектора 5, конкурирующий слой - 30 х 30 нейронов. 4. Обучить полученную сеть. Сохранить в файлах обучающую после– довательность и обученную сеть. 5. Подготовить произвольные ненормализованные входные векторы и проверить качество обучения карты Кохонена. Отчет должен содержать все файлы обучающих последовательностей и всех обученных сетей, полученные в п. 3 и п. 5 задания (эти файлы находятся в текущем каталоге, имеют текстовый формат и расширения .pat и .net соответственно), а также параметры алгоритма обучения. Контрольные вопросы Контрольные вопросы представлены в виде теста (см. приложение 2). 2.2.3. Лабораторная работа №3. Распознавание образов сетями Хопфилда Цель работы: Реализация ассоциативной памяти средствами ИНС на примере сетей Хопфилда; приобретение практических навыков работы с пакетом моделирования ИНС SNNS. Формируемые знания, умения и навыки: 1. Основные знания по сетям Хопфилда и областям их применения; 2. Знания и умения по использованию сетей Хопфилда для распознавания зашумленных изображений; 3. Навыки использования системы SNNS для распознавания искаженных образов сетями Хопфилда. Теоретическая часть. Общие сведения о сетях Хопфилда Американским исследователем Хопфилдом в 80-х годах предложен специальный тип нейросетей, названных в его честь. Они открыли новое направление в теории и практике нейросетей. До сих пор рассматривались лишь сети с прямыми связями (feedforward networks или FF - nets). Сети Хопфилда являются рекуррентными сетями или сетями с обратными связями (feedback networks). Ниже рассматриваются основы их построения. Сети Хопфилда обладают следующими свойствами: 1. симметрия дуг: сети содержат n нейронов, соединенных друг с другом. Каждая дуга (соединение) характеризуется весом wij , причем имеет место: i, j N : i j : 1 wij , где N – множество нейронов: N = {1, 2, … , n}, 2. симметрия весов: вес соединения нейрона ni с нейроном nj равен весу обратного соединения: wij = wji; wii = 0 (2.11) 3. бинарные входы: сеть Хопфилда обрабатывает бинарные входы {0,1} или {-1,1}. В литературе встречаются модели сетей как со значениями 0 и 1, так и –1, 1. Для структуры сети это безразлично. Однако формулы для распознавания образов (изображений) при использовании значений –1 и 1 для входов и выходов нейронов сети Хопфилда получаются нагляднее, поэтому эти значения и предполагаются ниже. Определение. Бинарная сеть Хопфилда определяется симметричной матрицей с нулевыми диагональными элементами, вектором Т порогов нейронов и знаковой функцией активации или выхода нейронов. Каждый вектор o с компонентами –1 или 1, удовлетворяющий уравнению o = S(wo – T), называется образом для сети Хопфилда. (2.12) Принцип функционирования сетей Хопфилда отличается от ранее рассмотренных сетей. На так называемой recall-стадии на входы сети подается некоторый образ. Он оставляется на входах сети до тех пор, пока не завершатся изменения состояний сети. В этом случае говорят о сходимости сети. Наглядно это можно представить следующим образом. В начале сеть находится на высоком энергетическом уровне, из которого возможны переходы в различные состояния. Затем энергетический уровень сети уменьшается до тех пор, пока не достигается некоторое конечное состояние. Ниже мы рассмотрим, как обучаются сети Хопфилда, и как считывается (извлекается) запомненная в них информация. Класс сетей Хопфилда содержит только один слой нейронов, причем каждый нейрон соединен с остальными. Обратные связи с выхода нейрона на его же вход отсутствуют. На рис.2.48 приведен конкретный пример сети Хопфилда из 4-х нейронов. in1 w41 w w31 21 w12 w32 in2 in3 in4 1 w42 w43 w34 w23 w24 w13 w14 2 3 4 out1 out2 out3 out4 Рис.2.48. Сеть Хопфилда из 4 нейронов. Алгоритм Хопфилда Обозначим через xs образ s-го класса, а через xsi – i-ю составляющую вектора xs. При этом алгоритм Хопфилда может быть описан следующим образом: 1. Расчет весов k 1 x x ,i j , wij s 0 si sj 0 ,i j где k – число классов образов; (2.13) 2. инициализация сети путем ввода : oi(0) = xi ,1 i n , (2.14) где oi(0) – выход i - го нейрона в начальный (нулевой) момент времени. 3. итерационное правило: Repeat n1 oi (t 1) S h wij o j (t ) , i 0 1 i n : oi (t 1) oi (t ) Until (2.15) где oi(t) – выход i – го нейрона в момент времени t. Соотношения (3.4), (3.5) представим в векторной форме: o(t+1) = S(wo(t)), t=1,2,… o(0) = x(0), где x – входной вектор, w – симметричная матрица, S – вектор-функция активации или выхода нейронов. Взвешенная сумма входов j – го нейрона сети Хопфилда равна: z j net j wij oi . (2.16) (2.17) (2.18) i Функция активации или выхода имеет вид: 1 o j S ( zi ) 1 для zj 0 для zj 0 (2.19) Таким образом, алгоритм Хопфилда может быть сформулирован следующим образом: Пусть имеется некоторый образ, который следует запомнить в сети Хопфилда, тогда веса искомой сети могут быть рассчитаны, т.е. процесс обучения исключается. Если этот образ характеризуется n – мерным вектором x = (x1,… , xn)T, то веса соединений определяются по формулам: xi x j wij 0 для i j для i j (2.20) В этом случае сеть Хопфилда, характеризуемая матрицей w и порогами Ti = 0, i=1, 2, … , n, запоминает предъявленный образ. Веса wij можно умножить на некоторый положительный коэффициент (например, 1/n). Использование такого коэффициента особенно целесообразно в тех случаях, когда запоминаемые образы характеризуются большим числом признаков (например, видеоизображение отображается большим числом пикселов). Пример 2.1. Имеется изображение из 4 – х пикселов: +1 -1 -1 +1 Соответствующий вектор (образ) имеет вид: x = (1,-1,-1,1)T . Стационарная сеть Хопфилда содержит при этом 4 элемента (нейрона). Ее весовая матрица рассчитывается на основе (2.20) и принимает вид: 0 1 1 1 1 1 1 0 w 1 1 0 1 1 1 1 0 При этом легко можно убедиться в справедливости равенства x = S(wx). Подадим на входы сети искаженный образ: 1 1 -1 1 Можно легко установить, что сети потребуется лишь одна итерация, чтобы выдать корректное изображение. Если имеется не много изображений (т.е. k мало), то сеть с матрицей (2.13) запоминает k образов, полагая, естественно, что изображения не сильно коррелированы. Если же число k велико, то весовая матрица оказывается недостаточной для запоминания всех k изображений. С ростом k уменьшается вероятность воспроизведения образа. Приведем утверждение относительно числа k запоминаемых образов при использовании сети Хопфилда из n нейронов. Пусть k – число образов, а n – число признаков (пикселов), и образы, подлежащие запоминанию, некоррелированы, т.е. для двух изображений j и s сумма x ji xsi (2.21) i мала. При этом при подаче на вход сети с весовой матрицей (13) одного образа каждый пиксел корректно воспроизводится с вероятностью p 0.99 при выполнении условия: k 0.15n n (2.22) Пример 2.2. Образ характеризуется тысячью признаками (n = 1000). В этом случае бинарная сеть Хопфилда в состоянии запомнить и корректно воспроизвести до 150 образов (например, видеоизображений). В работе сети Хопфилда можно выделить следующие три стадии: 1. Инициализация сети: на этой стадии рассчитываются все веса сети для некоторого множества образов. Подчеркнем еще раз: эти веса не определяются на основе рекуррентной процедуры, используемой во многих алгоритмах обучения с поощрением, 2. Ввод нового образа: нейроны сети устанавливаются в соответствующее начальное состояние по алгоритму (2.13) – (2.17), 3. Затухающий колебательный процесс: путем использования итеративной процедуры рассчитывается последовательность состояний сети до тех пор, пока не будет достигнуто стабильное состояние, т.е. oj(t+1) = oj(t), j = 1, 2, … , n, (2.23) Или: в качестве выходов сети используются значения (2.23), при которых сеть находится в динамическом равновесии: o = S(wo), где o – выходной вектор сети. Выход бинарной сети Хопфида , содержащей n нейронов, может быть отображен бинарным вектором o состояния сети. Общее число таких состояний – 2n (вершины n – мерного гиперкуба). При вводе нового входного вектора состояние сети изменяется от одной вершины к другой до достижения сетью устойчивого состояния. Из теории систем с обратными связями известно: для обеспечения устойчивости системы ее изменения с течением времени должны уменьшатся. В противном случае возникают незатухающие колебания. Для таких сетей Коэном (Cohen) и Гроссбергом (Grossberg) (1983) доказана теорема, формулирующая достаточные условия устойчивости сетей с обратными связями: Рекуррентные сети устойчивы, если весовая матрица w = (wij) симметрична, а на ее главной гиагонали – нули: 1. wij = wji для всех i j; 2. wii = 0 для всех i. Обратим внимание, что условия данной теоремы достаточны, но не необходимы. Для рекуррентных сетей отсюда следует, что возможны устойчивые сети, не удовлетворяющие приведенному критерию. Пример 2.3. Дана сеть из трех нейронов: 1 1 1 Рис.2.49. Сеть Хопфилда с тремя нейронами и весами, равными 1. Соответствующая весовая матрица имеет вид: 0 1 1 w 1 0 1 1 1 0 В качестве функции активации или выхода нейронов выберем знаковую функцию (sign) с нулевыми порогами. Пусть на вход такой сети подается вектор: x = (1,-1,1)T. Рассчитаем для него выходной вектор сети. При этом в соответствии с (2.13) – (2.17) получим: o(1) = S(wx) = (-1,1,-1)T; o(2) = S(wo(1)) = (-1,-1,-1)T; o(3) = S(wo(2)) = (-1,-1,-1)T. Т.к. o(3) = o(2), то после 3-го шага выходы сети не изменятся, т.е. выходной вектор определяется сетью после 3-го шага. Основная область применения сетей Хопфилда – распознавание образов. Например, каждое черно-белое изображение, представляемое пикселами, можно отобразить вектором x = (x1, … ,xn)T, где xi для i – го пиксела равен 1, если он черный, и xi = -1, если – белый. При подаче на входы обученной сети Хопфилда искаженного изображения сеть после некоторого числа итераций выдает на выходы корректное изображение. Работа с программой. Сети Хопфилда в SNNS На рис.2.50 представлено окно графического редактора SNNS с сетью Хопфилда из трех нейронов. В связи с особенностями реализации рекуррентных сетей в SNNS, каждый нейрон имеет обратную связь с самим собой, хотя это расходится с теорией. На эту особенность не следует обращать внимания. Рис.2.50. Графический редактор. Для создания сети Хопфилда из меню BIGNET менеджера выберите опцию Hopfield, в появившемся окне задайте размер сетки нейронов по горизонтали и вертикали, затем нажмите ENTER, CREATE NET, DONE. На рис.2.51 приведен пример сети из 36 нейронов в виде квадратной матрицы 6 x 6. Рис.2.51. Пример сети. Поскольку синаптические веса сети Хопфилда рассчитываются на основе входных образов за один шаг в отличие от классических алгоритмов обучения, требующих многократного предъявления образов сети. В SNNS этап обучения совмещен с инициализацией сети, поэтому в панели управления необходимо задать лишь функции инициализации и обновления. Функция обучения (Learning func.) для данной сети в SNNS не используется. SNNS поддерживает бинарные сети Хопфилда с двумя алгоритмами функционирования: Стандартная сеть Хопфилда с обучением по правилу Хебба (функция инициализации Hebb, первый параметр – смещение (BIAS) входных нейронов, второй – смещение выходных нейронов; функция обновления – Hopfield_Synchronous, параметров нет (рис.2.52).); Сеть Хопфилда, хранящая образы с фиксированным числом единиц (функция инициализации – Hebb_Fixed_Act, первый параметр – число единиц на образ, второй – вероятная степень искажения образов в процентах; функция обновления – Hopfield_Fixed_Act, единственный параметр – число единиц в образе). Рис.2.52. Формат файла входных образов. Нейроны в сети Хопфилда являются одновременно входными и выходными, однако в файле *.pat необходимо формально задать битовые карты входа и выхода для каждого образа (они должны совпадать). Рабочее задание 1. Ознакомиться с описанием лабораторной работы. 2. Создать сеть Хопфилда из 40 нейронов: для четных вариантов: стандартная сеть Хопфилда; определить максимальное количество образов, которое сеть способна запомнить и корректно воспроизводить при условии незначительных искажений тестовых образов; для нечетных вариантов: сеть Хопфилда для образов с фиксированным числом единиц; количество хранимых образов - 6. 3. Продемонстрировать работу сети на тестовых (искаженных) образах. Отчет должен содержать: 1. файлы обучающих и тестовых образов, обученную сеть; 2. выводы по проделанной работе, в частности, проверку условия (2.22), предельную степень искажения образов (2.21), при которой сеть еще способна правильно их распознать. Контрольные вопросы Контрольные вопросы представлены в виде теста (см. приложение 2).