← Tous les exercices
Comparer quatre pas η : lequel monte, lequel est le plus rapide ?
Partie 3 · ★★★★
On teste η = 0,3 ; 3 ; 12 et 30 sur 20 pas (descente est fournie). Pour chacun, deux diagnostics :
monte: les valeurs de η dont la perte remonte au premier pas (pertes[1] > pertes[0]) ;pas_sous_05: pour chaque η, l'indice du premier pas où la perte passe sous 0,5 (Nonesi jamais).
Le cours donne η = 30 en « pour aller plus loin » ; les résultats pour 30 sont calculés ici, pas lus dans la source.
def sigmoide(u): return 1 / (1 + math.exp(-u)) t = [1.5, 1.0, -0.5, -1.5, -1.0, 0.5] # température - 38 °C y = [1, 1, 1, 0, 0, 0] # pneumonie : 1 = oui, 0 = non def perte(w, b): a = [sigmoide(w * ti + b) for ti in t] p = [ai if yi == 1 else 1 - ai for ai, yi in zip(a, y)] return -sum(math.log(pi) for pi in p) / len(p) def gradient(w, b, e=1e-4): pw = (perte(w + e, b) - perte(w - e, b)) / (2 * e) pb = (perte(w, b + e) - perte(w, b - e)) / (2 * e) return pw, pb def descente(eta, nb_pas): w, b = 0.0, 0.0 pertes = [] for pas in range(nb_pas): pertes.append(perte(w, b)) pw, pb = gradient(w, b) w = w - eta * pw b = b - eta * pb return pertes, w, b etas = [0.3, 3, 12, 30] monte = [] pas_sous_05 = [] for eta in etas: pertes, w, b = descente(eta, 20) if pertes[___] > pertes[___]: monte.append(eta) pas_sous_05.append(next((i for i, p in enumerate(pertes) if p < ___), None))
Ctrl/⌘+Entrée