Discusión sobre el artículo "Redes neuronales de propagación inversa del error en matrices MQL5" - página 2
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Sí, pero los valores de activación se pasan a la función de derivación mientras que ésta espera los valores de preactivación. Eso es lo que estoy diciendo .
Creo que se equivoca. La derivación se calcula de acuerdo a la fórmula que di anteriormente: y'(x) = y(x)*(1-y(x)), donde x es el estado de la neurona antes de la activación y y(x) es el resultado de aplicar la función de activación. No se utiliza el valor previo a la activación para calcular la derivada, en su lugar se utiliza el resultado de la activación (y). He aquí una prueba simplificada:
Creo que te equivocas. La derivación se calcula según la fórmula que he dado más arriba: y'(x) = y(x)*(1-y(x)), donde x es el estado de la neurona antes de la activación e y(x) es el resultado de aplicar la función de activación. No se utiliza el valor previo a la activación para calcular la derivada, en su lugar se utiliza el resultado de la activación (y). He aquí una prueba simplificada:
Si , eso es lo que estoy diciendo , la derivada correcta coincide con la derivada llamada desde los valores x.
En la función back prop estas llamando al equivalente y.Derivative(d,AF_SIGMOID)
La matriz de salida es y en el backprop del articulo no creo que estes almacenando el equivalente de x en una matriz para llamar a la derivada desde esa.
(de nuevo , de acuerdo con la función mq)
--
incluso en tu ejemplo estas llamando a la derivada desde x , apuesto a que escribiste y al principio y luego "whoopsed"
Solo díselo en el foro ruso . Se ahorrara mucho tiempo a mucha gente si lo añaden en los documentos.
Gracias
Creo que te equivocas. La derivación se calcula según la fórmula que he dado más arriba: y'(x) = y(x)*(1-y(x)), donde x es el estado de la neurona antes de la activación e y(x) es el resultado de aplicar la función de activación. No se utiliza el valor previo a la activación para calcular la derivada, en su lugar se utiliza el resultado de la activación (y). He aquí una prueba simplificada:
Permítanme simplificar esto .
Este es tu ejemplo
En tu ejemplo estás llamando a x.Der ivative para llenar el vector de derivadas d.
Usted no está llamando y.Derivative para llenar los derivados, ¿por qué? Porque devuelve valores erróneos. (y probablemente lo viste, por eso usaste x.Derivative).
¿ Que es y? los valores de activación de x.
Entonces cuando haces esto :
x.Activation(y, AF_SIGMOID);llenas y con los valores de activación de x, pero llamas a la derivada en x no en y. (lo cual es correcto de acuerdo a la función mql5)
En tu articulo , en el feed forward temp es x
matrix temp = outputs[i].MatMul(weights[i]);Y y serían los valores de activación de x. ¿ Que matriz es esa ?
Lassalidas. En el artículo la y ( de la que no llamas a la derivada en el ejemplo) es la matriz de salidas .
(lo que estamos viendo en el código de arriba es el equivalente x.Activation(y,AF) del ejemplo que rellena y con los valores de activación)
En tu código back prop no estás llamando a x.Derivative porque x(matriz temp = salidas[i].MatMul(pesos[i]);)
no se almacena en ninguna parte y no se puede llamar. Usted está llamando el equivalente de y. Derivative que devuelve los valores erróneos
porque y tiene los valores de activación.
De nuevo, de acuerdo con la función mql5.
Así que en tu ejemplo estás usando la llamada correcta y en tu artículo estás usando la llamada incorrecta .
Saludos
Así que quieres esto:
Lo pensaré.
Así que quieres esto:
Lo pensaré.
A primera vista parece bien, sí. El cálculo en el acto es más rápido que el almacenamiento supongo .
👍
A primera vista parece bien, sí. El cálculo sobre el terreno es más rápido que el almacenamiento, supongo.
Creo que sé la razón por la que se codifica originalmente a través de la salida de la función de activación. En todas mis librerías NN anteriores y en algunas librerías de otras personas que he utilizado, las derivadas se calculan a través de las salidas, porque es más simple y eficaz (durante la adaptación a la API de matrices, no presté atención a la diferencia). Por ejemplo:
De esta forma no necesitamos mantener argumentos de pre-activación (matrices) o recalcularlos de nuevo durante la fase de backpropagation (como se hace en el fix). No me gustan ambos enfoques. El cálculo de la "autoderivada", por así decirlo, parece más elegante. De ahí que prefiera encontrar algunas referencias con fórmulas para autoderivadas de todas (o muchas) las funciones de activación soportadas, y volver a mi enfoque original.
Es interesante que no se requiera que la fórmula de la autoderivada se derive estrictamente de la función de activación - cualquier función con efecto equivalente es suficiente.Creo que sé la razón por la que originalmente se codifica a través de la salida de la función de activación. En todas mis librerías NN anteriores y en algunas librerías de otras personas que he utilizado, las derivadas se calculan a través de las salidas, porque es más simple y eficaz (durante la adaptación a la API de matrices, no presté atención a la diferencia). Por ejemplo:
De esta forma no necesitamos mantener argumentos de pre-activación (matrices) o recalcularlos de nuevo durante la fase de backpropagation (como se hace en el fix). No me gustan ambos enfoques. El cálculo de la "autoderivada", por así decirlo, parece más elegante. Por lo tanto, preferiría encontrar algunas referencias con fórmulas para las autoderivadas de todas (o muchas) las funciones de activación soportadas, y volver a mi enfoque original.
Sí, pero mq ha decidido hacerlo de esta manera, por lo que se aplica a todas las funciones de activación.
En palabras simples , en lugar de la función .Derivative "adaptarse" a la función de activación (como los 3 que usted ha mencionado podría recibir las salidas) que han decidido tener las funciones de recibir los valores de pre-activación en todos los ámbitos de todos modos. Eso está bien, el problema es que no está en la documentación.
La suposición por defecto por cualquier persona es que se adapta a la AF.
Esto es malo para alguien nuevo (como yo por ejemplo) ya que los "abordan" incluso antes de empezar. Lo que me salvó fue que primero construí una red basada en objetos.
(la comparacion de redes basadas en objetos y matrices seria tambien un articulo muy interesante y ayudaria a muchos codificadores que no son expertos en matematicas)
De todas formas lo puse en el hilo que un moderador tiene para reportar problemas de documentación .
(off topic : puedes usar este TanH , es mas rapido y correcto , creo)
¿Te refieres a un "sustituto"?
Por ejemplo, un nodo recibe un error en su salida, y usted conoce la "fluctuación" de la salida, así que si la "cambia" a una activación más simple y la deriva, ¿funcionará?
Así que en teoría sería como "regularizar" la salida pero sin hacerlo y simplemente multiplicando por la derivada de la regularización antes de la derivada de la activación?
Por ejemplo :
Un administrador respondió a los moderadores hilo sobre esto . Tal vez le interese
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading
mql5 errores de documentación, por defecto o inconsistencias.
Rashid Umarov, 2023.04.18 11:36
Se mejorará lo antes posible. Por un tiempo puedes usar este archivo include como referencia.
@Stanislav Korotky
Sus esfuerzos para poner el concepto de red neuronal con MQL es bien apreciada. Esto es realmente una gran pieza de trabajo para empezar con los principiantes como yo. Kudos :)
Gracias por actualizar el archivo con error corregido. Sin embargo, yo sugeriría para reemplazar el archivo en el área de descarga.
Por suerte me fui a través de la discusión sobre el tema y se encontró que hay un error en el archivo. Y que ahora estaba tratando de buscar la solución, me encontré con este enlace de archivo aquí.
Espero que haya sólo estos lugares para la corrección de errores en los números de línea 490-493, 500, 515-527, podría con // * marcado. Si en cualquier otro lugar por favor mencione los números de línea o marque //*BugFix ...
Saludos