{"notes":[{"id":"text-spotting/nougat","category":"text-spotting","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Nougat","subtitle":"Comme un disque rayé","author":"Z. Yuan","paperDate":"2023-08-25","publishedOn":"2026-04-14","world":"external/nougat","paperTitle":"Nougat: Neural Optical Understanding for Academic Documents","paperUrl":"https://arxiv.org/abs/2308.13418","bibliography":{"title":"Nougat: Neural Optical Understanding for Academic Documents","authors":["Lukas Blecher","Guillem Cucurull","Thomas Scialom","Robert Stojnic"],"url":"https://arxiv.org/abs/2308.13418","pdfUrl":"https://arxiv.org/pdf/2308.13418v1","codeUrl":"https://github.com/facebookresearch/nougat","preprint":{"id":"2308.13418","submittedOn":"2023-08-25","url":"https://arxiv.org/abs/2308.13418"},"publication":null,"citation":"@misc{textspottingnougat2023,\n  title = {{Nougat: Neural Optical Understanding for Academic Documents}},\n  author = {Lukas Blecher and Guillem Cucurull and Thomas Scialom and Robert Stojnic},\n  year = {2023},\n  eprint = {2308.13418},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2308.13418}\n}\n","citationPath":"/content/papers/citations/text-spotting/nougat.1d66a2aca861.bib"},"thumbnail":{"src":"/content/papers/assets/73888d5b579ab68d56551dc59d69ebcd0bf97704d288425f0341c9a9aa012138.png","width":1283,"height":288},"locale":"fr","path":"/content/papers/fr/text-spotting/nougat.331d593a5bfe.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"larchitecture-celle-de-donut","text":"L'architecture : celle de Donut","depth":3},{"id":"les-données-découper-le-code-source-latex-page-par-page","text":"Les données : découper le code source LaTeX page par page","depth":3},{"id":"faire-passer-des-pdf-numériques-pour-des-scans","text":"Faire passer des PDF numériques pour des scans","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"résultats-sur-le-jeu-de-test-arxiv","text":"Résultats sur le jeu de test arXiv","depth":3},{"id":"pris-dans-la-répétition","text":"Pris dans la répétition","depth":3},{"id":"détecter-la-répétition","text":"Détecter la répétition","depth":3},{"id":"retours-de-la-communauté","text":"Retours de la communauté","depth":3},{"id":"à-garder-en-tête-en-lisant-cet-article","text":"À garder en tête en lisant cet article","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[]}],"text":"Donnez le PDF d'un article à un moteur d'OCR ordinaire : le texte est en général bien lu, mais les équations s'éparpillent souvent en un tas de symboles.\n\nLa raison se devine aisément. Dans $x_i^2$, l'indice $i$ et l'exposant $2$ s'empilent à droite de $x$ ; le numérateur et le dénominateur d'une fraction sont disposés l'un au-dessus de l'autre. Un OCR qui lit ligne par ligne les traite comme du texte ordinaire, et les relations de position disparaissent. Le PDF lui-même n'aide guère : il enregistre « quel caractère est dessiné à quel endroit de la page » ; la structure LaTeX d'origine des équations a été perdue dès la compilation.\n\nNougat, présenté par Meta AI en août 2023, veut régler cela d'un coup : on lui donne l'image d'une page d'article, et il produit directement un texte balisé, avec équations et tableaux en LaTeX. Cette note suit la v1 publiée sur arXiv. Le code est open source sous licence MIT ; les poids du modèle sont sous CC BY-NC.\n\n## Définir le problème\n\nLes outils de l'époque avaient chacun leurs lacunes :\n\n- Les moteurs d'OCR comme **Tesseract** excellent à détecter et classer des caractères ou des mots isolés, mais ils traitent le texte ligne par ligne et ne comprennent pas les relations de position comme les exposants et les indices.\n- **GROBID** convertit en XML les PDF d'articles nativement numériques ; il traite très bien les données bibliographiques, mais ne conserve des équations que les caractères Unicode présents dans le PDF.\n- **pdf2htmlEX** convertit un PDF en HTML d'apparence identique, sans pouvoir lui non plus récupérer la sémantique des équations.\n\nLes auteurs veulent un modèle qui ne regarde que l'image de la page. Se limiter à l'image permet de traiter aussi d'anciens articles et livres numérisés ; produire directement un langage de balisage permet de préserver la structure des équations et des tableaux.\n\n## Résoudre le problème\n\n### L'architecture : celle de Donut\n\n[![Architecture de Nougat : l'image d'une page de document est encodée par un Swin Transformer en une représentation latente z, puis un décodeur Transformer produit des tokens de manière autorégressive ; à droite, un exemple de texte produit](/content/papers/assets/73888d5b579ab68d56551dc59d69ebcd0bf97704d288425f0341c9a9aa012138.png)](/content/papers/assets/73888d5b579ab68d56551dc59d69ebcd0bf97704d288425f0341c9a9aa012138.png)\n\n*Figure 1 de l'article, extraite de la [**page 2 du PDF v1**](https://arxiv.org/pdf/2308.13418v1#page=2), CC BY-SA 4.0.*\n\nL'architecture est très simple et reprend Donut, publié en 2021 :\n\n1. **Encodeur** : on rogne d'abord les marges de la page, puis on la redimensionne et la complète de blanc jusqu'au format fixe de 896×672 (un rapport compris entre US Letter et A4) ; un Swin Transformer la convertit ensuite en une suite de vecteurs de patchs $z$.\n2. **Décodeur** : un décodeur mBART à 10 couches lit $z$ par attention croisée (*cross-attention*) et produit les tokens de manière autorégressive, jusqu'à 4 096. Le tokenizer est emprunté à Galactica, spécialisé dans les textes scientifiques.\n\nLe modèle complet compte environ 350 millions de paramètres. Les auteurs ont aussi essayé une petite version de 250 millions de paramètres, dont le décodeur n'a que 4 couches. L'inférence utilise un décodage glouton.\n\nPas de détection de texte, ni le moindre prétraitement OCR. La manière de lire les caractères, le réseau doit l'apprendre seul.\n\n### Les données : découper le code source LaTeX page par page\n\nLe plus gros chantier concerne les données. Pour apprendre « image de page → texte balisé », il faut une grande quantité de paires, et il n'en existait alors aucune toute prête.\n\nLes auteurs collectent sur arXiv le code source LaTeX et le PDF compilé de 1 748 201 articles, y ajoutent une partie des articles en accès libre de PubMed Central, puis, pour le préentraînement, du texte OCR de l'Industry Documents Library.\n\nLe traitement se déroule ainsi :\n\n1. LaTeXML convertit le LaTeX en HTML, en développant au passage les macros personnalisées, en uniformisant les espaces, en normalisant les tableaux et en remplaçant les citations par leurs bons numéros.\n2. Le HTML est converti en un langage de balisage léger qui conserve les titres, le gras et l'italique, les algorithmes, les équations LaTeX en ligne et hors texte, et les tableaux LaTeX.\n3. Le code source complet est découpé page par page et aligné sur l'image de chaque page du PDF.\n\nLa troisième étape est la plus délicate. En LaTeX, c'est le compilateur qui décide des sauts de page : le code source n'en porte aucune marque. Dans le PDF, figures et tableaux se trouvent aussi souvent ailleurs que dans le code source. Les auteurs procèdent en deux temps :\n\n- **Découpage grossier** : MuPDF extrait d'abord le texte de chaque page du PDF, puis un classifieur TF-IDF avec SVM linéaire prédit à quelle page appartient chaque paragraphe du code source. Idéalement, on obtiendrait une suite de numéros de page en escalier ; en pratique, elle est très bruitée, et c'est l'impureté de Gini, comme dans un arbre de décision, qui permet de trouver les meilleurs points de coupure.\n- **Découpage fin** : autour du point de coupure prédit, on compare de manière approximative (*fuzzy matching*) le code source aux dernières phrases de la page précédente du PDF et aux premières phrases de la page suivante, afin de trouver la position exacte. Une page n'entre dans le jeu de données que si le score moyen de ses deux points de coupure atteint 0,9.\n\nAu final, environ 47 % des pages passent ce filtre.\n\n### Faire passer des PDF numériques pour des scans\n\nLes données d'entraînement ne contiennent que des articles nativement numériques, alors que le modèle doit traiter des numérisations. Les auteurs appliquent donc avec Albumentations une série de perturbations d'image : érosion, dilatation, bruit gaussien, flou, binarisation, compression, distorsion de grille et déformation élastique.\n\nIls perturbent aussi le **côté texte** ; nous verrons plus loin à quoi cela sert.\n\n## Discussion\n\n### Résultats sur le jeu de test arXiv\n\n| Méthode | Catégorie | Distance d'édition ↓ | BLEU ↑ | F1 ↑ |\n| --- | --- | ---: | ---: | ---: |\n| Texte intégré au PDF | Tout | 0,255 | 65,8 | 79,2 |\n| GROBID | Tout | 0,312 | 55,6 | 73,0 |\n| Nougat base | Tout | 0,071 | 89,1 | 93,1 |\n| Nougat base | Texte courant | 0,058 | 91,2 | 95,7 |\n| Nougat base | Équations | 0,128 | 56,9 | 76,5 |\n| Nougat base | Tableaux | 0,211 | 69,7 | 78,0 |\n\n*Tableau : extrait de la Table 1 de l'article.*\n\nGlobalement, la distance d'édition de Nougat n'est qu'environ le quart de celle de GROBID. Des trois types de contenu, les équations sont les plus difficiles : leur distance d'édition fait plus du double de celle du texte courant.\n\nSelon les auteurs, les équations obtiennent par nature des scores plus bas : une même formule peut s'écrire de nombreuses façons en LaTeX, par exemple selon l'ordre de l'indice et de l'exposant, avec `\\frac` ou `\\over`, avec `\\mathbf` ou `\\boldsymbol`. Le rendu est identique, les chaînes diffèrent.\n\nLe petit modèle (250 millions de paramètres) obtient presque les mêmes résultats que le grand.\n\n### Pris dans la répétition\n\nCe que cet article offre de plus intéressant, c'est la franchise avec laquelle les auteurs décrivent les échecs du modèle.\n\nLe modèle tombe parfois dans des répétitions. Dans le cas le plus simple, il produit sans fin la même phrase ou le même paragraphe ; il peut aussi osciller entre deux phrases en changeant quelques mots à chaque fois, ce qui échappe à une détection stricte des répétitions. Dans la bibliographie, il lui arrive même de poursuivre tout seul la numérotation, entrée après entrée. Une fois dans cet état, il n'en sort plus.\n\nSur le jeu de test, environ 1,5 % des pages sont concernées ; c'est plus fréquent sur des documents hors du domaine d'entraînement. Les auteurs observent que la répétition survient généralement après une erreur du modèle.\n\nCela suggère une piste : **montrer au modèle ses propres erreurs dès l'entraînement**. Pendant l'entraînement, des tokens corrects sont remplacés au hasard par des tokens quelconques ; les remplacements se poursuivent jusqu'à ce qu'un nombre tiré au hasard dépasse 10 %. Le modèle apprend ainsi à poursuivre sa lecture quand le texte qui précède contient une erreur, au lieu de se laisser entraîner par elle. Selon les auteurs, les performances globales ne baissent pas, et les répétitions diminuent nettement ; sur des documents hors domaine, les pages dont la conversion échoue reculent de 32 %.\n\n### Détecter la répétition\n\nLes réduire ne suffit pas. Le décodeur peut générer jusqu'à 4 096 tokens ; une fois pris dans une répétition, il tourne pour rien jusqu'à la limite. Les auteurs conçoivent donc en plus une méthode de détection.\n\n[![Deux exemples de détection de répétition, de trois graphiques chacun : logit maximal de chaque token, variance sur fenêtre glissante, variance de chaque position jusqu'à la fin. En haut, la répétition commence vers le 1 000e token, et la variance chute brutalement sous le seuil ; en bas, un échantillon normal dont la variance reste élevée tout du long](/content/papers/assets/1a40149c71166aacbd2c464be00126a4ae00240e18bac1afb5a04502192d89a2.png)](/content/papers/assets/1a40149c71166aacbd2c464be00126a4ae00240e18bac1afb5a04502192d89a2.png)\n\n*Figure 6 de l'article, extraite de la [**page 8 du PDF v1**](https://arxiv.org/pdf/2308.13418v1#page=8), CC BY-SA 4.0. En haut, un échantillon avec répétition ; en bas, un échantillon normal ; les lignes pointillées marquent respectivement le début de la répétition et le seuil de décision.*\n\nCommençons en haut à gauche : l'axe horizontal donne le rang du token généré, l'axe vertical le logit maximal à chaque étape. Jusqu'au 1 000e token environ, les points sont très dispersés ; ensuite, ils se resserrent tous dans une bande entre 17 et 18. L'échantillon normal, en bas, reste dispersé du début à la fin.\n\nIntuitivement, sur un texte normal, l'assurance du modèle monte et descend d'une étape à l'autre ; pris dans une répétition, il devient de plus en plus sûr du token suivant, et le logit maximal s'aplatit. Les auteurs en tirent un calcul en deux étapes :\n\n1. Sur la suite des logits maximaux $\\ell$, on fait glisser une fenêtre de taille $B=15$ et on calcule la variance de chaque fenêtre, $\\mathrm{VarWin}_B$ (graphique du milieu).\n2. Puis, de chaque position jusqu'à la fin de la séquence, on calcule la variance de ces variances, $\\mathrm{VarEnd}_B$ (graphique de droite).\n\nSi $\\mathrm{VarEnd}_B$ passe sous 6,75 et y reste jusqu'à la fin, la sortie est jugée répétitive.\n\nTrois nombres pour s'en faire une idée (valeurs illustratives, qui ne viennent pas de l'article) : sur un passage normal, les logits maximaux valent 20, 25 et 18, pour une variance d'environ 8,67 ; en pleine répétition, 17,0 ; 17,2 et 16,9, pour une variance de seulement 0,016. Un facteur de plusieurs centaines : la distinction est facile.\n\nPendant l'inférence, la « fin » n'est pas encore connue. Les auteurs ne prennent donc que les 200 derniers tokens, avec un seuil divisé par deux, et décident au fil de la génération ; une fois celle-ci terminée, le calcul est refait sur la séquence complète.\n\n### Retours de la communauté\n\nSur le GitHub de Nougat, l'issue n° 11 est un signalement daté du 30 août 2023 : un utilisateur teste la numérisation de l'article EPR paru en 1935 dans Physical Review. La première page passe, mais les pages 2 à 4 déclenchent toutes l'avertissement « Found repetitions », et la sortie se réduit à `[MISSING_PAGE_EMPTY:1]`. [facebookresearch/nougat#11](https://github.com/facebookresearch/nougat/issues/11)\n\nC'est précisément la détection de répétition à l'œuvre : une page jugée en échec est marquée comme manquante, au lieu de produire une page de texte répété. Devant ce marqueur, l'utilisateur sait au moins que la page doit être traitée autrement.\n\nLe README officiel précise aussi sans détour les langues couvertes : les articles en anglais donnent les meilleurs résultats, d'autres langues à alphabet latin peuvent fonctionner, mais pas le chinois, le russe, le japonais, etc.\n\n### À garder en tête en lisant cet article\n\nDans la section consacrée aux limites, les auteurs énumèrent plusieurs points :\n\n1. **La répétition reste le principal problème** ; l'article la laisse à des travaux futurs.\n2. **Presque uniquement l'anglais.** Les caractères spéciaux des autres langues à alphabet latin sont remplacés par la lettre anglaise la plus proche ; les écritures non latines font immédiatement tomber le modèle dans la répétition.\n3. **Une page à la fois.** La cohérence d'une page à l'autre n'est pas garantie, en particulier dans la bibliographie : la numérotation saute parfois des numéros, ou en ajoute qui n'existent pas dans l'original.\n4. **C'est lent.** Sur une A10G, avec des lots de 6 pages, il faut en moyenne 19,5 secondes par lot ; GROBID traite 10,6 PDF par seconde.\n\n## Conclusion\n\nNougat transforme l'OCR d'articles scientifiques en tâche générative, où l'on regarde une page pour écrire une page de texte balisé :\n\n1. **Une architecture simple** : un encodeur Swin Transformer et un décodeur mBART, sans prétraitement OCR.\n2. **L'ingénierie des données au premier plan** : à partir du code source LaTeX de 1,75 million d'articles arXiv, un classifieur et une correspondance approximative découpent des données d'entraînement page par page.\n3. **Pour la première fois, les équations peuvent être lues de bout en bout en LaTeX**, avec une distance d'édition globale bien inférieure à celle de GROBID.\n\nIl a aussi exposé très tôt les défauts typiques de l'OCR génératif : boucles de répétition, caractères rares remplacés par des lettres courantes, numéros inexistants ajoutés à la bibliographie. Les auteurs ne se contentent pas de publier des scores : ils proposent des parades, avec des erreurs injectées à l'entraînement et une détection des répétitions à l'inférence.\n\nDès qu'on confie à un modèle de langage le soin d'« écrire » une page, il s'efforce d'écrire de façon fluide. Quand il cale, mieux vaut le laisser s'arrêter que le laisser écrire sans fin.\n","imageSizes":{"/content/papers/assets/73888d5b579ab68d56551dc59d69ebcd0bf97704d288425f0341c9a9aa012138.png":{"width":1283,"height":288},"/content/papers/assets/1a40149c71166aacbd2c464be00126a4ae00240e18bac1afb5a04502192d89a2.png":{"width":1233,"height":800}}}
