Форум программистов, компьютерный форум, киберфорум
ИИ, нейросети, LLM, ML, Data Science, ИИ-агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/88: Рейтинг темы: голосов - 88, средняя оценка - 4.66
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200

Простейшая нейронная сеть для аппроксимации параболы

08.05.2019, 16:18. Показов 20062. Ответов 229
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пробую написать свою первую нс из двух нейронов. На выходе простой сумматор.
http://images.vfl.ru/ii/155731... 2257_m.png
Задаю значения х = [0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9] и по ним получаю y = (2*x-1)^2 + 0.1 см график ниже
http://images.vfl.ru/ii/155731... 2396_m.png
у - это зеленый точки (соединенные просто для понимания) синими линиями.
y = [0,74 0,46 0,26 0,14 0,1 0,14 0,26 0,46 0,74]. Исходные значения х и y задаю в квадрате 0-1 чтобы избавиться от нужды в нормализации.
Голубая линия - это выход сети (его обозначаю в дальнейшем y1), который получаю так:
сначала задаю случайные веса от -0.5 до 0.5: w = rand(6,1)-0.5; и по ним вычисляю выход сети: y1 = ynet(x, w);
(код на матлабе специально писал предельно просто, развернуто, без матриц)
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function y = ynet(x, w) % ф-ция вычисляет выход сети
for i = 1:numel(x)
  y(i,1) = forward(x(i), w);
end
end
 
function f = forward(x, w)
% y = w5*f(xw1+w3)+w6*f(xw2+w4)
f1 = smd(x*w(1)+w(3));
f2 = smd(x*w(2)+w(4));
f = w(5)*f1 + w(6)*f2;
end
 
function f = smd(x)
f = 1./(1+exp(-x)); % логический сигмойд
end
 
function df = dsm(x)
f = smd(x); df = f.*(1-f); % производная сигмойда
end
Задача ясна: изменить так значения весов w чтобы выходные значения y1 совпали или были близки к истинным y, т.е. минимизировать ф-цию ошибки сети E см ниже
http://images.vfl.ru/ii/155731... 2684_m.png
Пробую это делать тремя способами и ни один не работает и не понимаю почему.

Способ 1.
Нахожу производную от ф-ции ошибки сети по весам (как по формулам приведенным на рис выше) и соответственно ей изменяю веса (w1 = w - a*dE; w = w1)
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function full_x(w, x, y)
a = 0.1;
for i = 1:100
  dE = dE_analytic(w, x, y);
  w1 = w - a*dE;
  er1 = sumerr(x, y, w);
  er2 = sumerr(x, y, w1);
  if er1 < er2
    disp('err')
  else
    w = w1;
  end
end
end
 
function dE = dE_analytic(w, x, y) % ф-ция вычисляет градиент Е по весам w
y1 = ynet(x, w); d = y1 - y;
for i = 1:numel(x)
  de1(i) = d(i)*x(i)*dsm(x(i)*w(1)+w(3));
  de2(i) = d(i)*x(i)*dsm(x(i)*w(2)+w(4));
  de3(i) = d(i)*dsm(x(i)*w(1)+w(3));
  de4(i) = d(i)*dsm(x(i)*w(2)+w(4));
  de5(i) = d(i)*smd(x(i)*w(1)+w(3));
  de6(i) = d(i)*smd(x(i)*w(2)+w(4));
end
dE1 = w(5)*sum(de1);
dE2 = w(6)*sum(de2);
dE3 = w(5)*sum(de3);
dE4 = w(6)*sum(de4);
dE5 = sum(de5);
dE6 = sum(de6);
dE = [dE1 dE2 dE3 dE4 dE5 dE6]';
end
 
function err = sumerr(x, y, w)
temp = [];
for i = 1:numel(x)
  y1 = forward(x(i), w);
  d = y1 - y(i);
  temp = [temp; d*d];
