L'étiquette du marché ou les bonnes manières dans un champ de mines - page 21

 
grasn писал(а) >>

Pendant que je crée, je dois avoir l'air d'un artiste ! Mais quand je codifie... :о)))

PS: Serega, c'est presque monopolistique dans MathCAD, mais dans C++/FORTRAN ... sera différent, mais dans MathCAD - pour ne pas dire plus (pour ce cas particulier). Et si vous utilisez mean, il comptera encore plus vite, et si vous utilisez corr, par exemple, votre algorithme "rapide" fera la tortue :o). Je ne sais pas comment ils font, mais l'opérateur "addition" est beaucoup plus rapide que la boucle. Si vous ne l'avez pas de cette façon - alors mettez une nouvelle version.

Je l'ai.

Merci pour l'information !

 
Neutron >> :

N'oubliez pas qu'il est conseillé d'enseigner tout cela à chaque décompte - ce ne sera pas facile.

Maintenant, je comprends ! Je comptais tous les comités dans une seule pile...

Je ne vais pas augmenter le nombre de neurones dans la couche cachée. Je ne vois pas pourquoi, cela fonctionne bien avec deux.

Si cela ne vous dérange pas, j'aimerais passer directement à ORO, car j'ai déjà un maillage à deux couches prêt et qui fonctionne (même avec des échelles "de fond"), si cela vous intéresse - je peux mettre en place le code.

 

Jusqu'à présent, voici ce que j'ai fait :



d = 17 ;

w = 17*3 + 4 = 55 ;

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

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


Jusqu'à présent, l'algorithme ORO a été conçu comme suit (uniquement pour les poids de la couche de sortie) :

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

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]);



Cela semble fonctionner ! Mais quelque chose ne va toujours pas. Sur 1000 époques, tous les poids sont devenus très petits :

W2 [0] = 0,0876 W2 [1] = 0,0772 W2 [2] = -0,0424 W2 [3] = -0,05

Qu'ai-je manqué et comment puis-je maintenant pousser l'erreur vers les poids d'entrée ?

 
Prival писал(а) >>

Regardez les messages privés. Je m'excuse d'écrire ici, mais souvent ils ne reflètent pas les messages.

Sergey, vérifiez vos messages privés.

à paralocus

Je vous répondrai un peu plus tard.

Je travaille sur les données d'entrée pour le NS et cette idée m'est venue à l'esprit. Au fait, pourquoi avez-vous multiplié le nombre de poids par 3 lors du calcul de la longueur du vecteur d'apprentissage ? Je comprends que vous êtes censé avoir w=17+4 et c'est tout ! Vous formez chaque membre du comité avec son propre vecteur personnel...

 
Neutron >> :

...Au fait, pourquoi avez-vous multiplié le nombre de poids par 3 lors du calcul de la longueur du vecteur d'apprentissage ? Je suppose que vous devriez avoir w=17+4 et c'est tout ! Vous formez chaque membre du comité avec son propre vecteur personnel...

Dans ce cas, le vecteur d'entrée est le même. Il est lu une fois lors de chaque comptage, puis chaque membre du comité le "regarde" à travers ses "points" (pondérations) personnels et émet un jugement.

Bien sûr, il peut être lu pour chaque membre du comité séparément, mais à quoi bon si le résultat est le même ? Le vecteur d'entrée est constitué de 16 incréments consécutifs du quotient + une seule entrée.

А... J'ai compris ! Oui, j'avais deux vecteurs d'entrée différents : le kotir s'incrémente avec dt selon les séries Fibo - 2,3,5,8... et l'autre par la série de Luke - 3,4,7,11... et il n'y avait que 2 membres du comité. À l'époque, chaque membre du comité lisait un vecteur différent, mais maintenant j'ai simplifié les choses pour me concentrer sur la compréhension du BGC. Donc, le vecteur, dans ce cas, est un.

Les poids auraient-ils pu baisser autant parce que je n'ai enseigné que la deuxième couche ?

 

Eh bien, cela donne quand même quelque chose : w=17+4 et chaque membre a les mêmes vecteurs.

Paralocus, voici ce que je pense. Ne prenons pas d'avance et résolvons un Perspectron bicouche non linéaire avec sortie de non-linéarité dans MQL et obtenons un résultat positif. Vous passerez ensuite à un comité des réseaux (si nécessaire).

Qu'en pensez-vous ?

 
Neutron >> :

Eh bien, cela donne quand même quelque chose : w=17+4 et chaque membre a les mêmes vecteurs.

Paralocus, voici ce que je pense. Ne prenons pas d'avance et résolvons un Perspectron bicouche non linéaire avec sortie de non-linéarité dans MQL et obtenons un résultat positif. Vous passerez ensuite à un comité des réseaux (si nécessaire).

Qu'est-ce que vous en dites ?

OK ! Donc on sort tous les commissaires et le président. Une sorte de "balles de gangsters"... - :) >> faisons-le.

P/S sauf un - le premier

 

Alors, allons-y !

1. trouver l'erreur à la sortie du dernier neurone : d2out=X[-1]-OUT2, (j'entends la numérotation comme MQL et c'est le compte "futur").

2. le recalculer en tenant compte de la non-linéarité à son entrée : d2in=d2out*(1-OUT2^2)

3. la même erreur va à la sortie de chaque neurone de la première couche par son axone ! Maintenant, cette erreur à ses sorties est d1out et on répète la procédure (2) en recalculant à son entrée : d1[1]in=d1out*(1-OUT1[1]^2) et de la même façon pour le deuxième neurone de la couche cachée.

 
Les poids sont-ils corrigés par erreur calculée, ou pas encore ?
 

Non.

Tout d'abord, calculer la micro-correction pour chaque poids : dw=in*din - règle du delta - multiplier le signal d'entrée par l'erreur appliquée à une entrée particulière. Ensuite, nous le résumons dans un sommateur séparé pour chaque poids sur tous les échantillons du vecteur d'apprentissage. Les poids ne sont pas corrigés dans une itération de l'époque d'apprentissage. Seules les microcorrections et leurs carrés sont accumulés (dans un autre additionneur).

P.S. J'ai corrigé l'erreur dans le post ci-dessus. La dérivée est trouvée comme suit : *(1-OUT2^2).