Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РК_19_03_2008.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
2.57 Mб
Скачать

Динамічні та статичні мережі

Існує два типи нейронних мереж залежно від формату представлення вхідних даних: статичні і динамічні. Статичні мережі сприймають вхідний сигнал як вектор рівноправних елементів (тобто всі елементи сприймаються одночасно, а не в певній часовій послідовності), і динамічні мережі сприймають вхідний сигнал як елементи, що подаються послідовно у часі. Для рівноправних векторів порядок елементів не є важливим, а для послідовних у часі векторів порядок відіграє важливу роль.

Методи навчання нейронних мереж

Існує два методи навчання нейронних мереж. При послідовному (або інтерактивному) методі навчання ваги та зміщення мережі змінюються кожен раз після того, як на вхід було подано сигнал. При пакетному методі навчання ваги та зміщення оновлюються та змінюються тільки після того, як на вхід було подано всі сигнали.

Послідовний метод може бути застосований як до статичних, так і для динамічних мереж, хоча звичайно він використовується для останніх, наприклад при реалізації адаптивних фільтрів.

Порядок виконання завдання

1. Рекомендується попередньо розібратися з наведеними теоретичними відомостями.

2. Відпрацюйте приклад 1. Результати моделювання нейронної мережі занесіть у звіт.

Приклад 1. Статична мережа. Необхідно змоделювати просту залежність моменту М в маніпуляторі від ваги навантаження В (ваговий коефіцієнт = 2) і сили тертя F (коефіцієнт тертя = 1):

М = 2*В + 1*F. (1)

Розв’язок. Вказану залежність можна змоделювати статичною мережею (без зворотного зв’язку та запізнень). Представлення вхідних даних не залежить від часу, а тому вхідний вектор може бути представлений як вектор рівноправних елементів. Також цей вектор буде мати тільки два елементи [В F]. Рекомендується використати наступну мережу для розв’язання (граф. зображення показане на рис. 4.29).

Рис. 4.29. Лінійна нейронна мережа

Для завдання такої мережі необхідно записати такий код.

net = newlin([1 3;1 3],1);%перший параметр у дужках

%означає, що було встановлено діапазон зміни для

%вхідного вектору (навантаження змінюється від

%1 до 3 кг, а сила тертя від 1 до 3 N);

%другий параметр задає, що вихідний вектор має тільки

%один елемент, М

Ми можемо присвоїти матрицю ваг W = [2 1] і зміщення b = [0] згідно рівнянню (1). Код, який це робить, представлено нижче:

net.IW{1,1} = [2 1]; net.b{1} = 0;

Припустимо, що вхідні дані складаються 3 4 рівноправних векторів: .

Ми можемо записати їх як одну матрицю:

P = [1 2 2 3; 2 1 3 1]; %Тепер можна промоделювати роботу мережі:

A = sim(net,P); %результати моделювання з командного вікна Matlab % мають бути у звіті

Єдина матриця рівноправних векторів поступає на вхід мережі, а на виході також отримуємо єдину матрицю рівноправних векторів. Результат такий самий, якби було чотири мережі, що працюють паралельно, а кожна з них отримувала б один вхідний вектор і видавала на виході так само один вихідний. Порядок вхідних векторів не важливий, оскільки вони між собою не пов’язані.

3. Відпрацюйте приклад 2. Результати (програмний код в Matlab та A=sim(net,P) ) занесіть у звіт.

Приклад 2. Динамічна мережа. Необхідно змоделювати таку залежність як a(t) = w1,1p(t) + w1,2p(t – 1).

Розв’язок. Як ми бачимо, залежність містить запізнення у часі (t – 1), а отже мережа, що її моделює, також повинна мати запізнення. Тепер вхідний вектор мережі має бути впорядкований за часом. Використайте наступну мережу для розв’язання (рис. 4.30).

Рис. 4.30. Лінійна нейронна мережа із

динамічним запізненням

