Мета: навчитися будувати нейронні мережі за допомогою середовища MATLAB, познайомитися з елементами графічного інтерфейсу.
Нейронні мережі (NN| - Neural| Networks|) широко використовуються для вирішення різноманітних завдань. Серед областей застосування NN|, що розвиваються, - обробка аналогових і цифрових сигналів, синтез і ідентифікація електронних ланцюгів і систем. Основи теорії і технології застосування NN| широко представлені в пакеті MATLAB|. В зв'язку з цим особливо слід зазначити останню версію пакету - MATLAB| 6.0, де вперше представлений GUI| (Graphical| User| Interface| - графічний інтерфейс користувача) для NN| - NNTool|.
Прикладами застосування технології нейронних мереж для цифрової обробки сигналів є: фільтрація, оцінка параметрів, детектування, ідентифікація систем, розпізнавання образів, реконструкція сигналів, аналіз тимчасових рядів і стиснення. Згадані види обробки застосовні до різноманітних видів сигналів: звуковим, відео, мовним, зображення, передачі повідомлень, геофизичним, локаційним, медичних вимірювань (кардіограми, енцефалограми|, пульс) і іншим.
У даній статті даний опис NNTool| і показана техніка його застосування у ряді завдань синтезу ланцюгів і цифрової обробки сигналів.
Обробка сигналів в технологіях NN| виконується з допомогою або NN| без пам'яті, або NN| з пам'яттю. І в тому і іншому випадках ключовим елементом є NN| без пам'яті. Подібна роль визначається тією обставиною, що при використанні нейронів з певними функціями активації (передавальними характеристиками) NN| є універсальною апроксимацією. Останнє означає, що в заданому діапазоні зміни вхідних змінних NN| може із заданою точністю відтворювати (моделювати) довільну безперервну функцію цих змінних.
Нижче обговорюються питання, що відносяться до так званих NN| прямого розповсюдження, тобто без зворотних зв'язків. Чудовою властивістю таких NN| є їх стійкість.
Після того, як структура NN| вибрана, повинні бути встановлені її параметри. Вибір структури NN| і типів нейронів - самостійний і вельми непростий питання, яке тут ми обговорювати не будемо. Що ж до значень параметрів, то, як правило, вони визначаються в процесі рішення деякої оптимізаційної задачі. Ця процедура в теорії NN| називається навчанням.
Графічний інтерфейс користувача NNTool| дозволяє вибирати структури NN| з обширного переліку і надає безліч алгоритмів навчання для кожного типу мережі.
У статті розглянуті наступні питання, що відносяться до роботи з NNTool|:
призначення графічних елементів, що управляють;
підготовка даних;
створення нейронної мережі;
навчання мережі;
прогін мережі.
Всі етапи роботи з мережами проілюстровані прикладами вирішення простих завдань. Як і в попередніх статтях проекту "MATLAB| для DSP|", передбачається, що читач знайомий з основами теорії NN| і її термінологією.
Щоб запустити NNTool|, необхідно виконати однойменну команду в командному вікні MATLAB|:
>> nntool|
після цього з'явиться головне вікно NNTool|, що іменується "Вікном управле-ния| мережами і даними" (Network/Data Manager|) (мал. 1).
Панель "Мережі і дані" (Networks| and| Data|) має функціональні клавіші з наступними призначеннями:
Допомога (Help|) - короткий опис елементів даного вікна, що управляють;
Нові дані (New| Data|.) - виклик вікна, що дозволяє створювати нові набори даних;
Нова мережа (New| Network|.) - виклик вікна створення нової мережі;
Імпорт (Import|.) - імпорт даних з робочого простору MATLAB| в простір змінних NNTool|;
Експорт (Export|.) - експорт даних з простору змінних NNTool| в робочий простір MATLAB|;
Вигляд (View|) - графічне відображення архітектури вибраної мережі;
Видалити (Delete|) - видалення вибраного об'єкту.
На панелі "Тільки мережі" (Networks| only|) розташовані клавіші для роботи виключно з мережами. При виборі покажчиком миші об'єкту будь-якого іншого типу, ці кнопки стають неактивними.
При роботі з NNTool| важливо пам'ятати, що клавіші View|, Delete|, Initialize|, Simulate|, Train| і Adapt| (зображені на мал. 1 як неактивні) діють стосовно того об'єкту, який відмічений в даний момент виділенням. Якщо такого об'єкту немає, або над виділеним об'єктом неможливо провести вказану дію, відповідна клавіша неактивна.
Розглянемо створення нейронної мережі за допомогою NNTool| на прикладі.
Приклад 1.
Хай потрібно створити нейронну мережу, виконуючу логиче-скую| функцію "І".
Створення мережі
Виберемо мережу, що складається з одного персептрона з двома входами. В процесі навчання мережі на її входи подаються вхідні дані і проводиться зіставлення значення, отриманого на виході, з цільовим (бажаним). На підставі результату порівняння (відхилення набутого значення від бажаного) обчислюються величини зміни вагів і зсуву, що зменшують це відхилення.
Отже, перед створенням мережі необхідно заготовити набір повчальних і цільових даних. Складемо таблицю істинності для логічної функції "І", де P1| і Р2 - входи, а А - бажаний вихід (табл. 1).
Таблиця 1. Таблиця істинності логічної функції "І"
|
P1| |
P2| |
A |
|
0 |
0 |
0 |
|
0 |
1 |
0 |
|
1 |
0 |
0 |
|
1 |
1 |
1 |
Щоб задати матрицю, що складається з чотирьох векторів-рядків, як вхідну, скористаємося кнопкою New| Data|. У вікні, що з'явилося, слід провести зміни, показані на мал. 2, і натиснути клавішу "Створити" (Create|).
Мал.
2. Задание входных векторов
Після цього у вікні управління з'явиться вектор data1| в розділі Inputs|. Вектор цілей задається схожим чином (мал. 3).
Мал.
3. Задание целевого вектора
Після натиснення на Create| в розділі Targets| з'явиться вектор target1|.
Дані в полі "Значення" (Value|) можуть бути представлені будь-яким зрозумілим виразом MATLAB|. Наприклад, попереднє визначення вектора цілей можна еквівалентно замінити рядком вигляду
bitand|([0 0 1 1], [0 1 0 1]).
Тепер слід приступити до створення нейронної мережі. Вибираємо кнопку New| Network| і заповнюємо форму, як показано на мал. 4.
Мал.
4. Окно "Создание сети"
При цьому поля несуть наступні смислові навантаження:
Ім'я мережі (Network| Name|) - це ім'я об'єкту створюваної мережі.
Тип мережі (Network| Type|) - определяеттип| мережі і в контексті вибраного типу представляє для введення різні параметри в частині вікна, розташованій нижче за цей пункт. Таким чином, для різних типів мереж вікно змінює свій зміст.
Вхідні діапазони (Input| ranges|) - матриця з числом рядків, рівним числу входів мережі. Кожен рядок є вектором з двома елементами: перший - мінімальне значення сигналу, яке буде подано на відповідний вхід мережі при навчанні, другої, - максимальне. Для спрощення введення цих значень передбачений випадний список "Отримати з входу" (Get| from| input|), що дозволяє автоматично сформувати необхідні дані, вказавши ім'я вхідної змінної.
Кількість нейронів (Number| of| neurons|) - число нейронів в шарі.
Передавальна функція (Transfer| function|) - в цьому пункті вибирається передавальна функція (функція активації) нейронів.
Функція навчання (Learning| function|) - функція, що відповідає за оновлення вагів і зсувів мережі в процесі навчання.
За допомогою клавіші "Вигляд" (View|) можна подивитися архітектуру створюваної мережі (мал. 5). Так, ми маємо можливість упевнитися, чи всі дії були проведені вірно. На мал. 5 зображена персептронная| мережа з вихідним блоком, що реалізовує передавальну функцію з жорстким обмеженням. Кількість нейронів в шарі рівна одному, що символічно відображається розмірністю вектора-стовпця на виході шаруючи і указується числом безпосередньо під блоком передавальної функції. Дана мережа має два входи, оскільки розмірність вхідного вектора-стовпця рівна двом.
Отже, структура мережі відповідає нашому завданню. Тепер можна закрити вікно попереднього перегляду, натиснувши клавішу "Закрити" (Close|), і підтвердити намір створити мережу, натиснувши "Створити" (Create|) у вікні створення мережі.
В результаті виконаних операцій в розділі "Мережі" (Networks|) головного вікна NNTool| з'явиться об'єкт з ім'ям network1|.
Наша мета - побудувати нейронну мережу, яка виконує функцію логічного "І". Очевидно, не можна розраховувати на те, що відразу після етапу створення мережі остання забезпечуватиме правильний результат (правильне співвідношення "вхід/вихід"). Для досягнення мети мережу необхідно належним чином навчити, тобто підібрати відповідні значення параметрів. У MATLAB| реалізована більшість відомих алгоритмів навчання нейронних мереж, серед яких представлено два для персептронных| мереж даного вигляду. Створюючи мережу, ми вказали LEARNP| як функції, що реалізовує алгоритм навчання (мал. 4).
Повернемося в головне вікно NNTool|. На даному етапі інтерес представляє нижня панель "Тільки мережі" (Networks| only|). Натиснення будь-якій з клавіш на цій панелі викличе вікно, на безлічі вкладок якого представлені параметри мережі, необхідні для її навчання і прогону, а також що відображають поточний стан мережі.
Відзначивши покажчиком миші об'єкт мережі network1|, викличемо вікно управління мережею натисненням кнопки Train|. Перед нами виникне вкладка "Train|" вікна властивостей мережі, що містить, у свою чергу, ще одну панель вкладок (мал. 6). Їх головне призначення - управління процесом навчання. На вкладці "Інформація навчання" (Training| info|) потрібно вказати набір повчальних даних в полі "Входи" (Inputs|) і набір цільових даних в полі "Мети" (Targets|). Поля "Виходи" (Outputs|) і "Ошибки" (Errors|) NNTool| заповнює автоматиче-ски|. При цьому результати навчання, до яких відносяться виходи і помилки, зберігатимуться в змінних з вказаними іменами.
Завершити процес навчання можна, керуючись різними критеріями. Можливі ситуації, коли переважно зупинити навчання, вважаючи достатнім деякий інтервал часу. З іншого боку, об'єктивним критерієм є рівень помилки.
На вкладці "Параметри навчання" (Training| parame-ters|) для наший мережі (мал. 7) можна встановити наступні поля:
Кількість епох (epochs|) - визначає число епох (інтервал часу), після яких навчання буде припинено.
Епохою називают одноразове представлення всіх повчальних вхідних даних на входи мережі.
Досягнення мети або попадання (goal|) - тут задається абсолютна величина функції помилки, при якій мета вважатиметься досягнутою.
Період оновлення (show|) - період оновлення графіка кривою навчання, виражений числом епох.
Час навчання (time|) - після закінчення вказаного тут тимчасового інтервалу, вираженого в секундах, навчання припиняється.
Мал.
7. Вкладка параметров обучения
Зважаючи на той факт, що для завдань з лінійно віддільними множинами (а наше завдання відноситься до цього класу) завжди існує точне рішення, встановимо поріг досягнення мети, рівний нулю. Значення решти параметрів залишимо за умовчанням. Відмітимо тільки, що поле часу навчання містить запис Inf|, який визначає нескінченний інтервал часу (від англійського Infinite| - нескінченний).
Наступна вкладка "Необов'язкова інформація" (Optional| Info|) показана на мал. 8.
Мал.
8. Вкладка необязательной информации
Розглянемо вкладку навчання (Train|). Щоб почати навчання, потрібно натиснути кнопку "Навчити мережу" (Train| Network|). Після цього, якщо у нинішній момент мережа не задовольняє жодному з умов, вказаних в розділі параметрів навчання (Training| Parameters|), з'явиться вікно|, що ілюструє динаміку цільової функції - криву навчання. У нашому випадку графік може виглядати так, як показано на мал. 9. Кнопкою "Зупинити навчання" (Stop| Training|) можна припинити цей процес. З малюнка видно, що навчання було зупинене, коли функція мети досягла встановленої величини (goal| = 0).
Рисунок
9. Кривая обучения
Слід зазначити, що для персептронів, що мають функцію активації з жорстким обмеженням, помилка розраховується як різниця між метою і отриманим виходом.
Отже, алгоритм навчання знайшов точне рішення задачі. У методичних цілях переконаємося в правильності рішення задачі шляхом прогону навченої мережі. Для цього необхідно відкрити вкладку "Прогін" (Simulate|) і вибрати у випадному списку "Входи" (Inputs|) заготовлені дані. У даному завданні природно використовувати той же набір даних, що і при навчанні data1|. За бажання можна встановити прапорець "Задати цілі" (Supply| Targets|). Тоді в результаті прогону додатково будуть розраховані значення помилки. Натиснення кнопки "Прогін се-ти|" (Simulate| Network|) запише результати прогону в змінну, ім'я якої вказане в полі "Виходи" (Outputs|). Тепер можна повернутися в основне вікно NNTool| і, виділивши мишачу вихідну змінну network1|, натиснути кнопку "Перегляд" (View|). Вміст вікна перегляду співпадає із значенням вектора цілей - мережа працює правильно.
Слід відмітити, що мережа створюється такою, що ініціалізувала, тобто значення вагів і зсувів задаються певним чином. Перед кожним наступним досвідом навчання зазвичай початкові умови оновлюються, для чого на вкладці "Ініціалізація" (Initialize|) передбачена функція ініціалізації. Так, якщо потрібно провести декілька незалежних дослідів навчання, ініціалізація вагів і зсувів перед кожним з них здійснюється натисненням кнопки "Ініціалізувати ваги" (Initialize| Weights|).
Повернемося до вкладки "Необов'язкова інформація" (Optional| Info|) (мал. 8). Щоб зрозуміти, якій меті служать представлені тут параметри, необхідно обговорити два поняття: перенавчання і узагальнення.
При виборі нейронної мережі для вирішення конкретного завдання важко передбачити її порядок. Якщо вы-брать| невиправдано великий порядок, мережа може виявитися дуже гнучкою і може представити просту залежність складним чином. Це явище називається перенавчанням. У разі мережі з недостатньою кількістю нейронів, навпаки|, необхідний рівень помилки ніколи не буде досягнутий. Тут в наявності черезмірне| узагальнення.
Для попередження перенавчання застосовується наступна техніка. Дані діляться на дві множини: повчальне (Training| Data|) і контрольне (Validation| Data|). Контрольна множина в навчанні не використовується. На початку роботи помилки мережі на повчальній і контрольній множинах будуть однаковими. У міру того, як мережа навчається, помилка навчання убуває, і, поки навчання зменшує дійсну функцію помилки, помилка на контрольній множині також убуватиме. Якщо ж контрольна помилка перестала убувати або навіть стала рости, це указує на те, що навчання слід закінчити. Зупинка на цьому етапі називається ранньою зупинкою (Early| stopping|).
Таким чином, необхідно провести серію експериментів з різними мережами, перш ніж буде отримана відповідна. При цьому щоб не бути введеним в оману локальними мінімумами функції помилки, слід кілька разів навчати кожну мережу.
Якщо в результаті послідовних кроків навчання і контролю помилка залишається неприпустимо великою, доцільно змінити модель нейронної мережі (наприклад, ускладнити мережу, збільшивши число нейронів, або використовувати мережу іншого вигляду). У такій ситуації рекомендується застосовувати ще одну множину - тестову безліч спостережень (Test| Data|), яка є незалежною вибіркою з вхідних даних. Підсумкова модель тестується на цій множині, що дає додаткову можливість переконатися в достовірності отриманих результатів. Очевидно, щоб зіграти свою роль, тестова множина повинна бути використане тільки один раз. Якщо його використовувати для коректування мережі, воно фактично перетвориться на контрольну множину.
Установка верхнього прапорця (мал. 8) дозволить задати контрольну множину і відповідний вектор цілей (можливо, той же, що при навчанні). Установка нижнього| дозволяє задати тестову множину і вектор цілей для нього.
Навчання мережі можна проводити в різних режимах. У зв'язку з цим, в NNTool| передбачено дві вкладки, що представляють повчальні функції: розглянута раніше вкладка Train| і "Адаптація" (Adapt|). Adapt| вміщає вкладку інформація адаптації (Adap-tion| Info|), на якій містяться поля, схожі по своєму призначенню з полями вкладки Training| Info| і що виконують ті ж функції і вкладку параметри адаптації (Adaption| Parameters|). Остання містить єдине поле "Проходи" (passes|). Значення, вказане в цьому полі, визначає, скільки разів всі вхідні вектори будуть представлені мережі в процесі навчання.