Discusión sobre el artículo "Neuroredes profundas (Parte VI). Conjunto de clasificadores de redes neuronales: bagging"

 

Artículo publicado Neuroredes profundas (Parte VI). Conjunto de clasificadores de redes neuronales: bagging:

Vamos a ver los métodos de construcción y entrenamiento de conjuntos de redes neuronales con la estructura bagging. También vamos a definir las peculiaridades de la optimización de los hiperparámetros de los clasificadores de redes neuronales individuales que componen el conjunto. Asimismo, compararemos la calidad de la red neuronal optimizada obtenida en el artículo anterior de la serie, y el conjunto creado de redes neuronales. Para finalizar, analizaremos las diferentes opciones para mejorar aún más la calidad de clasificación del conjunto.

En la fig. 2 se muestran los 4 niveles de creación de un conjunto de clasificadores. En cada uno de ellos hay preguntas, cuyas respuestas analizaremos ahora.


Fig.2. Los cuatro niveles de creación de un conjunto de clasificadores

Autor: Vladimir Perervenko

 

Gracias, interesante, elmNN parece ser un digno sustituto de nnet, especialmente en ensemble. También aprendí sobre rBayesianOptimization, intentaré usarlo en el futuro.

 

Interesante artículo!
Ha sido inesperado aprender 500 redes a la vez. No pensaba que se pudiera hacer tan rápido. Con DNN serán horas...

1) En lugar del generador de números aleatorios adicional setRNG(rng[[k]]) podrías usar la función holdout(Ytrain, ratio = r/10, mode = "random", seed = i ) # donde i es el número de iteración del bucle.
De esta forma también obtendremos un nuevo conjunto mezclado de datos de entrada en cada iteración, que se repite en los reinicios.

2) En general, holdout es una gran función, mezcla los datos muy bien, mucho mejor que la auto-escrita en MT5 con la sustitución de cada línea con otra línea al azar.
Es al cambiar la semilla que se puede llegar a un muy buen resultado de aprendizaje. Traté de cambiar manualmente con darch - Tengo un error de 50% a 30% y el número de operaciones de unidades a cientos - y esto es sólo después de cambiar la clave para la mezcla. Comprobación automática en un bucle es probablemente más fiable.

3) elmNN - se asemeja a un NS regular con una época de entrenamiento. Tomando 500 piezas (de las que elegimos la mejor) obtenemos un análogo de 1 NS con 500 épocas de entrenamiento (de las que también elegimos la mejor época). Sin embargo, esto es sólo una asociación, no una afirmación.

Aunque promediar varias de las mejores redes creo que es mejor que 1 mejor resultado después de 500 epochs. Me gustaría hacer ensemble con DNN, pero me temo que será una curva de aprendizaje muy larga. Voy a experimentar)
¡Gracias por el artículo!

 
elibrarius:

Interesante artículo!
Ha sido inesperado aprender 500 redes a la vez. No pensaba que se pudiera hacer tan rápido. Con DNN serán horas...

1) En lugar de un generador de números aleatorios adicional setRNG(rng[[k]]) podríamos usar el incorporado holdout(Ytrain, ratio = r/10, mode = "random", seed = i ) # donde i es el número de iteración del bucle.
De esta forma también obtendremos un nuevo conjunto mixto de datos de entrada en cada iteración, que se repite en los reinicios.

2) En general, holdout es una gran función, mezcla los datos muy bien, mucho mejor que la auto-escrita en MT5 con la sustitución de cada línea con otra línea al azar.
Es al cambiar la semilla que se puede llegar a un muy buen resultado de aprendizaje. Traté de cambiar manualmente con darch - Tengo un error de 50% a 30% y el número de operaciones de unidades a cientos - y esto es sólo después de cambiar la clave para la mezcla. Comprobación automática en un bucle es probablemente más fiable.

3) elmNN - se asemeja a un NS regular con una época de entrenamiento. Tomando 500 piezas (de las que elegimos la mejor) obtenemos un análogo de 1 NS con 500 épocas de entrenamiento (de las que también elegimos la mejor época). Sin embargo, esto es sólo una asociación, no una afirmación.

Aunque promediar varias de las mejores redes creo que es mejor que 1 mejor resultado después de 500 epochs. Me gustaría hacer ensemble con DNN, pero me temo que será una curva de aprendizaje muy larga. Experimentaré)
¡Gracias por el artículo!

