iX Special Künstliche Intelligenz

139 14 14MB

German Pages 156 Year 2023

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

iX Special Künstliche Intelligenz

Citation preview

Anzeige

SPECIAL

2023

Künstliche Intelligenz verstehen, anwenden, selbst entwickeln Was große Sprachmodelle können Wie funktionieren GPT-4, Bard und Co. und wie setzt man sie ein? Hugging Face: die Zentrale für Open-Source-KI Stable Diffusion seziert

Eigene Projekte ganz konkret Neuronale Suche findet, was wirklich gemeint ist Musiksammlungen mit Kubeflow klassifizieren KI auf dem Handy – Emotionen in Selfies erkennen

Ohne Hardware geht nichts So funktionieren KI-Beschleuniger Aktuelle GPUs im Leistungsvergleich

Machine Learning selbst gemacht Mit PyTorch und scikit-learn in die KI-Entwicklung starten Mit LangChain Modelle verknüpfen und Agenten bauen Was ist erlaubt, was nicht: DSGVO, Data Act und AI Act © Copyright by Heise Medien.

14,90 € Österreich 16,40 € Schweiz 27.90 CHF Luxemburg 17,10 €

www.ix.de

© Copyright by Heise Medien.

Editorial | KI selbst machen

Verstehen statt vermenschlichen Ȗ ChatGPT war noch 60 Tage entfernt, als in der iX-Redaktion im vergangenen Herbst die Entscheidung fiel, Machine Learning und künstliche Intelligenz zum Thema des iX Special 2023 zu machen. Dann, ab jenem 30. November 2022, schien die Welt, und nicht nur die der IT, für immer verändert. Open­ AIs Sprachmodell wurde zum Tagesgespräch in Bars und Friseursalons, keine Regionalzeitung kam ohne Kommentar über die Möglichkeiten und Gefahren von KI aus, und alle mussten dabei sein: „Helgoländer Pastorin lässt Predigt von künstlicher Intelligenz schreiben“, titelte die Evangelische Zeitung – die katholische Konkurrenz ließ sich nicht lumpen, das Erzbistum Paderborn stellte ein „Interview“ mit ChatGPT prominent auf seine Website und ließ die Software sogar ein Gebet sprechen. Und hier liegt im Kern ein wichtiger Grund für seine Popularität. Denn natürlich kann ChatGPT kein Interview geben. Es hat ja keine Meinung und wäre dem Atheistenverband ebenso zu Willen. Aber die Form der Interaktion, das simulierte Gespräch mit dem KI-Modell, zieht zumindest zeitweilig fast alle Benutzer in einen Sog der Vermenschlichung. Das ist das Neue – alles andere, die Technik, die Methoden, das gab es vorher schon. Nicht ganz so mächtig, aber doch nur quantitativ verschieden.

Sicher ist: KI wird unser Leben schnell umkrempeln und noch einige Überraschungen bereithalten. So oder so birgt sie auch jede Menge ernsthafte Risiken, selbst wenn sie von echtem Weltverständnis oder einem eigenen Willen weit entfernt ist. Ihre Faszination werden selbstlernende und zunehmend mit der Außenwelt agierende KI-Modelle nicht so schnell verlieren, und solange das so ist, lohnt es sich, der Technik dahinter mit Neugier und Offenheit entgegenzutreten.

ULRICH WOLF

Und dieser Technik will sich dieses Heft widmen. Hier spielen die populären großen Modelle natürlich auch eine Rolle, etwa wenn wir uns das Innenleben von Stable Diffusion anschauen. Sie sind aber nicht die ausschließlichen Hauptdarsteller. Wir widmen uns auch Tools, Frameworks und Methoden, die nach wie vor wichtig sind oder wichtig werden, und den Rohstoffen des Machine Learnings, den Daten. Wir zeigen, wie der Bias eines neuronalen Netzes aus Statistik entsteht und wie die Hardwarebeschleuniger funktionieren, ohne die das Training großer Modelle nicht möglich wäre. Andere Beiträge laden zum Nach- und Mitmachen ein und demonstrieren, wie einfach es inzwischen ist, Machine-Learning-Anwendungen selbst zu entwickeln oder vorhandene, fortgeschrittene Modelle kreativ zu nutzen.

3

iX Special 2023 – KI © Copyright by Heise Medien.

Inhalt | iX Special 2023

Basics KI-Modelle verschleiern ihre Funktionsweise gerne durch viele Abstraktionsschichten. Ein Blick hinter die Magie von ChatGPT und Stable Diffusion hilft, große KI-Modelle sinnvoll einzusetzen. Wir zeigen, wie ­spezielle KI-Hardware das Training beschleunigt, und gehen der Frage nach, wie die Qualität der Trainingsdaten die Fairness der Modelle beeinflusst.

ab Seite 7 Basics

Bilderkennung

Large Language Models

AutoML

Emotionen erkennen mit Deep Learning

Sprachmodelle verstehen und einsetzen

8

Generative KI

AutoML mit Microsofts ML.NET Model Builder

Stable Diffusion seziert

16

Recht und Gesellschaft

So funktionieren KI-Chips

20

Rechtsrahmen

28

Urheberrecht

KI-Beschleuniger Hardware

GPUs für das KI-Training

Bias und Fairness

Warum KI oft unfair ist und was dagegen hilft

Datenqualität

34

Data-centric AI: Wie Datenqualität Fairness beeinflusst

40

Werkzeuge Machine-Learning-Frameworks Einstieg in PyTorch

ML-UI

50

66

Offene Datenquellen für ML-Projekte

72

Assoziationsanalyse: Wer mit wem?

80

Algorithmen

Modelle anwenden KI-Modell-Datenbanken

Hugging Face – Zentrale für KI-Modelle

Modelle verketten

KI im Spannungsfeld der Regulierung

128

Kampf um das Urheberrecht

132

KI versus Datenschutz

140

DSGVO

KI-Governance

Vertrauenswürdige KI organisatorisch umsetzen 144 Open-Source-Modelle können aufholen 148 Die Zukunft der KI – ohne Körper keine Intelligenz 150

58

Mit scikit-learn Modelle erstellen

Datenquellen

122

Ausblick

Notebook-Umgebungen für Machine Learning

Data Science

116

86

Maschinell illustriert Normalerweise kommen alle Aufmacher der iX von unseren Grafikerinnen in Rostock – für dieses iX Special sind wir bei den Artikelund Ru­brikaufmachern einen anderen Weg gegangen. Passend zum Thema haben wir die Titelbilder von den KI-Modellen Midjourney und Stable Diffusion erstellen lassen. Motive waren Maschinen, ­Motoren und Industrieanlagen. Dabei sind erst mal viele Bilder auf Masse entstanden. Nicht alle generierten Inhalte konnten über­ zeugen und keiner der Aufmacher ist ohne den letzten Schliff von Chefgrafikerin Lisa Hemmerling ausgekommen.

Große Sprachmodelle mit LangChain verketten 90

Knowledge Destillation

Große KI-Modelle mit Destillation eindampfen

Generative KI

Das Einmaleins des Prompt Engineering

98

102

KI selbst entwickeln Dense Passage Retrieval

Maschinen auf Text abrichten

MLOps

106

Musikklassifikation mit eigenen Modellen 110 4

iX Special 2023 – KI © Copyright by Heise Medien.

Werkzeuge Python hat sich als die Programmiersprache der KI etabliert. Die Frameworks scikit-learn und PyTorch unterstützen Ent­ wickler vom Einstieg bis zum professionellen Einsatz. JupyterNotebooks und ihre Alternativen aus der Cloud helfen beim Auswerten der Daten und beim Experimentieren mit Modellen. Aber wo kriegt man Trainingsdaten her? Wir weisen den Weg zu den wichtigsten öffentlichen Quellen.

ab Seite 49

Modelle einsetzen Für viele Einsatzzwecke gibt es bereits geeignete Modelle. Mit der Transformers-Bibliothek von Hugging Face lassen sie sich nutzen. Der neuste Trend bei Chatbots ist das Ver­ knüpfen ­verschiedener Sprachmodelle. Mit dem Framework LangChain kann man KI-Agenten automatisieren und mit eigenen Daten f­ üttern. Das Ergebnis von Dialogsystemen ist dabei vor allem von der Nutzereingabe – dem Prompt – abhängig. Geschicktes Prompting ist keine Glückssache.

ab Seite 85

KI selbst entwickeln KI-Modelle müssen nicht gleich alle Texte des Internets kennen oder Probleme wie den Klimawandel angehen können. Mit wenig Aufwand lassen sich eigene Modelle zum Experimentieren und zum Erfüllen kleiner Aufgaben erstellen. Das reicht von der neuronalen Suche in der Dokumentensammlung über das Erkennen von Emotionen in Selfies bis zum Klassifizieren der eigenen Musiksammlung mit einem KI-Modell. Wer mit Algorithmen und Modellen noch nicht so vertraut ist, lässt sich diese von AutoML-Werkzeugen vorschlagen.

ab Seite 105

Recht und Gesellschaft Beim Thema KI stehen Entwickler, Anwender und Gesetzgeber noch vor juristischen Herausforderungen. Wie und wo das ­Urheberrecht gilt, ist umstritten und die DSGVO ist beim Umgang mit Trainingsdaten möglicherweise ein Stolperstein. Kommende Richt­linien wie AI Act und Data Act gilt es jetzt schon mitzu­ denken. Dabei können KI-Governance-Frameworks Unternehmen Orientierung liefern. Zwei Interviews am Ende des Hefts ordnen den aktuellen gesellschaftlichen und technischen Stand ein und versuchen sich an einem Blick in die Zukunft.

ab Seite 127 © Copyright by Heise Medien.

5

© Copyright by Heise Medien.

Basics | Basics

Basics – ein Blick in die Blackbox KI-Systeme leisten mittlerweile Erstaunliches. Die großen Modelle wissen mit Inhalten zu überzeugen, die bei Sprache und Bildern an die Fähigkeiten von Menschen heranreichen. Wie Daten, Bilder und Sprache durch die Modelle neu zusammengewürfelt werden, das verstecken diese Systeme allerdings besonders vor neuen und nicht technikaffinen Anwenderinnen und Anwendern. An der Spitze der aktuellen Welle an KI stehen die großen Sprachmodelle (Large Language Models, LLMs), deren Rückgrat die Transformer-Architektur ist. Bildgeneratoren wie Stable Diffusion müssen für das Erzeugen von Bildern aus Texteingaben viele verschiedene kleinere Systeme verzahnen. Damit KI überhaupt arbeiten kann, braucht es zweierlei: Hardware als Motor der Berechnungen und gute, unverzerrte Trainingsdaten. Auf der Hardwareseite lassen sich zwar GPUs einsetzen, besonders hochgezüchtete KI-Chips versprechen jedoch noch effizienteres Modelltraining. Wo die GPU der Antrieb der KI ist, da sind die Daten der Treibstoff. In diesen können sich auch Bias und Vorurteile niederschlagen, was dazu führt, dass Modelle Menschen diskriminieren können. Daher gilt es, von vornherein auf die Qualität der Trainingsdaten zu achten.

Große Sprachmodelle und die Transformer-Architektur erklärt 

8

Eine Führung durch die Schichten von Stable Diffusion 

16

Wie KI-Chips arbeiten und welche es gibt 

20

Die richtige GPU finden – Übersicht und Benchmarks 

28

Warum KI oft unfair ist und was dagegen hilft 

34

Wie sich Datenqualität auf ML-Modelle auswirkt 

40 7

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Sprach-KI

modelle konnte nur wachsen, weil große Firmen wie Google, Meta oder Microsoft die Basismodelle vortrainiert und offen zur Verfügung gestellt haben. Deswegen lohnt sich ein Blick auf diese Modelle und ihre speziellen Eigenschaften. Unter ix.de/zq3t findet sich dazu ein begleitendes Jupyter-Notebook.

Basissprachmodelle am Beispiel BERT

Sprachmodelle verstehen und einsetzen Große Sprachmodelle arbeiten mit Embedding-Vektoren, die den Kontext und die Beziehung von Wörtern mathematisch abbilden. Durch Feintuning und Zero-Shot-Klassifikation sind diese Modelle sehr vielseitig einsetzbar. Ein Überblick. Von Prof. Christian Winkler Ȗ Auch wenn ChatGPT im Moment in  aller Munde ist, steckt dahinter auch „nur“ ein Sprachmodell. Seit der Er­ findung dieser großen Sprachmodelle (Large Language Models, LLM) im Jahr 2017 durch Google hat sich daraus eine ganz neue Disziplin mit einem eigenen Ökosystem entwickelt. Viele früher sehr schwierige Fragestellungen können heutige Systeme bereits elegant lösen. Dafür gibt es mehrere Gründe: Der von Google erfundene Attention-Mechanismus hat sich als sehr leistungsfähig herausgestellt. Mithilfe von Transfer Learning lassen sich Sprachmodelle auf ganz spezifische Probleme anpassen. Das Gros des Rechenaufwands steckt dabei im Training der generischen allgemeinen Modelle, der Anpassungsaufwand ist eher gering. Das hat ein ganzes Ökosystem an Möglichkeiten generiert, weil viele Anpassungen der Modelle durch die Community implementiert wurden. Die Grundidee der Sprachmodelle besteht darin, fehlende Wörter vorherzusagen. Das Training dieser Modelle benötigt daher allein Fließtexte, die in nahezu

beliebiger Menge zur Verfügung stehen. Nutzerinnen und Nutzer müssen die Texte nicht mal separat herunterladen, weil Projekte wie Common Crawl das bereits erledigt haben. Der Rechenaufwand zum Training großer Sprachmodelle ist immens. Allerdings lassen sich diese Aufgaben hervorragend parallelisieren. Leistungsfähigere Grafikkarten oder Spezialhardware wie TPUs (Tensor Processing Units) können immer größere Modelle trainieren. Das Ökosystem der Sprach-

Schon länger haben Sequence-to-Sequence-Modelle beispielsweise bei Übersetzungen gute Ergebnisse erzielt, etwa beim deutschen Start-up DeepL. Google hat das als Basis genutzt und das System um einen Attention-Mechanismus erweitert. So entstand BERT (Bidirectional Encoder Representations from Transformers; siehe ix.de/zq3t). Der AttentionMechanismus führt dazu, dass das Modell bestimmten Wörter besonders beachtet, während andere keine große Rolle spielen – genau wie Menschen selbst auch Sprache wahrnehmen. Außerdem hat Google die Architektur dahingehend verändert, dass als Ergebnis nicht eine neue Sequenz herauskommt wie bei einer Übersetzung, sondern eine kontex­ tualisierte Darstellung jedes einzelnen Worts in Form eines Vektors. Diese Kontextualisierung ist besonders wichtig. Erst damit kann es einem Sprachmodell gelingen, bestimmte Mehrdeutigkeiten aufzulösen. Vorherige Modelle konnten zum Beispiel nicht mit Homo­nymen umgehen (einem Wort mit mehreren Bedeutungen, umgangssprachlich Teekesselchen). Die Kontextualisierung legt außerdem die Basis für die Interpretation rhetorischer Stilmittel wie Ironie oder Sarkasmus. Für die Kontextualisierung ist insbesondere die Bidirek­ tionalität wichtig: Für manche Wörter lässt sich der Sinn erst erfassen, wenn man den Satz zu Ende gelesen hat. Der Sinnzusammenhang erschließt sich erst durch das, was danach kommt. Besonders

1-TRACT ȫ Große Sprachmodelle (LLMs) wandeln Wörter in Token und diese in kontextuali­ sierte Vektor-Embeddings um. ȫ Durch die Ähnlichkeit von Wort-Embeddings erkennen die Systeme den Kontext von Wörtern, Sätzen und ganzen Dokumenten. ȫ Generative Sprachmodelle stehen aktuell stark im Fokus. Sie erzeugen auf Basis statistischer Vorhersagen kontextuell passende Texte. ȫ Mit LLMs lässt sich Text auf vielfältige Weise verändern, analysieren oder erstellen: Sentiment Detection, Named Entity Recognition und Textzusammenfassen sind nur ein Bruchteil dieser Fähigkeiten.

8

iX Special 2023 – KI © Copyright by Heise Medien.

Die Grundarchitektur von BERT besitzt 12 Layer, die bis zu 512 Token verarbeiten. Mit jedem Durchwandern eines Layers nimmt die Kontextualisierung der encodierten Embeddings zu (Abb. 1).

t­ rifft das für Stilmittel wie Ironie zu, die den Sinn sogar umkehren. „Lass mich ausreden“ gilt also auch für BERT. In der von Google vorgeschlagenen Architektur arbeitet BERT mit bis zu 512 Token, die ein Encoder in zwölf Layern codiert (siehe Abbildung 1). Dabei nimmt in jedem Layer die Kontextualisierung zu. Jedes Sprachmodell besitzt einen Tokenisierer, der die Token aus den Texten ermittelt. Im Unterschied zur herkömmlichen Textanalyse entspricht ein Token nicht notwendigerweise genau einem Wort, BERT kann auch Teilwörter, Suf­ fixe und Präfixe erkennen. In Abbildung 2 ist zu sehen, dass das System aus dem Wort Sprachmodell zwei Token macht. Um den Vorhersagen zusätzliche Stabilität zu geben, arbeitet man im Training mit einer Maskierung: Bestimmte Wörter ignoriert das System. Für eine weiter ­gehende Kontextualisierung hat Google BERT nicht nur auf die Vorher­ sage von Wörtern, sondern auch von ganzen Sätzen trainiert. Das originale BERT (BERT large) ist bereits ein sehr großes

12

Encoder

2

Encoder

1

Encoder 1

3

2

4

512

Modell mit 24 Layern und 768-dimen­ sionalen Embeddings und kommt damit auf 340 Millionen Parameter und entsprechend lange Trainingszeiten. Bereits ganz zu Anfang hat Google auch verkleinerte Versionen des Modells bereitgestellt, die etwa nur mit zwei Layern und 128-dimen­sionalen Embeddings rechnen. Diese haben dann weniger Para­ meter, können schneller Berechnungen durchführen, liefern aber schlechtere Ergebnisse. Überraschenderweise zeigte sich, dass das Training von BERT auch in mehreren Sprachen gleichzeitig funktioniert und es dabei nur zu geringen Einbußen der Ge-

nauigkeit kommt. Offenbar gibt es Eigenschaften, die allen Sprachen gemeinsam sind, die Menschen aber nicht gut wahrnehmen können. Diese mehrsprachigen Modelle sind ein weiterer Grund, warum BERT und große Sprachmodelle so erfolgreich sind.

Anpassen der LLM auf spezifische Aufgaben Warum sind die Sprachmodelle so leistungsfähig? Die Vorhersage einzelner Wörter ist für sich genommen nicht spannend, aber Sprachmodelle haben darüber allgemeine Features der Sprache kennen[MASK]

[MASK] [CLS]

Input

TokenEmbeddings

E

ist

BERT

E

E

[CLS]

BERT

SatzEmbeddings

EA

TransformerPositionEmbeddings

E1

Sprach

ein

E

E

[SEP]

modell

E

E

E

neue

nutzt

Es

E

E neue

Sprach

modell

[SEP]

EA

EA

EA

EB

EB

EB

EB

E4

E5

E6

E7

E8

E9

E10

ist

ein

EA

EA

E2

E3

Es

nutzt

Aus einem Textinput erfolgt das Tokenisieren und Berechnen der Embeddings. Lange oder zusammengesetzte Wörter teilt das System dabei manchmal auf mehrere Token auf (Abb. 2). 9

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Sprach-KI

gelernt. Weil es sich dabei um TransferLearning-Systeme handelt, lassen sich diese allgemeinen Features nutzen, um die Modelle auf ganz spezielle Anforderungen anzupassen. Es gibt eine große Anzahl solcher Modelle, die bestimmte Aufgaben sehr gut erledigen können. Zum Verständnis ist es aber sinnvoll, sich zunächst den Anpassungs- und Trainingsprozess genau anzuschauen. Eine häufige Fragestellung bei der Analyse von Texten ist die Klassifikation. Dabei geht es darum, vorhandene Texte in existierende Kategorien einzusortieren. Denkbar sind etwa fachliche Kategorien, das Zuordnen von Schlüsselwörtern zu den Texten oder das Entscheiden, ob eine bestimmte Aussage positiv, neutral oder negativ zu werten ist. Letzteres nennt sich auch Sentimentanalyse. Bereits klassische Methoden wie Support

Vector Machines erledigen das Zuordnen von Schlüsselwörtern oder das Erkennen fachlicher Kategorien bei einer hinreichend großen Trainingsmenge zuverlässig. Allerdings können diese Methoden nur sehr unzulänglich mit Sentiments umgehen, weil dafür nicht nur einzelne Wörter eine Rolle spielen, sondern der Kontext, in dem diese Wörter stehen. Dafür sind Sprachmodelle sehr viel besser geeignet und lassen sich auf die Sentiment Detection anpassen. In der Fachsprache nennt man das Feintuning. Das Funktionsprinzip des Feintunings ist dabei äußerst interessant. Es zeigt sich nämlich, dass das Zuordnen gar nicht Embeddings aller Token eines Dokuments benötigt, sondern dass das voll kontextualisierte Embedding des ersten Tokens genügt. Dort ist bereits ein Großteil der Information der gesamten 512 folgenden

Token enthalten. Vor jedem Dokument (beziehungsweise vor jedem Satz) fügt man daher einen Klassifikationstoken (CLS) ein, das das Modell im Folgenden dann beim Training und zur Klassifika­ tion benutzt (siehe Abbildung 3). Als Beispiel soll hier die klassische Sentimentanalyse von IMDB-Daten dienen, für die man durch das Feintuning ­eines vorhandenen Modells ein Spezialmodell konstruieren kann (siehe Ab­ bildung  4). In jedem Fall benötigt das Feintuning bereits klassifizierte Daten als Trainingsdaten. Wenn keine solchen Trainingsdaten zur Verfügung stehen, kann man zum Beispiel mit Inferenz­ modellen arbeiten (siehe weiter unten im Artikel). Das Vorbereiten des Feintunings läuft dabei nach einem Schema ab, das von dem spezifischen zugrunde liegenden Sprach-

BERT und seine Nachfolger Weil BERT ein sehr komplexes Modell ist, wurden viele andere Modelle darauf basierend weiterentwickelt. Teilweise wurde die Architektur verändert, bei anderen Modellen wurde primär versucht, die Anzahl der Parameter zu reduzieren. Ein guter Überblick findet sich unter ix.de/zq3t.

ern, was zu viel weniger Parametern führt. Besonders wenn Rechenzeit oder Speicherplatz eine große Rolle spielen, verwendet man daher häufig DistlBERT als Basis (siehe Artikel „Große KI-Modelle mit Destillation eindampfen“ ab Seite 98).

AlBERT

XLNet Oftmals spielt es nur eine untergeordnete Rolle, in welcher Reihenfolge Wörter in einem Satz auftreten. Die Trainingsdatenmenge lässt sich also durch Permutation bestimmter Wörter sehr stark erhöhen. Genau diesen Weg geht XLNet und unterscheidet sich sonst nur wenig von den ursprünglichen BERT-Modellen. Die Anzahl der Parameter nimmt dabei nicht zu, allerdings steigt der Trainingsaufwand erheblich. Im Vergleich zu den Basismodellen lassen sich Verbesserungen von 10 bis 15 Prozent erreichen.

RoBERTa Auch RoBERTa erhöht die Datenmenge für das Training, allerdings nicht durch die Permutation der Wörter, sondern durch eine dynamische Maskierung. Die bei BERT angesprochenen Masken wechseln zwischen verschiedenen Trainingsperioden das Bezugswort, während bei BERT immer dasselbe Wort maskiert ist. Dadurch erhöht sich der Trainingsaufwand, nicht aber die Anzahl der Parameter. Im Vergleich zu BERT lassen sich mit RoBERTa Verbesserungen von bis zu 20 Prozent erreichen. Das ist einer der Gründe dafür, dass RoBERTa als abgeleitetes Modell heute sehr häufig zum Einsatz kommt.

DistilBERT Im Gegensatz zu den bisher genannten Modellen geht DistilBERT genau den umgekehrten Weg und versucht, die Anzahl der Para­ meter zu reduzieren. Das geschieht allerdings nicht durch eine kleinere Trainingsmenge. Vielmehr dient ein existierendes Modell als „Lehrer“, von dem das „Student-Modell“ lernt. Damit arbeiten die Systeme bei nahezu gleicher Performance mit deutlich weniger Lay-

Der Vollständigkeit halber sei AlBERT erwähnt, was für „A lite BERT“ steht. Dabei handelt es sich um ein kleineres BERT-Modell, das zusätzlich einige Architekturoptimierungen integriert. AlBERT reduziert die Anzahl der Parameter durch eine Faktorisierung der Embedding-Matrix und gemeinsame Parameter in unterschiedlichen Layern. Außerdem haben die Entwickler den Zusammenhang zwischen unterschiedlichen Sätzen aufgeweicht, was den Speicherverbrauch verkleinert und die Trainingsgeschwindigkeit erhöht. Dies erlaubt größere AlBERT-Modelle, die mit der gleichen Anzahl an Parametern dem entsprechenden (reinen) BERT-Modell überlegen sind.

GPT Die GPT-Modelle (Generative Pre-trained Transformer) erzeugen aus einem Strom von Token die dazugehörigen Embeddings und werden so trainiert, dass die Systeme folgende Token gut vorhersagen können. GPT ist ein generatives Modell und konzentriert sich daher „nur“ auf die Vorhersage von Token. Dadurch kann es ganze Texte generieren. Das Modell sagt das jeweils nächste Token (also im Prinzip das Wort) aus allen bisherigen Token (beziehungsweise den letzten 512) vorher. Auf diese Weise sieht es so aus, als ob GPT selbst Texte schreiben könne. GPT hat im Laufe der Zeit zahlreiche Verfeinerungen erfahren, besonders was die Anzahl der Parameter angeht und die Menge der Texte, mit der OpenAI das System trainiert hat. Spätere Versionen wie InstructGPT und ChatGPT hat man zusätzlich auf das Beantworten von Fragen trainiert. Besonders das letztgenannte Modell ist sehr populär, da es viele Standardaufgaben selbstständig erledigen kann und die generierten Texte sehr geschliffen klingen, auch wenn die darin getroffenen Aussagen nicht immer richtig sind.

10

iX Special 2023 – KI © Copyright by Heise Medien.

Vorhersage

Klassifikator

modell unabhängig ist. Zuerst muss man immer das Basisframework (PyTorch oder TensorFlow) vorbereiten, anschließend liest das Framework die Daten ein. Beim Tokenisieren sind noch die CLS-Token zu berücksichtigen. Um die Ergebnisse der Klassifikation bewerten zu können, teilen Entwickler das Datenset in eine Trainings- und eine Validierungsdatenmenge. Anschließend lädt man das Modell und beginnt das Training. Beim Training von Modellen arbeitet man in Epochen. In jeder Epoche sagt das Modell die Ergebnisse für die Trainingsdaten vorher, wo­raus sich der Loss berechnen lässt, der Wert einer Verlustfunktion, der die Un­genauigkeit des Modells angibt. Um ihn zu minimieren, berechnet die Backpropagation (Rückwärtsauswertung) den dazugehörigen Gradienten, mit dem man die Gewichte entsprechend anpasst. Der Validierungsschritt bestimmt Accuracy und Loss für die Validierungsdaten. Diese Kontrolle stellt sicher, dass das Modell nicht nur die Trainingsdaten auswendig lernt. Im Gegensatz zu klassischen Klassifizierungsverfahren kann das System mit verhältnismäßig kleinen Datenmengen arbeiten und dennoch gute Ergebnisse erzielen. Das liegt an den bereits im Sprachmodell vorhandenen Sprachfeatures, die auf das Modell nur noch angepasst werden. Technisch ist das Training noch etwas aufwendiger, weil man mit Dataloadern arbeiten muss. Je nachdem, ob eine Grafikkarte verfügbar ist oder nicht, dauert das Training unterschiedlich lang – mit der Grafikkarte wenige Minuten, nur mit CPU kann es auch einige Stunden dauern. Hier erkennt man, wa­ rum Grafikkarten für Deep Learning und besonders für Sprachmodelle so beliebt und eigentlich unentbehrlich sind. PyTorch vorbereiten (CPU/GPU) Daten einlesen Tokenisierung [CLS], [SEP]

Input IDs

Attention Masks

Training/Validation-Split Modell laden

Schematische Darstellung des Feintunings von KI-Modellen (Abb. 4).

Transformer-Layer 12

Transformer-Layer 2

Transformer-Layer 1

[CLS]

Nur das erste Token eines Dokuments, Absatzes oder Satzes dient zur Klassifikation. Es enthält bereits einen großen Teil der Informationen über die folgenden Token (Abb. 3). Mit BERT als Basismodell kann man eine Accuracy von etwa 84 Prozent er­ reichen, das ist für Sentimentanalyse ein ziemlich guter Wert. Ein Wechsel auf RoBERTa bringt keine Verbesserung. ­ ­DistilBERT ist kaum schlechter, aber braucht deutlich weniger Trainingszeit. Zum Vergleich kann man die Klassifi­ kation auch noch mit einer klassischen ­Methode durchführen, in diesem Fall mit ­einer Support Vector Machine (SVM). In Fällen wie hier erzielt die SVM mit einem Bruchteil der Rechenzeit sogar ein besseres Ergebnis. Nicht immer muss man a­ lso mit einem Sprachmodell ar­beiten.

Modelle für Spezialaufgaben verwenden In den Kommentaren der Internet Movie Database verwenden die Nutzer ein Vokabular, das viele gebräuchliche Wörter enthält und wenig Spezielles. Ganz anders sieht es aus, wenn man etwa wissenschaftliche Literatur analysieren möchte. Da es hier viele spezielle Wörter gibt, spricht man von einem domänenspezifischen Vokabular. Große Sprachmodelle können auch mit „Out-of-Vocabulary“-Szenarien umgehen. Viel besser funktioniert das allerdings, wenn sie an die entsprechenden Domänen angepasst sind. Zum Glück gibt es schon vortrainierte Modelle, die auf genau solche Texte an­gepasst wurden. Eine Übersicht mit unterschiedlichen Modellen für verschiedene Wissenschaftsdisziplinen findet sich u ­ nter ix.de/zq3t. Besonders domänenspezifisch sind Landesspra-

chen. Es gibt multilinguale BERT-Modelle, aber auch solche, die mit deutschen Texten vor­trainiert wurden. Damit lassen sich Ergebnisse beim Umgang mit Texten der entsprechenden Sprache deutlich verbessern. Neben speziellem Vokabular gibt es auch Anforderungen, die immer wiederkehren. Glücklicherweise existieren dafür bereits Sprachmodelle, die man direkt verwenden kann. Schon früh zeigte sich, dass es unpraktisch ist, wenn jedes Modell unterschiedliche Anforderungen erfüllt. Zuerst hat das die Firma Hugging Face erkannt und eine Plattform geschaffen, auf die Data Scientists ihre Modelle  hochladen können. Genauso einfach ist  es, existierende Modelle in eigener Software zu verwenden. Anhand verschiedener Aufgaben kann man erkennen, wie leicht das umzusetzen ist. Der erste Schritt besteht darin, die ModelSeite von Hugging Face aufzurufen. Auf dieser  Seite kann man nun direkt nach Modellen suchen, die bestimmten Anforderungen entsprechen (siehe auch Artikel „Hug­ging Face – Zentrale für KI-Mo­ delle“ ab Seite 86). Einige Beispiele für bestimmte Anwendungsfälle, mit denen spezialisierte Modelle auf Hugging Face umgehen können, sind: Sentiment Detection, Zusammenfassen und Generieren von Texten, Depersonalisieren und Named Entity Recognition. Für Sentiment Detection stehen bei Hugging Face gleich mehrere Modelle zur Verfügung. Sehr gut funktioniert etwa das Modell nlptown/bert-base-multilingual11

iX Special 2023 – KI © Copyright by Heise Medien.

Training in Epochen

Basics | Sprach-KI

Trainingsschritt Vorhersage Trainingsdaten

BERT und seine Derivate bei der Sentimentanalyse Modell

Accuracy

Laufzeit (i9-9900K, 16 Core)

BERT RoBERTa DistilBERT SVM

84 Prozent 82 Prozent 82 Prozent 90 Prozent

6500 s 7300 s 3300 s 0,8 s

uncased-sentiment. Ein Beispiel dafür zeigt Abbildung 6. Interessiert man sich für ein bestimmtes Thema, findet man oft nur ­wenige ­Informationen dazu – noch häufiger allerdings viel zu viel. So ist es gar nicht ­einfach, eine lange Wikipedia-Seite zusammenzufassen. Von BERT abgeleitete Modelle können das aber auch sehr gut, solange die Texte nicht zu lang sind und die maximale Sequenzlänge nicht überschreiten. Als Beispiel kann man sich die Informationen über BERT aus Wikipedia zusammenfassen lassen. Das Ergebnis ist auch hier ziemlich gut und spart viel Zeit beim Lesen (siehe Abbildung 7). Hugging Face stellt auch generative Modelle zur Verfügung. So hat die Bayerische Staatsbibliothek ein GPT-2-Modell trainiert, das man auch selbst ausprobieren kann (siehe ix.de/zq3t). Die Ergebnisse sind eher lustig als wirklich sinnvoll, aber können durchaus als Ideengeber fungieren. Wenn man sich im Hugging-Face-Fundus umsieht, findet man viele Modelle, die spezielle Dinge erledigen, wie etwa

Depersonalisieren von Daten. Solche Modelle streichen echte Namen in Datensätzen, um Daten öffentlich zur Verfügung zu stellen und dabei zu vermeiden, dass Personen in den Daten auffindbar sind (StanfordAIMI/stanford-deidentifier-­ base). Umgekehrt gehen Named Entity Recognizer (NER) vor und versuchen, aus vorhandenen Texten Entitäten wie Namen von Personen, Organisationen oder Adressen zu extrahieren. Das kann für die weitere Qualifikation von Texten sehr hilfreich sein.

Ähnlichkeitsmaße und Cross-Encoder BERT berechnet für Wörter kontextualisierte Embeddings und optimiert dabei auf die Vorhersage fehlender Wörter. Dadurch sind die Embeddings sehr stark kontextualisiert und das Modell kann Aufgaben besonders gut lösen, die mit dem Sprachverständnis verknüpft sind. Für viele Anwendungen benötigt man hingegen die Ähnlichkeit zweier Texte. ­Eine solche Ähnlichkeitsmetrik hilft beim Clustering oder bei Topic-Modellen, die über die statistische Häufung bestimmter  Wörter das Thema von Dokumenten ermitteln. Auch bei der Suche nach oder in  Dokumenten können Sprachmodelle helfen. In der ursprünglichen Variante kann BERT diese Anforderungen nur sehr schwer erfüllen: Für das Berechnen solcher Ähnlichkeiten muss das BERT-Modell die beiden Texte zusammen codieren,

Ein Beispiel für eine Sentiment­ analyse mit einem BERT-Modell, bei dem das System Sätze einer guten oder schlechten Bewertung zuordnet (Abb. 6). 12

Berechnung Loss Rückwärtsauswertung Gewichte anpassen (AdamW) Validierungsschritt Vorhersage Validierungsdaten Berechnung Accuracy und Loss

Das Training von Modellen erfolgt in Epochen, die in einen Trainings- und einen Validierungsschritt aufgeteilt sind (Abb. 5). was bei 10 000 Texten zu fast 50 Millionen Kombinationen führt und enorm viel Rechenzeit verschlingt. Um das effizient zu lösen, sind Änderungen notwendig. Die Texte sind so zu codieren, dass man die Embeddings zum Berechnen von Ähn­ lichkeiten verwenden kann. Das leisten Sentence Transformer. Die Konstruktion geschieht über siamesische Netzwerke. Auch wenn das kompliziert klingt, muss man sich damit gar nicht im Detail beschäftigen, denn die entsprechenden Modelle sind bereits vortrainiert und man kann sie direkt nutzen. Der Hauptan­ laufpunkt für Sentence Transformer ist SBERT (siehe ix.de/zq3t). Neben den theoretischen Grundlagen sind hier auch ­viele Praxisbeispiele zu finden. Die Transformer sind ein Open-Source-Projekt der TU Darmstadt. Im Kern berechnen sie ­eine Art Fingerabdruck von Dokumenten oder Sätzen. Gemeinsamkeiten zwischen den Dokumenten gibt die Cosinusähnlichkeit an. Dieses Maß verwendet man für Ähnlichkeiten von Vektoren in hochdimen­ sionalen Räumen, es misst den Cosinus des Winkels zwischen den Vektoren. Das Maß berücksichtigt damit nur die Richtung der Vektoren und ist unabhängig von deren Länge (siehe Abbildung 8). Das Ergebnis ist gut, weil das System offenbar die Ähnlichkeit zwischen Python und ­Java erkannt hat (beides sind Programmiersprachen). Leider geht die Einsicht allerdings nicht so weit, dass JupyterNote­books zusammen mit Python bei Data Scientists beliebt sind. Dieses Ähnlichkeitsmaß lässt sich durch Cross-Encoder noch weiter optimieren. Dazu muss man Satzpaare jeweils miteinander codieren. Bei fünf Paaren geht das ziemlich schnell, bei einer grö­ ßeren Anzahl würde das aber sehr viel Rechenzeit benötigen. Als Basis kann ­ man  hier das Modell cross-encoder/nlideberta-­v3-xsmall verwenden, das jeweils drei Scores zurückliefert, die ausdrücken, iX Special 2023 – KI

© Copyright by Heise Medien.

Sprachmodelle eignen sich für Textzusammenfassungen, wenn man beim Lesen Zeit sparen möchte. Hier am Beispiel des Wikipedia-Eintrags zu BERT (Abb. 7). ob sich die Sätze widersprechen, unterstützen oder in einem neutralen Verhältnis zueinander stehen. Besonders die Widersprüche und die zueinander neutralen Aussagen erkennt das System im Beispiel gut. Es gibt bei den Sätzen wenige, die sich  direkt unterstützen, aber das lässt sich gut ergänzen. Andere Cross-EncoderModelle sind eher auf das Beantworten von Fragen ausgelegt und bestimmen dazu die Ähnlichkeit einer Frage zu den Antwort-Kandidaten. Sentence Transformer sind flexibel einsetzbar und eignen sich damit auch für andere Anwendungsfälle: • Clustering: Um semantisch ähnliche Dokumente zusammenzufassen, kann man ihre Embeddings berechnen und einen Clusteralgorithmus wie K-Means verwenden. Beim Verfeinern der Cluster hilft ein Cross-Encoder.

• Paraphrase Mining: Darunter versteht man die Suche nach semantisch ähnlichen Sätzen in großen Datenmengen. Bei der Anforderungsanalyse in großen Softwareprojekten helfen solche Systeme doppelte oder bereits in einem anderen Kontext implementierte Anforderungen zu erkennen. • Ähnlichkeiten in Übersetzungen: Häufig sucht man semantisch ähnliche Texte, die aber in einer anderen Sprache vorliegen. Übliche Suchmaschinen können dabei nicht helfen, wohl aber die multilingualen Sentence Embeddings. Vektoren ähnlicher Texte in unterschiedlichen Sprachen haben einen geringen Cosinusabstand zueinander. • Bildersuche: Die Sentence Transformer ermöglichen es, Texte und Bilder in denselben Vektorraum einzubetten. Das erlaubt eine semantische Bildersuche, da

sich die für das Suchen von Text verwendeten Methoden auch für Bilder nutzen lassen.

Inferenz- und generative Modelle Alle bisher genannten Modelle erfüllen einen bestimmten Zweck. Für manche Aufgaben ist das allerdings nicht flexibel genug – man möchte die Modelle für mehrere Zwecke konfigurieren können. Genau das leisten Inferenzmodelle und erlauben damit eine Zero-Shot-Klassifikation. Die Idee dahinter ist, dass Menschen durch die Sprache selbst bei vielen Texten schon entscheiden können, zu welcher Kategorie ein bestimmter Text gehört. Da die Sprachmodelle mit so vielen Texten trainiert wurden, sollten sie in der Lage dazu sein, solche Klassifikationen selbst durchzuführen. Das funktioniert mit speziell

13

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Sprach-KI

Die Übereinstimmung von Texten und Dokumenten lässt sich mit der Cosinusähnlichkeit berechnen. Hier erkennt das System, welche Sätze im Kontext eher zusammenpassen (Abb. 8). dafür trainierten Inferenzmodellen tatsächlich sehr gut. Besonders bei den aktuellen großen Sprachmodellen wie GPT-3.5 und GPT-4, PaLM oder LLaMA schauen die Entwickler derzeit auf die Zero- und Few-Shot-Performance. ChatGPT hat es vorgemacht, dabei kann man aber leicht vergessen, dass es auch andere, offene Modelle gibt, die Ähnliches leisten. Flan-T5 kommt von Google und kann schon viele Aufgaben erledigen. Bei Hugging Face lässt es sich direkt ausprobieren. Teilweise sind die Antworten sehr überzeugend, aber ähnlich wie bei ChatGPT ist Vorsicht angebracht – man sollte die Aussagen nicht unreflektiert übernehmen. Auch Meta, dass sich neuerdings mehr auf KI als auf NFTs konzentriert, hat ein neues Sprachmodell mit dem Namen ­LLaMA entwickelt und Forschenden zur Verfügung gestellt. Durch einen Zufall wurde ein Torrent-Link für das Modell gepostet, sodass es nahezu jeder ausprobieren kann. Besonders spannend ist, dass Georgi Gerganov, ein bulgarischer Entwickler, ein C++-Interface dazu geschrieben hat, das sich durch Quantisierung sogar auf CPUs ausführen lässt (siehe ix.de/zq3t). Damit lässt sich das Modell auch auf Consumer-Hardware ausprobieren, man benötigt keine extrem leistungsfähigen Grafikkarten. Die Installation ist sehr gut dokumentiert und teilweise auch automatisiert (siehe ix.de/ zq3t). Nachdem das Modell nun breit zur Verfügung steht und durch den Open-

Source-Ansatz auch weiter trainiert werden kann, ergeben sich dadurch sicher sehr viele Ideen und neue Anwendungen.

Fazit Sprachmodelle zeigen ein sehr großes Potenzial in der Anwendung, das noch nicht im Ansatz erschöpft ist. So spannend und ab und zu lustig ein Dialog mit ChatGPT sein mag, ist das dennoch nur die Spitze des Eisbergs. Vielversprechende Anwendungen, die den Geschäftswert erhöhen, müssen sich erst noch herauskristallisieren. Hier kann man in den nächsten Jahren noch mit vielen interessanten Beiträgen rechnen. Es herrscht aktuell Goldgräberstimmung. Grund dafür ist unter anderem, dass Texte in sehr, sehr großer Menge zur Verfügung stehen und man die Modelle nicht mit dedizierten Trainingsdaten trainieren muss, sondern die Modelle diese Texte direkt verwenden können. Im Moment skalieren die Modelle vor allem mit größeren Trainingsdatenmengen und besserer Hardwareleistung. Dadurch ergeben sich größere Modelle. Hier wird es sicher noch weitere Optimierungen geben und die Modelle werden noch deutlich leistungsfähiger werden. Sprachmodelle und die dort verwendeten Modelle des Transfer Learning erobern schon heute immer mehr Domänen. So ist es Microsoft gelungen, aus gesprochener Sprache Text zu erkennen und dabei eine Genauigkeit zu erreichen, die der menschlichen überlegen

14

ist. Ähnliches gilt auch schon für handschriftlich notierte Texte. Der Computer kann die Sauklaue schon besser lesen als die meisten Menschen. Schließlich sind die aktuellen großen Modelle alle generativ. Mit DALL-E, Midjourney und Stable Diffusion gibt es Bildgeneratoren, die sogar Kunstwett­bewerbe gewinnen und damit zu Kontroversen führen. Fälschungen und Deepfakes lassen sich freilich auch erzeugen. Vor einigen Wochen versetzte ein KI-­generiertes Bild des Papstes in einer ­modischen Daunenjacke das Internet in Aufruhr. So beeindruckend es auch ist, dass das von Microsoft trainierte Modell VALL-E nach drei Sekunden einen Sprecher täuschend echt nachahmen kann, so immens ist der potenziell mögliche Schaden. Die Diskussion über die ethischen Grundlagen der Technologie ist daher zu Recht in vollem Gange.  ([email protected]) Quellen Unter ix.de/zq3t finden sich das Jupyter-Notebook zum Artikel und weiterführende Links.

PROF. CHRISTIAN WINKLER beschäftigt sich speziell mit NLP. Als Professor an der TH Nürnberg konzentriert sich seine Forschung auf die Optimierung der User Experience. iX Special 2023 – KI

© Copyright by Heise Medien.

© Copyright by Heise Medien.

Basics | Generative KI

aus der Texteingabe tatsächlich ein neues Bild. Wie das genau funktioniert, erklärt dieser Artikel. Zunächst zeigt Abbildung 2, dass Stable Diffusion kein monolithischer Block ist, sondern aus mehreren Komponenten besteht.

Texteingabe, Token und Embedding

Stable Diffusion seziert KI-Systeme ermöglichen auch künstlerisch unbegabten Menschen, aus Texteingaben hochwertige Bilder zu generieren. iX erklärt, was Stable Diffusion im Innersten zusammenhält. Von Dr. Gerhard Heinzerling Ȗ Mithilfe von KI-Bildgeneratoren ist es mittlerweile auch Laien möglich, Bilder zu erschaffen, die großen Kunstwerken ähneln. Auch Fotografie- und Kunstwettbewerbe lassen sich damit inzwischen gewinnen. Dieser Artikel stellt das generative KI-Modell Stable Diffusion vor, das aus Texteingaben Bilder ge­ neriert. Stable Diffusion ist ein OpenSource-Modell, das es in verschiedenen Varianten gibt. Hier wird auf eine Variante eingegangen, die mit der Python-Bi­ bliothek Keras erstellt wurde. Keras kapselt allerdings das Innenleben des Modells, weshalb dieser Beitrag eine grafische Darstellung und eine Beschreibung der verschiedenen Funktionsblöcke bie-

tet. Die URL zum Keras-Programm ist unter ix.de/z4uj verlinkt. Dort findet sich ein fertiges Beispiel, das zwar auf viele Keras-Funktionen zurückgreift, aber erlaubt, das Ganze einfach nachzuprogrammieren und die einzelnen Funktionen zu verstehen. Die Kurzform zeigt Abbildung 1. Benutzer können selbst mit einer einfachen CPU eigene Bilder generieren, indem sie in der Methode text_ to_image individuelle Texteingaben vornehmen. Wichtig ist, dass sich hier tatsächlich von Generieren sprechen lässt, da das Modell etwa nicht einfach im Internet nach einem Bild mit einem möglichst ähnlichen Schlagwort sucht. Es erstellt

1-TRACT ȫ Innerhalb von Stable Diffusion arbeiten eine Vielzahl an Komponenten im Verborgenen daran zusammen, aus Texten neue Bilder zu erstellen. ȫ Das System verknüpft die Worttoken des Prompts mit gelernten Bild-Text-Paaren und baut daraus dann eine zur Eingabe passende Grafik. ȫ Beim namensgebenden Diffusionsprozess hat das KI-System gelernt, Bilder mathematisch zu verrauschen und Rauschen aus verzerrten Bildern wieder herauszurechnen. ȫ Da Stable Diffusion zuerst kleinere, rechenfreundliche Bilder generiert, muss die KI die Bilder im finalen Schritt wieder in ein augenfreundliches Format übertragen.

16

Das Modell beginnt mit einer Textein­ gabe des Benutzers, die es in einzelne Token zerlegt. Ein Token entspricht in etwa einem Wort. Dabei macht das System aus einem zusammengesetzten Wort wie Finanzamt unter Umständen zwei Token. Dieser Artikel setzt Token und Wort der Einfachheit halber gleich. Dann schlägt Stable Diffusion das Token in einem Lexikon nach, das das Modell aus dem Internet heruntergeladen hat. Lexika gibt es viele und seit Langem. Im Prinzip handelt es sich um Wortlisten, es gibt auch komplexe Lexika mit Flexionsregeln wie Konjugationen und Deklinationen. In diesem Lexikon stehen die Einträge und die dazugehörigen Indizes, wichtig ist, dass es bereits vor dem Training des Modells erstellt wurde. Anhand der Indizes erstellt das Modell dann eine Embedded-Version der Token (siehe Abbildung 3), indem es aus den Token einen Vektor mit Zahlenwerten berechnet. In diesem Beispiel besteht der Vektor aus 768 Einträgen mit FloatWerten. Da es in diesem Algorithmus eine maximale Länge der Texteingabe von 77 Zeichen gibt, ergibt sich ein Vektor mit den Dimensionen 77 × 768. Diesen Vektor verquickt Stable Diffusion nun mit dem CLIP-Modell und schickt ihn durch einen Transformer.

CLIP und Transformer CLIP steht für Contrastive Language Image Pretraining. Das CLIP-Modell ist schon ein paar Tage alt, eine ausführliche Beschreibung findet sich unter ix.de/ z4uj. Das vortrainierte CLIP-Modell lässt sich bei Hugging Face einfach herunterladen (siehe ix.de/z4uj). Ziel des Modells ist es, Bilder und dazugehörige Texte miteinander zu verbinden. Dafür schickt es  sowohl die Texte als auch die Bilder durch einen Transformer. Der erstellt wiederum Vektoren aus den Eingaben. Diese Vektoren verheiratet das Modell dann, sodass passende Bild-Text-Paare eine hohe Bewertung, nicht passende Bild-Text-Paare eine niedrige Bewertung bekommen. In Abbildung 2 findet sich dieser Prozess unter Punkt 3, die dort dargestellte Diagonale von links oben iX Special 2023 – KI

© Copyright by Heise Medien.

nach rechts unten soll die besten Bewertungen bekommen. Contrastiv heißt das CLIP-Modell, weil es die nicht auf der Diagonalen befindlichen Werte möglichst niedriger bewertet. Das Pretraining bezieht sich da­ rauf, dass man zunächst das CLIP-Modell vortrainiert und es dann in den StableDiffusion-Algorithmus einbindet. Nach dem Training funktioniert das Modell in beide Richtungen. Bei der Vorgabe eines Bildes kann man einen Text daraus generieren und umgekehrt. Das funktioniert so gut, dass das Modell auch Klassen auf Bildern findet, für die es nie ein explizites Training gegeben hat. Das Ganze nennt sich dann Zero-Shot Learning. Stable Diffusion kann also Vorhersagen für Klassen treffen, auf die es nie trainiert wurde. Da in der Texteingabe nicht nur einzelne Wörter auftauchen, sondern Sätze, muss das Modell einen breiteren Kontext verstehen können. Beim Training gilt es herauszufinden, wie wahrscheinlich es ist, dass ein gegebenes Wort innerhalb der vor- oder nachlaufenden n Wörter auftaucht. Dafür legt das System eine gewisse Aufmerksamkeit auf bestimmte Wortkombinationen. Durch diese Attention genannte Herangehensweise kann das Modell die Grammatik von Sätzen verarbeiten. CLIP arbeitet auch mit Sätzen wie „Ein Foto eines …“, wobei die Punkte durch ähnliche Wörter austauschbar sind. Der Hauptzweck von Attention ist es also, kontextuelle Informationen zu einem Wort in einem gegebenen Satz hinzuzufügen (für eine genauere Erklärung

Mit der Implementation von Stable Diffusion in KerasCV lassen sich mit wenigen Befehlen bereits erste Bilder generieren (Abb. 1). siehe „Sprachmodelle verstehen und einsetzen“ ab Seite 8). Ein Embedding spannt dabei einen multidimensionalen semantischen Raum auf. Wichtig dabei ist, dass das System ähnliche Token, wie Teddy und Kuscheltier, in nah beieinanderliegenden Vektoren im semantischen Raum speichert. Zwei Wörter sind sich dabei ähnlich, wenn man sie in einem ähnlichen Kontext gebraucht. Am einfachsten bekommt man das mit Satzvervollständigungen heraus: Wird ein Satzanfang wie „Am Sonntag ­gehe ich gerne …“ genommen, dann sind alle Wörter, die zu den drei Punkten passen, zumindest grammatikalisch ähnlich, etwa „schwimmen“, „essen“ oder „spazieren“. Die Werte aus der Texteingabe gibt Stable Diffusion dann gemeinsam mit den Werten aus dem CLIP-Modell an den Variational Autoencoder weiter.

Variational Autoencoder Die Vektoren, die aus CLIP und der Texteingabe stammen, ließen sich nun direkt 6

Random Image

in das U-Net, also das zentrale neuro­nale Netz, einspeisen. Bei einer Bildgröße von 512 × 512 Pixeln würde das U-Net aber recht lange für die Berechnungen benötigen. Deshalb bedient man sich eines Tricks, den man aus der Bildkompres­ sion kennt. Die Daten wandern zuerst durch einen Variational Autoencoder (VAE). Ein VAE ist ein neuronales Netz mit zwei Besonderheiten: Die Anzahl der Input-Neuronen ist gleich der Anzahl der Output-Neuronen und die HiddenNeuronen in der Mitte des Netzes bilden ein Bottleneck mit einigen wenigen Neuronen. Durch diese Architektur kann man ein Bild in den VAE füttern und bekommt je nach Anzahl der Neuronen im Bottleneck das gleiche oder ein sehr ähnliches Bild wieder heraus. Das wirklich Interessante ist, dass man die Informa­ tionen nun auch aus der komprimierten Form, also dem Bottleneck, zurückgewinnen kann. Die verkleinerte Form ist jedoch kein kleines Bild des Ausgangsbildes, das man mit dem Auge noch irgend8

Noise Prediction

1

3

4

TokenEmbeddings

Transformer

5

Downsampling

U-Net

77 × 768

Noise Image

Upsampling

Downsampling

Upsampling

Downsampling Downsampling Variational Autoencoder von Pixelwerten in den latenten Raum

7

Upsampling

Downsampling

CLIP

Upsampling

Decoder

2

Bag of Words

Encoder

Texteingabe: ein blauer Hase (max. 77 Token)

Conditioning

Middle Block

generiertes Bild

Upsampling Variational Autoencoder vom latenten Raum in Pixelwerte

Schematische Darstellung der Komponenten von Stable Diffusion. Innerhalb des Bildgenerators arbeiten viele verschiedene Prozesse zusammen, um aus einer Texteingabe ein neues Bild zu erzeugen (Abb. 2). 17

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Generative KI

Imports

Modelle erstellen Prompt übergeben Indizes der Token mit Start- und Endtoken

es Bild zu erzeugen. Diese beiden Pro­ zesse lassen sich auch als Trainings- und als Inferenzphase auffassen. Die Eingabe in das Netz ist zunächst das Bild zum Zeitpunkt tx. Die Ausgabe ist die gesamte Verrauschung des Bildes, die man von dem komplett verrauschten Bild ab­ ziehen müsste, um das Originalbild wieder zu erhalten. Ein Bild durchläuft das ­U-Net n-mal, wobei man n als Parameter festlegen kann.

from tensorflow import keras import keras_cv model = keras_cv.models.StableDiffusion( img_width=512, img_height=512) processed_text = „Ein blauer Hase als Aquarellbild“ print(model.tokenizer.encode(processed_text)) [49406, 45307, 528, 560, 611, 938, 4458, 1076, 1657, 35512, 49407]

Keras-Workflow vom Erstellen des Modells bis zum Indizieren der Token (Abb. 3).

Encoder OriginalInput

Scheduler, Bildsynthese und Conditioning

Decoder komprimierte Darstellung

Diffusionsmodelle sind darauf trainiert, schrittweise normale Bilder aus verrauschten Bildern zu rekonstruieren. Dabei entscheidet der Scheduler darüber, wie viel Noise das Modell in jedem Schritt hinzufügt oder wegnimmt. Der Scheduler bestimmt auch, mit welchem Algorithmus das jeweils geschieht. Der Algorithmus kann im Unterschied zum hier gezeigten Beispiel recht komplex werden. Er stellt einen Mittelweg zwischen Geschwindigkeit und Qualität dar. Mit dem Scheduler kann man wie mit einem Hyperparameter ein wenig experimentieren. An dieser Stelle ist der Algorithmus von Stable Diffusion im Prinzip mit der Arbeit fertig. Allerdings hat der VAE das Bild ja von 512 × 512 Pixeln in einen semantischen Raum mit 64 × 64 Punkten verkleinert, daher muss das Modell das Bild nun wieder auf die Originalgröße zurückführen. Das geschieht mit der Technik namens Super-Resolution Imaging. Damit ist es möglich, ein neuronales Netz so zu trainieren, dass es Bilder aus einem niedrig dimensionierten Raum in einen höher dimensionierten Raum überführt. Das Modell berücksichtigt dabei die Verteilungen in den Trainingsdaten, um die wahrscheinlichsten visuellen Details zu generieren. Nachdem der grundlegende Algorithmus erklärt ist, bleibt eine sehr wichtige Frage offen: Wie kann man Einfluss auf

rekonstruierter Input

Im Autoencoder durchlaufen Bilder ein Kompressionsverfahren, bei dem ein neuronales Netz Bilddaten am Ende in einer niedrigeren Dimension rekonstruiert (Abb. 4). wie erkennen könnte. Stable Diffusion reduziert die Bilder mit der Größe von 512 × 512 Pixeln auf 64 × 64 Bildpunkte. Dabei überführt das Modell das Bild aus einem Pixelraum in einen Nicht-Pixelraum mit einer niedrigeren Dimension. Detailliert beschrieben findet sich dieses Verfahren in einem Aufsatz von Rombach und Kollegen [1]. Abbildung 4 zeigt die schematische Funktionsweise eines Autoencoders.

U-Net: Kern des Stable-Diffusion-Modells Den Kern des Stable-Diffusion-Modells bildet das neuronale Netz namens U-Net, schematisch in Abbildung 5 dargestellt. Die Architektur von U-Net besteht aus zwei Pfaden. Der erste ist der Kontrak­ tionspfad auf der linken Seite, der auch als Encoder bezeichnet wird. Er wird verwendet, um den Kontext eines Bildes zu erfassen, wobei das Bild immer weiter verkleinert wird. Im Grunde handelt es sich dabei um eine Ansammlung von Faltungsschichten und Max-Pooling-Schichten, wie man sie zum Beispiel aus Con­ volutional Neural Networks wie dem ­ResNet kennt: Die Max-Pooling-Bereiche  des Downsampling-Pfades betrachten mehrere Pixel. Das größte davon gibt das Netzwerk an die nächste Ebene weiter, wodurch das Bild immer kleiner wird. Die Ebenen ermöglichen es, eine Karte mit den Merkmalen eines Bildes zu erstellen und seine Größe zu reduzieren, um die Anzahl der Parameter des Netzwerks zu verringern. Der zweite Weg ist die symmetrische Expansion, die man als Decoder bezeichnet. Er ermöglicht ebenfalls eine genaue

Lokalisierung durch die transponierte Faltung. Die Skip-Connections helfen dem Netz, sich daran zu erinnern, was es eigentlich lernen sollte. Ohne sie wäre es für das Netz sehr schwierig, in der Upsampling-Phase die richtige Auflösung wieder zu rekonstruieren. Skip-Connections in tiefen Architekturen überspringen Layer in einem neuronalen Netz und füttern ihre Informationen direkt in spätere Layer wieder ein. Aus technischer Sicht minimiert man damit das Problem, dass Gradienten sonst immer kleiner würden. Ursprünglich wurde das U-Net für die Bildsegmentierung im biomedizinischen Bereich entwickelt. Im Fall von Stable Diffusion stellt das Netz den Zusammenhang zwischen einem normalen Bild und einem verrauschten Bild wieder her. Dabei soll es Vorhersagen treffen, wie stark das Bild verrauscht ist. Man unterscheidet zwischen einem Vorwärtsprozess und einem Rückwärtsprozess (siehe Abbildung 6). Der Forward-Prozess verrauscht die Bilder Schritt für Schritt, während der Backward-Prozess versucht, das Rauschen zu minimieren und ein rauschfrei-

5

Downsampling

Ein U-Net besteht aus einem Encoder (links) und einem Decoder (rechts). Bei Stable Diffusion sorgt der Encoder dafür, Bilder zu verrauschen, während der Decoder Rauschen aus Bildern wieder herausrechnen soll (Abb. 5).

18

U-Net

Upsampling

Downsampling

Upsampling

Downsampling

Upsampling

Downsampling Downsampling

Upsampling

Middle Block

Upsampling iX Special 2023 – KI

© Copyright by Heise Medien.

Forward-Diffusion-Prozess

Backward-Diffusion-Prozess

Beim Forward- und Backward-Diffusion-Prozess im Stable-Diffusion-Modell stellt das System ein verrauschtes Bild wieder her und soll gleichzeitig bestimmen, wie stark das Bild verzerrt ist (Abb. 6). das Ergebnisbild nehmen? Das macht man in diesem Fall über das Conditioning, eine klassische Deep-LearningTechnik. Dabei mischt das System gemeinsam mit dem Rauschanteil die Texteingabe mit in das Bild ein. Im Prinzip gibt es mehrere Möglichkeiten, das Ergebnis zu beeinflussen. Etwa indem man dem U-Net semantische Karten oder Bilder mit einmischt. Eine weitere Möglichkeit ist die Methode Text Inversion. Die Text Inversion fügt dem Embedding Space drei bis fünf Bilder eines vom Benutzer bereitgestellten Bildes oder Konzeptes in Form von Wörtern oder kurzen Phrasen wie „An oil painting of …“ hinzu. Bei Stable Diffusion impft nun der Cross-Attention-Mechanismus dem Modell diese Textinformationen ein und beeinflusst damit die Wort-Embeddings, die zur Bildgenerierung führen. Als Letztes sei noch genannt, dass es mehrere Modellvarianten gibt, bei denen man nicht nur Texte, sondern auch andere Bilder zur Manipulation des Zielbildes einfließen lassen kann. Auch einzelne Teile eines Bildes lassen sich dabei manipulieren.

Ausblick Bereits jetzt überzeugen Bildgeneratoren wie Stable Diffusion mit ihren Ergebnis-

sen. Dabei wird noch an vielen Stellen geforscht und fast täglich kommen neue Tools und Ideen auf den Markt, die Integration in bestehende Tools geht voran. Ein Beispiel sind die neuronalen Filter in Photoshop. StabilityAI hat für Photoshop ein Stable-Diffusion-Plug-in gebaut, mit dem man beispielsweise das Bild einer Person oder deren Gesicht schminken kann, indem man das Make-up aus einem anderen Bild per Klick überträgt. Ein Beispiel, wie sich Stable Diffusion in Zukunft nutzen lässt, kommt aus der Architektur, genauer dem Design-Brainstorming. Hier gibt es schon die ersten realen Versuche mit KI-Bildgeneratoren, die kreative Phase von Architekten und die Konzeptionsphase beim Design von Gebäuden zu beeinflussen. In Zukunft lassen sich die generierten und teils noch abstrusen Bilder womöglich direkt in 3-D erstellen und bereits mit statischen Berechnungen unterfüttern. Ein ganz anderer Ansatz, Stable Diffusion zu nutzen, kommt aus der Hirnforschung. In dem Aufsatz „High-resolution image reconstruction with latent diffusion models from human brain activity“ (siehe ix.de/z4uj) geht es darum, Menschen Texte oder semantischen Inhalt zu präsentieren, während sie in einem funktionellen Magnetresonanztomografen (fMRT) liegen. Während die

Forscher den Menschen Bilder zeigen, nimmt das fMRT die Hirnströmungen auf. Bilder der Hirnströme nutzt man dann als Input für ein feingetuntes Stable-Diffusion-Modell, das HirnstromBildpaare gelernt hat. Damit versuchen die Forscherteams, Bilder zu erzeugen, die möglichst nah an den gezeigten Originalen sind. Der KI-Bildgenerator lernt also, die Gedanken von Menschen zu lesen.  ([email protected]) Quellen [1] Robin Rombach et al. (2022); High-Resolution Image Synthesis with Latent Diffusion Models; https://arxiv.org/abs/2112.10752 [2] Weiterführende Links zu Stable Diffusion finden sich unter ix.de/z4uj.

DR. GERHaRD HEiNZERLiNG hat 1999 über die Frage, wie Wörter im Gehirn gespeichert sind, promoviert. Danach arbeitete er als SAP-Berater und ist heute im Bereich der Bilderkennung mittels KI bei der Firma Arineo angestellt.

19

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | KI-Beschleuniger

So funktionieren KI-Chips Anscheinend entwickelt jeder Chiphersteller, der etwas auf sich hält, hauseigene KIBeschleuniger. Die Folge ist eine verwirrende Vielfalt von KI-Chips. Wer KI-Modelle trainiert oder anwendet, sollte wissen, wie sie arbeiten und weshalb es so viele verschiedene gibt. Von Christof Windeck Ȗ Rechenwerke für künstliche Intelligenz (KI) stecken in aktuellen Smartphones, Supercomputern, Autos und Fernsehgeräten. Sie dienen ganz unterschiedlichen Aufgaben: In Handys verschönern sie etwa Fotos oder erkennen Sprachbefehle, in Supercomputern trainieren sie große KI-Modelle, in Autos analysieren sie Kamerabilder und in Smart-TVs oder Gaming-PCs skalieren sie Bilder in 4K-Auflösung. Deshalb gibt es ganz verschiedene KI-Beschleuniger, die sich nicht nur in ihrer Rechenleistung unterscheiden, sondern auch in vielen weiteren Details.

KI-Systematik Das Wirrwarr beginnt mit den Bezeichnungen: Unter KI – im Englischen Artificial Intelligence (AI) – versteht offenbar jeder etwas anderes. Manche meinen Machine Learning (ML), andere Deep Lear-

ning (DL) oder Deep Neural Networks (DNN) oder etwas ganz anderes. Weil es bei KI-Algorithmen häufig um künstliche neuronale Netze geht, beziehen sich die Namen vieler Beschleuniger darauf: Neural Processing Unit (NPU) oder Neural Engine. Andere Firmen schreiben einfach „AI Engine“. Google und Nvidia benennen ihre Tensor Processing Units (TPUs)

1-TRACT ȫ KI-Beschleuniger gibt es in großer Fülle, aber viele haben Gemeinsamkeiten. ȫ Manche KI-Rechenwerke ver­ arbeiten spezielle Datentypen. ȫ Einfach aufgebaute KI-Rechen­ werke können effizienter arbeiten als x86-CPUs.

20

beziehungsweise Tensor Cores wiederum nach dem Begriff des Tensors, mit dem Informatiker mehrdimensionale Felder (Arrays) meinen. All diese Bezeichnungen folgen keinen Standards und lassen selten Rückschlüsse auf den technischen Aufbau der eigentlichen Rechenwerke zu. Eines der wichtigsten Unterscheidungsmerkmale ist die Auslegung des KIChips entweder für das Training von KIAlgorithmen oder für die Anwendung fertig trainierter KI-Modelle. Letzteres bezeichnet man als Inferencing. KI-Training meint das Optimieren der Parameter eines KI-Modells. Für große Modelle verarbeitet man dabei gewaltige Datensätze, beispielsweise mehrere Millionen Bilder oder Abermilliarden Textschnipsel. Folglich ist leistungsstarke Rechnertechnik nötig, also Hochleistungschips mit sehr schneller Anbindung an viel Arbeitsspeicher (RAM) und riesige Massenspeicher. KI trainiert man daher in der iX Special 2023 – KI

© Copyright by Heise Medien.

KI-Datentypen Viele KI-Algorithmen verarbeiten derart große Datenmengen, dass man auf cle­ vere Tricks zurückgreifen muss, um deren Flut Herr zu werden. Erst dadurch sinkt der nötige Rechenaufwand auf ein zu bewältigendes Maß. Bei vielen KI-Algorithmen wird ein erheblicher Anteil der verarbeiteten Parameter durch sehr kleine Zahlenwerte repräsentiert. Viele lassen sich auf null setzen, ohne dass die Genauigkeit des Modells wesentlich leidet. Dieses Ausdünnen von Datenfeldern nennt man Pruning. ­Ein weiterer Trick ist das gezielte Ver­ ringern der Genauigkeit verarbeiteter Daten. Auch das mindert die Treffsicherheit mancher KI-Algorithmen nur wenig. Bei der sogenannten Quantisierung bildet man beispielsweise 16-Bit-Gleitkommazahlen (FP16) auf ganze Zahlen mit nur 8 Bit ab (Int8). Manche KI-Rechenwerke verarbeiten pro Taktschritt doppelt so viele Int8- wie FP16-Zahlenwerte und sind dann doppelt so schnell. Das klappt aber nur, wenn das jeweilige Rechenwerk mit den kompak­teren Datentypen tatsächlich umgehen kann. Wenn es jedoch nicht benutzte Stellen bloß mit Nullen auffüllt, ist nichts gewonnen. Kompaktere Datentypen werden nicht nur von den Rechenwerken schneller verarbeitet, sondern sparen auch Platz im

Quelle: Nvidia

Regel auf Supercomputern, in (Cloud-) Rechenzentren oder auf Workstations mit KI-Beschleunigerkarten. Nur einen Bruchteil solcher Ressourcen verlangt das Inferencing. Dabei kann es um das Verwandeln von Sprache in Text gehen, das Erkennen von Objekten in Bildern, von Bewegungen in Videos oder um das Verarbeiten von Radarsignalen. Weil es viele Anwendungsbereiche mit höchst unterschiedlichen, oft Echtzeitanforderungen gibt, zielt die Mehrzahl der KI-Chips auf Inferencing. Wie die Tabelle „Glossar KI-Algorithmen und -Modelle“ zeigt, gibt es verschiedene Typen neuronaler Netze und zudem auch andere KI-Verfahren. Schon das legt nahe, dass je nach Algorithmus ganz unterschiedlich ausgelegte Rechenwerke optimal sind. Convolutional Neural Networks spielen etwa bei der Objekterkennung in Bildern eine Rolle. Zurzeit ist Sprach-KI in aller Munde (Natural Language Processing, NLP) und dabei kommen Transformer-Modelle zum Einsatz. Prominent ist der Generative Pretrained Transformer mit Dialogfunktion, kurz ChatGPT, auf Basis des Sprachmodells GPT-3 und bald GPT-4.

Das mächtige Nvidia-System DGX A100 enthält acht A100-Chips mit insgesamt 640 GByte HBM-Speicher und schnelle Schnittstellen, um Cluster aufzubauen (Abb. 1). RAM, in eventuell vorhandenen Caches und belasten die Speicherbusse weniger. Um beim oben genannten Beispiel zu bleiben: Ein Speicherbus überträgt bei gleicher Datentransferrate pro Sekunde doppelt so viele 8- wie 16-Bit-Werte. In den vergangenen Jahren wurden Rechenwerke für platzsparende Daten­ typen entwickelt, die in manchen KI-­ Algorithmen Vorteile bringen. Dazu gehört etwa Brain Floating Point 16 (BF16). Im Vergleich zum erwähnten FP16-Format bildet BF16 einen größeren Wertebereich ab, aber auf Kosten der Genauigkeit. Denn während FP16 für den Exponenten 5 Bit verwendet und 10 Bit für die Mantisse, sind es bei BF16 für den Exponenten 8 Bit und für die Mantisse 7 Bit; 1  Bit codiert bei beiden Formaten das Vorzeichen (Plus oder Minus). Damit hat BF16 denselben Wertebereich wie FP32. Aber FP32 verwendet 23 statt nur 7 Bit für die Mantisse. Einen anderen Weg ging Nvidia beim hauseigenen Datenformat Tensor Float 32 (TF32), das 19 statt 32 Bits nutzt: Wie bei FP32 sind es 8 Bit für den Exponenten, aber 10 Bit für die Mantisse wie bei FP16 ( jeweils plus Vorzeichenbit). Der Trick mit dem Quantisieren funktioniert typischerweise nur beim Infe-

rencing gut. Wie oben bereits erwähnt, sind beim Inferencing außerdem weniger komplizierte Berechnungen nötig als beim Training. Bei Letzterem muss das Rechenwerk zudem auch mit höherer Genauigkeit rechnen – üblicherweise mit FP32-Daten –, um die Parameter in kleinen Schritten anzupassen. Und ei­ nige fürs Training wesentliche Rechenaufgaben verlangen komplexe Rechenwerke. Einige KI-Training-Beschleuniger verarbeiten sogar FP64 und eignen sich damit im Prinzip für manche HPCAlgorithmen, die sich sehr gut parallelisieren lassen. Viele einfache Inferencing-Rechenwerke für Smartphones und Embedded Systems verarbeiten hingegen bloß 16-Bit-Werte, einige sogar nur Int8-Ganzzahlen.

KI-Rechenwerke Viele KI-Algorithmen haben Gemeinsamkeiten, für die KI-Rechenwerke wiederum optimiert sind. Das erkennt man relativ gut beim genauen Blick auf ein neuronales Netzwerk (NN). Es besteht aus mehreren Schichten künstlicher Neuronen, die nacheinander die Daten der jeweils darunterliegenden Schicht weiterverarbeiten. Jedes Neuron hat dazu eine Reihe von Eingängen, an denen Daten ­hereinkommen. Ein Beispiel dafür sind RGB-Bilddaten, also die Rot-, Grün- und Blauwerte für jedes Pixel eines Fotos oder Videoframes. Diese RGB-Pixeldaten bilden einen dreidimensionalen Tensor. Das Neuron filtert die Tensordaten, wobei der Filter aus den Werten einer Matrix besteht, den Gewichten (Weights). Dazu sind Matrixmultiplikationen nötig. Deren Ergebnisse summieren die Rechenwerke des Neurons und addieren einen konstanten Bias-Wert hinzu. Besonders häufig fallen folglich die Operationen Multiplikation und Addition an, und zwar in gekoppelter Form. Diese Rechenoperationen nennt man auch MultiplyAccumulate, kurz MAC. Bei Vektorrechenwerken, die komplexere Befehle ver-

Glossar KI-Algorithmen und KI-Modelle englische Bezeichnung

deutscher Name

Abkürzung

Neural Network Artificial NN Deep NN Convolutional NN Recurrent NN Spiking NN Long Short-Term Memory Generative Pretrained Transformer Bidirectional Encoder Representations from Transformers

neuronales Netz künstliches NN tiefes NN faltendes NN rückgekoppeltes NN gepulstes NN ​ ​ ​

NN KNN/ANN DNN CNN RNN SNN LSTM GPT BERT

21

iX Special 2023 – KI © Copyright by Heise Medien.

Quelle: Cerebras

Basics | KI-Beschleuniger

Die Wafer Scale Engine Cerebras WSE-2 vereint über 800 000 KI-Kerne auf der nutzbaren Fläche eines 30-Zentimeter-­ Siliziumwafers – und verheizt rund 15 000 Watt (Abb. 2). arbeiten, spricht man auch von Fused Multiply-Add (FMA). Ergebnis der vielen MAC-Operationen ist eine einzige Zahl, die noch eine nicht lineare Aktivierungsfunktion durchläuft, bevor sie am Ausgang des Neurons erscheint. Die Aktivierungsfunktion übernimmt oft eine Rectified Linear Unit (ReLU), das Ergebnis ist stets positiv. Den größten Anteil am Rechenaufwand haben bei den meisten KI-Neuronen die Matrix-MAC-Rechenwerke. Bei einem simplen Inferencing-Beschleuniger verarbeiten sie beispielsweise acht Werte mit je acht Bit in einem Taktzy­ klus (8×8-MAC). MAC-Digitalschaltungen kann man umso einfacher aufbauen, je weniger und je kompaktere Daten­ typen sie verarbeiten sollen. Dabei kommen die erwähnten KI-Datenformate ins Spiel. Eine MAC-Einheit, die beispielsweise nur Int16-Werte verarbeitet, lässt sich aus weniger Transistoren aufbauen als eine FP32-taugliche und verheizt pro Taktzyklus auch weniger Energie. Weil sie zudem weniger Bytes pro Zyklus durchsetzt, kann sie auch mit weniger Datenleitungen angebunden sein, was wiederum Chipfläche und Energie spart. Von einfach gestrickten MAC-Einheiten passen folglich mehr auf jeden Qua­ dratmillimeter Silizium als von komplizierteren. Zahlreiche parallel nutzbare Rechenwerke liefern wiederum schon bei niedriger Taktfrequenz hohen Durchsatz. Das spart Strom, denn je langsamer ein Transistor schaltet, desto weniger Spannung braucht er dazu. Dadurch sinkt die Verlustleistung enorm. Viele InferencingBeschleuniger takten mit 1 GHz oder weniger, also deutlich niedriger als heutige x86-CPUs und Grafikchips. Ein spezialisiertes KI-Rechenwerk kann deshalb viel effizienter rechnen als ein Allzweckprozessor. Anders betrach-

tet kann man durch Parallelisierung und niedrigeren Takt mehr KI-Rechenleistung aus jedem Watt elektrischer Leistung quetschen. Man zahlt aber einen Preis dafür, nämlich die vergleichsweise große Siliziumfläche. Viele KI-Chips sind im Vergleich zu x86-Prozessoren gigantisch groß. Wegen der relativ niedrigen Taktfrequenz kann man solche Chips im Prinzip auch mit älteren und billigeren Fertigungsprozessen herstellen, braucht dann aber noch mehr Fläche.

Chipcharakter Nicht bloß die „Breite“ der verarbeiteten Datentypen beeinflusst, wie viele Transistoren und wie viel Fläche eine MACEinheit benötigt. Es gibt noch viele weitere Unterschiede, beispielsweise wie viele Register und wie viel Cache jede MAC-Einheit besitzt. Der nächste Faktor ist die Anzahl der MAC-Einheiten pro Chip, was wiederum sowohl die nötige Chip­fläche als auch die Auslegung der internen Busse und des Speichersubsystems beeinflusst. Denn wenn Daten nicht schnell genug fließen, müssen Rechenwerke Pausen einlegen, lassen sich also nicht ausreizen. Damit kommt der nächste Aspekt ins Spiel: die Taktfrequenz. Je höher sie liegt, desto mehr Rechenleistung steht bereit. Aber ab einer gewissen Schwelle steigt wie erwähnt der Stromfluss steil an. Deshalb suchen die Chipentwickler einen für bestimmte Anwendungen optimalen Kompromiss zwischen Rechenund Verlustleistung. Viele KI-Beschleuniger beherrschen zudem Spezialtricks wie die automatische Kompression dünn besetzter Ma­ trizen (Sparse Matrices), was Nvidia als „Sparsity“ bezeichnet und in die Tensorkerne eingebaut hat. Auch die externe Anbindung von KI-Beschleunigern unterscheidet sich extrem. Manche sind zur internen Integration in Chips gedacht, einige lassen sich per USB anschließen, andere haben PCI-Express(PCIe-)Controller. Während USB 3.0 weniger als 0,5 Gigabyte pro Sekunde überträgt, schafft PCIe 5.0 x16 bis zu 128 GByte/s. Schnelle I/O-Einheiten bestehen aus zahlreichen Transistoren, die relativ viel Chipfläche belegen und bei voller Transferrate mehrere Watt Leistung in Abwärme verwandeln. Bei Beschleunigerkarten mit eigenem RAM benötigt der jeweilige KI-Chip integrierte Speichercontroller, die zusätzlich Platz und Strom schlucken. PC-Prozessoren mit zwei DDR5-Speicherkanälen bringen es auf rund 77 GByte/s Daten-

22

transferrate. Ein Server mit zwei AMD Epyc 9004 steuert 24 DDR5-Kanäle an mit insgesamt etwa 920 GByte/s. Die dickste Gamer-Grafikkarte, Nvidias GeForce RTX 4090, hat 24 GByte GDDR6XRAM, das ebenfalls rund 1 TByte/s liefert (1008 GByte/s). Auf der Profischwester RTX 6000 sitzen 48 GByte mit ähnlicher Geschwindigkeit. Nvidias H100-Beschleunigerkarte hat bis zu 80 GByte High Bandwidth Memory (HBM3) mit 3,35 TByte/s. AMD Instinct MI250X und Intel Xeon GPU Max bieten bis zu 128 GByte HBM2e. Die riesige Wafer Scale Engine WSE-2 wiederum bindet keine RAM-Chips an, sondern hat 40 GByte integriertes SRAM, die zusammen rund 20 PByte/s übertragen sollen.

GPU-KI Nvidia liefert seit mehr als 16 Jahren Grafikchips (GPUs), die wegen der CUDAProgrammierschnittstelle (API) als Allzweckrechenbeschleuniger dienen. Dazu wurden die ursprünglich nur für die Verarbeitung von 3-D-Grafikdaten ausgelegten Shader-Rechenwerke mit jeder GPUGeneration flexibler und lernten neue ­Befehle hinzu. Für High-Performance Computing (HPC) gibt es hochgezüch­ tete Beschleunigerchips, früher Tesla genannt, mittlerweile je nach Generation V100, A100 und H100 – siehe „Glossar KIAlgorithmen und KI-Modelle“. Die stärksten HPC-Karten haben über 16 000 Shader-Kerne für FP32-Berechnungen und bringen vor allem hoch parallelisierbare Algorithmen auf Trab; deshalb eignen sie sich auch für KI. Seit mittlerweile drei Chipgenerationen hat Nvidia KI-Rechenwerke – die erwähnten Tensor Cores – entwickelt und zusätzlich zu den Shader-Kernen eingebaut. Diese KI-Einheiten profitieren vom schnell angebundenen Grafikspeicher. Die stärksten Nvidia-Rechenbeschleuniger mit High Bandwidth Memory (HBM) erreichen mehr als 3 Terabyte pro Sekunde. Außerdem hat der Nvidia H100 zusätzlich zu PCIe 5.0 x16 eine NVLink-4.0-Schnittstelle mit 18 Kanälen und 900 GByte/s, um weitere H100Beschleuniger anzubinden. Damit lassen sich große KI-Modelle auf viele H100-Chips verteilen. Weil Tensor- und Shader-Kerne auf denselben lokalen Speicher zugreifen, kann CUDA Rechenarbeit aufteilen. Ein Beispiel liefert die Bilder-KI Stable Diffusion, die CNN und Transformer kombiniert. Dabei übernehmen die Tensorkerne die CNN-Berechnungen und die aufwendigeren Transformer laufen auf den iX Special 2023 – KI

© Copyright by Heise Medien.

© Copyright by Heise Medien.

Basics | KI-Beschleuniger

Chips für KI-Training Hersteller

Chip

Cerebras

Wafer Scale Engine WSE-2 H100 SXM (Hopper) Data Center GPU Max A100 SXM (Ampere) Instinct MI250X Colossus MK2 Trainium Trn1 GroqCard Habana Gaudi2

FP16-TFlops

Int8-TOps

75 000¹

k. A.

  1979²    839    624²    383    250    210    188    k. A.

 3958² 1678  1248²  383  k. A.  k. A.  750  k. A.

Nvidia Intel Nvidia AMD Graphcore Amazon AWS Groq Intel ¹ mit Sparsity, sonst 7500 TFlops

CPU-KI

² mit Sparsity, sonst die Hälfte

Shader-Einheiten. Dadurch berechnet in vielen Spielen höhere Bildraten bei geeine einzelne Nvidia-GPU solche Modelringen oder kaum wahrnehmbaren Qualitätseinbußen. Die Tensorkerne der Gele effizienter als die Kombination zweier spezialisierter Chips. Force-RTX-Karten sind im Vergleich zu denen in den HPC-Beschleunigern zwar Nvidia liefert auch optimierte Systeme und Chips für spezielle KI-Anwendunbeschnitten, funktionieren im Prinzip gen. Die großen DGX- und HGX-Systeme aber gleich. Daher kann man in einem dienen dem Training und lassen sich zu Desktop-PC mit PCIe-x16-Steckplatz für Supercomputern koppeln; der Nvidia-ei350 Euro viel KI-Leistung nachrüsten. gene Selene ist einer der schnellsten Auch AMD (Instinct MI) und Intel Top500-Supercomputer. Billigere T4(Data Center Max GPU / Ponte Vecchio sowie die Arc-A-Gamerkarten) verkauKarten sind fürs Inferencing gedacht und fen GPU-Beschleuniger. AMD nennt die Jetson-Module zielen auf Fahrzeuge und KI-Rechenwerke Matrix Core TechnoloRoboter. Die Tensorkerne nutzt Nvidia gy beziehungsweise Wave Matrix Multi auch in Gaminggrafikkarten, nämlich für Accumulate (WMMA), Intel Xe Matrix die Upscaling-Funktion Deep Learning Extensions (XMX). Das KI-SkalierungsSuper Sampling (DLSS). DLSS rechnet verfahren von Intel heißt Xe Super Samdie einzelnen Bilder einer Spielszene pling (XeSS). hoch, die die GPU zuvor in einer geringeHerzstück von Ki-Beschleunigern ist eine Vielzahl von Recheneinheiten (RE), welche vor allem Rechenwerke für die Basisoperationen eines Neurons ren Auflösung – und deshalb deutlich In der Praxis sieht man die genannten enthalten: Multiplizierer Addierer (MAC). Jedesund RE Intel-Karten hat zudem ein eigenes schneller – berechnet hat.und Durch KI-SkaAMDbisher viel selteRegister. FürNachschärfung Ein- und Ausgangswerte sowiener für als dieKI-Rechenbeschleuniger Gewichte gibt es Puffer. als sollierung und liefert DLSS

Einfaches KI-Rechenwerk

Ein Speichercontroller tauscht Daten mit dem RAM aus.

Puffer für Eingansdaten

che von Nvidia. Bei Intel ist das logisch, weil die Data Center Max GPU noch nicht wirklich und die Arc-Reihe noch nicht lange auf dem Markt ist. AMD hingegen tat sich jahrelang schwer mit der Pflege der Entwicklersoftware. Firmen wie Cerebras, Graphcore, Groq und die Intel-Sparte Habana verkaufen ebenfalls Spezialchips fürs KI-Training. Sie zielen vor allem auf Cloud-Rechenzentren und konkurrieren dort mit Beschleunigern, die Google (TPU) und Amazon (Trainium) selbst entwickelt haben.

RE

RE

RE

RE

Register

Register

Register

Register

RE

RE

RE

RE

Register

Register

Register

Register

RE

RE

RE

RE

Register

Register

Register

Register

Ausgangspuffer

Puffer für Gewichte

Speichercontroller (zum RAM)

Ein einfaches KI-Rechenwerk: Herzstück von KI-Beschleunigern ist eine Vielzahl von Recheneinheiten (RE), die vor allem Rechenwerke für die Basisoperationen eines Neurons enthalten: Multiplizierer und Addierer (MAC). Jedes RE hat zudem ein eigenes Register. Für Ein- und Ausgangswerte sowie für die Gewichte gibt es Puffer. Ein Speichercontroller tauscht Daten mit dem RAM aus (Abb. 3). 24

Zwar ist KI zurzeit ein Trendthema, aber KI-Projekte machen nur einen Teil der Anwendungen aus, die in typischen Rechenzentren laufen. Die weitaus meisten  (Cloud-)Server haben keine KI-Beschleuniger und sind mit x86-Prozessoren von AMD oder Intel bestückt. Daher betont Intel gerne, dass ein erheblicher, vermutlich sogar der größte Teil aller KIAnwendungen auf x86-CPUs läuft. Diese haben allerdings in den jüngeren Generationen immer mehr zusätzliche KI-Funktionen bekommen. Jeder einzelne Kern eines modernen x86-Prozessors hat mehrere gleichzeitig nutzbare Rechenwerke für allgemeine Berechnungen, die Arithmetic Logic Units (ALUs). Die höchste Rechenleistung liefern aber die Vektorrechenwerke, auch SIMD-Einheiten genannt für Single In­ struction, Multiple Data. Alle aktuellen AMD- und Intel-Consumer-Chips haben pro Kern zwei Advanced Vector Exten­ sions der zweiten Generation (AVX2), die pro Taktschritt je zwei 256-Bit-Werte miteinander verrechnen, auch als Fused Multiply-Add (FMA). Diese lassen sich für KI-Matrixmultiplikationen einspannen: Jede AVX2-Einheit verarbeitet pro Zyklus vier FP64- oder acht FP32-Werte. Doch selbst bei hohen Taktfrequenzen bleiben sie weit hinter spezialisierten KI-Einheiten etwa von Grafikkarten zurück. Ein Pro­zessor mit acht CPU-Kernen schafft bei 4 GHz 16 × 8 × 4 Milliarden Gleitkommazahlen pro Sekunde, also 0,5 FP32TFlops. Dabei sind die CPU-Kerne hoch ausgelastet, schlucken also viel Strom. AMD und Intel erweitern ihre x86Prozessoren jedoch auf drei verschiedene Arten um KI-Fähigkeiten. Erstens bringen sie den ohnehin vorhandenen AVXRechenwerken neue Funktionen bei, etwa in Form der Vector Neural Network In­ structions (VNNI). Zweitens ertüch­tigen sie AVX-Rechenwerke für Datenformate wie BF16 und Int8. Drittens baut Intel zusätzliche KI-Rechenwerke ein, in die neuiX Special 2023 – KI

© Copyright by Heise Medien.

esten Xeons etwa die Advanced Matrix Extensions (AMX) und in Core-i-Prozessoren den Gaussian & Neural Accelerator (GNA). Der hilft etwa beim Entrauschen von Audiosignalen. Den „Max“-Spezialversionen der jüngsten Intel Xeons packt Intel zudem bis zu 64 GByte HBM gleich mit ins Gehäuse. Das superschnelle RAM bringt manche KI-Algorithmen enorm auf Trab. Trotz allem dürften x86-Prozessoren weiterhin eher fürs Inferencing als fürs KI-Training benutzt werden. Ein großer Vorteil der in x86-Prozessoren eingebauten KI-Funktionen ist allerdings, dass sie ohne Erweiterungskarten nutzbar sind. Sie stehen also etwa auch in virtuellen Cloud-Instanzen und Containern bereit, die sich durch Hinzunahme weiterer Instanzen skalieren und auf andere Hardware verschieben lassen. Im Vergleich zu KI-Beschleunigerkarten – auf solchen Karten sitzt maximal 128 GByte lokaler Speicher – steuern Serverprozessoren auch viel mehr RAM an. Server mit zwei AMD Epyc 9004 kann man mit 6 TByte bestücken, solche mit zwei Xeon-SP Gen 4 mit 8 TByte. In einem viel niedrigeren Leistungsbereich als x86-Prozessoren arbeiten Mikrocontroller. Das gilt sowohl für die Rechenleistung als auch für die elektrische Leistungsaufnahme. Manche Mikrocontroller schlucken bloß einige Dutzend Milliwatt. Vergleichsweise einfach gestrickte Mikrocontroller-Rechenkerne wie der ARM Cortex-M0 haben keine Floating-Point-Einheiten oder gar SIMDErweiterungen wie ARM Neon. Daher sind Zusatzeinheiten nötig, um KI-Algorithmen ausreichend schnell zu verarbeiten. SoC-Entwickler können KI-Rechenwerke als Funktionsblöcke von Designfirmen wie ARM, Cadence, Imagination Technology oder Synopsys kaufen, also als Intellectual Property Cores (IP-Kerne).

Chips und x86-CPUs für KI-Inferencing Hersteller

Chip

Google Intel²

Cloud TPU v4 Xeon Platinum 8490H AMX Cloud AI 100 Versal AI Core VC1902 T4 (Turing) Inferentia Inf1 GeForce RTX 3060 Xeon Platinum 8490H VNNI Epyc 9654 VNNI FSD-Chip, 2x NPU Neural Engine im M2 Coral USB

Qualcomm AMD Xilinix Nvidia Amazon AWS Nvidia Intel² AMD³ Tesla Apple Google Mediatek AMD/Intel

Dual-Core DLA 8 CPU-Kerne mit VNNI, 4 GHz

FP16-TFlops

Int8-TOps

  275¹   184¹

275 368

175 k. A.  65  64  51  46

350 133 130 128 102  92

 42 k. A.  16

 84  74  16   4

  0,9  1

 3,6   2

¹ BF16 ² geschätzt bei 3,0 GHz, 60 CPU-Kerne, pro Kern 2 AVX-512-Einheiten mit VNNI oder 1 AMX-Einheit nutzbar ³ geschätzt bei 3,45 GHz, 96 CPU-Kerne, pro Kern 1 AVX-512-Einheit mit VNNI

Solche Einheiten wie ARM Ethos-U65 oder PowerVR 3NX laufen dann parallel zu den Cortex-Prozessorkernen im selben Chip. Alternativ kann man die ShaderKerne einiger Embedded-Grafikkerne als KI-Rechenwerke einspannen, etwa die der ARM Mali-G710.

Chipfülle Viele KI-Chips haben zusätzliche Funktionsblöcke für spezielle Einsatzbereiche. Ein Beispiel ist das vom Elektroautohersteller Tesla selbst entwickelte System-on-Chip (SoC) für Full Self Driving (FSD), das auf die latenzarme Verarbeitung der Bilddaten von mehreren Kameras gleichzeitig optimiert ist. Qualcomms QCS410 für intelligente (Überwachungs-)Kameras ähnelt wiederum einem typischen Smartphone-SoC und hat außer einer „AI Engine“ beispielsweise auch vier integrierte ARM-Re-

chenkerne und eine GPU für allgemeine Aufgaben sowie Kameraschnittstellen (Camera Serial Interface MIPI CSI), einen Bildsignalprozessor (Image Signal Processor, ISP), Video- und Audio-Codecs, einen Audioverstärker für eingebaute Lautsprecher plus Controller für USB und Ethernet. Der ISP optimiert die Bilddaten vor dem Einspeisen ins KIRechenwerk: Zoom, Rauschminderung, Korrektur von Objektivverzerrungen, Farbraumkonversion. Andere KI-SoCs zielen etwa auf Audioanwendungen wie smarte Lautsprecher, geräuschreduzierende Kopfhörer oder Hörgeräte. Auf einer anderen Ebene liegen Unterschiede in der KI-Rechenleistung. Bei den soeben erwähnten Audio-SoCs für akkubetriebene „Hearables“ steht Sparsamkeit an erster Stelle, was auch die Performance beschränkt. Andere KI-Chips sind hingegen auf maximale Leistung oder minimale Latenz getrimmt, etwa

25

iX Special 2023 – KI © Copyright by Heise Medien.

solche zur Auswertung von Radarsensoren für Fahrerassistenzsysteme. Letztere müssen sicherheitskritische Entscheidungen innerhalb von Sekundenbruchteilen treffen. Das Beispiel Kraftfahrzeug verdeutlicht noch einen weiteren Unterschied zwischen KI-SoCs: Für manche Zwecke müssen Chips nach bestimmten Normen zertifiziert sein, etwa nach den Automotive Safety Integrity Levels (ASIL) für funktionale Sicherheit. Ein AudioSoC für ein Hörgerät muss die Medizinprodukteverordnung erfüllen können, ein Smartphone-SoC mit KI-Beschleuniger für schönere Schnappschüsse hingegen nicht. Manche sogenannten KI-Beschleuniger sind eigentlich eher KI-Ermöglicher, etwa die in rechenschwachen Mikrocon­ trollern. Hier macht eine zusätzliche KIEinheit den Algorithmus nicht bloß schneller, sondern den Chip überhaupt erst nutzbar für die jeweilige Aufgabe, und zwar mit minimalem Energiebedarf. KI-Beschleuniger für Supercomputer hingegen fressen schon mal 600 Watt oder im Extremfall – wie die gigantische Wafer Scale Engine Cerebras WSE-2 – sogar 15 Kilowatt. Sie verarbeiten KI-­ Algorithmen aber im Idealfall auch um das (Mehr-)Tausendfache schneller als ein Serverprozessor.

KI-Werkzeuge Die tollste Hardware lahmt, wenn der Code sie nicht ausreizt. Deshalb nutzen Entwickler zur Programmierung von KIAlgorithmen Frameworks wie TensorFlow, Caffe oder PyTorch. Dafür gibt es viele Codebeispiele und optimierte Bi­ bliotheken (Libraries). Für Mikrocon­ troller gibt es spezielle Varianten wie TensorFlow Lite. Alle Hersteller von KI-Chips liefern für derartige Frameworks jeweils angepasste Software, die Eigenheiten ihrer Rechenwerke berücksichtigt. Trotzdem sind oft Anpassungen am Quellcode für den jeweiligen Chip nötig, damit er optimal läuft. Und das Einrichten einer funktionsfähigen Programmier-Toolchain kann knifflig sein, wenn etwa die Treiber für einen KI-Chip nur mit einer bestimmten Version einer bestimmten Linux-Distribu­ tion laufen und die Libraries wiederum nur mit einer gewissen Frameworkver­ sion. Anders ausgedrückt laufen fertige KI-Modelle auf anderen Hardwareplattformen meistens nicht optimal, sondern verlangen Fein­tuning. Softwareoptimierung kann imposante Beschleunigung liefern. So zeigte Intel Anfang 2019, dass

Quelle: Apple

Basics | KI-Beschleuniger

Im Apple M1 belegt die 16-kernige Neural Engine – hier als NPU rot eingezeichnet – mehr Chipfläche als zwei der starken CPU-Kerne (Abb. 4). man die Verar­beitungsgeschwindigkeit des Benchmarks ResNet-50 bei einem Server mit zwei Xeon Platinum 8180 seit dessen Markteinführung Mitte 2017 fast um den Faktor 6 steigern konnte – ohne Änderungen an der Hardware. In der Praxis hängt es von vielen Randbedingungen ab, wie schnell ein KIAlgorithmus läuft. So sind MAC-Opera­ tionen zwar bei vielen KI-Algorithmen die häufigsten Berechnungen, aber nicht die einzigen – und je nach Mikroarchitektur bremsen zusätzliche Operationen erheblich. Sind Caches zu klein oder das RAM zu lahm, müssen die Rechenwerke immer wieder auf Daten warten. Wurde die Rechenaufgabe in Teilaufgaben zerlegt, die nicht zum Aufbau des Chips passen, liegt Leistungspotenzial brach.

Leistungsvergleich Weil KI-Software für die jeweilige Hardware angepasst sein muss, existiert bisher kein simpler Benchmark, der beliebige KI-Chips anhand weniger Messwerte miteinander vergleicht. Vielmehr gibt es zahlreiche unterschiedliche Benchmarks, einige für bestimmte KI-Modelle, beispielsweise für Bilderkennung mit ResNet-50. Und selbst bei solchen ResNet50-Ergebnissen muss man sehr genau hinschauen, weil einige Parameter den Benchmark stark beeinflussen. Kurz gesagt braucht man einiges Vorwissen, um KI-Chips sinnvoll miteinander vergleichen zu können. Schon der Vergleich der technischen Daten von KI-Beschleunigern ist schwierig. Viele Hersteller beziffern die maxi­ male Integer-Rechenleistung ihrer Chips in Billionen Operationen pro Sekunde (Tera Operations per Second, TOps) und die Gleitkommaperformance in Billionen Flops (TFlops). Die Apple Neural Engine

26

(ANE) im A15-SoC des iPhone 13 schafft laut Apple 15,8 TOps, bezogen auf FP16. Apple verrät allerdings nicht, ob die ANE mit Int8-Daten doppelt so schnell wäre. Nvidia nennt für die H100 als PCIeSteck­karte rund 1500 TOps für die Datentypen FP16 und BF16 sowie das Doppelte für FP8 und Int8 – sofern die SparsityMa­trizenkompression greift. Ohne Sparsity sind es für FP16/BF16 nur rund 750 TOps. Ohne genauere Angaben kann man davon ausgehen, dass die Hersteller den für ihr Produkt schmeichelhaftesten Spezialfall gewählt haben. Die Daten in den Tabellen „Chips für KI-Training“ und „Chips und x86-CPUs für KI-Inferencing“ taugen daher nur für eine ganz grobe Einstufung. Einige Chips wurden für spezielle ­KI-Algorithmen maßgeschneidert. Dazu ­gehören Forschungsprojekte wie Brain­ ScaleS und SpiNNaker. Für BrainScaleS wurden auf 20-Zentimeter-Wafern jeweils 20 Millionen Synapsen und 200 000 Neuronen untergebracht. SpiNNaker ist eine Maschine mit einer Million ARMRechenkernen und 7 TByte RAM.

Exoten IBM, Analog AI und Mythic erforschen analoge Rechenschaltungen, die die digitale MAC-Operation ersetzen und dabei weniger Energie benötigen. Die Firmen Lightmatter und Lightelligence arbeiten an optischen KI-Rechenwerken (siehe ix.de/zpfy). Es gibt außerdem mehrere Ansätze, KI-Algorithmen beziehungsweise Teile davon direkt im Arbeitsspeicher zu erledigen. Das hat unter anderem den Vorteil, dass der Transport der Daten vom RAM in die Rechenwerke entfällt, was Energie und Zeit spart. Micron stellte das Forschungsprojekt „Automata Processor“ schon 2014 vor, Samsung und Hynix entwickelten verschiedene „PiM“-Testchips für Processing in Memory. 2010 erregte der Memristor einige Aufmerksamkeit, und zwar nicht nur als nichtflüchtige Alternative für DRAM, sondern auch als Bauelement für MAC-Rechenwerke. Daran wird seit mehr als einem Jahrzehnt geforscht, auch mit resistiven Speicherzellen wie ReRAM. In der Anfangszeit des KI-Booms wurden programmierbare Logikchips (FPGAs) eingesetzt, aber für KI optimierte Chips hängten sie schon vor zehn Jahren bei Geschwindigkeit und Effizienz ab, sofern es nicht um Spezialanwendungen geht. Die AMD-Sparte Xilinx hat etwa mit den Versal-Karten eine Kombination aus einem FPGA-Teil mit hartveriX Special 2023 – KI

© Copyright by Heise Medien.

drahteten Inferencing-Beschleunigern entwickelt. Solche Kombiprozessoren könnten in Zukunft häufiger auftauchen, weil die Halbleiterindustrie effiziente Großserienverfahren entwickelt hat, um Chips aus mehreren Chiplets zusammenzufügen. Die Chiplets können dabei sogar von unterschiedlichen Firmen und aus unterschiedlichen Fertigungsverfahren stammen. Dadurch lassen sich Allzweck- und KI-Chiplets kostengünstig kombinieren.

KI-Boom Der Entwurf von KI-Rechenwerken ist nicht trivial, aber deutlich einfacher als das Design eines komplexeren Smartphone- SoC oder x86-Prozessors. Daher liegt die Einstiegshürde für KI-Chipentwicklung niedriger. Mehrere große CloudDienstleister wie Amazon und Google sowie Alibaba und Baidu aus China betreiben erfolgreich hausgemachte KI-Chips oder haben welche entwickelt. Der Boom der KI-Anwendungen sowie das bis 2021 in Strömen fließende Investorengeld führten zu einer Welle an Start-ups, die eigene KI-Chips entwickeln. Zurzeit sind schätzungsweise mehr als 60 Firmen im Rennen. Allerdings kostet die Entwicklung eines modernen SoC für die 5-NanometerFertigung über 50 Millionen Euro. Aus wirtschaftlicher Perspektive rechnet sich ein solcher Chip nur, falls er entweder in riesigen Stückzahlen zum Einsatz kommt oder sehr teuer verkauft werden kann. Oder wenn es eher ums Einsammeln von Risikokapital als um eine tatsächliche Chipfertigung geht. Viel billiger ist die Entwicklung und Herstellung eines schwächeren KI-Chips für ältere Fertigungstechnik. Daher arbeiten auch mehr Start-ups im letztgenannten Bereich.

Ausblick Die Entwicklung eines komplexen Halbleiterchips bis zur Serienreife dauert jedoch mehrere Jahre, in denen sich die KI-Software rasant weiterentwickelt. Es lässt sich deshalb nur schwer einschätzen, welches aus heutiger Sicht attraktive Beschleunigerkonzept in der Praxis ausreichend große wirtschaftliche Vorteile bringt, um im Markt bestehen zu können (siehe ix.de/zpfy). So mancher geplante KI-Chip dürfte es nicht in die Serienfertigung schaffen oder wird rasch wieder in der Versenkung verschwinden. Obwohl die KI-Forschung bereits mehrere Jahrzehnte auf dem Buckel hat,

verläuft die Entwicklung seit einigen Jahren rasant. Deshalb sind Vergleiche von Hardware und Performance nur Momentaufnahmen. Derzeit jedenfalls verarbeiten Beschleuniger viele KI-Algorithmen deutlich schneller und effizienter als aktuelle x86-Prozessoren von AMD und Intel. Letztere lernen bei KI jedoch rasch hinzu und sind leicht in der Cloud verfügbar. Bei sparsamen Mikrocontrollern und Smartphone-SoCs ermöglichen integrierte KI-Kerne es wiederum überhaupt erst, dass komplexe KI-Algorithmen laufen. KI-Rechenwerke gibt es in erschlagender Fülle. Die meisten stehen jedoch nicht in direkter Konkurrenz zueinander, weil sie auf unterschiedliche Anwendungsbereiche zielen; einige passen nur in Nischen. Die Erfahrung aus rund 60 Jahren industrieller Halbleiterentwicklung legt die Einschätzung nahe, dass die zurzeit schier uferlose Vielfalt an KIProzessoren auf eine überschaubare Anzahl an Varianten eindampfen wird. Ein wesentlicher Erfolgsfaktor sind effiziente Softwareökosysteme, weil die Hardware nur damit ihre Leistung auf die Straße bringt. ([email protected]) Dieser Artikel erschien zuerst in c’t 11/2023 unter dem Titel „Intelligenzbestien; So funktionieren Rechenwerke für KI-Algorithmen“. Quellen [1] Pina Merkert; Aufmerksamkeit reicht; So funktionieren SprachKIs vom Typ „Transformer“; c’t 11/2022, S. 136 [2] Pina Merkert; Byte-Intelligenz; Neuronale Netze für TensorFlowLite auf 8-Bit-Integer umrechnen; c’t 22/2019, S. 182 [3] Thomas Brandstetter; Rechnen mit Licht; Optical Computing: in Spezialbereichen tausendfach schneller als Elektronen; c’t 24/2022, S. 148 [4] Philipp Bongartz, Pina Merkert; Skalierungshypothese vs. Neurosymbolik; c’t 23/2022, S. 124

Christof Windeck ist leitender Redakteur im Hardware-Ressort des Computermagazins c’t. Seit 1999 testet er PCs, Server, Prozessoren und RAM. Er schreibt auch über Rechenzentren und Supercomputer. 27

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Hardware

Verarbeitung aufwendiger Modelle um Zehnerpotenzen besser.

Zu lange Trainingszeiten sind kontraproduktiv

GPUs für das KI-Training Wer KI-Modelle trainieren will, greift meist zu GPUs. Doch sind die Unterschiede zwischen den Karten groß und haben einen enormen Einfluss auf die Trainingsdauer. Von Toine Diepstraten und Henri Hagenow Ȗ Mitverantwortlich für die Fortschritte im Deep Learning (DL) ist die drastische Steigerung der Rechenleistung, speziell der GPUs. DL-Modelle bestehen aus mehreren Schichten von Neuronen, die miteinander verbunden sind. Jede Schicht führt eine Berechnung durch, die von den Ergebnissen der vorherigen Schicht abhängt. Da die Anzahl der Neuronenverbindungen bei der Vergrößerung durch eine Verbreiterung einer Schicht quadratisch zunimmt, werden die Berechnungen größerer Modelle überproportional rechenaufwendiger. Aufgrund ihrer Architektur kann eine GPU eine Vielzahl dieser Berechnungen parallel abarbeiten. Dabei führen Tausende von Rechenkernen mit SIMD-­ Instruktionen (Single Instruction Multi­ ple Data) die nötige Berechnung simultan aus. Um zu eruieren, welche Anforderungen eine GPU bei einem Einsatz in Deep-Learning-Umgebungen erfüllen muss, ist zwischen dem Training und dem Betrieb (Inferenz) des DL-Modells zu unterscheiden. Da beim Training große Datenmengen anfallen, kommen nur leistungsstarke GPUs mit einer hohen Anzahl von Rechenkernen und ausreichend GPU-Speicher infrage. Das ist wichtig, um bei stetig 28

wachsender Modellgröße die Rechenzeit in einem akzeptablen Bereich zu halten. Abhängig von Datenmenge und Modellgröße kann ein Trainingsdurchlauf ei­ nige Tage bis zu mehrere Monate in Anspruch nehmen. Im Vergleich zur CPU arbeitet eine GPU bei der Lösung solcher Aufgaben effizienter und skaliert bei der

1-TRACT ȫ Eine GPU arbeitet bei KI-Anwendungen effizienter als eine CPU. ȫ Neben der Rechenleistung sind Speichergröße und -bandbreite entscheidend für die Leistungsfähigkeit. ȫ Die auf dem Markt erhältlichen GPUs bewegen sich hinsichtlich Preis und Leistung in einem breiten Spektrum. ȫ Benchmarks zeigen die Leistungs­ fähigkeit der Spitzenmodelle, aber auch, dass mehrere günstige Karten mehr leisten können als ein HighEnd-Produkt. ȫ Leistungsaufnahme und Wärme­ abgabe der GPUs sind nicht zu unterschätzen und daher bei der Auswahl und der Unterbringung der Systeme zu berücksichtigen. © Copyright by Heise Medien.

Damit ein Entwicklungszyklus effizient abläuft, sollten möglichst am nächsten Tag Ergebnisse vorliegen. Das Training muss durch Anpassung einer Vielzahl von Parametern wie Learning-Rate, Batch­ size, Augmentation oder Modellarchitektur wiederholt optimiert werden, da ein gutes Ergebnis auf Anhieb unwahrscheinlich ist. Ob ein Trainingsdurchlauf in­ nerhalb einer Nacht oder in einer Woche abgeschlossen ist, kann bei der Entwicklung kommerzieller Dienste und Anwendungen einen gravierenden Unterschied machen. Bei der Inferenz wird dagegen das bereits trainierte Modell angewendet, um Vorhersagen auf bisher unbekannte Eingangsdaten zu treffen oder die gewünschte Anwendung des trainierten Modells abzurufen. Für den Betrieb des DL-Modells ist deutlich weniger Rechenleistung und Speicherplatz als während des Trainings erforderlich. In diesem Artikel befassen wir uns primär mit GPUs, die sich für das DL-Training eignen. Die Rechenleistung und die Größe des verbauten Speichers sind die ausschlaggebenden Faktoren bei der Auswahl einer für DL-Anwendungen geeigneten GPU. Die Anzahl der Gleitkommaberechnungen pro Sekunde (FLOPS – Floating Points per Second) ist sicher der wich­ tigste Indikator für die Leistungsfähigkeit. Die Rechenleistung liegt aktuell im PFlops-Bereich, die Herstellerangaben sind allerdings eher als Richtwerte zu verstehen, die nur im Optimalfall erreichbar sind. Ebenfalls nicht zu vernachlässigen ist die Genauigkeit der Berechnungen, die in 64, 32, 16 und 8 Bit erfolgen kann. Für Deep Learning ist in der Regel keine 64-Bit-Genauigkeit nötig, für die meisten Berechnungen sind 32 oder 16Bit bereits ausreichend. Für Inferenzanwendungen werden noch kleinere Auflösungen verwendet, da der größte Teil der Werte bereits als Konstanten feststeht.

Speichergröße ist entscheidend Ein weiterer Faktor, den es bei der Auswahl einer passenden GPU zu berücksichtigen gilt, ist die Speicherkapazität. Sie ist entscheidend für die Größe des zu trainierenden DL-Modells. Der Zustand des Modells und die Gradientenänderungen für jeden Trainingsdatensatz müssen iX Special 2023 – KI

Weitere Anbieter auf dem KI-GPU-Markt

im GPU-Speicher gehalten werden, was zu einem Speicherengpass führen kann. Die Batchgröße bestimmt, wie viele Trainingsdatensätze gleichzeitig verarbeitet werden, und kann daher die Speicheranforderungen des Modells erheblich beeinflussen. Im Idealfall sollte der Zustand des Modells mehrere Male in den GPUSpeicher passen. Modelle, die der Speicher der GPUs nicht fassen kann, lassen sich nur ineffizient trainieren, da der Datentransfer zwischen CPU und GPU zum Flaschenhals wird und der GPU-Prozessor nicht ausgelastet werden kann. Für den Betrieb des KI-Modells muss für eine effiziente Berechnung zumindest eine Instanz in den Speicher der GPU passen. Die Geschwindigkeit, mit der sich die Daten zwischen Speicher und Recheneinheit innerhalb der GPU bewegen, wird als Speicherbandbreite bezeichnet. Je höher sie ausfällt, desto besser ist die GPU ausgelastet. Der Wert wird vom Hersteller so gewählt, dass der Grafikprozessor und die Speicherarchitektur möglichst optimal aufeinander abgestimmt sind. Der Speicher kann aus günstigem GDDRoder teurem, aber performantem HBMSpeicher (High Bandwidth Memory) bestehen. Von besonderer Relevanz ist die Anzahl der GPU-Kerne: Je mehr Kerne eine GPU hat, desto mehr Operationen kann sie gleichzeitig ausführen. Die Taktraten spielen dagegen eine untergeordnete Rolle, da einer Steigerung physikalische Grenzen gesetzt sind. Eine Verdopplung der Cores von einer GPU-Generation zur nächsten ist dagegen nicht unüblich. Damit die Stromkosten nicht durch die Decke gehen, ist ein Blick auf die Energieeffizienz unerlässlich. Sie ergibt sich aus dem Verhältnis zwischen aufgenommener Leistung und erbrachter Rechenleistung. Die Leistungsaufnahme bestimmt durch die Wärmeabgabe die

Intel bietet nur GPU-Karten an, die sich für den Inferenzbetrieb eignen, arbeitet aber an leistungsfähigeren GPUs. Die Max-Serie erzielt bei Float32-Berechnungen zum Teil eine ähnliche Leistung wie Nvidia und AMD. Die Float16-Performance ist allerdings noch nicht konkurrenzfähig und die Kompatibilität zu gängigen DL-Frameworks verbesserungswürdig. Huawei hat die Atlas-Produktreihe für KIAnwendungen im Portfolio. Ob sie irgendwann auch den europäischen Markt erreicht, ist unklar. Das britische Unternehmen Graphcore konzentriert sich auf spezielle Hardware für künstliche Intelligenz. Ihre IPU (Intelligence Processing Unit) wurde speziell für DL-Workloads entwickelt. Cerebras Systems bietet mit der Wafer Scale Engine 2 eine spezielle KI-ComputeAnforderungen an die Kühlung und ist vor allem bei einem dauerhaften Parallelbetrieb mehrerer GPUs nicht zu unterschätzen. Stromversorgung und Kühlung können Dimensionen erreichen, für die klassische Serverräume und Rechenzentren nicht ausgelegt sind. Die Energieeffizienz einer GPU lässt sich ermitteln, indem man die Rechenleistung in Relation zum Stromverbrauch setzt. Im Allgemeinen ziehen neuere GPUs zwar mehr Strom, sind aber effizienter als ältere Modelle.

Der passende Formfaktor Damit möglichst viele GPUs in ein System passen, hat sich bei Compute-GPUs der 2-Slot-Formfaktor etabliert. Im BlowerDesign bläst ein Axiallüfter die kühle Luft längs durch die Kühlkörper der GPU und treibt die heiße Luft aus dem Gehäuse heraus. Im High-End-Bereich verzichtet man gänzlich auf Lüfter, dort hält ein pas-

Plattform an, die in einem Prozessor in der Größe eines ganzen Siliziumwafers mit 850 000 Rechenkernen und 40 GByte SRAM die Leistung von Hunderten von herkömmlichen GPUs vereint. Zusätzlich beschleunigt die hohe Speicherbandbreite von 20 PByte/s innerhalb des Chips das Training neuronaler Netze. Sein Betrieb verschlingt allerdings mehr als 20 Kilowatt, was etwa einem Rack mit klassischen GPUServern entspricht. Im Allgemeinen variieren die Produkte und Einsatzbereiche dieser Hersteller je nach Marktsegment, Kundenspezifikationen und Einsatzszenarien. Beispielsweise startet der Preis für die Chips von Graphcore im sechsstelligen oder der für solche von Cerebras Systems im siebenstelligen Bereich. Zudem ist das Programmieren von Anwendungen aufgrund der besonderen Architektur und eingeschränkte Softwareunterstützung nicht einfach. siver Kühler die GPU auf Temperatur, den Abtransport der Wärme übernehmen die Serverlüfter. Lautstärke, Energieaufnahme und Wärmeabgabe machen solche Server ungeeignet für Besenkammern und andere provisorische Standorte. Neben GPUs für den PCIe-Slot existieren solche im SXM-Format (Scalable Link Interface for eXternal Memory). Dieser Formfaktor wurde für den Einsatz in Supercomputern entwickelt. Das SXMModul sitzt direkt auf dem Motherboard. Ein spezieller Anschluss verbindet SXMGPUs mit dem Mainboard und externen Speichermodulen. SXM-GPUs bieten eine höhere Speicherkapazität und Bandbreite bei geringerer Latenz als GPUs für den PCIe-Slot. Bei den Frameworks dominiert Nvidia mit der proprietären CUDA-Schnittstelle (Compute Unified Device Architecture) den Markt. Die derzeit meistgenutzten DL-Frameworks TensorFlow und PyTorch wurden zum Teil exklusiv für

29

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Hardware

­ UDA entwickelt und ließen sich daC her lange Zeit nur mit Nvidia-GPUs beschleunigen. In den letzten Jahren haben andere Hersteller aber aufgeholt. Nun bietet auch AMD mit ROCm (Radeon Open Compute) eine alternative Schnittstelle an, mit der aktuelle TensorFlowund PyTorch-Versionen verfügbar sind. Zu guter Letzt spielt auch der Preis eine wichtige Rolle bei der Entscheidungsfindung. Grundsätzlich gilt: Je leistungsstärker eine GPU ist, desto teurer ist sie auch. Diese Abhängigkeit folgt allerdings keinem linearen Verlauf. Der Preisabstand der Hochleistungskarten ist oft gravierend. Es gilt daher, das optimale Produkt für die eigenen Ansprüche zu finden.

Wie viele GPUs braucht das DL-Training? Die Effektivität des Trainings eines DLModells hängt nicht nur von den Cha­ rakteristika der GPUs ab, sondern auch von deren Anzahl. Durch das Parallelisieren des Trainingsprozesses über mehrere GPUs lässt sich die Leistung nahezu li­ near steigern. Üblicherweise bündelt man zwei, vier oder acht GPUs in einem Server. Auch in Workstations lassen sich mehrere GPUs einbauen. Hier gibt es jedoch aufgrund von Platzbeschränkungen und den Anforderungen an Netzteilleistung und Wärmeableitung ein praktisches Limit von vier GPUs, damit optimale Leistung und Stabilität gewährleistet sind. Limitiert wird die Zahl der GPUs pro Server auch von der CPU und ihrem PCIe-Controller. High-End-GPUs verlangen 16 PCIe-Lanes für einen optimalen Datenaustausch zwischen den GPUs und der CPU beziehungsweise dem Hauptspeicher. Damit scheiden ClientCPUs wie AMD Ryzen mit 24 PCIe-Lanes

oder Intel I9 mit 20 Lanes aus. Aktuelle Server-CPUs, also AMDs Epyc oder Intels Xeon, kommen dagegen auf bis zu 128 PCIe-Lanes. Abzüglich der Lanes, die andere Karten für Storage und Netz belegen, ergibt sich ein Richtwert von vier bis sechs GPUs pro CPU für ein optimal ausgelastetes System. Ein Dual-CPU-System in einem 4U-Servergehäuse hat ausreichend Platz und genügend PCI-Lanes für bis zu acht GPUs. Eine Skalierung, die über acht GPUs innerhalb eines Servers hinausgeht, ist derzeit unüblich. Die nächste Stufe ist die Kombination mehrerer 8-GPU-Server, deren Nodes über ein 100-GBit-Ethernet-Netz verbunden sind, zu einem Cluster. Hier scheinen die Grenzen aktuell lediglich finanzieller Natur zu sein. Zum Beispiel wurde das große Sprachmodell LLama-65B auf einem Cluster mit 256 Servern mit jeweils acht GPUs, also mit insgesamt 2048 GPUs, trainiert. Ein ähnliches Set-up wurde auch für das Training von GPT-3 und GPT-4 eingesetzt, den DL-Modellen, die ChatGPT zugrunde liegen. Das Mischen verschiedener GPU-Modelle ist grundsätzlich nicht sinnvoll. Die aktuellen Multi-GPU-Skalierungsmethoden funktionieren am besten mit identischen GPUs. Denn die langsamste GPU bildet immer den Flaschenhals und gibt die maximale mögliche Performance vor, die pro GPU im Parallelbetrieb erreicht werden kann. In der Regel sind mehrere preiswerte GPUs dank Multi-GPU-Skalierung leistungsfähiger und unter Umständen sogar günstiger als eine teure GPU der nächsthöheren Leistungsklasse. Auch die richtige Wahl des Basissystems kann Ausgaben einsparen. Wenn eine Skalierung von vornherein geplant ist, kann sich die An-

schaffung eines Dual-CPU-Basissystems lohnen, das sich zur Leistungssteigerung einfach um weitere GPUs erweitern lässt.

Aktuelle Deep-Learning-GPUs Derzeit dominiert Nvidia mit einer breiten Palette an GPUs und Compute-Beschleunigern den Markt, darunter die GeForce-, die RTX-Serie und deren Ableger der A-Serie. Der Hersteller hat in den letzten Jahren einen Vorsprung bei der Entwicklung von GPUs für DL-Anwendungen aufgebaut und nutzt diese Marktmacht für eine aggressive Preisgestaltung. Die GPUs von Nvidia sind bekannt für ihre hohe Kompatibilität mit gän­ gigen DL-Frameworks wie TensorFlow und PyTorch. Das zweitgrößte Stück des Kuchens gehört AMD. Aus diesem Grund beschränkt sich der Artikel auf die GPUs der beiden Unternehmen (siehe Kasten „Weitere Anbieter auf dem KI-GPUMarkt“). Leistung und Stabilität liegen auf einem hohen Niveau. AMD konzentriert sich zumindest ­aktuell im HPC-Bereich auf Compute-­ Karten für Anwendungen jenseits von DL und Data Science. Die Stärke liegt insbeson­dere bei Berechnungen, die eine 64-Bit-Gleitkommagenauigkeit be­ nötigen. AMDs GPUs sind bei höherer Gleitkommagenauigkeit zum Teil leistungsstärker als ­aktuelle Nvidia GPUs. Es zeichnet sich aber ab, dass die AMDs Produktreihe der  Radeon Instinct eine Alternative zu Nvidias DL-GPUs werden könnte. Beide Hersteller bieten eigens für ihre Produkte entwickelte Softwarebibliotheken an. CUDA ist auf das parallele Ausführen von Anwendungen auf Nvidia-GPUs spezialisiert. Sie besteht aus einer API und einer Sammlung von C-Bibliotheken.

Übersicht aktueller GPU-Modelle Modell

Einsatzbereich

Veröffentlichung

Architektur

VRAM (in GByte)

GPU-Kerne Tensor-Kerne

Stromverbrauch (in Watt)

Durchsatz (in GByte/s)

GeForce RTX 2080TI QUADRO RTX 5000 GeForce RTX 3090 RTX A5000 RTX A5500 RTX A6000 AMD Instinct MI100 GeForce RTX 4090 RTX 6000 Ada Tesla V100 Nvidia A100

Workstation

2018

Turing

11 (DDR6)

5342

544

260

616

Workstation/Server

2018

Turing

16 (GDDR6)

3072

384

230

448

Workstation/Server Workstation/Server Workstation/Server Workstation/Server Server

2020 2021 2022 2020 2020

Ampere Ampere Ampere Ampere CDNA

24 (GDDR6X) 24 (GDDR6) 24 (GDDR6) 48 (GDDR6) 32 (HBM2)

10496 8192 10240 10752 7680

328 256 220 336 

350 230 230 300 300

936 768 768 768 1228

Workstation Workstation/Server Server Server

2022 2022 2017 2020

Ada Lovelace Ada Lovelace Volta Ampere

24 (GDDR6X) 48 (GDDR6) 16 (HBM2) 40/80 (HBM2)

16384 18176 5120 6912

512 568 640 512

450 300 250 300

Server

2022

Grace Hopper 80 (HBM2)

14592

456

350

1008 960 900 1935 (80 GByte PCIe) 2000

Nvidia H100

30

iX Special 2023 – KI © Copyright by Heise Medien.

PyTorch-Benchmark (1.13.1) mit ResNet-50 GPU-Modell 4 × A100 (40 GByte) bs 384/768

3351

4 × 6000 Ada (48 GByte) bs 384/768

4991

2513

2 × H100 (80 GByte) bs 768/1536

4378

2262

4 × A5000 (24 GByte) bs 192/384

1734

2 × A100 (40 GByte) bs 348/768

1714

2 × 6000 Ada (48 GByte) bs 348/768

1302

H100 (80 GByte) bs 768/1536

1135

2 × RTX 3090 Ti (24 GByte) bs 192/384

994

2 × A6000 (48 GByte) bs 348/768

983

2 × A5000 (24 GByte) bs 192/384

879

A100 (40 GByte) bs 348/768

879

4090 (24 GByte) bs 192/384

717

6000 Ada (48 GByte) bs 348/768

560

RTX 3090 Ti (24 GByte) bs 192/384

529

A6000 (48 GByte) bs 348/768

502

RTX 3090 (24 GByte) bs 192/384

498

A5500 (24 GByte) bs 192/384

467

A5000 (24 GByte) bs 192/384

445 352

Vv100 (16 GByte) bs 160/320

268

2080Ti (12 GByte) bs 96/192

3214 2696 2302

1768 1772 1760 1631 1382

1183

657

AMD MI100 (32 GByte) bs 256/512

3507

1150 1114 913

fp32 Automatic Mixed Precision

898 877 852 811 804

580

0

1000

2000

3000

4000

5000

Bilder pro Sekunde

Der Benchmark ermittelt die Leistung unterschiedlicher GPU-Modelle beim Trainieren des DL-Modells ResNet-50 sowohl für den Datentyp FP32 als auch für AMP. In der Klammer unter dem GPU-Modell steht die Größe des VRAMs einer einzelnen GPU, daneben die verwendete Batchgröße. Während Nvidia seine CUDA-Plattform stetig ausbaut, setzt AMD auf das OpenSource-Framework ROCm für professionelle Compute- und Machine-LearningAnwendungen. Mit den Tools und Biblio-

theoretisch max. FP32 CUDA / Tensor (TFLOPS)

Tensor-Performance (FP16 in TFlops)

11,8

23,5

11,2

22,3

29,2 27,7 34,1 38,7 23,1/46

142 111 136 154 184

82,5 91,1 14 19,5/156

330 364 112 312

51/378

756

theken können Entwickler parallele Anwendungen auf AMD-GPUs ausführen. ROCm ist derzeit nur für Linux erhältlich und arbeitet mit AMD-Compute-Karten zusammen, die auf der CDNA-Architektur basieren. Einige Modelle mit RDNA-2-Architektur werden ebenfalls unterstützt. Für die Schnittstelle sind aktuelle Versionen von TensorFlow und PyTorch unter Linux erhältlich.

GPUs von Nvidia und AMD im Vergleich Um die Leistung von GPUs für DL-Trainings einordnen und vergleichen zu können, wurde ein DL-Modell mit PyTorch trainiert. Bei den Messungen half das ­AIME-PyTorch-Benchmarks-Tool. Für Nvidias GPUs kam PyTorch in der Version 1.13.1 mit CUDA 11.7 und Python 3.8.10 zum Einsatz. Die AMD GPU wird mit PyTorch in der Version 1.12.1 mit ROCm 5.4.2, MIOpen 2.19.0 und Python 3.8.10 getestet. Abhängig vom GPU-Typ

wurden zwei verschiedene Systeme eingesetzt, da sich einige GPUs für Work­ stations eignen, während insbesondere GPUs mit passiver Kühlung primär für Server gedacht sind. Für die Tests von RTX 4090, RTX 3090, RTX 3090 TI, RTX 2080TI, RTX A5000 und RTX A5500 wurde eine AIME G400 Workstation verwendet. Die Tests von Nvidia A100, H100, Tesla V100, RTX 6000 Ada, RTX A6000 und AMD Instinct MI 100 werden mit einem AIME-A40002HE-Server durchgeführt. Die Performancemessung verwendet das visuelle Klassifizierermodell ResNet50 in Version 1.5. Als klassisches DL-Netzwerk mit einer komplexen 50-Schichten-Architektur, verschiedenen Faltungs- und Resi­ dual-Schichten sowie 25 Millionen Parametern ist es ein geeignetes Netzwerk für die Messung der erreichbaren DL-Leistung. Da viele Benchmarks das Modell verwenden, ist eine nahezu optimale Implementierung verfügbar, die der GPU die maximale Leistung abverlangt. Mit31

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Hardware

hilfe synthetischer Zufallsbilddaten erfolgt der Vergleich der GPUs, um einen Einfluss ­externer Faktoren wie der Art des Datensatzes, des Dataloaders und des Datenformats zu vermeiden. Die Batchsize definiert die Anzahl der Datensamples, die sich aus dem Datensatz in einer Trainingsiteration gleichzeitig verarbeiten lassen. Es folgt eine Aufteilung des Trainingsdatensatzes in Batches, die dann nacheinander durch das System propagiert werden, bis der gesamte Datensatz durchlaufen und somit eine Epoche abgeschlossen ist. Die Fachliteratur bezeichnet einen solchen Batch häufig als Minibatch, um die Unterscheidung zum kompletten Datensatz deutlich zu machen. Da nach jeder Iteration eine Anpassung der Gewichte im Modell an die Erkenntnisse aus dem aktuell verwendeten Batch erfolgt, hat auch die Batchsize Einfluss auf die Trainingsergebnisse und die Performance.

Präzision und Datentyp sind entscheidend Beim Training von DL-Modellen spielen die numerische Präzision der Berechnungen und der Datentyp eine große Rolle. Eine höhere Präzision ermöglicht feinere Gewichtungen, benötigt aber mehr Zeit und Speicher. Im vorliegenden Benchmark wird die Performance für FP32- und AMP-Datentypen (Automatic Mixed Precision) untersucht. Während der FP32Datentyp ausreichend numerische Genauigkeit für die Berechnungen bietet und im DL-Training am weitesten verbreitet ist, gewinnt AMP im DL zunehmend an Beliebtheit. AMP nutzt während des Trainingsprozesses verschiedene numerische Präzi­ sionsstufen, um die Effizienz und Genauigkeit von DL-Modellen zu verbessern. Die Idee dahinter: Bestimmte Teile des Modells reagieren auf numerische Präzision empfindlicher als andere. Durch die ­Verwendung unterschiedlicher Präzision lässt sich die Berechnung schneller und effizienter durchführen, ohne die effek­tive Genauigkeit des Modells zu beeinträch­ tigen. AMP erfordert spezielle Hardwareunterstützung, die nur aktuelle GPU-­ Generationen bieten. Zur optimalen Nutzung aller beteiligten GPUs verwendet die Redaktion beim Multi-GPU-Training das Modul Distri butedDataParallel von PyTorch. Im Gegensatz zur DataParallel-Methode erzeugt die Software pro GPU einen Subprozess, was zu einer deutlich besseren Performance führt.

Der Benchmark gibt die Anzahl der durchschnittlich verarbeiteten Bilder pro Sekunde aus. Die Dauer des Trainings betrug 50 Batches mit der jeweils unter den GPU-Typen angegeben Batchgröße. Die beiden Werte im Balkendiagramm entsprechen dem Training mit FP32-Datentyp und AMP. In der Klammer davor ist die Größe des GPU-VRAMs angegeben. Der höchste Wert aus drei Durchläufen stellt das Ergebnis dar. Die Starttemperatur aller GPUs lag bei 50 °C. Die Ergebnisse zeigen einen deutlichen Performancezuwachs bei allen GPUs durch den Einsatz von Automatic Mixed Precision (siehe Abbildung). Zudem zeigt das Diagramm eine kontinuierliche Verbesserung der GPU-Performance über die GPU-Generationen hinweg. Das aktuelle Topmodell, die Nvidia H100, erzielt die beste Einzel-GPU-Leistung, die jedoch durch den Einsatz mehrerer GPUs innerhalb eines Systems übertroffen wird. Die Ergebnisse zeigen, dass die Trainings­ leistung über mehrere GPUs hinweg gut skaliert. Um die Auswirkungen der Messung von Bildern pro Sekunde auf die Laufzeiten beim Trainieren von Netzwerken zu verdeutlichen, ist die Betrachtung eines realen Anwendungsfalls hilfreich. Exemplarisch sei das Training eines ResNetModells mit einem mittelgroßen Datensatz wie zum Beispiel dem knapp 1,5 Millionen Bilder umfassenden ImageNet2017-Datensatz genannt: Das aus vier Nvidia-A100-GPUs bestehende System mit einer Trainingsleistung von 3351 Bildern pro Sekunde erreicht eine Durchlaufzeit von 7 Minuten und 7 Sekunden. In dieser Zeit wird jedes Bild einmal trainiert, was einer Trainingsepoche entspricht. Da in der Regel mindestens 50 Trainingsepochen erforderlich sind, ergibt sich eine Gesamttrainingszeit von 5 Stunden und 55 Minuten für ein sinnvolles Training. Eine einzelne Tesla V100 hätte für das gleiche Ergebnis mehr als 56 Stunden benötigt.

Fazit Die Wahl der richtigen GPU und ihrer Anzahl hat einen großen Einfluss auf die Leistung und die Effizienz des DL-Systems, was sich erheblich auf die Dauer des Trainingsprozesses auswirkt. Letztendlich bestimmen die spezifischen Anforderungen, die Menge der zu trainierenden Daten, die Größe des Modells und nicht zuletzt das Budget die Auswahl. Abschätzen lässt sich ein Performancezugewinn für Multi-GPU-Systeme am ehesten bei der Messung der aktuellen

32

Trainingsdauer auf einem vorhandenen System mit einer GPU. Der ermittelte Wert lässt sich dann in etwa durch die der Anzahl der angestrebten GPUs teilen. Zu bedenken bei der Planung eines MultiGPU-Systems ist außerdem, dass mehrere GPUs leistungsfähigere und bedeutend teurere Einzel-GPUs im Preis-LeistungsVergleich und bei der Performance übertreffen. Soll eine Skalierung über einen längeren Zeitraum hinweg planbar sein, ist für den Start ein 4HE-Basissystem eine gute Wahl. Abhängig vom individuellen Bedarf ist es möglich, das System auf bis zu acht GPUs pro System auszubauen. Eine weitere Skalierung ist anschließend als Clusterausbau baugleicher Systeme denkbar. Zu beachten ist, dass eine geeignete Betriebsumgebung für Multi-GPU-Systeme verfügbar sein sollte. Geeignete Serverräume mit aktiver Klimatisierung oder eine Colocation für entsprechende Sys­ teme sind eine zwingende Voraussetzung für den Betrieb von DL-Servern. Die höchste GPU-Leistung bieten aktuell Nvidia-A100- und H100-ComputeBeschleuniger. Sehr günstige ConsumerGPUs spielen aufgrund des zu geringen GPU-Speichers, inkompatibler Produktabmessungen und mangelnder Softwareunterstützung keine Rolle beim DL-Training. Die Zukunft der KI-Entwicklung liegt bei speziellen Compute-DL-Karten und Systemen, die sich weiter auf diese Aufgabe spezialisieren und sich von der klassischen Grafikkarte immer weiter weg entwickeln.  ([email protected]) Quellen Das Benchmarktool findet sich unter ix. de/zeme.

TOINE DIEPSTRATEN ist Diplom-Informatiker und CTO von AIME, spezialisiert auf verteilte Systeme und KI / Deep Learning.

HENRI HAGENOW ist Diplom-Physiker und CEO der AIME GmbH und hat sich auf die Fertigung von Servern und Workstations zur Entwicklung von KI-Anwendungen spezialisiert. iX Special 2023 – KI

© Copyright by Heise Medien.

© Copyright by Heise Medien.

Basics | Datenqualität

Warum KI oft unfair ist und was dagegen hilft Machine-Learning-Algorithmen, deren Prognosen bestimmte Gruppen von Menschen benachteiligen, sind nicht fair. Modellverzerrungen und Fairness sind messbar, und in begrenztem Umfang lassen sich Modelle fairer gestalten. Von Boris Ruf Ȗ Fördergelder für Arbeitslose möglichst sinnvoll zu verteilen – das war die Idee des österreichischen Arbeitsamts, als es die Entwicklung eines neuen Entscheidungstools in Auftrag gab. Auf der Grundlage von Daten der vergangenen Jahre sollte das System die Chancen von Arbeitsuchenden auf dem Arbeitsmarkt vorhersagen. Der „AMS-Algorithmus“ teilte die Arbeit­suchenden in drei Gruppen ein, denen dann Weiterbildungsmaßnahmen in unterschiedlichem Umfang zugesprochen werden. Doch in der Alpenrepublik regte sich Widerstand. Datenschutzorganisa­ tionen kritisierten die Intransparenz der Software. Sie befürchteten, dass sie benachteiligte Bevölkerungsgruppen systematisch diskriminieren könne. Einstweilen untersagte die österreichische Datenschutzbehörde den Einsatz der Software aufgrund fehlender Rechtsgrundlage; zwischenzeitlich liegt der Fall am Verwaltungsgerichtshof. Warum sorgen Programme, die auf maschinellem Lernen (ML) beruhen und der künstlichen Intelligenz (KI) zuzurechnen sind, immer wieder für Negativschlagzeilen? Wie finden Verzerrungen ihren Weg in Daten und in Prognosemo-

delle? Und wie lässt sich Bias, wie das Phänomen auf Englisch heißt, kontrollieren und abmildern?

Was ist Bias? In Beispieldaten automatisiert komplexe  Muster zu erkennen, die sich dem menschlichen Auge oftmals entziehen, ist die große Stärke von ML-Algorithmen. Die gewonnenen Erkenntnisse werden dann genutzt, um Vorhersagen für neue, unbekannte Daten zu treffen. Im Zeitalter von Big Data steht eine riesige Menge an Daten mit allen möglichen Variablen zu Trainingszwecken zur Verfügung. Dabei gilt die Annahme, dass die Vorhersagen umso präziser werden, je mehr Daten man zum Training nutzt. Und tatsächlich übertreffen die Ergebnisse herkömmliche Ansätze und schneiden oft sogar besser ab als menschliche Expertise. Fehlerfrei sind die KI-Modelle allerdings nicht. Zwar lassen sich in großen Datenmengen zweifellos zahlreiche Korrelationen aufspüren; auf Kausalzusammenhänge weisen diese aber längst nicht immer hin. Denn wenn der Trainings­

1-TRACT ȫ Verzerrungen oder Bias in Machine-Learning-Modellen führen zu mangelnder Fairness, wenn Menschen betroffen sind. ȫ Sensible, personenbezogene Merkmale nicht zu erfassen, ist keine geeignete Gegenmaßnahme und kann das Problem sogar verschärfen. ȫ Es gibt keine allein gültige Definition von Fairness, sondern mehrere, die auf unterschiedlichen statistischen Voraussetzungen beruhen. ȫ Methoden zur Verbesserung der Fairness setzen in allen Phasen der ML-Entwicklung an, haben jedoch oft Nebenwirkungen. ȫ Fairness von KI-Algorithmen ist immer noch Gegenstand aktiver Forschung, es gibt keinen Konsens.

34

datensatz auch noch so groß ist, bleibt er doch stets nur eine Momentaufnahme jener Realität, die erfasst werden soll. Um die Qualität von KI-Modellen zu bewerten, werden mehrere Fehlertypen verwendet. Von Verzerrungen oder Bias ist die Rede, wenn sich die Fehlerraten für bestimmte Untergruppen unterscheiden. Als unfair werden die Entscheidungen empfunden, wenn sie Menschen betreffen und die Subgruppen demografischen Kategorien zuzuordnen sind.

Welche Fehlertypen gibt es? Zur Bewertung der Leistungsfähigkeit klassischer KI-Systeme für binäre Klassifizierungsprobleme hat sich die sogenannte Wahrheitsmatrix (im Englischen Confusion Matrix) bewährt. Ihre Zeilen repräsentieren die tatsächlichen, wahren Klassen, während sich die Spalten auf die Vorhersagen des Modells beziehen. In den Zellen, in denen die vorhergesagte Klasse mit dem tatsächlichen Ausgabewert übereinstimmt, stehen die Summen der jeweils korrekt klassifizierten Datenproben. Wo sich die Klassen unterscheiden, lag das Modell in seiner Vorhersage falsch und die Zellen enthalten die Summen der entsprechend fehlerhaft eingeordneten Fälle. Die Tabelle „Wahrheitsmatrix“ zeigt, wie die Werte der Zellen auf abstrakter Ebene üblicherweise bezeichnet werden. Von einer solchen Wahrheitsmatrix können nun zahlreiche statistische Kenngrößen abgeleitet werden, die zur Ermittlung der Fehlerraten notwendig sind. ­Zunächst wären da die tatsächlich positiven Fälle (P) im Datensatz. Diese Zahl ergibt sich aus der Summe der richtig-­ positiven und der falsch-negativen Pro­ gnosen. Letztere können auch als verfehlte positive Prognosen betrachtet werden. iX Special 2023 – KI

© Copyright by Heise Medien.

Wahrheitsmatrix ​ wahr

Wahrheitsmatrix männliche Patienten Prognose

0 1

     0 richtig-negative Prognosen (RN) falsch-negative Prognosen (FN)

Prognose

 1 falsch-positive Prognosen (FP) richtig-positive Prognosen (RP)

Beispiel einer konkreten Wahrheitsmatrix

wahr

0 1

     0  5101      2

Wahrheitsmatrix weibliche Patienten

Prognose wahr

0 1

     0 10 363      8

Entsprechend ergibt sich die Zahl der ­tatsächlich negativen Fälle (N) aus der Summe der richtig-negativen und der falsch-positiven Prognosen, die wiede­ rum als verpasste negative Prognosen verstanden werden können.

Die ersten Fehlertypen werden nun durch die Falsch-positiv-Rate (FPR) und die Falsch-negativ-Rate (FNR) beschrieben. Erstere bezeichnet den Anteil der eigentlich negativen Instanzen, der fälschlicherweise positiv klassifiziert wurde. Gleichermaßen steht letztere für die Rate der eigentlich positiven Fälle, die irrtümlich als negativ eingestuft wurden.

Weiterhin bezeichnet die Falscherkennungsrate (FER) den Anteil der Fehlentscheidungen von allen positiv beschiedenen Fällen. Es geht also um den Teil der Instanzen, die zu Unrecht als positiv identifiziert beziehungsweise erkannt wurden. Umgekehrt beschreibt die Falschauslassungsrate (FAR) das Verhältnis der fälschlicherweise negativ eingeordneten Fälle zu allen negativ pro­ gnostizierten. Diese eigentlich positiven Instanzen wurden ignoriert, das heißt, sie wurden irrtümlich übergangen beziehungsweise ausgelassen.

Unerwünschte Verzerrungen im Modell zu erkennen und zu beseitigen, ist allein deshalb geboten, weil es die Qualität der Ergebnisse verbessert. Noch dringlicher ist das Problem, wenn die Vorhersagen des Modells Menschen betreffen und die Verzerrung die systematische Benachteiligung einer demografischen Gruppe zur Folge hat – diese also diskriminiert wird.

Ein Beispiel Konkret veranschaulichen lässt sich das Problem an folgendem Beispielszenario: In der Radiologie soll eine bildverarbeitende Software mithilfe künstlicher Intelligenz seltene pathologische Verände-

 1 11 31

Prognose  1 17 54

Wahr

0 1

rungen auf Röntgenbildern erkennen. Wie die Wahrheitsmatrix der Gesamt­ ergebnisse aussehen könnte, zeigt die Tabelle „Beispiel einer konkreten Wahrheitsmatrix“. Von insgesamt 10 442 analysierten Röntgenbildern wurden 10 363 korrekt als negativ, also unbedenklich eingeordnet. Auf 54 Bildern wurde ebenfalls korrekt eine Auffälligkeit festgestellt. Falsch lag der Algorithmus insgesamt 25-mal: In 17 Fällen schlug er irrtümlich Alarm, in 8 Fällen übersah er pathologische Veränderungen. Das ergibt folgende Fehlerraten:

Bei näherer Betrachtung könnte sich allerdings ein anderes Bild ergeben, wie die Tabellen „Wahrheitsmatrix für männliche Patienten“ und „Wahrheitsmatrix für weibliche Patienten“ zeigen. Die Fehlerraten für Männer und Frauen fielen dann folgendermaßen aus: Männer: FPR≈0,0022 FNR≈0,0606 FER≈0,2619 FAR ≈0,0004 Frauen: FPR≈0,0011 FNR≈0,2069 FER≈0,2069 FAR≈0,0011

Für Frauen wäre das Risiko eines falschpositiven Befundes a­ lso niedriger als für Männer. Tatsächlich positive Ergebnisse würden allerdings häufiger übersehen – ein Fehler, der in diesem Kontext vermutlich schwerer wiegt. Insgesamt gilt: Das System versagt bei Männern oder Frauen unterschiedlich häufig, es liegt also eine Verzerrung vor.

Was wäre fair? Bevor Maßnahmen ergriffen werden können, um Verzerrungen in den Daten abzuschwächen und KI-Systeme so fairer zu machen, ist die Frage zu klären: Welche Art von Fairness ist das Ziel? Fairness ist ein theoretisches Konzept von Gerechtigkeit, für das verschiedene, mitunter gegensätzliche Definitionen existieren.

     0  5262      6

 1  6 23

Im Laufe der letzten Jahre haben Forscherinnen und Forscher diese unterschiedlichen Fairnessdefinitionen in mathematische Formeln übersetzt. Da praxisnahe Modelle nie völlig fehlerfrei sind, egal, wie sorgfältig sie trainiert wurden, liegt v­ ielen Fairnessdefinitionen letztlich  zugrunde, wie die Fehler auf verschiedene Gruppen verteilt sind. Dabei gibt es mehrere Arten von Fehlern, die abhängig vom Anwendungsfall unterschiedlich schwer wiegen können. Insgesamt wurden allein für Klassifizierungsprobleme bereits mehr als zehn unterschiedliche Fairnessdefinitionen in der Wissenschaftsliteratur vorgeschlagen. Trotzdem gilt der Bereich weiterhin als offenes Forschungsfeld ohne dominierende Lösungen. Nachfolgend werden exemplarisch drei von ihnen vorgestellt, die jeweils auf unterschiedlichen statistischen Grundprinzipien beruhen. Die Fairnessdefinition der Demographic Parity verfolgt das Prinzip der „bedingungslosen“ Unabhängigkeit. Praktisch bedeutet das, dass auf alle Prognosen bezogen der Anteil positiver und negativer Entscheidungen zwischen den sensiblen Gruppen gleich ist. Auf individueller Ebene gilt dann für zwei Per­ sonen mit verschiedenen sensiblen Attributen, dass es für sie gleich wahrscheinlich ist, eine der beiden Klassen zugewiesen zu bekommen. Bei Equalised Odds gilt das statistische Prinzip der Separierung: Für die wahren Klassen ist jeweils Unabhängigkeit gewährleistet, indem die Richtig-positiv- und die Richtig-negativ-Raten für die sensiblen Untergruppen gleich sind. Diesem Konzept liegt die Überlegung zugrunde, dass die Chancen auf eine korrekte Klassifikation für alle Personen identisch sein sollten. Im Fall von Calibration gilt das Prinzip der Suffizienz, das heißt, für alle positiven und alle negativen Vorhersagen ist der jeweilige Anteil korrekter Entscheidungen für beide sensiblen Untergruppen gleich. Als bedingter Erwartungswert wird ein Score verwendet, der die Wahrscheinlichkeit einer Zuordnung zur positiven Klasse ausdrückt. Diese Form von Kalibrierung der Ergebnisse für beide Untergruppen kann mit identischen Wahrscheinlichkeiten einer korrekten (oder in35

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Datenqualität

von ethischen Grundsätzen und gesetzlichen Rahmen­bedingungen geleitet.

Öffentliche Debatte

Grafische Repräsentation der Wahrheits­ matrix: Die schwarzen Punkte entspre­ chen negativen Werten, die weißen posi­ tiven. Richtig zugeordnete liegen im grünen und im dunkelgrauen Bereich, falsch zugeordnete im roten und hell­ grauen (Abb. 1). korrekten) Klassifizierung gleichgesetzt und entsprechend auch über eine Angleichung der Falscherkennungsrate und der Falschauslassungsrate erreicht werden. Auf individueller Basis lässt sich feststellen, dass Personen, die dieselbe Prognose erhalten haben, aber aus unterschiedlichen sensiblen Gruppen stammen, mit der gleichen Wahrscheinlichkeit der richtigen Klasse zugewiesen wurden.

Alles fair? Im Hinblick auf die Vielfalt möglicher Optionen liegt der Wunsch nahe, eine Form von „kompletter Fairness“ zu finden – eine ultimative Lösung also, die allen Typen von Fairness gleichermaßen gerecht wird. Manche Fairnessformeln hängen jedoch über gemeinsame Varia­ blen zusammen. Für einige von ihnen wurde zudem mathematisch nachgewiesen, dass es zumindest unter Praxisbedingungen unmöglich ist, sie simultan zu optimieren. Stattdessen bringen Verbesserungen für die eine Fairnessdefinition immer Verschlechterungen für eine andere mit sich. Wenn man die Zusammenhänge zwischen den Fairnessdefinitionen und die konditionalen Beziehungen innerhalb der Wahrheitsmatrix betrachtet, ist der Grund leicht nachvollziehbar: Die Formeln verwenden mitunter dieselben Zellwerte, und die Zellen selbst stehen in Beziehung zueinander. Zum Beispiel stellen die Summen der Zeilen die tatsächlichen Vorkommnisse für die jeweilige Klasse dar und sind folglich fix. Es gibt also keine universell anwendbare Form von Fairness, die allen Vorstellungen gleichermaßen genügt. Die optimale Definition hängt vielmehr vom konkreten Anwendungsfall ab und wird

In der Öffentlichkeit ist vor allem der Kompromiss zwischen kalibrierten Pro­ gnosen (Calibration) sowie gleichen Falsch-positiv- und Falsch-negativ-Raten (gleichzusetzen mit Equalised Odds) diskutiert worden. Ausgelöst hat die De­batte ein ML-­Algorithmus namens „Correc­ tional Offender Management Profiling for Alternative Sanctions“, kurz COMPAS, der in den USA Straftäter beurteilen sollte. Sein Zweck bestand darin, einen un­ abhängigen, datengestützten Risikoscore für verschiedene Formen von Rückfall­ risiko zu ermitteln. Algorithmen dieser Art unterstützen in der US-Strafjustiz die Gerichte bei bestimmten Entscheidungen wie der Gewährung von Kaution oder Bewährung. Der Score hat rein informa­ tiven Charakter, die finale Entscheidung liegt weiterhin beim Menschen. Im Mai 2016 sorgte ein Artikel von ProPublica, einer Plattform für investigativen Journalismus, für Aufsehen. Der Bericht warf dem COMPAS-Algorithmus rassistische Entscheidungsfindung vor. Die Journalisten begründeten ihre Kritik mit Verzerrungen, die sie bei den Aus­ gabewerten festgestellt hatten. Insbe­ sondere fiel die Falsch-positiv-Rate für schwarze Straftäter deutlich höher aus als für weiße. Afroamerikaner erhielten also überproportional häufig Prognosen, die zu Unrecht eine erhöhte Rückfälligkeit suggerierten. Northpointe, der Hersteller der Software, widersprach dem Vorwurf der Diskriminierung mit dem Argument, dass ihr Algorithmus durchaus faire Entscheidungen träfe, indem er das Fairnessziel „Calibration“ für beide Gruppen erfülle: Der Risikoscore gibt also die Wahrscheinlichkeit eines Rückfalls wieder, und das mit gleicher Zuverlässigkeit für beide Gruppen. Objektiv sind die Argumente beider Seiten richtig und berechtigt. Theoretisch könnten Calibration und Equalised Odds im vorliegenden Fall allerdings nur dann gemeinsam erreicht werden, wenn eine der beiden folgenden Voraussetzungen eintritt: Entweder die Raten der tatsächlich positiven Fälle (Basisraten) beider Untergruppen sind exakt identisch, oder die Klassen lassen sich perfekt se­ parieren. Letzteres würde nämlich das Erstellen eines idealen, fehlerfreien Pro­ gnosemodells möglich machen. Leider sind beide Voraussetzungen unter realen Bedingungen äußerst unwahrscheinlich. Die hitzige Debatte hat deutlich gemacht,

36

dass es bei der Entwicklung von KI-Anwendungen notwendig ist, die angestrebte Art von Fairness festzulegen und der betroffenen Zielgruppe zu kommunizieren. Die Wahl der passenden Fairnessmetrik bedarf dabei in der Regel Abwägungen und Kompromisse. Die Forschung hat hierzu Tools entwickelt, die den Prozess mithilfe von Entscheidungsbäumen formalisieren.

Wie entsteht Bias? Dass verzerrte Informationslagen technische Systeme stören können, ist kein neues Problem. Insbesondere Fälle kognitiver Verzerrung haben schon vor der Einführung von KI zu unerwünschten und unerwarteten Ergebnissen geführt. Automatisierungsbias beschreibt zum Beispiel das Phänomen, dass Menschen die Weisungen automatischer Systeme stärker gewichten als den menschlichen Verstand. So stürzten bereits mehrere Flugzeuge ab, weil die Piloten dem Autopiloten mehr vertrauten als ihrem eigenen Urteilsvermögen. Eine andere Art von Fehlverhalten kann auftreten, wenn ein Computersystem in einer Umgebung eingesetzt wird, für die es ursprünglich nicht vorgesehen war. Etwa, wenn es in einer neuen geografischen Region oder für eine andere Zielgruppe zum Einsatz kommt. Neuartige Ursachen für verzerrte Ergebnisse liegen indes in der Funktions­ weise des maschinellen Lernens. Von herausragender Bedeutung sind dabei die Trainingsdaten und deren passende Kategorien (Labels), die die gewünschten mutmaßlich richtigen Antworten repräsentieren. Unter Umständen können diese Labels objektiv erhoben werden, beispielsweise mithilfe eines Messgeräts. Oft beruhen die Zielwerte jedoch auf mensch­ lichen Beobachtungen, und Menschen können befangen sein. Da die Labels als Grundwahrheit dienen, haben sie direkten Einfluss auf die Qualität des Modells. Es übernimmt jegliche Verzerrung und verstärkt sie gegebenenfalls. Eine weitere Quelle für Verzerrungen liegt in der Art der Datenerfassung. Wenn die Daten nicht die echte Verteilung widerspiegeln und zum Beispiel Minderheitsgruppen unterrepräsentiert sind, schlägt sich das unweigerlich in den Ergebnissen des trainierten Modells nieder. Denn anders als manche Medien­ berichte suggerieren und dabei den Algorithmus unzulässigerweise personi­ fizieren, hegt das KI-System hierbei kein „Misstrauen“ gegenüber bestimmten Gruppen oder stuft diese auch nicht iX Special 2023 – KI

© Copyright by Heise Medien.

aufgrund der schwachen Datenlage automatisch als erhöhtes Risiko ein. Vielmehr hat der Mangel an Beispieldaten für diese Gruppe eine ungenügende Differenzierung zur Folge, die zu verstärkten Verzerrungen führen kann. Zudem können unzureichend gewählte Stellvertretervariablen die Resultate statistisch verfälschen. Des Weiteren können technische Maßnahmen wie Methoden, die einen erhöhten Schutz der Privatsphäre zum Ziel haben, bestehende Verzerrungen verstärken. Und nicht zuletzt kann ein bestimmungswidriger Einsatz der KI oder die fehlgeleitete menschliche Interpretation der Ausgabe des Systems das Endergebnis verzerren. Anders als bei traditionellen Algorithmen, bei denen mögliche Verzerrungen in der Entscheidungsfindung durch Wenndann-Regeln explizit im Code definiert sind, schleicht sich bei KI der Bias also auf subtilere Weise ins System und lässt sich wegen deren Blackbox-Eigenschaften überdies schwer nachvollziehen.

Attribute löschen hilft nicht Nun liegt die Frage auf der Hand, warum sich das Problem nicht einfach lösen lässt, indem man auf die sensiblen Attribute im Datensatz explizit verzichtet. Auf Englisch wird diese Herangehensweise als „fairness through unawareness“ bezeichnet, und tatsächlich untersagt die Gesetzgebung in vielen Ländern für die meisten Bereiche ohnehin, sensible Informationen zu verwenden. So ist in der  EU, in der die Datenschutz-Grundverordnung (DSGVO) den Umgang mit

personenbezogenen Daten regelt, das Speichern und Verarbeiten bestimmter Datenkategorien für viele Anwendungsbereiche untersagt oder bedarf der ausdrücklichen Einwilligung der betroffenen Person. Während dieser Ansatz für herkömmliche Szenarien einen unbestreitbaren Beitrag zum Schutz vor Diskriminierung leistet, erweist er sich für KI-Systeme als wirkungslos und bisweilen sogar als kontraproduktiv. Der Grund liegt in der Natur der Sache: Diese Systeme basieren in der Regel auf hochdimensionalen, stark korrelierten Daten. Ihre Entscheidungen stützen sich dabei auf Hunderte, manchmal Tausende von Attributen, deren Relevanz für den menschlichen Betrachter nicht auf der Hand liegt. Außerdem enthalten viele dieser Attribute komplexe Zusammenhänge, die wiederum für den Menschen oft schwer nachzuvollziehen sind. Werden die expliziten personenbezogenen Kategorien aus den Daten entfernt, bleiben derartige starke Korrelationen in den Daten erhalten und können über unerwartete Wege weiterhin eigentlich schützenswerte Informationen preisgeben. Vereinfacht zeigt sich das an den Daten eines Lebenslaufes. Selbst wenn die Angabe des Geschlechts fehlt, können Daten ohne personenbezogene Merkmale einen entsprechenden Hinweis geben. So sind bestimmte Hobbys oder Sportarten bei Frauen oder Männern beliebter. In Sprachen mit grammatikalischem Geschlecht kann die spezifische Deklination von Substantiv, Pronomen oder Adjektiv auch das Geschlecht der Person

verraten. Subtiler noch liegt der Fall bei einer Wehrpflicht, die in Deutschland ausschließlich für Männer galt, was über das Eintrittsalter in Ausbildung oder Studium wiederum Rückschlüsse über das Geschlecht zulässt. Schon bei Datensätzen mit wenigen Attributen kann dieser Ansatz also an seine Grenzen stoßen. Obendrein haben Forschungsprojekte längst demonstriert, dass sich mit heuristischen Methoden sensible Daten anhand von Informationen wie Vornamen oder Postleitzahl rekonstruieren lassen. Wenn auch die Ergebnisse solcher Verfahren nicht absolut zuverlässig sind, lässt sich grundsätzlich feststellen, dass das Löschen personenbezogener Kategorien im Kontext von KI-Anwendungen keinen ausreichenden Schutz vor Diskriminierung gewährleistet. Tatsächlich ist das Gegenteil der Fall. Schließlich ist es kaum möglich, die demografischen Gruppen in den Daten überhaupt erst sichtbar zu machen, wenn diese Informationen fehlen. Das wiederum ist aber essenziell, um die Ergebnisse der KI-Anwendung auf etwaige Verzerrungen zu überprüfen und gegebenenfalls unerwünschte Abweichungen auszugleichen. Andernfalls kann es passieren, dass diese Verzerrungen lange Zeit unbemerkt bleiben, da ihr Einfluss auf das Ergebnis sehr subtil ausfallen kann.

Wie lässt sich Bias technisch bekämpfen? Ist die Wahl der angestrebten Fairnessdefinition getroffen, muss eine Strategie ge-

37

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Datenqualität

tatsächlich positive Fälle tatsächlich negative Fälle

Aus der Wahrheitsmatrix lässt sich eine Reihe weiterer Raten ableiten (Abb. 2).

Basisrate Positivrate Negativrate Korrektklassifikationsrate (Accuracy) Fehlklassifikationsrate (Misclassification Rate) Richtig-positiv-Rate (True Positive Rate) Richtig-negativ-Rate (True Negative Rate) Falsch-positiv-Rate Falsch-negativ-Rate Falscherkennungsrate (False Discovery Rate) positiver Vorhersagewert (Positive Predictive Value) Falschauslassungsrate (False Omission Rate) negativer Vorhersagewert (Negative Predictive Value)

wählt werden, die verzerrten Ergebnisse zu korrigieren. Auch hierzu haben in den letzten Jahren Wissenschaftler und Wissenschaftlerinnen zahlreiche Methoden vorgestellt, die in drei verschiedenen Phasen des ML-Lebens­zyklus ansetzen: der Vorverarbeitung, dem Training und der Nachbearbeitung. Es beginnt bereits beim Erfassen und Verarbeiten der Daten, da sowohl durch die Datenquelle als auch durch die Extraktionsmethoden unerwünschte Nebeneffekte entstehen können. Deshalb muss die Integrität der Datenquelle gründlich validiert und die Auswahl der Messmethoden auf ihre Eignung geprüft werden. In klassischen Experimenten werden Daten häufig anhand von Fragebögen ermittelt. Das ist zwar aufwendig, erlaubt aber ein sorgfältig formuliertes Forschungsdesign, das mögliche Verzerrungen methodisch kontrolliert. In der Ära von Big Data stehen zwar große Mengen

an Daten zu geringen Kosten zur Verfügung, Informationen über die Umstände der Datenerhebung sind hingegen oft rar. Daher sorgen Algorithmen, die während der Vorverarbeitung zum Einsatz kommen, in der Regel dafür, dass die ­Eingabedaten ausgewogen sind. Das kann man durch das Erzeugen fairer Stellvertreterdaten erreichen oder durch das Ändern der Modellergeb­ nisse, etwa durch Neu­ gewichtung oder Stich­ probenwiederholung. In einigen Fällen kann es auch notwendig sein, fehlende oder zensierte Daten zu rekonstruieren, um sicherzustellen, dass der Datensatz repräsentativ ist. In der Trainingsphase des Modells greifen andere Ansätze zum Eindämmen unerwünschter Verzerrungen. Eine gängige Option ist es, das Fairnessziel direkt in die Verlustfunktion zu integrieren. Eine andere Methode besteht aus einem Metaalgorithmus, der als Eingabeparameter eine Fairnessmetrik akzeptiert und einen neuen Algorithmus erzeugt, der für diese Me­trik optimiert ist. Nicht zuletzt hat auch die Idee von Generative ­Adversarial Networks (GANs) neue Lösungsansätze inspiriert. So wird in einem Fall ein neuronales Netz als klassisches Vorhersagemodell trainiert, während parallel die Fähigkeit eines GAN minimiert wird, zugehörige geschützte Attribute zu erraten. Am Ende entsteht ein robustes Modell, das unabhängig von personenbezogenen Daten gute Ergebnisse erzielt. Der letzte Zeitpunkt für ein mögliches Eingreifen ist schließlich während der Nachbearbeitung der Prognose­ ergebnisse. Unterschiedliche Methoden widmen Labels derart um, damit das Er-

38

gebnis bestimmten Fairnessdefinitionen genügt. Eine Intervention während dieser Prozessphase hat den Vorteil, dass sich das Modell nicht ändert und ein potenziell aufwendiges erneutes Trainieren entfällt. Andererseits kann dieser Ansatz die Genauigkeit der Ergebnisse beeinträchtigen oder sich negativ auf die ursprünglich erreichte Generalisierung des Modells auswirken. Obwohl die vorgestellten Verfahren funktionieren, haben a­ lle einen experimentellen Charakter. Über eine bestmögliche He­rangehensweise hat sich in der KI-Forschung noch kein Konsens eingestellt, und die Wahl der richtigen Maßnahmen ist eine Frage der individuellen Abwägung hinsichtlich des Anwendungs­ bereichs und der Einsatzumgebung.

Wie geht es weiter? Die technischen Herausforderungen, die regulatorische Un­sicherheit sowie das Fehlen von Standardprozessen oder Best Practices können entmutigend wirken und bei Praktikern den Eindruck erwecken, ein verantwortungsvoller Einsatz von KI sei ein aussichtsloses Unterfangen. Dabei sind der Versuch und die Forschung in diesem Bereich die Mühen durchaus wert. Die nachhaltige Implementierung fairer KI könnte nämlich helfen, ein Problem zu lösen, das unsere Gesellschaft seit jeher plagt: menschliche Vorurteile. Zweifellos ist das Korrigieren von Algorithmen und Daten b ­ ezüglich unerwünschter Verzerrungen ein komplexes Pro­blem. Aber es bleibt eine technische Herausforderung, die einfacher zu meistern sein sollte als das Überwinden von Stereo­typen in der Gesellschaft. Mit Blick auf die voranschreitende Verbreitung von KI steht außer Frage, dass sie enormen Einfluss auf den Alltag der Menschen haben wird. Wenn es also gelingt, automa­ tisierte Systeme zu entwickeln, die faire, unparteiische Entscheidungen treffen, dann ist das ein signifikanter Fortschritt für eine gerechtere Welt.  ([email protected]) Quellen Literaturangaben zu Bias und Fairness im Machine Learning und Analysen der erwähnten Fälle: ix.de/z8eu

Boris Ruf ist Data Scientist bei AXA und Experte für KI-Fairness. iX Special 2023 – KI

© Copyright by Heise Medien.

© Copyright by Heise Medien.

Basics | Datenqualität

Data-centric AI: Wie Datenqualität Fairness beeinflusst Während die Forschung sich bisher vor allem auf das Modelltraining konzentriert hat, lässt die Qualität der Trainingsdaten oft noch zu wünschen übrig. Dabei ist Datenqualität hoch relevant, wie am Beispiel der Fairness eines ML-Modells gezeigt wird.

​​Grundlagen des überwachten Lernens

Von Isabel Bär Ȗ Bisher war es gängige Praxis, sich auf das Modelltraining zu konzen­trieren, um ML-Modelle hinsichtlich prädiktiver Performance und Fairness zu verbessern. Neue Forschungsarbeiten verlagern im Sinne eines datenzentrierten Ansatzes den Fokus von Algorithmen auf die Daten und heben die wichtige Rolle der Datenqualität für Performance und Fairness hervor. Das Ziel ist, nicht nur die Modelloptimierung, sondern verstärkt auch die Entwicklung von Verfahren zur Verbesserung der Datenqualität in den Blick zu nehmen. Die neue Richtung wird unter dem Begriff Data-centric AI zusammengefasst. Dieser Artikel nimmt eine solche datenzentrierte Perspektive ein, um den Zusammenhang von Datenqualität und Fairness zu analysieren und Datenqualitätseigenschaften festzulegen, die einen Einfluss auf die Fairness eines ML-Modells haben. Die Relevanz hoher Datenqualität lässt sich treffend mit dem Prinzip Gar­ bage in, Garbage out (Müll rein, Müll raus) beschreiben, dem zufolge niedrige

und Daten-Governance. Er beschreibt die Pflicht zur Entwicklung von Modellen auf der Grundlage von Trainings-, Validierungs- und Testdatensätzen, die re­levant, repräsentativ, fehlerfrei und vollständig sein müssen und den Merkmalen der zugrunde liegenden geografischen, verhaltensbezogenen und funk­ tionalen Rahmenbedingungen zu entsprechen haben. Damit trägt der Entwurf der kritischen Bedeutung von Datenqualitätsproblemen für Modelle Rechnung, die auf große Mengen an geeigneten Trainingsdaten angewiesen sind. Gleichzeitig belegen Zahlen, dass hohe Datenqualität eine Herausforderung darstellt. So sind nach einer Studie 96 Prozent der KI-Projekte in der Industrie mit Datenproblemen konfrontiert (siehe ix.de/zw88). Eine weitere Umfrage von Forrester zeigt, dass 45 Prozent der Projekte von einem Mangel an gut kuratierten Trainingsdaten betroffen sind und 40 Prozent Unsicherheiten bezüglich der Sicherstellung hoher Datenqualität aufweisen.

Datenqualität zwangsläufig zu schlechten Ergebnissen führt. Dabei spielen die Qualitätsanforderungen an die Test-, Validierungs- und Trainingsdaten sowohl aus informatischer als auch aus rechtlicher Sicht eine immer wichtigere Rolle. So veröffentlichte die EU-Kommission im April 2021 eine Verordnung als ersten Rechtsentwurf für KI, der bestehende Regularien ab 2024 ergänzen könnte. Artikel 10 Absatz 2 ist darin eine der zu erfüllenden Vorgaben für Hochrisikosysteme und bezieht sich konkret auf Daten

Um zu verstehen, welche Rolle Trainingsdaten für Modelle spielen, ist ein Blick auf die Grundlagen des maschi­ nellen Lernens sinnvoll. ML kann mit Supervised Learning (überwachtes Lernen), Unsupervised Learning (unüberwachtes Lernen) und Reinforcement Learning in drei Kategorien eingeteilt werden. In diesem Artikel stehen Klassifikationsmodelle als Teil des überwachten Lernens im Vordergrund, die Entscheidungsprozesse durch Verallgemeinerung von bekannten Beispielen automatisieren. Überwachtes Lernen ist eine Form der statistischen Inferenz, bei der aus gegebenen Trainingsdaten eine Funktion gelernt wird. Diese lässt sich auf neue und unbekannte Daten, die dieselben Merkmale wie der verwendete Trainingssatz aufweisen, generalisieren. Ziel der Klas-

1-TRACT ȫ Neue Forschungsarbeiten verlagern den Fokus vom Modelltraining auf Daten­ qualität, um ML-Modelle zu verbessern. Der Ansatz nennt sich Data-centric AI. ȫ Datenqualität kann an verschiedenen Stellen in der Modellentwicklung beeinträchtigt werden – von der Datenbeschaffung bis hin zum produktiven Einsatz nach dem Deployment. ȫ Neben der Fähigkeit, korrekte Vorhersagen zu treffen, besitzt ein ML-Modell auch nicht funktionale Eigenschaften wie Fairness, Robustheit und Sicherheit. Die Qualität der Trainingsdaten kann diese Eigenschaften massiv beeinflussen.

40

iX Special 2023 – KI © Copyright by Heise Medien.

Anforderungen an die Qualität von Trainingsdaten • Korrektheit besitzt eine syntaktische und eine semantische Komponente. Die syntaktische Korrektheit vergleicht die Repräsentation eines Datenwertes v mit den Elementen v' einer Definitionsdomäne: Stünde in der Spalte „Alter“ der Familienstand, wäre das syntaktisch inkorrekt. Die semantische Korrektheit vergleicht einen Datenwert mit dem korrekten Wert der realen Entität. Semantisch inkorrekt wäre es also, wenn in der Spalte „Alter“ eine Zahl stünde, die nicht das tatsächliche Alter der Person angibt. • Vollständigkeit gibt an, zu welchem Anteil Nicht-Nullwerte in einem Datensatz enthalten sind. Der Anteil ist als Verhältnis von der Anzahl vorhandener Werte zur Gesamtzahl der Stichproben in einem Datensatz definiert. Das Erkennen fehlender Werte kann eine Herausforderung darstellen, da sie nicht immer direkt als Nullwerte (NAN-Werte) erkennbar sind. Ein versteckter fehlender Wert könnte beispielsweise der Wert 0 in der Spalte „Alter“ sein. Auf den ersten Blick kein Nullwert, tatsächlich handelt es sich aber um einen versteckten fehlenden Wert, da er keinerlei Information bereitstellt. • Konsistenz bezieht sich auf die Validität und Integrität von Datenwerten – und spezifiziert die Spannbreite zulässiger Werte für eine Spalte. Für numerische Spalten kann diese Spannbreite Datentypen oder Intervalle umfassen. Die numerische Spalte „Alter“ dürfte zum Beispiel nur gültige Werte von 18 bis 80 Jahren beinhalten. Für kategorische Spalten können die zulässigen Werte eine festgelegte Menge an Werten umfassen – beispielsweise müsste die Spalte „Wohnort“ eine einheitliche Repräsentation der Stadt New York City beinhalten, um zu verhindern, dass die Stadt mit den Abkürzungen NYC und NY auf inkonsistente Weise repräsentiert ist. • Die Korrektheit der Labels legt fest, dass die Labels der Trainingsdaten fehlerfrei sein müssen. Einer tatsächlich kreditwürdigen Person muss im Trainingsdatensatz also auch das entsprechende Label kreditwürdig zugewiesen werden. Wäre dies nicht der Fall und eine kreditberechtigte Person hätte das Label nicht kreditwürdig, so würde das Modell einen falschen Zusammenhang zwischen Ein- und Ausgabe lernen. • Die Balance der Zielklasse erfordert, dass für jede Zielklasse, also für jedes Label, eine gleiche Menge an Datenwerten zur Verfügung steht. Im Beispiel müsste der Anteil der Labels kreditwürdig und nicht kreditwürdig gleich groß sein. • Die Balance demografischer Gruppen gibt an, ob alle Populationsgruppen gleichermaßen in einem Datensatz vertreten sind. Der Anteil der im Trainingsdatensatz vertretenen Geschlechter müsste zum Beispiel gleich groß sein, sodass das Modell für alle Gruppen eine ähnliche hohe prädiktive Performance erzielen kann. sifikation ist die Vorhersage einer oder mehrerer Ergebniskategorien (Label). Dafür benötigt das Modell geeignete Trainingsdaten in entsprechend aufbereiteter Form, die zu den Eingabedaten die passenden Labels enthalten. Im Trainingsprozess sucht das Modell mithilfe mathematischer Optimierungsverfahren die Funktion, die den unbekannten Zusammenhang zwischen Ein- und Ausgabe so gut wie möglich abbildet. Dabei beschreiben die Trainingsdaten Zustände der Vergangenheit, in denen das Modell Muster erkennt und auf deren Basis es Vorhersagen trifft.

Was macht hohe Datenqualität aus? Datenqualität setzt sich aus verschiedenen messbaren Dimensionen zusammen. Jede dieser Dimensionen definiert eine Anforderung an die Qualität der Trainingsdaten für ML-Modelle. 41

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Datenqualität

Vorverarbeitung der Daten Schema Matching Entity Resolution Data Fusion

Trainingsdaten

Balance demografischer Gruppen

Imputation fehlender Werte

Datenfilterung

Balance demografischer Gruppen

Balance demografischer Gruppen

Wrong Scaling of Feature Attributes Swapping Columns Handling Noisy Data Korrektheit Konsistenz

Training des Modells

Serving

Deployment

Serving-Anfragen Vorhersagen

Anwendung

Speicherung der Anfragen-Vorhersage-Paare

Serving-Logs Rückführung einer Teilmenge der Serving-Daten

In einer produktiven ML-Entwicklungspipeline können alle Datenmanagementaktivitäten Risikoquellen für Datenfehler (fett) sein (Abb. 1). Dazu ge­hören Korrektheit, Vollständigkeit und Konsistenz sowie die Korrektheit der Labels, die Balance der Zielklasse  und die Balance der demografischen Gruppen (siehe Kasten „Anforderungen an die Qualität von Trainingsdaten“). Die Qualitätsattribute lassen sich am besten  mit einem beispielhaften Datensatz aus der Praxis illustrieren, dem South-­ German-Credit-Datensatz. Der Datensatz enthält Informationen zu Personen, die bei einer süddeutschen Bank in den ­Jahren 1973 und 1975 einen Kreditantrag gestellt haben. Dazu gehören kategorische Datenwerte für Merkmale wie Geschlecht, Familienstand und Verwendungszweck des Kredits, aber auch numerische Spaltenwerte, die beispielsweise das Alter, die Kreditlaufzeit und die Höhe des aktuellen Kontostandes angeben. Kategorische Datenwerte sind oft mit Zahlen codiert: Das Merkmal Kreditmoral, das über die individuelle Kredithistorie eines Antragsstellenden informiert, beschreibt beispielsweise die Kategorie nie einen Kredit beantragt mit 0, die Kate­ gorie in der Vergangenheit in Zahlungs­ verzug geraten mit 1 und frühere Kredite fristgerecht abbezahlt mit 2. Das vorherzusagende Label wäre dann die binäre Zielvariable Kredit, die die Kreditwürdig-

keit einer Person mit 1 für kreditwürdig und 0 für nicht kreditwürdig beschreibt.

Fehlerquellen im Data-Science-Workflow Sind Datenqualitätseigenschaften verletzt, führt das schlussendlich zu Datenfehlern. Aus der Sicht von Entwicklerinnen und Entwicklern ist dabei interessant, dass Datenfehler oft als Folge von Datenmanagementaktivitäten während des gesamten ML-Lebenszyklus entstehen – und sie nicht nur auf Fehler in der Datenerfassung oder auf gesellschaftlich-historische Strukturen zurückzuführen sind. Der Voreingenommenheit von Modellen, die aus solchen Strukturen herrührt, widmet sich der Artikel „Warum KI oft unfair ist und was dagegen hilft“ ab Seite 34 [1]. Da Data Scientists die Datenvorbereitung, die Modellentwicklung und das Modell-Deployment im Gegensatz zu historisch-gesellschaftlichen Strukturen und zum Prozess der Datenerfassung direkt beeinflussen können, sollten sie sich dieser Datenfehlerquellen bewusst sein. Abbildung 1 zeigt, welche Arten von Datenfehlern zu verschiedenen Zeitpunkten im Data-Science-Workflow entste-

hen können, und bietet einen Leitfaden, um einschätzen zu können, wo Vorsicht geboten ist. Ein typischer Data-Science-Workflow besteht aus den Schritten Datenbeschaffung, Datenvorbereitung, Datenanalyse und Interpretation der Ergebnisse. Außerdem kann er Datenfilterung und Aggregation beinhalten. Die Datenbeschaffung ist selbsterklärend der erste Schritt im Workflow, wobei die Daten häufig aus mehreren Quellen stammen. Darauf folgt die Datenvorbereitung, die aus Datenintegration und Datensäuberung besteht. Da die verschiedenen Datensätze oft unterschiedliche Schemata aufweisen, müssen sie durch Dateninte­ gration in einen einheitlichen integrierten Datensatz überführt werden. Die Datenintegration besteht in der Regel aus den folgenden Schritten: der Angleichung der Schemata der Datensätze (Schema Matching), der Identifizierung der Elemente, die sich auf dieselbe Entität be­ ziehen (Entity Resolution) und der Überführung in einen integrierten Datensatz (Data Fusion). Die Datenintegration gilt im Datenmanagement als eine der Hauptursachen für Dateninkonsistenzen und stellt auch für ML-Modelle eine Hauptquelle für Datenfehler dar: Nach der ein-

Methoden der Datenverunreinigung Datenqualitätseigenschaft

kategorisch numerisch

Methode

Vollständigkeit und Balance demografischer Gruppen​ Korrektheit und Konsistenz



Induktion und anschließende Imputation der fehlenden Werte​

 ✓ 

✓ ✓

Fehlskalierung: Skalierung einer Teilmenge der Werte einer Spalte um den zufälligen Faktor 10, 100 oder 1000.

 ✓

Vertauschen kategorischer Spaltenwerte: Ersetzen von Werten in einer Spalte durch Werte einer anderen Spalte. Hinzufügen von gaußschem Rauschen zur Teilmenge der Werte einer Spalte, wobei die Standardabweichung zufällig aus dem Intervall von 2 bis 5 ausgewählt wird.

42

iX Special 2023 – KI © Copyright by Heise Medien.

gangs erwähnten Studie von Forrester wird die Datenintegration für 56 Prozent der KI-Projekte als herausfordernd bewertet. Der Prozess der Informations­ extraktion, also wenn Web- und Sprachdaten in eine strukturierte Form übertragen werden, kann ebenfalls zu inkorrekten Datenwerten führen. Die Datensäuberung ist der zweite wichtige Schritt in der Datenvorbereitung. Datensäuberungsmethoden sollen Inkonsistenzen in den Daten identifi­ zieren und entsprechende Reparaturen vornehmen – beispielsweise die Identifikation und Imputation fehlender Datenwerte. Damit besteht aber auch das Risiko ­einer Veränderung der Gruppenproportionen. Das kann passieren, wenn die gewählte Imputationsmethode fehlende Datenwerte zugunsten der häufigsten Gruppe ersetzt. Ein Beispiel wäre ein Daten­erhebungsprozess in Form eines Formulars, das neben der binären Geschlechtsauswahl auch die Möglichkeit lässt, keine Geschlechtsangabe zu treffen. Falls Frauen mit größerer Wahrscheinlichkeit das Geschlecht nicht angeben, fehlen diese Werte systematisch, da die Wahrscheinlichkeit des fehlenden Datenwertes vom fehlenden Datenwert selbst abhängt. Werden diese systematisch fehlenden Datenwerte durch eine simple Modus-Imputationsmethode ersetzt, wie sie in gängigen ML-Frameworks zum Einsatz kommt, kann sich die demografische Balance der Gruppen zugunsten der männlichen Gruppe verändern: Die Methode ersetzt den fehlenden Wert durch den häufigsten Wert des Merkmals, sodass alle überwiegend weiblichen nicht spezifizierten Geschlechtswerte auf männlich gesetzt werden. Auch Datenfilterungsoperationen können die Balance demografischer Gruppen beeinflussen. Beispielsweise ist die Filterung eines Datensatzes nach Postleitzahl oder Bezirk eine Operation, die zu einem verzerrten Teildatensatz führen kann, weil der Wohnort mit demografischen und sozialen Attributen korrelieren kann. Auch Datenaggregationen wie „GROUP BY“-Abfragen können das Verhältnis verschiedener Gruppen im Trainingsdatensatz aus der Balance bringen: Die in den verschiedenen Datengruppen enthaltenen Trends könnten durch die Aggrega­ tion verschwinden und sich sogar umkehren. Im Zuge der Datenvorverarbeitung kann es außerdem auch zur Verwechslung von kategorischen Zielspalten kommen – beispielsweise zum Vertauschen des Familienstandes mit dem angegebenen Verwendungszweck. Die Fehlskalierung numerischer Skalen, wie zum Beispiel die

Datensatz

Extraktion des geschützten Attributes A Datenverunreinigung for iteration in range (10) for pollution_level in ranger (0, 1, 0.1) for categorical_column in categorical_columns:

for numerical_column in numerical_columns: numerische Spalten

kategorische Spalten

Fehlskalierung der Spaltenwerte

Vertauschen der Spaltenwerte einer kategorischen Spalte mit anderen Spaltenwerten

Hinzufügen von gaußschem Rauschen (Standardabweichung zufällig aus Intervall)

Induzieren fehlender Werte und anschließende Imputation (Mean- und Median-Imputation)

Induzieren fehlender Werte und anschließende Imputation (Mean- und Median-Imputation)

verunreinigter Datensatz train_test_split Modelltraining

Logistic Regression

Decision Tree

Multilayer Perceptron

Modellvorhersagen auf Testdatensatz Berechnung der Fairnessmetriken M pro Spalte und pro Verunreinigungsgrad

Um die Auswirkung von Datenqualität auf Fairness zu messen, muss ein Datensatz erst verunreinigt werden. Die Fairness des Modells, das mit dem Datensatz trainiert wurde, prüft man anschließend anhand der EOD oder der SPD (Abb. 2). irrtümliche Erfassung der beantragten Laufzeit in Monaten und nicht in Jahren, ist ebenfalls eine Fehlerquelle bei der Vorbereitung von Daten. Das Risiko für technische Voreingenommenheit bleibt jedoch auch nach dem Deployment bestehen, da sich die Herausforderung der Datenintegration auch in einem produktiven System stellt. Es können Verteilungsverschiebungen (Distribution Shifts) entstehen, wenn sich die Verteilung der Merkmale in den Serving-Daten von der Verteilung der Merkmale in den Trainingsdaten unterscheidet. Serving-Daten sind die Eingabedaten, für die das produktive Modell Vorhersagen trifft. Kommt es infolge­ dessen zu einer verringerten Vorhersagequalität, bleiben die falschen Vorhersa-

gen in den Serving-Daten erhalten. Werden diese dann wiederum als neue Trainingsdaten in das Modell zurückgeführt, manifestieren sich Datenfehler in der produktiven ML-Pipeline.

Nicht funktionale Eigenschaften Nach den Grundlagen zur Datenqualität ergibt sich die Frage, in welchem Zusammenhang Datenqualität und die Eigenschaften eines ML-Modells stehen. Generell lassen sich die Eigenschaften von Modellen in funktionale und nicht funktionale Eigenschaften einteilen. Die bekannteste funktionale Eigenschaft ist die prädiktive Performance – also die Fähigkeit eines Modells, korrekte Vorhersagen zu treffen. Prädiktive Performance lässt 43

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Datenqualität

Die von SPD (orange) und EOD (blau) gemessene Fairnessmetrik verändert sich mit stärkerem Verschmutzungsgrad des Datensatzes (Abb. 3). sich je nach Aufgabentyp durch etablierte Metriken wie Accuracy oder Precision quantitativ erfassen. Zu den nicht funktionalen Eigenschaften gehören Fairness, Interpretierbarkeit, Robustheit und Sicherheit. Deren Definitionen sind allerdings noch vergleichsweise ungefestigt. Dieser Artikel konzentriert sich auf den Aspekt Fairness und zeigt, wie absichtlich herbeigeführte mangelhafte Datenqualität, die gängige Datenfehler in der Praxis simuliert, die Fairness eines ML-Modells beeinträchtigt. Dazu werden in einem experimentellen Aufbau inkrementell je zehn Prozent der Spaltenwerte im Trainingsdatensatz gezielt verunreinigt. Der verunreinigte Trainingsdatensatz wird dann zum Training des Klassifikationsmodells benutzt. Im letzten Schritt werden Fairnessmetriken berechnet, um zu prüfen, wie die inkrementelle Datenverunreinigung deren Werte verändert.

Warum Fairness? Das Thema Fairness ist mit dem steigenden Einsatz von KI immer stärker in den Mittelpunkt öffentlicher Debatten gerückt. KI-Systeme geben simple Produktund Filmempfehlungen, treffen aber auch kritische Entscheidungen – zum Beispiel über die Kreditwürdigkeit eines Antragstellers oder über die Eignung von Bewerberinnen für einen Arbeitsplatz. Der Einsatz künstlicher Intelligenz verlief dabei  nicht selten holprig: Beispielsweise sollte der Algorithmus ­Ofqual während der ­ Coronapandemie in England ursprünglich zur Vorhersage der Abiturnoten eingesetzt werden, bewertete Schülerinnen und Schüler von privaten Schulen aber systematisch besser. Für Absolventen und Absolventinnen großer staat­ licher Schulen traf er hingegen systematisch schlechtere Vorhersagen. Die Studie „Gen­ der Shades“ konnte nachweisen,

dass kommerzielle Gesichtserkennungssysteme für People of Color am schlechtesten abschnitten – und auch Klassifikationssysteme zur automatisierten Bewertung von Lebensläufen wiesen mit der Bevorzugung männlicher Bewerber einen geschlechtsspezifischen Bias auf (die entsprechenden Studien sind unter ix.de/ zw88 zu finden). Solche Vorfälle sind Beispiele für die systematische Begünstigung oder Benachteiligung einer Person aufgrund eines sogenannten geschützten Merkmals wie Geschlecht, Konfession oder sexueller Orientierung. Menschen sind – ungeachtet dieser Attribute– gleich und dementsprechend gleich zu behandeln, es sei denn, es liegt ein objektiver Grund vor, anders zu verfahren. Der Schutz dieser Attribute ist bereits in den Gleichbehandlungsrichtlinien der EU verbrieft und soll zukünftig auch für den KI-spezifischen Kontext bindend werden.

Semantisch identische Spalten wie BILL_AMT1 und BILL_AMT2 weisen eine ähnliche Entwicklung auf (Abb. 4). 44

iX Special 2023 – KI © Copyright by Heise Medien.

Die Fehlskalierung numerischer Spalten führt zu einer klar erkennbaren Änderung der Fairnessmetriken (Abb. 5).

Es ist eine fast lineare Verringerung der Fairnessmetriken nach der Verschmutzung zu erkennen (Abb. 6). Schwieriger als das Finden von Beispielen für die unfaire Entscheidung eines KI-Modells ist die Frage, wie sich eine abstrakte Eigenschaft wie Fairness messen lässt. Diese Frage ist wichtig: Um zu untersuchen, wie Datenqualität und Fairness zusammenhängen, muss Fairness messbar sein. Anders als die funktionale Eigenschaft der prädiktiven Performance kann man für Fairness allerdings nicht auf standardisierte Definitionen und Metriken zurückgreifen. Als Folge findet sich in der Literatur eine Bandbreite verschiedener Ansätze zur Definition und Quantifizierung von Fairness (nähere Informationen unter ix.de/zw88). Im Artikel wurden statistische Metriken ausgewählt.

Fairness messen Die Idee statistischer Fairnessdefinitionen beruht auf dem Konzept, den gegebenen Trainingsdatensatz entlang eines geschützten Attributes, beispielsweise des Geschlechts, in geschützte und ungeschützte Gruppen zu teilen. Die Metriken fordern dann die Gleichheit eines statistischen Maßes für beide Gruppen. Dieses Maß können Fehlerraten oder der Anteil vorteilhafter Vorhersagen für Gruppen sein. Konkret basiert eine Fairnessdefinition, die mit Fehlerraten arbeitet, also auf einem Vergleich des vom Modell vergebenen 45

iX Special 2023 – KI © Copyright by Heise Medien.

Basics | Datenqualität

Während die Fairnessmetrik EOD nach der Verschmutzung ansteigt, bleiben die SPD-Metrikwerte konstant (Abb. 7).

Labels mit dem Label des Trainingsdatensatzes. In Bezug auf das beispielhafte Kreditinstitut würde das bedeuten, dass das Klassifikationsmodell für männliche und weibliche Antragstellende die gleichen Fehlerraten aufweist. Die Art der untersuchten Fehlerraten kann dabei unterschiedlich gewählt werden. Eine der häufigsten Methoden zur statistischen Erfassung von Fairness ist die Equalized Odds Difference (EOD), die sowohl für geschützte als auch für ungeschützte Gruppen die gleichen True-Positive-Raten für das vorteilhafte Label x = 1 (kreditwürdig) und die gleichen False-Positive-Raten für das nicht vorteilhafte Label x = 0 (nicht kreditwürdig) fordert. Fehlerbezogene statistische Definitionen bieten den Vorteil, dass sie direkt mess- und überprüfbar sind. Das macht sie im Entwicklungsprozess zu einem wertvollen Werkzeug, um Unfairness zu  diagnostizieren. Die Berechnung der Fehlerraten erfolgt mithilfe der Confu­ sion Matrix, die auch für die Ermittlung prädiktiver Performance eingesetzt wird. So können statistische Fairnessdefinitionen von Metriken profitieren, die für das Testen der prädiktiven Performance von Klassifikationsmodellen bereits etabliert wurden. Eine Alternative zur EOD ist die Statistical Parity Difference (SPD). Sie zielt nicht auf die Angleichung der Fehler­ quoten für geschützte und ungeschützte Gruppen ab, sondern konzentriert sich auf die Angleichung der Ergebniswahrscheinlichkeit vorteilhafter Modellvorhersagen. Im Beispiel des Kreditvergabesystems würde das heißen: Sowohl geschützte als auch ungeschützte Gruppen werden mit der gleichen Wahrscheinlichkeit als kreditwürdig klassifiziert. Gemäß der Parity Definition kann das System a­ lso als fair gelten, wenn es in gleichen Antei-

len Kredite an Antragstellende über- und unterhalb einer bestimmten Altersgruppe vergibt und geschützte Merkmale somit ignoriert.

Frameworks für die Fairnessmessung In den letzten Jahren sind verschiedene Open-Source-Toolkits vorgestellt worden, die die Messung von Fairnessmetriken erleichtern sollen. Dieser Artikel nutzt das Framework FairLearn, das Methoden zur Berechnung der Fairnessmetriken bereitstellt. Sowohl für die EOD als auch für die SPD gilt, dass ein berechneter Metrikwert von 0 das Modell gemäß der Definition als fair einordnet. Ein Metrikwert von 1 hingegen bedeutet, dass das Modell gemäß der Fairnessdefinition als unfair gilt. ​Für die Experimente werden zwei Datensätze verwendet, die in der Fairnessforschung häufig als Benchmarkendatensätze zum Einsatz kommen: Der Datensatz South German Credit Data wurde bereits erwähnt – die binäre Zielvariable Kredit bestimmt im Experiment die Kreditwürdigkeit einer Person. Für diesen Datensatz codiert das geschützte Attribut famges Geschlecht und Familienstand eines Antragsstellenden. Der Datensatz Default Credit Card Clients enthält Informationen über Zahlungsausfälle, demografische Daten, Kreditdaten, Zahlungshistorien und Rechnungsauszüge von Kreditkartenkunden in Taiwan von April 2005 bis September 2005. Die Zielvariable „Zahlungsausfall im nächsten Monat“ sagt vorher, ob eine Person im nächsten Monat in Verzug ­geraten wird. Die geschützten Attribute male und female werden hier unter gen­ der zusammengefasst. Um sicherzugehen, dass die Ausgangsdaten für jede Experimentdurchführung immer die glei-

46

chen sind, wird der Datensatz vor der Datenverschmutzung mit­hilfe eines Seeds durchgemischt. Nach diesem Schritt werden pro Spalte die Verunreinigungsmethoden des Jenga-Frameworks angewendet. Man muss dabei allerdings sicherstellen, dass die Daten inkrementell und nicht zufällig verunreinigt werden – das heißt, dass ein zu zwanzig Prozent manipulierter Datensatz eine Teilmenge des zu dreißig Prozent verschmutzten Datensatzes ist. Daher wird der Datensatz zufällig in Teildatensätze geteilt, die sukzessive zu je zehn Prozent verunreinigt werden. Anschließend verkettet man die Teildatensätze miteinander. Nach erfolgter Datenverunreinigung liegt also pro Verunreinigungsmethode, pro Spalte und pro Verschmutzungsgrad ein verunreinigter Datensatz vor, auf den das Klassifikationsmodell trainiert wird. Nach dem Training folgt die Berechnung der Fairnessmetriken. Dieser Vorgang wird insgesamt zehnmal wiederholt, bis der finale Wert der Fairnessmetrik als Durchschnitt aus den vorliegenden zehn Metrikwerten gebildet wurde. Die Iterationen sind notwendig, um sicherzustellen, dass Ausreißer das Ergebnis nicht beeinflussen. Abbildung 2 visualisiert die Experiment-Pipeline.

Ergebnisse der Experimente Nach der Durchführung des Experiments können die Ergebnisse ausgewertet werden. Dazu wird die Entwicklung der Fairnessmetriken SPD (in orange) und EOD (in blau) pro Datenverschmutzungsmethode für die ausgewählten Spalten in einer Grafik visualisiert. Die x-Achse entspricht dem inkrementellen Verunreinigungsgrad der Daten von 0 bis 0,9. Die y­ -Achse entspricht dem Wert der gemessenen Fairnessmetriken. Sie skaliert mit den Werten der Metrik, die pro Verunreinigungsgrad gemessen wurde. Die Trendlinie visualisiert die Entwicklung der absoluten Metrikwerte. Da ein Metrikwert von 0 die Erfüllung der Fairnessdefinition bedeutet, kann man Graphen mit negativer Steigung als eine Verbesserung der Fairness interpretieren. Der Artikel zeigt eine Auswahl der Ergebnisse für die Datenverunreinigungsmethoden der Fehlskalierung und des numerischen Rauschens. Die kompletten Ergebnisse sind in der Masterarbeit „Der Einfluss von Datenqualitätsmängeln auf Fairness in KI-Systemen“ (siehe ix.de/zw88) zu finden. Abbildung 3 zeigt die Veränderung der Fairnessmetriken nach Hinzufügen von gaußschem Rauschen zu den SpaliX Special 2023 – KI

© Copyright by Heise Medien.

ten PAY-0 und PAY-2 des Datensatzes Default of Credit Card Clients. Die Spalten PAY informieren über den Rückzahlungsstatus eines Kreditkartenkunden (ein Wert von 1 bedeutet beispielsweise einen Zahlungsverzug von einem Monat, ein Wert von 2 einen Zahlungsverzug von neun Monaten und mehr). Sie sind semantisch gleich und unterscheiden sich nur bezüglich des Monats, auf den sie sich beziehen (zum Beispiel steht PAY-0 für den Zahlungsstatus des Monats September 2005, PAY-2 für ­August 2005). Angesichts der semantischen Ähnlichkeit der PAY-Spalten wäre eine ähnliche Veränderung der Fairnessmetriken erwartbar, was auch für die BILL-AMT-Spalten gilt, die Informationen über die Höhe der monatlichen Rechnungsstellung in Dollar beinhalten – BILL-AMT1 für September 2005 und BILL-AMT2 für August 2005. Die Ergebnisse zeigen in der Tat eine ähnliche Entwicklung der Fairnessme­ triken für semantisch identische Spalten (siehe Abbildung 4).

Fehlskalierung numerischer Spalten Abbildung 5 zeigt eine fast lineare Verringerung der EOD und der SPD nach Verschmutzung der Spalte „Alter“. Gleiches gilt auch für die Spalte LIMIT_BAL (Höhe des gewährten Kredits) in Ab­ bildung 6. In Abbildung 7 weist die Fairnessmetrik EOD dagegen einen Anstieg (und damit eine Verschlechterung) auf, während die SPD-Metrikwerte konstant bleiben. Die Ergebnisse zeigen für alle untersuchten Datenverunreinigungsmethoden eine Veränderung der Fairnessme­ triken bei inkrementell zunehmender Verunreinigung. Zwar mag es zunächst einmal widersprüchlich erscheinen, dass die Datenverunreinigung sogar einen positiven Effekt auf Fairness haben kann. Dabei sollte aber zum einen beachtet werden, dass Fairnessdefinitionen eingegrenzte mathematische Konstrukte sind, die Fehlerraten und Ergebnisverteilungen zwischen verschiedenen Gruppen untersuchen – sie entsprechen keiner intuitiven, gesellschaftlichen abstrakten Interpretation von Fairness. Zum andern müssen verunreinigte Spalten im domainspezifischen Kontext des Da­ tensatzes interpretiert werden – die ­Ska­lierung des Kontostandes kann sich auf die Kreditwürdigkeit anders auswirken als die Skalierung der Spalte „Alter“. Dennoch zeigen die Ergebnisse kon­ sistente Veränderungen der Fairness­

metriken als Reaktion auf veränderte Datenqualität und belegen damit einen ­Zusammenhang zwischen der Än­derung der Datenqualität und der Fairnessme­ triken.

Robustheit der Metriken Neben der festgestellten Auswirkung verringerter Datenqualität auf die Fairness lässt das Experiment auch Schlüsse auf die beiden Metriken SPD und EOD zu. Die Ergebnisse weisen leichte Schwankungen zwischen den Fairnessmetriken der zehn verschiedenen Iterationen auf – die Metriken zur Messung von Fairness scheinen also nicht ausreichend robust gegenüber Veränderungen in der Datenqualität zu sein. Dabei ist die Sensibilität von Fairnessmetriken gegenüber Veränderungen der Verteilungen in Test- und Trainingsdatensätzen bereits bekannt. In  einer Studie wurde die Stabilität der SPD untersucht, indem die Standard­ abweichung der Metrikwerte von verschiedenen Klassifikationsalgorithmen für zehn verschiedene Trainings- und Testdatensplits berechnet wurde (siehe ix.de/zw88). Das Ergebnis: Es besteht ­eine deutliche Varianz der Metrikwerte zwischen den verschiedenen Trainingsund Testvariationen, da sich die errechneten Metrikwerte je nach Verteilung der Daten unterscheiden. Es stellt sich also die Frage, ob die Fairnessmetriken, die in gängigen Fairness-Toolkits angeboten werden, eine verlässliche Methode zur Messung von Fairness darstellen. Werden sie trotzdem genutzt, empfiehlt es sich, mehrere Fairnessdefinitionen zu kombinieren und Aussagen über die Fairness eines Modells nicht auf der Grundlage einer einzelnen Metrik aufzubauen, die sensibel gegenüber Änderungen der Datenverteilungen und Datenqualität sein kann.

Fazit Die Experimente in diesem Artikel zeigen konsistente Muster in der Veränderung der Fairnessmetriken nach Anwendung von Datenverschmutzungsmethoden. Demzufolge stehen Datenfehler, die die Genauigkeit, Konsistenz und Vollständigkeit von Merkmalen beeinflussen, im Zusammenhang mit Änderungen der Fairnessmetriken. Die Metriken selbst sind außerdem nicht völlig robust: Die Werte einer einzelnen Metrik können je  nach Verteilung und Vollständigkeit der Daten verzerrt sein. Zusammenfassend zeigen unsere Ergebnisse, dass eine

v­ erminderte Datenqualität zu Verände­ rungen in den Fairnessmetriken führen kann, und unterstreichen die Relevanz einer hohen Datenqualität für die Entwicklung fairer Modelle aus einer datenzentrierten Perspektive. Auf der Grundlage der Versuchs­ ergebnisse lassen sich den Entwicklerinnen und Entwicklern konkrete Empfehlungen geben, um das Risiko einer technischen Verzerrung bei der Datenvorverarbeitung zu verringern. Die Entwickler sollten die Skalen der Attributwerte überprüfen, um sicherzustellen, dass sie während der Vorverarbeitung nicht fälsch­licherweise geändert werden. Außerdem sollten sie den Code überprüfen, um ein versehentliches Vertauschen von Zielspalten zu verhindern, und Imputationsmethoden sorgfältig auswählen, denn ihre inkorrekte Anwendung kann zu instabilen Fairnessmetriken führen. Letztlich unterstreichen die Ergebnisse damit die Bedeutung einer hohen Datenqualität für die weitere Entwicklung von KI-Modellen. Eine datenzentrierte Per­spektive verspräche also einen entsprechenden Beitrag zur Verbesserung der Fairness von künstlicher Intelligenz. ([email protected]) Dieser Artikel wurde im Rahmen des K ­ ITQAR-Projekts verfasst, das von der Denkfabrik Digitale Arbeitsgemein­ schaft im Bundesministerium für Arbeit und Soziales gefördert wird (BMAS). Die vorgestellten Ergebnisse sind Auszüge aus der Masterarbeit „Der Einfluss von Datenqualitäts­ mängeln auf Fairness in KI-Systemen“ der Autorin. Quellen [1] Boris Ruf; Warum KI oft unfair ist und was dagegen hilft; iX Special – KI 2023, S. 34 [2] Die erwähnten Studien, weiterführende Verweise und die vollständige Masterarbeit der Autorin sind unter ix.de/zw88 zu finden.

ISABEL BÄR studiert Data Engineering am Hasso-PlattnerInstitut und arbeitet als Werkstudentin bei ­INNOQ. Sie beschäftigt sich mit Fragen rund um den langfristig erfolgreichen Einsatz von künstlicher Intelligenz. 47

iX Special 2023 – KI © Copyright by Heise Medien.

© Copyright by Heise Medien.

Werkzeuge | Werkzeuge

Der KI-Werkzeugkasten – Frameworks, Notebooks, Datenquellen Die Sprache der KI ist Python. Dabei hat das Machine-Learning-Framework PyTorch gegenüber Tensor­Flow immer mehr an Boden gewonnen und lohnt daher einen ausführlicheren Blick. Aber auch scikit-learn ist mehr als eine Statistikbibliothek und eignet sich für den schnellen Einstieg ins Machine Learning. Jupyter-Notebooks dürfen im Werkzeugkasten angehender KI-Entwickler nicht fehlen. Alle großen CloudAnbieter – und auch einige kleine – wollen Entwickler mit gehosteten Notebook-Varianten an sich ziehen. Auch Trainingsdaten sind Werkzeuge. Ihre Qualität bestimmt, was ein Modell leistet. Das Netz bietet viele Quellen – entscheidend ist, sie zu finden und zu beurteilen. Um Ähnlichkeiten und Muster in Datensätzen zu erkennen, ist die Assoziationsanalyse eine oft unterschätzte Methode. Sie zeigt, dass das gezielte Wählen von Algorithmen manchmal der Holzhammermethode großes KI-Modell bei Aufwand und Nutzen überlegen sein kann.

Einstieg in PyTorch – Schritt für Schritt zum Machine-Learning-Modell 

50

Jupyter ist überall – die Notebook-Umgebungen der Cloud-Anbieter



58

Klassiker scikit-learn – Datentransformation und Modellentwicklung



66

Offene Datenquellen zum Training finden und beurteilen



72

Mit Assoziationsanalyse Muster in Datensätzen finden



80

49

iX Special 2023 – KI © Copyright by Heise Medien.

Werkzeuge | Machine-Learning-Frameworks

Einstieg in PyTorch PyTorch ist das wohl populärste Framework, um künstliche neuronale Netze zu definieren, zu trainieren und anzuwenden. Beim Entwickeln eines Modells zur automatischen Sprachklassifizierung zeigt sich am konkreten Beispiel, wie man die wichtigsten Module und Werkzeuge des Frameworks einsetzt. Von Carsten Schnober Ȗ Sprachmodelle wie GPT generieren Texte, die sich von denen aus der Feder vieler menschlicher Autoren kaum noch unterscheiden lassen. Auch manche bildenden Künstler erblassen vor Neid, wenn sie die Produkte von Modellen wie DALL-E bestaunen. Die dahintersteckenden Algorithmen basieren auf künstlichen neuronalen Netzen (KNN), und eines der populärsten Frameworks heißt Torch (siehe ix.de/zbu8). Unter den Programmiersprachen hat sich bei Entwicklern und Data Scientists im Bereich der künstlichen Intelligenz Python inzwischen fest etabliert. Das Ergebnis dieser erfolgreichen Hochzeit hört auf den Namen PyTorch (siehe ix.de/zbu8).

Der Spezialist Die wichtigste interne Funktion von PyTorch heißt Autograd. Sie ermöglicht die effiziente Anwendung des Backpropaga­ tion-Algorithmus (Fehlerrückführung), der wiederum den Einsatz künstlicher

neuronaler Netze (KNNs) im heutigen Maßstab ermöglicht (siehe Kasten „Deep Learning und künstliche neuronale Netze“). Darin, dass Entwickler mit PyTorch gerade keinen direkten Kontakt mit Autograd haben, liegt eine der großen Stärken des Frameworks. Der Backpropagation-Algorithmus kommt beim Training neuronaler Netze zum Einsatz. Dabei wird ein KNN mit Daten gefüttert, bei denen die gewünschte Ausgabe bekannt ist; beispielsweise für ein Klassifizierungssystem, das Bilder

oder T ­ exte kategorisiert. Backpropaga­ tion vergleicht die Ausgabe des KNN im aktuellen Zustand mit dem korrekten Output und passt dann das neuronale Netz graduell so an, dass es im nächsten Durchlauf der Wahrheit etwas näher kommt. Eine Fehlerfunktion beziffert den Abstand zwischen der aktuellen und der ­gewünschten Ausgabe des Netzes und ermöglicht es damit, dessen Parameter numerisch zu feilen. Mathematisch gesehen erfordert dieser Optimierungsschritt, die

1-TRACT ȫ Das Framework PyTorch verbirgt die komplexen KI-Algorithmen unter einer entwicklerfreundlichen Programmierschnittstelle. ȫ Ein Beispiel zeigt, wie man neuro­nale Netze mit PyTorch definiert und trainiert, vom Aufbereiten der Trainingsdaten bis zur Anwendung. Das schrittweise ent­ wickelte Modell klassifiziert Texte nach der Sprache, in der sie geschrieben sind. ȫ Das Ergebnis kann als Ausgangspunkt für weitere Experimente dienen, etwa um die Genauigkeit zu erhöhen.

50

iX Special 2023 – KI © Copyright by Heise Medien.

partielle Ableitung der besagten Fehlerfunktion zu berechnen. Das klingt kompliziert und ist es auch; die AutogradFunktionalität von Torch ermöglicht die Anwendung des Backpropagation-Algorithmus auch ohne mathematische Spezialkenntnisse.

Erste Schritte Die Topologie, also die Zusammensetzung eines künstlichen neuronalen Netzes, gestaltet sich äußerst variabel, beispielsweise was die Größe und Art der einzelnen Ebenen im Netz betrifft – also die Anzahl der Neuronen – und wie sie miteinander verbunden sind. Die optimale Architektur hängt von der spezifischen Aufgabe und Datenlage ab und ist Gegenstand aktiver Forschung. Dieser Artikel widmet sich vor allem der Implementierung von KNNs. Am Anfang steht hierbei die Installation von ­PyTorch. Sie erfolgt im einfachsten Fall Python-gemäß mit pip: pip3 install torch torchvision ↵ torchaudio

Für das hier gezeigte Anwendungsbeispiel genügt streng genommen das Paket torch. Aber es empfiehlt sich, torch vision und torchaudio bei dieser Gelegenheit gleich mitzuinstallieren, da die Entwicklung weiter fortgeschrittener KNNs ohne deren Module schnell an Grenzen stößt. Viele Entwickler bevorzugen statt pip den Paketmanager Conda, da er insbe­ sondere die Installation komplexer, im Bereich Machine Learning häufig benötigter Pakete wie NumPy und weiterer hardwareoptimierter Abhängigkeiten vereinfacht. Beispielsweise ist mit Conda der Support für bestimmte CUDA-Versionen oder für den M1-Chip in Apple MacBooks auf älteren macOS-Betriebssystemen reibungsloser. Mit macOS 13 (Ventura) scheint jedoch auch pip keine Probleme mehr zu haben. Generell bietet die PyTorch-Seite eine vollständige Übersicht aller unterstützten Betriebssysteme, Package-Manager, Programmiersprachen und Plattformen und liefert für jede Kombination direkt den passenden Befehl zur Installation (siehe ix.de/zbu8). Ob die PyTorch-Installation geglückt ist, lässt sich verifizieren, indem man die Bibliothek im Python-Interpreter lädt: import torch

Das Ausbleiben einer Fehlermeldung signalisiert eine erfolgreiche Installation. Als erste Fingerübung definiert die Klasse in Listing 1 ein einfaches Feed-

Herkunftsfragen PyTorch ist zwar das meistverwendete Produkt im Torch-Ökosystem, unter der Haube steckt jedoch eine andere Programmiersprache: Die Erfinder von Torch haben sich bei dessen Implementierung für Lua entschieden. Das erste Release im Jahr 2002 stand im Mittelpunkt einer wissenschaftlichen Publikation namhafter Forscher am Schweizer Forschungsinstituts Idiap. Bei PyTorch handelt es sich also lediglich um die Python-Schnittstelle zum besagten LuaFramework. In der Praxis spielt PyTorch dennoch die Hauptrolle, während das zugrunde liegende Torch bereits seit 2017 nicht mehr weiterentwickelt wird. Daneben existiert mit PyTorch C++ eine weitere Variante, die eine Schnittstelle für C++-Code bietet.

Deep Learning und künstliche neuronale Netze Wer sich der technischen Seite des schwer zu greifenden Begriffs künstliche Intelligenz nähert, stößt schnell auf den Begriff Deep Learning. Dessen Definition fällt bereits schärfer aus: Es handelt sich um einen Algorithmus aus der Welt des maschinellen Lernens, der künstliche neuronale Netze (KNNs) anwendet. Die Komponente „Deep“ bezieht sich dabei darauf, dass diese KNNs meist aus mehreren Schichten (Layers) bestehen, die wiederum eine frei definierbare Anzahl sogenannter Neuronen umfassen. Die Inspi­ration für die Namensgebung stammt aus der Biologie, funktional haben KNNs und ihre künstlichen Neuronen allerdings w ­ enig mit den Strukturen eines menschlichen oder tierischen ­Gehirns gemeinsam. In der Praxis entspricht ein solcher KNN-Layer einer Matrix. Das Konzept für KNNs geht bereits auf die 1940er-Jahre zurück. In den Folgejahrzehnten kamen sie immer wieder mehr oder weniger erfolgreich für Spezialanwendungen zum Einsatz, beispielsweise für die automatische Digitalisierung handgeschriebener und gedruckter Texte (HTR, OCR). Fortschritte bei der Entwicklung effizienter Algorithmen zum Optimieren solcher KNNs einer­seits sowie leistungsfähige Hardware andererseits haben seit den 2000er-Jahren den Einsatz von KNNs für immer komplexere Aufgaben wie das Erzeugen und Klassifizieren von Texten und Bildern ermöglicht. Forward-Netz, das einen Input ohne Weiteres durch einen oder mehrere lineare Layer eines KNN schleust. Die wichtigsten Punkte dabei sind: 1. Die neue Klasse erbt von torch. nn.Module. 2. Der Konstruktor definiert die Komponenten des Netzes; hier ein einzelner linearer Layer (self.linear) mit definierbarer Input- und Output-Dimensionalität. 3. Die forward()-Methode nimmt einen konkreten Input an, schleust ihn durchs Netz (Forward Pass) und gibt den entsprechenden Output zurück. Das hier definierte künstliche neuronale Netz mit nur einem Layer ist jedoch nur für äußerst einfache Aufgabenstellungen geeignet. Ein Objekt der FeedForward-Klasse lässt sich mit den Konstruktorargumenten für die Input- beziehungsweise Output-Dimensionen initialisieren: model = FeedForward(256, 8)

PyTorch liefert eine String-Serialisierung mit, um das Ergebnis zu verifizie-

ren. Diese Darstellung hilft vor allem bei der Analyse komplexer Modelle: print(model) FeedForward( (linear): Linear(in_features=256, ↵  out_features=8, bias=True) )

In die Praxis Das folgende Beispiel definiert ein etwas komplexeres neuronales Netz, das die Sprache eines beliebigen Textes automatisch erkennt, indem es dessen Buchstaben als Eingabe verwendet. Sie werden zunächst zu überlappenden Zeichentrigrammen zusammengefasst, also Folgen von je drei Zeichen. Dies hat sich nach dem aktuellen Stand der computerlinguistischen Forschung als die effektivste Unterteilungsmethode für Aufgaben dieser Art erwiesen. Das Wort „Text“ ergibt so die Trigramme „Tex“ und „ext“. Der folgende Beispielcode berücksichtigt keine Leerzeichen, Satzzeichen oder Satzgrenzen; hier liegt möglicherweise noch Verbesserungspotenzial. 51

iX Special 2023 – KI © Copyright by Heise Medien.

Werkzeuge | Machine-Learning-Frameworks

Natural Language Processing und Self-supervised Learning Das Trainieren eines KNN erfordert in der Regel einen Datensatz, bei dem Menschen für zahlreiche Eingaben die korrekte Ausgabe manuell angegeben – annotiert – haben. Im Falle einer Klassifizierungsanwendung könnte die Frage an die menschlichen Annotatoren lauten: Ist auf einem bestimmten Bild ein Hund oder eine Katze zu sehen? Eine ausreichende Anzahl derart annotierter Beispiele ermöglicht die Optimierung der Parameter eines KNN, das dabei häufig eine erstaunliche Abstraktionsfähigkeit beim Erkennen weiterer Bilder entwickelt – im Fall eines Klassifizierungsproblems allerdings beschränkt auf die bekannten Kategorien.

stellt. Streicht man aus den dort gefundenen Sätzen jeweils zufällige Wörter heraus, lässt sich ein Modell trainieren, das diese fehlenden Wörter voraussagt. Da das fehlende Wort bekannt ist, lässt sich wiede­ rum eine Fehlerfunktion definieren, die die Erfolgsquote eines KNN beim Wiederherstellen des originalen Satzes beziffert. So lässt sich das Netz auch ohne explizites menschliches Zutun optimieren – wenn man außer Acht lässt, dass Menschen auch diese Texte verfasst haben. Die Methode nennt sich Masked Language Modelling (MLM) und bildet eine der Grundlagen von Modellen wie BERT und dessen Nachfolgern (siehe ix.de/zbu8).

Solche menschengemachten Annotationen sind jedoch zeitaufwendig und teuer. Im Bereich des Natural Language Processing (NLP) macht man sich deshalb die Tatsache zunutze, dass das Internet gigantische Mengen frei verfügbarer Texte bereit-

Diese und ähnliche Optimierungsmethoden kommen bei verwandten Modellen bis hin zu den Modellen von OpenAI zum Einsatz. Sie lassen sich unter dem Begriff „selbst überwachtes Lernen“ (Self-supervised Learning) subsumieren.

Diese Trigramme dienen als Eingabe für das neuronale Netz. Das setzt eine numerische Repräsentation voraus, sie werden deshalb als One-Hot-Vektoren codiert. Das bedeutet, dass jeder Eingabesatz zunächst einem Nullvektor der Länge aller in den Trainingsdaten vorkommenden Trigramme entspricht; für jedes in einem bestimmten Text vorkommende Trigramm wird der entsprechende Index im Vektor auf 1 gesetzt. Ähnlich verhält es sich mit dem Ausgabevektor, der die Sprache des Textes codiert. Seine Vektorrepräsentation entspricht einem One-Hot-Vektor der Länge aller aus den Trainingsdaten bekannten Sprachen, im Beispiel 20. Das Optimierungsziel besteht also darin, dass das Netz für einen Eingabetext einen Vektor ausgibt, in dem der Wert für die tatsächliche Sprache des Eingabevektors möglichst nahe bei 1 liegt und die anderen 19 Werte nahe 0. Auch bei anderen Datentypen besteht der erste Schritt immer darin, die Eingabedaten in Vektoren zu verwandeln. Welche Methoden sich am besten eignen, hängt wiederum stark von der Natur der jeweiligen Daten und der Zielsetzung ab. Hat man es statt mit Text mit Bildern zu tun, konvertiert man die Pixel eines zweidimensionalen Bildes üblicherweise in einen Vektor, indem man die Farbwerte der einzelnen Pixel Reihe für Reihe aneinanderhängt. Je nach Datenlage gehen dem Vorverarbeitungsschritte voraus, etwa die Normalisierung der Eingabe­daten

auf eine einheitliche Bildgröße und -auflösung sowie das Umwandeln der Farbwerte in Graustufen. Für die Verarbeitung von Textdaten in  komplizierteren Aufgabenstellungen erfolgt zunächst eine Unterteilung in Wörter oder Teilwörter (Tokenisierung). Anstatt der Buchstabentrigramme mit vordefinierter Länge, wie im hier gezeigten Beispiel, ergibt sich aus einer Textpassage dadurch eine Sequenz von (Teil-) Wörtern variabler Länge. An erster Stelle steht im KNN dann ein sogenannter Embedding-Layer, der wie die anderen Layer optimiert wird, um die im Eingabetext gefundenen (Teil-)Wörter in Vektoren umzuwandeln; so „lernt“ das Netzwerk, jedes Wort durch einen Vektor von beispielsweise 768 Dezimalzahlen zu repräsentieren. Da es sich praktisch um eine Art Wörterbuch handelt, das für jedes bekannte Wort einen Vektor vorhält, heißen Embedding-Layer auch Lookup-Layer. PyTorch hält eine Implementation eines

Embedding-Layers vor, der sich wie die anderen Layertypen in die Topologie eines KNNs einbauen lässt. Sind die KNN-Parameter schließlich anhand der Trainingsdaten optimiert, liegen die Vektoren für ähnliche Eingabewörter im gemeinsamen Vektorraum nahe beieinander. Dabei hängt die Definition von „ähnlich“ von der jeweiligen Aufgabe des KNN ab. Diese EmbeddingVektoren spiegeln die vielschichtigen linguistischen Beziehungen zwischen Wörtern und deren Bedeutungen erstaunlich präzise wider.

Architektur Im ersten Schritt folgt die Definition des KNN (siehe Listing 2). Das oben bereits skizzierte Feed-Forward Network erhält dazu einen weiteren Layer namens hidden. Die Initialisierung erfolgt ebenfalls wie oben, es kommt aber ein weiterer Parameter für die Größe des zweiten Layers hinzu, hier auf 40 gesetzt (siehe Listing 3). Die Größe des Eingabelayers entspricht der Gesamtzahl von Zeichentrigrammen in den Trainingsdaten, hier 6121. Die Ausgabegröße ist 20, die Zahl der bekannten Sprachen in unserem Datensatz. Beide Werte werden weiter unten beim Laden der Trainingsdaten erhoben; der obige Code ist an dieser Stelle also noch nicht ausführbar, da die Varia­ blen q_grams und languages noch nicht initialisiert sind. Die Eingabegröße des zweiten Layers ist hier mit 40 definiert. Dieser etwas willkürlich gesetzte Wert entspricht der Erfahrung, dass die Eingabegröße des Zwischenlayers zwischen der Größe des ersten Layers und der Ausgabegröße liegen sollte. Zwischen den beiden neuronalen Ebenen befindet sich außerdem ein Sigmoid-Layer, der nichts weiter tut als – wenn nötig – die Ausgabewerte in das Intervall zwischen −1 und +1 zu bringen. Damit ist das Grundgerüst des KNN definiert. Für die Optimierung der Para-

Listing 1: Ein einfaches Feed-Forward-Netz import torch import torch.nn as nn class FeedForward(nn.Module): def __init__(self, input_dim, output_dim): super(FeedForward, self).__init__() self.linear = nn.Linear(input_dim, output_dim) def forward(self, x): out = self.linear(x) return out

52

iX Special 2023 – KI © Copyright by Heise Medien.

Architekturen: Transformer, rekursive Netze und Convolution In den letzten Jahren haben künstliche neuronale Netze Anwendungen zum Verarbeiten von Texten und Bildern spektakulär vo­ rangebracht. Dabei gab es nicht nur einen Sprung vorwärts, sondern mehrere Generationen neuronaler Netze, die ihre Vorgänger jeweils in den Schatten stellten. Die heutige Generation, die GPT und Co. zugrunde liegt, basiert vor allem auf Transformer-Layers. Dabei handelt es sich mathematisch gesehen um eine separate Matrix, deren Gewichte beim Training eines Modells optimiert werden, um die Aufmerksamkeit gezielt auf bestimmte Stellen des Kontexts zu richten. Iteriert das Modell über die Wörter eines Satzes und trifft beispielsweise auf das Wort „Bank“, könnte die sogenannte Attention-Matrix bestimmten Wörtern wie „Park“ besonderes Gewicht zuweisen – und so den Sinn der spezifischen „Bank“ als „Parkbank“ enthüllen. Convolutional Neural Networks (CNN) finden weiterhin großen Anklang bei der Verarbeitung von Bildern. Bei Convolution, zu Deutsch Faltung, handelt es sich um eine Matrixoperation, die jeden Eingabewert durch den gewichteten Mittelwert der sie umgebenden Werte ersetzt. Diese Methode hat sich als besonders effektiv erwiesen, um in Bildern relevante Objekte zu erkennen, da sie etwa auch unscharfe Kanten und Ränder in fast beliebigen Formen findet. meter fehlt noch die Definition der Verlustfunktion. Für Klassifizierungspro­ bleme wie das vorliegende bietet sich ­dafür Cross Entropy Loss an; diese Funktion misst den Gesamtunterschied zwischen den Werten des vom Modell ausgegebenen Vektors und der korrekten Antwort. import torch.nn as nn criterion = nn.CrossEntropyLoss()

Auf Basis des damit gemessenen Fehlerwerts erfolgt beim Training die Anpassung der Parameter des oben definierten neuronalen Netzes. Mit PyTorch brauchen Entwickler diese Werte nicht manuell zu verändern, sondern sie greifen auf das PyTorch-Modell optim zurück, das zahlreiche Optimierungsmethoden bereitstellt. import torch.optim as optim learning_rate = 0.0005 optimizer = optim.SGD(model.↵  parameters(), lr=learning_rate)

Die hier eingeführte Lernrate (Learning Rate) definiert den Faktor, mit dem der Optimierer die Modellparameter anpasst. Ein höherer Wert führt mit weniger Iterationen in die Richtung der optimalen Parameter und spart damit Zeit. Gerät die Lernrate jedoch zu hoch, birgt das die Gefahr, dass die optimalen Modellparameter niemals gefunden werden. Das Optimieren der Lernrate ist eine Wissenschaft für sich, aber in der Praxis

Die rekursiven neuronalen Netze (RNN) wiederum haben bis zum Durchbruch der Transformer in den letzten etwa fünf Jahren die besten Ergebnisse beim Verarbeiten von Texteingaben erzielt. Bei dieser Familie generiert das Modell für jede Eingabe, etwa jedes Wort, einen Output, der wiederum als zusätzliche Eingabe für das folgende Wort fungiert. Dahinter steckt die Intuition, dass für das Verständnis eines Wortes die umliegenden Wörter entscheidend sind. Bidirektionale RNNs wenden die gleiche Logik nicht nur in Leserichtung, sondern zusätzlich in die umgekehrte Richtung an. Varianten wie LSTM (Long Short-Term Memory) und GRU (­Gated Recurrent Unit) fügen sogenannte Gates hinzu, die bestimmten Wörtern des Kontexts bestimmte Gewichte verleihen, ähnlich wie die Attention-Matrizen oben. Der entscheidende Nachteil der RNNs liegt vor allem in der Skalierbarkeit. Es ist konzeptuell die Verarbeitung eines Eingabetextes zu parallelisieren, da die Berechnung eines Outputs für jedes Wort zuerst die des vorhergehenden Wortes erfordert. PyTorch bietet fertige Implementierungen für all diese Layertypen an. Im Prinzip lassen sie sich beliebig aneinanderreihen und kombinieren – allerdings tragen allzu bunte Varianten nach dem aktuellen Stand der Forschung nicht dazu bei, die Ergebnisse neuronaler Netze zu verbessern.

führen auch nicht ganz optimale Werte in der Regel bereits zu ausreichenden Ergebnissen.

Daten laden Bevor es mit dem Training losgeht, müssen auch die Daten ins passende Format. Dieses Beispiel greift auf einen frei verfügbaren Datensatz zurück, der 90 000 Textpassagen enthält, die jeweils einer von 20 Sprachen zugeordnet sind. Er steht auf der Hugging-Face-Webpage zum Download bereit (siehe ix.de/zbu8). In der Welt des Machine Learning ist es üblich, derartige Datensätze aufzu­ teilen in verschiedene Splits: Training, Valida­tion und Test. Der Trainings-Split enthält den Löwenanteil der Daten und wird verwendet, um ein Modell zu trai-

nieren; im hiesigen Beispiel bedeutet das 70 000 der 90 000 Datenreihen. Den Validation-Split verwendet man während der Entwicklung, um Modelle zwischenzeitlich miteinander zu vergleichen und den Trainingsfortschritt zu beobachten. Erst wenn man sich auf Grundlage der Ergebnisse auf den Daten des ValidationSplit auf ein Modell und seine Parameter festgelegt hat, prüft man – wissenschaftlicher Methodik folgend – dessen Leistung anhand des Test-Splits. Andernfalls läuft man Gefahr, das Modell so zu optimieren, dass es zwar auf den Testdaten beste Ergebnisse erzielt, jedoch nicht unbedingt bei bislang unbekannten Daten, die in einer Anwendung das eigentliche Ziel bilden. Der hier verwendete Datensatz ordnet Validation und Test jeweils 10 000 Einträge zu.

Listing 2: Definition eines Hidden Layers import torch.nn as nn class FeedForward(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(FeedForward, self).__init__() self.input_layer = nn.Linear(input_size, hidden_size) self.sigmoid = nn.Sigmoid() self.hidden = nn.Linear(hidden_size, output_size) def forward(self, x): y_1 = self.input_layer(x) y_non_linear = self.sigmoid(y_1) out = self.hidden(y_non_linear) return out

53

iX Special 2023 – KI © Copyright by Heise Medien.

Werkzeuge | Machine-Learning-Frameworks

Listing 3: Initialisierung des Hidden Layers input_size = len(q_grams) output_size = len(languages) hidden_size = 40 model = FeedForward(input_size, hidden_size, output_size) print(model) FeedForward( (input_layer): Linear(in_features=6121, out_features=40, bias=True) (sigmoid): Sigmoid() (hidden): Linear(in_features=40, out_features=20, bias=True) )

Listing 4: Implementierung der Klasse LanguageDataset import logging from typing import Dict, List, Set, Tuple from torch.utils.data import Dataset class LanguagesDataset(Dataset): def __init__(self, rows) -> None: self.rows: List[Dict[str, str]] = [row["row"] for row in rows] def __len__(self): return len(self.rows) def __getitem__(self, idx) -> Tuple[str, str]: row = self.rows[idx] return row["labels"], row["text"]

Die Klasse Dataset ist das Mittel der Wahl, um in PyTorch Datensätze zu verwalten. Durch eine Implementierung für die eigenen Daten macht der Entwickler diese über eine uniforme Schnittstelle zugänglich. Die Implementierung der internen Methoden __len__() und __ getitem__(i) ist dabei unverzichtbar, neben passender Logik zum Einlesen der eigenen Daten. Die Implementierung der Languages Dataset-Klasse in Listing  4 speichert die  Eingabedaten Reihe für Reihe in einer Python-Liste im Arbeitsspeicher, was auch den Zugriff auf einzelne Elemente einfach gestaltet. Implementationen für sehr große Datensätze setzen an dieser Stelle beispielsweise ausgeklügeltere Methoden ein, um die Daten bei Bedarf zu laden, ohne jedoch den verfügbaren Arbeitsspeicher zu überlasten. Die LanguagesDataset-Klasse implementiert die nötige Logik, um die Text-

passagen und die entsprechenden Sprachen zu extrahieren und einander zuzuordnen. Insbesondere die verschachtelte Serialisierung der Texte und der dazugehörigen Sprachen in den JSON-Objekten ist dabei spezifisch für die vorliegenden Daten. Die Zeilen in Listing 5 lesen eine JSON-Datei train.json im Format des Beispieldatensatzes ein und initialisieren eine Instanz der LanguagesDatasetKlasse: Das funktioniert ebenso für die beiden anderen Splits – Validation und Test – sodass man am Ende die drei Data­ set-Instanzen training_data, valida tion_data und test_data initialisiert hat.

Alle Werte sind Tensoren Um diese Daten mit PyTorch zu benutzen und so die Parameter eines KNN zu optimieren, müssen sie wie alle Ein- und

Ausgabewerte die Form von Tensoren annehmen. Diese sind in PyTorch ähnlich wichtig wie das Autograd-Feature, bewegen sich dank der Tensorklasse aber aus Entwicklersicht näher an der Oberfläche. Tensorobjekte lassen sich wie andere Python-Objekte initialisieren. Die Tensorklasse implementiert Matrizen beliebiger Dimensionalität – die mathematisch abstraktere Definition, wie sie in der Physik und Mathematik vorkommt, spielt für die Implementierung in PyTorch keine Rolle. Auch eindimensio­nale Tensoren sind erlaubt, ein solcher Tensor entspricht einem Vektor. Wer bereits die mathematische Bibliothek NumPy und ihre Arrays kennt, findet sich bei Torch-Tensoren schnell zurecht, denn beide gleichen sich in der Verwendung ebenso wie bei vielen der zur Verfügung stehenden Funktionen und Methoden. Anders als NumPy-Arrays erfordert ein PyTorch-Tensor jedoch, dass alle enthaltenen Elemente vom selben Typ sind, also beispielsweise nur Fließkommazahlen. Der Tensorkonstruktor nimmt eine Python-Liste, die diese Vorbedingung erfüllt, als Argument: torch.tensor([1, 2, 3])

Mehrdimensionale Tensoren lassen sich durch verschachtelte Listen deklarieren, zum Beispiel: torch.tensor([[1, 2], [3, 4]])

Weitere Helferfunktionen initialisieren Tensoren einer bestimmten Dimensionalität mit Nullen, Einsen oder Zufallswerten; die folgenden Beispiele generieren Tensoren mit zwei auf drei Dimen­ sionen: torch.zeros(2, 3) torch.ones(2, 3) torch.rand(2, 3)

Die rand()-Methode erzeugt standardmäßig Werte zwischen 0 und 1.

An die Geräte! Ein zentraler Punkt bei der PyTorch-Implementierung ist die Möglichkeit, Ten-

Listing 5: Initialisierung der LanguageDataset-Instanz

Listing 6: Abfrage von GPU und MPS

TRAIN_FILE = "train.json"

if torch.has_cuda: device = "cuda:0" elif torch.has_mps: device = "mps" else: device = "cpu"

with open(TRAIN_FILE, "rt") as train_file: _training = json.load(train_file) training_data = LanguagesDataset(_training["rows"])

54

iX Special 2023 – KI © Copyright by Heise Medien.

Listing 7: Definition der Trainingsfunktion def train(category_tensor, text_tensor): model.train() output = model(text_tensor[0]) loss = criterion(output, category_tensor[0]) loss.backward() optimizer.step() return output, loss.item()

soren einem bestimmten Gerät zuzuteilen. Ohne nähere Angaben landen sie im Register der CPU; wer über eine eingebaute GPU mit CUDA-Treibern verfügt, verschiebt einen Tensor mittels der to()Methode dorthin: tensor = torch.rand(2, 3) tensor = tensor.to("cuda:0")

Die Eigenschaft device zeigt an, welchem Gerät ein Tensor zugeteilt ist: print(tensor.device) device(type='cuda', index=0)

In der Regel sind GPUs um ein Vielfaches schneller als CPUs, wenn es um das Berechnen von Matrizenoperationen geht. Dank ­PyTorch nutzen Entwickler diese Eigenschaft, ohne selbst hardwarenahe Optimierungen vorzunehmen. Das setzt voraus, dass alle involvierten Tensoren demselben Gerät zugeteilt sind. Um dieses Ziel zu erreichen, bietet auch das oben definierte model-Objekt eine to()Methode, die auf die gleiche Weise zum Einsatz kommt wie bei einem Tensor: model = FeedForward(input_size, ↵  hidden_size, output_size) model = model.to("cuda:0")

PyTorch liefert Funktionen mit, die he­ rausfinden, welche Geräte verfügbar sind. Neben der CPU sind häufige Anwendungsfälle die bereits erwähnten CUDAGPUs sowie die MPS-Chips (Metal Performance Shaders), die Apple seit einigen Jahren in seinen MacBooks der Typen M1 und M2 verbaut. PyTorch unterstützt MPS ebenfalls und erzielt so auch auf solchen Rechnern beachtliche Geschwindigkeitsvorteile gegenüber der Verwendung der CPU. Die Abfrage in Listing 6 prüft, ob die genannten Chips unter PyTorch zur Verfügung stehen, und speichert den Namen in einer String-Variablen device. Der Einfachheit halber geht dieser Code von maximal einer CUDA-GPU aus und verwendet deshalb den Indexwert 0. Im ­Falle mehrerer CUDA-unterstützter Geräte lassen diese sich beispielsweise mit ­cuda:1 gezielt ansteuern. Das folgende Kommando initialisiert das jeweilige Gerät, sodass es im weiteren Verlauf als Argument für to(device)-Aufrufe zur Ver-

Listing 8: Umwandlung in Tensoren (Schritt 1) q = 3 q_gram_set = set() language_set = set() for row in _training["rows"]: text = row["row"]["text"] for start, end in zip(range(0, len(text) - q), range(q, len(text))): q_gram = text[start:end] q_gram_set.add(q_gram) language_set.add(row["row"]["labels"]) q_grams = list(q_gram_set) languages = list(language_set)

fügung steht; im Standardfall der CPU ist dieser Schritt überflüssig: torch.device(device)

Zum Training Ein Modell ist deklariert und aufs richtige Gerät verschoben, die Daten sind geladen; endlich folgt die Definition einer train()-Funktion, die pro Aufruf ein Text-Sprach-Paar entgegennimmt und die Parameter des Modells optimiert (siehe Listing 7). Die beiden Argumente category_ tensor und text_tensor sind Tensoren, die die tatsächliche Sprache eines Textes beziehungsweise den Text selbst in Form der oben beschriebenen One-Hot-Vektoren repräsentieren. Deren jeweilige Dimensionalität muss der im Modell definierten Größe von Aus- beziehungsweise Eingabelayer entsprechen, also der Anzahl der in den Trainingsdaten vorkom-

menden Sprachen und Buchstabentrigramme. Danach berechnet das Modell aus dem Texttensor auf Basis seiner derzeitigen Parameter einen Ausgabetensor. Die in der Variablen criterion gespeicherte Verlustfunktion berechnet den Unterschied zwischen diesem Ausgabetensor output und dem in category_tensor repräsentieren Idealzustand. Der Aufruf von loss.backward() propagiert den Fehlerwert mittels Autograd durch das künstliche neuronale Netz zurück und optimizer.step() passt daraufhin schließlich die Parameter des KNN an. Wiederholt man diesen Schritt für jedes eingeführte Sprach-Text-Paar aus den Trainingsdaten, rückt die Ausgaben des Klassifizierungsmodells immer näher an die Wahrheit. Es fehlt noch der Zwischenschritt, der die in den Trainingsdaten gefundenen Sprach-Text-Paare in Tensoren umwan-

Listing 9: Umwandlung in Tensoren (Schritt 2) def languageTensor(language): if language not in language_set: raise ValueError(f"Unknown language '{language}'.") tensor = torch.zeros(1, len(languages)) i = languages.index(language) tensor[0][i] = 1 return tensor

Listing 10: Umwandlung in Tensoren (Schritt 3) def qgramTensor(text): tensor = torch.zeros(1, len(q_gram_set)) for start, end in zip(range(0, len(text) - q), range(q, len(text))): _q_gram = text[start:end] if _q_gram in q_gram_set: i = q_grams.index(_q_gram) tensor[0][i] = 1 else: logging.debug(f"Ignoring previously unseen q-gram: '{_q_gram}'") return tensor

55

iX Special 2023 – KI © Copyright by Heise Medien.

Werkzeuge | Machine-Learning-Frameworks

cher sprengt und auch das lineare Aufsuchen von Trigrammindizes zu einer langwierigen Operation macht. Der geringe Umfang der vorliegenden Beispieldaten macht eine weitere Optimierung hier jedoch nicht nötig.

Listing 11: Modelltraining import random from tqdm.autonotebook import tqdm EPOCHS = 10 for epoch in tqdm(range(EPOCHS), unit="epoch"): samples = list(range(len(training_data))) random.shuffle(samples) for i in tqdm(samples, unit="sample", desc="Training"): label, text = training_data[i] language = languageTensor(label) input = qgramTensor(text) output, loss = train(language.to(device), input.to(device))

Listing 12: Ermitteln der Vorhersagegenauigkeit def evaluate(dataset): model.eval() total = 0.0 correct = 0.0 for i in tqdm(range(len(dataset)), unit="sample", desc="Evaluating"): label, text = dataset[i] input = qgramTensor(text) for i in range(input.size()[0]): output = model(input.to(device)) predicted = languages[torch.argmax(output)] total += 1.0 correct += predicted == label return total, correct

delt, die sich für die Eingabe in die train()-Funktion eignen. Dazu erzeugt man am einfachsten zunächst jeweils eine Python-Liste, die alle Sprachen beziehungsweise alle Trigramme enthält; damit entspricht jede Sprache und jedes Trigramm genau einem Indexwert aus der jeweiligen Liste (siehe Listing 8). Die Variable q gibt die Länge der Buchstabensequenzen wieder; statt Trigrammen ließen sich auch kürzere oder längere Sequenzen, beispielsweise Bigramme oder Quatrogramme, verwenden. Der obige Code iteriert über alle Datenreihen des Trainingssets und speichert alle vorkommenden Sprachen sowie Trigramme in Sets; Wiederholungen werden damit ignoriert. Die letzten beiden Zeilen konvertieren diese Sets in Listen, um die Reihenfolge der Einträge zu stabilisieren und jedem Element einen permanenten Index zuzuweisen. Mithilfe dieser Listen lassen sich Sprachcodes und Texte in Tensoren verwandeln; die languageTensor()-Funk­ tion übernimmt das zunächst für Sprachen wie „de“ (siehe Listing 9). languageTensor() stellt zunächst sicher, dass die eingegebene Sprache bekannt ist, denn unbekannte Sprachcodes

kann die Programmlogik nicht verarbeiten. Danach erzeugt die Funk­tion einen Tensor der gewünschten Dimensionalität und füllt ihn zunächst mit Nullen. Nur die Position, die der eingegebenen Sprache entspricht, erhält schließlich den Wert 1. Das gleiche Prinzip kommt in qgram Tensor() für die Verwandlung eines Textes in einen Tensor zum Einsatz (siehe Listing 10). Im Unterschied zu Sprachcodes können unbekannte Buchstabentrigramme durchaus vorkommen, denn die Trainingsdaten enthalten sicher nicht alle möglichen Permutationen aus allen möglichen Zeichensystemen. qgramTensor() wirft für unbekannte Trigramme deshalb keinen Fehler aus, sondern schreibt lediglich eine Logmeldung fürs Debugging. Als Ergebnis liefert auch diese Funktion einen Vektor, der größtenteils aus Nullen besteht. Allerdings stehen hier mehrere Positionen auf 1, nämlich alle, die dem Index irgendeines im Text vorkommenden Trigramms entsprechen. Potenziell kommen in einem größeren Datensatz enorm v­ iele verschiedene Trigramme vor. Ab einem gewissen Umfang re­sultiert das in einer Python-Liste, deren Größe den verfügbaren Arbeitsspei-

56

Auf der Zielgeraden Nun stehen alle Komponenten bereit, um endlich das Modell zu trainieren (siehe Listing 11). Der folgende Code iteriert mehrere Male über die Einträge des Trainingsdatensatzes in zufälliger Reihenfolge, verwandelt sie in Tensoren und verfüttert sie an die train()-Funktion; für Übersicht sorgt ein Fortschrittsbalken mit tqdm (siehe ix.de/zbu8). Die Variable EPOCHS gibt die Anzahl der Iterationen über den gesamten Datensatz an. Ein optimaler Wert hängt von der Menge und Diversität der Daten ab und bewegt sich in der Praxis meist zwischen 1 und 10.

Qualität und Quantität Um zwischenzeitlich einen Eindruck von der Leistung des Modells zu gewinnen, lohnt sich zunächst ein Blick auf den LossWert, der jedoch nur ein abstrakter Aus­ sagewert ist. Für mehr Einblick sorgt die Vorhersagegenauigkeit (Accuracy) des Modells auf den Daten des ValidationSplits. Die evaluate()-Funktion erhebt diesen Wert (siehe Listing 12). Die Funktion nimmt einen der eingangs initialisierten Teildatensätze ent­ gegen und misst die Genauigkeit des Modells für alle darin enthaltenen Datenpunkte. Aufrufe der Evaluierungsfunktion lassen sich etwa in die Trainingsschleife aus Listing 11 ans Ende jeder Iteration einfügen (Listing 13).

Erfolg! Die Modellevaluierungen am ValidationSplit ermöglichen schließlich die weitere Entwicklung des Modells. Der Autor dieses Artikels hat allein unter Verwendung der ersten 100 Einträge des Trainingsdatensatzes nach sieben Epochen eine Genauigkeit von etwa 70 Prozent gemessen. Mehr Daten führen zunächst zu besseren Ergebnissen, weitere Ebenen scheinen hingegen nicht zu helfen. Ab diesem Punkt beginnt die Forschungsarbeit: Bis zu welchem Punkt verhilft ein größerer Trainingsdatensatz zu besseren Ergebnissen, und ab wann führt er nur noch zu längeren Trainingszeiten? Helfen zusätzliche Ebenen im Netz vielleicht nur in einer bestimmten iX Special 2023 – KI

© Copyright by Heise Medien.

Listing 13: Aufrufe der Evalierungsfunktion Größe? Die Möglichkeiten sind beinahe unendlich; neben den Daten und der Netzwerkgröße können je nach Aufgabenstellung auch andere Optimierer, Verlustfunktionen und Netzwerktypen bessere Ergebnisse produzieren. Bei der Vektorisierung stehen ebenfalls Alternativen zur Verfügung. So verwenden manche Implementationen zum Verarbeiten von Text auf Buchstabenebene statt der fest definierten Trigramme N-Gramme variabler Größe. Ein anderer Ansatz sind rekursive neuronale Netze (RNNs), die über die einzelnen Buchstaben iterieren und die Ausgabe des Netzwerks in einem Zustand – also eines gelesenen Buchstaben – als Eingabe für den nächsten verwenden. PyTorch stellt neben der einfachsten Variante, RNN, im nn-Modul auch die fortgeschritteneren Implementationen namens LSTM (Long Short-Term Memory) und GRU (Gated Recurrent Unit) zur Verfügung (siehe ix.de/zbu8). Weiterhin bietet die hier gezeigte Implementation Raum für die Optimierung der Effizienz. Statt das Modell für jeden Eintrag in den Trainingsdaten einzeln zu optimieren, verarbeitet man in der Praxis größere Datensätze in Batches. Dabei füttert man die Trainingsfunktion mit mehreren Datenreihen auf einen Schlag. PyTorch stellt auch dafür eine Klasse bereit, den DataLoader: from torch.utils.data import DataLoader train_dataloader = DataLoader( training_data, batch_size=8, ↵ shuffle=True, ↵collate_fn=... )

print(f"Loss:\t{str(loss)}") total, correct = evaluate(validation_data) print(f"Samples evaluated:\t{total}") print(f"Samples correct:\t{correct}") print(f"Accuracy:\t{correct/total}")

Ein DataLoader-Konstruktor nimmt ein Objekt der Dataset-Klasse entgegen. Die weiteren Argumente definieren die Größe der Batches – hier 8. Der Parameter shuffle bestimmt, ob die Eingabedaten in zufälliger Reihenfolge verwendet werden. Der datenspezifische Teil verbirgt sich im collate_fn-Argument. Hier folgt eine Funktion, die die Reihen des Datensatzes in Tensoren konvertiert, wie es oben die Funktionen languageTensor() und qgram Tensor() jeweils für einen einzelnen Datenpunkt erledigen. Die Implementierung einer solchen Funktion ist datenspezifisch und erfordert keine weiteren PyTorch-Kenntnisse, abgesehen davon, dass sie Tensoren zurückliefern muss.

Gelernt ist gelernt Das implementierte PyTorch-Modell erfüllt seinen Zweck: Es erkennt, in welcher Sprache ein Text geschrieben wurde, wenn auch nicht in allen Fällen korrekt. Diesem Umstand sehen sich Wissenschaftler und Praktikerinnen im Feld des maschinellen Lernens übrigens kontinuierlich ausgesetzt – meistens müssen sie abwägen, wie viel Prozent Genauigkeit für einen konkreten Anwendungsfall ausreichend und wünschenswert sind. Die hier eingeführten PyTorch-Komponenten geben einen Einblick in die

Leistungsfähigkeit des Frameworks. PyTorch stellt eine Vielzahl fertiger Implementationen im optim- beziehungsweise im oben erwähnten nn-Modul zur Verfügung. Deren jeweilige Dokumentation bietet eine Übersicht über die verfügbaren Optionen, die sich nach Lust und Laune ausprobieren lassen. Neugierige Leserinnen und Leser sollten ohne Hemmungen damit experimentieren. Eine konkrete Anwendung wie die hier implementierte hilft dabei, die Effekte veränderter Komponenten direkt zu beobachten – ein unverzichtbarer Faktor einer an wissenschaftlicher Methodik orientierten, datengetriebenen Herangehensweise.  ([email protected]) Quellen Links zu den erwähnten Projekten: ix.de/zbu8

Carsten Schnober arbeitet als Forschungsingenieur am Netherlands eScience Center, das Software für Forschungseinrichtungen entwickelt. Sein Schwerpunkt liegt im Bereich künstliche Intelligenz und Natural Language Processing.

57

iX Special 2023 – KI © Copyright by Heise Medien.

Werkzeuge | ML-UI

fort ausprobieren. Auch Einführungen in das Thema Machine Learning wie d2l.ai nutzen interaktive Jupyter-Notebooks (siehe ix.de/z45h). Profis schätzen Notebooks, wenn sie schnell einen Prototypcode testen oder Daten auswerten wollen. Die Daten lassen sich einfach transformieren und bereinigen. Außerdem können sie direkt den passenden Programmcode dazu erstellen, um die Daten weiterzuverarbeiten oder Berechnungen durchzuführen. Viele sehen Jupyter-Notebooks sogar als Ersatz von Excel-Sheets für die Datenanalyse an. Die Kombination von Daten, Programmcode und Text erlaubt es Forscherinnen und Forschern, Code und Daten mit Analysen und Hypothesen anzureichern. Profis nutzen die Notebooks neben der Datenbereinigung auch für die statistische Modellierung, das Erstellen und Trainieren von Machine-LearningModellen sowie für das Visualisieren von Daten.

Notebook-Umgebungen für Machine Learning Jupyter-Notebooks sind der De-facto-Standard für das Prototyping und den Zugriff auf Machine-Learning-Angebote in der Cloud. Der Artikel gibt einen Überblick über die NotebookUmgebungen der verschiedenen Cloud-Anbieter und zeigt, wie man Jupyter-Notebooks auch lokal ausführen kann. Von Kay Glahn Ȗ Jupyter Notebook ist eine interak­ tive Umgebung, mit der sich JupyterNote­book-Dokumente erstellen und anzeigen lassen. Zumeist im Webbrowser und teilweise auch eingebettet in Entwicklungsumgebungen ausgeführt, erlauben sie, D ­ aten interaktiv auszuwerten  und zu berechnen. Zunehmend setzen Data Scientists sie auch für Machine Learning ein. In Jupyter-Notebooks lässt sich Python-Code im Webbrowser interpretieren, ohne dass eine Installation auf dem lokalen Rechner erforderlich ist. Der große Vorteil von Jupyter-Notebooks ist, dass sich damit interaktive Dokumente erstellen und teilen lassen, die neben Livecode auch Gleichungen, Berechnungsausgaben samt Visualisierung und Multimediainhalte mit erklärendem Text enthalten. Obwohl Computational Notebooks wie in Wolfram Mathematica seit Jahrzehnten existieren, setzten sie sich erst mit den Jupyter-Notebooks im großen Stil durch (siehe ix.de/z45h). Jupyter-Notebooks eignen sich für Einsteiger und Profis. Für Einsteiger sind

sie interessant, weil sie eine einfache und klare Struktur haben. Mit kommentiertem Beispielcode sind komplexe Aufgaben auch ohne oder mit nur geringen Programmierkenntnissen zu bewältigen. Zudem lässt sich der Programmcode in den Notebooks direkt ausführen, ohne dass man ihn erst langwierig kompilieren muss. Das macht Notebooks auch für Schulen, Universitäten und Onlinekurse in­teressant: Die Codebeispiele sind direkt in den Text integrierbar und der Programmcode lässt sich abändern und so-

Open Source und offen für viele Sprachen Die gemeinnützige Organisation Project Jupyter entwickelt neben weiteren Projekten die Jupyter-Notebook-Umgebung. 2014 gründete Fernando Pérez Project ­Jupyter als Ausgliederung aus dem Projekt IPython mit dem Ziel, Open-SourceSoftware, offene Standards und Services für interaktives Arbeiten mit vielen Programmiersprachen zu entwickeln. Die drei ursprünglich berücksichtigten Programmiersprachen sind Julia, Python und R, aus deren Anfangssilben Ju – Pyt – R sich auch der Name des Projektes ableitet. Gleichzeitig sind der Name und das dazugehörige Logo eine Hommage an Galileo Galileis Notizbucheinträge zur Entdeckung der Jupitermonde, bei denen Ga­ lileo Beobachtungen und Messdaten zusammen mit Metadaten in seinem Notizbuch festhielt. Das früher auch als IPython Notebook bekannte Jupyter Notebook ist heute sprachunabhängig und beherrscht neben

1-TRACT ȫ Jupyter Notebook ist eine interaktive Umgebung zum Bearbeiten und Ausführen von Notebook-Dokumenten. ȫ Weil Jupyter-Notebooks einfach aufgebaut sind, können auch Personen mit wenig Programmierkenntnissen sie nutzen. ȫ Profis verwenden Notebooks, um Machine-Learning-Modelle zu trainieren und Daten zu visualisieren. ȫ Jupyter-Notebooks sind in der Cloud und lokal nutzbar.

58

iX Special 2023 – KI © Copyright by Heise Medien.

den ursprünglichen Sprachen mithilfe von Kernels inzwischen weit über hundert Sprachen wie Haskell, Ruby, Java, MATLAB und Scala. Es stellt Python standardmäßig über den IPython-Kernel bereit, der unabhängig weiterentwickelt wird und als Kommandozeileninterpreter zum interaktiven Arbeiten mit der Programmiersprache Python auch Grund­ lage für die Python-Shell ist. Die JupyterNote­book-Umgebung steht unter einer modifizierten BSD-Lizenz bereit. Sie soll laut Aussage von Project Jupyter immer  zu hundert Prozent Open-SourceSoftware bleiben und für jeden frei nutzbar sein. Ein Jupyter-Notebook besteht aus einer Liste von Eingabe- und Ausgabezellen, die Code, Text oder Plots enthalten können. Bei Textzellen sind MarkdownCode oder mathematische Formeln erlaubt. Codezellen führt das JupyterNote­book nicht automatisch der Reihenfolge nach aus, sondern Nutzer entscheiden, wann es welche Zelle ausführt. Ein Ju­pyter-Notebook ist aus der Weboberfläche heraus in verschiedene Formate wie HTML, PDF oder LaTeX exportierbar. Hierbei gehen zwar die interaktiven Eigenschaften verloren, aber Inhalte und generierte Ausgaben bleiben erhalten. Technisch gesehen ist ein JupyterNotebook-Dokument eine JSON-Datei

JupyterLab ist die nächste Generation der Jupyter-Notebook-Umgebung (Abb. 1). mit der Dateinamensendung .ipynb, die ein versioniertes Schema enthält. Weitere Open-Source-Projekte von Project Jupyter sind JupyterLab, Binder, JupyterHub und Voilà. JupyterLab entwickelt die nächste Generation User Interfaces für Jupyter-Notebooks. Es enthält einen erweiterten Funktionsumfang und erlaubt, mehrere Jupyter-Notebooks in einem Browserfenster zu bearbeiten,

sodass es bereits mehr an eine IDE erinnert (Abbildung 1). Das Projekt Binder bietet einen Onlinedienst, der interak­ tive  Jupyter-Notebooks bereitstellt. Es kann aus mehreren Notebooks eine Konfiguration einer virtuellen Maschine erzeugen und stellt dafür einen Link zur Verfügung, über den sich die Notebooks nutzen lassen. JupyterHub ist eine Onlineumgebung, in der mehrere Autoren

Mit SageMaker Studio Lab erhält man einen kostenlosen Einstieg in Amazons Notebook-Welt (Abb. 2). 59

iX Special 2023 – KI © Copyright by Heise Medien.

Quelle: Google

Werkzeuge | ML-UI

Mit Colab von Google Research ist das erste Jupyter-Notebook schnell erstellt (Abb. 3). an Jupyter-Notebooks arbeiten können. Voilà schließlich konvertiert JupyterNote­ books in ein interaktives Dashboard, das Anwender als Website bereitstellen können, um Ergebnisse mit anderen im Web zu teilen. Da sich Jupyter-Notebooks im Bereich Machine Learning und Data Science inzwischen als De-facto-Standard durch­ gesetzt haben, haben auch die großen Cloud-Plattform-Anbieter Jupyter-Notebooks oder Derivate mit Zusatzfunktionen als Frontend für ihr Machine-Learning-Angebot in der Cloud eingeführt. Hierzu gehören Amazon SageMaker, Goo-

gle Colab und Microsoft Azure Machine Learning Notebooks. Doch auch Ent­ wicklungsumgebungen wie Visual Studio Code von Microsoft oder PyCharm von JetBrains gestatten inzwischen, Jupyter-­ Notebooks zu integrieren und somit Code beispielsweise zum Prototyping interaktiv auszuführen.

Amazon SageMaker Studio Lab Amazon erlaubt in seiner webbasierten Machine-Learning-Umgebung Sage­ Maker Studio, Jupyter-Notebooks zu nutzen. Sie ist Bestandteil von AWS und

wird kostenpflichtig angeboten. Gleichzeitig bietet Amazon aber mit SageMaker Studio Lab auch eine abgespeckte, kostenlose Variante seiner Umgebung an (Abbildung  2). Hierüber erhalten Nutzer Zugriff auf AWS-Compute-Ressourcen, ohne dass sie einen AWS-Account be­nötigen. Weil die Umgebung das quelloffene JupyterLab nutzt, sind neben ­Jupyter-Notebooks auch zahlreiche quelloffene Jupyter-Erweiterungen verwendbar. Wer den vollen Umfang von Amazon SageMaker nutzen möchte, muss auf die kostenpflichtige Variante zurückgreifen. Sie bietet beispielsweise Funktionen wie Continuous Integration und Continuous Delivery via SageMaker Pipelines an und erlaubt, SageMaker Data Wrangler für die Datenaufbereitung und SageMaker Ground Truth für das Labeln von Daten zu nutzen. Außerdem liefert sie eine umfangreichere Zugangskontrolle und Sicherheitsfunktionen, die durch das Einbinden von AWS Identity and Access Management (IAM), Amazon Virtual Private Cloud (Amazon VPC) und AWS Key Management Service (AWS KMS) möglich werden. Auch Estimators und eingebaute SageMaker-Algorithmen sind nur in der kostenpflichtigen Variante enthalten. Sage­MakerNotebook-Instanzen unterstützen R mit einem vorinstallierten R-Kernel. Auch eine R-zu-Python-Schnitt­stelle ist berücksichtigt, sodass man das SageMaker Python SDK aus einem R-Skript heraus nutzen kann.

Notebooks in Microsoft Azure Machine Learning Studio (Abb. 4). 60

iX Special 2023 – KI © Copyright by Heise Medien.

Über ein Plug-in integriert Visual Studio Code Notebooks sowie lokale und Remote-Kernel (Abb. 5). Will man das Angebot von Amazon ausprobieren, kann man mit der SageMaker-Lab-Notebook-Umgebung anfangen und später bei Bedarf seine Projekte nach SageMaker Studio exportieren. Das ist vor allem dann erforderlich, wenn man garantierte und leistungsstarke Compute-Instanzen benötigt. Die Amazon SageMaker Studio Lab Runtime basiert auf einer AWSEC2-Instanz, die mit 15 GByte Festplattenspeicher und 16 GByte RAM ausgestattet ist. Die Verfügbarkeit der Compute-Instanzen ist allerdings nicht garantiert und hängt von der aktuellen Nachfrage ab. Auch die Rechenzeit ist eingeschränkt: Bei einer CPUbasierten Compute-Instanz auf 12 Stunden und bei einer GPUbasierten Compute-Instanz auf 4 Stunden. Wer mehr Speicher und Rechenleistung oder -zeit braucht, sollte über einen Wechsel zu Amazon SageMaker Studio nachdenken. Um Zugang zu SageMaker Lab zu erhalten, braucht es einen separaten Account, den Amazon zurzeit via Warteliste an Interessenten vergibt. Ein bestehender AWS-Account ist nicht nutzbar. Laut Amazon wird der Account üblicherweise innerhalb von ein bis fünf Arbeitstagen genehmigt. In der Praxis hat sich allerdings gezeigt, dass die Freigabe auch mehr als zwei Wochen dauern kann. Will man SageMaker Studio für Machine-LearningVeranstaltungen wie Workshops, Hackathons oder Kurse verwenden, kann man Referal-Codes bei Amazon beantragen, mit denen Antragsteller eine Anfrage für einen Account stellen können, der dann automatisch sofort genehmigt wird. In Amazon SageMaker kann man entweder mit SageMaker Studio Notebooks arbeiten oder von SageMaker aus auf Notebook-Instanzen zugreifen. SageMaker Studio Notebooks haben den Vorteil, dass Jupyter-Notebooks per Mausklick schnell hochgefahren, die Compute-Ressourcen flexibel bereitgestellt und die Notebooks einfach mit anderen geteilt werden können. Außerdem ist immer automatisch die neueste Python-Version

vorinstalliert. Notebook-Instanzen hingegen sind eigenständige Compute-Instanzen, die eine Jupyter-Notebook-Anwendung ausführen. Amazons SageMaker Studio Lab ist kostenlos, und auch die Amazon-SageMaker-Studio-Entwicklungsumgebung kann man mit einem AWS-Account kostenlos nutzen. Sobald man dort allerdings Rechenleistung oder Speicher in Anspruch nimmt, fallen Kosten an. Sie sind für SageMaker Studio Notebooks und Notebook-Instanzen identisch.

Google Colab Auch Google bietet eine entsprechende Notebook-Umgebung an. Colaboratory (kurz Colab) ist ein cloudbasierter JupyterNotebook-Service von Google Research, der im Wesentlichen

61

iX Special 2023 – KI © Copyright by Heise Medien.

Werkzeuge | ML-UI

Rechenressourcen für Jupyter-Notebooks und Google Drive als Speicher anbietet (Abbildung  3). Er hat seinen Ursprung in einer Zusammenarbeit zwischen Google und dem Jupyter Project im Jahr 2014, die das Ergebnis unter ­colaboratory.jupyter.org zur Verfügung stellten. Seitdem wurde Colab konti­ nuierlich weiterentwickelt – vor allem durch interne Anforderungen von Google. In der Vergangenheit hat Google Research den Dienst kostenlos inklusive GPUs bereitgestellt. Allerdings sind die angebotenen Ressourcen nicht garantiert und stehen auch nicht unbegrenzt zur Verfügung. Zudem variieren die Nutzungseinschränkungen je nach Auslastung. Jupyter Notebook integriert zwar viele Sprachen über den jeweiligen Kernel, Google erlaubt derzeit aber nur Py­thon-3-­ Code innerhalb von Colab-Notebooks. Notebooks mit älterem Python-2-Code sind zu migrieren. Inzwischen hat Google den kosten­ losen Service eingeschränkt und bietet mit Colab Pro auch eine kostenpflichtige Variante an. Während das kostenlose Angebot die Laufzeitumgebung beendet, wenn sie sich im Leerlauf befindet, und maximal für 12 Stunden ausführt, lässt sich mit Colab Pro oder Pro+ die Verfügbarkeit erhöhen. Die Laufzeit hängt dann vom Kontostand der Compute-Units ab, die man vorab erwerben muss. So kann man mit Colab Pro+ die Umgebung 24 Stunden ununterbrochen ausführen, sofern die Compute-Units ausreichen. Wer komplett unabhängig sein will und keine Einschränkungen bei der Verfügbarkeit und der Rechenzeit haben möchte, kann über den GCP Marketplace eine dedizierte virtuelle Maschine mieten und sie in Google Colab einbinden. Dadurch hat man volle Kontrolle über Eigenschaften wie CPU, GPU und Speicher der virtuellen Maschine. Allerdings muss man sich selbst um deren Lifecycle kümmern und sie auch selbst hoch- und wieder he­ runterfahren, damit keine weiteren Kosten anfallen. Colab Pro kostet derzeit 11,01 Euro und Colab Pro+ 50,28 Euro im Monat. Bei der Pay-as-you-go-Variante kann man für den gleichen Betrag einmalig 100 beziehungsweise 500 Compute-Units erwerben und frei verwenden. Bei Abos sind sie im monatlichen Preis enthalten, verfallen aber nach neunzig Tagen. Google bietet unabhängig davon auch die Google-Cloud-Vertex-AI-Umgebung in GCP an, die besser skalierbar und eher auf den Produktionsbetrieb ausgerichtet ist. In der Vertex AI Workbench kann

man User Managed Notebooks erstellen, die bisher auch als Google Cloud AI Notebooks bekannt waren. Hierbei wird eine JupyterLab-Umgebung auf einer VM bereitgestellt, die sich individuell konfigurieren lässt und neben der Nutzung von GPUs auch den Zugriff auf Googles hauseigene TPUs (Tensor Processing Unit) ermöglicht.

Microsoft Azure Notebooks Wie Amazon und Google unterstützt auch Microsoft die Jupyter-Notebooks in seinen Produkten. Neben der Bereitstellung über GitHub Codespaces und die Integration in GitHub – das inzwischen ebenfalls zu Microsoft gehört – lassen sich Juypter-Notebooks via Plug-in auch in Microsofts Visual Studio Code einbinden. Doch dazu später mehr. Der zentrale Ort, Juypter-Notebooks bei Microsoft zu nutzen, ist Azure Machine Learning. Die Machine-LearningPlattform erlaubt es, Modelle auf Microsofts Cloud-Plattform Azure zu erstellen und zu deployen. Zentraler Bestandteil ist hierbei auch die Implementierung von Notebooks, die auf einer VM oder einer geteilten Cluster-Computing-Umgebung ausführbar sind. Notebooks lassen sich direkt in Azure Machine Learning Studio bearbeiten, sodass man nicht Jupyter oder JupyterLab aufrufen muss (Abbildung 4). Grundlage ist eine Compute-Instanz – eine sichere, cloudbasierte Azure-Workstation, die einen Jupyter-Notebook-Server, JupyterLab und eine komplett durch Azure verwaltete Machine-Learning-Umgebung enthält. Der Vorteil: Eine Compute-Instanz lässt sich mit den gewünschten Eigenschaften wie CPU und Speichergröße erstellen, ohne dass weitere Installa­ tions- und Konfigurationsschritte erforderlich sind, um sie in Betrieb zu nehmen und zum Ausführen von JupyterNotebooks zu nutzen. Man kann dann entweder über den Browser auf Jupyter oder JupyterLab der Machine-LearningCompute-Instanz zugreifen oder sie für die Ausführung eines in Azure Machine Learning Studio integrierten Notebook nutzen. Alternativ kann man über die AzureMachine-Learning-Erweiterung für Vi­ sual Studio Code auch ein in Visual Studio Code bearbeitetes Jupyter-Notebook direkt aus der Entwicklungsumgebung he­ raus auf der Compute-Instanz in Azure ausführen. Hierbei lässt sich Visual Studio Code entweder auf einem lokalen Rechner oder auf einer virtuellen Maschine in Azure verwenden.

62

Neben dem Python-Kernel ist auf Azure-Compute-Instanzen zudem ein ­R-Kernel verfügbar, sodass sich im jeweiligen Ju­ pyter-Notebook auch R-Code ausführen lässt, wenn man den entsprechenden Kernel auswählt. Die NotebookUmgebung in Azure Machine Learning Studio bietet einige nützliche Zusatzfunktionen an, zu denen IntelliSense gehört, das eine Codevervollständigung sowie die Anzeige von Members, Parameter Info und Quick Info bietet. Außerdem lassen sich Notebooks mit anderen Nutzern des Workspace teilen und kommentieren. Über die Funk­tion Snippets sind kurze Codevorlagen in das Notebook einfügbar. Neben Notebooks kann man auch Checkpoints mit einem Namen speichern. Der Vorgang sichert die aktuelle Version des Notebooks, zu der man später zurückkehren kann. Das Kostenmodell für Azure Notebooks ist etwas komplizierter. Bei Microsoft zahlt man eine zeitabhängige Gebühr für die VM der Compute-Instanz, die von der Anzahl der Prozessoren und des Arbeitsspeichers abhängig ist. Hinzu kommen eine temporäre Festplatte und die vom obligatorischen Loadbalancer ver­ arbeiteten Daten. Zusätzlich zahlt man aber auch für eine SSD und das Bereitstellen des Loadbalancers für die Compute-Instanz, die auch dann Kosten generieren, wenn die Compute-Instanz nicht ausgeführt wird. Den größten Posten macht hier die SSD aus, die automatisch als Premium SSD P10 LRS Managed Disk mit 128 Gibibyte konfiguriert wird, ohne dass man es ändern kann. Das allein schlägt mit 20,57 Euro pro Monat zu Buche, selbst wenn die Compute-Instanz nicht läuft. Für Azure Machine Learning Studio ist ein Azure Machine Learning Workspace erforderlich. Die dafür angelegten Ressourcen Key Vault, Application Insights, Azure Storage und Azure Container Registry generieren ebenfalls laufende Kosten.

Weitere Anbieter mit gehos­ teten Notebook-Umgebungen Neben den drei großen Cloud-Anbietern gibt es weitere Anbieter, die gehostete Notebook-Umgebungen im Angebot haben. Hierzu gehören neben Kaggle und Paperspace auch IBM mit Watson Studio, Deepnote, Anaconda Nucleus und JetBrains Datalore. Kaggle gehört seit 2017 zu Google und ist in erster Linie eine Onlinecommunity für Datenwissenschaftler, die Wettbewerbe für Machine-LearningProjekte ausschreibt. Die Wettbewerbe iX Special 2023 – KI

© Copyright by Heise Medien.

Jupyter-Notebooks lokal installieren Wer Jupyter-Notebooks lokal statt in der Cloud nutzen will, braucht einen lokalen Jupyter-Notebook- oder JupyterLab-Server. Um ihn zum Laufen zu bringen, installiert man am besten zunächst die aktuelle Python-Version und lädt dann mithilfe des Package Manager für Python-Packages (pip) die erforderlichen Jupyter-Packages herunter. Als Erstes lädt man Python von der offiziellen Website (python.org/ downloads/) herunter und installiert es. Danach nutzt man pip, um entweder JupyterLab oder Jupyter Notebook zu installieren.

JupyterLab JupyterLab mit pip auf der Kommandozeile installieren:

Python311\Scripts zum Pfad hinzufügen, damit sich die Jupyter-Server aus einem beliebigen Verzeichnis heraus starten lassen. Im Startverzeichnis werden dann auch die Jupyter-Notebooks abgelegt. Nach dem Start auf der Kommandozeile öffnet sich ein Webbrowser mit der passenden URL. Sollte das nicht der Fall sein, findet man in der Ausgabe der Kommandozeile eine URL wie http:// localhost:8888/lab?token=xyz, die einen Token oder eine HTMLDatei beinhaltet, die man dann im Browser öffnen kann. Den Server beendet man auf der Kommandozeile mit der Tastenkombination STRG + C oder im entsprechenden Menüpunkt der NotebookUmgebung.

Anaconda

pip install jupyterlab

Danach lässt sich JupyterLab mit folgendem Kommando auf der Kommandozeile starten: jupyter-lab

Jupyter Notebook Jupyter Notebook mit pip auf der Kommandozeile installieren: pip install notebook

Dann mit folgendem Kommando auf der Kommandozeile starten: jupyter notebook

Ist Anaconda fertig installiert, kann man entweder den Anaconda Navigator in Gang setzen und nach dessen Update JupyterLab oder Jupyter Notebook aus der grafischen Oberfläche heraus starten oder alternativ die oben genannten Kommandozeilenbefehle verwenden. Dafür sollte man aber unter Windows einen speziellen Anaconda Command Prompt nutzen, weil er den passenden Pfad enthält. Den Anaconda Command Prompt erreicht man entweder über den Anaconda Navigator oder unter Windows über das Startmenü. Bei der Installation wird ein entsprechender Link angelegt. Unter Linux und macOS öffnet man ein Terminal und gibt die Kommandozeilenbefehle zum Starten von JupyterLab oder Jupyter Notebook direkt ein.

Quelle: Anaconda

Damit alles reibungslos funktioniert, muss man unter Windows darauf achten, dass der Pfad richtig gesetzt ist. Sowohl das PythonVerzeichnis als auch das Scripts-Verzeichnis müssen im Pfad eingebunden sein. Wenn man unter Windows Python für alle User unter C:\Program Files\ installiert hat, kann es sein, dass der Package Manager die Juypter-Dateien im User-Verzeichnis ablegt. Dann muss man eventuell noch %USERPROFILE%\AppData\Roaming\Python\

Alternativ kann man JupyterLab und Jupyter Notebook auch komfortabel mit Anaconda auf Linux, macOS oder Windows installieren, was eine komplette Data-Science-Umgebung inklusive Python Packages lokal aufsetzt (Abbildung 6). Hierfür lädt man zunächst das Anaconda-Installationspaket für das gewünschte Betriebssystem herunter: anaconda.com. Bei der Installation sollte man darauf achten, den Windows-Pfad für Python nicht setzen zu lassen, da Anaconda den Pfad lieber selbst verwaltet.

Anaconda erleichtert das Installieren lokaler Notebook-Umgebungen (Abb. 6). 63

iX Special 2023 – KI © Copyright by Heise Medien.

Werkzeuge | ML-UI

sind mit einem Preisgeld versehen und die Community bearbeitet sie. Doch Kaggle bietet auch eine kostenlose NotebookUmgebung an, auf der man Jupyter-Notebooks bearbeiten kann. Hierbei handelt es sich aber nicht nur um einen einfachen Codeeditor: Nutzer haben auch Zugriff auf interaktive Sessions, die in einem ­Docker-Container mit vorinstallierten Packages ausgeführt werden. Man kann Notebooks mit anderen Teilnehmerinnen und Teilnehmern des Wettbewerbs teilen und auf versionierte Datenquellen zugreifen. Hierdurch erhält man auch kostenlosen Zugriff auf CPUs, GPUs und TPUs. Aber auch hier ist die Verfügbarkeit beschränkt, sodass man bei hoher Auslastung in eine Warteschlange gestellt wird. Außerdem sind die Ressourcen auf 12 Stunden Rechenzeit für CPU- und GPU-Notebook-Ses­ sions und 9 Stunden Rechenzeit für TPUNotebook-Sessions sowie der Festplattenspeicher auf 20 GByte beschränkt. Will man garantierte Ressourcen zur Verfügung haben, verweist Kaggle auf Google Vertex AI Workbench. Die Firma Paperspace bietet mit Gradient eine Cloud-Plattform zum Erstellen von Machine-Learning-Anwendungen an. Auch hier sind Jupyter-Notebooks und der Zugriff auf Rechenressourcen Kernbestandteil der Plattform. Neben GPUs hat man mit GradientNotebooks auch Zugriff auf IPUs (Intelligence Processing Units) – spezielle auf Machine Learning optimierte, von der Firma Graphcore entwickelte Hardwarebeschleuniger, die sich aus JupyterNotebooks heraus nutzen lassen. Gradient bietet hierfür entweder ein vorkonfiguriertes Template oder ein eigenes individuelles Docker Image an. Die Rechenzeit für Notebooks ist für kostenlose Instanzen auf 6 Stunden beschränkt und das auch nur, solange ausreichend Kapazitäten zur Verfügung stehen. Wer mehr und zugesicherte Rechenzeit benötigt, muss auf ein kostenpflichtiges Abo umsteigen, das umgerechnet ab etwa 7 Euro im Monat zu haben ist. Auch IBM bietet auf seiner CloudPlattform Cloud Pak for Data as a Service innerhalb von Watson Studio an, JupyterNotebooks zu nutzen. Watson Studio ist Bestandteil der IBM Watson Machine Learning Data Pipeline. Man erhält eine komplette Low-Code-Umgebung zum Erstellen von Machine-Learning-Modellen und zur Integration von IBMs MachineLearning-APIs. Vor allem, wenn man bereits Watson Studio und die zugehörigen APIs verwendet, ist die darin eingebettete Notebook-Umgebung sinnvoll.

Deepnote stellt ein Collaborative D ­ ata Notebook für Python, SQL und No-CodeTools auf seiner Cloud-Plattform bereit. Auch hier gibt es eine kostenlose Variante und ein kostenpflichtiges Team­abo, das mit etwa 36 Euro pro Monat zu Buche schlägt. Auch Anaconda, das vielen PythonEntwicklern durch die Installations­ packages für die Python-Umgebung bekannt sein dürfte, bietet seit Kurzem eine Cloud-Plattform namens Anaconda Nu­ cleus für Entwickler an. Hier sind neben in der Cloud gehosteten JupyterLab-In­ stanzen nutzungsfertige Anaconda-Umgebungen und Hunderte vorinstallierte Packages wie NumPy, pandas, Matplotlib, SQLite, Bokeh, HoloViews, seaborn und Panel verfügbar. Man kann mit einem kostenlosen Account einsteigen und bei Bedarf ein Abo abschließen, um den vollen Funktionsumfang und den persistenten Speicher zu nutzen. JetBrains bietet mit Datalore ebenfalls eine kollaborative Data-Science-Plattform in der Cloud an, deren zentraler Bestand­teil ebenfalls Juypter-Notebooks sind. Neben Python beherrscht Datalore auch SQL, R, Scala und Kotlin. Der Editor erlaubt den schnellen Zugriff auf Tools und verbundene Datenquellen, automa­ tische Visualisierung, Statistiken zu den Datasets, Report Builder, Environment Manager und Versionierung. Es gibt eine  kostenlose Version für den privaten ­Gebrauch und eine Professional-Version im Abomodell. Im Enterprise-Abo können Firmen alternativ die Plattform auch selbst hosten.

Lokal statt Cloud: Notebooks in eine IDE integrieren Will man Jupyter-Notebooks lieber lokal statt in der Cloud ausführen, integriert man sie in eine Entwicklungsumgebung. Hierfür eignen sich vor allem Microsoft Visual Studio Code, JetBrains PyCharm und die als Open Source verfügbare Python-Entwicklungsumgebung Spyder. In Visual Studio Code bindet man Jupyter-Notebooks über das Plug-in Jupyter Extension for Visual Studio Code ein (Abbildung 5). Dadurch erhält man eine Ankopplung an die Sprachkernels. Die Python-Umgebung, die separat beispielsweise via Anaconda zu installieren ist, lässt sich dann als Jupyter-Kernel nutzen. Die Jupyter Extension installiert automatisch die Extensions Jupyter Keymap, Jupyter Notebook Renderers, Jupyter Cell Tags und Jupyter Slide Show. Für weitere, experimentelle Features bietet sich die Jupyter PowerToys Extension

64

an. Die Jupyter Extension für Visual Studio unterstützt neben Python auch Julia, R und C#. Zusätzlich zu den StandardNotebook-Funktionen stellt Visual Studio Code auch die Codevervollständigung via IntelliSense bereit. Auch die Python-Entwicklungsumgebung PyCharm von JetBrains unterstützt Jupyter-Notebooks, allerdings nur in der Professional Edition. Diese bietet die Zusatzfunktionen der IDE wie Auto­ ­ vervollständigung, Navigation und Error Checking auch für Jupyter-Notebooks an. Bei der kostenlosen Community Edition fehlt die Option, Notebooks einzubinden, und in der Professional Edition sind nur lokale Jupyter-Notebooks möglich. Will man auch auf Remote-Notebooks zugreifen, benötigt man DataSpell, JetBrains’ Entwicklungsumgebung für Data Scientists. Unter Data Scientists kennt man Spyder. Auch hier lassen sich nach der Installation des Spyder-Notebook-Plug-ins Jupyter-Notebooks verwenden, allerdings nur Grundfunktionen. Mit Spyder File Switcher kann man aber eine IPythonKonsole mit dem Kernel des aktuellen Notebooks verbinden und somit beispielsweise die Variablen des Notebooks im Variable Explorer einsehen.

Fazit Es gibt zahlreiche Möglichkeiten, Jupyter-Notebooks zu nutzen. Welche Variante die richtige ist, hängt stark vom jeweiligen Einsatzzweck ab. Oft bietet es sich an, mit einer lokalen (siehe Kasten „Jupyter-Notebooks lokal installieren“) oder einer kostenlosen Jupyter-Umgebung in der Cloud zu starten und nur bei Bedarf – beispielsweise zum Trainieren eines Machine-Learning-Modells – Rechenleistung von einem Cloud-Anbieter in Anspruch zu nehmen. Durch das einheit­ liche Format der Jupyter-Notebooks ist dies problemlos möglich.  ([email protected]) Quellen Links zu den Quellen und BeispielNotebooks sind unter ix.de/z45h zu finden.

KAY GLAHN ist freiberuflich als strategischer und technischer Berater im Bereich neuer und disruptiver Technologien für internationale Kunden tätig. iX Special 2023 – KI

© Copyright by Heise Medien.

© Copyright by Heise Medien.

Werkzeuge | Data Science

keit, verschiedene Verfahren zu testen, um sich schrittweise einem passenden Ergebnis anzunähern. Die Bibliothek wird in der Praxis überwiegend für statistische Verfahren verwendet. Darüber hinaus bietet sie eine Möglichkeit zum Trainieren neuronaler Netze, ist für diesen Bereich jedoch eher für schnelle Tests und einfache Architekturen und weniger für komplexe Anwendungen geeignet. Für beide Anwendungsgebiete gibt es umfangreichere Frameworks und Bi­bliotheken – TensorFlow oder PyTorch (siehe „Einstieg in PyTorch“ ab Seite 50) für neuronale Netze, oder StatsModels für anspruchsvollere statistische Verfahren. Aber scikit-­learn vereint alles einsteigerfreundlich unter einem Dach und ermöglicht es, kom­plette Workflows abzubilden.

Modulare Komponenten

Mit scikit-learn Modelle erstellen Wer schnell in das Thema Machine Learning einsteigen will, findet in scikit-learn ein verlässliches Werkzeug. Die Python-Bibliothek eignet sich zum Aufbereiten von Daten und hilft auch beim Entwickeln und Trainieren erster Modelle. Von Alina Dallmann Ȗ Die Machine-Learning-Bibliothek scikit-learn ist in der Python-Welt weit verbreitet. Sie hilft beim Lösen verschiedener Probleme und ist primär für tabellarische Daten ausgelegt. Das Verarbeiten von Text- und Bilddaten ist aber eben-

falls möglich. scikit-learn bietet eine einheitliche Schnittstelle für verschiedene Arten  von Datentransformationen und Machine-Learning-Algorithmen. Dies ermöglicht Interessierten eine steile Lernkurve und gibt ihnen zudem die Möglich-

1-TRACT ȫ Die Python-Bibliothek scikit-learn eignet sich für den schnellen Einstieg in Datentransformation und Machine-Learning-Algorithmen. ȫ Die vielfältigen Statistik- und ML-Methoden lassen sich gleich oder sehr ähnlich ansprechen. ȫ Am Anfang des Machine-Learning-Prozesses stehen wichtige Entscheidungen: das Bereinigen der Daten und die Auswahl des passenden Algorithmus für Daten und Fragestellung. ȫ Probleme wie Overfitting oder Information Leakage lassen sich leicht verhindern, wenn man ein paar Grundsätze beachtet.

66

Die Bestandteile von scikit-learn decken den gesamten Ablauf beim Entwickeln eines Machine-Learning-Modells ab. Das reicht vom Vorverarbeiten der Daten über die Modellauswahl und das Training bis hin zur Evaluation. Für alle Bereiche gibt es verschiedene Klassen. Eine Klasse kann beispielsweise eine bestimmte Art der Datentransformation darstellen: So erlaubt die Klasse MinMaxScaler etwa das Skalieren von Daten in einem bestimmten Wertebereich. Andere Klassen repräsentieren einen bestimmten Modelltyp, wie LinearRegression. Diese Klassen erfüllen zwar teilweise unterschiedliche Zwecke, haben j­edoch  gemeinsame Methoden. fit(X[, y]) dient zum Berechnen von Parametern einer Datentransformation, meist basierend auf Trainingsdaten, oder zum Trainieren eines Algorithmus. transform(X[, y]) / predict(X) führt Datentransformationen nach dem Fitting durch oder erstellt eine Vorhersage mit einem trainierten Modell. X und y entsprechen dabei numpy-­ Arrays oder pandas-Data­Frames/-Series. Bei einem MinMaxScaler bedeutet der Aufruf von fit(), dass das Programm die minimalen und maximalen Werte für jede Spalte eines pandas-DataFrames extrahiert. Mit transform() lassen sich diese extrahierten Werte auf einen anderen Wertebereich anwenden. Anwenderinnen können diese Skalierung für Daten mit den gleichen Spalten übernehmen. Darüber hinaus enthält scikit-learn weitere Funktionen und Klassen, die nicht diesem Schema folgen. Dennoch haben Funktionen mit ähnlichen Aufgaben meistens das gleiche Interface, etwa Funktionen zum Berechnen von Metriken, die oft sowohl iX Special 2023 – KI

© Copyright by Heise Medien.

Ausschnitt aus einem pandas-DataFrame, der einen Datensatz mit gebrauchten Autos zeigt (Abb. 1). wahre als auch vorhergesagte Werte als Inputvariablen verarbeiten und einen Output haben.

Beispieldatensatz und Datenvorverarbeitung Die Beispiele im Verlauf dieses Artikels basieren auf einem Datensatz von gebrauchten Autos (siehe ix.de/zhwj). Dieser Datensatz enthält Informationen wie gefahrene Kilometer, Farbe, Zustand, Jahr der Erstzulassung und Preis. Abbildung 1 zeigt einen Ausschnitt aus dem zugehörigen pandas-DataFrame. Zur Demonstration soll das Beispiel den Verkaufspreis anhand der vorhandenen Daten vorhersagen. Der eigentliche Datensatz enthält über 400 000 Einträge. Zum Vereinfachen des Datensatzes finden aber nur die 20 Automodelle mit den meisten Einträgen Berücksichtigung. Nach dem Filtern von Outliern bleiben etwa 32 700 Einträge übrig (siehe Code auf GitHub unter ix.de/zhwj, getestet mit scikit-learn-Version 1.2.1). Bevor ein Algorithmus die Daten zum Lernen nutzen kann, bedarf es einiger Datenverarbeitungsschritte, wie • Normalisieren, • Konvertieren in andere Datentypen, • Diskretisieren, • Umgang mit undefinierten Werten (NAN), • Hinzufügen zusätzlicher Features, • Auswahl der relevantesten Features. scikit-learn kennt dafür einige Klassen, die verschiedene Datentransformationen ermöglichen. Eigene Transformationen lassen sich ebenfalls einfach integrieren. Für einen fairen Vergleich verschiedener

Ansätze teilt der folgende Code den Autodatensatz in einen Trainings- und einen Testdatensatz auf: from sklearn.model_selection ↵  import train_test_split X_train, X_test, y_train, y_test ↵  = train_test_split( df.drop(columns=["price"]), ↵  df["price"], test_size↵=0.2,↵  random_state=42)

Der Datensatz enthält sowohl Kategorieals auch Zahlenspalten. Eine Möglichkeit, in einem Regressionsmodell mit kate­gorischen Variablen umzugehen, ist ein One-Hot-Encoding (Klasse OneHot Encoder in scikit-learn). Zu Demonstra­ tions­zwecken lässt sich hier gut das Alter aus dem Jahr der Erstzulassung berechnen. Diese Datentransformation erfordert eine benutzerdefinierte Funktion. Sie erhält mithilfe der Klasse Function Transformer die gleichen Methoden wie integrierte Transformationen, sodass sie sich ebenfalls mit fit() und transform() aufrufen lässt. Listing 1 zeigt die genannten Transformationsklassen mit zusätzlichen Einstellungen. Ein ColumnTransformer erlaubt, die Transformationen in einem Schritt auf spezifischen Spalten des DataFrames auszu­führen. Darüber hinaus reicht die Transformation die Spalte odometer hier lediglich durch, damit sie nach dem Ausführen im DataFrame enthalten ist (siehe Listing 2). Die Trainingsdaten lassen sich nach dieser Definition in einem Schritt mit fit_transform() transformieren. Bei dieser Methode erfolgt das Fitting auf den Trainingsdaten und die Transformation auf denselben Daten in

Listing 1: One-Hot-Encoding mit benutzerdefinierter Funktion import datetime from sklearn.preprocessing import FunctionTransformer, OneHotEncoder one_hot_encoder = OneHotEncoder(dtype=int, handle_unknown="infrequent_if_exist", sparse_output=False) age_calculator = FunctionTransformer(lambda x: datetime.date.today().year - x, feature_names_out="one-to-one")

einem Schritt. Um die auf den Trainingsdaten angepassten Transformationen auf die Testdaten anzuwenden, reicht der Aufruf von transform(): train_features = column_↵ transformer.fit_transform(X_train) test_features = column_↵ transformer.transform(X_test)

Das Fitting hat nicht bei allen Transformationen einen Einfluss, beispielsweise beim Berechnen des Autoalters. Die Altersberechnung erfolgt genau gleich, unabhängig davon, ob es sich um Trainingsoder Testdaten handelt. Wer Daten skalieren will, sollte das hingegen lediglich auf den Trainingsdaten ausführen. Es ist eine gute Praxis, bei Testdaten nie fit() zu verwenden, um unerwünschte Effekte zu vermeiden. Einer dieser Effekte ist das Übertragen von Wissen aus den Testdaten (Wertebereiche) auf die Trainingsdaten beim Skalieren. Dieser Fall heißt Information Leakage. Nach den genannten Transformationen gibt es 73 Featurespalten, da jede Kategorie nach dem One-Hot-Encoding in einer Spalte steht. Eine Featureauswahl beschränkt diese Vielzahl von Spalten auf die aussagekräftigsten. Hierfür bietet scikit-­learn ebenfalls vorimplementierte Verfahren an, die sich zusätzlich durch eigene Verfahren ergänzen oder ersetzen lassen. So kann man Features mit einer zu geringen Varianz löschen (VarianceThreshold) oder die vielversprechendsten Features anhand von statistischen Metriken auswählen (etwa mit SelectKBest). Eine andere Möglichkeit ist, die besten Features nach einem Modelltraining aus-

Listing 2: Gezielte Spalten eines DataFrames transformieren from sklearn.compose import make_column_transformer column_transformer = make_column_transformer( (one_hot_encoder, category_cols), (age_calculator, ["year"]), ("passthrough", ["odometer"]), verbose_feature_names_out=False ).set_output(transform="pandas")

67

iX Special 2023 – KI © Copyright by Heise Medien.

Werkzeuge | Data Science

START

classification

kernel approximation

SVC Ensemble Classifiers

not working

not working

SGD Classifier

KNeighbors Classifier

Naive Bayes

not working

Text Data

Linear SVC

yes

Spectral Clustering

samples

yes

1) & (dg['count'] Entering new PALChain chain... def solution(): „‟„Jan has three times the number of pets as Marcia. Marcia has two more pets than Cindy. If Cindy has four pets, ↵  how many total pets do the three have?‟„‟ cindy_pets = 4 marcia_pets = cindy_pets + 2 jan_pets = marcia_pets * 3 total_pets = cindy_pets + marcia_pets + jan_pets result = total_pets return result > Finished chain. '28'

gram aided Language Model Prompting oder kurz PAL (siehe ix.de/zze9) lässt sich die Genauigkeit bei Rechenaufgaben erhöhen, indem das Modell Quellcode erzeugt, den ein Interpreter ausführt, um auf das richtige Ergebnis zu kommen. Folgende Beispielaufgabe nutzt PAL, um aus der Frage Quellcode zu generieren. Wie das mit der Kette PALChain und dem Modell code-davinci-002 von OpenAI geht, zeigt Listing 7. LangChain bringt noch eine ganze Reihe weiterer Chains für unterschiedliche Zwecke mit, die zum Ausprobieren einladen (siehe ix.de/zze9).

Gesprächshistorie und Gedächtnis Ein wichtiger Faktor beim Chatten mit großen Sprachmodellen ist deren Merkfähigkeit. Inhalte zu bereits gestellten Fragen kann sich eine Art eingebautes Gedächtnis merken und das Sprachmodell kann zu einem späteren Zeitpunkt darauf zugreifen, wenn es Informationen aus der vorangegangenen Konversation

benötigt. Auch LangChain besitzt mit der Memory-Schnittstelle ein solches Speicherkonzept. Der Speicher kann mehrere Informationen zurückgeben, etwa die neuesten n Nachrichten und eine Zusammenfassung aller vorherigen Nachrichten. Bei den zurückgegebenen Informationen kann es sich entweder um eine Zeichenfolge oder um eine Liste von Nachrichten handeln. Die einfachste Form eines solchen Speichers, das ConversationBufferMemory, dient lediglich als Puffer von vorherigen Nachrichten.

Listing 8 zeigt dessen Verwendung. Um die verschiedenen Fragen und Antworten zu speichern, kann dieser Puffer einer Chain übergeben werden, in diesem Fall einer ConversationalChain. Bekommt diese Konversation eine Frage übergeben, merkt sich der Puffer sowohl die Frage als auch die Antwort. Das ist in diesem Beispiel wichtig, da wir den gleichen Witz nicht zweimal hören wollen. Eine Weiterentwicklung dieses ein­ fachen Pufferspeichers ist das Conversa­ tionBufferWindowMemory. Es merkt sich nicht alles, sondern nur die k letzten In-

Listing 8: Verwenden des ConversationBufferMemory conversation_memory = ConversationBufferMemory(return_messages=True) conversation_buf = ConversationChain( llm=llm, memory=conversation_memory ) conversation_buf("Please tell me a joke about a cat.") conversation_buf("Do you know a joke about some other pet?") print(conversation_buf.memory.buffer)

Listing 9: Verwenden des ConversationEntityMemory conversation.predict(input="Ramon is working on a new article about LangChain for Conversational AI application ↵  development in Python.") conversation.memory.store {'Ramon': 'Ramon is working on an article about LangChain for Conversational AI application development in Python.', 'LangChain': 'LangChain is a platform for developing Conversational AI applications in Python.', 'Conversational AI': 'Conversational AI is a type of application development that uses LangChain for Python.', 'Python': 'Python is a programming language used for Conversational AI application development.'}

93

iX Special 2023 – KI © Copyright by Heise Medien.

Modelle anwenden | langchain

teraktionen und spart somit Token um den Preis, dass nicht die vollständige Konversation für das Sprachmodell sichtbar ist. Der Wert für k lässt sich im Konstruktor übergeben mit conversation_memory = Conversation↵ BufferWindowMemory(k=2)

Weitere Speicherarten für den Umgang mit Sprachmodellen konzentrieren sich auf Teilaspekte einer Konversation. So merkt sich beispielsweise das ConversationEntityMemory die vom Sprachmodell gefundenen Entitäten innerhalb des Kontextes einer Konversation (siehe Listing 9). Zuerst wird dazu wieder eine ConversationChain instanziiert, die in diesem Fall ConversationEntityMemory zum Speichern und als Prompt-Template ENTITY_MEMORY_CONVERSATION_TEMPLATE

verwendet.

conversation = ConversationChain( llm=llm, verbose=True, prompt=ENTITY_MEMORY_↵ CONVERSATION_TEMPLATE, memory=ConversationEntityMemory↵ (llm=llm) )

Wird nun die Konversation mit der ­Nutzereingabe in den Prompt gestartet,

kann das ConversationEntityMemory anschließend ausgegeben werden (siehe Listing 9).

Von Agenten und ihren Werkzeugen Agenten sind eine Weiterentwicklung der  Chains. Sie werden immer dort gebraucht, wo nicht von Anfang an klar ist, welche Prompts gegen welche externen Dienste in welcher Reihenfolge erzeugt werden müssen. Agenten registrieren dazu Tools, die auf externe Datenquellen zugreifen können. Abhängig von der Benutzereingabe entscheidet der Agent mithilfe des LLM, welche Aktion er in welcher Reihenfolge ausführt. Eine Ak­tion kann darin bestehen, ein Tool aufzurufen und die jeweilige Ausgabe zu nutzen, oder darin, eine Antwort an den Benutzer zurückzugeben. Aktuell existieren rund 18 Tools in LangChain. Neben Suchwerkzeugen für Google Search, Bing Search, Wikipedia und Wolfram Alpha lassen sich BashProzesse, einfache HTTP-GET-Requests oder IFTTT-Webhooks einbinden. Wer eigene Tools entwickeln möchte, findet in der LangChain-Dokumentation eine Anleitung (siehe ix.de/zze9).

Vier unterschiedliche Typen von Agenten stellt LangChain zur Verfügung. Der Agent zero-shot-react-description nutzt das Reasoning+Acting-Framework (oder kurz ReAct, siehe ix.de/zze9), um das zu nutzende Tool anhand von dessen Beschreibung zu bestimmen. ReAct ermöglicht es LLMs, sowohl verbale Argumentationsketten als auch Textaktionen in einer verschachtelten Weise zu erzeugen. Während die Textaktionen zu einem Beobachtungsfeedback aus dem externen Tool wie zum Beispiel einer Suchmaschine oder Wikipedia führen, beeinflussen die Argumentationsketten die externen Tools nicht. Stattdessen wirken sie sich auf den internen Zustand des LLM aus, indem sie über den Kontext nachdenken und ihn mit nütz­ lichen Informationen aktualisieren, um künftige Überlegungen und Handlungen zu unterstützen. Auch der Agent react-docstore ver­ wendet das ReAct-Framework, dieses Mal aber, um mit einem Docstore zu intera­gieren. Das ist eine Liste von Dokumenten, die entweder im Hauptspeicher existiert oder über eine API zugänglich ist. Ein Docstore muss zwei unterschiedliche ­Arten von Interaktionen ­zulassen. Mit Search wird nach Doku-

Listing 10: Einsatz des Agenten react-docstore docstore = DocstoreExplorer(Wikipedia()) tools = [ Tool( name="Search", func=docstore.search, description="Try to search for wiki page." ), Tool( name="Lookup", func=docstore.lookup, description="Lookup a term in the page" ) ] react = initialize_agent(tools=tools, llm=llm, agent="react-docstore", verbose=True) question = "What profession does Johann Wolfgang von Goethe and Friedrich Schiller in common?" react.run(question) > Entering new AgentExecutor chain... Thought: I need to search Johann Wolfgang von Goethe and Friedrich Schiller, find their professions, then find the profession they ↵ have in common. Action: Search[Johann Wolfgang von Goethe] Observation: Johann Wolfgang von Goethe (28 August 1749 – 22 March 1832) was a German poet, playwright, novelist, scientist, ↵  statesman, theatre director, and critic. His works include plays, poetry, literature..... Thought: Professions of Johann Wolfgang von Goethe are poet, playwright, novelist, scientist, statesman, theatre director, and critic. ↵  I need to search Friedrich Schiller next and find its professions. Action: Search[Friedrich Schiller] Observation: Johann Christoph Friedrich von Schiller (German: [ˈjoːhan ˈkʁɪstɔf ˈfʁiːdʁɪç fɔn ˈʃɪlɐ], short: [ˈfʁiːdʁɪç ˈʃɪlɐ] (listen); ↵  10 November 1759 – 9 May 1805) was a German playwright, poet, and philosopher. During the last seventeen years of his life ↵ (1788–1805), Schiller developed a productive, if complicated, friendship... Thought: Professions of Friedrich Schiller are playwright, poet, and philosopher. So profession Johann Wolfgang von Goethe and ↵  Friedrich Schiller have in common is playwright, poet, and philosopher. Action: Finish[playwright, poet, philosopher] > Finished chain. 'playwright, poet, philosopher'

94

iX Special 2023 – KI © Copyright by Heise Medien.

Listing 11: ChatGPT gibt zu, den aktuellen Nummer-eins-Hit nicht zu kennen prompt = "Who is this week the number one song in the German Spotify top 50 charts?" llm(prompt) AIMessage(content="As an AI language model, I don't have the ability to provide real-time information. However, you can check the ↵  current top 50 songs on the German Spotify charts to find out who the number one song is.", additional_kwargs={})

Listing 12: Google-Suche mit einem Agenten search = GoogleSearchAPIWrapper() tools = [ Tool( name = "Current Search", func=search.run, description="Simple person search" ), ] memory = ConversationBufferMemory(memory_key="chat_history") agent_chain = initialize_agent( tools, llm, agent="conversational-react-description", verbose=True, memory=memory ) agent_chain.run(input="Who is this week the number one song in the German Spotify top 50 charts?") > Entering new AgentExecutor chain...: Do I need to use a tool? Yes Action: Current Search Action Input: Number one song in the German Spotify top 50 charts Observation: Top 50 - Germany ; 1. All NightRAF Camora, Luciano ; 2. KometUdo Lindenberg, Apache 207 ; ... 3. Breaking your ↵ heartApache 207 ; 4. DaylightDavid Kushner ; 5. It then spent seven weeks at the top of the Australian ARIA Singles Chart ... Thought: Do I need to use a tool? No AI: The current number one song in the German Spotify Top 50 charts is "All Night" by RAF Camora and Luciano. > Finished chain. 'The current number one song in the German Spotify Top 50 charts is "All Night" by RAF Camora and Luciano.'

menten gesucht, mit Lookup werden Wörter in den Dokumenten gesucht und zurückgeliefert. Ein weiterer Agent ist self-ask-withsearch. Im einfachsten Fall stellt er eine Anfrage an eine Suchmaschine, um eine sachliche Antwort auf eine Fragestellung zu erzeugen. Der letzte Agent ist vom Typ conversational-react-description. Er kommt in Konversationsumgebungen zum Einsatz und benutzt Pufferspeicher, um sich an vorherige Konversations­ interaktionen zu erinnern. Wie sich ein solcher Agent ausführen lässt, zeigt Listing 10. Der erste Schritt initialisiert die Wikipedia-Such-API als Docstore und deklariert die beiden Tools Search und Look­ up  für die Nutzung durch einen react-­ docstore-Agenten. Der Agent wird dann mit dem eigentlichen Sprachmodell, den Tools und dem Typ des Agenten instan­ ziiert. Danach erhält er die Aufgabe, die ­Berufe herauszufinden, die Goethe und Schiller gemeinsam haben. Der Ablauf zur Beantwortung zeigt die Interaktion des Agenten mit dem Sprachmodell und der Wikipedia-API. Sowohl Goethe als auch Schiller werden hier als Such­terme identifiziert und der entsprechende Wikipe-

dia-Eintrag wird geladen. Das Sprachmodell extrahiert dann die Berufe der beiden aus den Wikipedia-Einträgen und beantwortet die Eingangsfrage völlig richtig.

Aktuelle Daten injizieren Besonders wenn man ein Sprachmodell nach aktuellen Daten wie der Wettervorhersage von morgen oder dem aktuellen Nummer-eins-Hit auf Spotify fragt, wird es im besten Fall behaupten, dass es zu dieser Frage keine Antwort kennt, da das letzte Training vermutlich länger her ist. Im schlimmsten Fall wird es halluzinieren und etwas ausgeben, das einer sehr niedrigen Wahrscheinlichkeit entspricht.

Auch hier helfen die Agenten von LangChain weiter. Was uns ChatGPT zum aktuellen Nummer-eins-Hit sagen kann, steht in Listing 11. Das ist nicht viel, aber immerhin ist das Sprachmodell hier ehrlich. Glücklicherweise gibt es für die Google Custom Search einen geeigneten API-Wrapper, der sich innerhalb der LangChain-Agenten nutzen lässt. Listing 12 zeigt, wie sich die Google-Search-API für die Nutzung innerhalb eines conversational-react-­ description-Agenten einrichten lässt. Ein einfaches ConversationBufferMemory hält dabei fest, was in der Konversation zwischen den Informationen aus der Suchmaschine und dem LLM passiert.

Listing 13: Erzeugen von Embeddings und einfache Suche in FAISS loader = TextLoader('data/twenty_thousand_leagues_under_the_sea.txt') documents = loader.load() text_splitter = TokenTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) embeddings = OpenAIEmbeddings(chunk_size=1) db = FAISS.from_documents(documents=texts, embedding=embeddings) db.similarity_search("Nautilus")

95

iX Special 2023 – KI © Copyright by Heise Medien.

Modelle anwenden | langchain

Listing 14: Das Sprachmodell beantwortet Fragen zu eigenen Daten template = """ Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question. Chat History: {chat_history} Follow Up Input: {question} Standalone question: """ condense_question_prompt = PromptTemplate.from_template(template=template) qa = ConversationalRetrievalChain.from_llm( llm=llm, retriever=db.as_retriever(), condense_question_prompt=condense_question_prompt, return_source_documents=True, verbose=True ) chat_history = [] query = "What is the name of captain Nemo's submarine?" result = qa({"question": query, "chat_history": chat_history}) print(result["answer"]) > Entering new ConversationalRetrievalChain chain... > Finished chain. The name of Captain Nemo's submarine is the Nautilus. chat_history = [(query, result["answer"])] query = "What do the passengers eat for dinner?" result = qa({"question": query, "chat_history": chat_history}) print(result["answer"])> Entering new ConversationalRetrievalChain chain... > Finished chain. They ate fish, holothuridæ, and different kinds of sea-weed. The drank water with

Viele der aktuellen Sprachmodelle begrenzen die Anzahl der Token, die sie innerhalb einer Anfrage verarbeiten können. Prompts gegen sehr viele oder sehr große Texte auszuführen, funktioniert nur auf zwei Wegen: 1. Man trainiert das Sprachmodell mit seinen Texten (Model Fine-tuning) oder 2. man bildet Embedding-Vektoren der Texte und gibt diese komprimierte Form dem Sprachmodell mit. Welcher Weg der bessere, schnellere oder gar günstigere ist, kommt auf den Anwendungsfall an. Aber die einfachste Form, mit LangChain größere Textmengen zu nutzen, sind Embeddings zusammen mit einer Vektordatenbank. Letz­tere er-

leben dank der Beliebtheit großer Sprachmodelle gerade ein Revival. Anbieter wie Weaviate, Pinecone, Milvus, MongoDB Atlas, Qdrant, Chroma und andere liefern Lösungen, um Dokumente in hochdimensionale Vektoren zu zerlegen, was eine schnellere Suche und Operationen wie Ähnlichkeitsvergleiche ermöglicht. Beim Prompt Engineering mit Lang­Chain sind Vektordatenbanken dafür zuständig, die Embeddings der eigenen Daten zu speichern.

Mit großen Texten arbeiten Embeddings sind numerische Repräsentationen von Token wie Sätzen, Absätzen oder Dokumenten in einem hochdimensi-

onalen Vektorraum. Die meisten Sprachmodelle bieten Schnittstellen, um Embeddings innerhalb ihres Vektorraums zu erstellen. Damit lassen sich auch eigene Texte in ein Format bringen, mit dem das Sprachmodell etwas anfangen kann, ohne dass es die Texte selbst kennen muss oder mit ihnen trainiert worden ist. Gleichzeitig sind Embeddings eine sparsame Art, mit dem Sprachmodell zu interagieren, da hier die Token schon komprimiert als ­numerische Repräsentationen vorliegen. Damit lassen sich auch sehr große Texte oder ganze Bücher mit Sprachmodellen nutzen. Das Beispiel in Listing 13 erzeugt aus der englischen Version von Jules Vernes Roman „20 000 Meilen unter dem Meer“

Listing 15: Mit Datenbanken sprechen db = SQLDatabase.from_uri('sqlite:///data/chinook.db') db_chain = SQLDatabaseChain(llm=llm, database=db, verbose=True) result = db_chain.run("which tables exist in the database?") result = db_chain.run("list all music genres in the database") result = db_chain("How much money did all users spent in total $ per country?") print(result['result']) SQLQuery: SELECT Country, SUM(Total) AS Total_Spent FROM customers c JOIN invoices i ON c.CustomerId = i.CustomerId ↵  GROUP BY Country ORDER BY Total_Spent DESC LIMIT 5; SQLResult: [('USA', 523.0600000000004), ('Canada', 303.96), ('France', 195.09999999999994), ('Brazil', 190.1),↵  ('Germany', 156.48)] Answer: The top 5 countries in terms of total money spent are USA ($523.06), Canada ($303.96), France ($195.10), ↵  Brazil ($190.10), and Germany ($156.48).

96

iX Special 2023 – KI © Copyright by Heise Medien.

Listing 16: Gespräche mit DataFrames url = 'https://raw.githubusercontent.com/Vibe1990/Netflix-Project/main/netflix_title.csv' netflix_df = pd.read_csv(url) netflix_df.head() agent = create_pandas_dataframe_agent(llm=llm, df=netflix_df, verbose=True) agent.run("how many rows are there?") agent.run("List all movie titles from director named Steven Spielberg which year are newer then 2000 and sum the ↵  duration time")

eine Vektordatenbank mit Embeddings. Da die API-Calls gegen die EmbeddingsAPIs der Sprachmodelle in der Regel auch längenbegrenzt sind, zerteilt der TokenTextSplitter das Buch in mundgerechte Textstücke von jeweils 1000 Chunks. Zum Erstellen der Embeddings ist die entsprechende Schnittstelle zum Sprachmodell zu initialisieren. Die OpenAI-Embeddings lassen sich dann mithilfe einer Vektordatenbank speichern. LangChain arbeitet mit einer ganzen Reihe bekannter OpenSource- und PaaS-Tools zusammen (siehe ix.de/zze9). Besonders einfach ist es, FAISS zu ­nutzen, eine Open-Source-Bibliothek von Facebook (siehe ix.de/zze9) zum effizienten Speichern von Embeddings. Sie ist ein Bestandteil des LangChain-Pakets, muss also nicht separat installiert werden. In dieser Datenbank können einfache Suchen ausgeführt werden. Die letzte Zeile in Listing 13 liefert alle Dokumente zurück, in denen der Term Nautilus auftaucht. Interessanter ist aber, dass sich jetzt mit einem passenden Prompt-Template und der ConversationalRetrievalChain Fragen an das Sprachmodell aus der Vektordatenbank stellen lassen, wie Listing 14 zeigt.

Datenbanken befragen Was mit Texten funktioniert, geht so ähnlich auch mit Datenbanken. In LangChain kümmert sich darum die SQL­ DatabaseChain. Unter der Haube steckt der bekannte Object Relational Mapper SQLAlchemy (siehe ix.de/zze9). Will man sich mit einer von SQLAlchemy unterstützten Datenbank verbinden, benötigt man zuerst eine Engine, die die Verbindung zur Datenbank hält. Für eine einfache SQLite-Datenbank funktioniert das über den Zweizeiler am Anfang von Listing 15. Die SQL-Datenbank-Chain ist nun bereit, mithilfe des Sprachmodells Fragen an die Datenbank zu beantworten. Damit man sieht, was die Chain mit der Anfrage macht, steht der verbose-­ Parameter wieder auf True. Dass hier

ein­fache SELECTs oder Abfragen nach den enthaltenen Tabellen funktionieren, dürfte keinen SQL-Experten umhauen. Abfragen, die Summierungen und JOINs nutzen, um mehrere Tabellen zu verknüpfen, und das Ergebnis dann auch noch sortieren, dürften diejenigen freuen, die mit dieser Art von SQL-Ausdrücken noch auf Kriegsfuß stehen.

DataFrames befragen Data Scientists und Data Engineers bekommen häufig beliebige Daten auf den Tisch und müssen sich erst mal einen Überblick über die Zusammensetzung des Datensatzes machen. Jupyter-Notebooks haben sich dafür als Werkzeug der Wahl und pandas DataFrames als tabellarische Schnittstelle etabliert. Die richtige Notation komplexer Aggregationen mit pandas aus dem Handgelenk hinzuschreiben, kann aber manchmal frustrierend sein. Schön wäre es, wenn man das Sprach­ modell nach Details zu den Daten fragen könnte. LangChain bietet dafür PythonAgenten, um Python-Code aus der Anfrage zu generieren und dann gegen den entsprechenden DataFrame auszuführen. Ein letztes Beispiel zeigt Listing 16. Im ersten Schritt werden die Daten für den DataFrame benötigt. Es handelt sich dabei um Film- und Serientitel von Netflix. Dieser DataFrame wird nun dem pandasDataFrame-Agenten übergeben – wieder mit verbose=True, um zu sehen, was ­geschieht. Mehr braucht es nicht, damit der Agent Fragen zum DataFrame beantwortet. Die erste Anfrage ist nicht sonderlich originell und wäre mit einem Blick in den DataFrame genauso schnell beantwortet. Die zweite würde dann aber schon etwas mehr Arbeit bedeuten. Doch auch hier liefert LangChain mit „658 Min“ die korrekte Addition der Laufzeit von „Catch Me If You Can“, „Indiana Jones and the Kingdom of the Crystal Skull“, „Lincoln“, „The Adventures of Tintin“ und „War Horse“, also allen Spielberg-Filmen, die nach 2000 entstanden.

Gesprächsoffen LangChain mit Python macht wirklich Spaß und kapselt die Komplexität der verschiedenen Anwendungsfälle und Schnittstellen in einer einheitlichen API. Das Framework bringt neben den gezeigten Anwendungsfällen und Elementen weitere Einsatzmöglichkeiten. In Verbindung mit speziell auf Machine-Learning-Anwendungen getrimmten Front­ end-Frameworks wie Streamlit [1] oder GRadio (siehe ix.de/zze9) lassen sich so in Windeseile Prototypen mit ansehn­ lichen Weboberflächen in Python oder JavaScript (siehe ix.de/zze9) implementieren, die dank vielfältiger Hostingmöglichkeiten auch schnell in Produktion gehen können. Obwohl LangChain noch nicht einmal ein Jahr alt ist und sich schnell weiterentwickelt, ist es bereits jetzt sehr populär und hat über 26 000 Sterne auf GitHub. Der Initiator H ­ arrison C ­ hase ist dabei, eine Firma rund um LangChain zu gründen. Eine Java­Script-Variante entsteht parallel. Zum Erscheinungstermin dieses Artikels sind sicherlich noch die einen oder anderen Funktionen dazugekommen.  ([email protected]) Quellen [1] Ramon Wartala; Mit Streamlit schneller zum datenwissenschaftlichen Prototyp; iX 12/2021, S. 50 [2] Weitere Infos zu LanChain und den erwähnten KI-Verfahren und Tools: ix.de/zze9

RAMON WARTALA ist Chapter Lead und Associate Director Data Science bei Accenture Song in Hamburg. Er entwirft und implementiert mit seinem Team Datenarchitekturen und Machine-Learning-Anwendungen für seine Kunden. 97

iX Special 2023 – KI © Copyright by Heise Medien.

Modelle anwenden | Knowledge Destillation

AIs GPT-3 mit seinen 175 Milliarden Parametern (siehe ix.de/zb9b).

Modellkomprimierung gegen die Kostenfalle

Die für Machine-Learning-Modelle erforderliche Rechenleistung stellt vor allem Entwickler vor große Herausforderungen. Mit geschickt komprimierten Modellen lassen sich die wirtschaftlichen und ökologischen Auswirkungen abfedern.

Doch auch nach dem Training erfordern derart große Transformer-Modelle im Einsatz gewaltige Hardwareressourcen. GPT-3 benötigt beispielsweise in einem realistischen Szenario mindestens 350 GByte VRAM. Die Hardwarekosten für den Betrieb liegen also zwischen 100 000 und 150 000 US-Dollar, wobei die Kosten für Strom, Kühlung oder Backup nicht berücksichtigt sind. Eine Alternative ist die Nutzung eines skalierbaren CloudDienstes, dessen jährliche Kosten bei mindestens 87 000 US-Dollar liegen (siehe ix.de/zb9b). Die hohen Trainings- und Betriebs­ kosten für KI-Modelle haben sowohl wirtschaftliche als auch ökologische Nach­ teile. Das erklärt das wissenschaftliche ­Interesse an Modellkomprimierung, also an Verfahren zur Verringerung der Größe von ML-Modellen mit möglichst geringen Genauigkeitseinbußen. Diese Techniken sind besonders nützlich in Szenarien mit begrenzten Speicher- oder Rechenressourcen, etwa bei mobilen Geräten. Für die Modellkomprimierung gibt es verschiedene Methoden, zum Beispiel ­ Pruning, Quantisierung und Wissensdestillation.

Von Bertram Sändig und Qi Wu

Das Modellwissen destillieren

Große KI-Modelle mit Destillation eindampfen

Ȗ Aktuelle Machine-Learning-Modelle wie Chat­GPT, DALL-E 2, aber auch ­ihre teilweise frei verfügbaren Artgenossen wie Alpaca, Vicuna oder Open As­ sistant erzielen in unzähligen Anwendungsgebieten beeindruckende Ergebnisse, e­ twa beim Generieren von Texten und Bildern, bei Suchen und Übersetzungen. Doch Entwickler stoßen schnell auf Hindernisse, wenn sie Modelle dieser Art verwenden wollen. Denn die er-

forderliche Rechenleistung ist eine e­ chte He­rausforderung. Einen weiteren Aspekt betrachteten Forscher der University of Massachusetts Amherst: In Experimenten ermittelten sie, dass das Training eines einzigen KIModells so viel CO₂ ausstoßen kann wie fünf Autos in ihrer gesamten Lebenszeit (siehe ix.de/zb9b). Dabei verfügte das untersuchte Modell über nur 200 Millionen Parameter – winzig im Vergleich zu Open­

1-TRACT ȫ Vor allem Entwickler stehen mit der für Machine-Learning-Modelle erforderlichen Rechenleistung vor großen Herausforderungen. ȫ Mit diversen Kompressions- und Destillationsverfahren lassen sich ML-Modelle drastisch verkleinern – mit überschaubaren Einbußen bei der Qualität. ȫ Als flexible Methode zur Modellkomprimierung hat sich die Wissensdestillation per Lehrer- und Schülermodell erwiesen. ȫ Schülermodelle müssen keine hochmodernen Transformer-Modelle sein. Ein kleines Long Short-Term Memory Network (LSTM) eignet sich oft sogar besser.

98

Beim Pruning versucht man, redundante Verbindungen in der Architektur zu entfernen. ML-Modelle sind für das Training oft überparametrisiert, was ihnen hilft, komplexe Probleme zu modellieren. Nähern sie sich einer optimalen Parameterkonfiguration an, werden viele Parameter redundant. Diese lassen sich entfernen, ohne die Leistung des Netzes stark zu beeinträchtigen. Das Verfahren der Quantisierung stellt die Gewichte des ML-Modells in geringerer Präzision dar, beispielsweise 8-Bit-Integer statt 32-BitFloating-Point. Während Methoden wie Pruning und Quantisierung darauf abzielen, die Größe des ursprünglichen Modells zu reduzieren, geht die Wissensdestillation einen anderen Weg: Hier trainiert man ein neues, kompaktes Modell, das das Verhalten eines größeren, komplexeren Modells nachahmt. Während des Trainingsprozesses lernt das kompakte Modell (auch Student- oder Schülermodell genannt), einen ähnlichen Output wie das größere Modell (Teacher-/Lehrermodell) zu eriX Special 2023 – KI

© Copyright by Heise Medien.

zielen, wodurch dessen Wissen effektiv destilliert wird. Einer der Hauptvorteile der Wissensdestillation besteht darin, dass die Architektur und Größe des neuen Modells gegenüber dem ursprünglichen flexibel ist. Für einfachere Probleme mit stringen­ teren Ressourcenanforderungen lassen sich kleinere Modelle erzeugen, während sich für komplexere Probleme größere Varianten nutzen lassen. Bei Bedarf funktioniert das sogar in Kombination mit Pruning und Quantisierung.

Wissensdestillation am Beispiel Wissensdestillation lässt sich auf viele Probleme anwenden. Hier dient das Vorgehen bei der Destillation eines Modells zur Eigennamenerkennung (Named Entity Recognition, NER) aus dem Bereich natürlicher Sprachverarbeitung (NLP) als Beispiel. Es soll nur um die wichtigsten Schritte gehen, die gesamte Anleitung findet sich online (siehe ix.de/zb9b). Es ist aber möglich, die beschriebenen Methoden erfolgreich anzuwenden, ohne die technischen Nuancen vollständig zu verinnerlichen. NER zielt darauf ab, in unstrukturierten Texten vorkommende Eigennamen (Zeichenfolgen, die eine real existie­ rende Entität beschreiben, zum Beispiel Firmennamen) zu erkennen und vordefinierten Kategorien zuzuordnen. Das können etwa Personennamen, Organisationen, Orte, medizinische Codes, Zeitangaben, Mengen, Geldwerte oder Prozentsätze sein. Viele Nutzer wünschen sich zur Eigennamenerkennung bestmögliche Ergebnisse unter eingeschränkten Hardwarebedingungen. Einer der in der Forschung verwendeten Standarddatensätze für das Erkennen benannter Entitäten ist CoNLL-2003. Die Klassen in diesem Datensatz heißen PER, LOC, ORG und MISC, was für Person, Ort, Organisation und Sonstiges steht.

Schritt 1: Das Lehrermodell Zunächst wird ein leistungsfähiges Modell ausgewählt, das als Teacher-Modell dienen kann. Ein State-of-the-Art-NERModell ist FLERT XLM-R, eine Trans­ former-basierte Architektur mit e­ iner sehr hohen Genauigkeit beziehungs­ weise  Trefferquote (F1-Score: 94 Prozent Englisch / 92 Prozent Deutsch) auf dem CoNLL-2003-Datenset (siehe ix.de/ zb9b). Die deutsche Version wird später als ner-­german-large, die englische als ner-english-large bezeichnet. Das Akro-

Listing 1: Synthetischen Trainigsdatensatz erstellen from flair.models import SequenceTagger from flair.data import Sentence teacher = SequenceTagger.load("flair/ner-english-large") labeled_sentences = [] for sentence in sentences: sent = Sentence(sentence) teacher.predict(sent,label_name='ner') labeled_sentences.append(sent)

nym XLM steht hier für Cross-lingual Language Model. Ein mehrsprachiges Modell bietet sich für die deutsche Domäne an und eröffnet z­ udem die Möglichkeit, weitere Sprachen mit dem gleichen Modell zu verarbeiten. Die dem ­Modell zugrunde liegende RoBERTa-Architektur ist e­ ine vortrainierte Transformer-Architektur wie BERT, mit vielen architektonischen Parallelen zu Modellen wie Chat­GPT und GPT-3. Details zu den Archi­tekturen beschreibt der Artikel „Sprachmodelle verstehen und einsetzen“ ab Seite 8. Es gibt andere Netze mit vergleich­ barer Leistung, beispielsweise das Automated Concatenation of Embeddings (ACE) oder biaffine-NER (siehe ix.de/ zb9b). Manchmal ist es durchaus vorteilhaft, sich den Evaluierungsdatensatz genauer anzuschauen und die Datenvertei-

lung zu vergleichen, um besser beurteilen zu können, welches ML-Modell sich für die eigenen Daten am besten eignet. Hierzu sollte man sich zunächst Fragen stellen wie: Sollte bei dem Lösungsansatz die Genauigkeit oder die Trefferquote im Vordergrund stehen? Sind einige Klassen weniger kritisch und können mehr Fehler tolerieren?

Schritt 2: Das Schülermodell Die Wahl des Student-Modells ist ebenfalls recht flexibel. Hier ist zu überlegen, was für die eigenen Anwendungsfälle am relevantesten ist. So könnte man auf eine reduzierte Variante des Lehrermodells zurückgreifen, also eine äquivalente Architektur mit weniger Parametern. Es ist aber auch eine völlig andere Modellarchitektur möglich.

Listing 2: Schülermodell initialisieren und trainieren import pickle from flair.data import Corpus from flair.datasets import SentenceDataset from flair.models import SequenceTagger from flair.embeddings import WordEmbeddings, CharacterEmbeddings, StackedEmbeddings from flair.trainers import ModelTrainer # load pre-processed data with open('pre_processed_data/train_mixed_28k.pickle', 'rb') as handle: train_mixed = pickle.load(handle) #... # create training corpus object corpus = Corpus(SentenceDataset(train_mixed),SentenceDataset(dev_ conll),SentenceDataset(test_conll)) tag_type = 'ner' embedding_types = [WordEmbeddings('glove'),CharacterEmbeddings()] embeddings = StackedEmbeddings(embeddings=embedding_types) tagger = SequenceTagger(hidden_size=256, embeddings=embeddings, tag_dictionary=tag_dictionary, tag_type=tag_type, use_crf=True) trainer = ModelTrainer(tagger, corpus) trainer.train('resources/taggers/kd_bilstmcrf_64ep', learning_rate=0.1, patience = 2, mini_batch_size=128, max_epochs=64, checkpoint=True)

99

iX Special 2023 – KI © Copyright by Heise Medien.

Modelle anwenden | Knowledge Destillation

Vergleich ner-englisch-large und 28k_lstmcrf_glove_64ep Modell F1-Score Inferenzzeit für 1000 Sätze auf CPU Anzahl Parameter

Lehrer

Schüler

ner-english-large 0,928 1318 s 560 Millionen

28k_lstmcrf_glove_64ep 0,8899 33 s 1,4 Millionen

Für diesen Artikel fiel die Wahl auf ein LSTM-Netzwerk (Long Short-Term Memory). Vor dem Aufkommen des Transformers (BERT, GPT-3) gehörten diese zu den leistungsfähigsten und am häufigsten verwendeten Machine-LearningModellen für natürliche Sprachverarbeitung und andere sequenzielle Probleme. Der Trainingsprozess von TransformerModellen skaliert besser für sehr große Modellarchitekturen. Die lassen sich auf modernen GPUs besser parallelisieren, und sie können weitreichende semantische Beziehungen besser abbilden. Doch gerade bei kleineren Modellen verschwindet der Vorteil der Trans­ former-Architektur oder kehrt sich sogar um: Hier werden meist bidirektionale LSTMs mit Conditional Random Field (BiLSTM-CRF) verwendet. LSTMs berücksichtigen die sequenzielle Natur von Text und lassen Informationen aus vorherigen Wörtern in Folgewörter eingehen. Bidirektionale LSTMs berücksichtigen solche Interaktionen sogar aus beiden Richtungen, das heißt von links nach rechts und von rechts nach links. Das CRF ermöglicht es dem Modell dabei, sequenzielle Label-Abhängigkeiten besser zu modellieren. Ergänzt werden die Eingabetoken durch gelernte Worteinbettungen (Word Embeddings), um dem Netzwerk auch semantische Informationen auf Wortebene hinzuzufügen (siehe ix.de/zb9b).

Die Trainingsdaten Im Kontext von Wissensdestillation füttert man das Lehrermodell mit Dokumenten und verwendet dessen Ergebnisse (Outputs) als Zielwert für das Schülermodell. Theoretisch ließe sich also mit dem Lehrermodell eine endlose Anzahl synthetischer Trainingsdaten generieren. Zu viele Trainingsdaten können jedoch den Trainingsprozess erschweren. Benötigt wird eine Anzahl von Dokumenten, die ausreicht, dass das Schülermodell das Verhalten der Vorlage bestmöglich nachahmen kann. Zur Verfügung stehen auch die Trainingsdaten, mit denen das Lehrermodell ursprünglich trainiert wurde. Diese wurden von Menschen erstellt und sind besonders zuverlässig. Daher empfiehlt es

sich, die gesamten von Menschen erstellten Trainingsdaten zu benutzen und diese mit zusätzlichen, vom Lehrermodell verarbeiteten Trainingsdaten anzureichern. Wegweisend ist hier das Forschungspaper „Does Knowledge Distillation Really Work?“ – in dem menschliche und synthetische Trainingsdaten zu gleichen Teilen zum Einsatz kommen (siehe ix.de/zb9b). Mit dem Code aus Listing 1 lässt sich beispielsweise das Lehrermodell laden und ein synthetischer Trainingsdatensatz erstellen.

Der Trainingsprozess und die Ergebnisse Hat jemand keinen Zugang zu einer GPU, lassen sich die hier geschilderten Expe­ rimente leicht auf einer Plattform wie Google Colab durchführen, wo man sogar kostenfrei Zugriff auf GPU-Ressourcen bekommt. Die allgemeine Trainingszeit für die Schülermodelle betrug in den Experimenten etwa sechs bis neun Minuten pro Epoche auf Google Colab mit GPU. Dabei wurden sie mit 28 000 Datensätzen trainiert. Bei insgesamt bis zu 64 Trainingsepochen ergibt das eine Gesamtzeit für das Training von circa acht Stunden. Der Code in Listing 2 zeigt, wie man das Schülermodell initialisiert und mithilfe des Datensatzes trainiert. Trainiert wurden viele verschiedene Schülermodelle mit leicht unterschiedlichen Hyperparametereinstellungen. Von ihnen erzielte 28k_lstmcrf_glove_64ep die besten Ergebnisse. Es wurde mit 28 000 Trainingssätzen auf einer BiLSTM-CRFModellarchitektur unter Verwendung von GloVe German Embedding für 64 Epochen trainiert. Die Inferenzzeiten wurden auf der gleichen CPU berechnet. Es überrascht nicht, dass das Lehrermodell ner-englishlarge die beste Qualität (F1-Score) aufweist. Das destillierte Modell liegt allerdings nur 3,81 Prozentpunkte dahinter, ist jedoch vierzigmal schneller und benötigt um den Faktor 400 weniger Arbeitsspeicher.

Fazit Die Wissensdestillation hat sich als flexible Methode zur Modellkomprimie-

100

rung erwiesen, die in vielen verschiedenen Domänen genutzt werden kann. Der allgemeine Arbeitsablauf bei der Implementierung der Wissensdestillation für eine konkrete Aufgabe lässt sich in folgenden Schritten zusammenfassen: • Ein vortrainiertes Lehrermodell für die konkrete Aufgabe auswählen. • Die Architektur des Schülermodells passend wählen. • Bestimmen, welches Datenset sich am besten eignet. • Mit dem Lehrermodell Trainingsdaten generieren. • Das Schülermodell mit den Trainingsdaten anlernen. • Die Ergebnisse des Lehrer- und des Schülermodells vergleichen. Darüber hinaus gibt es noch verschiedene Möglichkeiten zur Verbesserung der Wissensdestillation. Denkbar wären etwa das Experimentieren mit einer Transformer- anstelle einer LTSM-Architektur oder das Trainieren von mehr Lehrermodellen, um ein Ensemble von Wissen zu generieren, das auf den Schüler übertragen werden kann. Ebenfalls denkbar wäre die Nutzung einer anderen Strategie zur Datenerweiterung, die schwierige und einfache Beispiele identifiziert und sie entsprechend ihrer Bedeutung für das Modell auswählt.  ([email protected]) Quellen Links zu Hintergrundinformationen und zu den aufgeführten wissen­ schaftlichen Veröffentlichungen siehe ix.de/zb9b

BERTRAM SÄNDIG leitet das ML-Team bei ontolux (Neofonie GmbH). Er optimiert Large-Language-Modelle für das ­ontolux-Textanalyse-Toolkit und nutzt Forschungsergebnisse, um Kunden­ anwendungen anzupassen.

QI WU ist ML-Engineer bei ontolux (Neofonie GmbH) und arbeitet an Modelltraining und -optimierung, insbesondere Feintuning und Destillation. Sie nutzt Forschungsergebnisse, um Kundenanwendungen zu verbessern. iX Special 2023 – KI

© Copyright by Heise Medien.

© Copyright by Heise Medien.

Modelle anwenden | Generative KI

Das Einmaleins des Prompt Engineering Wer das volle Potenzial künstlicher Intelligenzen ausschöpfen möchte, braucht gute Prompts. Was Letztere ausmacht, hängt stark vom KI-Modell ab. Einige Grundlagen gelten aber immer. Von Philipp Schneider Ȗ KI-basierte Text- und Bildgeneratoren wie ChatGPT, Dall-E oder Stable Diffusion sind theoretisch in der Lage, ganze Hausarbeiten zu schreiben oder künstlerische Meisterwerke wie „Das Mädchen mit dem Perlenohrring“ zu vervollständigen. Doch nach dem ersten großen Hype ist bei vielen schon jetzt das Tal der Ernüchterung erreicht: Denn in der Praxis decken sich die gelieferten Resultate häufig nicht mit den Vorstellungen der Nutzerinnen und Nutzer. Während zum Beispiel Dall-E nicht selten Bilder liefert, die logische Fehler aufweisen oder nicht der gewünschten Gestaltung entsprechen, kann ChatGPT Missverständnissen zum Opfer fallen und eine falsche Tonalität oder Perspektive wählen. Diese Grenzen der modernen Generatoren liegen allerdings oft nicht allein in der Technik, sondern auch in den unzureichend formulierten Prompts. Was einen guten Prompt ausmacht, ist eine Wissenschaft für sich und hängt maßgeblich von der jeweiligen künst­ lichen Intelligenz ab. Inzwischen ist mit dem Prompt Engineering sogar eine komplett neue Berufsdisziplin aus dem Bedarf an guten Prompts entstanden. Dieser neue Bereich bietet all jenen Chancen, die sich tiefer mit der KI auseinandersetzen wollen. Das können Grafikerinnen sein, die Tools wie Dall-E für die Erstellung visueller Inhalte nutzen möchten, aber auch SEO-Texter oder Redakteurinnen. Wichtig ist in jedem Fall Geduld, denn auch wenn KI-Tools komplexe Ergebnisse liefern können, gleicht der Weg dorthin oft eher dem Gespräch mit einem Kind. Eine spezielle Ausbildung für Prompt Engineering gibt es noch nicht. Trotzdem haben Unternehmen schon jetzt die ersten Stellenanzeigen geschaltet, in denen sie nach Prompt Engineers suchen. Dabei ist ihnen offenbar bewusst, wie neu das begehrte Feld tatsächlich ist, wie ein Bei-

spiel aus den USA beweist: Das Unternehmen Anthropic, das sich mit KI-Sicherheit und Forschung befasst, verlangte in einer Ausschreibung für einen „Prompt Engineer and Librarian“ unter anderem ein ausgeprägtes Verständnis großer Sprachmodelle und Python-Grundkenntnisse. Gleichzeitig heißt es auch: „Given that the field of prompt-engineering is arguably less than 2 years old, this position is a bit hard to hire for!“ Kein Wunder also, dass externe Dienstleistungsfirmen, die Coachings in diesem Bereich anbieten, derzeit wie Pilze aus dem Boden schießen. Hier können zum Beispiel Grafik- oder Produktdesignerinnen, die KIBilder erstellen wollen, in mehrteiligen Seminaren lernen, wie sie dies mithilfe des Prompt Engineering umsetzen können. Doch was genau verbirgt sich hinter einem guten Prompt?

Prompts und ihre Tücken Dall-E ist ein KI-basierter Bildgenerator des US-amerikanischen Unternehmens OpenAI. Er wandelt mithilfe künstlicher

1-TRACT ȫ Die Kommunikation mit Sprachund Bildgenerationen erfolgt ­anwenderseitig über Prompts. Mit deren Passgenauigkeit steht und fällt auch die Qualität des ­KI-Erzeugnisses. ȫ Mit dem Prompt Engineering ist sogar ein neues, rasch wachsendes Berufsbild entstanden. ȫ Bild- und Sprach-KIs haben unterschiedliche Anforderungen an Prompts. Sie eint jedoch der Anspruch auf möglichst detaillierte User-Eingaben.

102

neuronaler Netze textbasierte Prompts in eine bestimmte Anordnung von Pixeln um. Damit das in der Praxis funktioniert und teilweise fotorealistische Bilder entstehen können, wurde das Modell zuvor mit Millionen von Bildern und den dazugehörigen Beschreibungen trainiert. So weiß Dall-E zwar nicht, wer Leonardo da Vinci ist, kann aber Bilddateien erstellen, die seinem Stil beeindruckend nahekommen, wie eines der folgenden Beispiele zeigt. Ein Prompt darf im Falle von Dall-E maximal 1000 Zeichen umfassen. Das mag zunächst nach viel klingen. Allerdings ist es für das KI-Modell unverzichtbar, möglichst viele Informationen zu erhalten, um ein Ergebnis liefern zu können, das der Vorstellung der Nutzerinnen und Nutzer bestmöglich entspricht. Daher lohnt es sich, tiefer in den fachspezifischen Jargon aus Kunst und Fotografie einzusteigen – je nachdem, welches Bild man erzeugen will. Fehlen diese Informationen im Prompt, entscheidet Dall-E zufällig, welche Stilmittel es nutzt, um ein Bild zu generieren. Sucht man nach In­ spiration, kann das hilfreich sein; möchte man aber ein ganz bestimmtes Ergebnis erzeugen, lohnt es sich, so präzise wie möglich zu sein. Einerseits geht es dabei um Faktoren wie die Bildkomposition, die man Dall-E in englischer Sprache mitteilen sollte. Wie nah oder fern ist das Dargestellte von der Perspektive der Betrachtenden? Soll das Bild ein Close-up oder doch ein Long Shot sein? Wie lässt sich der Winkel beschreiben? Handelt es sich um eine Drohnenaufnahme oder um eine Aufnahme aus der Froschperspektive, auf Englisch „Worm’s Eye View“? Andererseits spielen vor allem für fotorealis­ tische Bilder auch technische Faktoren eine Rolle: Welches Gerät kommt zum Einsatz, um das Foto zu machen? Wie ist  die Belichtungszeit und wie sind die iX Special 2023 – KI

© Copyright by Heise Medien.

Emotionen einbringen Möchte man mithilfe von Dall-E kein fotorealistisches Bild, sondern ein Gemälde generieren, gilt es, bei der Formulierung des Prompts weitere Punkte zu beachten. Hier spielt die Malweises eine übergeordnete Rolle. Schließlich sieht ein Aquarell ganz anders aus als ein Ölgemälde. Auch die Stilepoche kann der Prompt enthalten. Soll das Bild der Pop Art, dem Barock oder doch eher dem Impressionismus zuzuordnen sein? Nicht zuletzt kann auch die Stimmung einen entscheidenden Unterschied machen, wie ein Bild gestaltet ist und auf die Betrachtenden wirkt. Hier ist die Nennung entsprechender Adjektive sinnvoll – von fröhlich, farbenfroh und gemütlich über dynamisch und romantisch bis hin zu düster, melancholisch oder gar apokalyptisch kann Dall-E völlig unterschiedliche Ergebnisse liefern. Die Ergebnisse guter Prompts zeigen die Abbildungen 1 und 2. Auf den ersten Blick sind die Ergebnisse, die Dall-E auf Grundlage der gelieferten Informationen generiert, verblüffend. Auf den zweiten zeigen sich allerdings einige Schwächen – so zum Beispiel in der verzerrten Darstellung der Wiese bei dem Bild, das einen schwarzen Hund im Sonnenuntergang zeigt. Doch es gibt noch weitere Probleme, mit denen der Bildgenerator aktuell zu kämpfen hat und die vor allem auf den Prompt zurückzuführen sind, wie das Beispiel in Abbildung 3 verdeutlicht. Wie sich zeigt, hat die künstliche Intelligenz ein Problem mit Negierungen. Obwohl der Prompt explizit erwähnt, dass

trale Rolle. Man kann sich die Kommunikation mit dem Chatbot ungefähr so vorstellen, als würde man einem Kindergartenkind einen Auftrag geben. Auch hier kann unter Umständen etwas ganz anderes herauskommen als erhofft, wenn man nicht exakt beschreibt, welchen Ausgang man herbeiführen möchte. Ein Beispiel: Jan möchte seiner Freundin Anna ein paar liebe Grüße aus seinem Urlaub am Nordpol schicken und nutzt die GPT-3.5-turbo Engine, um hierfür einen passenden Text zu formulieren:

Quelle: Philipp Schneider / erstellt mit Dall-E

Lichtverhältnisse? Der Prompt darf auch die Beschreibung künstlerischer Effekte enthalten, erzeugt durch bestimmte Filter, zum Beispiel eine monochrome oder negative Farbgestaltung.

Prompt: „Ein dynamisches Foto von einem schwarzen Labrador, Wide Shot, draußen auf einer Wiese im Stadtpark zum Sonnenuntergang, Weitwinkel, softer Fokus, gemacht mit einem iPhone 10, gepostet auf Instagram“ (Abb. 1). kein Orangensaft in dem Glas sein soll, stellt Dall-E genau das dar. Ähnlich verhält es sich mit den Bananen: Zwar ist im Vordergrund ein Teller ohne die gelbe Frucht zu sehen, auf dem zweiten Teller dahinter liegt aber eine. Das liegt daran, dass die KI einen zugegebenermaßen irreführend formulierten Prompt auf ähnliche Art und Wiese verarbeitet wie das menschliche Gehirn. Hört ein Mensch den simplen Satz „Dies ist keine Banane“ denkt er, obwohl in dem Satz eine Verneinung vorkommt, unweigerlich sofort an eine Banane.

Tücken der Text-KI Der Chatbot ChatGPT, im November 2022 von OpenAI veröffentlicht, basiert auf dem Sprachmodell GPT-3.5-turbo beziehungsweise dessen Nachfolger GPT-4. Das Modell nutzt maschinelles Lernen und wurde mit Millionen von Texten aus dem Internet trainiert. Auch beim Umgang mit ChatGPT spielt die Formulierung der verwendeten Prompts eine zen-

Prompt: Schreibe einen Urlaubsgruß. Ergebnis: Hallo! Ich wünsche dir einen schönen Urlaub! Genieße die Zeit und mach die besten Erinnerungen! Die ungenaue Formulierung des Prompts hat dazu geführt, dass die GPT-3.5-turbo Engine Jan missverstanden hat. Statt eines Grußes, den er seiner Freundin Anna aus dem Urlaub senden möchte, hat das Tool die Situation umgedreht und angenommen, dass die Adressatin diejenige ist, die derzeit auf Reisen ist. Es lohnt sich also, konkreter zu werden. Prompt: Schreibe Grüße aus meinem Urlaub. Ergebnis: Hallo daheim! Ich vermisse euch alle! Ich bin hier an einem wunderschönen Ort, an dem ich eine tolle Zeit habe. Ich genieße die Sonne, das warme Wetter und türkisfarbene Meer. Hoffentlich können wir bald wieder zusammen sein und die Erinnerungen aus meinem Urlaub teilen. Viele liebe Grüße! Diesmal hat Jan seinen Prompt zwar etwas konkreter formuliert, trotzdem liefert die Anwendung noch immer nicht das gewünschte Ergebnis. Das Problem

103

iX Special 2023 – KI © Copyright by Heise Medien.

Quelle: Philipp Schneider / erstellt mit Dall-E

Quelle: Philipp Schneider / erstellt mit Dall-E

Modelle anwenden | Generative KI

Prompt: „Melancholisches Ölgemälde eines jungen, blonden Mädchens vor einer hügeligen Winterlandschaft, Middle Shot, gemalt von Leonardo da Vinci im Jahr 1514“ (Abb. 2).

Prompt: „Ein Teller, auf dem keine Bananen liegen. Daneben steht ein Glas ohne Orangensaft.“ Die KI kommt, wie auch das menschliche Gehirn, mit den Verneinungen durcheinander (Abb. 3).

ist, dass es dem Bot am nötigen Kontext fehlt. Er kann nicht wissen, dass Jan seine Ferien nicht etwa in Spanien, sondern am Nordpol verbringt. Da er mit Texten aus dem Internet trainiert wurde, hat er vermutlich gelernt, dass der Begriff „Urlaub“ mit Strand und schönem Wetter gleichzusetzen ist. Wenn Jan einen Text erhalten möchte, der seinen Erwartungen entspricht, muss er dem Chatbot also den nötigen Kontext liefern, um den Text konkreter einordnen zu können.

Prompt: Schreibe meiner guten Freundin Anna ein paar Grüße aus meinem Urlaub am Nordpol. Hier wollte ich immer schon mal hin! Ergebnis: Hallo Anna,  ich bin gerade am Nordpol! Ich kann es kaum glauben! Hier ist es unglaublich schön und die Landschaft ist wirklich einzigartig. Ich bin begeistert von der unendlich weiten Eiswüste und dem unglaublichen Schnee. Ich kann sogar Eisberge und Eisschollen auf dem Meer treiben sehen. Es ist ein einzigartiges Erlebnis, hier zu sein, und ich wünsche dir, dass du irgendwann einmal auch hierherkommst! Ich schicke dir viele Grüße aus dem eisigen Norden!  Herzlichst, dein Freund

Prompt: Schreibe Anna ein paar Grüße aus meinem Urlaub am Nordpol. Ergebnis: Hallo Anna, ich hoffe, es geht dir gut! Ich bin gerade am Nordpol und es ist wirklich wunderschön hier! Es ist eine unglaubliche und einzigartige Erfahrung, die ich hier mache. Die Landschaft ist so beeindruckend und ich habe schon einige tolle Abenteuer erlebt. Ich habe einige Eisbären gesehen und sogar ein paar Pinguine! Ich wünsche mir, dass du auch einmal hierherkommen und diese grandiose Schönheit erleben kannst. Liebe Grüße vom Nordpol! Wie sich zeigt, kann die künstliche Intelligenz auch Dinge durcheinanderbringen  – etwa, dass Eisbären und Pinguine an entgegengesetzten Polen leben. Immerhin zeigt dieses Beispiel, dass der Text, den die GPT-3.5-turbo Engine liefert, sehr viel spezifischer ausfällt, wenn auch der Prompt, den Jan eingibt, spezifisch formuliert ist. Durch die Nennung seines Urlaubsortes hat er dem Tool mehr Kontext geliefert, an dem es sich bei seiner Formulierung orientieren kann. Um das Ergebnis noch etwas persönlicher klingen zu lassen, fügt er nun noch wei­ tere Informationen hinzu.

Zuletzt lassen sich auch der Schreibstil und das Format durch die Formulierung des Prompts beeinflussen, wie dieses letzte Beispiel zeigt: Prompt: Mein Name ist Jan. Schreibe meiner guten Freundin Anna ein paar Grüße aus meinem Urlaub am Nordpol. Hier wollte ich immer schon mal hin! Bitte schreibe zwei Absätze. Schreibe witzig und persönlich. Beende den zweiten Absatz mit einer Frage. Ergebnis: Liebe Anna! Ich hoffe, es geht dir gut. Ich schicke dir liebe Grüße aus meinem Urlaub am Nordpol! Wie du weißt, war es schon immer mein Traum, hierherzukommen, und jetzt stehe ich hier und es ist unglaublich! Es ist so still hier, und ich kann den Eisbergen und Eisblöcken beim Eintauchen in die arktische Stille zuschauen. Es ist ein wunderschöner und magischer Ort! Ich wünschte, du wärst hier, um all die Eindrücke mit mir teilen zu können. Viel-

104

leicht kannst du das nächste Mal mit mir gemeinsam hierherkommen. Wie geht es dir? Wie ist das Wetter bei dir? Viele Grüße und liebe Umarmungen Dein Jan

Fazit: Zwischen Mehrwert und Selbstfindung Wie sich zeigt, sind Prompts ganz individuell. Die Definition eines guten Prompts ist nicht eindeutig möglich und hängt davon ab, welche Art von KI-Modell zum Einsatz kommt. Was für ein textbasiertes Dialogsystem wie ChatGPT gilt, funktioniert nicht zwangsläufig auch bei einem Bildgenerator wie Dall-E. Hinzu kommt, dass sich die KI-Modelle ständig wei­ terentwickeln. Das bedeutet, dass man auch die verwendeten Prompts ständig überprüfen und gegebenenfalls anpassen muss, um weiterhin gute Ergebnisse erzielen zu können – kein Wunder also, dass Prompt Engineers derzeit die wohl gefragteste neue Berufsgruppe überhaupt bilden. Erste Stimmen haben sich bereits zu Wort gemeldet, die meinen, dass das Prompt Engineering nur eine Eintagsfliege sei und innerhalb kürzester Zeit wieder obsolet würde. Grund dafür sei, dass die Tools nicht nur immer besser werden, sondern auch immer einfacher zu bedienen sind. Schon jetzt bieten einige Tools Funktionen, die es Anwenderinnen und Anwendern erlauben, Vorlagen zu nutzen oder ihre Prompts zu verfeinern, um so ein besseres Ergebnis zu erzielen. Aktuell sind vor allem ChromePlug-ins wie „ChatGPT PROMPT Ge­ nius“ beliebt. Sie bieten eine Vielzahl vorgefertigter Prompts für verschiedene Kategorien und können ohne tieferes Vorwissen direkt in ChatGPT ausgeführt werden. Entsprechende Funktionen könnten die speziellen Kenntnisse darüber, wie ein guter Prompt zu verfassen ist, also bald schon ersetzen. Selbst aktiv nach Prompt Engineers zu suchen wäre damit längst nicht für alle Unternehmen notwendig.  ( [email protected])

PHILIPP SCHNEIDER leitet die Entwicklung beim Tech-Start-up Conversion Maker, das unter anderem auf Basis von OpenAI automatisch Marketingtexte generiert. iX Special 2023 – KI

© Copyright by Heise Medien.

KI selbst entwickeln | KI selbst entwickeln

KI selbst entwickeln – warum sich selber bauen lohnt So faszinierend es auch ist, große Sprachmodelle zu nutzen – für viele Zwecke ist Eigenbau besser. Und mit Services aus der Cloud und guten Frameworks auch gar nicht schwer. Wenn man gerade keine hochmotorisierte Grafikkarte herumliegen hat, lassen sich Ressourcen für kleine Projekte gut mieten. Amazon AWS, Microsoft Azure und die Google Cloud bieten schnell gebuchte Hardwarekontingente an – und auch Hugging Face ermöglicht das Trainieren as a Service. Die aktuellen Modelle verstehen den Umgang mit Text, Ton und Bild – oder lernen ihn im Feintuning. Damit lassen sich eigene Dokumentensammlungen nach bestimmten Sätzen, Phrasen oder per FragePrompts durchsuchen. Ein zweites Beispiel aus dem Alltag ist das Sortieren der Musiksammlung. Darauf abgerichtete Modelle können mit wenigen Sekunden Material Titel einem Genre zuordnen. Ist man oft bei Fotos von Familie und Freunden unsicher, ob das Lachen oder eine Grimasse ist, hilft KI. Ein selbst erstelltes ML-Modell erkennt Emotionen in Selfies – und das sogar im Browser. Menschen, denen das zu viel Programmieren ist, können mit AutoML einen Ansatz verfolgen, bei dem Systeme selbst versuchen, die passenden Schritte zum Auswerten und Verwenden der Daten zu finden.

Neuronale Suche, die endlich mal das Gesuchte findet

106

Musikgenres mit KI-Modellen bestimmen

110

Ein Modell für das Erkennen von Emotionen in Selfies

116

AutoML: Features und Algorithmen aussuchen lassen

122

105

iX Special 2023 – KI © Copyright by Heise Medien.

KI selbst entwickeln | Neuronale Suche

Maschinen auf Text abrichten In Confluence oder mit der Windows-Suche wieder nichts gefunden? Mithilfe von KI lässt sich die traditionelle Suche aufbohren. Extractive-Question-Answering-Modelle finden nicht nur wörtliche Zeichenketten, sondern erkennen komplexe Zusammenhänge und entdecken thematisch passende Ergebnisse. Von Clemens Gutknecht, Leon Marius Schröder und Leon Lukas Ȗ Während KI in viele Bereiche von Alltag und Arbeit bereits Einzug gehalten hat, verlässt man sich beim Suchen immer noch auf angestaubte traditionelle Algorithmen. Wenn Suchende nicht das buchstäblich passende Stichwort ver­ wenden oder das Programm kein Synonym in einer Standardliste findet, liefert die Software keine passenden Ergebnisse. Darüber hinaus ist die Stichwortsuche schon an sich eine Notlösung, da Nutzer eigentlich eine Frage beantwortet haben oder ein Dokument finden wollen. Mit dem Durchbruch der Transformer-Architektur im Natural Language Processing (NLP) 2017 stehen Machine-LearningModelle zur Verfügung, die dieser Auf­ gabe besser gewachsen sind. Und auch das Aufsetzen eines solchen Systems ist dank des Open-Source-Projektes Hay­ stack kein Hexenwerk. Im Folgenden geht es darum, eine Question-Answering-Pipeline mithilfe von Haystack in Python zu implemen­ tieren. Am Ende wird es möglich sein, Fragen zu stellen, deren Antwort das Pro106

gramm als Textspanne in eigenen Dokumenten findet. Wer will, kann die Standardpipeline dabei um ein selbst feinjustiertes DPR-Modell ergänzen, um noch bessere Suchergebnisse zu erhalten (siehe „Neuronale Suche in Texten“ in der

1-TRACT ȫ Das Durchsuchen der eigenen Dokumente über Stichwörter ist frus­ trierend, wenn einem partout nicht das richtige Schlagwort einfällt. KIbasierte neuronale Suchen schaffen hier Abhilfe. ȫ Mit dem Framework Haystack und Transformern aus dem Hugging Face Model Hub lässt sich schnell eine eigene neuronale Suche einrichten. ȫ Dank der Transformer-Modelle lassen sich per Suchanfrage auch komplexe Zusammenhänge finden und inhaltliche Suchanfragen stellen. ȫ Eigene Modelle für das Extractive Question Answering halluzinieren nicht: Die Suche ist immer mit Quellen belegt. © Copyright by Heise Medien.

iX 6/2023). Da das Verarbeiten von Daten in den verwendeten neuronalen Netzwerken (Inferencing) stark parallelisierbar erfolgt, bietet sich für dieses Projekt eine CUDA-Umgebung an. Für einen reinen Testlauf mit wenigen Dokumenten ist eine Nvidia-Grafikkarte allerdings nicht unbedingt nötig. Das begleitende Repository auf GitHub stellt ein Jupyter-Notebook zur Verfügung, das Google Colab unkompliziert ausführt – einen Google-Account vorausgesetzt (siehe ix.de/zy3m). Außerdem verweist es auf einen Datensatz von Bürgerbüro-Servicedokumenten der Stadt München, falls keine eigene Dokumentensammlung parat steht. Abbildung 1 zeigt eine Übersicht des Prozesses der neuronalen Suche, der aus zwei Stufen besteht. Zunächst erfolgt das Generieren einer Vorauswahl an Dokumenten, gefolgt von dem gezielten Durchsuchen der Vorauswahl. Bei umfangreichen Dokumentensammlungen ist dies besonders relevant, da das Durchsuchen der gesamten Sammlung Zeile für Zeile zu zeit- und rechenaufwendig wäre. Für den ersten Schritt gibt es zwei Optionen: e­ inen klassischen, stichwortbasierten Algorithmus oder ein Machine-Learning-Modell. Der zweite Schritt verwendet ein spezia­ lisiertes Machine-Learning-Modell. Bei diesen handelt es sich um neuronale Netzwerke der Transformer-Architektur. Im Vergleich zu stichwortbasierten Ansätzen bieten Transformer-Modelle den entscheidenden Vorteil, dass sie den Kontext berücksichtigen und mit einer inhaltlichen Repräsentation der Wörter und Sätze arbeiten. Dies ermöglicht eine genauere Suche, die sich auf den Kern der Frage konzentriert, anstatt auf Schlagwörter und Synonymlisten zu setzen. Im ersten Schritt zum Generieren der  Vorauswahl handelt es sich um ein Dense-­Passage-Retrieval-Modell (DPRModell). Dessen Aufgabe ist es, das Indizieren der Dokumente in der Datenbank zu übernehmen. Dabei kommt allerdings kein klassisches Indizieren auf Basis von Schlüsselwörtern zum Einsatz, sondern ein Vektor-Embedding: Man trainiert das DPR-Modell so, dass es jedes Dokument in einen Vektor umwandeln kann und inhaltlich ähnliche Dokumente nahe beieinanderliegende Vektoren ergeben. Diese lassen sich dann mit Verfahren wie K-Nearest-Neighbor gruppieren. Wenn das Modell nun die Suchanfrage (Query) ebenfalls in einen Vektor umwandelt, lassen sich die k am nächsten liegenden Dokumentvektoren als Vorauswahl ermitteln. Beim zweiten Schritt kommt hingegen ein Extractive-Question-Answering-MoiX Special 2023 – KI

Was ist künstliche Intelligenz?

dell (exQA-Modell) zum Einsatz. Dieses neuronale Netzwerk ist darauf spezialisiert, die Antwortspanne in einem Text zu einer gegebenen Frage zu finden. Bei einer Antwortspanne handelt es sich hier um einen beliebigen Textabschnitt, für den das Sprachmodell die Wahrscheinlichkeit, relevante Antwortinformationen zu enthalten, als maximal einschätzt. In der Pipeline durchsucht nun also das Question-Answering-Modell jedes Dokument aus der Vorauswahl und gibt Textabschnitte zurück, die möglicherweise die Antwort auf die Suchanfrage enthalten. Die sortiert das Programm nach geschätzter Relevanz und präsentiert sie anschließend dem Nutzer. Bevor man den Prozess in Abbildung 1 in einer Pipeline umsetzen kann, gilt es zunächst, den Document Store zu befüllen. Der erste Schritt dafür konvertiert vorhandene Dokumente zu TXT-Dateien, da sich nur einfacher Text als Input für diese Art von neuronalen Netzwerken eignet. Danach berechnet ein DPR-Modell die Dokumentvektoren, die dann den Index bilden. Abbildung 2 stellt diesen Prozess dar.

Die Nadel im Haystack Das Haystack-Framework ist eine OpenSource-Software, die das deutsche Startup Deepset entwickelt. Es bietet eine Reihe von Werkzeugen, mit denen Benutzer NLP-Anwendungen schneller und effizienter implementieren können. Unter anderem unterstützt es beim Aufbau von Frage-Antwort-Systemen, Chatbots, Dokumentenklassifizierung und Informa­ tion Retrieval. Dabei ist es einfach zu verwenden und bietet eine umfang­reiche Dokumentation sowie eine aktive Community, die regelmäßig neue Funk­tionen und Verbesserungen bereitstellt. Für die Installation von Haystack sollte sicher­ gestellt sein, dass Python 3.8 oder höher auf dem System verfügbar ist. Besonders sauber gelingt die Installation in einer virtuellen Umgebung, zum Beispiel mit Miniconda. Zur Installation von Hay­stack ­genügt es dann, über die Konsole pip install farm-haystack auszuführen. Im Kern umfasst Haystack drei Komponenten: das modeling-Package, das Funktionen zum Trainieren und Evaluieren von Transformern beinhaltet, die Document Stores, Wrapper um verschiedene Datenbanken zum Vorhalten der Dokumente, und die zentralen Pipelines mit einer Vielzahl an unterschiedlichen Nodes (Knoten). Während die Pipelines dabei den Informationsfluss steuern, bieten die Nodes unterschiedliche Fähigkeiten, vom Text-zu-Sprache-Konvertieren

1. Nutzerfrage

Document Store

2. Vorauswahl an Dokumenten wird von einem stichwortbasierten klassischen Algorithmus (z. B. BM25) oder einem „DPR“-Modell nach inhaltlicher Ähnlichkeit getroffen

3. „QA“-Modell 4. Nutzer erhält Liste durchsucht Vorauswahl von Antwortspannen („Zitate“) aus den Passage für Passage Quelldokumenten

Die neuronale Suche besteht aus mehreren Schritten. Nach einer Suchanfrage wählt ein klassischer Suchalgorithmus oder ein KI-Modell möglicherweise passende Texte aus der Dokumentensammlung aus, die das Antwortmodell dann nach den passenden Abschnitten durchsucht (Abb. 1).

DOCX PDF

TXT

TXT 1. Dokumente in einheitliche TXT-Dateien konvertieren

2. Document Store befüllen (In-Memory, Elasticsearch, FAISS ...)

3. DPR-Index erstellen

Beim Befüllen des Document Stores überführt das System alle Quelldokumente als TXTDateien in einen Index, den ein Dense-Passage-Retrieval-Modell erstellt (Abb. 2). über das Übersetzen bis hin zum Generieren von Antworten. Entsprechend bietet das Framework auch Nodes an, die beim Konvertieren von verschiedenen Dateiformaten zu einfachem Text helfen. Es handelt sich hierbei insbesondere um Konverter für PDFs (einschließlich optischer Zeichenerkennung) und DOCX-Dokumente. Auch das Verarbeiten weiterer Datentypen ist möglich, ferner existieren Nodes für das Nutzen von Konverter-Anwendungen von Drittanbietern (etwa Azure oder Tika). Die Nodes lassen sich ebenfalls unabhängig von einer Pipeline verwenden und liefern fertige Haystack Documents. Dieses Format ist essenziell, um im nächsten Schritt die Dokumente nahtlos in einen Document Store einzubinden. Haystack stellt zudem eine nützliche Funktion bereit, die alle unterstützten Dateien in einem Verzeichnis automa-

tisch in Haystack-Document-Objekte konvertiert: from haystack.utils import ↵ convert_files_to_docs all_docs = convert_files_to_docs↵ (dir_path="Pfad/zu/den/Dokumenten")

Nun haben die meisten aktuellen Sprachmodelle der Transformer-Klasse allerdings eine gewichtige Einschränkung: Es gibt ein festes Limit für die Eingabelänge. Wie hier beträgt sie bei kleinen, spezialisierten Modellen oft 512 Token – das entspricht etwa 125 deutschen Wörtern. Die genaue Anzahl hängt jedoch vom eingesetzten Modell und dem dazugehörigen Tokenizer ab. Da die meisten Dokumente deutlich länger sind, ist es nötig, sie vorher aufzuteilen. Dazu bietet Haystack einen praktischen PreProcessor-Node, der neben vielen anderen Vorverarbeitungsaufgaben auch das Aufteilen über-

Extraktives versus freies Question Answering Warum wird kein freies Question-Answering-Modell eingesetzt, das natürlichsprachige Antworten statt Antwortspannen liefert (wie man es etwa von ChatGPT kennt)? Zuverlässiges freies Question Answering ist im Vergleich zum Extractive Question An­ swering eine deutlich anspruchsvollere Aufgabe im Bereich Sprachverarbeitung. Dies liegt zum einen daran, dass wegen der vielen möglichen korrekten Formulierungen deutlich mehr und auch anders geartete

Trainingsdaten notwendig sind. Zum anderen ist es ein Problem, den Wahrheitsgehalt der Antwort zu gewährleisten, da die Modelle gelegentlich Informationen halluzinieren. Beim Extractive Question Answering hingegen ist die Richtigkeit der Informationen direkt aus dem zitierten Dokument gegeben und somit direkt belegt. Eine Einschränkung ist allerdings, dass eine Antwortspanne keine über das Dokument verteilten Informationen erfassen kann. 107

iX Special 2023 – KI © Copyright by Heise Medien.

Wo

Q

kann

Q

ich

Q

...

Q

--

Per-

C

sonal-

C

ausweis

C

Sie

C

können

C

...

C

Input: Query/ Context-Tokens

{nicht-Context wird maskiert}

KI selbst entwickeln | Neuronale Suche

DPR-Modellpaar trainiert hat, kann das an dieser Stelle einbinden. Je nach eingesetzter GPU und Umfang der Dokumentenbasis kann der Indizierungsvorgang wenige Minuten bis zu mehrere Stunden dauern. Wahrscheinlichkeit Start- bzw. End-Token zu sein

Encoder-Modell Antwort Start

Inputs BERT-ähnlicher Encoder-Transformer

QA-Head: Linear Layer mit Logit-Output

Antwort Ende

Schematische Darstellung des exQA-Modells. Je deutlicher sich die Stärke der Aktivierung dabei von der der übrigen Token unterscheidet, desto relevanter wird die resultierende Antwortspanne eingeschätzt (Abb. 3). nehmen kann. Um sicher zu sein, dass die Teilstücke immer unter dem Längenlimit liegen, legt Listing 1 die maximale Länge hier auf 100 Wörter fest. Damit sind die Teildokumente jetzt für das Indizieren in einer Datenbank bereit.

Document Store befüllen und Dokumente indizieren Haystack bietet mit den Document Stores Wrapper um verschiedene Datenbank­ optionen. Für den testweisen Einsatz einer Question-Answering-Pipeline bietet sich der einfache In-Memory Document Store an. Für den Einsatz in einer Produktionsumgebung empfehlen sich Elas­ ticsearch oder FAISS. Das Hinzufügen der vorbereiteten Haystack-Dokumente zu einem Document Store gestaltet sich sehr einfach: from haystack.document_stores ↵  import InMemoryDocumentStore document_store = ↵ InMemoryDocumentStore() document_store.write_documents(docs)

Nach der Integration der Dokumente in den Document Store ist für die Suche via Dense Passage Retrieval allerdings noch das Indizieren anhand der entsprechenden Vektoren notwendig. Dafür wird ein weiterer einzelner Haystack-Node genutzt, der Retriever. Dabei handelt es sich um den gleichen Node, der zur Laufzeit die Vorauswahl an Dokumenten bereitstellt (siehe Listing 2). Der DensePassageRetriever-Node benötigt als Parameter ein DPR-Modellpaar, da man üblicherweise zwei parallel trainierte DPR-Modelle einsetzt. Das erste Modell wandelt die Query in einen Vektor um, das andere das Dokument (den Kontext). Der Grund: Query und Kontext sind sprachlich zu unterschiedlich, um effektiv vom gleichen Modell verarbeitet zu werden. Dieses Beispiel greift bequemerweise auf die umfangreiche Modellbibliothek von Hugging Face zurück und dort auf das DPR-Modellpaar gbert-base-germandpr von Deepset. Wer nach dem Artikel „Neuronale Suche in Texten“ in der iX  6/2023 ein eigenes

Antworten finden Mit der Integration des Dense Passage Retrievals und dem Indizieren des Document Stores stehen alle Komponenten für das erfolgreiche Generieren einer Vorauswahl an Dokumenten im Antwortprozess auf eine Nutzerfrage. Der nächste Schritt ist, diese Vorauswahl im Detail zu analysieren und mögliche Antwortzitate (Antwortspannen) zu finden. Hierfür kommt ein exQA-Modell zum Einsatz. Für das Extractive Question Answering tauscht man bei Basissprachmodellen der Transformer-Klasse (genauer: bei einem reinen Encoder-Modell) vor dem Trainieren den Head (Kopf ) aus. Trotz seines Namens handelt es sich dabei nicht um den vorderen, sondern um den letzten Teil des Netzwerks, der für das Generieren der Ausgabedaten verantwortlich ist. Typischerweise handelt es sich dabei um eine oder mehrere Schichten (Layer), die die Berechnung des neuronalen Netzwerks in ein für die jewei­ lige Aufgabe geeignetes Ausgabeformat umwandeln. Bei exQA-Modellen ist das Ziel, die richtige Antwortspanne zu identifizieren, indem das Modell sowohl die wahrscheinlichsten Starttoken als auch die wahrscheinlichsten Endtoken vorhersagt. Um dies zu erreichen, muss das Netzwerk für jedes Eingabetoken die Wahrscheinlichkeit berechnen, dass es sich bei diesem Token um das Anfangsoder Endtoken der gesuchten Antwort handelt. Abbildung 3 zeigt das beispielhaft: Die jeweiligen schwarzen und roten Neuronen in der Ausgabeschicht zeigen die Wahrscheinlichkeit für das Start- be-

Listing 1: Aufteilen der Dokumente in Abschnitte

Listing 2: Vorauswahl der Dokumente

preprocessor = PreProcessor( split_by="word", split_length=100, split_overlap=10, split_respect_sentence_boundary=True, )

from haystack.nodes.retriever.dense import DensePassageRetriever

docs = preprocessor.process(all_docs)

retriever = DensePassageRetriever(document_store=document_store, query_embedding_model="deepset/gbert-base-germandpr-question_encoder", passage_embedding_model="deepset/gbert-base-germandpr-ctx_encoder") document_store.update_embeddings(retriever)

108

iX Special 2023 – KI © Copyright by Heise Medien.

Listing 3: Festlegen der Parameter für Retriever- und Reader-Node prediction = pipeline.run( query="Was darf ich mit einem Jagdschein?", params={ "Retriever": {"top_k": 10}, "Reader": {"top_k": 5} } )

ziehungsweise Endtoken an. Hierbei bedeutet eine größere Aktivierung dieser Neuronen, dargestellt durch eine stär­ kere Füllfarbe, eine höhere Wahrscheinlichkeit für die jeweilige Position als Start oder Ende der gesuchten Antwortspanne. Falls die wahrscheinlichste Endposition vor der wahrscheinlichsten Anfangsposition liegen sollte, betrachtet das Modell die nächstwahrscheinlichen Start-End-Paare. Auf der anderen Seite ist die Eingabe für das Modell die Nutzerfrage, gefolgt von einem Trennungstoken (>SEP