IFM 3.2 (PO23) / IFM 5.14 (PO18) / INF701: Künstliche Intelligenz (Winter 2024/25)

Quelle: "künstliche intelligenz" by Gerd Altmann (geralt) on Pixabay.com (Pixabay License)

Kursbeschreibung

Ausgehend von den Fragen "Was ist Intelligenz?" und "Was ist künstliche Intelligenz?" werden wir uns in diesem Modul mit verschiedenen Teilgebieten der KI beschäftigen und uns anschauen, welche Methoden und Algorithmen es gibt und wie diese funktionieren. Dabei werden wir auch das Gebiet Machine Learning berühren, aber auch andere wichtige Gebiete betrachten. Sie erarbeiten sich im Laufe der Veranstaltung einen Methoden-Baukasten zur Lösung unterschiedlichster Probleme und erwerben ein grundlegendes Verständnis für die Anwendung in Spielen, Navigation, Planung, smarten Assistenten, autonomen Fahrzeugen, ...

Überblick Modulinhalte

  1. Problemlösen
    • Zustände, Aktionen, Problemraum
    • Suche (blind, informiert): Breiten-, Tiefensuche, Best-First, Branch-and-Bound, A-Stern
    • Lokale Suche: Gradientenabstieg, Genetische/Evolutionäre Algorithmen (GA/EA)
    • Spiele: Minimax, Alpha-Beta-Pruning, Heuristiken
    • Constraints: Backtracking, Heuristiken, Propagation, AC-3
  2. Maschinelles Lernen
    • Merkmalsvektor, Trainingsmenge, Trainingsfehler, Generalisierung
    • Entscheidungsbäume: CAL2, CAL3, ID3, C4.5
    • Neuronale Netze
      • Perzeptron, Lernregel
      • Feedforward Multilayer Perzeptron (MLP), Backpropagation, Trainings- vs. Generalisierungsfehler
      • Steuerung des Trainings: Kreuzvalidierung, Regularisierung
      • Ausblick: Support-Vektor-Maschinen
    • Naive Bayes Klassifikator
  3. Inferenz, Logik (entfällt im W24)
    • Prädikatenlogik: Modellierung, semantische und formale Beweise, Unifikation, Resolution
    • Ausblick: Anwendung in Prolog

Team

Kursformat

Vorlesung (2 SWS)

07.10. - 24.01.
Mo, 11:00 - 12:30 Uhr (DE) (online)
(Flipped Classroom)

Praktikum (2 SWS)

Praktikumsgruppe 07.10. - 24.01.
G1 Mo, 17:00 bis 18:30 Uhr (DE) (online)
G2 Mo, 15:15 bis 16:45 Uhr (DE) (online)
G3 Di, 09:45 bis 11:15 Uhr (DE) (online)

Online-Sitzungen per Zoom (Zugangsdaten siehe ILIAS IFM 3.2 GKI (PO23, 3. Semester)). Sie können hierzu den Raum J101 bzw. J102 (siehe Stundenplan) nutzen.

Vorlesung (2 SWS)

07.10. - 24.01.
Mo, 11:00 - 12:30 Uhr (DE) (online)
(Flipped Classroom)

Praktikum (2 SWS)

Praktikumsgruppe 07.10. - 24.01.
G1 Mi, 11:30 bis 13:00 Uhr (DE) (online)
G2 Mi, 14:00 bis 15:30 Uhr (DE) (online)
G3 Fr, 11:30 bis 13:00 Uhr (DE) (online)

Online-Sitzungen per Zoom (Zugangsdaten siehe ILIAS IFM 5.14 KI (PO18, 5. Semester)). Sie können hierzu den Raum J101 bzw. J102 (siehe Stundenplan) nutzen.

Vorlesung (2 SWS)

30.09. - 25.10. 28.10. - 15.01.
Mo, 12:00 - 13:30 Uhr (TR) Mo, 13:00 - 14:30 Uhr (TR)
online online

Durchführung als Flipped Classroom: Sitzungen per Zoom (Zugangsdaten siehe Google Classroom)

Übung (2 SWS)

Übungsgruppe 30.09. - 15.01.
G1 / G2 wird bekanntgegeben
G3 / G4 wird bekanntgegeben
online

Sitzungen per Google Meet (Zugangsdaten siehe Google Classroom)

Prüfungsform, Note und Credits

Klausur plus Testat, 5 ECTS

  • Testat: Vergabe der Credit-Points

    Kriterien: Mindestens 6 der 10 Aufgabenblätter erfolgreich bearbeitet.

    ("erfolgreich bearbeitet": Bearbeitung individuell (also in 1er Teams), je mindestens 60% bearbeitet, fristgerechte Abgabe der Lösungen im ILIAS, Vorstellung der Lösungen im Praktikum)

  • Klausur: => Modulnote

    Schriftliche Prüfung ("Klausur") am Ende des Semesters (in beiden Prüfungszeiträumen; Prüfungsvorbereitung HSBI).

Klausur plus Testat, 5 ECTS

  • Testat: Vergabe der Credit-Points

    Kriterien: Mindestens 6 der 10 Aufgabenblätter erfolgreich bearbeitet.

    ("erfolgreich bearbeitet": Bearbeitung individuell (also in 1er Teams), je mindestens 60% bearbeitet, fristgerechte Abgabe der Lösungen im ILIAS, Vorstellung der Lösungen im Praktikum)

  • Klausur: => Modulnote

    Schriftliche Prüfung ("Klausur") am Ende des Semesters (in beiden Prüfungszeiträumen; Prüfungsvorbereitung HSBI).

Prüfung Gewicht
Zwischenprüfung 40 %
Endprüfung 60 %
Übung 10 % Bonus für Endprüfung

Wenn in der Endprüfung die 40 Punkte Mindestgrenze erreicht wird (Prüfungsnote ≥40), werden 10 % der Übungspunkte als Bonus zu der Prüfungsnote hinzugefügt.

Für die Vergabe von Übungspunkten ist eine erfolgreiche Teilnahme an der Übung erforderlich. Für Details siehe Prüfung & Noten @TDU.

Materialien

  1. "Artificial Intelligence: A Modern Approach" (AIMA). Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
  2. "Introduction to Artificial Intelligence". Ertel, W., Springer, 2017. ISBN 978-3-319-58487-4. DOI 10.1007/978-3-319-58487-4.
  3. "An Introduction to Machine Learning". Kubat, M., Springer, 2017. ISBN 978-3-319-63913-0. DOI 10.1007/978-3-319-63913-0.

Fahrplan

Hier finden Sie einen abonnierbaren Google Kalender IFM 3.2 GKI (PO23, 3. Semester) mit allen Terminen der Veranstaltung zum Einbinden in Ihre Kalender-App.

Abgabe der Übungsblätter jeweils Montag bis 11:00 Uhr im ILIAS. Vorstellung der Lösung im jeweiligen Praktikum in der Abgabewoche.

Monat Woche Vorlesung Lead Abgabe Aufgabenblatt Vorstellung Praktikum
Oktober 41 07.: Orga (Zoom); Einführung KI, Problemlösen; Machine Learning 101, Perzeptron Carsten, Canan
42 14.: Lineare Regression Canan 14.: Blatt: Perzeptron 14. / 15.
43 21.: Logistische Regression Canan
44 28.: Overfitting, Multilayer Perceptron Canan 28.: Blatt: Regression 28. / 29.
November 45 04.: Backpropagation Canan 04.: Blatt: MLP 04. / 05.
46 11.: Training & Testing, Performanzanalyse Canan 11.: Blatt: Backpropagation 11. / 12.
47 18.: Machine Learning 101, CAL2, Pruning, CAL3, Entropie, ID3 und C4.5 Carsten
48 25.: Tiefensuche, Breitensuche, Branch-and-Bound, Best First, A-Stern Carsten 25.: Blatt: DTL 25. / 26.
Dezember 49 02.: Gradientensuche, Simulated Annealing; Intro EA/GA, Genetische Algorithmen Carsten 02.: Blatt: Suche 02. / 03.
50 09.: Optimale Spiele, Games mit Minimax, Minimax und Heuristiken, Alpha-Beta-Pruning Carsten 09.: Blatt: EA/GA 09. / 10.
51 16.: Projektwoche Semester 1+3
52 23.: Weihnachtspause
01 30.: Weihnachtspause
Januar 02 06.: Einführung Constraints, Lösen von diskreten CSP, CSP und Heuristiken, Kantenkonsistenz und AC-3 Carsten 06.: Blatt: Games 06. / 07.
03 13.: Wahrscheinlichkeitstheorie, Naive Bayes Carsten 13.: Blatt: CSP 13. / 14.
04 20.: Rückblick (Zoom), Prüfungsvorbereitung HSBI Carsten 20.: Blatt: Naive Bayes 20. / 21.
(Prüfungsphase I) Klausur: Di, 04. Feb 2025, 10-18 Uhr (je Klausur 90', Vergabe ca. 2 Wochen vorher)
(Prüfungsphase II) Klausur: Di, 01. Apr 2025, 10-16 Uhr (je Klausur 90', Vergabe ca. 2 Wochen vorher)
News

Die nächste Klausur für "Künstliche Intelligenz" (IFM 5.14, PO18) wird am Mittwoch, 02. Oktober 2024 angeboten. Die Klausur wird als digitale Klausur auf dem Prüfungs-ILIAS der HSBI in Präsenz vor Ort in Minden im Raum B40 durchgeführt. Die Prüfung beginnt um 08:00 Uhr und dauert 90 Minuten. Ein DIN-A4-Zettel ist als Hilfsmittel zugelassen. Der geprüfte Stoff bezieht sich auf den zuletzt durchgeführten Kurs (Winter 2023/2024). Weitere Informationen siehe Prüfungsvorbereitung HSBI.

Hier finden Sie einen abonnierbaren Google Kalender IFM 5.14 KI (PO18, 5. Semester) mit allen Terminen der Veranstaltung zum Einbinden in Ihre Kalender-App.

Abgabe der Übungsblätter jeweils Mittwoch bis 11:00 Uhr im ILIAS. Vorstellung der Lösung im jeweiligen Praktikum in der Abgabewoche.

Monat Woche Vorlesung Lead Abgabe Aufgabenblatt Vorstellung Praktikum
Oktober 41 07.: Orga (Zoom); Einführung KI, Problemlösen; Machine Learning 101, Perzeptron Carsten, Canan
42 14.: Lineare Regression Canan 16.: Blatt: Perzeptron 16. / 18.
43 21.: Logistische Regression Canan
44 28.: Overfitting, Multilayer Perceptron Canan
November 45 04.: Backpropagation Canan 06.: Blatt: Regression 06. / 08.
46 11.: Training & Testing, Performanzanalyse Canan 13.: Blatt: MLP 13. / 15.
47 18.: Machine Learning 101, CAL2, Pruning, CAL3, Entropie, ID3 und C4.5 Carsten 20.: Blatt: Backpropagation 20. / 22.
48 25.: Tiefensuche, Breitensuche, Branch-and-Bound, Best First, A-Stern Carsten 27.: Blatt: DTL 27. / 29.
Dezember 49 02.: Gradientensuche, Simulated Annealing; Intro EA/GA, Genetische Algorithmen Carsten 04.: Blatt: Suche 04. / 06.
50 09.: Optimale Spiele, Games mit Minimax, Minimax und Heuristiken, Alpha-Beta-Pruning Carsten 11.: Blatt: EA/GA 11. / 13.
51 16.: Projektwoche Semester 1+3 18.: Blatt: Games 18. / 20.
52 23.: Weihnachtspause
01 30.: Weihnachtspause
Januar 02 06.: Einführung Constraints, Lösen von diskreten CSP, CSP und Heuristiken, Kantenkonsistenz und AC-3 Carsten
03 13.: Wahrscheinlichkeitstheorie, Naive Bayes Carsten 15.: Blatt: CSP 15. / 17.
04 20.: Rückblick (Zoom), Prüfungsvorbereitung HSBI Carsten 22.: Blatt: Naive Bayes 22. / 24.
(Prüfungsphase I) Klausur: Di, 04. Feb 2025, 10-18 Uhr (je Klausur 90', Vergabe ca. 2 Wochen vorher)
(Prüfungsphase II) Klausur: Di, 01. Apr 2025, 10-16 Uhr (je Klausur 90', Vergabe ca. 2 Wochen vorher)

Förderungen und Kooperationen

Kooperation zw. HSBI und TDU

Über das Projekt "Digital Mobil @ FH Bielefeld" der Fachhochschule Bielefeld (HSBI) ist im Sommer 2020 eine Kooperation mit der Türkisch-Deutschen Universität in Istanbul (TDU) im Modul "Künstliche Intelligenz" gestartet.

Wir werden in diesem Semester die Vorlesungen und auch die Übungen/Praktika wieder im Co-Teaching durchführen. In den Zoom-Sitzungen nehmen deshalb alle Studierenden gemeinsam (TDU und HSBI) teil.

Kooperation mit dem DigikoS-Projekt

Diese Vorlesung wurde zudem vom Projekt "Digitalbaukasten für kompetenzorientiertes Selbststudium" (DigikoS) unterstützt. Ein vom DigikoS-Projekt ausgebildeter Digital Learning Scout hat insbesondere die Koordination der digitalen Gruppenarbeiten, des Peer-Feedbacks und der Postersessions in ILIAS technisch und inhaltlich begleitet. DigikoS wird als Verbundprojekt von der Stiftung Innovation in der Hochschullehre gefördert.

Subsections of IFM 3.2 (PO23) / IFM 5.14 (PO18) / INF701: Künstliche Intelligenz (Winter 2024/25)

Subsections of Einführung KI

Intro: Was ist Künstliche Intelligenz?

TL;DR

KI ist ein altes und modernes Forschungsgebiet, welches periodisch Hype-Zeiten erlebt hat und sich aktuell wieder in einer Hoch-Phase befindet. Wer heute "KI" sagt, meint meist Maschinelles Lernen oder (noch genauer) eine Form von Deep Learning. Dabei gibt es in der KI viele weitere Gebiete: Suche (Problemlösen), Spiele, Constraintprobleme, Entscheidungsbäume, ..., um nur einige zu nennen.

Der Turing-Test (Alan Turin, 1950) hat gewissermaßen die modernen Zweige der KI begründet, u.a. Wissensrepräsentation, Logisches Schließen, Maschinelles Lernen, Verarbeitung natürlicher Sprache, Computer Vision und Robotik. Dabei ist zwischen starker KI und schwacher KI zu unterscheiden.

Häufig werden die Gebiete in einem Diagramm eingeordnet, wobei die x-Achse Verhalten vs. Denken und die y-Achse Rational vs. Menschlich aufspannen. So kann man beispielsweise Logik dem rationalen Denken zuordnen oder die Erforschung kognitiver Prozesse dem Quadranten menschliches Denken.

Wenn man sich die Geschichte der KI anschaut, beobachtet man bei fast allen Themen, dass sie in der Vergangenheit eine Hype-Phase erlebt haben und dabei die oft stark überzogenen Erwartungen enttäuscht haben und danach meist nur wenig Beachtung erfuhren. Nach einer Weile kamen die Themen wieder "auf die Tagesordnung", diesmal mit vernünftigen Erwartungen.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K1) Aspekte, die zur Intelligenz gerechnet werden
  • (K1) Turing-Test: Aufbau, Gebiete, Kritik
  • (K1) Gebiete der KI sowie deren Zielsetzung
  • (K1) Starke vs. schwache KI
  • (K1) Wichtige Strömungen in der KI und ihre zeitliche Einordnung

Was ist (künstliche) Intelligenz?

Quelle: AvB - RoboCup 2013 - Eindhoven by RoboCup2013 on Flickr.com (CC BY 2.0)

  • Was ist (künstliche) Intelligenz?
  • Ist Commander Data intelligent?
  • Woran erkennen Sie das?

Definition Intelligenz

Intelligenz (von lat. intellegere "verstehen", wörtlich "wählen zwischen ..." von lat. inter "zwischen" und legere "lesen, wählen") ist in der Psychologie ein Sammelbegriff für die kognitive Leistungsfähigkeit des Menschen. Da einzelne kognitive Fähigkeiten unterschiedlich stark ausgeprägt sein können und keine Einigkeit besteht, wie diese zu bestimmen und zu unterscheiden sind, gibt es keine allgemeingültige Definition der Intelligenz.

 Quelle: "Intelligenz" by Cumtempore and others on Wikipedia (CC BY-SA 3.0)

Das ist spannend: Es gibt keine allgemeingültige Definition für den Begriff "Intelligenz". Damit wird es schwierig, auch "Künstliche Intelligenz" zu definieren ...

Aber wir können aus dieser Definition auf Wikipedia mitnehmen, dass es um kognitive Fähigkeiten geht. Verstehen und im weiteren Sinne Denken sind bereits im Begriff enthalten und damit auch Teil der kognitiven Fähigkeiten.

Schauen wir uns nun noch die Definition von "kognitiven Fähigkeiten" genauer an.

Zu den kognitiven Fähigkeiten eines Menschen zählen die Wahrnehmung, die Aufmerksamkeit, die Erinnerung, das Lernen, das Problemlösen, die Kreativität, das Planen, die Orientierung, die Imagination, die Argumentation, die Introspektion, der Wille, das Glauben und einige mehr. Auch Emotionen haben einen wesentlichen kognitiven Anteil.

 Quelle: "Kognition" by Arbraxan and others on Wikipedia (CC BY-SA 3.0)

Zu den kognitiven Fähigkeiten und damit zur Intelligenz zählen also eine Reihe von Fähigkeiten, die man Menschen im allgemeinen zuschreibt. Lernen und Problemlösen und Planen sind Dinge, die vermutlich jeder direkt mit dem Begriff Intelligenz verbindet. Interessanterweise gehören auf auch Aufmerksamkeit und Wahrnehmung und Orientierung mit dazu -- Fähigkeiten, die beispielsweise in der Robotik sehr wichtig sind. Kreativität und Vorstellung zählen aber auch mit in den Bereich der kognitiven Fähigkeiten und damit zum Begriff Intelligenz. In der KI werden diese Gebiete zunehmend interessant, etwa beim Komponieren von Musik und beim Erzeugen von Bildern oder Texten. Mit Emotionen beschäftigt sich die KI-Forschung aktuell nur am Rande, etwa bei der Erkennung von Emotionen in Texten. Andere Gebiete der kognitiven Fähigkeiten wie Glaube und Wille spielen derzeit keine Rolle in der KI.

Versuch einer Definition für "KI"

Ziel der KI ist es, Maschinen zu entwickeln, die sich verhalten, als verfügten sie über Intelligenz.

 -- John McCarthy (1955)

Einwand: Braitenberg-Vehikel zeigen so etwas wie "intelligentes" Verhalten, sind aber noch lange nicht intelligent! Bezieht sich nur auf Verhalten!

KI ist die Fähigkeit digitaler Computer oder computergesteuerter Roboter, Aufgaben zu lösen, die normalerweise mit den höheren intellektuellen Verarbeitungsfähigkeiten von Menschen in Verbindung gebracht werden ...

 -- Encyclopedia Britannica

Einwand: Dann wäre aber auch Auswendig-Lernen oder das Multiplizieren langer Zahlen als intelligent zu betrachten! Bezieht sich vor allem auf "Denken"!

Artificial Intelligence is the study of how to make computers do things at which, at the moment, people are better.

 -- Elaine Rich ("Artificial Intelligence", McGraw-Hill, 1983)

Quelle: nach [Ertel2017, pp. 1-3]

Dazu gehört auch

  • Anpassung an sich verändernde Situationen
  • Erkennung von Bildern und Gesichtern und Emotionen
  • Erkennung von Sprache
  • Umgang mit kontextbehafteten, unvollständigen Informationen
  • Ausräumen von Geschirrspülern ;-)
  • Über Emotionen und Empathie verfügen
KI-Grundverordnung der EU

Die EU hat am 13. Juni 2024 die sogenannte "KI-Verordnung" verabschiedet ("VERORDNUNG (EU) 2024/1689 DES EUROPÄISCHEN PARLAMENTS UND DES RATES", Document 32024R1689: Verordnung (EU) 2024/1689 des Europäischen Parlaments und des Rates vom 13. Juni 2024 zur Festlegung harmonisierter Vorschriften für künstliche Intelligenz und zur Änderung der Verordnungen (EG) Nr. 300/2008, (EU) Nr. 167/2013, (EU) Nr. 168/2013, (EU) 2018/858, (EU) 2018/1139 und (EU) 2019/2144 sowie der Richtlinien 2014/90/EU, (EU) 2016/797 und (EU) 2020/1828 (Verordnung über künstliche Intelligenz) (Text von Bedeutung für den EWR)).

Dort finden Sie unter Artikel 3 "Begriffsbestimmungen" unter Absatz 1 eine Begriffsdefinition. Ein "KI-System" wird darin als ein maschinengestütztes System definiert, in irgendeiner Art für einen autonomen Betrieb ausgelegt ist und eine gewisse Anpassungsfähigkeit haben kann. Zusätzlich soll das "KI-System" aus den Eingaben Vorhersagen und Entscheidungen zu treffen oder auch Inhalte erzeugen und mit der physischen oder digitalen Umwelt interagieren können. Quelle: VERORDNUNG (EU) 2024/1689 DES EUROPÄISCHEN PARLAMENTS UND DES RATES, Art. 3 Abs. 1

Interessant ist, dass dabei nicht explizit auf Softwaresysteme eingegangen wird. Später im Text finden sich Hinweise, dass sich ein KI-System vermutlich als Software repräsentiert, auch kommen Modelle und Daten vor. Bei den Modellen kommt der Begriff des Lernens vor, in allen derzeit üblichen Varianten (überwachtes Lernen, unüberwachtes Lernen, Reinforcement Learning). Große Teile des Dokuments beschäftigen sich mit weitreichenden Bestimmungen für Akteure, die ein KI-System zur Verfügung stellen wollen.

Lesen Sie selbst: VERORDNUNG (EU) 2024/1689 DES EUROPÄISCHEN PARLAMENTS UND DES RATES.

Alan Turing 1950: Turing-Test (begründet Zweige der KI)

  • Wann verhält sich eine Maschine intelligent?

Quelle: Turing Test version 3.png by Bilby on Wikimedia Commons (Public Domain)

Zum Bestehen des Turing-Tests ist (u.a.) erforderlich:

  • Wissensrepräsentation: Speichern des gesammelten Wissens => Wissensbasierte Systeme
  • Logisches Schließen: Beantworten von Fragen mit Hilfe des vorhandenen Wissens => Logik, Resolution
  • Maschinelles Lernen: Anpassung an veränderliches Umfeld => Musteranalyse und Mustererkennung und Mustervorhersage
  • Verarbeitung natürlicher Sprache: Erfolgreiche Kommunikation, beispielsweise in Englisch => NLP

"Totaler Turing-Test": zusätzlich Computer Vision (Erkennen von Objekten) und Robotik (Manipulation von Objekten)

Damit begründet der Turing-Test die Gebiete der KI.

Problem: Der Turing-Test ist nicht reproduzierbar, nicht konstruktiv und nicht mathematisch analysierbar ... Außerdem wird durch den Turing-Test im Wesentlichen nur Funktionalität geprüft, nicht ob Intention oder Bewusstsein vorhanden ist.

Starke vs. schwache KI

"Schwache KI"

  • Simulation intelligenten Verhaltens
  • Lösung konkreter Probleme
  • Adaptives Verhalten ("Lernen")
  • Umgang mit Unsicherheit und unvollständigen Informationen

"Starke KI"

  • Eigenschaften der "schwachen KI"
  • Intelligenz nach menschlichen Maßstäben (auf "Augenhöhe")
  • Bewusstsein
  • Emotionen (?)
  • Empathie
Frage

Wie würden Sie Systeme wie ChatGPT einordnen? Woran machen Sie das fest?

Typische Ansätze in der KI

Untersuchung von

  • Verhalten vs. Denken
  • Rational vs. menschlich

Motivation dabei

  • Menschliche Intelligenz verstehen
  • Intelligente/intelligent wirkende Systeme bauen

Damit erhält man vier Kombinationen:

  • Menschliches Denken
  • Rationales Denken
  • Rationales Verhalten
  • Menschliches Verhalten

Menschliches Denken: Kognitive Modellierung

  • Welche kognitiven Fähigkeiten sind für intelligentes Verhalten nötig? Wie laufen Denkprozesse im Gehirn ab?
  • Erfordert Theorien über interne Aktivitäten des Gehirns
  • Ansätze:
    • top-down: Vorhersage und Test von menschlichem Verhalten
    • bottom-up: Auswertung neurobiologischer Daten
  • Wissenschaftszweige: Kognitionswissenschaft (Verbindung der Computermodelle der KI mit den Experimenten und Theorien der Psychologie), Neurobiologie/-informatik
Neuronale bzw. Konnektionistische KI

Die Schule der sogenannten "Neuronalen bzw. Konnektionistischen KI" verfolgt den Ansatz, die biologischen Prozesse im Gehirn zu verstehen und nachzubauen (bottom-up Ansatz) und auf reale Probleme anzuwenden.

Dank massiver Rechenleistung, riesigen Datenmengen und geeigneten Modellen (Deep Learning) kann diese Tradition aktuell große Erfolge vorzeigen.

Rationales Denken: Aristoteles: Was sind korrekte Argumente und Denkprozesse? => Wie sollen wir denken?

Beispiel:

Fakt: Sokrates ist ein Mensch.
Fakt: Alle Menschen sind sterblich.
Folgerung: Sokrates ist sterblich.
  • Formalisierte Problembeschreibung
  • Problemlösung durch logische Prozesse
  • Verbindung von moderner KI zur Mathematik und Philosophie
Symbolische KI

Die Schule der sogenannten "Symbolische KI" verfolgt den top-down-Ansatz, mit Hilfe formaler Beweise Schlüsse zu ziehen und damit Fragen zu beantworten bzw. Probleme zu lösen. Dabei wird die betrachtete "Welt", also Gedanken, Konzepte und Beziehungen zwischen Objekten durch Symbole und Formeln repräsentiert, ähnlich der Art und Weise, wie Menschen logisch denken und kommunizieren.

Das Hauptproblem dieser Tradition liegt im Aufwand bei der geeigneten Formalisierung der realen Welt.

Rationales Verhalten: Das "Richtige" tun

  • Das "Richtige": Verhalten zum Erzielen des besten (erwarteten) Ergebnisses (unter Berücksichtigung der verfügbaren Informationen)

    Ein System ist rational, wenn es das seinen Kenntnissen nach "Richtige" macht.

  • Denken ist nicht unbedingt notwendig (zb. Reflexe können auch rationales Verhalten sein)

  • Interessant: "richtige" Handlung unter unvollständigen/unsicheren Informationen

Statistische KI

Die Schule der sogenannten "Statistischen KI" verfolgt einen Ansatz, der sich stark auf statistische Methoden und Modelle stützt, um Muster in Daten zu erkennen und Entscheidungen zu treffen, also um aus großen Datenmengen Erkenntnisse zu gewinnen und Vorhersagen zu treffen.

Aus der Analyse von Datenpunkten und deren Merkmalen werden Wahrscheinlichkeiten für bestimmte Ereignisse berechnet, beispielsweise in Regressionsanalysen, Klassifizierungsverfahren oder Zeitreihenanalysen.

Diese Tradition spielt eine zentrale Rolle in zahlreichen Anwendungsbereichen wie Gesundheitswesen, Finanzen, Marketing und vielen weiteren.

Menschliches Verhalten: Na ja, Sie wissen schon ;-)

Modelle, Lernen und Vorhersagen

In der Informatik allgemein und auch in der KI versuchen wir, Probleme der realen Welt mit Hilfe von künstlichen Systemen (Algorithmen, Software) zu lösen. Dafür brauchen wir zunächst ein abstraktes mathematisches Modell der Welt, in der wir uns bewegen. Das Modell sollte alle für das zu lösende Problem relevanten Aspekte der Welt repräsentieren - und möglichst nicht mehr als diese, um unnötige Komplexität zu vermeiden. Es kommt häufig vor, dass selbst die relevanten Aspekte zu umfangreich oder teilweise sogar unbekannt sind und nicht vollständig dargestellt werden können. Modelle stellen also eine Abstraktion der echten Welt dar und sind verlustbehaftet. Es gibt viele verschiedene Modelle.

Beispiel: Wir möchten von Bielefeld nach Minden fahren. Neben den offensichtlichen Parametern (Womit wollen wir fahren? Wo genau ist der Startpunkt, wo genau der Zielpunkt? Wann wollen wir fahren?) spielen in der realen Welt unendlich viele Aspekte eine Rolle: Farben, Gerüche, Licht, Beschaffenheit der einzelnen Straßen, exakte Positionen auf der Straße/im Ort ... Sind diese wirklich relevant für dieses Problem? Am Ende wird es wichtig sein, eine abstrakte Darstellung zu finden, die irgendwie die Städte und Dörfer repräsentiert und die Verbindungen dazwischen. Und vermutlich muss ich wissen, wie lang die Strecken jeweils sind (oder wie lange ich brauche oder wieviel Geld mich das Abfahren kostet). Es scheint also so zu sein, dass eine Abstraktion des Problems als Graph sinnvoll ist: Die Knoten entsprechen den Orten, die Kanten den Straßen (oder Bahnlinien o.ä.). An den Kanten sind Kosten annotiert (Kilometer, Zeit, ...). Damit ignorieren wir die Komplexität der realen Welt und fokussieren uns auf die Aspekte, die zur Lösung des Problems wichtig sind. Behalten Sie im Gedächtnis, dass unser Modell verlustbehaftet ist und wir damit tatsächlich nur das Wegeproblem lösen können! Wenn wir Wege vergessen haben oder falsch bewertet haben, wird unser Algorithmus später möglicherweise nicht die gewünschte Lösung finden! Wir schauen uns das Thema Modellierung am Beispiel des Problemlösens und insbesondere für Suchprobleme in der Lektion Problemlösen noch genauer an.

Ein Modell kann Parameter haben. Im obigen Beispiel wären dies die Werte an den Kanten. Es kann sein, dass diese Werte nicht im Vorfeld bekannt sind, sondern aus einem Datensatz extrahiert werden müssen. Dies nennt man Lernen: Das Modell wird (besser gesagt: die Parameter des Modells werden) an das Problem angepasst. Dafür gibt es unterschiedliche Algorithmen. In der Regel benötigt man ein Ziel für den Adaptionsprozess: eine sogenannte Ziel- oder Kostenfunktion. Anpassen der Modellparameter mit Hilfe von Daten und einer Zielfunktion bedeutet auch, dass man das Ziel möglicherweise nie zu 100% erreicht, sondern nur in die Nähe kommt. Je nach Problem kann man auch nur eine Modellfamilie vorgeben und den konkreten Aufbau des Modells im Trainingsprozess erarbeiten lassen.

Wichtig: Lernen bietet sich immer dann an, wenn eine analytische Lösung nicht möglich ist (fehlende Informationen, Komplexität des Problems). Das bedeutet im Umkehrschluss aber auch: Wenn eine analytische Lösung bekannt ist (oder zu finden ist), dann gibt es keinen Grund für den Einsatz von adaptiven Systemen!

Mit dem Modell der Welt kann nun das Problem gelöst werden. Dazu wird das Modell mit Daten versorgt (im obigen Beispiel: Start und Ziel) und ein passender Algorithmus kann auf dem Modell die Lösung berechnen. Dies kann eine Vorhersage sein, welchen Weg ich nehmen soll, wie lange es dauern wird, welchen Spielzug ich als nächstes machen sollte, ob in einem Bild eine Katze zu sehen ist, ... Es könnte aber auch im Fall von sogenannten generativen Modellen ein erzeugter Text oder ein erzeugtes Bild sein.

Hinweis: In manchen Quellen wird dieser Vorgang auch "Inferenz" genannt. Da dieser Begriff aus der Logik stammt und mit bestimmten Prozessen zur Schlussfolgerung verbunden ist, möchte ich in diesem Skript diesen Begriff nicht für das Generieren einer Vorhersage nutzen.

Modellkomplexität

In der KI werden sehr unterschiedliche Modelle betrachtet, die auch eine sehr unterschiedliche Komplexität aufweisen.

Besonders einfache Modelle sind Modelle, die für einen Input direkt einen Output berechnen. Für jeden Input wird eine feste Berechnung durchgeführt, es erfolgt kein Backtracking und es gibt keine (inneren) Zustände. Dies ähnelt dem reflexartigen Verhalten in biologischen Vorbildern, weshalb diese Modell oft auch "reflex-based models" genannt werden. In diese Kategorie fallen beispielsweise lineare Regression und das Perzeptron, aber auch Modelle mit vielen Parametern wie ein Multilagen-Perzeptron (MLP) oder die daraus abgeleiteten Deep Neural Networks.

In der nächst komplexeren Stufe haben die Modelle einen internen Zustand ("state-based models"). Darüber wird ein Zustand der betrachteten Welt modelliert. Zwischen den Zuständen gibt es Übergänge (sogenannte Aktionen), so dass sich hier ein Graph aufspannt (der sogenannte Problemgraph, vgl. Problemlösen). In diese Klasse fallen die typischen Suchprobleme (wie Breitensuche, Tiefensuche, A*), aber auch Spiele mit Zufallskomponente oder mit gegnerischen Mitspielern.

Noch eine Stufe komplexer sind Modelle mit Variablen ("variable-based models"). Während es bei den zustandsbasierten Modellen immer (auch) um den Weg zwischen den Zuständen geht und damit um eine prozedurale Beschreibung, wie von einem Startzustand zu einem Zielzustand zu gelangen ist, steht bei Modellen mit Variablen nur die Lösung im Vordergrund: Das Modell enthält verschiedene Variablen, denen ein passender Wert aus einem Wertebereich zugeordnet werden muss. Wie diese Belegung entsteht, ist am Ende nicht mehr so interessant. Denken Sie beispielsweise an ein Sudoku oder die Erstellung eines Stundenplans. Die Variablen sind entsprechend die einzelnen Felder, gesucht ist eine insgesamt korrekte Belegung aller Felder. In diese Klasse fallen Constraint Satisfaction Probleme (CSP), aber auch Bayes'sche Netze und die sogenannte “lokale Suche”.

Auf der höchsten Komplexitätsstufe stehen logische Modelle. Hier wird Wissen über die Welt in Form von Fakten und Regeln modelliert, und über eine entsprechende Anfrage wird daraus mit Hilfe von formal definierten Beweisen eine korrekte Antwort generiert. Dies nennt man auch "Inferenz". Hier kommt beispielsweise das Prädikatenkalkül zum Einsatz oder die Programmiersprache Prolog.

Kurzer Geschichtsüberblick -- Wichtigste Meilensteine

  • 1943: McCulloch/Pitts: binäres Modell eines Neurons
  • 1950: Turing-Test
  • 1956: Dartmouth Workshop (Minsky, McCarthy, ...) -- McCarthy schlägt den Begriff "Artificial Intelligence" vor
  • 1960er: Symbolische KI (Theorembeweiser), Blockwelt, LISP
  • 1970er: Wissensbasierte System (Expertensysteme)
  • 1980er: zunächst kommerzieller Erfolg der Expertensysteme, später Niedergang ("KI-Eiszeit"); Zuwendung zu Neuronalen Netzen
  • 1990er: Formalisierung der KI-Methoden, Einführung probabilistischer Methoden (Bayes'sches Schließen), verstärkte mathematische Fundierung
  • heute: friedliche Koexistenz verschiedener Paradigmen und Methoden; Rückkehr zu "Human-Level AI" (McCarthy, Minsky, Nilsson, Winston); Rückkehr zu Neuronalen Netzen (CNN/RNN)

Siehe auch Abbildung 1.3 in [Ertel2017, S.8] ...

Wrap-Up

  • Definition von "Intelligenz" nicht ganz einfach
  • Dimensionen: Denken vs. Verhalten, menschlich vs. rational
  • Ziele der KI: Verständnis menschlicher Fähigkeiten, Übertragen auf künstliche Systeme

Schauen Sie sich zur Einführung auch gern das YouTube-Video Overview Artificial Intelligence Course | Stanford CS221 an. (Vorsicht: Das ist recht lang.)

Übungsblätter/Aufgaben
Quellen

Problemlösen

TL;DR

Um ein Problem lösen zu können, muss es zunächst geeignet dargestellt werden. In der KI betrachten wir Zustände einer Welt, auf die Aktionen angewendet werden können und die die betrachtete Welt in den/einen Folgezustand bringen. Hier muss unterschieden werden zwischen deterministischen und stochastischen Welten, ebenso spielt die Beobachtbarkeit durch den Agenten (die die Welt betrachtende und durch die Aktionen auf die Welt einwirkende Instanz) eine Rolle: Kann der Agent die Welt komplett beobachten, nur einen Teil davon oder gar nichts? Es spielt auch eine Rolle, ob es diskrete Zustände gibt, oder ob man mit kontinuierlichen Variablen zu tun hat. Gibt es nur einen Agenten oder können mehrere Agenten beteiligt sein ... (In dieser Veranstaltung werden wir uns auf deterministische und voll beobachtbare Welten mit diskreten Zuständen konzentrieren.)

Dies alles muss bei der Modellierung betrachtet werden. Es empfiehlt sich, die Zustände und die Aktionen so abstrakt wie möglich zu beschreiben. Anderenfalls kann später die Lösung des Problems zumindest stark erschwert werden.

Durch das wiederholte Anwenden der Aktionen auf den Startzustand bzw. auf die sich daraus ergebenden Folgezustände wird der Zustandsraum aufgebaut. Dabei ist zu beachten, dass Aktionen Vorbedingungen haben können, d.h. unter Umständen nicht auf alle Zustände angewendet werden können. Die entstehende Struktur (Zustandsraum) kann man formal als Graph repräsentieren: Die Zustände werden durch die Knoten und die Aktionen als (gerichtete) Kanten im Graph dargestellt (=> Problemgraph).

Das Problemlösen entspricht nun einer Suche im Problemgraphen: Man sucht einen Weg von einem Startknoten zu einem Zielknoten, d.h. eine Folge von Aktionen, die den Start- in den Zielzustand überführen. Der Weg entspricht dann der Lösung des Problems. Normalerweise will man eine bestimmte Qualität der Lösungen haben: Es sollen die kürzesten Wege (also die mit den wenigsten Zwischenstationen/Knoten) oder die billigsten Wege (die Summe der an den Kanten annotierten Gewichte soll minimal sein) gefunden werden.

Zur Suche kann man bei den in dieser Veranstaltung betrachteten deterministischen Problemen mit diskreten Zuständen den einfachen "Tree-Search"-Algorithmus (Benennung in Anlehnung an [Russell2020]) einsetzen, der allerdings Wiederholungen und Schleifen zulässt. Mit zwei Erweiterungen wird daraus der "Graph-Search"-Algorithmus (Benennung in Anlehnung an [Russell2020]), der die wiederholte Untersuchung von bereits besuchten Knoten vermeidet. In beiden Algorithmen wird eine zentrale Datenstruktur eingesetzt (im [Russell2020] auch "Frontier" genannt), die die als Nächstes zu untersuchenden Knoten hält und die damit die Grenze zwischen dem bereits untersuchten Teil des Graphen und dem unbekannten Teil des Graphen bildet. Je nach Art der Datenstruktur und je nach den betrachteten Kosten ergeben sich eine Reihe unterschiedlicher Suchalgorithmen, die wir in einer späteren Sitzung betrachten.

Die Suchverfahren können im Hinblick auf Optimalität, Vollständigkeit und Komplexität beurteilt werden.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Definition Problem: Begriffe Zustand, Aktion, Zustandsraum, Problemgraph, Suchbaum
  • (K2) Problemlösen als Suche nach Wegen im Problemgraph => Suchbaum
  • (K2) Unterschied zw. Tree-Search und Graph-Search

Motivation: Roboter in einer Bibliothek

Aktionen:

  • Right (R)
  • Left (L)
  • Take (T)
  • Drop (D)

Wahrnehmungen:

  • In welchem Raum bin ich?
  • Habe ich das Buch?

Aufgabe: Das Buch aus der Bibliothek holen und in den Kopiererraum bringen.

Bemerkungen zur Umwelt:

  • Beobachtbarkeit der Umwelt kann variieren: "voll beobachtbar" bis zu "unbeobachtbar"
  • Umwelt kann "deterministisch" oder "stochastisch" sein: Führt eine Aktion in einem Zustand immer zum selben Folgezustand?
  • Wann erfolgt die Rückmeldung an den Agenten über die Auswirkung der Aktionen? Sofort ("sequentiell") oder erst am Ende einer Aktionsfolge ("episodisch")?
  • Wird die Umwelt nur durch die Aktionen des Agenten verändert ("statisch")? Oder verändert sich die Umwelt zwischen den Aktionen eines Agenten, beispielsweise durch andere Agenten ("dynamisch")?
  • Gibt es diskrete Zustände (wie im Beispiel)?

Zustände der Bibliotheks-Welt

Problem: Gegeben einen Startzustand, wie komme ich zum Ziel?

  • Welche Aktionen können in einem Zustand (zb. Nr. 4) angewendet werden?
  • Welche Aktionen können in den Folgezuständen angewendet werden?

Ergebnis:

  • Zustandsraum: Menge aller von den Startzuständen aus erreichbaren Zustände
  • Problemgraph: Repräsentation der Zustände und Aktionen als Knoten und (gerichtete) Kanten

Suche im Problemgraphen

  • Durch die Suche im Problemgraphen wird ein Suchbaum aufgespannt
  • Varianten: Zustände können in einem Pfad wiederholt vorkommen vs. Wiederholungen werden ausgeschlossen

Definition Zustand und Aktion

Zustand:
(Formale) Beschreibung eines Zustandes der Welt
Aktion:

(Formale) Beschreibung einer durch Agenten ausführbaren Aktion

  • Anwendbar auf bestimmte Zustände
  • Überführt Welt in neuen Zustand ("Nachfolge-Zustand")

Geeignete Abstraktionen wählen für Zustände und Aktionen!

Anmerkung: [Russell2020] unterscheidet zw. Aktionen und Transitionsmodell; hier nur Aktionen! D.h. die Aktionen und das Übergangsmodell aus dem [Russell2020] werden direkt zusammen betrachtet. Bei den hier diskutierten Problemen ist das ohne Nachteile möglich, es wird lediglich etwas Flexibilität genommen bzw. Komplexität vermieden (je nach Sichtweise :-) ...

Definition Problem

Ein Problem besteht aus:

Startzustände
Menge $S_A \subset S$
Aktionen
Menge von Funktionen $\operatorname{op}: S \to S$
Zustandsraum
Menge aller Zustände $S$, die durch (wiederholte) Anwendung von Aktionen von den Startzuständen aus erreichbar sind
Zieltest
Funktion $\operatorname{goal}: S \to \{0,1\}$
Zielzustände
Menge $S_E \subseteq S$ mit $\forall x \in S_E : \operatorname{goal}(x)=1$
Kosten

Gesamtkosten: $f(n) = g(n) + h(n)$

  • $n \in S$ auf dem aktuellen Weg erreichter Knoten
  • $g(n)$ tatsächliche Kosten für den Weg vom Start bis zu Knoten $n$
  • $h(n)$ geschätzte Restkosten für den Weg von Knoten $n$ zum Ziel

Hinweis: Unterschied Zustand und Knoten bzw. Zustandsraum und Problemgraph

  • Zustände und Aktionen kann man als einen Graph darstellen: Problemgraph
    • Zustände werden als Knoten im Graphen abgebildet
    • Aktionen werden als (gerichtete) Kanten im Graphen abgebildet
  • Unterscheidung "Zustand" und "Knoten":
    • Zustand: Beschreibung/Modellierung eines Zustandes der Welt
    • Knoten: Datenstruktur, Bestandteil des Graphen, symbolisiert einen Zustand

Das bedeutet, dass der Problemgraph eine Repräsentation des Zustandsraumes ist.

Die beiden Begriffe werden normalerweise synonym verwendet, sofern eindeutig ist, was gemeint ist.

Definition Problemlösen

Problemlösen

Wegesuche im Graph vom Startknoten zu einem Zielknoten

  • Spannt den Suchbaum auf
Lösung

Folge von Aktionen, die Start- in Zielzustand überführen

Ergebnis des Problemlösens

Suche: Einfache Basisvariante

  1. Füge Startknoten in leere Datenstruktur (Stack, Queue, ...) ein
  2. Entnehme Knoten aus der Datenstruktur:
    • Knoten ist gesuchtes Element: Abbruch, melde "gefunden"
    • Expandiere alle Nachfolger des Knotens und füge diese in die Datenstruktur ein
  3. Falls die Datenstruktur leer ist: Abbruch, melde "nicht gefunden"
  4. Gehe zu Schritt 2

Für die in dieser Veranstaltung betrachteten deterministischen Probleme mit diskreten Zuständen ist diese Basisvariante der Suche eine Art generischer Suchalgorithmus: Durch die Variation der eingesetzten Datenstruktur und durch die Betrachtung unterschiedlicher Kosten erhält man die in den nächsten Sitzungen betrachteten verschiedenen klassischen Suchalgorithmen.

Anmerkung: Für Handsimulation besserer Überblick, wenn statt der Knoten immer partielle Wege in Datenstruktur gespeichert werden!

Anmerkung: Im [Russell2020, Abschnitt 3.3.3, S.92] wird ein Algorithmus mit den vorgestellten Eigenschaften als "tree-like search" bezeichnet. In Anlehnung an [Russell2020] wird diese Basisvariante der Suche in dieser Lehrveranstaltung kurz als "Tree-Search"-Algorithmus bezeichnet.

Anmerkung: Im [Russell2020] wird für die Datenstruktur, mit der die Suche arbeitet, auch "Frontier" genannt. Hier werden alle Knoten gehalten, die in einem der nächsten Schritte betrachtet werden sollen, d.h. diese Knoten bilden die Grenze zwischen dem bereits untersuchten Teil des Graphen und dem noch unbekannten Teil des Graphen (deshalb auch "Frontier").

Erweiterung der Suche: Vermeiden von Wiederholungen

  1. Füge Startknoten in leere Datenstruktur (Stack, Queue, ...) ein
  2. Entnehme Knoten aus der Datenstruktur:
    • Knoten ist gesuchtes Element: Abbruch, melde "gefunden"
    • Markiere aktuellen Knoten, und
    • Expandiere alle Nachfolger des Knotens und füge alle unmarkierten Nachfolger, die noch nicht in der Datenstruktur sind, in die Datenstruktur ein
  3. Falls die Datenstruktur leer ist: Abbruch, melde "nicht gefunden"
  4. Gehe zu Schritt 2

Dieser Algorithmus ist eine Erweiterung der einfachen Basisvariante der Suche:

  1. Man markiert bereits besuchte (expandierte) Knoten und besucht diese nie wieder (man würde diese bei einer Expansion nicht wieder in die Datenstruktur aufnehmen).
  2. Außerdem vermeidet man, dass ein Knoten mehrfach in der Datenstruktur vorkommt: Dies würde bedeuten, dass man hier verschiedene Wege vom Start zu diesem Knoten in der Datenstruktur hat, die dann auch alle weiter untersucht werden müssten. In der Regel reicht aber ein Weg vom Start zu einem Zwischenknoten (meist wird der kürzeste genommen, dazu in einer späteren Sitzung mehr).

Anmerkung: Für Handsimulation besserer Überblick, wenn statt der Knoten immer partielle Wege in Datenstruktur gespeichert werden!

Anmerkung: Im [Russell2020, Abschnitt 3.3.3, S.92] wird ein Algorithmus mit den vorgestellten Eigenschaften als "graph search" bezeichnet. In Anlehnung an [Russell2020] wird diese erweiterter Variante der Suche in dieser Lehrveranstaltung kurz als "Graph-Search"-Algorithmus bezeichnet.

Bewertung von Suchalgorithmen

Vollständigkeit
Findet der Algorithmus eine Lösung, wenn es eine gibt?
Optimalität
Findet der Algorithmus die beste Lösung?
Zeitkomplexität
Wie lange dauert es eine Lösung zu finden?
Speicherkomplexität
Wieviel Speicher benötigt die Suche?

Größen zur Bewertung:

  • b: Verzweigungsfaktor
  • d: Ebene (Tiefe) des höchsten Lösungsknotens
  • m: Länge des längsten Pfades

Wrap-Up

  • Begriffe "Problem", "Zustand", "Aktion", "Zustandsraum", "Problemgraph", "Suchbaum"

  • Problemlösen: Suche in Graphen nach Weg vom Start zum Ziel

    • Suche spannt einen Suchbaum auf
    • Unterschiedliche Kostenfunktionen möglich
    • Suchalgorithmen: Einfache Basisvariante, Erweiterung mit Vermeidung von Redundanzen
    • Beurteilung der Suchverfahren: Optimalität, Vollständigkeit, Komplexität
Challenges

Drei Elben und drei Orks befinden sich an einem Ufer eines Flusses und wollen diesen überqueren. Es steht dazu ein Pferd zur Verfügung, welches maximal zwei Wesen tragen kann. Das Pferd kann den Fluss nicht allein überqueren.

Gesucht ist eine Möglichkeit, alle Elben und Orks über den Fluss zu bringen. Dabei darf zu keiner Zeit an keinem Ufer die Anzahl der sich dort befindlichen Orks größer sein als die der dort wartenden Elben, da es sonst zu Konflikten zwischen beiden Gruppen kommt.

  1. Formalisieren Sie das Problem (Zustände, Aktionen, Start- und Endzustand).
  2. Skizzieren Sie den Problemgraph.
Übungsblätter/Aufgaben
Quellen

Entscheidungsbäume (Decision Tree Learner - DTL)

Beim überwachten Lernen soll eine Hypothese aufgebaut werden, die der echten (zu lernenden) Funktion möglichst nahe kommt. Eine Hypothese kann im einfachsten Fall als Entscheidungsbaum dargestellt werden. Die Merkmale bilden dabei die Knoten im Baum, und je Ausprägung gibt es eine Kante zu einem Nachfolgerknoten. Ein Merkmal bildet die Wurzel des Baums, an den Blättern sind die Klassen zugeordnet.

Einen Entscheidungsbaum kann man zur Klassifikation eines Objekts schrittweise durchlaufen: Für jeden Knoten fragt man die Ausprägung des Merkmals im Objekt ab und wählt den passenden Ausgang aus dem Knoten. Wenn man am Blatt angekommen ist, hat man die Antwort des Baumes auf das Objekt, d.h. üblicherweise die Klasse.

Subsections of Entscheidungsbäume (Decision Tree Learner - DTL)

Machine Learning 101

TL;DR

Lernen wird in der KI oft als Verhaltensänderung (eines Systems) aufgefasst. Dabei soll eine Gütefunktion optimiert werden.

Je nach verfügbarem Feedback eines "Lehrers" werden typischerweise drei Arten von Lernen unterschieden: Überwachtes Lernen, Unüberwachtes Lernen, Reinforcement Lernen. Dabei stellt der Lehrer beim überwachten Lernen Trainingsbeispiele plus eine Vorgabe (Klasse, Funktionswert) zur Verfügung, während beim unüberwachten Lernen nur die Trainingsbeispiele bereitgestellt werden und der Algorithmus selbst Zusammenhänge in den Daten erkennen soll. Beim Reinforcement Learning erfolgt das Feedback am Ende einer Kette von Aktionen, d.h. der Algorithmus muss diese Bewertung auf die einzelnen Aktionen zurückrechnen.

Beim überwachten Lernen soll eine Hypothese aufgebaut werden, die der echten (zu lernenden) Funktion möglichst nahe kommt. Eine konsistente Hypothese erklärt die Trainingsdaten, eine generalisierende Hypothese kann auch unbekannte Daten (die aus der selben Quelle stammen, also zum selben Problem gehören) korrekt bewerten. Es wird unterschieden zwischen Klassifikation (einige wenige diskrete Label/Klassen, die den Trainingsbeispielen zugeordnet sind) und Regression (Lernen eines Funktionsverlaufs).

Merkmalsvektoren gruppieren Eigenschaften des Problems bzw. der Objekte, d.h. jedes Objekt kann über einen Merkmalsvektor beschrieben werden. Trainingsdaten sind ausgewählte Beispielobjekte (durch Merkmalsvektoren beschrieben) plus die Vorgabe (Klasse oder Funktionswert) vom Lehrer.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K1) Definition und Arten des Lernens
  • (K2) Überwachtes Lernen: Lernen durch Beobachten (mit Lehrer)
  • (K2) Merkmalsvektoren, Eigenschaften, Ausprägung, Objekte, Trainingsmenge

Was ist Lernen?

Verhaltensänderung eines Agenten in Richtung der Optimierung eines Gütefunktionals (Bewertungsfunktion) durch Erfahrung.

Warum Lernen?

  • Nicht alle Situationen vorhersehbar
  • Nicht alle Details modellierbar
  • Lösung oder Lösungsweg unbekannt, nicht explizit programmierbar
  • Data Mining: Entdeckung neuen Wissens durch Analyse der Daten
  • Selbstanpassende Programme

=> Lernen wichtige Eigenschaft lebender Wesen :-)

