Versão 2: um paragrafo a mais na parte do Tensorflow - nao use a funçao de descida do gradiente implementada no Tensorflow.
Pode ser feito individualmente ou em grupos de ate 3 pessoas
data para entrega: até meia note de 18/4 (Domingo)
Nós vamos minimizar a função de 2 dimensões:
f(x_1,x_2) = (1-x_1)^2 + 100 (x_2 - x_1^2)^2
que é a função de Rosenbrock em 2D. https://en.wikipedia.org/wiki/Rosenbrock_function Essa não é uma função convexa. O ponto de minimo esta em [1,1] mas é difícil chegar nele. O gradiente no vale em formato de banana é muito pequeno e uma vez no vale, a decida do gradiente anda muito pouco a cada passo.
valor inicial: Assuma que o valor inicial da descida do gradiente é [0,0]
teste de convergência: vamos definir tolerancia como
tol = | f(x_{novo})-f(x_{velho}) |
Pare quando a tolerância for menor que 10^{-5} (1.e-5).
numero máximo de passos: interrompa a computação depois de 50.000 passos.
implemente a função que computa o gradiente de f
use o teste de convergência e o valor inicial acima
para cada um dos valores do learning rate abaixo plote os valores de f(x) dos passos da descida do gradiente, o número de vezes da atualização x e o valor final de x encontrado.
se voce quiser mostrar os valores do x no caminho da otimização (no plano 2D) este site http://louistiao.me/notes/visualizing-and-animating-optimization-algorithms-with-matplotlib/ tem vários exemplos de plotar os valores do x
mostre o que acontece quando o learning rate é muito grande e a descida do gradiente nao converge (na minha implementação um l.r de 1.e-2 já da erro) Não precisa gerar os gráficos da saída para este caso.
implemente uma politica de redução do learning rate, de tal forma que a cada passo da descida do gradiente o novo l.r. é o velho vezes 0.999 (ou seja o l.r. diminue em 1 milesimo a cada passo).
Rode a decisa do gradiente com esta politica com valor inicial de l.r = 5.e-3
Use o tensorflow para computar automaticamente o gradiente em vez de usar a sua função.
O tensorflow deve ser usado apenas para calcular o gradiente. O tensorflow tem sua propria implementação de descida do gradiente, a funçao tf.compat.v1.train.GradientDescentOptimizer NÃO use essa função. Voce deve usar sua propria implementação da descida do gradiente usada na parte 1.