Jacques Wainer
6/4/20
Fazem sentido em otimização não convexa
há mínimos locais pequenos
ha regiões com derivadas zero (em todas ou várias direções) que não são pontos de mínimo.
É preciso escapar desses dois tipos de regiões - nesses casos o gradiente = 0 e portanto a descida do gradiente para (wi+1=wi) e não há avanço (ou ele é pequeno).
Esta é uma boa fonte para esses assuntos
As tres familias de variações são
momento
stochastic gradient descent e minibatch
algoritmos adaptativos para o learning rate (e o momento)
metáfora: uma bola descendo o morro - ela mantem o momento (direção e velocidade) como um componente importante do novo passo.
momento: Vi=wi−wi−1
wi+1=wi−ϵ∇f(wi)+βVi
onde β é o quanto o momento velho Vi influencia na nova direção e normalmente esse número é grande (0.9 ou mesmo 0.99)
Escapa de mínimos locais pequenos (onde o V se mantem ainda grande)
Quando estamos falando de aprendizado de maquina normalmente estamos falando em minimizar algum erro sobre varios dados.
Queremos minimizar algo como:
minf(w)=k∑erro(yk−g(w,xk))
onde k anda pelos dados e erro é alguma medida de erro (quadrático, modulo, e outros) e g é a função de estamos tentando aprender (com parâmetros w)
A descida do gradiente normal seria:
wi+1=wi−ϵ∇(k∑erro(yk−g(wi,xk)))
Isso é igual a:
wi+1=wi−k∑ϵ∇erro(yk−g(wi,xk))
ou seja, acumula-se o gradiente do erro para cada dado e só depois atualiza o wi+1.
Isso é o a descida do gradiente tradicional e é chamado de batch GD
A ideia do stochasic gradient descent é atualizar o w com o gradiente do erro de um só dado.
wi+1=wi−ϵ∇erro(yk−g(wi,xk))
para algum k.
Note que a direção de ∇erro(yk−g(wi,xk)) pode ser totalmente contraria a direção “correta” de ∇(∑kerro(yk−g(wi,xk))). Mas os outros dados vão acabar puxando o w na “direção certa”.
O SGD faz um caminho muito mais ruidoso para o mínimo (ver figura aqui )
O SGD é útil para escapar de regiões com derivada perto de zero (em todas ou algumas direções). Se ∇(∑kerrok) é zero, ∇errok não deve ser zero.
O SGD é útil tambem conceitualmente para coisas como online learning onde voce não pode guardar os dados (por exemplo dados de sensores) e voce precisa utilizar o dado no aprendizado assim que ele aparece.
Na prática, para SGC é preciso alterar a ordem em que os dados k são apresentados ao algoritmo.
O SGD é muito ruidoso - o caminho para o minimo é muito ruidoso. A ideia do minibatch é combinar o batch com o SGC e fazer a atualizacao do w assim que um grupo de M dados for apresentado:
wi+1=wi−ϵ∇k∑Merro(yk−g(wi,xk))
Esse é um minibatch de M dados. Ele deve ter uma vantagem similar ao SGD em termos de fugir de regioes onde o gradiente é 0, mas faz um percurso menos ruidoso.
Este não é um algoritmo de l.r. adaptativo. Mas é parte dos outros algoritmos.
A formula do momento é onde β é 0.9 ou maior
wi+1=wi−ϵ∇f(wi)+βVi
A ideia do NAG é que wi+1 vai ser perto de wi+βVi que são vetores que computamos na volta passada. Vamos chamar este ponto de w^i
w^i=wi+βVi
Em vez de calcular o gradiente em wi vamos calcula-lo em w^i. Assim a formula de atualização do wi+1 no NAG é
wi+1=wi−ϵ∇f(w^i)+βVi
Adagrad, como uma boa introdução a algoritmos adaptativos, tem um l.r para cada dimensão do vetor w. Em redes neurais profundas, o gradiente tem valores muito baixos para as primeiras camadas (mexer nos pesos das primeiras camadas tem muito pouca influencia no resultado final) e muito maiores para as últimas.
wi+1,j=wi,j−ϵj∇jf(wi)
onde o indice j indica a dimensão
no adagrad:
ϵj=Gi,j+δϵ
onde δ é um numero pequeno so para que a divisão não seja por 0 (se Gi,j é 0). Gi,j é a soma dos quadrados do gradiente na direção j até agora.
Se os gradientes na direção j são grandes, o passo naquela direção é pequeno (para evitar divergencias). E se são pequenos, o passo é grande.
Mas o AdaGrad sempre vai diminuindo o passo (ja que Gi,j sempre cresce).
Adadelta modifica o Adagrad para que o l.r. de cada direção não diminua continuamente. O termo Gi,j só soma k dos últimos gradientes (na direção j).
Adam usa a ideia de momento em cada direção, que tambem é adaptado com a soma dos quadrados do gradiente.
RMSprop, Adamax, Nadam, AMSGrad são outros algoritmos.
Veja outros algoritmos em https://ruder.io/optimizing-gradient-descent/index.html#nesterovacceleratedgradient
Space, Right Arrow or swipe left to move to next slide, click help below for more details