Vecteurs sémantiques — Les-mathematiques.net The most powerful custom community solution in the world

Vecteurs sémantiques

Bonjour,

Je m'appelle Julien 43 ans, formateur informatique. Je me permets de venir vous demander votre avis, n'étant pas moi-même expert en mathématiques. Je vais essayer d'exposer le sujet le plus clairement possible.

C'est un projet loisir, sur le thème de l'IA. Le word embedding consiste à représenter la signification, ou valeur sémantique, d'un mot sous la forme d'un vecteur. Généralement, ces vecteurs sont créés par des algorithmes tournant très vite sur des corpus extrêmement volumineux, l'idée de base étant que des mots souvent utilsés dans le même contexte sont potentiellement liés sémantiquement. La technique fonctionne assez bien, et permet de faire des calculs tout à fait étonnants, comme Roi - Homme + Femme, dont le résultat est Reine. Dans cet exemple, on retire la notion d'homme de la notion de roi, avant d'y ajouter la notion de femme, qui naturellement nous donne la notion de reine. Cela peut paraître abstrait raconté comme cela, mais c'est très concret : c'est un vrai calcul, dont le résultat est réellement un vecteur correspond à Reine. L'outil montre des propriétés intéressantes ; par exemple la différence entre France et Paris est égale à la différence entre Allemagne et Berlin : on peut calculer des analogies. Tout cela me passionne !

Mais je trouve qu'une faiblesse de ces techniques est que les vecteurs obtenus par ces algorithmes sont finalement des "boîtes noires". Sur les 500+ dimensions d'un vecteur, par exemple, on ne sait pas quelle elle la signification d'une dimension particulière. Pire : une unique dimension n'a en réalité pas de sens par elle-même, car la vraie valeur sémantique est en fait répartie, peu ou prou et de façon invérifiable, sur plusieurs dimensions. Ce flou me gâche un peu le plaisir.

Mon idée est donc de manipuler ce que j'appellerai ici des "vecteurs sémantiques" (en anglais "meaning-vectors"), non pas en tant que boîtes noires, mais en tant qu'entités formellement définies et contrôlées. Notamment, chaque dimension porte un nom, a une valeur sémantique choisie, a une description claire, voire éventuellement une correspondance ontologique RDF/OWL.

Étape suivante, avoir des mots c'est bien, avoir des phrases c'est mieux ! Ce que j'essaye de faire, c'est de trouver une représentation mathématique des phrases et des propositions, et un calcul permettant de mettre en relation le vecteur sémantique d'une phrase entière avec les vecteurs sémantiques de ses constituants et des rôles qu'ils occupent. Les phrases et les propositions sont des structures arborescentes, comme on peut en voir dans ce tutoriel pour jsRealB.

J'envisage plusieurs pistes. L'une serait d'utiliser des fonctions correspondant aux rôles occupés par les constituants d'une phrase. Exemple : le garçon mange la pomme, où le garçon est sujet, donc représenté par une fonction sujet(garçon). Mais je ne sais pas si une telle solution serait intéressante au niveau des calculs qu'elle permettrait. Une autre piste, mais là j'entre dans ce que je ne maîtrise plus (ou pas encore plutôt), ce serait quelque chose comme des bivecteurs peut-être, de l'algèbre géométrique...

C'est pour cela que je viens vers vous. Je cherche des personnes qui auraient une belle aisance avec les vecteurs à N dimensions, et qui seraient en position d'exprimer ce qui, à leur sens, permettrait d'exprimer le mieux la "transformation" ou la "rotation" pour ainsi dire, que représente le rôle occupé par un élément dans une phrase. Idéalement, l'outil montrerait des propriétés semblant logiques et naturelles lors des manipulations. C'est donc un acte de création : choisir, comme on choisit les mots d'un poème, de représenter la relation entre une phrase et ses constituants, d'une façon, ou d'une autre.

En espérant avoir émoustillé votre curiosité intellectuelle, et surtout ne pas avoir manqué de clarté dans mon propos,

Je vous remercie d'avance.

Julien