1. No se puede. La principal tarea del RNG es garantizar que los pesos de las redes neuronales del ensemble se inicialicen por variables aleatorias constantes. 2. Para optimizar los hiperparámetros, se necesita un conjunto de calidad constante.

3. Se trata de una NN monocapa pero sin aprendizaje por retropropagación. Lea la descripción en los enlaces. Allí hay todo un zoológico de ellas. Y como afirman los desarrolladores, funcionan con bastante éxito.

Los resultados del ensemble con ELM fueron honestamente para mí una gran sorpresa y la confirmación de la afirmación: "no todo lo que es difícil es brillante". En la próxima parte probaremos varios métodos para mejorar la calidad de la clasificación por promediado.

Suerte

 
Vladimir Perervenko:

1. No se puede. La principal tarea del RNG es garantizar que los pesos de las redes neuronales del conjunto se inicialicen por variables aleatorias constantes. Para optimizar los hiperparámetros, se necesita un conjunto de calidad constante.

3. Se trata de una NN monocapa pero sin aprendizaje por retropropagación. Lea la descripción en los enlaces. Allí hay todo un zoológico de ellas. Y como afirman los desarrolladores, funcionan con bastante éxito.

Los resultados del ensemble con ELM fueron honestamente para mí una gran sorpresa y la confirmación de la afirmación: "no todo lo que es difícil es brillante". En la próxima parte probaremos varios métodos para mejorar la calidad de la clasificación por promediado.

Buena suerte

1) Entendido. Además de inicializar la mezcla, también estás inicializando los pesos de la red.
¿Y simplemente set.seed(i); no dará el mismo efecto?

 
elibrarius:

1) Entendido. Además de inicializar la mezcla, también estás inicializando los pesos de la red.
¿Y simplemente set.seed(i); no dará el mismo efecto?

No, no lo hará. Se establecerá el RNG a un estado una vez, pero tenemos 500 iteraciones de foreach y necesitamos un estado diferente del RNG en cada iteración. Mira la descripción del paquete doRNG.

Suerte

 
Vladimir Perervenko:

No, no lo hará. Pondrá el RNG en un estado una vez, pero tenemos 500 iteraciones foreach y necesitamos un estado diferente del RNG en cada iteración. Mira la descripción del paquete doRNG.

Suerte

Estará dentro del bucle

  Ens <- foreach(i = 1:n, .packages = "elmNN") %do% {
    set.seed(i);
    idx <- rminer::holdout(Ytrain, ratio = r/10, mode = "random")$tr
    elmtrain(x = Xtrain[idx, ], y = Ytrain[idx], 
             nhid = nh, actfun = "sin")
  }
es decir, habrá set.seed(1); luego set.seed(2); set.seed(3); ..... set.seed(500);
 
elibrarius:

Estará dentro del bucle

Pruébalo. Puede que funcione.

 
Vladimir Perervenko:

Pruébalo. Podría funcionar.

Debería.

Y creo que es posible no desactivar el multithreading en este caso.

 
elibrarius:

Tiene que hacerlo.

Y creo que es posible no desactivar el multithreading en este caso.

Pruébalo en la práctica. Si obtienes el mismo resultado o mejor, entonces puedes hacerlo así. El lenguaje R te permite realizar la misma acción de diferentes maneras.

Suerte

 
Vladimir Perervenko:

Pruébalo en la práctica. Si obtienes el mismo resultado o mejor, entonces puedes hacerlo así. El lenguaje R te permite realizar la misma acción de diferentes maneras.

Suerte

La versión

  Ens <- foreach(i = 1:n, .packages = "elmNN") %do% {
    set.seed(i);
    idx <- rminer::holdout(Ytrain, ratio = r/10, mode = "random")$tr
    elmtrain(x = Xtrain[idx, ], y = Ytrain[idx], 
             nhid = nh, actfun = "sin")
  }

funciona. Da los mismos pesos de red cada vez que se ejecuta. Estaba comparando en la segunda red. Saqué env$Ens[2] y luego lo comparé por plugin en notepad++.

No funcionó con multithreading:

Error in setMKLthreads(2) :can't find function "setMKLthreads"

¿Qué es esta función? No está en el código de los artículos 4 y 6. ¿Cómo conectarla?

PD: Sería más conveniente si pudieras publicar la sesión de R con todas las funciones y los datos de origen.