Для реалізації такої мережі необхідно записати такий код.

net = newlin([1 4],1,[0 1]);

% остання складова задає запізнення для другого входу (проте у нас

% немає другого входу, є тільки запізнений перший)

net.biasConnect = 0;

Задаємо матрицю ваг наступним чином:

W = [1 2].

Запишіть відповідний програмний код у Matlab, який повинен бути у звіті.

Припустимо, що вхідна послідовність наступна: p1 = [1], p2 = [2], p3 = [3], p4 = [4]. Послідовні у часі входи представимо у вигляді елементів структурного масиву:

P = {1 2 3 4}; % Тепер можна моделювати роботу мережі:

A = sim(net,P) % результати моделювання з командного вікна Matlab мають бути у звіті

Поясніть як ці результати були отримані згідно графічного представлення мережі

На вході мережі були елементи структурного масиву, а на виході також маємо масив структур, який містить часову послідовність елементів. Зауважте, що порядок елементів має значення. В нашому випадку, поточний вихід отримується як множення ваги w1,1 на перший вхід і множення ваги w1,2 на його попереднє значення та сумування результатів. Якщо змінити порядок входів, то результат звичайно буде іншим.

4. Відпрацюйте приклад 3. У звіт необхідно занести: матрицю ваг (отриману в результаті навчання та потрібну згідно завдання), а також програмний код в Matlab, що підвищує рівень відповідності між заданої та отриманою матрицями ваг.

Приклад 3. Послідовне навчання для статичних мереж. Розглянемо знову статичну мережу з першого прикладу. Для того, щоб її навчити, будемо використовувати функцію adapt, а входи і цільовий результат (вихід) представимо у вигляді рівноправної послідовності.

Наприклад необхідно натренувати мережу для реалізації лінійної функції наступного вигляду:

t = 2p1 + p2. (2)

Як і в попередньому прикладі входи будуть:

,

а цільовий вихід є таким

t1 = [4], t2 = [5], t3 = [7], t4 = [7].

Нашою задачею є знайти параметри лінійної функції (2), тобто матрицю ваг W = [2 1].

Розв’язок. Передусім створимо мережу з нульовими вхідними вагами та зміщеннями. Будемо задавати швидкість навчання як нуля (спочатку) для того, щоб детальніше розібратися в послідовному навчанні.

net = newlin([1 3;1 3],1,0,0); net.IW{1,1} = [0 0]; net.b{1} = 0;

Для послідовного навчання представимо входи і цільовий вихід як:

P = {[1;2] [2;1] [2;3] [3;1]}; T = {4 5 7 7};

Як ми бачимо, послідовність була представлена у вигляді структурного масиву, а не матриці, як раніше. Це тому, що ми використовуємо функцію adapt, і для послідовного навчання необхідно оновлювати (у часі!) ваги та зміщення після надходження нової комбінації вхід-результат. Якщо б ми представили входи у вигляді матриці рівноправних векторів, тоді ваги і зміщення змінилися тільки після обробки всіх комбінацій вхід-результат (тобто режим пакетного навчання).

Тепер запишемо команду для послідовного тренування мережі.

[net,a,e,pf] = adapt(net,P,T);

a

e

Виходи мережі залишились нулями, оскільки швидкість навчання є нульовою, а тому ваги не оновлюються. Помилки будуть дорівнювати самим цільовим виходам:

a = [0] [0] [0] [0]

e = [4] [5] [7] [7]

Якщо встановити швидкість навчання як 0.1, то можна побачити як змінюються помилки з прибуттям кожної нової комбінації вхід-результат:

net.inputWeights{1,1}.learnParam.lr=0.1;

net.biases{1,1}.learnParam.lr=0.1;

[net,a,e,pf] = adapt(net,P,T);

a = [0] [2] [6.0] [5.8]

e = [4] [3] [1.0] [1.2]

display('weight matrix = '),net.IW{1}