end
err = sum(temp);
end
На выходе получаю (и всегда что-то близкое к этому)
http://images.vfl.ru/ii/155732... 2811_m.png
В чем тут дело? В чем ошибка? Через десяток итераций сеть перестает обучаться.

Способ 2.
Меняю веса по градиенту Е, но вычисленному после каждого x(i) и y(i), но результат такой же, похожий

Способ 3.
Меняю веса через вычисление обратного распространения ошибки
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function backprop(w, x, y)
a = 0.1;
for i = 1:40
  for j = 1:9
    y1 = ynet(x(j), w); d = y1 - y(j);
    d1 = d*w(5); d2 = d*w(6);
    df1 = dsm(x(j)*w(1)+w(3));
    df2 = dsm(x(j)*w(2)+w(4));
    w(1) = w(1)+d1*df1*x(j)*a;
    w(2) = w(2)+d2*df2*x(j)*a;
    w(3) = w(3)+d1*df1*a;
    w(4) = w(4)+d2*df2*a;
    f1 = smd(x(j)*w(1)+w(3));
    w(5) = w(5)+d1*f1*a;
    f2 = smd(x(j)*w(2)+w(4));
    w(6) = w(6)+d2*f2*a;
  end
end
end
Миниатюры
Простейшая нейронная сеть для аппроксимации параболы   Простейшая нейронная сеть для аппроксимации параболы   Простейшая нейронная сеть для аппроксимации параболы  

Простейшая нейронная сеть для аппроксимации параболы  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2019, 16:18
Ответы с готовыми решениями:

Нейронная сеть для аппроксимации
Написал скрипт, для нейронной сети, но при запуске ничего не происходит. clear all N=80; x=rand(1,N); y=(rand(1,N)-0.5)*4; ...

Нейронная сеть для функции
Как написать нейронную сеть для решения такой задачи: У меня есть нейронная сеть. Я хочу ее обучить, например возводить числа в куб. ...

Не работающая нейронная сеть для xor
Проблема описана в заголовке, но тут по-подробнее. Ошибка как бы изменяется в меньшую сторону, но абсолютно не значительно, и как видно...

229
1 / 1 / 0
Регистрация: 06.02.2019
Сообщений: 217
30.09.2019, 23:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Excalibur921 Посмотреть сообщение
YagDen, Можете изменить формулы для учета нейрона смешения w7?
sig(sig(x w1 + w3) w5 + sig(x w2 + w4) w6 + w7)
Да. Нужно заменить
Цитата Сообщение от Excalibur921 Посмотреть сообщение
s3= o1*w5+ o2*w6
на
Code
1
s3= o1*w5 + o2*w6 + w7
А в коррекции весов добавить
Code
1
w7 = w7 + speed * g3
Но я так уже пробовал. Что-то у меня все равно не получилось. Видимо,я где-то ошибся.
0
1 / 1 / 0
Регистрация: 06.02.2019
Сообщений: 217
01.10.2019, 00:31
Хотя нет, что-то даже получилось.
Миниатюры
Простейшая нейронная сеть для аппроксимации параболы  
0
818 / 577 / 75
Регистрация: 20.09.2014
Сообщений: 3,770
01.10.2019, 04:08
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Похоже все дело в нейроне смещения, он сильно влияет на форму.
Мы уже где-то тут обмусолили эту тему - "Что такое нейрон смещения и почему его так называют?"
Виктор Царегородцев говорит, что это тенденция тупых западных математиков - употреблять этот термин.

Дело в том, что кружочки, которые рисуют на схемах нейронных сетей - это не нейроны! Это сигналы. Соответственно bias - это всего лишь единичный сигнал, а никак не целый нейрон. У него даже нет функции активации. Он как возбуждается-тормозится?

Без bias не решишь даже задачи XOR по-нормальному, тем более XOR с помехами на входе.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
01.10.2019, 12:37
Mikhaylo, Снова 5 строк формул не пашет…
0
47 / 15 / 1
Регистрация: 26.08.2017
Сообщений: 162
01.10.2019, 14:24
Цитата Сообщение от Excalibur921 Посмотреть сообщение
danila_zaytcev, У вас другое устройство сети. Это нейрон смещения?
Разумеется смещения, я бы конечно не называл просто дополнительный вес "нейроном смещения", но если Вам так угодно...

