Neurones "from scratch", ou Comment nous avons créé un assistant pour nos répartiteurs de support technique

Bonjour, Habr! Je m'appelle Alexander Soloviev, je suis programmeur chez DataLine.



Je voudrais partager l'expérience de la mise en œuvre de réseaux de neurones à la mode dans notre entreprise. Tout a commencé lorsque nous avons décidé de créer notre propre Service Desk. Pourquoi et pourquoi le vôtre, vous pouvez lire mon collègue Alexei Volkov (face) ici



Je vais vous parler d'une innovation récente du système: un réseau de neurones pour aider le répartiteur de la première ligne de support. Si vous êtes intéressé, bienvenue au chat.







Clarification de la tâche



Un casse-tête pour tout répartiteur de support est une décision rapide à affecter à une demande client entrante. Voici les demandes:

Bonne après-midi.



Je comprends bien: pour partager un calendrier avec un utilisateur spécifique, vous devez ouvrir l'accès à votre calendrier sur le PC de l'utilisateur qui souhaite partager le calendrier et saisir le courrier de l'utilisateur auquel il souhaite donner accès?


Selon la rĂ©glementation, le rĂ©partiteur doit rĂ©pondre dans les deux minutes: enregistrer une demande, dĂ©terminer l'urgence et dĂ©signer une unitĂ© responsable. Dans ce cas, le rĂ©partiteur choisit parmi 44 divisions de l'entreprise. 



Les instructions des répartiteurs décrivent une solution pour les requêtes les plus courantes. Par exemple, donner accès à un centre de données est une simple demande. Mais les demandes de service comportent de nombreuses tâches: installer un logiciel, analyser une situation ou une activité réseau, connaître les détails de la facturation des solutions, vérifier tous les types d'accès. Parfois, il est difficile de comprendre à partir de la demande à quel responsable envoyer la question:

Hi Team,

 

The sites were down again for few minutes from 2020-07-15 14:59:53 to 2020-07-15 15:12:50 (UTC time zone), now they are working fine. Could you please check and let us know why the sites are fluctuating many times.

 

Thanks


Il y a eu des situations où l'application a été envoyée au mauvais service. La demande a été prise au travail, puis réaffectée à d'autres artistes ou renvoyée au répartiteur. Cela a augmenté la vitesse de la solution. Le délai de résolution des demandes est inscrit dans l'accord avec le client (SLA), et nous sommes responsables du respect des délais.



Ă€ l'intĂ©rieur du système, nous avons dĂ©cidĂ© de crĂ©er un assistant pour les rĂ©partiteurs. L'objectif principal Ă©tait d'ajouter des invites qui aident l'employĂ© Ă  prendre une dĂ©cision sur l'application plus rapidement. 



Surtout, je ne voulais pas succomber Ă  la nouvelle tendance et mettre le chatbot en première ligne de support. Si vous avez dĂ©jĂ  essayĂ© d'Ă©crire Ă  un tel support technique (qui ne pèche dĂ©jĂ  pas avec ça), vous comprenez ce que je veux dire. 



Premièrement, il vous comprend très mal et ne répond pas du tout aux demandes atypiques, et deuxièmement, il est très difficile de joindre une personne vivante.



En général, nous n'avons certainement pas prévu de remplacer les répartiteurs par des robots de discussion, car nous voulons que les clients continuent de communiquer avec une personne en direct.



Au dĂ©but, j'ai pensĂ© Ă  ĂŞtre bon marchĂ© et joyeux et j'ai essayĂ© l'approche par mots clĂ©s. Nous avons compilĂ© un dictionnaire de mots-clĂ©s manuellement, mais cela ne suffisait pas. La solution ne faisait face qu'Ă  des applications simples, avec lesquelles il n'y avait aucun problème. 



Au cours du travail de notre Service Desk, nous avons accumulĂ© une solide histoire de demandes, sur la base de laquelle nous pouvons reconnaĂ®tre des demandes entrantes similaires et les attribuer immĂ©diatement aux exĂ©cuteurs correcteurs. ArmĂ© de Google et d'un certain temps, j'ai dĂ©cidĂ© de plonger plus profondĂ©ment dans mes options.  



