Искусственные нейронные сети




Скачать 1.3 Mb.
страница 8/17
Дата 27.09.2016
Размер 1.3 Mb.
1   ...   4   5   6   7   8   9   10   11   ...   17

Лабораторная работа № 5

Методы и алгоритмы обучения
искусственных нейронных сетей


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

Теоретические сведения


После того как сформирована архитектура нейронной сети, должны быть заданы начальные значения весов и смещений, или иными словами, сеть должна быть инициализирована. Такая процедура выполняется с помощью метода init для объектов класса network. Оператор вызова этого метода имеет вид:

net = init (net).

Перед вызовом этого метода в вычислительной модели сети необходимо задать следующие свойства:



net.initFcn для определения функций, которые будут использоваться для задания начальных матриц весов и весов слоёв, а также начальных векторов смещений;

net.layers {i}. initFcn – для задания функции инициализации i-го слоя;

net.biases{i}.initFcn – для задания начального вектора смещения
i-го слоя;

net.inputWeights{i,j}.initFcn – для задания функции вычисления матрицы весов к слою i от входа j;

net.layerWeight{i,j}.initFcn для задания функции вычисления матрицы весов к слою i от входа j;

net.initParam – для задания параметров функций инициализации.

Способ инициализации сети определяется заданием свойств и net.initFcn net.layers{i}.initFcn. Для сетей с прямой передачей сигналов по умолчанию используется net.initFcn = ‘initlay’, что разрешает для каждого слоя использовать собственные функции инициализации, задаваемые свойством net.layers{i}.initFcn с двумя возможными значениями: initwb и initnw.

Функция initwb позволяет использовать собственные функции инициализации для каждой матрицы весов и для каждого вектора смещений, при этом возможными значениями для свойств net.inputWeights{i,j}.initFcn и net.layerWeight{i,j}.initFcn являются: initzero’, ‘midpoint’, ’randnc’, ’rands, а для свойства net.biases{i}.initFcn – значения initcon’, ‘initzero и rands. Для
сетей без обратных связей с линейными функциями активации
веса обычно инициализируются случайными значениями из интервала [-1 1].

Функция initnw реализуют алгоритм Nguyen-Widrow и применяется для слоёв, использующих сигмоидальные функции активации. Эта функция генерирует начальные веса и смещения для слоя так, чтобы активные области нейронов были распределены равномерно относительно области входов, что обеспечивает минимизацию числа нейронов сети и время обучения.

Другими возможными значениями свойства net.initFcn являются: initcon’, ‘initnw’, ‘initwb’ и ‘initzero’.

Помимо функции initnw следующие функции производят непосредственную инициализацию весов и смещений:



initzero присваивает матрицам весов и векторам смещений нулевые значения;

rands присваивает матрицам весов и векторам смещений случайные значения из диапазона [-1 1];

randnr присваивает матрице весов случайные нормированные строки из диапазона [-1 1];

randnc присваивает матрице весов случайные нормированные столбцы из диапазона [-1 1];

midpoint присваивает элементам вектора смещения начальные равные смещения, зависящие от числа нейронов в слое, и используется вместе с функцией настройки learncon.

Таким образом, задание функций инициализации для вычислительной модели нейронной сети является многоступенчатым и выполняется по следующему алгоритму:



  1. Выбрать для свойства net.initFcn одно из возможных значений: initzero’, ‘initcon’, ‘initnw’, ‘initwb’ или ‘initlay’.

  2. Если выбраны значения initzero’, ‘initcon или initnw, то задание функций инициализации сети завершено.

  3. Если выбрано значение initwb, то переход к шагу 6.

  4. Если выбрано значение initlay, то переходим к слоям и для каждого слоя i свойству net.layers{i}.initFcn необходимо задать одно из возможных значений: initnw или initwb.

  5. Если для i-го слоя выбрано значение initnw, то для этого слоя задание функций инициализации завершено.

  6. Если для всех слоев сети или для какого-то слоя установлено свойство initwb, то для этих слоёв необходимо задать свойства net.biases{i}.initFcn, выбрав его из набора: initzero’, ‘rands или initcon, а также свойства net.layerWeights{i,j}.initFcn, используя следующие значения: initzero’, ‘midpoint’, ‘randnc’, ‘randnr или rands.