Learning Agent

Feedback während des Lernens

  • Überwachtes Lernen

    • Lernen durch Beobachtung
    • Vorgabe von Beispielen: Ein- und Ausgabewerte

    => Regression, Klassifikation

  • Unüberwachtes Lernen

    • Erkennen von Mustern in den Inputdaten, Clustering
    • Kein Feedback (!)
  • Reinforcement Lernen

    • Bewertung der Aktionen des Agenten am Ende einer Aktionsfolge

Beispiel Kleinkind: Lernen von Klassen/Konzepten durch Beispiele

  • Zuerst ist alles "Katze" (Übergeneralisierung)
  • Differenzierung durch Feedback der Umwelt; Erkennung unterschiedlicher Ausprägungen

Beispiel: Kreditrisiko

  • Bankkunde beantragt Kredit

  • Soll er aus Sicht der Bank den Kredit bekommen?

  • Bankangestellter betrachtet (relevante) Merkmale des Kunden:

    • Alter, Einkommen, sozialer Status
    • Kundenhistorie bei der Bank
    • Höhe des Kredits
  • Bewertung des Kreditrisikos:

    • Klassifikation: Guter oder schlechter Kunde (Binäre Entscheidung: 2 Klassen)
    • Regression: Vorhersage Gewinn/Verlust für die Bank (Höhe des Gewinns/Verlusts interessant)

Beispiel: Autoreparatur

  • Gegeben: Eigenschaften eines Autos

    => Eigenschaften: Ausprägungen der Merkmale

  • Gesucht: Diagnose und Reparaturanleitung

    => Hypothese über den Merkmalen (Funktion $\operatorname{h}$)

Lernen durch Beobachten: Lernen einer Funktion $\operatorname{f}$

Funktionsapproximation: Lernen einer Funktion $\operatorname{f}$ anhand von Beispielen

  • Ein Beispiel ist ein Tupel $(\mathbf{x}, \operatorname{f}(\mathbf{x}))$, etwa $$ (\mathbf{x}, \operatorname{f}(\mathbf{x})) = \left(\begin{array}{ccc} O & O & X \\ . & X & . \\ X & . & . \end{array}, +1\right) $$

  • Aufgabe: Baue Hypothese $\operatorname{h}$ auf, so dass $\operatorname{h} \approx \operatorname{f}$.

    • Benutze dazu Menge von Beispielen => Trainingsdaten.
  • Ziele:

    1. Konsistente Hypothese: Übereinstimmung bei Trainingsdaten
    2. Generalisierende Hypothese: Korrekte Vorhersage bei unbekannten Daten

Anmerkung: Stark vereinfachtes Modell realen Lernens!

Konstruieren einer konsistenten Hypothese

Welcher Zusammenhang ist hier dargestellt? Offenbar eine Art Funktionsverlauf ... Wir haben für einige x-Werte die zugehörigen y-Werte vorgegeben.

Konstruieren einer konsistenten Hypothese (cnt.)

Die einfachste Approximation wäre eine lineare Funktion. Allerdings werden hierbei einige Werte mehr oder weniger stark nicht korrekt widergegeben, d.h. man hat einen relativ hohen (Trainings-) Fehler.

Konstruieren einer konsistenten Hypothese (cnt.)

Die Hyperbel erklärt die Trainingsdaten bis auf den einen Punkt sehr gut. Die Frage ist, ob dieser eine Punkt zum zu lernenden Zusammenhang gehört oder ein Ausreißer ist, den man gefahrlos ignorieren kann?

Konstruieren einer konsistenten Hypothese (cnt.)

Die grüne Hypothese ist von allen bisher gezeigten die komplexeste, erklärt aber alle Datenpunkte. D.h. hier wäre der Trainingsfehler Null. Zwischen den Trainingsdaten zeigt das Modell eine "glatte" Approximation, d.h. es wird auch neue Daten, die es beim Training nicht gesehen hat, relativ gut erklären. (Dabei liegt freilich die Annahme zugrunde, dass alle relevanten Daten in der Trainingsmenge vorhanden sind, d.h. dass es insbesondere zwischen den Datenpunkten keine Ausreißer o.ä. gibt.)

Konstruieren einer konsistenten Hypothese (cnt.)

Diese Hypothese erklärt ebenfalls sämtliche Trainingsdaten. Allerdings schwingt die Funktion zwischen den Daten stark hin und her. Vermutlich entspricht dies nicht dem zu lernenden Funktionsverlauf. Der Trainingsfehler wäre wie bei der deutlich einfacheren Hypthese aus dem letzten Schritt Null. Der Generalisierungsfehler (sprich die Abweichung, wenn man das Modell nach Daten zwischen den Trainingspunkten fragt) dürfte erheblich höher liegen.

D.h. hier hat das Modell einfach die Trainingsdaten auswendig gelernt, aber nicht den Zusammenhang zwischen den Daten! Dies ist in der Regel unerwünscht!

Occam's Razor

Bevorzuge die einfachste konsistente Hypothese!

  1. Wenn es mehrere mögliche Erklärungen für einen Sachverhalt gibt, ist die einfachste Erklärung allen anderen vorzuziehen.
  2. Eine Erklärung ist "einfach", wenn sie möglichst wenige Variablen und Annahmen enthält und wenn diese in klaren logischen Beziehungen zueinander stehen, aus denen der zu erklärende Sachverhalt logisch folgt.

Trainingsdaten und Merkmalsvektoren

Lehrer gibt Beispiele vor: Eingabe $\mathbf{x}$ und passende Ausgabe $\operatorname{f}(\mathbf{x})$

  • Ausgabe: typischerweise Skalar (Funktionswert oder Klasse) => Beispiel: Bewertung eines Spielstandes bei TicTacToe

  • Eingabe: (Beschreibung des) Objekt(s) oder Situation, die zur Ausgabe gehört => Beispiel: Spielstand bei TicTacToe

Merkmalsvektoren:

  • Zusammenfassen der relevanten Merkmale zu Vektoren

Beispiel: Schwimmen im See

Beschreibung der Faktoren, wann ich im See schwimmen möchte:

  1. Scheint die Sonne?
  2. Wie warm ist das Wasser?
  3. Wie warm ist die Luft?
  • Trainingsbeispiel:
    • Eingabe: Merkmalsvektor (sonnig, warm, warm)
    • Ausgabe: Klasse ja

Dabei wird davon ausgegangen, dass jeder Faktor (jedes Merkmal) an einer bestimmten Stelle im Merkmalsvektor aufgeführt ist. Beispielsweise gehört das sonnig zur Frage "Scheint die Sonne", warm jeweils zur Wasser- und zur Lufttemperatur.

Damit hat man in einem Vektor eine Situation komplett beschrieben, d.h. einen Zustand der Welt mit den relevanten Dingen beschrieben. Diesem Zustand kann man beispielsweise ein Label (Klasse) verpassen, hier in diesem Fall "ja, in dieser Welt möchte ich schwimmen".

Die Trainingsmenge baut sich dann beim überwachten Lernen aus vielen solcher Paare (Merkmalsvektor, Klasse) auf, und die Algorithmen sollen diese Zuordnung lernen, d.h. ein Modell für diese Daten erzeugen, welches die Daten gut erklärt und darüber hinaus für neue Daten aus der selben Datenquelle gute Vorhersagen macht.

Trainingsdaten -- Merkmalsvektoren

Generell: Merkmalsvektor für Objekt $v$: $$ \mathbf{x}(v) = (x_1, x_2, \ldots, x_n) $$

  • $n$ Merkmale (Attribute)
  • Attribut $x_t$ hat $m_t$ mögliche Ausprägungen
  • Ausprägung von $v$ bzgl. $x_t$: $\quad x_t(v) = i \quad$ (mit $i = 1 \ldots m_t$)

Anmerkung: Stellen Sie sich den Merkmalsvektor vielleicht wie einen Konstruktor einer Klasse x vor: Die einzelnen Attribute $x_t$ sind die Parameter, aus denen der Merkmalsvektor aufgebaut ist/wird. Jedes der Attribute hat einen Typ und damit eine bestimmte Anzahl erlaubter Werte ("Ausprägungen") ...

Trainingsbeispiel:

  • Tupel aus Merkmalsvektor und zugehöriger Klasse: $\left(\mathbf{x}(v), k\right)$

Wrap-Up

  • Lernen ist Verhaltensänderung, Ziel: Optimierung einer Gütefunktion

    • Aufbau einer Hypothese, die beobachtete Daten erklären soll
    • Arten: Überwachtes Lernen, Unüberwachtes Lernen, Reinforcement Lernen
  • Merkmalsvektoren gruppieren Eigenschaften des Problems bzw. der Objekte

  • Trainingsdaten: Beispielobjekte (durch Merkmalsvektoren beschrieben) plus Vorgabe vom Lehrer

Challenges

Modellierung

Sie stehen vor der Entscheidung, ob Sie sich zur Vorbereitung auf die Flipped-Classroom-Sitzung noch das Skript anschauen. Welche Attribute benötigen Sie, um die Situation zu beschreiben?

Metriken für Klassifikatoren

Es ist wieder Wahlkampf: Zwei Kandidaten O und M bewerben sich um die Kanzlerschaft. Die folgende Tabelle zeigt die Präferenzen von sieben Wählern.

Nr. Alter Einkommen Bildung Kandidat Vorhersage
1 $\ge 35$ hoch Abitur O O
2 $< 35$ niedrig Master O O
3 $\ge 35$ hoch Bachelor M M
4 $\ge 35$ niedrig Abitur M M
5 $\ge 35$ hoch Master O O
6 $< 35$ hoch Bachelor O M
7 $< 35$ niedrig Abitur M O

Auf diesem Datensatz wurde ein Klassifikator trainiert, die Trainingsergebnisse sind in der Tabelle unter "Vorhersage" angegeben.

Bewerten Sie den Klassifikator.

Quellen

CAL2

TL;DR

Eine Hypothese kann im einfachsten Fall als Entscheidungsbaum dargestellt werden. Die Merkmale bilden dabei die Knoten im Baum, und je Ausprägung gibt es eine Kante zu einem Nachfolgerknoten. Ein Merkmal bildet die Wurzel des Baums, an den Blättern sind die Klassen zugeordnet.

Einen Entscheidungsbaum kann man zur Klassifikation eines Objekts schrittweise durchlaufen: Für jeden Knoten fragt man die Ausprägung des Merkmals im Objekt ab und wählt den passenden Ausgang aus dem Knoten. Wenn man am Blatt angekommen ist, hat man die Antwort des Baumes auf das Objekt, d.h. üblicherweise die Klasse.

Den Baum kann man mit dem Algorithmus CAL2 schrittweise aufbauen. Man startet mit "Nichtwissen" (symbolisiert mit einem "*") und iteriert durch alle Trainingsbeispiele, bis der Baum sich nicht mehr verändert. Wenn der Baum auf ein Beispiel einen "*" ausgibt, dann ersetzt man diesen "*" mit der Klasse des eben betrachteten Beispiels. Wenn der Baum bei einem Beispiel die passende Klasse ausgibt, macht man mit dem nächsten Beispiel weiter. Wenn der Baum bei einem Beispiel eine andere Klasse ausgibt, muss das Klassensymbol im Baum (an der Stelle, wo das Objekt gelandet ist) durch den nächsten Test ersetzt werden: Hierzu nimmt man das nächste, auf diesem konkreten Pfad noch nicht verwendete Merkmal. CAL2 kann nur mit diskreten Attributen und disjunkten Klassen einen fehlerfreien Baum erzeugen.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K3) Entscheidungsbaumlerner CAL2

Entscheidungsbäume: Klassifikation

  • Attribute als Knoten im Baum
  • Ausprägungen als Test (Ausgang, Verzweigung)
  • Klasse (Funktionswert) als Blatt

Erinnern Sie sich an das Beispiel mit der Auto-Reparatur aus der letzten Sitzung.

Die relevanten Eigenschaften (Merkmale) eines Autos würden als Knoten im Baum repräsentiert. Beispiel: "Motor startet" oder "Farbe".

Jedes Merkmal hat eine Anzahl von möglichen Ausprägungen, diese entsprechen den Verzweigungen am Knoten. Beispiel: "startet", "startet nicht" oder "rot", "weiß", "silber", ... .

Entsprechend kann man durch Abarbeiten des Entscheidungsbaumes am Ende zu einer Diagnose gelangen (Klasse).

Eine andere Sichtweise ist die Nutzung als Checkliste für eine Reparatur ...

