Рыночный этикет или правила хорошего тона на минном поле - страница 21

 
grasn писал(а) >>

Пока творю - должен выглядеть, как художник! А вот когда кодирую ... :о)))

PS: Серега, конкретно в MathCAD практически монопенисуально, а вот в C++/ФОРТРАНЕ ... будет отличаться, но в MathCAD - мягко говоря нет (для этого конкретного случая). А если использовать mean, то считать будет еще быстрее, а если использовать, напимер, corr, то твой "быстрый" алгоритм будет черепашкой :о) Как они это делают, не знаю, но что касается оператора "суиммирования" - он на много быстрее цикла. Если у тебя не так - тогда ставь свежую версию.

Понятно.

Спасибо за информацию!

 
Neutron >>:

Не забывай, что всё это хозяйство на каждом отсчёте желательно дообучать - мало не покажется.

Теперь понял! Я то все комитеты в одной куче считал...

Увеличивать число нейронов в скрытом слое я не буду. Зачем, если и с двумя хорошо работает.

Если ты не против, хотелось бы перейти вплотную к ОРО, т.к. двухслойная сетка у меня уже готова и работает(даже с весами "от фонаря"), если интересно - могу выложить код.

 

Пока что сделал вот что:



d = 17;

w = 17*3 + 4 = 55;

P = 4*55*55/17 = 712;

------------------------------------------------------------------------


Алгоритм ОРО пока понял вот как (только для весов выходного слоя):

// ----------------------------------------- ЭПОХА ---------------------------------------------------

for(int i = cikl; i > 2; i--)
{
out = OUT(i); // Получаем выход сетки
target = (Close[i]-Close[i+1])/Close[i+1];--------------------// Получаем целевое значение
delta = target - out;-----------------------------------------// Вычитаем выход сетки из целевого значения
pr = th(out);-------------------------------------------------// Вычисляем производную выходного сигнала
pr = 1 - pr*pr;-----------------------------------------------//

for(int n = 0; n < 4; n++)
{
Corr[n] += delta * pr * D2[n];--------------------------------// Вычисляем ошибку для каждого веса и суммируем её за всю эпоху
Norm[n] += Corr[n]*Corr[n];-----------------------------------// Считаем норму вектора коррекций для каждого веса за всю эпоху
}
}
// ------------------------------------- КОНЕЦ ЭПОХИ --------------------------------------------------

// ----------------------------------- КОРРЕКЦИЯ ВЕСОВ ------------------------------------------------

for(i = 0; i < 4; i++)

W2[i] += Corr[i]/MathSqrt(Norm[i]);



Вроде все работает! Но что-то все же не так. За 1000 эпох все веса стали очень маленькими:

W2 [0] = 0.0876 W2 [1] = 0.0772 W2 [2] = -0.0424 W2 [3] = -0.05

Что я упустил и как теперь протолкнуть ошибку к входным весам?

 
Prival писал(а) >>

Глянь личные сообщения. Извиняюсь что тут пишу. но они сообщения часто не отражаються.

Сергей, глянь личку.

to paralocus

Чуть позже отвечу.

Сейчас вожусь со своими входными данными для НС-ки - идея пришла в голову. Кстати, чего это ты при подсчёте длины обучающего вектора умножил число весов на 3? Я так понимаю, у тебя должно быть w=17+4 и всё! Ты же обучаешь каждого члена комитета своим персональным вектором...

 
Neutron >>:

...Кстати, чего это ты при подсчёте длины обучающего вектора умножил число весов на 3? Я так понимаю, у тебя должно быть w=17+4 и всё! Ты же обучаешь каждого члена комитета своим персональным вектором...

В данном случае входной вектор один и тот же. Он читается один раз на каждом отсчете, а потом каждый член комитета "смотрит" на него через свои персональные "очки"(веса) и выносит суждение.

Можно, конечно читать его для каждого члена комитета отдельно, но какой в этом смысл, если результат будет одним и тем же? Входной вектор это 16 последовательных приращений котира + единичный вход.

А... я понял! Да, раньше у меня было два разных вх. вектора: приращения котира с dt по ряду Фибо - 2,3,5,8... а другой по ряду Люка - 3,4,7,11... и членов комитета было всего 2. Тогда каждый член комитета читал свой вектор, но сейчас я все упростил, чтобы сосредоточиться на понимании ОРО. Так что, вектор, в данном случае, один.

А веса могли так уменьшиться из-за того. что я обучал только второй слой?

 

Ну, так всёравно получается: w=17+4 и каждому члену одинаковые вектора.

paralocus, я вот, что думаю. Давай ты не будешь бежать впереди телеги, а для затравки решишь на MQL-е двуслойный неленейный персептрон с неленейностью на выходе и получишь положительный результат. Затем перейдёшь к комитету сетей (если потребуется).

Что скажешь?

 
Neutron >>:

Ну, так всёравно получается: w=17+4 и каждому члену одинаковые вектора.

paralocus, я вот, что думаю. Давай ты не будешь бежать впереди телеги, а для затравки решишь на MQL-е двуслойный неленейный персептрон с неленейностью на выходе и получишь положительный результат. Затем перейдёшь к комитету сетей (если потребуется).

Что скажешь?

Ок! Т.е. берем и убираем всех коммисаров и председателя. Типа "бандитские пули"... -:) Щас сделаем!

P/S кроме одного - первого

 

Ну, тоды поехали!

1. находим ошибку на выходе последнего нейрона: d2out=X[-1]-OUT2, (в смысле нумерация как MQL и это "будущий" отсчёт).

2. пересчитываем её с учётом нелинейности на его вход: d2in=d2out*(1-OUT2^2)

3. Эта же самая ошибка уходит по своему аксону на выход каждого нейрона первого слоя! Теперь, это ошибка на его выходах - d1out и повторяем процедуру (2) пересчитывая на вход: d1[1]in=d1out*(1-OUT1[1]^2) и так же на второй нейрон скрытого слоя.

 
Веса корректируем вычисленной ошибкой, или пока нет?
 

Нет.

Сначала считаем микрокоррекцию по каждому весу: dw=in*din - дельта правило - умножаем входной сигнал на приведённую к конкретному входу ошибку. И суммируем её в отдельном по каждомку весу сумматору на протяжении всех отсчётов обучающего вектора. В пределах одной итерации эпохи обучения веса не корректируются. Только накапливаются микрокоррекции и их квадраты (в другом сумматоре).

P.S. Постом выше откорректировал ошибку. Производная находится так: *(1-OUT2^2).

Причина обращения: