···22#import "@preview/fletcher:0.5.8": node, edge
33#import "@preview/fletcher:0.5.8"
4455-#let diagram = (..args) => pad(y: 3em, align(center, fletcher.diagram(..args)))
55+#show figure: set block(spacing: 4em)
66+#let diagram = (caption: none, ..args) => figure(caption: caption, fletcher.diagram(..args))
6778#show math.equation.where(block: true): set block(spacing: 2em)
89···443444444445Il est théoriquement possible d'utiliser $A$ pour optimiser une politique, en maximisant sa valeur à un état donné:
445446446446-#diagram(
447447+#diagram(caption: [Boucle d'entraînement],
447448 node((0, 0))[$s_t$],
448449 edge("-"),
449450 node(name: <policy>, (0, -1))[$cal(P)$],
···451452 node((1, -2))[$a_t$],
452453 edge("->", corner: right)[$M$],
453454 node(name: <final>, (2, 0))[$s_(t+1)$],
454454- edge((2, 0), (2, .75), (0, .75), (0, 0), "-->", label-side: left)[itération],
455455+ edge(<final>, (0, 0), "-->", label-side: left)[itération],
455456 // edge("d,d,l,l,l,u,u,u", <policy>, "->", label-pos: 33%, label-side: left, align(center, [$Q_cal(P)(s_(t+1), argmax_(a in A) A_(cal(P), R)(s_(t+1), a)) <- A_(cal(P), R) (dots)$ \ Mise à jour]))
456457 // edge("d,d,l,l,l,u,u,u", <policy>, "->", label-pos: 37%, label-side: left, align(center)[$argmax_(a in A) A_(cal(P), R)(s_(t+1), a)$ \ mise à jour de $cal(P)$])
457457- edge("d,d,l,l,l,u,u,u", <policy>, "->", label-pos: 37%, label-side: left, align(center)[$Q_cal(P)(s_(t+1), a_(t+1)^*) &= A_(cal(P), R)(s_(t+1), a_(t+1)^*)$ \ mise à jour de $cal(P)$])
458458-)
458458+ edge("d,l,l,l,u,u", <policy>, "->", label-pos: 33%, label-side: left, align(center)[
459459+ // mise à jour de $cal(P)$ \
460460+ $Q_cal(P)(s_(t+1), a_(t+1)^*) <- A_(cal(P), R)(s_(t+1), a_(t+1)^*)$
461461+ ])
462462+) <policy-update-loop>
459463460464Avec
461465···499503Il existe plusieurs manières de mesurer l'écart entre deux distributions de probabilité, dont notamment la _divergence de Kullback-Leibler_, aussi appelée entropie relative @kullback-leibler @kullback-leibler2:
500504501505$
502502-D_"KL" (P || P') := sum_(x in cal(X)) P(x) log P(x) / P'(x)
506506+D_"KL" (P || P') := sum_(x in cal(X)) P(x) log P(x) / (P'(x))
503507$
504508505509Avec $cal(X)$ l'espace des échantillons et $P, P'$ deux distributions de probabilité sur celui-ci. Dans notre cas, $cal(X) = S times A$,
···562566563567==== _Proximal Policy Optimization_
564568569569+La _PPO_ repose sur le même principe de stabilisation de l'entraînement par limitation de l'ampleur des changements de politique à chaque pas.
565570571571+#section[Avec pénalité _(PPO-Penalty)_]
566572573573+#section[Par _clipping_ _(PPO-Clip)_]
574574+575575+_PPO-Clip_ évite le calcul d'une distance K-L#footnote[Kullback-Leibler] et enlève la contraînte sur le problème d'optimisation.
576576+577577+On préfère changer la mise à jour de la politique, pour limiter directement dans son expression l'ampleur de la modification à $Q_cal(P) (s_(t+1), a_(t+1)^*)$ (cf @policy-update-loop)
578578+579579+On utilise cette mise à jour @ppo-openai
580580+581581+$
582582+Q_cal(P) (s_(t+1), a_(t+1)) <- min(
583583+584584+)
585585+$
567586568587569588== Le H1v2 d'_Unitree_