Definition Entscheidungsbaum

  • Erinnerung: Merkmalsvektor für Objekt $v$: $$ \mathbf{x}(v) = (x_1, x_2, \ldots, x_n) $$

    • $n$ Merkmale (Attribute)
    • Attribut $x_t$ hat $m_t$ mögliche Ausprägungen
    • Ausprägung von $v$ bzgl. $x_t$: $\quad x_t(v) = i \quad$ (mit $i = 1 \ldots m_t$)
  • Alphabet für Baum: $$ \lbrace x_t | t=1,\ldots,n \rbrace \cup \lbrace \kappa | \kappa = \ast,A,B,C,\ldots \rbrace \cup \lbrace (,) \rbrace $$

  • Entscheidungsbaum $\alpha$: $$ \alpha = \left\lbrace \begin{array}{ll} \kappa & \text{Terminalsymbole: } \kappa = \ast,A,B, \ldots\\ x_t(\alpha_1, \alpha_2, \ldots, \alpha_{m_t}) & x_t \text{ Testattribut mit } m_t \text{ Ausprägungen} \end{array}\right. $$

Anmerkung: Stellen Sie sich die linearisierte Schreibweise wieder wie den (verschachtelten) Aufruf von Konstruktoren vor. Es gibt die Oberklasse Baum, von der für jedes Attribut eine Klasse abgeleitet wird. D.h. der Konstruktor für eine Attributklasse erzeugt letztlich ein Objekt vom Obertyp Baum. Außerdem sind die Terminalsymbole A, B, ... Objekte vom Typ Blatt, welches eine Unterklasse von Baum ist ...

Dabei wird die Anzahl der möglichen Ausprägungen für ein Attribut berücksichtigt: Jede Ausprägung hat einen Parameter im Konstruktor. Damit werden die Unterbäume beim Erzeugen des Knotens übergeben.

Induktion von Entscheidungsbäumen: CAL2

  1. Anfangsschritt: $\alpha^{(0)} = \ast$ (totales Unwissen)

  2. $n$-ter Lernschritt: Objekt $v$ mit Klasse $k$, Baum $\alpha^{(n-1)}$ gibt $\kappa$ aus

    • $\kappa = \ast$: ersetze $\ast$ durch $k$
    • $\kappa = k$: keine Aktion nötig
    • $\kappa \neq k$: Fehler
      • Ersetze $\kappa$ mit neuem Test: $\kappa \gets x_{t+1}(\ast, \ldots, \ast, k, \ast, \ldots, \ast)$
      • $x_{t+1}$: nächstes Attribut, auf dem aktuellen Pfad noch nicht verwendet
      • Symbol $k$ an Position $i$ wenn $x_{t+1}(v) = i$

$\alpha^{(n)}$ bezeichnet den Baum im $n$-ten Lernschritt.

CAL2 ist ein Meta-Algorithmus: Es ist ein Algorithmus, um einen Algorithmus zu lernen :-)

Beispiel mit CAL2

$x_1$ $x_2$ $x_3$ $k$
0 0 1 A
1 0 0 A
0 1 4 B
1 1 2 B
0 0 3 A

Ergebnis: $x_1(x_2(A, B), x_2(A, B))$

Anmerkung: Denken Sie an die Analogie von oben. $x_1$ kann als Konstruktor einer Klasse x1 betrachtet werden, die eine Unterklasse von Baum ist. Durch den Aufruf des Konstruktors wird als ein Baum erzeugt.

Es gibt in $x_1$ zwei mögliche Ausprägungen, d.h. der Baum hat in diesem Knoten zwei alternative Ausgänge. Diese Unterbäume werden dem Konstruktor von x1 direkt beim Aufruf übergeben (müssen also Referenzen vom Typ Baum sein).

CAL2: Bemerkungen

  • Nur für diskrete Merkmale und disjunkte Klassen

  • Zyklischer Durchlauf durch Trainingsmenge

  • Abbruch:

    • Alle Trainingsobjekte richtig klassifiziert => Kein Fehler in einem kompletten Durchlauf
    • (Differenzierung nötig, aber alle Merkmale verbraucht)
    • (Lernschrittzahl überschritten)

Wrap-Up

  • Darstellung der Hypothese als Entscheidungsbaum
  • CAL2: diskrete Attribute, disjunkte Klassen
Challenges

Modellierung

Sie stehen vor der Entscheidung, ob Sie sich zur Vorbereitung auf die Flipped-Classroom-Sitzung noch das Skript anschauen.

Zeichnen Sie einen Entscheidungsbaum, der Ihnen bei der Entscheidung hilft.

Textklassifikation

Betrachten Sie die folgenden Aussagen:

  • Patient A hat weder Husten noch Fieber und ist gesund.
  • Patient B hat Husten, aber kein Fieber und ist gesund.
  • Patient C hat keinen Husten, aber Fieber. Er ist krank.
  • Patient D hat Husten und kein Fieber und ist krank.
  • Patient E hat Husten und Fieber. Er ist krank.

Aufgaben:

  1. Trainieren Sie auf diesem Datensatz einen Klassifikator mit CAL2.
  2. Ist Patient F krank? Er hat Husten, aber kein Fieber.

Handsimulation CAL2

Zeigen Sie mit einer Handsimulation, wie CAL2 mit dem folgenden Trainingsdatensatz schrittweise einen Entscheidungsbaum generiert. Nutzen Sie die linearisierte Schreibweise.

Beispiel $x_1$ $x_2$ $x_3$ Klasse
1 a a a 1
2 a b a 2
3 a a b 1
4 b a b 1
5 a a c 1
6 b b b 2

Welchen Entscheidungsbaum würde CAL2 lernen, wenn dem Trainingsdatensatz der Vektor $((a,a,b), 2)$ als Beispiel Nr. 7 hinzugefügt werden würde?

Quellen
  • [Unger1981] Lernfähige Klassifizierungssysteme (Classifier Systems Which Are Able to Learn)
    Unger, S. und Wysotzki, F., Akademie-Verlag, 1981.
    Der Vollständigkeit halber aufgeführt (Werk ist leider vergriffen und wird nicht mehr verlegt)

Pruning

TL;DR

Pruning ist das Entfernen redundanter und irrelevanter Tests (Merkmale).

Irrelevante Merkmale spielen keine Rolle bei der Klassifikation, an jedem Ausgang eines irrelevanten Merkmals findet sich exakt der selbe Baum. Diese Tests kann man einfach entfernen und durch einen ihrer Teilbäume ersetzen; dadurch ändert sich nicht die Klassifikation des Baumes.

Bei redundanten Tests sind alle Ausgänge bis auf einen noch mit "Nichtwissen" ("*") markiert. Hier kann man den Test durch den einen bekannten Ausgang ersetzen, wodurch sich die Klassifikation ändert. Allerdings wird der Klassifikationsfehler nicht größer, da man ja vorher nur für eine Ausprägung des redundanten Merkmals einen Baum hatte und für die anderen jeweils mit "*" antworten musste (d.h. hier stets einen Fehler gemacht hatte).

Über die Transformationsregel kann man einfach die Reihenfolge von Tests im Baum ändern.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K3) Pruning: Entfernen bedingt irrelevanter Tests
  • (K3) Pruning: Entfernen bedingt redundanter Tests
  • (K3) Umformen von Entscheidungsbäumen mit Transformationsregel

Pruning: Bedingt irrelevante Attribute

Baum: $\alpha = x_1(x_2(A, B), x_2(A, B), x_2(A, B))$

$x_1$ ist bedingt irrelevant => Vereinfachung: $\alpha = x_2(A, B)$

Allgemein:

  • Sei $\tilde{x}$ Weg zu Nichtendknoten $x_t$
  • Baum dort $\alpha/\tilde{x} = x_t(\alpha_1, \ldots, \alpha_{m_t})$
  • $x_t$ ist bedingt irrelevant unter der Bedingung $\tilde{x}$, wenn $\alpha_1 = \alpha_2 = \ldots = \alpha_{m_t}$
  • Vereinfachung: Ersetze in $\alpha/\tilde{x}$ den Test $x_t$ durch $\alpha_1$

Anmerkung: Der durch das Entfernen von bedingt irrelevanten Attributen entstandene Baum hat exakt die selbe Aussage (Klassifikation) wie der Baum vor dem Pruning.

Anmerkung: $x_1$ im obigen Beispiel ist sogar global irrelevant, da es sich hier um die Wurzel des Baumes handelt. Der Weg $\tilde{x}$ ist in diesem Fall der leere Weg ...

Pruning: Bedingt redundante Attribute

Baum: $\alpha = x_1(\ast, \ast, x_2(A, B))$

$x_1$ ist bedingt redundant => Vereinfachung: $\alpha = x_2(A, B)$

Allgemein:

  • Sei $\tilde{x}$ Weg zu Nichtendknoten $x_t$
  • Baum dort $\alpha/\tilde{x} = x_t(\ast, \ldots, \ast, \alpha_i, \ast, \ldots, \ast)$ (mit $\alpha_i \neq \ast$)
  • $x_t$ ist bedingt redundant unter der Bedingung $\tilde{x}$
  • Vereinfachung: Ersetze in $\alpha/\tilde{x}$ den Test $x_t$ durch $\alpha_i$

Anmerkung: Der durch das Entfernen von bedingt redundanten Attributen entstandene Baum hat eine etwas andere Klassifikation als der Baum vor dem Pruning. Wo vorher ein * ausgegeben wurde, wird nach dem Pruning u.U. ein Klassensymbol ausgegeben. Der Klassifikationsfehler erhöht sich aber nicht, da hier ein * wie ein falsches Klassensymbol zu werten ist.

Anmerkung: $x_1$ im obigen Beispiel ist sogar global redundant, da es sich hier um die Wurzel des Baumes handelt. Der Weg $\tilde{x}$ ist in diesem Fall der leere Weg ...

Allgemeine Transformationsregel

$$ x_1(x_2(a, b), x_2(c, d)) \Leftrightarrow x_2(x_1(a, c), x_1(b, d)) $$

Wrap-Up

  • Pruning: Entfernen bedingt redundanter und irrelevanter Tests
  • Transformationsregel zum Umbauen von Entscheidungsbäumen
Quellen

CAL3

TL;DR

CAL3 ist eine einfache Erweiterung von CAL2 für nicht-disjunkte (überlappende) Klassen. Statt beim Baumaufbau bei einer Fehlklassifikation sofort zu verzweigen, werden hier zunächst die im entsprechenden Pfad aufgelaufenen Klassensymbole gezählt. Wenn ausreichend viele davon gesehen wurden (Schwelle $S_1$), wird eine Entscheidung getroffen: Wenn eine Klasse in diesem temporären Blatt dominiert (ihre Häufigkeit über einer Schwelle $S_2$ liegt), dann entscheidet man sich in diesem Blatt fest für diese Klasse. Ansonsten (die Häufigkeit aller Klassen in dem Blatt liegt unter $S_2$) nimmt man analog zu CAL2 den nächsten, auf diesem Pfad noch nicht verwendeten Test hinzu.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K3) Meta-Algorithmus CAL3 für überlappende Klassen

CAL3: Erweiterung von CAL2 für nicht-disjunkte Klassen

  1. Anfangsschritt: $\alpha^{(0)} = \ast$ (totales Unwissen)

  2. $n$-ter Lernschritt: Objekt $v$ mit Klasse $k$

    • Rückweisung (Endknoten mit $\ast$): Ersetze $\ast$ durch Vereinigungsklasse $/k1/$

    • Endknoten mit Vereinigungsklasse:

      • Zähler für $k$ erhöhen, bzw.
      • $k$ mit Anzahl $1$ in Vereinigungsklasse einfügen

    Falls nun die Summe aller Klassen am Endknoten größer/gleich $S_1$ (Statistikschwelle):

    • Für genau eine Klasse gilt: $P(k | \tilde{x}) \ge S_2$: => Abschluss: Ersetze Vereinigungsklasse durch $k$ (für immer!)

    • Für alle Klassen gilt: $P(k | \tilde{x}) < S_2$: => Differenzierung: Ersetze Vereinigungsklasse durch neuen Test: $\kappa \gets x_{t+1}(\ast, \ldots, \ast, /k1/, \ast, \ldots, \ast)$

      $x_{t+1}$: nächstes Attribut, auf dem aktuellen Pfad $\tilde{x}$ noch nicht verwendet Symbol $k$ mit Anzahl 1 an Position $i$ wenn $x_{t+1}(v) = i$

Beispiel mit CAL3

$x_1$ $x_2$ $k$
0 0 A
0 1 B
0 1 A
1 0 B
1 1 A
  • $S_1 = 4, S_2 = 0.7$

Ergebnis: $x_1(A, x_2(B, A))$

Trainingsfehler: $1/5 = 0.2 < 1-S_2 = 1-0.7 = 0.3$

Hinweis: Bei nicht überlappenden Klassen erzeugt CAL3 u.U. andere Bäume als CAL2 ...

CAL3: Abbruchbedingungen und Parameter

  • Parameter:

    • $S_1$: Statistikschwelle, problemabhängig wählen
    • $S_2$: $0.5 < S_2 \le 1.0$
    • Klassifikationsfehler kleiner als $1-S_2$
      • kleiner Fehler => großer Baum
      • großer Fehler => kleiner Baum
  • Abbruch:

    • Alle Trainingsobjekte richtig klassifiziert => Kein Fehler in einem kompletten Durchlauf
    • Alle Endknoten mit eindeutigen Klassensymbolen belegt
    • Differenzierung nötig, aber alle Merkmale verbraucht
    • Lernschrittzahl überschritten

Wrap-Up

  • CAL3: Erweiterung von CAL2 für überlappende Klassen
    • Parameter $S_1$ (Anzahl Objekte bis Entscheidung), $S_2$ (Dominanz?)
    • Trainingsfehler wg. überlappender Klassen!
Challenges

Textklassifikation

Betrachten Sie die folgenden Aussagen:

  • Patient A hat weder Husten noch Fieber und ist gesund.
  • Patient B hat Husten, aber kein Fieber und ist gesund.
  • Patient C hat keinen Husten, aber Fieber. Er ist krank.
  • Patient D hat Husten und kein Fieber und ist krank.
  • Patient E hat Husten und Fieber. Er ist krank.

Aufgaben:

  1. Trainieren Sie auf diesem Datensatz einen Klassifikator mit CAL3 ($S_1=4, S_2=0.6$).
  2. Ist Patient F krank? Er hat Husten, aber kein Fieber.
Quellen
  • [Unger1981] Lernfähige Klassifizierungssysteme (Classifier Systems Which Are Able to Learn)
    Unger, S. und Wysotzki, F., Akademie-Verlag, 1981.
    Der Vollständigkeit halber aufgeführt (Werk ist leider vergriffen und wird nicht mehr verlegt)

Entropie

TL;DR

Die Entropie kann als Maß für den Informationsgehalt einer Trainingsmenge betrachtet werden: Wieviele Ja/Nein-Entscheidungen sind nötig, um die Daten fehlerfrei zu repräsentieren?

Nach der Wahl eines Attributs kann die verbleibende mittlere Entropie berechnet werden. Damit hat man ein Kriterium für die Auswahl von Attributen beim Aufbau von Entscheidungsbäumen: Nimm das Attribut, welches einen möglichst hohen Informationsgehalt hat. Oder andersherum: Wähle das Attribut, bei dem die verbleibende mittlere Entropie der Trainingsmenge nach der Wahl des Attributs am kleinsten ist.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K3) Berechnung der Entropie und des Information Gain

Wie Attribute wählen?

Erinnerung: CAL2/CAL3

  • Zyklische Iteration durch die Trainingsmenge
  • Ausschließlich aktuelles Objekt betrachtet
  • Reihenfolge der "richtigen" Attributwahl bei Verzweigung unklar

=> Betrachte stattdessen die komplette Trainingsmenge!

Relevanz => Informationsgehalt

  • Shannon/Weaver (1949): Entropie
    • Maß für die Unsicherheit einer Zufallsvariablen
    • Anzahl der Bits zur Darstellung der Ergebnisse eines Zufallsexperiments

Beispiele

  • Münze, die immer auf dem Rand landet: keine Unsicherheit, 0 Bit
  • Faire Münze: Kopf oder Zahl: Entropie 1 Bit
  • Fairer 4-seitiger Würfel: 4 mögliche Ausgänge: Entropie 2 Bit
  • Münze, die zu 99% auf einer Seite landet: Entropie nahe Null

=> Anzahl der Ja/Nein-Fragen, um zur gleichen Information zu kommen

Definition der Entropie $H(V)$ für Zufallsvariable $V$

  • Zufallsvariable $V$ => mögliche Werte $v_k$
  • Wahrscheinlichkeit für $v_k$ sei $p_k = P(v_k)$

$H(V) = -\sum_k p_k \log_2 p_k$

Hinweis: $\log_2 x = \frac{\log_{10} x}{\log_{10} 2} = \frac{\log x}{\log 2}$

  • Nur eine Klasse: $\log_2 1 = 0$ => $H(V) = 0$ Bit
  • Zwei Klassen, gleichwahrscheinlich: $\log_2 0.5 = -1$ => $H(V) = 1$ Bit

Beispiele Entropie: faire Münze

Entropie: $H(V) = -\sum_k p_k \log_2 p_k$

  • $v_1 = \operatorname{Kopf}, v_2 = \operatorname{Zahl}$
  • $p_1 = 0.5, p_2 = 0.5$
  • $H(\operatorname{Fair}) = -(0.5 \log_2 0.5 + 0.5 \log_2 0.5) = 1$ Bit
$\log_2 0.5 = -1$

Beispiele Entropie: unfaire Münze

Entropie: $H(V) = -\sum_k p_k \log_2 p_k$

  • $v_1 = \operatorname{Kopf}, v_2 = \operatorname{Zahl}$
  • $p_1 = 0.99, p_2 = 0.01$
  • $H(\operatorname{UnFair}) = -(0.99 \log_2 0.99 + 0.01 \log_2 0.01)$

    $H(\operatorname{UnFair}) \approx 0.08$ Bit

$\log_2 0.01 \approx -6.64$ $\log_2 0.99 \approx -0,014$

Beispiele Entropie: 4-seitiger Würfel

Entropie: $H(V) = -\sum_k p_k \log_2 p_k$

  • $v_1 = 1, v_2 = 2, v_3 = 3, v_4 = 4$
  • $p_1 = p_2 = p_3 = p_4 = 0.25$
  • $H(\operatorname{Wuerfel}) = -4\cdot(0.25 \log_2 0.25) = 2$ Bit
$\log_2 0.25 = -2$

Entropie der Trainingsmenge: Häufigkeit der Klassen zählen

Nr. $x_1$ $x_2$ $x_3$ $k$
1 0 0 0 A
2 1 0 2 A
3 0 1 1 A
4 1 1 0 B
5 0 1 1 B
6 0 1 0 A
  • Anzahl Klasse $A$: 4
  • Anzahl Klasse $B$: 2
  • Gesamtzahl Beispiele: 6

Wahrscheinlichkeit für $A$: $p_A = 4/6 = 0.667$

Wahrscheinlichkeit für $B$: $p_B = 2/6 = 0.333$

$$ \begin{array}{rcl} H(S) &=& -\sum_k p_k \log_2 p_k\\ &=& -(4/6 \cdot \log_2 4/6 + 2/6 \cdot \log_2 2/6)\\ &=& -(-0.39 -0.53) = 0.92 \operatorname{Bit} \end{array} $$

Mittlere Entropie nach Betrachtung von Attribut $A$

$$ R(S, A) = \sum_{v \in \operatorname{Values}(A)} \frac{|S_v|}{|S|} H(S_v) $$
  • Auswahl von Attribut $A$ partitioniert die Trainingsmenge: Je Ausprägung $v$ von $A$ erhält man eine Submenge $S_v$

  • $R(S, A)$ berechnet die mittlere Entropie der Trainingsmenge, nachdem Attribut $A$ ausgewählt wurde: Unsicherheit/nötige Bits nach Auswahl von Attribut $A$

Entropie der Trainingsmenge nach Attributwahl

Nr. $x_1$ $x_2$ $x_3$ $k$
1 0 0 0 A
2 1 0 2 A
3 0 1 1 A
4 1 1 0 B
5 0 1 1 B
6 0 1 0 A
  • Sei Attribut $x_1$ ausgewählt
  • $x_1$ partitioniert die Trainingsmenge
    • $x_1=0$ liefert $S_0 = \lbrace 1,3,5,6 \rbrace$
    • $x_1=1$ liefert $S_1 = \lbrace 2,4 \rbrace$
    • Häufigkeit für $x_1=0$: $4/6$
    • Häufigkeit für $x_1=1$: $2/6$
    • Gesamtzahl Beispiele: 6
$$ \begin{array}{rcl} R(S, A) &=& \sum_{v \in \operatorname{Values}(A)} \frac{|S_v|}{|S|} H(S_v)\\ &=& 4/6 \cdot H(\lbrace 1,3,5,6 \rbrace) + 2/6 \cdot H(\lbrace 2,4 \rbrace)\\ &=& 4/6\cdot(-3/4 \cdot \log_2 3/4 - 1/4 \cdot \log_2 1/4) +\\ && 2/6\cdot(-1/2 \cdot \log_2 1/2 - 1/2 \cdot \log_2 1/2)\\ &=& 0.54 + 0.33 = 0.87 \operatorname{Bit} \end{array} $$

Ausblick: Gini Impurity

Wir haben hier die Entropie als Maß für den Informationsgehalt einer Trainingsmenge genutzt. $R(S,A)$ als die mittlere Entropie nach Betrachtung von Attribut $A$ wird von typischen Entscheidungsbaumverfahren wie ID3 und C4.5 genutzt, um bei einer Verzweigung das nächste möglichst aussagekräftige Merkmal auszuwählen.

In anderen Entscheidungsbaumlernern wird stattdessen die Gini Impurity zur Bestimmung des Informationsgehalts eingesetzt (u.a. CART). Dieses Maß sagt aus, wie oft man ein zufällig gezogenes Element des Datensatzes falsch klassifizieren würde, wenn man es mit einer zufälligen Klasse basierend auf der Verteilung der Klassen im Datensatz labeln würde.

Hierzu drei lesenswerte Blog-Einträge:

Wrap-Up

  • Begriff und Berechnung der Entropie: Maß für die Unsicherheit
  • Begriff und Berechnung des Informationsgewinns
    • Entropie für eine Trainingsmenge
    • Mittlere Entropie nach Wahl eines Attributs
Challenges

Entropie einer Trainingsmenge

Betrachten Sie die folgenden Aussagen:

  • Patient A hat weder Husten noch Fieber und ist gesund.
  • Patient B hat Husten, aber kein Fieber und ist gesund.
  • Patient C hat keinen Husten, aber Fieber. Er ist krank.
  • Patient D hat Husten und kein Fieber und ist krank.
  • Patient E hat Husten und Fieber. Er ist krank.

Aufgaben:

  1. Geben Sie die Entropie $H(S)$ der Trainingsmenge an.
  2. Berechnen Sie $R(H,A)$ (die mittlere Entropie der Trainingsmenge, nachdem Attribut $A$ gesehen wurde) für die einzelnen Attribute.
Quellen

ID3 und C4.5

TL;DR

Der Entscheidungsbaum-Lernalgorithmus ID3 nutzt den Informationsgehalt für die Entscheidung bei der Attributwahl: Nimm das Attribut, welches einen möglichst hohen Informationsgehalt hat. Oder andersherum: Wähle das Attribut, bei dem die verbleibende mittlere Entropie der Trainingsmenge nach der Wahl des Attributs am kleinsten ist. Oder noch anders formuliert: Nimm das Attribut, bei dem die Differenz zwischen der Entropie der Trainingsmenge (vor der Wahl des Attributs) und der verbleibenden mittleren Entropie (nach der Wahl des Attributs) am größten ist (die Differenz nennt man auch "Information Gain"). Die Trainingsmenge wird entsprechend der Ausprägung in Bezug auf das eben gewählte Merkmal aufgeteilt und an die Kinder des Knotens weiter gereicht; dort wird der Baum rekursiv weiter aufgebaut.

Durch eine Normierung des Information Gain kann eine Verbesserung in Bezug auf mehrwertige Attribute erreicht werden, dies führt zum Algorithmus C4.5.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K3) Entscheidungsbaumalgorithmen ID3 und C4.5

Wie Attribute wählen?

Erinnerung: CAL2/CAL3

  • Zyklische Iteration durch die Trainingsmenge
  • Ausschließlich aktuelles Objekt betrachtet
  • Reihenfolge der "richtigen" Attributwahl bei Verzweigung unklar

=> Betrachte stattdessen die komplette Trainingsmenge!

Erinnerung Entropie: Maß für die Unsicherheit

  • Entropie $H(S)$ der Trainingsmenge $S$: relative Häufigkeit der Klassen zählen

  • Mittlere Entropie nach Betrachtung von Attribut $A$

    $$ R(S, A) = \sum_{v \in \operatorname{Values}(A)} \frac{|S_v|}{|S|} H(S_v) $$
  • Informationsgewinn durch Betrachtung von Attribut $A$

    $$ \begin{array}{rcl} \operatorname{Gain}(S, A) &=& H(S) - R(S, A)\\[5pt] &=& H(S) - \sum_{v \in \operatorname{Values}(A)} \frac{|S_v|}{|S|} H(S_v) \end{array} $$

$R(S,A)$ ist die Unsicherheit/nötige Bits nach Auswahl von Attribut A. Je kleiner $R(S,A)$, um so kleiner die verbleibende Unsicherheit bzw. um so kleiner die Anzahl der nötigen Bits zur Darstellung der partitionierten Trainingsmenge nach Betrachtung von Attribut $A$ ...

=> Je kleiner $R(S,A)$, um so größer der Informationsgewinn

Informationsgewinn: Kriterium zur Auswahl von Attributen

  1. Informationsgewinn für alle Attribute berechnen
  2. Nehme Attribut mit größtem Informationsgewinn als nächsten Test
Nr. $x_1$ $x_2$ $x_3$ $k$
1 0 0 0 A
2 1 0 2 A
3 0 1 1 A
4 1 1 0 B
5 0 1 1 B
6 0 1 0 A
$H(S) = 0.92 \operatorname{Bit}$ $$ \begin{array}{rcl} \operatorname{Gain}(S, x_1) &=& 0.92 - 0.87 = 0.05 \operatorname{Bit}\\ \operatorname{Gain}(S, x_2) &=& 0.92 - 2/6 \cdot 0 - 4/6 \cdot 1\\ &=& 0.25 \operatorname{Bit}\\ \operatorname{Gain}(S, x_3) &=& 0.92 - 3/6 \cdot 0.92 - 2/6 \cdot 1 - 1/6 \cdot 0\\ &=& 0.13 \operatorname{Bit} \end{array} $$

Informationsgewinn für $x_2$ am höchsten => wähle $x_2$ als nächsten Test

Entscheidungsbaumlerner ID3 (Quinlan, 1986)

def ID3(examples, attr, default):
    # Abbruchbedingungen
    if examples.isEmpty():  return default
    if examples.each(class == A):  return A  # all examples have same class
    if attr.isEmpty():  return examples.MajorityValue()

    # Baum mit neuem Test erweitern
    test = MaxInformationGain(examples, attr)
    tree = new DecisionTree(test)
    m = examples.MajorityValue()
    for v_i in test:
        ex_i = examples.select(test == v_i)
        st = ID3(ex_i, attr - test, m)
        tree.addBranch(label=v_i, subtree=st)
    return tree

[Russell2020]: Man erhält aus dem "Learn-Decision-Tree"-Algorithmus [Russell2020, S. 678, Fig. 19.5] den hier vorgestellten ID3-Algorithmus, wenn man die Funktion $\operatorname{Importance}(a, examples)$ als $\operatorname{InformationGain}(examples, attr)$ implementiert/nutzt.

Hinweis: Mit der Zeile if examples.each(class == A): return A soll ausgedrückt werden, dass alle ankommenden Trainingsbeispiele die selbe Klasse haben und dass diese dann als Ergebnis zurückgeliefert wird. Das "A" steht im obigen Algorithmus nur symbolisch für die selbe Klasse! Es kann also auch ein anderes Klassensymbol als "A" sein ...

Beispiel ID3

Nr. $x_1$ $x_2$ $x_3$ $k$
1 0 0 0 A
2 1 0 2 A
3 0 1 1 A
4 1 1 0 B
5 0 1 1 B
6 0 1 0 A
  • $x2$ höchsten Information Gain
  • $x2=0$ => Beispiele 1,2 => A
  • $x2=1$ => Beispiele 3,4,5,6 => Information Gain berechnen, weiter teilen und verzweigen

Beobachtung: $\operatorname{Gain}$ ist bei mehrwertigen Attributen höher

  • Faire Münze:

    • Entropie = $H(\operatorname{Fair}) = -(0.5 \log_2 0.5 + 0.5 \log_2 0.5) = 1 \operatorname{Bit}$
  • 4-seitiger Würfel:

    • Entropie = $H(\operatorname{Dice}) = -4\cdot(0.25 \log_2 0.25) = 2 \operatorname{Bit}$

=> $\operatorname{Gain}$ ist bei mehrwertigen Attributen höher

Damit würden Attribute bei der Wahl bevorzugt, nur weil sie mehr Ausprägungen haben als andere.

Anmerkung: Im obigen Beispiel wurde einfach die Entropie für zwei "Attribute" mit unterschiedlich vielen Ausprägungen betrachtet, das ist natürlich kein $\operatorname{Gain}(S, A)$. Aber es sollte deutlich machen, dass Merkmale mit mehr Ausprägungen bei der Berechnung des Gain für eine Trainingsmenge einfach wegen der größeren Anzahl an Ausprägungen rechnerisch bevorzugt würden.

C4.5 als Verbesserung zu ID3

Normierter Informationsgewinn: $\operatorname{Gain}(S, A) \cdot \operatorname{Normalisation}(A)$

$$ \operatorname{Normalisation}(A) = \frac{1}{ \sum_{v \in \operatorname{Values}(A)} p_v \log_2 \frac{1}{p_v} } $$

C4.5 kann zusätzlich u.a. auch noch mit kontinuierlichen Attributen umgehen, vgl. en.wikipedia.org/wiki/C4.5_algorithm.

In einem Paper (DOI 10.1007/s10115-007-0114-2) wurde der Algorithmus zu den "Top 10 algorithms in data mining" ausgewählt.

Im Wikipedia-Artikel Information Gain finden Sie weitere Informationen zum "Informationsgewinn" (Information Gain).

Ein anderer, relativ ähnlich arbeitender Entscheidungsbaumlerner ist der CART (Classification And Regression Tree)-Algorithmus, wobei der Begriff "CART" allerdings oft auch einfach allgemein für "Entscheidungsbaumlerner" genutzt wird.

Hierzu drei lesenswerte Blog-Einträge:

Beispiele zur Normierung bei C4.5

  • Faire Münze:

    • Entropie = $H(\operatorname{Fair}) = -(0.5 \log_2 0.5 + 0.5 \log_2 0.5) = 1 \operatorname{Bit}$
    • Normierung: $1/(0.5 \log_2 (1/0.5) + 0.5 \log_2 (1/0.5)) = 1/(0.5 \cdot 1 + 0.5 \cdot 1) = 1$
    • Normierter Informationsgewinn: $\operatorname{Gain}(S, A) \cdot \operatorname{Normalisation}(A) = 1 \operatorname{Bit} \cdot 1 = 1 \operatorname{Bit}$
  • 4-seitiger Würfel:

    • Entropie = $H(\operatorname{Dice}) = -4\cdot(0.25 \log_2 0.25) = 2 \operatorname{Bit}$
    • Normierung: $1/(4\cdot 0.25 \log_2 (1/0.25)) = 1/(4\cdot 0.25 \cdot 2) = 0.5$
    • Normierter Informationsgewinn: $\operatorname{Gain}(S, A) \cdot \operatorname{Normalisation}(A) = 2 \operatorname{Bit} \cdot 0.5 = 1 \operatorname{Bit}$

=> Normierung sorgt für fairen Vergleich der Attribute

Anmerkung: Auch hier ist die Entropie natürlich kein $\operatorname{Gain}(S, A)$. Das Beispiel soll nur übersichtlich deutlich machen, dass der "Vorteil" von Attributen mit mehr Ausprägungen durch die Normierung in C4.5 aufgehoben wird.

Wrap-Up

  • Entscheidungsbaumlerner ID3
    • Nutze Information Gain zur Auswahl des nächsten Attributs
    • Teile die Trainingsmenge entsprechend auf ("nach unten hin")
  • Verbesserung durch Normierung des Information Gain: C4.5
Challenges

Textklassifikation

Betrachten Sie die folgenden Aussagen:

  • Patient A hat weder Husten noch Fieber und ist gesund.
  • Patient B hat Husten, aber kein Fieber und ist gesund.
  • Patient C hat keinen Husten, aber Fieber. Er ist krank.
  • Patient D hat Husten und kein Fieber und ist krank.
  • Patient E hat Husten und Fieber. Er ist krank.

Aufgaben:

  1. Trainieren Sie auf diesem Datensatz einen Klassifikator mit ID3.
  2. Ist Patient F krank? Er hat Husten, aber kein Fieber.
Quellen

NN: Einführung in Neuronale Netze

