Illustration de l'agorithme du gradient

Soit une fonction simple f(x) = x^4 + 3 x ^3 + c

On cherche le minimum de cette fonction en regardant comment l'algorithme converge en fonction du parametres learning rate

In [6]:
import matplotlib.pyplot as plt
import numpy as np

max_iters   = 10000
precision   = 0.0001

# liste des valeurs du learning rate que l'on va observer
gammas       = np.linspace(0.001, 0.01, 10)

# Dérivée de la fonction dont on veut trouver le minimum

fct = lambda x: 4 * x**3 - 9 * x**2



def gradient(gamma):
    '''
    x_0 = 6
    x_t+1 = x_t - gamma * fct(x_t)
    '''
    
    iters       = 0
    cur_x       = 6
    previous_step_size = 1
    x = [] 

    while (previous_step_size > precision) & (iters < max_iters):
        x.append(cur_x)
        prev_x = cur_x
        cur_x -= gamma * fct(prev_x)
        previous_step_size = abs(cur_x - prev_x)
        iters+=1

    print("Gamma {}  min {:.4f} f(min) {:.4f}".format(gamma, cur_x, fct(cur_x)))
    return x


# Afficher les courbes de convergence pour les différentes valuers du learning_rate

fig, ax = plt.subplots(1,1, figsize = (12,6))
for gamma in gammas:
    x = gradient(gamma)
    plt.plot(x, label = gamma)

plt.legend()
plt.show()
Gamma 0.001  min 2.2547 f(min) 0.0965
Gamma 0.002  min 2.2523 f(min) 0.0470
Gamma 0.003  min 2.2515 f(min) 0.0306
Gamma 0.004  min 2.2511 f(min) 0.0220
Gamma 0.005  min 2.2509 f(min) 0.0178
Gamma 0.006  min 2.2507 f(min) 0.0132
Gamma 0.007  min 2.2494 f(min) -0.0118
Gamma 0.008  min 2.2495 f(min) -0.0102
Gamma 0.009000000000000001  min 2.2496 f(min) -0.0084
Gamma 0.01  min 2.2497 f(min) -0.0069
In [ ]: