DIY Black Mirror - enseignez un bot basé sur son historique de chat

Dans le «Black Mirror», il y avait une série (S2E1), dans laquelle ils ont créé des robots similaires à des morts, en utilisant l'histoire de la correspondance sur les réseaux sociaux pour la formation. Je veux vous dire comment j'ai essayé de faire quelque chose de similaire et ce qui en est ressorti. Il n'y aura pas de théorie, seulement de la pratique.


image


L'idée était simple: reprendre l'historique de leurs conversations de Telegram et, sur leur base, former le réseau seq2seq, qui est capable de prédire son achÚvement au début du dialogue. Un tel réseau peut fonctionner en trois modes:


  • PrĂ©dire l'achĂšvement de la phrase utilisateur en fonction de l'historique des conversations
  • Travailler en mode chatbot
  • SynthĂ©tisez des journaux de conversation entiers

VoilĂ  ce que j'ai


Le robot offre une complétion de phrase


image


Le robot offre l'achĂšvement du dialogue


image


Le robot communique avec une personne vivante


User:  Bot:  User:  ? Bot:  User:  ? Bot:  User: ? Bot:    User:     ? Bot:    User:  ? Bot:    

Ensuite, je vais vous expliquer comment prĂ©parer les donnĂ©es et entraĂźner vous-mĂȘme un tel robot.


Comment vous apprendre


Préparation des données


Tout d'abord, vous devez obtenir beaucoup de conversations quelque part. J'ai pris toute ma correspondance dans Telegram, car le client pour le bureau permet de télécharger l'archive complÚte au format JSON. Ensuite, j'ai jeté tous les messages qui contiennent des citations, des liens et des fichiers, et j'ai transféré les textes restants en minuscules et jeté tous les caractÚres rares à partir de là, ne laissant qu'un simple ensemble de lettres, de chiffres et de signes de ponctuation - il est plus facile d'apprendre le réseau.


Ensuite, j'ai apporté les chats à ce formulaire:


 === >  <    >  <  ! === >  ? <  

Ici, les messages qui commencent par le symbole ">" sont une question pour moi, le symbole "<" marque ma réponse en conséquence et la ligne "===" sert à séparer les dialogues entre eux. Le fait qu'un dialogue se soit terminé et que l'autre a commencé, j'ai déterminé par le temps (si plus de 15 minutes se sont écoulées entre les messages, alors nous pensons que c'est une nouvelle conversation. Vous pouvez voir le script pour convertir l'histoire sur github .


Depuis que j'utilise activement les télégrammes depuis longtemps, il y a eu beaucoup de messages à la fin - il y avait 443 000 lignes dans le fichier final.


Sélection du modÚle


J’ai promis qu’il n’y aurait pas de thĂ©orie aujourd’hui, je vais donc essayer de l’expliquer le plus briĂšvement possible sur mes doigts.


J'ai choisi le classique seq2seq basé sur GRU. Un tel modÚle d'entrée reçoit le texte lettre par lettre et génÚre également une lettre à la fois. Le processus d'apprentissage est basé sur le fait que nous apprenons au réseau à prédire la derniÚre lettre du texte, par exemple, nous donnons «plomb» à l'entrée et attendons que «rivet» soit sorti.


Pour générer des textes longs, une astuce simple est utilisée - le résultat de la prédiction précédente est renvoyé au réseau et ainsi de suite jusqu'à ce que la longueur de texte nécessaire soit générée.


Les modules GRU peuvent ĂȘtre trĂšs, trĂšs simplifiĂ©s comme un "perceptron rusĂ© avec de la mĂ©moire et de l'attention", plus de dĂ©tails Ă  leur sujet peuvent ĂȘtre trouvĂ©s, par exemple, ici .


Le modÚle était basé sur l' exemple bien connu de la tùche de générer des textes de Shakespeare.


La formation