Ладно... иногда полезно взять в руки калькулятор и позаниматься арифметикой.

Итак:
Layer0 : N0 : w0: 0.824 w1: 2.835 out: 1 err: 0.0004 N1 : w0: 0.833 w1: -2.892 out: 0.855 err: -3.6
Layer1 : N0 : w0: -12.5 w1: 12.495 w2: 26.193 out: 24.379 err: -0.326

У нас было обучающее множество входов {-5,-4,-3,-2,-1,0,1,2,3,4,5} и квадраты выходы; Оно же и тестовое. Посчитаем половинку, так как функция симметричная:

формула

L0.n0.out = tanh(x*L0.n0.w0+ L0.n0.w1)
L0.n1.out = tanh(x*L0.n1.w0+ L0.n1.w1)
L1.n0.out = (L0.n0.out*L1.n0.w0 + L0.n1.out*L1.n0.w1 + L1.n0.w2)

L0.N0.w0=0.824
L0.N0.w1=2.835
L0.N1.w0=0.833
L0.N1.w1=-2.892

L1.N0.w0=-12.5
L1.N0.w1=12.495
L1.N0.w2=26.193

Подставляем:
x = 0
L0.n0.out = tanh(0*0.824+ 2.835) = 1
L0.n1.out = tanh(0*0.833 + -2.892) = -1
L1.n0.out = (1*-12.5 + - 1*12.495 + 26.193) = 1.198


x = 2
L0.n0.out = tanh(2*0.824+ 2.835) = 1
L0.n1.out = tanh(2*0.833 + -2.892) = -0.84
L1.n0.out = (1*-12.5 + - 0.84*12.495 + 26.193) = 4.1972

x = 5
L0.n0.out = tanh(5*0.824+ 2.835) = 1
L0.n1.out = tanh(5*0.833 + -2.892) = 0.85
L1.n0.out = (1*-12.5 + 0.85*12.495 + 26.193) = 25.31375

ну, всё верно вроде...

Добавлено через 11 минут
ЗЫ экстраполяция\интерполяция функций это задача регрессии, то есть отображения вектора в вектор(скаляр) а значит последний слой без функции нелинейности(сигмоид, гипертангенс), походу у Вас именно в этом были затруднения))

Но то что Вы так долго страдали, так долго испытывали муку, это хорошо, это правильно, хорошее начало, если с таким же упорством продолжите не будет перед Вами существенных препятствий.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
01.10.2019, 14:40
Цитата Сообщение от danila_zaytcev Посмотреть сообщение
иногда полезно взять в руки калькулятор и позаниматься арифметикой.
Что это все и зачем?

Где тут ошибка?
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
sig(x) = 1 / (1 + exp(-x))
dsig(x) = x * (1 - x)
speed = 0.1 // скорость обучения
 
Прямое распространение:
s1 = w1 * x + w3;
o1 = sig(s1)
s2 = w2 * x + w4
o2 = sig(s2)
s3= o1*w5 + o2*w6 + w7
o3 = sig(s3)
 
Обратное распространение:
delta = f(x) - o3 // f(x) - парабола
loss = loss + delta * delta // лосс функция. 
g3 = delta * dsig(o3) // градиент выходного нейрона
g1 = g3 * w5 * dsig(o1) // градиент соответствующего нейрона скрытого слоя
g2 = g3 * w6 * dsig(o2) // градиент соответствующего нейрона скрытого слоя
 
Коррекция весов:
w1 = w1 + speed * x * g1
w2 = w2 + speed * x * g2
w3 = w3 + speed * g1
w4 = w4 + speed * g2
w5 = w5 + speed * o1 * g3
w6 = w6 + speed * o2 * g3
w7 = w7 + speed * g3
0
47 / 15 / 1
Регистрация: 26.08.2017
Сообщений: 162
01.10.2019, 16:37
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Что это все и зачем?
я написал веса и формулы как вы просили.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
01.10.2019, 16:45
Мда…