Théorie de l'apprentissage



Il s'est avĂ©rĂ© que ma tâche est une tâche de classification classique. En entrĂ©e, l'algorithme reçoit le texte principal de l'application, en sortie il l'affecte Ă  l'une des classes prĂ©cĂ©demment connues - c'est-Ă -dire les divisions de l'entreprise. 



Il y avait de nombreuses solutions. Il s'agit d'un "rĂ©seau neuronal", d'un "classificateur bayĂ©sien naĂŻf", d'un "voisin le plus proche", d'une "rĂ©gression logistique", d'un "arbre dĂ©cisionnel", d'un "boosting" et de nombreuses autres options. 



Il n'y aurait pas de temps pour essayer toutes les techniques. Par conséquent, je me suis installé sur les réseaux de neurones (j'ai longtemps voulu essayer de travailler avec eux). Comme il s'est avéré plus tard, ce choix était pleinement justifié.



Alors, j'ai commencĂ© ma plongĂ©e dans les rĂ©seaux de neurones Ă  partir d'ici . A Ă©tudiĂ© les algorithmes d'apprentissagerĂ©seaux de neurones: avec un enseignant (apprentissage supervisĂ©), sans enseignant (apprentissage non supervisĂ©), avec implication partielle d'un enseignant (apprentissage semi-supervisĂ©) ou «apprentissage par renforcement». 



Dans le cadre de ma tâche, la mĂ©thode d'enseignement avec un enseignant est apparue. Il y a plus qu'assez de donnĂ©es pour la formation: plus de 100 000 applications rĂ©solues. 



Choix de l'implémentation



J'ai choisi la bibliothèque Encog Machine Learning Framework pour l'implĂ©mentation . Il est livrĂ© avec une documentation accessible et comprĂ©hensible avec des exemples . D'ailleurs, l'implĂ©mentation pour Java, qui est proche de moi. 



En bref, la mĂ©canique du travail ressemble Ă  ceci:  



  1. Le cadre du rĂ©seau de neurones est prĂ©configurĂ©: plusieurs couches de neurones connectĂ©s par des connexions synapse. 



  2. Un ensemble de données d'apprentissage avec un résultat prédéterminé est chargé en mémoire.

  3. . «».  «» . 

  4. «» : , , .

  5. 3 4 . , . , - .



J'ai essayé divers exemples du framework, je me suis rendu compte que la bibliothèque gère les nombres à l'entrée avec un bang. Ainsi, l' exemple avec la définition d'une classe d'iris par la taille du bol et des pétales ( Fisher's Iris ) a bien fonctionné .



Mais j'ai un texte. Cela signifie que les lettres doivent en quelque sorte ĂŞtre transformĂ©es en chiffres. Je suis donc passĂ© Ă  la première Ă©tape prĂ©paratoire - la "vectorisation". 



La première option de vectorisation: par lettre



Le moyen le plus simple de transformer du texte en nombres est de prendre l'alphabet sur la première couche du réseau neuronal. Il s'avère 33 lettres-neurones: ABVGDEOZHZYKLMNOPRSTUFHTSZHSHSCHYEYUYA.



Chacun se voit attribuer un numéro: la présence d'une lettre dans un mot est considérée comme un, et l'absence est considérée comme zéro.



Alors le mot "bonjour" dans ce codage aura un vecteur: 







un tel vecteur peut dĂ©jĂ  ĂŞtre donnĂ© au rĂ©seau de neurones pour l'entraĂ®nement. Après tout, ce nombre est 001001000100000011010000000000000 = 1216454656 Après avoir fouillĂ© 



dans la théorie, je me suis rendu compte qu'il n'y avait pas de point particulier dans l'analyse des lettres. Ils n'ont aucune signification sémantique. Par exemple, la lettre «A» figurera dans chaque texte de la proposition. Considérez que ce neurone est toujours allumé et n'aura aucun effet sur le résultat. Comme toutes les autres voyelles. Et dans le texte de l'application, il y aura la plupart des lettres de l'alphabet. Cette option ne convient pas.



La deuxième variante de la vectorisation: par dictionnaire



