4. Optimización en ML
Convención: Todos los casos van a asumirse de minimización, sin pérdida
de generalidad ya que maximizar f equivale a minimizar f ′ = −f .
Optimización en general: buscamos minimizar J(θ), tenemos toda la
información necesaria disponible.
Optimización en ML: buscamos minimizar J(θ), sólo disponemos de un
ˆ
J(θ) basado en el dataset disponible.
Conclusión: no son el mismo problema.
4 / 24
5. Proxy target/surrogate loss
Denominamos proxy o surrogate a una función f ′ que queremos minimizar
como medio para minimizar otra función f que es la que verdaderamente
nos interesa.
El esquema entonces resulta:
aprendemos vía train set → necesitamos minimizar Jtrain(θ)
predecimos vía test set → queremos minimizar Jtest(θ)
Importante: Definida una función de pérdida por observación L(ŷ, y), la
función de costo típicamente se define como
J(θ) = E[L(ŷ, y)]
de donde
ˆ
J(θ) =
1
n
n
X
i=1
L(ŷi , yi )
5 / 24
6. Ejemplo
Supongamos un caso de clasificación binaria donde definimos la función de
pérdida como el accuracy o precisión, definido como
L(ŷ, y) = 1{ŷ ̸= y}
Como podemos ver, esta función de pérdida es muy mala para minimizar.
Planteamos entonces entrenar sobre la cross-entropy loss
Ltrain(ŷ, y) = −y · log(ŷ) − (1 − y) · log(1 − ŷ)
que nos permite ya no sólo trabajar con ŷ ∈ {0, 1} sino todo el rango
continuo [0, 1] de probabilidades, además de, especialmente, ser derivable
respecto de ŷ.
6 / 24
7. Taxonomía
Ahora que nuestro problema es minimizar Jtrain(θ), podemos separarlo en
varios casos:
Optimización
Continua
Sin
restricciones
Con
restricciones
J convexa
J no convexa
7 / 24
9. Caso trivial
Analicemos el caso más simple: se conoce la solución analítica.
Ejemplo: modelo lineal con ŷ =< θ, x >, matriz de diseño X, vector de
targets Y , L(ŷ, y) = (ŷ − y)2, entonces el θ óptimo resulta:
θ∗
= arg min
θ
J(θ) = (XT
X)−1
XT
Y
Importante: si ese cálculo nosotros lo realizamos mediante cierto método
iterativo en vez de calcularlo directamente es decisión de implementación
nuestra, la expresión de θ∗ ya la tenemos.
9 / 24
11. Intuición
¿Qué ocurre si no existe solución analítica? En términos generales, la única
estrategia posible es prueba y error en forma iterativa.
Planteemos el caso de J(θ), θ ∈ R.
En cada punto ¿Cómo saber hacia
donde moverme?
- Si J es derivable, J′ informa
la inclinación de J para cada θ.
- Como mínimo, informa la
dirección de crecimiento
y (en sentido contrario)
la dirección de decrecimiento
11 / 24
12. Definición
Sea f : Rn → R diferenciable, entonces:
∇f (x)T apunta en la dirección de máximo crecimiento.
−∇f (x)T apunta en la dirección de máximo decrecimiento.
Se define entonces el algoritmo de minimización de descenso por gradiente
(GD) como:
xt+1 = xt − γ · ∇f (x)T
donde γ > 0 es el learning rate, un valor pequeño que controla cuánto
moverse por paso.
Para una sucesión γt apropiada está demostrado que GD converge a
un mínimo local.
Son dos problemas a resolver:
Cómo seleccionar el punto inicial x0
Cómo seleccionar γ (o γt)
12 / 24
13. No GD-based
¿Pausa! ¿Por qué Gradient Descent?
GD pide muy poco, que f sea diferenciable (y recordemos que
nosotros la construimos...)
GD es una aproximación lineal
¿Podemos hacer algo mejor que lineal?
Recordemos el polinomio de Taylor de grado 2 de una función f (x)
alrededor de un punto xt evaluada en un punto x̃ = xt + ∆ con ∆ pequeño:
f (x̃) ≈ f (xt) + f ′
(xt)(x̃ − xt) +
1
2
f ′′
(xt)(x̃ − xt)2
f (xt + ∆) ≈ f (xt) + f ′
(xt)∆ +
1
2
f ′′
(xt)∆2
13 / 24
14. Método de Newton
Para el caso anterior (desarrollo de Taylor de orden 2) el máximo ocurre en
f ′(xt + ∆∗) = 0 para ∆∗ = − f ′(xt )
f ′′(xt ) . Luego, el método de Newton plantea:
xt+1 = xt −
f ′(xt)
f ′′(xt)
O en su versión multivariada:
xt+1 = xt − H−1
∇f (xt)T
Pros:
Incorpora curvatura para corrección → mayor velocidad de
convergencia
Cons:
Newton en particular no converge a mínimo, sino a punto crítico:
surgen los saddle points como peligro.
La estimación de Hessiano requiere muchas observaciones.
Goodfellow compara 102 obs. para ∇f (x) vs 104 para H−1∇f (x)T .
14 / 24
16. Recapitulación
Queremos seguir utilizando gradient descent (GD/VGD), la idea es
proponer adaptaciones del mismo que ataquen los problemas del original, a
saber:
elección de θ0
elección de γt
convergencia lenta
Recordemos la expresión de (Vanilla) Gradient Descent:
θt+1 = θt − γ · g
con g = ∇f (θt).
16 / 24
17. LR decay
Idea: al principio está bien aprender de forma agresiva, luego hay que ir
refinando → γ decrece con t.
θt+1 = θt − γt · g
con diferentes opciones de γt decreciente, entre ellas:
polinomial: γt = γ0(1
t )k = γ0 · t−k
exponencial: γt = γ0(1
k )t = γ0 · k−t
restringida: γt =
(
(1 − t
tmax
)γ0 + t
tmax
γmin si 0 ≤ t < tmax
γmin si t ≥ tmax
con hiperparámetros k, γ0, γmin menos sensibles que γ constante.
17 / 24
18. Momentum
Idea: adaptar el γ según consistencia (tener en cuenta steps anteriores) →
agregar memoria.
(
vt = αvt−1 − γ · g
θt+1 = θt + vt
α ∈ (0, 1) es la viscosidad (en términos físicos) o retención de
memoria de valores anteriores.
Observar que
θt+1 = θt − γ(gt + αgt−1 + α2
gt−2 + . . . ) = θt − γ
t
X
i=0
αi
gt−i
18 / 24
19. RMSProp
Idea: "reescalar" el gradiente para tener más estabilidad. El reescalamiento
se hace a nivel de feature para que variaciones grandes sobre un feature no
anulen a otros que aún no variaron.
(
st = λst−1 + (1 − λ)g2
θt+1 = θt − γ
√
st +ϵ
⊙ g
con 2 y
√
aplicados element-wise, e.g. g2 = g ⊙ g = (g2
1 , g2
2 , . . . , g2
n ).
λ ∈ (0, 1) es la retención de memoria de valores anteriores.
0 < ϵ ≪ 1 es una constante para estabilidad numérica. Valores típicos
rondan 10−6.
19 / 24
20. Adam
Idea: Momentum y RMSProp hacen cosas distintas y ambas están buenas
¡Mezclemos!
vt = β1vt−1 + (1 − β1)g
st = β2st−1 + (1 − β2)g2
v′
t = vt
1−βt
1
s′
t = st
1−βt
2
θt+1 = θt − γ
√
s′
t +ϵ
⊙ v′
t
β1, β2 ∈ (0, 1) son la retención de memoria de valores anteriores de
media y variabilidad del gradiente. Valores default son
β1 = 0.99, β2 = 0.999.
0 < ϵ ≪ 1 es una constante para estabilidad numérica. Valor default
es 10−8.
20 / 24
21. Adam puede fallar
Reescribamos las dos partes interesantes de Adam:
(
vt = β1vt−1 + (1 − β1)g
st = β2st−1 + (1 − β2)g2
≡
(
vt = vt−1 − (1 − β1)(vt−1 − g)
st = st−1 − (1 − β2)(st−1 − g2)
Y prestemos atención a lo siguiente:
∆θ = θt+1 − θt = γ
√
s′
t +ϵ
⊙ v′
t ∝ 1
√
s′
t
∆s = st − st−1 = −(1 − β2)(st−1 − g2) ∝ −st−1 + g2
¿Qué pasa si, por ej., en varias iteraciones el gradiente es 0 o muy
pequeño, es decir s ≫ g2? Ocurre que s se empieza a reducir
exponencialmente, y por consiguiente ∆θ a aumentar mucho.
21 / 24
22. Yogi
Idea: Corrijamos el defecto de Adam para gradientes dispersos (sparse) y
estancamientos (plateaus). Si la idea original era reescalar el gradiente
usando g2, volvamos a eso.
ADAM: ∆s = −(1 − β2)(st−1 − g2)
YOGI: ∆s = −(1 − β2) · sgn(st−1 − g2)g2
vt = β1vt−1 + (1 − β1)g
st = st−1 − (1 − β2) · sgn(st−1 − g2)g2
v′
t = vt
1−βt
1
s′
t = st
1−βt
2
θt+1 = θt − γ
√
s′
t +ϵ
⊙ v′
t
22 / 24
24. Estimación de ∇f
En todos estos casos estamos partiendo de la base que conocemos
perfectamente ∇f (θ), pero la realidad es que no. En el mejor de los casos,
podemos calcular el promedio sobre las n observaciones del dataset.
El problema: ¿cuántas m observaciones utilizamos para estimar ∇f (θ)?
Si recordamos que σx̄ ∝ 1
√
m
, reducir 10x el error estándar de la estimación
requiere 100x más observaciones. → no rinde. Al mismo tiempo, hardware
tipo GPU/TPU nos permite procesar múltiples entradas en paralelo.
Se definen 3 enfoques generales:
stochastic (*): m = 1
minibatch: 1 < m ≪ n según hardware
batch: m = n
(*) Hay un conflicto en la literatura, donde a cualquier m < n se le llama
stochastic, especialmente dada la preponderancia del esquema de
minibatch por sobre los demás.
24 / 24