Полдня пилил код и в итоге если Epoh>10 то у Mathematica 8 полностью едет крыша…море ошибок
Меньше работает

Добавлено через 1 минуту
danila_zaytcev, Где ошибки в алгоритме пост 146? Веса правильно обновляют? Нейрон смещения это w7.
0
47 / 15 / 1
Регистрация: 26.08.2017
Сообщений: 162
01.10.2019, 17:13
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Где ошибки в алгоритме пост 146? Веса правильно обновляют? Нейрон смещения это w7.
Нет не правильно, присутствуют грубые ошибки. Но мне кажется Вы ещё не совсем готовы к правильному решению, особенно после не уважительных высказываний по поводу указателей в Си. ИМХО кто не разобрался с указателями вообще не может считаться программистом и интересоваться машинным обучением.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
01.10.2019, 18:13
Цитата Сообщение от danila_zaytcev Посмотреть сообщение
присутствуют грубые ошибки.

Я у вас уже 5 раз просил написать формулы а не код.
YagDen, никак не пашет.
0
1 / 1 / 0
Регистрация: 06.02.2019
Сообщений: 217
01.10.2019, 20:52
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Где тут ошибка?
Здесь нет. У меня в программе ошибка была. А формулы вроде верные.

Добавлено через 2 минуты
Цитата Сообщение от Excalibur921 Посмотреть сообщение
YagDen, никак не пашет.
Почему не пашет? Это что за картинка? Ваши результаты?
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
01.10.2019, 22:57
Цитата Сообщение от YagDen Посмотреть сообщение
Почему не пашет? Это что за картинка? Ваши результаты?
Мои результаты, с вашими новыми формулами из порядка 50 рандом генераций весов лучшие решения. Сеть фактически абсолютно не учиться. Часто просто эффекта обучения ноль. Почему у вас другая парабола из центра?
Обучаю по этой: f[x_]:=(2*x-1)^2+0.1;
Как любит писать VTsaregorodtsev, все эти алгоритмы и формулы на вебсайтов перепевки Шаляпиных =). Т.е. заведомо не пашут и искажены + никем не проверены.

Вот тут вроде четко все пошагово:
https://habr.com/ru/post/198268/
попробовал написать формулы то там опечатка то нейроны смещения забыли, расчет не проверен там и вообще странные формулы. Кароче бардак.
А где искать проверенные расчетом формулы хз…
0
47 / 15 / 1
Регистрация: 26.08.2017
Сообщений: 162
01.10.2019, 23:22
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Я у вас уже 5 раз просил написать формулы а не код.
Ну ладно, сжалюсь над вами, всё равно толку не будет, если даже в готовом коде разобраться не можете.

вот исправленные формулы

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
f(x) = tanh(x)
df(x) = 1.0 - x^2
speed = 0.001 // скорость обучения
 
Прямое распространение:
s1 = w1 * x + w3;
o1 = f(s1)
s2 = w2 * x + w4
o2 = f(s2)
s3= o1*w5 + o2*w6 + w7
o3 = s3
 
Обратное распространение:
delta = Y - o3 // f(x) - парабола
loss = loss + delta * delta // лосс функция. 
g3 = delta // градиент выходного нейрона
g1 = g3 * w5 * df(o1) // градиент соответствующего нейрона скрытого слоя
g2 = g3 * w6 * df(o2) // градиент соответствующего нейрона скрытого слоя
 
