Comment le raisonnement par étapes aide les réseaux neuronaux à calculer
(quantamagazine.org)- Les grands modèles de langage échouent souvent lorsqu’on leur demande de donner directement la réponse à des problèmes qui nécessitent plusieurs étapes, comme de longs calculs arithmétiques, mais ils peuvent résoudre des problèmes auparavant difficiles si on leur fait produire une résolution étape par étape
- En 2022, le chain-of-thought prompting de chercheurs de Google, une méthode simple consistant à faire afficher les étapes intermédiaires, s’est largement répandu, mais les raisons de son efficacité restent un sujet d’analyse
- Des chercheurs examinent les capacités et les limites des Transformers à l’aide de la théorie de la complexité computationnelle, et montrent qu’une architecture optimisée pour le traitement parallèle peut limiter la puissance de calcul lorsqu’elle doit produire une réponse immédiate
- Selon les travaux théoriques de Merrill et Sabharwal, le chain of thought commence à être réellement utile lorsque le nombre d’étapes intermédiaires augmente proportionnellement à la taille de l’entrée, et beaucoup de problèmes nécessitent encore davantage d’étapes
- Ces résultats ne signifient pas que les modèles réels apprennent nécessairement ces solutions pendant l’entraînement, mais ils fournissent un cadre pour comparer de nouvelles architectures de réseaux neuronaux sans surestimer les limites des Transformers
Pourquoi la résolution étape par étape modifie les performances des modèles
- Les humains n’essaient pas de réussir d’un seul coup un problème comme l’addition de nombres à 20 chiffres ; ils construisent le calcul de la colonne des unités vers la gauche
- Les grands modèles de langage peuvent eux aussi réussir des problèmes arithmétiques en quelques étapes, mais échouent fréquemment sur des problèmes qui exigent de nombreuses étapes, comme l’addition de grands nombres
- En 2022, des chercheurs de Google ont montré qu’en demandant à un modèle de générer une solution étape par étape, il pouvait résoudre des problèmes qui semblaient auparavant difficiles
- Cette méthode, appelée chain-of-thought prompting, s’est rapidement diffusée, mais les chercheurs analysent encore les raisons de son efficacité
Comment les Transformers sont devenus puissants, et leurs contraintes structurelles
- Les grands modèles de langage reposent sur des réseaux neuronaux artificiels qui représentent et traitent les mots sous forme de suites de nombres
- Avant l’apprentissage, les paramètres démarrent avec des valeurs aléatoires
- Le modèle prédit le mot suivant à partir d’un grand volume de textes issus d’Internet, puis ajuste ses paramètres pour réduire l’écart avec le texte réel
- Le Transformer, introduit par des chercheurs de Google en 2017, a considérablement élargi la recherche sur les modèles de langage
- Avant les Transformers, les réseaux neuronaux avaient au plus quelques centaines de millions de paramètres
- Les plus grands modèles actuels fondés sur des Transformers comptent plus de 1 000 milliards de paramètres
- Le composant central du Transformer est l’attention head
- Il parcourt rapidement l’ensemble du texte d’entrée et repère les liens entre mots utiles pour prédire le mot suivant
- Ensuite, un feedforward network effectue les calculs lourds
- L’architecture qui utilise plusieurs couches d’attention heads et de feedforward networks permet d’effectuer simultanément les calculs pour chaque mot pendant l’apprentissage
- Grâce à ce parallélisme, l’entraînement peut être distribué sur de grands volumes de données et de nombreux processeurs
- David Chiang explique que, pour exploiter de grands jeux de données, les modèles doivent eux aussi être grands, et que sans parallélisation l’entraînement ne serait pas praticable
- En usage courant après l’entraînement, un Transformer produit une sortie mot par mot, puis ajoute cette sortie à l’entrée pour générer le mot suivant
- Comme l’architecture reste optimisée pour le traitement parallèle, les chercheurs ont commencé à examiner si ce parallélisme se paie par une perte de puissance de calcul
La puissance de calcul des Transformers vue par la théorie de la complexité
- Comme il est difficile d’analyser directement le processus d’apprentissage des réseaux neuronaux, certains chercheurs supposent que les paramètres peuvent être fixés aux valeurs souhaitées et analysent la puissance de calcul intrinsèque des Transformers
- Cette approche traite le Transformer comme une certaine forme d’ordinateur programmable
- Quelles fonctions peut-il calculer ?
- Quels types de problèmes peut-il résoudre ?
- En 2019, Pablo Barceló et ses coauteurs ont prouvé qu’un Transformer idéalisé doté d’un nombre fixe de paramètres pouvait, avec un réglage approprié et une réinjection répétée de ses sorties, être aussi puissant qu’une machine de Turing
- Ce résultat constituait un point de départ important, mais reposait sur des hypothèses peu réalistes susceptibles de surestimer la puissance des Transformers réels
- Par la suite, les chercheurs ont commencé à construire des cadres théoriques plus réalistes
Les limites d’un Transformer qui doit répondre immédiatement
- William Merrill et Ashish Sabharwal ont analysé, à l’aide de la complexité des circuits (circuit complexity), les limites engendrées par l’architecture parallèle des Transformers
- Ils ont étudié le cas où un Transformer ne peut pas réinjecter sa sortie comme entrée, et où la première sortie doit être la réponse finale
- Dans ce cadre théorique, un Transformer ne peut pas résoudre des problèmes de calcul situés en dehors de certaines classes de complexité
- Un exemple relativement simple : on estime que de nombreux problèmes mathématiques, comme la résolution d’équations linéaires, se trouvent hors de cette classe
- Le parallélisme est un avantage qui rend l’entraînement possible, mais il devient un coût lorsqu’une réponse immédiate est exigée
- Merrill explique que, si l’on utilise un Transformer en lui fournissant une entrée et en attendant directement une réponse, il est assez faible
Comment le chain of thought contourne ces limites
- Les résultats de Merrill et Sabharwal ont conduit à se demander jusqu’où un Transformer devient plus puissant lorsqu’il peut réutiliser ses sorties
- Le raisonnement chain-of-thought des modèles de langage réels dépend de la formulation du prompt, mais lorsqu’un modèle produit une réponse étape par étape, il peut en principe réutiliser les résultats intermédiaires lors du passage suivant dans le Transformer
- Dans un article de mai 2023, une équipe de l’Université de Pékin a étudié certains problèmes mathématiques qui, dans le cadre de Merrill et Sabharwal, devraient être impossibles pour un Transformer ordinaire
- Elle a montré qu’en autorisant des étapes intermédiaires, un Transformer pouvait résoudre ces problèmes
- En octobre 2023, Merrill et Sabharwal ont publié une étude théorique analysant plus en détail la puissance de calcul du chain of thought
- Elle quantifie la manière dont la puissance de calcul supplémentaire varie selon le nombre d’étapes intermédiaires dont dispose le Transformer avant de produire la réponse finale
- Comme dans l’exemple de l’addition de nombres à deux chiffres, certains problèmes nécessitent davantage d’étapes intermédiaires à mesure que l’entrée grandit
- La méthode la plus simple pour additionner deux nombres à 20 chiffres exige deux fois plus d’étapes intermédiaires d’addition que pour additionner deux nombres à 10 chiffres
Les étapes intermédiaires aident, mais ne sont pas gratuites
- Merrill et Sabharwal analysent que, si les étapes intermédiaires sont très peu nombreuses, le gain obtenu par le Transformer reste limité
- Le chain of thought commence à produire un effet réel lorsque le nombre d’étapes intermédiaires augmente proportionnellement à la taille de l’entrée
- Beaucoup de problèmes exigent que le nombre d’étapes intermédiaires augmente bien plus vite que la taille de l’entrée
- Le chain of thought n’est donc pas une solution universelle
- En principe, il peut permettre de résoudre des problèmes plus difficiles
- Mais cela nécessite un effort de calcul substantiel
- Merrill dit s’intéresser à plusieurs méthodes permettant de contourner les limites d’un Transformer en une seule étape, et que le chain of thought n’est peut-être pas la méthode la plus économique
Points de vigilance pour l’application aux modèles réels
- La portée de ce que l’analyse théorique peut dire sur les modèles de langage réels est limitée
- Prouver qu’un Transformer peut en principe résoudre un problème donné ne signifie pas qu’un modèle de langage réel apprend nécessairement cette solution pendant l’entraînement
- Les résultats portant sur les limites des Transformers reposent eux aussi sur des critères exigeants
- Ils signifient qu’aucun Transformer ne peut résoudre parfaitement un problème donné dans tous les cas
- Daniel Hsu explique que certains cas particuliers précis peuvent être bien traités
- Ces analyses fournissent un cadre pour comparer d’autres architectures de réseaux neuronaux susceptibles de remplacer les Transformers
- Si l’analyse par la théorie de la complexité fait apparaître qu’un réseau est plus puissant, cela peut constituer un indice qu’il sera aussi meilleur en conditions réelles
- Alors que les modèles de langage sont utilisés dans de nombreuses applications concrètes, il faut garder à l’esprit qu’il existe beaucoup de tâches dans lesquelles ils ne sont pas performants
1 commentaires
Avis sur Hacker News
Je pense qu’il ne faut pas comparer la chaîne de pensée (chain-of-thought) à une chaîne rigoureuse de logique/mathématiques.
Le raisonnement étape par étape du modèle ne confère pas ce niveau de rigueur à la sortie, et la solidité de la chaîne n’est que celle du contexte pertinent ; c’est donc bien plus faible que les mathématiques/la logique humaines.
En tant que personne qui manipule quotidiennement des modèles dans ce domaine sans en construire directement, je ne vois pas les liens nécessaires enseignés en mathématiques de base, et je vois souvent les modèles échouer d’une façon qu’un humain passé un certain âge n’aurait pas.
Au final, cela ressemble davantage à une recherche de contexte pertinent, certes puissante, qu’au raisonnement logique humain. Un humain peut partir de très peu de concepts et, assis sur une chaise, atteindre par pur raisonnement des conclusions en béton très éloignées, tandis qu’un modèle semble plutôt sauter d’un contexte à l’autre.
Quiconque a fait sérieusement des statistiques bayésiennes sait qu’un échantillonneur a besoin d’un bref préchauffage avant de produire des échantillons efficacement. Dans la chaîne de pensée, il semble se passer quelque chose de similaire : le modèle doit errer un moment avant d’entrer dans le bon voisinage où échantillonner la bonne réponse.
Beaucoup de gens pensent avoir suffisamment réfléchi à des croyances douteuses, mais ce n’est pas le cas. Ils utilisent le contexte pour deviner la pensée/le mot suivant, et arrivent souvent à la conclusion qu’ils avaient dès le départ.
Quand on parle de conclusion en béton, je pense qu’en pratique elle est d’abord fabriquée intuitivement, puis fortement vérifiée : les définitions sont-elles assez claires, les sauts de raisonnement sont-ils justifiés, etc.
Ce que j’aimerais vraiment voir, c’est comment apprendre aux LLM à transformer des phrases anglaises ambiguës en une forme utilisable par un moteur de raisonnement formel.
Par exemple, plutôt que de demander directement à un LLM « combien de terrains de football tiennent dans l’Angleterre », il vaut souvent mieux lui demander d’écrire du code Python qui fait le calcul en supposant que
get_size_football_field()etget_size_England()existent et renvoient des valeurs en mètres carrés.Au-delà d’environ 10 lignes de code Go, je n’arrive plus à raisonner, et mes nombreuses tentatives de résolution de puzzles pour le plaisir me l’ont clairement montré.
Nous avons une boucle auditive, et face à un problème complexe, nous répétons une sorte d’incantation du type « maintenant que je sais XYZ, quelle est la suite… » jusqu’à ce qu’une bonne étape suivante nous vienne, puis nous l’ajoutons au contexte.
Simplement, pour l’instant, la fonction de transition est bien meilleure chez les humains.
Elle écrit le raisonnement dans le contexte pour pouvoir s’y référer plus facilement ensuite ; ce n’est bien sûr qu’une hypothèse.
Une explication simplifiée, que j’ai l’impression d’avoir entendue chez Karpathy, est que les modèles Transformer ne calculent que lorsqu’ils génèrent (décodent) des tokens.
Donc, en utilisant une chaîne de pensée pour générer davantage de tokens, on donne au modèle plus de temps pour « réfléchir ». Bien sûr, cette explication ne couvre pas toutes les nuances.
Pour une complétion courte, l’espace des possibilités plausibles est beaucoup plus vaste, comme
A B1,A B2. Si on demande une réponse courte à une question subtile, une réponse réfléchie, une réponse qui paraît correcte en surface ou un baratin convaincant sont tous possibles.En revanche, si on force le modèle à expliquer son raisonnement, l’espace des complétions plausibles se réduit. On peut partir d’un baratin convaincant et, si on le pousse honnêtement jusqu’au bout, finir par conclure qu’il faut se contredire.
C’est similaire à la raison pour laquelle, quand on réfute une croyance nocive chez une personne honnête, il fonctionne bien de lui faire dérouler directement les conséquences de cette croyance et de suivre avec elle les effets de ce qui semblait séduisant sans trop y réfléchir.
C’est aussi pour cela qu’il est efficace, en prompt engineering, de remplir le prompt d’éléments qui réduisent l’espace des complétions plausibles.
Même si l’on pose la question de raisonnement la plus complexe, la quantité de calcul nécessaire pour générer le token suivant est la même que pour la question oui/non la plus simple ; c’est une contrainte structurelle.
Faire générer au LLM des données de « brouillon » à utiliser pour le calcul, afin qu’il prête attention aux informations pertinentes, est une façon de contourner cette limite de coût constant. Plus la tâche est difficile, plus il faut de brouillon, afin de laisser davantage de contexte pertinent pour les tokens futurs.
En revanche, j’ai réalisé que la mémoire de travail du LLM est limitée aux valeurs d’activation, et que cela peut devenir un goulot d’étranglement. Le modèle peut étendre sa mémoire de travail en écrivant des résultats partiels dans la sortie puis en les relisant.
Par exemple, si on lui dit « pense à un nombre mais ne le dis pas », il n’a nulle part où stocker ce nombre. Il n’a pas de stockage temporaire en dehors de la bande. Mais si on lui dit « pense étape par étape », il stocke les résultats intermédiaires — c’est-à-dire ses pensées — sur la bande, ce qui lui donne de l’espace de stockage supplémentaire pour réfléchir.
Il y a bien un aspect « ajouter du calcul », mais l’essentiel est de structurer le processus pour que le modèle ne se concentre que sur une portée limitée lorsqu’il prend une décision.
En pratique, cela revient à créer une structure arborescente de décisions qui s’appuient les unes sur les autres. En générant des tokens intermédiaires, le modèle peut se concentrer uniquement sur un ensemble plus petit de décisions déjà repliées.
Cela dit, cela peut aussi créer un comportement anticipatoire où les étapes intermédiaires sont biaisées par un mauvais résultat attendu par le modèle ; en pratique, c’est donc un peu plus compliqué.
L’explication selon laquelle « l’étude formelle du calcul a commencé en 1936 avec la machine de Turing de Turing » devrait remonter plus loin
Il y a la logique combinatoire de Moses Schönfinkel dans les années 1920 https://en.wikipedia.org/wiki/Moses_Sch%C3%B6nfinkel et le lambda-calcul d’Alonzo Church au début des années 1930 https://encyclopediaofmath.org/wiki/Lambda-calculus
Cela dit, ces modèles sont moins adaptés comme fondements de la théorie de la complexité computationnelle
Aristotle a probablement été l’une des premières personnes à tenter de formaliser la pensée structurée
Le dispositif de calcul de Turing formalisait la manière dont un mathématicien humain manipule des symboles selon des règles formelles pour résoudre des problèmes par le calcul, et s’inscrivait dans une longue lignée de réflexions issues de la même expérience et de la question de savoir à quel point elle était facile à mécaniser
Le premier à l’avoir effectivement mis en œuvre pour l’arithmétique fut Pascal
À mon avis, les deux modes du discours sur les LLM — « ils sont conscients ! » et « ce ne sont que des prédicteurs du prochain token avec un dataset impressionnant » — viennent en général de deux groupes différents
D’un côté, les personnes qui ont d’abord découvert les LLM puis appris les bases du machine learning ; de l’autre, celles qui ont d’abord appris les bases du machine learning puis découvert les LLM actuels
Je fais partie du second groupe, mais il existe réellement un risque que des idées préconçues sur les bases empêchent de voir la vue d’ensemble, donc je salue le débat en lui-même
Concernant la chaîne de pensée, je sais au moins qu’une grande partie des résultats de l’article original n’ont ensuite pas été bien reproduits dans des tentatives ultérieures. Je ne sais pas si c’est dû à la particularité de modèles qui changent tous les jours ou s’il y a une raison plus profonde
Mais quand je me suis plaint autrefois à mon directeur de thèse que les gens du machine learning semblaient mal connaître les anciens travaux en machine learning et en IA, ce directeur, qui avait plus de 30 ans de carrière de recherche, m’a répondu que cette plainte existait déjà quand il était doctorant
En IA, il y a énormément de travaux sur une très longue période — environ 80 ans si l’on compte depuis Pitts et McCulloch, et longtemps aussi même en partant de Turing — au point qu’il est très difficile de suivre ce que font les autres tout en creusant son propre sujet
Par exemple, si l’on ouvre un livre sur l’apprentissage par renforcement, il traite de problèmes quasiment identiques à ceux de la planification (planning), avec des hypothèses très similaires d’espaces d’états et d’actions, mais parfois comme si le domaine de la planification n’existait pas
Cela dit, ce sont bien des prédicteurs du prochain token :P
Quand on voit qu’un Transformer, approximation aussi pauvre et totalement sans état, peut produire des résultats aussi impressionnants, on n’a pas l’impression qu’il y ait une recette secrète particulière derrière tout ça
Je pensais que c’était évident. Les LLM n’ont pas de voix intérieure ni d’images mentales comme les humains, ils ne peuvent donc pas d’abord réfléchir entièrement au problème dans leur tête avant de répondre
Donc, si l’on utilise la zone de sortie réelle comme une sorte de bloc-notes, ils peuvent couvrir un espace de raisonnement plus large avant de donner une réponse, ce qui ressemble à la manière dont les humains procèdent
Quand on pose une question donnée avec un prompt du type « réfléchis étape par étape », on voit qu’ils produisent aussi des pensées provisoires inutiles dans la réponse finale. C’est exactement ce que nous faisons quand nous résolvons un problème auquel nous ne pouvons pas répondre immédiatement
Les humains notent aussi sur papier, avec un stylo, des pensées et réponses provisoires ou intermédiaires. Les LLM n’ont pas cet outil, mais peuvent utiliser leur sortie de manière similaire
Certains prompts de Tree of Thoughts font produire deux types de sorties au LLM : l’une consiste à « penser avec une voix intérieure », l’autre est la sortie destinée à être montrée à l’humain
Leur donner la capacité d’appeler des méthodes ou de « googler » peut aussi être vu comme une manière d’effectuer de la pensée et du raisonnement avant de produire la réponse destinée à l’utilisateur
Le modèle ne pense pas. Il ne fait que prédire une sortie à partir du contexte d’entrée
Donc, s’il y a un problème à résoudre de manière itérative, il faut stocker les étapes intermédiaires dans le contexte. Sinon, ces étapes n’ont nulle part où aller
Je ne vois pas pourquoi le fait de prédire une sortie à partir d’une entrée mènerait à croire qu’il ne peut pas penser. Il se peut que toute pensée soit cela, et nous n’en savons rien
On peut examiner la plausibilité de
11 + 31 = 24pour une raison simpleLa réponse est un nombre, et le fait qu’il s’agisse d’un nombre à deux chiffres est assez plausible quand on additionne des entrées à deux chiffres. 24 est aussi une réponse fréquente dans les problèmes de maths, et il a beaucoup de diviseurs. Il contient même les chiffres qui apparaissent quand on additionne
1+3et1+1En revanche, la dernière phrase « Montrez le raisonnement. 11 + 31 donne 10 + 30 = 40 en additionnant les dizaines entre elles, 1 + 1 = 2 en additionnant les unités entre elles, et en combinant 40 et 2 on obtient 24 » n’est pas très plausible
Ou encore « 10 + 30 = 20, 1 + 1 = 4, et en combinant 20 et 4 on obtient 24 » ne l’est pas davantage
En décomposant le problème, on doit passer par des zones moins probables qu’une réponse fausse rapide
Cela dit, l’argument fondé sur la complexité computationnelle est plus fort. L’explication ci-dessus peut suffire, dans des cas simples, comme explication par perturbation ; il faudra donc peut-être l’écarter avant d’affirmer que la complexité computationnelle est importante
L’argument de complexité est aussi intuitivement évident. Si l’on voit un LLM comme un ordinateur qui, à chaque cycle d’horloge, effectue une passe avant en temps constant sur l’entrée jusqu’ici disponible et produit un token, alors lui donner davantage de cycles lui permet de calculer davantage
Il peut aussi utiliser un état. C’est possible même si le mécanisme de transmission de l’état d’un cycle au suivant est très limité
Cela ressemble aussi à une extension du vieux problème selon lequel un perceptron monocouche ne peut pas calculer XOR. Ici, le « cycle » correspond à la progression d’une couche à la suivante
Bien sûr, cela ne veut pas dire que les détails sont évidents. Dire que plusieurs ticks d’horloge peuvent être utilisés n’explique pas à lui seul ce qui peut être fait en un tick
Il existe un tweet lié au miracle de la chaîne de pensée, et qui pourrait en être une explication plus simple
Si l’on cherche l’expression « Réfléchissons étape par étape ! », on trouve parmi les résultats des sites comme http://geteasysolution.com, qui contiennent beaucoup de solutions mathématiques détaillées étape par étape. Le fait que ce soit assez courant donne matière à réflexion
https://twitter.com/yanaiela/status/1765077404043952516
Cette formulation peut guider le modèle vers l’espace conceptuel de sites web contenant beaucoup d’exemples de chaînes de pensée, mais si la chaîne de pensée n’aidait pas réellement à réfléchir, cela ne se traduirait pas par de meilleures sorties
Je pensais que c’était déjà évident. Tout est une question de prise en compte du contexte
Si l’on veut améliorer les choses, il suffit d’ajouter un terme au prompt pour ouvrir davantage de considérations. En supposant qu’on n’ait pas atteint la fin de la fenêtre de contexte, chaque nouveau mot « libère » un nouveau vecteur doté de plus de contexte, et le modèle de langage l’ajoute à ce qu’il prend en considération
La similarité avec ce à quoi ressemble le fonctionnement du cerveau humain est si frappante qu’il serait presque absurde de ne pas s’en servir comme analogie pour mieux utiliser les modèles de langage
Si l’on peut obtenir le même résultat en manipulant un LLM et en manipulant le cerveau humain — c’est-à-dire en utilisant les bons mots — je ne vois pas pourquoi il faudrait croire qu’il existe une différence
C’est le genre de chose que l’on apprend avec le temps en utilisant et en étudiant des modèles 3B. Beaucoup de gens semblent s’en détourner, mais certains modèles comme le « vieux » orca mini 3B restent très puissants, et je les utilise encore
Ce qu’il faut, ce sont de meilleurs prompts, et cette approche fonctionne très bien
Le principal obstacle est la fenêtre de contexte généralement réduite de ces petits modèles, mais on peut le contourner sans trop sacrifier la qualité grâce à une légère extension RoPE, au résumé de texte, à l’ajout de mots de contexte, ou encore à l’omission de lettres dans certains mots du prompt
Si vous voulez améliorer les résultats d’un modèle de langage, il faut devenir mentaliste, escroc, magicien et spécialiste de l’ingénierie sociale. Cela paraît étrange, mais ça marche
Merrill et Sabharwal ont démontré que la chaîne de pensée ne commence réellement à aider que lorsque le nombre d’étapes intermédiaires augmente proportionnellement à la taille de l’entrée, et que beaucoup de problèmes exigent que ce nombre d’étapes augmente bien davantage
Cela correspond aussi à mon expérience. GPT-4 ne parvient à décomposer que des problèmes « simples » quand on lui demande une résolution étape par étape. En particulier, dans les cas de complexité O(n²) où les étapes elles-mêmes doivent être davantage décomposées, il divise bien la tâche en étapes, mais échoue régulièrement à redécouper les sous-tâches en sous-étapes. Même lorsque ces sous-tâches pourraient être résolues avec un prompt de chaîne de pensée
Les prompts de chaîne de pensée fonctionnent pour de simples calculs O(n), parce qu’ils empêchent le LLM de donner une réponse au jugé, à l’aveugle ; mais, théoriquement comme empiriquement, je ne pense pas qu’ils aient la capacité de décomposer un problème O(n²) en O(n) sous-problèmes O(n). Inutile de dire que les humains sont bien plus intelligents que cela, et les rats aussi
La chaîne de pensée me fait penser au fait de « se débrouiller tant bien que mal » (muddling through), et correspond directement à mon intuition selon laquelle c’est la bonne approche pour approximer l’intelligence
https://studio.ribbonfarm.com/p/massed-muddler-intelligence#...