← Tous les exercices
La descente complète : 20 pas jusqu'au creux
Partie 3 · ★★★
Regroupe la boucle dans une fonction descente(eta, nb_pas) qui part de w = 0, b = 0 et renvoie (pertes, w, b). Comme le notebook (ex.3, question 1.1) : 20 pas avec η = 3 doivent atteindre le creux de la partie 6, w ≈ 1,46 et b ≈ 0, avec des pertes qui commencent par 0,69, 0,50, 0,48.
La fonction gradient (par différences) est fournie.
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(___): pertes.append(perte(w, b)) pw, pb = gradient(w, b) w = w - eta * ___ b = b - eta * pb return pertes, w, b
Ctrl/⌘+Entrée