Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Python-Grundlagen – Teil 02
Python-Grundlagen – Teil 02
Ich bin Dr. Soper und heute habe ich das Vergnügen, den zweiten Teil unserer dreiteiligen Serie über die Grundlagen der Programmiersprache Python vorzustellen.
Bevor wir in die heutige Lektion eintauchen, möchte ich betonen, dass die Informationen, die ich weitergeben werde, auf den Kenntnissen und Fähigkeiten aufbauen, die wir in der vorherigen Lektion erworben haben. Wenn Sie also noch keine Gelegenheit hatten, sich das vorherige Video anzusehen, empfehle ich Ihnen dringend, dies zu tun, bevor Sie mit dieser Python-Lektion beginnen.
Nehmen wir uns nun einen Moment Zeit, um kurz zu besprechen, was Sie in dieser Lektion lernen können.
Am Ende dieses Videos erhalten Sie Kenntnisse über die folgenden Aspekte von Python:
Im Laufe der Lektion werden wir jedes dieser Themen im Detail beleuchten, komplett mit anschaulichen Beispielen und Demonstrationen, die ihre Funktionen in der Programmiersprache Python demonstrieren.
Beginnen wir mit der Diskussion von Listen in Python.
In Python ist eine Liste einfach eine benannte Sammlung von Elementen. Diese Elemente können von beliebigem Typ sein, einschließlich Zahlen, Text, Variablen, Objekten und sogar anderen Listen! Wenn eine Liste andere Listen als Elemente enthält, wird sie als mehrdimensionale Liste bezeichnet.
Betrachten wir zur Veranschaulichung einige Beispiele. Im ersten Beispiel erstellen wir eine Liste namens „int list“ und weisen ihren Elementen die Werte -3, 7, 4, 0, -2 und 342 zu. Sie können sich eine einfache, eindimensionale Liste als Vektor vorstellen. Python identifiziert eine Liste anhand ihrer eckigen Klammern. Um den Elementen der Liste Werte zuzuweisen, trennen wir sie durch Kommas in den eckigen Klammern. Denken Sie daran, dass Listen Elemente jedes Datentyps aufnehmen können.
Im zweiten Beispiel deklarieren wir eine Liste von Planeten und weisen die Namen aller bekannten Planeten in unserem Sonnensystem als deren Elemente zu. Es ist erwähnenswert, dass Pluto 2006 von der Internationalen Astronomischen Union auf den Status eines „Zwergplaneten“ herabgestuft wurde und daher nicht in dieser Liste enthalten ist. Im dritten Beispiel deklarieren wir eine zweidimensionale Liste. Mit anderen Worten: Die Elemente dieser Liste sind auch Listen. Sie können es sich als eine 2x3-Matrix mit zwei Zeilen und drei Spalten vorstellen.
Sehen wir uns nun einige Demonstrationen an, in denen Listen in Python deklariert und verwendet werden. In der ersten Codezelle deklarieren wir einfach die drei Listen, die wir zuvor besprochen haben. Wenn wir diese Zelle ausführen, wird keine Ausgabe angezeigt, da wir Python lediglich anweisen, diese drei Listen zu erstellen und sie im Speicher des Computers zu speichern. In der folgenden Codezelle werden wir untersuchen, wie auf bestimmte Werte innerhalb einer Liste zugegriffen wird. Bevor wir jedoch fortfahren, ist es wichtig, die Indizierung in Python zu verstehen.
Python verwendet ein nullbasiertes Indexierungssystem. Das bedeutet, dass beim Umgang mit Sammlungen wie Listen oder Arrays das erste Element einen Index von Null hat, das zweite Element einen Index von Eins und so weiter. Betrachten wir zur Veranschaulichung unsere „int-Liste“ als Beispiel. Diese Liste enthält sechs Werte. Wenn wir beispielsweise auf das fünfte Element in der Liste zugreifen möchten, hätte dieses Element einen Index von 4.
Nachdem wir dieses auf Null basierende Indexierungssystem verstanden haben, druckt die nächste Codezelle einfach den Namen des dritten Planeten in der „Planeten“-Liste aus, in diesem Fall „Erde“. Da es das dritte Element in der Liste ist, sollte es sich an Indexposition 2 befinden. Klicken wir auf die Schaltfläche „Ausführen“, um zu überprüfen, ob die Ausgabe wie erwartet ist und um zu bestätigen, dass die Erde tatsächlich das dritte Gestein von der Sonne ist.
Kommen wir nun zum nächsten Thema dieser Lektion: NumPy-Arrays in Python. Kommen wir nun zum nächsten Thema dieser Lektion: if-Anweisungen und logische Operatoren. Python bietet uns die Möglichkeit, bedingte Anweisungen mithilfe von if-Anweisungen zu verwenden. Mit einer if-Anweisung können wir verschiedene Codeblöcke ausführen, je nachdem, ob eine bestimmte Bedingung wahr oder falsch ist. Darüber hinaus bietet Python auch logische Operatoren, die es uns ermöglichen, mehrere Bedingungen miteinander zu kombinieren.
Im ersten Beispiel haben wir eine einfache if-else-Struktur, die prüft, ob eine Variable mit dem Namen „x“ kleiner als 10 ist. Wenn die Bedingung wahr ist, wird „x ist kleiner als 10“ auf dem Bildschirm ausgegeben. Andernfalls, wenn die Bedingung falsch ist, wird „x ist größer oder gleich 10“ ausgegeben. Die else-Anweisung wird verwendet, um den Code anzugeben, der ausgeführt werden soll, wenn die Bedingung in der if-Anweisung falsch ist.
Wir können diese Struktur mithilfe einer if-elif-else-Struktur erweitern, um mehrere Möglichkeiten zu verarbeiten. Im zweiten Beispiel führen wir eine zusätzliche Bedingung ein, indem wir prüfen, ob die Person jünger als 13 Jahre ist. Basierend auf dem Alter der Person bestimmt der Code, ob es sich bei der Person um ein Kind, einen Teenager oder einen Erwachsenen handelt. Die elif-Anweisung ermöglicht es uns, nach zusätzlichen Bedingungen zu suchen, bevor wir auf die else-Anweisung zurückgreifen, wenn keine der Bedingungen wahr ist.
Sehen wir uns einige Demonstrationen dieser if-Anweisungen und logischen Operatoren in Aktion in unserem Jupyter-Notizbuch an.
In der ersten Codezelle deklarieren wir eine Variable mit dem Namen „x“ und legen ihren Wert fest. Anschließend verwenden wir eine if-else-Struktur, um eine bestimmte Nachricht auszugeben, je nachdem, ob „x“ kleiner als 10 ist. Lassen Sie uns die Codezelle ausführen und die Ausgabe beobachten. Da der Wert von „x“ derzeit 10 beträgt, gibt Python „x ist größer oder gleich 10“ auf dem Bildschirm aus. Wenn wir den Wert von „x“ auf -7 ändern und die Codezelle erneut ausführen, erhalten wir ein anderes Ergebnis. Nachdem der Wert von „x“ auf -7 geändert wurde, gibt Python nun „x ist kleiner als 10“ aus.
In der nächsten Codezelle implementieren wir die if-elif-else-Struktur, um anhand ihres Alters zu bestimmen, ob eine Person ein Kind, ein Teenager oder ein Erwachsener ist. Lassen Sie uns die Zelle laufen lassen und sehen, was passiert. Wie erwartet gibt Python „Kind“ aus, da der Wert der Variablen „Alter“ derzeit auf 5 gesetzt ist. Wenn wir den Wert von „Alter“ ändern und die Codezelle erneut ausführen, erhalten wir je nach Alter der Person unterschiedliche Ergebnisse. Kommen wir zum nächsten Thema und besprechen wir die logischen Operatoren in Python. Python bietet drei logische Operatoren: „und“, „oder“ und „nicht“. Mit diesen Operatoren können wir mehrere Bedingungen gleichzeitig testen.
Im ersten Beispiel zeigen wir, wie man mit den Operatoren „and“ und „or“ ermittelt, ob zwei Variablen, „x“ und „y“, positiv sind. Die if-Anweisung prüft, ob sowohl „x“ als auch „y“ positiv sind. Wenn mindestens eine der Bedingungen falsch ist, fährt der Code mit der elif-Anweisung fort, die prüft, ob „x“ oder „y“ positiv ist. Wenn weder 'x' noch 'y' positiv sind, wird die else-Anweisung ausgeführt.
Im zweiten Beispiel führen wir den „nicht“-Operator ein, der dazu dient, das Ergebnis eines Vergleichs umzukehren bzw. zu invertieren. Wir prüfen, ob eine Person mindestens 13 Jahre alt ist. Wenn die Person mindestens 13 Jahre alt ist, muss sie mindestens 13 Jahre alt sein und darf daher kein Kind sein. Ansonsten gelten sie als Kind.
Sehen wir uns einige Demonstrationen dieser logischen Operatoren an, die in Python verwendet werden.
In der ersten Codezelle verwenden wir die logischen Operatoren „und“ und „oder“, um zu bestimmen, ob „x“ und „y“ positiv sind. Wir haben „x“ auf 5 und „y“ auf -2 gesetzt. Lassen Sie uns die Zelle ausführen und die Ausgabe beobachten. Da „y“ negativ ist, ist die Bedingung für den „und“-Operator falsch. Die Bedingung für den Operator „oder“ ist jedoch wahr, da „x“ positiv ist. Daher gibt der Code „x ist positiv“ auf dem Bildschirm aus. Jetzt ändern wir den Wert von „x“ in -3 und führen die Codezelle erneut aus. Dieses Mal sind beide Bedingungen für die Operatoren „and“ und „or“ falsch, sodass der Code mit der else-Anweisung fortfährt und „x und y sind nicht positiv“ ausgibt.
In der nächsten Codezelle verwenden wir den Operator „nicht“, um zu überprüfen, ob eine Person aufgrund ihres Alters kein Kind ist. Wir haben die Variable „Alter“ auf 10 gesetzt, was bedeutet, dass die Person als Kind gilt. Lassen Sie uns die Codezelle ausführen und die Ausgabe beobachten. Da die Person weniger als 13 Jahre alt ist, ist die Bedingung für den „Nicht“-Operator falsch und der Code gibt „Kind“ auf dem Bildschirm aus.
Ändern Sie nun den Wert von „Alter“ auf 18 und führen Sie die Codezelle erneut aus. Dieses Mal ist die Person mindestens 13 Jahre alt, sodass die Bedingung für den „nicht“-Operator wahr ist und der Code „Kein Kind“ ausgibt. Damit ist unsere Lektion über Listen, NumPy-Arrays, if-Anweisungen und logische Operatoren in Python abgeschlossen. Ich hoffe, dass Sie diese Informationen nützlich fanden und dass sie Ihnen bei Ihrer Python-Programmierreise helfen.
Im nächsten und letzten Teil dieser Serie werden wir uns mit fortgeschritteneren Themen befassen, darunter Schleifen, Funktionen und Dateihandhabung. Bleiben Sie also dran!
Vielen Dank für Ihre Aufmerksamkeit und bis zur nächsten Lektion!
Python-Grundlagen – Teil 03
Python-Grundlagen – Teil 03
Ich hoffe, Sie haben alle einen schönen Tag. Hier ist Dr. Soper, und ich freue mich, bei unserer dritten Lektion über die Grundlagen der Programmiersprache Python wieder bei Ihnen zu sein. In der heutigen Sitzung werden wir tiefer in Python eintauchen und einige Schlüsselkonzepte erkunden, die Ihr Verständnis und Ihre Fähigkeiten verbessern werden.
Bevor wir beginnen, möchte ich betonen, dass die in dieser Lektion präsentierten Informationen auf den Kenntnissen und Fähigkeiten aufbauen, die wir in den beiden vorherigen Lektionen erworben haben. Wenn Sie sich diese Videos noch nicht angesehen haben, empfehle ich Ihnen dringend, dies zu tun, bevor Sie in diese Python-Lektion eintauchen.
Nehmen wir uns nun einen Moment Zeit, um zu besprechen, was Sie in dieser Lektion lernen können. Am Ende dieser Sitzung werden Sie ein umfassendes Verständnis der folgenden Aspekte von Python haben:
In dieser Lektion werden wir diese Konzepte anhand anschaulicher Beispiele und Demonstrationen untersuchen, damit Sie ihre praktischen Anwendungen in der Programmiersprache Python verstehen.
Beginnen wir damit, in die Welt der „for“- und „while“-Schleifen in Python einzutauchen.
Im Allgemeinen ermöglichen Schleifen die wiederholte Ausführung einer Reihe von Anweisungen. Python bietet zwei Arten von Schleifen: „for“-Schleifen und „while“-Schleifen. Der Hauptunterschied zwischen den beiden besteht darin, dass „for“-Schleifen eine bestimmte Anzahl von Malen ausgeführt werden, während „while“-Schleifen so lange laufen, bis eine bestimmte Bedingung erfüllt ist.
Beginnen wir mit einem Beispiel einer „for“-Schleife, die die ersten 10 natürlichen Zahlen ausgibt, bei denen es sich um ganze Zahlen zwischen 1 und 10 handelt. Um eine „for“-Schleife zu erstellen, verwenden wir das Schlüsselwort „for“ gefolgt von einem Variablennamen. In diesem Fall verwenden wir die Variable „x“. Während die „for“-Schleife iteriert, wird der Variablen „x“ für jede Iteration ein anderer Wert zugewiesen. Anschließend geben wir die Menge der Elemente an, die der Variablen iterativ zugewiesen werden, gefolgt von einem Doppelpunkt. In diesem speziellen Beispiel erstellen wir die Menge der Elemente mithilfe der Python-Funktion „range“. Die Funktion „Bereich“ gibt einen Zahlenbereich zwischen einer Untergrenze und einer Obergrenze zurück. Insbesondere ist die Untergrenze inklusiv, während die Obergrenze exklusiv ist. Daher liegt der Zahlenbereich in diesem Beispiel zwischen 1 und 10.
Während der ersten Iteration der Schleife ist der Wert von „x“ 1. Anschließend wird „x“ während der zweiten Iteration der Wert 2 zugewiesen, und so weiter, bis er 10 erreicht. Alle eingerückten Codezeilen, die auf das „for“ folgen Die Anweisung wird bei jedem Durchlauf der Schleife ausgeführt. In diesem Beispiel geben wir einfach den Wert „x“ aus, sodass die Zahlen 1 bis 10 angezeigt werden.
Sehen wir uns nun eine weitere „for“-Schleife an, die die Namen von Planeten ausgibt. In diesem Fall verwenden wir den Variablennamen „Planet“, um die Schleife zu steuern, und durchlaufen eine Liste von Planeten. Während die Schleife fortschreitet, wird der Variablen „planet“ nacheinander der Name jedes Planeten zugewiesen, sodass wir den Namen jedes Planeten in der Liste ausdrucken können.
Lassen Sie uns nun verschachtelte Schleifen in Python besprechen. Bei verschachtelten Schleifen läuft eine Schleife (die sogenannte innere Schleife) innerhalb einer anderen Schleife (die sogenannte äußere Schleife). Die innere Schleife wird für jede Iteration der äußeren Schleife einmal ausgeführt. Stellen Sie sich beispielsweise ein Szenario vor, in dem die äußere Schleife eine Variable namens „row“ mit Ganzzahlen im Bereich von 0 bis 1 füllt, während die innere Schleife eine Variable namens „column“ mit Ganzzahlen im Bereich von 0 bis 2 füllt. Diese Zahlen entsprechen der Zeile und Spaltenindizes eines zweidimensionalen NumPy-Arrays. Während die verschachtelte Schleife fortschreitet, gibt sie zunächst die Werte aller Elemente in der ersten Zeile des Arrays aus und fährt dann mit der zweiten Zeile fort.
Lassen Sie uns abschließend die „while“-Schleife untersuchen. Bei dieser Art von Schleife verlassen wir uns auf eine Kontrollvariable, beispielsweise „x“, die zunächst auf einen bestimmten Wert gesetzt wird. Die Schleife wird so lange weiter ausgeführt, wie der Wert von „x“ eine bestimmte Bedingung erfüllt. Beispielsweise können wir „x“ auf 1 initialisieren und die Schleife läuft weiter, solange „x“ unter 10 bleibt. In jeder Iteration wird der Wert von „x“ aktualisiert, sodass wir bestimmte Aktionen innerhalb der Schleife ausführen können Schleife, bis die Bedingung nicht mehr erfüllt ist.
Damit ist unser Überblick über „for“- und „while“-Schleifen in Python abgeschlossen. Im nächsten Abschnitt werden wir uns mit Funktionen befassen, einem grundlegenden Konzept in der Programmierung, das es uns ermöglicht, Code effektiv zu organisieren und wiederzuverwenden.
Grundlagen des Reinforcement Learning
Grundlagen des Reinforcement Learning
Ich bin Dr. Soper und werde heute die Grundlagen des Reinforcement Learning diskutieren, einem entscheidenden Bereich im weiteren Bereich der künstlichen Intelligenz. Bevor wir uns mit den Grundlagen des verstärkenden Lernens befassen, nehmen wir uns einen Moment Zeit, um zu überprüfen, was Sie in dieser Lektion lernen werden.
Am Ende dieses Videos werden Sie Folgendes klar verstanden haben:
Sobald wir diese Konzepte verstanden haben, sind wir bestens gerüstet, um mit der Erstellung echter KI-Modelle zu beginnen. Lassen Sie uns also keine Zeit verlieren und loslegen!
Lassen Sie uns zunächst untersuchen, was mit „Reinforcement Learning“ gemeint ist. Neben überwachtem und unüberwachtem Lernen ist Reinforcement Learning eines der drei Hauptparadigmen des maschinellen Lernens.
Beim überwachten Lernen lernt eine Maschine eine allgemeine Funktion, um Ausgaben basierend auf Eingabe-Ausgabe-Paaren vorherzusagen. Beim unüberwachten Lernen entdeckt eine Maschine Muster in einem Datensatz, ohne vorher über die Daten Bescheid zu wissen. Andererseits zielt Reinforcement Learning darauf ab, einer Maschine beizubringen, ihre Umgebung so zu verstehen, dass sie Maßnahmen ergreifen kann, um die kumulativen Belohnungen zu maximieren. Um dies zu erreichen, geht es beim Reinforcement Learning darum, die optimale Balance zwischen der Erkundung der Umgebung und der Nutzung des bisher Gelernten zu finden. Schauen wir uns nun die fünf Prinzipien an, die der auf Verstärkungslernen basierenden KI zugrunde liegen.
Das erste Prinzip, das wir diskutieren werden, ist das Eingabe- und Ausgabesystem. Dieses System ist nicht nur auf das verstärkende Lernen beschränkt, sondern von grundlegender Bedeutung für alle künstlichen Intelligenz- und kognitiven Computersysteme. Dabei geht es um die Umwandlung von Inputs in Outputs.
Im Kontext des verstärkenden Lernens werden die Eingaben als „Zustände“ bezeichnet, die den Zustand der Umgebung darstellen. Die Ausgaben werden „Aktionen“ genannt und beantworten die Frage „Was soll ich als nächstes tun?“ Das Ziel des verstärkenden Lernens besteht darin, eine optimale Richtlinie zu identifizieren, die die Maßnahmen in jedem Staat leitet.
Lassen Sie uns nun über Belohnungen sprechen. Belohnungen spielen in allen KI- und Cognitive-Computing-Systemen eine entscheidende Rolle. Sie fungieren als Messgrößen, die das System über seine Leistung informieren. Belohnungsfunktionen können so gestaltet werden, dass sie je nach zu lösendem Problem Gewinne maximieren oder Verluste minimieren. Es wird davon ausgegangen, dass unmittelbare und kumulative Belohnungen die insgesamt angesammelten Belohnungen im Laufe der Zeit maximieren.
Das dritte Prinzip ist die Umgebung, die sich auf die Umgebung bezieht, in der das Reinforcement-Learning-System arbeitet. Die Umgebung liefert Informationen über Zustände und Belohnungen. Es definiert auch die Spielregeln und legt fest, welche Aktionen zu einem bestimmten Zeitpunkt möglich sind. Das System weiß zunächst nichts über die Konsequenzen seines Handelns und muss experimentieren, um zu lernen.
Als nächstes haben wir Markov-Entscheidungsprozesse (MDP). Benannt nach dem Mathematiker Andrey Andreyevich Markov, bieten MDPs einen mathematischen Rahmen für die Modellierung der Entscheidungsfindung, wenn die Ergebnisse teilweise zufällig sind und teilweise unter der Kontrolle eines Entscheidungsträgers stehen. Beim Reinforcement Learning fungiert das KI-System als Entscheidungsträger in der Umgebung. MDPs umfassen diskrete Zeiteinheiten, und das System wechselt basierend auf Beobachtungen, Aktionen, Belohnungen und nachfolgenden Zuständen von einem Zustand zum nächsten.
Schließlich haben wir den Trainingsmodus und den Inferenzmodus. Reinforcement-Learning-Systeme durchlaufen zwei Phasen: Training und Inferenz. Im Trainingsmodus lernt das System und versucht, durch mehrere Trainingszyklen eine optimale Richtlinie zu ermitteln. Basierend auf den gewonnenen Erkenntnissen aktualisiert es seine Richtlinien. Im Inferenzmodus ist das System vollständig trainiert und wird bereitgestellt, um seine Aufgabe mithilfe der erlernten Richtlinie ohne weitere Aktualisierungen auszuführen.
Nachdem wir nun ein solides Verständnis der Prinzipien des Reinforcement Learning haben, können wir mit der Entwicklung echter Reinforcement-Learning-Modelle beginnen. In den nächsten beiden Videos werden wir Reinforcement-Learning-Modelle untersuchen, die Thompson Sampling nutzen, um praktische Probleme zu lösen. Das erste Modell befasst sich mit dem Explorations-Ausbeutungs-Dilemma im Problem der mehrarmigen Banditen, und das zweite Modell optimiert die Ergebnisse einer komplexen Werbekampagne mithilfe von Simulationen.
Diese Videos vermitteln praktische Erfahrungen bei der Erstellung von KI-Modellen mit Python. Ich hoffe, Sie begleiten mich bei diesen spannenden Abenteuern im Bereich Cognitive Computing und künstliche Intelligenz!
Damit ist unsere Lektion über die Grundlagen des verstärkenden Lernens abgeschlossen. Ich hoffe, Sie fanden diese Informationen interessant und wünsche Ihnen allen einen schönen Tag.
Reinforcement Learning: Thompson Sampling & The Multi Armed Bandit Problem – Teil 01
Reinforcement Learning: Thompson Sampling & The Multi Armed Bandit Problem – Teil 01
Ich bin Dr. Soper, und es ist mir eine Freude, Ihnen den ersten Teil unserer umfassenden Lektion zum Reinforcement Learning vorzustellen, die sich speziell auf Thompson Sampling und das bekannte Problem der mehrarmigen Banditen konzentriert.
Bevor wir uns mit den Feinheiten des Reinforcement Learning im Kontext von Thompson Sampling und dem Multi-Armed Bandit Problem befassen, möchte ich betonen, wie wichtig es ist, sich die vorherigen Videos dieser Serie anzusehen. Diese vorangegangenen Lektionen dienen als Grundlage für die Konzepte, die wir heute untersuchen werden, und ich empfehle dringend, sich mit ihnen vertraut zu machen, falls Sie dies noch nicht getan haben.
Um einen kurzen Überblick darüber zu geben, was Sie in dieser Lektion lernen können, möchte ich die wichtigsten Punkte skizzieren:
Die vor uns liegende Reise verspricht aufschlussreich zu werden, da wir verschiedene Anwendungen und Auswirkungen von Problemen mit mehrarmigen Banditen aufdecken. Beginnen wir also ohne weitere Umschweife mit unserer Erkundung!
Um das Konzept des Reinforcement Learning im Kontext des Multi-Armed-Bandit-Problems zu verstehen, ist es wichtig, zunächst zu definieren, was dieses Problem mit sich bringt.
Das Problem der mehrarmigen Banditen bezieht sich auf jedes Szenario, in dem wir bestimmen müssen, wie wir eine feste Menge einer begrenzten Ressource auf eine Reihe konkurrierender Optionen verteilen können. Das Hauptziel besteht darin, unsere erwarteten Belohnungen zu maximieren und gleichzeitig der Unsicherheit zu begegnen.
Diese begrenzte Ressource kann verschiedene Formen annehmen, beispielsweise Zeit, Geld, Einsätze usw. Darüber hinaus sind die Belohnungen, die wir für jede verfügbare Option erhalten könnten, nicht vollständig bekannt. Wenn wir jedoch Ressourcen verschiedenen Optionen zuweisen, gewinnen wir nach und nach ein besseres Verständnis für die potenziellen Vorteile, die mit jeder Option verbunden sind.
Der Name „Multi-Armed Bandit Problem“ geht auf eine Glücksspielanalogie zurück. Stellen Sie sich eine Spielerin vor, die vor einer Reihe von Spielautomaten steht und versucht, den Automaten zu finden, der ihre Gewinnchancen maximiert. Spielautomaten sind Glücksspiele, die man häufig in Casinos findet, bei denen die Spieler Geld einzahlen und an der Reihe sind. Wenn der Spieler Glück hat, zahlt der Automat eine Geldprämie aus, von der der Spieler hofft, dass er seine ursprüngliche Investition übersteigt.
Traditionell wurden Spielautomaten aufgrund des mechanischen Hebels (Arms), mit dem das Spiel gestartet wurde, als „einarmige Banditen“ bezeichnet. Wenn ein Spieler also auf mehrere Spielautomaten stößt und sich entscheiden muss, welchen er spielen möchte, stellt er ein klassisches Problem mit mehreren bewaffneten Banditen dar. Dieses Problem verkörpert von Natur aus das Explorations-Ausbeutungs-Dilemma, das für das verstärkende Lernen von grundlegender Bedeutung ist.
Beim Explorations-Ausbeutungs-Dilemma geht es darum, zu bestimmen, wie oft der Spieler jeden Automaten spielen soll. Wenn ein Spieler einen Automaten entdeckt, der scheinbar häufige Belohnungen bietet, sollte er dann an diesem bestimmten Automaten weiterspielen (Ausbeutung) oder potenzielle Verluste riskieren, indem er andere Automaten ausprobiert, in der Hoffnung, eine noch lohnendere Option zu finden (Erkundung)?
Nun fragen Sie sich vielleicht, warum das Problem der vielarmigen Banditen so wichtig ist. Nun, die Wahrheit ist, dass Probleme mit mehrarmigen Banditen in der realen Welt allgegenwärtig sind und sowohl unser tägliches Leben als auch unser Geschäftsumfeld durchdringen.
Denken Sie über die Entscheidungen nach, denen Sie in Ihrem Privatleben begegnen. Entscheiden Sie beispielsweise, ob Sie Ihr Lieblingsrestaurant an einem Freitagabend noch einmal besuchen oder ein neues Lokal erkunden möchten, das Sie noch nie zuvor besucht haben. Stellen Sie sich vor, Sie hätten mehrere interessante TV-Serien zum Streamen zur Verfügung, hätten aber nur wenig freie Zeit, um sie anzusehen. Wie bestimmen Sie, in welche Show Sie Ihre Zeit investieren?
Thompson Sampling ist ein beliebter Algorithmus zur Lösung des Explorations-Ausbeutungs-Dilemmas beim Problem der mehrarmigen Banditen. Es bietet einen prinzipiellen Ansatz zum Ausgleich von Exploration und Ausbeutung durch Nutzung der Bayes'schen Schlussfolgerung.
Die Kernidee hinter Thompson Sampling besteht darin, eine Annahme oder Wahrscheinlichkeitsverteilung über die wahren zugrunde liegenden Belohnungswahrscheinlichkeiten jeder Option (Arm) im Banditenproblem aufrechtzuerhalten. Dieser Glaube wird basierend auf den beobachteten Belohnungen aus früheren Interaktionen mit den Armen aktualisiert.
Thompson Sampling verfolgt bei der Entscheidungsfindung einen probabilistischen Ansatz. Anstatt strikt den Arm mit der höchsten erwarteten Belohnung (Ausbeutung) auszuwählen oder Arme nach dem Zufallsprinzip zu erkunden, wird ein Arm aus der Glaubensverteilung auf eine Weise ausgewählt, die Erkundung und Ausbeutung in Einklang bringt.
Gehen wir die Schritte des Thompson-Sampling-Algorithmus durch:
Initialisierung: Beginnen Sie mit der Initialisierung der Glaubensverteilung für jeden Arm. Diese Verteilung stellt die Unsicherheit über die wahre Belohnungswahrscheinlichkeit jedes Arms dar. Typischerweise wird eine Beta-Verteilung als vorherige Verteilung verwendet, da sie mit der Binomialverteilung konjugiert ist, die üblicherweise zur Modellierung der Belohnungen bei Bandit-Problemen verwendet wird.
Stichprobenziehung: Stichproben Sie für jede Interaktionsrunde eine Belohnungswahrscheinlichkeit aus der Glaubensverteilung für jeden Arm. Dieser Schritt beinhaltet die Erkundung durch die Berücksichtigung von Waffen mit höherer Unsicherheit hinsichtlich ihrer Belohnungswahrscheinlichkeiten.
Auswahl: Wählen Sie den Zweig mit der höchsten Belohnungswahrscheinlichkeit aus. Dieser Schritt beinhaltet die Ausbeutung durch die Bevorzugung von Waffen, die aufgrund der Glaubensverteilung wahrscheinlich höhere erwartete Belohnungen haben.
Aktualisieren: Beobachten Sie die Belohnung des ausgewählten Arms und aktualisieren Sie die Glaubensverteilung für diesen Arm basierend auf der Bayes'schen Schlussfolgerung. Dieser Schritt aktualisiert die Posterior-Verteilung unter Verwendung der vorherigen Verteilung und der beobachteten Belohnung.
Durch wiederholtes Abtasten, Auswählen und Aktualisieren passt Thompson Sampling seine Glaubensverteilung basierend auf den beobachteten Belohnungen an und verbessert so die Auswahl der Waffen im Laufe der Zeit schrittweise.
Thompson Sampling hat sich in verschiedenen Anwendungen als wirksamer Algorithmus zur Lösung des Explorations-Ausbeutungs-Dilemmas erwiesen. Es wird häufig in Online-Werbung, klinischen Studien, Empfehlungssystemen und vielen anderen Bereichen eingesetzt, in denen es um sequenzielle Entscheidungsfindung unter Unsicherheit geht.
Einer der Hauptvorteile von Thompson Sampling ist seine Einfachheit und einfache Implementierung. Der Algorithmus erfordert keine komplexen Berechnungen oder die Abstimmung von Hyperparametern, was ihn in vielen realen Szenarien zu einer praktischen Wahl macht.
Zusammenfassend bietet Thompson Sampling eine elegante Lösung für das Problem der mehrarmigen Banditen, indem es Exploration und Ausbeutung durch Bayes'sche Schlussfolgerung in Einklang bringt. Seine Fähigkeit, sich an sich ändernde Belohnungswahrscheinlichkeiten anzupassen, und seine breite Anwendbarkeit machen es zu einem wertvollen Werkzeug für verstärktes Lernen und Entscheidungsfindung.
Im nächsten Teil unserer Lektion werden wir tiefer in die mathematischen Grundlagen von Thompson Sampling eintauchen und seine Leistungsgarantien untersuchen. Seien Sie gespannt auf eine spannende Reise in die Feinheiten dieses leistungsstarken Algorithmus!
Reinforcement Learning: Thompson Sampling & The Multi Armed Bandit Problem – Teil 02
Reinforcement Learning: Thompson Sampling & The Multi Armed Bandit Problem – Teil 02
Ich bin Dr. Soper und präsentiere hier den zweiten Teil unserer Lektion über Reinforcement Learning im Kontext von Thompson Sampling und dem berühmten Multi-Armed Bandit Problem.
Im vorherigen Video dieser Serie haben wir ein Verständnis für das Problem der mehrarmigen Banditen gewonnen und erfahren, wie Thompson Sampling zur Bewältigung dieses Problems eingesetzt werden kann.
Bevor wir fortfahren, empfehle ich Ihnen dringend, sich das vorherige Video anzusehen, falls Sie es noch nicht getan haben, da es grundlegende Kenntnisse vermittelt, die Ihr Verständnis dieser Lektion erheblich verbessern werden.
Heute liegt unser Fokus auf der Implementierung eines auf Verstärkungslernen basierenden KI-Systems, das Thompson Sampling nutzt, um ein echtes Problem mit mehrarmigen Banditen zu lösen. Dazu wechseln wir auf Python und legen los! Lassen Sie uns zunächst kurz das Szenario betrachten, mit dem wir arbeiten werden. Stellen Sie sich vor, Sie sind in einem Casino und haben 1.000 $, um an den Spielautomaten zu spielen. Es stehen sechs Spielautomaten zur Verfügung und jede Runde kostet 1 $. Die Umrechnungsrate, die die Gewinnwahrscheinlichkeit in einer bestimmten Runde angibt, variiert je nach Automat und ist Ihnen unbekannt.
Ihr Ziel ist es, Ihre Gewinnchancen zu maximieren, indem Sie so schnell wie möglich den Spielautomaten mit der höchsten Conversion-Rate identifizieren.
In unserer Python-Implementierung beginnen wir mit dem Import der erforderlichen Bibliotheken. Glücklicherweise müssen wir für dieses Projekt nur Numpy importieren. Als nächstes definieren wir die Umgebung. Die Definition der Umgebung ist ein entscheidender Schritt in jedem Reinforcement-Learning-Projekt. Hier beginnen wir mit der Angabe der Gesamtzahl der Runden, die wir an den Spielautomaten spielen werden. Da wir 1.000 $ haben und jede Runde 1 $ kostet, haben wir insgesamt 1.000 Runden.
Wir müssen auch die Gesamtzahl der Spielautomaten definieren, die in diesem Fall sechs beträgt. Darüber hinaus werden wir Arrays erstellen, um unsere Gewinne und Verluste für jeden Spielautomaten zu verfolgen. Diese Arrays dienen als Formparameter für die Beta-Verteilung, wie in der vorherigen Lektion besprochen. Darüber hinaus werden wir einen Startwert für den Zufallszahlengenerator festlegen, um die Reproduzierbarkeit unserer Ergebnisse sicherzustellen.
Als nächstes generieren wir für jeden Spielautomaten zufällige Umrechnungsraten zwischen 1 % und 15 %. Diese Umrechnungskurse geben an, wie oft ein Spieler gewinnen würde, wenn er an diesem bestimmten Automaten spielen würde. Bitte beachten Sie, dass der Spieler in einem realen Szenario keinen Zugriff auf diese Informationen hätte. Nachdem wir die Umrechnungskurse generiert haben, drucken wir sie auf dem Bildschirm aus, um die im Speicher des Computers gespeicherten Werte zu beobachten.
Im nächsten Schritt erstellen wir den Primärdatensatz. Dieser Datensatz ist eine Matrix mit einer Zeile für jede Runde und einer Spalte für jeden Spielautomaten. In diesem Fall besteht unser Datensatz aus 1.000 Zeilen und 6 Spalten, die die 1.000 Spielzüge und 6 möglichen Spielautomaten darstellen. Jeder Eintrag in der Matrix gibt das Ergebnis des Spielens eines bestimmten Spielautomaten in einer bestimmten Runde an, wobei „1“ einen Gewinn und „0“ einen Verlust angibt.
Um den Datensatz zu generieren, verwenden wir verschachtelte „for“-Schleifen. Nachdem wir den Datensatz generiert haben, drucken wir die ersten 15 Zeilen aus, um einen Eindruck von seiner Struktur zu bekommen.
Beim Ausführen der Codezelle wird eine mit Einsen und Nullen gefüllte Matrix angezeigt, die jeweils Gewinne und Verluste darstellen. Jede Reihe entspricht einer Runde und jede Spalte entspricht einem Spielautomaten. Beispielsweise würde das Spielen eines beliebigen Spielautomaten in der ersten Runde zu einem Verlust führen. Der Datensatz ermöglicht es uns, die Ergebnisse zu verstehen, wenn wir in einer bestimmten Runde an einem bestimmten Spielautomaten spielen würden.
Als Nächstes zeigen wir die Mittelwerte für jede Spalte im Datensatz an. Diese Mittel stellen die tatsächlichen Umrechnungsraten dar, die wir für jeden Spielautomaten in unserer Simulation erwarten können. Beim Ausführen der Codezelle werden diese Werte angezeigt, die nahe an den zuvor definierten theoretischen Umrechnungsraten liegen sollten, obwohl sie aufgrund des Zufallszahlengenerators und der begrenzten Anzahl von Umdrehungen in unserem Datensatz nicht genau sind.
Jetzt ist es an der Zeit, das 1.000-malige Spielen der Spielautomaten zu simulieren und dabei die Einschränkung einzuhalten, nur einen Automaten pro Runde zu spielen.
Mithilfe verschachtelter „for“-Schleifen, wobei die äußere Schleife jede Runde und die innere Schleife jeden Spielautomaten durchläuft, führen wir die Simulation durch. Zu Beginn jeder Runde setzen wir die Variable „max_beta“ auf -1. Diese Variable hilft uns dabei, den größten Beta-Wert zu verfolgen, der für die aktuelle Runde beobachtet wurde.
Für jeden Spielautomaten ziehen wir einen Zufallswert aus der Beta-Verteilung des Automaten, wobei die Form der Verteilung durch die Anzahl der Gewinne und Verluste bestimmt wird, die beim Spielen dieses bestimmten Automaten erzielt wurden. Wir werden den Beta-Wert des aktuellen Spielautomaten mit dem größten Beta-Wert vergleichen, der bisher in der aktuellen Runde beobachtet wurde. Wenn es größer ist, aktualisieren wir die Variable „index_of_machine_to_play“ mit dem Index des aktuellen Spielautomaten.
Nach der Untersuchung der Beta-Werte aller sechs Spielautomaten speichert die Variable „index_of_machine_to_play“ den Index des Automaten mit dem höchsten Beta-Wert für die aktuelle Runde. Anschließend spielen wir den ausgewählten Spielautomaten, indem wir das Ergebnis in unserem Datensatz nachschlagen und aufzeichnen, ob es ein Gewinn oder Verlust war, indem wir das entsprechende Element im Array „number_of_positive_rewards“ oder „number_of_negative_rewards“ erhöhen.
Dieser Prozess wird fortgesetzt, bis wir alle 1.000 Runden abgeschlossen haben. Unser KI-System lernt in jeder Runde kontinuierlich von der Umgebung und nutzt sein gesammeltes Wissen, um zwischen Erkundung und Ausbeutung zu entscheiden. Sobald alle 1.000 Runden beendet sind, berechnen wir, wie oft unser KI-Agent jeden Spielautomaten insgesamt gespielt hat, und drucken die Ergebnisse auf dem Bildschirm aus.
Beim Ausführen der Codezelle wird angezeigt, wie oft jeder Spielautomat gespielt wurde. Wie Sie sehen können, hat unser auf Verstärkungslernen basierendes KI-System erfolgreich Spielautomat 4 als Spielautomat mit der höchsten Gewinnwahrscheinlichkeit identifiziert. Es entschied sich, diesen Automaten in 695 der 1.000 Runden zu spielen, um die kumulativen Gewinne zu maximieren.
Schließlich ist es wichtig, diese Ergebnisse mit einer relevanten Basislinie zu vergleichen. In diesem Fall wäre der naive Ansatz, für jede Runde zufällig einen Spielautomaten auszuwählen, der gespielt werden soll. Die letzte Codezelle demonstriert diesen Zufallsstichprobenansatz, indem sie die Anzahl der Gewinne berechnet, wenn wir in jeder Runde zufällig einen Spielautomaten auswählen würden.
Durch das Ausführen der Codezelle wird der Vergleich zwischen dem Thompson-Stichprobenansatz und dem Zufallsstichprobenansatz sichtbar. Wie Sie sehen können, führte der Thompson-Sampling-Ansatz zu deutlich mehr Erfolgen als der naive, zufällige Sampling-Ansatz. Daher wäre es für unseren Spieler ratsam, Thompson Sampling zu nutzen!
In dieser Lektion haben wir das bisher in unserer Serie gewonnene Wissen angewendet, um ein reales Entscheidungsproblem zu lösen. Konkret haben wir erfolgreich ein vollständiges, auf Verstärkungslernen basierendes künstliches Intelligenzsystem in Python aufgebaut, das Thompson Sampling verwendet, um ein echtes Problem mit mehreren bewaffneten Banditen anzugehen.
Ich hoffe, dass Sie in dieser Phase unserer Serie beginnen, ein Verständnis für den Nutzen von KI-Tools zur Unterstützung der Entscheidungsfindung zu entwickeln. Möglicherweise stellen Sie sich auch clevere und innovative Anwendungen dieser Technologien zur Lösung anderer realer Probleme vor.
Im nächsten Video dieser Serie werden wir eine ausgefeiltere Version des auf Thompson Sampling basierenden Verstärkungslernens untersuchen, das auf eine komplexe Werbekampagne angewendet wird. Ich lade Sie ein, sich auch dieses Video anzusehen.
Damit ist Teil zwei unserer Lektion über Reinforcement Learning im Kontext von Thompson Sampling und dem berühmten Multi-Armed Bandit Problem abgeschlossen. Ich hoffe, Sie fanden diese Lektion interessant und wünschen Ihnen bis zum nächsten Mal einen schönen Tag!
Ein gewinnmaximierendes, auf Verstärkungslernen basierendes KI-System in Python
Ein gewinnmaximierendes, auf Verstärkungslernen basierendes KI-System in Python
Guten Tag allerseits! Hier spricht Dr. Soper. Heute werden wir uns mit einem umfassenden Beispiel in Python befassen, das zeigt, wie ein auf Verstärkungslernen basierendes KI-System die Unternehmensgewinne in einem komplexen Szenario mit mehreren Optionen und Millionen von Kunden effektiv maximieren kann.
Die in diesem Video vorgestellten Techniken wurden in früheren Lektionen dieser Serie vorgestellt und ausführlich besprochen. Wenn Sie noch keine Gelegenheit hatten, sich diese vorherigen Videos anzusehen, empfehle ich Ihnen dringend, dies zu tun, bevor Sie mit diesem fortfahren.
Bevor wir uns mit dem Codieren in Python befassen, besprechen wir das Geschäftsproblem, das wir in diesem Video mithilfe eines KI-Systems lösen möchten, das auf Thompson Sampling Reinforcement Learning basiert.
Stellen Sie sich vor, Sie arbeiten für ein Mobilfunkunternehmen mit 10 Millionen Kunden. Das Unternehmen hat beschlossen, seine Gewinne durch die Einführung eines Smartphone-Upgrade-Programms zu steigern. Um Kunden zum Upgrade ihrer Smartphones zu bewegen, hat das Marketingteam des Unternehmens acht unterschiedliche Werbekampagnen entwickelt. Jede Kampagne bietet Kunden spezifische Funktionen, Werbeaktionen oder Rabatte. Der durchschnittliche Gewinn aus jeder Kampagne variiert jedoch, da die damit verbundenen Funktionen, Werbeaktionen und Rabatte unterschiedliche Kosten für das Unternehmen verursachen. Obwohl das Unternehmen die Kosten und den Gewinn pro Verkauf für jede Werbekampagne berechnen kann, bleibt es ungewiss, wie effektiv jede Kampagne sein wird. Bestimmte Kampagnen können sich als äußerst effektiv erweisen, während andere möglicherweise keine nennenswerten Ergebnisse liefern.
Unser Ziel ist es, ein KI-System aufzubauen, das den Gewinn des Unternehmens für sein Smartphone-Upgrade-Programm maximieren kann. Es ist wichtig zu beachten, dass unser Ziel nicht einfach darin besteht, die Anzahl der am Programm teilnehmenden Kunden zu maximieren. Stattdessen streben wir eine Gewinnoptimierung an, die nicht nur von der Anzahl der Kunden abhängt, die jeder Werbekampagne ausgesetzt sind, sondern auch von der Effektivität jeder Kampagne bei der Generierung von Verkäufen und dem durchschnittlichen Gewinn pro Verkauf. Mit einem klaren Verständnis des Geschäftsproblems wechseln wir zu Python und beginnen mit der Implementierung.
Bevor ich den Code in diesem Notizbuch beschreibe, möchte ich Sie darüber informieren, dass in der Videobeschreibung ein Link zu diesem Notizbuch verfügbar ist. Laden Sie gerne eine Kopie des Notizbuchs herunter, um damit zu experimentieren oder es an Ihre spezifischen Anforderungen anzupassen. Wie üblich beginnen wir mit dem Import der notwendigen Python-Bibliotheken. Für dieses Projekt benötigen wir zwei Bibliotheken: NumPy, die wir verwenden, um Zufallswerte aus verschiedenen Wahrscheinlichkeitsverteilungen zu generieren, und locale, die wir verwenden, um Währungswerte entsprechend zu formatieren. Da es unser Ziel ist, Gewinne zu maximieren, werden wir in diesem Projekt ausführlich mit Geldwerten arbeiten. Durch die Festlegung unseres aktuellen Gebietsschemas auf die Vereinigten Staaten wird sichergestellt, dass Python Währungswerte in US-Dollar formatiert und Kommas zum Trennen großer Zahlen verwendet. Wenn Sie eine andere Währungsformatierung bevorzugen, können Sie das Gebietsschema gerne entsprechend ändern.
Die nächste Codezeile legt einen Startwert für den Zufallszahlengenerator fest. Dies garantiert, dass Sie die in diesem Video beobachteten genauen Ergebnisse reproduzieren können, wenn Sie sich für den Download und die Ausführung des Notebooks entscheiden.
Unsere nächste Aufgabe besteht darin, eine Klasse zum Speichern von Informationen über die verschiedenen Werbekampagnen zu definieren. Wir verwenden diese Klasse, um Objekte zu erstellen, die jede Werbekampagne darstellen und die Attribute oder Merkmale der jeweiligen Kampagnen beibehalten. Durch die Verwendung von Kampagnenobjekten auf diese Weise können wir alle kampagnenbezogenen Details vom Rest der Programmlogik trennen und so unser Verständnis dafür, wie die KI lernt und Entscheidungen trifft, erheblich verbessern.
Wie Sie sehen können, wird jedes Kampagnenobjekt durch die Bereitstellung einer eindeutigen Kampagnen-ID initialisiert. Anschließend weist die Funktion __init__ der Kampagne mithilfe von NumPy eine zufällige Conversion-Rate zwischen 1 % und 20 % zu, um einen Zufallswert aus einer gleichmäßigen Wahrscheinlichkeitsverteilung zu ziehen. Die Conversion-Rate gibt den Prozentsatz der Kunden an, die sich für ein Upgrade ihres Smartphones entscheiden, wenn sie einer bestimmten Werbekampagne ausgesetzt sind. Es ist erwähnenswert, dass dem Mobilfunkunternehmen diese Informationen nicht bekannt sind. Wir verwenden NumPy auch, um für jede Kampagne einen zufälligen Gewinn pro erfolgreichem Verkauf zwischen 100 und 200 US-Dollar zuzuweisen. Obwohl wir diese Gewinnwerte zufällig zuweisen, ist es ebenso möglich, für jede Werbekampagne spezifische Werte zu verwenden, die vom Mobilfunkunternehmen bereitgestellt werden. Schließlich enthält die Klasse eine Methode get_profit(), die den Gewinn pro erfolgreichem Verkauf für die Kampagne zurückgibt.
Hier ist der Code für die Campaign-Klasse:
Nachdem wir nun die Campaign-Klasse definiert haben, können wir mit der Implementierung des Reinforcement-Learning-Algorithmus basierend auf der Thompson-Stichprobe fortfahren. Wir erstellen eine Klasse namens ThompsonSampling, die den Algorithmus kapselt.
Die ThompsonSampling-Klasse verfügt über die folgenden Attribute und Methoden: num_campaigns: Die Anzahl der Werbekampagnen.
Die Methoden der ThompsonSampling-Klasse lauten wie folgt:
Hier ist der Code für die ThompsonSampling-Klasse:
Nachdem wir nun die ThompsonSampling-Klasse implementiert haben, können wir mit der Erstellung einer Instanz der Klasse fortfahren und den Algorithmus ausführen. Für dieses Beispiel legen wir die Anzahl der Kampagnen auf 8 und die Anzahl der Versuche auf 1000 fest. Nach der Durchführung der Testversionen zeigen wir die Gesamtumsätze und Gewinne für jede Kampagne an.
Sie können den Code entsprechend Ihren spezifischen Anforderungen ändern, beispielsweise der Anzahl der Kampagnen und Testversionen. Darüber hinaus können Sie die Campaign-Klasse um weitere Attribute und Methoden erweitern, um zusätzliche Informationen zu jeder Kampagne zu erfassen.Hier ist der Code zum Ausführen des Thompson-Sampling-Algorithmus:
Grundlagen des Q-Learning
Grundlagen des Q-Learning
Guten Tag allerseits! Ich bin Dr. Soper und freue mich, heute in die Grundlagen des Q-Learning einzutauchen, einer leistungsstarken Technik im Bereich der künstlichen Intelligenz. Bevor wir uns auf diese Lernreise begeben, empfehle ich Ihnen, sich das vorherige Video dieser Reihe mit dem Titel „Grundlagen des Reinforcement Learning“ anzusehen, wenn Sie mit dem Konzept noch nicht vertraut sind.
In dieser Lektion werden wir die grundlegenden Konzepte des Q-Learning untersuchen, einschließlich seiner Eigenschaften, Q-Werte, zeitlichen Unterschiede, der Bellman-Gleichung und des gesamten Q-Learning-Prozesses. Am Ende dieser Lektion verfügen Sie über ein solides Verständnis dieser Konzepte und sind bestens gerüstet, um KI-Modelle zu erstellen, die auf Q-Learning basieren. Also, ohne weitere Umschweife, fangen wir an!
Lassen Sie uns zunächst kurz besprechen, was Q-Learning beinhaltet. Wie bereits erwähnt, ist Q-Learning eine Form des verstärkenden Lernens, bei dem ein KI-Agent mit einer Umgebung interagiert, die aus Zuständen und Belohnungen besteht. Das Ziel des Agenten besteht darin, direkt durch Interaktion mit der Umgebung eine optimale Richtlinie zu konstruieren, ohne dass ein zugrunde liegendes mathematisches Modell oder eine Wahrscheinlichkeitsverteilung erlernt werden muss. Q-Learning umfasst Versuch und Irrtum, da der Agent kontinuierlich versucht, das Problem mithilfe unterschiedlicher Ansätze über mehrere Episoden hinweg zu lösen und dabei seine Richtlinien basierend auf den gewonnenen Erkenntnissen aktualisiert.
Lassen Sie uns nun tiefer in die Eigenschaften von Q-Learning-Modellen eintauchen. Da es sich bei Q-Learning um eine Form des Reinforcement Learning handelt, weist es die grundlegenden Merkmale aller Reinforcement-Learning-Modelle auf. Zu diesen Merkmalen gehören ein Eingabe- und Ausgabesystem, Belohnungen, eine Umgebung, Markov-Entscheidungsprozesse sowie Trainings- und Inferenzmodi. Zusätzlich zu diesen Merkmalen weisen Q-Learning-Modelle zwei spezifische Merkmale auf. Erstens ist die Anzahl der möglichen Zustände in Q-Learning-Modellen endlich, was bedeutet, dass sich der KI-Agent immer in einer von einer festen Anzahl möglicher Situationen befindet. Zweitens ist die Anzahl möglicher Aktionen in Q-Learning-Modellen ebenfalls begrenzt, sodass der KI-Agent in jedem Zustand aus einem festen Satz möglicher Aktionen auswählen muss.
Nachdem wir nun die Merkmale verstanden haben, wollen wir uns mit einigen klassischen Q-Learning-Problemen befassen. Ein solches Problem ist das Labyrinth, bei dem jeder Ort einen Zustand darstellt und die Aktionen des Agenten darin bestehen, sich nach oben, rechts, unten oder links zu bewegen. Ziel ist es, durch das Labyrinth zu navigieren und so schnell wie möglich den Ausgang zu erreichen. Ein weiteres klassisches Beispiel ist das Cliff-Walking-Problem, bei dem der Agent durch eine gitterartige Umgebung navigieren muss, um einen bestimmten Ort zu erreichen, ohne von der Klippe zu fallen. In beiden Szenarien lernt der KI-Agent etwas über die Umgebung, indem er sich auf Q-Werte verlässt und diese aktualisiert.
Was sind also Q-Werte? Q-Werte repräsentieren die Qualität einer bestimmten Aktion (a) in einem oder mehreren bestimmten Zuständen. Sie geben die erwartete Summe zukünftiger Belohnungen an, wenn diese Aktion vom aktuellen Stand aus durchgeführt wird. Mit anderen Worten: Q-Werte schätzen die zusätzliche Belohnung, die der Agent erzielen kann, wenn er eine bestimmte Aktion ausführt und von dort aus optimal vorgeht. Der KI-Agent zielt darauf ab, in Szenarien mit negativen Belohnungen seine Gesamtbelohnungen zu maximieren oder seine Gesamtstrafen zu minimieren. Durch die Aktualisierung und Verfeinerung der Q-Werte lernt der Agent sowohl durch positive als auch durch negative Verstärkung.
Q-Werte werden in einer Q-Tabelle gespeichert, die Zeilen enthält, die die möglichen Zustände darstellen, und Spalten, die die möglichen Aktionen darstellen. Die Q-Tabelle dient als Richtlinie des Agenten und steuert seine Aktionen in der Umgebung. Eine optimale Q-Tabelle enthält Werte, die es dem Agenten ermöglichen, in einem bestimmten Zustand die beste Aktion auszuwählen, die zur höchsten potenziellen Belohnung führt.
Zeitliche Unterschiede (TD) spielen beim Q-Learning eine entscheidende Rolle. TD bietet eine Methode zur Berechnung, um wie viel der Q-Wert für die vorherige Aktion angepasst werden sollte, basierend auf den Erkenntnissen des Agenten über die Q-Werte für die Aktionen des aktuellen Status. Diese Anpassung hilft dem Agenten, in nachfolgenden Episoden bessere Entscheidungen zu treffen. Der TD-Wert wird unter Berücksichtigung der unmittelbar für die vorherige Aktion erhaltenen Belohnung, eines Abzinsungsfaktors (Gamma), der zukünftige Belohnungen abzinst, und des maximalen Q-Werts des nächsten Zustands berechnet.
Der TD-Fehler, oft als δ bezeichnet, wird als Differenz zwischen dem TD-Wert und dem aktuellen Q-Wert für das vorherige Zustands-Aktionspaar berechnet. Es stellt die Diskrepanz zwischen der Vorhersage des Agenten und der tatsächlich in der Umgebung beobachteten Belohnung dar. Der TD-Fehler wird verwendet, um den Q-Wert des vorherigen Zustands-Aktions-Paares zu aktualisieren und so die Q-Werte im Laufe der Zeit schrittweise zu verfeinern.
Lassen Sie uns nun die Bellman-Gleichung vorstellen, die das Herzstück des Q-Learnings ist. Die Bellman-Gleichung drückt die Beziehung zwischen dem Q-Wert eines Zustands-Aktionspaars und den Q-Werten seiner benachbarten Zustands-Aktionspaare aus. Es ist wie folgt definiert:
Q(s, a) = R(s, a) + γ * max[Q(s', a')]
In dieser Gleichung stellt Q(s, a) den Q-Wert von Zustand s und Aktion a dar, R(s, a) bezeichnet die unmittelbare Belohnung, die man erhält, wenn man Aktion a im Zustand s durchführt, γ (Gamma) ist der Abzinsungsfaktor, der bestimmt die Bedeutung zukünftiger Belohnungen im Vergleich zu unmittelbaren Belohnungen, s' ist der nächste Zustand, der nach der Aktion a im Zustand s erreicht wird, und a' stellt die beste Aktion dar, die im Zustand s' durchgeführt werden kann.
Die Bellman-Gleichung besagt im Wesentlichen, dass der Q-Wert eines Zustands-Aktionspaars gleich der erhaltenen unmittelbaren Belohnung plus dem abgezinsten maximalen Q-Wert der nächsten Zustands-Aktionspaare sein sollte. Durch die iterative Anwendung der Bellman-Gleichung und die Aktualisierung der Q-Werte basierend auf beobachteten Belohnungen und zukünftigen Schätzungen nähert sich der Agent schrittweise einer optimalen Richtlinie an.
Kommen wir nun zum gesamten Q-Learning-Prozess. Q-Learning folgt einem iterativen Ansatz, der aus folgenden Schritten besteht:
Durch diesen iterativen Prozess werden die Q-Werte aktualisiert und nähern sich allmählich ihren optimalen Werten an, was zu einer verbesserten Richtlinie führt. Die Explorations-Exploitation-Strategie ermöglicht es dem Agenten, ein Gleichgewicht zwischen der Erforschung neuer Aktionen zur Entdeckung besserer Strategien und der Nutzung des erlernten Wissens zu finden, um Entscheidungen auf der Grundlage der aktuell besten Aktionen zu treffen.
Es ist erwähnenswert, dass es sich bei Q-Learning um einen Off-Policy-Lernalgorithmus handelt, was bedeutet, dass der Agent aus den Erfahrungen lernen kann, die durch eine andere Richtlinie generiert werden. Diese Eigenschaft ermöglicht ein effizienteres Lernen und eine größere Flexibilität bei der Erforschung verschiedener Strategien.
Zusammenfassend ist Q-Learning eine leistungsstarke Technik im Bereich des verstärkenden Lernens. Dabei geht es darum, optimale Richtlinien durch Versuch und Irrtum zu erlernen, ohne dass ein mathematisches Modell der Umgebung erforderlich ist. Durch die Verwendung von Q-Werten zur Schätzung der erwarteten Summe zukünftiger Belohnungen, deren Aktualisierung durch zeitliche Unterschiede und die Bellman-Gleichung sowie die Befolgung eines iterativen Lernprozesses verbessert der Agent schrittweise seine Strategie und erzielt eine bessere Leistung bei der gegebenen Aufgabe.
Ich hoffe, dass Ihnen diese Lektion ein solides Verständnis der Grundlagen des Q-Learning vermittelt hat. In der nächsten Lektion werden wir tiefer in die Implementierungsdetails eintauchen und praktische Beispiele von Q-Learning in der Praxis erkunden. Vielen Dank für Ihre Aufmerksamkeit und ich freue mich darauf, Sie im nächsten Video zu sehen!
Q-Learning: Ein vollständiges Beispiel in Python
Q-Learning: Ein vollständiges Beispiel in Python
Ich bin Dr. Soper und freue mich, Ihnen heute eine detaillierte Anleitung für ein Python-basiertes KI-System mit Q-Learning vorzustellen. Diese Lektion baut auf den im vorherigen Video besprochenen Konzepten auf. Wenn Sie also mit Q-Learning nicht vertraut sind, empfehle ich Ihnen dringend, sich das vorherige Video anzusehen, bevor Sie mit diesem fortfahren.
In dieser Lektion befassen wir uns mit einem Geschäftsproblem, mit dem ein wachsendes E-Commerce-Unternehmen konfrontiert ist. Das Unternehmen baut ein neues Lager und möchte die Kommissionierung mithilfe von Lagerrobotern automatisieren. Lagerroboter sind autonome Bodenfahrzeuge, die für die Bewältigung verschiedener Lageraufgaben, einschließlich der Kommissionierung, konzipiert sind.
Unter Kommissionierung versteht man den Vorgang, bei dem einzelne Artikel an verschiedenen Standorten im Lager gesammelt werden, um Kundenbestellungen zu erfüllen. Sobald die Artikel aus den Regalen geholt wurden, möchte das E-Commerce-Unternehmen, dass die Roboter sie zum Versand zu einem bestimmten Verpackungsbereich im Lager transportieren.
Um maximale Effizienz und Produktivität zu gewährleisten, müssen die Roboter die kürzesten Wege zwischen dem Verpackungsbereich und allen anderen Orten im Lager erlernen, an denen sie sich bewegen dürfen. In diesem Video ist es unser Ziel, Q-Learning zu nutzen, um diese Aufgabe zu lösen.
Lassen Sie uns zunächst die Umgebung für unser Lagerroboterszenario vorstellen. Das Lager kann als Diagramm dargestellt werden, wobei jedes schwarze Quadrat einen Lagerort für Artikel (Regal oder Lagerplatz) und jedes weiße Quadrat einen Gang darstellt, den die Roboter zur Navigation nutzen können. Das grüne Quadrat zeigt den Standort des Artikelverpackungsbereichs an.
Insgesamt gibt es 121 Standorte im Lager, und jeder Standort stellt einen Zustand oder eine Situation dar, in der sich ein Roboter zu einem bestimmten Zeitpunkt befinden könnte. Jeder Zustand kann durch einen Zeilen- und Spaltenindex identifiziert werden. Beispielsweise befindet sich der Artikelverpackungsbereich an Position (0, 5). Die schwarzen und grünen Quadrate sind Endzustände. Das heißt, wenn der KI-Agent während des Trainings einen Roboter in einen dieser Bereiche fährt, ist die Trainingsepisode beendet. Das grüne Quadrat stellt den Zielzustand dar, während die schwarzen Quadrate Fehlerzustände darstellen, da ein Absturz des Roboters in einen Lagerbereich für Gegenstände als Fehler betrachtet wird.
Lassen Sie uns als Nächstes die Aktionen besprechen, die dem KI-Agenten zur Verfügung stehen. Der KI-Agent kann eine von vier Richtungen wählen: Oben, Rechts, Unten oder Links. Das Ziel des Agenten besteht darin, Aktionen zu erlernen, die verhindern, dass der Roboter in Lagerbereiche für Gegenstände stürzt.
Lassen Sie uns nun die Belohnungsstruktur für unser Szenario untersuchen. Jedem Bundesstaat (Standort) im Lager wird ein Belohnungswert zugewiesen. Um dem KI-Agenten das Lernen zu erleichtern, werden für alle Zustände außer dem Zielzustand negative Belohnungen (Strafen) verwendet. Dem Verpackungsbereich (Zielzustand) wird ein Belohnungswert von 100 zugewiesen, während alle anderen Staaten einen Belohnungswert von -100 haben. Der Einsatz negativer Belohnungen ermutigt den KI-Agenten, den kürzesten Weg zum Ziel zu finden, indem er seine Strafen minimiert. Positive Belohnungen für weiße Quadrate werden nicht verwendet, da das Ziel des Agenten darin besteht, die kumulativen Belohnungen zu maximieren, und die Verwendung positiver Belohnungen für weiße Quadrate könnte dazu führen, dass der Agent ziellos Belohnungen anhäuft, ohne das Ziel zu erreichen.
Nachdem wir nun die Umgebung mit ihren Zuständen, Aktionen und Belohnungen definiert haben, wechseln wir zu Python und schauen uns die Code-Implementierung genauer an.
Wir beginnen mit dem Import der notwendigen Python-Bibliotheken. Für dieses Projekt benötigen wir lediglich die Numpy-Bibliothek, die zum Erstellen mehrdimensionaler Arrays, zum Generieren von Zufallswerten und zum Durchführen numerischer Aufgaben verwendet wird.
Der nächste Schritt besteht darin, die Umgebung zu definieren, beginnend mit den Zuständen. Das Lager wird als 11x11-Raster dargestellt, was 121 mögliche Zustände ergibt. Wir verwenden ein dreidimensionales Numpy-Array, um die Q-Werte für jede Kombination aus Zustand und Aktion zu speichern. Die ersten beiden Dimensionen stellen die Zeilen und Spalten der Zustände dar, während die dritte Dimension ein Element für jede mögliche Aktion enthält, die der KI-Agent ausführen kann.
Als nächstes definieren wir die vier Aktionen, die dem Agenten zur Verfügung stehen: Oben, Rechts, Unten, Links.
Fahren wir mit der Code-Implementierung fort.
Hier ist der Code, der den Q-Learning-Algorithmus für unser Lagerroboterszenario implementiert:
Um die erlernte Richtlinie zu testen, können wir die Q-Tabelle verwenden, um Aktionen basierend auf den höchsten Q-Werten für jeden Zustand auszuwählen:
Grundlagen künstlicher neuronaler Netze und Deep Q-Learning
Grundlagen künstlicher neuronaler Netze und Deep Q-Learning
Ich bin Dr. Soper und heute habe ich das Vergnügen, mit Ihnen allen die Grundlagen künstlicher neuronaler Netze und Deep Q-Learning zu diskutieren.
Bevor wir uns mit den Feinheiten dieser Themen befassen, empfehle ich Ihnen, sich das vorherige Video dieser Reihe mit dem Titel „Grundlagen des Q-Learning“ anzusehen, wenn Sie mit Q-Learning nicht vertraut sind.
Beginnen wir mit einer kurzen Zusammenfassung dessen, was Sie in dieser Lektion lernen werden.
Am Ende dieses Videos verfügen Sie über ein umfassendes Verständnis von:
Sobald wir diese Konzepte verstanden haben, sind wir bestens gerüstet, um KI-Modelle zu konstruieren, die auf künstlichen neuronalen Netzen und tiefem Q-Learning basieren.
Fangen wir ohne Umschweife an!
Um künstliche neuronale Netze und ihr Innenleben zu verstehen, müssen wir zunächst künstliche Neuronen und Aktivierungsfunktionen verstehen.
Was genau ist ein künstliches Neuron?
Künstliche Neuronen dienen als Grundbausteine, auf denen alle künstlichen neuronalen Netze aufgebaut sind. Sie wurden ursprünglich 1943 von Warren McCulloch und Walter Pitts als mathematisches Modell biologischer Neuronen vorgeschlagen, die die Grundlage tierischer Gehirne, einschließlich des menschlichen Gehirns, bilden.
Inspiriert durch diese biologischen Neuronen entstand das künstliche Neuronenmodell.
Wie im Diagramm dargestellt, besteht der Zweck eines künstlichen Neurons darin, einen oder mehrere Eingabewerte in einen Ausgabewert umzuwandeln. Jeder Eingabewert wird mit einer Gewichtung multipliziert, die die Stärke der Eingabe anpasst. Wenn der Eingabewert beispielsweise 0,8 und die Gewichtung 0,5 beträgt, würde die resultierende Multiplikation 0,4 ergeben. In diesem Szenario verringerte das Gewicht die Stärke der Eingabe. Wenn umgekehrt die Gewichtung größer als 1 wäre, würde die Stärke der Eingabe verstärkt.
Sobald die gewichteten Eingabewerte berechnet sind, durchlaufen sie eine Aktivierungsfunktion, die den Ausgabewert des künstlichen Neurons erzeugt. Es ist erwähnenswert, dass die Gewichte während des Trainings angepasst werden können, um Fehler zu minimieren – eine Idee, auf die wir in Kürze noch einmal zurückkommen werden.
Schauen wir uns nun die Aktivierungsfunktionen an.
Eine Aktivierungsfunktion ist eine mathematische Funktion, die von einem künstlichen Neuron verwendet wird, um seine gewichteten Eingabewerte in einen Ausgabewert umzuwandeln. Wie in der Gleichung dargestellt, nimmt eine Aktivierungsfunktion einen einzelnen Eingabewert, der durch Multiplikation jedes Eingabewerts mit seiner zugehörigen Gewichtung erhalten wird, und summiert dann alle diese Ergebnisse. Der summierte Wert wird dann durch die Aktivierungsfunktion geleitet, um den Ausgabewert des künstlichen Neurons zu erhalten.
Es ist wichtig zu beachten, dass in einem künstlichen Neuron verschiedene Aktivierungsfunktionen verwendet werden können, die sich bei der Umwandlung von Eingabewerten in Ausgabewerte jeweils unterschiedlich verhalten.
Lassen Sie uns vier gängige Aktivierungsfunktionen untersuchen:
Schwellenwertaktivierungsfunktion: Diese Funktion gibt entweder 0 oder 1 als Ausgabe zurück. Wenn der Eingabewert größer oder gleich Null ist, wird 1 zurückgegeben. Andernfalls wird 0 zurückgegeben. Folglich sind die Ausgabewerte für künstliche Neuronen, die eine Schwellenwertaktivierungsfunktion verwenden, immer entweder 0 oder 1.
Sigmoid-Aktivierungsfunktion: Die Ausgabe der Sigmoid-Aktivierungsfunktion liegt zwischen 0 und 1. Positive Eingabewerte führen zu Ausgabewerten, die sich 1,0 nähern, wenn die Eingabewerte steigen, während negative Eingabewerte zu Ausgabewerten führen, die näher an 0,0 liegen, wenn die Eingabewerte abnehmen. Daher erzeugt die Sigmoid-Aktivierungsfunktion immer eine Ausgabe zwischen 0 und 1.
Aktivierungsfunktion des hyperbolischen Tangens: Die Funktion des hyperbolischen Tangens ähnelt stark der Sigmoid-Aktivierungsfunktion, außer dass ihr Ausgabewert immer zwischen -1,0 und +1,0 liegt. Positive Eingabewerte erzeugen Ausgabewerte, die sich +1,0 nähern, wenn die Eingabewerte steigen, und negative Eingabewerte erzeugen Ausgabewerte, die sich -1,0 nähern, wenn die Eingabewerte sinken.
Dies sind nur einige Beispiele für Aktivierungsfunktionen, die in künstlichen neuronalen Netzen verwendet werden. Die Wahl der Aktivierungsfunktion hängt von der konkreten Problemstellung und dem gewünschten Verhalten des neuronalen Netzes ab. Nachdem wir uns nun mit künstlichen Neuronen und Aktivierungsfunktionen befasst haben, wollen wir nun mit dem Verständnis der Funktionsweise neuronaler Netze fortfahren.
Neuronale Netze bestehen aus mehreren Schichten miteinander verbundener künstlicher Neuronen, die eine komplexe Netzwerkstruktur bilden. Die drei Hauptschichten in einem neuronalen Netzwerk sind die Eingabeschicht, die verborgenen Schichten und die Ausgabeschicht. Die Eingabeschicht ist dafür verantwortlich, Eingabedaten wie Bilder, Text oder numerische Werte zu empfangen und zur Verarbeitung an die nachfolgenden Schichten weiterzuleiten. Die Anzahl der Neuronen in der Eingabeschicht entspricht der Anzahl der Eingabemerkmale oder -dimensionen in den Daten. Verborgene Schichten sind, wie der Name schon sagt, Zwischenschichten zwischen der Eingabe- und der Ausgabeschicht. Diese Schichten führen den Großteil der Berechnungen in einem neuronalen Netzwerk durch. Jedes Neuron in einer verborgenen Schicht empfängt Eingaben von der vorherigen Schicht und berechnet mithilfe der Aktivierungsfunktion eine Ausgabe.
Die Ausgabeschicht erzeugt die endgültige Ausgabe des neuronalen Netzwerks. Die Anzahl der Neuronen in der Ausgabeschicht hängt von der Art des Problems ab. Beispielsweise gibt es bei einem binären Klassifizierungsproblem typischerweise ein Neuron in der Ausgabeschicht, das die Wahrscheinlichkeit der Zugehörigkeit zu einer Klasse darstellt. Um das Lernen zu ermöglichen und die Leistung des neuronalen Netzwerks zu verbessern, werden die Gewichte der Verbindungen zwischen Neuronen während einer Trainingsphase angepasst. Diese Anpassung wird mithilfe eines Prozesses namens Backpropagation in Kombination mit einem Optimierungsalgorithmus wie dem stochastischen Gradientenabstieg erreicht. Während des Trainings wird dem neuronalen Netzwerk ein Satz Eingabedaten zusammen mit den entsprechenden Zielausgaben präsentiert. Das Netzwerk berechnet seine Ausgabe für jede Eingabe und die Differenz zwischen der berechneten Ausgabe und der Zielausgabe wird mithilfe einer Verlustfunktion gemessen.
Ziel des Trainings ist es, diesen Verlust durch Anpassung der Gewichte der Verbindungen zu minimieren. Der Backpropagation-Algorithmus berechnet den Gradienten der Verlustfunktion in Bezug auf die Gewichte und ermöglicht so die Aktualisierung der Gewichte in der Richtung, die den Verlust verringert. Dieser iterative Prozess wird fortgesetzt, bis das neuronale Netzwerk lernt, genaue Ausgaben für die gegebenen Eingaben zu erzeugen. Nachdem wir nun über ein solides Verständnis künstlicher neuronaler Netze verfügen, wollen wir uns mit den Grundlagen des Deep Q-Learning befassen.
Deep Q-Learning ist eine Technik des verstärkenden Lernens, die tiefe neuronale Netze als Funktionsnäherungen nutzt, um optimale Aktionen in einem Markov-Entscheidungsprozess (MDP) oder einer Umgebung des verstärkenden Lernens zu lernen. Im Kontext des Deep Q-Learning nimmt das neuronale Netzwerk, oft auch als Q-Netzwerk bezeichnet, den Zustand der Umgebung als Eingabe und erzeugt einen Q-Wert für jede mögliche Aktion. Der Q-Wert stellt die erwartete zukünftige Belohnung dar, wenn eine bestimmte Aktion aus dem gegebenen Zustand ausgeführt wird. Während des Trainings wird das Q-Netzwerk mithilfe des Q-Learning-Algorithmus aktualisiert, der Elemente des Reinforcement Learning und neuronaler Netzwerke kombiniert. Der Q-Learning-Algorithmus nutzt eine Kombination aus Erkundung und Nutzung, um die Schätzungen des Q-Netzwerks für die optimalen Q-Werte schrittweise zu verbessern.
Die grundlegenden Schritte des Deep-Q-Learning-Algorithmus sind wie folgt:
Durch die iterative Aktualisierung des Q-Netzwerks mithilfe des Q-Learning-Algorithmus lernt das Netzwerk nach und nach, die optimalen Q-Werte für jedes Zustands-Aktionspaar abzuschätzen. Nach dem Training kann das Q-Netzwerk verwendet werden, um die Aktion mit dem höchsten Q-Wert für einen bestimmten Zustand auszuwählen, sodass ein Agent in einer Umgebung des verstärkenden Lernens fundierte Entscheidungen treffen kann. Deep Q-Learning wurde erfolgreich in verschiedenen Bereichen angewendet, darunter unter anderem beim Spielen, in der Robotik und bei der Steuerung autonomer Fahrzeuge. Es hat eine bemerkenswerte Leistung beim Erlernen komplexer Aufgaben anhand hochdimensionaler sensorischer Eingaben gezeigt. Es ist jedoch wichtig zu beachten, dass tiefes Q-Learning bestimmte Einschränkungen aufweist, wie z. B. die Möglichkeit einer Überschätzung von Q-Werten und die Schwierigkeit, mit kontinuierlichen Handlungsräumen umzugehen. Forscher erforschen weiterhin fortschrittliche Techniken und Algorithmen, um diese Herausforderungen zu bewältigen und die Fähigkeiten des Deep Reinforcement Learning zu verbessern.
Deep Q-Learning ist eine leistungsstarke Technik, die Reinforcement Learning mit tiefen neuronalen Netzen kombiniert, um optimale Aktionen in einer bestimmten Umgebung zu erlernen. Durch die Nutzung der Fähigkeit tiefer neuronaler Netze zur Approximation komplexer Funktionen hat Deep Q-Learning erhebliche Fortschritte in verschiedenen Bereichen der künstlichen Intelligenz erzielt.
Faltungs-Neuronale Netze und tiefes Faltungs-Q-Learning
Faltungs-Neuronale Netze und tiefes Faltungs-Q-Learning
Guten Tag allerseits! Hier ist Dr. Soper, und heute werde ich über Convolutional Neural Networks (CNNs) und Deep Convolutional Q-Learning sprechen. Wenn Sie mit künstlichen neuronalen Netzen oder Q-Learning nicht vertraut sind, empfehle ich Ihnen, sich das frühere Video dieser Reihe mit dem Titel „Grundlagen künstlicher neuronaler Netze und tiefes Q-Learning“ anzusehen, bevor Sie mit diesem fortfahren.
Bevor wir uns mit dem Thema Convolutional Neural Networks und Deep Convolutional Q-Learning befassen, werfen wir einen kurzen Blick darauf, was Sie in dieser Lektion lernen können. Am Ende dieses Videos werden Sie ein solides Verständnis davon haben, was Faltungs-Neuronale Netze sind und wie sie funktionieren. Wir werden wichtige Konzepte wie Feature-Maps, Faltung, Max-Pooling, Flattening und die Verbindung zu vollständig verbundenen Schichten diskutieren, um Vorhersagen zu generieren. Darüber hinaus werden wir untersuchen, wie Deep Convolutional Q-Learning funktioniert.
Sobald wir diese grundlegenden Konzepte abgedeckt haben, werden wir in der Lage sein, Faltungs-Neuronale Netze aufzubauen, die in der Lage sind, bemerkenswerte Aufgaben zu erfüllen. Zu diesen Aufgaben gehören die Objekterkennung in Bildern und Videos und sogar das Spielen von Videospielen auf einem Niveau, das die menschlichen Fähigkeiten übersteigt.
Also lasst uns anfangen. Lassen Sie uns zunächst ein intuitives Verständnis dafür entwickeln, was Faltungs-Neuronale Netze sind und warum sie nützlich sind. Vereinfacht ausgedrückt ist ein Convolutional Neural Network (CNN) eine Art künstliches neuronales Netzwerk, das für Daten mit räumlicher Struktur entwickelt wurde. Zu den Daten mit räumlichen Strukturen gehören Bilder, Videos und sogar Text (obwohl CNNs hauptsächlich für Computer-Vision-Aufgaben verwendet werden). In diesem Video konzentrieren wir uns auf die bildbasierte Eingabe.
Daten mit einer räumlichen Struktur, wie zum Beispiel Bilder, enthalten Pixel, die auf eine bestimmte Weise angeordnet sind. Die Position jedes Pixels hat eine Bedeutung, und diese Anordnung ermöglicht es uns, Objekte in einem Bild zu identifizieren. Wenn wir beispielsweise die Pixel in einem Bild zufällig neu anordnen würden, würde es zu einer bedeutungslosen Ansammlung von Rauschen und nicht zu einem erkennbaren Objekt. Diese räumliche Anordnung verstehen wir unter „Daten, die eine räumliche Struktur haben“.
Faltungs-Neuronale Netze sind absichtlich darauf ausgelegt, diese räumlichen Beziehungen zwischen Eingabewerten zu erfassen, beispielsweise die Position eines Pixels in einem Bild oder die Position eines Wortes in einem Satz. Durch die Berücksichtigung dieser räumlichen Beziehungen können CNNs Daten mit räumlichen Strukturen effektiv verarbeiten und analysieren.
Lassen Sie uns nun diskutieren, wie CNNs auf hohem Niveau funktionieren. Im Großen und Ganzen generiert ein CNN für jeden Eingabefall eine Reihe von Feature-Maps. Mit anderen Worten: Es werden Daten für die Faltungsschicht erstellt. Als nächstes wird eine Technik namens Pooling angewendet, um jede Feature-Map zu vereinfachen. Anschließend werden die gepoolten Feature-Maps abgeflacht und die resultierenden Vektoren zu vollständig verbundenen Ebenen verbunden. Diese Verbindung ermöglicht die Ausbreitung von Informationen durch das Netzwerk, was zur Generierung von Vorhersagen führt.
Um tiefer in die Details einzutauchen, beginnen wir mit dem ersten Schritt: dem Anwenden von Filtern auf das Eingabebild. Filter, auch Merkmalsdetektoren oder Kernel genannt, dienen dazu, bestimmte Merkmale in einem Bild zu erkennen, beispielsweise Linien, Kurven oder Formen. Indem wir diese Filter auf ein Eingabebild anwenden, generieren wir Feature-Maps. Die Sammlung von Feature-Maps bildet die Faltungsschicht.
Um diesen Prozess zu veranschaulichen, betrachten wir ein einfaches Schwarzweißbild, das aus Pixeln besteht, die durch eine Matrix dargestellt werden. Anschließend können wir einen Filter auf das Bild anwenden, beispielsweise einen 3x3-Filter zur Erkennung vertikaler Linien. Indem wir den Filter über das Bild schieben, können wir eine Feature-Map erstellen, die den Grad der Überlappung zwischen dem Filter und verschiedenen Abschnitten des Bildes angibt.
Wir können mehrere Filter auf ein Bild anwenden, um verschiedene Merkmale zu erkennen. Jeder Filter generiert seine eigene Feature-Map, sodass wir Linien, Kurven, Formen und mehr erkennen können. Diese Feature-Maps bilden zusammen die Faltungsschicht.
Glückwunsch! Sie verstehen jetzt den Prozess der Faltung in Faltungs-Neuronalen Netzen. Lassen Sie uns als Nächstes das maximale Pooling besprechen.
Max Pooling ist eine Technik, die in CNNs verwendet wird, um die aus der Faltungsschicht erhaltenen Feature-Maps herunterzurechnen. Sein Zweck besteht darin, die räumlichen Dimensionen der Feature-Maps zu reduzieren und gleichzeitig die wichtigsten Informationen beizubehalten.
Die Idee hinter Max Pooling besteht darin, die Feature-Map in nicht überlappende Regionen zu unterteilen, die oft als Pooling-Fenster oder Pooling-Regionen bezeichnet werden. Für jede Region wird nur der Maximalwert innerhalb dieser Region beibehalten, während die anderen Werte verworfen werden. Dieser Maximalwert wird dann in die gepoolte Feature-Map einbezogen.
Durch die Auswahl des Maximalwerts trägt das Max-Pooling dazu bei, die hervorstechendsten Merkmale der Eingabedaten beizubehalten. Es bietet auch eine gewisse Übersetzungsinvarianz, was bedeutet, dass selbst wenn sich die Position eines Merkmals geringfügig verschiebt, der damit verbundene Maximalwert wahrscheinlich immer noch erfasst wird.
Um diesen Prozess zu veranschaulichen, betrachten wir einen 2x2-Max-Pooling-Vorgang, der auf eine Feature-Map angewendet wird. Wir unterteilen die Feature-Map in nicht überlappende 2x2-Regionen und nehmen den Maximalwert aus jeder Region, um die gepoolte Feature-Map zu bilden. Dadurch werden die räumlichen Abmessungen der Feature-Map um den Faktor 2 verkleinert.
Max-Pooling kann in einem CNN mehrfach durchgeführt werden, was zu einer weiteren Reduzierung der räumlichen Dimensionen führt. Dieses Downsampling trägt dazu bei, die Rechenkomplexität des Netzwerks zu reduzieren und es effizienter zu machen.
Sobald der Max-Pooling-Vorgang abgeschlossen ist, besteht der nächste Schritt darin, die gepoolten Feature-Maps zu reduzieren. Beim Flattening werden die mehrdimensionalen Feature-Maps in einen eindimensionalen Vektor umgewandelt. Diese Transformation ermöglicht die Verbindung der Daten mit vollständig verbundenen Schichten, den Standardschichten in herkömmlichen neuronalen Netzen.
Der abgeflachte Vektor dient als Eingabe für die vollständig verbundenen Schichten, wo das Netzwerk lernt, Darstellungen auf hoher Ebene zu extrahieren und auf der Grundlage dieser Darstellungen Vorhersagen zu treffen. Die vollständig verbundenen Schichten sind dafür verantwortlich, den globalen Kontext zu integrieren und komplexe Entscheidungen auf der Grundlage der von den Faltungsschichten extrahierten Merkmale zu treffen.
Um den Informationsfluss in einem CNN zusammenzufassen:
Dieser Prozess der Merkmalsextraktion, des Downsampling und der Entscheidungsfindung ermöglicht es CNNs, die räumlichen Beziehungen in Eingabedaten effektiv zu erfassen und genaue Vorhersagen zu treffen.
Nachdem wir nun ein gutes Verständnis von Faltungs-Neuronalen Netzen haben, wollen wir uns mit tiefgreifendem Faltungs-Q-Learning befassen.
Deep Convolutional Q-Learning kombiniert die Leistungsfähigkeit von CNNs mit verstärkenden Lerntechniken, insbesondere Q-Learning, um komplexe Aufgaben zu lösen. Q-Learning ist eine Art Reinforcement-Learning-Algorithmus, der es einem Agenten ermöglicht, optimale Aktionen in einer Umgebung zu lernen, indem er mit dieser interagiert und Belohnungen erhält.
Im Kontext des Deep Convolutional Q-Learning ist der Agent typischerweise ein künstlicher Agent, beispielsweise ein Computerprogramm, und die Umgebung ist eine visuell basierte Aufgabe, beispielsweise das Spielen eines Videospiels. Der Agent beobachtet den aktuellen Stand des Spiels (dargestellt als Bilder) und ergreift Aktionen basierend auf den Q-Werten, die jeder Aktion zugeordnet sind. Die Q-Werte stellen die erwarteten zukünftigen Belohnungen für die Durchführung einer bestimmten Aktion in einem bestimmten Zustand dar.
Um die Q-Werte anzunähern, wird ein Deep Convolutional Neural Network verwendet. Das CNN verwendet den aktuellen Zustand (Bild) als Eingabe und gibt einen Q-Wert für jede mögliche Aktion aus. Die Q-Werte werden dann verwendet, um gemäß einer Richtlinie die Aktion mit der höchsten erwarteten zukünftigen Belohnung auszuwählen.
Der Agent interagiert mit der Umgebung, indem er Maßnahmen ergreift, Belohnungen erhält und die Q-Werte basierend auf den beobachteten Belohnungen und den vorhergesagten Q-Werten aktualisiert. Dieser Prozess der Interaktion mit der Umgebung und der Aktualisierung der Q-Werte wird iterativ wiederholt, um die Entscheidungsfähigkeit des Agenten zu verbessern.
Die Kombination aus tiefen Faltungs-Neuronalen Netzen und Q-Learning ermöglicht es dem Agenten, komplexe visuelle Muster zu lernen und darauf basierend Entscheidungen zu treffen. Dieser Ansatz war in verschiedenen Bereichen erfolgreich, darunter beim Spielen von Videospielen, beim autonomen Fahren und in der Robotik.