diff --git a/.github/workflows/personal-dictionary.txt b/.github/workflows/personal-dictionary.txt index 1eabc60..5b6de7a 100644 --- a/.github/workflows/personal-dictionary.txt +++ b/.github/workflows/personal-dictionary.txt @@ -35,6 +35,7 @@ Isoperimetry Iésima JJ Julián +Jupyter LReLU LaTeX Liang @@ -71,6 +72,7 @@ Wilcoxon Wortman Zhou approximators +aproximable aproximador aproximadores autres @@ -103,18 +105,22 @@ gj gjk hiperplanos homeomorfismo +homeomorfos ij ik inasumible inecuación insesgado insesgados +ipynb jejejeje jk lcc linenos lineos md +metaheurística +metaheurísticas modus muestral multicapa @@ -133,9 +139,11 @@ perceptrón png posteriori precompilados +preimágenes primeraCapa qB reenfocar +reescalados referenciada reformulando renumerar @@ -154,6 +162,7 @@ squasher struct subespacio subespacios +subrecubrimiento sumatoria sumatorias sutilGreen diff --git a/Experimentos/comparativas-funciones-activacion/resultado-comparativas-funciones-media-tiempos-(-10_10)_1000000_15.csv b/Experimentos/comparativas-funciones-activacion/resultado-comparativas-funciones-media-tiempos-(-10_10)_1000000_15.csv index 9610b5a..08b4ed8 100644 --- a/Experimentos/comparativas-funciones-activacion/resultado-comparativas-funciones-media-tiempos-(-10_10)_1000000_15.csv +++ b/Experimentos/comparativas-funciones-activacion/resultado-comparativas-funciones-media-tiempos-(-10_10)_1000000_15.csv @@ -6,7 +6,7 @@ CosineSquasher,1522.128334,1521.1174307333333,19.223196344549216,1513.372792,149 ReLU,1546.379417,1552.0491917333336,21.43475886362318,1552.016166,1512.011125,1532.035333,1543.759375,1540.612458,1564.436708,1537.824125,1567.3520409999999,1578.8184999999999,1564.99575,1541.752958,1589.6446660000001,1584.8445,1577.180416,1554.431834 Indicadora de 0,1554.431834,1556.1143969999998,21.813565966541663,1518.339083,1511.308084,1510.907875,1538.663167,1562.783625,1556.0002909999998,1537.2600830000001,1568.3839580000001,1579.263333,1566.066459,1537.7922500000002,1586.575541,1575.844917,1575.89225,1557.448625 Rampa,1557.448625,1552.1686360666667,25.043497518707966,1535.111334,1520.111959,1549.579791,1514.297625,1545.007458,1544.746958,1540.343291,1546.379417,1588.8155829999998,1575.782625,1544.9089170000002,1561.5806670000002,1583.646417,1562.033542,1568.392292 -Threshold de 2x,1562.809333,1556.6688833333333,23.029093715119515,1584.281958,1570.896041,1572.923375,1566.459333,1579.974125,1609.038458,1594.426542,1610.811708,1608.7973339999999,1624.151667,1599.73775,1620.39075,1611.743416,1632.175667,1630.37375 +Umbral de 2x,1562.809333,1556.6688833333333,23.029093715119515,1584.281958,1570.896041,1572.923375,1566.459333,1579.974125,1609.038458,1594.426542,1610.811708,1608.7973339999999,1624.151667,1599.73775,1620.39075,1611.743416,1632.175667,1630.37375 LReLU,1564.124416,1561.367075066667,21.721638618531873,1630.1591250000001,1634.9615,1635.167917,1622.027916,1614.659458,1641.409416,1678.905541,1674.3473330000002,1672.447959,1637.151584,1664.005917,1670.290208,1672.8287090000001,1668.0979579999998,1682.95975 Valor absoluto,1583.266458,1580.5449971333333,23.463812468931806,1561.298041,1537.732667,1537.1505000000002,1564.766625,1583.266458,1574.4847909999999,1578.754958,1603.4879170000002,1599.884125,1570.287209,1587.366958,1614.3985,1605.536917,1601.6335,1588.125791 Sigmoid,1608.7973339999999,1601.0787915999997,21.937801434715055,1614.294458,1590.238917,1589.5995839999998,1591.044625,1641.8969590000002,1626.399583,1632.1184170000001,1623.39875,1668.685167,1630.391583,1644.828333,1625.854458,1673.028833,1657.49,1635.244291 diff --git a/Memoria/capitulos/0-Metodologia/Comentarios_previos.tex b/Memoria/capitulos/0-Metodologia/Comentarios_previos.tex index af33000..d81cea1 100644 --- a/Memoria/capitulos/0-Metodologia/Comentarios_previos.tex +++ b/Memoria/capitulos/0-Metodologia/Comentarios_previos.tex @@ -8,7 +8,7 @@ \section*{Comentario previo} Se pretende con este documento presentar un trabajo de fin del doble grado de Ingeniería Informática y Matemáticas y que cualquier miembro del tribunal; independientemente de la vertiente a la que pertenezca sea capaz de comprenderlo en su totalidad. -Para ello se ha acompañado la exposición con notas en los márgenes aclaratorias, que siguen el siguiente código de color y icono \footnote{Como parte de la metodología los colores han sido seleccionados de acorde a una paleta de colores inclusiva. +Para ello se ha acompañado la exposición con notas aclaratorias en los márgenes, que siguen el siguiente código de color e icono \footnote{Como parte de la metodología los colores han sido seleccionados de acorde a una paleta de colores inclusiva. Para ello se ha seleccionado una paleta de la web Palett.es, visitada por última vez el 13 de mayo del 2022 y con dirección \url{https://palett.es/6a94a8-013e3b-7eb645-31d331-26f27d}. @@ -16,7 +16,7 @@ \section*{Comentario previo} \begin{itemize} \item \iconoAclaraciones \textcolor{dark_green}{ Color 1}: Comentarios para - aclarar conceptos matemáticos o informáticos ofertar la idea intuitiva que + aclarar conceptos matemáticos o informáticos y ofrecer la idea intuitiva que se esconde, donde no se presuponen conocimientos avanzados en la materia. \item \iconoProfundizar \textcolor{blue}{ Color 2}: Comentarios para una reflexión más profunda o que indique nuevas áreas que explorar. diff --git a/Memoria/capitulos/0-Metodologia/herramientas.tex b/Memoria/capitulos/0-Metodologia/herramientas.tex index 3b19448..ac0e323 100644 --- a/Memoria/capitulos/0-Metodologia/herramientas.tex +++ b/Memoria/capitulos/0-Metodologia/herramientas.tex @@ -10,8 +10,40 @@ \subsection{GitHub} desde la planificación, comunicación, test e incluso difusión y acceso a los resultados. \subsection{Lenguaje de programación Julia} -Hemos seleccionado como lenguaje de programación \href{https://julialang.org}{Julia}, -esto se debe a que nos ofrece \textit{benchmarks} muy competitivos\footnote{Véase los resultado expuestos en -\url{https://julialang.org/benchmarks/}, web consultada por última vez el 22 de mayo de 2022.} -, al nivel de C. Así como la disponibilidad de bibliotecas usadas en ciencia de datos de -la de lenguajes como \textit{R} y \textit{Python}. \ No newline at end of file +Hemos seleccionado como lenguaje de programación \href{https://julialang.org}{Julia} +por los siguientes motivos: +\begin{itemize} + \item Ofrece \textit{benchmarks} + muy competitivos\footnote{Véase los resultado expuestos en + \url{https://julialang.org/benchmarks/}, + web consultada por última vez el 22 de mayo de 2022.}, + al nivel de C. + \item Variedad de bibliotecas usadas para ciencia de datos que podríamos encontrar + en otros lenguajes muy utilizados en el sector como son Python y R. + \item Otras características del lenguaje que facilitan + la optimización del código como veremos en la sección \ref{ch06:activation-function-implementation}. +\end{itemize} + +\subsection{\textit{Notebooks}} +% Comentario sobre qué es un scripts +\marginpar{\maginLetterSize + \iconoAclaraciones \textcolor{dark_green}{ + \textbf{ + Significado del término \textit{script} + } + } + + Término para designar un programa relativamente simple y que por lo general + es interpretado (se va traduciendo y ejecutando línea a línea). +} + +Todos los gráficas que se muestran en la memoria han sido creadas por nosotros. +Las hemos generado con \textit{scripts} o la mayoría de la veces con +\href{https://jupyter.org}{\textit{notebooks} de Jupyter}, el motivo de esto ha +sido el tener una interacción y visualización más cómoda y compacta de los resultados. + +El lenguaje utilizado en los \textit{notebooks} ha sido Julia o Python indistintamente, +a conveniencia de cuál ofrecía la función o biblioteca más cómoda para el propósito. + + + \ No newline at end of file diff --git a/Memoria/capitulos/0-Metodologia/introduccion.tex b/Memoria/capitulos/0-Metodologia/introduccion.tex index 0dc1f59..5fa051c 100644 --- a/Memoria/capitulos/0-Metodologia/introduccion.tex +++ b/Memoria/capitulos/0-Metodologia/introduccion.tex @@ -12,7 +12,7 @@ \chapter{Metodología} a otras áreas de la ciencia; hemos aplicado por ende la metodología expuesta en el artículo \cite{DBLP:journals/corr/abs-2104-12545}, realizado -el trabajo desarrollando con una mentalidad ágil, de acorde a las siguientes hipótesis: +el trabajo con una mentalidad ágil, de acorde a las siguientes hipótesis: \begin{enumerate} \item Se premia la \textbf{reproducibilidad}, \textit{la ciencia no puede ser ciencia si no es reproducible}. Es por @@ -69,12 +69,12 @@ \section{\textit{Personas definidas}} \label{ch:metodología_personas} \item \textbf{Rosa Camarero}, desea implementar un modelo de red neuronal que mejore a los actuales en algún aspecto, ya sea porque reduzca su coste computacional o espacio en memoria. - \item \textbf{María López}, catedrática en matemáticas aplicadas y miembro del tribunal . Su conocimiento - de informática es moderado. Valora una memoria formal y rigurosa. Se encarga de evaluar trabajos fin de grado, en particular éste mismo + \item \textbf{María López}, catedrática en matemáticas aplicadas y miembro del tribunal. Su conocimiento + de informática es moderado. Valora una memoria formal y rigurosa. Se encarga de evaluar trabajos fin de grado, en particular éste mismo. - \item \textbf{Pedro Castillo}, Doctor experto en \textit{deep learning} y miembro del tribunal. Valora la claridad, las experimentaciones sensatas y fundamentadas así cómo la posibilidad de aplicaciones reales. Se encarga de evaluar trabajos fin de grado, en particular éste mismo. + \item \textbf{Pedro Castillo}, Doctor experto en \textit{deep learning} y miembro del tribunal. Valora la claridad, las experimentaciones sensatas y fundamentadas así como la posibilidad de aplicaciones reales. Se encarga de evaluar trabajos fin de grado, en particular éste mismo. - \item \textbf{Javier Merí}, profesor del departamento de análisis matemático y contutor del proyecto (junto con JJ). Busca de manera formal rigurosa entender y optimizar las redes neuronales usando herramientas analíticas. Estará presente durante todo el desarrollo. + \item \textbf{Javier Merí}, profesor del departamento de análisis matemático y contutor del proyecto (junto con JJ). Busca de manera formal y rigurosa entender y optimizar las redes neuronales usando herramientas analíticas. Estará presente durante todo el desarrollo. \item \textbf{JJ Merelo}, profesor del departamento de arquitectura de computadores y contutor del proyecto (junto con Javier). Busca resolver problemas relacionados con la optimización bajo un punto de vista más práctico y experimental, salvaguardando un trabajo bien organizado y metódico. Estará presente durante todo el desarrollo. @@ -88,7 +88,7 @@ \section{Historias de usuario} \label{ch:metodología_personas_historias_de_us A partir de los usuarios se han definido las historias de usuario \cite{UserStories}, que han quedado registradas como \textit{issues} etiquetadas con \textit{user story} y cabecera de formato -\texttt{[HUxx] título de la historia de usuario} \href{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales}{nuestro repositorio +\texttt{[HUxx] título de la historia de usuario} en \href{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales}{nuestro repositorio de GitHub}, donde \texttt{HUxx} representa la historia de usuario número $xx$. @@ -103,7 +103,10 @@ \subsubsection*{\href{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuro \subsubsection*{ \href{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales/issues/65}{[HU02] Metodología} } \label{HUO2} -Como \textit{JJ} me gustaría que el proyecto se realizara bajo un desarrollo ágil, el cuál recoge sus principios en el siguiente manifiesto \cite{principios-manifiesto-agil} y que es una filosofía, no una metodología \cite{why-agile-is-not-a-methodology-1} \cite{why-agile-is-not-a-methodology-2}. +Como \textit{JJ} me gustaría que el proyecto se realizara bajo un desarrollo ágil, el cual recoge sus principios en el siguiente manifiesto \cite{principios-manifiesto-agil} y que es una filosofía, no una metodología \cite{why-agile-is-not-a-methodology-1} \cite{why-agile-is-not-a-methodology-2}. +Puede encontrar su declaración en las historias de usuario definidas en \href{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales}{nuestro repositorio +de GitHub} \footnote{Visite el \textit{issue} 65 \url{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales/issues/65}.}. + \subsubsection*{ \href{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales/issues/50}{ @@ -124,14 +127,16 @@ \subsubsection*{ [HU04] Indagar y experimentar sobre redes neuronales} } \label{HUO4} -Como \textit{Javier y JJ} gustaría plantear nuevas hipótesis para conocer en mayor profundidad, +Como \textit{Javier y JJ} nos gustaría plantear nuevas hipótesis para conocer en mayor profundidad, aclarar limitaciones, particularizar o abstraer en cualquier aspecto de las redes neuronales actuales. -\subsubsection*{ - \href{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales/issues/49}{[HU05] Requisitos tribunal} -} \label{HUO6} -Como \textit{Mayte y Pablo} queremos corregir un trabajo fin de grado bien hecho. -Bajo el contexto de evaluación la memoria debe de cumplir una serie de requisitos imprescindibles: +Puede encontrar su declaración en las historias de usuario definidas en \href{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales}{nuestro repositorio +de GitHub} \footnote{Visite el \textit{issue} 51 \url{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales/issues/51}.}. + + +\subsubsection*{[HU05] Requisitos tribunal} \label{HUO6} +Como \textit{María y Pedro} queremos corregir un trabajo fin de grado bien hecho. +Bajo el contexto de evaluación, la memoria debe de cumplir una serie de requisitos imprescindibles: \begin{enumerate} \item Declaración explícita firmada en la que se asume la originalidad del trabajo, entendida en el sentido de que no ha utilizado fuentes sin citarlas debidamente. Esta declaración se puede descargar en la web del Grado (matemáticas). @@ -153,13 +158,13 @@ \section{Hitos} \label{ch00:hitos} Los hitos describen entregables, productos mínimos viables y se basan en las historias de usuarios, puede encontrar nuestras declaraciones en nuestro repositorio \footnote{Concretamente en la sección de \textit{milestones}, cuya URL es \url{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales/milestones}.}. -A éstas además le hemos asociado una fecha de entrega. +A éstas además les hemos asociado una fecha de entrega. \subsection*{Hito 0: Explicitación escrita de la metodología} -Consiste en la redacción de la descripción de la metodología a seguir resultando en capítulos concretos de la memoria +Consiste en la redacción de la descripción de la metodología a seguir, resultando en capítulos concretos de la memoria y \textit{issues} en la plataforma de trabajo, GitHub. -La documentación presentada deberá de incluir: +La documentación presentada deberá incluir: \begin{itemize} \item Explicitación de la metodología. \item Definición y descripción de personas. @@ -178,16 +183,12 @@ \subsection*{Hito 1: Búsqueda de resultados teóricos para optimizar las redes \item En general, cualquier hipótesis que se pueda relajar o cambiar en el camino de reducir el espacio de búsqueda de posibles redes neuronales o de los pesos de las mismas. \end{itemize} -El estudio progresivo se verá reflejado en varios capítulos y secciones de la memoria. Con secciones como: -\textit{Definición y construcción de las redes neuronales}. -Este hito consiste en la redacción de una serie de capítulos y secciones -que estudien: - -Se aceptarán las secciones una vez hayan sido supervisadas y validadas por los tutores. +El estudio progresivo se verá reflejado en varios capítulos y secciones de la memoria +que se aceptarán una vez hayan sido supervisadas y validadas por los tutores. \subsection*{Hito 2: Evaluación experimental de las hipótesis de optimización formuladas} -Deberá de validarse y cuantificar experimentalmente las propuestas de optimización del hito anterior. +Deberán de validarse y cuantificar experimentalmente las propuestas de optimización del hito anterior. Para ello se deberá de: \begin{enumerate} @@ -197,21 +198,17 @@ \subsection*{Hito 2: Evaluación experimental de las hipótesis de optimización \item Una descripción y formulación de los test. \end{itemize} - \item \textbf{Evaluar los resultados.} + \item \textbf{Evaluar los resultados}. \end{enumerate} -El criterio de aceptación de un producto mínimo viable consistirá en: +El criterio de aceptación de un producto mínimo viable consistirá en verificar que: \begin{itemize} - \item La implementación de los algoritmos debe de ser coherente y proveniente del hito anterior y debe de estar referenciada. - \item Toda implementación deberá previamente comprobar su correcto funcionamiento mediante tests. - \item La redacción del análisis y conclusiones deberá ser aprobado por los tutores nuevamente. + \item La implementación de los algoritmos debe de es coherente y proveniente del hito anterior y debe de estar referenciada. + \item Toda implementación comprueba su correcto funcionamiento mediante tests. + \item La redacción del análisis y conclusiones es aprobada por los tutores nuevamente. \end{itemize} -\subsection*{Hito 3: Implementación de aplicaciones reales que se beneficien de las optimizaciones encontradas } - -A partir de las optimizaciones encontradas del hito previo deberá de implementarse alguna aplicación real que se beneficie de algunas de las optimizaciones encontradas. - -Un ejemplo de ello podría ser entrenar una red neuronal en una raspberry pi . +%Suprimo el Hito 3 porque por desgracia no nos va a dar tiempo :( @@ -226,8 +223,9 @@ \subsection*{Hito x: Entrega del proyecto} \section{Registro de trabajo} Con el fin de constatar que el desarrollo efectivamente se ha -llevado con una filosofía ágil y según a los tiempos estipulados se ha registrando el tiempo, tareas dedicadas y hitos relacionados -en las siguiente \href{https://docs.google.com/spreadsheets/d/1TCcKQIKjKW9sMSU2f6obN9gHgv3c8UEdjmONkBlv42M/edit?usp=sharing}{hoja de cálculo}. +llevado con una filosofía ágil y según los tiempos estipulados se han registrado el tiempo, + las tareas dedicadas y los hitos relacionados +en la siguiente \href{https://docs.google.com/spreadsheets/d/1TCcKQIKjKW9sMSU2f6obN9gHgv3c8UEdjmONkBlv42M/edit?usp=sharing}{hoja de cálculo}. En total el número de horas invertidas ha sido: \textcolor{red}{TODO Estos TODOS están relacionados con el issue 46} @@ -239,8 +237,8 @@ \section{Registro de trabajo} \section{Resumen de la metodología} Se ha seguido un desarrollo ágil que radica en la resolución de problemas expuestos como historias de usuarios. -Éstas historias de usuario se formulan en base a los beneficiados,personas bien definidas; se formalizan -mediante \textit{issues} y entraman los \textit{hitos}, hitos con los que guiar el desarrollo. +Éstas historias de usuario se formulan en base a los beneficiados, personas bien definidas; se formalizan +mediante \textit{issues} y entraman los \textit{hitos}, con los que guiar el desarrollo. Todo esto se puede leer no solo en esta memoria sino también en nuestro repositorio de GitHub \cite{TFG-Estudio-de-las-redes-neuronales}. diff --git a/Memoria/capitulos/1-Introduccion_redes_neuronales/Objetivos.tex b/Memoria/capitulos/1-Introduccion_redes_neuronales/Objetivos.tex index 5f2defd..dfe720d 100644 --- a/Memoria/capitulos/1-Introduccion_redes_neuronales/Objetivos.tex +++ b/Memoria/capitulos/1-Introduccion_redes_neuronales/Objetivos.tex @@ -23,7 +23,7 @@ \chapter{Introducción a las redes neuronales} \cite{a-universal-law-of-Robustness} \cite{CHAI2021100134} el sustento de esto no deja de ser experimental o basado en cotas de carácter \textit{en el peor de los casos y por el tamaño del espacio de búsqueda}. Pero estos motivos no constituyen una demostración formal ni rigurosa de porqué decantarnos verdaderamente por -ello y es más otros artículos experimentales demuestran que aumentar el número de capas no mejora los resultado +ello y, es más otros artículos experimentales demuestran que aumentar el número de capas no mejora los resultado \cite{DBLP:conf/iwann/Linan-Villafranca21}. Así pues, sustentados con la demostración de convergencia universal \cite{HORNIK1989359} diff --git a/Memoria/capitulos/1-Introduccion_redes_neuronales/feedforward-network-una-capa.tex b/Memoria/capitulos/1-Introduccion_redes_neuronales/feedforward-network-una-capa.tex index 79d97c4..75fc6df 100644 --- a/Memoria/capitulos/1-Introduccion_redes_neuronales/feedforward-network-una-capa.tex +++ b/Memoria/capitulos/1-Introduccion_redes_neuronales/feedforward-network-una-capa.tex @@ -3,37 +3,25 @@ %******************************************************* % Construcción redes neuronales una capa %******************************************************* +% Introducción al capítulo -\section{Definición de las redes neuronales \textit{Feedforward Networks} -de una capa oculta} \label{sec:redes-neuronales-intro-una-capa} +A lo largo de este capítulo daremos una modelización propia de red neuronal y la compararemos con otros modelos ofrecidos. +Probaremos además que el modelo propuesto es un aproximador universal, es decir es capaz de aproximar cualquier función medible. -% Nota margen aclarativa de una función medible -\reversemarginpar -\setlength{\marginparwidth}{\smallMarginSize} -\marginpar{\maginLetterSize - \iconoAclaraciones \textcolor{dark_green}{ - \textbf{Qué son las funciones medibles - y porqué las usamos en nuestra definición.} - } - {\maginLetterSize - A nivel intuitivo una función medible es aquella, - que por muy extraña que sea, - su imagen (los valores que toma su salida) está acotada casi siempre, lo que a nivel práctico - significa que \textit{podemos observar y cuantificar sus valores.} - - Con esto pretendemos que nuestra definición $\Gamma$ - sea lo menos restrictiva posible. - } -} -\normalmarginpar -\setlength{\marginparwidth}{\bigMarginSize} +% Comienzo de la sección +\section{Definición de las redes neuronales \textit{Feedforward Networks} +de una capa oculta} \label{sec:redes-neuronales-intro-una-capa} -A lo largo de esta sección explicaremos qué es una red neuronal, cómo está construida y en qué consiste el \textit{aprendizaje} de la misma, concretamente +Ya estamos en condiciones de introducir qué es una red neuronal, +cómo está construida y en qué consiste el \textit{aprendizaje} de la misma. +Concretamente construiremos el tipo particular \textit{Feedforward Neural Networks}, al cual nos referiremos de ahora en adelante como red neuronal. -De acorde con nuestra filosofía de trabajo expuesta en la introducción del capítulo \ref{motivo-una-capa} partiremos de un modelo de una sola capa oculta. +De acorde con nuestra filosofía de trabajo expuesta en la introducción del capítulo \ref{motivo-una-capa} +partiremos de un modelo de una sola capa oculta y además comenzaremos presentando el modelo que +hemos considerado más conveniente; esta decisión es argumentada en el capítulo \ref{chapter:construir-redes-neuronales}. % Imagen grafo red neuronal una capa oculta muy simple y en blanco y negro \begin{figure}[h!] @@ -42,7 +30,7 @@ \section{Definición de las redes neuronales \textit{Feedforward Networks} \caption{\textit{Grafo} de una red neuronal de una capa oculta} \label{img:grafo-red-neuronal-una-capa-oculta} \end{figure} -%\begin{mdframed} % Añadimos símbolo de que es contenido + \begin{aportacionOriginal} \begin{definicion}[Redes neuronales de una capa oculta] \label{definition:redes_neuronales_una_capa_oculta} Dados $X \subseteq \R^d, Y \subseteq \R^s$ y $\Gamma$ un conjunto no vacío de funciones medibles definidas de $\R$ a $\R$, denotaremos como @@ -62,7 +50,28 @@ \section{Definición de las redes neuronales \textit{Feedforward Networks} \end{align} \end{definicion} \end{aportacionOriginal} -%\end{mdframed} + +% Nota margen aclarativa de una función medible +\reversemarginpar +\setlength{\marginparwidth}{\smallMarginSize} +\marginpar{\maginLetterSize + \iconoAclaraciones \textcolor{dark_green}{ + \textbf{Qué son las funciones medibles + y porqué las usamos en nuestra definición.} + } + {\maginLetterSize + A nivel intuitivo una función medible es aquella, + que por muy extraña que sea + su imagen (los valores que toma su salida) está acotada casi siempre, lo que a nivel práctico + significa que \textit{podemos observar y cuantificar sus valores.} + + Con esto pretendemos que nuestra definición $\Gamma$ + sea lo menos restrictiva posible. + } +} +\normalmarginpar +\setlength{\marginparwidth}{\bigMarginSize} + % Nota margen aclarativa de la fórmula \marginpar{\maginLetterSize \iconoAclaraciones \textcolor{dark_green}{ @@ -137,58 +146,3 @@ \subsection*{Diferencia con otras definiciones} \label{subsection:diferencia-ot \item \textbf{Se elimina un parámetro} de la transformación afín de la última capa; puesto que no es necesario para la convergencia de nuevo por \ref{teo:MFNAUA} lo hemos eliminado. \item Nuestras funciones de activación son funciones medibles en vez de diferenciables ya que a priori no existe ninguna hipótesis teórica que fuerce a tal restricción, como hemos visto en \ref{teo:MFNAUA}. \end{itemize} - -\subsection*{Las funciones de activación $\Gamma$ son la clave del aprendizaje} - -Notemos que de no ser por las funciones de activación se estarían haciendo transformaciones lineales de los datos, por el contrario estamos realizando \textit{cambios más fuerte} siendo capaz con esto de \textit{de diferenciar puntos claves}. - -\textcolor{red}{Dicho de esta manera queda muy poco claro y habría que profundizar más.} -Vamos a mostrar un ejemplo de la importancia de la función de activación - -\textcolor{red}{TODO : Añadir gráficos cuando esté implementada una red neuronal} - - -% Ejemplo de cómo se aproxima gracias a la forma de la función de activación -\begin{figure}[h!] - \includegraphics[width=\textwidth]{1-Introduccion_redes_neuronales/idea-como-aproxima-redes-neuronales.jpeg} - \caption{Cómo actúa en la aproximación una función de activación} - \label{img:idea-como-aproxima-redes-neuronales} - \end{figure} - -La idea intuitiva es que para una capa oculta con una neurona, -lo que se hace es \textit{colocar} por escalado y simetrías la imagen de la función de activación. - -% Ejemplo trivial de como la forma de la función de activación influye en aproximar mejor -\begin{figure}[h!] - \includegraphics[width=0.8\textwidth]{1-Introduccion_redes_neuronales/Idea-forma-función-Activación.jpg} - \caption{Cómo afecta la forma de la función de activación} - \label{img:como afecta la forma de la función de aproximación} - \end{figure} - -% IDEA -\iconoAclaraciones \textcolor{dark_green}{ Nota idea Blanca: Multiplicar por un coeficiente complejo sería aplicar un giro, - lo que a priori mejoraría la convergencia - ¿Qué pasaría se cambiáramos el cuerpo?} - -Ante esta idea habría que plantearse si: - -\begin{enumerate} - \item Formalizar si esto mejoraría. - \item A nivel de implementar Julia tiene números complejos ¿cuánto supondría de coste computacional? ¿merecería la pena? - \item ¿Cómo habría que actualizar los pesos? -\end{enumerate} - -% IDEA -\iconoAclaraciones \textcolor{dark_green}{ Nota idea Blanca: Vista esta idea sería muy interesante plantearse a partir de los datos cómo deberían de ser las funciones de activación. Es decir, que no se fijen a priori, sino que sean de los datos donde provenga su forma.} - -Para poder utilizarse la idea que acaba de plantearse debería de plantearse: -\begin{enumerate} - \item Formalizar beneficio teórico. - \item Balanza costo y mejora. - \item Una forma de mejorar que acepte esas funciones (no necesariamente \textit{backpropagation}). -\end{enumerate} - -% IDEA -\iconoAclaraciones \textcolor{dark_green}{ Nota idea Blanca: Ante esto mi intuición me dice que que la función de activación sea constante por algún extremo y que no fuera constante en algún intervalo serían las únicas hipótesis para que tal función de activación sirviera para construir redes neuronales que funcionara como aproximador universal} - - diff --git a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_1_primeras_definiciones.tex b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_1_primeras_definiciones.tex index 82a6d12..689ec4e 100644 --- a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_1_primeras_definiciones.tex +++ b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_1_primeras_definiciones.tex @@ -28,7 +28,7 @@ \section{Definiciones primeras}\label{ch:articulo:sec:defincionesPrimeras} } Se probará la convergencia de las redes neuronales independientemente de la función de activación seleccionada. Cabe entonces la pregunta ¿Existen funciones de activación más democráticas que otras? - Se discutirá esta pregunta como hipótesis de optimización \ref{hypothesis:activation-function}. + Se discutirá esta pregunta en \ref{funciones-activacion-democraticas-mas-demoscraticas}. } % Imágenes de la función indicadora @@ -96,29 +96,46 @@ \section{Definiciones primeras}\label{ch:articulo:sec:defincionesPrimeras} Notemos que así definidas las funciones de activación son medibles, ya que la imagen inversa de un abierto de $[0,1]$ siempre será un conjunto medible de $\R$ (capítulo 7 página 77 \cite{nla.cat-vn1819421}). - % Nota margen sobre que abstrae esta estructura de red neuronal - \marginpar{\maginLetterSize - \iconoAclaraciones \textcolor{dark_green}{ - \textbf{Idea tras la definición de $\pmc$.} - } - Nótese que de acorde a nuestra definición - \textcolor{red}{TODO añadir referencia} - lo que se ha definido es la clase de las redes - neuronales de una capa oculta y salida de una dimensión. - Donde cada sumando representa una neurona de la capa oculta. - } - %%% fin nota Cabe destacar que la definición tomada es la propuesta en \cite{HORNIK1989359} y que existen otras posibles definiciones menos restrictivas con las que también se ha probado la convergencia universal. Por ejemplo podrían aceptarse funciones de activación no continuas (véase \cite{FUNAHASHI1989183}); o como se demuestra en \cite{DBLP:journals/corr/SonodaM15} y en \cite{non-polynomial-activation-functions}, funciones de activación no polinómicas y no acotadas. - \end{definicion} +\subsection*{Las funciones de activación $\Gamma$ son la clave del aprendizaje} + +\label{ch03:funcionamiento-intuitivo-funcion-activacion} + +Las \textit{funciones de activación} serán definidas con precisión en la sección +\ref{def:funcion_activacion_articulo}, pero para continuar con nuestro razonamiento +pensemos en ellas como una función cualquiera que no sea un polinomio. + +Una vez liberados de tratar de buscar un polinomio que aproxime la función en todo +el dominio, podemos pensar en aproximar la imagen de acorde a intervalos. + +% Issue #114 TODO : Añadir gráficos cuando esté implementada una red neuronal + +% Ejemplo de cómo se aproxima gracias a la forma de la función de activación +\begin{figure}[H] + \includegraphics[width=\textwidth]{1-Introduccion_redes_neuronales/idea-como-aproxima-redes-neuronales.jpeg} + \caption{Cómo actúa en la aproximación una función de activación} + \label{img:idea-como-aproxima-redes-neuronales} + \end{figure} +La idea intuitiva es que para una capa oculta con una neurona, +lo que se hace es \textit{colocar} por escalado y simetrías la imagen de la función de activación. +% Ejemplo trivial de como la forma de la función de activación influye en aproximar mejor +\begin{figure}[h!] + \includegraphics[width=0.8\textwidth]{1-Introduccion_redes_neuronales/Idea-forma-función-Activación.jpg} + \caption{Cómo afecta la forma de la función de activación} + \label{img:como afecta la forma de la función de aproximación} +\end{figure} + + +% Fin del tratamiento de funciones de activación Para cualquier natural $d$ mayor que cero denotaremos por $\afines$ al conjunto de todas las \textbf{funciones afines} de $\R^d$ a $\R$. Es decir el conjunto de funciones de la forma $A(x) = w \cdot x + b$ donde $x$ y $w$ son vectores de $\R^d$, $b \in \R$ es un escalar @@ -126,17 +143,17 @@ \section{Definiciones primeras}\label{ch:articulo:sec:defincionesPrimeras} usual. En este contexto, $x$ corresponde al vector entrada de la red neuronal, $w$ los pesos de la red que se multiplicarán con $x$ en la capa intermedia y $b$ el sesgo. - % Nota margen sobre Idea intuitiva de la definición - \marginpar{\maginLetterSize - \iconoAclaraciones \textcolor{dark_green}{ - \textbf{Motivación de la definición de $\pmcg$}}. - - En un principio será más fácil demostrar que con funciones de esta clase seremos capaz de aproximar cualquier función continua. - De esta manera este conjunto actuará de nexo de unión entre las funciones continuas y las redes neuronales facilitando las demostraciones. De ahora en adelante nos referiremos a este conjunto como al \textbf{de anillo de aproximación} (como curiosidad, el nombre proviene a que tiene estructura de anillo y que se utilizará para aproximar funciones continuas). - } - - - + % Nota margen sobre que abstrae esta estructura de red neuronal + \marginpar{\maginLetterSize + \iconoAclaraciones \textcolor{dark_green}{ + \textbf{Idea tras la definición de $\pmc$.} + } +Nótese que de acorde a nuestra definición \ref{definition:redes_neuronales_una_capa_oculta} +lo que se ha definido es la clase de las redes +neuronales de una capa oculta y salida de una dimensión. +Donde cada sumando representa una neurona de la capa oculta. +} +%%% fin nota \begin{definicion} [Formalización de una red neuronal de una capa oculta y salida real] Para cualquier función Borel medible $G$, definida de $\R$ a $\R$ y cualquier natural positivo $d \in \N$ se define a la clase de funciones $\pmc$ como @@ -154,13 +171,26 @@ \section{Definiciones primeras}\label{ch:articulo:sec:defincionesPrimeras} \end{equation} Conforme avancen los resultado teórico veremos que $\pmc$ - no depende de la función $G$ seleccionada, así pues tras enunciar tales resultados nos referiremos sin ambigüedad tal conjunto como $\rrnn$. + no depende de la función $G$ seleccionada, así pues tras enunciar tales resultados nos referiremos sin ambigüedad a tal conjunto como $\rrnn$. \end{definicion} + Definiremos a continuación una familia de funciones más generales que $\pmc$ con la intención de que actúe como nexo de unión entre la clase de funciones continuas y las redes neuronales de una capa facilitándonos con ello la prueba de los resultados. La familia que introduciremos solo tiene una utilidad teórica, es decir no tendrá ninguna relevancia a nivel práctico en cuanto a implementaciones. - +% Nota margen sobre Idea intuitiva de la definición +\marginpar{\maginLetterSize +\iconoAclaraciones \textcolor{dark_green}{ +\textbf{Motivación de la definición de $\pmcg$}}. + +En un principio será más fácil demostrar que con +funciones de esta clase seremos capaz de aproximar cualquier función continua. +De esta manera este conjunto actuará de nexo de unión entre las funciones continuas y las redes neuronales +facilitando las demostraciones. De ahora en adelante nos + referiremos a este conjunto como al \textbf{de anillo de aproximación} (como curiosidad, el nombre proviene a que + tiene estructura de anillo y que se utilizará para + aproximar funciones continuas). +} \begin{definicion} [Anillo de aproximación de redes neuronales]\label{def:articulo_abstracción_rrnn} \begin{equation} @@ -180,28 +210,7 @@ \section{Definiciones primeras}\label{ch:articulo:sec:defincionesPrimeras} \end{definicion} - -\subsection{ Reflexión sobre la relevancia de la función de activación} - -\textcolor{red}{Este párrafo es redundante con el de la introducción, habría que ver cómo casarlos} -La función de activación $G$ es clave en el proceso de aprendizaje. -Por una parte nótese que como $\afines$ es el espacio de funciones afines, lo que se está haciendo es -aproximar una función medible a partir de combinaciones lineales de \textit{rectas} evaluadas mediante $G$. - -\begin{figure}[h!] - \includegraphics[width=\textwidth]{articulo_rrnn_aproximadores_universales/ejemploAproximaciónCurvasPorRectas.jpeg} - \caption{Ejemplo de curva aproximada por un perceptrón multicapa \cite{alma991008058419704990}. El interior de la curva da lugar a la categoría $+$ y el exterior a otra, la $-$.} - \label{img:def_esenciales_ejemplo_curva_aproximada_percentrón_multicapa} -\end{figure} - -Se probará la convergencia de las redes neuronales independientemente de la función de activación seleccionada. Cabe entonces la pregunta -¿Existen funciones de activación más democráticas que otras? -Se discutirá esta pregunta como hipótesis de optimización \ref{hypothesis:activation-function}. - -Por otra parte, la función de activación acota la imagen de una aplicación afín, esta limitación -es de total relevancia ya que permite una interpretación previamente convenida. -Decimos por ende que es la causante del \textit{aprendizaje}. - +\reversemarginpar %%% Nota margen sobre función medible \marginpar{\maginLetterSize \iconoAclaraciones \textcolor{dark_green}{ @@ -218,11 +227,7 @@ \subsection{ Reflexión sobre la relevancia de la función de activación} que pueden ser observables y cuantificables en la mayoría de los casos, estos comportamientos son formalizados matemáticamente con \textbf{funciones medibles}. } -Por si el comentario no ha resultado claro procedamos a dar un ejemplo: -Supongamos que nos hallamos frente a un problema de clasificación de dos clases y que la función de activación -tomada es una función umbral que toma valores cero o uno. Define por tanto esta función una separación de clases. -De otra manera, de solo existir la función afín sin una transformación de la salida, el codominio serían -todos los número reales donde a priori no se explicita una asignación de clase. +\normalmarginpar Introducimos a continuación la notación de los conjuntos de funciones que seremos capaces de aproximar. @@ -266,9 +271,10 @@ \subsection{ Reflexión sobre el tipo de funciones que se pueden aproximar} con la precisión que se desee}. } \normalmarginpar + Dado un subconjunto $S$ de un espacio métrico $(X, \rho)$, se dice que $S$ es denso por la distancia $\rho$ - en subconjunto $T$ si para todo $\epsilon$ positivo y cualquier $t \in T$ existe un $s \in S$ tal - que $\rho(s,t) \leq \epsilon$. + en subconjunto $T$ si para todo $\varepsilon$ positivo y cualquier $t \in T$ existe un $s \in S$ tal + que $\rho(s,t) \leq \varepsilon$. \end{definicion} Un ejemplo habitual es en el espacio métrico $(\R, |\cdot|)$ con $|\cdot|$ el valor absoluto, el subconjunto @@ -289,6 +295,9 @@ \subsection{ Reflexión sobre el tipo de funciones que se pueden aproximar} \iconoAclaraciones \textcolor{dark_green}{ \textbf{Noción intuitiva de compacto} } + + Un compacto es un conjunto que \textbf{se puede cambiar por un subconjunto finito cometiendo un error prefijado}. + Al trabajar con números reales, un espacio es compacto si es cerrado y acotado, lo que a nivel práctico significa que los \textbf{datos de entrada se encuentran dentro de un rango concreto}. } @@ -299,7 +308,7 @@ \subsection{ Reflexión sobre el tipo de funciones que se pueden aproximar} \textbf{Noción intuitiva de uniformemente denso para compactos } } lo que indica es que \textit{controlamos} \textbf{cuánto de cerca - están dos funciones sea cual sea cualquier punto del compacto en que evaluemos} es decir, podríamos afirmar que para una red neuronal que tome valores por ejemplo en $[0,1]^r$, se puede saber que su error es menor que $\epsilon \in\R^+$ independientemente de la entrada. + están dos funciones sea cual sea cualquier punto del compacto en que evaluemos} es decir, podríamos afirmar que para una red neuronal que tome valores por ejemplo en $[0,1]^r$, se puede saber que su error es menor que $\varepsilon \in\R^+$ independientemente de la entrada. } \end{definicion} diff --git a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_2_teorema_1_hasta_lema_2_2.tex b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_2_teorema_1_hasta_lema_2_2.tex index 9af64da..83f2e02 100644 --- a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_2_teorema_1_hasta_lema_2_2.tex +++ b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_2_teorema_1_hasta_lema_2_2.tex @@ -134,8 +134,8 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en \reversemarginpar \marginpar{\maginLetterSize \iconoProfundizar \textcolor{blue}{\textbf{Nueva hipótesis de optimización}} El corolario \ref{cor:se-generaliza-G-a-una-familia} -abre la puerta a preguntarse si la combinación de diferentes funciones de activación podría mejorar los resultados de alguna manera. -Abordaremos esta cuestión en \ref{hypothesis:activation-function}. +abre la puerta a preguntarse si la combinación de diferentes funciones de activación +podría mejorar los resultados de alguna manera. } \normalmarginpar @@ -163,43 +163,26 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en \end{proof} \end{aportacionOriginal} +\iconoClave \textcolor{darkRed}{ \textbf{Cómo contribuiría este corolario a la optimización de redes neuronales}} + Notemos que este resultado no da pista alguna de las ventajas de una función frente a otra, - ni cómo afecta a la \textit{velocidad de convergencia}. +ni cómo afecta a la \textit{velocidad de convergencia}. +Es más, a priori se estaría aumentando el espacio de búsqueda, lo que significaría que \textit{dificultaría el encontrar la solución}, es decir +un aumento en coste y aumento del error de aproximación. -Recordemos que de manera general se ha definido $A$ como una función afín -$A(x) = w \cdot x + b$ donde $x$ y $w$ son vectores de $\R^d$ y $b \in \R$ es un escalar. ¿Pero que ocurriría si trabajáramos con transformaciones más generales? -Por ejemplo $B((x_1, ..., x_d)) = \sum_{i= 0} ^N \sum_{j= 0} ^d \alpha_{ij} x_j^i$ con $N$ natural positivo. +Sin embargo, como ya mostrábamos en +\ref{ch03:funcionamiento-intuitivo-funcion-activacion} +utilizar una función de activación frente a otra +varía el número de neuronas necesarias para +conseguir cierta precisión, lo cual, +bien usado significaría +reducir el espacio de búsqueda. -% Nota sobre posible hipótesis de optimización -\setlength{\marginparwidth}{\bigMarginSize} -\marginpar{\maginLetterSize \iconoProfundizar \textcolor{blue}{\textbf{Nueva hipótesis de optimización}} -Gracias al corolario \ref{corolario:generaliza-a} -nos podemos plantear si aumentar el espacio de búsqueda a partir de transformaciones - no lineales es más conveniente que hacerlo mediante el número neuronas. -Abordaremos esta cuestión en \ref{hypothesis:activation-function}. -} +En el capítulo \ref{ch08:genetic-selection}, una vez que +se hayan presentado todas las herramientas necesarias +se desarrollará con más profundidad y claridad esta idea. -\begin{aportacionOriginal} - \begin{corolario}[Generalización de de las transformaciones afines] \label{corolario:generaliza-a} - Se puede extender $\afines$ a conjuntos más generales como el de los polinomios de $d$ variables de grado $N$, $\mathbb{P}$. - \end{corolario} - \begin{proof} - Simplemente hay que reparar en que $\afines$ está contenido en el espacio $\mathbb{P}$. - Es más observando la demostración bastará con utilizar cualquier conjunto que contenga a $\afines$. - \end{proof} -\end{aportacionOriginal} - -La utilidad de este corolario a nivel práctico es cuestionable, ya que aumentaría considerablemente el número de -parámetros que ajustar de la red neuronal ocasionando: (1) la necesidad de mayor número de datos que aprender, -(2) mayor costo computacional, (3) probablemente peores resultados a igual número de iteraciones en comparativa -con otros modelos de menor número de neuronas (ya que el espacio de búsqueda ha aumentado). - -Podría tener el siguiente interés: -el teorema nos dice que podemos aproximar cualquier función continua de variable real, sin embargo, desconocemos el -número de neuronas, por capa. Supongamos una situación en la que el número de neuronas esté restringido, en tal caso, -generalizar $A^r$ sí que podría tener un papel importante en cuanto a mejoras. -\textcolor{red}{TODO: ELIMINAR ESTA CONCLUSIÓN CUANDO SE REDACTE EN LAS HIPÓTESIS} % Nota idea intuitiva equivalencia \marginpar{\maginLetterSize\raggedright @@ -217,8 +200,6 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en \end{definicion} Lo que se está diciendo es que serán iguales casi por doquier. - - % Definición distancia \begin{definicion} [Introducción de una distancia basada en una probabilidad] \label{definition:distancia-probabilidad} Dada una medida de probabilidad $\mu$ en $(\R^d, B^d)$, se define @@ -226,7 +207,7 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en \begin{equation} \begin{split} & \rho_{\mu} : \fM \times \fM \longrightarrow \R^+ \\ - & \rho_{\mu}(f,g) = \inf \{ \epsilon > 0: \mu \{ x : |f(x) - g(x)| > \epsilon \} < \epsilon \}. + & \rho_{\mu}(f,g) = \inf \{ \varepsilon > 0: \mu \{ x : |f(x) - g(x)| > \varepsilon \} < \varepsilon \}. \end{split} \end{equation} \end{definicion} @@ -240,7 +221,7 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en Son equivalentes las siguientes afirmaciones: \begin{enumerate} \item $\rho_{\mu}(f_n, f) \longrightarrow 0$. - \item Para cualquier $\epsilon > 0$ se tiene que $\mu \{ x : |f_n(x) - f(x)| > \epsilon \} \longrightarrow 0$. + \item Para cualquier $\varepsilon > 0$ se tiene que $\mu \{ x : |f_n(x) - f(x)| > \varepsilon \} \longrightarrow 0$. \item $\int \min \{ |f_n(x) - f(x)|, 1\} d\mu(x) \longrightarrow 0.$ \end{enumerate} \end{lema} @@ -260,17 +241,17 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en Comenzaremos probando (1) $\Rightarrow$ (2). Si $\rho_{\mu}(f_n, f) \longrightarrow 0$ - Fijamos $\epsilon_0 > 0$, tenemos por definición que - para cualquier $0 < \delta < \epsilon_0$ existirá $n_0 \in \N$ tal que + Fijamos $\varepsilon_0 > 0$, tenemos por definición que + para cualquier $0 < \delta < \varepsilon_0$ existirá $n_0 \in \N$ tal que $\rho_{\mu}(f_n, f) < \delta$ para cada $n$ un natural mayor que $n_0$. Es decir, - $$\inf \{ \epsilon > 0: \mu \{ x : |f_n(x) - f(x)| > \epsilon \} < \epsilon \} < \delta \quad \forall n \geq n_0$$ + $$\inf \{ \varepsilon > 0: \mu \{ x : |f_n(x) - f(x)| > \varepsilon \} < \varepsilon \} < \delta \quad \forall n \geq n_0$$ entonces \begin{equation} - \mu \{ x : |f_n(x) - f(x)| > \epsilon_0 \} + \mu \{ x : |f_n(x) - f(x)| > \varepsilon_0 \} \leq \mu \{ x : |f_n(x) - f(x)| > \delta\} < \delta @@ -281,7 +262,7 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en lo que significa que \begin{equation} - \mu \{ x : |f_n(x) - f(x)| > \epsilon_0 \} + \mu \{ x : |f_n(x) - f(x)| > \varepsilon_0 \} \longrightarrow 0 \end{equation} @@ -289,18 +270,18 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en % 2 -> 1 Veamos ahora que (2) $\Rightarrow$ (1). - Fijamos $\epsilon_0 > 0$ y bajo la hipótesis segunda se tiene que + Fijamos $\varepsilon_0 > 0$ y bajo la hipótesis segunda se tiene que \begin{equation} - \mu \{ x : |f_n(x) - f(x)| > \epsilon_0 \} + \mu \{ x : |f_n(x) - f(x)| > \varepsilon_0 \} \longrightarrow 0, \end{equation} - es decir, que para cualquier real $\delta$ cumpliendo que $0 < \delta < \epsilon_0$ + es decir, que para cualquier real $\delta$ cumpliendo que $0 < \delta < \varepsilon_0$ existe un natural $n_0$ a partir del cual todo natural $n$ mayor o igual satisface que \begin{equation} - \mu \{ x : |f_n(x) - f(x)| > \epsilon_0 \} + \mu \{ x : |f_n(x) - f(x)| > \varepsilon_0 \} \leq \mu \{ x : |f_n(x) - f(x)| > \delta\} < \delta @@ -311,9 +292,9 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en lo que significa que \begin{equation} - \inf \{ \epsilon > 0: + \inf \{ \varepsilon > 0: \mu \{ - x : |f_n(x) - f(x)| > \epsilon \} < \epsilon + x : |f_n(x) - f(x)| > \varepsilon \} < \varepsilon \} < \delta \quad @@ -335,16 +316,16 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en % 2 -> 3 Probaremos ahora que (2) $\Longrightarrow$ (3). - Por (2) se tiene que sea cual sea el $\epsilon$ cumpliendo que - $0 < \epsilon \leq 2$ + Por (2) se tiene que sea cual sea el $\varepsilon$ cumpliendo que + $0 < \varepsilon \leq 2$ existirá un natural $n_0$ a partir del cual, cualquier otro natural $n$ satisface que \begin{equation} \mu \{ - x : |f_n(x) - f(x)| > \frac{\epsilon}{2} + x : |f_n(x) - f(x)| > \frac{\varepsilon}{2} \} < - \frac{\epsilon}{2}, + \frac{\varepsilon}{2}, \end{equation} Gracias a esta desigualdad, para cualquier $n > n_0$ podemos acotar la siguiente integral: @@ -352,8 +333,8 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en \begin{equation} \int \min \{ |f_n(x) - f(x)|, 1\} d\mu(x) \leq - \frac{\epsilon}{2} (1-\frac{\epsilon}{2}) + 1\frac{\epsilon}{2} - = \epsilon - \frac{\epsilon^2}{4} < \epsilon. + \frac{\varepsilon}{2} (1-\frac{\varepsilon}{2}) + 1\frac{\varepsilon}{2} + = \varepsilon - \frac{\varepsilon^2}{4} < \varepsilon. \end{equation} probando con ello la implicación (2) $\Longrightarrow$ (3). @@ -361,29 +342,29 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en Finalmente comprobaremos la implicación (3) $\Longrightarrow$ (1). Para cada $n\in \N$ llamamos $g_n = \min\{|f_n - f|, 1|\}$. - Por (2), dado $0 < \epsilon < 1$, existe un $n_0 \in \N$ + Por (2), dado $0 < \varepsilon < 1$, existe un $n_0 \in \N$ de modo que si $n \geq n_0$ se cumple que \begin{equation}\label{eq:definiciones_Básicas_Integral_GN_menor_Epsilon_Cuadrado} - \int g_n d\mu < \epsilon^2 + \int g_n d\mu < \varepsilon^2 \end{equation} - Como $\epsilon < 1$ tenemos que + Como $\varepsilon < 1$ tenemos que \begin{equation} - \{ x; g_n(x) > \epsilon \} + \{ x; g_n(x) > \varepsilon \} = - \{ x; |f_n - f| > \epsilon \} + \{ x; |f_n - f| > \varepsilon \} \end{equation} luego \begin{equation} - \mu\{ x; |f_n - f(x)| > \epsilon \} + \mu\{ x; |f_n - f(x)| > \varepsilon \} = - \mu\{ x; g_n(x) > \epsilon \} + \mu\{ x; g_n(x) > \varepsilon \} \leq - \frac{1}{\epsilon} - \int_{g_n(x) > \epsilon} g_n d\mu - < \epsilon + \frac{1}{\varepsilon} + \int_{g_n(x) > \varepsilon} g_n d\mu + < \varepsilon \quad \forall n \geq n_0 \end{equation} @@ -391,8 +372,8 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en donde se ha usado la desigualdad de Chebyshev para $g_n$ y la desigualdad (\refeq{eq:definiciones_Básicas_Integral_GN_menor_Epsilon_Cuadrado}). -Probando con esto lo buscado que para cualquier $\epsilon > 0$ se tiene que -$$\mu \{ x : |f_n(x) - f(x)| > \epsilon \} \longrightarrow 0.$$ +Probando con esto lo buscado que para cualquier $\varepsilon > 0$ se tiene que +$$\mu \{ x : |f_n(x) - f(x)| > \varepsilon \} \longrightarrow 0.$$ \end{proof} @@ -403,25 +384,25 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en \end{lema} \begin{proof} Para cada $n\in \N$ llamamos $g_n = \min\{|f_n - f|, 1|\}$. Tengamos presente que por el lema \ref{lema:caracterizacionConvergenciaSucesiones2_1} - deberemos probar que para cualquier $\epsilon > 0$, + deberemos probar que para cualquier $\varepsilon > 0$, existe un $n_0$ natural, tal que para cualquier otro natural $n$ mayor o igual que $n_0$ se tiene que \begin{equation} \int \min \{ |f_n(x) - f(x)|, 1\} d\mu(x) < - \frac{\epsilon}{2}. + \frac{\varepsilon}{2}. \end{equation} Sea $\mu(\R^d) = M \in \R^+$ y sin pérdida de generalidad puede suponerse $M = 1$ \footnote{De otra forma bastaría con definir - en los pasos siguientes $\mu(K) > M - \frac{\epsilon}{2}$ y acotar con $\frac{\epsilon}{2M}$ - en vez de $\frac{\epsilon}{2}$.}. + en los pasos siguientes $\mu(K) > M - \frac{\varepsilon}{2}$ y acotar con $\frac{\varepsilon}{2M}$ + en vez de $\frac{\varepsilon}{2}$.}. Ya que $\R^r$ es un espacio métrico localmente compacto (pag 228 teorema 52.G \cite{nla.cat-vn1819421}), - se tiene que existirá un subconjunto $K$ compacto de $\R^r$ con medida $\mu(K) > 1 - \frac{\epsilon}{2}.$ + se tiene que existirá un subconjunto $K$ compacto de $\R^r$ con medida $\mu(K) > 1 - \frac{\varepsilon}{2}.$ Para el cual, por su compacidad, existirá un $n_0$ natural - $\sup_{x \in K} |f_n(x) - f(x)| < \frac{\epsilon}{2}$ + $\sup_{x \in K} |f_n(x) - f(x)| < \frac{\varepsilon}{2}$ para cada natural $n$ con $n\geq n_0.$ % Nota idea intuitiva lema de que C es denso en M @@ -456,7 +437,7 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en \leq \mu(K) \sup_{x \in K} |f_n(x) - f(x)| \leq - \frac{\epsilon}{2} . + \frac{\varepsilon}{2} . \end{equation} Acotando el primer sumando por la medida @@ -468,11 +449,11 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en \int_{\R^d \setminus K} \min \{ |f_n(x) - f(x)|, 1\} d\mu(x) + \int_{K} \min \{ |f_n(x) - f(x)|, 1\} d\mu(x) \\ \leq - \mu(\R^d \setminus K) + \frac{\epsilon}{2} + \mu(\R^d \setminus K) + \frac{\varepsilon}{2} \leq - \frac{\epsilon}{2} + \frac{\epsilon}{2} + \frac{\varepsilon}{2} + \frac{\varepsilon}{2} = - \epsilon + \varepsilon \end{split} \end{equation} @@ -487,15 +468,15 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en $\fM$ para la distancia $\rho_\mu$. \end{lema} \begin{proof} - Dada cualquier $f \in \fM$ y un $\epsilon > 0$ arbitrario, + Dada cualquier $f \in \fM$ y un $\varepsilon > 0$ arbitrario, tenemos que encontrar una función $g$ que cumpla que - $\rho_{\mu}(f, g) < \epsilon$. + $\rho_{\mu}(f, g) < \varepsilon$. Tomando un $M > 1$ lo suficientemente grande, tenemos que \begin{equation} \int \min \{ |f(x)\ 1_{|f(x)| < M} - f(x)|, 1\} d\mu(x) - < \frac{\epsilon}{2}. + < \frac{\varepsilon}{2}. \end{equation} Sabemos además que podemos aproximar $f 1_{|f| < M}$ por $g$, una función continua que es límite de una sucesión de @@ -503,11 +484,11 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en la cual satisface \begin{equation}\label{eq:lema3_3_integral} \int \min \{ |f(x) 1_{|f(x)| < M} - g(x)|, 1\} d\mu(x) - < \frac{\epsilon}{2}. + < \frac{\varepsilon}{2}. \end{equation} Tomamos $M$ lo suficientemente grande, de tal forma que \begin{equation} \label{eq:lema3_3_medida_conjunto} - \mu(\{ x: |f(x)| \geq M\}) < \frac{\epsilon}{2} + \mu(\{ x: |f(x)| \geq M\}) < \frac{\varepsilon}{2} \end{equation} y denotamos por $\Lambda$ al conjunto $\{ x: |f(x)| < M\}.$ @@ -522,14 +503,14 @@ \subsection{Observaciones y reflexiones sobre el teorema de convergencia real en \int_{\R^d \setminus \Lambda} \min \{ |f - g|, 1\} d\mu \\ < - \frac{\epsilon}{2} + \frac{\varepsilon}{2} + \mu(\{ x: |f(x)| \geq M\}) < - \frac{\epsilon}{2} + \frac{\varepsilon}{2} + - \frac{\epsilon}{2} - < \epsilon. + \frac{\varepsilon}{2} + < \varepsilon. \end{split} \end{equation} \end{proof} diff --git a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_3_teorema_2_2.tex b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_3_teorema_2_2.tex index 80d9656..35d5e1f 100644 --- a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_3_teorema_2_2.tex +++ b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_3_teorema_2_2.tex @@ -11,7 +11,9 @@ medida de probabilidad $\mu$ en $(\R^d, B^d)$, se tiene que $\pmcg$ es $\dist$-denso en $\fM$. \end{teorema} + % Nota idea intuitiva teorema 2.2 + \setlength{\marginparwidth}{\smallMarginSize} \marginpar{\maginLetterSize\raggedright \iconoAclaraciones \textcolor{dark_green}{ \textbf{ @@ -26,6 +28,8 @@ La idea de la demostración es sencilla, sabemos aproximar una función medible con una continua y a su vez una continua con una red neuronal generalizada, luego sabemos aproximar una función medible con una red neuronal generalizada. } + \setlength{\marginparwidth}{\bigMarginSize} + % Fin de la nota \begin{proof} Debemos probar que para cualquier función $f \in \fM$ existe una sucesión de funciones $\{h_n\}_{n\in \N}$ contenida en $\pmcg$ y @@ -47,8 +51,8 @@ \end{proof} % Nota idea intuitiva lema 3.4 -\reversemarginpar -\setlength{\marginparwidth}{\smallMarginSize} +%\reversemarginpar +\setlength{\marginparwidth}{\bigMarginSize} \marginpar{\maginLetterSize\raggedright \iconoAclaraciones \textcolor{dark_green}{ \textbf{ @@ -65,21 +69,21 @@ % Lema A.2 \begin{lema}\label{lema:a_2_paso_previo_denso} Sea F una función de activación continua y $\psi$ una \textbf{función de activación} arbitraria. - Para cualquier $\epsilon > 0$ existe un elemento $H_{\epsilon}$ de $\mathcal{H}_\psi{(\R, \R)}$ cumpliendo que + Para cualquier $\varepsilon > 0$ existe un elemento $H_{\varepsilon}$ de $\mathcal{H}_\psi{(\R, \R)}$ cumpliendo que \begin{equation} - \sup_{\lambda \in \R} | F(\lambda) - H_{\epsilon}(\lambda) | < \epsilon. + \sup_{\lambda \in \R} | F(\lambda) - H_{\varepsilon}(\lambda) | < \varepsilon. \end{equation} \end{lema} \begin{proof} Procedamos a realizar la siguiente prueba constructiva. - Tomamos fijo pero arbitrario un $\epsilon > 0,$ que sin pérdida de generalidad + Tomamos fijo pero arbitrario un $\varepsilon > 0,$ que sin pérdida de generalidad supondremos menor que uno. - Para que $H_\epsilon$ pertenezca a $\mathcal{H}_\psi{(\R, \R)}$ deberá de ser de la + Para que $H_\varepsilon$ pertenezca a $\mathcal{H}_\psi{(\R, \R)}$ deberá de ser de la forma $\sum^{q-1}_{j=1} b_j \psi( A_j(\lambda))$ debemos encontrar por ende el número de sumatorias, $q-1$; esa misma cantidad de constantes reales $b_j$ y funciones afines $A_j$. Para ello tomamos como $q$ cualquier número natural que cumpla que \begin{equation}\label{eq:lema_a_2_def_q} - \frac{1}{q} < \frac{\epsilon}{4}. + \frac{1}{q} < \frac{\varepsilon}{4}. \end{equation} Fijaremos para cada $j \in \{1,2, ...,q-1\}$ los coeficientes $b_j$ como $\frac{1}{q}$. @@ -87,17 +91,17 @@ Seleccionamos cualquier constante real $M>0$ de tal forma que se cumpla que \begin{equation}\label{lema_a_2_psi_m} - \psi(-M) < \frac{\epsilon}{2q} + \psi(-M) < \frac{\varepsilon}{2q} \quad \text{ y } \quad - \psi(M) > 1 - \frac{\epsilon}{2q}. + \psi(M) > 1 - \frac{\varepsilon}{2q}. \end{equation} Sabemos que esto es posible ya que por ser $\psi$ una función de activación satisface que $\lim_{\lambda \longrightarrow \infty} \psi(\lambda) = 1$ y que $\lim_{\lambda \longrightarrow -\infty} \psi(\lambda) = 0$, por tanto existirá una constante $M_1$ positiva tal que a partir de ella cualquier otra constante $n_1$ mayor o igual que cumpla que - $\psi(n_1) > 1 - \frac{\epsilon}{2q}$. También existirá una constante $M_2$ positiva tal que a partir de + $\psi(n_1) > 1 - \frac{\varepsilon}{2q}$. También existirá una constante $M_2$ positiva tal que a partir de ella cualquier otra constante $n_2$ mayor o igual tal que que - $\psi(-n_2) < \frac{\epsilon}{2q}$. Podemos tomar como $M$ al máximo de $M_1$ y $M_2$. + $\psi(-n_2) < \frac{\varepsilon}{2q}$. Podemos tomar como $M$ al máximo de $M_1$ y $M_2$. Seleccionaremos ahora los siguientes puntos del dominio \begin{align}\label{lema:2_2_selección_r_F} @@ -119,9 +123,9 @@ A_{rs}(r) = -M \text{ y } A_{rs}(s) = M. \end{equation} - Acabamos pues de determinar todos los elementos que conforman a $H_\epsilon$, de tal forma que se tiene que + Acabamos pues de determinar todos los elementos que conforman a $H_\varepsilon$, de tal forma que se tiene que \begin{equation} - H_\epsilon(\lambda) = \frac{1}{q} \sum^{q-1}_{j=1} \psi( A_{r_j, r_{j+1}}(\lambda)) + H_\varepsilon(\lambda) = \frac{1}{q} \sum^{q-1}_{j=1} \psi( A_{r_j, r_{j+1}}(\lambda)) \end{equation} y así definida cumple que: % Nota idea de demostración intuitiva lema lema:a_2_paso_previo_denso @@ -144,55 +148,55 @@ Se cumple que $\lambda \leq r_1 < r_2 <...< r_q$ luego para todos $j \in \{1, ..., q-1\}$ las funciones afines satisfacen que $A_{r_j, r_{j+1}}(\lambda) < -M$ y por cómo se fijó $M$ en la condición \refeq{lema_a_2_psi_m} - resulta que $\psi( A_{r_j, r_{j+1}}(\lambda)) < \frac{\epsilon}{2 q}$. Por tanto + resulta que $\psi( A_{r_j, r_{j+1}}(\lambda)) < \frac{\varepsilon}{2 q}$. Por tanto para $\lambda \in (- \infty, r_1]$ se tiene \begin{equation} - H_\epsilon(\lambda) = \frac{1}{q} \sum^{q-1}_{j=1} \psi( A_{r_j, r_{j+1}}(\lambda)) + H_\varepsilon(\lambda) = \frac{1}{q} \sum^{q-1}_{j=1} \psi( A_{r_j, r_{j+1}}(\lambda)) < - \frac{1}{q} \sum^{q-1}_{j=1} \frac{\epsilon}{2q} + \frac{1}{q} \sum^{q-1}_{j=1} \frac{\varepsilon}{2q} < - \frac{1}{q} (q-1) \frac{\epsilon }{2q} - <\frac{\epsilon }{2q} - < \frac{\epsilon }{2} + \frac{1}{q} (q-1) \frac{\varepsilon }{2q} + <\frac{\varepsilon }{2q} + < \frac{\varepsilon }{2} \end{equation} - y como además $0 \leq F(\lambda) \leq \frac{1}{q} < \frac{\epsilon}{2}$ por cómo se seleccionaron los puntos $r_j$ en + y como además $0 \leq F(\lambda) \leq \frac{1}{q} < \frac{\varepsilon}{2}$ por cómo se seleccionaron los puntos $r_j$ en \refeq{lema:2_2_selección_r_F} se tiene que \begin{equation} - | F(\lambda) - H_{\epsilon}(\lambda) | < \frac{\epsilon}{2} + \frac{\epsilon}{2} < \epsilon. + | F(\lambda) - H_{\varepsilon}(\lambda) | < \frac{\varepsilon}{2} + \frac{\varepsilon}{2} < \varepsilon. \end{equation} \item Si $\lambda \in (r_q, +\infty):$ Se cumple que $r_1 < r_2 <...< r_q <\lambda$ luego para todo $j \in \{1, ..., q-1\}$ las funciones afines satisfacen que $A_{r_j, r_{j+1}}(\lambda) > M$ y por cómo se fijó $M$ en \refeq{lema_a_2_psi_m} - resulta que $\psi( A_{r_j, r_{j+1}}(\lambda)) > 1-\frac{\epsilon}{2q}$ concluyendo que + resulta que $\psi( A_{r_j, r_{j+1}}(\lambda)) > 1-\frac{\varepsilon}{2q}$ concluyendo que para $\lambda \in (r_q,+\infty):$ \begin{equation} 1 \geq - H_\epsilon(\lambda) = \frac{1}{q} \sum^{q-1}_{j=1} \psi( A_{r_j, r_{j+1}}(\lambda)) + H_\varepsilon(\lambda) = \frac{1}{q} \sum^{q-1}_{j=1} \psi( A_{r_j, r_{j+1}}(\lambda)) > - \frac{1}{q} \sum^{q-1}_{j=1} \left(1-\frac{\epsilon}{2q} \right) + \frac{1}{q} \sum^{q-1}_{j=1} \left(1-\frac{\varepsilon}{2q} \right) > - \frac{(q-1)}{q} \left(1-\frac{\epsilon}{2q} \right) + \frac{(q-1)}{q} \left(1-\frac{\varepsilon}{2q} \right) \end{equation} - y por ende, como además $\frac{(q-1)}{q} \left(1-\frac{\epsilon}{2q} \right) < \frac{q-1}{q} \leq F(\lambda) \leq 1$ por cómo se seleccionaron los puntos $r_j$ en + y por ende, como además $\frac{(q-1)}{q} \left(1-\frac{\varepsilon}{2q} \right) < \frac{q-1}{q} \leq F(\lambda) \leq 1$ por cómo se seleccionaron los puntos $r_j$ en \refeq{lema:2_2_selección_r_F} se tiene que \begin{equation} - | F(\lambda) - H_{\epsilon}(\lambda) | + | F(\lambda) - H_{\varepsilon}(\lambda) | \leq - 1 - \frac{(q-1)}{q} \left(1-\frac{\epsilon}{2q} \right) - = \frac{1}{q} + \frac{\epsilon}{2q} - < \epsilon. + 1 - \frac{(q-1)}{q} \left(1-\frac{\varepsilon}{2q} \right) + = \frac{1}{q} + \frac{\varepsilon}{2q} + < \varepsilon. \end{equation} Donde para acotar $\frac{1}{q}$ hemos usado la desigualdad \refeq{eq:lema_a_2_def_q}. \item Si $\lambda \in (r_{j},r_{j+1}]$ para $j \in \{ 1, \ldots, q-1\}$: Tenemos por una parte que $\frac{j}{q} < F(\lambda) \leq \frac{j+1}{q}$ y - podemos descomponer $H_\epsilon$ en las siguientes sumatorias: + podemos descomponer $H_\varepsilon$ en las siguientes sumatorias: \begin{equation} \begin{split} - q H_\epsilon(\lambda) + q H_\varepsilon(\lambda) = \sum^{j-1}_{i=1} \psi( A_{r_i, r_{i+1}}(\lambda)) + @@ -204,42 +208,42 @@ Nótese que así definida, si $j = q-2$ o $j = q -1$ el último sumando no aparece. - Los términos de la primera sumatoria serán mayores que $\left(1-\frac{\epsilon}{2q} \right)$ y menores o iguales que la unidad, + Los términos de la primera sumatoria serán mayores que $\left(1-\frac{\varepsilon}{2q} \right)$ y menores o iguales que la unidad, el segundo sumando satisface que $0 \leq q\psi( A_{r_j, r_{j+1}}(\lambda)) \leq 1$ - y para la última sumatoria, todos sus términos serán menores que $\frac{\epsilon}{2q}$ y mayores o iguales que cero. + y para la última sumatoria, todos sus términos serán menores que $\frac{\varepsilon}{2q}$ y mayores o iguales que cero. De donde resulta que : \begin{equation} - \frac{j-1}{q}\left(1-\frac{\epsilon}{2q} \right) + \frac{j-1}{q}\left(1-\frac{\varepsilon}{2q} \right) < - H_\epsilon(\lambda) + H_\varepsilon(\lambda) < \frac{j-1}{q} + \frac{1}{q} + - \frac{q-j}{q} \frac{\epsilon}{2q} , + \frac{q-j}{q} \frac{\varepsilon}{2q} , \end{equation} concluyendo que \begin{equation} - F(\lambda), H_\epsilon(\lambda) + F(\lambda), H_\varepsilon(\lambda) \in \left[ - \frac{j-1}{q}\left(1-\frac{\epsilon}{2q}\right), + \frac{j-1}{q}\left(1-\frac{\varepsilon}{2q}\right), \frac{j+1}{q} \right] \end{equation} y por tanto: \begin{equation} - | F(\lambda) - H_{\epsilon}(\lambda) | - \leq \frac{j+1}{q} - \frac{j-1}{q}\left(1-\frac{\epsilon}{2q}\right) + | F(\lambda) - H_{\varepsilon}(\lambda) | + \leq \frac{j+1}{q} - \frac{j-1}{q}\left(1-\frac{\varepsilon}{2q}\right) = - \frac{2}{q} + \frac{j-1}{q}\frac{\epsilon}{2q} - < \frac{\epsilon}{2} + \frac{\epsilon}{2} - < \epsilon. + \frac{2}{q} + \frac{j-1}{q}\frac{\varepsilon}{2q} + < \frac{\varepsilon}{2} + \frac{\varepsilon}{2} + < \varepsilon. \end{equation} \end{itemize} - La acotación $| F(\lambda) - H_{\epsilon}(\lambda) | < \epsilon$ se cumple para todo + La acotación $| F(\lambda) - H_{\varepsilon}(\lambda) | < \varepsilon$ se cumple para todo \begin{equation} \lambda \in (- \infty, r_1] \bigcup (r_q,+\infty) @@ -284,7 +288,7 @@ Para ello basta ver que cualquier función de la forma $\prod_{k=1}^l F(A_k(\cdot))$ puede ser uniformemente aproximada por una una sucesión de funciones de $\rrnng$. - Fijamos $\epsilon > 0$. + Fijamos $\varepsilon > 0$. Por continuidad, existirá un $\delta >0$ tal que, para cualesquiera números reales $0 \leq a_k, b_k \leq 1,$ con $k \in \{1,...,l\}$ cumpliendo que $|a_k -b_k| < \delta$ se tiene @@ -293,7 +297,7 @@ \prod^l_{k=1} a_k - \prod^l_{k=1} b_k \right| < - \epsilon. + \varepsilon. \end{equation} Por el lema \ref{lema:a_2_paso_previo_denso} existe una función @@ -315,7 +319,7 @@ \prod ^l_{k=1} H_\delta(A_k(x)) \right| < - \epsilon. + \varepsilon. \end{equation} Puesto que $H_\delta$ es de la forma $\sum_{t=1}^T \beta_t \psi(A_t(\cdot))$ @@ -328,14 +332,14 @@ %Lema A.3 \begin{lema}\label{lema:A_3_función_activación_continua_con_arbitaria} - Para cada función de activación $\psi$, cada $\epsilon >0$ + Para cada función de activación $\psi$, cada $\varepsilon >0$ y cada $M>0$ existe una función - $\cos_{M,\epsilon} \in \mathcal{H}_F{(\R, \R)}$ tal que + $\cos_{M,\varepsilon} \in \mathcal{H}_F{(\R, \R)}$ tal que \begin{equation} \sup_{ \lambda \in [-M, M]} - |\cos_{M,\epsilon}(\lambda) - \cos(\lambda)| + |\cos_{M,\varepsilon}(\lambda) - \cos(\lambda)| < - \epsilon. + \varepsilon. \end{equation} \end{lema} \begin{proof} @@ -475,12 +479,12 @@ \end{equation} Como $F$ es una función de activación continua, el lema \ref{lema:a_2_paso_previo_denso} nos da la existencia de - $W_\frac{\epsilon}{t} \in \mathcal{H}_\psi{(\R, \R)}$ cumpliendo que - $|F - W_{ \frac{\epsilon}{t}} | < \frac{\epsilon}{t}$ en todo $\R$. + $W_\frac{\varepsilon}{t} \in \mathcal{H}_\psi{(\R, \R)}$ cumpliendo que + $|F - W_{ \frac{\varepsilon}{t}} | < \frac{\varepsilon}{t}$ en todo $\R$. Por tanto \begin{equation} - |F \circ A_i - W_{ \frac{\epsilon}{t}} \circ A_i | - < \frac{\epsilon}{t} + |F \circ A_i - W_{ \frac{\varepsilon}{t}} \circ A_i | + < \frac{\varepsilon}{t} \quad \forall j \in \{1, \ldots, t\} . @@ -488,27 +492,27 @@ Podemos ya definir la función que buscamos: \begin{equation} - \cos_{M, \epsilon}(\lambda) = \sum_{j=1}^t - \alpha_j W_{ \frac{\epsilon}{t}}(A_j(\lambda)). + \cos_{M, \varepsilon}(\lambda) = \sum_{j=1}^t + \alpha_j W_{ \frac{\varepsilon}{t}}(A_j(\lambda)). \end{equation} De esta manera, para cualquier $\lambda \in [-M, M]$ \begin{equation} \begin{split} - |\cos_{M,\epsilon}(\lambda) - \cos(\lambda)| + |\cos_{M,\varepsilon}(\lambda) - \cos(\lambda)| &\leq |\cos(\lambda) - H_{[- M, M]}(\lambda)| + - | \cos_{M,\epsilon}(\lambda) - H_{[- M, M]}(\lambda)| \\ + | \cos_{M,\varepsilon}(\lambda) - H_{[- M, M]}(\lambda)| \\ &\leq 0 - + | \cos_{M,\epsilon}(\lambda) - H_{[- M, M]}(\lambda)| \\ + + | \cos_{M,\varepsilon}(\lambda) - H_{[- M, M]}(\lambda)| \\ & \leq \sum_{j=1}^t - | W_{ \frac{\epsilon}{t}}(A_j(\lambda)) + | W_{ \frac{\varepsilon}{t}}(A_j(\lambda)) - F( A_j(\lambda)) | \\ - & < \sum_{j=1}^t \frac{\epsilon}{t} = \epsilon . + & < \sum_{j=1}^t \frac{\varepsilon}{t} = \varepsilon . \end{split} \end{equation} @@ -521,11 +525,11 @@ $A_j \in \afines$ y $\beta_j \in \R$. Para cualquier función de activación $\psi$, cualquier compacto $K \subset \R^d$ - y cualquier $\epsilon > 0$ + y cualquier $\varepsilon > 0$ existe $f \in \mathcal{H}_\psi{(\R^d, \R)}$ para el cual se cumple que \begin{equation} \sup_{x \in K} - |g(x) - f(x)| < \epsilon. + |g(x) - f(x)| < \varepsilon. \end{equation} \end{lema} \begin{proof} @@ -546,45 +550,45 @@ En virtud del lema \ref{lema:A_3_función_activación_continua_con_arbitaria} podemos encontrar - $\cos_{M, \frac{\epsilon}{q B}} \in \sum(\psi)$ cumpliendo que + $\cos_{M, \frac{\varepsilon}{q B}} \in \sum(\psi)$ cumpliendo que \begin{equation} \sup_{\lambda \in [-M, M]} | - \cos_{M, \frac{\epsilon}{q B}}(\lambda) + \cos_{M, \frac{\varepsilon}{q B}}(\lambda) - \cos(\lambda) | - < \frac{\epsilon}{q B} + < \frac{\varepsilon}{q B} \end{equation} por lo que para cualquier $j \in \{1, ..., q \}$ se tiene que \begin{equation} \sup_{x \in K} | - \cos_{M, \frac{\epsilon}{q B}}(A_j(x)) + \cos_{M, \frac{\varepsilon}{q B}}(A_j(x)) - \cos(A_j(x)) | \leq \sup_{\lambda \in [-M, M]} | - \cos_{M, \frac{\epsilon}{q B}}(\lambda) + \cos_{M, \frac{\varepsilon}{q B}}(\lambda) - \cos(\lambda) | - < \frac{\epsilon}{q B}. + < \frac{\varepsilon}{q B}. \end{equation} Definamos ahora $f$ como \begin{equation} f(x) = \sum_{j=1}^q \beta_j - \cos_{M, \frac{\epsilon}{q B}}(A_j(x)), + \cos_{M, \frac{\varepsilon}{q B}}(A_j(x)), \end{equation} que cumple $f \in \mathcal{H}_\psi{(\R^d, \R)}$ puesto que - $\cos_{M, \frac{\epsilon}{q B}} \in \mathcal{H}_\psi{(\R, \R)}$, + $\cos_{M, \frac{\varepsilon}{q B}} \in \mathcal{H}_\psi{(\R, \R)}$, y satisface además que \begin{equation} \begin{split} \sup_{x \in K} | f(x) - g(x)| &\leq \sup_{\lambda \in [-M, M]} - | \sum_{j=1}^q \beta_j \cos_{M, \frac{\epsilon}{q B}}(\lambda ) + | \sum_{j=1}^q \beta_j \cos_{M, \frac{\varepsilon}{q B}}(\lambda ) - \sum_{j=1}^q \beta_j \cos(\lambda )| \\ &\leq @@ -592,7 +596,7 @@ \sum_{j=1}^q |\beta_j| | - \cos_{M, \frac{\epsilon}{q B}}(\lambda) + \cos_{M, \frac{\varepsilon}{q B}}(\lambda) - \cos(\lambda) | @@ -601,8 +605,8 @@ \sup_{\lambda \in [-M, M]} \sum_{j=1}^q B - \frac{\epsilon}{q B} - = \epsilon. + \frac{\varepsilon}{q B} + = \varepsilon. \end{split} \end{equation} Con lo que acabamos de probar la tesis del lema. @@ -615,8 +619,12 @@ } \marginpar{\maginLetterSize Afirma que \textbf{podemos aproximar cualquier función continua definida - con una red neuronal}. Además, si los valores de entrada está + con una red neuronal independientemente de la + función de activación que use}. + Además, si los valores de entrada está dentro de un rango acotado tendremos una cota de error única para todo el dominio. + + Podría pensarse que la capacidad de aproximación de una red neuronal depende de su función de activación, este resultado con matices lo desmiente, \textbf{eso sí, siempre que se tenga el número suficiente de neuronas}. } %Lema A.5 diff --git a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_4_colorario_2_1.tex b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_4_colorario_2_1.tex index 7bb3a83..4e03d8b 100644 --- a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_4_colorario_2_1.tex +++ b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_4_colorario_2_1.tex @@ -13,8 +13,8 @@ \begin{teorema}[Teorema de Lusin] \label{teo:Lusin} Si $\mu$ es una medida regular de Borel, $E$ un conjunto de medida finita y $f$ una función medible en $E$ entonces - para cualquier $\epsilon > 0$ existirá un conjunto compacto - $K$ en $E$ tal que $\mu(E \setminus C) \leq \epsilon$ y donde $f$ es continua en $K$. + para cualquier $\varepsilon > 0$ existirá un conjunto compacto + $K$ en $E$ tal que $\mu(E \setminus C) \leq \varepsilon$ y donde $f$ es continua en $K$. \end{teorema} \begin{proof} Demostración en páginas 242 y 243 de \cite{nla.cat-vn1819421}. @@ -45,10 +45,10 @@ \begin{corolario} \label{cor:2_1} Para cada función $g \in \fM$ existe un subconjunto compacto $K$ de $\R^d$ y $f \in \rrnn$ tal que para cualquier - $\epsilon > 0$ se tiene que - $\mu(K) > 1- \epsilon$ y para cada $x \in K$ tenemos que + $\varepsilon > 0$ se tiene que + $\mu(K) > 1- \varepsilon$ y para cada $x \in K$ tenemos que \begin{equation} - |f(x) - g(x) | < \epsilon, + |f(x) - g(x) | < \varepsilon, \end{equation} independientemente de la función de activación $\psi$, dimensión $d$ o medida $\mu$. \end{corolario} @@ -64,12 +64,13 @@ Este teorema corrige la carencia sobre la precisión del error que describíamos en la idea intuitiva del teorema \ref{teo:2_4_rrnn_densas_M}. Podemos encontrar una red neuronal que aproxime cualquier función medible que queramos en todos los puntos del espacio que queramos. } + \normalmarginpar \begin{proof} - Sea $\epsilon > 0$ fijo pero arbitrario. Gracias al teorema de Lusin \ref{teo:Lusin} + Sea $\varepsilon > 0$ fijo pero arbitrario. Gracias al teorema de Lusin \ref{teo:Lusin} existe un subconjunto compacto $K \subset \R^d$ de medida - $\mu(K) > 1 - \epsilon$ donde la restricción $g_{|K}$ es continua. + $\mu(K) > 1 - \varepsilon$ donde la restricción $g_{|K}$ es continua. Por otra parte, en virtud de la caracterización de Tietze \ref{teo:Tietze}, @@ -84,7 +85,7 @@ Por ser $G$ continua en un compacto, por la densidad de las redes neuronales en compactos en $\fC$(lema \ref{lema:A_5_uniformemente_denso_compactos} ) se tiene que existirá $f \in \rrnng$ tal que \begin{equation} - \sup_{x \in K} |G(x) - f(x)| < \epsilon. + \sup_{x \in K} |G(x) - f(x)| < \varepsilon. \end{equation} Por lo que podemos afirmar que para todo $x \in K$ @@ -92,7 +93,7 @@ |f(x) -g(x)| \leq | f(x) -G(x)| + |G(x) -g(x)| - < \epsilon + 0 = \epsilon + < \varepsilon + 0 = \varepsilon \end{equation} como queríamos probar. \end{proof} diff --git a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_5_colorarios_lp.tex b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_5_colorarios_lp.tex index 28b2f8c..60e3ff8 100644 --- a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_5_colorarios_lp.tex +++ b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_5_colorarios_lp.tex @@ -68,11 +68,12 @@ \section{Generalización a espacios $L_p$} cualquier función de la clase recién introducida. } + \begin{proof} Se quiere probar que para cualquier $g \in L_p$ y - $\epsilon >0$ existe $f \in \rrnn$ tal que + $\varepsilon >0$ existe $f \in \rrnn$ tal que \begin{equation} - \dlp(f,g) <\epsilon. + \dlp(f,g) <\varepsilon. \end{equation} Por pertenecer $g$ a $L_p$ existe una constante $M$ real positiva @@ -80,7 +81,7 @@ \section{Generalización a espacios $L_p$} tal que si definimos la función $h =g 1_{|g|0$ + y sea cual sea $\varepsilon >0$ existe $f \in \rrnn$ la cual cumple que \begin{equation} \mu\{ x: |f(x) - g(x)| - < \epsilon + < \varepsilon \} = 1. \end{equation} @@ -179,8 +182,8 @@ \section{Generalización a espacios $L_p$} \begin{proof} Por el teorema \ref{teo:2_4_rrnn_densas_M} existe $f \in \rrnn$ tal que para cualquier - $\epsilon_1, \epsilon_2 >0$ se cumple que - $\mu \{x: |f(x) - g(x)| > \epsilon_1\} < \epsilon_2.$ + $\varepsilon_1, \varepsilon_2 >0$ se cumple que + $\mu \{x: |f(x) - g(x)| > \varepsilon_1\} < \varepsilon_2.$ Sea $O$ el conjunto de puntos tal que $\mu(O) = 1.$ Por ser finito $O$ podemos encontrar \begin{equation} \label{eq:2_4:definición_epsilon} @@ -189,30 +192,30 @@ \section{Generalización a espacios $L_p$} \}. \end{equation} - Sin pérdida de generalidad tomamos $\epsilon < \delta$ y entonces + Sin pérdida de generalidad tomamos $\varepsilon < \delta$ y entonces para que la $f$ fijada cumpla que \begin{equation} - \dist(f,g) = \epsilon + \dist(f,g) = \varepsilon \end{equation} debe de cumplirse que \begin{equation} \dist(f,g) = \inf \{ - \epsilon_1 > 0: + \varepsilon_1 > 0: \mu\{ x: |f(x) - g(x)| - > \epsilon_1 + > \varepsilon_1 \} - < \epsilon_1 + < \varepsilon_1 \} - = \epsilon, + = \varepsilon, \end{equation} - pero por cómo tomamos $\epsilon$ en (\refeq{eq:2_4:definición_epsilon}) se + pero por cómo tomamos $\varepsilon$ en (\refeq{eq:2_4:definición_epsilon}) se tiene que $\mu\{ x: |f(x) - g(x)| - > \epsilon + > \varepsilon \} = 0.$ Por lo que acabamos de probar, como queríamos, que @@ -220,7 +223,7 @@ \section{Generalización a espacios $L_p$} \mu\{ x: |f(x) - g(x)| - < \epsilon + < \varepsilon \} = 1. \end{equation} @@ -236,9 +239,9 @@ \section{Generalización a espacios $L_p$} \ref{corolario:2_5_función_Booleana} } } - { \small + Este resultado nos permite \textbf{aproximar funciones que actúen como clasificadores discretos}. Por ejemplo sea $g$ como una función que dada una imagen $x$ indica si hay un perro haciendo valer $g(x)=1$ y en caso contrario $g(x)=0$. - } + } %Nota aclarativa sobre la implementación del corolario @@ -250,7 +253,7 @@ \section{Generalización a espacios $L_p$} \ref{corolario:2_5_función_Booleana} } } - {\small + El resultado nos indica que podemos obtener una red neuronal $h$ que aproxime tal clasificador, pero \textbf{tal red neuronal no necesariamente tomará valores discretos}, es decir, pudiera darse el caso que @@ -262,7 +265,7 @@ \section{Generalización a espacios $L_p$} tal que $\theta \circ h(\{ x : g(x)=0 \})=0$ y $\theta \circ h(\{ x : g(x)=1 \})=1$. - } + } \begin{definicion}[Función Booleana] @@ -285,11 +288,11 @@ \section{Generalización a espacios $L_p$} Para cada función Booleana $g: \{0,1\}^d \longrightarrow \{0,1\}$ y - cada $\epsilon >0$ existe una red neuronal + cada $\varepsilon >0$ existe una red neuronal $f \in \rrnn$ tal que \begin{equation} \max_{x \in \{ 0,1\}^d} |g(x) - f(x)| - < \epsilon. + < \varepsilon. \end{equation} \end{corolario} @@ -329,14 +332,14 @@ \section{Generalización a espacios $L_p$} \mu\{ x: |f(x) - g(x)| - < \epsilon + < \varepsilon \} = 1, \end{equation} es decir que \begin{equation} \max_{x \in \{ 0,1\}^d} |g(x) - f(x)| - < \epsilon + < \varepsilon \end{equation} como queríamos probar. \end{proof} @@ -441,7 +444,7 @@ \section{Generalización a espacios $L_p$} } } \marginpar{\maginLetterSize - {\small + { Es interesante reparar en que la demostración se basa en añadir una neurona por cada punto que queramos que tome un valor concreto, esa neurona se activará (es decir, no será nula) cuando la entrada $x$ \textit{sea mayor} que el valor que la activa $x_i$ y vale la diferencia con el valor anterior $x_{i-1}$, es decir $g(x_{i}) - g(x_{i-1})$, como el nodo $x_{i-1}$ @@ -495,7 +498,7 @@ \section{Generalización a espacios $L_p$} nos brinda una heurística de inicialización de los pesos de una red neuronal. } - La cual se tratará en en la sección \ref{section:inicializar_pesos}. + La cual se tratará en la sección \ref{section:inicializar_pesos}. \setlength{\marginparwidth}{\bigMarginSize} } @@ -638,7 +641,8 @@ \subsubsection*{Naturaleza de los datos} situación experimental puede producir incoherencias teóricas, como por ejemplo que se tengan dos muestras $(x_1, y_1), (x_2, y_2)$ tales que $x_1 = x_2$ pero $y_1 \neq y_2$ o que la medición contenga errores, es decir $(x, g(x)+\delta)$. -Se podría paliar esta situación con preprocesado de los datos. +Se podría paliar esta situación con un + preprocesado de los datos. \subsubsection*{ Naturaleza de la regla subyacente} @@ -657,15 +661,3 @@ \subsubsection*{Coste computacional inasumible} Supongamos que los datos son idílicos, el modelo se conoce y se establece un tamaño de datos de entrenamiento suficiente y un número de neuronas acorde ¿podríamos asumir el coste computacional? -\subsubsection*{Naturaleza constructiva de la demostración} -\textcolor{red}{Estoy especulando, pero quiero dejar este pensamiento registrado.} -El coste computacional de \textit{construir} esa red neuronal -es menor que el de entrenarla (TODO: comparar) -podría optarse por una estrategia que se base de alguna manera -en esta construcción para inicializar los pesos? - -Por ejemplo: queremos construir una redes neuronales con n neuronas, -seleccionamos n datos aleatorios, construimos $f_n$ -y sobre ella entrenamos. - -Quizás se obtengan mejores resultados que directamente inicializando los pesos de manera aleatoria. diff --git a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_6_multi_output.tex b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_6_multi_output.tex index 77d3f13..18179fb 100644 --- a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_6_multi_output.tex +++ b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_6_multi_output.tex @@ -50,8 +50,20 @@ \section{Generalización para \textit{multi-output neuronal networks}} \end{equation} \end{definicion} -\iconoAclaraciones \textcolor{dark_green}{ Nota Blanca: } +\iconoAclaraciones \textcolor{dark_green}{ Observación: } +% Comentario +\marginpar{\maginLetterSize + \iconoAclaraciones \textcolor{dark_green}{ + \textbf{ + Por qué se ha destacado la observación + } + } + Se destaca tal observación para remarcar que una + red neural con salidas en varias dimensiones tiene + una definición mucho más estricta y que podría dar a confusión. + +} Es interesante apreciar que se tiene que \begin{equation} \label{eq:diferencia_conjuntos_multicapa} @@ -116,7 +128,7 @@ \section{Generalización para \textit{multi-output neuronal networks}} \ref{corolario:2_6}} } } -\marginpar{\maginLetterSize\small +\marginpar{\maginLetterSize En esencia, todos los resultados probados hasta ahora para redes neuronales con salida real de dimensión uno son válidos para cualquier tamaño de salida, es decir, \textbf{lo que a nosotros @@ -131,7 +143,7 @@ \section{Generalización para \textit{multi-output neuronal networks}} \ref{corolario:2_6}} } } -\marginpar{\maginLetterSize\small +\marginpar{\maginLetterSize La demostración del corolario es totalmente constructiva: si se desea una red neuronal de salida $s\in \N$, se construyen de manera independiente $s$ redes neuronales de salida de dimensión uno @@ -155,7 +167,7 @@ \section{Generalización para \textit{multi-output neuronal networks}} } } \marginpar{\maginLetterSize - \small + La demostración del corolario nos da una \textbf{técnica constructiva} de obtener redes neuronales de varias salidas, que puede ser de valía para aplicarla \textbf{como heurística diff --git a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/diferencia_entre_los_reales_y_enteros.tex b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/diferencia_entre_los_reales_y_enteros.tex index ed88bbd..ba1a2a5 100644 --- a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/diferencia_entre_los_reales_y_enteros.tex +++ b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/diferencia_entre_los_reales_y_enteros.tex @@ -11,36 +11,88 @@ \section{Consideración sobre la capacidad de cálculo} que aproxime todo lo bien que queramos la función ideal; sin embargo, destaquemos que los parámetros que caracterizan a la red neuronal encontrada son reales. Es decir, si nuestra red neuronal toma valores irracionales difícilmente será computable en un ordenador por su infinitud. -Esto nos impone una nueva restricción en el espacio de búsqueda, ya que no solo debe de reducirse el error, si no que los parámetros que representan la red deben de estar limitados a cierta precisión: la propia de un ordenador. +Esto nos impone una nueva restricción en el espacio de búsqueda, ya que no solo debe de reducirse el error, si no que los parámetros que representan la red deben de estar limitados a cierta precisión: la propia de un ordenador. -Comenzaremos viendo que en efecto una red neuronal con parámetros en el cuerpo de los enteros es factible como aproximador universal. +% Comentario sobre la representación de enteros +\marginpar{\maginLetterSize + \iconoProfundizar \textcolor{blue}{ + \textbf{ + Ojalá hubiera un lenguaje de programación que permitiera + trabajar explícitamente con + tipos racionales + } + } + + De hecho el lenguaje de programación Julia, + el que hemos seleccionado para nuestra implementación + sí lo permite. ( Véase la documentación oficial de Julia sobre \href{https://docs.julialang.org/en/v1/manual/complex-and-rational-numbers/}{\textit{Rational numbers}}, consultada por última ver el + 30 de mayo del 2022). + +} + +Comenzaremos viendo que, en efecto, una red neuronal con parámetros en el cuerpo de los racionales es factible como aproximador universal. % Teorema de que podemos tener redes neuronales con parámetros racionales que también converjan. \begin{aportacionOriginal} \begin{teorema} - El espacio $\mathcal{H}(\Q^d, \Q^s)$ es denso al espacio $\rrnnmc$. + El espacio $\mathcal{H}(\Q^d, \Q^s)$ es denso en el espacio $\rrnnmc$. \end{teorema} \begin{proof} - Para todo $h_r \in \rrnnmc$, dado cualquier $\epsilon \in \R^+$, - gracias a la densidad de los racionales en los reales, - existirá $h_q \in \mathcal{H}(\Q^d, \Q^s)$ tal que - $\dist( h_r, h_q) < \epsilon$. + Se quiere probar que para todo $h^r \in \rrnnmc$, + dado cualquier $\varepsilon \in \R^+$ + existirá $h^q \in \mathcal{H}(\Q^d, \Q^s)$ tal que + $\dist( h^r, h^q) < \varepsilon$. + + La red neuronal $h^r$ está determinada por un conjunto finito + de parámetros supongamos que hay $q$ y que están determinados por un índice del conjunto $\Lambda$. + + Sea $\alpha^0_i \in R$, el primer índice $h^r$ definimos la red neuronal $h^1$ con coeficientes $\alpha^1_i$ con $i\in \Lambda$ + de tal forma que los parámetros que la determinan vienen dados por + \begin{equation*} + \alpha^1_i = \alpha^0_i + \text{ con } i \in \Lambda + \text{ y } i \neq 1. + \end{equation*} + + El primer parámetro $\alpha^1_1$, será un número racional + seleccionado de tal forma que se satisfaga que + \begin{equation*} + \dist( h^r, h^1) < \frac{\varepsilon}{q}. + \end{equation*} + Por la densidad de los racionales en los reales sabemos que existe $\alpha^1_1$. + + Siguiendo la misma idea, para $j \in \{2,\ldots, q\}$ se define la red neuronal + $h^j$ cuyos parámetros vienen dados por + \begin{equation*} + \alpha^j_i = \alpha^{j-1}_i + \text{ con } i \in \Lambda + \text{ y } i \neq j; + \end{equation*} + y $\alpha^j_j \in \Q$ seleccionado de tal forma que + \begin{equation*} + \dist( h^j, h^{j-1}) < \frac{\varepsilon}{q}. + \end{equation*} + + De esta forma, en virtud de la desigualdad triangular, se ha + encontrado una red neuronal $h^q$ + de modo que todos sus parámetros son racionales y + satisface + $\dist( h^r, h^q) < \varepsilon$. \end{proof} - Si bien los números racionales tienen el potencial de ser computados por su - finitud, seguimos sujetos a que el número de decimales y tamaño de su parte entera \textit{sean lo suficientemente pequeños} como para poder ser representados - y calculados con un ordenador. Esto no tiene que ser, cierto y de hecho abre una nueva cuestión - Al aumentar el número de neuronas, la precisión que demande una red neuronal también disminuye? + Si bien los números racionales tienen el potencial de ser computados, seguimos sujetos a que el número de decimales y tamaño de su parte entera \textit{sean lo suficientemente pequeños} como para poder ser representados + y calculados con un ordenador. Esto no tiene que ser, cierto y de hecho abre una nueva cuestión: + Al aumentar el número de neuronas, ¿la precisión demandada por una red neuronal también disminuye? \end{aportacionOriginal} De ser cierto este resultado, podría empezar a denominarse el espacio de las redes neuronales de $n$ neuronas y $d$ bits de precisión. -Es más, una vez limitados los decimales con los que se puede representar una red neuronal; puesto que los números racionales son isomorfos a los enteros, se abriría la puerta a establecer un isomorfismo entre las redes neuronales con parámetros +Es más, una vez limitados los decimales con los que se puede representar una red neuronal; puesto que los números racionales son isomorfos a los enteros, se podría plantear establecer un isomorfismo entre las redes neuronales con parámetros en los racionales y el -y el de las redes neuronales con entradas en los enteros. - -Todas estas pesquisas tendrían su interés ya que por las arquitecturas -actuales, los números flotantes (racionales con un límite de decimales) se calculan en la GPUs, mientras que los enteros en las CPUs, siendo más rápidas la segundas\footnote{En el blog del investigador Long Zhou, se comenta se da una visión favorable sobre las CPUs y cómo en la actualidad se comenten errores a la hora de comparar las GPUs y CPUs, dejo link a la publicación. Consultada por última vez el 23 de mayo +de las redes neuronales con entradas en los enteros. + +Todas estas pesquisas tienen su interés ya que por las arquitecturas +actuales, los números flotantes (racionales con un límite de decimales) se calculan en las GPUs, mientras que los enteros en las CPUs, siendo más rápidas la segundas\footnote{En el blog del investigador Long Zhou, se comenta se da una visión favorable sobre las CPUs y cómo en la actualidad se comenten errores a la hora de comparar las GPUs y CPUs, dejo link a la publicación. Consultada por última vez el 23 de mayo del 2022, URL: \url{https://long-zhou.github.io/2013/02/12/CPU-GPU-comparison.html}} \cite{CPU-vs-GPUS}. diff --git a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/introduccion.tex b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/introduccion.tex index 9802b90..fa0fc65 100644 --- a/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/introduccion.tex +++ b/Memoria/capitulos/2-Articulo_rrnn_aproximadores_universales/introduccion.tex @@ -4,15 +4,11 @@ %******************************************************* % Introducción artículo MFNAUA %******************************************************* +\section{Las redes neuronales son aproximadores universales} -\chapter{Las redes neuronales son aproximadores universales} -\label{chapter:redes-neuronales-aproximador-universal} -\section{Introducción} - -Tras las definiciones y construcciones expuestas durante el capítulo de presentación -y construcción de las redes neuronales presentada en el capítulo anterior \ref{sec:redes-neuronales-intro-una-capa}. -es pertinente la pregunta de si todas las estructuras y técnicas presentadas solventan nuestro -objetivo principal: Aproximar con éxito una función genérica desconocida. +Tras las definición \ref{sec:redes-neuronales-intro-una-capa} de red neural expuesta, +es pertinente la pregunta si tal estructura será +capaz de aproximar con éxito una función genérica desconocida. Aunque las redes neuronales multicapa ya se venían aplicando con anterioridad, véase por ejemplo los usos expuestos durante la primera conferencia @@ -20,7 +16,7 @@ \section{Introducción} no fue hasta 1989 que se descubrió formalmente su alcance. Tal delimitación se propuso en el artículo \textbf{Multilayer Feedforward Networks are Universal Approximators} \cite{HORNIK1989359} - escrito por Kurt Hornik, Maxwell Stinchcombe y Halber White enunciando + escrito por Kurt Hornik, Maxwell Stinchcombe y Halber White enunciando: \begin{teorema}\textbf{Las redes \textit{feedforward} multicapa son una clase de aproximadores universales } \label{teo:MFNAUA} \\ @@ -30,14 +26,35 @@ \section{Introducción} \end{teorema} -En las secciones siguientes, con el fin de alcanzar una comprensión profunda de las redes neuronales, -trataremos de desgranar y profundizar en el artículo y su demostración. Primero precisaremos o introduciremos conceptos elementales -sobre redes neuronales \ref{ch:articulo:sec:defincionesPrimeras}, después demostraremos el teorema en el caso real -\ref{teo:TeoremaConvergenciaRealEnCompactosDefinicionesEsenciales} e iremos refinando y generalizando los resultado -en -TODO: añadir referencia a la sección que faltan -hasta probar en -TODO añadir referencia a la sección que faltan -el resultado enunciado \ref{teo:MFNAUA}. +En las secciones siguientes, con el fin de alcanzar una + comprensión profunda de las redes neuronales, +trataremos de desgranar y profundizar en el artículo y su +demostración. Primero precisaremos o introduciremos conceptos elementales +sobre redes neuronales \ref{ch:articulo:sec:defincionesPrimeras}, después +demostraremos el teorema en el caso real +\ref{teo:TeoremaConvergenciaRealEnCompactosDefinicionesEsenciales} e iremos refinando y generalizando los resultados hasta probar +el resultado enunciado \ref{teo:MFNAUA} para una capa oculta. + +El esquema general será: + + % Nota margen de denso + \setlength{\marginparwidth}{\bigMarginSize} + \marginpar{\maginLetterSize + \iconoAclaraciones \textcolor{dark_green}{ + \textbf{Idea intuitiva conjunto denso.} + } + Si $S$ es denso en $T$, + se está está diciendo que \textbf{los elementos de $S$ son capaces de aproximar cualquier elemento de $T$ + con la precisión que se desee}. + } + + +\begin{itemize} + \item Las redes neuronales que nosotros hemos modelizado son densas en un espacio más general que hemos denominado \textit{Anillo de aproximación de redes neuronales}. + \item El espacio \textit{Anillo de aproximación de redes neuronales} es denso en la funciones continuas. + \item Las funciones continuas son densas en los reales. +\end{itemize} + +Si quisiéramos situar en este esquema a otras definiciones de redes neuronales las situaríamos entre nuestro modelo y el espacio \textit{Anillo de aproximación de redes neuronales}; en el capítulo \ref{chapter:construir-redes-neuronales} se probará la equivalencia de nuestro modelo con estas definiciones y sus beneficios. diff --git a/Memoria/capitulos/3-Teoria_aproximacion/0_objetivos.tex b/Memoria/capitulos/3-Teoria_aproximacion/0_objetivos.tex index 0cbac4a..d1055e7 100644 --- a/Memoria/capitulos/3-Teoria_aproximacion/0_objetivos.tex +++ b/Memoria/capitulos/3-Teoria_aproximacion/0_objetivos.tex @@ -6,17 +6,14 @@ \chapter{Teoría de la aproximación} \label{chapter:teoria-aproximar} -Teniendo siempre presente la busca de una comprensión última de las redes neuronales -con el fin de poder encontrar alguna clave con las que optimizarlas, debemos de -notar que el teorema clave que nos asegura la convergencia se trata del Teorema de Stone Weierstrass -usado en el teorema \ref{teo:TeoremaConvergenciaRealEnCompactosDefinicionesEsenciales}. -El desarrollo de los capítulos comprendidos entre Polinomios de Bernstein \refeq{ch:Bernstein}, -a la demostración del teorema de Stone Weierstrass \refeq{ch:TeoremaStoneWeiertrass} es múltiple. -Se pretende primeramente construir las herramientas esenciales para la demostración del -Teorema Universal de redes neuronales por propagación hacia delante y hacia detrás; -mas comprendiendo la naturaleza del fundamento es posible entender la bondad, alcance e imposición -de las estructuras elementales que conforman las redes neuronales, luego se hará simultáneamente -un análisis y estudio de las implicaciones de la teoría demostrada. + + Puesto que queremos fundamentar desde el origen las redes neuronales, + supongamos que desconociéramos la existencia de éstas + y nos halláramos frente a un problema de aprendizaje \ref{sec:Aprendizaje}; + el enfoque más natural consistiría en abordar el problema + haciendo uso de teoría de la aproximación. + ¿Somos capaces de aproximar una función a partir de sus puntos? + diff --git a/Memoria/capitulos/3-Teoria_aproximacion/1_polinomios_de_Bernstein.tex b/Memoria/capitulos/3-Teoria_aproximacion/1_polinomios_de_Bernstein.tex index b7adb96..ff4240c 100644 --- a/Memoria/capitulos/3-Teoria_aproximacion/1_polinomios_de_Bernstein.tex +++ b/Memoria/capitulos/3-Teoria_aproximacion/1_polinomios_de_Bernstein.tex @@ -8,21 +8,66 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} %% Resumen capítulo -En esta sección introduciremos los polinomios de Bernstein, -que vistos como una serie nos asegurarán una convergencia uniformemente a cualquier +En esta sección introduciremos los polinomios de Bernstein +que, vistos como una serie, nos asegurarán una convergencia uniforme a cualquier función continua en un compacto y serán esenciales para nuestra prueba del teorema de Stone-Weierstrass, las pruebas se basan en el manual \cite{the-elements-of-real-analysis}. + % Nota margen de compacto + \reversemarginpar + \setlength{\marginparwidth}{\smallMarginSize} + \marginpar{\maginLetterSize + \iconoAclaraciones \textcolor{dark_green}{ + \textbf{Idea intuitiva compacto} + } + + Un compacto es un conjunto que se puede cambiar por un subconjunto finito cometiendo un error prefijado. + + } + \normalmarginpar + \setlength{\marginparwidth}{\bigMarginSize} + + + +% Nota margen sobre Idea intuitiva convergencia uniforme +\marginpar{\maginLetterSize +\iconoAclaraciones \textcolor{dark_green}{ +\textbf{¿Qué es la convergencia uniforme?}}. + Cuando se hable de \textbf{convergencia} nos referiremos + a encontrar un elemento que \textbf{aproxime todo lo bien que queramos}; + es decir, fijado cualquier error podemos encontrar un elemento + que lo aproxime cometiendo un error menor. + + Tengamos presente que en el contexto de funciones + el error se puede medir evaluando la imagen de cada punto del dominio; entonces + con \textbf{uniforme} lo que se dice es que independientemente del error que se busque, + se puede encontrar una función que \textbf{para todos los puntos del dominio + aproxima al objetivo + por debajo de ese error}. +} + Comenzaremos recordando el Teorema del Binomio de Newton. %% Teorema Binomio de Newton - \begin{teorema}[Binomio de Newton] Cualquier potencia de un binomio $x+y$ con $x,y \in \R$, puede ser expandido en una suma de la forma \[ (x+y)^n = \sum_{k=0}^n \binom{n}{k} x^{k}y^{n-k}. \] -\end{teorema} +\end{teorema} + +% Nota margen sobre Idea intuitiva sobre porqué se está procediendo de esta manera +\marginpar{\maginLetterSize +\iconoAclaraciones \textcolor{dark_green}{ +\textbf{¿Con qué idea se está avanzando?}}. + + Nuestro objetivo es ser capaces de aproximar una función + a partir de una muestra de sus preimágenes e imágenes. + Comenzaremos probando primero que dada una función continua, podemos + aproximarla a partir de una muestra concreta. + Por eso se está tratando de reescribir la función en + términos de cierto conjunto de sus imágenes. +} %%% Idea intuitiva y desigualdad Tomando ahora para esta igualdad $x \in \R, y= 1-x$ se tiene que @@ -30,7 +75,7 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} 1 = (x+ (1-x))^n = \sum_{k=0}^n \binom{n}{k} x^{k} (1-x)^{n-k}. \end{equation} -Dada cualquier función $f$ definida en $x$ podríamos multiplicar la ecuación +Dada cualquier función continua $f: I \longrightarrow \R$ podríamos multiplicar la ecuación \eqref{eq:uno_igual_binomio} por $f(x)$ resultando \begin{equation}\label{eq:f_igual_binomio} @@ -39,7 +84,7 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} Y tomando como dominio $I=[0,1]$ de $f: I \longrightarrow \R$, nos encontramos -frente a una ecuación muy sugerente para introducir $B_n(x)$, el \textit{Polinomio n-ésimo de Bernstein }. +frente a una ecuación muy sugerente para introducir $B_n(x)$, el \textit{Polinomio n-ésimo de Bernstein}. El cual pretende aproximar la función $f$ a través de los puntos $\frac{k}{n}$ con $n \in \N$ fijo y $k \in \{0,...,n \}.$ @@ -68,7 +113,7 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} Ante tal igualdad la intuición ya nos hace pensar que sea convergente al aumentar el tamaño de la partición. - En efecto, en nuestro sucesivo teorema, nos cercioraremos que \ref{def:Bernstein} + En efecto, en nuestro siguiente teorema, nos cercioraremos de que \ref{def:Bernstein} es uniformemente convergente a $f$ en un compacto. Para la demostración será necesario el siguiente resultado técnico: @@ -150,8 +195,8 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} \begin{equation} x^2 = \sum_{k=0}^{n} \frac{k(k-1)}{n(n-1)} \binom{n}{k} x^{k} (1-x)^{n-k}. \end{equation} - Podemos reescribir la ecuación resultando \label{eq:desarrollo_binomio_dos}: - \begin{equation} + Podemos reescribir la ecuación resultando: + \begin{equation}\label{eq:desarrollo_binomio_dos} (n^2 - n) x^2 = \sum_{k=0}^{n} (k^2 - k) \binom{n}{k} x^{k} (1-x)^{n-k}. \end{equation} @@ -160,7 +205,7 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} Sumando las dos expresiones que hemos obtenido \eqref{eq:desarrollo_binomio_uno} y \eqref{eq:desarrollo_binomio_dos} - resultando + resulta: \begin{equation} (n^2 - n) x^2 + nx= \sum_{k=0}^{n} ((k^2 - k)+k) \binom{n}{k} x^{k} (1-x)^{n-k}. \end{equation} @@ -177,14 +222,12 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} \begin{equation} \frac{1}{n} x (1-x)= \sum_{k=0}^{n} \left( x-\frac{k}{n} \right)^2 \binom{n}{k} x^{k} (1-x)^{n-k}. \end{equation} - - \end{proof} \begin{teorema}[Teorema de aproximación de Bernstein]\label{teo:aproximacion_bernstein} Sea $f$ una función continua de un intervalo $I = [0,1]$ con imágenes en los reales. - La secuencia de polinomio de Bernstein + La sucesión de polinomios de Bernstein \ref{def:Bernstein} converge uniformemente a $f$ en $I.$ \end{teorema} @@ -224,9 +267,11 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} $\frac{k}{N} \in I$ y tomando $x \in I$ podemos acotar por la desigualdad triangular $$\left|f(x)- f\left( \frac{k}{N} \right) \right| \leq |f(x)| + \left|f \left( \frac{k}{N}\right) \right|\leq 2M.$$ - Por lo que + Por (\refeq{eq:eq:Bernstein_diferencia}) \begin{equation*} - |f(x)-B_n(x)| \sum_{k=0}^n \left|f(x) - f \left( \frac{k}{n} \right)\right| \leq + |f(x)-B_n(x)| + \leq + \sum_{k=0}^n \left|f(x) - f \left( \frac{k}{n} \right)\right| \binom{n}{k} x^{k} (1-x)^{n-k}. \end{equation*} @@ -246,14 +291,16 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} \end{equation} % Conjunto de los que son mayores \begin{equation} - \mathcal{B}_{n x} = \{0,..., n\} - \mathcal{A}_{n x}. + \mathcal{B}_{n x} = \{0,..., n\} + \setminus + \mathcal{A}_{n x}. \end{equation} Para los elementos de $\mathcal{A}_{n x}$ se obtiene la siguiente estimación: \begin{equation*} \begin{split} - \sum_{k \in \mathcal A } \left|f(x) - f \left( \frac{k}{n} \right)\right| + \sum_{k \in \mathcal{A}_{n x} } \left|f(x) - f \left( \frac{k}{n} \right)\right| \binom{n}{k} x^{k} (1-x)^{n-k} \leq \sum_{k \in \mathcal{A}_{n x} } \varepsilon \binom{n}{k} x^{k} (1-x)^{n-k} @@ -265,17 +312,17 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} \end{split} \end{equation*} - Para el resto de sumandos para los que $|x - \frac{k}{n}| \geq n^{\frac{-1}{4}}$ se tiene que - $(x - \frac{k}{n})^2 \geq n^{\frac{-1}{2}}$ cota. Procederemos a acotar tales términos, para ello partimos de la ecuación (\refeq{eq:eq:Bernstein_diferencia}) y la acotación de $f$. - - \begin{equation*} - |f(x)-B_n(x)| \sum_{k=0}^n \left|f(x) - f \left( \frac{k}{n} \right)\right| - \leq \sum_{k=0}^n 2M - \binom{n}{k} x^{k} (1-x)^{n-k} - \end{equation*} + Para los elementos de $ \mathcal{B}_{n x}$ se tiene que + $(x - \frac{k}{n})^2 \geq n^{\frac{-1}{2}}$. + Usando esto y la consecuencia \refeq{consecuencia:M} podemos escribir: \begin{align*} - & \sum_{k \in \mathcal{B}_{n x}} 2M + &\sum_{k \in \mathcal{B}_{n x} } \left|f(x) - f \left( \frac{k}{n} \right)\right| + \binom{n}{k} x^{k} (1-x)^{n-k} + \\ + & + \leq + \sum_{k \in \mathcal{B}_{n x}} 2M \binom{n}{k} x^{k} (1-x)^{n-k} \\ & @@ -304,10 +351,9 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} \frac{1}{n} x(1-x) \right) \leq - \frac{M}{2 \sqrt{n}}, + \frac{M}{2 \sqrt{n}}. \end{align*} - - Donde para la penúltima desigualdad se ha usado + Para la penúltima desigualdad se ha usado la desigualdad (\refeq{eq:binomio_segunda_suma}) del lema previo y para la última que en el intervalo $I$ se satisface que \begin{equation*} x (1-x) \leq \frac{1}{4}. @@ -315,10 +361,9 @@ \section{Polinomios de Bernstein}\label{ch:Bernstein} Además recordemos que se puede tomar un $n$ que satisfaga (\refeq{eq:cota-de-la-n}) y entonces se concluye que para los valores de $\mathcal{B}_{n x}$ se puede acotar la desigualdad por $\varepsilon$. - - Por tanto para un $n$ convenientemente seleccionado, se ha acotado la desigualdad para los indices $\mathcal{A}_{n x}$ y $\mathcal{B}_{n x}$, es decir todos, por lo que concluimos que + Por tanto, para un $n$ convenientemente seleccionado, se ha acotado la desigualdad para los indices $\mathcal{A}_{n x}$ y $\mathcal{B}_{n x}$, es decir todos los elementos de $\{0, \ldots, n\}$, por lo que concluimos que \begin{equation*} |f(x) - B_n(x)| \leq 2 \varepsilon, \end{equation*} - independiente del valor de $x$, por lo que se prueba que la secuencia de polinomios de Bernstein converge uniformemente a $f$ en $I$. + independientemente del valor de $x$, por lo que se prueba que la secuencia de polinomios de Bernstein converge uniformemente a $f$ en $I$. \end{proof} \ No newline at end of file diff --git a/Memoria/capitulos/3-Teoria_aproximacion/2_Weierstrass_approximation_theorem.tex b/Memoria/capitulos/3-Teoria_aproximacion/2_Weierstrass_approximation_theorem.tex index 7178950..a6e3d8e 100644 --- a/Memoria/capitulos/3-Teoria_aproximacion/2_Weierstrass_approximation_theorem.tex +++ b/Memoria/capitulos/3-Teoria_aproximacion/2_Weierstrass_approximation_theorem.tex @@ -5,20 +5,44 @@ % Teorema de Aproximación Weierstrass %******************************************************* -Realizando un repaso global habiendo acabado el teorema, se pueden extraer que conjunto a un ingenioso manejo de operaciones y acotaciones; la clave del resultado reside en las consideraciones -en \refeq{consecuencia:M} \refeq{consecuencia:delta} y estas a su vez en la +Realizando un repaso global habiendo acabado el teorema, + se pueden extraer que, junto a un ingenioso + manejo de operaciones y acotaciones; la clave del resultado reside en las consideraciones +en \refeq{consecuencia:M} y \refeq{consecuencia:delta} y estas a su vez en la compacidad de $I$. Por su parte, la selección del dominio de $I = [0,1]$ viene determinada ya que - los nodos $\{ \frac{k}{N} | k\in \{0,..., N\}\}$ sobre los que se construye el \textit{N-ésimo polinomio de Bernstein} deben pertenecer a $I$. + los nodos $\{ \frac{k}{N} \colon k\in \{0,..., N\}\}$ sobre los que se construye el \textit{N-ésimo polinomio de Bernstein} deben pertenecer a $I$. Sin embargo, tal dificultad es fácilmente salvable con un homeomorfismo. +% Nota margen sobre Idea intuitiva homeomorfismo +\marginpar{\maginLetterSize +\iconoAclaraciones \textcolor{dark_green}{ +\textbf{¿Qué es un homeomorfismo?}}. + + A nivel intuitivo, un homeomorfismo sería + la transformación de un objeto en otro, + con la condición de que tal cambio consista + en una deformación \textit{sin roturas}. + Es decir, si éste fuera de plastilina, + existiría un homeomorfismo entre la figura + original y + aquellas que pudiéramos construir + sin separar totalmente la masilla + o crear y eliminar agujeros. + Ejemplo de objetos homeomorfos serías: + un pelota y un vaso, + una taza y un rosco. + El vaso y la taza no serían homeomorfos, + ya que el número de agujeros que tienen es distinto. +} + Como resultado de relajar el dominio donde se define $f$, pidiéndole tan solo compacidad nace el siguiente corolario. \begin{corolario}[Teorema de aproximación de Weierstass] \label{teo:Teorema-Weierstrass} - Sea $f$ una función continua definida en un intervalo real y con valores reales. Se tiene que $f$ puede ser aproximada uniformemente con polinomios. + Sea $f$ una función continua definida en un intervalo cerrado y acotado y con valores reales. Se tiene que $f$ puede ser aproximada uniformemente con polinomios. \end{corolario} \begin{proof} diff --git a/Memoria/capitulos/3-Teoria_aproximacion/3_TeoremaStoneWeierstrass.tex b/Memoria/capitulos/3-Teoria_aproximacion/3_TeoremaStoneWeierstrass.tex index de3ac49..3760f70 100644 --- a/Memoria/capitulos/3-Teoria_aproximacion/3_TeoremaStoneWeierstrass.tex +++ b/Memoria/capitulos/3-Teoria_aproximacion/3_TeoremaStoneWeierstrass.tex @@ -7,59 +7,361 @@ \section{Teorema de Stone-Weierstrass }\label{ch:TeoremaStoneWeiertrass} +\begin{lema}\label{ch03:lema:min-max} + Sean tres funciones $f_1,f_2,g : K \longrightarrow \R$ tales que + \begin{equation} + |f_2 - g| \leq \varepsilon. + \end{equation} + Entonces la diferencia entre los máximos + y respectivamente mínimos satisface que: + \begin{equation} + | + \max\{f_1, f_2\} + - + \max\{f_1, g\} + | + \leq \epsilon + \end{equation} + y + \begin{equation} + | + \min\{f_1, f_2\} + - + \min\{f_1, g\} + | + \leq \epsilon. + \end{equation} +\end{lema} +\begin{proof} + Sabemos que + \begin{align} + & \max\{f,g\} = \frac{1}{2} (f+g+ |f-g|) \\ + & \min \{f,g\} = \frac{1}{2} (f+g -|f-g|). + \end{align} + Por lo que + \begin{align} + | + \max\{f_1, f_2\} + - + \max\{f_1, g\} + | + & = + \left| + \frac{1}{2} (f_1+f_2+ |f_1-f_2|) + - + \frac{1}{2} (f_1+g+ |f_1-g|) + \right| + \\ + &= + \frac{1}{2} + \big| + f_1+f_2+ |f_1-f_2| + - + f_1 - g - |f_1-g| + \big| + \\ + &= + \frac{1}{2} + \big| + f_2 - g + |f_1-f_2| + - |f_1-g| + \big| + \\ + & \leq + \frac{1}{2} + (|f_2 - g | + + + |f_2 - g | + ) + \\ + & \leq + |f_2 - g | + \\ + & \leq + \varepsilon. + \end{align} + + Para el mínimo se razona igual: + \begin{align} + | + \min\{f_1, f_2\} + - + \min\{f_1, g\} + | + & = + \left| + \frac{1}{2} (f_1+f_2- |f_1-f_2|) + - + \frac{1}{2} (f_1+g - |f_1-g|) + \right| + \\ + &= + \frac{1}{2} + \big| + f_1+f_2- |f_1-f_2| + - + f_1 - g + |f_1-g| + \big| + \\ + &= + \frac{1}{2} + \big| + f_2 - g - |f_1-f_2| + + |f_1-g| + \big| + \\ + & \leq + \frac{1}{2} + ( + |f_2 - g | + + + |f_2 - g | + ) + \\ + & \leq + |f_2 - g| + \\ + & \leq + \varepsilon. + \end{align} + +\end{proof} + \begin{teorema}[Teorema de Stone-Weierstrass] Sea $K$ un subconjunto compacto de $\R^p$ y sea $\mathcal{A}$ una colección de - funciones continuas de $K$ a $\R$ cumpliendo $\mathcal{A}$ y + funciones continuas de $K$ a $\R$ que separa puntos en $K$, es decir cumpliendo las siguientes propiedades: \begin{enumerate} \item La función constantemente uno, definida como $e(x)=1$, para cualquier $x\in K$ pertenece a $\mathcal{A}$. - \item Cerrado para sumas y producto para escalares reales. Si $f,g$ pertenece a $\mathcal{A}$, entonces $\alpha f + \beta g$ pertenece a $\mathcal{A}$ . - \item Cerrado para producto. Para $f,g \in \mathcal A$, se tiene que $fg$ pertenece a $\mathcal{A}$. - \item Separación de $K$, es decir si $x \neq y$ pertenecientes a $K$, entonces existe una función $f$ en $\mathcal{A}$ de tal manera que $f(x) \neq f(y)$. + \item $\mathcal{A}$ es cerrado para sumas y productos por escalares reales. Si $f,g$ pertenece a $\mathcal{A}$, entonces $\alpha f + \beta g$ pertenece a $\mathcal{A}$ . + \item $\mathcal{A}$ es cerrado para productos. Para $f,g \in \mathcal A$, se tiene que $fg$ pertenece a $\mathcal{A}$. + \item Separación de $K$, es decir, si $x \neq y$ pertenecen a $K$, entonces existe una función $f$ en $\mathcal{A}$ de tal manera que $f(x) \neq f(y)$. \end{enumerate} - Se tiene que toda función continua de $K$ a $\R$ puede ser aproximada en $K$ por funciones de $\mathcal A$. + Entonces se tiene que toda función continua de $K$ a $\R$ puede ser aproximada en $K$ por funciones de $\mathcal A$. \end{teorema} -La idea que subyace bajo la demostración del teorema es que a partir de las hipótesis de la estructura algebraica y -separabilidad -se prueba que es posible encontrar las funciones máximo y mínimo, -construyéndolo a partir del valor absoluto. - -Con esta nueva propiedad y siendo cerrado para combinaciones lineales -se puede aproximar uniformemente cualquier función continua definida en el compacto. - \begin{proof} - Sean $a, b \in \R$ y $x \neq y$ pertenecientes a $K$. Por la hipótesis de separabilidad existirá - una función $f \in \mathcal{A}$ tal que $f(x) \neq f(y)$. Además la existencia de un elemento neutro - $e \in \mathcal{A}$ en el álgebra nos permite encontrar reales $\alpha, \beta$ tales que + \subsubsection*{Paso 1: Para $f \in \mathcal{A}$ la función valor absoluto de $f$ puede ser aproximada por elementos + de $\mathcal{A}$.} + Probaremos que + para cualquier $\varepsilon > 0$ y $f \in \mathcal{A}$, + existe $g \in \mathcal{A}$ tal que + \begin{equation*} + \big| g(x) - |f(x)|\big| < \varepsilon \quad \forall x \in K. + \end{equation*} - $$\alpha f(x) + \beta e(x) = a, \quad \alpha f(y) + \beta e(y) = b$$ - - Por el teorema de Heine, para $f \in \mathcal A$ está acotada por tomar imagen en un compacto, es decir $|f(x)| \leq M$ para $x \in K.$ + Por el teorema de Heine $f$ es acotada, es decir existe $M \in R^+$ tal que $|f(x)| \leq M$ para $x \in K.$ Consideremos ahora la función valor absoluto, $\phi(t)=|t|$ definida en el dominio $I = [-M, M].$ Por el teorema de aproximación de Weierstrass \ref{teo:Teorema-Weierstrass} para cualquier $\varepsilon > 0$ existirá un polinomio $p$ cumpliendo que - $$||t|- p(t)| < \varepsilon, \quad \forall t \in I.$$ + \begin{equation} + \big||t|- p(t)\big| < \varepsilon \quad \forall t \in I. + \end{equation} Puesto que $t \in I$ no son más que las posibles imágenes que puede tomar $f$ en $K$ inferimos entonces que - $$||f(x)| - p \circ f(x)| < \varepsilon \quad \forall x \in K.$$ + \begin{equation} + \big||f(x)| - p \circ f(x)\big | < \varepsilon \quad \forall x \in K + \end{equation} + + Como $f \in \mathcal{A}$ y $p$ es un polinomio, + $p \circ f$ son sumas de potencias de $f$ multiplicadas por escalares. + Como $\mathcal{A}$ es cerrado para estas operaciones tenemos que la función + $p \circ f$ pertenece a $\mathcal{A}$ de donde se deduce + $|f|$ se puede aproximar todo lo que queramos por elementos de $\mathcal{A}$. - Como $f \in \mathcal{A}$ y $p$ es un polinomio, es decir, $p \circ f(x)$ son sumas de potencias multiplicadas por escalares de $f(x)$, luego por la hipótesis de ser cerrado a estas operaciones tenemos que la función - $|f|$ pertenece a $\mathcal{A}$ si $f \in \mathcal{A}.$ + Tenemos con esto que para $f,g \in \mathcal{A}$ también es capaz de aproximar la función + a supremo e ínfimo gracias a que: + \begin{align} \label{eq:cerrado-min-max} + & \max\{f,g\} = \frac{1}{2} (f+g+ |f-g|) \\ + & \min \{f,g\} = \frac{1}{2} (f+g -|f-g|). + \end{align} + + \subsubsection*{Paso 2: Para cada familia finita $\mathcal{F} \subset \mathcal{A}$ las funciones $\max\{\mathcal{F}\}$ y $\min\{\mathcal{F}\}$ pueden ser aproximadas por elementos de + de $\mathcal{A}$} + \label{ch03:weiertrass-paso-2} + Razonando por inducción: para el caso base $n=2$ ya se ha probado. + Si $n >2$ entonces podemos escribir (los razonamientos son idénticos para la función mínimo): + \begin{equation} + \max\{f_1, f_2, \ldots, f_n\} + = + \max\{f_1, \max\{f_2, \ldots, f_n\}\}, + \end{equation} + por hipótesis de inducción existe + $g \in \mathcal{A}$ tal que + \begin{equation} + |\max\{f_2, \ldots, f_n\} - g| + < + \frac{\varepsilon}{2}. + \end{equation} + Considerando entonces + $\max\{f_1,g\}$, por el caso base existirá + un $g' \in \mathcal{A}$ tal que + \begin{equation}\label{cota:max-g} + |\max\{f_1,g\} - g'| + < \frac{\varepsilon}{2}. + \end{equation} + Por desigualdad triangular, el lema \ref{ch03:lema:min-max} y la ecuación (\refeq{cota:max-g}) se tiene que + \begin{align} + |\max\{f_1, f_2, \ldots, f_n\} + - + g' + | + &\leq + |\max\{f_1, f_2, \ldots, f_n\} + - + \max\{f_1,g\} + | + + + | + \max\{f_1,g\}- + g' + | + \leq + \varepsilon. + \end{align} - Tenemos con esto que $\mathcal{A}$ también es cerrada a supremo e ínfimo gracias a que: - $$\sup\{f,g\} = \frac{1}{2} \{f+g+ |f+g|\}$$ - $$\inf\{f,g\} = \frac{1}{2} \{f+g -|f+g|\}$$ + Probando con ello lo buscado. - Por lo que concluimos que cualquier función puede ser uniformemente aproximada por combinaciones lineales, supremos e ínfimo mediante funciones de $\mathcal{A}$. Es decir, cualquier función continua en $K$ - puede ser uniformemente aproximado por funciones de $\mathcal{A}$. + \subsubsection*{Paso 3: Cualquier función continua $f \in \mathcal{C}(K, \R)$ puede ser aproximada con elementos + de $\mathcal{A}$} + Vamos a proceder ahora con nuestro objetivo + principal. + Queremos probar que para cualquier función continua $f: K \longrightarrow \R$ y cualquier $\varepsilon > 0$ existe $g \in \mathcal{A}$ tal que + + \begin{equation} + |f(x) - g(x)| < \varepsilon \quad \forall x \in K. + \end{equation} + + Tomamos $s,t \in K$ distintos y por la hipótesis de separación de puntos existirá $u \in \mathcal{A}$ tal que $u(s) \neq u(t)$, de esta forma definimos + \begin{equation} + \tilde{h}_{s t}(x) = + f(s) + (f(t) - f(s))\frac{ u(x) - u(s)}{ u(t) - u(s)}, + \end{equation} + se tiene que $\tilde{h}_{s t} \in \mathcal{A}$ + y satisface que + $\tilde{h}_{s t}(s) = f(s)$ y $\tilde{h}_{s t}(t) = f(t)$. + + Tomamos $s \in K$ fijo pero arbitrario y + definimos el siguiente conjunto + \begin{align} + U_t = + \left\{ + u \in K \colon + \tilde{h}_{s t}(u) < f(u) + \frac{\varepsilon}{2} + \right\}. + \end{align} + Notemos que $U_t$ es un conjunto abierto ya que + $\tilde{h}_{s t} - f$ es una función continua + y se está tomando la imagen inversa de un abierto. + Además se tiene que $\{t,s\} \subset U_t$ para cualquier + $t \in K \setminus \{s\}$. + % Escribimos como recubrimiento finito + Por lo que podemos escribir + \begin{equation*} + K = \bigcup_{t \in K \setminus \{s\}} U_t + \end{equation*} + y por ser $K$ compacto admitirá un recubrimiento finito dado por + $I_u = \{t_1, \ldots, t_n\} \subset K$, es decir + \begin{equation}\label{subrecubrimiento_t} + K = \bigcup_{t \in I_u} U_t. + \end{equation} + Definimos ahora + \begin{equation*} + h_s(x) = \max_{t \in I_u}\{ + \tilde{h}_{s t}(x) + \colon + x \in U_t + \} + \text{ para cada } x \in K. + \end{equation*} + Así definida $h_s$ satisface que: + \begin{itemize} + % Desigualdad + \item $\text{Para cada } x \in K$ se tiene que $h_s(x) < f(x) + \frac{\varepsilon}{2}$. + + Ya que por + (\refeq{subrecubrimiento_t}) + $h_s(x) = \tilde{h}_{s t_j}(x)$ y + como $x \in U_{t_j}$ entonces + $\tilde{h}_{s t_j}(x) < f(x) + \frac{\varepsilon}{2}$. + % continuidad + \item La función $h_s$ puede ser aproximada con la precisión que se desee por elementos de $\mathcal{A}$ como ya hemos visto en el paso 2. + Sea $h_s'\in \mathcal{A}$ tal que + $|h_s' - h_s| < \frac{\varepsilon}{2}$. + + % Desigualdad para aproximación + \item $\text{Para cada } x \in K$ se tiene que $h_s(x) < f(x) + \frac{\varepsilon}{2}$ y que $\frac{\varepsilon}{2} > |h_s' - h_s| \geq h_s' - h_s$; sumando ambas ecuaciones se tiene que + \begin{equation} + h_s'(x) < f(x) + \varepsilon. + \end{equation} + + \end{itemize} + + + % Vamos a definir el conjunto pa sacar la otra cota. + Y definimos para cada $s \in K$ el conjunto + \begin{equation}\label{subrecubrimiento_s} + V_s = \left\{ + v \in K \colon + h_s'(x) > f(x) - \frac{\varepsilon}{2} + \right\}. + \end{equation} + + Y repitiendo el mismo argumento que para $U_t$ puede verse que $K$ admitirá un + subrecubrimiento finito por abiertos: + \begin{equation*} + K = \bigcup_{s \in I_s} V_s + \end{equation*} + con $I_v = \{s_1, \ldots, s_m\} \subset K$. + % definimos ahora la función graciosa + Además $g$ definida como: + \begin{equation} + g(x)= \min_{s \in I_v} + \{ + h_{s}'(x) + \colon + x \in V_s + \} + \end{equation} + satisface: + \begin{itemize} + + \item Por el paso 2 sabemos que existe $g' \in \mathcal{A}$ tal que $|g' - g| < \frac{\varepsilon}{2}$. + + % g acotado inferiormente + \item $\text{Para cada } x \in K$ se tiene que $g(x) >f(x) - \frac{\varepsilon}{2}$. + Ya que por + (\refeq{subrecubrimiento_s}) + $g(x) = h_{s_i}'(x)$ y + como $x \in V_{s_i}$ entonces + $h_{s_i}'(x) > f(x) - \frac{\varepsilon}{2}$. + % g acotado superiormente + \item $\text{Para cada } x \in K$ se tiene que $g(x) 1 + \end{array} + \right. + \end{equation*} + usando el método de interpolación de Lagrange; en este caso el error tiende a + infinito conforme aumenta el número de nodos. \footnote{Puede encontrar la implementación + del código que genera las gráficas en nuestro repositorio + \url{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales}, + en el fichero \texttt{Lagrange.ipynb} que se encuentra en el directorio de teoría de la aproximación de la memoria. } + + \item Y otra cuestión, de corte físico o filosófico ¿son todos los fenómenos observables continuos? + Sería extraño que así fueran, lo que evidencia la necesidad de formular una teoría más general. +\end{enumerate} + +\begin{figure}[H] + \centering + \begin{subfigure}[b]{0.475\textwidth} + \centering + \includegraphics[width=\textwidth]{metodo-lagrange/lagrange-3-datos.png} + \caption[Network2]% + {{\small Polinomio de Lagrange utilizando 3 datos}} + \end{subfigure} + \hfill + \begin{subfigure}[b]{0.475\textwidth} + \centering + \includegraphics[width=\textwidth]{metodo-lagrange/lagrange-8-datos.png} + \caption[]% + {{\small Polinomio de Lagrange utilizando 8 datos}} + \end{subfigure} + \vskip\baselineskip + \begin{subfigure}[b]{0.475\textwidth} + \centering + \includegraphics[width=\textwidth]{metodo-lagrange/lagrange-13-datos.png} + \caption[]% + {{\small Polinomio de Lagrange utilizando 13 datos}} + \end{subfigure} + \hfill + \begin{subfigure}[b]{0.475\textwidth} + \centering + \includegraphics[width=\textwidth]{metodo-lagrange/lagrange-18-datos.png} + \caption[]% + {{\small Polinomio de Lagrange utilizando 18 datos}} + \end{subfigure} + \caption{Ejemplo de aproximación de la función $f(x)$ a partir de los polinomios de Lagrange.} + \label{fig:aproximacion-lagrage} +\end{figure} + +El problema que evidencia este caso patológico es el tratar de abarcar todo el dominio +con un mismo polinomio ¿y si en lugar de eso se hicieran aproximaciones +en una partición concreta del dominio? El resultado sería una función definida a trozos. +La cuestión es que esta aproximación sería difícil de implementar de manera eficiente; +sin embargo, es el germen y el enfoque de las \textit{funciones de activación}. + +De todas formas no abandonemos del todo esta teoría, porque como ya veremos el +teorema de Stone Weierstrass \ref{ch:TeoremaStoneWeiertrass} jugará +un papel fundamental en la demostración +de que las redes neuronales son aproximadores universales. diff --git a/Memoria/capitulos/3-Teoria_aproximacion/Lagrange.ipynb b/Memoria/capitulos/3-Teoria_aproximacion/Lagrange.ipynb new file mode 100644 index 0000000..b4e344b --- /dev/null +++ b/Memoria/capitulos/3-Teoria_aproximacion/Lagrange.ipynb @@ -0,0 +1,123 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Ejemplo para ver cómo el error tiende a infinito al aproximar con polinomios\n", + "## Utiliza método de los polinomios de Lagrange " + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.interpolate import lagrange\n", + "import matplotlib.pyplot as plt\n", + "from numpy.polynomial.polynomial import Polynomial\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "directorio_guardar_imagenes = \"../../img/metodo-lagrange/\"\n", + "for i in range(2,20,5):\n", + " x = np.arange(-3, 3.1, 6/i)\n", + " f = lambda z: np.log(z) if(z>1) else np.exp(-z)-4\n", + " y = list(map(f,x))\n", + " poly = lagrange(x, y)\n", + " x_new = np.arange(-3, 3.1, 0.1)\n", + " plt.scatter(x, y, label='datos')\n", + " plt.plot(x_new, Polynomial(poly.coef[::-1])(x_new), label='Polinomio Lagrange')\n", + " plt.plot(x_new, list(map(f,x_new)) , label=r\"$f(x)$\", linestyle='-.')\n", + " plt.legend()\n", + " #plt.title(f\"Polinomio lagrange para {i+1} datos\")\n", + " plt.savefig(directorio_guardar_imagenes+f\"lagrange-{i+1}-datos.png\")\n", + " plt.show()\n", + " " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.7 ('tensorflow')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "24dcaf82da949eb8a169ffe40fd331a23a642ab22de3e08713f616aa663d0868" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Memoria/capitulos/4-Actualizacion_redes_neuronales/aprendizaje.tex b/Memoria/capitulos/4-Actualizacion_redes_neuronales/aprendizaje.tex index 4b59957..166c51e 100644 --- a/Memoria/capitulos/4-Actualizacion_redes_neuronales/aprendizaje.tex +++ b/Memoria/capitulos/4-Actualizacion_redes_neuronales/aprendizaje.tex @@ -615,14 +615,46 @@ \subsection{Algoritmos de actualización de pesos de una neurona} \end{algorithmic} \end{algorithm} -Notemos la necesidad de una variable $\eta \in \R$ que es prefijada. - -\textcolor{red}{$\eta$ podría ser incluso una vector de pesos que se aplicara de manera distinta a cualquier coeficiente o una función variable de ciertas condiciones. No sé hasta qué punto sería interesante plantearse el uso de algoritmos genéticos para actualizarlo ya que estos carecen de valor teórico. ¿Existe algún resultado de análisis que nos de una cota mejor?} - - -Procederemos ahora a determinar el cálculo del gradiente, como hemos visto este vienen determinado por la expresión. +Notemos la necesidad de una variable $\eta \in \R$ que es + prefijada. En la terminología de aprendizaje automático +se suele referir a ester término +como tasa de aprendizaje o \textit{learning rate}. +Una amplia literatura sobre cómo debe seleccionarse +y variantes adaptativas del mismo, +se puede encontrar en \cite{MostafaLearningFromData}. +El algoritmo como hemos visto se divide en +\begin{enumerate} + \item Ejecución del algoritmo de gradiente descendente. + \item Actualización de los pesos. +\end{enumerate} + +La complejidad por tanto será el máximo de esos dos procesos; +puesto que el segundo son tres grandes asignaciones de costo $n d , n, n s$ respectivamente, +la complejidad recae principalmente en el coste de calcular los gradientes, +la cual calculamos en la sección \ref{ch05:complejidad-gradientes}. +En resumen su complejidad es +\begin{align*} + &\mathcal{O}( + \max\{ + n d , n, n s, + \text{coste cálculo de los gradientes} + \} + ) + = \\ + & = + \mathcal{O}( + \text{coste cálculo de los gradientes} + ) + = \\ + & + = + \mathcal{O}(|\mathcal{D}| n d s). +\end{align*} + +Procederemos ahora a determinar el cálculo del gradiente, como hemos visto, éste viene determinado por la expresión. El algoritmo que se muestra a continuación supone que la memoria no es un problema así que se plantea para que no haya ningún cálculo repetido. +\pagebreak % Cálculo de los gradientes @@ -719,9 +751,8 @@ \subsection{Algoritmos de actualización de pesos de una neurona} \end{algorithmic} \end{algorithm} -\textcolor{red}{Falta añadir complejidad} - \subsubsection*{Análisis de la complejidad} +\label{ch05:complejidad-gradientes} Notemos que la complejidad computacional del algoritmo \ref{algoritmo:calculo-gradiente} es: \begin{itemize} \item \textbf{Coste de cálculo}: Entendiendo suma, productos y evaluaciones como constante de valor $1$ el resultado es: @@ -752,13 +783,19 @@ \subsubsection*{Análisis de la complejidad} |\mathcal{D}| 3 \max \{4, d \} n s. \end{align} - - De aquí se deduce, puesto que $s,d$ son constantes fijas que a nivel práctico serán mucho menor que el número de neuronas $n$ y el número de datos de entrenamiento $|\mathcal{D}| $, que lo que afecta primordialmente al coste es $|\mathcal{D}| $ y $n$. + La complejidad del algoritmo resulta por tanto + $\mathcal{O}(|\mathcal{D}| n d s)$. + De aquí se deduce, puesto que $s,d$ son constantes fijas que a nivel práctico serán + mucho menor que el número de neuronas $n$ y el + número de datos de entrenamiento $|\mathcal{D}| $, + que lo que afecta primordialmente al coste es + $|\mathcal{D}| $ y $n$. Si queremos converger con cierta precisión, el teorema de aproximación no nos permite reducir $n$. Sin embargo, si suponemos que $\mathcal{D}$ presenta datos independientes e idénticamente distribuidos tomar un subconjunto aleatorio mantendría un buen estimador del error actual y por ende del aprendizaje. - \textcolor{red}{La clave es cuánto de pequeño debe ser la muestra con la que aprendamos.} + La clave entonces reside en qué tamaño de subconjunto tomar, en artículos como \cite{mini-batch-size} se ofrece una posible estimación basada en reducir el número de épocas, es decir ejecuciones del algoritmo de gradiente descendiente. + \item \textbf{Coste en memoria}: El coste total de memoria, entendiendo por una unidad aquella que almacene un parámetro concreto de la red neuronal será: diff --git a/Memoria/capitulos/4-Actualizacion_redes_neuronales/construccion-evaluacion-red-neuronal.tex b/Memoria/capitulos/4-Actualizacion_redes_neuronales/construccion-evaluacion-red-neuronal.tex index 7d200bd..1e7b2a4 100644 --- a/Memoria/capitulos/4-Actualizacion_redes_neuronales/construccion-evaluacion-red-neuronal.tex +++ b/Memoria/capitulos/4-Actualizacion_redes_neuronales/construccion-evaluacion-red-neuronal.tex @@ -8,12 +8,23 @@ \chapter{Construcción técnica de las redes neuronales de una sola capa} \label{chapter:construir-redes-neuronales} Vista la formulación teórica de una red neuronal de una sola capa -introducida en \ref{definition:redes_neuronales_una_capa_oculta} explicaremos a continuación una construcción técnica junto con un -análisis del costo necesario. - Particularmente el algoritmo presentado es una ligera modificación del algoritmo de -\textit{forward propagation} explicado en \cite{BishopPaterRecognition}, ha sido necesaria su modificación para ser totalmente fieles a nuestro enfoque teórico. +introducida en \ref{definition:redes_neuronales_una_capa_oculta} +se comparará y estudiará la relación teórica +entre nuestra propuesta de modelo y los modelos usuales de redes neuronales. + +Explicaremos también una construcción técnica junto con un +análisis del costo necesario y beneficio obtenido. +Así como los algoritmos necesarios para su evaluación y aprendizaje. + + Los algoritmos presentados son + la adaptación natural de técnicas como +\textit{forward propagation} y \textit{backpropagation } explicadas en \cite{BishopPaterRecognition} a nuestro enfoque teórico. + +Además, puesto que nuestro objetivo es optimizar seremos muy meticulosos en cuanto a analizar el +coste computacional tanto de cómputo como de +memoria. + -Además, puesto que nuestro objetivo es optimizar seremos muy meticulosos en cuanto a analizar el coste computacional tanto de cómputo como de memoria. \section{Componentes de una red neuronal de una capa oculta} @@ -196,6 +207,7 @@ \subsection{Consideraciones sobre la irrelevancia del sesgo} % Consideración sobre componer la red neuronal con una función \subsection{\textit{Modus operandi} ante problemas que requieran un dominio de salida discreto} +\label{ch05:dominio-discreto} Es usual en la literatura presentar las redes neuronales con la salida compuesta con una función $\theta$, de tal manera que una red neuronal sea de la forma @@ -278,11 +290,11 @@ \subsubsection*{Construcción de $k-$NN} \SetKwFunction{FSum}{$\theta$} \SetKwProg{Fn}{Function}{:}{} \Fn{\FSum{$h_x$}}{ - \STATE $distanciaMínima \gets\infty$ + \STATE \textit{distancia mínima} $\gets\infty$ \STATE $clase \leftarrow NADA$ \\ \STATE \COMMENT{Encontramos el más cercano}\\ \ForAll{cada $(h, y)$}{ - \If{$distancia(h,h_x) < distanciaMínima$}{ + \If{$distancia(h,h_x) <$\textit{distancia mínima}}{ $clase \leftarrow y$ } } @@ -292,8 +304,6 @@ \subsubsection*{Construcción de $k-$NN} \end{algorithmic} \end{algorithm} -\textcolor{red}{Falta revisar y repensar esta sección -aprovechar que es de dimensión para hacer triquiñuelas en la evaluación ordenando los valores jejejeje} %%%%%%%%%%% Fin de lo observado \subsection{Qué función de activación seleccionar} @@ -303,19 +313,38 @@ \subsection{Qué función de activación seleccionar} \begin{enumerate} \item Espacio de memoria. \item Coste computacional. - \item Precisión a obtener. + \item Efectividad en cuanto a reducir el error de aproximación. \end{enumerate} Sobre la primera consideración está claro que el uso de una única función ahorraría el tener que almacenar el tipo de función que se va emplear en cada neurona. -Respecto al coste computacional -\textcolor{red}{TODO: añadir coste computacional de las funciones que considere oportunas} +Respecto al coste computacional puede uno basarse en una análisis teórico del número de +operaciones y su complejidad o realizar un estudio empírico se ha realizado +en al sección \ref{ch06:coste-computacional-funciones-activacion}. -Y respecto a la precisión no se conoce ninguna motivación (por ahora) -que \textcolor{red}{TODO pensar} +% Nota margen sobre idea +\marginpar{\maginLetterSize + \iconoClave \textcolor{darkRed}{ + \textbf{ + Estrategia de selección de funciones de activación. + } + } -\textcolor{red}{TODO: Pudiera existir un equilibrio entre -el coste y la precisión. Es decir, a mismo número de neuronas se podría conseguir mejor precisión con ciertas funciones de activación -> esto seguro. ¿Cómo se podría saber esto a partir de los datos? ¿aumentaría ese proceso el coste?} + Esta idea abre la puerta a determinar mediante algoritmos + de optimización qué funciones de activación podrían resultar más + beneficiosas. + Ideas similares usando algoritmos genéticos + se encuentra en artículos como + \cite{FunctionOptimizationwithGeneticAlgorithms} + y + \cite{Genetic-deep-neural-networks} + sin embargo expondremos nuestra versión en el capítulo + \ref{ch08:genetic-selection}. + +} +Fijado cierto número de neuronas, en lo que respecta a la precisión que nos puedan aportar las funciones de activación; por la idea intuitiva +del funcionamiento de las funciones de activación mostrado en mostrada en \ref{ch03:funcionamiento-intuitivo-funcion-activacion} es un factor que repercute en los resultados +pero desconocido a priori. %% Formulación técnica diff --git a/Memoria/capitulos/4-Actualizacion_redes_neuronales/introduccion.tex b/Memoria/capitulos/4-Actualizacion_redes_neuronales/introduccion.tex index ee3b13a..246279b 100644 --- a/Memoria/capitulos/4-Actualizacion_redes_neuronales/introduccion.tex +++ b/Memoria/capitulos/4-Actualizacion_redes_neuronales/introduccion.tex @@ -17,6 +17,5 @@ \chapter{Explicitación del cálculo de una red neuronal} Explicaremos en este capítulo el método tradicional y ampliamente usado de \textit{backpropagation} \ref{algoritmo-de-backpropagation} y otros más novedosos como -\textcolor{red}{TODO : añadir otros métodos de actualización de pesos. La idea sería que -los buscados tengan un coste menor para así optimizar la velocidad de aprendizaje.} +% Este TODO debería de estar hecho en otro PR, lo elimino y ya lo mergearé diff --git a/Memoria/capitulos/4-Actualizacion_redes_neuronales/optimizaciones.tex b/Memoria/capitulos/4-Actualizacion_redes_neuronales/optimizaciones.tex deleted file mode 100644 index 783f283..0000000 --- a/Memoria/capitulos/4-Actualizacion_redes_neuronales/optimizaciones.tex +++ /dev/null @@ -1,201 +0,0 @@ -%%%%%%%%%%%%%%%%%%% -%% Optimización de la inicialización de los pesos de una red neuronal -%%%%%%%%%%%%%%%%%%%%%%%%% - -\section{ Inicialización de los pesos de una red neuronal} -\label{section:inicializar_pesos} -Como observábamos en la sección \ref{sec:gradiente-descendente}, el gradiente descendente pretende en cada -cada iteración mejorar la solución encontrada, pero es -totalmente sensible a la posición inicial -de los pesos. -Presentamos por tanto la siguiente propuesta para inicializar una red neuronal de modo que sus pesos se encuentre ya lo suficientemente cerca de la solución, -no solo servirá exclusivamente para el método de gradiente descendente -sino para cualquier otro dependiente del punto inicial. - -\subsection{ Estado del arte relacionado con esto} - -\textcolor{red}{TODO: Estado del arte. Buscar sobre backbones y otros -sistema y cómo influye el estado inicial. Argumentar con esto -que este algoritmo permitiría generar nuestro propio backbone} - -\subsection{Descripción del método propuesto} - -\begin{aportacionOriginal} % método de construción - -La idea proviene de la demostración casi constructiva del teorema \ref{teorema:2_5_entrenamiento_redes_neuronales}. - -Se desea inicializar los pesos de $h \in \rrnnsmn$, para la cual, una vez fijado el número $n$ de neuronas de nuestra red neuronal, será necesario determinar un subconjunto $\Lambda \mathcal{D}$ de datos de entrenamiento. - -La bondad del resultado depende en gran medida de $\Lambda$, -puesto que a priori se carece de hipótesis, se seleccionará -de manera aleatoria bajo supuesto de una distribución -independiente e idénticamente distribuida de los datos. - -Como apunta la demostración, debe de encontrarse un -$p \in \R^d$ satisfaciendo que $p \cdot (x_i-x_j) \neq 0$ para cualesquiera -atributos $x_i,x_j$ distintos de $\Lambda$. - -Es decir que se estaría considerando un vector que no -pertenezca a una unión finita de hiperplanos ortogonales de $\R^r$. -De manera teórica la probabilidad de seleccionar un $p$ y -que pertenezca al espacio ortogonal es $0$, sin embargo esto -no quiere decir que no pueda pasar. - -Tomaremos por tanto un $p$ aleatorio y a partir de él -seleccionaremos $\Lambda$ lo suficientemente grande para que - al menos $n$ vectores admitan de manera estricta la ordenación: - -\begin{equation}\label{eq:method_inicializar_condition_desigualdad} - p \cdot x_1 < - p \cdot x_2 - < \cdots < - p \cdot x_n. -\end{equation} -Para continuar, para la función de activación -seleccionada $\gamma$, por cómo se definen -existirá un $M \in \R^+$ tal que -\begin{equation} \label{eq:method_inicializar_M} - \gamma(K)=1 \text{ y } \gamma(-K)=0 - \text{ sean constantes para todo }K \geq M. -\end{equation} - -Una vez concretados los valores $p$, $\Lambda$ y $M$ que satisfagan las condiciones -(\refeq{eq:method_inicializar_condition_desigualdad}) -y (\refeq{eq:method_inicializar_M}) -falta concretar los valores iniciales de la red neuronal. - -Para ello debemos de calcular el valor de las matrices $(A,S,B)$ que definen a una red neuronal y que presentamos en la sección \ref{section:rrnn_implementation}. - -Recordemos que $A$ y $S$ tienen tantas filas como neuronas y $B$ tantas columnas como neuronas. - -Usado la notación vectorial -$p_{[i,j]} = (p_i, p_{i+1}, \ldots, p_{j})$ donde $(p_0, p_1, \ldots, p_d)=p$, comenzaremos definiendo el valor de la primera fila como - -\begin{align} - &S_1 = M p_0, \\ - & A_{1 *} = M p_{[1,d]}, \\ - & B_{* 1} = y_1. -\end{align} - -Los valores de la fila k-ésimas de las matrices $(A,S)$, vendrán determinados por la única función afín $A \in \afines$, -dada por $A_k(x)=B_k(p \cdot x)$, con $B_{k}$ como la única función afín de $\R$ en $\R$ que cumple que -\begin{equation} - B_k(p \cdot x_{k-1}) = -M - \quad \text{y} \quad - B_{k}(p \cdot x_k)= M. -\end{equation} - -Que esto equivale a calcular las constantes reales $\tilde {\alpha}$. - -Si tenemos presente que -\begin{equation} - \tilde{\alpha}_{k p} (p \cdot x_{k-1}) + \tilde{\alpha}_{k s} = -M - \quad \text{y} \quad - \tilde{\alpha}_{k p}(p \cdot x_k) + \tilde{\alpha}_{k s}= M. -\end{equation} -Resolviendo el sistema resulta que - -\begin{equation} - \left\{ - \begin{array}{l} - \tilde{\alpha}_{k p} = \frac{2 M}{p \cdot (x_k - x_{k-1})} - \\ - \tilde{\alpha}_{k s} - = M - \tilde{\alpha}_{k p}(p \cdot x_{k-1}) - = M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k-1}) - \end{array} - \right. -\end{equation} - -Luego los coeficientes de la red neuronal $A$, $S$ se deduciría de -\begin{equation} - \left\{ - \begin{array}{l} - \alpha_{k 0} = \tilde{\alpha}_{k s} = - M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k-1}) - \\ - \alpha_{k i} = \tilde{\alpha}_{k p} p_{i} - = - \frac{2 M}{p \cdot (x_k - x_{k-1})} - p_i - \end{array} - \right. -\end{equation} - -Esto define un sistema lineal compatible -cuya solución son las respectivas filas y columnas: - -\begin{equation} - \left\{ - \begin{array}{l} - S_{k} = M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k-1})\\ - A_{k i} = \frac{2 M}{p \cdot (x_k - x_{k-1})} - p_{i} - \\ - B_{* k} = y_k - y_{k-1} - \end{array} - \right. -\end{equation} - -Con todo esto el proceso algorítmico resultante es: - -\end{aportacionOriginal} % método de construción - -% Algoritmo de inicialización de pesos de una red neuronal - -\begin{algorithm}[H] - \caption{Inicialización de pesos de una red neuronal} - \textbf{Input:} Tamaño red neuronal $n$, conjunto de datos de entrenamiento $\mathcal{D}$, constate $M$ involucrada en \refeq{eq:method_inicializar_M}. - - \textbf{Input:} Red neuronal, representada con las matrices $(A,S,B)$. - \hspace*{\algorithmicindent} - \begin{algorithmic}[1] - %selección de p - \STATE \textit{Inicializamos $p$}. \\ - $p \gets$ vector de $\R^{d+1}$. - \COMMENT{Como heurística será generado con distribución uniforme en el intervalo $[0,1]$} - % Cálculo de Lambda - \STATE \textit{Selección datos inicialización - $\Lambda \subset \mathcal{D}$}. \\ - \begin{equation} - \Lambda \gets \{ \emptyset \} - \end{equation} - \While{tamaño de $\Lambda < n$}{ - Tomamos de manera aleatoria $(x,y)$ de $\mathcal{D}$. \\ - \If{para todo $(a,b) \in \Lambda$ se satisface que - $p \cdot (x-a)$}{ - \begin{equation} - \Lambda \gets \Lambda \cup \{(x,y)\}. - \end{equation} - \COMMENT{$\Lambda$ está ordenado conforme a la propiedad - \refeq{eq:method_inicializar_condition_desigualdad} - } - } - } - \STATE \textit{Cálculo de los parámetros base de la red neuronal.} \\ - - Para el primer $(x_1, y_1) \in \Lambda$ \\ - \begin{align} - &S_1 = M p_0, \\ - & A_{1 *} = M p_{[1,d]}, \\ - & B_{* 1} = y_1. - \end{align} - $\Lambda \gets \Lambda \setminus \{(x_1, y_1)\} $ \\ - \STATE \textit{Cálculo del resto de neuronas}. - \For{ cada $(x_k, y_k) \in \Lambda$}{ - \begin{align} - &S_{k} = M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k-1})\\ - & A_{k i} = \frac{2 M}{p \cdot (x_k - x_{k-1})} - p_{i} \quad i \in \{1, \ldots d\},\\ - & B_{* k} = y_k - y_{k-1}. - \end{align} - } - \STATE \textbf{return $(A,S,B)$}. - \end{algorithmic} -\end{algorithm} - -\textcolor{red}{TODO: Añadir coste computacional} - -\textcolor{red}{TODO: Hacer observaciones sobre que sería igual de válido cambiando la $M$ y $p$ ¿hay alguna selección mejor que otra? } - -\textcolor{red}{TODO: Hacer experimentaciones } \ No newline at end of file diff --git a/Memoria/capitulos/4-Actualizacion_redes_neuronales/otras-alternativas.tex b/Memoria/capitulos/4-Actualizacion_redes_neuronales/otras-alternativas.tex index b93c84f..7d0b368 100644 --- a/Memoria/capitulos/4-Actualizacion_redes_neuronales/otras-alternativas.tex +++ b/Memoria/capitulos/4-Actualizacion_redes_neuronales/otras-alternativas.tex @@ -2,7 +2,7 @@ %%% Alternativas al algoritmo de gradiente descendente %%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{Otras alternativas al alternativo de gradiente descendente} +\subsection{Otras alternativas al algoritmo de gradiente descendente} Recordemos que nuestro enfoque partía de fundamentar toda decisión de diseño de manera rigurosa. Destaquemos por tanto que en el algoritmo de gradiente descendente se introduce la restricción de que @@ -10,21 +10,24 @@ \subsection{Otras alternativas al alternativo de gradiente descendente} Esto, a priori, no es de extrañar, ya que si buscamos optimizar algún aspecto, en algún momento deberemos de particularizar o reenfocar algunos de los componentes del problema, sin embargo ¿exigir tales restricciones está sustentado teóricamente? -Desde un punto de vista analítico la forma por excelencia de minimizar radica en la derivación. Pudiéndose relajar el concepto de derivada a derivada débil o incluso trabajar en el ambiente de teoría de distribuciones, donde \textit{casi todo} se puede derivar \cite{teoriaDistribuciones}. +Desde un punto de vista analítico la forma por excelencia de minimizar radica en la derivación. Pudiéndose relajar el concepto de derivada a derivada +débil o incluso trabajar en el ambiente de teoría de distribuciones, donde \textit{casi todo} se puede +derivar \cite{teoriaDistribuciones}. La clave sería poder implementar los cálculos y obtener buenos resultados experimentales. -La cuestión reside entonces si existen otras alternativas al algoritmo de gradiente descendente podrían reducir el costo computacional del proceso de aprendizaje. +La cuestión reside entonces si existen otras alternativas al algoritmo de gradiente descendente +que podrían reducir el costo computacional del proceso de aprendizaje. Para ello se ha consultado el estado del arte actual encontrando publicaciones como: \subsubsection{\textit{Gradients without Backpropagations}} -A finales de este mismo años, se publicó el artículo \textit{Gradients without Backpropagations} \cite{forwardGradient}, en él se introduce el algoritmo al que acuñan como +A principios de este mismo año, se publicó el artículo \textit{Gradients without Backpropagations} \cite{forwardGradient}, en él se introduce el algoritmo al que acuñan como \textit{forward propagation} y al que posicionan los propios autores como una alternativa \textit{más eficiente en coste} que el algoritmo de \textit{Backpropagation}. Por desgracia, en este artículo no se da una demostración formal que verdaderamente explique el beneficio computacional, sino que se basan en meras experimentaciones. -Sin embargo, tiene su interés y es por ello que lo mencionamos, en indicar que existe margen de mejora +Sin embargo, tiene su interés y es por ello que lo mencionamos, en que indica que existe margen de mejora imponiendo como restricción el que las funciones de activación sean diferenciables. Esta tendencia se puede ver también en artículos como \cite{TransactionsOnNeuralNetworks}. diff --git a/Memoria/capitulos/5-Estudio_experimental/combinacion_funciones_activacion.tex b/Memoria/capitulos/5-Estudio_experimental/combinacion_funciones_activacion.tex new file mode 100644 index 0000000..505c37e --- /dev/null +++ b/Memoria/capitulos/5-Estudio_experimental/combinacion_funciones_activacion.tex @@ -0,0 +1,21 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Combinación de distintas funciones +% de activación +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newpage +\chapter{Selección genética de las funciones de activación } +\label{ch08:genetic-selection} + +%TODO: issue 90 +A modo de borrador de lo que tendrá este capítulo: +\begin{itemize} + \item Referencia a la idea intuitiva. + \item Comentario sobre complejidad. + + Más funciones de activación -> aumento espacio de búsqueda. + Si se usan bien -> disminuye número de neuronas + -> se converge más rápido con métodos. + \item Cómo introducir los algoritmos genéticos para desarrollar esta idea. + + El algoritmo genético selecciona qué funciones de activación se usan. Tras esto se entrena el algoritmo de de manera usual. +\end{itemize} \ No newline at end of file diff --git a/Memoria/capitulos/5-Estudio_experimental/funciones_activacion.tex b/Memoria/capitulos/5-Estudio_experimental/funciones_activacion.tex index 64ec42b..19ae66c 100644 --- a/Memoria/capitulos/5-Estudio_experimental/funciones_activacion.tex +++ b/Memoria/capitulos/5-Estudio_experimental/funciones_activacion.tex @@ -4,37 +4,59 @@ % 1. Comparativas en cuanto a coste computacional. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Funciones de activación} +\chapter{Democratización de las funciones de activación} +\label{funciones-activacion-democraticas-mas-demoscraticas} +A lo largo de este capítulo se esclarecerá la idea +que se planteó en \ref{def:funcion_activacion_articulo} +de si +hay alguna función de activación mejor que otra. +Para ello +se han aportado dos nuevos resultados originales: +el teorema \ref{teo:eficacia-funciones-activation} +y el corolario \ref{corolario:afine-activation-function}. +Gracias a ellos se puede establecer cuándo +dos espacios de redes neuronales con funciones de activación distintas pueden aproximar +con la misma precisión una función. Cabe mencionar +que estos resultados son además independientes del modelo de red neuronal seleccionado gracias a los resultados teóricos descubiertos en \ref{consideration-irrelevancia-sesgo} y \ref{ch05:dominio-discreto}. + +El teorema \ref{teo:eficacia-funciones-activation} +y el corolario \ref{corolario:afine-activation-function} tienen su importancia ya que +si sabemos que dos funciones de activación producen +los mismos resultados (\textit{o muy similares}), +conociendo su coste computacional podremos seleccionar +el que sea menor y de esta manera optimizar el tiempo +de cálculo y disminuir el número de operaciones sin +perder precisión en los resultados. + +Es por ello que +tras establecer las clases de funciones que producen +resultados similares, en la sección \ref{ch06:coste-computacional-funciones-activacion} +se ha formulado un test para +determinar las funciones de menor costo. + + -Como se observó en -% TODO referencia a que no hay idoneidad a nivel teórico -% sobre una función de -se desconoce teóricamente si una función de activación va a ser -mejor que otra, es por ello y puesto que nuestro objetivo -es reducir el coste computacional de una red neuronal -que procederemos a realizar un análisis del costo de las redes neuronales. \section{Caracterización de las funciones de activación} -Si bien por conveniencia teórica definimos las funciones de activación en \ref{def:funcion_activacion_articulo} +Por conveniencia teórica definimos las funciones de activación en \ref{def:funcion_activacion_articulo} como una función de $\phi:\R \longrightarrow [0,1]$, no decreciente, con uno como límite en infinito y cero como límite a -menos infinito. - -Nos basaremos en el concepto actual de función de activación, +menos infinito; nos basaremos en el concepto \textit{actual} de función de activación: basta con que sea una función no polinómica -(véanse los artículos \cite{DBLP:journals/corr/SonodaM15}, \cite{modern-trainable-activation-functions} y \cite{FUNAHASHI1989183}), -además también incluiremos la función de activación identidad. +(véanse los artículos \cite{DBLP:journals/corr/SonodaM15}, \cite{modern-trainable-activation-functions} y \cite{FUNAHASHI1989183}). Funciones no polinómicas hay infinitas y reincidimos en que a priori no hay una mejor que otra; por tanto, como criterio de selección nos guiaremos por la intuición que nos brinda la demostración del teorema \ref{teorema:2_3_uniformemente_denso_compactos}. La imagen de una función de activación es relevante a la hora de aproximar la función ideal desconocida, ya que reduce el número de neuronas si se usa convenientemente. -Por lo tanto, una buena heurística sería disponer de un repertorio básico de funciones de activación que contemplen distintas imágenes no polinómicas. +Por lo tanto, una buena heurística sería disponer de un repertorio básico de funciones de activación que contemplen distintas imágenes no polinómicas. + Además de las propuestas en \ref{def:funcion_activacion_articulo}, -añadimos a nuestra colección las siguientes. +añadimos a nuestra colección las que mostramos en la tabla \ref{table:funciones-de-activation}. El criterio de selección ha sido contar con funciones de activación de formas diversas y que además sean las utilizadas de acorde (motivados por \ref{ch03:funcionamiento-intuitivo-funcion-activacion}) +\pagebreak \begin{table}[H] \centering @@ -45,17 +67,17 @@ \section{Caracterización de las funciones de activación} \hline %%%%%%%% Identidad %%%%%%% % Nombre: - Identidad - & %expresión - $Id(x) = x$ - & % Rango imagen - $(-\infty, +\infty)$ - & % Gráfica - \begin{minipage}{\coeficienteAncho\textwidth} - \includegraphics[width=\linewidth]{funciones-activacion/Identidad.png} - \end{minipage} - \\ - \hline + %Identidad + %& %expresión + %$Id(x) = x$ + %& % Rango imagen + %$(-\infty, +\infty)$ + %& % Gráfica + %\begin{minipage}{\coeficienteAncho\textwidth} + % \includegraphics[width=\linewidth]{funciones-activacion/Identidad.png} + %\end{minipage} + %\\ + %\hline %%%%%%%% Indicadora %%%%%%% % Nombre: Indicadora $\lambda \in \R$ @@ -73,7 +95,7 @@ \section{Caracterización de las funciones de activación} % Nombre: Función umbral $p$ polinomio & %expresión - $Threshold(x) = 1_{\{p(x) > 0\}}$ + $Umbral(x) = 1_{\{p(x) > 0\}}$ & % Rango imagen $\{0,1\}$ & % Gráfica @@ -223,20 +245,80 @@ \section{Caracterización de las funciones de activación} \label{table:funciones-de-activation} \end{table} +% comentario margen +% Qué hace la función afín definida +% y relevancia teorema +\setlength{\marginparwidth}{\bigMarginSize} +\marginpar{\maginLetterSize + \iconoAclaraciones \textcolor{dark_green}{ + \textbf{ + Qué hace la función $\phi$ + } + } + + Tal función significa aplicar traslaciones, + simetrías, reescalados o composiciones de estos + movimientos a la imagen de la función afín. + + \iconoClave \textcolor{darkRed}{ + \textbf{ + Utilidad práctica del teorema + } + } + + Gracias a este resultado sabremos + cuándo dos funciones de activación + producirán exactamente los mismos resultados. + Por lo tanto podremos seleccionar + la más oportuna, por ejemplo + la que tenga menos coste. +} + + \begin{aportacionOriginal} \begin{teorema}\label{teo:eficacia-funciones-activation} - Sea $\phi \in \mathcal{A}(\R^2)$ una transformación afín, sean dos funciones de activación $\sigma, \gamma$ tales que + \label{teo:equivalencia-grafos-activation-function} + Sea $\phi \in \mathcal{A}(\R^2)$ una función afín + cuya forma matricial asociada es de la forma: + \begin{equation} + \phi((x,y)) = + \begin{bmatrix} + a & 0 \\ + 0& b + \end{bmatrix} + \begin{bmatrix} + x \\ + y + \end{bmatrix} + + + \begin{bmatrix} + t_x & t_y + \end{bmatrix} + \end{equation} + con $a,b \in \R^*$ y $t_x, t_y \in \R$. + + Sean dos funciones de activación $\sigma, \gamma$ tales que \begin{equation*} - \phi \circ \sigma = \gamma, + \phi(Grafo(\sigma)) = Grafo(\gamma), \end{equation*} - entonces para + entonces el espacio de redes neuronales de $n$ neuronas creado con la función de activación $\sigma$ es igual al espacio de redes neuronales creado con la función de activación $\gamma$. \end{teorema} \begin{proof} - - Sea $\mathcal{H}^+_{\sigma, n}(\R^d, \R^s)$, el espacio de redes neuronales con $n$ neuronas con sesgo. + % Primero lo demostramos con sesgo + Sea $\mathcal{H}^+_{\sigma, n}(\R^d, \R^s)$ el espacio de redes neuronales con $n$ neuronas con sesgo. + + Está claro que + $\mathcal{H}^+_{\gamma, n}(\R^d, \R^s)$ + y + $\mathcal{H}^+_{\sigma, n}(\R^d, \R^s)$ + son biyectivos. + + Ya que basta con tomar una red neuronal de una y cambiarle la función de activación por la de la otra. + Veamos + que se da la igualdad viendo que una está contenida en la otra. Para cualquier $h \in \mathcal{H}^+_{\sigma, n}(\R^d, \R^s)$ la proyección i-ésima de $h$ será de la forma @@ -245,28 +327,79 @@ \section{Caracterización de las funciones de activación} h_i(x) = \sum^n_{j=1}(\beta_{j} \sigma(A_j(x))+ k_j), \end{equation*} con $x \in \R^d, \beta_{j}, k_j \in \R, A_j \in \afines$. - - Procedemos a definir $\tilde{h}_i(x)$ como sigue y - se tiene que - \begin{equation*} + % Se define la h tilda: + Procedemos a definir $\tilde{h}_i(x)$ como sigue + \begin{align}\label{eq:h-tilda-definition} \tilde{h}_i(x) - = \sum^n_{j=1}(\beta_{j} \phi(\sigma(A_j(x)))+ k_j) + = \sum^n_{j=1}(\beta_{j} (b \sigma( a A_j(x) + t_x) + t_y)+ k_j) = \sum^n_{j=1}(\tilde{\beta}_{j} \sigma(\tilde{A}_j(x))+ \tilde{k_j}), - \end{equation*} + \end{align} con $x \in \R^d, \tilde \beta_{j}, \tilde k_j \in \R, \tilde{A}_j \in \afines$, - por lo que está claro que $\tilde{h}_i(x) \in \mathcal{H}^+_{\sigma, n}(\R^d, \R^s)$. - - Pero por hipótesis del teorema $\phi \circ \sigma = \gamma$, por lo que $\tilde{h}_i(x) \in \mathcal{H}^+_{\gamma, n}(\R^d, \R^s)$. - - Basta con considerar la transformación afín inversa para ver que ambos espacios son isomorfos + por lo que está claro que $\tilde{h}(x) \in \mathcal{H}^+_{\sigma, n}(\R^d, \R^s)$. + + Observemos que la + hipótesis del enunciado + establece que + \begin{align} + Grafo(\gamma) &= \{ (x, \gamma(x)) \colon x \in \R \} + \\ + & = + Grafo(\gamma) = \phi(Grafo(\sigma)) + \\ + & = + \phi( \{ (x, \sigma(x)) \colon x \in \R \}) + \\ + &= + \{ (a x + t_x, b \sigma(x) + t_y) \colon x \in \R \}. + \end{align} + Por lo que $\tilde{h}$ así definida (\refeq{eq:h-tilda-definition}) + es a su vez + \begin{align} + \tilde{h}_i(x) + = \sum^n_{j=1}(\beta_{j} \gamma A_j(x)+ k_j) + \end{align} + es decir que $\tilde{h}(x) \in \mathcal{H}^+_{\gamma, n}(\R^d, \R^s)$. + Así que vía $\phi$ se ha definido una inyección + de $\mathcal{H}^+_{\sigma, n}(\R^d, \R^s)$ a + $\mathcal{H}^+_{\gamma, n}(\R^d, \R^s)$, + esto es + \begin{equation} + \mathcal{H}^+_{\sigma, n}(\R^d, \R^s) + \subseteq + \mathcal{H}^+_{\gamma, n}(\R^d, \R^s). + \end{equation} + + Además, $\phi$ con las hipótesis exigidas es + invertible, con inversa: + \begin{equation} + \phi^{-1}((x,y)) = + \begin{bmatrix} + \frac{1}{a} & 0 \\ + 0& \frac{1}{b} + \end{bmatrix} + \begin{bmatrix} + x \\ + y + \end{bmatrix} + + + \begin{bmatrix} + - \frac{t_x}{a} & - \frac{t_y}{b} + \end{bmatrix}. + \end{equation} + Así que razonando de igual manera que en el + apartado anterior se tiene la inclusión + \begin{equation} + \mathcal{H}^+_{\sigma, n}(\R^d, \R^s) + \supseteq + \mathcal{H}^+_{\gamma, n}(\R^d, \R^s), + \end{equation} + por lo que podemos concluir que \begin{equation*} - \mathcal{H}^+_{\gamma, n}(\R^d, \R^s) \simeq \mathcal{H}^+_{\sigma, n}(\R^d, \R^s). + \mathcal{H}^+_{\gamma, n}(\R^d, \R^s) + = + \mathcal{H}^+_{\sigma, n}(\R^d, \R^s). \end{equation*} - - Dos conjuntos isomorfos donde para cualquier $h \in \mathcal{H}^+_{\gamma, n}(\R^d, \R^s)$, - se tiene que $h \in \mathcal{H}^+_{\sigma, n}(\R^d, \R^s)$ via el isomorfismo y - luego componer con la inversa de la aplicación afín. - + Como demostramos en \ref{consideration-irrelevancia-sesgo} se tiene que \begin{equation*} \mathcal{H}^+_{\sigma, n}(\R^d, \R^s) = \mathcal{H}^+_{\gamma, n}(\R^d, \R^s) @@ -283,13 +416,15 @@ \section{Caracterización de las funciones de activación} \end{proof} \end{aportacionOriginal} -\subsubsection*{Relevancia práctica del teorema} + + +\subsubsection*{\iconoClave \textcolor{darkRed}{Relevancia práctica del teorema}} Este teorema lo que nos está diciendo es que si dos funciones de activación tienen \textit{la misma forma} (independientemente de su grafo) entonces \textbf{aproximarán igual de bien}, es decir, con el mismo error dentro de un conjunto de datos. Esto a nivel práctico significa que \textbf{si se tienen dos funciones de activación - \textit{con la misma forma} (o muy parecidas) elige + \textit{con la misma forma} (\textit{o muy parecida}) elige la que tenga menor costo computacional}, porque a nivel teórico aproximarán igual de bien y de esta manera ahorraremos recursos. @@ -300,12 +435,81 @@ \subsubsection*{Relevancia práctica del teorema} significa que sea resultado de una serie de aproximaciones). +% Relevancia corolario +\marginpar{\maginLetterSize + \iconoAclaraciones \textcolor{dark_green}{ + \textbf{ + Relevancia corolario + \ref{corolario:afine-activation-function} + } + } + Simplifica las comparativas entre funciones + de activación + sin necesidad de conocer su imagen. +} +%corolario para cuando sean afines +\begin{corolario}\label{corolario:afine-activation-function} + Sea $\phi \in \mathcal{A}(\R)$ una transformación afín e invertible, esto es de la forma + \begin{equation} + \phi(x) = a x + b + \text{ con } a \in \R^*, b \in \R. + \end{equation} + Dadas dos funciones de activación $\sigma$ y $\gamma$ que satisfagan que + \begin{equation} + \phi \circ \sigma = \gamma, + \end{equation} + entonces + el espacio de redes neuronales de $n$ neuronas creado con la función de activación $\sigma$ es + igual al espacio de redes neuronales creado con la función de activación $\gamma$. +\end{corolario} +\begin{proof} + En base a que $\phi(x) = a x + b$, con + $a \in \R^*, b \in \R$ + basta con definir + $\psi \in \mathcal{A}(\R^2)$ como + \begin{equation} + \psi((x,y)) = + \begin{bmatrix} + 1 & 0 \\ + 0& a + \end{bmatrix} + \begin{bmatrix} + x \\ + y + \end{bmatrix} + + + \begin{bmatrix} + 0 & b + \end{bmatrix}. + \end{equation} + A partir definición se tiene que + \begin{align} + Grafo(\gamma) &= + \{ (x, \gamma(x)) \colon x \in \R\} + \\ + & = + \{ (x, \phi(\sigma(x))) \colon x \in \R\} + \\ + & = + \psi(\{ (x, \sigma(x)) \colon x \in \R\}) + = + \psi(Grafo(\sigma)). + \end{align} + Se satisfacen + las hipótesis del teorema \ref{teo:equivalencia-grafos-activation-function} y en virtud de él se tiene el resultado buscado. +\end{proof} + +\section{ Selección de las mejores funciones de activación} +Así pues, a la vista de la imágenes de las distintas funciones de activación +recogidas en la tabla \ref{table:funciones-de-activation}, y +por el recién probado teorema \ref{teo:eficacia-funciones-activation}, podemos determinar a priori +que de manera teórica existen conjuntos de funciones que aproximadamente pueden producir los mismos resultados. -Así pues a la vista de la imágenes de las distintas funciones de activación -recogidas en la tabla \ref{table:funciones-de-activation} y -por el recién probado teorema \ref{teo:eficacia-funciones-activation} podemos determinar a priori -que de manera teórica existen conjuntos de funciones que aproximadamente puedes producir los mismos resultado, -compararemos entonces su coste computacional y tomaremos como representante de la clase aquel que sea de menor coste. +A la vista de del resultado, si las funciones de +activación son similares entonces actuarán con +una precisión similar, es por ello +que el la table \ref{table:Clases-equivalencia-activation-function} establecemos +las siguientes clases de funciones de activación \begin{table}[H] \centering @@ -324,10 +528,11 @@ \subsubsection*{Relevancia práctica del teorema} \label{table:Clases-equivalencia-activation-function} \end{table} -\textcolor{red}{TODO: Comentar cómo afecta el escalado al error}. Razonarlo con la integral. +Compararemos entonces su coste computacional y tomaremos como representante de la clase aquel que sea de menor coste. -\subsection{ Implementación de las funciones de activación en la biblioteca de redes neuronales} +\subsection{ Implementación de las funciones de activación en la biblioteca de redes neuronales} +\label{ch06:activation-function-implementation} Las funciones de activación han sido implementadas con cuidado de que sean eficientes y valiéndose de las características propias de Julia, para ello se han utilizado técnicas como: @@ -363,7 +568,7 @@ \subsection{ Implementación de las funciones de activación en la biblioteca de % Programación modular \item \textbf{Programación modular}: Tal y como se recomienda en la documentación de Julia \footnote{ Consultada en la página web oficial de Julia a día 23 de mayo del 2022 con URL: \url{https://docs.julialang.org/en/v1/manual/modules/} - } se ha utilizado una módulo en la implementación de la biblioteca, esto aporta los siguientes beneficios: + } se ha utilizado un módulo en la implementación de la biblioteca, esto aporta los siguientes beneficios: \begin{itemize} \item Los módulos pueden ser precompilados y de esta manera se aceleraría la carga y el tiempo de inicialización. \item Encapsulamiento de los métodos y facilidades de uso del espacio de nombres, lo cual forma parte @@ -537,13 +742,15 @@ \subsubsection*{Sobre el sistema de tipos de Julia} \subsection{Coste computacional funciones activación } +\label{ch06:coste-computacional-funciones-activacion} \subsubsection{Diseño del experimento} -El experimento para comparar los resultados ha consistido: -Se ha evaluado cada función a comparar $20000000$ veces y se ha medido cuanto tarda. +El experimento para comparar los resultados ha consistido en: +Se ha evaluado cada función a comparar $20.000.000$ veces y se ha medido cuanto tarda. Esto se ha repetido $15$ veces. Puede encontrar la implementación concreta y los resultados concretos de cada iteración en el repositorio del proyecto \footnote{En el directorio de experimentos de \url{https://github.com/BlancaCC/TFG-Estudio-de-las-redes-neuronales}.}. +Además, puesto que las funciones más simples que se pueden construir son la identidad y la constante, las hemos añadido para poder comparar el costo. \subsubsection{Test de hipótesis} @@ -557,18 +764,18 @@ \subsubsection{Test de hipótesis} La motivación de realizar esta prueba es la siguiente: \begin{itemize} \item Las muestras son independientes. - \item Los datos tomados, el tiempo, permiten ser ordenados. + \item Los datos tomados permiten ser ordenados. \item El tamaño de muestra es pequeño y no podemos asegurar normalidad de la datos. \end{itemize} \subsubsection*{Hipótesis} \begin{itemize} - \item $H_0$: La mediana de las diferencia de cada par de datos es $0$. - \item $H_a$: La mediana de las diferencia entre cada par de datos es diferente de cero. + \item $H_0$: La mediana de las diferencias de cada par de datos es $0$. + \item $H_a$: La mediana de las diferencias entre cada par de datos es diferente de cero. \end{itemize} -La utilidad de este test es que si rechaza la hipótesis la hipótesis nula sabremos que con un $95 \%$ de certeza tendrán medianas diferentes, es decir, \textbf{existe una +La utilidad de este test es que si rechaza la hipótesis nula sabremos que con un $95 \%$ de certeza tendrán medianas diferentes, es decir, \textbf{existe una diferencia de tiempos}. En caso de que no se rechace no podremos afirmar nada. Puede encontrar la implementación en el repositorio del proyecto \footnote{En el directorio de experimentos @@ -580,10 +787,10 @@ \subsubsection*{Hipótesis} \resizebox{\textwidth}{!}{ \begin{tabular}{|l|l|l|l|l|l|} \hline - ~ & cte 1 & Identidad & Threshold de $2x$ & CosineSquasher & Indicadora de 0 \\ \hline + ~ & cte 1 & Identidad & Umbral de $2x$ & CosineSquasher & Indicadora de 0 \\ \hline cte 1 & - &\textbf{No rechaza $H_0$} & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline Identidad & \textbf{No rechaza $H_0$} & - & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline - Threshold de $2x$ & Rechaza $H_0$ & Rechaza $H_0$ & - & Rechaza $H_0$ & \textbf{No rechaza $H_0$} \\ \hline + Umbral de $2x$ & Rechaza $H_0$ & Rechaza $H_0$ & - & Rechaza $H_0$ & \textbf{No rechaza $H_0$} \\ \hline CosineSquasher & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ & - & Rechaza $H_0$ \\ \hline Indicadora de 0 & Rechaza $H_0$ & Rechaza $H_0$ & \textbf{No rechaza $H_0$} & Rechaza $H_0$ & - \\ \hline Rampa & Rechaza $H_0$ & Rechaza $H_0$ & \textbf{No rechaza $H_0$} & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline @@ -607,7 +814,7 @@ \subsubsection*{Hipótesis} ~ & Rampa & ReLU & Sigmoidea& Tangente hiperbólica \\ \hline cte 1 & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline Identidad & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline - Threshold de $2x$ & \textbf{No rechaza $H_0$} & \textbf{No rechaza $H_0$} & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline + Umbral de $2x$ & \textbf{No rechaza $H_0$} & \textbf{No rechaza $H_0$} & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline CosineSquasher & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline Indicadora de 0 & Rechaza $H_0$ & \textbf{No rechaza $H_0$} & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline Rampa & - & \textbf{No rechaza $H_0$} & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline @@ -631,7 +838,7 @@ \subsubsection*{Hipótesis} ~ & Valor absoluto & Coseno & Hardtanh & LReLU \\ \hline cte 1 & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline Identidad & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$& Rechaza $H_0$ \\ \hline - Threshold de $2x$ & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ & \textbf{No rechaza $H_0$} \\ \hline + Umbral de $2x$ & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ & \textbf{No rechaza $H_0$} \\ \hline CosineSquasher & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ \\ \hline Indicadora de 0 & Rechaza $H_0$ & Rechaza $H_0$ & Rechaza $H_0$ & \textbf{No rechaza $H_0$} \\ \hline Rampa & Rechaza $H_0$& Rechaza $H_0$ & Rechaza $H_0$ & \textbf{No rechaza $H_0$} \\ \hline @@ -649,34 +856,43 @@ \subsubsection*{Hipótesis} \end{table} Como ya comentábamos, si la hipótesis nula es rechazada podemos suponer que hay una diferencia -de tiempo significativas; en caso contrario no podemos saber nada. +de tiempo significativa; en caso contrario no podemos saber nada. -Sin embargo podemos entender estos rechazos como una clase de equivalencia; es decir, la diferencia en coste computacional no es tan significativa, dentro de ese grupo. De hecho, como podemos apreciar en la tabla \ref{Tiempos-ejecucion-comparativas}, que está ordenada de menor tiempo a mayor, - estos se encuentra en posiciones consecutivas. +Sin embargo, podemos entender estos rechazos como una clase de equivalencia; es decir, la diferencia en coste computacional no es tan significativa, dentro de ese grupo. De hecho, como podemos apreciar en la tabla \ref{Tiempos-ejecucion-comparativas}, que está ordenada de menor tiempo a mayor, + estos se encuentran en posiciones consecutivas y en los mismos rango de tiempos de la respectiva + gráfica de caja y bigote figura \ref{img:boxplot-whiskers-activation-function}. \begin{table}[H] \centering - \begin{tabular}{|l|l|l|l|} + \resizebox{0.8\textwidth}{!}{ + \begin{tabular}{|l|c |c|} \hline - Función & Mediana & Media Tiempo & Desviación típica \\ \hline - cte 1 (para comparar) & 1475,959 & 1473,478 & 26,332 \\ \hline - Identidad (para comparar) & 1479,817 & 1467,311 & 27,021 \\ \hline - Hardtanh & 1495,105 & 1491,046 & 21,334 \\ \hline - CosineSquasher & 1522,128 & 1521,117 & 19,223 \\ \hline - ReLU & 1546,379 & 1552,049 & 21,435 \\ \hline - Indicadora de 0 & 1554,432 & 1556,114 & 21,814 \\ \hline - Rampa & 1557,449 & 1552,169 & 25,043 \\ \hline - Threshold de $2x$ & 1562,809 & 1556,669 & 23,029 \\ \hline - LReLU & 1564,124 & 1561,367 & 21,722 \\ \hline - Valor absoluto & 1583,266 & 1580,545 & 23,464 \\ \hline - Sigmoidea& 1608,797 & 1601,079 & 21,938 \\ \hline - Coseno & 1630,392 & 1629,634 & 26,113 \\ \hline - Tangente hiperbólica & 1664,006 & 1653,295 & 23,025 \\ \hline + Función & Mediana & Media tiempo \\ \hline + cte 1 (para comparar) & 1475,959 & 1473,478 $\pm$ 26,332 \\ \hline + Identidad (para comparar) & 1479,817 & 1467,311 $\pm$ 27,021 \\ \hline + Hardtanh & 1495,105 & 1491,046 $\pm$ 21,334 \\ \hline + CosineSquasher & 1522,128 & 1521,117 $\pm$ 19,223 \\ \hline + ReLU & 1546,379 & 1552,049 $\pm$ 21,435 \\ \hline + Indicadora de 0 & 1554,432 & 1556,114 $\pm$ 21,814 \\ \hline + Rampa & 1557,449 & 1552,169 $\pm$ 25,043 \\ \hline + Umbral de $2x$ & 1562,809 & 1556,669 $\pm$ 23,029 \\ \hline + LReLU & 1564,124 & 1561,367 $\pm$ 21,722 \\ \hline + Valor absoluto & 1583,266 & 1580,545 $\pm$ 23,464 \\ \hline + Sigmoid & 1608,797 & 1601,079 $\pm$ 21,938 \\ \hline + Coseno & 1630,392 & 1629,634 $\pm$ 26,113 \\ \hline + Tangente hiperbólica & 1664,006 & 1653,295 $\pm$ 23,025 \\ \hline \end{tabular} + } \caption{Tiempo de ejecución en segundos} \label{Tiempos-ejecucion-comparativas} \end{table} +\begin{figure}[H] + \centering + \includegraphics[width=\textwidth]{5-estudio-experimental/activation-function/boxplot-whiskers-activation-function.png} + \caption{Gráfico de cajas y bigotes con los tiempo de las respectivas funciones} + \label{img:boxplot-whiskers-activation-function} +\end{figure} Si volvemos a nuestro objetivo, que era encontrar el representante de menor costo entre las agrupaciones dispuestas en la tabla \ref{table:Clases-equivalencia-activation-function}. Concluimos que los mejores candidatos son: diff --git a/Memoria/capitulos/5-Estudio_experimental/inicializacion-pesos.tex b/Memoria/capitulos/5-Estudio_experimental/inicializacion-pesos.tex new file mode 100644 index 0000000..19601e4 --- /dev/null +++ b/Memoria/capitulos/5-Estudio_experimental/inicializacion-pesos.tex @@ -0,0 +1,294 @@ +%%%%%%%%%%%%%%%%%%% +%% Optimización de la inicialización de los pesos de una red neuronal +%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{ Mejora en la inicialización de los pesos de una red neuronal} +\label{section:inicializar_pesos} +Como observábamos en la sección \ref{sec:gradiente-descendente}, el gradiente descendente pretende en cada +iteración mejorar la solución encontrada, pero es +totalmente sensible a la posición inicial +de los pesos. +Presentamos por tanto la siguiente propuesta para inicializar una red neuronal con el objetivo de que sus pesos se encuentren ya cerca de la solución. Destaquemos que este algoritmo +no solo servirá exclusivamente para el método de gradiente descendente +sino para cualquier otro dependiente del punto inicial. + +\section{ Estado del arte relacionado } + +% Nota informativa de lo que es un backbone +\setlength{\marginparwidth}{\bigMarginSize} +\marginpar{\maginLetterSize + \iconoAclaraciones \textcolor{dark_green}{ + \textbf{ + Qué es un \textit{backbone} + } + } + + Se denomina \textit{backbone} a los nodos de una red neuronal que han sido \textbf{inicializados con valores + de otras redes neuronales ya entrenadas}. Por ejemplo si quisiéramos clasificar insectos y partiéramos de una red neuronal que se entrenó para clasificar frutas. + +} + +Se ha comprobado en la práctica que el uso de +\textit{backbones} reporta mejoras sustanciales en el +entrenamiento de redes neuronales, véanse artículos como \cite{backbone-object-detection}, \cite{backbone-Architecture} y sus referencias. + +Cuando se carece de \textit{backbones} o no es posible utilizarlos, una buena técnica para dar un valor inicial a los pesos consiste en basarse en metaheurísticas tales como algoritmos genéticos, +ver \cite{Montana2002NeuralNW}, sin embargo, éstos +tienen un coste computacional importante. + +Ante esta situación, nuestro algoritmo propone una inicialización de bajo coste computacional y que no necesita de más valores que los del conjunto de entrenamiento. + + + +\section{Descripción del método propuesto} + +\begin{aportacionOriginal} % método de construción + +La idea proviene de la demostración casi constructiva del teorema \ref{teorema:2_5_entrenamiento_redes_neuronales}. + +Se desea inicializar los pesos de $h \in \rrnnsmn$, para la cual, una vez fijado el número $n$ de neuronas de nuestra red neuronal, será necesario determinar un subconjunto $\Lambda \mathcal{D}$ de datos de entrenamiento. + +La bondad del resultado depende en gran medida de $\Lambda$, +puesto que a priori se carece de hipótesis, se seleccionará +de manera aleatoria bajo el supuesto de una distribución +independiente e idénticamente distribuida de los datos. + +Como apunta la demostración, debe encontrarse un +$p \in \R^d$ satisfaciendo que $p \cdot (x_i-x_j) \neq 0$ para cualesquiera +atributos $x_i,x_j$ distintos de $\Lambda$. + +Es decir que se estaría considerando un vector que no +pertenezca a una unión finita de hiperplanos ortogonales de $\R^r$. +De manera teórica la probabilidad de seleccionar un $p$ y +que pertenezca al espacio ortogonal es $0$, sin embargo esto +no quiere decir que no pueda pasar. + +Tomaremos por tanto un $p$ aleatorio y a partir de él +seleccionaremos $\Lambda$ lo suficientemente grande para que + al menos $n$ vectores admitan de manera estricta la ordenación: + +\begin{equation}\label{eq:method_inicializar_condition_desigualdad} + p \cdot x_1 < + p \cdot x_2 + < \cdots < + p \cdot x_n. +\end{equation} +Para continuar, para la función de activación +seleccionada $\gamma$, por cómo se definen +existirá un $M \in \R^+$ tal que +\begin{equation} \label{eq:method_inicializar_M} + \gamma(K)=1 \text{ y } \gamma(-K)=0 + \text{ sean constantes para todo }K \geq M. +\end{equation} + +Una vez concretados los valores $p$, $\Lambda$ y $M$ que satisfagan las condiciones +(\refeq{eq:method_inicializar_condition_desigualdad}) +y (\refeq{eq:method_inicializar_M}) +falta concretar los valores iniciales de la red neuronal. + +Para ello debemos calcular el valor de las matrices $(A,S,B)$ que definen a una red neuronal y que presentamos en la sección \ref{section:rrnn_implementation}. + +Recordemos que $A$ y $S$ tienen tantas filas como neuronas y $B$ tantas columnas como neuronas. + +Usado la notación vectorial +$p_{[i,j]} = (p_i, p_{i+1}, \ldots, p_{j})$ donde $(p_0, p_1, \ldots, p_d)=p$, comenzaremos definiendo el valor de la primera fila como + +\begin{align} + &S_1 = M p_0, \\ + & A_{1 *} = M p_{[1,d]}, \\ + & B_{* 1} = y_1. +\end{align} + +Los valores de la fila k-ésima de las matrices $(A,S)$, vendrán determinados por la única función afín $A \in \afines$, +dada por $A_k(x)=B_k(p \cdot x)$, con $B_{k}$ como la única función afín de $\R$ en $\R$ que cumple que +\begin{equation} + B_k(p \cdot x_{k-1}) = -M + \quad \text{y} \quad + B_{k}(p \cdot x_k)= M. +\end{equation} + +Esto equivale a calcular las constantes reales $\tilde {\alpha}$. + +Si tenemos presente que +\begin{equation} + \tilde{\alpha}_{k p} (p \cdot x_{k-1}) + \tilde{\alpha}_{k s} = -M + \quad \text{y} \quad + \tilde{\alpha}_{k p}(p \cdot x_k) + \tilde{\alpha}_{k s}= M. +\end{equation} +Resolviendo el sistema resulta que + +\begin{equation} + \left\{ + \begin{array}{l} + \tilde{\alpha}_{k p} = \frac{2 M}{p \cdot (x_k - x_{k-1})} + \\ + \tilde{\alpha}_{k s} + = M - \tilde{\alpha}_{k p}(p \cdot x_{k-1}) + = M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k-1}) + \end{array} + \right. +\end{equation} + +Luego los coeficientes de la red neuronal $A$, $S$ se deducirían de +\begin{equation} + \left\{ + \begin{array}{l} + \alpha_{k 0} = \tilde{\alpha}_{k s} = + M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k-1}) + \\ + \alpha_{k i} = \tilde{\alpha}_{k p} p_{i} + = + \frac{2 M}{p \cdot (x_k - x_{k-1})} + p_i + \end{array} + \right. +\end{equation} + +Esto define un sistema lineal compatible +cuya solución son las respectivas filas y columnas: + +\begin{equation} + \left\{ + \begin{array}{l} + S_{k} = M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k-1})\\ + A_{k i} = \frac{2 M}{p \cdot (x_k - x_{k-1})} + p_{i} + \\ + B_{* k} = y_k - y_{k-1} + \end{array} + \right. +\end{equation} + +Con todo esto el proceso algorítmico resultante es: + +\end{aportacionOriginal} % método de construcción + +% Algoritmo de inicialización de pesos de una red neuronal + +\begin{algorithm}[H] + \caption{Inicialización de pesos de una red neuronal} + \textbf{Input:} Tamaño red neuronal $n$, conjunto de datos de entrenamiento $\mathcal{D}$, constate $M$ involucrada en \refeq{eq:method_inicializar_M}. + + \textbf{Input:} Red neuronal, representada con las matrices $(A,S,B)$. + \hspace*{\algorithmicindent} + \begin{algorithmic}[1] + %selección de p + \STATE \textit{Inicializamos $p$}. \\ + $p \gets$ vector de $\R^{d+1}$. + \COMMENT{Como heurística será generado con distribución uniforme en el intervalo $[0,1]$} + % Cálculo de Lambda + \STATE \textit{Selección de los datos de inicialización + $\Lambda \subset \mathcal{D}$}. \\ + \begin{equation} + \Lambda \gets \{ \emptyset \} + \end{equation} + \While{tamaño de $\Lambda < n$}{ + Tomamos de manera aleatoria $(x,y)$ de $\mathcal{D}$. \\ + \If{para todo $(a,b) \in \Lambda$ se satisface que + $p \cdot (x-a) \neq 0$}{ + \begin{equation} + \Lambda \gets \Lambda \cup \{(x,y)\}. + \end{equation} + \COMMENT{$\Lambda$ está ordenado conforme a la propiedad + \refeq{eq:method_inicializar_condition_desigualdad} + } + } + } + \STATE \textit{Cálculo de los parámetros base de la red neuronal.} \\ + + Para el primer $(x_1, y_1) \in \Lambda$ \\ + \begin{align} + &S_1 = M p_0, \\ + & A_{1 *} = M p_{[1,d]}, \\ + & B_{* 1} = y_1. + \end{align} + $\Lambda \gets \Lambda \setminus \{(x_1, y_1)\} $ \\ + \STATE \textit{Cálculo del resto de neuronas}. + \For{ cada $(x_k, y_k) \in \Lambda$}{ + \begin{align} + &S_{k} = M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k-1})\\ + & A_{k i} = \frac{2 M}{p \cdot (x_k - x_{k-1})} + p_{i} \quad i \in \{1, \ldots d\},\\ + & B_{* k} = y_k - y_{k-1}. + \end{align} + } + \STATE \textbf{return $(A,S,B)$}. + \end{algorithmic} +\end{algorithm} + +\subsection{Coste computacional algoritmo de inicialización de pesos} + +Antes de comenzar con el análisis notemos que el algoritmo tiene un componente aleatorio introducido en la selección del $p$; +y que en el peor (y con probabilidad nula) de los casos podría acabar con coste $\mathcal{O}(|\mathcal{D}|)$ devolviendo un resultado erróneo. + +Sin embargo, en virtud de las observaciones hechas en la +descripción del método, la mayoría de los datos del conjunto de entrenamiento tomados para inicializar la red neuronal cumplirán la propiedad de ortogonalidad y por tanto una buena +heurística es suponer +que el paso 2 del algoritmo, \textit{Selección de los datos de inicialización} se va a realizar con un coste de orden lineal a $n$. De esta manera el algoritmo de inicialización de pesos propuesto tendría una complejidad $\mathcal{O}(n)$. + +Notemos que este coste es bastante menor al de realizar \textit{backpropagation} y que además éste debería de realizarse repetidamente pare mejorar el error considerablemente, mientras que el nuestro se realiza tan solo una vez. + + +\subsection{Observaciones } + +Observemos que nuestro algoritmo, para un mismo conjunto de entrenamiento es capaz de producir infinitas soluciones +diferentes ya que +existen dos variables libres $M$ y $p$. + +La constante $M$ depende de la función de activación seleccionada y recordemos que debe escogerse para que satisfaga la condición \refeq{eq:method_inicializar_M}. + +Presentamos a continuación en la tabla \ref{table:M-activation-function} el valor $M$ para algunas funciones de activación. + +\begin{table}[H] + \centering + \begin{tabular}{|c|c|} + \hline + Función de activación & Valor mínimo de $M$ \\ \hline + Función rampa & 1 \\ \hline + \textit{Cosine Squasher} & $\frac{\pi}{2}$ \\ \hline + Función indicadora 0 & 0 \\ \hline + \end{tabular} + \caption{Valor mínimo del parámetro $M$ en algoritmo de inicialización de redes neuronales según la función de activación seleccionada.} + \label{table:M-activation-function} +\end{table} + +\subsection{Generalización del método para funciones de activación } + +A priori si la función de activación no cumple las propiedades +demandadas no podría ser utilizada en el algoritmo. Sin embargo, es +posible ver que se puede generalizar para otras +funciones de activación menos restrictivas como las definidas en \ref{table:funciones-de-activation}. + +\begin{itemize} + \item Por el teorema \ref{teo:eficacia-funciones-activation} también será valido para \textbf{funciones de activación que sean afines a una que satisface \refeq{eq:method_inicializar_M}}. El proceso constructivo consistiría en: (1) hacer que la red aprenda con la función que cumple los requisitos \refeq{eq:method_inicializar_M}. (2) Los pesos obtenidos transformarlos con la misma técnica que se aplica en la demostración del teorema \ref{teo:eficacia-funciones-activation}. + + \item \textbf{Funciones de activación asintóticas a 0 o 1}, esto es funciones que satisfacen que: + \begin{enumerate} + \item $\lim _{x \rightarrow \infty} \psi(x) = 1 + $. + \item $\lim _{x \rightarrow -\infty} \psi(x) = 0$. + \item Que cumpla que $\psi(x) \neq 1$ para todo $x\in \R$ o $\psi(x) \neq 0$ para todo $x\in \R$ . + \end{enumerate} + Bastará con tomar un $M$ lo suficientemente grande. + \item Para funciones del tipo anterior, pero asintóticas a $a,b \in \R$, con alguno de los extremos $a,b$ distintos de $0$ y $1$, bastará con realizar una transformación afín de $f$ cumpliendo que $f(a)= 0$ y $f(b)= 1$ y aplicar el teorema \ref{teo:eficacia-funciones-activation}. +\end{itemize} + +De esta manera se pueden ampliar las funciones de activación válidas, añadiendo algunas como: + +\begin{table}[H] + \centering + \begin{tabular}{|c|c|} + \hline + Función de activación & Valor mínimo de $M$ \\ \hline + Función rampa & 1 \\ \hline + \textit{Cosine Squasher} & $\frac{\pi}{2}$ \\ \hline + Función indicadora 0 & 0 \\ \hline + Función de activación & Valor mínimo de $M$ \\ \hline + Sigmoidea & con $M=10$ el error menor de $10^{-5}$\\ \hline + Tangente hiperbólica & con $M=7$ el error menor de $10^{-5}$\\ \hline + \textit{Hardtanh} & 1 \\ \hline + \end{tabular} + \caption{Valor mínimo del parámetro $M$ en algoritmo de inicialización de redes neuronales según la función de activación seleccionada (con más resultados).} + \label{table:M-activation-function-2} +\end{table} + +%\textcolor{red}{TODO issue 107: Hacer experimentaciones } \ No newline at end of file diff --git a/Memoria/capitulos/Introduccion.tex b/Memoria/capitulos/Introduccion.tex index 146e798..d472ea1 100644 --- a/Memoria/capitulos/Introduccion.tex +++ b/Memoria/capitulos/Introduccion.tex @@ -3,7 +3,8 @@ %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - +\part{Teoría subyacente} + No es usual en un manual que trate sobre redes neuronales encontrarse en su interior con un capítulo sobre teoría de la aproximación, pero tampoco es nuestra intención hacer de este documento una recopilación de todo lo usual, sino todo lo contrario. @@ -13,7 +14,15 @@ El fin de esto no es más que construir una teoría sólida que de cabida a optimizaciones de fundamento teórico. Para ello nuestro \textit{modus operandi} será el siguiente: -Se describirá el conjunto y características de problemas que pretendemos abarcar en el capítulo \ref{chapter:Introduction-neuronal-networks}. Al final del mismo capítulo se introduce la definición que hemos determinado por conveniente de red neuronal y que es producto de los capítulos \ref{chapter:redes-neuronales-aproximador-universal} -y \ref{chapter:teoria-aproximar}. +Se describirá el conjunto y características de problemas que pretendemos abarcar en el capítulo \ref{chapter:Introduction-neuronal-networks}. +Se comentará las limitaciones e inconvenientes que presenta un enfoque clásico +basado en teoría de la aproximación en el capítulo \ref{chapter:teoria-aproximar}. +A continuación en el capítulo \ref{chapter4:redes-neuronales-aproximador-universal}, +presentarán las redes neuronales como un modelo eficiente. -Tras todo el fundamento teórico en \ref{chapter:construir-redes-neuronales} se explicitará el diseño de la red neuronal así como los algoritmo de evaluación y aprendizaje. \ No newline at end of file +Al final del mismo capítulo se introduce la definición que hemos determinado por conveniente de red neuronal y que es producto de los capítulos +\ref{chapter:teoria-aproximar} y \ref{chapter4:redes-neuronales-aproximador-universal}. + +Tras todo el fundamento teórico en \ref{chapter:construir-redes-neuronales} se explicitará el diseño de la red neuronal modelizada así como los algoritmo de evaluación y aprendizaje. + +En los capítulos \ref{funciones-activacion-democraticas-mas-demoscraticas} y \ref{section:inicializar_pesos} se explican además otros resultados para optimizar el coste computacional. \ No newline at end of file diff --git a/Memoria/capitulos/N-Exploracion-hipotesis-planteadas/hipotesis.tex b/Memoria/capitulos/N-Exploracion-hipotesis-planteadas/hipotesis.tex index 6c8c16c..f0227eb 100644 --- a/Memoria/capitulos/N-Exploracion-hipotesis-planteadas/hipotesis.tex +++ b/Memoria/capitulos/N-Exploracion-hipotesis-planteadas/hipotesis.tex @@ -8,48 +8,14 @@ \chapter{Hipótesis de optimización } \textcolor{red}{ATENCIÓN: Todos este capítulo está como notas personales} -\section{A qué nos referimos con optimización} -ES necesario decir qué queremos optimizar -Ejemplo: -- Mejores resultados para mismo tiempo. - -Medir error y tiempo de cálculo. - -Es por ello que es necesario establecer cómo lo vamos a medir. - - - \textcolor{red}{ATENCIÓN: Todo este capítulo está como notas personales} - En esta sección recopilaremos las posibles ideas que podrían optimizar las redes neuronales, describiremos una experimentación para contrastar los resultados y mostraremos sus conclusiones. -\section{Democratización de la función de activación}\label{hypothesis:activation-function} - -La primera pregunta, existe alguna función de activación -claramente mejor en algún sentido que las otras. - -Haciendo un estudio computacional de evaluaciones concretas sí. -(TODO: hacer experimento) - -Pero eso no significaría que fuera mejor para -evaluar los resultados en una red neuronal real. -(hacer experimento) - -Este experimento depende de los datos y da lugar a la siguiente pregunta. - -¿Existe una dependencia en la mejora de los resultados -con respecto de los datos? - -Es decir si tenemos dos redes neuronales $f$ y $g$ de mismo número de neuronas y distintas funciones de activación y dos conjuntos de entrenamiento $D_1$, $D_2$ - -¿Podría darse el caso de que para $D_1$ $f$ aprenda mejor pero que para $D_2$ $g$ sea mejor?. - - Vamos a tratar de encontrar de encontrar un ejemplo de esto. \section{Inicialización de la pesos red neuronal}\label{hypothesis:pesos-iniciales} -\section{Construcción dinámica del número de neuronas} +\section{Algoritmo genéticos} diff --git a/Memoria/img/5-estudio-experimental/activation-function/boxplot-whiskers-activation-function.png b/Memoria/img/5-estudio-experimental/activation-function/boxplot-whiskers-activation-function.png new file mode 100644 index 0000000..cb4504a Binary files /dev/null and b/Memoria/img/5-estudio-experimental/activation-function/boxplot-whiskers-activation-function.png differ diff --git a/Memoria/img/metodo-lagrange/lagrange-13-datos.png b/Memoria/img/metodo-lagrange/lagrange-13-datos.png new file mode 100644 index 0000000..e672e5d Binary files /dev/null and b/Memoria/img/metodo-lagrange/lagrange-13-datos.png differ diff --git a/Memoria/img/metodo-lagrange/lagrange-18-datos.png b/Memoria/img/metodo-lagrange/lagrange-18-datos.png new file mode 100644 index 0000000..24ce7ed Binary files /dev/null and b/Memoria/img/metodo-lagrange/lagrange-18-datos.png differ diff --git a/Memoria/img/metodo-lagrange/lagrange-3-datos.png b/Memoria/img/metodo-lagrange/lagrange-3-datos.png new file mode 100644 index 0000000..b6a9dac Binary files /dev/null and b/Memoria/img/metodo-lagrange/lagrange-3-datos.png differ diff --git a/Memoria/img/metodo-lagrange/lagrange-8-datos.png b/Memoria/img/metodo-lagrange/lagrange-8-datos.png new file mode 100644 index 0000000..8bef2f1 Binary files /dev/null and b/Memoria/img/metodo-lagrange/lagrange-8-datos.png differ diff --git a/Memoria/library.bib b/Memoria/library.bib index d642a27..393e101 100644 --- a/Memoria/library.bib +++ b/Memoria/library.bib @@ -1,4 +1,4 @@ -%----- Teoría de la aproximación ----- +`%----- Teoría de la aproximación ----- % Texto principal del que se ha sacado @book{the-elements-of-real-analysis, title={The elements of real analysis}, @@ -288,6 +288,74 @@ @Book{ nla.cat-vn1819421 catalogue-url = { https://nla.gov.au/nla.cat-vn1819421 }, } +% Estimación del tamaño mini-batch +@article{mini-batch-size, + author = {Michael P. Perrone and + Haidar Khan and + Changhoan Kim and + Anastasios Kyrillidis and + Jerry Quinn and + Valentina Salapura}, + title = {Optimal Mini-Batch Size Selection for Fast Gradient Descent}, + journal = {CoRR}, + volume = {abs/1911.06459}, + year = {2019}, + url = {http://arxiv.org/abs/1911.06459}, + eprinttype = {arXiv}, + eprint = {1911.06459}, + timestamp = {Mon, 02 Dec 2019 13:44:01 +0100}, + biburl = {https://dblp.org/rec/journals/corr/abs-1911-06459.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} + +% ----- Backbones ---- +% Artículo donde se enseña beneficios de utilizar backbones +@article{backbone-object-detection, + author = {Tingting Liang and + Xiaojie Chu and + Yudong Liu and + Yongtao Wang and + Zhi Tang and + Wei Chu and + Jingdong Chen and + Haibin Ling}, + title = {CBNetV2: {A} Composite Backbone Network Architecture for Object Detection}, + journal = {CoRR}, + volume = {abs/2107.00420}, + year = {2021}, + url = {https://arxiv.org/abs/2107.00420}, + eprinttype = {arXiv}, + eprint = {2107.00420}, + timestamp = {Wed, 07 Jul 2021 15:23:11 +0200}, + biburl = {https://dblp.org/rec/journals/corr/abs-2107-00420.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} +@article{backbone-Architecture, + author = {Shanghua Gao and + Ming{-}Ming Cheng and + Kai Zhao and + Xinyu Zhang and + Ming{-}Hsuan Yang and + Philip H. S. Torr}, + title = {Res2Net: {A} New Multi-scale Backbone Architecture}, + journal = {CoRR}, + volume = {abs/1904.01169}, + year = {2019}, + url = {http://arxiv.org/abs/1904.01169}, + eprinttype = {arXiv}, + eprint = {1904.01169}, + timestamp = {Thu, 25 Apr 2019 10:24:54 +0200}, + biburl = {https://dblp.org/rec/journals/corr/abs-1904-01169.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} + +% Algoritmo genético para inicializar pesos redes neuronales +@article{Montana2002NeuralNW, + title={Neural Network Weight Selection Using Genetic Algorithms}, + author={David J. Montana}, + year={2002} +} + % Ejemplos de redes neuronales que combinan distintas funciones de activación % artículo que compara arquitecturas habituales @article{DBLP:journals/corr/abs-1811-03378, @@ -418,6 +486,24 @@ @ARTICLE{non-polynomial-activation-functions pages={911-917}, doi={10.1109/72.392253}} +% Métodos de selección de funciones de activación +@article{FunctionOptimizationwithGeneticAlgorithms, +author = {Kolev, Kolyu and Sevova, Janeta and Blagoev, Ivan}, +year = {2018}, +month = {05}, +pages = {}, +title = {Artificial Neural Network Activation Function Optimization with Genetic Algorithms} +} +@INPROCEEDINGS{Genetic-deep-neural-networks, + author={Zhang, Luna M.}, + booktitle={2015 IEEE International Conference on Big Data (Big Data)}, + title={Genetic deep neural networks using different activation functions for financial data mining}, + year={2015}, + volume={}, + number={}, + pages={2849-2851}, + doi={10.1109/BigData.2015.7364099}} + %%----------- Sobre utilizar otros cuerpos -------------- % Utiliza solo aritmética entera diff --git a/Memoria/paquetes/comandos-entornos.tex b/Memoria/paquetes/comandos-entornos.tex index ee77adf..b917d5e 100644 --- a/Memoria/paquetes/comandos-entornos.tex +++ b/Memoria/paquetes/comandos-entornos.tex @@ -85,13 +85,13 @@ % Para las notas del margen %Nota los colores seleccionados han sido creados con una paleta inclusiva % https://palett.es/6a94a8-013e3b-7eb645-31d331-26f27d -\definecolor{darkRed}{rgb}{ 0.149, 0.99, 0.49}%{1,0.1,0.1} +\definecolor{darkRed}{rgb}{0.2,1,0.7}%{ 0.149, 0.99, 0.49}%{1,0.1,0.1} \definecolor{dark_green}{rgb}{0, 0.24, 0.23} %{0.2, 0.7, 0.2} \definecolor{sutilGreen}{rgb}{0.850, 0.996, 0.807} % para el fondo del código \definecolor{blue}{rgb}{0.61, 0.98, 0.759} % sobreeescribimos el azul \newcommand{\smallMarginSize}{1.8cm} \newcommand{\bigMarginSize}{3cm} -\newcommand{\maginLetterSize}{\footnotesize} %{\scriptsize}% +\newcommand{\maginLetterSize}{\scriptsize}%{\footnotesize} %{\scriptsize}% % Para los iconos \usepackage{fontawesome} @@ -108,7 +108,7 @@ linewidth=5pt, outerlinecolor=red, outerlinewidth=5pt, -innerlinewidth=0pt, +innerlinewidth=1pt, outerlinecolor=red, roundcorner=5pt %middlelinecolor= yellow, @@ -119,20 +119,21 @@ leftline = false, bottomline = false, rightmargin=0pt, -skipabove=0pt, -skipbelow=0pt, +skipabove=7pt, +skipbelow=7pt, leftmargin=-1cm, backgroundcolor=black!7, %innerleftmargin=1cm, %innerrightmargin=0pt, %innertopmargin=0pt, %innerbottommargin=0pt, -%frametitlebackgroundcolor=yellow, +frametitlebackgroundcolor=yellow!100, ]{mdframed} - + \newenvironment{aportacionOriginal} {\mdfsetup{ - frametitle={\colorbox{black!7}{ \textcolor{white}{\Large Aportación original}}}, + frametitle=\textcolor{white}{\Large Aportación original} + %frametitle={\colorbox{black!7}{ \textcolor{white}{\Large Aportación original}}}, %frametitleaboveskip=-\ht\strutbox, %frametitlealignment=\center } diff --git a/Memoria/tfg.tex b/Memoria/tfg.tex index a8b9514..288e872 100644 --- a/Memoria/tfg.tex +++ b/Memoria/tfg.tex @@ -224,18 +224,26 @@ \input{capitulos/0-Metodologia/introduccion} \input{capitulos/0-Metodologia/herramientas} -\part{Teoría subyacente }%\label{part:conceptos-previos} - % Filosofía a seguir \input{capitulos/Introduccion} % Redes neuronales Definición de la clase de redes neuronales \input{capitulos/1-Introduccion_redes_neuronales/Objetivos} -\input{capitulos/1-Introduccion_redes_neuronales/aprendizaje_introduccion} -\input{capitulos/1-Introduccion_redes_neuronales/feedforward-network-una-capa} +\include{capitulos/1-Introduccion_redes_neuronales/aprendizaje_introduccion} + + +% Teoría de la aproximación +\input{capitulos/3-Teoria_aproximacion/0_objetivos} +\input{capitulos/3-Teoria_aproximacion/1_polinomios_de_Bernstein} +\input{capitulos/3-Teoria_aproximacion/2_Weierstrass_approximation_theorem} +\input{capitulos/3-Teoria_aproximacion/3_TeoremaStoneWeierstrass} +\include{capitulos/3-Teoria_aproximacion/4_Conclusiones} % Las redes neuronales multicapa son aproximadores universales -\include{capitulos/2-Articulo_rrnn_aproximadores_universales/introduccion} +\chapter{Las redes neuronales son aproximadores universales} +\label{chapter4:redes-neuronales-aproximador-universal} +\input{capitulos/1-Introduccion_redes_neuronales/feedforward-network-una-capa} +\input{capitulos/2-Articulo_rrnn_aproximadores_universales/introduccion} \include{capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_1_primeras_definiciones} \input{capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_2_teorema_1_hasta_lema_2_2} \input{capitulos/2-Articulo_rrnn_aproximadores_universales/desgranando_el_articulo/articulo_3_teorema_2_2} @@ -245,24 +253,17 @@ \part{Teoría subyacente }%\label{part:conceptos-previos} \input{capitulos/2-Articulo_rrnn_aproximadores_universales/diferencia_entre_los_reales_y_enteros} %\include{capitulos/2-Articulo_rrnn_aproximadores_universales/conclusiones_finales} -% Teoría de la aproximación -\input{capitulos/3-Teoria_aproximacion/0_objetivos} -\input{capitulos/3-Teoria_aproximacion/1_polinomios_de_Bernstein} -\input{capitulos/3-Teoria_aproximacion/2_Weierstrass_approximation_theorem} -\input{capitulos/3-Teoria_aproximacion/3_TeoremaStoneWeierstrass} - % Redes neuronales: métodos de evaluación y actualización de pesos %\input{capitulos/4-Actualizacion_redes_neuronales/introduccion} \input{capitulos/4-Actualizacion_redes_neuronales/construccion-evaluacion-red-neuronal} \input{capitulos/4-Actualizacion_redes_neuronales/aprendizaje} \input{capitulos/4-Actualizacion_redes_neuronales/otras-alternativas} -\input{capitulos/4-Actualizacion_redes_neuronales/optimizaciones} - -% Hipótesis -\part{Estudio experimental y exploración hipótesis planteadas} -\include{capitulos/5-Estudio_experimental/funciones_activacion} -\include{capitulos/N-Exploracion-hipotesis-planteadas/hipotesis} +% Mejoras propuestas +\input{capitulos/5-Estudio_experimental/funciones_activacion} +\input{capitulos/5-Estudio_experimental/inicializacion-pesos} +\input{capitulos/5-Estudio_experimental/combinacion_funciones_activacion} +%\include{capitulos/N-Exploracion-hipotesis-planteadas/hipotesis} % --------------------------------------------------------------------