BlancaCC / TFG-Estudio-de-las-redes-neuronales

MIT License
10 stars 1 forks source link

Propuesta optimización: Uso de algoritmos genéticos para selección de funciones de activación #90

Closed BlancaCC closed 2 years ago

BlancaCC commented 2 years ago

Con el fin de #48 propongo el uso de algoritmos genéticos para determinar las funciones de activación a determinar. Existen ya diferentes artículos publicados al respecto como los que cito al final del issue. Sin embargo creo que se le podría dar un enfoque novedoso en los siguientes aspectos:

  1. Variabilidad de las funciones de activación En ambos artículos (1)(2) se plantean funciones de activación muy similares en forma: Captura de Pantalla 2022-05-15 a las 8 21 14

¿Por qué si existen otras formas no se contemplan? Por ejemplo una función de activación con forma Gaussiana, solo podría ser simulada con dos neuronas de funciones de activación de las que ellos plantean. Si nuestro modelo tuviera un coste fijo de neuronas y mejorara con el uso de Gaussianas, se estarían desperdiciando la mitad de éstas "simulando" a las Gaussianas. La idea recién transmitida se formalizará de manera rigurosa y avalará matemáticamente el uso de algoritmos genéticos.

  1. Resultado del algoritmo genético

Podemos ver que en (1) y (2) los algoritmos genéticos se encargan de determinar una función de activación a dos trozos, es decir el resultado es una función de activación que combina dos, la que evalúa en los negativos y la que evalúa en los positivos. Pero de acorde a la primera observación tampoco creo que esto sea una mejora sustancial. Por ello propongo que lo que determine el algoritmo genético sea qué función de activación se implementa en cada nodo y NO una única función de activación y que esté en todos.

@JJ ¿Qué opinas de explorar esta idea? ¿Se te ocurre alguna alternativa a los algoritmos genéticos que yo desconozca? Muchas gracias por la atención 😊

Artículos citados: 1. @misc{https://doi.org/10.48550/arxiv.1808.00783, doi = {10.48550/ARXIV.1808.00783}, url = {https://arxiv.org/abs/1808.00783}, author = {Basirat, Mina and Roth, Peter M.}, keywords = {Neural and Evolutionary Computing (cs.NE), Computer Vision and Pattern Recognition (cs.CV), Machine Learning (cs.LG), Machine Learning (stat.ML), FOS: Computer and information sciences, FOS: Computer and information sciences}, title = {The Quest for the Golden Activation Function}, publisher = {arXiv}, year = {2018}, copyright = {arXiv.org perpetual, non-exclusive license} }

2. @inbook{10.1145/3377929.3389942, author = {Nader, Andrew and Azar, Danielle}, title = {Searching for Activation Functions Using a Self-Adaptive Evolutionary Algorithm}, year = {2020}, isbn = {9781450371278}, publisher = {Association for Computing Machinery}, address = {New York, NY, USA}, url = {https://doi.org/10.1145/3377929.3389942}, abstract = {The introduction of the ReLU function in neural network architectures yielded substantial improvements over sigmoidal activation functions and allowed for the training of deep networks. Ever since, the search for new activation functions in neural networks has been an active research topic. However, to the best of our knowledge, the design of new activation functions has mostly been done by hand. In this work, we propose the use of a self-adaptive evolutionary algorithm that searches for new activation functions using a genetic programming approach, and we compare the performance of the obtained activation functions to ReLU. We also analyze the shape of the obtained activations to see if they have any common traits such as monotonicity or piece-wise linearity, and we study the effects of the self-adaptation to see which operators perform well in the context of a search for new activation functions. We perform a thorough experimental study on datasets of different sizes and types, using different types of neural network architectures. We report favorable results obtained from the mean and standard deviation of the performance metrics over multiple runs.}, booktitle = {Proceedings of the 2020 Genetic and Evolutionary Computation Conference Companion}, pages = {145–146}, numpages = {2} }

JJ commented 2 years ago

Opino lo que ya te he dicho... Creo que es una idea interesante a explorar, posiblemente cuando esté entregado el proyecto y con buena nota

BlancaCC commented 2 years ago

En #106 @JJ ha hecho una corrección muy legada a este tema la cual considero que es interesante reflejar en nuestra memoria:

Comentario de JJ:

Usa simplemente algoritmos de optimización. En todo caso, ya hay trabajos sobre el tema https://www.researchgate.net/profile/Kolyu-Kolev/publication/326009614_Artificial_Neural_Network_Activation_Function_Optimization_with_Genetic_Algorithms/links/5b333b70aca2720785e98ca7/Artificial-Neural-Network-Activation-Function-Optimization-with-Genetic-Algorithms.pdf https://ieeexplore.ieee.org/abstract/document/7364099?casa_token=rnW-KvcD4p4AAAAA:s4UsWyZ0HLIWkQNK0jGjm1lFmm5-QMPHbd2xSOndD4yB2MAZMiOpi7XPcyuM5npzzDWz6L2d

Mi respuesta:

He leído los artículos y aún así nuestro enfoque sería distinto, voy añadir un capítulo 8 comentándolo. El artículo que más se parece es el segundo, te comento las ventajas que tenemos frente a él:

  • Nuestro espacio de búsqueda es considerablemente menor. (Esto es una ventaja muy grande que ofrece el trabajar solo con una capa oculta) Nótese que están utilizando DNN, por lo tanto cuando calculan las posibilidades, el espacio de búsqueda sería:

número neuronas ^ (número funciones activación)

Captura de Pantalla 2022-06-01 a las 10 09 30

al trabajar con una sola capa oculta las neuronas son conmutativas, es decir da igual que pongamos una función de activación en una neurona que en otra, siempre que el número se mantenga invariante (esta idea se me ha ocurrido gracias al artículo, no va a ser nada difícil de demostrar... vaya buen teorema que me has dado idea de incluir en la memoria 😜) en nuestro caso sería

(edit: no es lineal, sigue siento menor que la exponencial. Es una recurrencia que no sé resolver 😅)

def F(n,t_max,t=1, s=""):
    """
    n = número de neuronas
    t_max = número de funciones de activación 
    """
    suma = 0
    if t > t_max:
        print(s)
        return 1
    ini = 0
    if t == t_max:
        ini = n
    for i in range(ini, n+1):
        suma += F(n-i,t_max, t+1, s+str(t_max -t +1)*i)
    return suma

Ejemplo de ejecución: 
F(4,3) sería 15 combinaciones en total: 
Donde cada número representa dígito representa a una de las tres funciones de activación. 
1111
2111
2211
2221
2222
3111
3211
3221
3222
3311
3321
3322
3331
3332
3333
BlancaCC commented 2 years ago

@JJ Aquí hay una idea muy interesante para desarrollarlo en un futuro. Me explico: ¿Te acuerdas que te comenté que se me había ocurrido una manera de pasar de una capa oculta a varias capas ocultas? Pues en ese proceso se veía además que se reducía el número de neuronas.

En resumen:

Por lo que:

  1. Seleccionamos las funciones de activación que una capa
  2. Aplicamos algoritmo de transferencia de una capa a varias.
  3. Entrenamos