this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Continue rapport

+44 -39
+44 -39
rapport/context.typ
··· 26 26 27 27 La phase d'apprentissage consiste à trouver, par des cycles d'essai/erreur, quelles sont les meilleures actions à prendre en fonction de l'environnement actuel, avec meilleur définit comme "qui minimise le coût" (ou maximise la récompense): 28 28 29 - #diagram( 30 - node((0, 0))[Agent], 31 - edge((0, 0), (1, 0), "->")[Action], 32 - node((1, 0))[Environnement], 33 - edge((1, 0), (2, 0), "-->")[Fonction coût], 34 - node((2, 0))[Score], 29 + #diagram({ 30 + node((0, 0))[Agent] 31 + edge((0, 0), (1, 0), "->")[Action] 32 + node((1, 0))[Environnement] 33 + edge((1, 0), (2, 0), "-->")[Fonction coût] 34 + node((2, 0))[Score] 35 35 edge((2, 0), (0, 0), "->", bend: 45deg)[Mise à jour] 36 - ) 36 + }) 37 37 38 38 Cette technique est particulièrement adaptée au problèmes qui se prêtent à une modélisation type "jeu vidéo", dans le sens où l'agent représente le personnage-joueur, et le coût un certain score, qui est condition de victoire ou défaite. 39 39 ··· 361 361 On peut visualiser ce calcul ainsi: 362 362 363 363 #let height = 2 364 - #diagram( 364 + #diagram({ 365 365 // Prior path 366 - node((0, 0))[$dots.c$], 367 - edge("->")[$a_(t-2)$], 368 - node((1, 0))[$s_(t-1)$], 369 - edge("->")[$a_(t-1)$], 366 + node((0, 0))[$dots.c$] 367 + edge("->")[$a_(t-2)$] 368 + node((1, 0))[$s_(t-1)$] 369 + edge("->")[$a_(t-1)$] 370 370 371 371 // Main-branch path 372 - node((2, 0), name: <break>)[$s_t$], 373 - edge("-")[], 374 - node((3.5, 0)), 375 - edge("->", label-pos: 0%)[$a_t$], 376 - node((4.5, 0))[$sum_(i=t+1)^oo gamma^t r(s_i)$], 372 + node((2, 0), name: <break>)[$s_t$] 373 + edge("-")[] 374 + node((3.5, 0)) 375 + edge("->", label-pos: 0%)[$a_t$] 376 + node((4.5, 0))[$sum_(i=t+1)^oo gamma^t r(s_i)$] 377 377 378 378 // Bottom-branch path 379 - node(name: <bottom>, (4.5, +1.5))[$sum_(i=t+1)^oo gamma^t r(s'_i)$], 380 - edge(<break>, <bottom>, "->", bend: -25deg)[$a'_t$], 379 + node(name: <bottom>, (4.5, +1.5))[$sum_(i=t+1)^oo gamma^t r(s'_i)$] 380 + edge(<break>, <bottom>, "->", bend: -25deg)[$a'_t$] 381 381 382 382 // top-branch path 383 - node(name: <top>, (4.5, -1.5))[$sum_(i=t+1)^oo gamma^t r(s''_i)$], 384 - edge(<break>, <top>, "->", bend: 25deg)[$a''_t$], 383 + node(name: <top>, (4.5, -1.5))[$sum_(i=t+1)^oo gamma^t r(s''_i)$] 384 + edge(<break>, <top>, "->", bend: 25deg)[$a''_t$] 385 385 386 386 // Expectation bar V(s) 387 - node((5, height)), 388 - edge("--"), 389 - node((1.85, height)), 390 - edge("-", label-side: left, label-pos: 75%)[$exp$], 391 - node((1.85, -height)), 392 - edge("--")[$V(s_t)$], 393 - node((5, -height)), 387 + node((5, height)) 388 + edge("--") 389 + node((1.85, height)) 390 + edge("-", label-side: left, label-pos: 75%)[$exp$] 391 + node((1.85, -height)) 392 + edge("--")[$V(s_t)$] 393 + node((5, -height)) 394 394 395 395 // Expectation bar Q(s, a) 396 - node((5, 0.5)), 397 - edge("--"), 398 - node((3.25, 0.5)), 399 - edge("-", label-side: left, label-pos: 75%)[$exp$], 400 - node((3.25, -0.5)), 401 - edge("--")[$Q(s_t, a_t)$], 402 - node((5, -0.5)), 403 - ) 396 + node((5, 0.5)) 397 + edge("--") 398 + node((3.25, 0.5)) 399 + edge("-", label-side: left, label-pos: 75%)[$exp$] 400 + node((3.25, -0.5)) 401 + edge("--")[$Q(s_t, a_t)$] 402 + node((5, -0.5)) 403 + }) 404 404 405 405 Pour calculer $A_(p, r)(s, a)$, on regarde l'espérance des récompenses cumulées pour tout chemin commençant par $s$, et on la compare à celle pour tout chemin commençant par $M(s, a)$ 406 406 ··· 572 572 573 573 #section[Par _clipping_ _(PPO-Clip)_] 574 574 575 - _PPO-Clip_ enlève la contraînte sur le problème d'optimisation. 575 + _PPO-Clip_ lève la contraînte du problème d'optimisation. 576 576 577 577 On préfère changer l'objectif la quantité à optimiser, pour limiter intrinsèquement l'ampleur des modifications, en résolvant le problème d'optimisation suivant @ppo-openai 578 578 ··· 601 601 La complexité de l'expression, et la présence d'un $min$ au lieu de simplement un $op("clip")$ est dûe au fait que l'avantage $A_(cal(P)', R) (s, a)$ peut être négatif: 602 602 603 603 / Si l'avantage est positif: #fletcher.diagram( 604 - height: 1em, 604 + spacing: (2.7em, 2em), 605 605 edge((-5, 0), "->", (5, 0)), 606 606 edge((-5, 0.25), "-", (-5, -0.25), label-side: left)[$0$] 607 607 ) ··· 611 611 quad 1 + epsilon 612 612 ) A_(cal(P)', R)(s, a) 613 613 $ 614 - / Si l'avantage est négatif: $ 614 + / Si l'avantage est négatif: #fletcher.diagram( 615 + spacing: (2.7em, 2em), 616 + edge((-5, 0), "->", (5, 0)), 617 + edge((-5, 0.25), "-", (-5, -0.25), label-side: left)[$0$] 618 + ) 619 + $ 615 620 L(s, a, cal(P), cal(P)', R) = max( 616 621 1 - epsilon, quad 617 622 (Q_cal(P)' (s, a)) / (Q_cal(P) (s, a))