Das Perzeptron kann als die Nachahmung einer biologischen Nervenzelle betrachtet werden. Durch das Zusammenschließen dieser "künstlichen "Nervenzellen" entstehen künstliche Neuronale Netze (NN), die ähnlich wie das Gehirn lernen sollen, komplexe Aufgaben zu bewerkstelligen.

Subsections of NN: Einführung in Neuronale Netze

NN01 - Das Perzeptron

Kurze Übersicht

Definition "Maschinelles Lernen"

Fähigkeit zu lernen, ohne explizit programmiert zu werden. (Arthur Samuel, 1959)

Arten des Lernens

  • Überwachtes Lernen (e.g. Klassifizierung, Regression)
  • Unüberwachtes Lernen (e.g. Clustering, Dimensionsreduktion)
  • Bestärkendes Lernen (e.g. Schach spielen)

Formalisierung

  • Zielfunktion $f$
  • Merkmalraum (input space)
  • Ausgaberaum (output space)
  • Datensatz $\mathcal{D}$
  • Hypothesenmenge $\mathcal{H}$
  • Lernalgorithmus $\mathcal{A}$

Das Perzeptron

Ein einfaches Modell für die binäre Klassifizierung

  • Bilde gewichtete Summe (Linearkombination) der Merkmale
  • Vergleiche das Ergebnis mit einem Schwellenwert
    • Positiv, falls über dem Schwellenwert
    • Negativ, falls unter dem Schwellenwert
  • Gewichte und Schwellenwert sind unbekannte Parameter des Modells, die es zu lernen gilt > siehe Perzeptron Lernalgorithmus
Übungsblätter/Aufgaben
Lernziele
  • (K2) Arten des maschinellen Lernens
  • (K2) Formalisierung eines ML-Problems, insbesondere Klassifizierung: Datensatz, Merkmalraum, Hyphotesenfunktion, Zielfunktion
  • (K2) Perzeptron als linearer Klassifizierer
  • (K2) Entscheidungsgrenze
  • (K3) Berechnung der Entscheidungsgrenze
  • (K3) Perzeptron Lernalgorithmus

NN02 - Lineare Regression und Gradientenabstieg

Kurze Übersicht

Formalisierung

  • Ausgabe $y$ ist reelle Zahl aus einem stetigen Bereich (zum Beispiel Hauspreis)
  • Die Hypothesenfunktion ist eine gewichtete Summe der Merkmale $x_i$ plus eine Konstante $w_0$: $$h(\mathbf{x}) = \mathbf{w}^T\mathbf{x} = w_0 + w_1x_1 + w_2x_2 + \ldots + w_nx_n$$
  • Der Verlust (engl. loss) für einen Datenpunkt $\mathbf{x}$ ist das Fehlerquadrat: $$\mathcal{L} = (\hat{y} - y)^2 = (h(\mathbf{x}) - y)^2$$
  • Die Kosten (engl. cost) sind der durchschnittliche Verlust über alle Datenpunkte: $$J = \frac{1}{2m} \sum_{i=1}^{m} (\hat{y} - y)^2 = \frac{1}{2m} \sum_{i=1}^{m} (h(\mathbf{x}) - y)^2$$

Der Gradient

  • Der Gradientenvektor $\nabla J(\mathbf{w})$ setzt sich zusammen aus den partiellen Ableitungen der Kostenfunktion $J$ nach den Gewichten $w_i$ und zeigt in jedem Punkt $\mathbf{w}$ in die Richtung des steilsten Aufstiegs: $$\nabla J = [ \partial J / \partial w_0 \quad \partial J / \partial w_1 \quad \ldots \quad \partial J / \partial w_n]^T$$
  • Schlussfolgerung: In die entgegengesetzte Richtung, i.e. in Richtung $-\nabla J(\mathbf{w})$ geht es am steilsten bergab!
  • IDEE: Bewege $\mathbf{w}$ in Richtung $-\nabla J(\mathbf{w})$, um die Kosten $J$ möglichst schnell zu senken.

Der Gradientenabstieg (engl. Gradient Descent)

  1. Starte mit zufälligen Gewichten $\mathbf{w}$
  2. Berechne den Gradientenvektor im aktuellen Punkt $\mathbf{w}$
  3. Gewichtsaktualisierung: Gehe einen kleinen Schritt in Richtung $-\nabla J(\mathbf{w})$ $$\mathbf{w} _{neu} := \mathbf{w} _{alt} - \alpha \cdot \nabla J(\mathbf{w} _{alt})$$ ($\alpha$: Lernrate/Schrittweite).
  4. Wiederhole Schritte 2-3, bis das globale Minimum von $J$ erreicht ist.

Graphische Übersicht

  • Lineare Regression
  • Perzeptron
Lernziele
  • (K2) Lineare Regression aus Sicht neuronaler Netze: Graphische Darstellung, Vergleich mit Perzeptron
  • (K2) Formalisierung
  • (K2) Verlust- und Kostenfunktion
  • (K2) Gradientenvektor
  • (K2) Lernrate
  • (K3) Gradientenabstieg
Challenges

Skalierung der Merkmale

Abbildung 1 und Abbildung 2 zeigen die Höhenlinien (Contour Lines) von zwei Kostenfunktionen.

Abbildung 1

Abbildung 1

Abbildung 2

Abbildung 2

  • Erklären Sie, welcher der beiden Fälle nachteilhaft für den Gradientenabstieg Algorithmus ist. Wo liegt der Nachteil? Wie kann die Merkmalskalierung dem genannten Nachteil entgegenwirken?
  • Zeigen Sie unter Verwendung Ihrer eigenen, zufällig generierten Datenpunkte aus dem Bereich $[100, 300] \times [0, 2]$, wie sich Standardisierung, Min-Max Skalierung und Normalisierung auf die Daten auswirken. Vergleichen Sie dazu die jeweiligen Streudiagramme (scatterplots). Sie können hierzu das folgende Jupyter Notebook als Startpunkt benutzen.

NN03 - Logistische Regression

Kurze Übersicht

Formalisierung

  • Ausgabe $y$ ist reelle Zahl aus dem stetigen Bereich $(0,1)$

  • Die Hypothesenfunktion ist: $$h(\mathbf{x}) = \sigma (\mathbf{w}^T\mathbf{x}) = \sigma (w_0 + w_1x_1 + w_2x_2 + \ldots + w_nx_n) \tag{1}$$

  • Der Kreuzentropie Verlust (engl. Cross-Entropy) für einen Datenpunkt $\mathbf{x}$: $$\mathcal{L}(a, y) = - y \log(a) - (1-y) \log(1-a)\tag{2}$$ wobei hier $a := \hat{y}$ die Vorhersage ist.

  • Die Kosten als durchschnittlicher Verlust über alle Datenpunkte $x^{(1)}, \ldots, x^{(m)}$: $$J = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(a^{(i)}, y^{(i)})\tag{3}$$

Gradientenabstieg

  • Der Gradient für einen Datenpunkt $\mathbf{x}$: $$\frac{\partial \mathcal{L}}{\partial w} = (a-y)x \tag{4}$$
  • Der Gradient für alle Datenpunkte $X$ in Matrix-Notation: $$\nabla J = \frac{\partial J}{\partial w} = \frac{1}{m}X(A-Y)^T\tag{5}$$

Graphische Übersicht

  • Logistische Regression
  • Lineare Regression
  • Perzeptron
Lernziele
  • (K2) Logistische Regression aus Sicht neuronaler Netze: Graphische Darstellung, Vergleich mit Perzeptron und linearer Regression
  • (K2) Formalisierung
  • (K2) Sigmoid-Aktivierungsfunktion
  • (K2) Verlust- und Kosten (Cross-Entropy Loss)
  • (K3) Gradientenabstieg für logistische Regression

NN04 - Overfitting und Regularisierung

Kurze Übersicht

Nichtlineare Modelle

  • Einführung von neuen Merkmalen in Form von nichtlienaren Kombinationen der ursprünglichen Merkmale
  • Erhöhung der Komplexität des Modells ermöglicht das Erfassen von nichtlinearen Beziehungen
  • Bemerkung: Die Hypothesenfunktion bleibt linear in den Gewichten, es wird weiterhin logistische Regression in einem erweiterten Merkmalraum durchgeführt.

Überanpassung und Regularisierung

  • Die Überanpassung (engl. Overfitting) ist eines der häufigsten und wichtigsten Probleme in ML und DL
  • "Was im Bereich des maschinellen Lernens Professionelle von Amateuren unterscheidet, ist ihre Fähigkeit mit Überanpassung umzugehen." [AbuMostafa2012, S. 119]
  • Anzeichen von Überanpassung sind geringe Trainingskosten und hohe Testkosten (Kosten auf nicht-gesehenen Daten).
  • Regularisierung ist eine Maßnahme gegen Überanpassung. Man kann es sich als eine Reduktion in der Komplexität des Modells vorstellen.
  • Der Regularisierungsparameter $\lambda$ ist ein Hyperparameter. Je größer der $\lambda$-Wert, desto größer der Regularisierungseffekt.
  • Die Kostentenfunktion bei regulariserter logistischer Regression: $$J = \frac{1}{m} \left\lbrack \sum_{i=1}^m \left( -y^{[i]}log(a^{[i]})-(1-y^{[i]})log(1-a^{[i]}) \right) + \frac{\lambda}{2} \sum_{j=1}^n (w^2_j) \right\rbrack \tag{1}$$
  • Die Gewichtsaktualisierung mit Regularisierungsterm: $$w_j := w_j - \frac{\alpha}{m} \left\lbrack \sum_{i=1}^m \left( ( a^{[i]} - y^{[i]} )x_j^{[i]} \right) + \lambda w_j \right\rbrack \tag{2}$$
Übungsblätter/Aufgaben
Lernziele
  • (K2) Erhöhung der Modell-Komplexität durch Einführung von Merkmalen höherer Ordnung
  • (K2) Unter- und Überanpassung
  • (K2) Regularisierung (Auswirkung auf Gewichte und Modell)
  • (K3) Gradientenabstieg für regularisierte logistische Regression
Quellen

NN05 - Multilayer Perzeptron

Folien

Kurze Übersicht

Multilayer Perzeptron (MLP)

  • Das Perzeptron kann nur linear separable Daten korrekt klassifizieren.
  • Durch das Zusammenschließen von mehreren Perzeptronen kann man ein mehrschichtiges Perzeptron (engl. Multilayer Perceptron) aufstellen, das komplexere Funktionen modellieren kann.
  • Ein MLP wird oft auch als Feed Forward Neural Network oder als Fully Connected Neural Network bezeichnet.
  • Die "inneren" Schichten eines solchen Netzwerkes sind sogenannte versteckte Schichten (engl. hidden layer). Das sind alle Schichten ausgenommen die Eingangs- und Ausgangsschicht.

Graphische Übersicht und Vorwärtslauf

  • Ein Multi-Layer Perzeptron Ein Vorwärtslauf (forward pass): $$a^{[1]} = ReLU \left( W^{[1]} \cdot \mathbb{x} + b^{[1]} \right) \tag{1}$$ $$\hat{y} := a^{[2]} = \sigma \left( W^{[2]} \cdot a^{[1]} + b^{[2]} \right) \tag{2}$$
Übungsblätter/Aufgaben
Lernziele
  • (K2) Multi-Layer Perzeptron (MLP): Graphische Darstellung, Vorwärtslauf
  • (K2) Aktivierungsfunktionen (insbesondere ReLU)
  • (K3) Vorwärtslauf (forward pass) für ein gegebenes MLP
  • (K3) Berechnung der einzelnen Aktivierungen
Challenges

Lineares MLP

Gegeben sei ein MLP mit linearen Aktivierungsfunktionen, d.h. für jedes Neuron berechnet sich der Output durch die gewichtete Summe der Inputs: $y = g(w^T x)$, wobei $g(z) = z$ gilt, also $y = w^T x$. Zeigen Sie, dass dieses Netz durch eine einzige Schicht mit linearen Neuronen ersetzt werden kann.

Betrachten Sie dazu ein zwei-schichtiges Netz (i.e. bestehend aus Eingabe-Schicht, Ausgabe-Schicht und einer versteckten Schicht) und schreiben Sie die Gleichung auf, die die Ausgabe als Funktion der Eingabe darstellt.

Als Beispiel sei das zwei-schichtige MLP mit den folgenden Gewichten und Bias-Werten gegeben:

Schicht 1: $W_1 = [[2, 2],[3, -2]]$, $b_1 = [[1],[-1]]$ Schicht 2: $W_2 = [[-2, 2]]$, $b_2 = [[-1]]$

  • Stellen Sie dieses Netzwerk graphisch dar. Was ist die Anzahl der Zellen in den einzelnen Schichten?
  • Berechnen Sie die Ausgabe für eine Beispiel-Eingabe Ihrer Wahl.
  • Stellen Sie ein ein-schichtiges Netz auf, das für jede Eingabe die gleiche Ausgabe wie das obige Netzwerk berechnet und es somit ersetzen könnte.

NN06 - Backpropagation

Kurze Übersicht

Forwärts- und Rückwärtslauf

  • Im Forwärtslauf (engl. forward pass oder forward propagation) wird ein einzelner Forwärtsschritt von Schicht $[l-1]$ auf Schicht $[l]$ wie folgt berechnet: $$Z^{[l]} = W^{[l]}A^{[l-1]} + b^{[l]} \tag{1}$$ $$A^{[l]} = g(Z^{[l]}) \tag{2}$$ Dabei bezeichnet $g$ die Aktivierungsfunktion (z.B. Sigmoid oder ReLU).

  • Im Rückwärtslauf (engl. backpropagation) werden in einem einzelnen Rückwärtsschritt von Schicht $[l]$ auf Schicht $[l-1]$ die folgenden Gradienten berechnet:

    $$dZ^{[l]} := \frac{\partial J }{\partial Z^{[l]}} = dA^{[l]} * g'(Z^{[l]}) \tag{3}$$ $$dW^{[l]} := \frac{\partial J }{\partial W^{[l]}} = \frac{1}{m} dZ^{[l]} A^{[l-1] T} \tag{4}$$ $$db^{[l]} := \frac{\partial J }{\partial b^{[l]}} = \frac{1}{m} \sum_{i = 1}^{m} dZ^{[l](i)}\tag{5}$$ $$dA^{[l-1]} := \frac{\partial J }{\partial A^{[l-1]}} = W^{[l] T} dZ^{[l]} \tag{6}$$

    Dabei steht "$*$" für die elementweise Multiplikation.

  • Beachten Sie:

    • Der Forwärtsschirtt übernimmt $A^{[l-1]}$ von dem vorherigen Schritt und gibt $A^{[l]}$ an den nächsten Schritt weiter.
    • Der Rückwärtschritt übernimmt $dA^{[l]}$ von dem vorherigen Schritt und gibt $dA^{[l-1]}$ an den nächsten Rückwärtsschritt weiter.

Parameteraktualisierung

  • Die Aktualisierung der Parameter in Schicht $l$ erfolgt wie gewohnt durch: $$W^{[l]} = W^{[l]} - \alpha \text{ } dW^{[l]} \tag{7}$$ $$b^{[l]} = b^{[l]} - \alpha \text{ } db^{[l]} \tag{8}$$ Dabei bezeichnet $\alpha$ die Lernrate.
Übungsblätter/Aufgaben
Lernziele
  • (K2) Forwärts- und Rückwärtslauf in Matrix Notation mit mehreren Datenpunkten als Eingabe
  • (K2) Ableitung der Aktivierungsfunktionen
  • (K3) Berechnung der partiellen Ableitungen
  • (K3) Rückwärtslauf (backpropagation) für ein gegebenes MLP

NN07 - Training & Testing

Kurze Übersicht

Training und Testing

  • Der tatsächliche Erfolg eines Modells wird nicht durch niedrige Trainingskosten gemessen, sondern durch geringe Kosten auf ungesehenen Daten, d.h. hohe Vorhersagekraft, gute Generalisierung!

  • Die Menge aller gelabelten Daten in Trainingsset und Testset aufteilen, Testset nicht während des Trainings einsetzen!.

    • $E_{in}$ bezeichnet den Fehler auf dem Trainingsset, auch in-sample error.
    • $E_{out}$ bezeichnet den Fehler auf dem gesamten Eingaberaum $X$, auch out-of-sample error. $E_{out}$ ist der eigentliche Indikator für den zukünftigen Erfolg des Modells, ist uns aber nicht zugänglich.
    • $E_{test}$ bezeichnet den Fehler auf dem Testset und ist eine Näherung für $E_{out}$.

    Analogie:
    $E_{in}$ : Erfolg in Übungsaufgaben und Probeprüfungen.
    $E_{test}$ : Erfolg in Endprüfung.

  • Die Näherung $E_{test}$ sollte möglichst genau sein, damit es als ein verlässliches Gütesiegel dienen kann.

    • Das Testset sollte genug Daten enthalten. Üblicher Anteil an Testdaten:
      • bei $|D| \approx 100.000 \rightarrow$ ca. 20%
      • bei $|D| \approx 10.000.000 \rightarrow$ ca. 1%
      • Beispiel: Hat man 1000 Beispiele im Testset, wird $E_{test}$ mit $\ge 98\%$ Wahrscheinlichkeit in der $\pm 5\%$ Umgebung von $E_{out}$ liegen (für theoretische Grundlagen und Herleitung siehe [AbuMostafa2012, S. 39-69]).
    • Trainingsdaten und Testdaten sollten möglichst aus derselben Verteilung kommen, wie die zukünftigen Real-World-Daten.
  • Wichtige Bemerkung:

    • Testdaten nicht anfassen, bis das Modell Einsatzbereit ist!
    • Die Testdaten dürfen in keinster Weise bei der Auswahl der endgültigen Hypothese eingesetzt werden, weder bei der Berechnung der Parameter (Training), noch bei der Bestimmung der Hyperparameter (Hyperparameter-Tuning).
    • Sobald der Testfehler die Auswahl der endgültigen Hypothese beeinflusst, kann sie nicht mehr als "Gütesiegel" eingesetzt werden.
      CHECK: Hätte man zufällig andere Testdaten gewählt, könnte sich dadurch die endgültige Hypothese ändern?

Validierung und Modellauswahl

  • Das Ziel ist es, das Modell mit bester Generalisierung, also kleinstem $E_{out}$ zu bestimmen. $E_{out}$ ist jedoch unbekannt und die Näherung $E_{test}$ darf nicht bei der Modellauswahl eingesetzt werden.

  • LÖSUNG: Einen weiteren Teil der Daten als Validierungsset (auch development set) beiseitelegen und nicht für das Training (i.e. Minimierung des Trainingsfehlers $E_{in}$) verwenden!

  • Bemerkung:
    Das Wort Modell kann je nach Kontext unterschiedliche Bedeutungen annehmen.
    Ein Modell im aktuellen Kontext ist als ein Paar $(\mathcal{H},\mathcal{A})$ von Hypothesenraum (bzw. Modellarchitektur) und Lernalgorithmus definiert.

    • Die Auswahl eines Modells kann aus einer Menge von Modellen unterschiedlicher Art erfolgen (z.B. lineare Modelle, polynomiale Modelle, neuronale Netze), oder von Modellen derselben Art aber mit unterschiedlichen Hyperparametern (z.B. Neuronale Netze mit unterschiedlicher Anzahl von versteckten Schichten).
    • Außerdem kann dieselbe Modellarchitektur $\mathcal{H}$ mit unterschiedlichen Lernalgorithmen trainiert werden, was wiederum die endgültige Hypothese beeinflussen kann. Die Bestimmung der Hyperparameter von ${\mathcal{A}}$ (wie z.B. Optimierungsfunktion, Lernrate, Kostenfunktion, Regularisierungsparameter usw.) sind daher auch Teil der Modellauswahl.
  • Der Validierungsfehler $E_{val}$ kann nun als Entscheidungsgrundlage an verschiedenen Stellen des Lernrpozesses eingesetzt werden, wie zum Beispiel:

    • Bei der Auswahl geeigneter Hyperparameter wie z.B. Anzahl Schichten, Anzahl Zellen/Schicht, Aktivierungsfunktion, Regularisierungsparameter (siehe Abbildung 1).
    Abbildung 1 - Einsatz der Validierung für das Hyperparameter-Tuning

    Abbildung 1 - Einsatz der Validierung für das Hyperparameter-Tuning

    • Bei der Auswahl der endgültigen Hypothese ($\rightarrow$ Parameterauswahl!): unter allen Hypothesen, die während des Trainings durchlafen werden, wähle jene mit kleinstem $E_{val}$ (siehe Abbildung 2).
    Abbildung 2 - Einsatz der Validierung bei der Auswahl der entgültigen Hypothese

    Abbildung 2 - Einsatz der Validierung bei der Auswahl der entgültigen Hypothese

    • Bei der graphischen Darstellung von Lernkurven für die Diagnose von Über- und Unteranpassung (siehe Abbildung 3).
    Abbildung 3 - Lernkurven

    Abbildung 3 - Lernkurven

  • Übliche train/val/test Aufteilung der Daten (in Prozent):

    • bei $|D| \approx 100.000 \rightarrow$ ca. 60/20/20
    • bei $|D| \approx 10.000.000 \rightarrow$ ca. 98/1/1
  • Bemerkung:
    Das Modell ist trainiert für gute Ergebnisse auf Trainingsdaten und "fine-tuned" für gute Ergebnisse auf den Validierungsdaten. Ergebnisse auf Testdaten werden mit hoher wahrscheinlichkeit schlechter ausfallen, als auf Validierungsdaten ($E_{val}$ ist eine zu optimistische Näherung).

  • Sind Validierungs- und/oder Trainingsset zu klein, führt das zu schlechten Näherungen $E_{val}$ und folglich zu schlechten Entscheidungen.

    • Bei der Aufteilung muss ein gutes Trade-off gefunden werden.
    • Wenn kein Gütesiegel notwendig ist, kann man auf das Testset verzichten und die Daten in Trainings- und Validierungsset aufteilen.
    • Für eine bessere Näherung mit weniger Validierungsdaten kann k-fache Kreuzvalidierung eingesetzt werden (wenn genug Rechenkapazität vorhanden ist).

K-fache Kreuzvalidierung (engl. k-fold cross-validation):

  • Das Modell $(\mathcal{H_m},\mathcal{A_m})$ wird $k$ mal trainiert und validiert, jedes mal mit unterschiedlichen Trainings- und Validierungsmengen:

    • Die Trainingsdaten werden in $k$ disjunkte Teilmengen $D_1, D_2, ..., D_k$ aufgeteilt.

    • Bei dem $i$-ten Training werden die Teilmenge $D_i$ für die Berechnung des Validierungsfehlers $e_i := E_{val}(h_m^{*(i)})$ und die restlichen $k-1$ Teilmengen für das Training verwendet.

    • Der Kreuzvalidierungsfehler des Modells $(\mathcal{H_m},\mathcal{A_m})$ ist der Durchschnitt der $k$ Validierungsfehler $e_1, e_2, ..., e_k$ (siehe Abbildung 4). $$E_{CV}(m) := \frac{1}{k} \sum_{i=1}^{k} e_i = \frac{1}{k} \sum_{i=1}^{k} E_{val}(h_m^{*(i)})$$

    Abbildung 4 - Kreuzvalidierung

    Abbildung 4 - Kreuzvalidierung

  • Bemerkung: Die Kreuzvalidierung wird nur bei der Modellauswahl eingesetzt: es liefert verlässlichere Näherungen für $E_{out}$ und führt daher zu besseren Entscheidungen. Das zuletzt ausgewählte Modell wird danach wie gewohnt auf den gesamten Trainigsdaten (ausgenommen Testdaten) trainiert und zum Schluss mit den Testdaten evaluiert.

Lernziele
  • (K2) Trainings-, Validierungs- und Testfehler
  • (K2) Zweck einer Testmenge
  • (K2) Kreuzvalidierung
  • (K2) Hyperparameter-Tuning
  • (K2) Lernkurven
Quellen

NN08 - Performanzanalyse

Kurze Übersicht

Performanzmetriken für Klassifizierungsprobleme

Wahrheitsmatrix (engl. Confusion Matrix)

  • Gibt eine Übersicht über die Anzahl von richtig und falsch klassifizierten Datenpunkten (bei binärer Klassifizierung)
    • $TP =$ # True Positives $=$ Anzahl richtiger 1-Vorhersagen
    • $FP =$ # False Positives $=$ Anzahl falscher 1-Vorhersagen
    • $FN =$ # False Negatives $=$ Anzahl falscher 0-Vorhersagen
    • $TN =$ # True Negatives $=$ Anzahl richtiger 0-Vorhersagen
  • Bei Klassifizierungsproblemen mit $N$ Klassen hat man eine $N \times N$ Matrix, die in Position $(i,j)$ die Anzahl der Klasse-$j$-Beispiele enthält, die als Klasse-$i$ vorhergesagt wurden.
Abbildung 1 - Wahrheitsmatrix bei binärer Klassifizierung

Abbildung 1 - Wahrheitsmatrix bei binärer Klassifizierung

Treffergenauigkeit (engl. Accuracy)

  • Anzahl richtig klassifizierter Datenpunkte, Erfolgsrate (engl. correct rate) $$Accuracy = \frac{TP+TN}{TP+TN+FP+FN}$$

  • Accuracy vermittelt ein falsches Bild des Erfolges bei unausgewogenen Datensätzen
    Beispiel:

    • Klasse 1 hat 10, Klasse 0 hat 990 Beispiele.
    • Ein Modell, das immer 0 ausgibt, hat $990/1000 = 0.99$ Treffergenauigkeit, ist aber offensichtlich kein gutes Modell!

Precision

  • Positive Predictive Value (PPV)
  • Antwort auf: Von allen positiven Vorhersagen, wie viele sind richtig? $$Precision = \frac{TP}{TP + FP}$$
  • Wahrscheinlichkeit, dass ein positiv klassifiziertes Beispiel auch tatsächlich positiv ist.
  • Je näher an 1, desto besser.
  • Accuracy of positive predictions.

Recall

  • True Positive Rate, auch Sensitivität (engl. Sensitivity)
  • Antwort auf: Von allen positiven Beispielen, wie viele wurden richtig klassifiziert? $$Recall = \frac{TP}{TP + FN}$$
  • Wahrscheinlichkeit, dass ein positives Beispiel tatsächlich als solches erkannt wird.
  • Je näher an 1, desto besser.
  • Accuracy of positive examples.

Precision-Recall Trade-off

  • Ein gutes Modell sollte hohe Precision und zugleich hohes Recall haben.
  • Man kann die Precision eines Modells beliebig erhöhen (durch das Vergrößern des Schwellenwertes bei der Klassifizierung), jedoch wird dabei der Recall abnehmen.
  • Genau so kann man den Recall eines Modells beliebig erhöhen (durch das Verkleinern des Schwellenwertes bei der Klassifizierung), jedoch wird dabei die Precision abnehmen.
  • Es gilt ein gutes Trade-off zu finden.
  • Eine Zwei-Zahlen-Metrik erschwert den Entscheidungsprozess bei Evaluierung und Modellauswahl.

$F_1$-Score (Harmonisches Mittel)

  • Fasst Precision (P) und Recall (R) in einer Metrik zusammen (Harmonisches Mittel von P und R): $$F_1-Score = \frac{2}{\frac{1}{P} + \frac{1}{R}} = 2 \cdot \frac{PR}{P + R}$$
  • Der $F_1$-Score wird nur dann hoch sein, wenn P und R beide hoch sind.
  • Je näher an 1, desto besser.
  • Sehr kleine P und R Werte ziehen den $F_1$-Score sehr stark herunter. In dieser Hinsicht gibt diese Metrik ein akkurates Bild über den Erfolg eines Modells.
Lernziele
  • (K2) Performanzmetriken für die Evaluierung von Klassifizierungsmodellen
  • (K2) Wahrheitsmatrix (engl. Confusion Matrix)
  • (K2) Treffergenauigkeit (engl. Accuracy)
  • (K2) Precision (engl. Precision)
  • (K2) Recall
  • (K2) $F_1$-Score (Harmonisches Mittel)
  • (K3) Berechnung und Deutung von Precision und Recall
  • (K3) Berechnung und Deutung des $F_1$-Scores
  • (K3) Einsatz bei Evaluierung und Auswahl von Modellen

Suche

Problemlösen durch Suche im Problemgraphen. Aus den Basisalgorithmen Tree-Search und Graph-Search entstehen je nach verwendeter Datenstruktur und nach betrachteten Kosten unterschiedliche Suchalgorithmen.

  • Uninformierte Suche: ... jeder Schritt "kostet" gleich viel: nur die Anzahl der Schritte zählt ...
  • Informierte Suche: ... Einsatz einer Kostenfunktion ...
  • Lokale Suche: ... das Ziel ist im Weg ...

Subsections of Suche

Suche mit Tiefensuche

TL;DR

Die Tiefensuche gehört zu den "Uninformierten Suchverfahren": Es werden keine weiteren Pfadkosten, sondern nur die Anzahl der Schritte berücksichtigt.

Die Tiefensuche entsteht, wenn man bei der Tree-Search oder der Graph-Search für die Datenstruktur einen Stack benutzt: Expandierte Nachfolger werden immer oben auf den Stack gelegt, und der nächste zu expandierende Knoten wird oben vom Stack genommen. Dadurch verfolgt die Tiefensuche einen Pfad immer erst in die Tiefe.

Bei Sackgassen erfolgt automatisch ein Backtracking, d.h. es wird zum letzten Knoten mit einer Alternative zurückgegangen. Dies liegt daran, dass bei einer Sackgasse keine Nachfolger expandiert und oben auf den Stack gelegt werden.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Verwendete Datenstrukturen
  • (K2) Algorithmische Abläufe, Terminierung
  • (K2) Optimalität, Vollständigkeit und Komplexität
  • (K3) Uninformierte Suchverfahren: Tiefensuche

Hole das Buch

Das Beispiel ist ein Büroflur in der Uni. Neben den Büros gibt es eine Bibliothek und einen Kopiererraum, wo auch der Roboter sich gerade aufhält. Die Aufgabe für den Roboter lautet: Hole das Buch aus der Bibliothek (und bringe es zum Kopier). (Damit das Beispiel und der sich daraus ergebende Problemgraph nicht zu groß und zu unübersichtlich werden, soll das Ziel hier darin liegen, dass der Roboter das Buch in der Bibliothek aufnimmt.)

Es stehen zwei Aktionen zur Verfügung:

  1. Der Roboter kann von einem in den nächsten Raum wechseln (Kosten siehe Pfeile)
  2. Der Roboter kann das Buch aufnehmen (Kosten: 3)

Dabei sind die Durchgänge teilweise nur in einer Richtung zu benutzen (Pfeilrichtung).

Problemgraph zum Kopiererbeispiel

=> Problemlösen == Suche im Graphen

Uninformierte ("blinde") Suche:

Keine Informationen über die Kosten eines Pfades: Nur die Pfadlänge (Anzahl der Schritte) zählt.

Varianten:

Anmerkungen Wegesuche (Landkarte)

Bei der Wegesuche hat man den Problemgraphen bereits durch die Orte und die Verbindungen (Straßen) zwischen ihnen gegeben. Es gibt nur eine ausführbare Aktion: "fahre nach".

Dabei können nur die Anzahl der Zwischenstationen auf dem Weg gezählt werden ("uninformierte Suche"), oder man ordnet den Kanten Kosten zu (bei der Wegesuche wären dies die Entfernungen zwischen den Orten oder die Zeit, die man von A nach B braucht) und landet damit bei der "informierten Suche".

Normalerweise hat man eine Ordnung auf den Aktionen, d.h. für einen Knoten ergibt sich daraus eine Reihenfolge, in der die Aktionen angewendet werden und die Nachfolger expandiert werden. Bei der Wegesuche hat man dies nicht, insofern muss man willkürlich eine Ordnung festlegen. In dieser Veranstaltung ist dies die alphabetische Reihenfolge der Knoten (Orte).

Tiefensuche (TS, DFS)

Erinnerung Tree-Search

  1. Füge Startknoten in leere Datenstruktur (Stack, Queue, ...) ein
  2. Entnehme Knoten aus der Datenstruktur:
    • Knoten ist gesuchtes Element: Abbruch, melde "gefunden"
    • Expandiere alle Nachfolger des Knotens und füge diese in die Datenstruktur ein
  3. Falls die Datenstruktur leer ist: Abbruch, melde "nicht gefunden"
  4. Gehe zu Schritt 2

=> Was passiert, wenn wir einen Stack einsetzen?