Et si vous ne prenez pas des lettres, mais des mots? Disons le dictionnaire explicatif de Dahl. Et pour compter comme 1 dĂ©jĂ  la prĂ©sence d'un mot dans le texte, et l'absence - comme 0. 



Mais ici, je suis tombé sur le nombre de mots. Le vecteur s'avérera être très grand. Un neurone avec 200k neurones d'entrée prendra une éternité et nécessitera beaucoup de mémoire et de temps CPU. Vous devez créer votre propre dictionnaire. De plus, il y a une spécificité informatique dans les textes que Vladimir Ivanovitch Dal ne connaissait pas.



Je suis retournĂ© Ă  la thĂ©orie. Pour raccourcir le vocabulaire lors du traitement de textes, utilisez les mĂ©canismes de N-grammes - une sĂ©quence de N Ă©lĂ©ments. 



L'idée est de diviser le texte d'entrée en certains segments, de composer un dictionnaire à partir d'eux et d'alimenter le réseau de neurones avec la présence ou l'absence d'une phrase dans le texte d'origine comme 1 ou 0. Autrement dit, au lieu d'une lettre, comme dans le cas de l'alphabet, pas seulement une lettre, mais une phrase entière sera considérée comme 0 ou 1.



Les plus populaires sont les unigrammes, les bigrammes et les trigrammes. En utilisant l'expression "Bienvenue dans DataLine" comme exemple, je vais vous parler de chacune des méthodes.



  1. Unigramme - le texte est divisé en mots: "bon", "bienvenue", "v", "DataLine".

  2. Bigram - nous le divisons en paires de mots: "bienvenue", "bienvenue Ă ", "Ă  DataLine".

  3. Trigramme - de mĂŞme, 3 mots chacun: "bienvenue Ă ", "bienvenue Ă  DataLine".

  4. N-grammes - vous voyez l'idée. Combien de N, autant de mots d'affilée.

  5. N-. , . 4- N- : «»,« », «», «» . . .



J'ai dĂ©cidĂ© de me limiter Ă  l'unigramme. Mais pas seulement un unigramme - les mots sortaient encore trop. 



L' algorithme "Porter Stemmer" est venu Ă  la rescousse , qui a Ă©tĂ© utilisĂ© pour unifier les mots en 1980. 



L'essence de l'algorithme: supprimer les suffixes et les fins du mot, ne laissant que la partie sémantique de base. Par exemple, les mots «important», «important», «important», «important», «important», «important» sont ramenés à la base «important». Autrement dit, au lieu de 6 mots, il y en aura un dans le dictionnaire. Et c'est une réduction significative.



De plus, j'ai supprimé du dictionnaire tous les nombres, signes de ponctuation, prépositions et mots rares, afin de ne pas créer de «bruit». En conséquence, pour 100 000 textes, nous avons obtenu un dictionnaire de 3 000 mots. Vous pouvez déjà travailler avec cela.



Formation sur les réseaux neuronaux



Donc j'ai déjà:



  1. Dictionnaire de 3k mots.
  2. Représentation de dictionnaire vectorisée.
  3. Les tailles des couches d'entrée et de sortie du réseau neuronal. Selon la théorie, un dictionnaire est fourni sur la première couche (entrée) et la couche finale (sortie) est le nombre de classes de solution. J'en ai 44 - par le nombre de divisions de l'entreprise.







Pour entraîner un réseau de neurones, il reste très peu de choix:



  1. MĂ©thode d'enseignement.
  2. Fonction d'activation.
  3. Le nombre de calques masqués.


Comment j'ai sélectionné les paramètres . Les paramètres sont toujours sélectionnés empiriquement pour chaque tâche spécifique. C'est le processus le plus long et le plus fastidieux, car il nécessite beaucoup d'expérimentation.



J'ai donc pris un échantillon de référence de 11k applications et fait le calcul d'un réseau de neurones avec différents paramètres:



  1. À 10k, j'ai formé un réseau de neurones.
  2. À 1k j'ai testé le réseau déjà formé.


