Prefacio
El código de este artículo se puede obtener de mi Github:
/paulQuei/gradient_descent
El ejemplo del algoritmo de esto El artículo está implementado en lenguaje Python, numpy y matplotlib se utilizan en la implementación. Si no está familiarizado con estas dos herramientas, busque tutoriales en Internet.
Acerca de la optimización
La mayoría de los algoritmos de aprendizaje implican algún tipo de optimización. La optimización es la tarea de cambiar x para minimizar o maximizar una función.
Solemos llamar minimización a la mayoría de los problemas de optimización. La maximización se puede lograr mediante la minimización.
Consideramos como función objetivo o criterio la función a minimizar o maximizar.
Normalmente utilizamos un superíndice * para representar el valor de x en el que se minimiza o maximiza una función. Recuerde esto:
[x^* = arg; minf(x)]
La optimización en sí es un tema muy importante. Si está interesado, puede aprender de libros sobre optimización numérica e investigación de operaciones.
Modelos y funciones de supuestos
Todos los modelos son incorrectos, pero algunos son útiles. George Edward Pelham Box
Un modelo es una hipótesis sobre los datos que se van a analizar. Aprende de los datos para resolver un problema específico, por lo que es el concepto central del aprendizaje automático.
Para un problema, suele haber una gran cantidad de modelos entre los que elegir.
Este artículo no profundizará en este aspecto. Para varios modelos, consulte libros relacionados sobre aprendizaje automático. Este artículo solo analiza el algoritmo de descenso de gradiente basado en el modelo lineal más simple.
Aquí primero presentamos tres símbolos de uso común en el aprendizaje supervisado:
m, que describe el número de muestras de entrenamiento.
x, que describe variables o características de entrada.
y, describe la variable de salida o valor objetivo.
Tenga en cuenta que una muestra puede tener muchas características, por lo que xey suelen ser un vector. Sin embargo, al comienzo del aprendizaje, para facilitar la comprensión, se puede entender temporalmente que se trata de un valor específico. El conjunto de entrenamiento contiene muchas muestras, que usamos para representar la I-ésima muestra.
x es la característica de la muestra de datos e y es su valor objetivo. Por ejemplo, en un modelo para predecir precios de vivienda, X es información diversa sobre la casa, como área, piso, ubicación, etc. , Y es el precio de la casa. En la tarea de reconocimiento de imágenes, X son todos los datos de píxeles de la imagen e Y es el objeto de destino contenido en la imagen.
Queremos encontrar una función que asigne X a Y. Esta función debería ser lo suficientemente buena para predecir la Y correspondiente. Por razones históricas, esta función se llama función de hipótesis.
El proceso de aprendizaje se muestra en la siguiente figura. Es decir, primero entrenamos nuestro modelo de algoritmo en función de los datos existentes (llamado conjunto de entrenamiento) y luego predecimos nuevos datos en función de la función hipotética del modelo.
El modelo lineal, como su nombre indica, consiste en describir el patrón en forma de línea recta. La función de hipótesis del modelo lineal es la siguiente:
[h _ { \theta }(x)= \theta _ { 0 }+\theta _ { 1 } * x]
Esta fórmula debería ser sencilla para todos. Si se dibuja, en realidad es una línea recta.
La siguiente imagen es un ejemplo específico, a saber:
En un proyecto real de aprendizaje automático, tendrá muchos datos. Los datos provendrán de una fuente de datos. Se almacenan en archivos csv o se empaquetan en otros formatos.
Pero este artículo es a modo de demostración. Generamos automáticamente los datos requeridos a través de un código simple. Para facilitar el cálculo, la cantidad de datos demostrados también es pequeña.
Importar numpy como np
max_x = 10
data_size = 10
θ_ 0 = 5
theta_1 = 2
Definición de obtención de datos:
x = np.linspace(1, max_x, data_size)
ruido = np.random.normal(0, 0.2, len(x))
y = theta_0 + theta_1 * x + ruido
Devuelve x, y
Este código es muy simple. Generamos 10 datos, cuyo rango x es un número entero en [1, 10]. La y correspondiente se calcula en forma de modelo lineal y su función es:. Los datos de la vida real a menudo se ven interferidos por varios factores, por lo que agregamos deliberadamente algo de ruido gaussiano a y. Por lo tanto, el valor final de y será ligeramente diferente del original.
Finalmente, nuestros datos son los siguientes:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]
Podemos dibujar estos 10 datos para que podamos tener una comprensión intuitiva, como sigue como se muestra en la figura:
Aunque los datos utilizados en la demostración se calcularon utilizando nuestra fórmula. Pero en la ingeniería real, los parámetros del modelo deben aprenderse de los datos. Entonces asumimos aquí que no sabemos cuáles son los dos parámetros del modelo lineal, pero los obtenemos en forma de algoritmo.
Finalmente lo comparamos con parámetros conocidos para comprobar que nuestro algoritmo es correcto.
Con los datos anteriores, podemos intentar trazar una línea recta para describir nuestro modelo.
Por ejemplo, dibuje una línea horizontal como se muestra a continuación:
Obviamente, esta línea horizontal está demasiado alejada de los datos y no coincide mucho con los datos.
Luego podemos trazar otra línea diagonal.
La línea diagonal que dibujamos la primera vez puede que tampoco sea la adecuada. Podría verse así:
Finalmente, lo intentamos una y otra vez y encontramos el más adecuado, como se muestra a continuación:
El proceso de cálculo del algoritmo de descenso de gradiente es similar a este Intentar instintivamente significa iterar constantemente y acercarse al resultado final paso a paso.
Función de valor
Intentamos varias veces ajustar los datos en línea recta.
Una línea recta en un plano bidimensional puede estar determinada únicamente por dos parámetros, y la determinación de los dos parámetros es también la determinación del modelo. Entonces, ¿cómo se describe qué tan bien se ajusta el modelo a los datos? La respuesta es la función de costos.
La función de coste describe el grado de desviación entre el modelo de aprendizaje y los resultados reales. Tome las tres imágenes de arriba como ejemplo. La línea roja en el último gráfico debería desviarse menos (con un costo) que la primera línea verde horizontal.
Obviamente, queremos que nuestra función de hipótesis sea lo más cercana posible a los datos, es decir, queremos que el resultado de la función de costos sea lo más pequeño posible. Esto implica la optimización de los resultados y el método de descenso de gradiente es uno de los métodos para encontrar el valor mínimo.
La función de coste también se llama función de pérdida. Para cada muestra, la función de hipótesis calcula una estimación, que a menudo expresamos mediante esta estimación. Ahora mismo.
Naturalmente, pensaremos en la siguiente fórmula para describir el grado de desviación entre nuestro modelo y el valor real:
[(h_\theta(x^i)-y^ i )^2 =(\widehat{y}^{i}-y^i)^2 =(\ theta _ { 0 }+\ theta _ { 1 } * x^{i}-y^{i}) ^ 2]
Tenga en cuenta que estos son valores de datos reales, no estimaciones de nuestro modelo. El primero corresponde a la coordenada Y del punto discreto en la figura anterior, y el segundo corresponde a la coordenada Y del punto de proyección del punto discreto en la línea recta.
Cada dato tendrá un valor de desviación. La función de costo es la desviación promedio de todas las muestras. La fórmula de cálculo es la siguiente:
[l(\ theta)= \. frac { 1 } { m } \sum_{i=1}^{m}(h_\theta(x^i)-y^i)^2 = \frac { 1 } { m } \sum_{i=1} ^{m}( \theta_{0}+\ theta _ { 1 } * x^{i}-y^{i})^2]
Cuando el resultado de la función de pérdida es menor, significa que la función estimada de nuestra hipótesis El resultado está más cerca del valor real. Por eso debemos minimizar la función de pérdida.
Diferentes modelos pueden utilizar diferentes funciones de pérdida. Por ejemplo, la función de hipótesis de la regresión logística es la siguiente: La función de costo es la siguiente: Con la fórmula anterior, podemos escribir una función para implementar la función de costo:
Defina función_costo (x, y, t0, t1):
p>cost_sum = 0
Para I(len(x)) en el rango:
costo _ artículo = NP power. (tt 1 * x[I ]-y[I], 2)
Costo total += elemento de costo
Devolución suma_costo/préstamo(x)
El código de esta función no debe ser explicado, se calcula en base a lo anterior.
Podemos intentar elegir diferentes combinaciones de suma para calcular el valor de la función de costo y luego obtener el resultado:
Importar numpy como np
Invertir matplotlib. importar pyplot como plt
Importar cm desde matplotlib
Importar Axes3D desde mpl_toolkits.mplot3d
θ_ 0 = 5
theta_1 = 2
def draw_cost(x, y):
fig = PLT figure(figsize = (10, 8))
ax = fig.gca(projection=. '3d ')
Recuento de dispersión = 100
Radio = 1
t0 _ rango = NP Espacio Lin(θ_ 0-radio, θ_ radio. , recuento_dispersión)
t 1 _ rango = NP . Espacio Lin(theta_1-radius, theta_1 + radio, recuento_dispersión)
costo = np.zeros(( len(rango_t0), len. (t1_range)))
Para el rango (len(t0_range)):
Para el rango óptimo (len(t1_range)):
coste[a ][b] = cost_function(x,y,t0_range[a],t1_range[b])
t0,t1 = np.meshgrid( t0_range, t1_range)
ax.set_xlabel ('theta_0 ')
ax.set_ylabel('theta_1 ')
ax.plot_surface(t0, t1, costo, cmap=cm.hsv)
En este código, tomamos muestras de un rango de sumas 100 veces y luego calculamos los valores de la función de costo de diferentes pares de combinaciones.
Si trazamos los valores de la función de costos de todos los puntos, el resultado es el que se muestra en la siguiente figura:
Como se puede ver en esta figura, cuanto más cerca de [5 , 2], menor será el resultado (desviación). Al contrario, cuanto más lejos, mayor será el efecto.
Explicación intuitiva
De la figura anterior podemos ver que la función de costo tiene diferentes resultados en diferentes posiciones.
Desde una perspectiva tridimensional, esto es lo mismo que las ondulaciones del suelo. El lugar más alto es como la cima de una montaña.
Nuestro objetivo es: partiendo de cualquier punto, encontrar rápidamente un camino para llegar al punto más bajo del gráfico (el valor de generación más bajo).
El proceso algorítmico de descenso de gradiente es el mismo que queremos hacer rápidamente desde la cima de la montaña.
En la vida, naturalmente pensamos que tomar el camino más empinado es el camino más rápido para bajar la montaña. Como se muestra en la siguiente imagen:
Los lectores atentos pueden tener rápidamente muchas preguntas sobre esta imagen, como por ejemplo:
¿Cómo determinar la dirección descendente de una función?
¿Hasta dónde debe llegar cada paso?
¿Es posible permanecer en la plataforma a mitad de la montaña?
Estas cuestiones se analizan a continuación en este artículo.
Descripción del algoritmo
El primer punto del algoritmo de descenso de gradiente es determinar la dirección de descenso, es decir, el gradiente.
A menudo lo usamos para representar gradientes.
Para una curva en un espacio bidimensional, el gradiente es la dirección de su tangente. Como se muestra en la siguiente figura:
Para funciones en un espacio de alta dimensión, el gradiente está determinado por las derivadas parciales de todas las variables.
La expresión es la siguiente:
[\ nabla f({ \ theta })=(\ frac { \ parcial f({ \ theta })} { \ parcial \ theta _ 1},\frac{\partial f({\theta})}{\partial\theta_2},...,\frac{\partial f({\theta})}{\partial\theta_n} )]
En el aprendizaje automático, utilizamos principalmente el algoritmo de descenso de gradiente para minimizar la función de costo, de la siguiente manera:
[\theta ^* = arg mínimo L(\theta)]< /p >
Donde l es la función de costos y los parámetros.
La lógica principal del algoritmo de descenso de gradiente es muy simple: descender a lo largo de la dirección del gradiente hasta que los parámetros converjan.
Recuerda hacer:
[\theta^{k+1 } _ I = \theta^{k}_i-\lambda\nabra f(\theta^ {k} )]
El subíndice I aquí representa el parámetro I-ésimo. El superíndice k se refiere al resultado del cálculo del k-ésimo paso, no a la k-ésima potencia. Según la comprensión, el superíndice k se omitirá en la siguiente fórmula. Hay algunos puntos a tener en cuenta aquí:
Convergencia significa que la tasa de cambio de la función es muy pequeña. La cantidad adecuada a elegir depende del proyecto específico. En el proyecto de demostración podemos elegir el valor 0,01 o 0,001. Los diferentes valores afectarán el número de iteraciones del algoritmo, porque al final del descenso del gradiente, nos acercaremos cada vez más a un lugar plano y la tasa de cambio de la función será cada vez menor. Elegir un valor menor puede hacer que el número de iteraciones del algoritmo aumente drásticamente.
En la fórmula, se llama tamaño del paso, también llamado tasa de aprendizaje. Determina hasta dónde llega cada paso y explicaremos este valor en detalle a continuación. Puede asumir temporalmente que es un valor fijo como 0,01 o 0,001.
En proyectos específicos, no dejaremos que el algoritmo se ejecute infinitamente, por lo que generalmente establecemos un límite superior para el número de iteraciones.
Descenso de gradiente de regresión lineal
Con el conocimiento anterior, podemos volver a la implementación del algoritmo de descenso de gradiente de la función de costo del modelo lineal.
Primero, de acuerdo con la función de costo, podemos obtener el vector gradiente de la siguiente manera:
[\ nabla f({ \ theta })=(\ frac { \ parcial l( \ theta)} { \ parcial \ theta _ { 0 } },\ frac { \ parcial l(\ theta)} { \ parcial \ theta _ { 1 } })=(\ frac { 2 } { m } \ sum_{ i=1} ^{m}(\theta_{0}+\ theta _ { 1 } * x^{i}-y^{i}),\frac { 2 } { m } \sum_{i=1} ^{m} (\theta_{0}+\ theta _ { 1 } * x^{i}-y^{i})x^{i})]
Luego, trae cada derivada parcial en la fórmula de iteración para obtener:
[\ theta _ { 0 }:= \ theta _ { 0 }-\ lambda \ frac { \ part l(\ theta _ { 0 })} { \ part \ theta _ { 0 }-\ frac { 2 \ lambda } { m } \sum_{i=1}^{m}(\ theta _ { 0 }+\ theta _ { 1 } * x^{i}-y ^{ i})\ \ theta _ { 1 }:= \ theta _ { 1 }-\ lambda \ frac { \ part l(\ theta
A partir de esto podemos implementar nuestro algoritmo de descenso de gradiente a través del código , algoritmo La lógica no es complicada:
learning_rate = 0.01
def gradient_descent(x, y):
t0 = 10
t1 = 10
delta = 0.001
Para tiempo en el rango (1000):
suma1 = 0
suma2 = 0 p >
Para I(len(x)) en el rango:
suma 1+=(tt 1 * x[I]-y[I])
suma 2+=(tt 1 * x[I]-y[I])* x[I]
t0 _ = t0-2 * tasa de aprendizaje * suma 1/len(x )
t 1 _ = t 1-2 * tasa de aprendizaje * suma 2/len(x)
Imprimir ('número de veces: {}, gradiente: [{} , {} ]'. Formato (tiempos, t0_, t1_)
if (ABS(t0-t0_)<delta y ABS(t 1-t 1_)<Δ):
print(" Descenso de gradiente completado")
return t0_,t1_
t0 = t0_
t1 = t1_
print(" Descenso de gradiente demasiado veces")
Devuelve t0, t1
El código se explica de la siguiente manera:
Seleccionamos aleatoriamente 10 como punto de partida.
Establece un máximo de 1000 iteraciones.
El rango de convergencia se establece en 0,001.
El tamaño del paso de aprendizaje se establece en 0,01.
Si dibujas el patrón lineal obtenido durante el proceso iterativo del algoritmo, puedes obtener el siguiente diagrama dinámico:
Finalmente, los resultados obtenidos por el algoritmo son los siguientes:
Número de veces: 657, gradiente: [5.196562662718697, 1.952931052920264]
Número de veces: 658, gradiente: [5.195558390180733, 1.9530753071808193]
Número de veces : 659, gradiente: [5.194558 335124868, 1.9532189556399233]
Número de veces: 660, gradiente: [5.193562479839619, 1.953620008416623]
Acabado de descenso en gradiente
Como puede ser Visto desde la salida, el algoritmo converge después de 660 iteraciones. El resultado en este momento [5.19356247939619, 1.95362000416623] está cerca del valor objetivo [5, 2]. Si se requiere una mayor precisión, el valor delta se puede ajustar a un valor menor, pero, por supuesto, se requieren más iteraciones.
Extensiones de dimensiones superiores
Aunque nuestros ejemplos son bidimensionales, la situación es similar para dimensiones superiores. De manera similar, se puede calcular según la fórmula iterativa:
[\ theta _ { I } = \ theta _ { I }-\sum_{i=1}^{m}(h_\theta( x^{k })-y^k)x_i^k]
Aquí el subíndice I representa el parámetro I y el superíndice k representa los datos k.
Familia de descenso de gradiente BGD
En el contenido anterior, podemos ver que cada iteración del algoritmo necesita atravesar todas las muestras. Esta práctica se llama descenso de gradiente por lotes o BGD para abreviar. Como ejemplo de demostración, solo hay 10 datos, no hay problema.
Pero en proyectos reales, la cantidad de conjuntos de datos puede ser millones o decenas de millones, y la cantidad de cálculo para cada iteración será muy grande.
Así que hay dos variaciones.
Iniciado sesión
Descenso de gradiente histórico (SGD para abreviar), este algoritmo selecciona solo una muestra a la vez del conjunto de muestras para el cálculo. Obviamente, este algoritmo requiere muchos menos cálculos en cada paso.
La fórmula del algoritmo es la siguiente:
[\ theta _ { I } = \ theta _ { I }-\ lambda \ frac { \ part l(\ theta)} { \ parcial \ theta _ I } = \ theta _ { I }-\lambda(h_\theta(x^k)-y^k)x_i^k]
Por supuesto, reducir la complejidad computacional de el algoritmo tiene un costo, es decir, el resultado del algoritmo dependerá en gran medida de los datos obtenidos aleatoriamente, lo que puede llevar a que el resultado final del algoritmo sea insatisfactorio.
MBGD
Los dos enfoques anteriores son en realidad dos extremos. Una es usar todos los datos a la vez, la otra es usar solo un dato a la vez.
Naturalmente, pensamos en un método para tomar ambos: seleccionar una pequeña parte de los datos para la iteración cada vez. Esto no solo evita el problema de que el conjunto de datos sea demasiado grande, lo que resulta en cálculos excesivos para cada iteración, sino que también evita el impacto de un solo dato en el algoritmo.
Este algoritmo se llama descenso de gradiente mini-batch, o MBGD para abreviar.
La fórmula del algoritmo es la siguiente:
[\ theta _ { I } = \ theta _ { I }-\sum_{i=a}^{a+b}( h_\theta (x^k)-y^k)x_i^k]
Por supuesto, podemos considerar SGD como un caso especial del Mini-lote 1.
¿Cómo elegir la variante del algoritmo mencionada anteriormente?
La siguiente es la sugerencia de Ng:
Si el tamaño de la muestra es pequeño (por ejemplo, menor o igual a 2000), puede elegir BGD.
Si el número de muestras es grande, elija MBGD, por ejemplo: 64, 128, 256, 512.
La siguiente tabla es una comparación de tres algoritmos de optimización del aprendizaje profundo.
Precisión del método, velocidad de actualización, uso de memoria, aprendizaje en línea, BGD es bueno, lento, alto o bajo, SGD es bueno, trae un anuncio, MBGD es bueno, medio, medio, sí.
Optimización del algoritmo
La ecuación 7 es la forma básica del algoritmo y mucha gente ha investigado más al respecto. A continuación, presentamos varios métodos de optimización del algoritmo de descenso de gradiente.
Efecto Momentum
El impulso es impulso. La idea de este algoritmo es utilizar un modelo dinámico: cada iteración del algoritmo se basa en la última velocidad.
La fórmula de este algoritmo es la siguiente:
[v^t = \gamma v^{t-1 }+\ lambda \ nabla f(\ theta)\ theta = \theta -v _ t]
Como se puede ver al comparar la Ecuación 7, la principal diferencia de este algoritmo es que cada momento se ve afectado por el momento anterior.
Formalmente, el algoritmo de impulso introduce la variable V como la función de velocidad: representa la dirección y la velocidad del movimiento del parámetro en el espacio de parámetros. La velocidad se establece en el promedio de gradientes negativos que decae exponencialmente. El nombre impulso proviene de una analogía física. Según las leyes del movimiento de Newton, un gradiente negativo es la fuerza que hace que las partículas se muevan en el espacio de parámetros. El momento se define en física como masa multiplicada por velocidad. En el algoritmo de aprendizaje de impulso, asumimos que es una unidad de masa, por lo que el vector de velocidad V también puede considerarse como el impulso de la partícula.
Una buena opción es establecer el valor de 0 a 0,9, que es una constante.
La siguiente figura es una comparación de los efectos del algoritmo de impulso:
El efecto de impulso se puede aumentar modificando ligeramente el algoritmo original:
def gradiente _ descenso _ con _ impulso( x, y):
t0 = 10
t1 = 10
delta = 0.001
v0 = 0
v1 = 0
Gamma = 0,9
Para tiempo en el rango (1000):
suma1 = 0
suma2 = 0
Para I(len(x)) en el rango:
suma 1+=(tt 1 * x[I]-y[ I]) p>
suma 2+=(tt 1 * x[I]-y[I])* x[I]
v0 =gamma* v0 + 2 * tasa de aprendizaje* suma1 / len(x)
v 1 = gamma * v 1+2 * tasa de aprendizaje * suma 2/len(x)
t0_ = t0 - v0
t1_ = t1 - v1
Imprimir ('Número de veces: {}, gradiente: [{}, {}]'.
Formato (tiempos, t0_, t1_)
if (ABS(t0-t0_)<delta y ABS(t 1-t 1_)<Δ):
print(" Descenso de gradiente completado")
return t0_,t1_
t0 = t0_
t1 = t1_
print(" Descenso de gradiente demasiado veces")
Devuelve t0, t1
El siguiente es el resultado del algoritmo:
Números: 125, gradiente: [4.955453758569991, 2.00005017897775] p>
Número de veces: 126, gradiente: [4.955309381126545, 1.996928964532015]
Número de veces: 127, gradiente: [4.9542964317327005, 1.98674828684156]
Número de veces: 128 , gradiente: [ 4.9536358220657, 1.9781180992510465]
Número de veces: 129, gradiente: [4.95412496254411, 1.978858350530971]
Clasificación por descenso de gradiente
Como se puede ver en Según los resultados, el algoritmo mejorado solo necesita 129 iteraciones para converger. La velocidad es mucho más rápida que las 660 veces originales.
De manera similar, podemos convertir el proceso de cálculo del algoritmo en un diagrama dinámico:
En comparación con el algoritmo original, la mayor diferencia entre el algoritmo mejorado y el algoritmo original es que cuando Buscando el valor objetivo, el resultado final salta hacia arriba y hacia abajo, pero la amplitud del salto se vuelve más pequeña a medida que retrocede. Este es el efecto del impulso.
Optimización de la tasa de aprendizaje
En este punto, es posible que todavía tengas curiosidad sobre cómo se establece la tasa de aprendizaje.
De hecho, la selección de este valor requiere algo de experiencia o prueba y error para determinarlo.
El libro "Aprendizaje profundo" se describe así: "Es más un arte que una ciencia, y deberíamos consultar atentamente la mayoría de guías sobre el tema". La clave es que este valor no puede ser ni demasiado grande ni demasiado pequeño.
Si este valor es demasiado pequeño, el tamaño del paso de cada iteración será muy pequeño y el resultado es que el algoritmo necesitará iterar muchas veces.
¿Y qué si esto vale la pena para el Congreso? El resultado es que el algoritmo puede oscilar hacia adelante y hacia atrás alrededor del resultado, pero no logra alcanzar el punto objetivo. La siguiente figura describe este fenómeno:
De hecho, el valor de la tasa de aprendizaje no es necesariamente una constante y hay mucha investigación sobre cómo establecer este valor.
Los siguientes son algunos algoritmos mejorados comunes.
AdaGrad
AdaGrad es la abreviatura de Adaptive Gradient. El algoritmo establecerá diferentes tasas de aprendizaje para cada parámetro. Utiliza la suma de cuadrados de gradientes históricos como base para el cálculo.
La fórmula del algoritmo es la siguiente:
[\ theta _ I = \ theta _ I-\ frac { \ lambda }
Comparado con 7, el El cambio aquí radica en la división El signo raíz debajo del signo.
El símbolo raíz tiene dos símbolos y el segundo símbolo es fácil de entender. Es una pequeña constante introducida artificialmente para evitar la división por 0. Por ejemplo, se puede establecer en: 0,005438+0.
La expresión del primer símbolo se expande de la siguiente manera:
[g _ t = \sum _ { I = 1}^{t} \Nabra f(\ theta) { I } \nabraf(\theta){i}^{T}]
Este valor es en realidad la acumulación de la suma cuadrada de cada gradiente en la historia.
El algoritmo AdaGrad puede ajustar automáticamente la tasa de aprendizaje durante el entrenamiento, utilizando una tasa de aprendizaje más alta para parámetros con menor frecuencia y, a la inversa, utilizando una tasa de aprendizaje menor para parámetros con mayor frecuencia; Por tanto, Adagrad es muy adecuado para procesar datos escasos.
Sin embargo, la desventaja de este algoritmo es que puede hacer que la tasa de aprendizaje sea muy pequeña, lo que hace que el algoritmo converja muy lentamente.
Se puede encontrar una explicación intuitiva de este algoritmo en el curso en vídeo del profesor Li Hongyi: ML Lecture 3-1: Gradient Descent.
RMSProp
RMS es la abreviatura de raíz cuadrática media. RMSProp es un método de tasa de aprendizaje adaptativo propuesto por Geoff Hinton, el padrino de la inteligencia artificial. Adagrad acumulará todos los cuadrados de gradiente anteriores, mientras que RMSProp solo calcula el promedio correspondiente, por lo que puede aliviar el problema de la rápida disminución en la tasa de aprendizaje del algoritmo AdaGrad.
La fórmula de este algoritmo es la siguiente:
[e[\nabra f(\theta_{i})^2]^{t} = \gamma e[\na braf(\theta_{i})^2]^{t-1 }+(1-\gamma)(\nabraf(\theta_{i})^{t})^{2} \ \theta _ I = \ theta _ I-\frac{\lambda}{\sqrt{e[g^2]^{t+1}+\ epsilon } } \nabraf(\theta_{i})]
De nuevo, se introduce para evitar la división por cero. es el parámetro de atenuación, generalmente establecido en 0,9.
Este es el promedio del gradiente al cuadrado en el tiempo t.
En las tradiciones bíblica y coránica) Adán (el nombre del primer ser humano)
Adán es la abreviatura de estimación de momento adaptativo. Utiliza la estimación de momento de primer orden del. gradiente y estimación de momento de segundo orden. La estimación de momento se utiliza para ajustar dinámicamente la tasa de aprendizaje de cada parámetro.
La ventaja de Adam es que después de la corrección del sesgo, la tasa de aprendizaje de cada iteración tiene un cierto rango. , haciendo que los parámetros sean más estables
La fórmula del algoritmo es la siguiente:
[m^{t} = \ beta _ { 1 } m^{t-1} +(1-\ beta _ { 1 })\Naboo pull f(\ theta)\ v^{t} = \ beta _ { 2 } v^{t-1}+(1-\ beta _ { 2 }) \nabra f(\ theta)^2 \ \ Widehat{m}^{t} = \frac{m^{t}}{1-\beta^{t}_1} \ \ Wide Hat { v } { t } = \frac { v { t } } { 1 -\ beta { t } _ 2 } \ \ n
, son la estimación del momento de primer orden y la estimación del momento de segundo orden del gradiente, que son las correcciones y pueden aproximarse como la estimación insesgada del valor esperado p>
El proponente del algoritmo Adam recomienda un valor predeterminado de 0,9, un valor predeterminado de 0,999 y un valor predeterminado de
En aplicaciones prácticas, Adam se usa comúnmente y puede obtener rápidamente un resultado de predicción.
Resumen de optimización
Aquí enumeramos varios algoritmos de optimización. decir cuál es mejor en proyectos reales, es posible que sea necesario probar diferentes algoritmos uno por uno para determinar cuál elegir. Este proceso también es uno de los procesos por los que pasan los proyectos de IA actuales. De hecho, si está interesado, puede continuar leyendo el artículo Sebastian Ruder: Descripción general del algoritmo de optimización de descenso de gradiente o diapositivas de optimización del aprendizaje profundo para obtener más investigaciones.
Debido a limitaciones de espacio, no entraré en detalles aquí.
Limitaciones del algoritmo
El algoritmo de descenso de gradiente tiene algunas limitaciones. En primer lugar, requiere que la función sea diferenciable y este método no se puede utilizar para funciones no diferenciables. p>
Además, en algunos casos, el algoritmo de descenso de gradiente puede converger lentamente al acercarse al punto extremo o producir una oscilación en forma de Z. Esto debe evitarse ajustando la tasa de aprendizaje. Además, el descenso de gradiente encontrará los siguientes dos tipos de problemas.
Mínimo local significa que el valor mínimo que encontramos es solo el valor mínimo de una región, no el valor mínimo global porque es el punto de partida. el algoritmo es arbitrario, como se muestra en la siguiente figura, podemos caer fácilmente en un mínimo local.
Esto es como bajar desde la cima de la montaña. La primera plataforma a la que llegue puede no estar en la. parte inferior de la montaña, pero puede ser sólo una plataforma a mitad de camino de la montaña.
El punto de partida del algoritmo determina la velocidad de convergencia del algoritmo y si caerá en un mínimo local.
La mala noticia es que no parece haber una forma especialmente buena de determinar qué punto es un buen punto de partida, es un poco de suerte.
Podría ser una buena idea probar diferentes puntos aleatorios varias veces, razón por la cual el algoritmo de optimización requiere tanto tiempo.
Pero la buena noticia es:
Para funciones convexas o cóncavas, no hay problema de extremos locales. Su extremo local debe ser el extremo global.
Algunos estudios recientes han demostrado que algunos mínimos locales no son tan malos como se imagina y están muy cerca de los resultados arrojados por los mínimos globales.
Punto de silla
Además de los mínimos locales, puede ocurrir otra situación durante el proceso de descenso del gradiente, a saber, el punto de silla. Un punto de silla significa que encontramos un punto con un gradiente de 0, pero no es el valor extremo de la función. Hay valores más pequeños y más grandes a su alrededor. Es como una silla de montar.
Como se muestra en la siguiente figura:
Una variedad de funciones aleatorias exhiben las siguientes propiedades: En espacios de baja dimensión, los valores extremos locales son muy comunes. Sin embargo, en espacios de alta dimensión, los mínimos locales son raros, mientras que los puntos de silla son comunes.
Pero para los puntos de silla, se puede utilizar el método matemático de la matriz de Hesse para determinarlo. En este punto, no hay más expansión aquí. Los lectores interesados pueden continuar explorando a través de varios enlaces proporcionados aquí.
Materiales de referencia y materiales de lectura recomendados
Wikipedia: Descenso de gradiente
Sebastian Ruder: descripción general de los algoritmos de optimización de descenso de gradiente
Enda Ng: Estudio de máquinas.
Enda Ng: Aprendizaje profundo
Peter Flake: Aprendizaje automático
Conferencia 3-1 de Li Hongyi-ML: Descenso de gradiente
PDF : Li Hongyi Descenso de gradiente
Introducción a la optimización en el aprendizaje profundo: Descenso de gradiente
Introducción a la optimización en el aprendizaje profundo: Momentum, RMSProp y Adam
Descenso de gradiente estocástico – Mini lotes y más
Descripción general del método de descenso de gradiente de Liu Jianping Binard
Pensando en la relación entre derivadas parciales, derivadas direccionales, gradientes y diferenciales de funciones multivariadas
Tres formas de métodos de descenso de gradiente [aprendizaje automático] BGD, SGD y MBGD.
Autor: Paul https://paul.pub/gradient-descent/