Bemerkungen

  • Nachfolger eines Knotens: Alle von diesem Zustand durch Aktionen erreichbare Zustände

  • Suchalgorithmus mit Stack als Datenstruktur => Tiefensuche

    • Zu betrachtender Knoten in Schritt 2 wird oben vom Stack genommen
    • Expandierte Knoten werden in Schritt 2.a oben auf den Stack gelegt Dabei i.A. die vorgegebene Reihenfolge der Nachfolgeknoten beachten!

    Auswirkung: Weg wird in die Tiefe verfolgt (deshalb "Tiefensuche")

  • Im [Russell2020] wird die Datenstruktur zum Halten der zu expandierenden Knoten (also hier im Fall der Tiefensuche der Stack) auch "Frontier" genannt.

  • Backtracking: Wenn der Weg in eine Sackgasse führt, d.h. ein Knoten keine Nachfolger hat, werden bei der Expansion des Knotens keine Nachfolger auf den Stack gelegt. Die Evaluation des nächsten Knotens auf dem Stack bewirkt deshalb ein Zurückspringen im Suchbaum zum letzten Knoten auf dem aktuellen Weg mit noch offenen Alternativen ...

Konventionen für diese Lehrveranstaltung

In der Beschreibung der Algorithmen werden häufig nur die letzten Knoten der partiellen Wege in den Datenstrukturen mitgeführt (das gilt auch für die Beschreibung im [Russell2020]). Dies erschwert die Nachvollziehbarkeit, wenn man die Queue oder den Stack schrittweise aufschreibt. Deshalb wird für diese Veranstaltung die Konvention eingeführt, immer die partiellen Wege aufzuschreiben.

Nicht Bestandteil der Algorithmen, dient aber der Nachvollziehbarkeit: Expandierte Knoten sollen alphabetisch sortiert an der korrekten Stelle in der Datenstruktur auftauchen, dabei soll aber natürlich die Reihenfolge der ursprünglich in der Datenstruktur enthaltenen Knoten nicht modifiziert werden. (Bei "echten" Problemen wird die Reihenfolge der expandierten Nachfolger in der Regel durch eine Reihenfolge der anwendbaren Operationen bestimmt.)

Weitere Hinweise

  • Die Tiefensuche wurde zufällig am Beispiel Tree-Search eingeführt. Man kann auch Graph-Search einsetzen. Wichtig ist nur, dass als Datenstruktur ein Stack genutzt wird.

  • Bei Tree-Search werden bereits besuchte Knoten u.U. immer wieder besucht. Zyklen im aktuell entwickelten Pfad sind also möglich! Außerdem sind mehrere Wege zum selben (Zwischen-/End-) Knoten in der Datenstruktur möglich!

  • Im [Russell2020] wird der Begriff "Backtracking" für den rekursiven Tiefensuche-Algorithmus verwendet. Dies steht im Gegensatz zum üblichen Sprachgebrauch in der KI!

Tiefensuche (rekursive Variante)

  1. Startknoten ist gesuchtes Element: Abbruch, melde "gefunden"
  2. Für jeden Nachfolger des Startknotens:
    • Rufe Tiefensuche für aktuellen (Nachfolger-) Knoten auf
    • Ergebnis "gefunden": Abbruch, melde "gefunden"
  3. Abbruch, melde "nicht gefunden"

Bemerkungen

  • Eigenschaften wie "normale" Tiefensuche
  • Einfacher zu implementieren: Nutzung des Stacks wird auf den Compiler verlagert (Funktionsaufruf, Stack des Prozesses ...)
  • Speicherbedarf: Für jeden Knoten wird nur der nächste Knoten expandiert, plus Speicher für die Funktion

Eigenschaften der Tiefensuche

Siehe Breitensuche

Wrap-Up

  • Uninformierte Suchverfahren
    • Keine weiteren Pfadkosten (nur Anzahl der Schritte)
    • Tiefensuche: Verfolge einen Pfad zuerst in die Tiefe
    • Backtracking bei Sackgassen (automatisch durch den Stack)
Übungsblätter/Aufgaben
Quellen

Suche mit Breitensuche

TL;DR

Die Breitensuche gehört zu den "Uninformierten Suchverfahren": Es werden keine weiteren Pfadkosten, sondern nur die Anzahl der Schritte berücksichtigt.

Die Breitensuche entsteht, wenn man bei der Tree-Search oder der Graph-Search für die Datenstruktur eine Queue benutzt: Expandierte Nachfolger werden immer hinten in die Queue eingefügt, und der nächste zu expandierende Knoten wird vorn aus der Queue genommen. Dadurch wird bei der Breitensuche der Suchbaum ebenenweise entwickelt.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Verwendete Datenstrukturen
  • (K2) Algorithmische Abläufe, Terminierung
  • (K2) Optimalität, Vollständigkeit und Komplexität
  • (K3) Uninformierte Suchverfahren: Breitensuche

Hole das Buch

=> Problemlösen == Suche im Graphen

Uninformierte ("blinde") Suche:

Keine Informationen über die Kosten eines Pfades: Nur die Pfadlänge (Anzahl der Schritte) zählt.

Varianten:

Breitensuche (BS, BFS)

Erinnerung Graph-Search

  1. Füge Startknoten in leere Datenstruktur (Stack, Queue, ...) ein
  2. Entnehme Knoten aus der Datenstruktur:
    • Knoten ist gesuchtes Element: Abbruch, melde "gefunden"
    • Markiere aktuellen Knoten, und
    • Expandiere alle Nachfolger des Knotens und füge alle unmarkierten Nachfolger, die noch nicht in der Datenstruktur sind, in die Datenstruktur ein
  3. Falls die Datenstruktur leer ist: Abbruch, melde "nicht gefunden"
  4. Gehe zu Schritt 2

=> Was passiert, wenn wir eine Queue einsetzen?

Bemerkungen

  • Nachfolger eines Knotens: Alle von diesem Zustand durch Aktionen erreichbare Zustände

  • Suchalgorithmus mit Queue als Datenstruktur => Breitensuche

    • Zu betrachtender Knoten in Schritt 2 wird vorn aus der Queue genommen
    • Expandierte Knoten werden in Schritt 2.a hinten in die Queue eingefügt Dabei i.A. die vorgegebene Reihenfolge der Nachfolgeknoten beachten!

    Auswirkung: Suchbaum wird ebenenweise aufgebaut (deshalb "Breitensuche")

  • Graph-Search: Markierte Knoten müssen geeignet gespeichert werden: separate Datenstruktur => Aufwand!

Konventionen für diese Lehrveranstaltung

In der Beschreibung der Algorithmen werden häufig nur die letzten Knoten der partiellen Wege in den Datenstrukturen mitgeführt (das gilt auch für die Beschreibung im [Russell2020]). Dies erschwert die Nachvollziehbarkeit, wenn man die Queue oder den Stack schrittweise aufschreibt. Deshalb wird für diese Veranstaltung die Konvention eingeführt, immer die partiellen Wege aufzuschreiben.

Nicht Bestandteil der Algorithmen, dient aber der Nachvollziehbarkeit: Expandierte Knoten sollen alphabetisch sortiert an der korrekten Stelle in der Datenstruktur auftauchen, dabei soll aber natürlich die Reihenfolge der ursprünglich in der Datenstruktur enthaltenen Knoten nicht modifiziert werden. (Bei "echten" Problemen wird die Reihenfolge der expandierten Nachfolger in der Regel durch eine Reihenfolge der anwendbaren Operationen bestimmt.)

Weitere Hinweise

  • Die Breitensuche wurde zufällig am Beispiel Graph-Search eingeführt. Man kann auch die Tree-Search-Variante einsetzen. Wichtig ist nur, dass als Datenstruktur eine Queue genutzt wird.

  • Im [Russell2020] wird die Breitensuche ebenfalls auf der Basis des Graph-Search-Algorithmus eingeführt. Allerdings wird die Abbruchbedingung modifiziert: Die Zielbedingung wird nicht erst (wie bei Graph-Search eigentlich definiert) geprüft, wenn ein Knoten aus der Queue entnommen wird, sondern bereits bei der Erzeugung der Nachfolgerknoten (vor dem Einfügen in die Queue). Dadurch spart man sich die Expansion einer zusätzlichen Ebene: Die Komplexität wäre in diesem Fall "nur" $O(b^{d})$.

Eigenschaften Breitensuche vs. Tiefensuche

Tiefensuche Breitensuche
Vollständigkeit nein1 ja2
Optimalität nein ja
Zeitkomplexität $O(b^m)$ $O(b^{d+1})$
Speicherkomplexität $O(bm)$ $O(b^{d+1})$
  • Zeitkomplexität: maximal zu expandierende Knotenzahl
  • Speicher:
    • TS: in jeder Tiefe weitere $b$ Knoten speichern
    • BS: alle Knoten einer Ebene im Speicher halten3

b: Verzweigungsfaktor, d: Ebene d. höchsten Lösungsknotens, m: Länge d. längsten Pfades

Praxisvergleich Breitensuche vs. Tiefensuche

Breitensuche: Annahme: $b=10$, 10.000 Knoten/s, 1.000 Byte/Knoten

Tiefe exp. Knoten Zeit Speicher
2 $10^3$ 0.1 s 1 MB
4 $10^5$ 10 s 100 MB
6 $10^7$ 20 min 10 GB
8 $10^9$ 30 h 1 TB
10 $10^{11}$ 130 d 100 TB

Tiefensuche: Annahme: längster Pfad (Tiefe) $m=1000$

=> Speicherbedarf ca. 10 MB

Wrap-Up

  • Uninformierte Suchverfahren
    • Keine weiteren Pfadkosten (nur Anzahl der Schritte)
    • Breitensuche: Verfolge alle Pfade (baue den Suchbaum ebenenweise auf)

  1. gilt für Tree-Search-Variante; vollständig in Graph-Search-Variante bei endlichem Suchraum ↩︎

  2. falls b endlich ↩︎

  3. $O(b^{d})$ mit vorgezogener Zielprüfung (vgl. [Russell2020]↩︎

Übungsblätter/Aufgaben
Quellen

Suche mit Branch-and-Bound

TL;DR

Branch-and-Bound gehört zu den "Informierten Suchverfahren": Es werden (reale) Pfadkosten statt der Anzahl der Schritte berücksichtigt.

Branch-and-Bound entsteht, wenn man bei der Tree-Search oder der Graph-Search für die Datenstruktur eine sortierte Queue (Prioritätsqueue) benutzt: Expandierte Nachfolger werden immer hinten in die Queue eingefügt, diese wird nach den Kosten der partiellen Pfade sortiert und der nächste zu expandierende Knoten (d.h. der bisher günstigste partielle Weg) wird vorn aus der Queue genommen. Branch-and-Bound arbeitet mit den bisher entstandenen (realen) Kosten der partiellen Wege.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Verwendete Datenstrukturen
  • (K2) Algorithmische Abläufe, Terminierung
  • (K2) Optimalität, Vollständigkeit und Komplexität
  • (K2) Bedeutung nicht-negativer Kosten für Branch-and-Bound
  • (K3) Informierte Suchverfahren: Branch-and-Bound

Hole das Buch

=> Problemlösen == Suche im Graphen

Informierte Suche: Nutzung der Kostenfunktion:

Gesamtkosten: $f(n) = g(n) + h(n)$

  • $n \in S$ auf aktuellem Weg erreichter Knoten
  • $g(n)$ tatsächliche Kosten für Weg vom Start bis Knoten $n$
  • $h(n)$ geschätzte Restkosten für Weg von Knoten $n$ zum Ziel => $h(n)$ wird auch "heuristische Funktion" oder "Heuristik" genannt

Varianten:

Branch-and-Bound (BnB)

Variante der Breitensuche mit Kosten

  • Idee: Expandiere den bisher günstigsten partiellen Weg

  • Kostenfunktion: $f(n) = g(n)$

  • Datenstruktur: sortierte Queue (Prioritätsqueue)

  • Voraussetzung: alle Aktionen haben positive Kosten (jeden Knoten $n$ gilt: $g(n) > 0$)

Hinweis: Die Branch-and-Bound-Suche taucht im [Russell2020] als Erweiterung der "Uniformen Suche" auf ...

BnB: Finde einen Weg von A nach H

Graph-Search fordert: Expandierte Nachfolgerknoten, die schon in der Queue sind, sollen nicht (erneut) in die Queue aufgenommen werden.

  • Problem dabei: Was ist mit den Kosten?! Der neu expandierte Weg könnte günstiger sein als der schon in der Queue enthaltene.

  • Lösung (vgl. Optimierungsmöglichkeiten für A*):

    Füge zunächst alle neu expandierten partiellen Pfade (mit unmarkierten Endknoten) in die Queue ein, sortiere diese und behalte von mehreren Pfaden zum gleichen Knoten nur den jeweils günstigsten in der Queue

Pfade, deren Endknoten bereits früher im Pfad vorkommt (Schleifen), werden bei Graph-Search in Schritt 2 nicht in die Queue aufgenommen (der Endknoten wäre bei einer Schleife ja bereits markiert und der neue Pfad würde bei Graph-Search nicht weiter beachtet).

Das Einfärben ist kein Problem, da nur der jeweils günstigste Knoten aus der Queue genommen, gefärbt und expandiert wird. D.h. alle anderen Wege sind zu diesem Zeitpunkt bereits teurer. Wenn man nun (später) über einen anderen Weg zu einem bereits gefärbten Knoten kommt, kann der neue Weg nicht günstiger sein (positive Kosten vorausgesetzt).

Konventionen für diese Lehrveranstaltung

In der Beschreibung der Algorithmen werden häufig nur die letzten Knoten der partiellen Wege in den Datenstrukturen mitgeführt (das gilt auch für die Beschreibung im [Russell2020]). Dies erschwert die Nachvollziehbarkeit, wenn man die Queue oder den Stack schrittweise aufschreibt. Deshalb wird für diese Veranstaltung die Konvention eingeführt, immer die partiellen Wege aufzuschreiben.

Auf dem Papier sortiert sich die Queue schlecht, deshalb können Sie darauf verzichten, wenn Sie den im nächsten Schritt zu expandierenden Weg unterstreichen. Wer nicht mit Unterstreichen arbeiten will, muss eben dann manuell sortieren ...

Wenn bei der Graph-Search-Variante ein Weg nicht in die Queue aufgenommen wird, weil bereits ein anderer (günstigerer) Weg zum selben (Zwischen-/End-) Knoten bereits in der Queue enthalten ist, schreiben Sie dies geeignet auf. Dies gilt auch für den analogen Fall, wenn ein Weg aus der Queue entfernt wird, weil ein günstigerer Weg zum selben (Zwischen-/End-) Knoten eingefügt werden soll.

Eigenschaften von BnB

Siehe A*

Wrap-Up

  • Informierte Suchverfahren
    • Nutzen reale Pfadkosten und/oder Schätzungen der Restkosten
    • Branch-and-Bound: nur reale Pfadkosten $g(n)$
Übungsblätter/Aufgaben
Quellen

Suche mit Best First

TL;DR

Best First gehört wie Branch-and-Bound zu den "Informierten Suchverfahren": Es werden Pfadkosten (in diesem Fall Schätzungen) statt der Anzahl der Schritte berücksichtigt.

Best First arbeitet algorithmisch wie Branch-and-Bound, allerdings werden immer nur die geschätzten Restkosten eines Knotens zum Ziel berücksichtigt.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K1) Verwendete Datenstrukturen
  • (K2) Algorithmische Abläufe, Terminierung
  • (K2) Optimalität, Vollständigkeit und Komplexität
  • (K3) Informierte Suchverfahren Best-First

Hole das Buch

=> Problemlösen == Suche im Graphen

Informierte Suche: Nutzung der Kostenfunktion:

Gesamtkosten: $f(n) = g(n) + h(n)$

  • $n \in S$ auf aktuellem Weg erreichter Knoten
  • $g(n)$ tatsächliche Kosten für Weg vom Start bis Knoten $n$
  • $h(n)$ geschätzte Restkosten für Weg von Knoten $n$ zum Ziel => $h(n)$ wird auch "heuristische Funktion" oder "Heuristik" genannt

Varianten:

Best-First (BF, BFS)

  • Idee: Expandiere den partiellen Weg, der verspricht, dem Ziel am nächsten zu sein (Heuristik)

  • Kostenfunktion: $f(n) = h(n)$

  • Datenstruktur: sortierte Queue (Prioritätsqueue)

  • Voraussetzungen: $h(n)$ positiv, $h(n) = 0$ für den Zielknoten

Konventionen BF

In der Beschreibung der Algorithmen werden häufig nur die letzten Knoten der partiellen Wege in den Datenstrukturen mitgeführt (das gilt auch für die Beschreibung im [Russell2020]). Dies erschwert die Nachvollziehbarkeit, wenn man die Queue oder den Stack schrittweise aufschreibt. Deshalb wird für diese Veranstaltung die Konvention eingeführt, immer die partiellen Wege aufzuschreiben.

Auf dem Papier sortiert sich die Queue schlecht, deshalb können Sie darauf verzichten, wenn Sie den im nächsten Schritt zu expandierenden Weg unterstreichen. Wer nicht mit Unterstreichen arbeiten will, muss eben dann manuell sortieren ...

Wenn bei der Graph-Search-Variante ein Weg nicht in die Queue aufgenommen wird, weil bereits ein anderer (günstigerer) Weg zum selben (Zwischen-/End-) Knoten bereits in der Queue enthalten ist, schreiben Sie dies geeignet auf. Dies gilt auch für den analogen Fall, wenn ein Weg aus der Queue entfernt wird, weil ein günstigerer Weg zum selben (Zwischen-/End-) Knoten eingefügt werden soll.

Eigenschaften von BF

Siehe A*

Wrap-Up

  • Informierte Suchverfahren
    • Nutzen reale Pfadkosten und/oder Schätzungen der Restkosten
    • Best-First: nur Schätzungen $h(n)$
Challenges

Betrachten Sie folgende Landkarte und Restwegschätzungen:

Quelle: MapGermanyGraph.svg by Regnaron and Jahobr on Wikimedia Commons (Public Domain)

Finden Sie mit der Best-First-Suche jeweils einen Weg von Würzburg nach München. Vergleichen Sie das Ergebnis mit der Gradienten-Suche.

Übungsblätter/Aufgaben
Quellen

Suche mit A*

TL;DR

A* zählt zu den Verfahren der informierten Suche. Dabei verwendet A* sowohl die realen Pfadkosten als auch die Schätzungen der Restkosten, d.h. die Kostenfunktion für A* ist $f(n) = g(n)+h(n)$.

A* ist vollständig und optimal, allerdings muss die Heuristik bei der Tree-Search-Variante zulässig sein (d.h. sie muss unterschätzen, beispielsweise die Luft-Linie) und bei der Graph-Search-Variante muss sie konsistent sein (d.h. für jeden Knoten die Dreiecks-Ungleichung erfüllen).

A* hat wie BnB exponentiellen Aufwand. Durch die zusätzliche Verwendung der Heuristik werden die partiellen Pfade in der Queue aber geschickter sortiert, so dass A* in der Regel mit weniger Suchschritten als BnB auskommt.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Verwendete Datenstrukturen
  • (K2) Algorithmische Abläufe, Terminierung
  • (K2) Optimalität, Vollständigkeit und Komplexität
  • (K2) Bedingung(en) an Restkostenabschätzung bei A*
  • (K3) Informierte Suchverfahren A*

Hole das Buch

=> Problemlösen == Suche im Graphen

Informierte Suche: Nutzung der Kostenfunktion:

Gesamtkosten: $f(n) = g(n) + h(n)$

  • $n \in S$ auf aktuellem Weg erreichter Knoten
  • $g(n)$ tatsächliche Kosten für Weg vom Start bis Knoten $n$
  • $h(n)$ geschätzte Restkosten für Weg von Knoten $n$ zum Ziel => $h(n)$ wird auch "heuristische Funktion" oder "Heuristik" genannt

Varianten:

A*-Suche

  • Kombination aus Branch-and-Bound und Best-First-Suche

  • Kostenfunktion: $f(n) = g(n) + h(n)$

  • Datenstruktur: sortierte Queue (Prioritätsqueue)

  • Voraussetzung:

    1. Alle Aktionen haben positive Kosten ($g(n) \ge \epsilon$)
    2. Heuristik $h(n)$ muss zulässig/konsistent sein

Konventionen für diese Lehrveranstaltung

In der Beschreibung der Algorithmen werden häufig nur die letzten Knoten der partiellen Wege in den Datenstrukturen mitgeführt (das gilt auch für die Beschreibung im [Russell2020]). Dies erschwert die Nachvollziehbarkeit, wenn man die Queue oder den Stack schrittweise aufschreibt. Deshalb wird für diese Veranstaltung die Konvention eingeführt, immer die partiellen Wege aufzuschreiben.

Notieren Sie die Bestandteile der Kosten für jeden partiellen Weg in der Queue einzeln: "$g(n) + h(n) = f(n)$". Das erleichtert Ihnen die weiteren Schritte, da Sie dort ja nur mit $g(n)$ weiter rechnen dürfen. Gleichzeitig erleichtert es die Nachvollziehbarkeit.

Auf dem Papier sortiert sich die Queue schlecht, deshalb können Sie darauf verzichten, wenn Sie den im nächsten Schritt zu expandierenden Weg unterstreichen. Wer nicht mit Unterstreichen arbeiten will, muss eben dann manuell sortieren ...

Wenn bei der Graph-Search-Variante ein Weg nicht in die Queue aufgenommen wird, weil bereits ein anderer (günstigerer) Weg zum selben (Zwischen-/End-) Knoten bereits in der Queue enthalten ist, schreiben Sie dies geeignet auf. Dies gilt auch für den analogen Fall, wenn ein Weg aus der Queue entfernt wird, weil ein günstigerer Weg zum selben (Zwischen-/End-) Knoten eingefügt werden soll.

Tree-Search-Variante: Die Heuristik muss zulässig sein:

  • Seien $h^\star(n)$ die tatsächlichen optimalen Restkosten von einem Knoten $n$ zum nächsten Ziel.
  • Dann muss für jeden beliebigen Knoten $n$ gelten: $$h(n) \le h^\star(n)$$
  • Außerdem muss gelten:
    • $h(n) \ge 0$ für jeden Knoten $n$
    • $h(n) = 0$ für jeden Zielknoten $n$

=> Beispiel: Luftlinie als Abschätzung

Hinweis: Im der englischen Ausgabe des [Russell2020] wird die zulässige Heuristik auch "admissible heuristic" genannt.

A* ist optimal

A* (Tree-Search-Variante) mit zulässiger Heuristik ist optimal.

Beweis siehe Übung :-)

  • Dynamische Programmierung: Behalte von mehreren Pfaden zum gleichen Knoten nur den günstigsten in der Queue

  • Pfade, deren Endknoten bereits früher im Pfad vorkommt (Schleifen), werden in Schritt 2 nicht in die Queue aufgenommen

  • Übergang zur Graph-Search-Variante und Markierung von Knoten

    => Achtung: Dann schärfere Anforderungen an Heuristik (Konsistenz)

Graph-Search-Variante: Die Heuristik muss konsistent sein:

Für jeden Knoten $n$ und jeden durch eine Aktion $a$ erreichten Nachfolger $m$ gilt: $$h(n) \le c(n,a,m) + h(m)$$ mit $c(n,a,m)$ Schrittkosten für den Weg von $n$ nach $m$ mit Aktion $a$.

Außerdem muss gelten:

  • $h(n) \ge 0$ für jeden Knoten $n$
  • $h(n) = 0$ für jeden Zielknoten $n$

=> Eine konsistente Heuristik ist gleichzeitig zulässig.

Hinweis: Im der englischen Ausgabe des [Russell2020] wird die konsistente Heuristik auch "consistent heuristic" genannt.

Eigenschaften Branch-and-Bound, Best-First, A*

Branch-and-Bound Best-First A*
Kosten $f(n) = g(n)$ $f(n) = h(n)$ $f(n) = g(n) + h(n)$
Vollständigkeit ja1 nein2 ja
Optimalität ja nein ja
Aufwand exponentiell exponentiell exponentiell
Bemerkung Probiert erst alle "kleinen" Pfade Suchverlauf stark abh. v. Heuristik Heuristik: zulässig bzw. konsistent

Wrap-Up

  • Informierte Suchverfahren

    • Nutzen reale Pfadkosten und/oder Schätzungen der Restkosten
    • A*: komplette Kostenfunktion $f(n) = g(n)+h(n)$ => besondere Anforderungen an die Heuristik! (Tree-Search: zulässige Heuristik; Graph-Search: konsistente Heuristik)
  • Ausblick auf Verbesserungen der vorgestellten Suchverfahren:

    • Beschränkung der Suchtiefe ("Depth-Limited-Search")
    • Iterative Vertiefung der Suchtiefe ("Iterative-Deepening-Search"), beispielsweise IDA* ("Iterative-Deepening A*")
    • Beschränkung des verwendeten Speichers, beispielsweise SMA* ("Simplified Memory-Bounded A*")

  1. BnB vollständig: Kosten größer Epsilon (positiv) ↩︎

  2. gilt für Tree-Search-Variante; vollständig bei Graph-Search und endlichen Problemräumen ↩︎

Challenges

Informierte und uninformierte Suche

Betrachten Sie folgendes Problem:

Dargestellt ist eine typische Büroumgebung mit verschiedenen Räumen und einem Flur. Die Pfeile in den Durchgängen geben an, in welche Richtung der jeweilige Durchgang durchschritten werden darf. Die Werte an den Pfeilen geben die Kosten für den Übergang von einem Raum in den anderen an.

Ein Roboter Robbi, der sich zunächst im Kopierer-Raum aufhält, soll den Weg zur Bibliothek finden und dort das Buch aufnehmen. Der Roboter kann sich immer nur entlang den Pfeilen in einen Nachbarraum bewegen (Aktion move). Die Kosten für das Aufnehmen des Buches betragen 3 Einheiten (Aktion take). Weitere Aktionen gibt es nicht.

  1. Zeichnen Sie den Problemgraphen. Markieren Sie Start- und Zielknoten.
  2. Finden Sie den Weg mit Tiefensuche und mit Breitensuche (Tree-Search). Welche Unterschiede stellen Sie fest?
  3. Welche Wege würden mit der jeweiligen Graph-Search-Variante nicht weiter untersucht?
  4. Suchen Sie nun einen Weg mit A* (Tree-Search). Definieren Sie zunächst Restkostenschätzungen. Was müssen Sie dabei beachten?
Übungsblätter/Aufgaben
Quellen

Lokale Suche: Gradientensuche

TL;DR

Lokale Suchverfahren: Nur das Ergebnis zählt! Nicht der Weg ist das Ziel, sondern nur das Erreichen des Ziels.

In Analogie zum Bergsteigen: Gehe in Richtung des stärksten Anstiegs kann man die Suche so formulieren, dass man in jedem Suchschritt den Nachfolgeknoten nach dem stärksten Anstieg der Kostenfunktion auswählen. Dieses Verfahren nennt sich auch Hill-Climbing (bzw. Gradientensuche).

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Problematik der lokalen Minima bei Gradientenverfahren
  • (K3) Lokale Suche (Gradientenabstieg)

Unterschiede in den Suchproblemen?

Bisher betrachtete Suchverfahren:

  • Systematische Erkundung des Suchraums
  • Weg zur Lösung wichtig

=> Oft aber nur das Ziel an sich interessant! (Und nicht, wie man dort hin gelangt.)

Beispiel: Stundenplan

Analogie: Bergsteigen ohne Karte und Pfade

Gradienten-Suche: "Gehe in Richtung des steilsten Anstiegs der Zielfunktion."

=> Schrittweise Verbesserung des aktuellen Zustands (Lokale Suche)

  • Verschiedene Namen: "Hill-climbing", "Greedy local search"
  • Kann auch als Minimierung angewendet werden

Pseudoalgorithmus Gradientensuche

"Wie Bergsteigen am Mount Everest in dickem Nebel mit Gedächtnisverlust"

  1. Setze currNode auf den Startknoten
  2. currNode ist gesuchtes Element: Abbruch, melde "gefunden"
    • Expandiere alle Nachfolger von currNode
    • Setze nextNode auf Nachfolger mit höchster Bewertung
    • Falls Bewertung von nextNode $\leq$ Bewertung von currNode: Abbruch, melde "nicht gefunden"
    • Setze currNode auf nextNode
  3. Gehe zu Schritt 2

Beispiel Gradientensuche: $n$-Damen

  • Ziel: Setze $n$ Damen auf ein $n \times n$-Spielfeld ohne Konflikte
  • Start: Setze $n$ Damen auf ein $n \times n$-Spielfeld (mit Konflikten)
  • Suche: Bewege jeweils eine Dame so, daß die Anzahl der Konflikte reduziert wird

Schauen Sie sich auch Abb. 4.3 auf Seite 130 im [Russell2020] an!

Hinweis: Alle Damen stehen von Anfang an auf dem Brett und werden nur verschoben => "vollständige Zustandsformulierung"

Eigenschaften 8-Damen-Problem ($n=8$)

  • Zustandsraum: $8^8 \approx 17$ Millionen Zustände!
  • Beginnend mit zufällig erzeugtem Startzustand:
    • bleibt in 86% der Fälle stecken, d.h.
    • findet Lösung nur in 14% der Fälle.
  • Beobachtung: Lösung nach durchschnittlich 4 Schritten, oder Verfahren bleibt nach durchschnittlich 3 Schritten stecken.

Quelle: nach [Russell2020, p. 131]

Eigenschaften Gradientensuche

  • Vollständigkeit: nein
  • Optimalität: nein
  • Komplexität: linear in der Anzahl der zu expandierenden Knoten

Zielfunktion (Bewertung) nötig!

Problem: lokale Maxima und Plateaus

  • Lokale Maxima/Minima: Algorithmus findet nur eine suboptimale Lösung
  • Plateaus: Hier muss der Algorithmus mit zufälligen Zügen explorieren

Wrap-Up

Lokale Suchverfahren: Nur das Ergebnis zählt!

  • Gradientenverfahren: Gehe in Richtung des stärksten Anstiegs der Kostenfunktion
Challenges

Betrachten Sie folgende Landkarte und Restwegschätzungen:

Quelle: MapGermanyGraph.svg by Regnaron and Jahobr on Wikimedia Commons (Public Domain)

Finden Sie mit der Gradienten-Suche jeweils einen Weg von Würzburg nach München. Vergleichen Sie das Ergebnis mit der Best-First-Suche.

Übungsblätter/Aufgaben
Quellen

Lokale Suche: Simulated Annealing

TL;DR

Lokale Suchverfahren: Nur das Ergebnis zählt! Nicht der Weg ist das Ziel, sondern nur das Erreichen des Ziels.

Das Problem bei der Gradientensuche ist, dass man eine Kostenfunktion benötigt und diese auch lokale Minima enthalten kann. Mit der reinen Gradientensuche würde man bei Erreichen lokaler Minima die Suche abbrechen (müssen), da es keine weitere Verbesserung unter den Nachfolgern mehr geben kann. In Anlehnung an das Abkühlen von Metall kann hier eine Variante der lokalen Suche helfen: Simulated Annealing. Man führt einen "Temperatur"-Parameter ein, der im Laufe der Suche immer kleiner wird und schließlich gegen Null geht. In Abhängigkeit von dieser "Temperatur" wird mit einer bestimmten Wahrscheinlichkeit eine Verschlechterung akzeptiert: Bei einer hohen Temperatur ist diese Wahrscheinlichkeit höher, bei einer niedrigen Temperatur niedriger, so dass das Verfahren in ein normales Hill-Climbing übergeht. Damit kann man ein Festfressen in lokalen Minima vermeiden bzw. überwinden.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Funktionsweise Simulated Annealing

Motivation

Problem: lokale Maxima und Plateaus

  • Lokale Maxima/Minima: Algorithmus findet nur eine suboptimale Lösung
  • Plateaus: Hier muss der Algorithmus mit zufälligen Zügen explorieren

Mögliche Lösungen:

  • Neustart des Algorithmus, wenn kein Fortschritt erzielt wird
  • Rauschen "injizieren"

Gedankenexperiment: Ausweg aus lokalen Minima

  • "Drehen der Landschaft": Minimieren statt Maximieren
  • Ball wird in Zustandsraum-Landschaft gesetzt.
  • Folge:
    • rollt steilsten Abstieg hinunter
    • rollt evtl. in Tal auf halber Höhe (lokales Minimum) => bleibt dort gefangen

=> "Schütteln der Landschaft" -- Ball springt aus dem Tal und rollt in anderes Tal

Nicht zu stark schütteln -- sonst wird u.U. globales Minimum verlassen!

Analogie Härten von Metall

  • Metall erhitzen bis Atome frei beweglich
  • Langsam abkühlen

=> stabiles Atomgitter mit minimalem Energiezustand

Übertragen der Idee

  • Starkes "Schütteln" (hohe "Temperatur") am Anfang
  • Schrittweises "Abkühlen" => "Schütteln" im Laufe der Zeit verringern

=> Simulated Annealing

Pseudocode Simulated Annealing (Minimierungsproblem)

def simulated_annealing(problem):
    current = problem.startNode
    t = 0;  temp = schedule(t)

    while temp>0:
        temp = schedule(++t)
        neighbors = current.expandSuccessors()
        if not neighbors: return current
        working = random.choice(neighbors)
        dE = problem.value(current) - problem.value(working)
        if dE > 0 or probability(math.exp(dE/temp)):
            current = working

    return current