Заметим, что с помощью оператора revert(net) можно возвратить значения весов и смещений к ранее установленным значениям.

После инициализации нейронной сети её необходимо обучить решению конкретной прикладной задачи. Для этих целей нужно собрать обучающий набор данных, содержащий интересующие признаки изучаемого объекта, используя имеющийся опыт. Сначала следует включить все признаки, которые, по мнению аналитиков и экспертов, являются существенными; на последующих этапах это множество, вероятно, будет сокращено. Обычно для этих целей используются эвристические правила, которые устанавливают связь между количеством необходимых наблюдений и размером сети. Обычно количество наблюдений на порядок больше числа связей в сети и возрастает по нелинейному закону, так что уже при довольно небольшом числе признаков, например 50, может потребоваться огромное число наблюдений. Эта проблема носит название "проклятие размерности". Для большинства реальных задач бывает достаточно нескольких сотен или тысяч наблюдений.

После того как собран обучающий набор данных для проектируемой сети, производится автоматическая настройка весов и смещений с помощью процедур обучения, которые минимизируют разность между желаемым сигналом и полученным на выходе в результате моделирования сети. Эта разность носит название "ошибки обучения". Используя ошибки обучения для всех имеющихся наблюдений, можно сформировать функцию ошибок или критерий качества обучения. Чаще всего в качестве такого критерия используется сумма квадратов ошибок. Для линейных сетей при этом удаётся найти абсолютный минимум критерия качества, для других сетей достижение такого минимума не гарантируется. Это объясняется тем, что для линейной сети критерий качества, как функция весов и смещения, является параболоидом, а для других сетей – очень сложной поверхностью в N+1-мерном пространстве, где N – число весовых коэффициентов и смещений.

С учётом специфики нейронных сетей для них разработаны специальные алгоритмы обучения. Алгоритмы действуют итеративно, по шагам. Величина шага определяет скорость обучения и регулируется параметром скорости настройки. При большом шаге имеется большая вероятность пропуска абсолютного минимума, при малом шаге может сильно возрасти время обучения. Шаги алгоритма принято называть эпохами или циклами.

На каждом цикле на вход сети последовательно подаются все обучающие наблюдения, выходные значения сравниваются с целевыми значениями и вычисляется функция критерия качества обучения – функция ошибки. Значения функции ошибки, а также её градиента используются для корректировки весов и смещений, после чего все действия повторяются. Процесс обучения прекращается по следующим трём причинам, если:

а) реализовано заданное количество циклов;

б) ошибка достигла заданной величины;

в) ошибка достигла некоторого значения и перестала уменьшаться.

Во всех этих случаях сеть минимизировала ошибку на некотором ограниченном обучающем множестве, а не на множестве реальных входных сигналов при работе модели. Попытки усложнить модель и снизить ошибку на заданном обучающем множестве могут привести к обратному эффекту, когда для реальных данных ошибка становится ещё больше. Эта ситуация называется явлением переобучения нейронной сети.

Для того чтобы выявить эффект переобучения нейронной сети, используется механизм контрольной проверки. С этой целью часть обучающих наблюдений резервируется как контрольные наблюдения и не используется при обучении сети. По мере обучения контрольные наблюдения применяются для независимого контроля результата. Если на некотором этапе ошибка на контрольном множестве перестала убывать, обучение следует прекратить даже в том случае, когда ошибка на обучающем множестве продолжает уменьшаться, чтобы избежать явления переобучения. В этом случае следует уменьшить количество нейронов или слоёв, так как сеть является слишком мощной для решения данной задачи. Если же, наоборот, сеть имеет недостаточную мощность, чтобы воспроизвести зависимость, то явление переобучения скорее всего наблюдаться не будет и обе ошибки – обучения и контроля – не достигнут требуемого уровня.

Таким образом, для отыскания глобального минимума ошибки приходится экспериментировать с большим числом сетей различной конфигурации, обучая каждую из них несколько раз и сравнивая полученные результаты. Главным критерием выбора в этих случаях является контрольная погрешность. При этом применяется правило, согласно которому из двух нейронных сетей с приблизительно равными контрольными погрешностями следует выбирать ту, которая проще.

