Discusión sobre el artículo "Neuroredes profundas (Parte IV). Creación, entrenamiento y simulación de un modelo de neurored" - 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
Ocurre algo sutil aprendiendo con el profesor sobre un conjunto muy pequeño - sólo 1000 ejemplos (25% del total)
¿No ha comparado la calidad del aprendizaje en estos 1000 y en 3000 (preentrenamiento + entrenamiento)? ¿La diferencia es realmente pequeña?
Está ocurriendo algo sutil en el aprendizaje con el profesor sobre un conjunto muy pequeño - sólo 1000 ejemplos (25% del total)
¿No ha comparado la calidad de la enseñanza en esos 1000 y en 3000 (preentrenamiento + entrenamiento)? ¿La diferencia es realmente pequeña?
Lo envié exactamente cuando el servidor se estaba reiniciando, supongo.
Una ventaja de usar preentrenamiento es que para un entrenamiento fino se necesitan muchos menos ejemplos, épocas de entrenamiento y niveles de entrenamiento. Para el preentrenamiento, en cambio, son deseables más ejemplos. Según mi experiencia, 1500-2000 ejemplos son suficientes para el preentrenamiento. El preentrenamiento situará los pesos de la DNN en la zona de soluciones óptimas. Sólo es necesario un ajuste fino. El aumento de estos pesos conduce a la degradación de la calidad.
Pero puedes comprobarlo experimentalmente.
Buenas tardes, señores traders + programadores + matemáticos...
Al autor - gracias por el artículo, está bien explicado, incluso comprensible.... )
Vladimir, tengo una pregunta de prejuicios personales, por favor, responda si es posible:
LÍMITES DE LA SOLUCIÓN DEL PROBLEMA:
1. Entrenamiento: Buscar y seleccionar en DB2* las repeticiones encontradas de la Plantilla* en DB1*. El número de repeticiones y la desviación permitida caracterizarán completamente la confianza en la Hipótesis*. La DB2 creada con las repeticiones tendrá un tamaño mucho menor que la DB1 para los IF de interés*, y por lo tanto será menos exigente en términos de consumo de energía informática. Al convertir las citas de diferentes IF* en un único tipo de tamaño, podremos guardar las repeticiones encontradas de diferentes IF* en una DB1 (unificadora), lo que nos permitirá obtener un mayor número de Plantillas de repeticiones*.
2. Análisis: Cuando aparezca un nuevo punto en los Datos*, y en consecuencia un nuevo Patrón* -
2.1. realizar inmediatamente una nueva búsqueda en DB2 - lo que permitirá realizar una búsqueda rápida, guardar los datos encontrados en DB3* y actualizar DB2* en consecuencia
2.2. durante el tiempo de inactividad realizar una nueva búsqueda en DB1 - que permitirá realizar una búsqueda precisa pero lenta, guardar los datos encontrados en DB3* y actualizar DB2* en consecuencia
2.3. sobre la base de los cambios en DB3* comprobar (de acuerdo con la estrategia de negociación) y, si es necesario, cambiar la posición de negociación
descifrar las abreviaturas:
DB1 - Base de datos / historial de cotizaciones de todos los IF* :
1) en forma de cadena de Puntos* limitada por una larga historia, pero de la cual se analizarán grupos de 20 puntos, después de analizar este grupo hacemos un desplazamiento de un punto y repetimos el análisis.
2) como una lista de Plantillas*.
DB2 - Base de datos con Plantillas* repetidas, que son idénticas total o parcialmente (se descarta cualquier número de variables de una Plantilla*).
DB3 - Base de datos con Plantillas*, que son idénticas total o parcialmente (con desviaciones al nivel especificado en las coordenadas de los Puntos* de la Plantilla*) a la última Plantilla, es decir, actual ahora.
FI* - Instrumentos financieros (EURUSD, GBPUSD, _SPX500, ...), cada instrumento financiero se almacena en un archivo separado
Punto* - consiste en precio, fecha, volumen, que a su vez puede corresponder a: cierre de barra / fractal / etc.
Plantilla* - un grupo de 20 Puntos*.
Hipótesis* - el resultado del sistema de análisis FI* (como variante - red neuronal).
PREGUNTA SOBRE LA TAREA:
¿Puede resolverse la tarea en cuestión utilizando una red neuronal y, en caso afirmativo, cuál es el método más adecuado para entrenar la red neuronal y por qué?
Permítanme aclarar la pregunta: ¿es posible entrenar una red neuronal alimentando un número significativo de Plantillas* (una parte de la plantilla contendrá puntos de referencia para la determinación de la identidad y la segunda parte contendrá una Hipótesis*). Si la respuesta es "sí", ¿qué tipo de red neuronal se puede utilizar para ello y se ha encontrado alguna implementación ya hecha de tal cosa para
Por lo que tengo entendido las variantes que propones no sirven para esto.
Escribí la tarea un poco resumida - no quería entrar en sutilezas, pero quería obtener una respuesta a la pregunta.
Por mi parte puedo decir lo obvio - las redes neuronales me atraen, pero aún no he conseguido sumergirme en ellas.
Saludos,
Vladimir
Buenas tardes, señores traders + programadores + matemáticos...
Al autor - gracias por el artículo, está bien explicado, incluso comprensible.... )
Vladimir, tengo una pregunta de prejuicios personales, por favor, responda si es posible:
LÍMITES DE LA SOLUCIÓN DEL PROBLEMA:
1. Entrenamiento: Buscar y seleccionar en DB2* las repeticiones encontradas de la Plantilla* en DB1*. El número de repeticiones y la desviación permitida caracterizarán completamente la confianza en la Hipótesis*. La DB2 creada con las repeticiones tendrá un tamaño mucho menor que la DB1 para los IF de interés*, y por lo tanto será menos exigente en términos de consumo de energía informática. Al convertir las citas de diferentes IF* en un único tipo de tamaño, podremos guardar las repeticiones encontradas de diferentes IF* en una DB1 (unificadora), lo que nos permitirá obtener un mayor número de Plantillas de repeticiones*.
2. Análisis: Cuando aparezca un nuevo punto en los Datos*, y en consecuencia un nuevo Patrón* -
2.1. realizar inmediatamente una nueva búsqueda en DB2 - lo que permitirá hacer una búsqueda rápida, guardar los datos encontrados en DB3* y actualizar DB2* en consecuencia
2.2. durante el tiempo de inactividad realizar una nueva búsqueda en DB1 - que permitirá realizar una búsqueda precisa pero lenta, guardar los datos encontrados en DB3* y actualizar DB2* en consecuencia
2.3. sobre la base de los cambios en DB3* comprobar (de acuerdo con la estrategia de negociación) y, si es necesario, cambiar la posición de negociación
descifrar las abreviaturas:
DB1 - Base de datos / historial de cotizaciones de todos los IF* :
1) en forma de cadena de Puntos* limitada por una larga historia, pero de la cual se analizarán grupos de 20 puntos, después de analizar este grupo hacemos un desplazamiento de un punto y repetimos el análisis.
2) como una lista de Plantillas*.
DB2 - Base de datos con Plantillas* repetidas, que son idénticas total o parcialmente (se descarta cualquier número de variables de una Plantilla*).
DB3 - Base de datos con Plantillas*, que son idénticas total o parcialmente (con desviaciones al nivel especificado en las coordenadas de los Puntos* de la Plantilla*) a la última Plantilla, es decir, actual ahora.
FI* - Instrumentos financieros (EURUSD, GBPUSD, _SPX500, ...), cada instrumento financiero se almacena en un archivo separado
Punto* - consiste en precio, fecha, volumen, que a su vez puede corresponder a: cierre de barra / fractal / etc.
Plantilla* - un grupo de 20 Puntos*.
Hipótesis* - el resultado del sistema de análisis FI* (como variante - red neuronal).
PREGUNTA SOBRE LA TAREA:
¿Puede resolverse la tarea en cuestión utilizando una red neuronal y, en caso afirmativo, cuál es el método más adecuado para entrenar la red neuronal y por qué?
Permítanme aclarar la pregunta: ¿es posible entrenar una red neuronal alimentando un número significativo de Plantillas* (una parte de la plantilla contendrá puntos de referencia para la determinación de la identidad y la segunda parte contendrá una Hipótesis*). Si la respuesta es "sí", ¿qué tipo de red neuronal se puede utilizar para ello y se ha encontrado alguna implementación ya hecha de tal cosa para
Por lo que tengo entendido las variantes que propones no sirven para esto.
Escribí la tarea un poco resumida - no quería entrar en sutilezas, pero quería obtener una respuesta a la pregunta.
Por mi parte puedo decir lo obvio - las redes neuronales me atraen, pero aún no he conseguido sumergirme en ellas.
Saludos,
Vladimir
Buenas tardes.
Para tareas de entrenamiento y clasificación de secuencias de longitud variable definitivamente deberías aplicar LSTM. Hay muchas variedades de este tipo de redes neuronales. Todo depende del tipo de datos de entrada y de los objetivos de clasificación.
Ahora es posible aplicar en R/MT4 todos los tipos de redes neuronales disponibles en TensorFlow/Keras/CNTK.
Suerte
Por la tarde.
Para tareas de entrenamiento y clasificación de secuencias de longitud variable debería utilizar sin duda LSTM. Existen muchas variedades de este tipo de redes neuronales. Todo depende del tipo de datos de entrada y de los objetivos de clasificación.
Ahora es posible aplicar en R/MT4 todos los tipos de redes neuronales disponibles en TensorFlow/Keras/CNTK.
Suerte
¡Suerte!
La respuesta es clara, gracias.
Me moveré en esta dirección.
Vladimir, ¿qué piensas de unir fuerzas? Creo que juntos podemos superar...
Con todo respeto,
Vladimir
¡Muy bien!
La respuesta está clara, gracias.
Me moveré en esta dirección.
Vladimir, ¿qué piensas de unir fuerzas? Creo que podemos luchar juntos...
Con respeto,
Vladimir
Bien.
Podemos discutir el trabajo conjunto. Pero podré empezar después de terminar esta serie de artículos, espero poder hacerlo a finales de mes.
Pero podemos empezar el trabajo preparatorio y explicativo ahora. Para que el trabajo sea eficaz, es importante que entienda la idea básica. Ahora no entiendo bien su idea. ¿Puede visualizarla de alguna manera?
Buena suerte.
Hola,
¿podría explicar por qué se eligen parámetros diferentes para las distintas capas de NS:
darch.unitFunction = c(" tanhUnit"," maxoutUnit", " softmaxUnit"),
darch.dropout = c(0.1,0.2,0.1),
darch.weightUpdateFunction = c("weightDecayWeightUpdate", "maxoutWeightUpdate","weightDecayWeightUpdate"),
1) ¿sólo para mostrar que hay una gran variedad en el paquete?
2) ¿o las combinaciones de parámetros especificadas tienen alguna ventaja? (Según su experiencia).
3) ¿o la diversidad es útil en principio? Y se debería intentar utilizar parámetros diferentes para capas diferentes (no necesariamente exactamente los especificados en el código).
Hola,
¿podría explicar por qué se eligen parámetros diferentes para las distintas capas de NS:
1) ¿sólo para mostrar que hay una gran variedad en el paquete?
2) ¿o las combinaciones de parámetros especificadas tienen alguna ventaja? (Según su experiencia).
3) ¿o la diversidad es útil en principio? Y debemos tratar de utilizar diferentes parámetros para diferentes capas (no necesariamente exactamente los especificados en el código).
Debido a que tienen diferentes funciones de activación.
La función de activación de la primera capa oculta está determinada por el tipo de datos de entrada Dado que tenemos entradas en el rango +1/-1, la más apropiada es tanh, pero también puede ser sigm o maxout. La segunda capa oculta es maxout. La salida por supuesto es softmax.
La salida por experiencia. Las diferentes capas pueden y en principio deben tener diferentes parámetros. No todos los paquetes ofrecen una posibilidad tan amplia de variar los parámetros.
Elegir una combinación de estos hiperparámetros para obtener el menor error de clasificación es un problema de optimización (habrá un ejemplo en la quinta parte del artículo).
Así que se puede experimentar con cualquier parámetro (por supuesto, si son relevantes para nuestros datos).
Experimenta.
Suerte
Hola,
otra pregunta.
¿Por qué se divide el entrenamiento en 2 etapas:
1 preentrenar y luego entrenar sólo la capa superior de la DNN
y
2 aprendizaje fino de toda la red?
¿No obtendríamos el mismo resultado sin la 2ª etapa si extendemos la 1ª etapa a
preentrenar + aprendizaje fino de toda la red al mismo tiempo
(es decir, establecer rbm.lastLayer = 0, bp.learnRate = 1, darch.trainLayers = T)
Actualización. Puse en marcha un experimento:(rojo muestra los cambios en el código)
evalq({
require(darch)
require(dplyr)
require(magrittr)
Ln <- c(0, 16, 8, 0)
nEp_0 <- 25
#------------------
par_0 <- list(
layers = Ln,
seed = 54321,
logLevel = 5,
# params RBM========================
rbm.consecutive = F, # each RBM is trained one epoch at a time
rbm.numEpochs = nEp_0,
rbm.batchSize = 50,
rbm.allData = TRUE,
rbm.lastLayer = 0,
rbm.learnRate = 0.3,
rbm.unitFunction = "tanhUnitRbm",
# params NN ========================
darch.batchSize = 50,
darch.numEpochs = nEp_0,
darch.trainLayers = T,
darch.unitFunction = c("tanhUnit","maxoutUnit", "softmaxUnit"),
bp.learnRate = 1,
bp.learnRateScale = 1,
darch.weightDecay = 0.0002,
darch.dither = F,
darch.dropout = c(0.1,0.2,0.1),
darch.fineTuneFunction = backpropagation, #rpropagation
normalizeWeights = T,
normalizeWeightsBound = 1,
darch.weightUpdateFunction = c("weightDecayWeightUpdate",
"maxoutWeightUpdate",
"weightDecayWeightUpdate"),
darch.dropout.oneMaskPerEpoch = T,
darch.maxout.poolSize = 2,
darch.maxout.unitFunction = "linearUnit")
#---------------------------
DNN_default <- darch(darch = NULL,
paramsList = par_0,
x = DTcut$pretrain$woe %>% as.data.frame(),
y = DTcut$pretrain$raw$Class %>% as.data.frame(),
xValid = DTcut$val$woe %>% as.data.frame(),
yValid = DTcut$val$raw$Class %>% as.data.frame()
)
}, env)
conseguido:
INFO [2017-11-15 17:53:24] Classification error on Train set (best model): 29.1% (582/2000)
INFO [2017-11-15 17:53:24] Train set (best model) Cross Entropy error: 1.146
INFO [2017-11-15 17:53:25] Classification error on Validation set (best model): 30.54% (153/501)
INFO [2017-11-15 17:53:25] Validation set (best model) Cross Entropy error: 1.192
INFO [2017-11-15 17:53:25] Best model was found after epoch 8
INFO [2017-11-15 17:53:25] Final 0.632 validation Cross Entropy error: 1.175
INFO [2017-11-15 17:53:25] Final 0.632 validation classification error: 30.01%
INFO [2017-11-15 17:53:25] Fine-tuning finished after 4.4 secs
Tiene después del segundo paso.
INFO [2017-11-15 17:49:45] Error de clasificación en Train set (mejor modelo): 32.57% (326/1001)
INFO [2017-11-15 17:49:45] Error de entropía cruzada del conjunto de entrenamiento (mejor modelo): 1.244
INFO [2017-11-15 17:49:45] Error de clasificación en el conjunto de validación (mejor modelo): 30.74% (154/501)
Es decir, el error en el conjunto de validación es el mismo, es decir, el 30%
Antes probé con
yValid = DTcut$train$raw$Class %>% as.data.frame()
como en el código del paso 1, y obtuve:
INFO [2017-11-15 17:48:58] Error de clasificación en el conjunto de entrenamiento (mejor modelo): 28.85% (577/2000)
INFO [2017-11-15 17:48:58] Error de entropía cruzada del conjunto de entrenamiento (mejor modelo): 1.153
INFO [2017-11-15 17:48:59] Error de clasificación en el conjunto de validación (mejor modelo): 35.66% (357/1001)
Pensaba que era imposible conseguir un error del 30% con un paso, pero después de la validación con el conjunto del paso 2 se volvió tan bueno como el tuyo.
Es posible que solo el conjunto DTcut$val sea mejor que el conjunto DTcut$train, por eso también se comportó tan bien en mi único paso como en tus 2 pasos.