Wenn dE positiv ist, dann ist der Nachfolger "besser" (hier: kleiner bewertet) als der aktuelle Knoten und wird immer als nächster Knoten übernommen.

Wenn dE negativ ist, dann ist der betrachtete Nachfolger "schlechter" (hier: größer bewertet) als der aktuelle Knoten. Dann wird er mit einer Wahrscheinlichkeit math.exp(dE/temp) als nächster Knoten übernommen. Diese Wahrscheinlichkeit ist bei hohen Temperaturen temp eher hoch, und sinkt, je niedriger die Temperatur temp wird.

Die Temperatur temp bewegt sich dabei von hohen positiven Werten auf den Wert Null (wird also nicht negativ).

Detail: Akzeptieren von Verschlechterungen

Quelle: "Exp e.svg" by Marcel Marnitz, reworked by Georg-Johann on Wikimedia Commons (Public Domain)

  • Wahrscheinlichkeit zum Akzeptieren einer Verschlechterung: math.exp(dE/temp)
  • $dE$ negativ => $\exp\left(\text{dE}/\text{temp}\right) = \exp\left(-\frac{|\text{dE}|}{\text{temp}}\right) = \frac{1}{\exp\left(\frac{|\text{dE}|}{\text{temp}}\right)}$

$\exp(a)$ bzw. $e^a$:

  • $a<0$: geht gegen 0
  • $a=0$: 1
  • $a>0$: steil (exponentiell) gegen Unendlich ...

Wenn $dE$ negativ ist, wird math.exp(dE/temp) ausgewertet. Damit ergibt sich wegen $dE$ negativ: $\exp\left(\text{dE}/\text{temp}\right) = \exp\left(-\frac{|\text{dE}|}{\text{temp}}\right) = \frac{1}{\exp\left(\frac{|\text{dE}|}{\text{temp}}\right)}$. Betrachtung für $dE$ (nur negativer Fall!) und $\text{temp}$:

  • Temperatur $\text{temp}$ hoch: $a = \frac{|\text{dE}|}{\text{temp}}$ ist positiv und klein (nahe Null), d.h. $\exp(a)$ nahe 1 (oder größer), d.h. die Wahrscheinlichkeit $1/\exp(a)$ ist nahe 1 (oder kleiner)
  • Temperatur $\text{temp}$ wird kleiner und geht gegen Null: $a = \frac{|\text{dE}|}{\text{temp}}$ ist positiv und wird größer, d.h. $\exp(a)$ geht schnell gegen Unendlich, d.h. die Wahrscheinlichkeit $1/\exp(a)$ geht gegen 0

Abkühlungsplan problemabhängig wählen

  • Initiale Temperatur: So hoch, daß praktisch jede Änderung akzeptiert wird

  • Abkühlen: $T_k = \alpha T_{k-1}$ mit $0.8 \le \alpha \le 0.99$

    • Ausreichend langsam abkühlen!
    • Typisch: jede Stufe so lange halten, daß etwa 10 Änderungen akzeptiert wurden
  • Stop: Keine Verbesserungen in 3 aufeinander folgenden Temperaturen

Der Abkühlungsplan muss problemabhängig gewählt werden. Das Beispiel zeigt typische Elementes eines solchen Abkühlungsplans.

Eigenschaften Simulated Annealing

  • Vollständigkeit: ja (mit gewisser Wahrscheinlichkeit)
  • Optimalität: ja (mit gewisser Wahrscheinlichkeit)

Voraussetzung: geeigneter Abkühlungsplan

Anwendungen von Simulated Annealing

  • Flugplan-Scheduling
  • Layout-Probleme (Chipentwurf, Leiterplatten)
  • Produktionsplanung

Wrap-Up

Lokale Suchverfahren: Nur das Ergebnis zählt!

  • Gradientenverfahren
    • Analogie Bergsteigen: Gehe in Richtung des stärksten Anstiegs der Kostenfunktion => Hill-Climbing
    • Achtung: Probleme mit lokalen Minima => Simulated Annealing
Übungsblätter/Aufgaben
Quellen

Subsections of Genetische Algorithmen

Einführung Evolutionäre Algorithmen

TL;DR

Lokale Suchverfahren: Nur das Ergebnis zählt!

Evolutionäre Algorithmen sind lokale Suchverfahren, wobei gleichzeitig an mehreren Stellen im Problemraum gesucht wird. Sie bedienen sich Mechanismen aus der Evolution: Es gibt eine Population von Individuen, die jedes das Problem kodieren ("vollständige Zustandsbeschreibung") und damit im Laufe der Suche zu einer möglichen Lösung werden können.

Videos (HSBI-Medienportal)
Lernziele
  • (K2) Problematik der lokalen Minima bei Gradientenverfahren
  • (K2) Überblick über die verschiedenen Strömungen
  • (K2) Prinzipieller Ablauf von Genetischen Algorithmen

Evolution sehr erfolgreich bei Anpassung

Quelle: Photo by Johannes Plenio on Unsplash.com (Unsplash License)

Wie funktioniert's?

EA -- Zutaten und Mechanismen

  • Zutaten:

    • Individuen: Kodierung möglicher Lösungen
    • Population von Individuen
    • Fitnessfunktion: Bewertung der Angepasstheit
  • Mechanismen ("Operatoren"):

    • Selektion
    • Rekombination (Crossover)
    • Mutation

EA -- Allgemeiner Ablauf

EA -- Beispiel

Jedes Individuum kodiert ein Spielfeld mit einer konkreten Anordnung aller Königinnen => Vollständige Zustandsbeschreibung.

Dabei korrespondiert der Index in das Array des Individuums mit der jeweiligen Spalte des Spielfelds. Die Zahl an einer Arrayposition gibt dann an, in welcher Zeile in dieser Spalte eine Königin ist.

Crossover: Die ausgewählten Individuen werden an der selben Stelle aufgetrennt und die Hälften verkreuzt zu zwei neuen Individuen zusammengesetzt. Es entstehen zwei neue Anordnungen der Königinnen (zwei neue Spielfelder).

EA -- Strömungen

  1. Genetische Algorithmen (GA)

    • Holland und Goldberg (ab 1960)
    • Binäre Lösungsrepräsentation (Bitstring): $\mathbf{g} = (g_1, \dots, g_m)\in \{ 0,1\}^m$
    • Fitnessbasierte stochastische Selektion
    • $\mu$ Eltern erzeugen $\mu$ Kinder
  2. Evolutionsstrategien (ES)

    • Rechenberg und Schwefel (ab 1960)
    • Kodierung reellwertiger Parameter: $\mathbf{g} = (\mathbf{x}, \mathbf{\sigma})$ mit $\mathbf{x} = (x_1, \dots, x_n) \in \mathbb{R}^n$
    • $\mu$ Eltern erzeugen $\lambda$ Kinder mit $\mu \le \lambda$
  3. Evolutionäre Programmierung (EP)

Hinweis: Häufig finden sich Mischformen, beispielsweise GA mit reellwertigen Parametern

Hinweis: Im Folgenden werden Genetische Algorithmen (GA) betrachtet. Sie finden jeweils Hinweise auf die Gestaltung der Operatoren bei ES.

Anwendungsbeispiele für Evolutionäre Algorithmen

  • Berechnung und Konstruktion komplexer Bauteile: beispielsweise Tragflächenprofile (Flugzeuge), Brücken oder Fahrzeugteile unter Berücksichtigung bestimmter Nebenbedingungen
  • Scheduling-Probleme: Erstellung von Stunden- und Raumplänen oder Fahrplänen
  • Berechnung verteilter Netzwerktopologien: Wasserversorgung, Stromversorgung, Mobilfunk
  • Layout elektronischer Schaltkreise

Wrap-Up

Lokale Suchverfahren: Nur das Ergebnis zählt!

  • Evolutionäre Algorithmen: Unterschied GA und ES (grober Überblick)
Übungsblätter/Aufgaben
Quellen
  • [Baeck1996] Evolutionary Algorithms in Theory and Praxis
    Bäck, T., Oxford University Press, 1996. ISBN 978-0-1950-9971-3.
  • [Michalewicz1996] Genetic Algorithms + Data Structures = Evolution Programs
    Michalewicz, Z., Springer, 1996. ISBN 978-3-5406-0676-5.
  • [Nissen1997] Einführung in Evolutionäre Algorithmen
    Nissen, V., Vieweg+Teubner Verlag, 1997. ISBN 978-3-5280-5499-1.
  • [Russell2020] Artificial Intelligence: A Modern Approach
    Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
    GA: Abschnitt 4.1.4
  • [Schwefel1995] Evolution and Optimum Seeking
    Schwefel, H. P., Wiley, 1995. ISBN 978-0-4715-7148-3.
    Originalarbeit zu Evolutionsstrategien

Modellierung mit Genetischen Algorithmen

TL;DR

Lokale Suchverfahren: Nur das Ergebnis zählt!

Evolutionäre Algorithmen sind lokale Suchverfahren, wobei gleichzeitig an mehreren Stellen im Problemraum gesucht wird. Sie bedienen sich Mechanismen aus der Evolution: Es gibt eine Population von Individuen, die jedes das Problem kodieren ("vollständige Zustandsbeschreibung") und damit im Laufe der Suche zu einer möglichen Lösung werden können.

Die Individuen werden mit Hilfe einer Fitnessfunktion bewertet, wie gut sie bereits an das Problem angepasst sind (bzw. wie sehr sie bereits der gesuchten Lösung entsprechen). Über eine fitnessproportionale Selektion werden Individuen ausgewählt, aus denen mittels Rekombination (auch "Crossover" genannt) neue Individuen mit Eigenschaften der Eltern erzeugt werden. Über eine Mutation werden dann noch Elemente der neuen Individuen leicht verändert, bevor diese zur neuen Population werden ...

Durch das Anwenden von Rekombination und Mutation springt man im Problemraum umher. Auch wenn als Basis die fitteren (angepassteren) Individuen dienen, kann es wie bei allen lokalen Suchverfahren vorkommen, dass sich der Algorithmus in lokalen Minima (bzw. lokalen Maxima, je nach Richtung der Optimierung) festfrisst.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K3) GA: Kodierung, Fitnessfunktion, Ablauf, Operatoren, Auswertung

EA -- Allgemeiner Ablauf

Kodierung Individuen

  • Binäre Lösungsrepräsentation (Bitstring): $\mathbf{g} = (g_1, \dots, g_m)\in \{ 0,1\}^m$

    • String gliedert sich in $n$ Elemente (mit $n \le m$) => jedes Segment entspricht einer Problemvariablen
    • Dekodierungsfunktion $\Gamma : \{0,1\}^m \to \mathbb{R}^n$

    Alle relevanten Aspekte des Problems müssen in die Codierung einfließen!

    Bei ES hat man einen Vektor mit reellen Zahlen, wobei jeder Eintrag einen Parameter des Problems darstellt. Eine Dekodierungsfunktion benötigt man entsprechend nicht.

    Bei der Erzeugung der Startpopulation werden die Individuen zufällig (mit zufälligen Werten) initialisiert.

  • Fitnessfunktion $\Phi$ ordnet jedem Individuum $\mathbf{g}_i$ eine reelle Zahl zu: $$\Phi(\mathbf{g}_i) = F(\Gamma(\mathbf{g}_i)) - w\cdot\sum_j(Z_j(\Gamma(\mathbf{g}_i)))^2$$

    • Zielfunktion $F$: wie sehr genügt ein Individuum bereits dem Optimierungproblem
    • Strafterme $Z_j$: Anreicherung der Optimierung mit weiteren Informationen
    • Gewichte $w$: statisch oder dynamisch (Abkühlen)

    Die Wahl einer guten Fitnessfunktion ist oft eine Herausforderung, aber dennoch wichtig, da damit die Suche gesteuert wird!

Selektion: Erstelle Matingpool mit $\mu$ Individuen

  • Fitnessproportionale Selektion (Roulette Wheel Selection): Auswahlwahrscheinlichkeit für Individuum $\mathbf{g}_k$: $$p_{sel}(\mathbf{g}_k) = \frac{\Phi(\mathbf{g}_k)}{\sum_j \Phi(\mathbf{g}_j)}$$ => Voraussetzung: positive Fitnesswerte

  • Turnier-Selektion (Tournament Selection):

    • Turniergröße $\xi$
    • Turnier: ziehe $\xi$ Individuen gleichverteilt (mit Zurücklegen!) und kopiere fittestes Individuum in den Matingpool
    • Führe $\mu$ Turniere durch

Hinweis: Es gibt noch viele weitere Selektionsmechanismen. Die vorgestellten sind in der Praxis am gebräuchlichsten.

Über die Selektion wird der sogenannte "Selektionsdruck" aufgebaut: Wie gut muss ein Individuum sein (im Vergleich zu den restlichen Individuen in der Population), damit es eine Chance zur Reproduktion erhält? Dürfen sich nur die "Guten" fortpflanzen, oder erhalten auch die "Schlechten" eine gewisse Chance?

Da jedes Individuum einen Punkt im Suchraum darstellt, beeinflusst die Wahl der Selektion die Geschwindigkeit der Suche, begünstigt u.U. aber auch ein eventuelles Festfahren in lokalen Minima. Dies kann beispielsweise geschehen, wenn immer nur die "Guten" selektiert werden, aber die "Guten" der Population sich in der Nähe eines lokalen Minimums befinden. Dann werden auch die Nachfolger sich wieder dort aufhalten.

Crossover: Erzeuge zwei Nachkommen aus zwei Eltern

Festlegung der Crossover-Wahrscheinlichkeit $p_{cross}$ (typisch: $p_{cross} \ge 0.6$)

  1. Selektiere Eltern $\mathbf{g}_a$ und $\mathbf{g}_b$ gleichverteilt aus Matingpool

  2. Zufallsexperiment:

    • mit $1-p_{cross}$: Kinder identisch zu Eltern (kein Crossover)

    • mit $p_{cross}$: Crossover mit $\mathbf{g}_a$ und $\mathbf{g}_b$

      • Ziehe $i$ gleichverteilt mit $1 < i < m$
      • Kinder aus $\mathbf{g}_a$ und $\mathbf{g}_b$ zusammenbauen: $$\mathbf{g}_c = (g_{a,1}, \dots, g_{a,i}, \; g_{b,{i+1}}, \dots, g_{b,m})$$ und $$\mathbf{g}_d = (g_{b,1}, \dots, g_{b,i}, \; g_{a,{i+1}}, \dots, g_{a,m})$$

      => Trenne Eltern an gleicher Stelle auf, vertausche Bestandteile

  3. Gehe zu Schritt 1, bis insg. $\mu$ Nachkommen

Anmerkung: Die Eltern werden jeweils in die Ausgangsmenge zurückgelegt.

Mit einer kleinen Wahrscheinlichkeit sind die Kinder also identisch zu den Eltern. Dies ist im Sinne der lokalen Suche wichtig, um bereits erreichte gute Positionen im Suchraum nicht zu verlieren: Es könnte sein, dass die Nachfolger alle schlechter sind ...

Varianten: $N$-Punkt-Crossover, Shuffle-Crossover

Bei ES wird parameterweise gekreuzt. Dabei gibt es verschiedene Möglichkeiten: Übernahme eines Parameters von einem Elternteil, Verrechnen (beispielsweise Mitteln) der Werte beider Eltern, ... Bei ES heißt "Crossover" deshalb oft "Rekombination".

Mutation

  • Mutationswahrscheinlichkeit $p_{mut}$ (typische Werte: $p_{mut} = 0.01$ oder $p_{mut} = 0.001$)

  • Für alle Individuen:

    • Mutiere jedes Gen eines Individuums mit $p_{mut}$:

      $$ g_i^{(t+1)} = \left\{ \begin{array}{ll} \neg g_i^{(t)} & \mbox{ falls } \chi_i \le p_{mut}\\[5pt] \phantom{\neg} g_i^{(t)} & \mbox{ sonst } \end{array} \right. $$

      =>$\chi_i$ gleichverteilte Zufallsvariable (Intervall $[0,1]$), für jedes Bit $g_i$ neu bestimmen

Anmerkung: Die optimale Mutationsrate $p_{mut}^*$ ist von Länge $m$ des Bitstrings abhängig; annäherbar durch $p_{mut}^* \approx 1/m$.

Die beim Crossover erstellten Nachfolger liegen im Suchraum in der Nähe der Eltern. Durch die Mutationsrate bestimmt man, ob und wie weit sich ein Kind entfernen kann. Dies entspricht dem Bild des "Schüttelns" der Zustandslandschaft.

Bei ES unterscheidet man Mutationswahrscheinlichkeit und Mutationsrate. Es wird parameterweise mutiert.

Bewertungskriterien

Vorsicht: Es handelt sich um Zufallsexperimente. Wenn man nicht nur direkt nach einer Lösung sucht, sondern beispielsweise Parametereinstellungen oder die Wahl der Fitnessfunktion für ein Problem vergleichen will, muss man jeweils mehrere Experimente mit der selben Einstellung machen und Kenngrößen berechnen.

Geschwindigkeit: AES Average Evaluations to a Solution $$ \mbox{AES } = \frac{\sum\limits_{i \in \mbox{erfolgreiche Läufe}} \mbox{Generationen von Lauf } i}{\mbox{Anzahl der erfolgreichen Läufe}} $$

Die AES liegt im Intervall $[0, maxGen]$.

Lösungswahrscheinlichkeit: SR Success Rate $$ \mbox{SR } = \frac{\mbox{Anzahl der erfolgreichen Läufe}}{\mbox{Anzahl aller Läufe}} $$

Die SR liegt im Intervall $[0, 1]$.

Typische Läufe

  • Populationsgröße $\mu=15$
  • Anzahl Nachfahren $\lambda=100$
  • Abbruch nach $maxGen=200$ Generationen

Stochastischer Algorithmus! Ausreichend Wiederholungen durchführen und mitteln!

Hinweis: Die Parameter müssen problemabhängig gewählt werden. Zu hohe Werte für $\mu$ und $\lambda$ führen dazu, dass man bei kleinen Problemen mit hoher Wahrscheinlichkeit bereits am Anfang eine Lösung "würfelt", also gar kein GA nutzt. Wenn dies allerdings nicht passiert, sorgt eine hohe Populationsgröße dafür, dass jeder Schritt sehr lange dauert. Die Abbruchgrenze ist ebenfalls mit Augenmaß zu wählen: Ein zu kleiner Wert sorgt für zu frühen Abbruch (keine Lösung!), ein zu hoher Wert sorgt beim Festfressen des Algorithmus für eine unnötige weitere "Suche" ...

Wrap-Up

Lokale Suchverfahren: Nur das Ergebnis zählt!

  • Evolutionäre Algorithmen:
    • Begriffe: Individuum, Population, Kodierung
    • Operationen: Selektion, Rekombination, Mutation
    • Bewertung mit Fitnessfunktion
Challenges

Sudoku

Ein $9 \times 9$-Sudoku-Rätsel soll mit einem GA gelöst werden.

Geben Sie für dieses Problem jeweils eine geeignete Kodierung der Individuen, passende Operatoren (Crossover, Mutation) und eine geeignete Fitnessfunktion an, damit das Problem mit einem GA gelöst werden kann. Begründen Sie Ihre Wahl!

Was würden Sie noch benötigen, um das Probleme mit Simulated Annealing lösen zu können?

Travelling Salesman Problem

Das Travelling Salesman Problem für 10 Städte, d.h. das Finden der kürzesten Route zwischen 10 Städten, soll mit einem GA gelöst werden.

Geben Sie für dieses Problem jeweils eine geeignete Kodierung der Individuen, passende Operatoren (Crossover, Mutation) und eine geeignete Fitnessfunktion an, damit das Problem mit einem GA gelöst werden kann. Begründen Sie Ihre Wahl!

Was würden Sie noch benötigen, um das Probleme mit Simulated Annealing lösen zu können?

Übungsblätter/Aufgaben
Quellen
  • [Baeck1996] Evolutionary Algorithms in Theory and Praxis
    Bäck, T., Oxford University Press, 1996. ISBN 978-0-1950-9971-3.
  • [Michalewicz1996] Genetic Algorithms + Data Structures = Evolution Programs
    Michalewicz, Z., Springer, 1996. ISBN 978-3-5406-0676-5.
  • [Nissen1997] Einführung in Evolutionäre Algorithmen
    Nissen, V., Vieweg+Teubner Verlag, 1997. ISBN 978-3-5280-5499-1.
  • [Russell2020] Artificial Intelligence: A Modern Approach
    Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
    GA: Abschnitt 4.1.4
  • [Schwefel1995] Evolution and Optimum Seeking
    Schwefel, H. P., Wiley, 1995. ISBN 978-0-4715-7148-3.
    Originalarbeit zu Evolutionsstrategien

Subsections of Spiele

Einführung Optimale Spiele

TL;DR

Spiele können als Suchproblem betrachtet werden. Dabei sind in der Regel mehrere Spieler ("Agenten") beteiligt. Bei manchen Spielen ist die Umgebung (der Spielzustand) vollständig einsehbar, bei anderen nur teilweise (Kartenspiele). Bei manchen Spielen kommt eine Zufallskomponente zum Wirken.

Spiele sind in der KI deshalb so interessant, weil bei der Suche riesige Suchbäume entstehen (bzw. durchsucht werden müssten). Da die Ressourcen normalerweise begrenzt sind (denken Sie an die Reaktionszeit auf einen Zug des Gegners), muss man hier intelligente Lösungen finden. (Einige davon werden wir in den folgenden Sitzungen anschauen).

Videos (HSBI-Medienportal)
Lernziele
  • (K2) Spiele als Suchproblem
  • (K2) Eigenschaften guter Spielalgorithmen

Backgammon: Zwei Spieler, was ist der beste Zug?

Quelle: "position-backgammon-decembre" by serialgamer_fr on Flickr.com (CC BY 2.0)

Zwei Spieler, ein Spielstand und ein Würfelergebnis: Was ist jetzt der beste Zug?!

Motivation: Unterschied zu Suche?!

=> Mehrere konkurrierende Agenten an Suche beteiligt!

=> (Re-) Aktion des Gegners unbekannt/nicht vorhersehbar.

Spiele und Umgebungen

Deterministisch Zufallskomponente
Voll beobachtbar Schach, Go, ... Backgammon, Monopoly
Partiell beobachtbar Schiffe-versenken Bridge, Poker, Skat, ...

=> Bis auf Roboterfußball in KI traditionell keine physischen Spiele!

Brettspiele sind interessant für KI

  • Brettspiele gut abstrakt darstellbar:

    • Zustände einfach repräsentierbar
    • Aktionen wohldefiniert (und i.d.R. sehr einfach)
    • Realisierung als Suchproblem möglich
  • Problem: Suchbäume werden in Praxis riesig

    Beispiel Schach:

    • Im Mittel 35 Aktionen (branching factor) von jeder Position
    • Oft mehr als 40 Züge pro Spieler => Suchbäume mit mehr als 80 Ebenen
    • $35^{80} \approx 10^{123}$ mögliche Knoten!
    • (Aber "nur" rund $10^{40}$ verschiedene Zustände)

    Quelle: [Russell2020, pp. 193-196]

Eigenschaften guter Spielalgorithmen

  • Zeit begrenzt

    • Irgendeine gute Entscheidung treffen! => Bewertungsfunktion (auch für Zwischenzustände)
  • Speicher begrenzt

    • Evaluierungsfunktion für Zwischenzustände
    • Löschen von irrelevanten Zweigen
  • Strategien nötig

    • Vorausschauend spielen (Züge "vorhersehen")

Wrap-Up

  • Spiele kann man als Suchproblem betrachten
  • Merkmale:
    • Mehrere Agenten beteiligt
    • Beobachtbarkeit der Umgebung
    • Zufallskomponente
    • Spielstrategie
  • Problem: Riesige Spielbäume
  • Umgang mit begrenzten Ressourcen (Zeit, Speicher)
Übungsblätter/Aufgaben
Quellen

Minimax

TL;DR

Mit dem Minimax-Algorithmus können optimale Züge berechnet werden. Dabei wird von zwei Spielern Max und Min ausgegangen, die abwechselnd ziehen und beide optimal spielen. Wenn Max gewonnen hat, wird der Spielausgang mit +1 bewertet, wenn Min gewonnen hat mit -1, und mit 0 sonst. Damit hat man ein sogenanntes "Nullsummenspiel" (der Gewinn des einen Spielers ist der Verlust des anderen) und kann den Algorithmus so gestalten, dass Max stets den Zug wählt, der das Spielergebnis maximiert und Min entsprechend den Zug wählt, der das Spielergebnis minimiert (daher auch die Namen der Spieler).

Minimax baut den gesamten Spielbaum bis zu den Blättern auf. Die Blätter (Spielausgang) werden mit einer Utility-Funktion bewertet, und diese Bewertung wird dann im Spielbaum nach oben gereicht.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K3) Minimax-Algorithmus

Spiele als Suchproblem: Minimax

Terminologie

  • Zwei abwechselnd spielende Spieler: MAX und MIN, wobei MAX beginnt

    • Beide Spieler spielen in jedem Zug optimal
    • Spielergebnis wird aus Sicht von MAX bewertet:
      • $+1$, wenn Spieler MAX gewinnt
      • $-1$, wenn Spieler MIN gewinnt
      • $0$, wenn unentschieden
    • Spieler MAX versucht, das Spielergebnis zu maximieren
    • Spieler MIN versucht, das Spielergebnis zu minimieren
  • Startzustand: Initialer Zustand des Spielbrettes

  • Aktionen: Legale Züge, abhängig vom Spielzustand

  • Zieltest: Ist das Spiel vorbei?

    => Startzustand und anwendbare Aktionen definieren den Zustandsraum.

  • Nutzenfunktion: $\operatorname{UTILITY}(s,p)$: Wert des Spiels für Spieler $p$ im Spielzustand $s$

  • Strategie: Spieler benötigen Strategie, um zu gewünschtem Endzustand zu kommen (unabhängig von den Entscheidungen des Gegenspielers) => einfacher Pfad von Start zu Ziel reicht nicht

Hinweis: Nullsummenspiel! (Der Gewinn des einen Spielers ist der Verlust des anderen Spielers.)

Eine mit dem Minimax-Algorithmus berechnete Strategie wird auch Minimax-Strategie genannt. Sie sichert dem betreffenden Spieler den höchstmöglichen Gewinn, der unabhängig von der Spielweise des Gegners erreichbar ist.

Bei Nicht-Nullsummenspielen, bei denen die Niederlage des Gegners nicht zwangsläufig mit dem eigenen Gewinn zusammenfällt (d.h. Gewinn des einen Spielers $\ne$ Verlust des anderen Spielers), liefert der Minimax-Algorithmus nicht unbedingt eine optimale Strategie.

Spielbaum TTT

Minimax (Idee)

  1. Erzeuge kompletten Suchbaum mit Tiefensuche
  2. Wende Nutzenfunktion (Utility) auf jeden Endzustand an
  3. Ausgehend von Endzuständen => Bewerte Vorgängerknoten:
    • Knoten ist Min-Knoten: Nutzen ist das Minimum der Kindknoten
    • Knoten ist Max-Knoten: Nutzen ist das Maximum der Kindknoten
  4. Startknoten: Max wählt den Zug, der zum Nachfolger mit der höchsten Bewertung führt

Annahme: Beide spielen perfekt. Fehler verbessern das Resultat für den Gegner.

Minimax-Algorithmus: Funktionen für MAX- und MIN-Knoten

def Max-Value(state):
    if Terminal-Test(state): return Utility(state)

    v = -INF
    for (a, s) in Successors(state):
        v = MAX(v, Min-Value(s))
    return v
def Min-Value(state):
    if Terminal-Test(state): return Utility(state)

    v = +INF
    for (a, s) in Successors(state):
        v = MIN(v, Max-Value(s))
    return v

Hinweis I: Auf wikipedia.org/wiki/Minimax finden Sie eine Variante mit einem zusätzlichen Tiefenparameter, um bei einer bestimmten Suchtiefe abbrechen zu können. Dies ist bereits eine erweiterte Version, wo man beim Abbruch durch das Erreichen der Suchtiefe statt Utility() eine Eval()-Funktion braucht (vgl. Minimax: Heuristiken).

Wenn man ohne Suchtiefenbeschränkung arbeiten will, braucht man diesen Parameter nicht! Der Algorithmus terminiert auch ohne Suchtiefenbeschränkung!

Hinweis II: Im [Russell2020, S. 196, Abb. 6.3] findet sich eine Variante, die die auf der nächsten Folien gezeigte Startfunktion mit den hier gezeigten Min-Value()- und Max-Value()-Funktionen verschmilzt. Dabei wird in den beiden Hilfsfunktionen nicht nur der min- bzw. max-Wert optimiert, sondern auch der jeweils beste Zug gespeichert und als Rückgabe zurückgeliefert.

Minimax-Algorithmus: Sonderbehandlung Startknoten

def Minimax(state):
    (val, action) = (-INF, null)
    for (a, s) in Successors(state):
        v = Min-Value(s)
        if (val <= v):
            (val, action) = (v, a)
    return action
  • Startknoten ist ein MAX-Knoten
  • Nicht nur Kosten, sondern auch die zugehörige Aktion speichern

Minimax Beispiel

Aufwand Minimax

  • maximale Tiefe des Spielbaums: $m$
  • in jedem Zustand $b$ gültige Züge
  • => Zeitkomplexität $O(b^m)$

Gedankenexperiment:

  • erster Zug: $b$ Möglichkeiten,
  • zweiter Zug: jeweils wieder $b$ Möglichkeiten $\rightarrow$ $b \star b = b^2$,
  • dritter Zug: jeweils wieder $b$ Möglichkeiten $\rightarrow$ $b \star (b \star b) = b^3$,
  • ...,
  • $m$. Zug: jeweils wieder $b$ Möglichkeiten $\rightarrow$ $b^m$

Wrap-Up

  • Minimax: Entwickelt Spielbaum, bewertet Zustände entsprechend Max und Min
    • Gewinn von Max: +1, Gewinn von Min: -1
    • Max wählt das Maximum der möglichen Züge von Min
    • Min wählt das Minimum der möglichen Züge von Max
    • Spielbaum wird bis zu den Blättern entwickelt, Bewertung mit Utility
Challenges

Optimale Spiele und MiniMax

Auf einem Tisch liegen nebeneinander 5 Streichhölzer. Es gibt zwei Spieler - Weiß und Schwarz - die abwechselnd ein oder zwei Streichhölzer wegnehmen dürfen (es muss mind. ein Streichholz genommen werden). Wer das letzte Streichholz nehmen muss, hat verloren. Zu Beginn ist Weiß am Zug.

  1. Spielbaum

Zeichnen Sie den kompletten Spielbaum auf. Geben Sie an den Kanten jeweils die Zahl der genommenen und der verbleibenden Hölzer an.

Beispiel: Wenn in einem Zug ein Holz genommen wird und 3 Hölzer verbleiben, steht an der entsprechenden Kante "1/3". Geben Sie jeweils an, welcher Spieler am Zug ist.

  1. Minimax

Geben Sie die Bewertung aller Spielzustände mit Hilfe des Minimax-Algorithmus an. Bewerten Sie die Endzustände mit +1, wenn Spieler Weiß gewonnen hat, mit -1, falls Schwarz gewonnen hat.

  1. Optimaler Zug

Mit welchem Zug muss Weiß beginnen, um das Spiel garantiert zu gewinnen (beide Spieler verhalten sich stets optimal)? Argumentieren Sie mit der Minimax-Bewertung.

Übungsblätter/Aufgaben
Quellen

Heuristiken

TL;DR

Minimax entwickelt den gesamten Spielbaum. Wenn nicht genug Zeit dafür zur Verfügung steht, kann man die Suchtiefe begrenzen. Für die Bewertung der Zustände benötigt man eine Eval-Funktion, die die Knoten in der selben Reihenfolge sortieren sollte wie es in der vollständigen Version über die Utility-Funktion geschieht. Die Eval-Funktion sollte zudem schnell zu berechnen sein. Typische Varianten für die Eval-Funktion sind gewichtete Features oder ein Nachschlagen in Spieldatenbanken (Spielzustand plus Bewertung).

Minimax kann auf Spiele mit mehr als zwei Spielern erweitert werden. Dabei versucht dann jeder Spieler für sich, das Ergebnis des Spiels (aus seiner Sicht) zu maximieren.

Bei Spielen mit Zufall (Würfelereignisse) kann man jedem Würfelereignis eine Wahrscheinlichkeit zuordnen und damit den jeweils erreichbaren Max- oder Min-Wert gewichten. Die Summe dieser gewichteten Bewertungen ist die Bewertung des entsprechenden "Chance"-Knotens, der dann in der darüberliegenden Ebene nach dem Minimax-Prinzip ausgewertet wird (=> Expectimax).

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Minimax für mehr als zwei Spieler
  • (K2) Minimax mit Zufallskomponente
  • (K2) Optimierungsmöglichkeit: Sortierung der Nachfolger => Heuristik
  • (K2) Optimierungsmöglichkeit: Suchtiefe beschränken => Übergang zu Bewertungsfunktion
  • (K2) Optimierungsmöglichkeit: Bewertung über Spieldatenbanken
  • (K3) Minimax-Algorithmus
  • (K3) Tiefenbeschränkung und Bewertungsfunktion bei Minimax

