Hello, world

Het classificeren van tekstuele gegevens is een van de belangrijkste taken bij natuurlijke taalverwerking (NLP) en kent verschillende toepassingen, waaronder sentimentanalyse, spamdetectie en onderwerpmodellering. Het werken met tekstuele gegevens is echter een uitdaging in vergelijking met numerieke gegevens vanwege de ongestructureerde aard van tekst. In tegenstelling tot getallen heeft tekst geen vast formaat, waardoor het moeilijker wordt om de betekenis eruit te halen en te classificeren.

Met de opkomst van chatGPT lijkt het erop dat we een nieuwe tool bij de hand hebben die tekst kan interpreteren. De onderliggende technologie, transformatoren genaamd, werd voor het eerst beschreven in 2017 in het Google-paper ‘Attention is all you need’ [https://arxiv.org/abs/1706.03762]. Het projecteert woorden in een semantische vectorruimte – dit concept bestaat al veel langer – zodat hun relatieve posities overeenkomen met hun relatieve betekenissen. Neem het volgende voorbeeld. Als we een semantische ruimte van dimensie twee hebben, dan zouden de woorden ‘koning’, ‘koningin’, ‘man’ en ‘vrouwen’ als volgt met elkaar verbonden zijn:

Er zijn drie redenen waarom op transformatoren gebaseerde taalmodellen de wereld verbijsterd hebben en AI-legendes prediken dat we deze systemen ethisch moeten ontwerpen om niet uit te sterven.

  • een aandachtsmechanisme leert hoe woorden in een tekst elkaar beïnvloeden, waardoor het leren van afhankelijkheden op lange termijn mogelijk wordt
  • de architectuur is parallelleerbaar, zodat grote hoeveelheden gegevens binnen een redelijke tijd kunnen worden verwerkt
  • nieuwe trainingstechnieken hebben het mogelijk gemaakt om deze modellen te trainen op ongelabelde gegevens, waardoor vrijwel alle bestaande tekstuele gegevens kandidaat-trainingsgegevens zijn geworden (wetenschappelijke artikelen, websites, filmscripts…)

Waar tekst vroeger werd geclassificeerd op basis van structurele kenmerken, zoals de lengte van de tekst, de aanwezigheid van specifieke woorden of zinsdelen en de frequentie van specifieke tekens of symbolen, kan deze nu worden geclassificeerd op basis van de betekenis ervan. In de volgende sectie bespreken we verschillende methoden voor het classificeren van tekstuele gegevens met behulp van open-source taalmodellen van Hugging Face.

Semantische tekstclassificatie

De kracht van taalmodellen ligt in hun vermogen om kennis uit hun enorme trainingsdatasets over te dragen naar uw gebruiksscenario. Laten we zeggen dat je wat tekst hebt om te classificeren, maar er zijn geen gelabelde gegevens en je weet niet eens wat de mogelijke klassen zijn. Door de tekst in semantische ruimte te clusteren, kunt u gerelateerde teksten samen classificeren. Je kunt dit proberen door chatGPT in de ene query te vragen 10 willekeurige dieren te genereren, en in een andere query om die dieren in twee klassen te classificeren. In essentie vindt er onder de motorkap een semantische clustering plaats.

Als u klasselabels kent, kunt u afstandsstatistieken in de semantische ruimte gebruiken om tekst te classificeren. Als je chatGPT vraagt of een paard een zoogdier of een amfibie is, zal het zoogdier correct antwoorden, omdat het uit training weet hoe paarden, zoogdieren en amfibieën zich verhouden. Dit wordt zero-shot-tekstclassificatie genoemd [https://huggingface.co/tasks/zero-shot-classification]. Je kunt er ook je lessen mee beschrijven en b.v. classificeer bakker als “een baan waarvoor je vroeg moet opstaan” en barman als “een baan waarvoor je laat kunt opstaan”. Dit is leuk voor eenvoudige vragen, maar zal niet goed werken voor complexere taken, wanneer domeinkennis vereist is of wanneer u kleinere taalmodellen gebruikt.

U kunt het diepere begrip van een taalmodel benutten om complexere gebruiksscenario’s aan te pakken door extra informatie in de tekstprompt zelf te verstrekken. Als je de volgende prompt geeft aan chatGPT: "Als een paard A is en een kikker B, wat is dan een zebra?" het zal correct A zeggen, omdat het model weet dat paarden en zebra's meer op elkaar lijken dan kikkers en zebra's, en dat paarden het label A krijgen. Dit wordt 'in-context leren' genoemd en is erg handig voor het structureren van ongestructureerde tekst op basis van een enkele of een paar voorbeelden, b.v. voor het maken van SQL-query's op basis van vragen. Het maakt de gevolgtrekking echter iets langzamer, omdat hoe meer voorbeelden u geeft, hoe meer tekst elke keer door het taalmodel moet worden verwerkt.

Laten we nu zeggen dat je meer subjectieve klassen hebt, zoals goede bieren en slechte bieren. Met slechts een paar voorbeelden (ongeveer tien per klas) kunnen taalmodellen worden verfijnd om de inbedding van de goede bieren dichter bij elkaar te brengen en verder van die voor slechte bieren. In combinatie met een eenvoudige classificator heb je maar een paar voorbeelden van goede bieren en slechte bieren nodig om te weten dat de goede Belgisch zijn. Dit wordt een paar-shot-tekstclassificatie genoemd [https://huggingface.co/blog/setfit]. Het maakt het mogelijk om uw dataset handmatig te bewerken om uw classificator af te stemmen.

Als er voldoende gelabelde gegevens zijn (zeg 1000 exemplaren per klasse), is het nog steeds wenselijk om een goede classificator te bouwen door een taalmodel te verfijnen [https://huggingface.co/learn/nlp-course/chapter3/3?fw=pt #een-model-met-de-trainer-api nauwkeurig afstemmen en er een geavanceerde classificator op trainen. Als je het goed doet, levert dit de beste prestaties op.

Persoonlijke lessen

Onlangs heb ik bij een klant gewerkt voor een functie voor tekstclassificatie. Ik begon met een zero-shot classificatiepijplijn, maar het werd al snel duidelijk dat het afstemmen van klassebeschrijvingen een omslachtig en handmatig proces was en niet nuttig om een goed raamwerk op te bouwen. De resultaten van de zero-shot-classificatie, beoordeeld door een zakelijke gebruiker, bleken waardevolle voorbeelden te zijn, dus heb ik daarna gekozen voor een paar-shot-leeraanpak. In totaal heb ik drie keer zoveel tijd besteed aan deze functie. Om te voorkomen dat u hetzelfde doet, volgen hier enkele tips:

  1. Verwachtingsmanagement: taalmodel-webinterfaces zoals ChatGPT en Hugging Face-chat zijn mooie demonstraties van de kracht van taalmodellen. Het zijn echter nog steeds machine learning-modellen. Ze vereisen een zorgvuldige integratie in uw applicatie, goed gedefinieerde taken en veel testen. Als u ze gebruikt om zakelijke gebruikers te triggeren, zorg er dan voor dat u ook de verwachtingen tempert. Als je er zelf door getriggerd bent, doe dan zeker goed onderzoek naar het onderwerp en kijk naar (state-of-the-art) alternatieven. Het is zonde om maandenlang aan iets te werken en te beseffen dat er al een gemakkelijke oplossing voorhanden is.
  2. Hybride oplossingen: tijdens iteraties met de zakelijke gebruikers merkte ik de subjectiviteit van onze lessen op en hoe sommige verkeerde classificaties duurder zijn dan andere (denk aan het diagnosticeren van een zieke persoon als gezond of het beoordelen van een kwetsbare brug als stabiel). Er is maar zoveel dat je kunt doen met begeleid leren. Zorg ervoor dat u whitelist- en blacklist-mogelijkheden opneemt, zodat u opmerkingen in toekomstige iteraties kunt opnemen (accountmanager is geen manager op de financiële afdeling, maar een medewerker op de verkoopafdeling).
  3. Denk vooruit: je zult de minste tijd aan een taak als deze besteden door er rekening mee te houden dat je enige tijd aan een taak als deze zult besteden:
  • Doe je onderzoek. Je zult merken dat veel van je ideeën al eerder zijn uitgeprobeerd en vaak kun je zelfs code vinden om mee te beginnen. Als u blackbox-componenten zoals taalmodellen gebruikt, zorg er dan voor dat u weet op welke gegevens ze zijn getraind, zodat u geen tijd verspilt aan een Engels model voor een meertalige taak.
  • Structureer uw code. Het is een data science-project, dus splits uw repository op in een data-, modellen- en codesectie. Versie en beschrijf uw gegevens duidelijk. Bewaar modelkaarten die het specifieke model beschrijven, evenals de trainingsgegevens ervan, indien gebruikt. Houd natuurlijk uw codegeschiedenis bij met een tool als git.
  • Identificeer samen met zakelijke gebruikers KPI’s die de prestaties van uw model beoordelen en voor hen begrijpelijk zijn. Bespreek de use-case. Betrek de zakelijke gebruikers bij een gedachte-experiment: “Als ik u een model zou kunnen geven dat uw tekst classificeert met een nauwkeurigheid van bijvoorbeeld 90%, wat zou u er dan mee doen?” Het kan u meteen duidelijk maken dat het model niet zal worden gebruikt vanwege zakelijke beperkingen.
  • Anticipeer op feedback en neem deze op. Als u nog geen gelabelde gegevens heeft, heeft u deze nodig voor het evalueren van uw model. U kunt zakelijke gebruikers de resultaten laten bekijken, maar u kunt er goed aan doen de resultaten mee te nemen voor volgende iteraties (zorg er uiteraard voor dat u niet op uw trainingsset test).
  1. Gegevenskwaliteit: in de eerste plaats is het waardeloos om gegevens te labelen. Zoals ik al zei, heb je in ieder geval gegevens nodig om je model te beoordelen. Zorg ervoor dat u slechts één keer hoeft te etiketteren. Kies lessen verstandig en met het juiste niveau van granulariteit. Controleer de literatuur op bestaande raamwerken. Uw tekstclassificatietaak is waarschijnlijk ouder dan u denkt en raamwerken zijn ontwikkeld door mensen met veel domeinkennis – denk voor functieclassificatie bijvoorbeeld aan de European Standard Classification of Occupations (ESCO). Breng verder uw voorbeelden in evenwicht om een goed beeld te krijgen van de nauwkeurigheid van alle klassen en voor een evenwichtige training als u een classificatie met weinig schoten uitvoert. Als u de gegevens niet in evenwicht kunt brengen, gebruik dan specifieke trainingsmethoden voor onevenwichtige gegevens, zoals een gewogen kostenfunctie.