Коррекция весов:
w1 = w1 + speed * x * g1
w2 = w2 + speed * x * g2
w3 = w3 + speed * g1
w4 = w4 + speed * g2
w5 = w5 + speed * o1 * g3
w6 = w6 + speed * o2 * g3
w7 = w7 + speed * g3
последний слой без сигмоида, так как это регрессия, скорость обучения меньше на два порядка и лучше гипертангенс чем сигмоид
0
1 / 1 / 0
Регистрация: 06.02.2019
Сообщений: 217
01.10.2019, 23:49
Цитата Сообщение от danila_zaytcev Посмотреть сообщение
Ну ладно, сжалюсь над вами, всё равно толку не будет, если даже в готовом коде разобраться не можете.
вот исправленные формулы
Цитата Сообщение от danila_zaytcev Посмотреть сообщение
Нет не правильно, присутствуют грубые ошибки.
Вы заменили функции активации. А грубые ошибки в моих-то формулах где?
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
02.10.2019, 00:23
Всеравно не хочет честно из рандом весов…
speed=0.001;
Epoh=10000;
rMinW=-0.5; // пределы начальных рандом весов
rMaxW=0.5;
X эпохи, Y средняя сумма квадратов отклонений в 11 точках параболы от НС.
Название: ScreenShot00125.jpg
Просмотров: 36

Размер: 7.9 Кб
Название: ScreenShot00126.jpg
Просмотров: 36

Размер: 11.6 Кб
speed=0.6;
Epoh=100;
rMinW=-10.5;
rMaxW=10.5;
{5.74198,5.25908,1.23013,-6.41618,-3.42504,2.67133,6.63578}

Всеравно не обучение а перебор из 50 рандом в заданных пределах только пару примерно годных как часть залазит на параболу. Результат сильно зависит от удачи. Значит падает в локальный минимум.

Понятия не имею как так точно аппроксимировало у вас за 1 раз…фантастика.
Или там брутофорс из 1000 рандомов это лучшая аппроксимация?

speed=0.1;
Epoh=100;
rMinW=-20.5;
rMaxW=20.5;

{-2.93199,-2.95084,-5.14015,4.4262,-7.13367,-9.10463,2.16476}
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
02.10.2019, 00:32
Обучение бегает по кругу читая всегда 11 точек подряд на параболе из массива.
Может их нужно перемешивать?

Раньше было так:
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Обучение это 2д вектора на параболе из X рандом от 0 до 1 и Y=f(x)?
Теперь так, без перемешивания:
Цитата Сообщение от Excalibur921 Посмотреть сообщение
это 2д вектора из 10 точек с постоянным шагом 0.1 по X и Y=f(x)
danila_zaytcev, Может у вас другая парабола? Откуда там от 0 до 25 по Y на рис?
Простейшая нейронная сеть для аппроксимации параболы
Может у нас разные параболы? =)
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Обучаю по этой: f[x_]:=(2*x-1)^2+0.1;
Отсюда и сильно разная точность и простота аппроксимации.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
02.10.2019, 01:17
Сделал в GeoGebra примерно по рис полином по 3 точкам, можно на википедии взять 3 точки и получить уравнение параболы но лень.
Эта тоже похоже на нее.
Правда странный размер ячеек по горизонтали у вас на рис, это не анаморфирование? Т.е. по X не растянута координата? По X и Y одинаковый шаг координат?

X нач=3 X кон=42
f(x)=0.0613*x^2-2.7625*x+31.9984
Аппроксимирует еще хуже. Там хоть сдвиги были.
Почти всегда горизонтальная прямая ответ НС и график обучения не двигается.
Вот наверно лудший из порядка 20 рандомов:
speed=0.1;
Epoh=10;
rMinW=-100.5;
rMaxW=100.5;
Название: ScreenShot00133.jpg
Просмотров: 34

Размер: 11.3 Кб

Странная форма кривой от НС…не обычный краказябр.
0
2829 / 1689 / 273
Регистрация: 19.02.2010
Сообщений: 4,462
02.10.2019, 01:54
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Обучение бегает по кругу читая всегда 11 точек подряд на параболе из массива.
Может их нужно перемешивать?
Обязательно