Réponses

  • Je suis en train de lire A Geometric Algebra Primer de Jaap Suter, mais je suis preneur si vous avez d'autres ressources ou idées !
  • Juste pour dire que j'ai bien lu ton message mais je n'ai rien à proposer.

    Par contre je te cite :
    Mais je trouve qu'une faiblesse de ces techniques est que les vecteurs obtenus par ces algorithmes sont finalement des "boîtes noires". Sur les 500+ dimensions d'un vecteur, par exemple, on ne sait pas quelle elle la signification d'une dimension particulière. Pire : une unique dimension n'a en réalité pas de sens par elle-même, car la vraie valeur sémantique est en fait répartie, peu ou prou et de façon invérifiable, sur plusieurs dimensions. Ce flou me gâche un peu le plaisir.

    Par curiosité j'ai suivi un cours (plusieurs en fait) de deep-learning sur coursera et j'ai rencontré le word embedding lors de l'introduction des réseaux de neurones récurrents.

    Pour revenir à ta remarque je me rappelle que le prof disait qu'il valait mieux ne pas mettre de contraintes qui obligent le réseau à utiliser des caractéristiques qui ont du sens pour nous humains car en fait on n'obtenait pas les meilleurs résultat ainsi. D'ailleurs au début c'est ce qui était fait pour le traitement du langage puis ils ont laissé le réseau "découvrir" les bonnes caractéristiques.

    Bon après c'est déjà un peu loin pour moi donc...

    Un truc qui m'avait embêté est que j'ai découvert par la suite, plusieurs semaines après avoir suivi ce cours, que les réseaux récurrents n'étaient plus forcément considérés comme les meilleurs pour le traitement du langage. Il semblerait qu'ils aient été supplantés par les transformers (ce ne sont pas les copains d'Optimus Prime pour le lecteur voulant faire une vanne... B-)-)
  • Je sais qu'une application de ce genre de chose est le SEO (Search Engine Optimisation), et pour en avoir discuté avec un "praticien" il trouve que c'est très joli mais ne l'utilise pas. Il a préféré construire une méthode avec des dendogrammes sémantiques, technique d'un abord très bourrin mais extrêmement efficace (quand on sait faire et qu'on a la puissance de calcul) car elle permet de s'adapter quasiment en temps réel aux modifications d'algo de Google (comme les contraintes sous-jacentes sont faibles, la modification des corpus se fait de façon très souple).

    Ceci dit tout ce qui touche le langage et ses modélisations, c'est passionnant.
    "J'appelle bourgeois quiconque pense bassement." Gustave Flaubert
  • Roi - Homme + Femme = Reine
    France - Allemagne + Berlin = Paris
    Ok
    Est-ce que
    Masculin - Roi + Reine = Féminin ?
    Et surtout, est-ce que
    Pays - France + Paris = Capitale ?
    Autrement dit, le vecteur pour passer d'un pays à sa capitale est toujours le même. Est-ce qu'il est égal au vecteur qui fait passer du mot 'Pays' au mot 'Capitale' ?
    Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. Benjamin Franklin
  • @Julag

    C'est un sujet très interessant, qui nécessite de se poser la question de ce qu'est le langage. En analysant des corrélations entre des corpus français et allemand, l'alliage de l'informatique et des statistiques (l'intelligence artificielle) permettra de trouver une correspondance entre Bonjour et Guten Tag. Est-ce que cela signifie que ces mots ont le même sens ? Est-ce que ces mots ont tout simplement un sens bien défini ? Ces mots ne sont-ils pas en eux-même des "boîtes noires" ? Comment un bébé apprend à les utiliser ? Peut-on créer, de la même manière, un système de traduction d'aboiements de chien en chant d'oiseau ? Je joins une image du signal physique du son "bonjour". Tu écris "on ne sait pas quelle est la signification d'une dimension particulière. Pire : une unique dimension n'a en réalité pas de sens par elle-même" Ce que tu semble espérer en constatant cela c'est qu'en faisant une transformation mathématique du signal, tu puisses y trouver une composante qui pointe clairement sur le concept de bien, une sur la notion de souhait, et une sur celle de lever et coucher du soleil. Cela n'a rien à voir avec le mot hello. Ce n'est pas comme cela que fonctionne le cerveau d'un bébé qui apprend à reconnaitre ce mot, identifier son contexte, et qui finalement l'utilise de manière appropriée et fini par croire qu'il sait ce qu'il signifie alors qu'en fait il ne sait que l'utiliser pour communiquer, oralement d'abord, à l'écrit ensuite. Cela me fait penser à une scène du film Imitation Game sur la vie d'Alan Turing où il exprime à son camarade le sentiment que le langage n'est pas réellement plus clair qu'un message chiffré, que ce qu'exprime l'un est interprété par l'autre sans qu'on puisse être sûr que les deux comprennent la même chose. Que dire d'une discussion entre oiseaux ou entre chiens ? Manifestement ils communiquent, dans quelle mesure se comprennent-ils ?123384
  • D’abord merci !

    C’est vrai, pour faire du deep-learning il faut laisser « libres » les significations des dimensions des vecteurs, de sorte que le système les crée de lui-même. Mais mon objectif est différent : je ne souhaite pas que mon programme apprenne à reconnaître ou à reproduire un langage naturel.

    Les vecteurs, même affublés de ce blason clinquant « sémantiques », restent des vecteurs au sens mathématique, et les calculs impliquant les notions de capitales et de pays fonctionnent parfaitement, à condition que les corpus utilisent ces termes de façon adéquate bien sûr.

    A vrai dire, j’ai moi-même joué avec des algorithmes de ce type, sur un corpus modeste : un fragment du « Simple English Wikipedia » extrait de données téléchargées à l’institut Allen pour l’IA (il me semble), traduit en français grâce à notre cher Big Brother international, auquel j’ai ajouté un livre sur le bouddhisme pour faire bonne mesure. Malgré la taille réduite de ce corpus, j’ai obtenu des résultats amusants. Extraits choisis : l’homme est au roi ce que la femme est à… la république ! Pas mal, n’est-ce pas ? Un autre, qui était plus bluffant : j’ai calculé la différence entre un homme et un bouddha, et j’ai obtenu : soutra. Pour ceux qui s’y intéressent, vous reconnaitrez que, sans être parfaitement exact, il y a de l’idée !

    Mon ambition reste très modeste. Il est impossible qu’un programme sache un jour ce que c’est que de regarder un coucher de soleil près de la mère de ses enfants, ou même simplement « l’effet que ça fait » d’être un humain qui dit bonjour à un autre être humain. Les qualia d’un être vivant ne font pas partie de ce que je souhaite implémenter. Mais si les mots du langage naturel humain sont et resteront des boîtes noires, vous conviendrez avec moi qu’il y a certains langages dans lesquels les mots sont parfaitement définis… Par exemple, en mathématiques, comme en informatique, les choses sont claires. Un fichier est un fichier, une fonction est une fonction. Et c’est bien dans ce monde de fichiers, de fonctions et de Giga-octets que vivrait le programme que je souhaite implémenter. Un monde avec lequel nous pouvons interagir par le biais d’un clavier et d’un écran, mais dont nul programme ne peut sortir, un monde dans lequel les mots peuvent avoir une signification exacte. C’est pour ça que je disais « c’est un acte de création » : je ne souhaite pas que le programme puisse utiliser mon langage naturel, je souhaite qu’il puisse utiliser son propre langage certes très proche du nôtre, mais défini clairement, formellement. L’originalité supposée de la démarche est d’emprunter la notion de sémantique vectorielle, que je trouve tout à fait judicieuse, pour l’appliquer non pas aux techniques auxquelles elle est habituellement associée (toutes basées sur des volumes énormes, de la redondance et de grosses puissances de calcul), mais à de l’IA symbolique, l’IA comme on en faisait il y a plusieurs décennies finalement. Je suis moins intéressé par la faculté d’apprendre, à vrai dire, que par la faculté de penser subjectivement. Mais les pensées ont besoin de structure, et je ne trouvais pas cette structure dans les vecteurs tels qu’ils m’étaient présentés.

    Voici un petit morceau de Javascript pour illustrer mon propos (à utiliser avec la librairie vector-object de Stanleyfok), si vous me permettez :
    const Vector = require("vector-object");
    
    let boy = new Vector({   human:  1, young:       1 });
    let eats = new Vector({  action: 1, foodRelated: 1 });
    let apple = new Vector({ fruit:  1, foodRelated: 1 });
    
    let sentenceA = new Vector({}).add(boy).add(eats).add(apple);
    console.log("boy + eats + apple = ", sentenceA);
    
    let sentenceB = new Vector({}).add(apple).add(eats).add(boy);
    console.log("apple + eats + boy = ", sentenceB);
    
    console.log(
        sentenceA.isEqual(sentenceB) ?
            "boy + eats + apple == apple + eats + boy" :
            "boy + eats + apple != apple + eats + boy"
    );
    
    L'exécution donne ceci :
    boy + eats + apple =  Vector {
      vector: { human: 1, young: 1, action: 1, foodRelated: 2, fruit: 1 }
    }
    apple + eats + boy =  Vector {
      vector: { fruit: 1, foodRelated: 2, action: 1, human: 1, young: 1 }
    }
    boy + eats + apple == apple + eats + boy
    
    On voit que les phrases « le garçon mange la pomme » et « la pomme mange le garçon » auraient la même valeur sémantique si on se contentait d’ajouter les vecteurs sémantiques des mots qui composent ces phrases. Or elles ne sont pas censées avoir la même valeur sémantique. Le vecteur sémantique de la phrase entière est donc plus qu’une simple addition des vecteurs sémantiques des composants de la phrase. Cet élément en plus, c’est le rôle qu’occupent les différents constituants. Donc au lieu d’additionner les vecteurs sémantiques des mots, je vais essayer de composer la valeur sémantique de la phrase en tenant compte de sa structure. Dans le cas présent, on aurait par exemple un bivecteur « garçon/sujet », et un bivecteur « pomme/complément d’objet direct » (je schématise), au lieu des simples vecteurs sémantiques d’origine.

    Toujours en espérant être le moins obscur possible,

    Cordialement,
    Julien
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!