Autrement dit, à 10 km, nous construisons un vocabulaire et apprenons. Et puis nous montrons le réseau neuronal formé 1k textes inconnus. Le résultat est le pourcentage d'erreur: le rapport des unités devinées au nombre total de textes.



En consĂ©quence, j'ai atteint une prĂ©cision d'environ 70% sur des donnĂ©es inconnues. 



Empiriquement, j'ai dĂ©couvert que la formation peut se poursuivre indĂ©finiment si les mauvais paramètres sont choisis. Plusieurs fois, le neurone est entrĂ© dans un cycle de calcul sans fin et a suspendu la machine de travail pour la nuit. Pour Ă©viter cela, pour moi-mĂŞme, j'ai acceptĂ© la limite de 100 itĂ©rations ou jusqu'Ă  ce que l'erreur rĂ©seau cesse de diminuer. 



Voici les paramètres:



MĂ©thode d'enseignement . Encog propose plusieurs options au choix: RĂ©tropropagation, ManhattanPropagation, QuickPropagation, ResilientPropagation, ScaledConjugateGradient.



Ce sont différentes manières de déterminer les poids aux synapses. Certaines méthodes fonctionnent plus rapidement, certaines sont plus précises, il vaut mieux en lire plus dans la documentation. La propagation résiliente a bien fonctionné pour moi



Fonction d'activation . Il est nĂ©cessaire de dĂ©terminer la valeur du neurone en sortie, en fonction du rĂ©sultat de la somme pondĂ©rĂ©e des entrĂ©es et de la valeur seuil. 



J'ai choisi parmi 16 options . Je n'ai pas eu assez de temps pour vérifier toutes les fonctions. Par conséquent, j'ai considéré le plus populaire: la tangente sigmoïde et hyperbolique dans diverses implémentations.



En fin de compte, je me suis installé sur ActivationSigmoid



Nombre de couches cachĂ©es... En thĂ©orie, plus les couches sont cachĂ©es, plus le calcul est long et difficile. J'ai commencĂ© avec une couche: le calcul Ă©tait rapide, mais le rĂ©sultat Ă©tait inexact. Je me suis installĂ© sur deux couches cachĂ©es. Avec trois couches, il Ă©tait considĂ©rĂ© comme beaucoup plus long et le rĂ©sultat ne diffĂ©rait pas beaucoup d'un Ă  deux couches. 



Sur ce, j'ai terminé les expériences. Vous pouvez préparer l'outil pour la production.



Ă€ la production!



En outre, une question de technologie. 



  1. J'ai foiré Spark pour pouvoir communiquer avec le neurone via REST.

  2. Enseigné pour enregistrer les résultats du calcul dans un fichier. Pas à chaque fois de recalculer lors du redémarrage du service.

  3. Ajout de la possibilitĂ© de lire les donnĂ©es rĂ©elles pour la formation directement depuis le Service Desk. Auparavant formĂ© sur les fichiers csv. 

  4. Ajout de la possibilité de recalculer le réseau neuronal pour attacher le recalcul au planificateur.

  5. Tout rassemblé dans un pot épais.

  6. J'ai demandé à mes collègues un serveur plus puissant qu'une machine de développement.

  7. Zaploil et zadulil racontent une fois par semaine.

  8. J'ai vissé le bouton au bon endroit dans le Service Desk et j'ai écrit à mes collègues comment utiliser ce miracle.

  9. J'ai recueilli des statistiques sur ce que le neurone choisit et ce que la personne a choisi (statistiques ci-dessous). 



Voici Ă  quoi ressemble une application de test: 







Mais dès que vous appuyez sur le "bouton vert magique", la magie opère: les champs de la carte sont remplis. Le répartiteur doit uniquement s'assurer que le système invite correctement et enregistre la demande.







Le résultat est un assistant tellement intelligent pour le répartiteur.



Par exemple, les statistiques du dĂ©but de l'annĂ©e. 







Il existe également un réseau de neurones "très jeune" réalisé selon le même principe. Mais il y a encore peu de données, elle gagne encore en expérience.







Je serai heureux si mon expĂ©rience aidera quelqu'un Ă  crĂ©er son propre rĂ©seau neuronal. 

Si vous avez des questions, je serai ravi d'y répondre.



All Articles