Цитата Сообщение от Excalibur921 Посмотреть сообщение
X нач=3 X кон=42
f(x)=0.0613*x^2-2.7625*x+31.9984
Аппроксимирует еще хуже. Там хоть сдвиги были.
Почти всегда горизонтальная прямая ответ НС и график обучения не двигается.
Готтсподи... Ну нарисуйте графики сигмоиды и гип.тангенса - посмотрите, когда там у них происходит выход на асимптоты...
Асимптота -> производная=0 -> обучения при таком аргументе функции нет (независимо значения лосса и его производной по выходу нейрона).
Так что - надо нормализовать такие данные (и зависимые, и независимые признаки) перед тем, как их совать в сетку. Ответ сети переводить затем в исходный интервал формулой, обратной к той, которой ранее нормализовывались требуемые выходные данные.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
02.10.2019, 10:00
danila_zaytcev,
1)напишите все ваши веса w0 –w7.
2)в каких пределах у вас задана рандом инициализация весов?
3)сколько эпох\итераций
4)напишите массив 11 векторов, может там я беру неправильные Y близкие к 1 и это плохо?


VTsaregorodtsev,
Эти формулы правильны? Уже редакция 2.
Простейшая нейронная сеть для аппроксимации параболы
На википедии другой алгоритм.
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Ну нарисуйте графики сигмоиды и гип.тангенса
Так это и спросил давно, никто не среагировал. Даже рисунок сделал.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Имеет близкий к линейному участок не на интервале Y=0 до Y=1 а
Y=0.34 Y=0.66
Что может сильно замедлять обучение, может правильно подкорректировать функцию параболы f(x) так чтобы она была от X=0.34 до X=0.66?
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
надо нормализовать такие данные
Сейчас tanh, значит обучающий пример должна быть
вход от X от -0.25 до 0.25 и выход Y от -0.25 до 0.25?
Или что-то одно важно в этом интервале? Обучающая пара X вход Y правильный ответ.
Название: ScreenShot00135.jpg
Просмотров: 32

Размер: 6.6 Кб
Позже задам правильную формулу и пределы X.
Может еще правильно добавить специальную функцию корректирующую плотность точек на параболе? Сильно они лезут к вершине параболы.
Красные
F[x_]:=(2*x-1)^2+0.1;
X шаг 0.1
Зеленые примерно равномерной плотности, может так лучше?
Название: ScreenShot00138.jpg
Просмотров: 31

Размер: 5.6 Кб
Какой функцией можно задать Fspec(x) чтобы получить зеленые точки?
F[x_]:=(2*Fspec(x)-1)^2+0.1;
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
02.10.2019, 12:28  [ТС]
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Обязательно
Зачем? Разве это не то же самое как переставлять уравнения в системе уравнений? В чем отличие?

Excalibur921, вот программа для двух нейронов и единицы и на выходе сумматор (или что то же самое нейрон с выходной функцией y = x). Сеть и веса показаны в верхнем посту каждой страницы. Там же функция сети и ее производные по весам, т.е. там приведены формулы градиента. Программа ниже обучает эту сеть наискорейшим спуском.
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function targ_n_n_forum
% нейронная сеть с одним слоем
% двумя нейронами и единицей
% для аппроксимации параболы
% на выходе сети сумматор
b = 100; j = 0;
[x y w h i] = start2n;
while 1
  dE = dE_analytic(w, x, y);
  [w er] = naiskor_spusk(dE, w, x, y);
  if er < 0.005
    draw_h(w, x, h, i, er);
    break
  end
  i = i + 1;
  if mod(i, b) == 0
    h = draw_h(w, x, h, i, er);
  end
end
end
function [w er] = naiskor_spusk(dE, w, x, y)
a = 0.1; er1 = sumerr_n(x, y, w);
while 1
  w1 = w - a*dE;
  er = sumerr_n(x, y, w1);
  if er1 < er
    a = a/2;
  else
    w = w1; return
  end
