Aandacht, dialoog en herbruikbare patronen leren

Rasa Core is een op open source gebaseerd machine learning dialoogsysteem voor het bouwen van niveau 3 contextuele AI-assistenten. In versie 0.11 hebben we ons nieuwe inbeddingsbeleid (REDP) verzonden, dat veel beter is in het omgaan met niet-coöperatieve gebruikers dan onze standaard LSTM (Rasa-gebruikers zullen dit kennen als de KerasPolicy). We presenteren er een paper over op NeurIPS, en deze post legt het probleem uit dat REDP oplost en hoe het werkt.

Ons nieuwe dialoogmodel (REDP) overtreft ons standaard LSTM-beleid bij het omgaan met niet-coöperatieve gebruikers. Deze plots worden hieronder nader toegelicht.

Niet-meewerkende gebruikers maken het leven van een ontwikkelaar moeilijk

Het moeilijke van het bouwen van een goede AI-assistent is omgaan met de oneindige manieren waarop uw gebruikers van het gelukkige pad afdwalen. REDP, ons nieuwe dialoogbeleid, heeft twee voordelen: (1) het is veel beter in het leren omgaan met niet-coöperatief gedrag, en (2) het kan deze informatie hergebruiken bij het leren van een nieuwe taak.

Wat bedoelen we met niet-coöperatief gedrag? Om het punt duidelijk te maken, nemen we het voorbeeld van de altijd populaire restaurantaanbeveling, maar hetzelfde geldt voor het bouwen van een assistent voor IT-probleemoplossing, klantenondersteuning of iets anders. Stel dat je 3 stukjes informatie van een gebruiker nodig hebt om een ​​eetgelegenheid aan te bevelen. De voor de hand liggende aanpak is om een ​​while-lus te schrijven om deze 3 dingen te vragen. Helaas is een echte dialoog niet zo eenvoudig en zullen gebruikers je niet altijd de gevraagde informatie geven (althans niet meteen).

Wanneer we een gebruiker vragen "welke prijsklasse u zoekt?", Kunnen deze reageren met:

  • “Waarom moet je dat weten?” (Enge context)
  • “Kun je me al wat restaurants laten zien?” (Brede context)
  • “Eigenlijk nee, ik wil Chinees eten” (correctie)
  • "Ik zou waarschijnlijk meer voor mezelf moeten koken" (gekakel)

We noemen dit niet-meewerkende gedrag. Er zijn veel andere manieren waarop een gebruiker zou kunnen reageren, maar in onze paper bestuderen we deze vier verschillende soorten. Hier is een voorbeeldgesprek:

In elk geval moet de assistent op een nuttige manier reageren op het (niet-meewerkende) bericht van de gebruiker en het gesprek vervolgens in de goede richting sturen. Om dit correct te doen, moet u rekening houden met verschillende soorten context. Uw dialoog moet rekening houden met de lange-termijnstatus van het gesprek, wat de gebruiker zojuist heeft gezegd, wat de assistent zojuist heeft gezegd, wat de resultaten van API-oproepen waren en meer. We beschrijven dit in meer detail in dit bericht.

Regels gebruiken om niet-coöperatief gedrag te verwerken, wordt rommelig snel

Als je al een aantal AI-assistenten of chatbots hebt gebouwd, realiseer je je waarschijnlijk wat een hoofdpijn dit is en kun je doorgaan naar het volgende gedeelte. Maar laten we proberen een aantal regels te bedenken voor een van de eenvoudigste en meest voorkomende niet-meewerkende antwoorden: ik weet het niet. Om een ​​gebruiker te helpen bij het vinden van een restaurant, kunnen we vragen stellen over de keuken, de locatie, het aantal personen en de prijsklasse. De API die we vragen, vereist een keuken, locatie en aantal personen, maar de prijsklasse is optioneel.

We willen dat onze assistent zich zo gedraagt: als de gebruiker het antwoord op een optionele vraag niet weet, ga dan naar de volgende vraag. Als de vraag niet optioneel is, stuur dan een bericht om ze te helpen erachter te komen en geef ze vervolgens nog een kans om te antwoorden. Tot nu toe, zo simpel.

Maar als de gebruiker zegt dat ik het niet twee keer achter elkaar weet, moet je escaleren (bijvoorbeeld doorgeven aan een menselijke agent, of op zijn minst erkennen dat dit gesprek niet zo goed verloopt). Behalve natuurlijk als een van de "Ik weet het niet" een antwoord was op een optionele vraag.

Je kunt deze veel logica redelijk goed aan met een paar geneste if-statements. Maar om met echte gebruikers om te gaan, moet u omgaan met veel soorten niet-coöperatief gedrag en met elk gebruikersdoel dat uw assistent ondersteunt. Voor een mens is het duidelijk wat het juiste is om te doen, maar het is niet zo eenvoudig om een ​​consistente set regels te schrijven en te onderhouden die dat zo maken. Wat als we een model zouden kunnen bouwen dat deze dialoogpatronen zou kunnen achterhalen en ze in nieuwe contexten zou kunnen hergebruiken?

REDP gebruikt aandacht om niet-coöperatieve dialoog af te handelen

Aandacht is een van de belangrijkste ideeën in diep leren van de afgelopen jaren. Het kernidee is dat een neuraal netwerk niet alleen kan leren hoe het invoergegevens moet interpreteren, maar ook kan leren welke delen van de invoergegevens moeten worden geïnterpreteerd. Een beeldclassificator die verschillende dieren kan detecteren, kan bijvoorbeeld leren de blauwe lucht op de achtergrond te negeren (wat niet erg informatief is) en vooral aandacht te schenken aan de vorm van het dier, of het poten heeft en de vorm van het hoofd .