Необходимость многократных экспериментов ведёт к тому, что контрольное множество начинает играть ключевую роль в выборе нейронной сети, т. е. участвует в процессе обучения. Тем самым его роль как независимого критерия качества модели ослабляется, поскольку при большом числе экспериментов возникает риск переобучения нейронной сети на контрольном множестве. Для того, чтобы гарантировать надёжность выбираемой модели сети, резервируют ещё тестовое множество наблюдений. Итоговая модель тестируется на данных из этого множества, чтобы убедиться, что результаты, достигнутые на обучающем и контрольном множествах, реальны. При этом тестовое множество должно использоваться только один раз, иначе оно превратится в контрольное множество.

Итак, процедура построения нейронной сети состоит из следующих шагов:


  1. Выбрать начальную конфигурацию сети в виде одного слоя с числом нейронов, равным половине общего количества входов и выходов.

  2. Обучить сеть и проверить ее на контрольном множестве, добавив в случае необходимости дополнительные нейроны и промежуточные слои.

  3. Проверить, не переобучена ли сеть. Если имеет место эффект переобучения, то произвести реконфигурацию сети.

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

Другой подход к процедуре обучения сети можно сформулировать, если рассматривать её как процесс, обратный моделированию. В этом случае требуется подобрать такие значения весов и смещений, которые обеспечивали бы нужное соответствие между входами и желаемыми значениями на выходе. Такая процедура обучения носит название процедуры адаптации и достаточно широко применяется для настройки параметров нейронных сетей.

По умолчанию для сетей с прямой передачей сигналов в качестве критерия обучения используется функционал, представляющий собой сумму квадратов ошибок между выходами сети и их целевыми значениями:

,

где Q – объём выборки; q – номер выборки; i – номер выхода;


целевое значение для i-го выхода выборки q; сигнал на i-м выходе при подаче входных сигналов q-й выборки. Целью обучения сети является минимизация этого функционала с помощью изменения весов и смещений.

В настоящее время разработано несколько методов минимизации функционала ошибки на основе известных методов определения экстремумов функций нескольких переменных. Все эти методы можно разделить на три класса:

а) методы нулевого порядка, в которых для нахождения минимума используется только информация о значениях функционала в заданных точках;

б) методы первого порядка, в которых используется градиент функционала ошибки по настраиваемым параметрам, использующий частные производные функционала;

в) методы второго порядка, в которых используются вторые производные функционала.

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

Если используется градиент функционала ошибки, то

,

где и векторы параметров на k-й и k+1-й итерациях;


параметр скорости обучения; градиент функционала, соответствующий k-й итерации.

Если используется сопряжённый градиент функционала, то на первой итерации направление движения выбирают против градиента этой итерации:



.

Для следующих итераций направление выбирают как линейную комбинацию векторов и :



,

а вектор параметров рассчитывают по формуле:



,

Для методов второго порядка расчет параметров на k-м шаге производят по формуле (метод Ньютона):



,

где Hk – матрица вторых частных производных целевой функции (матрица Тессе); gk – вектор градиента на k-й итерации. Вычисление матрицы Тессе требует больших затрат машинного времени, поэтому её заменяют приближенными выражениями (квазиньютоновские алгоритмы).

Градиентными алгоритмами обучения являются:

GD алгоритм градиентного спуска;

GDM алгоритм градиентного спуска с возмущением;

GDA алгоритм градиентного спуска с выбором параметра скорости настройки;

Rprop пороговый алгоритм обратного распространения ошибки;

GDX алгоритм градиентного спуска с возмущением и адаптацией параметра скорости настройки.

Алгоритмами, основанными на использовании метода сопряженных градиентов, являются:



CGF алгоритм ФлетчераРивса;

CGP алгоритм ПолакаРебейры;

CGB алгоритм БиелеПауэлла;

SCG алгоритм Молера.

Квазиньютоновскими алгоритмами являются:



DFGS алгоритм Бройдена, Флетчера, Гольдфарба и Шанно;

OSS одношаговый алгоритм метода секущих плоскостей (алгоритм Баттини);

LM алгоритм ЛевенбергаМарквардта;

BR алгоритм ЛевенбергаМарквардта с регуляризацией по Байесу.

В процессе работы алгоритмов минимизации функционала ошибки часто возникает задача одномерного поиска минимума вдоль заданного направления. Для этих целей используется метод золотого сечения GOL, алгоритм Брента BRE, метод половинного деления и кубической интерполяции HYB, алгоритм Чараламбуса CHA и алгоритм перебора с возвратом BAC.