Перший вихід буде таким самим, оскільки зміни ще не відбулися. Другий вихід вже зміниться, оскільки оновляться ваги. Надалі ваги продовжуються змінюватися, і обчислюється помилка для кожного з них. При правильному виборі мережі та відповідній швидкості навчання помилка знаходження ваг та зміщення нарешті стане нульової або близькою до нуля.

Занесіть у звіт отримані результати для матриці ваг W та спробуйте змінити параметри навчання або додати декілька навчальних прикладів для досягнення прийнятної точності (підказка: спробуйте функцію net.adaptParam.passes).

5. Відпрацюйте приклад 4. У звіт необхідно занести: матрицю ваг (отриману в результаті навчання та потрібну згідно завдання), а також програмний код в Matlab, що підвищує рівень відповідності між заданої та отриманою матрицями ваг.

Приклад 4. Послідовне навчання динамічної мережі. Можна також тренувати динамічну мережу послідовно. Насправді, це є більш природнішим. Тепер створимо лінійну мережу з одним елементом запізненням на вході, таку, як було використано у попередньому прикладі. Будемо ініціалізувати ваги як нульові, а швидкість навчання встановимо 0.1:

net = newlin([1 4],1,[0 1],0.1);

net.IW{1,1} = [0 0];

net.biasConnect = 0;

Для тренування такої мережі послідовним методом необхідно представити входи та цільові виходи як елементи структурного масиву.

Pi = {1};%початкові умови

P = {2 3 4};

T = {3 5 7};

Тут будемо використовувати функцію adapt.

[net,a,e,pf] = adapt(net,P,T,Pi);

a = [0] [2.4] [ 7.98]

e = [3] [2.6] [-0.98]

Перший вихід дорівнює нулю, оскільки ваги не встигли ще оновитися. Потім ваги змінюються з кожним кроком.

Занесіть у звіт отримані результати для матриці ваг W та спробуйте змінити параметри навчання або додати декілька навчальних прикладів для досягнення прийнятної точності (підказка: спробуйте функцію net.adaptParam.passes).

6. Відпрацюйте приклад 5. У звіт необхідно занести: матрицю ваг (отриману в результаті навчання та потрібну згідно завдання), а також програмний код в Matlab, що підвищує рівень відповідності між заданої та отриманою матрицями ваг.

Приклад 5. Пакетне навчання статичної мережі. Пакетне тренування, при якому ваги та зміщення оновлюються тільки після того, як були отримані всі комбінації вхід-цільовий вихід, може бути застосоване як для статичних, так і для динамічних мереж.

Для пакетного тренування також можна використовувати або функцію adapt, або функцію train, хоча остання більш підходить, оскільки застосовує потужніші алгоритми навчання. Послідовне навчання використовує тільки функцію adapt; функція train може бути застосована тільки для пакетного навчання.

Будемо використовувати статичну мережу з попереднього прикладу. Швидкість навчання становимо 0.1.

net = newlin([-1 1;-1 1],1,0,0.1); net.IW{1,1} = [0 0]; net.b{1} = 0;

Для пакетного тренування статичної мережі з функцією adapt, вхідні вектори повинні бути представлені у вигляді матриці рівноправних векторів.

P = [1 2 2 3; 2 1 3 1]; T = [4 5 7 7];

Коли ми записуємо функцію adapt, вона визиває функцію trains (яка є функцією навчання для лінійних мереж, встановлена за умовчанням) і функцію learnwh (яка є функцією навчання для ваг та зміщення, встановлена за умовчанням).

[net,a,e,pf] = adapt(net,P,T);

a = 0 0 0 0

e = 4 5 7 7

Зауважте, що виходи мережі є нулями, оскільки ваги не оновлюються, поки всі тренувальні приклади не будуть представлені. Результати будуть такими:

>net.IW{1,1}

  ans = 4.9000 4.1000

>net.b{1}

  ans =

2.3000