Wenn die Zeit nicht reicht: Suchtiefe begrenzen

  • Einführung neuer Funktionen:

    1. Cutoff-Test statt Terminal-Test

      Beispielsweise bei erreichter Tiefe oder Zeitüberschreitung

    2. Eval statt Utility

      Bewertung der erreichten Position (statt nur Bewertung des Endzustandes)

  • Bedingungen an Eval:

    1. Endknoten in selber Reihenfolge wie bei Utility
    2. Schnell zu berechnen (!)

Beispiel Schach

  • Mögliche Evaluierungskriterien:

    • Materialwert: Bauer 1, Läufer/Springer 3, Turm 5, Dame 9
    • Stellungsbewertung: Sicherheit des Königs, Stellung der Bauern
    • Daumenregeln: 3 Punkte Vorteil => sicherer Sieg
  • Nutzung gewichteter Features $f_i$: $\operatorname{Eval}(s) = w_1f_1(s) + w_2f_2(s) + \ldots$

    • Beispiel: $w_1 = 9$ und $f_1(s)$ = (# weiße Königinnen) - (# schwarze Königinnen)
  • Alternativ: Speicherung von Positionen plus Bewertung in Datenbanken => Lookup mit $\operatorname{Eval}(s)$ (statt Berechnung zur Laufzeit)

Minimax mit mehreren Spielern

Hier maximiert jeder Spieler sein eigenes Ergebnis. Im Grunde müsste diese Variante dann besser "Maximax" heissen ...

Wenn es an einer Stelle im Suchbaum mehrere gleich gute (beste) Züge geben sollte, kann der Spieler Allianzen bilden: Er könnte dann einen Zug auswählen, der für einen der Mitspieler günstiger ist.

Zufallsspiele

Quelle: "position-backgammon-decembre" by serialgamer_fr on Flickr.com (CC BY 2.0)

Backgammon: Was ist in dieser Situation der optimale Zug?

Minimax mit Zufallsspielen: ZUFALLS-Knoten

Zusätzlich zu den MIN- und MAX-Knoten führt man noch Zufalls-Knoten ein, um das Würfelergebnis repräsentieren zu können. Je möglichem Würfelergebnis $i$ gibt es einen Ausgang, an dem die Wahrscheinlichkeit $P(i)$ dieses Ausgangs annotiert wird.

=> Für Zufallsknoten erwarteten Minimax-Wert (Expectimax) nutzen

Minimax mit Zufall: Expectimax

Expectimax-Wert für Zufallsknoten $C$:

$$ \operatorname{Expectimax}(C) = \sum_i P(i) \operatorname{Expectimax}(s_i) $$
  • $i$ mögliches Würfelergebnis
  • $P(i)$ Wahrscheinlichkeit für Würfelergebnis
  • $s_i$ Nachfolgezustand von $C$ gegeben Würfelergebnis $i$

Für die normalen Min- und Max-Knoten liefert Expectimax() die üblichen Aufrufe von Min-Value() bwz. Max-Value().

Auf wikipedia.org/wiki/Expectiminimax finden Sie eine Variante mit einem zusätzlichen Tiefenparameter, um bei einer bestimmten Suchtiefe abbrechen zu können. Dies ist bereits eine erweiterte Version, wo man beim Abbruch durch das Erreichen der Suchtiefe statt Utility() eine Eval()-Funktion braucht. Zusätzlich kombiniert der dort gezeigte Algorithmus die Funktionen Expectimax(), Min-Value() und Max-Value() in eine einzige Funktion.

Eine ähnliche geschlossene Darstellung finden Sie im [Russell2020, S. 212].

Hinweis: Üblicherweise sind die Nachfolger der Zufallsknoten gleich wahrscheinlich. Dann kann man einfach mit dem Mittelwert der Bewertung der Nachfolger arbeiten.

Wrap-Up

  • Minimax:
    • Kriterien zur Begrenzung der Suchtiefe, Bewertung Eval statt Utility
    • Erweiterung auf $>2$ Spieler
    • Erweiterung auf Spiele mit Zufall: Expectimax
Übungsblätter/Aufgaben
Quellen

Alpha-Beta-Pruning

TL;DR

Minimax entwickelt den gesamten Spielbaum. Wenn man dabei die bisher besten Werte für MAX und MIN als $\alpha$ und $\beta$ mitführt, beobachtet man, dass ein $\alpha$-Wert nie kleiner wird und ein $\beta$-Wert nie größer wird. Dies kann man ausnutzen und das Entwickeln von Pfaden abbrechen, wenn in einem MIN-Knoten der $\beta$-Wert kleiner wird als der $\alpha$-Wert des MAX-Vorgängers: (a) kann der $\beta$-Wert bei der weiteren Untersuchung der verbleibenden Nachfolger im MIN-Knoten nur noch kleiner werden, und (b) würde der MAX-Vorgänger diesen MIN-Knoten nie als Nachfolger in Betracht ziehen, da er bereits einen besseren Zug gesehen hat (da sein $\alpha$ größer ist als das $\beta$ im Nachfolger). Deshalb kann man hier sofort die Untersuchung der verbleibenden Nachfolger im MIN-Knoten abbrechen ("Pruning"). Eine analoge Überlegung gilt für einen MAX-Nachfolger unter einem MIN-Knoten.

Dabei bleibt das Endergebnis erhalten. Man schneidet nur Suchpfade weg, die das Ergebnis von Minimax nicht verändern.

Die mögliche Effizienzsteigerung ist sehr stark abhängig von Sortierung der Nachfolger! Deshalb stellt man häufig Heuristiken zur "richtigen" Sortierung der Nachfolger auf ("Killer-Moves").

Zusätzlich kann man wie bei Minimax auch die Suchtiefe begrenzen und eine Bewertungsfunktion (statt der Nutzenfunktion) einsetzen. Auch hier kann die Bewertungsfunktion wieder gewichtete Features nutzen und/oder Positionen mit in Datenbanken gespeicherten Positionen und Bewertungen abgleichen.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Optimierungsmöglichkeit: Sortierung der Nachfolger => Heuristik
  • (K2) Optimierungsmöglichkeit: Suchtiefe beschränken => Übergang zu Bewertungsfunktion
  • (K2) Optimierungsmöglichkeit: Bewertung über Spieldatenbanken
  • (K3) alpha-beta-Pruning

Verbesserung Minimax-Algorithmus

=> Minimax-Baum: Verbesserungen möglich?

Alpha-beta-Pruning

Minimax-Algorithmus mit zusätzlichen Informationen:

  • $\alpha$: bisher bester Wert für MAX (höchster Wert)
  • $\beta$: bisher bester Wert für MIN (kleinster Wert)

=> Beobachtungen:

  1. $\alpha$ für MAX-Knoten wird nie kleiner
  2. $\beta$ für MIN-Knoten wird nie größer

Pruning-Regeln

  1. Schneide (unter) MIN-Knoten ab, deren $\beta$ $\le$ dem $\alpha$ des MAX-Vorgängers ist.

  2. Schneide (unter) MAX-Knoten ab, deren $\alpha$ $\ge$ dem $\beta$ des MIN-Vorgängers ist.

Abbruch, wenn kein Platz mehr zwischen Alpha und Beta

Alpha-beta-Pruning -- Der Algorithmus (Skizze)

def Max-Value(state, alpha, beta):
    if Terminal-Test(state): return Utility(state)

    v = -INF
    for (a, s) in Successors(state):
        v = MAX(v, Min-Value(s, alpha, beta))
        if (v >= beta): return v
        alpha = MAX(alpha, v)
    return v
def Min-Value(state, alpha, beta):
    if Terminal-Test(state): return Utility(state)

    v = +INF
    for (a, s) in Successors(state):
        v = MIN(v, Max-Value(s, alpha, beta))
        if (v <= alpha): return v
        beta = MIN(beta, v)
    return v

Initialer Aufruf von Max-Value() mit $\alpha = -\infty$ und $\beta = +\infty$

Achtung: Es kursieren Varianten von diesem Algorithmus, bei denen auf die Hilfsvariable v verzichtet wird und stattdessen alpha bzw. beta direkt modifiziert werden und als Rückgabewert dienen. Das kann zu anderen oder falschen Ergebnissen führen! Sie können das in der Aufgabe auf Blatt 03 gut beobachten.

Alpha-beta-Pruning -- Eigenschaften

  1. Pruning beeinflusst nicht das Endergebnis!

  2. Sortierung der Nachfolger spielt große Rolle

  3. Perfekte Sortierung: $O(b^{d/2})$ => Verdopplung der Suchtiefe möglich

Für Schach immer noch zu aufwändig ...

Verbesserungen für Alpha-beta-Pruning

  • "Killer-Move": Maximale Effizienz nur wenn optimaler Zug immer zuerst untersucht => Zu untersuchende Züge sortieren/priorisieren, zb. Schach: a) Figuren schlagen b) Drohen c) Vorwärts ziehen d) Rückwärts ziehen

  • Verändern der Suchtiefe nach Spielsituation

  • Bewertungsfunktion Eval:

    • Datenbanken mit Spielsituationen und Expertenbewertung:
      • Eröffnungsspiele (besonders viele Verzweigungen)
      • Endspiele
    • Lernen der optimalen Gewichte für Eval-Funktion
    • Berücksichtigung von Symmetrien

Beispiel DeepBlue (IBM, 1997)

  • Alpha-beta-Pruning mit Tiefenbeschränkung: ca. 14 Halbzüge
  • Dynamische Tiefenbeschränkung (stellungsabhängig, max. ca. 40 Züge)
  • Heuristische Stellungsbewertung Eval:
    • mehr als 8.000 Features
    • ca. 4.000 Eröffnungsstellungen
    • ca. 700.000 Spielsituationen (von Experten bewertet)
    • Endspiel-Datenbank: alle Spiele mit 5 Steinen, viele mit 6 Steinen

Quelle: [Russell2014, p. 185]

Beispiel AlphaGo (Google, 2016)

  • Beschränkung der Suchtiefe: Bewertung der Stellung durch "Value Network"

  • Beschränkung der Verzweigungsbreite: Bestimmung von Zugkandidaten durch "Policy Network"

  • Training dieser "Deep Neural Networks":

    • Überwachtes Lernen: "Analyse" von Spiel-Datenbanken
    • Reinforcement-Lernen: Self-Play, Bewertung am Ende
      • Züge mit Monte-Carlo-Baumsuche ausgewählt

Quelle: [Silver2016], siehe auch deepmind.com/research/alphago/

Wrap-Up

  • Alpha-beta-Pruning:

    • Mitführen der bisher besten Werte für MAX und MIN: $\alpha$ und $\beta$
    • Abschneiden von Pfaden, die Verschlechterung bewirken würden
    • Endergebnis bleibt erhalten
    • Effizienzsteigerung abhängig von Sortierung der Nachfolger
  • Viele Verbesserungen denkbar:

    • Zu untersuchende Züge "richtig" sortieren (Heuristik)
    • Suchtiefe begrenzen und Bewertungsfunktion (statt Nutzenfunktion)
    • Positionen mit Datenbank abgleichen
Challenges

Optimale Spiele und MiniMax

Auf einem Tisch liegen nebeneinander 5 Streichhölzer. Es gibt zwei Spieler - Weiß und Schwarz - die abwechselnd ein oder zwei Streichhölzer wegnehmen dürfen (es muss mind. ein Streichholz genommen werden). Wer das letzte Streichholz nehmen muss, hat verloren. Zu Beginn ist Weiß am Zug.

  1. Spielbaum

Zeichnen Sie den kompletten Spielbaum auf. Geben Sie an den Kanten jeweils die Zahl der genommenen und der verbleibenden Hölzer an.

Beispiel: Wenn in einem Zug ein Holz genommen wird und 3 Hölzer verbleiben, steht an der entsprechenden Kante "1/3". Geben Sie jeweils an, welcher Spieler am Zug ist.

  1. Minimax

Geben Sie die Bewertung aller Spielzustände mit Hilfe des Minimax-Algorithmus an. Bewerten Sie die Endzustände mit +1, wenn Spieler Weiß gewonnen hat, mit -1, falls Schwarz gewonnen hat.

  1. Alpha-Beta-Pruning

Wenden Sie Alpha-Beta-Pruning auf den Spielbaum an. Werden damit mehr oder weniger oder gleich viele Spielzüge wie mit Minimax entwickelt? Begründen Sie Ihre Antwort.

Übungsblätter/Aufgaben
Quellen

Constraintsolving

Was haben Typ-Inferenz, Sudoku, das 8-Queens-Problem, das Einfärben von Landkarten und das Erstellen von Stundenplänen gemeinsam?

Es handelt sich um eine bestimmte Art von Suchproblemen, wobei den Parametern (Variablen) Werte so zugewiesen werden müssen, dass Einschränkungen bzw. Relationen zwischen den Variablen gelten.

Subsections of Constraintsolving

Einführung Constraints

TL;DR

Ein Constraintproblem (CSP) besteht aus Variablen, die über Einschränkungen ("Constraints") verbunden sind. Jeder Variable wird eine Domäne (Wertebereich) zugeordnet.

Die Constraints können sich auf eine einzelne Variable beziehen ("unäre Constraints"), auf zwei Variablen ("binäre Constraints") oder auf mehr Variablen. Ein CSP kann als Graph dargestellt werden.

Eine "Belegung" ist eine Zuweisung von Werten an Variablen aus deren Domäne. Eine "konsistente" Belegung erfüllt die Constraints, eine "vollständige" Belegung belegt alle Variablen.

Eine Lösung für ein CSP ist eine vollständige und konsistente Belegung.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K1) Definitionen: Variable, Domäne, Constraint, Arität, CSP, Zuweisung
  • (K3) Formulierung von CSP

Motivation: Einfärben von Landkarten

Die Skizze soll eine Landkarte mit verschiedenen Ländern darstellen. Die Aufgabe lautet: Färbe jedes Land mit einer Farbe ein, um die Übersichtlichkeit zu erhöhen. Verwende dabei so wenig wie möglich unterschiedliche Farben. Aneinander grenzende Länder müssen unterschiedliche Farben bekommen (=> Constraint).

Einfärben von Landkarten: Formalisierung

  • Variablen: A, B, C, D, E, F

  • Werte: $\lbrace red, green, blue \rbrace$

  • Constraints: Benachbarte Regionen müssen unterschiedliche Farben haben

  • Mögliche Lösung: Zuweisung an Variablen ("Belegung") $\lbrace \operatorname{A} = red, \operatorname{B} = blue, \operatorname{C} = green, \operatorname{D} = red, \operatorname{E} = blue, \operatorname{F} = blue \rbrace$

Definition: Constraint Satisfaction Problem (CSP)

  • Ein CSP $\langle V, D, C \rangle$ besteht aus:

    • Menge von Variablen $V = \lbrace V_1, V_2, \ldots, V_n \rbrace$
    • Je $V_i$ nicht leere Domäne $D_i = \lbrace d_{i,1}, d_{i,2}, \ldots, d_{i,m_i} \rbrace$
    • Menge von Constraints $C = \lbrace C_1, C_2, \ldots, C_p \rbrace$ (Randbedingungen, Abhängigkeiten zwischen Variablen)
  • Zuweisung/Belegung (Assignment) $\alpha$:

    • Zuweisung von Werten an (einige/alle) Variablen: $\alpha = \lbrace X=a, Y=b, \ldots \rbrace$ (aus den jeweiligen Wertebereichen)
    • Konsistente Belegung: Randbedingungen sind nicht verletzt
    • Vollständige Belegung: Alle Variablen sind belegt
  • Lösung eines CSP: Vollständige und konsistente Belegung

Constraint-Graph

Ein CSP kann man auch als Constraint-Graph darstellen. Die Variablen werden zu Knoten im Graph, die Constraints zu Kanten zwischen den Knoten. Dadurch kann man die aus dem Problemlösen bekannten Algorithmen anwenden ...

Constraints -- Arität

Die Arität betrifft hier die "Stelligkeit": Wie viele Variablen stehen in einem Constraint miteinander in Beziehung? (Also wie viele Parameter hat ein Constraint?)

  • unär: betrifft einzelne Variablen Beispiel: $\operatorname{A} \neq red$

  • binär: betrifft Paare von Variablen Beispiel: $\operatorname{A} \neq \operatorname{B}$

  • höhere Ordnung: betrifft 3 oder mehr Variablen

  • Präferenzen: "soft constraints" Beispiel: "rot ist besser als grün"

    Abbildung über Gewichtung => Constraint-Optimierungsproblem (COP)

Constraints -- Wertebereiche

  • Endliche Domänen: $d$ Werte => $O(d^n)$ mögliche Zuweisungen (exponentiell in der Zahl der Variablen)

  • Unendliche Domänen: reelle Zahlen, natürliche Zahlen => Keine Auflistung der erlaubten Wertekombinationen mehr möglich => Übergang zu Gleichungen/Ungleichungen: $job_1+5

    • lineare Constraints
    • nichtlineare Constraints

Historische Unterscheidung:

  • Constraint Satisfaction: endliche Domänen, kombinatorische Methoden
  • Constraint Solving: unendliche Domänen

CSP sind überall ...

  • Stundenpläne (Klassen, Räume, Zeiten)
  • Konfiguration (Computer, Autos, ...)
  • Fahrpläne (Zug, Flug, ...)
  • Planung von komplexen Projekten
  • Sudoku :-)
  • ...

Wrap-Up

  • Definitionen und Begriffe:
    • Variable, (un-) endliche Domänen, Wertemenge
    • Constraint, Arität, CSP
    • Zuweisung, Lösung, ...
Übungsblätter/Aufgaben
Quellen
  • [Bartak2001] Theory and Practice of Constraint Propagation
    Barták, R., 2001.
  • [Kumar1992] Algorithms for Constraint Satisfaction Problems: A Survey
    Kumar, V., 1992.
  • [Russell2020] Artificial Intelligence: A Modern Approach
    Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
    CSP: Abschnitt 5.1

Lösen von diskreten CSP

TL;DR

CSP's mit endlichen Domänen lassen sich mit einer Backtracking-Suche lösen. Dabei wird schrittweise eine Variablen ausgewählt und dann ein Wert aus deren Wertebereich für die Belegung ausgewählt. Danach ruft sich die Backtracking-Suche rekursiv auf. Falls dabei keine Lösung gefunden werden kann, erfolgt Backtracking und die Belegung wird schließlich rückgängig gemacht und durch die nächste Möglichkeit ersetzt.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K3) Lösung von CSP mit endlichen Domänen mit Hilfe der BT-Suche

Einfärben von Landkarten als CSP

Endliche Domänen: Formulierung als Suchproblem

def BT_Search(assignment, csp):
    if complete(assignment): return assignment

    var = VARIABLES(csp, assignment)

    for value in VALUES(csp, var):
        if consistent(value, var, assignment, csp):
            assignment += {var = value}

            if INFERENCE(csp, assignment, var) != failure:
                result = BT_Search(assignment, csp)
                if result != failure: return result

            assignment -= {var = value}

    return failure

Quelle: Eigener Code basierend auf einer Idee nach [Russell2020, p. 176, fig. 5.5]

Hierbei handelt es sich um eine etwas angepasste Tiefensuche: Starte mit leerem Assignment und weise schrittweise Variablen passende Werte zu und mache notfalls Backtracking.

BT-Suche für CSP am Beispiel Landkartenfärbeproblem

Wrap-Up

  • Lösung von CSP mit endlichen Domänen mit Hilfe der Backtracking-Suche
Übungsblätter/Aufgaben
Quellen
  • [Bartak2001] Theory and Practice of Constraint Propagation
    Barták, R., 2001.
  • [Kumar1992] Algorithms for Constraint Satisfaction Problems: A Survey
    Kumar, V., 1992.
  • [Russell2020] Artificial Intelligence: A Modern Approach
    Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
    CSP, Backtracking: Abschnitt 5.3

Heuristiken

TL;DR

CSP's mit endlichen Domänen lassen sich mit einer Backtracking-Suche lösen. Dabei gibt es einige Freiheitsgrade: Auswahl der nächsten Variable und Wahl des nächsten Werts. Hier können Heuristiken die Suche beschleunigen.

Zur Wahl der als nächstes zu betrachtenden Variable kann die Minimum Remaining Values (MRV)-Heuristik eingesetzt werden: Wähle die Variable mit wenigsten freien Werten. Bei Gleichstand bei der MRV kann man mit der Gradheuristik die Variable mit den meisten Constraints zu offenen (noch nicht belegten) Variablen wählen.

Bei der Wahl des Wertes kann die Least Constraining Value (LCV)-Heuristik genutzt werden: Wähle den Wert, der für die verbleibenden Variablen die wenigsten Werte ungültig macht.

Während die MRV relativ leicht umzusetzen ist, muss man für die LCV alle Constraints zu den Nachbarn auswerten.

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K3) Verbesserung der BT-Suche mit Heuristiken: MRV, Gradheuristik, LCV

VARIABLES: Variablen-Sortierung, Welche Variable soll betrachtet werden?

VARIABLES: Welche Variable zuerst ausprobieren?

Minimum Remaining Values (MRV): (vgl. [Russell2020, S. 177])

  • Wähle Variable mit wenigsten freien Werten (die am meisten eingeschränkte Variable)

    => reduziert den Verzweigungsgrad

Beispiel:

  1. Freie Auswahl, alle haben gleich viele freie Werte (jeweils 3) => wähle A
  2. B und C haben nur noch zwei freie Werte => wähle B (oder C)
  3. C hat nur noch einen Wert, D noch zwei, der Rest drei => wähle C

VARIABLES: Gleichstand bei MRV

VARIABLES: Welche Variable zuerst ausprobieren?

Gradheuristik: Erweiterung von MRV bei Gleichstand (vgl. [Russell2020, S. 177])

  • Wähle Variable mit meisten Constraints auf offene (noch nicht zugewiesene) Variablen

    => reduziert den Verzweigungsgrad in späteren Schritten

Beispiel:

  1. MRV: Alle haben gleich viele freie Werte (jeweils 3) => Gradheuristik: B, C und D haben die meisten Verbindungen (Constraints) auf offene Variablen => wähle B (oder C oder D)
  2. MRV: A, C und D haben nur noch zwei freie Werte => Gradheuristik: C und D haben je zwei Constraints auf noch offene Variablen => wähle C (oder D)
  3. MRV: A und D haben beide nur noch einen Wert => Gradheuristik: D hat die meisten Verbindungen (Constraints) auf offene Variablen => wähle D

VALUES: Werte-Sortierung, Welchen Wert soll ich ausprobieren?

VALUES: Welchen Wert zuerst ausprobieren?

Least Constraining Value (LCV): (vgl. [Russell2020, S. 177])

  • Wähle Wert, der für verbleibende Variablen die wenigsten Werte ungültig macht

    => verringert die Wahrscheinlichkeit für Backtracking

Beispiel:

  1. Sei A gewählt: Alle Werte machen in den anderen Variablen einen Wert ungültig => freie Wahl des Wertes => wähle beispielsweise rot
  2. Sei B gewählt: Alle Werte machen in den anderen Variablen einen Wert ungültig => freie Wahl des Wertes => wähle beispielsweise grün
  3. Sei D gewählt: Verbleibende Werte rot und blau
    • Wahl von rot würde für C einen Wert übrig lassen (blau)
    • Wahl von blau würde für C keinen Wert übrig lassen => LCV: Wahl von rot!

Hinweis: Diese Heuristik ist in der Praxis sehr aufwändig zu berechnen! Man müsste für jeden Wert die noch offenen Constraints anschauen und berechnen, wie viele Werte damit jeweils ungültig gemacht werden. Die Idee ist aber dennoch interessant, und möglicherweise kann man sie für ein reales Problem so adaptieren, dass bei der Umsetzung nur wenig zusätzlicher Aufwand entsteht.

Wrap-Up

  • Verbesserung der BT-Suche mit Heuristiken: MRV, Gradheuristik, LCV
Challenges

Sei $D=\lbrace 0, \ldots, 5 \rbrace$, und ein Constraintproblem definiert durch

$$\langle \lbrace v_1, v_2, v_3, v_4 \rbrace, \lbrace D_{v_1} = D_{v_2} = D_{v_3} = D_{v_4} = D \rbrace, \lbrace c_1, c_2, c_3, c_4 \rbrace \rangle$$

mit

  • $c_1=\left((v_1,v_2), \lbrace (x,y) \in D^2 | x+y = 3 \rbrace\right)$,
  • $c_2=\left((v_2,v_3), \lbrace (x,y) \in D^2 | x+y \le 3 \rbrace\right)$,
  • $c_3=\left((v_1,v_3), \lbrace (x,y) \in D^2 | x \le y \rbrace\right)$ und
  • $c_4=\left((v_3,v_4), \lbrace (x,y) \in D^2 | x \ne y \rbrace\right)$.
  1. Zeichen Sie den Constraint-Graph.
  2. Welche Variable würde bei der Anwendung von MRV und Gradheuristik im ersten Schritt bei der Suche mit der BT-Search ausgewählt?
  3. Geben Sie eine Lösung für das Problem an.
Übungsblätter/Aufgaben
Quellen
  • [Bartak2001] Theory and Practice of Constraint Propagation
    Barták, R., 2001.
  • [Kumar1992] Algorithms for Constraint Satisfaction Problems: A Survey
    Kumar, V., 1992.
  • [Russell2020] Artificial Intelligence: A Modern Approach
    Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
    CSP, Backtracking/Heuristiken: Abschnitt 5.3

Kantenkonsistenz und AC-3

TL;DR

Bei der Backtracking-Suche werden schrittweise Variablen belegt. Dabei kann eine Belegung eine Lösung im weiteren Verlauf der Suche unmöglich machen, so dass (viel) Backtracking notwendig wird.

Beim Forward Checking entfernt man nach der Belegung einer Variablen in allen Nachbarvariablen die durch die aktuelle Belegung inkonsistent gewordenen Werte. Wenn dabei ein Wertebereich leer wird, führt die aktuelle Belegung nicht zu einer Lösung und kann sofort zurückgenommen werden. Allerdings findet man mit Forward Checking nicht alle Inkonsistenzen.

Bei der Kantenkonsistenz prüft man, ob zu jedem Wert aus dem Wertebereich einer Variablen in den Nachbarvariablen mindestens ein passender (konsistenter) Wert existiert. Dabei werden die Constraints nacheinander betrachtet (nicht gleichzeitig). Wenn dies nicht der Fall ist, wird der Wert aus dem Wertebereich der betrachteten Variablen entfernt. Der AC-3-Algorithmus erzeugt schrittweise Kantenkonsistenz für ein CSP.

Man kann den AC-3 als Vorverarbeitung nutzen und die Wertemengen vor der BT-Suche reduzieren. Eventuell findet man dabei bereits eine Lösung oder kann eine Lösung ausschließen. Man kann den AC-3 auch als Inferenzschritt in die BT-Suche einbetten ("MAC").

Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Forward Checking (FC)
  • (K2) Erweiterung von FC auf alle Kanten: Kantenkonsistenz
  • (K2) Kantenkonsistenz bedeutet nicht globale Konsistenz
  • (K3) AC-3 Algorithmus

Problem bei BT-Suche

Zuweisung eines Wertes an Variable $X$:

  • Passt zu aktueller Belegung
  • Berücksichtigt aber nicht restliche Constraints => macht weitere Suche u.U. unmöglich/schwerer

Lösung: Nach Zuweisung alle nicht zugewiesenen Nachbarvariablen prüfen

INFERENCE: Vorab-Prüfung (Forward Checking)

Inference: Frühzeitiges Erkennen von Fehlschlägen! (vgl. [Russell2020, S. 178])

Nach Zuweisung eines Wertes an Variable $X$:

  • Betrachte alle nicht zugewiesenen Variablen $Y$:
    • Falls Constraints zw. $X$ und $Y$, dann ...
    • ... entferne alle inkonsistenten Werte aus dem Wertebereich von $Y$.

Beispiel:

  1. Sei A auf rot gesetzt => entferne rot in B und C
  2. Sei D auf grün gesetzt => entferne grün in B und C und E

Problem: Für B und C bleibt nur noch blau; sind aber benachbart!

Forward Checking findet nicht alle Inkonsistenzen!

  • Nach $\lbrace A=red, D=green \rbrace$ bleibt für B und C nur noch blue
  • B und C sind aber benachbart

Übergang von Forward Checking zu Kantenkonsistenz

  • Forward Checking erzeugt Konsistenz für alle Constraints der gerade betrachteten (belegten) Variablen.

  • Idee: Ausdehnen auf alle Kanten ... => Einschränken der Wertemengen

Definition Kantenkonsistenz (Arc Consistency)

Eine Kante von $X$ nach $Y$ ist "konsistent", wenn für jeden Wert $x \in D_X$ und für alle Constraints zwischen $X$ und $Y$ jeweils ein Wert $y \in D_Y$ existiert, so dass der betrachtete Constraint durch $(x,y)$ erfüllt ist.

Ein CSP ist kanten-konsistent, wenn für alle Kanten des CSP Konsistenz herrscht.

Beispiel Kantenkonsistenz

$V = \lbrace a,b,c,d,e \rbrace$ $\mathrm{C} = \lbrace ((a,b), \ne), ((b,c), \ne), ((a,c), \ne), ((c,d), =), ((b,e), <) \rbrace$

$D_a=D_b=D_c=\lbrace 1,2,3 \rbrace$, $D_d=\lbrace 1,2 \rbrace$, $D_e=\lbrace 1,2,3 \rbrace$

Einschränkung der Ausgangswertemengen (kanten-konsistent)

$D_a=\lbrace 1,2,3 \rbrace$, $D_b=\lbrace 1,2 \rbrace$, $D_c=\lbrace 1,2 \rbrace$, $D_d=\lbrace 1,2 \rbrace$, $D_e=\lbrace 2,3 \rbrace$

=> Kantenkonsistenz ist nur lokale Konsistenz!

Anmerkung: $((a,b), \ne)$ ist Kurzform für $\left((a,b), \lbrace (x,y) \in D_a \times D_b | x \ne y \rbrace\right)$

AC-3 Algorithmus: Herstellen von Kantenkonsistenz

def AC3(csp):
    queue = Queue(csp.arcs)
    while not queue.isEmpty():
        (x,y) = queue.dequeue()
        if ARC_Reduce(csp,x,y):
            if D_x.isEmpty(): return false
            for z in x.neighbors(): queue.enqueue(z,x)
    return true

def ARC_Reduce(csp, x, y):
    change = false
    for v in D_x:
        if not (any w in D_y and csp.C_xy(v,w)):
            D_x.remove(v);  change = true
    return change

Quelle: Eigener Code basierend auf einer Idee nach [Russell2020, p. 171, fig. 5.3]

Anmerkung: Die Queue in AC-3 ist wie eine (mathematische) Menge zu betrachten: Jedes Element kann nur genau einmal in einer Menge enthalten sein. D.h. wenn man bei queue.enqueue(z,x) die Rückkanten von den Nachbarn in die Queue aufnimmt, sorgt die Queue eigenständig dafür, dass es keine doppelten Vorkommen einer Kante in der Queue gibt. (Falls die verwendete Queue in einer Programmiersprache das nicht unterstützt, müsste man bei queue.enqueue(z,x) stets abfragen, ob die Kante (z,x) bereits in der Queue ist und diese dann nicht erneut hinzufügen.) AC-3 hat eine Laufzeit von $O(d^3n^2)$ ($n$ Knoten, maximal $d$ Elemente pro Domäne). Leider findet auch AC-3 nicht alle Inkonsistenzen ... (NP-hartes Problem).

Hinweis: In gewisser Weise kann man Forward Checking als ersten Schritt bei der Herstellung von Kantenkonsistenz interpretieren.

Einsatz des AC-3 Algorithmus

  1. Vorverarbeitung: Reduktion der Wertemengen vor BT-Suche

    • Nach AC-3 evtl. bereits Lösung gefunden (oder ausgeschlossen)
  2. Propagation: Einbetten von AC-3 als Inferenzschritt in BT-Suche (MAC -- Maintaining Arc Consistency)

    • Nach jeder Zuweisung an $X_i$ Aufruf von AC-3-Variante:
      • Initial nur Kanten von $X_i$ zu allen noch nicht zugewiesenen Nachbarvariablen
    • Anschließend rekursiver Aufruf von BT-Suche

Wrap-Up

  • Anwendung von Forward Checking und ...
  • ... die Erweiterung auf alle Kanten: AC-3, Kantenkonsistenz
Challenges

Fingerübungen

Ist die Kante zwischen a und b konsistent?

