16 Descenso por gradiente
El descenso por gradiente es un algoritmo de optimización utilizado en el campo del aprendizaje automático y en otros campos relacionados con la optimización de funciones. Su objetivo es encontrar los valores de los parámetros de una función que minimicen (o maximicen) su valor.
Supongamos que deseamos minimizar una función objetivo \(f\). Es decir, queremos encontrar el valor del parámetro \(x^*\) que nos provea la mínima evaluación: $$
x^* = f(x)
$$
El descenso por gradiente especifica que de forma iterativa podemos hallar el valor del parámetro a través de actualizar un valor candidato. Formalmente,
Sea \(x_{t-1}\) un valor candidato, \(\eta\) un factor de escala (en el ámbito del aprendizaje, se denomina tasa de aprendizaje) y \(\nabla_x f(x)\) el gradiente de la función \(f(x)\) con respecto de \(x\). El nuevo valor candidato se calcula como $$
x_t = x_{t-1} - _x f(x)
$$
En el caso particular donde solo tenemos un parámetro, el gradiente se puede definir como la derivada unidimensional, $$
_x f(x) = f(x)$$
Para las situaciones donde se tienen más parámetros, el gradiente se calcula con las derivadas parciales con respecto de cada parámetro. Como se verá después en la aplicación a las redes neuronales. Para comprender mejor el método partiremos de un ejemplo.
Suponiendo la siguiente función objetivo a minimizar: $$
f(x) = x^2
$$
Determine el valor del parámetro x, a una iteración del descenso por gradiente usando un valor candidato, \(x=-2\), y una tasa de aprendizaje, \(\eta=0.1\). Solucion: para esta función, el gradiente es: $$
f(x) = 2x$$
De esta forma, la actualización iterativa, ecuación (#eq:actualizacion_gradiente), se escribe como: $$
x_t = x_{t-1} - x_{t-1}$$
Utilizando el valor candidato, \(x=-2\), y la tasa de aprendizaje, \(\eta=0.1\), el nuevo valor se determina como: $$
x_t = (-2) - 0.1 (2 (-2)) = -1.6$$
De lo anterior podemos observar que el nuevo valor es mejor dado que disminuye la evaluación de la función. Es decir, \(f(-1.6) < f(-2)\).
Partiendo la ecuación \(x^2\) del ejemplo #ejem:descenso. Suponga ahora que el valor inicial es \(x=5\) y que la tasa de aprendizaje \(\eta=0.1\).
- Calcule los valores del parámetro para 5 iteraciones consecutivas. Solución: los valores se encuentran escritos en la tabla siguiente.
| \(x_t\) | \(f(x_t)\) | \(x_{t+1}\) |
|---|---|---|
| 5 | 25 | 4 |
| 4 | 16 | 3.2 |
| 3.2 | 10.2 | 2.56 |
| 2.56 | 6.55 | 2.04 |
| 2.04 | 4.19 | 1.63 |
- Implemente un programa en python y grafique los resultados del método para 10 iteraciones. Solución: observe la figura 3.

16.1 Implementación
El método de descenso por gradiente consiste en ejecutar repetidamente la ecuación (#eq:actualizacion_gradiente). Para esta implementación estamos suponiendo que la función solo tiene una variable, por lo cual solo se usa una derivada univariable. Por lo anterior, la implementación de la ecuación (#eq:actualizacion_gradiente) se realiza en una función de Python mostrada en el código siguiente.
# descenso por gradiente:
def descenso_por_gradiente(parametro, tasa):
parametro = parametro - tasa * df(parametro)
return parametroComo se observa, la función recibe el valor actual del parámetro y la tasa de aprendizaje.
La función de actualización se prueba en el bloque de código #cod:test_descenso_1D para una función objetivo cuadrática.
#funcion objetivo:
def f(x):
return x**2# derivada de la funcion objetivo:
def df(x):
return 2*x# funcion principal:
def main(iterations):
print("Introduccion al descenso por gradiente") parametro = 5
tasa = 0.1
print(f"Valor inicial x: {parametro}")
print(f"Valor de f(x): {f(parametro)}") for i in range(iterations):
parametro = descenso_por_gradiente(parametro, tasa)
print(f"\nIteracion: {i+1}")
print(f"Valor de x: {parametro}")
print(f"Valor de f(x): {f(parametro)}")
if __name__ == "__main__":
iterations = int(input("Introduce la cantidad de iteraciones: "))
if iterations <= 0:
print("El numero de iteraciones debe ser mayor a 0")
else:
main(iterations)16.2 Ejercicios
Calcule de forma iterativa 6 valores del parámetro x para minimizar la función: $$
f(x) = 2x + x^2$$
Use el parámetro inicial \(x=10\) y una tasa \(\eta = 0.2\)
Modifique el código #cod:test_descenso_1D para que se minimice la función descrita en el ejercicio #ejer:suma2x. Grafique los valores calculados para 20 iteraciones del método.
Dada la función \(f(x) = x^4 - 5x^2 + 4x\):
Determine el gradiente de la función con respecto a \(x\).
Establezca la ecuación de actualización, substituyendo el gradiente en: $$
x_t = x_{t-1} - _x f(x)$$
- Realice un programa que a partir de valores introducidos por el usuario: \(\eta\), \(x_0\), e \(iteraciones\) grafique el comportamiento del descenso por gradiente.