Quiconque a dĂ©jĂ  rencontrĂ© des rĂ©seaux de neurones sait probablement que les apprendre sur le CPU est trĂšs ennuyeux. Heureusement, Google vient Ă  la rescousse avec son service Colab - vous pouvez y exĂ©cuter gratuitement votre code dans le cahier jupyter en utilisant un CPU, un GPU et mĂȘme un TPU . Dans mon cas, la formation sur la carte vidĂ©o tient en 30 minutes, bien que des rĂ©sultats raisonnables soient disponibles aprĂšs 10. L'essentiel est de se rappeler de changer le type de matĂ©riel (dans le menu Runtime -> Changer le type d'exĂ©cution).


Test


AprÚs la formation, vous pouvez procéder à la vérification du modÚle - j'ai écrit plusieurs exemples qui vous permettent d'accéder au modÚle dans différents modes - de la génération de texte au chat en direct. Tous sont sur github .


La méthode pour générer du texte a un paramÚtre de température - plus il est élevé, plus le texte (et vide de sens) produira un bot. Ce paramÚtre est logique pour configurer les mains pour une tùche spécifique.


Utilisation ultérieure


Pourquoi un tel rĂ©seau peut-il ĂȘtre utilisĂ©? La chose la plus Ă©vidente est de dĂ©velopper un bot (ou clavier intelligent) qui peut offrir Ă  l'utilisateur des rĂ©ponses toutes faites avant mĂȘme qu'il ne les Ă©crive. Une fonctionnalitĂ© similaire existe depuis longtemps dans Gmail et la plupart des claviers, mais elle ne prend pas en compte le contexte de la conversation et la façon dont un utilisateur particulier conduit la correspondance. Disons que le G-Keyboard me propose de maniĂšre stable des options complĂštement dĂ©nuĂ©es de sens, par exemple, "Je vais avec ... respect" Ă  l'endroit oĂč je voudrais obtenir l'option "Je vais de la datcha", que j'ai certainement utilisĂ©e Ă  plusieurs reprises.


Le bot de chat a-t-il un avenir? Dans sa forme pure, il n'est dĂ©finitivement pas lĂ , il a trop de donnĂ©es personnelles, personne ne sait Ă  quel moment il donnera Ă  l'interlocuteur le numĂ©ro de votre carte bancaire que vous avez jetĂ© une fois Ă  un ami. De plus, un tel bot n'est pas du tout rĂ©glĂ©, il est trĂšs difficile de le faire effectuer des tĂąches spĂ©cifiques ou de rĂ©pondre correctement Ă  une question spĂ©cifique. Au contraire, un tel chatbot pourrait fonctionner en conjonction avec d'autres types de bots, fournissant un dialogue plus connectĂ© "sur rien" - il s'en sort bien. (Et pourtant, un expert externe en la personne de sa femme a dit que le style de communication du bot Ă©tait trĂšs similaire Ă  moi. Et les sujets qui l'intĂ©ressent sont clairement les mĂȘmes - les bugs, les corrections, les commits et autres joies et chagrins du dĂ©veloppeur apparaissent constamment dans les textes).


Quoi d'autre vous conseille d'essayer si ce sujet vous intéresse?


  • Transfert d'apprentissage (pour vous entraĂźner sur un grand nombre de dialogues avec d'autres personnes, puis terminer par vous-mĂȘme)
  • Changer de modĂšle - augmenter, changer de type (par exemple, sur LSTM).
  • Essayez de travailler avec TPU. Dans sa forme pure, ce modĂšle ne fonctionnera pas, mais il peut ĂȘtre adaptĂ©. L'accĂ©lĂ©ration thĂ©orique de l'apprentissage devrait ĂȘtre dix fois supĂ©rieure.
  • Portez vers une plate-forme mobile, par exemple en utilisant Tensorflow mobile.

Lien PS vers github

Source: https://habr.com/ru/post/fr453314/


All Articles