Практические задания

Задание 1. Адаптировать параметры однослойной статической линейной сети с двумя входами для аппроксимации линейной зависимости вида , выполнив следующие действия:


  1. С помощью конструктора линейного слоя

net = newlin(PR, s, id, lr),

где PR – массив размера Rx2 минимальных и максимальных значений для R векторов входа; s – число нейронов в слое; id – описание линий задержек на входе слоя; lr – параметр скорости настройки, сформировать линейную сеть:



net = newlin([-1 1; -1 1], 1, 0, 0).

  1. Подготовить обучающие последовательности в виде массивов ячеек, используя зависимости и четыре пары значений и (произвольные):

P = {[-1; 1] [-1/3; 1/4] [1/2; 0] [1/6; 2/3]};

T = { -1 -5/12 1 1 }.

  1. Для группировки представления обучающей последовательности преобразовать массивы ячеек в массивы чисел:

P1 = [P{:}], T1 = [T{:}].

  1. Выполнить команды net и gensim(net), проанализировать поля вычислительной модели и структурную схему сети и записать в тетрадь значения полей, определяющих процесс настройки параметров сети (весов и смещений):

net.initFcn – функция для задания начальных матриц весов и векторов смещений;

net.initParam – набор параметров для функции initFcn, ко-
торые можно определить с помощью команды help(net.initFcn), где initFcn – заданная функция инициализации: initcon, initlay, initnw, initnwb, initzero;

net.adaptFcn – функция адаптации нейронной сети, используемая при вызове метода adapt класса network: adaptwb или trains;

net.adaptParam – параметры функции адаптации, определяемые с помощью команды help(net.adaptFcn);

net.trainFcn – функция обучения нейронной сети, используемая при вызове метода train класса network: trainb, trainbfg, traingbr, trainc, traincgb, traincgt, traincgp, trainngd, traingda, traingdm, traingdx, trainlm, trainoss, trainr, trainrp, trainscg;

net.trainParam – параметры функции обучения, определяемые с помощью команды help(net.trainFcn);

net.performFcn – функция оценки качества обучения, используемая при вызове метода train: mae, mse, msereg, sse;

net.performParam – параметры функции оценки качества обучения, определяемые с помощью команды help(net.performFcn);

net.layers{1}.initFcn – функция инициализации параметров слоя: initnw, initwb;

net.layers{1}.transferFcn – функция активации, которая для
линейного слоя должна быть purelin;

net.layers{1}.netInputFcn – функция накопления для слоя:
netprod, netsum;

net.biases{1}.initFcn – функция инициализации вектора смещений: initcon, initzero, rands;

net.biases{1}.lean – индикатор настройки: 0 – с помощью метода adapt, 1 – с помощью метода train;

net.biases{1}.learnFcn – функция настройки вектора смещений: learncon, learngd, learngdm, learnnp, learnwh;

net.biases{1}.learnParam – параметры функции настройки, определяемые с помощью команды help.(net.biases{1}.learnFcn);

net.inputWeights{1, 1}.initFcn – функция инициализации весов входа: initzero, midpoint, randnc, randnr, rands;

net.inputWeights{1,1}.learn – индикатор настройки: 0 – с помощью метода adapt, 1 – с помощью метода train;

net.inputWeights{1,1}.learnFcn – функция настройки весов: learngd, learngdm, learnhd, learnis, learnk, learnlv1, learnlv2,
learnos, learnnp, learnpn, learnsom, learnnwh;

net.inputWeights{1,1}.learnParam – параметры функции настройки, определяемые с помощью команды help(net.inputWeights {1,1}. learnParam);

net.inputWeights{1,1}.weightFcn – функция для вычисления взвешенных входов для слоя: dist, dotprod, mandist,negdist, normprod;

для многослойных сетей параметры net.inputWeights{i,j}, связанные с обучением такие, как initFcn, learn, learnFcn, learnParam, weightFcn, имеют тот же смысл и могут принимать такие же значения, что и соответствующие параметры для net.inputWeights{1,1}.



  1. Выполнить один цикл адаптации сети с нулевым параметром скорости настройки:

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

net1.IW{1,1} % – матрица весов после адаптации;

a % – четыре значения выхода;

e % – четыре значения ошибки.

  1. Инициализировать нулями веса входов и смещений и задать параметры скорости настройки для них соответственно 0.2 и 0:

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

net.b{1} = 0;

net.inputWeights{1,1}.learnParm.lr = 0.2;

net.biases{1}.learnParam.lr =0.

Нулевое значение параметра скорости настройки для смещения обусловлено тем, что заданная зависимость не имеет постоянной составляющей.



  1. Выполнить один цикл адаптации с заданным значением параметра скорости адаптации:

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

net1.IW{1,1} % – значения весов в сети net1 изменились;

a % – четыре значения выхода сети net1;

e % – четыре значения ошибки сети net1.

  1. Выполнить адаптацию сети net с помощью 30 циклов:

for i = 1:30,

[net, a{i}, e{i}] = adapt(net, P, T);

W(i, :) = net.IW{1,1};

end;

cell2mat(a{30}) % – значения выхода на последнем цикле;

cell2mat(e{30}) % – значение ошибки на последнем цикле;

W(30, :) % – веса после 30 циклов;

mse(cell2mat(e{30}) % – функция ошибок: 0.0017176.

Здесь cell2mat – функция преобразования массива числовых ячеек в массив чисел, а mseфункция среднеквадратичной ошибки.



  1. Построить графики зависимости значений выходов сети и весовых коэффициентов, а также среднеквадратичной ошибки от числа циклов, используя функцию subplot для деления экрана на окна:

subplot(3,1,1)

for i = 1:1:30, plot(i, cell2mat(a{i}), ′k′),

hold on

end;

xlabel(′′), ylabel(′Выходы a(i)′)

grid

subplot(3,1,2)

plot(0:30, [[0 0]; W], ′k′)

xlabel(′′), ylabel(′Веса входов W(i) ′)

grid

subplot(3,1,3)

for i = 1:30, E(i) = mse(e{i}); end

semilogy(1:30, E, ′+k′)

xlabel(′Циклы′), ylabel(′Ошибка′), grid

  1. Адаптировать рассматриваемую модель статической сети для аппроксимации той же зависимости и с теми же требованиями к погрешности, используя групповой способ представления обучающей последовательности:

P = [-1 -1/3 1/2 1/6; 1 1/4 0 2/3];

T = [-1 -5/12 1 1];

net = newlin([-1 1; -1 1], 1, 0, 0, 0.2);

net = IW{1} = [0 0]; % – присваивание начальных весов;

net.l{1} = 0; % – присваивание начального смещения;

net.inputWeughts{1,1}.learnParam.lr = 0.2;

EE = 10;

i = 1; % – для подсчета количества циклов;

while EE > 0.0017176

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

W(i, :) = net .IW{1,1};

EE = mse(e{i});

ee(i) = EE;

i = i + 1;

end;

  1. Проанализировать результаты и сделать их сравнение с результатами для последовательного представления обучающей последовательности:

W(63, :)

cell2mat(a{63})

EE = mse(e{63})

mse(e{1})

  1. Для полученных результатов построить графики и сравнить их с предыдущими:

subplot(3,1,1)

for i = 1:1:63, plot(i, cell2mat(a{i}), ′k′),

hold on

end;

xlabel(′′), ylabel(′Выходы a(i′′), grid

subplot(3,1,2)

plot(0:63, [[0 0]; W], ′k′)

xlabel(′′), ylabel(′Веса входов W(i)′), grid

subplot(3,1,3)

semilogy(1:63, ee, ′+k′)

xlabel(′Циклы′), ylabel(′Ошибка′), grid

Задание 2. Адаптировать параметры однослойной динамической сети с одним входом и одной линией задержки для аппроксимации рекурентного соотношения , выполнив следую­щие действия:

  1. Так как для динамических сетей групповой способ представления обучающего множества не используется, подготовить данные для последовательной адаптации в виде массивов ячеек значений входа и цели:

P = {-1/2 1/3 1/5 1/4); % – значения входа p(t);

T = {-1 1/6 11/15 7/10}; % – значения цели y(t).

  1. Выполнить адаптацию и построение графиков

net = newlin([-1 1], 1, [0 1], 0.5); % – help(newlin);

Pi = {0}; % – начальное условие для линии задержки;

net.IW{1} = [0 0]; % – веса для основного и задержанного входов;

net.biasConnect = 0; % – значение смещения;

EE = 10; i = 1;

while EE > 0.0001

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

W(i, :) = net.IW{1,1};

EE = mse(e{i});

ee(i) = EE;

i = i +1;

end

W(22, :)

a{22}

EE

subplot(3,1,1)

for i = 1:1:22, plot(i, cell2mat(a{i}), ′k′)

hold on

end;

xlabel(′′), ylabel(′Выходы a(i)′), grid

subplot(3,1,2)

plot(0:22,[[0 0]; W], ′k′)

xlabel(′′), ylabel(‘Веса входов W(i)′), grid

subplot(3,1,3)

semilogy(1:22, ee, ′+k′)

xlabel(′Циклы ′), ylabel(′Ошибка′)grid

Задание 3. Обучить нейронную сеть, для которой модель и зависимость выхода от входов приведены в задании 1, выполнив команды и используя последовательный и групповой способы представления обучающей последовательности:

а) для последовательного способа:



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

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

net.b{1} = 0;

P = {[-1 1][-1/3; 1/4][1/2 0][1/6;2/3]};

T = {-1 –5/12 1 1}

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

net.biases{1}.learnParam.lr = 0;

net.trainParam.epochs = 30;

net1=train (net,P,T);

W = net1.IW{1} % – параметры после обучения:

Y = sim(net1,p)

EE = mse([Y{:}] – [T{:}]) % – ошибка 1.3817*e-003

б) для группового способа:



P = [-1 -1/3; 1/2 1/6; 1 1/4 0 2/3];

T = [-1 –5/12 1 1]

net1=train (net,P,T);

W = net1.IW{1} % – параметры после обучения:

Y = sim(net1,P)

EE = mse(y-T) % – та же ошибка 1.3817*e-003

Задание 4. Обучить динамическую линейную сеть, рассмотренную во 2-м задании и сравнить результаты, выполнив следующие команды:

net = newlin([-1 1] , 1,[0 1], 0.5)

Pi = {0} % – начальное условие линии задержки;

net.IW{1} = [0 0] % – начальные веса входов;

net.biasConnect = 0; % – смещение отсутствует;

net.trainParam.epochs = 22;

P = {-1/2 1/3 1/5 1/4}; % – вектор входа;

T = {-1 1/6 11/15 7/10}; % – вектор цели;

net1 = train(net, P, T, Pi); % – обучение сети;

W = net1.IW{1} % – веса после обучения сети;

Y = sim(net1, P); % – моделирование новой сети;

EE = mse( [Y{:}] - [T{:}] ) % – ошибка = 3.6514е-005.

Задание 5. Создать и инициализировать трёхслойную сеть с двумя входами для последующего обучения сети методом обратного распространения ошибки, выполнив следующие действия:

  1. Создать шаблон сети:

net5 = network(2, ... % – число входов;

3, ... % – число слоёв сети;

[1; 1; 1], ... % – связь смещений;

[1 1 ; 0 0; 0 0], ... % – связь входов;

[ 0 0 0 ; 1 0 0 ; 0 1 0], ... % – связь слоёв;

[0 0 1], ... % – связь выходов;

[0 0 1] ); % – связь целей.

  1. Настроить параметры сети для инициализации с помощью алгоритма НгуенаВидроу для обеспечения возможности использования метода обратного распространения:

net5.initFcn = ′initlay′; % – для сети;

net5.layers{1}.initFcn = ′initnw′; % – для 1-го слоя;

net5.layers{2}.initFcn = ′initnw′; % – для 2-го слоя;

net5.layers{3}.initFcn = ′initnw′; % – для 3-го слоя.

  1. Проинициализировать сеть для её последующего обучения методом обратного распространения ошибки:

net5 = init(net5);

net5.IW{1, 1} % – матрица весов для 1-го входа;

net5.IW{1, 2} % – матрица весов для 2-го входа;

net5.LW{2, 1} % – матрица весов для 2-го слоя;

net5.LW{3, 2} % – матрица весов для 3-го слоя;

net5.b{1} % – матрица смещения для 1-го слоя;

net5.b{2} % – матрица смещения для 2-го слоя;

net5.b{3} % – матрица смещения для 3-го слоя.

  1. Промоделировать сеть с начальными значениями весов и смещений:

P = [0.5 1 ; 1 0.5]; % – значения входных векторов;

Y = sim(net5) % – моделирование сети.

Задание 6. Создать и инициализировать трёхслойную сеть с двумя входами для последующего обучения различными методами, выполнив следующие действия:

  1. Создать шаблон сети, воспользовавшись шаблоном net5:

net6 = net5; % – создание новой копии сети;

net6 = revert(net5); % – возврат к настройке параметров по умолчанию.

  1. Настроить параметры сети с помощью функции инициализации нулевых значений весов и смещений initzero:

net6.initFcn = ′initlay′;

net6.layers{1}.initFcn = ′initnw′;

net6.layers{2}.initFcn = ′initnw′;

net6.layers{3}.initFcn = ′initnw′;

net6.inputWeights{1 ,1}.initFcn = ′initzero′;

net6.inputWeights{1 ,2}.initFcn = ′initzero′;

net6.layerWeights{2 ,1}.initFcn = ′initzero′;

net6.layerWeights{3 ,2}.initFcn = ′initzero′;

net6.biases{1}.initFcn = ′initzero′;

net6.biases{2}.initFcn = ′initzero′;

net6.biases{3}.initFcn = ′initzero′;

net6.init(net6); % – инициализация сети.

  1. Выдать на экран матрицы весов и смещения, используя команды 3-го пункта 5-го задания.

  2. Промоделировать сеть и возвратить её к исходным значениям весов и смещений:

Ynet6 = sim(net6);

net6 = revert(net6).

Задание 7. Создать и инициализировать трёхслойную сеть с двумя входами, используя следующие функции инициализации:

а) rands – для задания случайных весов и смещений.

б) randnc для задания случайной матрицы с нормированными столбцами;

в) randnv для задания случайной матрицы с нормированными строками;

г) initcon – для задания равных смещений;

д) midpoint для задания матрицы средних значений;

Для создания и инициализации сети использовать команды 6-го задания, заменяя в них функцию initzero на рассматриваемые функции инициализации, а сеть net6 – на сеть net7.
Задание 8. Создать двухслойную нейронную сеть с прямой передачей сигнала, одним входом, двумя нейронами в первом слое и одним нейроном во втором слое, настроить сеть для обучения с использованием алгоритма градиентного спуска GD, обучить эту сеть и путём её моделирования оценить качество обучения. Порядок выполнения задания следующий:


  1. Создать нейронную сеть с прямой передачей сигнала:

net8 = newff([0 5], …. % – диапазоны значений входа;

[2 1], ….. % – количество нейронов в слоях;

{′tansig′, % – функция активации для 1-го слоя;

′logsig′} % – функция активации для 2-го слоя;

′traingd′); % – имя функции обучения.

  1. Убедиться, что веса и смещения каждого слоя инициализированы с помощью алгоритма Нгуена–Видроу:

net8.initFcn % – должно быть ′initlay′;

net8.layers{1}.initFcn % – должно быть ′initnw′;

net8.layers{2}.initFcn % – должно быть ′initnw′;

net8.IW{1,1} % – вес входа;

net8.LW{2,1} % – веса для 2-го слоя.

net8.b{1}

net8.b{2}

  1. Задать обучающие последовательности входов и целей T:

P = [0 1 2 3 4 5]; % – вектор входа;

T = [0 0 0 1 1 1]; % – вектор целей.

  1. Выдать на экран параметры обучающей функции traingd и их значений по умолчанию:

info = traingd(′pdefaults′)

info =

epochs: 100 % – максимальное количество циклов
обучения;


show: 25 % – интервал вывода данных;

goal: 0 % – предельное значение критерия обучения;

time: Inf % – максимальное время обучения;

min_grad: 1.0e-006 % – максимальное значение градиента

критерия % качества;

max_fail: 5 % – максимально допустимый уровень

% превышения ошибки контрольного

% подмножества по сравнению с обучающим.

Процедура обучения прекратится, когда будет выполнено одно из следующих условий:

а) значение функции качества стало меньше предельного goal;

б) градиент критерия качества стал меньше значения min_grad;

в) достигнуто предельное значение циклов обучения epochs;

г) превышено максимальное время, отпущенное на обучение time;