Wann ist der Graph lokal konsistent?

  • a {1,2}; b {2,3}; c {1,2,3}; d {1,2,3}
  • a {1,2}; b {2,3}; c {3}; d {1,2}
  • a {1,3}; b {2,3}; c {1,3}; d {1,2,3}
  • a {1,2}; b {2,3}; c {1,3}; d {1,2,3}

Wie sieht die Queue im nächsten Schritt mit AC3 aus?

Aktuelle Queue: [ab, ac, ba, bc, ca, cb]

  • [bc, ba, ca, cb, ab, ac]
  • [ab, ac, ba, bc, ca, cb]
  • [ac, ba, bc, ca, cb]
  • [ac, ba, bc, ca, cb, ba]
Übungsblätter/Aufgaben
Quellen
  • [Bartak2001] Theory and Practice of Constraint Propagation
    Barták, R., 2001.
  • [Kumar1992] Algorithms for Constraint Satisfaction Problems: A Survey
    Kumar, V., 1992.
  • [Russell2020] Artificial Intelligence: A Modern Approach
    Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
    CSP, AC-3: Abschnitt 5.2

Naive Bayes

Ich habe Symptome beobachtet. Kann ich die Ursache (also die Krankheit) bestimmen, wenn ich etwas Hintergrundwissen habe:

  • Wie häufig treten verschieden Krankheiten auf
  • Welche Krankheit zeigt welche Symptome (und wie oft treten die dann auf)

Kann ich aus diesen Daten einen Klassifikator lernen?

Subsections of Naive Bayes

Wiederholung Wahrscheinlichkeitstheorie

TL;DR

Diese Sitzung ist eine (relativ oberflächliche) Einführung/Wiederholung in die/der Grundlagen der Wahrscheinlichkeitstheorie.

Wir schauen uns die möglichen Ausgänge eines Zufallsexperiments an ("Ereignisse"). Wenn diese Ereignisse sich gegenseitig ausschließen und alle denkbaren Ergebnisse abdecken, dann nennt man diese Ereignisse auch Elementarereignisse. Die Wahrscheinlichkeit für ein Ereignis kann man angeben als Anzahl der möglichen Ergebnisse, die für dieses Ereignis günstig sind, geteilt durch die Anzahl aller Ausgänge. Über die Kolmogorov Axiome bekommt man die typischen Rechenregel für die Wahrscheinlichkeit.

Man kann eine Verbundwahrscheinlichkeit $P(A,B) = P(B,A)$ angeben, das ist die Wahrscheinlichkeit, dass $A$ und $B$ gleichzeitig auftreten.

Die bedingte Wahrscheinlichkeit für $A$ gegeben $B$ ist $P(A|B)$ und berechnet sich $P(A|B) = \frac{P(A,B)}{P(B)}$.

Daraus kann man die Bayes-Regel ableiten: $$P(A|B) = \frac{P(B|A)P(A)}{P(B)}$$ Dabei nennt man

  • $P(A)$ "Prior" oder "A-priori-Wahrscheinlichkeit" (die Wahrscheinlichkeit für $A$ ohne weiteres Wissen),
  • $P(B|A)$ "Likelihood" (Wie wahrscheinlich ist das Auftreten von $B$, gegeben $A$?),
  • $P(A|B)$ "Posterior" oder "A-posteriori-Wahrscheinlichkeit" (Wie wahrscheinlich ist $A$, wenn $B$ eingetreten ist?), und
  • $P(B)$ ist ein Normierungsfaktor (Wie wahrscheinlich ist $B$ an sich?).
Videos (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K2) Elementarereignisse und Wahrscheinlichkeit
  • (K2) Bedingte Wahrscheinlichkeit und Verbundwahrscheinlichkeit
  • (K2) (Bedingte) Unabhängigkeit
  • (K3) Rechenregeln
  • (K3) Marginalisierung
  • (K3) Bayes'sche Regel

Ereignisse und Wahrscheinlichkeit

Hinweis: Die folgende Darstellung zur Einführung in die Wahrscheinlichkeitstheorie dient dem Verständnis des Naive Bayes Klassifikationsalgorithmus und ist teilweise eher oberflächlich gehalten. Sie kann und soll keine entsprechende mathematische Einführung ersetzen!

Ereignisse

  • Ereignisse $\Omega = \lbrace \omega_1, \omega_2, \ldots, \omega_n \rbrace$: endliche Menge der Ausgänge eines Zufallsexperiments

  • Elementarereignis: Die $\omega_i \in \Omega$

    • decken alle möglichen Versuchsergebnisse ab, und
    • schließen sich gegenseitig aus

Regeln

  • Wenn $A$ und $B$ Ereignisse sind, dann auch $A \cup B$
  • $\Omega$ wird als sicheres Ereignis bezeichnet: Enthält definitionsgemäß alle Versuchsausgänge, d.h. ein in der Menge enthaltenes Ereignis muss auftreten
  • Die leere Menge $\emptyset$ wird als unmögliches Ereignis bezeichnet
  • Die Variablen $A$ und $B$ heißen auch Zufallsvariablen

Im Rahmen dieser Veranstaltung betrachten wir nur diskrete Zufallsvariablen mit endlichem Wertebereich!

Wahrscheinlichkeit

  • Wahrscheinlichkeit:

    Sei $\Omega = \lbrace \omega_1, \omega_2, \ldots, \omega_n \rbrace$ endlich. Die Wahrscheinlichkeit $P(A)$ für ein Ereignis $A$ ist dann definiert als

    $$ P(A) = \frac{|A|}{|\Omega|} = \frac{\text{Anzahl der für A günstigen Fälle}}{\text{Anzahl der möglichen Fälle}} $$

    Man könnte auch schreiben: $P(A) = \sum_{\omega \in A} P(\omega)$

    Hinweis: Diese Definition von Wahrscheinlichkeit geht von gleich wahrscheinlichen Elementarereignissen aus! Die allgemeine Definition geht über einen entsprechenden Grenzwert.

Verteilung

Den Vektor mit den Wahrscheinlichkeiten aller Elementarereignisse nennt man auch Verteilung.

Beispiel: $\mathbf{P}(A) = (P(A=1), P(A=2), \ldots, P(A=6)) = (1/6, 1/6, \ldots, 1/6)$

Hinweis: Wir betrachten hier nur diskrete Zufallsvariablen. Für kontinuierliche Variablen wird die Verteilung mit Hilfe einer Dichtefunktion dargestellt, beispielsweise der Gauss'schen Funktion.

Beispiel

  • Einmaliges Würfeln mit einem Spielwürfel: $\Omega = \lbrace 1,2,3,4,5,6 \rbrace$
  • Elementarereignisse: $\lbrace 1,2,3,4,5,6 \rbrace$
  • Das Würfeln einer geraden Zahl ($A = \lbrace 2,4,6 \rbrace$) ist kein Elementarereignis, ebenso wie das Würfeln einer Zahl kleiner 5 ($B = \lbrace 1,2,3,4 \rbrace$), da $A \cap B = \lbrace 2,4 \rbrace \ne \emptyset$
  • Wahrscheinlichkeit, eine 1 zu würfeln: $P(A \in \lbrace 1 \rbrace) = P(A=1) = \frac{1}{6}$. Anmerkung: Man schreibt statt $P(A \in \lbrace 1 \rbrace)$ oft einfach $P(1)$.
  • Wahrscheinlichkeit, eine gerade Zahl zu würfeln: $P(A \in \lbrace 2,4,6 \rbrace) = P(A=2 \vee A=4 \vee A=6) = \frac{|\lbrace 2,4,6 \rbrace|}{|\lbrace 1,2,3,4,5,6 \rbrace|} = \frac{3}{6} = 0.5$

Rechenregeln: Kolmogorov Axiome

Sei $A$ ein Ereignis, also $A \subseteq \Omega$:

  • $0 \le P(A) \le 1$
  • $\Omega = \lbrace \omega_1, \omega_2, \ldots, \omega_n \rbrace$: $\sum_{i} P(\omega_i) = 1$ (Normierungsbedingung: Summe über die Wahrscheinlichkeiten aller Elementarereignisse ist immer 1)

  • $P(A \cup B) = P(A) + P(B) - P(A \cap B)$

Daraus folgt (u.a.):

  • $P(\Omega) = 1$
  • $P(\emptyset) = 0$
  • $P(A) = 1- P(\neg A)$
  • $A$ und $B$ unabhängig: $P(A \cup B) = P(A) + P(B)$

  • $P(A \cap B)$ ist leer, wenn $A$ und $B$ sich nicht überlappen

  • $A \subseteq B$: $P(A) \le P(B)$

Verbundwahrscheinlichkeiten

$$P(A,B) = P(B,A) = \text{ Wahrscheinlichkeit, dass A und B gleichzeitig auftreten }$$
Halsschmerzen $\neg$ Halsschmerzen
Schnupfen 0.04 0.06
$\neg$ Schnupfen 0.01 0.89
  • $P(S,H) = 0.04$

Die Tabelle kann man so lesen: In 4 von 100 Fällen tritt das Ereignis "Schnupfen" gleichzeitig mit dem Ereignis "Halsschmerzen" auf, in 6 von 100 Fällen tritt "Schupfen" ohne Halsschmerzen auf. ... In Summe kommt man wieder auf 100 Fälle (100 Prozent).

Nach diesen Zahlen liegt also die Verbundwahrscheinlichkeit für die Ereignisse "Schnupfen" und "Husten", d.h. $P(S,H)$, bei 4 Prozent.

Hinweis: Die gezeigten Zahlen und Zusammenhänge sind fiktiv und dienen lediglich zur Verdeutlichung der Wahrscheinlichkeitsbegriffe!

Bedingte Wahrscheinlichkeit

Definition: Bedingte Wahrscheinlichkeit für $A$ gegeben $B$:

$$P(A|B) = \frac{P(A,B)}{P(B)}$$
Halsschmerzen $\neg$ Halsschmerzen
Schnupfen 0.04 0.06
$\neg$ Schnupfen 0.01 0.89
  • $P(\text{Schnupfen } | \text{ Halsschmerzen}) = \frac{P(S,H)}{P(H)} = \frac{0.04}{0.04+0.01} = 0.8$
  • $P(\text{Halsschmerzen } | \text{ Schnupfen}) = \frac{P(H,S)}{P(S)} = \frac{0.04}{0.04+0.06} = 0.4$

Wegen $P(A|B) = \dfrac{P(A,B)}{P(B)}$ ist $P(A,B) = P(A|B)P(B) = P(B|A)P(A)$ (Produkt-Regel)!

Marginalisierung

Halsschmerzen $\neg$ Halsschmerzen $\sum$
Schnupfen 0.04 0.06 0.1
$\neg$ Schnupfen 0.01 0.89 0.9
$\sum$ 0.05 0.95 1
$P(S) = P(S,H) + P(S, \neg H)$

Allgemein: Seien $B_1, \ldots, B_n$ Elementarereignisse mit $\bigcup_i B_i = \Omega$. Dann ist $$P(A) = \sum_i P(A,B_i) = \sum_i P(A|B_i)P(B_i)$$

Diesen Vorgang nennt man Marginalisierung. Die resultierende Verteilung $P(A)$ nennt man auch "Randverteilung", da sie mit einer Projektion eines Quaders auf eine Seitenfläche vergleichbar ist.

Kettenregel

  • Produktregel: Wegen $P(A|B) = \dfrac{P(A,B)}{P(B)}$ gilt $P(A,B) = P(A|B)P(B)$

  • Verallgemeinerung (Kettenregel): $$ \begin{array}{rcl} P(A_1,A_2,\ldots,A_n) &=& P(A_n,\ldots,A_2,A_1)\\ & = & P(A_n|A_{n-1},\ldots,A_1)P(A_{n-1},\ldots,A_1)\\ & = & P(A_n|A_{n-1},\ldots,A_1)P(A_{n-1}|A_{n-2},\ldots,A_1)P(A_{n-2},\ldots,A_1)\\ & = & \ldots\\ & = & P(A_n|A_{n-1},\ldots,A_1) \ldots P(A_2|A_1)P(A_1)\\ & = & \prod_i P(A_i|A_1,\ldots,A_{i-1}) \end{array} $$

Bayes-Regel

Bedingte Wahrscheinlichkeit: $P(A,B) = P(A|B)P(B) = P(B|A)P(A)$

$$ P(A|B) = \frac{P(B|A)P(A)}{P(B)} $$
  • $P(A)$ nennt man "Prior" oder "A-priori-Wahrscheinlichkeit" (Das ist die Wahrscheinlichkeit für $A$ ohne weiteres Wissen)
  • $P(B|A)$ nennt man "Likelihood" (Wie wahrscheinlich ist das Auftreten von $B$, gegeben $A$?)
  • $P(A|B)$ nennt man "Posterior" oder "A-posteriori-Wahrscheinlichkeit" (Wie wahrscheinlich ist $A$, wenn $B$ eingetreten ist?)
  • $P(B)$ ist ein Normierungsfaktor

Wenn man (siehe später: Naive Bayes Klassifikator) $A$ als Klasse und $B$ als Daten betrachtet:

  • $P(A)$: Wie wahrscheinlich ist eine bestimmte Klasse an sich (A-priori-Wahrscheinlichkeit der Klassen)?
  • $P(B|A)$: Wie wahrscheinlich sind bestimmte Daten, gegeben die Klasse $A$? (Likelihood der Daten)
  • $P(A|B)$: Gegeben die Daten $B$, wie wahrscheinlich ist die Klasse $A$? (Posterior)

In der Medizin hat sucht man i.d.R. die Ursache für beobachtete Symptome: $$ P(\text{Ursache}|\text{Symptome}) = \frac{P(\text{Symptome}|\text{Ursache})P(\text{Ursache})}{P(\text{Symptome})} $$

Aus der A-priori-Wahrscheinlichkeit für bestimmte Krankheiten und der Likelihood der Symptome (wie wahrscheinlich sind Symptome, gegeben eine Krankheit) kann man die Wahrscheinlichkeit für das Vorliegen einer Erkrankung gegeben bestimmte Symptome berechnen.

Beispiel Bayes

  • Bei Arthrose wird in 80 Prozent der Fälle ein steifes Gelenk beobachtet
  • Eine von 10.000 Personen hat Arthrose
  • Eine von 10 Personen hat ein steifes Gelenk

=> Ich habe ein steifes Gelenk. Habe ich Arthrose?

  • Gegeben: $P(A) = 0.0001, P(S) = 0.1, P(S|A) = 0.8$
  • Gesucht: $P(A|S)$
$$ P(A|S) = \frac{P(S|A)P(A)}{P(S)} = \frac{0.8 \times 0.0001}{0.1} = 0.0008 = 0.08\% $$

Wenn ein steifes Gelenk vorliegt, ist die Wahrscheinlichkeit, dann an Arthrose erkrankt zu sein, bei nur 0.08%. Kein Grund zur Sorge in diesem Fall :-)

=> Wie wahrscheinlich ist ein steifes Gelenk ohne Arthrose, also $P(S|\neg A$)?

Mit Marginalisierung: $P(S) = P(S|A)P(A) + P(S|\neg A)P(\neg A)$, d.h. $0.1 = 0.8 \times 0.0001 + P(S|\neg A) \times (1-0.0001)$, d.h. $P(S|\neg A) = 0.0999$

In knapp 10 Prozent der Fälle würde man im obigen Beispiel bei der Diagnose "keine Arthrose" ein steifes Gelenk beobachten.

Hinweis: Die genannten Zahlen und Zusammenhänge sind rein fiktional und sollen lediglich zur Veranschaulichung der Bayes-Regel dienen!

Schauen Sie sich auch das Beispiel 7.9 in [Ertel2017, Ex. 7.9, S. 135] an!

Unabhängige Ereignisse

  • $P(\text{Halsschmerzen},\text{ Regen}) = P(\text{Regen }|\text{ Halsschmerzen})P(\text{Halsschmerzen})$
  • $P(\text{Regen }|\text{ Halsschmerzen}) = \text{ ?? }$ $= P(\text{Regen})$

  • Zwei Ereignisse $A$ und $B$ sind unabhängig, wenn $$ P(A|B) = P(A) $$

    => $P(A,B) = P(A|B)P(B) = P(A)P(B)$

Dies kann man verallgemeinern (bedingte Unabhängigkeit):

$X$ und $Y$ sind bedingt unabhängig (gegeben $Z$), wenn $P(X|Y,Z) = P(X|Z)$ bzw. $P(Y|X,Z) = P(Y|Z)$

Daraus folgt:

$$ P(X,Y|Z) = P(X|Y,Z)P(Y|Z) = P(X|Z)P(Y|Z) $$

Wrap-Up

  • Grundlagen der Wahrscheinlichkeitstheorie
    • Elementarereignisse und Wahrscheinlichkeit
    • Rechenregeln
    • Bedingte Wahrscheinlichkeit und Verbundwahrscheinlichkeit
    • Marginalisierung
    • (Bedingte) Unabhängigkeit
    • Bayes'sche Regel
Übungsblätter/Aufgaben
Quellen

Klassifikation mit Naive Bayes

TL;DR

Mit Hilfe der (verallgemeinerten) Bayes-Regel kann man Klassifikation durchführen. Dazu werden beim "Training" die bedingten Wahrscheinlichkeiten aus den Trainingsdaten geschätzt. Die Anwendung (Klassifikation) erfolgt dann durch die Nutzung der beim "Training" berechneten bedingten Wahrscheinlichkeiten:

$$ h_{MAP} = \operatorname{argmax}_{h \in H} P(h|D_1, \ldots, D_n) = \operatorname{argmax}_{h \in H} P(h) \prod_i P(D_i|h) $$

Für jede Hypothese $h$, d.h. für jede Klasse, wird der Posterior $P(h|D_1, \ldots, D_n)$ ausgerechnet. Die Klasse, deren Wert dabei am höchsten ist, "gewinnt", d.h. die Klasse mit dem größten Posterior wird ausgegeben. (Deshalb wird das Verfahren oft auch "MAP" -- Maximum a Posteriori -- genannt.)

Bei der Berechnung wird angenommen, dass die betrachteten Merkmale (bedingt) unabhängig sind (dies geht in die obige Formel ein). Diese Annahme trifft aber oft nicht zu, deshalb auch der Name "Naive Bayes Klassifikation". Man berechnet in diesem Fall falsche Werte. Dennoch zeigt der Algorithmus in der Praxis sehr gute Ergebnisse.

Durch den Einsatz der bedingten Wahrscheinlichkeiten in der Produktformel ergeben sich einige Schwierigkeiten:

  1. Wenn beim "Training" Ausprägungen fehlen, ist die bedingte Wahrscheinlichkeit Null. Dadurch wird das gesamte Produkt Null. Zur Abhilfe kann man den Laplace-Schätzer nutzen, der (gesteuert über einen Parameter) gewissermaßen virtuelle Trainingsbeispiele beisteuert.
  2. Durch das Produkt vieler kleiner Werte kann es schnell zu Floating Point-Underflows kommen. Hier kann man einen Trick nutzen: Man berechnet den Logarithmus der Produktformel. Dadurch ändern sich zwar die absoluten Werte, die Reihenfolge der Hypothesen bleibt aber erhalten. Da wir nur nach der Hypothese suchen, die einen höheren Wert als die anderen hat, und nicht den absoluten Wert an sich benötigen, kann man so vorgehen. Durch den Logarithmus wird aus dem Produkt eine Summe, wo die kleinen Werte der bedingten Wahrscheinlichkeiten nicht so starke Auswirkungen haben wie im Produkt.

Oft nimmt man zusätzlich an, dass für alle Hypothesen (Klassen) $h$ der Prior $P(h)$ gleich ist. Dann kann man diesen Faktor ebenfalls aus der Berechnung entfernen. Dieses Verfahren nennt man auch "Maximum Likelihood".

Der NB-Klassifikator wird gern für die Textklassifikation eingesetzt. Hier muss man einem Text ein Label zuordnen. In einer Vorverarbeitung wird zunächst eine Menge der relevanten Wörter über alle Trainingstexte gebildet (Bag-of-Words). Der Bag-of-Words entspricht einem Merkmalsvektor, wobei die Merkmale die einzelnen Wörter sind. Dann kann jeder Text der Trainingsmenge über so einen Merkmalsvektor dargestellt werden: Entweder man gibt pro Merkmal an, ob es da (1) oder nicht da (0) ist oder man zählt die Häufigkeit des Auftretens. Dann kann man mit dem NB-Klassifikator die bedingten Wahrscheinlichkeiten schätzen und einen neuen Text klassifizieren.

Videos (HSBI-Medienportal)
Lernziele
  • (K2) Annahme von Unabhängigkeit => 'Naive' Bayes Klassifikation
  • (K2) Naivität der Annahme, dennoch sehr gute Erfolge in Praxis
  • (K2) Probleme mit niedrigen Wahrscheinlichkeiten
  • (K3) Schätzen der bedingten Wahrscheinlichkeiten aus den Trainingsdaten
  • (K3) Klassifikation mit Naive Bayes durch Nutzung der geschätzten Wahrscheinlichkeiten

Medizinische Diagnostik mit NB

  • Bei Arthrose wird in 80 Prozent der Fälle ein steifes Gelenk beobachtet: $P(S|A) = 0.8$
  • Eine von 10.000 Personen hat Arthrose: $P(A) = 0.0001$
  • Eine von 10 Personen hat ein steifes Gelenk: $P(S) = 0.1$

=> Ich habe ein steifes Gelenk. Habe ich Arthrose?

Textklassifikation mit NB

  • Mails, manuell markiert:

    • D1: ("Sieben Zwerge fraßen sieben Ziegen", OK)
    • D2: ("Sieben Ziegen traten sieben Wölfe", SPAM)
    • D3: ("Sieben Wölfe fraßen sieben Böcke", OK)
    • D4: ("Sieben Böcke traten sieben Zwerge", SPAM)
  • Neue Mails:

    • T1: ("Sieben Zwerge fraßen sieben Wölfe")
    • T2: ("Sieben Zwerge traten sieben Ziegen")

Lernen Sie mit Hilfe der Trainingsmenge einen Naive-Bayes-Klassifikator und wenden Sie diesen auf die beiden Test-Dokumente an.

Naive Bayes

  • Verallgemeinerte Bayes Regel $$ P(H|D_1, \ldots, D_n) = \frac{P(D_1, \ldots, D_n | H)P(H)}{P(D_1, \ldots, D_n)} $$

  • Annahme: $D_i$ sind bedingt unabhängig $$ P(D_1, \ldots, D_n | H) = P(D_1 | H) \cdot \ldots \cdot P(D_n | H) = \prod_i P(D_i | H) $$

  • Beobachtung: $P(D_1, \ldots, D_n)$ für alle Hypothesen $h \in H$ gleich

  • Naive Bayes Klassifikator bzw. MAP ("Maximum a Posteriori") $$ h_{MAP} = \operatorname{argmax}_{h \in H} P(h | D_1, \ldots, D_n) = \operatorname{argmax}_{h \in H} P(h) \prod_i P(D_i | h) $$

    Naive Bayes: Wähle die plausibelste Hypothese, die von den Daten unterstützt wird.

Bayes'sches Lernen

$$ h_{MAP} = \operatorname{argmax}_{h \in H} P(h | D_1, \ldots, D_n) = \operatorname{argmax}_{h \in H} P(h) \prod_i P(D_i | h) $$

Training: Bestimme die Wahrscheinlichkeiten aus Trainingsdaten $\mathbf{S}$

  • Für jede Klasse $h$:
    • Schätze $P(h) = \dfrac{|S(h)|}{|S|}$
    • Für jedes Attribut $D_i$ und jede Ausprägung $x \in D_i$: Schätze $P(D_i=x | h) = \dfrac{|S_{D_i}(x) \cap S(h)|}{|S(h)|}$

Klassifikation: Wähle wahrscheinlichste Klasse $h_{MAP}$ für Vektor $\mathbf{x}$

  • $h_{MAP} = \operatorname{argmax}_{h \in H} P(h) \prod_{x \in \mathbf{x}} P(x | h)$

Beispiel Klassifikation mit NB

Nase läuft Husten Gerötete Haut Fieber Klasse
1 1 1 0 krank
1 1 0 0 krank
0 0 1 1 krank
1 0 0 0 gesund
0 0 0 0 gesund
  • Eingabe: Person mit Husten und Fieber

Gesucht: $P(\text{krank})$, $P(\text{gesund})$, $P(\text{Nase=0}|\text{krank})$, $P(\text{Nase=0}|\text{gesund})$, ...

Wähle Klasse $$ \begin{array}{rl} h_{MAP} = \operatorname{argmax}_{h \in \lbrace \text{gesund, krank} \rbrace} & P(h) \cdot P(\text{Nase=0}|h) \cdot P(\text{Husten=1}|h) \\ & \cdot P(\text{Haut=0}|h) \cdot P(\text{Fieber=1}|h) \end{array} $$

Ergebnis: (nur die für den zu klassifizierenden Beispiel-Vektor nötigen Werte, die restlichen müssten aber auch beim "Training" berechnet werden!)

P(gesund) = 2/5 = 0.4
P(krank)  = 3/5 = 0.6

P(Nase=0 | gesund) = 1/2 = 0.5
P(Nase=0 | krank)  = 1/3 = 0.333

P(Husten=1 | gesund) = 0/2 = 0
P(Husten=1 | krank)  = 2/3 = 0.667

P(Haut=0 | gesund) = 2/2 = 1
P(Haut=0 | krank)  = 1/3 = 0.333

P(Fieber=1 | gesund) = 0/2 = 0
P(Fieber=1 | krank)  = 1/3 = 0.333

h = gesund: P(gesund) * P(Nase=0 | gesund) * P(Husten=1 | gesund) * P(Haut=0 | gesund) * P(Fieber=1 | gesund) = 0.4*0.5*0*1*0              = 0
h = krank:  P(krank)  * P(Nase=0 | krank)  * P(Husten=1 | krank)  * P(Haut=0 | krank)  * P(Fieber=1 | krank)  = 0.6*0.333*0.667*0.33*0.333 = 0.015

=> Klasse "krank" gewinnt ...

Textklassifikation mit NB

  • Texte als Trainingsmenge:

    • Text zerlegen in Terme (Wörter, sonstige relevante Token)
    • ggf. Entfernen von Stoppwörtern (beispielsweise Artikel u.ä.)
    • ggf. Stemming und Lemmatisierung für restliche Terme
    • ggf. weitere Vorverarbeitungsschritte (Groß-Klein-Schreibung, ...)
    • Terme zusammenfassen als Menge: "Bag of Words" (mit Häufigkeit)
  • Naive Bayes "trainieren":

    • A-priori-Wahrscheinlichkeit der Klassen: $P(c) = \dfrac{N_c}{N} = \dfrac{\text{Anzahl Dokumente in Klasse c}}{\text{Anzahl Dokumente}}$

    • Likelihood der Daten (Terme):

      • $P(t|c) = \dfrac{\operatorname{count}(t,c)}{\sum_{v \in V} \operatorname{count}(v,c)}$ mit $\operatorname{count}(t,c)$ Anzahl der Vorkommen von Term $t$ in allen Dokumenten der Klasse $c$ und $V$ die Vereinigung aller Terme aller Dokumente (als Menge)

      • Variante mit Laplace-Glättung (s.u.): $P(t|c) = \dfrac{\operatorname{count}(t,c) + 1}{\sum_{v \in V} \operatorname{count}(v,c) + |V|}$

Naivität im Naive Bayes

  • Unabhängigkeit der Attribute oft nicht gegeben

    => $P(D_1, \ldots, D_n | H) \ne \prod_i P(D_i | H)$

  • A-posteriori-Wahrscheinlichkeiten oft unrealistisch nah an 1 oder 0

  • Praxis: Dennoch häufig sehr gute Ergebnisse

    Wichtig: Solange die Maximierung über alle Hypothesen die selben Ergebnisse liefert, müssen die konkreten Schätzungen/Werte nicht exakt stimmen ...

Wenn Attribute nicht (bedingt) unabhängig sind, kann sich der NB verschätzen, d.h. es kommt dann u.U. zu einer höheren Fehlerrate, da bestimmte Eigenschaften in der Trainingsmenge zu hoch gewichtet werden.

Laplace-Schätzer

  • Problem: Attribut-Ausprägung für bestimmte Klasse nicht in Trainingsmenge:

    • => Bedingte Wahrscheinlichkeit ist 0
    • => Produkt gleich 0
  • Lösung: "Laplace-Schätzer" (auch "Laplace-Glättung")

    Statt $P(D_i=x | h) = \dfrac{|S_{D_i}(x) \cap S(h)|}{|S(h)|}$

    nutze $P(D_i=x|h) = \dfrac{|S_{D_i}(x) \cap S(h)| + m \cdot p_i}{|S(h)| + m}$

    • mit $m$: frei wählbarer Faktor, und

    • $p_i$: A-priori-Wahrscheinlichkeit für $P(D_i=x|h)$

      Hintergrundwissen oder einfach uniforme Verteilung der Attributwerte: $p_i = 1/|D_i|$ (Wahrscheinlichkeit für eine Attributausprägung ist 1/(Anzahl der Ausprägungen des Attributs))

    => "virtuelle" Trainingsbeispiele ($m$ ist die Zahl der virtuellen Trainingsbeispiele)

Probleme mit Floating Point Underflow

  • MAP berechnet Produkt mit vielen Termen

  • Problem: Bei kleinen Zahlen kann Floating Point Underflow auftreten!

  • Lösung: Logarithmus maximieren (Produkt geht in Summe über)

    Erinnerung: $\log(x \cdot y) = \log(x) + \log(y)$ und Logarithmus streng monoton

    $$ \begin{array}{rcl} h_{MAP} &=& \operatorname{argmax}_{h \in H} P(h|D_1, \ldots, D_n) \\[5pt] &=& \operatorname{argmax}_{h \in H} P(h) \prod_i P(D_i | h) \\[5pt] &=& \operatorname{argmax}_{h \in H} [\log(P(h)) + \sum_i \log(P(D_i | h))] \end{array} $$

Maximum Likelihood

  • Maximum a Posteriori $$ h_{MAP} = \operatorname{argmax}_{h \in H} P(h | D_1, \ldots, D_n) = \operatorname{argmax}_{h \in H} P(h) \prod_i P(D_i | h) $$

  • Annahme: Klassen uniform verteilt => $P(h_i) = P(h_j)$

    Maximum Likelihood $$ h_{ML} = \operatorname{argmax}_{h \in H} \prod_i P(D_i | h) $$

    => Maximiere die Likelihood der Daten

Ausblick: Kontinuierliche Attribute

Bisher sind wir von diskreten Attributen ausgegangen. Bei kontinuierlichen Attributen hat man zwei Möglichkeiten:

  • Diskretisierung der Attribute: Aufteilung in Intervalle und Bezeichnung der Intervalle mit einem Namen
  • Einsatz einer Verteilungsannahme und deren Dichtefunktion, beispielsweise Annahme von normalverteilten Daten mit der Dichtefunktion $$ f(x) = \frac{1}{\sqrt{2 \pi \sigma}} e^{- \frac{(x - \mu)^2}{2 \sigma^2}} $$ wobei $\mu$ der Mittelwert und $\sigma^2$ die Varianz der Daten sind.

Hinweis zum Sprachgebrauch

In Abhängigkeit von der Verteilung der $P(D_i | h)$ spricht man von

  • "multinominalem" NB: Attribute umfassen mehrere Kategorien (verschiedene Ausprägungen, wie im "Wahlkampf"-Beispiel: Attribut "Bildung" hat die Ausprägungen "Abitur", "Bachelor" und "Master")
  • Bernoulli NB: Attribute sind binär (Ausprägung 0 oder 1), typischerweise bei der Textklassifikation
  • Gauss'sches NB: Annahme einer Normalverteilung der Attribut-Ausprägungen

Wrap-Up

  • Klassifikation mit Naive Bayes
    • Annahme von Unabhängigkeit => "Naive" Bayes Klassifikation
    • Schätzen der bedingten Wahrscheinlichkeiten aus den Trainingsdaten
    • Klassifikation durch Nutzung der geschätzten Wahrscheinlichkeiten
    • Hinweis auf Naivität der Annahme, dennoch sehr gute Erfolge in Praxis
    • Hinweis auf Probleme mit niedrigen Wahrscheinlichkeiten
Challenges

Textklassifikation

Betrachten Sie die folgenden Aussagen:

  • Patient A hat weder Husten noch Fieber und ist gesund.
  • Patient B hat Husten, aber kein Fieber und ist gesund.
  • Patient C hat keinen Husten, aber Fieber. Er ist krank.
  • Patient D hat Husten und kein Fieber und ist krank.
  • Patient E hat Husten und Fieber. Er ist krank.

Aufgaben:

  1. Trainieren Sie auf diesem Datensatz einen Klassifikator mit NB.
  2. Ist Patient F krank? Er hat Husten, aber kein Fieber.
Übungsblätter/Aufgaben
Quellen