end
end
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function [x y w h i] = start2n
close all; clc; x = (0.1:0.05:0.9)';
y = (2*x - 1).^2 + 0.1; pot(x,y,'.');
axis([0 1 0 1])
set(gcf,'position',[1680 950 560 420])
[w er i h] = first_poisk_w(x, y);
end
function [w er i h] = first_poisk_w(x, y)
N = 100;
w = rand(6,1)-0.5; i = 0; m = 0.5;
y1 = ynet(x, w); h = plot(x,y1,'-w');
err = [];  pause(0.1);
er = sumerr_n(x, y, w); % return
while 1
  ww = w_plus_ww(w, m, N);
  [w er] = find_best(ww, x, y);
  i = i + 1; err  = [err; er];
  if er < 0.5
    h = draw_h(w, x, h, i, er);
    break
  end
end
end
function ww = w_plus_ww(w, m, N)
n = numel(w);
A = m*rand(n,N) - m/2;
ww = repmat(w, 1, N) + A;
ww = cat(2, w, ww);
end
function [w err] = find_best(ww, x, y)
[r c] = size(ww); er = zeros(c,1);
for i = 1:c
  w = ww(:,i);
  er(i) = sumerr_n(x, y, w);
end
[err ind] = min(er);
w = ww(:,ind);
end
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function err = sumerr_n(x, y, w)
y1 = ynet(x, w);
d = y1 - y; err = sum(d.*d);
end
function y = ynet(x, w)
for i = 1:numel(x)
  y(i,1) = forward(x(i), w);
end
end
function f = forward(x, w)
% y = w5*f(xw1+w3)+w6*f(xw2+w4)
f1 = smd(x*w(1)+w(3));
f2 = smd(x*w(2)+w(4));
f = w(5)*f1 + w(6)*f2;
end
function dE = dE_analytic(w, x, y)
y1 = fnet(x, w); d = y1 - y;
for i = 1:numel(x)
  de1(i) = d(i)*x(i)*dsm(x(i)*w(1)+w(3));
  de2(i) = d(i)*x(i)*dsm(x(i)*w(2)+w(4));
  de3(i) = d(i)*dsm(x(i)*w(1)+w(3));
  de4(i) = d(i)*dsm(x(i)*w(2)+w(4));
  de5(i) = d(i)*smd(x(i)*w(1)+w(3));
  de6(i) = d(i)*smd(x(i)*w(2)+w(4));
end
dE1 = w(5)*sum(de1);
dE2 = w(6)*sum(de2);
dE3 = w(5)*sum(de3);
dE4 = w(6)*sum(de4);
dE5 = sum(de5);
dE6 = sum(de6);
dE = [dE1 dE2 dE3 dE4 dE5 dE6]';
end

Разбил весь код на три куска для удобства.
Функция start2n выдает не первые попавшиеся веса w, а проверяет множество случайных векторов w, для каждого из них вычисляет ошибку сети и возвращает вектор w с минимальной ошибкой меньшей 0.5 - вот в этом случае только работает наискорейший спуск. Для обучения по Левенбергу эта процедура не требуется.
Вот как работает программа https://youtu.be/nR9A1DH5Crw
Если что непонятно - спрашивайте(я не могу все объяснение сразу продумать безупречно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.10.2019, 12:28
Помогаю со студенческими работами здесь

Нейронная сеть для распознавания лиц
Всем привет!) Хочу посоветоватся с людьми которые знакомы с нейронными сетями. Суть дела такова, мне необходимо запрограмировать систему...

Нейронная сеть для распознавания образов
Нужно сделать нейронную сеть для распознавания образов. Кто делал такое? Где проще это делать? Где есть нормальные гайды? Думаю между...

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

Нейронная сеть для распознавания чисел
Народ, дано вот такое задание: Создать нейронную сеть для распознавания десяти чисел, по одному из следующих методов: 1) Трехслойная...

Нейронная сеть для сайта Asp.net
Подскажите, надо для учебы разместить нейронную сеть(любую) на сайте. Можете подкинуть какую-нибудь литекратуру для этого. Сайт обычный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru