Слишком Большая скорость обучения

Линейный нейрон обучен найти минимальное ошибочное решение для простой проблемы. Нейрон обучен со скоростью обучения, больше, чем та, предложенная MAXLINLR.

X задает два входных набора с 1 элементом (вектор-столбцы). T задает сопоставленные цели с 1 элементом (вектор-столбцы).

X = [+1.0 -1.2];
T = [+0.5 +1.0];

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

w_range = -2:0.4:2;
b_range = -2:0.4:2;
ES = errsurf(X,T,w_range,b_range,'purelin');
plotes(w_range,b_range,ES);

MAXLINLR находит самую быструю устойчивую скорость обучения для того, чтобы обучить линейную сеть. NEWLIN создает линейный нейрон. Чтобы видеть, что происходит, когда скорость обучения является слишком большой, увеличьте скорость обучения до 225% рекомендуемого значения. NEWLIN берет эти аргументы: 1) матрица Rx2 min и макс. значений для элементов входа R, 2) Число элементов в выходном векторе, 3) Введите вектор задержки и 4) Скорость обучения.

maxlr = maxlinlr(X,'bias');
net = newlin([-2 2],1,[0],maxlr*2.25);

Замените учебные параметры по умолчанию путем определения максимального номера эпох. Это гарантирует, что обучение остановится:

net.trainParam.epochs = 20;

Чтобы показать путь обучения, мы обучим только одну эпоху за один раз и вызовем PLOTEP каждая эпоха (код, не показанный здесь). График показывает историю обучения. Каждая точка представляет эпоху, и синие линии показывают каждое изменение, внесенное правилом изучения (Видроу-Хофф по умолчанию).

%[net,tr] = train(net,X,T);                                                    
net.trainParam.epochs = 1;
net.trainParam.show = NaN;
h=plotep(net.IW{1},net.b{1},mse(T-net(X)));     
[net,tr] = train(net,X,T);                                                    
r = tr;
epoch = 1;
while epoch < 20
   epoch = epoch+1;
   [net,tr] = train(net,X,T);
   if length(tr.epoch) > 1
      h = plotep(net.IW{1,1},net.b{1},tr.perf(2),h);
      r.epoch=[r.epoch epoch]; 
      r.perf=[r.perf tr.perf(2)];
      r.vperf=[r.vperf NaN];
      r.tperf=[r.tperf NaN];
   else
      break
   end
end

tr=r;

Обучать функциональные выходные параметры обучивший сеть и история производительности обучения (TR). Здесь ошибки построены относительно учебных эпох.

plotperform(tr);

Мы можем теперь использовать SIM, чтобы протестировать associator с одними из исходных входных параметров,-1.2, и видеть, возвращает ли это цель, 1.0. Результат не очень близко к 0,5! Это вызвано тем, что сеть была обучена со слишком большой скоростью обучения.

x = -1.2;
y = net(x)
y = 2.0913