···11-#import "utils.typ": comment, dontbreak, refneeded, todo
11+#import "utils.typ": dontbreak
22#import "@preview/fletcher:0.5.8": edge, node
33#import "@preview/fletcher:0.5.8"
44#import "@preview/diagraph:0.3.6"
···137137138138L'expression comporte deux hyperparamètres, à valeurs dans $]0, 1[$:
139139140140-/ Learning rate $alpha$: contrôle à quel point l'on favorise l'évolution de $Q$ ou pas. // Il est commun de progressivement baisser $alpha$, ce qui donne lieu à des phases plus "exploratives" ($alpha$ élevé, exploration de nouvelles actions) ou "exploitative" ($alpha$ faible, exploitation des récompenses connues) #refneeded
140140+/ Learning rate $alpha$: contrôle à quel point l'on favorise l'évolution de $Q$ ou pas.
141141/ Discount factor $gamma$: contrôle l'importance que l'on donne aux récompenses futures. Il est utile de commencer avec une valeur faible puis l'augmenter avec le temps @maxq-discount.
142142143143=== Difficultés liées à l'implémentation de la fonction coût
144144145145==== Tendances à la "tricherie" des agents
146146147147-Expérimentalement, on sait que des tendances "tricheuses" émergent facilement pendant l'entraînement #refneeded: l'agent découvre des séries d'actions qui causent un bug avantageux vis à vis du coût associé, soit parce qu'il y a un bug dans le calcul de l'état de l'environnement post-action, soit parce que la fonction coût ne prend pas suffisemment bien en compte toutes les possibilités de l'environnement (autrement dit, il manque de contraintes).
147147+Expérimentalement, on sait que des tendances "tricheuses" émergent facilement pendant l'entraînement: l'agent découvre des séries d'actions qui causent un bug avantageux vis à vis du coût associé, soit parce qu'il y a un bug dans le calcul de l'état de l'environnement post-action, soit parce que la fonction coût ne prend pas suffisemment bien en compte toutes les possibilités de l'environnement (autrement dit, il manque de contraintes).
148148149149-Dans le cas de la robotique, cela arrive particulièrement souvent #refneeded, et il faut donc un simulateur qui soit suffisamment réaliste.
149149+Dans le cas de la robotique, cela arrive particulièrement souvent, et il faut donc un simulateur qui soit suffisamment réaliste.
150150151151==== Sous-spécification de la fonction coût
152152···170170#let proba = $bb(P)$
171171#let setbuilder = (content, with) => ${ #content thick mid(|) thick #with }$
172172173173-Théoriquement, le score associé à un couple état/action est souvent réduit à l'intervalle $[0, 1]$ et assimilé à une distribution de probabilité: $Q$ est une fonction de $S times A$ vers $[0, 1]$ qui renvoie la probabilité qu'a l'agent à choisir une action en étant dans un état de l'environnement.
174174-175175-176173On note dans le reste de cette section:
177174178175/ $A$: l'ensemble des actions
···181178/ $M: S times A -> S$: le moteur de simulation physique, qui applique l'action à un état de l'environnement et envoie le nouvel état de l'environnement
182179/ $Pi: S -> A$: une politique
183180/ $Pi^*: S -> A$: la meilleure politique possible, celle que l'on cherche à approcher
184184-/ $R: S -> RR^+$: sa fonction de récompense #todo[incohérent! c'est sensé être $Q$, qu'on a assimilé à une distrib de proba :/]
181181+/ $R: S -> RR^+$: sa fonction de récompense
185182/ $Q_pi: S times A -> [0, 1]$: la distribution de probabilité d'une politique $pi$, qu'on suppose Markovienne (elle ne dépend que de l'état dans lequel on est). $Q_pi (s_t, a_t)$ est la probabilité que $pi$ choisisse $a_t$, _quand on est dans l'état_ $s_t$ ($s_t$ est l'état *pré*-action, et non post-action)
186183/ $Q$ (resp. $Q^*$): $Q_Pi$ (resp. $Q_(Pi^*)$), pour alléger les notations
187184// $R$: $R_Pi$
···283280284281285282 [
286286- #todo[Pas clair]
287287-288283 Notamment, les espérances le long d'un chemin, notées $inline(exp_(s_0, a_0, ...))$ dans @trpo, sont dénotées ici par une opération-sur-ensemble usuelle#footnote[d'autres exemples d'"opérations-sur-ensemble" sont $sum_(x in RR)$ ou $product_(n in NN)$, par exemple.], avec $exp_(c in cal(C))$. De même, la notation $inline(exp_(s_0, a_0, ... ~ pi))$ est dénotée $exp_(c ~ pi in cal(C))$ et explicitée après @eta-exp-definition.
289284290285 Dans la documentation de _OpenAI Spinning Up_ (citation "@trpo-openai"), les espérances sont notées $op(E, limits: #true)_(s, a ~ pi)$, ce qui correspond à faire une espérance _le long_ de tout chemin: cela correspond ici à $exp_(c ~ pi in cal(C)) sum_(t=0)^oo dots.c$.
···677672- Couple maximal sur les commandes envoyées au moteurs
678673- Limite sur la vélocité du robot
679674- Prévention des auto-collisions (par exemple, le bras qui tape la jambe)
680680-- #todo[Ajouter @maciej]
675675+- Limite sur les magnitudes des forces de réaction du sol @maciej
681676- etc.
682677683678···731726 scale(7%, reflow: true, diagraph.render(read("./isaac-deptree.dot"))),
732727)
733728734734-Bien que toutes ces dépendances puissent être spécifiées avec des contraintes de version strictes @lockfiles pour éviter des changements imprévus de comportement du code venant des bibliothèques, beaucoup celles-ci ont besoin de compiler du code C++ _à l'installation_#footnote[Pour des raisons de performance @cpp-python, certaines bibliothèques implémentent leurs fonctions critiques en C++. C'est par exemple le cas de NumPy #refneeded]: fixer la version de la bibliothèque ne suffit pas donc à guarantir la reproductibilité de la compilation de l'arbre des dépendances.
729729+Bien que toutes ces dépendances puissent être spécifiées avec des contraintes de version strictes @lockfiles pour éviter des changements imprévus de comportement du code venant des bibliothèques, beaucoup celles-ci ont besoin de compiler du code C++ _à l'installation_#footnote[Pour des raisons de performance @cpp-python, certaines bibliothèques implémentent leurs fonctions critiques en C++. C'est par exemple le cas de NumPy @numpy]: fixer la version de la bibliothèque ne suffit pas donc à guarantir la reproductibilité de la compilation de l'arbre des dépendances.
+2-2
rapport/gz-unitree.typ
···11#import "@preview/zebraw:0.5.5"
22#import "@preview/fletcher:0.5.8": diagram, edge, node
33#import "@preview/cetz:0.4.2"
44-#import "./utils.typ": dontbreak, refneeded, trimmed-image
44+#import "./utils.typ": dontbreak, trimmed-image
55#show figure: set block(spacing: 2em)
66#let zebraw = (..args) => zebraw.zebraw(
77 lang: false,
···419419 [Respectivement $q$, $dot(q)$, $tau_"ff"$, $K_p$ et $K_d$],
420420)
421421422422-Cette équation se rapproche des modèles de type PID (_proportional-integrative-derivative_) @control-pid, avec le terme intégratif remplacé par $tau_"ff"$, ce qui en fait une expression plus adaptée pour les politiques avec des mouvements non-brusques: le terme intégratif apporte une capacité d'instabilité qui complexifie l'entraînement #refneeded
422422+Cette équation se rapproche des modèles de type PID (_proportional-integrative-derivative_) @control-pid, avec le terme intégratif remplacé par $tau_"ff"$, ce qui en fait une expression plus adaptée pour les politiques avec des mouvements non-brusques: le terme intégratif apporte une capacité d'instabilité qui complexifie l'entraînement
423423424424425425#figure(
+3-3
rapport/nix.typ
···11-#import "utils.typ": comment, refneeded, todo
11+#import "utils.typ": comment, todo
2233== Reproductibilité
44···29293030=== Contenir les effets de bords
31313232-En dehors du besoin de vérifiabilité du monde de la recherche, la reproductibilité est une qualité recherchée dans certains domaines de programmation @reproducibility #todo[Lesquels?].
3232+En dehors du besoin de vérifiabilité du monde de la recherche, la reproductibilité est une qualité recherchée en programmation @reproducibility.
33333434-Il existe donc depuis longtemps #todo[préciser + #refneeded] des langages de programmation dits _fonctionnels_, qui, de manière plus ou moins stricte, limitent les effets de bords. Certains langages font également la distinction entre une fonction _pure_ (sans effets de bord) et une fonction classique @fortran-pure. Certaines fonctions, plutôt appelées _procédures_, sont uniquement composées d'effet de bord et ne renvoie pas de valeur @ibm-function-procedure-routine.
3434+Il existe donc des langages de programmation dits _fonctionnels_, qui, de manière plus ou moins stricte, limitent les effets de bords. Certains langages font également la distinction entre une fonction _pure_ (sans effets de bord) et une fonction classique @fortran-pure. Certaines fonctions, plutôt appelées _procédures_, sont uniquement composées d'effet de bord et ne renvoie pas de valeur @ibm-function-procedure-routine.
353536363737=== État dans le domaine de la robotique
+1-1
rapport/proofs.typ
···11-#import "utils.typ": comment, refneeded
11+#import "utils.typ": comment
22#show math.equation.where(block: true): set block(spacing: 2em)
3344== Cas dégénéré de $D_"KL" (Q, Q') = 0$ sans utilisation de $max$ <dkl-zero>