We hebben hetzelfde idee gebruikt om niet-coöperatieve gebruikers te behandelen. Na correct te hebben gereageerd op het niet-meewerkende bericht van een gebruiker, moet de assistent terugkeren naar de oorspronkelijke taak en door kunnen gaan alsof de afwijking nooit is gebeurd. REDP bereikt dit door een aandachtsmechanisme toe te voegen aan het neurale netwerk, waardoor het de irrelevante delen van de dialooggeschiedenis kan negeren. De onderstaande afbeelding is een illustratie van de REDP-architectuur (een volledige beschrijving staat in de krant). Het attentiemechanisme is gebaseerd op een aangepaste versie van de neurale turingmachine en in plaats van een classifier gebruiken we een 'embed-and-rank'-benadering, net als in de inbeddingspijplijn van Rasa NLU.

Er is eerder aandacht besteed aan dialoogonderzoek, maar het inbeddingsbeleid is het eerste model dat aandacht specifiek gebruikt voor het omgaan met niet-coöperatief gedrag, en ook om die kennis opnieuw te gebruiken in een andere taak.

REDP Leert wanneer er GEEN aandacht aan moet worden besteed

In de onderstaande afbeelding tonen we een Rasa Core-verhaal in het midden en een bijbehorend gesprek aan de rechterkant. Aan de linkerkant is een staafdiagram dat laat zien hoeveel aandacht ons model besteedt aan verschillende delen van de gespreksgeschiedenis wanneer het de laatste actie kiest (utter_ask_price). Merk op dat het model de vorige niet-coöperatieve gebruikersberichten volledig negeert (er zijn geen balken naast chitchat, correct, uitleggen, enz.). Het inbeddingsbeleid is beter in dit probleem, omdat het na het beantwoorden van de vraag van een gebruiker kan doorgaan met de taak die moet worden uitgevoerd en kan negeren dat de afwijking ooit is gebeurd. De gearceerde en solide balken tonen de aandachtsgewichten boven de gebruikersberichten respectievelijk systeemacties.

REDP is veel beter dan een LSTM Classifier bij het omgaan met niet-coöperatieve gebruikers

Deze plot vergelijkt de prestaties van REDP en de standaard Rasa Core LSTM (Rasa-gebruikers zullen dit kennen als de KerasPolicy). We zijn het aantal dialogen in de testset aan het plannen waar elke actie correct wordt voorspeld, terwijl we steeds meer trainingsgegevens toevoegen. We hebben twee enigszins verschillende versies van de LSTM (lees de paper voor meer informatie).

Patronen voor taken hergebruiken

We wilden niet alleen zien hoe goed REDP kon omgaan met niet-meewerkende gebruikers, maar ook om te zien of het die informatie in een nieuwe context kon hergebruiken. Stel dat uw Rasa-assistent bijvoorbeeld al een heleboel trainingsgegevens van echte gebruikers heeft (omdat ze niet meewerken, zoals ze altijd zijn ). Nu wilt u ondersteuning toevoegen voor een nieuw gebruikersdoel. Hoe goed kan uw assistent omgaan met afwijkingen van het gelukkige pad, zelfs wanneer hij nog nooit eerder onwillig gedrag heeft gezien in deze taak?

Om dit te testen, hebben we een treintestgesplit gemaakt van dialogen voor een hotelboekingstaak (met een heleboel niet-coöperatief gedrag), en de prestaties vergeleken met en zonder trainingsgegevens van een andere taak (boeking van een restaurant).

V1 van REDP toonde een groot voordeel van overdrachtsonderwijs

De bovenstaande grafiek toont enkele resultaten voor een vroege versie van REDP (niet de laatste, die zullen we hierna tonen). De testset bevindt zich in het hoteldomein. De vierkanten laten zien hoe de prestaties verbeteren wanneer we ook trainingsgegevens uit het restaurantdomein opnemen. Er is een grote sprong in prestaties, waaruit blijkt dat REDP kennis uit een andere taak kan hergebruiken! Dit wordt ook transfer learning genoemd. Hier is hetzelfde plot voor de LSTM. Er is enig bewijs van transfer-learning, maar het is veel kleiner dan voor REDP:

V2 van REDP lost de taak zeer snel op

Deze plot toont de resultaten voor de ‘definitieve’ versie van REDP, die wordt beschreven in de paper en geïmplementeerd in Rasa Core. De prestaties zijn veel beter dan die van V1. Met slechts de helft van de gegevens bereikt REDP bijna 100% testnauwkeurigheid. We zien nog steeds een voordeel van transfer learning, maar er is niet veel ruimte voor verbetering bij het toevoegen van trainingsgegevens voor restaurants.

Volgende stappen

We zijn erg enthousiast over het inbeddingsbeleid en hebben nog een aantal experimenten lopen om te laten zien wat het kan doen. Het maakte gehakt vlees van de eerste taak die we het gaven, dus we gooien het op nog moeilijkere problemen om overdrachtsonderwijs in het wild te bestuderen.

Probeer REDP in je dataset! De code en gegevens voor het papier zijn hier beschikbaar. Deel uw resultaten in deze thread op het Rasa-forum.

Er wordt hard gewerkt aan de realisatie van de 5 niveaus van AI-assistenten, dus als u aan deze problemen wilt werken en oplossingen naar een codebase wilt verzenden die door duizenden ontwikkelaars wereldwijd wordt gebruikt, sluit u aan! We zijn aan het inhuren.

Oorspronkelijk gepubliceerd op blog.rasa.com op 29 november 2018.