Занесіть у звіт отримані результати для матриці ваг W та спробуйте змінити параметри навчання або додати декілька навчальних прикладів для досягнення прийнятної точності (підказка: спробуйте функцію net.adaptParam.passes).

Результат відрізняється від того, який ми отримали при одному проходженні функції adapt для послідовного навчання.

Тепер виконаємо таке ж пакетне навчання, але використовуючи функцію train.

Створимо мережу таким самим чином.

net = newlin([-1 1;-1 1],1,0,0.1); net.IW{1,1} = [0 0]; net.b{1} = 0;

Для цього випадку вхідні вектори можуть бути представлені у вигляді матриці рівноправних векторів, або у вигляді структурного масиву послідовних векторів. Функція train перетворює будь-який структурний масив послідовних векторів в матрицю рівноправних векторів. Це відбувається тому, що мережа є статичною, а ще тому, що функція train завжди працює в пакетному режимі. Рівноправні вектори частіше використовуються, оскільки вони реалізовані у Matlab ефективніше.

P = [1 2 2 3; 2 1 3 1]; T = [4 5 7 7];

Тепер можна тренувати мережу. Будемо її тренувати тільки для одного періоду (epoch) – для функції adapt ми використовували одне проходження.

net.inputWeights{1,1}.learnParam.lr = 0.1;

net.biases{1}.learnParam.lr = 0.1; net.trainParam.epochs = 1;

net = train(net,P,T);

Результати знаходження ваг після одного періоду тренування будуть такими:

>net.IW{1,1}

  ans = 4.9000 4.1000

>net.b{1}

  ans = 2.3000

Занесіть у звіт отримані результати для матриці ваг W та спробуйте змінити параметри навчання або додати декілька навчальних прикладів для досягнення прийнятної точності (підказка: спробуйте функцію net.trainParam.epochs).

Такий самий результат був при тренуванні в пакетному режимі функцією adapt.

7. Відпрацюйте приклад 6. У звіт необхідно занести: матрицю ваг (отриману в результаті навчання та потрібну згідно завдання), а також програмний код в Matlab, що підвищує рівень відповідності між заданої та отриманою матрицями ваг.

Приклад 6. Пакетне тренування динамічної мережі. Для динамічних мереж пакетне тренування виконується звичайно тільки функцією train, особливо якщо існує тільки одна навчальна послідовність. Розглянемо лінійну мережу із запізненням. Встановимо швидкість навчання 0.02. (При використанні алгоритму градієнтного спуску рекомендується використовувати менші швидкості навчання)

net = newlin([-1 1],1,[0 1],0.02); net.IW{1,1}=[0 0];

net.biasConnect=0; net.trainParam.epochs = 1;

Pi = {1}; P = {2 3 4}; T = {3 5 6};

Мережа моделюється в послідовному режимі, тому що входи є послідовностями, але ваги оновлюються в пакетному режимі.

net=train(net,P,T,Pi);

Ваги після одного періоду тренування

>net.IW{1,1}

ans = 0.9000 0.6200

Вони відрізняються від тих, що були отримані при послідовному тренуванні.

Занесіть у звіт отримані результати для матриці ваг W та спробуйте змінити параметри навчання або додати декілька навчальних прикладів для досягнення прийнятної точності (підказка: спробуйте функцію net.trainParam.epochs).

8. Змоделюйте логічні функції AND і OR з допомогою нейронної мережі. Програмний код в Matlab та результати навчання та моделювання мають бути занесені у звіт.

підказка: використайте функцію newp (створює нейронну мережу з передатною функцією hardlim таким самим чином, як в розглянутих прикладах).

9. Необхідно ідентифікувати параметри лінійної функції типу: z = a*x + b*y +bias. Експериментальні дані наведені в табл. 4.2. Програмний код в Matlab та результати навчання та моделювання мають бути занесені у звіт.

Таблиця 4.2

Вихідні дані для завдання

z

7

10

13

16

19

22

x

0

1

2

3

4

5

y

5

4

3

2

1

0