д) ошибка контрольного подмножества превысила ошибку обучающего более чем в max_fail раз.

Функция traingd предполагает, что функции взвешивания


dotprod, накопления netsum и активации transig или rogsig имеют производные. Для вычисления производных критерия качества обучения perf по переменным веса и смещения используется метод обратного распространения. В соответствии с методом градиентного спуска вектор настраиваемых переменных получает следующее приращение:

,

где tr – параметр скорости настройки, равный по умолчанию 0,01. Функцией одновременного поиска минимума вдоль заданного направления в данной сети является функция srchbac.



  1. Обучить рассматриваемую сеть:

net8.trainParam.epochs = 500;

net8.trainParam.90al = 0.01;

[net8, TR] = train(net8, P, T);

TR % – характеристики процедуры обучения.

  1. Произвести моделирование сети и оценить качество ее обучения:

Ynet8 = sim(net8, P) % – целевые значения.

Задание 9. Повторить 8-е задание для следующих функций обучения: traingda, traingdm, traingdx, trainrp, traincgf, traincgp, traincgb, trainscg, trainbfg, trainoss, trainlm. Сравнить полученные результаты.

Задание 10. Создать и обучить сеть для аппроксимации синусоидальной функции, зашумленной нормально распределенным шумом, выполнив следующие действия:

  1. Задать обучающие последовательности:

P = [-1: .05: 1];

T = sin[2*pi*P] + 0.1*randn(size(P));

  1. Сформировать сеть с прямой передачей сигнала:

net10 = newff([-1 1], [20 1], {′transig′, ′purelin′}, … ′trainbr′);

  1. Настроить сеть:

net10.trainParam.epochs = 50;

net10.trainParam.show = 10; % для отображения.

  1. Обучить сеть и построить график аппроксимируемой функции и график выхода сети:

net10 = train(net, P, T);

Y = sim(net, P);

plot(P, Y, P, T, ‘+’) % – два графика.

  1. Изменяя количество нейронов в первом слое, исследовать качество аппроксимации.

Задание 11. Создать сеть и произвести ее последовательную адаптацию, выполнив следующие команды:

net11 = newff([-1 2; 0 5], [3, 1], … {′tansig′, ′purelin′}, ′traingd′);

net11.inputWeights{1, 1}.learnFcn = ′learngd′;

net11.layerWeights{2, 1}.learnFcn = ′learngd′;

net11.biases{1}.learnFcn = ′learngd′;

net11.biases{2}.learnFcn = ′learngd′;

net11.layerWeights{2, 1}.learnParam.lr = 0.2;

P = [-1 -1 2 2; 0 5 0 5];

T = [-1 -1 1 1];

P = num2cell(P,1);

T = num2cell(T,1);

net11.adaptParam.passes = 50;

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

a = sim(net11, P) % [-1.02] [-0.99624] [1.0279] [1.0021];

mse(e) % – должно быть 5,5909е-004.

Задание 12. Создать сеть и произвести ее последовательную адаптацию, используя следующие функции настройки весов и смещений: learngdm, learnlv1, learnlv2, learnk, learncon, learnis, learnos, learnsom, learnh, learnhd. Сравнить алгоритм настройки для одной и той же обучающей последовательности.

Задание 13. Создать, обучить и апробировать многослойную нейронную сеть с прямой передачей сигнала для принятия решения о зачислении в высшее учебное заведение абитуриентов, сдавших вступительные экзамены по математике, физике и русскому языку. Правила приема таковы:

  1. Проходной балл для абитуриентов, не имеющих льгот, должен быть равен 11;

  2. Удовлетворительные оценки по математике и физике для этой категории абитуриентов недопустимы;

  3. Абитуриенты, имеющие льготы, зачисляются при любых положительных оценках по всем трем предметам.

Для обучения сети следует использовать все изученные методы адаптации и обучения и провести анализ их эффективности. Следует также определить минимальное количество слоев и нейронов, обеспечивающее удовлетворительное решение поставленной задачи. Для формирования обучающего, контрольного и тестового множества построить дискретную имитационную модель, используя инструментальный пакет Simulink.
1   ...   4   5   6   7   8   9   10   11   ...   17


База данных защищена авторским правом ©infoeto.ru 2022
обратиться к администрации
Как написать курсовую работу | Как написать хороший реферат
    Главная страница