Neuronale Netze
Lernziele
- Machen Sie sich mit dem Diagramm und den Komponenten eines neuronalen Netzwerks vertraut
- Das Konzept einer „Schicht“ in einem neuronalen Netzwerk verstehen
- Verstehen Sie, wie neuronale Netzwerke neue Funktionen lernen.
- Verstehen Sie, wie die Aktivierungen in jeder Schicht berechnet werden.
- Lernen Sie, wie ein neuronales Netzwerk ein Bild klassifizieren kann.
- Verwenden Sie ein Framework, TensorFlow, um ein neuronales Netzwerk zur Klassifizierung eines Bildes aufzubauen.
- Lernen Sie, wie Daten in eine und aus einer neuronalen Netzwerkschicht in TensorFlow gelangen
- Erstellen Sie ein neuronales Netzwerk in normalem Python-Code (von Grund auf), um Vorhersagen zu treffen.
- (Optional): Lernen Sie, wie neuronale Netzwerke die Parallelverarbeitung (Vektorisierung) nutzen, um Berechnungen zu beschleunigen.
Willkommen
Willkommen zu Kurs 2 dieser Spezialisierung auf maschinelles Lernen.In diesem Kurs lernen Sie neuronale Netze,auch Deep-Learning-Algorithmen genannt,sowie Entscheidungsbäume kennen.Dies sind einige derleistungsstärksten und am weitesten verbreitetenAlgorithmen für maschinelles Lernen, und Sie müssensie implementieren und für sich selbst arbeiten lassen.Eines der Dinge, die Sie auch in diesem Kurs sehen, sindpraktische Ratschlägezum Aufbau von Systemen für maschinelles Lernen.Dieser Teil des Materials ist für diesen Kurs einzigartig.Wenn Sie ein praktisches maschinelles Lernsystem aufbauen,müssen Sie viele Entscheidungen treffen,z. B. sollten Sie mehr Zeit mit demSammeln von Daten verbringen oder sollten Sieeine viel größere GPU kaufen, umein viel größeres neuronales Netzwerk aufzubauen?Selbst heute, wenn ichein führendes Technologieunternehmen besuche und mitdem Team spreche, das dort an einer Anwendungfür maschinelles Lernen arbeitet, schaue ich mir leider manchmal an, was sie inden letzten sechs Monaten gemachthaben, und denke, meine Güte, jemand hätte dir vielleicht sogar vorsechs Monaten sagen können, dass dieser Ansatz nicht so gut funktionieren würde.Mit einigen der Tipps, die Sie in diesem Kurs lernen,hoffe ich, dass Siezu denjenigen gehören, die diese sechs Monate nicht verschwenden, sondernsystematischere und bessere Entscheidungendarüber treffen können, wie praktischfunktionierende Anwendungen für maschinelles Lernen erstellt werden können.Lassen Sie uns damit beginnen.Im Detail sehen Sie diesin den vier Wochen dieses Kurses.In Woche 1 werden wir uns mit neuronalen Netzwerken und derDurchführung von Inferenzen oder Vorhersagen befassen.Wenn Sie ins Internet gehenund die Parametereines neuronalen Netzwerks herunterladen würden, das jemand anderes trainiert hatund dessen Parameter im Internet veröffentlicht wurden,dannwürde die Verwendung dieses neuronalen Netzwerks für Vorhersagen als Inferenz bezeichnet werden,und Sie habenin dieser Woche gelernt, wie neuronale Netzwerke funktionieren und wie man Inferenz macht.Nächste Woche lernst du, wie dudein eigenes neuronales Netzwerk trainierst.Insbesondere, wenn Sieeinen Trainingssatz mit beschrifteten Beispielen,X und Y, haben, wie trainieren Siedie Parameter eines neuronalen Netzwerks für sich selbst?In der dritten Wochewerden wir dann auf praktische Ratschläge für denAufbau von Systemen für maschinelles Lernen eingehen und ich werde Ihneneinige Tipps geben, die meiner Meinung nachselbst hochbezahlte Ingenieure, dieheute sehr erfolgreich maschinelle Lernsysteme bauen,nicht immer konsequent anwenden können. Ichdenke, das wird Ihnen helfen,Systeme effizient und schnell selbst zu bauen.In der letzten Woche dieses Kurseslernen Sie dann etwas über Entscheidungsbäume.Obwohl Entscheidungsbäume in den Medien nicht so viel Aufsehen erregen,herrscht vor Ort weniger Hype umEntscheidungsbäume als um neuronale Netzwerke.Sie sind auch einerder weit verbreiteten und sehr leistungsfähigen Lernalgorithmen, von denen ich denke, dass die Wahrscheinlichkeithoch ist, dass Sie sie selbst verwenden, wenn Sie am Ende eine Anwendung erstellen.Lassen Sie uns damit inneuronale Netzwerke einsteigen undzunächst einen kurzen Blick darauf werfen, wie das menschliche Gehirn, alsodas biologische Gehirn, funktioniert.Gehen wir zum nächsten Video über.
Neuronen und das Gehirn
Als neuronale Netzwerke vor vielen Jahrzehnten zum ersten Mal erfunden wurden, bestand die ursprüngliche Motivation darin, Software zu schreiben, die nachahmen konnte, wie das menschliche Gehirn oder das biologische Gehirn lernt und denkt. Auch wenn neuronale Netzwerke, manchmal auch künstliche neuronale Netze genannt, heute ganz anders geworden sind als die Vorstellung, wie das Gehirn tatsächlich funktioniert und lernt. Einige der biologischen Motivationen hängen immer noch in der Art und Weise ab, wie wir heute über künstliche neuronale Netze oder neuronale Computernetzwerke denken. Schauen wir uns zunächst an, wie das Gehirn funktioniert und wie das mit neuronalen Netzwerken zusammenhängt. Das menschliche Gehirn, oder vielleicht allgemeiner das biologische Gehirn, weist ein höheres oder leistungsfähigeres Maß an Intelligenz auf, und alles andere wäre bisher geplant. Neuronale Netze haben also mit der Motivation begonnen, Software zu entwickeln, die das Gehirn nachahmt. Die Arbeit an neuronalen Netzwerken hatte bereits in den 1950er Jahren begonnen und geriet dann für eine Weile in Ungnade. Dann, in den 1980er und frühen 1990er Jahren, gewannen sie wieder an Popularität und erfreuten sich in einigen Anwendungen wie der handschriftlichen Ziffernerkennung, die sogar damals zum Lesen von Postleitzahlen für das Schreiben von Post und zum Lesen von Dollarzahlen auf handschriftlichen Schecks verwendet wurden, enorme Bedeutung. Aber dann geriet es Ende der 1990er Jahre wieder in Ungnade. Ab etwa 2005 erlebte es ein Wiederaufleben und wurde auch mit Deep Learning ein wenig umbenannt. Eines der Dinge, die mich damals überraschten, war Deep Learning und neuronale Netzwerke bedeuteten sehr ähnliche Dinge. Aber vielleicht wurde zu der Zeit unterschätzt, dass der Begriff Deep Learning einfach viel besser klingt, weil er tiefgründig ist und dieses Lernen. Es stellte sich also heraus, dass dies die Marke war, die in den letzten zehn oder anderthalb Jahrzehnten an Bedeutung gewonnen hat. Seitdem haben neuronale Netze ein Anwendungsgebiet nach dem anderen revolutioniert. Ich denke, der erste Anwendungsbereich , auf den moderne neuronale Netze oder Deep Learning einen großen Einfluss hatten, war wahrscheinlich die Spracherkennung, wo wir aufgrund des modernen Deep Learning viel bessere Spracherkennungssysteme sahen und Autoren wie [inaudible] und Geoff Hinton maßgeblich dazu beigetragen haben, und dann begann es, in die Computer Vision vorzudringen. Manchmal sprechen die Leute immer noch von den ImageNet-Momenten im Jahr 2012, und das war vielleicht ein größerer Spritzer, wo dann [unhörbar] ihre Fantasie entfesselt haben und einen großen Einfluss auf Computer Vision hatten. Dann, in den nächsten Jahren, brachte es uns dazu , in Texte oder in die Verarbeitung natürlicher Sprache usw. einzusteigen. Neuronale Netzwerke werden heute in allen Bereichen eingesetzt, vom Klimawandel über medizinische Bildgebung bis hin zu Online-Werbung und Produktempfehlungen, und wirklich viele Anwendungsbereiche des maschinellen Lernens verwenden jetzt neuronale Netzwerke. Obwohl die heutigen neuronalen Netzwerke fast nichts damit zu tun haben, wie das Gehirn lernt, gab es schon früh die Motivation, Software zu entwickeln, die das Gehirn nachahmt. Also, wie funktioniert das Gehirn? Hier ist ein Diagramm, das zeigt , wie Neuronen in einem Gehirn aussehen. Das gesamte menschliche Denken stammt von Neuronen wie diesen in deinem und meinem Gehirn, die elektrische Impulse senden und manchmal neue Verbindungen zwischen anderen Neuronen bilden. Bei einem Neuron wie diesem hat es eine Reihe von Eingängen, an denen es elektrische Impulse von anderen Neuronen empfängt, und dann führt dieses Neuron, das ich eingekreist habe, einige Berechnungen durch und sendet diese Ausgaben dann durch diese elektrischen Impulse an andere Neuronen, und die Ausgabe dieses oberen Neurons wird wiederum zur Eingabe für dieses Neuron unten, das wiederum Eingaben von mehreren anderen Neuronen aggregiert, um dann vielleicht seine eigene Ausgabe an noch andere Neuronen zu senden, und das ist der Stoff, aus dem menschliches Denken besteht. Hier ist ein vereinfachtes Diagramm eines biologischen Neurons. Ein Neuron besteht aus einem Zellkörper, der hier links abgebildet ist, und wenn Sie einen Kurs in Biologie besucht haben, erkennen Sie vielleicht, dass dies der Kern des Neurons ist. Wie wir auf der vorherigen Folie gesehen haben, hat das Neuron unterschiedliche Eingaben. In einem biologischen Neuron werden die Eingangsdriten Dendriten genannt, und es sendet dann gelegentlich elektrische Impulse über das Ausgangskabel, das Axon genannt wird, an andere Neuronen. Mach dir keine Sorgen über diese biologischen Begriffe. Wenn Sie sie in einem Biologieunterricht gesehen haben, erinnern Sie sich vielleicht an sie, aber Sie müssen sich keinen dieser Begriffe wirklich merken, um künstliche neuronale Netzwerke aufzubauen. Aber dieses biologische Neuron kann dann elektrische Impulse senden, die als Eingabe für ein anderes Neuron dienen. Das künstliche neuronale Netzwerk verwendet also ein sehr vereinfachtes mathematisches Modell dessen, was ein biologisches Neuron tut. Ich werde hier einen kleinen Kreis zeichnen, um ein einzelnes Neuron zu bezeichnen. Ein Neuron benötigt einige Eingaben, eine oder mehrere Eingaben, die nur Zahlen sind. Es führt einige Berechnungen durch und gibt eine andere Zahl aus, die dann eine Eingabe für ein zweites Neuron sein könnte, hier rechts abgebildet. Wenn Sie ein künstliches neuronales Netzwerk oder einen Deep-Learning-Algorithmus erstellen, möchten Sie oft viele solcher Neuronen gleichzeitig simulieren, anstatt ein Neuron nach dem anderen zu erstellen. In diesem Diagramm zeichne ich drei Neuronen. Diese Neuronen geben zusammen ein paar Zahlen ein, führen einige Berechnungen durch und geben einige andere Zahlen aus. An dieser Stelle möchte ich einen großen Vorbehalt anbringen: Obwohl ich eine lockere Analogie zwischen biologischen Neuronen und künstlichen Neuronen gezogen habe, denke ich, dass wir heute fast keine Ahnung haben, wie das menschliche Gehirn funktioniert. Tatsächlich erzielen Neurowissenschaftler alle paar Jahre einen grundlegenden Durchbruch über die Funktionsweise des Gehirns. Ich denke, wir werden dies auf absehbare Zeit auch weiterhin tun. Das ist für mich ein Zeichen dafür, dass es noch viele Durchbrüche darüber gibt, wie das Gehirn tatsächlich funktioniert, und daher werden Versuche, das, was wir heute über das menschliche Gehirn wissen, blind nachzuahmen, was ehrlich gesagt sehr wenig ist, uns wahrscheinlich nicht so weit bringen, rohe Intelligenz aufzubauen. Sicher nicht mit unserem aktuellen Wissensstand in den Neurowissenschaften. Allerdings werden wir selbst mit diesen extrem vereinfachten Modellen eines Neurons, über die wir sprechen werden, in der Lage sein, wirklich leistungsstarke Deep-Learning-Algorithmen zu erstellen. Wenn Sie also tiefer in neuronale Netze und Deep Learning eintauchen, sollten Sie die biologische Motivation nicht zu ernst nehmen, obwohl die Ursprünge biologisch motiviert waren. Tatsächlich haben sich diejenigen von uns, die im Bereich Deep Learning forschen, von der biologischen Motivation abgewandt. Stattdessen verwenden sie nur technische Prinzipien, um herauszufinden, wie effektivere Algorithmen entwickelt werden können. Aber ich denke, es könnte trotzdem Spaß machen, hin und wieder darüber zu spekulieren und darüber nachzudenken, wie biologische Neuronen funktionieren. Die Ideen neuronaler Netze gibt es schon seit vielen Jahrzehnten. Ein paar Leute haben mich gefragt : „Hey Andrew, warum jetzt? Warum haben sich neuronale Netze erst in den letzten paar Jahren wirklich durchgesetzt?“ Dies ist ein Bild, das ich für sie zeichne, wenn mir diese Frage gestellt wird , und das du vielleicht auch für andere zeichnen könntest, wenn sie dir diese Frage stellen. Lassen Sie mich auf der horizontalen Achse die Datenmenge darstellen, die Sie für ein Problem haben, und auf der vertikalen Achse die Leistung oder Genauigkeit eines auf dieses Problem angewandten Lernalgorithmus. In den letzten Jahrzehnten, mit dem Aufkommen des Internets, dem Aufkommen von Mobiltelefonen, der Digitalisierung unserer Gesellschaft, ist die Datenmenge, die wir für viele Anwendungen haben, stetig nach rechts gerückt. Bei vielen Datensätzen, die P auf Papier verwenden, z. B. wenn Sie etwas bestellen, anstatt es auf einem Blatt Papier zu haben, ist die Wahrscheinlichkeit, dass es sich um eine digitale Aufzeichnung handelt, viel höher. Wenn Sie einen Arzt aufsuchen, ist die Wahrscheinlichkeit, dass Ihre Krankenakte heute digital ist, viel höher als auf Papier. In vielen Anwendungsbereichen ist die Menge digitaler Daten also explosionsartig angestiegen. Was wir bei herkömmlichen Algorithmen für maschinelles Lernen wie der logistischen Regression und der linearen Regression gesehen haben, war es sehr schwierig, die Leistung weiter zu steigern, selbst wenn man diesen Algorithmen mehr Daten eingab. Es war also so, als ob die traditionellen Lernalgorithmen wie lineare Regression und logistische Regression einfach nicht in der Lage wären, mit der Datenmenge zu skalieren, die wir jetzt einspeisen konnten, und sie waren nicht in der Lage, all diese Daten, die wir hatten, für verschiedene Anwendungen effektiv zu nutzen. KI-Forscher begannen zu beobachten , dass, wenn Sie ein kleines neuronales Netzwerk mit diesem Datensatz trainieren, die Leistung vielleicht so aussieht. Wenn Sie ein mittelgroßes neuronales Netzwerk trainieren würden, also eines mit mehr Neuronen darin, könnte seine Leistung so aussehen. Wenn Sie ein sehr großes neuronales Netzwerk trainieren, also eines mit vielen dieser künstlichen Neuronen, dann wird die Leistung bei einigen Anwendungen einfach weiter steigen. Das bedeutete also zwei Dinge, es bedeutete, dass man für eine bestimmte Klasse von Anwendungen, bei denen man viele Daten hat, manchmal den Begriff Big Data herumwirbeln hört, wenn man in der Lage ist, ein sehr großes neuronales Netzwerk zu trainieren, um diese riesige Datenmenge zu nutzen, dann kann man Leistung in allen Bereichen erreichen , von Spracherkennung über Bilderkennung bis hin zu Anwendungen zur Verarbeitung natürlicher Sprache und vielem mehr, sie waren mit früheren Generationen von Lernalgorithmen einfach nicht möglich.. Dies führte dazu, dass Deep-Learning-Algorithmen an Fahrt gewagt haben, und das ist auch der Grund für schnellere Computerprozessoren, einschließlich der Zunahme von GPUs oder Grafikprozessoren. Dies ist Hardware, die ursprünglich für die Generierung gut aussehender Computergrafiken entwickelt wurde, sich aber auch für Deep Learning als sehr leistungsfähig herausgestellt hat. Dies war auch ein wichtiger Faktor dafür, dass Deep-Learning-Algorithmen zu dem wurden, was sie heute sind. So haben neuronale Netze angefangen und deshalb haben sie sich in den letzten Jahren so schnell durchgesetzt. Lassen Sie uns nun genauer auf die Funktionsweise neuronaler Netzwerke eingehen. Bitte fahren Sie mit dem nächsten Video fort.
Vorhersage der Nachfrage
Um zu veranschaulichen, wie neuronale Netzwerke funktionieren, beginnen wir mit einem Beispiel.
Wir verwenden ein Beispiel aus der Nachfrageprognose, in dem Sie sich das Produkt ansehen und versuchen, vorherzusagen, ob dieses Produkt ein Verkaufsschlager sein wird oder nicht. Lass uns einen Blick darauf werfen.
In diesem Beispiel verkaufen Sie T-Shirts und möchten wissen, ob ein bestimmtes T-Shirt ein Verkaufsschlager sein wird, ja oder nein, und Sie haben Daten über verschiedene T-Shirts gesammelt, die zu unterschiedlichen Preisen verkauft wurden, und welche zu Topsellern wurden. Diese Art von Anwendung wird heute von Einzelhändlern verwendet , um bessere Lagerbestände und Marketingkampagnen zu planen. Wenn Sie wissen, was wahrscheinlich ein Verkaufsschlager sein wird, würden Sie beispielsweise planen, einfach mehr von dieser Aktie im Voraus zu kaufen.
In diesem Beispiel ist das Eingabemerkmal x der Preis des T-Shirts, und das ist die Eingabe für den Lernalgorithmus. Wenn Sie die logistische Regression anwenden, um eine Sigmoidfunktion an die Daten anzupassen, die so aussehen könnten, könnten die Ausgaben Ihrer Vorhersage so aussehen, 1/1 plus e zum negativen wx plus b. Zuvor hatten wir dies als f von x als Ausgabe des Lernalgorithmus geschrieben. Um uns in die Lage zu versetzen, ein neuronales Netzwerk aufzubauen, werde ich die Terminologie ein wenig ändern und das Alphabet a verwenden, um die Ausgabe dieses logistischen Regressionsalgorithmus zu bezeichnen.
Der Begriff A steht für Aktivierung und ist eigentlich ein Begriff aus den Neurowissenschaften. Er bezieht sich darauf, wie viel Leistung ein Neuron an andere nachgeschaltete Neuronen sendet.
Es stellt sich heraus, dass diese logistischen Regressionseinheiten oder dieser kleine logistische Regressionsalgorithmus als ein sehr vereinfachtes Modell eines einzelnen Neurons im Gehirn betrachtet werden können. Was das Neuron tut, ist, dass wir den Preis x eingeben, und dann berechnet es diese Formel zusätzlich und es gibt die Zahl a aus, die mit dieser Formel berechnet wird, und es gibt die Wahrscheinlichkeit aus, dass dieses T-Shirt ein Verkaufsschlager wird.
Eine andere Möglichkeit, sich ein Neuron vorzustellen, ist ein winziger kleiner Computer, dessen einzige Aufgabe darin besteht, eine oder mehrere Zahlen einzugeben, z. B. einen Preis, und dann eine Zahl oder vielleicht ein paar andere Zahlen auszugeben, was in diesem Fall die Wahrscheinlichkeit ist, dass das T-Shirt ein Verkaufsschlager ist.
Wie ich im vorherigen Video angedeutet habe, ist ein logistischer Regressionsalgorithmus viel einfacher als das, was irgendein biologisches Neuron in deinem oder meinem Gehirn tut. Deshalb ist das künstliche neuronale Netzwerk ein so stark vereinfachtes Modell des menschlichen Gehirns. Auch wenn Deep-Learning-Algorithmen in der Praxis, wie Sie wissen, sehr gut funktionieren.
Angesichts dieser Beschreibung eines einzelnen Neurons erfordert der Aufbau eines neuronalen Netzwerks jetzt nur noch, eine Reihe dieser Neuronen zu nehmen und sie miteinander zu verkabeln oder zusammenzusetzen.
Schauen wir uns nun ein komplexeres Beispiel für eine Nachfrageprognose an. In diesem Beispiel werden wir vier Funktionen verwenden, um vorherzusagen, ob ein T-Shirt ein Verkaufsschlager ist oder nicht.
Die Merkmale sind der Preis des T-Shirts, die Versandkosten, der Umfang der Vermarktung dieses bestimmten T-Shirts sowie die Materialqualität. Handelt es sich um hochwertige, dicke Baumwolle oder vielleicht um ein Material von geringerer Qualität? Nun könnten Sie vermuten, dass es tatsächlich von einigen Faktoren abhängt, ob ein T-Shirt ein Verkaufsschlager wird oder nicht. Erstens die Erschwinglichkeit dieses T-Shirts. Zweitens: Welchen Bekanntheitsgrad haben potenzielle Käufer für dieses T-Shirt? An dritter Stelle steht die wahrgenommene Qualität gegenüber Voreingenommenheit oder potenzieller Voreingenommenheit, wenn man sagt, dass es sich um ein hochwertiges T-Shirt handelt.
Ich werde ein künstliches Neuron erstellen, um zu versuchen, die Wahrscheinlichkeit abzuschätzen, dass dieses T-Shirt als sehr erschwinglich wahrgenommen wird. Die Erschwinglichkeit hängt hauptsächlich vom Preis und den Versandkosten ab, da der Gesamtbetrag der Bezahlung einen Teil des Preises zuzüglich der Versandkosten ausmacht.
Wir werden hier ein kleines Neuron verwenden, eine logistische Regressionseinheit, um Preis und Versandkosten einzugeben und vorherzusagen, ob die Leute denken, dass das erschwinglich ist? Zweitens werde ich hier ein weiteres künstliches Neuron erstellen, um abzuschätzen, gibt es ein hohes Bewusstsein dafür? Die Bekanntheit hängt in diesem Fall hauptsächlich von der Vermarktung des T-Shirts ab. Schließlich werde ich ein weiteres Neuron erstellen, um abzuschätzen, ob die Leute es als qualitativ hochwertig empfinden, und das kann hauptsächlich vom Preis des T-Shirts und der Materialqualität abhängen. Der Preis ist hier ein Faktor , denn glücklicherweise oder unglücklicherweise werden die Leute, wenn es ein sehr teures T-Shirt gibt, manchmal als qualitativ hochwertig empfinden, weil es sehr teuer ist, als die Leute vielleicht denken, dass es von hoher Qualität sein wird.
Angesichts dieser Schätzungen der Erschwinglichkeit, des Bewusstseins und der wahrgenommenen Qualität verbinden wir dann die Ausgänge dieser drei Neuronen mit einem anderen Neuron hier auf der rechten Seite, sodass es dann eine weitere logistische Regressionseinheit gibt. Das gibt schließlich diese drei Zahlen ein und gibt die Wahrscheinlichkeit aus, dass dieses T-Shirt ein Verkaufsschlager ist.
In der Terminologie neuronaler Netzwerke werden wir diese drei Neuronen zu einer sogenannten Schicht zusammenfassen. Eine Schicht ist eine Gruppierung von Neuronen, die dieselben oder ähnliche Merkmale als Eingabe verwendet und die wiederum einige Zahlen zusammen ausgibt.
Diese drei Neuronen auf der linken Seite bilden eine Ebene , weshalb ich sie übereinander gezeichnet habe, und dieses einzelne Neuron auf der rechten Seite ist auch eine Ebene. Die linke Schicht hat drei Neuronen, sodass eine Schicht mehrere Neuronen oder auch ein einzelnes Neuron haben kann, wie im Fall dieser Schicht auf der rechten Seite. Diese Schicht auf der rechten Seite wird auch als Ausgabeschicht bezeichnet, da die Ausgaben dieses letzten Neurons die vom neuronalen Netzwerk vorhergesagte Ausgabewahrscheinlichkeit sind.
In der Terminologie neuronaler Netze werden wir auch Bezahlbarkeitsbewusstsein und Wahrnehmung von Qualität als Aktivierungen bezeichnen. Der Begriff Aktivierungen stammt von biologischen Neuronen und bezieht sich auf den Grad, in dem das biologische Neuron einen hohen Ausgangswert oder viele elektrische Impulse an andere Neuronen sendet, die ihm nachgeschaltet sind. Diese Zahlen zu Erschwinglichkeit, Bewusstsein und wahrgenommener Qualität sind die Aktivierungen dieser drei Neuronen in dieser Schicht, und auch diese Ausgangswahrscheinlichkeit ist die Aktivierung dieses Neurons, das hier rechts gezeigt wird.
Dieses spezielle neuronale Netzwerk führt daher Berechnungen wie folgt durch. Es gibt vier Zahlen ein, dann verwendet diese Schicht des neuronalen Netzwerks diese vier Zahlen, um die neuen Zahlen zu berechnen, die auch als Aktivierungswerte bezeichnet werden. Dann verwendete die letzte Schicht, die Ausgabeschicht des neuronalen Netzwerks, diese drei Zahlen, um eine Zahl zu berechnen. In einem neuronalen Netzwerk wird diese Liste mit vier Zahlen auch als Eingabeschicht bezeichnet, und das ist nur eine Liste von vier Zahlen.
Nun, ich möchte dieses neuronale Netzwerk vereinfachen. So wie ich es bisher beschrieben habe, mussten wir die Neuronen nacheinander durchgehen und entscheiden, welche Eingaben von der vorherigen Schicht übernommen wurden. Wir sagten zum Beispiel, dass Erschwinglichkeit nur eine Funktion von Preis und Versandkosten ist und Bekanntheit nur eine Funktion des Marketings usw. ist, aber wenn Sie ein großes neuronales Netzwerk aufbauen, wäre es eine Menge Arbeit, manuell zu entscheiden, welche Neuronen welche Funktionen als Eingabe verwenden sollen.
So wie ein neuronales Netzwerk in der Praxis implementiert wird, hat jedes Neuron in einer bestimmten Schicht, sagen wir diese Schicht in der Mitte, Zugriff auf jedes Merkmal, auf jeden Wert aus der vorherigen Schicht, aus der Eingabeschicht, weshalb ich jetzt Pfeile von jedem Eingabe-Feature zu jedem dieser hier in der Mitte gezeigten Neuronen zeichne.
Sie können sich vorstellen, dass, wenn Sie versuchen, die Erschwinglichkeit vorherzusagen und das Unternehmen weiß, wie hoch die Kosten für Versand, Marketing und Material sind, vielleicht lernen, Marketing und Material zu ignorieren und durch die entsprechende Einstellung der Parameter herauszufinden, dass Sie sich nur auf die Teilmenge der Funktionen konzentrieren, die für die Erschwinglichkeit am relevantesten sind.
Um die Notation und Beschreibung dieses neuronalen Netzes weiter zu vereinfachen, nehme ich diese vier Eingabemerkmale und schreibe sie als Vektor x, und wir werden das neuronale Netzwerk so betrachten, dass es vier Merkmale hat, die diesen Merkmalsvektor x umfassen. Dieser Merkmalsvektor wird dieser Schicht in der Mitte zugeführt, die dann drei Aktivierungswerte berechnet. Das sind diese Zahlen und diese drei Aktivierungswerte werden wiederum zu einem weiteren Vektor, der dieser letzten Ausgabeschicht zugeführt wird, die schließlich die Wahrscheinlichkeit ausgibt, dass dieses T-Shirt ein Verkaufsschlager wird.
Das ist alles, was ein neuronales Netzwerk ist. Es hat einige Ebenen, in denen jede Ebene einen Vektor eingibt und einen anderen Zahlenvektor ausgibt. Diese Ebene in der Mitte gibt beispielsweise vier Zahlen x ein und drei Zahlen aus, die der Erschwinglichkeit, dem Bekanntheitsgrad und der wahrgenommenen Qualität entsprechen. Um etwas mehr Terminologie hinzuzufügen: Sie haben gesehen, dass diese Ebene als Ausgabeschicht und diese Ebene als Eingabeschicht bezeichnet wird.
Um auch der Ebene in der Mitte einen Namen zu geben, wird diese Ebene in der Mitte als versteckte Ebene bezeichnet. Ich weiß, dass das vielleicht nicht der beste oder der intuitivste Name ist , aber die Terminologie kommt daher , wenn man ein Trainingsset hat. In einem Trainingssatz können Sie sowohl x als auch y beobachten. Ihr Datensatz sagt Ihnen, was x und was y ist, und so erhalten Sie Daten, die Ihnen sagen, was die richtigen Eingaben und die richtigen Ausgaben sind. Ihr Datensatz sagt Ihnen jedoch nicht, was die richtigen Werte für Erschwinglichkeit , Bekanntheit und wahrgenommene Qualität sind. Die richtigen Werte für diese sind ausgeblendet. Du siehst sie nicht im Trainingssatz, weshalb diese Ebene in der Mitte als versteckte Ebene bezeichnet wird.
Ich möchte mit Ihnen eine andere Denkweise über neuronale Netzwerke teilen, die ich als nützlich empfunden habe, um meine Intuition dafür zu entwickeln. Lassen Sie mich einfach die linke Hälfte dieses Diagramms abdecken und sehen, was uns noch bleibt. Was Sie hier sehen, ist, dass es einen logistischen Regressionsalgorithmus oder eine logistische Regressionseinheit gibt, die die Erschwinglichkeit, den Bekanntheitsgrad und die wahrgenommene Qualität eines T-Shirts als Eingabe verwendet und anhand dieser drei Merkmale die Wahrscheinlichkeit abschätzt, dass das T-Shirt ein Verkaufsschlager wird. Dies ist nur eine logistische Regression. Aber das Coole daran ist, anstatt die ursprünglichen Funktionen, den Preis, die Versandkosten, das Marketing usw. zu verwenden, vielleicht bessere Funktionen, Erschwinglichkeit, Bekanntheit und wahrgenommene Qualität zu verwenden, die hoffentlich besser vorhersagen, ob dieses T-Shirt ein Verkaufsschlager wird oder nicht.
Eine Möglichkeit, sich dieses neuronale Netzwerk vorzustellen , ist die logistische Regression. Aber als Variante der logistischen Regression können sie ihre eigenen Funktionen erlernen, was es einfacher macht, genaue Vorhersagen zu treffen.
Vielleicht erinnern Sie sich an den vorherigen Kurs, dieses Beispiel für Wohnimmobilien, wo wir gesagt haben, dass Sie, wenn Sie den Preis eines Hauses vorhersagen wollen, die Fassade oder die Breite von Grundstücken nehmen und diese mit der Tiefe eines Grundstücks multiplizieren könnten, um ein komplexeres Objekt zu konstruieren, x_1 mal x_2, was der Größe des Rasens entspricht. Dort führten wir manuelles Feature-Engineering durch, bei dem wir uns die Funktionen x_1 und x_2 ansehen und von Hand entscheiden mussten, wie wir sie kombinieren sollten, um bessere Funktionen zu entwickeln.
Das neuronale Netzwerk muss die Funktionen nicht manuell entwickeln, sondern kann, wie Sie später sehen werden, seine eigenen Funktionen erlernen, um sich das Lernproblem zu erleichtern. Dies macht neuronale Netze heute zu einem der leistungsstärksten Lernalgorithmen der Welt.
Zusammenfassend lässt sich sagen, dass ein neuronales Netzwerk dies tut. Die Eingabeschicht hat einen Merkmalsvektor, in diesem Beispiel vier Zahlen. Sie wird in die versteckte Schicht eingegeben, die drei Zahlen ausgibt. Ich werde einen Vektor verwenden, um diesen Aktivierungsvektor zu bezeichnen, den diese versteckte Ebene ausgibt. Dann nimmt die Ausgabeschicht ihre Eingabe auf drei Zahlen auf und gibt eine Zahl aus, was die endgültige Aktivierung oder die endgültige Vorhersage des neuronalen Netzwerks wäre.
Ein Hinweis: Obwohl ich dieses neuronale Netzwerk zuvor als erschwingliche Rechenleistung , Bewusstsein und wahrgenommene Qualität beschrieben habe, ist eine der wirklich schönen Eigenschaften eines neuronalen Netzwerks, wenn man es anhand von Daten trainiert, dass man nicht explizit entscheiden muss, welche anderen Funktionen, wie Erschwinglichkeit usw., das neuronale Netzwerk stattdessen berechnen soll, oder ganz von selbst herausfinden, welche Funktionen es in dieser verborgenen Schicht verwenden möchte. Das macht ihn zu einem so leistungsstarken Lernalgorithmus.
Sie haben hier ein Beispiel für ein neuronales Netzwerk gesehen, und dieses neuronale Netzwerk hat eine einzige Schicht, die eine versteckte Schicht ist. Schauen wir uns einige andere Beispiele für neuronale Netze an, insbesondere Beispiele mit mehr als einer versteckten Schicht.
Hier ist ein Beispiel. Dieses neuronale Netzwerk hat einen Eingabe-Merkmalsvektor X , der einer versteckten Schicht zugeführt wird. Ich nenne das die erste versteckte Ebene. Wenn diese versteckte Schicht drei Neuronen hat, gibt sie einen Vektor mit drei Aktivierungswerten aus. Diese drei Zahlen können dann in die zweite versteckte Ebene eingegeben werden. Wenn die zweite versteckte Schicht zwei Neuronen für logistische Einheiten hat, dann gibt diese zweite versteckte Schicht einen weiteren Vektor mit jetzt zwei Aktivierungswerten aus, der möglicherweise an die Ausgabeschicht geht, die dann die endgültige Vorhersage des neuronalen Netzwerks ausgibt.
Hier ist ein weiteres Beispiel. Hier ist ein neuronales Netzwerk , dessen Eingabe an die erste versteckte Schicht geht, die Ausgabe der ersten versteckten Schicht an die zweite versteckte Schicht, an die dritte versteckte Schicht und dann schließlich an die Ausgabeschicht. Wenn Sie Ihr eigenes neuronales Netzwerk aufbauen, müssen Sie unter anderem entscheiden, wie viele verborgene Schichten Sie haben möchten und wie viele Neuronen jede verborgene Schicht haben soll.
Diese Frage, wie viele versteckte Schichten und wie viele Neuronen pro verborgener Schicht sind, ist eine Frage der Architektur des neuronalen Netzes. Später in diesem Kurs erhalten Sie einige Tipps zur Auswahl einer geeigneten Architektur für ein neuronales Netzwerk. Die Wahl der richtigen Anzahl versteckter Ebenen und der Anzahl versteckter Einheiten pro Ebene kann sich jedoch auch auf die Leistung eines Lernalgorithmus auswirken.
Später in diesem Kurs lernen Sie, wie Sie auch eine gute Architektur für Ihr neuronales Netzwerk auswählen. In der Literatur wird diese Art von neuronalem Netzwerk mit mehreren Schichten übrigens als mehrschichtiges Perzeptron bezeichnet.
Wenn Sie das sehen, bezieht sich das nur auf ein neuronales Netzwerk , das so aussieht, wie Sie es hier auf der Folie sehen. Das ist ein neuronales Netzwerk. Ich weiß, dass wir in diesem Video viel durchgemacht haben. Danke, dass du bei mir geblieben bist. Aber Sie wissen jetzt, wie ein neuronales Netzwerk funktioniert.
Schauen wir uns im nächsten Video an, wie diese Ideen auch auf andere Anwendungen angewendet werden können. Insbesondere werden wir uns die Computer-Vision-Anwendung der Gesichtserkennung ansehen. Gehen wir zum nächsten Video über.
Beispiel: Erkennen von Bildern
Im letzten Video haben Sie anhand eines Beispiels zur Bedarfsprognose gesehen, wie ein neuronales Netzwerk funktioniert. Schauen wir uns an, wie Sie eine ähnliche Idee auf Computer-Vision-Anwendungen anwenden können. Lass uns eintauchen.
Wenn Sie eine Gesichtserkennungsanwendung erstellen, möchten Sie vielleicht ein neuronales Netzwerk trainieren, das ein solches Bild als Eingabe verwendet und die Identität der Person auf dem Bild ausgibt. Dieses Bild ist 1.000 mal 1.000 Pixel groß. Ihre Darstellung im Computer erfolgt in Wirklichkeit als Raster von 1.000 mal 1.000 oder wird auch als Matrix von 1.000 mal 1.000 Pixelintensitätswerten bezeichnet.
In diesem Beispiel reichen meine Pixelintensitätswerte oder Pixelhelligkeitswerte von 0 bis 255, also 197 wäre hier die Helligkeit des Pixels ganz oben links im Bild, 185 die Helligkeit des Pixels, ein Pixel darüber und so weiter, bis 214 wäre die untere rechte Ecke dieses Bildes. Wenn Sie diese Pixelintensitätswerte nehmen und sie in einen Vektor aufwickeln, erhalten Sie am Ende eine Liste oder einen Vektor mit einer Million Pixelintensitätswerten. Eine Million, denn 1.000 mal 1.000 Quadrate ergeben eine Million Zahlen.
Das Problem der Gesichtserkennung ist, kann man ein neuronales Netzwerk trainieren , das als Eingabe einen Merkmalsvektor mit einer Million Pixel-Helligkeitswerten verwendet und die Identität der Person auf dem Bild ausgibt. Sie können Sie ein neuronales Netzwerk aufbauen, um diese Aufgabe auszuführen.
Das Eingangsbild X wird dieser Neuronenschicht zugeführt. Dies ist die erste versteckte Ebene, die dann einige Merkmale extrahiert. Die Ausgabe dieser ersten verborgenen Schicht wird einer zweiten versteckten Schicht zugeführt und diese Ausgabe wird einer dritten Schicht und dann schließlich der Ausgangsschicht zugeführt, die dann, sagen wir, die Wahrscheinlichkeit abschätzt, dass es sich um eine bestimmte Person handelt.
Eine interessante Sache wäre, wenn Sie sich ein neuronales Netzwerk ansehen, das auf vielen Bildern von Gesichtern trainiert wurde, und versuchen, zu visualisieren, was diese versteckten Schichten sind, wenn Sie versuchen, zu berechnen. Es stellt sich heraus, dass, wenn man ein System wie dieses auf vielen Bildern von Gesichtern trainiert und die verschiedenen Neuronen in den verborgenen Schichten betrachtet, um herauszufinden, was sie möglicherweise berechnen, genau das ist, was Sie finden könnten.
In der ersten versteckten Schicht finden Sie möglicherweise ein Neuron, das nach der niedrigen vertikalen Linie oder einer solchen vertikalen Kante sucht. Ein zweites Neuron, das nach einer ausgerichteten Linie oder einer solchen ausgerichteten Kante sucht. Das dritte Neuron sucht nach einer Linie in dieser Ausrichtung und so weiter.
In den frühesten Schichten eines neuronalen Netzwerks stellen Sie möglicherweise fest, dass die Neuronen nach sehr kurzen Linien oder sehr kurzen Kanten im Bild suchen. Wenn Sie sich die nächste versteckte Schicht ansehen, stellen Sie fest, dass diese Neuronen möglicherweise lernen, viele kleine kurze Linien und kleine kurze Randsegmente zu gruppieren, um nach Teilen von Gesichtern zu suchen.
Zum Beispiel ist jedes dieser kleinen quadratischen Kästchen eine Visualisierung dessen, was das Neuron zu erkennen versucht. Dieses erste Neuron sieht aus, als würde es versuchen, das Vorhandensein oder Fehlen eines Auges an einer bestimmten Position des Bildes zu erkennen.
Das zweite Neuron sieht aus, als würde es versuchen, einen Nasenwinkel zu erkennen, und vielleicht versucht dieses Neuron hier drüben, den unteren Teil eines Ohrs zu erkennen. Wenn Sie sich dann die nächste versteckte Ebene in diesem Beispiel ansehen, aggregiert das neuronale Netzwerk verschiedene Teile von Gesichtern, um dann zu versuchen, das Vorhandensein oder Fehlen größerer, gröberer Gesichtsformen zu erkennen.
Wenn dann schließlich erkannt wird, wie sehr das Gesicht verschiedenen Gesichtsformen entspricht, wird ein umfangreicher Satz von Merkmalen erstellt, anhand derer die Ausgabeschicht versuchen kann, die Identität des Personenbildes zu ermitteln.
Das Bemerkenswerte am neuronalen Netzwerk ist, dass Sie diese Merkmalsdetektoren an den verschiedenen verborgenen Schichten ganz alleine lernen können. In diesem Beispiel hat ihm nie jemand gesagt, dass es in der ersten Ebene nach kurzen kleinen Kanten und in der zweiten Ebene nach Augen, Nasen und Gesichtsteilen und dann nach vollständigeren Gesichtsformen in der dritten Ebene suchen soll.
Das neuronale Netzwerk ist in der Lage, diese Dinge ganz alleine aus Daten herauszufinden. Nur eine Anmerkung: In dieser Visualisierung werden die Neuronen in der ersten verborgenen Schicht gezeigt, wie sie in relativ kleinen Fenstern nach diesen Kanten suchen. In der zweiten versteckten Ebene wird ein größeres Fenster betrachtet, und in der dritten versteckten Ebene wird ein noch größeres Fenster betrachtet. Diese kleinen Neuronenvisualisierungen entsprechen tatsächlich unterschiedlich großen Regionen im Bild.
Lassen Sie uns nur zum Spaß sehen, was passiert, wenn Sie dieses neuronale Netzwerk mit einem anderen Datensatz trainieren, sagen wir auf vielen Bildern von Autos, Bild nebenbei.
Derselbe Lernalgorithmus muss Autos erkennen und lernt dann in der ersten Schicht Kanten. Ziemlich ähnlich, aber dann lernen sie, Teile von Autos in der zweiten versteckten Schicht und dann vollständigere Fahrzeugformen in der dritten versteckten Ebene zu erkennen. Indem es einfach verschiedene Daten einspeist, lernt das neuronale Netzwerk automatisch, sehr unterschiedliche Merkmale zu erkennen, um zu versuchen, Vorhersagen zur Auto- oder Personenerkennung zu treffen oder ob es eine bestimmte Aufgabe gibt, für die trainiert wird.
So funktioniert ein neuronales Netzwerk für Computer-Vision-Anwendungen. Tatsächlich werden Sie später in dieser Woche sehen, wie Sie selbst ein neuronales Netzwerk aufbauen und es auf eine Anwendung zur Erkennung handgeschriebener Ziffern anwenden können.
Bisher haben wir uns mit der Beschreibung der Intuitionen neuronaler Netzwerke befasst , um Ihnen ein Gefühl dafür zu geben, wie sie funktionieren. Im nächsten Video schauen wir uns die konkrete Mathematik und eine konkrete Umsetzung von Details genauer an, wie Sie tatsächlich eine oder mehrere Schichten eines neuronalen Netzwerks aufbauen und wie Sie eines dieser Dinge also selbst implementieren können. Gehen wir zum nächsten Video über.
Neuronale Netzwerkschicht
Der grundlegende Baustein der meisten modernen neuronalen Netze ist eine Neuronenschicht. In diesem Video lernst du, wie man eine Neuronenschicht aufbaut, und sobald du das erledigt hast, kannst du diese Bausteine nehmen und sie zu einem großen neuronalen Netzwerk zusammenfügen.
Schauen wir uns an, wie eine Neuronenschicht funktioniert. Hier ist das Beispiel, das wir aus dem Beispiel mit der Bedarfsprognose hatten, wo wir vier Eingabe-Features hatten, die auf diese Schicht von drei Neuronen in der verborgenen Schicht gesetzt waren , die dann ihre Ausgabe mit nur einem Neuron an diese Ausgabeschicht sendet.
Zoomen wir auf die verborgene Ebene, um uns ihre Berechnungen anzusehen. Diese versteckte Schicht gibt vier Zahlen ein und diese vier Zahlen sind Eingaben für jedes der drei Neuronen.
Jedes dieser drei Neuronen implementiert nur eine kleine logistische Regressionseinheit oder eine kleine logistische Regressionsfunktion.
Nimm das erste Neuron. Es hat zwei Parameter, w und b. Um zu kennzeichnen, dass dies die erste versteckte Einheit ist, werde ich sie als w_1, b_1 indizieren. Ich gebe einen Aktivierungswert a aus , der g von w_1 in einem Produkt mit x plus b_1 ist, wobei dies der vertraute z-Wert ist, den Sie im vorherigen Kurs in der logistischen Regression kennengelernt haben, und g von z ist die vertraute logistische Funktion, 1 über 1 plus e bis zum negativen z. Vielleicht ist dies eine Zahl 0,3 und das ist der Aktivierungswert a des ersten Neurons. Um zu kennzeichnen, dass dies das erste Neuron ist, füge ich hier auch einen Index a_1 hinzu, sodass a_1 eine Zahl wie 0,3 sein kann. Basierend auf den Eingabefunktionen besteht eine Wahrscheinlichkeit von 0,3, dass dies sehr erschwinglich ist.
Schauen wir uns nun das zweite Neuron an. Das zweite Neuron hat die Parameter w_2 und b_2, und diese w, b oder w_2, b_2 sind die Parameter der zweiten logistischen Einheit. Es berechnet, dass a_2 der logistischen Funktion g entspricht, die auf w_2 Punktprodukt x plus b_2 angewendet wird, und dies kann eine andere Zahl sein, sagen wir 0,7. Denn in diesem Beispiel besteht eine Wahrscheinlichkeit von 0,7, dass wir glauben, dass potenzielle Käufer auf dieses T-Shirt aufmerksam werden.
In ähnlicher Weise hat das dritte Neuron einen dritten Satz von Parametern w_3, b_3. In ähnlicher Weise berechnet es einen Aktivierungswert a_3, der g von w_3 Punktprodukt x plus b_3 entspricht, und das kann beispielsweise 0,2 sein. In diesem Beispiel geben diese drei Neuronen 0,3, 0,7 und 0,2 aus, und dieser Vektor aus drei Zahlen wird zum Vektor der Aktivierungswerte a, der dann an die letzte Ausgabeschicht dieses neuronalen Netzwerks übergeben wird.
Wenn Sie nun neuronale Netzwerke mit mehreren Ebenen erstellen, ist es nützlich, den Ebenen unterschiedliche Nummern zu geben. Konventionell wird diese Schicht Schicht 1 des neuronalen Netzwerks genannt und diese Schicht wird Schicht 2 des neuronalen Netzwerks genannt. Die Eingabeschicht wird manchmal auch als Schicht 0 bezeichnet, und heute gibt es neuronale Netzwerke, die Dutzende oder sogar Hunderte von Schichten haben können.
Aber um die Notation einzuführen , die uns hilft, zwischen den verschiedenen Ebenen zu unterscheiden, werde ich die hochgestellte eckige Klammer 1 verwenden, um in verschiedene Ebenen zu indizieren. Insbesondere ein hochgestelltes Zeichen in eckigen Klammern 1 werde ich verwenden, das ist eine Notation, um die Ausgabe von Schicht 1 dieser verborgenen Schicht dieses neuronalen Netzwerks zu bezeichnen, und in ähnlicher Weise sind w_1, b_1 hier die Parameter der ersten Einheit in Schicht 1 des neuronalen Netzwerks, also werde ich hier auch ein hochgestelltes Zeichen in eckigen Klammern 1 hinzufügen, und w_2, b_2 sind die Parameter der zweiten versteckten Einheit oder das zweite versteckte Neuron in Schicht 1. Seine Parameter werden hier auch wie folgt mit ^ [1] bezeichnet. Ebenso kann ich hochgestellte eckige Klammern wie folgt hinzufügen, um anzuzeigen, dass dies die Aktivierungswerte der versteckten Einheiten der Schicht 1 dieses neuronalen Netzwerks sind.
Ich weiß, dass diese Notation vielleicht etwas unübersichtlich wird. Aber die Sache, an die Sie sich erinnern sollten, ist, dass jedes Mal, wenn Sie diese hochgestellte eckige Klammer 1 sehen, sich diese nur auf eine Größe bezieht , die der Schicht 1 des neuronalen Netzwerks zugeordnet ist. Wenn Sie die hochgestellte eckige Klammer 2 sehen , bezieht sich dies auf eine Größe, die der Ebene 2 des neuronalen Netzwerks zugeordnet ist. Dies gilt auch für andere Ebenen, einschließlich Schicht 3, Schicht 4 usw. für neuronale Netzwerke mit mehr Ebenen.
Das ist die Berechnung von Schicht 1 dieses neuronalen Netzwerks. Seine Ausgabe ist dieser Aktivierungsvektor, a^ [1] und ich werde ihn hierher kopieren, weil diese Ausgabe a_1 die Eingabe für Schicht 2 wird. Lassen Sie uns nun in die Berechnung von Schicht 2 dieses neuronalen Netzes hineinzoomen, die auch die Ausgabeschicht ist. Die Eingabe für Ebene 2 ist die Ausgabe von Ebene 1, also a_1 ist dieser Vektor 0,3, 0,7, 0,2, den wir gerade im vorherigen Teil dieser Folie berechnet haben. Da die Ausgabeschicht nur ein einzelnes Neuron hat, berechnet sie lediglich a_1, das ist die Ausgabe dieses ersten und einzigen Neurons, als g, die auf w _1 angewendete Sigmoidfunktion in einem Produkt mit a^ [1], also das ist die Eingabe in diese Schicht und dann plus b_1. Hier ist dies die Größe z, mit der Sie vertraut sind, und g ist wie zuvor die Sigmoidfunktion, die Sie darauf anwenden. Wenn dies zu einer Zahl führt, sagen wir 0,84, dann wird dies die Ausgabeschicht des neuronalen Netzwerks.
Da in diesem Beispiel die Ausgabeschicht nur ein einzelnes Neuron hat, ist diese Ausgabe nur ein Skalar, eine einzelne Zahl und kein Zahlenvektor. Um bei unserer bisherigen Notationskonvention zu bleiben, verwenden wir ein hochgestelltes Zeichen in eckigen Klammern 2, um die Mengen zu bezeichnen, die der Schicht 2 dieses neuronalen Netzwerks zugeordnet sind, also a^ [2] ist die Ausgabe dieser Schicht, und deshalb werde ich das auch hier als endgültige Ausgabe des neuronalen Netzwerks kopieren. Um die Notation einheitlich zu gestalten, können Sie auch diese hochgestellten eckigen Klammern 2s hinzufügen, um anzuzeigen, dass dies die Parameter und Aktivierungswerte sind, die der Ebene 2 des neuronalen Netzwerks zugeordnet sind. Sobald das neuronale Netzwerk a_2 berechnet hat, gibt es einen letzten optionalen Schritt, den Sie implementieren können oder nicht. Wenn Sie eine binäre Vorhersage wünschen, 1 oder 0, ist dies ein Verkaufsschlager? Ja oder nein? Sie können also die Zahl A hochgestellte eckige Klammern 2, Index 1, und das ist die Zahl 0,84, die wir berechnet haben, nehmen und diesen Schwellenwert auf 0,5 setzen. Wenn es größer als 0,5 ist, können Sie Y mit 1 vorhersagen, und wenn es kleiner als 0,5 ist, können Sie Ihr Y mit 0 vorhersagen.
Wir haben diesen Schwellenwert auch gesehen, als Sie im ersten Kurs der Spezialisierung etwas über logistische Regression gelernt haben. Wenn Sie möchten, erhalten Sie dann die endgültige Prognose, indem Sie entweder Eins oder Null angeben, wenn Sie nicht nur die Wahrscheinlichkeit ermitteln möchten, dass es sich um einen Verkaufsschlager handelt.
So funktioniert ein neuronales Netzwerk. Jede Ebene gibt einen Zahlenvektor ein und wendet eine Reihe logistischer Regressionseinheiten darauf an. Anschließend wird ein weiterer Zahlenvektor berechnet, der dann von Ebene zu Schicht weitergegeben wird, bis Sie zur endgültigen Berechnung der Ausgabeschichten gelangen, bei der es sich um die Vorhersage des neuronalen Netzwerks handelt. Dann können Sie entweder den Schwellenwert bei 0,5 angeben oder nicht, um die endgültige Vorhersage zu treffen.
Lassen Sie uns nun diese Grundlage, die wir jetzt aufgebaut haben, nutzen, um uns einige noch komplexere, noch größere neuronale Netzwerkmodelle anzusehen. Ich hoffe, dass dieses Konzept der Schichten und deren Zusammenfügung zum Aufbau eines neuronalen Netzwerks durch weitere Beispiele noch klarer wird. Gehen wir also zum nächsten Video über.
Komplexere neuronale Netzwerke
Im letzten Video haben Sie etwas über die neuronale Netzwerkschicht gelernt und wie diese einen Zahlenvektor eingibt und wiederum einen anderen Zahlenvektor ausgibt.
In diesem Video verwenden wir diese Ebene, um ein komplexeres neuronales Netzwerk aufzubauen. Ich hoffe, dass dadurch auch die Notation, die wir für neuronale Netze verwenden, klarer und konkreter wird. Lass uns einen Blick darauf werfen.
Dies ist das laufende Beispiel , das ich in diesem Video als Beispiel für ein komplexeres neuronales Netzwerk verwenden werde. Dieses Netzwerk besteht aus vier Schichten, wobei die Eingabeschicht nicht mitgezählt wird, die auch als Schicht 0 bezeichnet wird , wobei die Schichten 1 , 2 und 3 versteckte Schichten sind und Schicht 4 die Ausgabeschicht und Schicht 0 wie üblich die Eingabeschicht ist.
Wenn wir sagen, dass ein neuronales Netzwerk vier Schichten hat, schließt das laut Konvention alle verborgenen Schichten der Ausgabeschicht mit ein, aber wir zählen die Eingabeschicht nicht mit. Dies ist ein neuronales Netzwerk mit vier Schichten in der herkömmlichen Art, Schichten im Netzwerk zu zählen.
Zoomen wir auf Ebene 3, die dritte und letzte versteckte Ebene , um uns die Berechnungen dieser Ebene anzusehen. Ebene 3 gibt einen Vektor ein, eine hochgestellte eckige Klammer 2 , die von der vorherigen Ebene berechnet wurde, und sie gibt a_3 aus, was ein weiterer Vektor ist. Was ist die Berechnung, die Layer 3 durchführt, um von a_2 nach a_3 zu wechseln?
Wenn es drei Neuronen hat oder wir es drei versteckte Einheiten nennen, dann hat es die Parameter w_1, b_1, w_2, b_2 und w_3, b_3 und es berechnet a_1 gleich dem Sigmoid von w_1. Produkt mit dieser Eingabe für die Ebene plus b_1, und es berechnet a_2 gleich dem Sigmoid von w_2. Produkt mit wiederum a_2, der Eingabe für die Ebene plus b_2 usw., um a_3 zu erhalten. Dann ist die Ausgabe dieser Ebene ein Vektor, der a_1, a_2 und a_3 umfasst. Auch hier gilt: Wenn wir expliziter angeben wollen, dass all dies Größen sind, die mit Schicht 3 verknüpft sind, fügen wir alle diese hochgestellten, eckigen Klammern 3 hinzu, um zu kennzeichnen, dass diese Parameter w und b die Parameter sind, die Neuronen in Schicht 3 zugeordnet sind, und dass diese Aktivierungen Aktivierungen mit Schicht 3 sind.
Beachten Sie, dass dieser Begriff hier w_1 hochgestellte eckige Klammer 3 ist, was die Parameter bedeutet, die mit Layer 3 verknüpft sind. Produkt mit einer hochgestellten eckigen Klammer 2, das die Ausgabe von Ebene 2 war, die zur Eingabe für Ebene 3 wurde. Deshalb gibt es hier a_3, weil es ein Parameterassoziator für Layer 3-Produkt mit ist, und dort ist a_2, weil es die Ausgabe von Layer 2 ist.
Lassen Sie uns nun kurz überprüfen, ob wir das verstehen. Ich werde die hoch- und tiefgestellten Zeichen, die dem zweiten Neuron zugeordnet sind, ausblenden und ohne dieses Video zurückzuspulen, fahren Sie fort und spulen Sie zurück, wenn Sie möchten, aber es vorziehen, dass Sie es nicht tun. Aber können Sie, ohne dieses Video zurückzuspulen, die fehlenden hoch- und tiefgestellten Zeichen in dieser Gleichung durchdenken und sie selbst ausfüllen? Schauen Sie sich einmal das Video-Quiz am Ende an und sehen Sie, ob Sie hier herausfinden können, welche hoch- und tiefgestellten Zeichen für diese Gleichung geeignet sind.
Wenn Sie die erste Option gewählt haben, haben Sie es richtig gemacht! Die Aktivierung des 2. Neurons auf Schicht 3 wird mit ‚a‘ drei zwei bezeichnet. Um die Aktivierungsfunktion g anzuwenden, verwenden wir die Parameter desselben Neurons. Also haben w und b den gleichen Index 2 und die hochgestellte eckige Klammer 3. Die Eingabe-Features sind der Ausgabevektor des vorherigen Layers, also Layer 2. Das wird also der Vektor ‚a‘ hochgestellt 2 sein.
Die zweite Option verwendet den Vektor ‚a‘ 3, der nicht der Ausgabevektor der vorherigen Ebene ist. Die Eingabe für diese Ebene ist eine „Zwei“.
Und die dritte Option hat eine Zwei Zwei als Eingabe, was eher eine einzelne Zahl als der Vektor ist. Denken Sie daran, dass die richtige Eingabe ein Vektor ist, eine Zwei, mit dem kleinen Pfeil oben, und keine einzelne Zahl.
Um es noch einmal zusammenzufassen, a_3 ist die mit Schicht 3 verbundene Aktivierung für das zweite Neuron, daher ist dieses a_2 ein Parameter, der der dritten Schicht zugeordnet ist. Für das zweite Neuron ist dies a_2, wie oben und dann plus b_3. Hoffentlich macht das Sinn.
Nun die allgemeinere Form dieser Gleichung für eine beliebige Schicht 0 und für eine beliebige Einheit j, das heißt, dass eine Deaktivierung Schicht l, Einheit j, wie a32, ausgibt, das ist die Sigmoidfunktion, die auf diesen Begriff angewendet wird, der der Wellenvektor von Schicht l ist, wie Schicht 3 für die j-te Einheit, also gibt es wieder a_2, im obigen Beispiel, und das wird mit einer Deaktivierung punktförmig erzeugt Wert. Beachten Sie, dass dies nicht l ist, sondern l minus 1, wie a_2 oben, weil Sie mit der Ausgabe der vorherigen Ebene und dann plus b, dem Parameter für diese Ebene für diese Ebene für diese Einheit j, einen Punkt erzeugen. Dadurch aktivieren Sie Schicht l Einheit j, wobei das hochgestellte Zeichen l Schicht l und ein Index j Einheit j bezeichnet.
Beim Aufbau neuronaler Netzwerke bezieht sich Einheit j auf das j-te Neuron, also verwenden wir diese Begriffe ein bisschen synonym, wobei jede Einheit ein einzelnes Neuron in der Schicht ist. G hier ist die Sigmoidfunktion. Im Kontext eines neuronalen Netzes hat g einen anderen Namen , der auch Aktivierungsfunktion genannt wird, da g diesen Aktivierungswert ausgibt.
Wenn ich Aktivierungsfunktion sage, meine ich hier diese Funktion g. Bisher ist die einzige Aktivierungsfunktion, die Sie gesehen haben, eine Sigmoid-Funktion, aber nächste Woche schauen wir uns an, wann andere Funktionen, dann die Sigmoid-Funktion auch anstelle von g eingesteckt werden können. Die Aktivierungsfunktion ist nur die Funktion, die diese Aktivierungswerte ausgibt.
Nur eine letzte Notation. Um diese gesamte Notation konsistent zu machen, gebe ich auch den Eingabevektor X und einen anderen Namen, der a_0 ist. Auf diese Weise funktioniert dieselbe Gleichung auch für die erste Ebene, wo, wenn l gleich 1 ist, die Aktivierungen der ersten Ebene, also a_1, das Sigmoid mal das Gewichtspunktprodukt mit a_0 wären, was nur dieser Eingabe-Merkmalsvektor X ist. Mit dieser Notation wissen Sie jetzt, wie berechnet die Aktivierungswerte einer beliebigen Schicht in einem neuronalen Netzwerk als Funktion der Parameter sowie Aktivierungen der vorherigen Ebene.
Sie wissen jetzt, wie Sie die Aktivierungen einer beliebigen Ebene anhand der Aktivierungen der vorherigen Ebene berechnen können. Lassen Sie uns dies in einen Inferenzalgorithmus für ein neuronales Netzwerk umwandeln. Mit anderen Worten, wie man ein neuronales Netzwerk dazu bringt, Vorhersagen zu treffen. Sehen wir uns das im nächsten Video an.
Inferenz: Vorhersagen machen (Vorwärtspropagation)
Lassen Sie uns das Gelernte zu einem Algorithmus zusammenfassen, damit Ihr neuronales Netzwerk Rückschlüsse ziehen oder Vorhersagen treffen kann. Dies wird ein Algorithmus sein, der als Forward Propagation bezeichnet wird. Lass uns einen Blick darauf werfen.
Ich werde als motivierendes Beispiel die handschriftliche Ziffernerkennung verwenden. Und der Einfachheit halber werden wir nur zwischen den handgeschriebenen Ziffern Null und Eins unterscheiden. Es ist also nur ein binäres Klassifizierungsproblem, bei dem wir ein Bild eingeben und klassifizieren, ist das die Ziffer Null oder die Ziffer Eins? Und damit kannst du später in dieser Woche auch im Übungslabor selbst spielen.
Für das Beispiel der Folie verwende ich ein Bild von acht mal acht. Dieses Bild einer Eins ist also dieses Gitter oder eine Matrix mit acht mal acht oder 64 Pixel-Intensitätswerten, wobei 255 ein hellweißes Pixel und Null ein schwarzes Pixel bedeuten würde. Und unterschiedliche Zahlen sind verschiedene Grautöne zwischen den Schwarz- und Weißtönen.
Angesichts dieser 64 Eingabefunktionen werden wir das neuronale Netzwerk mit zwei versteckten Ebenen verwenden. Wo die erste versteckte Schicht 25 Neuronen oder 25 Einheiten hat. Die zweite versteckte Schicht hat 15 Neuronen oder 15 Einheiten. Und dann endlich die Ausgabeschicht oder die Ausgabeeinheit, wie groß ist die Wahrscheinlichkeit, dass dies 1 gegen 0 ist?
Lassen Sie uns also die Reihenfolge der Berechnungen durchgehen, die in Ihrem neuronalen Netzwerk durchgeführt werden müssen, um von der Eingabe X, diesen acht mal acht oder 64 Zahlen, zur vorhergesagten Wahrscheinlichkeit a3 zu gelangen. Die erste Berechnung besteht darin, von X nach a1 zu gehen, und genau das macht die erste Schicht der ersten versteckten Ebene. Es wird eine Berechnung durchgeführt, bei der die eckige Klammer 1 des Superstreifens dieser Formel auf der rechten Seite entspricht.
Beachten Sie, dass eine Eins 25 Zahlen hat, da diese versteckte Ebene 25 Einheiten hat. Aus diesem Grund reichen die Parameter von w1 bis w25 sowie von b1 bis b25. Und ich habe hier x geschrieben, aber ich hätte auch a0 hier schreiben können, weil konventionell die Aktivierung von Layer Zero, also a0, gleich dem Eingabe-Feature-Wert x ist. Lassen Sie uns einfach a1 berechnen.
Der nächste Schritt ist die Berechnung von a2. Betrachtet man die zweite versteckte Schicht, führt es dann diese Berechnung durch, wobei a2 eine Funktion von a1 ist und sie als sichere Punktaktivierungsfunktion berechnet wird, die auf das Punktprodukt a1 plus den entsprechenden Wert von b angewendet wird. Beachten Sie, dass Schicht zwei 15 Neuronen oder 15 Einheiten hat, weshalb die Parameter Here von w1 bis w15 und b1 bis b15 laufen. Jetzt haben wir a2 berechnet.
Der letzte Schritt besteht dann darin, a3 zu berechnen, und zwar mit einer sehr ähnlichen Berechnung. Erst jetzt, diese dritte Schicht, die Ausgabeschicht, hat nur eine Einheit, weshalb es hier nur einen Ausgang gibt. A3 ist also nur ein Skalar. Und schließlich können Sie optional einen Wert mit einem 3-Index verwenden und einen Schwellenwert von 4,5 festlegen, um ein binäres Klassifizierungslabel zu erhalten. Ist das die Ziffer 1? Ja oder nein?
Die Reihenfolge der Berechnungen nimmt also zuerst x und berechnet dann a1 und dann a2 und berechnet dann a3, was auch die Ausgabe der neuronalen Netze ist. Du kannst das auch als f (x) schreiben. Denken Sie also daran, als wir etwas über lineare Regression und logistische Regression gelernt haben, verwenden wir f (x), um das Ergebnis einer linearen Regression oder logistischen Regression zu bezeichnen. Wir können also auch f (x) verwenden, um die vom neuronalen Netzwerk berechnete Funktion als Funktion von x zu bezeichnen. Da diese Berechnung von links nach rechts geht, beginnen Sie mit x und berechnen a1, dann a2, dann a3.
Dieses Album wird auch Vorwärtsausbreitung genannt, weil Sie die Aktivierungen der Neuronen propagieren. Sie führen diese Berechnungen also in Vorwärtsrichtung von links nach rechts durch. Und das steht im Gegensatz zu einem anderen Algorithmus namens Backward Propagation oder Backpropagation, der für das Lernen verwendet wird. Und darüber lernst du nächste Woche.
Übrigens, diese Art von neuronaler Netzwerkarchitektur, bei der Sie anfangs mehr versteckte Einheiten haben und dann die Anzahl der versteckten Einheiten abnimmt, je näher Sie der Ausgabeschicht kommen. Es gibt auch eine ziemlich typische Wahl bei der Auswahl neuronaler Netzwerkarchitekturen.
Und weitere Beispiele dafür finden Sie auch im Praxislabor. Das ist also neuronale Netzwerkinferenz unter Verwendung des Forward-Propagation-Algorithmus. Und damit könnten Sie die Parameter eines neuronalen Netzwerks herunterladen, das jemand anderes trainiert und ins Internet gestellt hat. Und Sie könnten mithilfe ihres neuronalen Netzwerks Rückschlüsse auf Ihre neuen Daten ziehen.
Nachdem Sie nun die Mathematik und den Algorithmus gesehen haben, schauen wir uns an, wie Sie dies tatsächlich in Tensorflow implementieren können. Schauen wir uns das genauer im nächsten Video an.
Inferenz im Code
TensorFlow ist eines der führenden Frameworks zur Implementierung von Deep-Learning-Algorithmen. Wenn ich Projekte erstelle, ist TensorFlow eigentlich ein Tool, das ich am häufigsten verwende. Das andere beliebte Tool ist PyTorch. Aber wir werden uns bei dieser Spezialisierung auf TensorFlow konzentrieren.
Schauen wir uns in diesem Video an, wie Sie Inferenzcode mit TensorFlow implementieren können. Lass uns eintauchen. Eines der bemerkenswerten Dinge an neuronalen Netzwerken ist, dass derselbe Algorithmus auf so viele verschiedene Anwendungen angewendet werden kann. In diesem Video und in einigen Laboren, damit Sie sehen können, was das neuronale Netzwerk macht, werde ich ein weiteres Beispiel verwenden, um Inferenz zu veranschaulichen.
Manchmal röste ich Kaffeebohnen gerne selbst zu Hause. Mein Favorit sind eigentlich kolumbianische Kaffeebohnen. Kann der Lernalgorithmus helfen, die Qualität der Bohnen zu optimieren, die Sie durch einen solchen Röstvorgang erhalten? Beim Rösten von Kaffee können Sie zwei Parameter kontrollieren: die Temperatur, bei der Sie die rohen Kaffeebohnen erhitzen, um sie in schön geröstete Kaffeebohnen zu verwandeln, sowie die Dauer oder wie lange Sie die Bohnen rösten werden.
In diesem leicht vereinfachten Beispiel haben wir Datensätze mit unterschiedlichen Temperaturen und unterschiedlichen Dauern sowie Beschriftungen erstellt, die zeigen, ob es sich bei dem von Ihnen gerösteten Kaffee um gut schmeckenden Kaffee handelt. Wo hier ein Kreuz steht, entspricht das positive Kreuz y gleich 1 gutem Kaffee, und alle negativen Kreuze entsprechen schlechtem Kaffee.
Es sieht so aus, als ob eine vernünftige Vorstellung von diesem Datensatz darin besteht, dass, wenn Sie ihn bei zu niedriger Temperatur kochen, er nicht geröstet wird und am Ende zu wenig gekocht wird. Wenn du es nicht lange genug kochst, ist die Dauer zu kurz, es ist auch kein schön geröstetes Bohnenset. Wenn Sie es schließlich entweder zu lange oder bei zu hoher Temperatur kochen, erhalten Sie am Ende verkochte Bohnen. Das sind ein bisschen verbrannte Bohnen. Es gibt auch keinen guten Kaffee. Nur Punkte innerhalb dieses kleinen Dreiecks entsprechen hier einem guten Kaffee.
Dieses Beispiel ist ein wenig vereinfacht gegenüber dem tatsächlichen Kaffeerösten. Auch wenn dieses Beispiel zur Veranschaulichung vereinfacht ist, gab es bereits ernsthafte Projekte, bei denen maschinelles Lernen zur Optimierung der Kaffeeröstung eingesetzt wurde. Die Aufgabe erhält einen Merkmalsvektor x mit Temperatur und Dauer, sagen wir 200 Grad Celsius für 17 Minuten. Wie können wir in einem neuronalen Netzwerk Rückschlüsse ziehen, damit es uns sagt, ob diese Temperatur- und Dauereinstellung zu gutem Kaffee führt oder nicht?
Es sieht so aus. Wir setzen x auf ein Array mit zwei Zahlen. Die Eingabe bietet 200 Grad Celsius und 17 Minuten. Dann erstellen Sie Ebene 1 als diese erste versteckte Ebene, das neuronale Netzwerk, als dichte offene Klammereinheiten 3, das heißt drei Einheiten oder drei versteckte Einheiten in dieser Schicht , wobei Sie als Aktivierungsfunktion die Sigmoidfunktion verwenden.
Dense ist ein anderer Name für die Schichten eines neuronalen Netzwerks , von denen wir bisher erfahren haben. Wenn Sie mehr über neuronale Netzwerke erfahren, lernen Sie auch andere Arten von Ebenen kennen. Aber vorerst verwenden wir nur die dichte Ebene , den Ebenentyp, den Sie in den letzten Videos für all unsere Beispiele kennengelernt haben.
Als Nächstes berechnen Sie a1, indem Sie Ebene 1 nehmen, die eigentlich eine Funktion ist, und diese Funktion Ebene 1 auf die Werte von x anwenden. Auf diese Weise erhalten Sie a1, was eine Liste von drei Zahlen sein wird, da Ebene 1 drei Einheiten hatte. Also kann a1 hier, nur zur Veranschaulichung, 0,2, 0,7, 0,3 sein.
Als nächstes wäre die zweite versteckte Schicht, Schicht 2, dicht. Diesmal hat es eine Einheit und wieder die Sigmoid-Aktivierungsfunktion, und Sie können dann a2 berechnen, indem Sie diese Layer-2-Funktion auf die Aktivierungswerte von Layer 1 bis a1 anwenden. Dadurch erhalten Sie den Wert von a2 , der der Veranschaulichung halber vielleicht 0,8 ist.
Wenn Sie schließlich einen Schwellenwert von 0,5 festlegen möchten, können Sie einfach testen, ob a2 größer und gleich 0,5 ist, und y-hat entsprechend auf eins oder null positives oder negatives Kreuz setzen. So führen Sie mithilfe von TensorFlow Inferenzen im neuronalen Netzwerk durch.
Es gibt einige zusätzliche Details , auf die ich hier nicht eingegangen bin, z. B. wie man die TensorFlow-Bibliothek lädt und wie man auch die Parameter w und b des neuronalen Netzwerks lädt. Aber das besprechen wir im Labor. Bitte schauen Sie sich unbedingt das Labor an. Dies sind jedoch die wichtigsten Schritte für die Vorwärtsweitergabe bei der Berechnung von a1 und a2 und optional des Schwellenwerts a2.
Schauen wir uns ein weiteres Beispiel an und kehren zum Problem der Klassifizierung handgeschriebener Ziffern zurück. In diesem Beispiel ist x eine Liste der Pixelintensitätswerte. Also ist x gleich einem Numpy-Array dieser Liste von Pixelintensitätswerten. Um dann einen Schritt der Vorwärtsausbreitung zu initialisieren und auszuführen, ist Schicht 1 eine dichte Schicht mit 25 Einheiten und der Sigmoid-Aktivierungsfunktion. Anschließend berechnen Sie, dass a1 der auf x angewendeten Layer-1-Funktion entspricht. Um eine Inferenz durch die zweite Ebene zu erstellen und auszuführen, richten Sie Ebene 2 wie folgt ein und berechnen dann a2 als Ebene 2, die auf a1 angewendet wird. Schließlich ist Schicht 3 die dritte und letzte dichte Schicht. Schließlich können Sie optional den Schwellenwert a3 festlegen, um eine binäre Vorhersage für y-hat zu erstellen.
Das ist die Syntax für die Durchführung von Inferenzen in TensorFlow. Eine Sache, auf die ich kurz angespielt habe, ist die Struktur der Numpy-Arrays. TensorFlow behandelt Daten auf eine bestimmte Art und Weise, die unbedingt richtig behandelt werden muss. Schauen wir uns im nächsten Video an, wie TensorFlow mit Daten umgeht.
Daten in TensorFlow
In diesem Video möchte ich mit Ihnen Schritt für Schritt erklären, wie Daten in NumPy und in TensorFlow dargestellt werden. So können Sie bei der Implementierung neuer neuronaler Netze über einen konsistenten Rahmen verfügen, um darüber nachzudenken, wie Ihre Daten dargestellt werden sollen.
Eines der bedauerlichen Dinge an der Art und Weise, wie Dinge heute im Code gemacht werden, ist, dass NumPy vor vielen, vielen Jahren zum ersten Mal erstellt wurde und zu einer Standardbibliothek für lineare Algebra und Python wurde.
Und viel später hat das Google-Brain-Team, das Team, das ich gegründet und einst geleitet hatte, TensorFlow entwickelt. Daher gibt es leider einige Inkonsistenzen zwischen der Darstellung von Daten in NumPy und in TensorFlow. Es ist also gut, sich dieser Konventionen bewusst zu sein, damit Sie den richtigen Code implementieren und hoffentlich die Dinge in Ihren neuronalen Netzwerken zum Laufen bringen können.
Schauen wir uns zunächst an, wie TensorFlow Daten darstellt. Sehen wir uns an, Sie haben einen Datensatz wie diesen aus dem Kaffee-Beispiel. Ich habe erwähnt, dass du x wie folgt schreiben würdest. Warum hast du also diese doppelte eckige Klammer hier? Schauen wir uns an, wie NumPy Vektoren und Matrizen speichert. Falls Sie der Meinung sind, dass Matrizen und Vektoren komplizierte mathematische Konzepte sind, machen Sie sich darüber keine Sorgen. Wir gehen ein paar konkrete Beispiele durch und Sie werden alles tun können, was Sie mit Matrizen und Vektoren tun müssen, um Ihre Netzwerke zu implementieren.
Beginnen wir mit einem Beispiel für eine Matrix. Hier ist eine Matrix mit 2 Zeilen und 3 Spalten. Beachten Sie, dass es eine, zwei Zeilen und 1, 2, 3 Spalten gibt. Wir nennen das also eine 2 x 3-Matrix. Die Konvention lautet also, dass die Dimension der Matrix als Anzahl der Zeilen im Verhältnis zur Anzahl der Spalten geschrieben wird. Also im Code zum Speichern dieser Matrix, dieser 2 x 3-Matrix, schreibst du einfach x = np.array dieser Zahlen wie diese. Wo Sie feststellen, dass die eckige Klammer Ihnen sagt, dass 1 , 2, 3 die erste Zeile dieser Matrix und 4, 5, 6 die zweite Zeile dieser Matrix ist. Und dann gruppiert diese offene eckige Klammer die erste und die zweite Reihe zusammen. Dadurch wird x so gesetzt, dass es das Zahlenarray ist. Die Matrix ist also nur ein 2D-Array von Zahlen.
Schauen wir uns noch ein Beispiel an, hier habe ich eine weitere Matrix geschrieben. Wie viele Rollen und wie viele Spalten hat das? Nun, Sie können das als eine, zwei, drei, vier Zeilen zählen und es hat eine, zwei Spalten. Das ist also die Anzahl der Zeilen anhand der Spaltenmatrix, es ist also eine 4 x 2-Matrix. Um das im Code zu speichern, schreiben Sie x equals np.array und dann diese Syntax hier, um diese vier Matrixzeilen in der Variablen x zu speichern. Dadurch wird ein 2D-Array mit diesen acht Zahlen erstellt. Matrizen können unterschiedliche Dimensionen haben. Sie haben ein Beispiel für eine 2 x 3-Matrix und die 4 x 2-Matrix gesehen.
Eine Matrix kann auch andere Dimensionen wie 1 x 2 oder 2 x 1 haben. Beispiele dafür werden wir auf der nächsten Folie sehen. Was wir also zuvor getan haben, als wir x als Eingabe-Merkmalsvektoren festgelegt haben, war, x auf np.array mit zwei eckigen Klammern, 200, 17, zu setzen. Und dadurch wird eine 1 x 2-Matrix erstellt, die nur aus einer Zeile und zwei Spalten besteht.
Schauen wir uns ein anderes Beispiel an: Wenn Sie x als np.array definieren würden, aber jetzt so geschrieben, entsteht eine 2 x 1-Matrix mit zwei Zeilen und einer Spalte. Weil die erste Reihe nur die Zahl 200 und die zweite Reihe nur die Zahl 17 ist. Das hat also die gleichen Zahlen, aber in einer 2 x 1 statt einer 1 x 2-Matrix. Genug, dieses Beispiel oben wird auch als Zeilenvektor bezeichnet, ist ein Vektor, der nur eine einzelne Zeile ist. Und dieses Beispiel wird auch als Spaltenvektor bezeichnet, weil dieser Vektor nur eine einzige Spalte hat. Und der Unterschied zwischen der Verwendung doppelter eckiger Klammern wie dieser und einer einzelnen eckigen Klammer wie dieser besteht darin, dass die beiden Beispiele oben auf 2D-Arrays liegen, bei denen eine der Dimensionen zufällig 1 ist.
Dieses Beispiel führt zu einem 1D-Vektor. Das ist also nur ein 1D-Array, das keine Zeilen oder Spalten hat, obwohl wir konventionell x als Spalte wie diese rechts setzen können. Im Gegensatz zu dem, was wir zuvor im ersten Kurs gemacht hatten, nämlich x so mit einer einzigen eckigen Klammer zu schreiben. Und das führte zu dem, was in Python als 1D-Vektor statt einer 2D-Matrix bezeichnet wird. Und das ist technisch gesehen nicht 1 x 2 oder 2 x 1, es ist nur ein lineares Array ohne Zeilen oder Spalten, sondern nur eine Liste von Zahlen.
Während wir also im ersten Kurs, wenn wir mit linearer Regression und logistischer Regression arbeiten, diese 1D-Vektoren verwenden, um die Eingabemerkmale x darzustellen. Bei TensorFlow besteht die Konvention darin, Matrizen zur Darstellung der Daten zu verwenden. Und warum gibt es diese Wechselkonventionen? Nun, es stellt sich heraus, dass TensorFlow für die Verarbeitung sehr großer Datensätze konzipiert wurde. Durch die Darstellung der Daten in Matrizen anstelle von 1D-Arrays ist TensorFlow intern etwas recheneffizienter.
Wenn wir also zu unserem ursprünglichen Beispiel für das erste Training zurückkehren, Beispiel in diesem Datensatz mit Merkmalen 200°C in 17 Minuten, wurden wir so dargestellt. Das ist also eigentlich eine 1 x 2-Matrix, die zufällig eine Zeile und zwei Spalten hat, um die Zahlen 217 zu speichern.
Und falls das nach vielen Details und wirklich komplizierten Konventionen aussieht, machen Sie sich keine Sorgen, all das wird klarer. Und in den optionalen Labs und in den Praxislabors können Sie sich selbst von den konkreten Implementierungen des Codes überzeugen.
Zurück zu dem Code für die Durchführung zur Ausbreitung oder Beeinflussung im neuronalen Netzwerk. Wenn Sie berechnen, dass a1 der Ebene 1 entspricht, die auf x angewendet wird, was ist dann a1? Nun, a1 wird tatsächlich daran liegen, dass die drei Zahlen tatsächlich eine 1 x 3-Matrix sein werden. Und wenn Sie a1 ausdrucken, erhalten Sie so etwas wie tf.tensor 0.2, 0.7, 0.3 als Form von 1 x 3, 1, 3 bezieht sich darauf, dass es sich um eine 1 x 3-Matrix handelt. Und so sagt TensorFlow, dass es sich um eine Gleitkommazahl handelt, was bedeutet, dass es sich um eine Zahl handelt, für die ein Dezimaltrennzeichen verwendet werden kann , indem 32 Bit Speicher in Ihrem Computer verwendet werden. Dort befindet sich der Float 32.
Und was ist der Tensor? Ein Tensor ist hier ein Datentyp, den das TensorFlow-Team erstellt hat, um Berechnungen an Matrizen effizient zu speichern und auszuführen. Wenn Sie also Tensor sehen, denken Sie einfach an die Matrix auf diesen wenigen Folien. Technisch gesehen ist ein Tensor etwas allgemeiner als die Matrix, aber für die Zwecke dieses Kurses sollten Sie sich den Tensor nur als eine Art der Darstellung von Matrizen vorstellen.
Denken Sie daran, dass ich zu Beginn dieses Videos gesagt habe, dass es die TensorFlow-Methode zur Darstellung der Matrix und die NumPy-Methode zur Darstellung der Matrix gibt. Dies ist ein Artefakt der Entstehungsgeschichte von NumPy und TensorFlow, und leider gibt es zwei Möglichkeiten, eine Matrix darzustellen, die in diese Systeme integriert wurden. Und wenn Sie a1, einen Tensor, nehmen und ihn zurück in ein NumPy-Array konvertieren möchten, können Sie dies mit dieser Funktion a1.numpy tun. Und es nimmt dieselben Daten und gibt sie in Form eines NumPy-Arrays und nicht in Form eines TensorFlow-Arrays oder einer TensorFlow-Matrix zurück.
Schauen wir uns nun an, wie die Aktivierungsausgabe der zweiten Ebene aussehen würde. Hier ist der Code, den wir von zuvor hatten, Schicht 2 ist eine dichte Schicht mit einer Einheit und Sigmoid-Aktivierung und a2 wird berechnet, indem Schicht 2 genommen und auf a1 angewendet wird, also was ist a2? A2, vielleicht eine Zahl wie 0,8 und technisch gesehen ist das eine 1 x 1-Matrix, ein 2D-Array mit einer Zeile und einer Spalte und entspricht also dieser Zahl 0,8. Und wenn Sie a2 ausdrucken, sehen Sie, dass es sich um einen TensorFlow-Tensor mit nur einem Element, einer Zahl 0,8, handelt und es sich um eine 1 x 1-Matrix handelt. Und wieder ist es eine Float32-Dezimalzahl, die 32 Bit im Computerspeicher einnimmt. Auch hier können Sie mit a2.numpy von einem Tensorflow-Tensor in eine NumPy-Matrix konvertieren, wodurch dies wieder in ein NumPy-Array umgewandelt wird, das so aussieht.
Das gibt Ihnen hoffentlich einen Eindruck davon, wie Daten in TensorFlow und in NumPy dargestellt werden. Ich bin es gewohnt, Daten in NumPy zu laden und Daten zu manipulieren, aber wenn Sie ein NumPy-Array an TensorFlow übergeben, konvertiert TensorFlow es gerne in sein eigenes internes Format. Der Tensor und dann effizient mit Tensoren arbeiten. Und wenn Sie die Daten wieder auslesen, können Sie sie als Tensor behalten oder wieder in ein NumPy-Array konvertieren.
Ich finde es ein bisschen bedauerlich, dass wir aufgrund der Entwicklungsgeschichte dieser Bibliotheken diese zusätzliche Konvertierungsarbeit durchführen mussten, obwohl die beiden Bibliotheken eigentlich recht gut zusammenarbeiten können. Aber wenn Sie hin und her konvertieren, egal ob Sie ein NumPy-Array oder einen Tensor verwenden, sollten Sie beim Schreiben von Code darauf achten.
Als Nächstes nehmen wir das, was wir gelernt haben, und setzen es zusammen, um tatsächlich ein neuronales Netzwerk aufzubauen. Sehen wir uns das im nächsten Video an.
Aufbau eines neuronalen Netzwerks
Sie haben also inzwischen eine Menge Tensor-Flow-Code gesehen und gelernt, wie man eine Ebene im Tensorflow erstellt und wie man eine Forward-Requisite durch eine einzelne Ebene im Tensorflow ausführt.
Und habe auch etwas über Daten in TensorFlow gelernt. Lassen Sie uns alles zusammenfassen und darüber sprechen, wie ein neuronales Netzwerk in TensorFlow aufgebaut wird. Dies ist auch das letzte Video zum Thema Tensorfluss für diese Woche.
Und in diesem Video lernst du auch eine andere Art, ein neuronales Netzwerk aufzubauen, die sogar ein bisschen einfacher sein wird als das, was du bisher gesehen hast. Lassen Sie uns also in das eintauchen, was Sie zuvor gesehen haben.
Wenn Sie Forward-Prop ausführen möchten, initialisieren Sie die Daten X, erstellen Ebene eins, berechnen dann eine Eins, erstellen dann Ebene zwei und berechnen eine Zwei. Dies war also eine explizite Methode, um die Vorwärtsstütze jeweils auf einer Berechnungsebene auszuführen.
Es stellt sich heraus, dass Tensor Flow sowohl Forward Prop als auch Lernen auf unterschiedliche Weise implementiert. Lassen Sie mich Ihnen eine andere Art zeigen, ein neuronales Netzwerk in TensorFlow aufzubauen.
Dies ist dieselbe wie zuvor, Sie erstellen Ebene eins und Ebene zwei. Aber jetzt, anstatt die Daten manuell zu nehmen und an Ebene eins zu übergeben und dann die Aktivierungen von Ebene eins zu nehmen und sie an Ebene zwei zu übergeben.
Stattdessen können wir Tensor Flow mitteilen, dass wir möchten, dass Schicht eins und Schicht zwei zu einem neuronalen Netzwerk zusammengefügt werden. Das macht die sequentielle Funktion in TensorFlow, sie heißt: Lieber TensorFlow, bitte erstelle ein neuronales Netzwerk für mich, indem du diese beiden Ebenen, die ich gerade erstellt habe, sequentiell aneinanderreihst.
Es stellt sich heraus, dass Tensorflow mit dem sequentiellen Framework viel Arbeit für Sie erledigen kann. Nehmen wir an, Sie haben links ein Trainingsset wie dieses. Das ist für das Kaffee-Beispiel. Sie können dann die Trainingsdaten als Eingaben X verwenden und sie in ein Numpy-Array einfügen. Dies hier ist eine Vier-mal-Zwei-Matrix und die Zielbeschriftungen. Y kann dann wie folgt geschrieben werden. Und das ist nur ein eindimensionales Array der Länge vier Y, dieser Satz von Zielen kann dann als 1D-Array wie dieses 1001 gespeichert werden, was vier Zugbeispielen entspricht. Und es stellt sich heraus, dass angesichts der Daten X und Y, die in dieser Matrix gespeichert sind, X und dieses Array Y ist.
Wenn Sie dieses neuronale Netzwerk trainieren möchten, müssen Sie nur Funktionen aufrufen und model dot compile mit einigen Parametern aufrufen. Wir werden nächste Woche mehr darüber sprechen, also mach dir vorerst keine Sorgen. Und dann müssen Sie das Model Dot Fit X Y aufrufen, was Tensor Flow anweist, dieses neuronale Netzwerk, das durch die sequentielle Aneinanderreihung der Schichten eins und zwei entsteht, mit den Daten X und Y zu trainieren.
Aber wir werden lernen, wie das geht, aber wir werden nächste Woche die Details dazu erfahren und dann endlich, wie Sie Inferenzen auf dieses neuronale Netzwerk ziehen? Wie macht man Forward-Prop, wenn man ein neues Beispiel hat, sagen wir X new, was ein NP-Array mit diesen beiden Funktionen ist, als Forward-Prop auszuführen, anstatt es eine Schicht nach der anderen selbst machen zu müssen, Sie müssen nur model predict auf X new aufrufen und dies gibt den entsprechenden Wert einer Zwei für Sie aus, wenn dieser Eingabewert von X gegeben ist. Das Modell sagt also voraus, führt eine Vorwärtspropagation durch und führt eine Inferenz für Sie durch, Sie haben mit der sequentiellen Funktion kompiliert.
Jetzt möchte ich diese drei Codezeilen überarbeiten und sie nur ein bisschen weiter vereinfachen, nämlich beim Codieren in Tensorflow. Konventionell weisen wir die beiden Ebenen nicht explizit zwei Variablen zu, Ebene eins und Ebene zwei, wie folgt. Aber laut Konvention würde ich normalerweise einfach einen Code wie diesen schreiben, wenn wir sagen, dass das Modell ein sequentielles Modell aus einigen aneinandergereihten Schichten ist. Sequentiell, wobei die erste Schicht eine dichte Schicht mit drei Einheiten und Aktivierung des Sigmoids und die zweite Schicht eine dichte Schicht mit einer Einheit und wiederum einer Sigmoid-Aktivierungsfunktion ist.
Wenn Sie sich also anderen Tensor-Flow-Code ansehen, sehen Sie oft, dass er eher so aussieht, als dass er diesen Layer-Eins- und Layer-2-Variablen explizit zugewiesen ist. Und das war’s. Dies ist so ziemlich der Code, den Sie benötigen, um in TensorFlow zu trainieren und auf ein neuronales Netzwerk zu schließen.
Wo wir nächste Woche noch einmal mehr über die Trainingsbits dieser beiden kombiniert werden, werden der Compiler und die Fit-Funktion kombiniert.
Lassen Sie uns dies auch für das Beispiel für die Ziffernklassifizierung wiederholen. Vorher hatten wir X, in dieser Eingabeschicht ist eins eine Ebene, der eins entspricht. Sie wollen auf X usw. über Schicht zwei und Schicht drei anwenden, um zu versuchen, eine Ziffer zu klassifizieren. Mit dieser neuen Codierungskonvention mit der Verwendung der sequentiellen Tensorflussfunktion können Sie stattdessen angeben, was Schicht eins, Schicht zwei, Schicht drei sind, und Tensor Flow anweisen, die Ebenen für Sie zu einem neuen Netzwerk zusammenzufügen und so wie zuvor. Anschließend können Sie die Daten in der Matrix speichern und die Kompilierungsfunktion ausführen und das Modell wie folgt anpassen. Dazu nächste Woche noch einmal mehr.
Um Schlüsse zu ziehen oder Vorhersagen zu treffen, können Sie die Modellprognose auf X verwenden, neu und ähnlich dem , was Sie zuvor mit dem Kaffee-Klassifikationsnetzwerk gesehen haben. Anstatt Schicht eins, Schicht zwei, Schicht drei zuzuweisen, explizit wie hier, würden wir diese Ebenen häufiger einfach nehmen und sie direkt in die sequentielle Funktion einfügen. Am Ende haben Sie also diesen kompakteren Code, der Tensor Flow einfach mitteilt, ein Modell für mich erstellt, das diese drei Ebenen sequentiell aneinanderreiht, und dann funktioniert der Rest des Codes genauso wie zuvor. So haben Sie in TensorFlow ein neuronales Netzwerk aufgebaut.
Jetzt weiß ich, dass, wenn Sie etwas über diese Techniken lernen, manchmal jemand Sie bittet, diese fünf Codezeilen zu implementieren, und dann tippen Sie fünf Codezeilen ein und dann gratuliert jemand mit nur fünf Codezeilen. Du hast dieses verrückte, komplizierte neuronale Netzwerk auf dem neuesten Stand der Technik gebaut und manchmal wunderst du dich, was genau habe ich mit nur diesen fünf Codezeilen gemacht?
Eine Sache, die Sie aus der Spezialisierung auf maschinelles Lernen mitnehmen sollten, ist die Fähigkeit, modernste Bibliotheken wie Tensor Flow zu verwenden, um Ihre Arbeit effizient zu erledigen. Aber ich möchte nicht wirklich, dass du einfach fünf Codezeilen aufrufst und nicht wirklich auch weißt, was der Code tatsächlich unter der Haube macht.
Im nächsten Video lasse ich Sie zurückgehen und Ihnen zeigen , wie Sie es selbst von Grund auf neu implementieren können. Vorwärtsverbreitung in Python, sodass Sie das Ganze in der Praxis selbst nachvollziehen können. Die meisten Ingenieure für maschinelles Lernen implementieren Forward Propagation nicht wirklich in Python, deshalb verwenden wir oft nur Bibliotheken wie Tensorflow und Pytorch, sondern weil ich möchte, dass Sie selbst verstehen, wie diese Algorithmen funktionieren, damit Sie selbst durchdenken können, was Sie möglicherweise ändern müssen, was wahrscheinlich funktioniert, was weniger wahrscheinlich ist.
Lassen Sie uns auch durchgehen, was Sie benötigen würden, um die Propagierung von Grund auf neu zu implementieren, denn selbst wenn Sie eine Bibliothek aufrufen und sie effizient laufen lassen und großartige Dinge in Ihrer Anwendung tun, möchte ich, dass Sie im Hinterkopf auch ein tieferes Verständnis dafür haben, was Ihr Code tatsächlich tut, sodass wir mit dem nächsten Video fortfahren können.
Vorwärtsstütze in einer einzigen Schicht
Wenn Sie die Forward-Propagierung selbst in Python von Grund auf neu implementieren müssten, wie würden Sie das tun und zusätzlich eine Intuition dafür gewinnen, was in Bibliotheken wie TensorFlow und PyTorch wirklich vor sich geht? Wenn Sie eines Tages beschließen, etwas noch Besseres als TensorFlow und PyTorch zu bauen, vielleicht haben Sie jetzt eine bessere Idee zu Hause. Ich empfehle den meisten Leuten nicht wirklich, dies zu tun. Aber vielleicht wird sich eines Tages jemand ein noch besseres Framework als TensorFlow und PyTorch einfallen lassen, und wer das tut, muss diese Dinge möglicherweise selbst von Grund auf neu implementieren.
Schauen wir uns das an, auf dieser Folie werde ich ziemlich viel Code durchgehen und Sie sehen diesen ganzen Code später im optionalen Lab wieder, genau wie im Übungslabor. Machen Sie sich also keine Sorgen, dass Sie sich zu jeder Codezeile Notizen machen oder jede Codezeile auswendig lernen müssen. Sie sehen diesen Code im Jupiter-Notizbuch im Labor aufgeschrieben und das Ziel dieses Videos ist es, Ihnen nur den Code zu zeigen, um sicherzustellen, dass Sie verstehen, was er tut. Wenn Sie also zum optionalen Labor und zum Übungslabor gehen und den Code dort sehen, wissen Sie, was zu tun ist. Machen Sie sich also keine Gedanken darüber, sich zu jeder Zeile detaillierte Notizen zu machen.
Wenn Sie den Code auf dieser Folie durchlesen und verstehen können, was er bewirkt, ist das alles, was Sie brauchen. Schauen wir uns also an, wie Sie Forward Prop in einer einzigen Ebene implementieren. Wir werden weiterhin das hier gezeigte Kaffeeröstmodell verwenden. Und schauen wir uns an, wie Sie einen Eingabe-Feature-Vektor x verwenden und Forward Prop implementieren würden, um diese Ausgabe a2 zu erhalten.
In dieser Python-Implementierung werde ich 1D-Arrays verwenden, um all diese Vektoren und Parameter darzustellen, weshalb es hier nur eine einzige eckige Klammer gibt. Dies ist eher ein 1D-Array in Python als eine 2D-Matrix, wie wir sie hatten, als wir doppelte eckige Klammern hatten. Der erste Wert, den Sie berechnen müssen, ist also ein Super-Strip-Wert der eckigen Klammer 1, der der erste Aktivierungswert von a1 ist und das ist g dieses Ausdrucks hier. Deshalb werde ich auf dieser Folie die Konvention verwenden, dass ich einen Begriff wie w2, 1 als Variable darstelle und dann 1 indiziere. Dieser Unterstrich eins bezeichnet den Index Eins, bezeichnet den Index eins, also bedeutet w2 eine hochgestellte 2 in eckigen Klammern und dann den Index 1. Um a1_1 zu berechnen, haben wir also die Parameter w1_1 und b1_1, die sagen wir 1_2 und -1 sind. Sie würden dann z1_1 als Punktprodukt zwischen diesem Parameter w1_1 und der Eingabe x berechnen und zu b1_1 addieren und schließlich ist a1_1 gleich g, der Sigmoidfunktion, die auf z1_1 angewendet wird. Als Nächstes berechnen wir a1_2, was wiederum nach der Konvention, die ich hier beschrieben habe, a1_2 sein wird, geschrieben so. So ähnlich wie wir es auf der linken Seite gemacht haben, w1_2 besteht aus zwei Parametern -3, 4, b1_2 ist der Term, b 1, 2 da drüben, also berechnet man z als diesen Term in der Mitte und wendet dann die Sigmoidfunktion an und dann hat man am Ende ein 1_2, und schließlich macht man dasselbe, um a1_3 zu berechnen.
Jetzt haben Sie diese drei Werte berechnet, a1_1, a1_2 und a1_3, und wir möchten diese drei Zahlen zu einem Array zusammenfassen, sodass Sie hier oben a1 erhalten, was die Ausgabe der ersten Ebene ist. Und das tun Sie, indem Sie sie mit einem np-Array wie folgt gruppieren.
Jetzt haben Sie a_1 berechnet, lassen Sie uns auch die zweite Ebene implementieren. Sie berechnen also die Ausgabe a2, also a2 wird mit diesem Ausdruck berechnet und wir hätten die Parameter w2_1 und b2_1, die diesen Parametern entsprechen. Und dann würdest du z als Punktprodukt zwischen w2_1 und a1 berechnen und b2_1 hinzufügen und dann die Sigmoid-Funktion anwenden, um a2_1 zu erhalten, und das war’s, so implementierst du Forward Prop nur mit Python und np.
Nun, auf dieser Code-Seite, die Sie gerade gesehen haben, gibt es viele Ausdrücke. Schauen wir uns im nächsten Video an, wie Sie dies vereinfachen können, um Forward-Prop für ein allgemeineres neuronales Netzwerk zu implementieren, anstatt es für jedes einzelne Neuron hart zu codieren, wie wir es gerade getan haben. Schauen wir uns das also im nächsten Video an.
Allgemeine Implementierung der Vorwärtsausbreitung
Im letzten Video haben Sie gesehen, wie Forward-Prop in Python implementiert wird, aber indem Sie Codezeilen für jedes einzelne Neuron fest codieren.
Schauen wir uns nun die allgemeinere Implementierung von Forward Prop in Python an. Ähnlich wie im vorherigen Video ist es mein Ziel in diesem Video, Ihnen den Code zu zeigen, damit Sie wissen, wie er zu interpretieren ist, wenn Sie ihn in ihrem Übungslabor und in den optionalen Labs erneut sehen.
Machen Sie sich beim Durchgehen dieses Beispiels keine Gedanken darüber, sich zu jeder einzelnen Codezeile Notizen zu machen. Wenn du den Code durchlesen und verstehen kannst, reicht das definitiv aus.
Sie können eine Funktion schreiben, um eine dichte Schicht zu implementieren , also eine einzelne Schicht eines neuronalen Netzwerks. Ich werde die Dichtefunktion definieren, die als Eingabe die Aktivierung der vorherigen Schicht sowie die Parameter w und b für die Neuronen in einer bestimmten Schicht verwendet.
Um das Beispiel aus dem vorherigen Video zu verwenden: Wenn Schicht 1 drei Neuronen hat und wenn w_1 und w_2 und w_3 diese sind, stapeln wir all diese Wellenvektoren zu einer Matrix. Dies wird eine Matrix von zwei mal drei sein, wobei die erste Spalte der Parameter w_1,1, die zweite Spalte der Parameter w_1 , 2 und die dritte Spalte der Parameter w_1,3 ist. Auf ähnliche Weise, wenn Sie die Parameter be, b_1,1 gleich negativ eins, b_1,2 gleich eins usw. haben, dann werden wir diese drei Zahlen wie folgt zu einem 1D-Array b stapeln, negativ eins, eins, zwei. Die Dichtefunktion nimmt als Eingabe die Aktivierung aus der vorherigen Ebene, und a könnte hier a_0 sein, was gleich x ist, oder die Aktivierung von einer späteren Ebene sowie die in Spalten gestapelten w-Parameter, wie rechts gezeigt, sowie die b-Parameter, die ebenfalls in einem 1D-Array gestapelt sind, wie links dort gezeigt. Diese Funktion würde eine bis zur Aktivierung von der vorherigen Ebene eingeben und die Aktivierungen von der aktuellen Ebene ausgeben.
Lassen Sie uns den Code dafür Schritt für Schritt durchgehen. Hier ist der Code. Erstens entspricht die Einheit W.shape,1. W hier ist eine Matrix von zwei mal drei, also ist die Anzahl der Spalten drei. Das entspricht der Anzahl der Einheiten in dieser Ebene. Hier wären Einheiten gleich drei. Wenn Sie sich die Form von w ansehen, können Sie nur die Anzahl der versteckten Einheiten oder die Anzahl der Einheiten in dieser Ebene ermitteln. Als Nächstes setzen wir a auf ein Array von Nullen mit so vielen Elementen, wie es Einheiten gibt.
In diesem Beispiel müssen wir drei Aktivierungswerte ausgeben, also initialisiert dies einfach a mit Null, Null, Null, einem Array mit drei Nullen. Als Nächstes durchlaufen wir eine for-Schleife, um das erste , zweite und dritte Element von a zu berechnen. Für j in Bereichseinheiten geht j von Null auf Einheiten minus Eins. Es geht von 0, 1, 2, Indizierung von Null und Python wie gewohnt. Dieser Befehl w entspricht W Doppelpunkt Komma j, so ziehen Sie die j-te Spalte einer Matrix in Python heraus.
Beim ersten Durchlaufen dieser Schleife wird die erste Spalte von w und somit w_1,1 abgerufen. Beim zweiten Durchlaufen dieser Schleife, wenn Sie die Aktivierung der zweiten Einheit berechnen, wird die zweite Spalte, die w_1, 2 usw. entspricht, zum dritten Mal durch diese Schleife abgerufen. Dann berechnest du z mit der üblichen Formel, ist ein Punktprodukt zwischen diesem Parameter w und der Aktivierung, die du erhalten hast, plus b, j. Und dann berechnest du die Aktivierung a, j, gleich g, die Sigmoidfunktion, die auf z angewendet wird.
Dreimal durch diese Schleife und du berechnest sie, die Werte für alle drei Werte dieses Aktivierungsvektors sind a. Dann gibst du schließlich a zurück. Was die Dichtefunktion tut, ist, dass sie die Aktivierungen der vorherigen eingibt Ebene, und wenn die Parameter für die aktuelle Ebene gegeben sind, werden die Aktivierungen zurückgegeben für die nächste Schicht.
Angesichts der Dense-Funktion können Sie wie folgt einige dichte Schichten nacheinander aneinanderreihen, um Forward-Prop im neuronalen Netzwerk zu implementieren. Anhand der Eingabe-Features x können Sie dann die Aktivierungen a_1 so berechnen, dass a_1 gleich der Dichte von x, w_1, b_1 ist, wobei hier w_1, b_1 die Parameter sind, die manchmal auch als Gewichtungen der ersten versteckten Ebene bezeichnet werden. Dann kannst du a_2 als Dichte von jetzt a_1 berechnen, was du gerade oben berechnet hast. W_2, b-2, was die Parameter oder Gewichte dieser zweiten versteckten Schicht sind. Dann berechne a_3 und a_4. Wenn das ein neuronales Netzwerk mit vier Schichten ist, dann definiere, dass f von x gerade gleich a_4 ist, und so gibst du f von x zurück.
Beachten Sie, dass ich hier W verwende, weil nach den Notationskonventionen der linearen Algebra Groß- oder Großbuchstaben verwendet werden, wenn es sich auf eine Matrix bezieht und Kleinbuchstaben auf Vektoren und Skalare. Weil es also eine Matrix ist, ist das W. Das ist alles.
Sie wissen jetzt, wie Sie Forward Prop von Grund auf selbst implementieren können. Sie können den ganzen Code sehen und ausführen und ihn selbst im Übungslabor üben, wobei Sie auch darauf vorbereitet sind.
Ich denke, selbst wenn Sie leistungsstarke Bibliotheken wie TensorFlow verwenden, ist es hilfreich zu wissen, wie es unter der Haube funktioniert. Denn falls etwas schief geht, falls etwas sehr langsam läuft oder Sie ein seltsames Ergebnis haben oder es so aussieht, als ob ein Fehler vorliegt, werden Sie durch Ihre Fähigkeit zu verstehen, was tatsächlich vor sich geht, beim Debuggen Ihres Codes viel effektiver.
Wenn ich die meiste Zeit Algorithmen für maschinelles Lernen ausführe, funktioniert das ehrlich gesagt nicht. Sophie, nicht das erste Mal. Ich finde, dass meine Fähigkeit, meinen Code als TensorFlow-Code oder etwas anderes zu debuggen, wirklich wichtig ist, um ein effektiver Ingenieur für maschinelles Lernen zu sein.
Selbst wenn Sie TensorFlow oder ein anderes Framework verwenden, hoffe ich, dass Sie dieses tiefere Verständnis für Ihre eigenen Anwendungen und auch für das Debuggen Ihrer eigenen Algorithmen für maschinelles Lernen nützlich finden. Das ist alles. Das ist das letzte erforderliche Video dieser Woche mit Code darin.
Im nächsten Video möchte ich mich mit einem meiner Meinung nach unterhaltsamen und faszinierenden Thema befassen, nämlich, welche Beziehung zwischen neuronalen Netzwerken und KI oder AGI, künstlicher allgemeiner Intelligenz, besteht? Dies ist ein kontroverses Thema, aber weil es so viel diskutiert wurde, möchte ich Ihnen einige Gedanken dazu mitteilen.
Wenn Sie gefragt werden, befinden sich neuronale Netze überhaupt auf dem Weg zur Intelligenz auf menschlicher Ebene? Sie haben einen Rahmen, um über diese Frage nachzudenken. Schauen wir uns dieses lustige Thema, glaube ich, im nächsten Video an.
Gibt es einen Weg zum AGI?
Seit ich ein Teenager war und anfing, mit neuronalen Netzwerken herumzuspielen, hatte ich das Gefühl, dass der Traum, vielleicht eines Tages ein KI-System zu bauen , das so intelligent ist wie ich oder so intelligent wie ein typischer Mensch , einer der inspirierendsten Träume von KI war. Ich halte diesen Traum heute noch am Leben.
Aber ich denke, dass der Weg dorthin nicht klar ist und sehr schwierig sein könnte. Ich weiß nicht, ob wir nur Jahrzehnte brauchen würden und ob wir noch zu unseren Lebzeiten Durchbrüche erleben werden oder ob es Jahrhunderte oder sogar länger dauern kann, bis wir dorthin gelangen.
Werfen wir einen Blick darauf, wie dieser AGI, der Traum von künstlicher allgemeiner Intelligenz, aussieht, und spekulieren wir ein wenig darüber, welche möglichen Wege, unklare Pfade, schwierige Wege sein könnten, um eines Tages dorthin zu gelangen. Ich denke, es gab eine Menge unnötigen Hype um AGI oder künstliche allgemeine Intelligenz.
Vielleicht ist ein Grund dafür, dass KI tatsächlich zwei sehr unterschiedliche Dinge beinhaltet. Eines davon ist ANI, was für Artificial Narrow Intelligence steht. Dabei handelt es sich um ein KI-System, das eine Sache, eine enge Aufgabe, manchmal sehr gut erledigt und unglaublich wertvoll sein kann, wie z. B. der intelligente Lautsprecher oder die Suche nach selbstfahrenden Autos oder im Internet oder KI, die auf bestimmte Anwendungen wie Landwirtschaft oder Fabriken angewendet wird.
In den letzten Jahren hat ANI enorme Fortschritte gemacht und, wie Sie wissen, einen enormen Wert in der heutigen Welt geschaffen. Da ANI ein Teilbereich der KI ist, ist es aufgrund der schnellen Fortschritte bei ANI logischerweise wahr, dass KI in den letzten zehn Jahren auch enorme Fortschritte gemacht hat.
Bei KI gibt es eine andere Idee, nämlich AGI, künstliche allgemeine Intelligenz. Es besteht die Hoffnung, KI-Systeme zu entwickeln , die alles können, was ein typischer Mensch tun kann.
Trotz all der Fortschritte bei ANI und damit enormen Fortschritten bei der KI bin ich mir nicht sicher, wie viele Fortschritte wir tatsächlich in Richtung AGI machen. Ich denke, all die Fortschritte bei ANI haben die Menschen zu dem richtigen Schluss gebracht, dass es enorme Fortschritte in der KI gibt.
Aber das hat einige Leute zu dem Schluss gebracht, ich denke fälschlicherweise, dass viele Fortschritte in der KI zwangsläufig bedeuten, dass es große Fortschritte in Richtung AGI gibt. Wenn Sie mehr über KI und AGI wissen, vielleicht finden Sie es manchmal nützlich, dieses Bild zu zeichnen, um einige der Dinge zu erklären, die auch in der KI vor sich gehen, und einige der Quellen unnötigen Hypes um AGI zu erklären.
Mit dem Aufkommen des modernen Deep Learning haben wir begonnen, Neuronen zu simulieren, und mit immer schnelleren Computern und sogar GPUs können wir noch mehr Neuronen simulieren. Ich denke, vor vielen Jahren gab es die große Hoffnung, Junge, wenn wir nur viele Neuronen simulieren könnten, dann können wir das menschliche Gehirn oder so etwas wie ein menschliches Gehirn simulieren und wir haben wirklich intelligente Systeme. Leider hat sich herausgestellt, dass es nicht ganz so einfach ist. Ich denke, zwei Gründe dafür sind erstens: Wenn Sie sich die künstlichen neuronalen Netzwerke ansehen, die wir bauen, sind sie so einfach, dass eine logistische Regressionseinheit wirklich nichts mit dem zu tun hat, was ein biologisches Neuron tut, so viel einfacher ist als das, was irgendein Neuron in deinem oder meinem Gehirn tut.
Zweitens glaube ich, dass wir bis heute fast keine Ahnung haben, wie das Gehirn funktioniert. Es gibt immer noch grundlegende Fragen dazu, wie genau ein Neuron von Eingängen zu Ausgaben abbildet, die wir heute einfach nicht kennen. Der Versuch, das in einem Computer zu simulieren, geschweige denn eine einzelne logistische Funktion, ist weit von einem genauen Modell dessen entfernt, was das menschliche Gehirn tatsächlich tut. Angesichts unseres derzeit und wahrscheinlich in naher Zukunft sehr begrenzten Verständnisses der Funktionsweise des menschlichen Gehirns denke ich, dass der Versuch, das menschliche Gehirn als Weg zu AGI zu simulieren, ein unglaublich schwieriger Weg sein wird.
Besteht jedoch die Hoffnung, noch zu unseren Lebzeiten Durchbrüche bei AGI zu erzielen? Lassen Sie mich einige Beweise mit Ihnen teilen, die mir helfen, diese Hoffnung zumindest für mich selbst am Leben zu erhalten.
Es wurden einige faszinierende Experimente an Tieren durchgeführt, die zeigen oder stark darauf hindeuten, dass dasselbe Stück biologischen Gehirngewebes eine überraschend breite Palette von Aufgaben erfüllen kann. Dies hat zu der Hypothese eines einzigen Lernalgorithmus geführt, dass möglicherweise viel Intelligenz auf einen oder eine kleine Handvoll Lernalgorithmen zurückzuführen sein könnte.
Wenn wir nur herausfinden könnten , was diese eine oder kleine Handvoll Algorithmen sind, könnten wir sie vielleicht eines Tages in einem Computer implementieren.
Lassen Sie mich einige Details dieser Experimente mit Ihnen teilen. Dies ist ein Ergebnis von Roe et al. von vor vielen Jahrzehnten. Der hier gezeigte Teil Ihres Gehirns ist Ihr auditiver Kortex, und Ihr Gehirn ist so verkabelt, dass es Signale von Ihren Ohren in Form von elektrischen Impulsen weiterleitet, je nachdem, welches Geräusch Ihr Ohr wahrnimmt, an diesen Hörkortex. Es stellt sich heraus, dass, wenn man das Gehirn eines Tieres neu verkabelt, also den Draht zwischen dem Ohr und der Hörrinde durchtrennt und stattdessen Bilder in die Hörrinde einspeist, die Hörrinde lernt zu sehen. Auditiv bezieht sich auf Geräusche, und so lernt dieser Teil des Gehirns, zu dem die meisten Menschen lernen, hier, wenn ihm verschiedene Daten zugeführt werden, stattdessen zu sehen.
Hier ist ein weiteres Beispiel. Dieser Teil Ihres Gehirns ist Ihr somatosensorischer Kortex, somatosensorisch bezieht sich auf die Berührungsverarbeitung. Wenn Sie das Gehirn auf ähnliche Weise neu verkabeln, um die Verbindung zwischen den Berührungssensoren und diesem Teil des Gehirns zu unterbrechen, und stattdessen das Gehirn neu verkabeln, um Bilder einzuspeisen, dann lernt der somatosensorische Kortex zu sehen. Es gab eine Reihe von Experimenten wie diesen, die zeigen, dass viele verschiedene Teile des Gehirns, nur je nachdem, welche Daten gegeben werden, lernen können zu sehen oder zu fühlen oder zu hören lernen, als ob es vielleicht einen Algorithmus gäbe, der nur abhängig von den Daten oder diesen Daten lernt, diese Eingaben entsprechend zu verarbeiten.
Es kommt vor , dass Systeme gebaut werden, die eine Kamera an der Stirn von jemandem montieren und sie einem Spannungsmuster in einem Gitter auf der Zunge zuordnen. Indem Sie ein Graustufenbild einem Spannungsmuster auf Ihrer Zunge zuordnen, können Menschen, die nicht zitiert werden, dabei helfen, mit Ihrer Zunge zu sehen, oder sie haben faszinierende Experimente mit menschlicher Echolokalisierung oder menschlichem Sonar durchgeführt, also Tiere wie Delfine und Fledermäuse verwenden Sonar, um zu sehen, und Forscher haben herausgefunden, dass Menschen manchmal ein gewisses Maß an menschlichem Echo lernen können, wenn man Menschen beibringt, Klickgeräusche zu machen und zu hören, wie das von der Umgebung abprallt. Standort.
Oder das ist ein haptischer Gürtel, und mein Forschungslabor in Stanford hat so etwas auch schon einmal gebaut, aber wenn man einen Ring aus Summen um die Taille legt und ihn mit einem Magnetkompass programmiert, so dass zum Beispiel die Buzzer in nördlichster Richtung immer langsam vibrieren, dann gewinnt man irgendwie einen Richtungssinn, den manche Tiere haben, Menschen aber nicht. Dann fühlt es sich an, als würdest du herumlaufen und du weißt einfach, wo der Norden ist, es fühlt sich nicht so an, als würde dieser Teil meiner Taille summen, es fühlt sich an, als ob, oh, ich weiß, wo der Norden ist.
Oder bei Operationen wird dem Frosch ein drittes Auge implantiert und das Gehirn lernt mit diesem Input einfach mit. Es gab eine Vielzahl von Experimenten wie diesen, die nur zeigen, dass das menschliche Gehirn erstaunlich anpassungsfähig ist, Neurowissenschaftler sagen, dass es erstaunlich plastisch ist, sie meinen nur anpassungsfähig an eine verwirrende Bandbreite von Sensoreingängen, und so stellt sich die Frage, ob dasselbe Stück Gehirngewebe lernen kann, zu sehen, zu berühren oder sogar andere Dinge, was ist der Durchschnitt der Benutzer, und können wir diesen Algorithmus replizieren und in einem Computer implementieren?
Mir tut der Frosch und andere Tiere leid, oder für welche diese Experimente gemacht wurden, obwohl ich die Schlussfolgerungen auch für ziemlich faszinierend halte. Bis heute denke ich, dass die Arbeit an AGI eines der faszinierendsten naturwissenschaftlichen und technischen Probleme aller Zeiten ist, und vielleicht entscheiden Sie sich eines Tages dafür, darüber zu forschen.
Ich denke jedoch, dass es wichtig ist, übertriebene Hypes zu vermeiden, ich weiß nicht, ob das Gehirn wirklich aus einem oder einer kleinen Handvoll Algorithmen besteht, und selbst wenn es so wäre, habe ich keine Ahnung, und ich glaube nicht, dass irgendjemand weiß, was der Algorithmus ist, aber ich habe immer noch diese Hoffnung und vielleicht ist sie es, und vielleicht könnten wir, durch viel harte Arbeit, eines Tages eine Annäherung daran finden. Ich finde es immer noch eines der faszinierendsten Themen, ich denke in meiner Freizeit wirklich darüber nach und vielleicht bist du eines Tages derjenige, der einen Beitrag zu diesem Problem leistet.
Kurzfristig denke ich, dass maschinelles Lernen und neuronale Netze auch ohne AGI ein sehr mächtiges Werkzeug sind, und selbst ohne zu versuchen, Intelligenz auf menschlicher Ebene aufzubauen, denke ich, dass neuronale Netzwerke ein unglaublich mächtiges und nützliches Set von Tools für Anwendungen sind, die Sie erstellen könnten.
Das war’s mit den erforderlichen Videos dieser Woche, herzlichen Glückwunsch, dass Sie diesen Punkt im Unterricht erreicht haben. Danach werden wir auch einige optionale Videos haben, um etwas tiefer in effiziente Implementierungen neuronaler Netzwerke einzutauchen. Insbesondere in den kommenden optionalen Videos möchte ich Ihnen einige Details zur Vektorisierung von Implementierungen neuronaler Netzwerke mitteilen. Ich hoffe, du schaust dir auch diese Videos an.
Wie neuronale Netzwerke effizient implementiert werden
Einer der Gründe, warum Deep-Learning-Forscher in den letzten zehn Jahren neuronale Netze skalieren konnten und in den letzten zehn Jahren für wirklich große neuronale Netze hielten, ist, dass neuronale Netzwerke vektorisiert werden können. Sie können mit Matrixmultiplikationen sehr effizient implementiert werden. Es stellt sich heraus, dass parallele Rechenhardware, einschließlich GPUs, aber auch einige CPU-Funktionen sehr gut darin sind, sehr große Matrixmultiplikationen durchzuführen. In diesem Video werden wir uns ansehen, wie diese vektorisierten Implementierungen neuronaler Netzwerke funktionieren. Ohne diese Ideen glaube ich nicht, dass Deep Learning heute auch nur annähernd erfolgreich und skalierbar wäre. Hier auf der linken Seite finden Sie den Code, den Sie zuvor gesehen haben, wie Sie Forward Prop oder Forward Propagation in einer einzigen Ebene implementieren würden. X hier ist die Eingabe, W, die Gewichte des ersten, zweiten und dritten Neurons, sagen wir, Parameter B, und dann ist das derselbe Code, den wir zuvor gesehen haben. Dadurch werden beispielsweise drei Zahlen ausgegeben. Wenn Sie diese Berechnung tatsächlich implementieren, erhalten Sie 1, 0, 1. Es stellt sich heraus, dass Sie eine vektorisierte Implementierung dieser Funktion wie folgt entwickeln können. Setze X so, dass es diesem Wert entspricht. Beachten Sie die doppelten eckigen Klammern. Dies ist jetzt ein 2D-Array, wie in TensorFlow. W ist das gleiche wie zuvor, und B, ich verwende jetzt B, ist auch ein 2D-Array mit dem Format Eins mal Drei. Dann stellt sich heraus, dass all diese Schritte, dieser für loop inside, durch nur ein paar Codezeilen ersetzt werden können, Z entspricht np.matmul. Mit Matmul führt NumPy die Matrixmultiplikation durch. Wobei X und W jetzt beide Matrizen sind, also multiplizierst du sie einfach miteinander. Es stellt sich heraus, dass diese for-Schleife, all diese Codezeilen durch nur ein paar Codezeilen ersetzt werden können, was eine vektorisierte Implementierung dieser Funktion ergibt. Sie berechnen Z, das jetzt wieder eine Matrix ist, als numpy.matmul zwischen A in und W, wobei hier A in und W beide Matrizen sind, und matmul ist, wie NumPy eine Matrizenmultiplikation durchführt. Es multipliziert zwei Matrizen miteinander und fügt dann die Matrix B hinzu. Dann ist A out gleich der Aktivierungsfunktion g , also der Sigmoidfunktion, elementweise auf diese Matrix Z angewendet, und dann gibst du schließlich A out zurück. So sieht der Code aus. Beachten Sie, dass in der vektorisierten Implementierung all diese Größen, x, das in den Wert von A eingegeben wird, sowie W, B sowie Z und A out, jetzt alle 2D-Arrays sind. All dies sind Matrizen. Dies stellt sich als sehr effiziente Implementierung eines Schritts der Vorwärtsausbreitung durch eine dichte Schicht im neuronalen Netzwerk heraus. Dies ist Code für eine vektorisierte Implementierung von Forward Prop in einem neuronalen Netzwerk. Aber was macht dieser Code und wie funktioniert er eigentlich? Was macht dieser Matmul eigentlich? In den nächsten beiden Videos, die beide ebenfalls optional sind, werden wir uns mit der Matrixmultiplikation und deren Funktionsweise befassen. Wenn Sie mit linearer Algebra vertraut sind, wenn Sie mit Vektoren, Matrizen, Transponierungen und Matrizenmultiplikationen vertraut sind, können Sie diese beiden Videos einfach schnell überfliegen und zum letzten Video dieser Woche springen. Im letzten Video dieser Woche, das ebenfalls optional ist, werden wir dann näher darauf eingehen, wie Matmul Ihnen diese vektorisierte Implementierung bietet. Gehen wir zum nächsten Video über, in dem wir uns ansehen, was Matrixmultiplikation ist.
Matrix-Multiplikation
Sie wissen, dass eine Matrix nur ein Block oder ein 2D-Array von Zahlen ist. Was bedeutet es, zwei Matrizen zu multiplizieren? Lass uns einen Blick darauf werfen. Um Matrizen zu multiplizieren, schauen wir uns zunächst an, wie wir Punktprodukte zwischen Vektoren verwenden. Nehmen wir als Beispiel das Punktprodukt zwischen diesem Vektor 1, 2 und diesem Vektor 3, 4. Wenn z das Punktprodukt zwischen diesen beiden Vektoren ist, berechnen Sie z, indem Sie hier das erste Element mit dem ersten Element multiplizieren , es ist 1 mal 3 plus das zweite Element plus 2 mal 4, und das ist also nur 3 plus 8, was 11 entspricht. Im allgemeineren Fall, wenn z das Punktprodukt zwischen einem Vektor a und einem Vektor w ist, berechnen Sie z, indem Sie das erste Element miteinander und dann die zweiten Elemente und das dritte usw. multiplizieren und dann all diese Produkte addieren. Das ist das Vektor-Vektor-Punkt-Produkt. Es stellt sich heraus, dass es eine andere äquivalente Art gibt, ein Punktprodukt zu schreiben , die einem Vektor a gegeben hat, also 1, 2, geschrieben als Spalte. Sie können daraus eine Reihe machen. Das heißt, Sie können ihn von einem sogenannten Spaltenvektor in einen Zeilenvektor umwandeln, indem Sie die Transponierung von a nehmen. Die Transponierung des Vektors a bedeutet, dass Sie diesen Vektor nehmen und seine Elemente wie folgt auf die Seite legen. Es stellt sich heraus, dass, wenn Sie eine Transponierung multiplizieren, dies ein Zeilenvektor ist, oder Sie können sich dies als eine Eins-mal-Zwei-Matrix mit w vorstellen, die Sie sich jetzt als Zweimal-Eins-Matrix vorstellen können. Dann ist z gleich einer Transponierung mal w und das ist dasselbe, als würde man das Punktprodukt zwischen a und w nehmen. Um es noch einmal zusammenzufassen, z ist gleich dem Punktprodukt zwischen a und w, wie z einer Transponierung entspricht, das heißt, ein auf die Seite gelegtes, multipliziert mit w, und das wird nützlich sein, um die Matrixmultiplikation zu verstehen. Dass dies nur zwei Arten sind, dieselbe Berechnung zu schreiben, um zu z zu kommen. Schauen wir uns nun die Vektormatrixmultiplikation an , bei der Sie einen Vektor nehmen und einen Vektor mit einer Matrix multiplizieren. Auch hier ist der Vektor a 1, 2 und eine Transponierung wird auf die Seite gelegt. Stellen Sie sich das also nicht als Zweimal-Eins-Matrix vor, sondern wird zu einer Eins-mal-Zwei-Matrix. Lassen Sie mich nun eine Zweimal-Zwei-Matrix w mit diesen vier Elementen erstellen, 3, 4, 5, 6. Wenn Sie Z als Transponierung mal w berechnen möchten, schauen wir uns an, wie Sie dabei vorgehen. Es stellt sich heraus, dass Z eine Eins-mal-Zweimatrix sein wird, und um den ersten Wert von Z zu berechnen, nehmen wir hier eine Transponierung, 1, 2, und multiplizieren diese mit der ersten Spalte von w, das sind 3, 4. Um das erste Element von Z zu berechnen, erhalten Sie am Ende 1 mal 3 plus 2 mal 4, was, wie wir zuvor gesehen haben, gleich 11 ist, also ist das erste Element von Z 11. Lassen Sie uns herausfinden, was das zweite Element von Z ist. Es stellt sich heraus, dass Sie diesen Vorgang einfach wiederholen, aber jetzt eine Transponierung mit der zweiten Spalte von w multiplizieren. Für diese Berechnung haben Sie 1 mal 5 plus 2 mal 6, was 5 plus 12 entspricht, was 17 ist. Das entspricht 17. Z ist gleich dieser Eins-mal-Zweier-Matrix, 11 und 17. Nun noch eine letzte Sache, und dann kommen wir zum Ende dieses Videos, in dem es darum geht, wie man die Vektormatrixmultiplikation auf die Matrixmultiplikation verallgemeinert. Ich habe eine Matrix A mit diesen vier Elementen, die erste Spalte ist 1, 2 und die zweite Spalte ist negativ 1, negativ 2 und ich möchte wissen, wie man eine Transponierung mal w berechnet. Im Gegensatz zur vorherigen Folie ist A jetzt eine Matrix und nicht nur der Vektor oder die Matrix ist nur eine Menge verschiedener Vektoren, die in Spalten gestapelt sind. Lassen Sie uns zunächst herausfinden, was eine A-Transponierung ist. Um die A-Transponierung zu berechnen, nehmen wir die Spalten von A und ähnlich wie beim Transponieren eines Vektors nehmen wir die Spalten und legen sie eine Spalte nach der anderen auf die Seite. Die erste Spalte 1, 2 wird zur ersten Zeile 1, 2, lassen Sie uns einfach auf die Seite legen, und diese zweite Spalte, negativ 1, negativ 2, wird auf die Seite negativ 1, negativ 2 gelegt, so wie hier. Die Art und Weise, wie Sie eine Matrix transponieren, ist, dass Sie die Spalten nehmen und die Spalten einfach eine Spalte nach der anderen auf die Seite legen. Am Ende ist dies eine A-Transponierung. Als nächstes haben wir diese Matrix W, die als 3,4, 5,6 geschrieben wird. Es gibt eine Spalte 3, 4 und die Spalte 5, 6. Eine Möglichkeit, ich ermutige Sie, an Matrizen zu denken. Zumindest für die Implementierung neuronaler Netzwerke ist es nützlich, wenn Sie eine Matrix sehen, an die Spalten der Matrix denken und wenn Sie die Transponierung einer Matrix sehen, sich die Zeilen dieser Matrix als gruppiert vorstellen, wie hier dargestellt, mit A- und A-Transponierung sowie W. Lassen Sie mich nun zeigen, wie man A-Transponierung und W multipliziert. Um diese Berechnung durchzuführen, lassen Sie mich die Spalten von A, a_1 und a_2 aufrufen. und das bedeutet, dass a_1-Transponierung die erste Zeile von A-Transponierung ist und a_2-Transponierung die zweite Zeile von A ist transponieren. Lassen Sie mich dann wie zuvor die Spalten von W als w_1 und w_2 bezeichnen. Es stellt sich heraus, dass wir zur Berechnung der A-Transponierung W zunächst die zweite Zeile von A ignorieren und einfach auf die erste Zeile von A achten müssen. Nehmen wir diese Zeile 1, 2, also a_1, transponieren und multiplizieren wir sie mit W. Sie wissen bereits von der vorherigen Folie, wie das geht. Das erste Element ist 1, 2, inneres Produkt oder Punktprodukt, wir haben 3, 4. Das ergibt 3 mal 1 plus 2 mal 4, was 11 ist. Dann ist das zweite Element 1, 2 Eine Transponierung, das innere Produkt haben wir 5, 6. Es gibt 5 mal 1 plus 6 mal 2, was 5 plus 12 ist, was 17 ist. Das ergibt, dass die erste Zeile von Z gleich A-Transponierung W ist. Wir haben lediglich a_1-Transponierung genommen und mit W multipliziert. Das ist genau das, was wir auf der vorherigen Folie gemacht haben. Als Nächstes vergessen wir a_1 für den Moment und schauen wir uns a_2 an und nehmen die a_2-Transponierung und multiplizieren das mit W. Jetzt haben wir a_2-Transponierung mal W. Um das zuerst zu berechnen, nehmen wir negativ 1 und negativ 2 und addieren das Produkt mit 3, 4. Das ist minus 1 mal 3 plus minus 2 mal 4 und das stellt sich als minus 11 heraus. Dann müssen wir a_2 mal die zweite Spalte transponieren und haben minus 1 mal 5 plus minus 2 mal 6, und das ergibt minus 17. Am Ende erhalten Sie eine Transponierung von A mal W entspricht dieser Zweimal-Zwei-Matrix hier. Lassen Sie uns über die allgemeine Form der Matrixmatrixmultiplikation sprechen. Dies war ein Beispiel dafür, wie man einen Vektor mit einer Matrix multipliziert, oder eine Matrix mit einer Matrix besteht aus vielen Punktprodukten zwischen Vektoren, die jedoch auf eine bestimmte Weise angeordnet sind, um die Elemente des oberen Z zu konstruieren, ein Element nach dem anderen. Ich weiß, das war eine Menge, aber schauen wir uns im nächsten Video die allgemeine Form an, wie eine Matrixmatrixmultiplikation definiert ist, und ich hoffe, dass dies alles auch verdeutlicht. Gehen wir zum nächsten Video über.
Regeln für die Matrixmultiplikation
Schauen wir uns also die allgemeine Form an, wie Sie zwei Matrizen miteinander multiplizieren. Und dann, im letzten Video nach diesem, nehmen wir das und wenden es auf die vektorisierte Implementierung eines neuronalen Netzwerks an. Lass uns eintauchen. Hier ist die Matrix A, die eine 2 mal 3-Matrix ist, weil sie zwei Zeilen und drei Spalten hat. Nach wie vor ermutige ich Sie, sich die Spalten dieser Matrix als drei Vektoren vorzustellen, die Vektoren a1, a2 und a3. Und was wir tun werden, ist eine A-Transponierung zu nehmen und das mit der Matrix W zu multiplizieren. Die erste, was ist eine A-Transponierung? Nun, eine A-Transponierung erhält man, indem man die erste Spalte von A nimmt und sie so auf die Seite legt und dann die zweite Spalte von A nimmt und so auf seine Seite legt. Und dann die dritte Spalte von A und so auf der Seite liegen. Also sind diese Zeilen jetzt A1 transponieren, A2 transponieren und A3 transponieren. Als nächstes ist hier die Matrix W. Ich ermutige Sie, sich W als zusammengestapelte Faktoren w1, w2, w3 und w4 vorzustellen. Schauen wir uns also an, wie Sie dann die Transponierung von A mal W berechnen. Beachten Sie nun, dass ich auch leicht unterschiedliche Orangetöne verwendet habe, um die verschiedenen Spalten von A zu bezeichnen, wobei derselbe Farbton Zahlen entspricht, die wir als zu einem Vektor zusammengefasst betrachten. Und derselbe Farbton wird verwendet, um verschiedene Rollen der A-Transponierung anzuzeigen, da die verschiedenen Rollen der A-Transponierung A1-Transponierung, A2-Transponierung und A3-Transponierung sind. Und in ähnlicher Weise habe ich verschiedene Farbtöne verwendet, um die verschiedenen Spalten von W zu bezeichnen. Weil die Zahlen den gleichen Blauton haben, sind diejenigen, die zu den Vektoren w1, w 2 oder w3 oder w4 gruppiert sind. Schauen wir uns nun an, wie Sie A-Transponierung mal W berechnen können. Ich werde vertikale Bögen zu den verschiedenen Blautönen und horizontale Balken mit den verschiedenen Orangetönen zeichnen, um anzuzeigen, welche Elemente von Z, die eine A-Transponierung W sind, von den verschiedenen Rollen der A-Transponierung beeinflusst oder beeinflusst werden und welche von den verschiedenen Spalten von W beeinflusst oder beeinflusst werden. Schauen wir uns zum Beispiel die erste Spalte von W an. hellster Blauton hier. Also wird w1 diese erste Spalte von Z beeinflussen oder ihr entsprechen, die hier durch diesen helleren Blauton dargestellt ist. Und die Werte dieser zweiten Spalte von W, die w2 sind, wie durch diesen zweiten helleren Blauton angezeigt, wirken sich auf die Werte aus, die in die zweite Spalte von Z usw. für die dritte und vierte Spalte berechnet wurden. Schauen wir uns entsprechend die A-Transponierung an. Die A1-Transponierung ist die erste Zeile von A-Transponierung, was durch den hellsten Orangeton angezeigt wird, und die A1-Transponierung wirkt sich auf die Werte in der ersten Zeile von Z aus oder beeinflusst sie oder entspricht ihnen. Lassen Sie uns also herausfinden, wie die Matrix Z berechnet wird, die eine 3 mal 4-Matrix sein wird. Also mit insgesamt 12 Zahlen. Lassen Sie uns anfangen und herausfinden, wie die Zahl in der ersten Zeile, in der ersten Spalte von Z, berechnet wird. Also dieses obere linke Element hier, weil dies die erste Zeile und erste Spalte ist, die dem helleren Orangeton und dem helleren Blauton entsprechen. Sie berechnen das, indem Sie die erste Zeile einer Transponierung und die erste Spalte von W nehmen und ihr inneres Produkt oder das Produkt nehmen. Diese Zahl wird also ein (1,2) Punktprodukt mit (3,4) sein, was (1 * 3) + (2 * 4) = 11 ist. Schauen wir uns das zweite Beispiel an. Wie würdest du dieses Element von Z berechnen ? Das ist also in der dritten Zeile, Zeile 1, Zeile 2, Zeile 3. Das ist also in Zeile 3 und der zweiten Spalte, Spalte 1, Spalte 2. Um also die Zahl in Zeile 3, Spalte 2 von Z zu berechnen, würden Sie jetzt Zeile 3 von A transponieren und Spalte 2 von W nehmen und diese addieren. Beachten Sie, dass dies dem dunkelsten Orangeton und dem zweithellsten Blauton entspricht. Und um dies zu berechnen, ist dies (0,1 * 5) + (0,2 * 6), was (0,5 + 1,2) ist, was 1,7 entspricht. Um also die Zahl in Zeile 3, Spalte 2 von Z zu berechnen, nimmst du die dritte Zeile, Zeile 3 einer Transponierung und Spalte 2 von W. Schauen wir uns ein weiteres Beispiel an und lass uns sehen, ob du das herausfinden kannst. Das ist Zeile 2, Spalte 3 der Matrix Z. Warum schauen Sie nicht nach, ob Sie herausfinden können, in welcher Zeile und in welcher Spalte das Punktprodukt zusammengefaßt werden soll und welche Zahl also in dieses Element dieser Matrix aufgenommen werden soll. Hoffentlich hast du das verstanden. Sie sollten Zeile 2 von A transponieren und Spalte 3 von W. Und wenn Sie das Produkt, das zusammen A2 ergibt, nehmen, ist die Transponierung w3 (-1 * 7) + (-2 * 8), was (-7 + -16) ist, was -23 entspricht. Und so berechnet man dieses Element der Matrix Z. Und es stellt sich heraus, dass, wenn man das für jedes Element der Matrix Z tut, man alle Zahlen in dieser Matrix berechnen kann, die sich als so herausstellt. Sie können das Video jederzeit anhalten, die Elemente auswählen und überprüfen, ob die Formel, die wir durchgegangen sind, Ihnen den richtigen Wert für Z liefert. Ich möchte nur auf eine letzte interessante Anforderung für die Multiplikation von Matrizen hinweisen, nämlich dass die X-Transponierung hier eine 3 mal 2-Matrix ist, weil sie 3 Zeilen und 2 Spalten hat, und W hier ist eine 2 mal 4-Matrix, weil sie 2 Zeilen und 4 Spalten hat. Eine Voraussetzung, um zwei Matrizen miteinander zu multiplizieren, ist, dass diese Zahl mit dieser Zahl übereinstimmen muss. Und das liegt daran, dass Sie nur Punktprodukte zwischen Vektoren verwenden können, die dieselbe Länge haben. Sie können also das Punktprodukt zwischen einem Vektor mit zwei Zahlen nehmen. Und das liegt daran, dass Sie das innere Produkt zwischen dem Vektor der Länge 2 nur mit einem anderen Vektor der Länge 2 verwenden können. Sie können beispielsweise nicht das innere Produkt zwischen einem Vektor der Länge 2 und einem Vektor der Länge 3 verwenden. Und deshalb ist die Matrixmultiplikation nur gültig, wenn die Anzahl der Spalten der ersten Matrix, also eine Transponierung hier, gleich der Anzahl der Rollen der zweiten Matrix ist, also der Anzahl der Rollen von W hier. Wenn Sie also während dieses Vorgangs Punktprodukte verwenden, verwenden Sie Punktprodukte von Vektoren derselben Größe. Und dann ist die andere Beobachtung, dass die Ausgabe Z einer Transponierung W entspricht. Die Abmessungen von Z sind 3 mal 4. Die Ausgabe dieser Multiplikation wird also dieselbe Anzahl von Zeilen wie die X-Transponierung und die gleiche Anzahl von Spalten wie W haben. Und das ist auch eine weitere Eigenschaft der Matrixmultiplikation. Das ist also Matrixmultiplikation. All diese Videos sind optional. Also danke, dass du mich dabei unterstützt hast. Und falls du später in dieser Woche Interesse hast, gibt es auch einige rein optionale Quizfragen, mit denen du noch mehr dieser Berechnungen selbst üben kannst. Lassen Sie uns einen Teil dessen, was wir über Matrixmultiplikation gelernt haben, auf die vektorisierte Implementierung eines neuronalen Netzwerks anwenden. Ich muss sagen, als ich die vektorisierte Implementierung zum ersten Mal verstanden habe, fand ich das wirklich cool. Ich implementiere selbst seit einiger Zeit neuronale Netzwerke ohne die vektorisierte Implementierung. Und als ich die vektorisierte Implementierung endlich verstand und sie zum ersten Mal auf diese Weise implementierte, lief sie unglaublich viel schneller als alles, was ich je zuvor gemacht habe. Und ich dachte, wow, ich wünschte, ich hätte das früher herausgefunden. Die vektorisierte Implementierung ist ein bisschen kompliziert, aber sie sorgt dafür, dass Ihre Netzwerke viel schneller laufen. Schauen wir uns das also im nächsten Video an
TensorFlow Implementierung
Willkommen zurück zur zweiten Woche dieses Kurses über fortgeschrittene Lernalgorithmen. Letzte Woche haben Sie gelernt, wie man Inferenzen im neuronalen Netzwerk durchführt. Diese Woche werden wir das Training eines neuronalen Netzwerks besprechen. Ich denke, es macht wirklich Spaß, deine eigenen Daten zu verwenden und dein eigenes neuronales Netzwerk darauf zu trainieren. Diese Woche schauen wir uns an, wie Sie das machen könnten. Lass uns eintauchen. Fahren wir mit unserem laufenden Beispiel für die handschriftliche Ziffernerkennung fort, bei der dieses Bild als Null oder Eins erkannt wird. Hier verwenden wir die neuronale Netzwerkarchitektur, die Sie letzte Woche gesehen haben, wo Sie ein Eingabe-X haben, das ist das Bild, und dann die erste versteckte Ebene aus 25 Einheiten, die zweite versteckte Schicht mit 15 Einheiten und dann eine Ausgabeeinheit. Wie würden Sie die Parameter dieses neuronalen Netzes trainieren, wenn Sie eine Reihe von Trainingsbeispielen mit Bildern X erhalten würden, wie dies auch beim Ground-Truth-Label Y der Fall war? Lassen Sie mich weitermachen und Ihnen den Code zeigen, den Sie in TensorFlow verwenden können, um dieses Netzwerk zu trainieren. In den nächsten Videos danach werden wir uns mit Details befassen, um zu erklären, was der Code tatsächlich tut. Das ist ein Code, den du schreibst. Dieser erste Teil kommt Ihnen vielleicht aus der Vorwoche bekannt vor, in der Sie TensorFlow bitten, diese drei Schichten eines neuronalen Netzwerks sequentiell miteinander zu verbinden. Die erste versteckte Schicht mit 25 Einheiten und Sigmoid-Aktivierung, die zweite versteckte Schicht und dann schließlich die Ausgabeschicht. Nichts Neues hier im Vergleich zu dem, was Sie letzte Woche gesehen haben. Im zweiten Schritt müssen Sie TensorFlow bitten, das Modell zu kompilieren. Der wichtigste Schritt, um TensorFlow mit der Kompilierung des Modells zu beauftragen, besteht darin, anzugeben, welche Verlustfunktion Sie verwenden möchten. In diesem Fall verwenden wir etwas, das der binären Crossentropie-Verlustfunktion entspricht. Im nächsten Video werden wir mehr darüber erfahren, was das wirklich ist. Nachdem Sie dann die Verlustfunktion angegeben haben, besteht der dritte Schritt darin, die Anpassungsfunktion aufzurufen, die TensorFlow anweist, das in Schritt 1 angegebene Modell unter Verwendung des Verlusts der Kostenfunktion, die Sie in Schritt 2 angegeben haben, an den Datensatz X, Y anzupassen. Im ersten Kurs, als wir über den Gradientenabstieg sprachen, mussten wir entscheiden, wie viele Schritte der Gradientenabstieg ausgeführt werden soll oder wie lange der Gradientenabstieg ausgeführt werden soll. Epochen ist also ein Fachbegriff für die Anzahl der Schritte von einen Lernalgorithmus wie Gradient Descent, den Sie vielleicht ausführen möchten. Das ist alles. Schritt 1 besteht darin, das Modell zu spezifizieren, das TensorFlow mitteilt, wie die Inferenz berechnet werden soll. Schritt 2 kompiliert das Modell mithilfe einer bestimmten Verlustfunktion, und Schritt 3 besteht darin, das Modell zu trainieren. So können Sie ein neuronales Netzwerk in TensorFlow trainieren. Wie immer hoffe ich, dass ihr nicht nur diese Codezeilen aufruft, um das Modell zu trainieren, sondern dass ihr auch versteht, was tatsächlich hinter diesen Codezeilen vor sich geht, sodass ihr es nicht einfach aufruft, ohne wirklich zu verstehen, was vor sich geht. Ich denke , das ist wichtig, denn wenn Sie einen Lernalgorithmus ausführen und dieser anfangs nicht funktioniert, können Sie mithilfe dieses konzeptionellen Rahmens dessen, was wirklich vor sich geht, debuggen, wenn Dinge nicht so funktionieren, wie Sie es erwarten. Lassen Sie uns nun zum nächsten Video übergehen, in dem wir uns eingehender damit befassen, was diese Schritte in der TensorFlow-Implementierung tatsächlich bewirken. Wir sehen uns im nächsten Video.
Details zur Ausbildung
Werfen wir einen Blick auf die Details dessen, was der TensorFlow-Code für das Training eines neuronalen Netzwerks tatsächlich tut. Lass uns eintauchen. Bevor wir uns mit den Details des Trainings in neuronalen Netzwerken befassen, sollten wir uns daran erinnern, wie Sie im vorherigen Kurs ein logistisches Regressionsmodell trainiert haben. Schritt 1 beim Erstellen eines logistischen Regressionsmodells bestand darin, anzugeben, wie die Ausgabe anhand des Eingabe-Features x und der Parameter w und b berechnet werden soll. Im ersten Kurs sagten wir, dass die logistische Regressionsfunktion f von x gleich G vorhersagt. Produkt X plus B, also die Sigmoidfunktion, die auf W.X plus B angewendet wurde. Wenn Z das Punktprodukt von W von X plus B ist 1 über 1 plus e zum negativen z, also bestand der erste Schritt darin, die Eingabe-/Ausgabefunktion der Logistik zu spezifizieren Regression, und das hängt sowohl von der Eingabe x als auch von den Parametern des Modells ab. Der zweite Schritt, den wir machen mussten, um das Alphabetisierungsregressionsmodell zu trainieren , bestand darin, die Verlustfunktion und auch die Kostenfunktion zu spezifizieren. Sie erinnern sich vielleicht, dass die Verlustfunktion besagte, wenn die religiöse Regression opus f von x und das Ground-Truth-Label die tatsächliche Bezeichnung und ein Trainingssatz y waren, dann war der Verlust in diesem einzelnen Trainingsbeispiel negativ y log f von x minus eins minus y mal log von eins minus f von x. Dies war ein Maß dafür, wie Nun, wird die logistische Regression an einem einzelnen Trainingsbeispiel x Komma y durchgeführt. Angesichts dieser Definition von a Verlustfunktion, dann definieren wir die Kostenfunktion, und die Kostenfunktion war eine Funktion der Parameter W und B, und das war nur der Durchschnitt, der aus den durchschnittlichen M-Gesamttrainingsbeispielen der Verlustfunktion berechnet wurde, berechnet anhand der M-Trainingsbeispiele X1, Y1 bis XMYM, und denken Sie daran, dass in der Konvention die Verlustfunktion eine Funktion der Ausgabe des Lernalgorithmus und des Ground-Truth-Labels ist, wie sie über ein einzelnes Trainingsbeispiel berechnet wurden wohingegen die Kostenfunktion J ein Durchschnitt der Verlustfunktion ist berechnet über deinen gesamten Trainingssatz. Das war der zweite Schritt dessen, was wir beim Aufbau der logistischen Regression getan haben. Dann bestand der dritte und letzte Schritt zum Trainieren eines logistischen Regressionsmodells darin, einen Algorithmus , insbesondere den Gradientenabstieg, zu verwenden, um die Kostenfunktion J von WB zu minimieren, um sie als Funktion der Parameter W und B zu minimieren. Wir minimieren die Kosten J als Funktion der Parameter, indem wir den Gradientenabstieg verwenden, wobei W minus die Lernrate Alpha mal die Ableitung von J in Bezug auf W aktualisiert wird. respektiere B. Wenn diese drei Schritte. Im ersten Schritt wird angegeben, wie die Ausgaben anhand der Eingabe X und der Parameter berechnet werden sollen, in Schritt 2 werden Verlust und Kosten angegeben, und in Schritt drei wird die Kostenfunktion minimiert, für die wir die logistische Regression trainiert haben. In denselben drei Schritten können wir ein neuronales Netzwerk in TensorFlow trainieren. Schauen wir uns nun an, wie sich diese drei Schritte dem Training eines neuronalen Netzwerks zuordnen lassen. Wir werden auf den nächsten drei Folien ausführlicher darauf eingehen, aber nur kurz. Der erste Schritt besteht darin, anzugeben, wie die Ausgabe anhand der Eingabe x und der Parameter W und B berechnet werden soll. Dies erfolgt mit diesem Codeausschnitt, der aus der letzten Woche bei der Spezifizierung des neuronalen Netzwerks bekannt sein sollte, und dies reichte tatsächlich aus, um die Berechnungen zu spezifizieren, die beispielsweise für die Vorwärtsausbreitung oder für den Inferenzalgorithmus erforderlich sind. Der zweite Schritt besteht darin, das Modell zu kompilieren und ihm mitzuteilen, welchen Verlust Sie verwenden möchten. Hier ist der Code, den Sie verwenden, um diese Verlustfunktion zu spezifizieren, bei der es sich um die binäre Kreuzentropieverlustfunktion handelt. Sobald Sie diesen Verlust angegeben haben, erhalten Sie anhand eines Durchschnitts über den gesamten Trainingssatz auch die Kostenfunktion für das neuronale Netzwerk. Schritt drei besteht darin, die Funktion aufzurufen, um zu versuchen, die Kosten als Funktion der Parameter des neuronalen Netzwerks zu minimieren. Schauen wir uns diese drei Schritte im Zusammenhang mit dem Training eines neuronalen Netzwerks genauer an. Geben Sie im ersten Schritt an, wie die Ausgabe anhand der Eingabe x und der Parameter w und b berechnet werden soll. Dieser Codeausschnitt spezifiziert die gesamte Architektur des neuronalen Netzwerks. Es sagt Ihnen, dass es 25 versteckte Einheiten in der ersten versteckten Ebene gibt, dann die 15 in der nächsten und dann eine Ausgabeeinheit und dass wir den Sigmoid-Aktivierungswert verwenden. Basierend auf diesem Codeausschnitt wissen wir auch, was die Parameter w1, v1 sind, aber die Parameter der ersten Ebene der zweiten Ebene und die Parameter der dritten Ebene. Dieser Codeausschnitt spezifiziert die gesamte Architektur des neuronalen Netzes und teilt TensorFlow daher alles mit, was es benötigt. Um die Ausgabe a 3 oder f von x als Funktion der Eingabe x und der Parameter zu berechnen, haben wir hier w l und b l geschrieben. Fahren wir mit Schritt 2 fort. Im zweiten Schritt müssen Sie angeben, was die Verlustfunktion ist. Das wird auch die Kostenfunktion definieren, mit der wir das neuronale Netzwerk trainieren. Für das Problem der handschriftlichen Ziffernklassifizierung, bei dem Bilder entweder eine Null oder eine Eins haben , das mit Abstand am häufigsten vorkommt, ist die zu verwendende Verlustfunktion, die wir für die logistische Regression hatten, negativ y log f von x minus 1 minus y mal log 1 minus f von x, wobei y das Ground-Truth-Label ist, manchmal auch als Zielbezeichnung y bezeichnet, und f von x ist jetzt die Ausgabe des neuronalen Netzwerks. In TensorFlow wird dies als binäre Kreuzentropieverlustfunktion bezeichnet. Woher kommt dieser Name? Nun, es stellt sich heraus, dass diese Funktion oben in der Statistik Kreuzentropie-Verlustfunktion genannt wird, also das bedeutet Kreuzentropie, und das Wort binär betont oder weist darauf hin, dass es sich um ein binäres Klassifikationsproblem handelt, weil jedes Bild entweder eine Null oder eine Eins ist. Die Syntax besteht darin, TensorFlow aufzufordern, das neuronale Netzwerk mithilfe dieser Verlustfunktion zu kompilieren. Ein weiterer historischer Hinweis: Carers war ursprünglich eine Bibliothek, die unabhängig von TensorFlow entwickelt wurde, und ist eigentlich ein völlig anderes Projekt von TensorFlow. Aber irgendwann wurde es in TensorFlow zusammengeführt, weshalb wir den Namen dieser Verlustfunktion mit tf.Keras library.losses versehen haben. Ich erinnere mich übrigens nicht immer an die Namen aller Verlustfunktionen und TensorFlow, aber ich mache einfach selbst eine schnelle Websuche, um den richtigen Namen zu finden, und füge ihn dann in meinen Code ein. Nachdem der Verlust in Bezug auf ein einzelnes Trainingsbeispiel angegeben wurde, weiß TensorFlow, dass die Kosten, die Sie minimieren möchten, dann der Durchschnitt sind, indem der Durchschnitt aller m Trainingsbeispiele für den Verlust aller Trainingsbeispiele verwendet wird. Die Optimierung dieser Kostenfunktion führt dazu, dass das neuronale Netzwerk an Ihre binären Klassifizierungsdaten angepasst wird. Falls Sie eher ein Regressionsproblem als ein Klassifikationsproblem lösen möchten. Sie können TensorFlow auch anweisen, Ihr Modell mit einer anderen Verlustfunktion zu kompilieren. Zum Beispiel, wenn Sie ein Regressionsproblem haben und den quadratischen Fehlerverlust minimieren möchten. Hier ist der quadratische Fehlerverlust. Der Verlust in Bezug darauf, ob Ihr Lernalgorithmus f von x mit einem Ziel- oder Ground-Truth-Label von y ausgibt, ist die Hälfte des quadratischen Fehlers. Dann können Sie diese Verlustfunktion in TensorFlow verwenden, um die vielleicht intuitiver benannte mittlere quadratische Fehlerverlustfunktion zu verwenden. Dann versucht TensorFlow, den mittleren quadratischen Fehler zu minimieren. In diesem Ausdruck verwende ich j von Großbuchstabe W Kommagröße B, um die Kostenfunktion zu bezeichnen. Die Kostenfunktion ist eine Funktion aller Parameter im neuronalen Netzwerk. Sie können sich das Großbuchstaben W so vorstellen, dass es W1, W2, W3 einschließt. Alle W-Parameter und das gesamte neue Netzwerk und seien einschließlich b1, b2 und b3. Wenn Sie die Kostenfunktion in Bezug auf w und b optimieren, wenn wir versuchen, sie in Bezug auf alle Parameter im neuronalen Netzwerk zu optimieren. Obendrein hatte ich f von x als Ausgabe des neuronalen Netzwerks geschrieben, aber wir können auch f von w b schreiben, wenn wir betonen wollen, dass die Ausgabe des neuronalen Netzwerks als Funktion von x von allen Parametern in allen Schichten des neuronalen Netzwerks abhängt. Das ist die Verlustfunktion und die Kostenfunktion. Schließlich werden Sie TensorFlow bitten, die Kreuzfunktion zu minimieren. Vielleicht erinnern Sie sich an den Gradientenabstiegsalgorithmus aus dem ersten Kurs. Wenn Sie den Gradientenabstieg verwenden , um die Parameter eines neuronalen Netzwerks zu trainieren , aktualisieren Sie wiederholt für jede Schicht l und für jede Einheit j wlj gemäß wlj minus der Lernrate alpha mal der partiellen Ableitung in Bezug auf diesen Parameter der Kostenfunktion j von wb und in ähnlicher Weise auch für die Parameter b. Nachdem Sie beispielsweise 100 Iterationen des Gradientenabstiegs durchgeführt haben, erhalten Sie hoffentlich einen guten Wert der Parameter. Um den Gradientenabstieg verwenden zu können, müssen Sie vor allem diese Terme für partielle Ableitungen berechnen. TensorFlow verwendet einen Algorithmus namens Backpropagation, um diese partiellen Ableitungsbegriffe zu berechnen, und das ist tatsächlich Standard beim Training neuronaler Netzwerke. TensorFlow kann all diese Dinge für Sie erledigen. Es implementiert Backpropagation alles innerhalb dieser Funktion namens fit. Alles was Sie tun müssen, ist model.fit, x, y als Ihr Trainingssatz aufzurufen und es für 100 Iterationen oder 100 Epochen anzuweisen. Was Sie später sehen, ist, dass TensorFlow einen Algorithmus verwenden kann, der sogar ein bisschen schneller ist als Gradient Descent, und dazu werden Sie später in dieser Woche auch mehr erfahren. Jetzt weiß ich, dass wir uns stark auf die TensorFlow-Bibliothek verlassen, um ein neuronales Netzwerk zu implementieren. Ein Muster, das ich bei mehreren Ideen gesehen habe, ist, dass sich die Technologie weiterentwickelt, Bibliotheken ausgereifter werden und die meisten Ingenieure Bibliotheken verwenden, anstatt Code von Grund auf neu zu implementieren. Dafür gab es in der Geschichte der Informatik viele andere Beispiele. Vor vielen Jahrzehnten mussten Programmierer ihre eigene Sortierfunktion von Grund auf neu implementieren, aber jetzt sind Sortierbibliotheken ziemlich ausgereift, sodass Sie wahrscheinlich die Sortierfunktion einer anderen Person aufrufen, anstatt sie selbst zu implementieren, es sei denn, Sie nehmen an einem Computerkurs teil und ich bitte Sie, dies als Übung zu tun. Wenn man heute die Quadratwurzel einer Zahl berechnen will, also was ist die Quadratwurzel von sieben, nun ja, früher mussten Programmierer ihren eigenen Code schreiben, um das zu berechnen, aber jetzt ruft so ziemlich jeder einfach eine Bibliothek auf, um Quadratwurzeln zu ziehen, oder Matrixoperationen, wie das Multiplizieren zweier Matrizen miteinander. Als Deep Learning noch jünger und weniger ausgereift war, implementierten viele Entwickler, darunter auch ich, Dinge von Grund auf mit Python, C++ oder einer anderen Bibliothek. Aber heute sind Deep-Learning-Bibliotheken so ausgereift, dass die meisten Entwickler diese Bibliotheken verwenden werden , und tatsächlich verwenden die meisten kommerziellen Implementierungen neuronaler Netze heute eine Bibliothek wie TensorFlow oder PyTorch. Aber wie ich bereits erwähnt habe, ist es immer noch nützlich, zu verstehen, wie sie unter der Haube funktionieren, sodass Sie, falls etwas Unerwartetes passiert, was bei den heutigen Bibliotheken immer noch der Fall ist, eine bessere Chance haben, zu wissen, wie das Problem behoben werden kann. Jetzt, wo Sie wissen, wie man ein grundlegendes neuronales Netzwerk trainiert, das auch als mehrschichtiges Perzeptron bezeichnet wird, gibt es einige Dinge, die Sie am neuronalen Netzwerk ändern können, um es noch leistungsfähiger zu machen. Schauen wir uns im nächsten Video an, wie Sie verschiedene Aktivierungsfunktionen als Alternative zu der von uns verwendeten Sigmoid-Aktivierungsfunktion austauschen können. Dadurch funktionieren Ihre neuronalen Netzwerke noch viel besser. Schauen wir uns das im nächsten Video an.
Alternativen zur sigmoiden Aktivierung
Bisher haben wir die Sigmoid-Aktivierungsfunktion in allen Knoten in den versteckten Schichten und in der Ausgabeschicht verwendet. Und wir haben so angefangen, weil wir neuronale Netzwerke aufgebaut haben, indem wir die logistische Regression genutzt und viele logistische Regressionseinheiten erstellt und sie miteinander verknüpft haben. Wenn Sie jedoch andere Aktivierungsfunktionen verwenden, kann Ihr neuronales Netzwerk viel leistungsfähiger werden. Schauen wir uns an, wie das geht. Erinnern Sie sich an das Beispiel mit einer Nachfrageprognose von letzter Woche, bei dem Sie anhand von Preis, Versandkosten, Marketing und Material versuchen würden, vorherzusagen, ob etwas sehr erschwinglich ist. Wenn es eine gute Bekanntheit und eine hohe wahrgenommene Qualität gibt , versuchen Sie auf dieser Grundlage vorherzusagen, dass es ein Verkaufsschlager war. Dies setzt jedoch voraus, dass Bewusstsein vielleicht binär ist, ob die Menschen sich dessen bewusst sind oder nicht. Aber es scheint, dass das Ausmaß, in dem potenzielle Käufer das T-Shirt, das Sie verkaufen, bewusst sind, vielleicht nicht binär ist, sie können sich ein wenig bewusst sein, etwas bewusst, extrem bewusst oder es könnte sich völlig viral verbreitet haben. Anstatt also Bewusstsein als Binärzahl 0, 1 zu modellieren, versuchen Sie, die Wahrscheinlichkeit des Bewusstseins abzuschätzen, oder anstatt Bewusstsein nur eine Zahl zwischen 0 und 1 zu modellieren. Vielleicht sollte Bewusstsein eine beliebige nicht negative Zahl sein, da es jeden nicht-negativen Bewusstseinswert geben kann, der von 0 bis zu sehr, sehr großen Zahlen reicht. Während wir also zuvor diese Gleichung verwendet hatten, um die Aktivierung dieser zweiten versteckten Einheit zu berechnen, die das Bewusstsein schätzt, wobei g die Sigmoidfunktion ist und einfach zwischen 0 und 1 liegt. Wenn Sie zulassen möchten, dass a,1, 2 potenziell viel größere positive Werte annimmt, können wir stattdessen eine andere Aktivierungsfunktion eintauschen. Es stellt sich heraus, dass diese Funktion eine sehr häufige Wahl der Aktivierungsfunktion in neuronalen Netzwerken ist. Es sieht so aus. Es heißt, wenn z das ist, dann ist g (z) 0 nach links und dann gibt es diese gerade Linie 45° rechts von 0. Wenn also z größer oder gleich 0 ist, ist g (z) gerade gleich z. Das ist die rechte Hälfte dieses Diagramms. Und die mathematische Gleichung dafür lautet: g (z) ist gleich max (0, z). Sie können gerne selbst überprüfen, ob max (0, z) zu dieser Kurve führt, die ich hier gezeichnet habe. Und wenn a 1, 2 g (z) für diesen Wert von z ist, dann kann a, der Deaktivierungswert nicht 0 oder einen anderen nicht negativen Wert annehmen. Diese Aktivierungsfunktion hat einen Namen. Es trägt den Namen ReLu mit dieser lustigen Großschreibung und ReLu steht wieder für einen etwas obskuren Begriff, aber er steht für rectified linear unit. Machen Sie sich nicht zu viele Gedanken darüber, was berichtigt bedeutet und was Lineareinheit bedeutet. Dies war nur der Name, den die Autoren dieser speziellen Aktivierungsfunktion gegeben hatten, als sie sie entwickelten. Aber die meisten Leute im Bereich Deep Learning sagen einfach ReLU, um sich auf dieses g (z) zu beziehen. Allgemeiner gesagt haben Sie die Wahl, was Sie für g (z) verwenden möchten, und manchmal verwenden wir eine andere Wahl als die Sigmoid-Aktivierungsfunktion. Hier sind die am häufigsten verwendeten Aktivierungsfunktionen. Sie haben die Sigmoid-Aktivierungsfunktion gesehen, g (z) entspricht dieser Sigmoidfunktion. Auf der letzten Folie haben wir uns gerade die reLU oder die gleichgerichtete Lineareinheit g (z) gleich max (0, z) angesehen. Es gibt noch eine weitere Aktivierungsfunktion, die als lineare Aktivierungsfunktion bezeichnet wird und die einfach g (z) gleich z ist. Wenn Sie die lineare Aktivierungsfunktion verwenden, sagen die Leute manchmal, dass wir keine Aktivierungsfunktion verwenden, denn wenn a g (z) ist, wobei g (z) gleich z ist, dann ist a einfach gleich w.x plus b z. Und so ist es, als ob da überhaupt kein g drin wäre.. Wenn Sie also diese lineare Aktivierungsfunktion g (z) verwenden , sagen die Leute manchmal, nun, wir verwenden keine Aktivierungsfunktion. Allerdings werde ich mich in diesem Kurs auf die Verwendung der linearen Aktivierungsfunktion beziehen und nicht auf die Verwendung keiner Aktivierungsfunktion. Aber wenn Sie hören, dass jemand anderes diese Terminologie verwendet, ist das, was er meint. Es bezieht sich nur auf die lineare Aktivierungsfunktion. Und diese drei sind wahrscheinlich die mit Abstand am häufigsten verwendeten Aktivierungsfunktionen in neuronalen Netzwerken. Später in dieser Woche werden wir uns mit der vierten Funktion befassen, der Softmax-Aktivierungsfunktion. Mit diesen Aktivierungsfunktionen können Sie jedoch eine Vielzahl leistungsfähiger neuronaler Netzwerke aufbauen. Möchten Sie also beim Aufbau eines neuronalen Netzwerks für jedes Neuron die Sigmoid-Aktivierungsfunktion oder die ReLU-Aktivierungsfunktion verwenden? Oder eine lineare Aktivierungsfunktion? Wie wählen Sie zwischen diesen verschiedenen Aktivierungsfunktionen? Schauen wir uns das im nächsten Video an.
Auswahl der Aktivierungsfunktionen
Schauen wir uns an, wie Sie die Aktivierungsfunktion für verschiedene Neuronen in Ihrem neuronalen Netzwerk auswählen können. Wir beginnen mit einer Anleitung zur Auswahl für die Ausgabeschicht. Es stellt sich heraus, dass es je nachdem, was das Ziellabel oder das Ground-Truth-Label y ist, eine ziemlich natürliche Wahl für die Aktivierungsfunktion für die Ausgabeschicht gibt, und wir werden uns dann die Wahl der Aktivierungsfunktion auch für die verborgenen Schichten Ihres neuronalen Netzwerks ansehen. Lass uns einen Blick darauf werfen. Sie können verschiedene Aktivierungsfunktionen für verschiedene Neuronen in Ihrem neuronalen Netzwerk wählen, und wenn Sie die Aktivierungsfunktion für die Ausgangsschicht betrachten, stellt sich heraus, dass es oft eine ziemlich natürliche Wahl gibt, je nachdem, was das Ziel oder das Ground-Truth-Label y ist. Insbesondere, wenn Sie an einem Klassifikationsproblem arbeiten, bei dem y entweder Null oder Eins ist, also einem binären Klassifikationsproblem, dann ist die sigmoide Aktivierungsfunktion fast immer die natürlichste Wahl, weil dann die neuronale netzwerk lernt, die Wahrscheinlichkeit vorherzusagen, dass y gleich eins ist, genau wie bei der logistischen Regression. Meine Empfehlung ist, wenn Sie an einem binären Klassifizierungsproblem arbeiten, Sigmoid auf der Ausgabeschicht zu verwenden. Wenn Sie ein Regressionsproblem lösen, können Sie alternativ eine andere Aktivierungsfunktion wählen. Zum Beispiel, wenn Sie vorhersagen möchten, wie sich der Aktienkurs von morgen im Vergleich zum heutigen Aktienkurs ändern wird. Nun, es kann steigen oder fallen, und in diesem Fall wäre y eine Zahl, die entweder positiv oder negativ sein kann, und in diesem Fall würde ich empfehlen, die lineare Aktivierungsfunktion zu verwenden. Warum ist das so? Nun, das liegt daran, dass dann die Ausgaben Ihres neuronalen Netzwerks, f von x, was im obigen Beispiel gleich a^3 ist, g wären, angewendet auf z^3 und mit der linearen Aktivierungsfunktion kann g von z entweder positive oder negative Werte annehmen. Y kann also positiv oder negativ sein, verwenden Sie eine lineare Aktivierungsfunktion. Wenn y schließlich nur nicht-negative Werte annehmen kann, z. B. wenn Sie den Preis eines Hauses vorhersagen, der niemals negativ sein kann, dann ist die ReLU-Aktivierungsfunktion die natürlichste Wahl, denn wie Sie hier sehen, nimmt diese Aktivierungsfunktion nur nicht-negative Werte an, entweder Null oder positive Werte. Bei der Auswahl der Aktivierungsfunktion, die Sie für Ihre Ausgabeschicht verwenden möchten, gibt es normalerweise eine ziemlich natürliche Wahl, je nachdem, welches Label y Sie vorhersagen möchten. Tatsächlich zeigt die Anleitung auf dieser Folie, dass ich so gut wie immer meine Aktivierungsfunktion auch für die Ausgabeschicht eines neuronalen Netzwerks auswähle. Wie wäre es mit den verborgenen Schichten eines neuronalen Netzwerks? Es stellt sich heraus, dass die ReLU-Aktivierungsfunktion heute von vielen Praktikern bei weitem die häufigste Wahl für das Training neuronaler Netzwerke ist. Obwohl wir neuronale Netzwerke ursprünglich mit der Sigmoid-Aktivierungsfunktion beschrieben hatten und tatsächlich in der frühen Geschichte der Entwicklung neuronaler Netzwerke Menschen vielerorts sigmoide Aktivierungsfunktionen verwenden, hat sich das Gebiet weiterentwickelt, sodass ReLU viel häufiger und Sigmoide kaum jemals verwendet werden. Nun, die einzige Ausnahme ist, dass Sie eine Sigmoid-Aktivierungsfunktion in der Ausgabeschicht verwenden, wenn Sie ein binäres Klassifizierungsproblem haben. Also warum ist das so? Nun, es gibt ein paar Gründe. Wenn Sie zunächst die ReLU- und die Sigmoid-Aktivierungsfunktionen vergleichen, ist die ReLU etwas schneller zu berechnen, da sie nur die Berechnung von maximal 0, z erfordert, wohingegen für das Sigmoid eine Potenzierung und dann eine Inverse usw. erforderlich ist, weshalb sie etwas weniger effizient ist. Aber der zweite Grund, der sich als noch wichtiger herausstellt, ist, dass die ReLU-Funktion nur in einem Teil des Graphen flach wird; hier links ist sie völlig flach, wohingegen die Sigmoid-Aktivierungsfunktion an zwei Stellen flach wird. Es geht flach zur linken Seite des Diagramms und flach zur rechten Seite des Diagramms. Wenn Sie ein neuronales Netzwerk mit Gradientenabstieg trainieren, dann wären Gradientenabfahrten sehr langsam, wenn Sie eine Funktion haben, die an vielen Stellen fett ist. Ich weiß, dass der Gradientenabstieg eher die Kostenfunktion J von W, B als die Aktivierungsfunktion optimiert, aber die Aktivierungsfunktion ist ein Teil dessen, was in die Berechnung einfließen wird, und das führt dazu, dass mehr Stellen in der Kostenfunktion J von W, B, die ebenfalls flach sind und einen kleinen Gradienten haben, und das verlangsamt das Lernen. Ich weiß, dass das nur eine intuitive Erklärung war, aber Forscher haben herausgefunden, dass die Verwendung der ReLU-Aktivierungsfunktion dazu führen kann , dass Ihr neuronales Netzwerk auch etwas schneller lernt. Aus diesem Grund ist die ReLU-Aktivierungsfunktion für die meisten Praktiker, wenn Sie versuchen, zu entscheiden, welche Aktivierungsfunktionen mit versteckter Schicht verwendet werden sollen, jetzt die mit Abstand häufigste Wahl. Tatsächlich baue ich ein neuronales Netzwerk auf, und so wähle ich auch Aktivierungsfunktionen für die verborgenen Schichten aus. Zusammenfassend empfehle ich Ihnen Folgendes für die Auswahl der Aktivierungsfunktionen für Ihr neuronales Netzwerk. Verwenden Sie für die Ausgabeschicht ein Sigmoid, wenn Sie ein binäres Klassifizierungsproblem haben; linear, wenn y eine Zahl ist, die positive oder negative Werte annehmen kann, oder verwenden Sie ReLu, wenn y nur positive Werte oder null positive Werte oder nicht negative Werte annehmen kann. Dann würde ich für die versteckten Ebenen empfehlen, ReLu einfach als Standardaktivierungsfunktion zu verwenden, und in TensorFlow würden Sie es so implementieren. Anstatt wie zuvor zu sagen, dass Aktivierung gleich Sigmoid ist, für die versteckten Ebenen ist das die erste versteckte Ebene, die zweite versteckte Ebene als TensorFlow, um die ReLU-Aktivierungsfunktion zu verwenden, und dann für die Ausgabeschicht in diesem Beispiel, habe ich sie gebeten, die Sigmoid-Aktivierungsfunktion zu verwenden, aber wenn Sie die lineare Aktivierungsfunktion verwenden möchten, ist das die Syntax dafür, oder ob Sie die ReLU verwenden möchten Aktivierungsfunktion, die die Syntax dafür anzeigt. Mit diesen umfangreicheren Aktivierungsfunktionen sind Sie gut positioniert, um viel leistungsfähigere neuronale Netzwerke aufzubauen, als wenn Sie nur einmal die Sigmoid-Aktivierungsfunktion verwenden. Übrigens, wenn Sie sich die Forschungsliteratur ansehen, hören Sie manchmal von Autoren, die sogar andere Aktivierungsfunktionen verwenden, wie die Tanh-Aktivierungsfunktion oder die LeakyRelu-Aktivierungsfunktion oder die Swish-Aktivierungsfunktion. Alle paar Jahre lassen sich Forscher manchmal eine weitere interessante Aktivierungsfunktion einfallen, und manchmal funktionieren sie ein bisschen besser. Zum Beispiel habe ich die LeakyRelu-Aktivierungsfunktion in meiner Arbeit ein paar Mal verwendet, und manchmal funktioniert sie ein bisschen besser als die ReLu-Aktivierungsfunktion, die Sie in diesem Video kennengelernt haben. Aber ich denke, in den meisten Fällen und für die allermeisten Anwendungen wäre das, was Sie in diesem Video gelernt haben, gut genug. Wenn Sie mehr über andere Aktivierungsfunktionen erfahren möchten, schauen Sie natürlich gerne im Internet nach, und es gibt nur eine kleine Handvoll Fälle, in denen diese anderen Aktivierungsfunktionen noch leistungsfähiger sein könnten. Damit wünsche ich Ihnen auch viel Spaß beim Üben dieser Ideen, dieser Aktivierungsfunktionen in den optionalen Labs und in den Praxislabors. Dies wirft jedoch noch eine weitere Frage auf. Warum brauchen wir überhaupt Aktivierungsfunktionen? Warum verwenden wir nicht einfach die lineare Aktivierungsfunktion oder verwenden nirgendwo eine Aktivierungsfunktion? Es stellt sich heraus, dass das überhaupt nicht funktioniert. Schauen wir uns im nächsten Video an, warum das so ist und warum Aktivierungsfunktionen so wichtig sind, damit Ihre neuronalen Netzwerke funktionieren.
Warum brauchen wir Aktivierungsfunktionen?
Schauen wir uns an, warum neuronale Netzwerke Aktivierungsfunktionen benötigen und warum sie einfach nicht funktionieren, wenn wir die lineare Aktivierungsfunktion in jedem Neuron im neuronalen Netzwerk verwenden würden. Erinnern Sie sich an dieses Beispiel für eine Nachfrageprognose. Was würde passieren, wenn wir eine lineare Aktivierungsfunktion für alle Knoten in diesem neuronalen Netzwerk verwenden würden? Es stellt sich heraus, dass dieses große neuronale Netzwerk nichts anderes sein wird als nur eine lineare Regression. Dies würde also den gesamten Zweck der Verwendung eines neuronalen Netzwerks zunichte machen, da es dann einfach nichts Komplexeres als das lineare Regressionsmodell , das wir im ersten Kurs kennengelernt haben, anpassen könnte. Lassen Sie uns dies anhand eines einfacheren Beispiels veranschaulichen. Schauen wir uns das Beispiel eines neuronalen Netzwerks an, in dem die Eingabe x nur eine Zahl ist und wir eine versteckte Einheit mit den Parametern w1 und b1 haben, die a1 ausgibt, was hier nur eine Zahl ist, und dann ist die zweite Schicht die Ausgabeschicht und sie hat auch nur eine Ausgabeeinheit mit den Parametern w2 und b2 und dann a2, was ebenfalls nur eine Zahl ist, nur ein Skalar, was die Ausgabe des neuronalen Netzes f von x ist. Lass Mal sehen, was dieses neuronale Netzwerk tun würde, wenn wir die lineare Aktivierungsfunktion g von z gleich z überall verwenden würden . Um a1 als Funktion von x zu berechnen, verwendet das neuronale Netzwerk a1 gleich g von w1 mal x plus b1. Aber g von z ist gleich z. Das ist also nur w1 mal x plus b1. Dann ist a2 gleich w2 mal a1 plus b2, weil g von z gleich z ist. Lassen Sie mich diesen Ausdruck für a1 nehmen und ihn dort einsetzen. Das wird also w2 mal w1 x plus b1 plus b2. Wenn wir vereinfachen, wird dies zu w2, w1 mal x plus w2, b1 plus b2. Es stellt sich heraus, dass, wenn ich w gleich w2 mal w1 setzen würde und b gleich dieser Größe hier gesetzt hätte, dann haben wir gerade gezeigt, dass a2 gleich w x plus b ist. a2 ist also nur eine lineare Funktion der Eingabe x. Anstatt ein neuronales Netzwerk mit einer versteckten Schicht und einer Ausgabeschicht zu verwenden, hätten wir genauso gut ein lineares Regressionsmodell verwenden können. Wenn Sie mit linearer Algebra vertraut sind, ergibt sich dieses Ergebnis aus der Tatsache, dass eine lineare Funktion einer linearen Funktion selbst eine lineare Funktion ist. Aus diesem Grund kann das neuronale Netzwerk durch mehrere Schichten in einem neuronalen Netzwerk keine komplexeren Merkmale berechnen oder etwas Komplexeres als nur eine lineare Funktion lernen. Wenn Sie also ein neuronales Netzwerk mit mehreren Schichten wie diesem haben und sagen, Sie würden eine lineare Aktivierungsfunktion für alle versteckten Schichten und auch eine lineare Aktivierungsfunktion für die Ausgabeschicht verwenden, dann stellt sich heraus, dass dieses Modell eine Ausgabe berechnet, die vollständig der linearen Regression entspricht. Die Ausgabe a4 kann als lineare Funktion der Eingabemerkmale x plus b ausgedrückt werden. Oder alternativ, wenn wir immer noch eine lineare Aktivierungsfunktion für alle versteckten Schichten verwenden würden, für diese drei versteckten Schichten hier, aber wir würden eine logistische Aktivierungsfunktion für die Ausgabeschicht verwenden, dann stellt sich heraus, dass Sie zeigen können, dass dieses Modell der logistischen Regression entspricht, und a4 kann in diesem Fall als 1 über 1 plus e ausgedrückt werden negatives wx plus b für einige Werte von w und b. Dieses große neuronale Netzwerk tut es also nicht tun Sie alles , was Sie nicht auch mit logistischer Regression tun können. Aus diesem Grund lautet eine allgemeine Faustregel, die lineare Aktivierungsfunktion nicht in den verborgenen Schichten des neuronalen Netzwerks zu verwenden. Tatsächlich empfehle ich, normalerweise die ReLU-Aktivierungsfunktion zu verwenden, sollte gut funktionieren. Deshalb benötigt ein neuronales Netzwerk überall andere Aktivierungsfunktionen als nur die lineare Aktivierungsfunktion. Bisher haben Sie gelernt, neuronale Netzwerke für binäre Klassifikationsprobleme zu erstellen, bei denen y entweder Null oder Eins ist. Sowie für Regressionsprobleme, bei denen y negative oder positive Werte annehmen kann, oder vielleicht nur positive und nicht negative Werte. Im nächsten Video möchte ich Ihnen eine Verallgemeinerung dessen vorstellen, was Sie bisher zur Klassifizierung gesehen haben. Insbesondere, wenn y nicht nur zwei Werte annimmt, sondern drei oder vier oder zehn oder noch mehr kategoriale Werte annehmen kann. Schauen wir uns an, wie Sie ein neuronales Netzwerk für diese Art von Klassifikationsproblem aufbauen können.
Multiklasse
Die Mehrklassenklassifizierung bezieht sich auf Klassifizierungsprobleme, bei denen Sie mehr als nur zwei mögliche Ausgabebezeichnungen haben können, also nicht nur Null oder 1. Schauen wir uns an, was das bedeutet. Bei den Problemen mit der Klassifizierung handschriftlicher Ziffern, die wir uns bisher angesehen haben, haben wir nur versucht, zwischen den handgeschriebenen Ziffern 0 und 1 zu unterscheiden. Aber wenn Sie versuchen, Protokolle oder Postleitzahlen in einem Umschlag zu lesen, dann gibt es tatsächlich 10 mögliche Ziffern, die Sie vielleicht erkennen möchten. Oder alternativ haben Sie im ersten Kurs das Beispiel gesehen, wenn Sie versuchen zu klassifizieren, ob Patienten möglicherweise an einer von drei oder fünf verschiedenen möglichen Krankheiten leiden. Auch das wäre ein Problem mit der Klassifizierung mehrerer Klassen, oder eine Sache, an der ich viel gearbeitet habe, ist die visuelle Fehlerprüfung des Teileherstellers im Werk. Vielleicht schauen Sie sich das Bild einer Pille an, die ein Pharmaunternehmen hergestellt hat, und versuchen herauszufinden, ob sie einen Kratzeffekt oder Verfärbungsfehler oder einen Chip-Defekt hat. Und das wären wiederum mehrere Klassen mit mehreren verschiedenen Arten von Defekten, die man bei dieser Pille einstufen könnte. Ein Klassifikationsproblem mit mehreren Klassen ist also immer noch ein Klassifikationsproblem, da y, Sie können nur eine kleine Anzahl diskreter Kategorien annehmen, ist keine Zahl, sondern y kann jetzt mehr als nur zwei mögliche Werte annehmen. Während Sie also zuvor für den Kauf der Klassifikation möglicherweise einen Datensatz wie diesen mit den Funktionen x1 und x2 hatten. In diesem Fall würde die logistische Regression das Modell anpassen, um die Wahrscheinlichkeit zu schätzen, dass y anhand der Merkmale x gleich 1 ist. Da y bei Klassifikationsproblemen mit mehreren Klassen entweder 01 ist, hätten Sie stattdessen einen Datensatz, der vielleicht so aussieht. Wo wir vier Klassen haben, wobei das Os eine Klasse darstellt, stehen die xs für eine andere Klasse. Die Dreiecke stehen für die dritte Klasse und die Quadrate für die vierte Klasse. Und anstatt nur die Wahrscheinlichkeit zu schätzen, dass y gleich 1 ist, wollen wir jetzt abschätzen, wie hoch die Wahrscheinlichkeit ist, dass y gleich 1 ist, oder wie groß ist die Wahrscheinlichkeit, dass y gleich 2 ist? Oder wie groß ist die Wahrscheinlichkeit, dass y gleich 3 ist, oder wie groß ist die Wahrscheinlichkeit, dass y gleich 4 ist? Und es stellt sich heraus, dass der Algorithmus, den Sie im nächsten Video kennengelernt haben, eine Entscheidungsgrenze lernen kann, die vielleicht so aussieht und den explodierten Raum neben ihm in vier Kategorien unterteilt und nicht nur in zwei Kategorien. Das ist also die Definition des Mehrklassenklassifizierungsproblems. Im nächsten Video schauen wir uns den Softmax-Regressionsalgorithmus an, der eine Verallgemeinerung des logistischen Regressionsalgorithmus ist und mit dem Sie Klassifikationsprobleme mit mehreren Klassen lösen können. Und danach nehmen wir die Softmax-Regression und passen sie in ein neues neuronales Netzwerk ein, sodass Sie auch ein neuronales Netzwerk trainieren können, um Klassifikationsprobleme mit mehreren Klassen auszuführen. Gehen wir zum nächsten Video über.
Softmax
Der Softmax-Regressionsalgorithmus ist eine Verallgemeinerung der logistischen Regression, bei der es sich um einen binären Klassifikationsalgorithmus für Klassifikationskontexte mit mehreren Klassen handelt. Schauen wir uns an, wie das funktioniert. Denken Sie daran, dass die logistische Regression gilt, wenn y zwei mögliche Ausgabewerte annehmen kann, entweder Null oder Eins, und die Art und Weise, wie sie diese Ausgabe berechnet, ist, dass Sie zuerst z = w.Produkt von x plus b berechnen und dann berechnen würden, was ich hier nenne a gleich g von z ist, was eine Sigmoidfunktion ist, die auf z angewendet wird. Wir haben dies als logistische Regressionsschätzungen der Wahrscheinlichkeit interpretiert, dass y gleich 1 ist diese Eingabemerkmale x. Nun, kurze Quizfrage; wenn die Wahrscheinlichkeit von y gleich 1 ist, ist 0,71, was ist dann Wahrscheinlichkeit, dass y gleich Null ist? Nun, die Wahrscheinlichkeit, dass y die Eins ist, und die Wahrscheinlichkeit, dass Y die Null ist , müssen sich zu eins summieren, oder? Es besteht also eine Wahrscheinlichkeit von 71 Prozent, dass es eins ist, es muss eine Wahrscheinlichkeit von 29 Prozent oder 0,29 bestehen, dass es gleich Null ist. Um die logistische Regression ein wenig zu verschönern und uns auf die Verallgemeinerung zur Softmax-Regression vorzubereiten, werde ich mir vorstellen, dass die logistische Regression tatsächlich zwei Zahlen berechnet: Erstens a_1, das ist die Größe, die wir zuvor hatten, dass die Wahrscheinlichkeit, dass y gleich 1 ist, bei gegebenem x, und zweitens werde ich mir die logistische Regression so vorstellen, dass auch a_2 berechnet wird, was nur die Chance ist wobei y angesichts der Eingabe-Features x gleich Null ist, und daher müssen a_1 und a_2 natürlich zu 1 addiert werden. Lassen Sie uns das nun auf die Softmax-Regression verallgemeinern, und ich werde dies anhand eines konkreten Beispiels tun, wann y vier mögliche Ausgaben annehmen kann, sodass y die Werte 1, 2, 3 oder 4 annehmen kann. Die Softmax-Regression bewirkt Folgendes: Sie berechnet z_1 als w_1.product mit x plus b_1, und dann wird z_2 gleich w_2.product von x plus b_2 usw. für z_3 und z_4. Hier sind w_1, w_2, w_3, w_4 sowie b_1, b_2, b_3, b_4 die Parameter der Softmax-Regression. Als Nächstes ist hier die Formel für die Softmax-Regression. Wir berechnen a_1 gleich e^z_1 geteilt durch e^ z_1 plus e^ z_2 plus e^z_3 plus, e^ z_4, und a_1 wird als die algorithmische Schätzung der Wahrscheinlichkeit interpretiert, dass y gleich 1 ist, wenn die Eingabemerkmale x gegeben sind. Dann berechnen wir die Formel für die Softmax-Regression, wir berechnen a_2 gleich e^ z_2 geteilt durch denselben Nenner, e^z_1 plus e^z_2, plus e^z_3 plus e^z4, und wir interpretieren a_2 als die Algorithmusschätzung der Wahrscheinlichkeit, dass y gleich 2 ist, wenn die Eingabemerkmale x gegeben sind. Ähnliches gilt für a_3, wo hier der Zähler jetzt e^z_3 geteilt durch denselben Nenner ist, das ist die geschätzte Wahrscheinlichkeit, dass y a_3 ist, und ähnlich nimmt a_4 diesen Ausdruck an. Während wir auf der linken Seite die Spezifikation für das logistische Regressionsmodell aufgeschrieben haben, sind diese Gleichungen auf der rechten Seite unsere Spezifikation für das Softmax-Regressionsmodell. Es hat die Parameter w_1 bis w_4 und b_1 bis b_4, und wenn Sie die richtigen Optionen für all diese Parameter kennen, können Sie anhand einer Reihe von Eingabe-Features x vorhersagen, wie hoch die Wahrscheinlichkeit ist, dass y 1, 2, 3 oder 4 ist. Kurzes Quiz, lassen Sie uns sehen, führen Sie die Softmax-Regression für eine neue Eingabe x aus, und Sie stellen fest, dass a_1 0,30 ist, a_2 0,20, a_3 ist 0,15. Was glaubst du, wird a_4 sein? Warum schaust du dir nicht dieses Quiz an und schaust, ob du die richtige Antwort findest? Sie haben vielleicht bemerkt, dass, weil die Wahrscheinlichkeit, dass y die Werte 1, 2, 3 oder 4 annehmen, sie sich zu eins addieren müssen, a_4, die Wahrscheinlichkeit, dass y mit einer Vier zusammen ist, 0,35 betragen muss, was 1 minus 0,3 minus 0,2 minus 0,15 ist. Hier habe ich die Formeln für die Softmax-Regression bei vier möglichen Ausgaben aufgeschrieben, und lassen Sie uns nun die Formel für den allgemeinen Fall für die Softmax-Regression aufschreiben. Im allgemeinen Fall kann y n mögliche Werte annehmen, also kann y 1, 2, 3 usw. bis zu n sein. In diesem Fall wird die Softmax-Regression berechnet, dass z_ j gleich w_ j.product mit x plus b_j ist, wobei die Parameter der Softmax-Regression jetzt w_1, w_2 bis w_n sind, sowie b_1, b_2 bis b_n., berechnen wir a j gleich e zu z j geteilt durch die Summe von k ist gleich 1 bis n von e zu z sub k. Während ich hier eine andere Variable k verwende, um die Summe zu indizieren, weil hier j sich auf eine bestimmte feste Zahl wie j bezieht entspricht 1. A, j wird als die Schätzung des Modells interpretiert, dass y gleich j ist, wenn die Eingabe-Features x gegeben sind. Beachten Sie, dass diese Formel konstruktionsbedingt, wenn Sie a1, a2 bis n addieren, diese Zahlen am Ende immer 1 ergeben. Wir haben angegeben, wie Sie das Softmax-Regressionsmodell berechnen würden. Ich werde es in diesem Video nicht beweisen, aber es stellt sich heraus, dass, wenn Sie die Softmax-Regression mit n gleich 2 anwenden, sodass es nur zwei mögliche Ausgabeklassen gibt, die Softmax-Regression im Grunde dasselbe berechnet wie die logistische Regression. Die Parameter sind am Ende etwas anders, aber am Ende reduzieren sie sich auf das logistische Regressionsmodell. Aber deshalb ist das Softmax-Regressionsmodell die Verallgemeinerung der logistischen Regression. Nachdem wir definiert haben, wie die Softmax-Regression ihre Ausgaben berechnet, schauen wir uns nun an, wie die Kostenfunktion für die Softmax-Regression spezifiziert wird. Erinnern wir uns an die logistische Regression, das hatten wir. Wir sagten, z entspricht dem. Dann habe ich vorhin geschrieben, dass a1 g von z ist, was als Wahrscheinlichkeit interpretiert wurde, dass y 1 ist. Wir haben auch geschrieben, dass a2 die Wahrscheinlichkeit ist, dass y gleich 0 ist. Zuvor hatten wir den Verlust der logistischen Regression als negativ y log a1 minus 1 minus y log 1 minus a1 geschrieben. Aber 1 minus a1 ist auch gleich a2, weil a2 nach diesem Ausdruck hier eins minus a1 ist. Ich kann den Verlust für die logistische Regression etwas umschreiben oder vereinfachen, sodass er negativ y log a1 minus 1 minus y log von a2 ist. Mit anderen Worten, der Verlust, wenn y gleich 1 ist, ist ein negativer log a1. Wenn y gleich 0 ist, ist der Verlust negativ log a2 und dann wie zuvor. Die Kostenfunktion für alle Parameter im Modell ist der durchschnittliche Verlust, der über den gesamten Trainingssatz gemittelt wird. Das war eine Kostenfunktion für diese Regression. Schreiben wir die Kostenfunktion auf, die herkömmlicherweise die Softmax-Regression verwendet. Denken Sie daran, dass dies die Gleichungen sind, die wir für die Softmax-Regression verwenden. Der Verlust, den wir für die Softmax-Regression verwenden werden, ist genau dieser. Der Verlust, wenn der Algorithmus a1 durch an setzt. Das Ground-Truth-Label besagt, dass, wenn y gleich 1 ist, der Verlust negativ log a1 ist. Sagt negativer Logarithmus der Wahrscheinlichkeit, dass es dachte, y sei gleich 1, oder wenn y gleich 2 ist, dann definiere ich es als negativen Logarithmus a2. Y ist gleich 2. Der Verlust des Algorithmus in diesem Beispiel ist ein negativer Logarithmus der Wahrscheinlichkeit, mit der angenommen wird, dass y gleich 2 ist. Bis hinunter, wenn y gleich n ist, dann ist der Verlust ein negativer Logarithmus von a n. Um zu veranschaulichen, was das bewirkt: Wenn y gleich j ist, dann ist der Verlust ein negativer Logarithmus von a j. So sieht diese Funktion aus. Der negative Logarithmus eines j ist eine Kurve, die so aussieht. Wenn ein j sehr nahe an 1 liegt, dann überschreitet man diesen Teil der Kurve und der Verlust wird sehr gering sein. Aber wenn es denkt, sagen wir, ein J hätte nur eine 50-prozentige Chance, wird der Verlust etwas größer. Je kleiner a j ist, desto größer ist der Verlust. Dies gibt dem Algorithmus einen Anreiz, ein j so groß wie möglich zu machen, so nah wie möglich an 1. Denn was auch immer der tatsächliche Wert y war, Sie möchten, dass der Algorithmus hoffentlich sagt, dass die Wahrscheinlichkeit, dass y dieser Wert ist, ziemlich groß war. Beachten Sie, dass in dieser Verlustfunktion y in jedem Trainingsbeispiel nur einen Wert annehmen kann. Am Ende berechnen Sie diesen negativen Logarithmus von a j nur für einen Wert von a j, was auch immer der tatsächliche Wert von y gleich j in diesem speziellen Trainingsbeispiel war. Wenn y beispielsweise gleich 2 ist, berechnen Sie am Ende den negativen Logarithmus von a2, aber keinen der anderen negativen Logarithmus von a1 oder die anderen Terme hier. Das ist die Form des Modells sowie die Kostenfunktion für die Softmax-Regression. Wenn Sie dieses Modell trainieren, können Sie damit beginnen, Klassifizierungsalgorithmen für mehrere Klassen zu erstellen. Als Nächstes möchten wir dieses Softmax-Regressionsmodell in ein neues Netzwerk einbauen, sodass Sie wirklich etwas noch Besseres tun können, nämlich ein neues Netzwerk für die Mehrklassenklassifizierung zu trainieren. Lassen Sie uns das im nächsten Video durchgehen.
Neuronales Netzwerk mit Softmax-Ausgang
Um ein neuronales Netzwerk aufzubauen, das eine Klassifizierung mehrerer Klassen durchführen kann, nehmen wir das Softmax-Regressionsmodell und fügen es im Wesentlichen in die Ausgabeschicht eines neuronalen Netzwerks ein. Schauen wir uns an, wie das geht. Vorher, als wir handschriftliche Ziffernerkennung mit nur zwei Klassen durchführten. Wir verwenden ein neues neuronales Netzwerk mit dieser Architektur. Wenn Sie jetzt eine handschriftliche Ziffernklassifizierung mit 10 Klassen durchführen möchten, allen Ziffern von Null bis Neun, dann ändern wir dieses neuronale Netzwerk so, dass es 10 Ausgabeeinheiten hat, wie folgt. Und diese neue Ausgabeschicht wird eine Softmax-Ausgabeschicht sein. Manchmal sagen wir also, dass dieses neuronale Netzwerk eine Softmax-Ausgabe hat oder dass diese obere Ebene eine Softmax-Ebene ist. Und die Art und Weise, wie die Vorwärtsausbreitung in diesem neuronalen Netzwerk funktioniert, ist eine Eingabe X A1, die genauso berechnet wird wie zuvor. Und dann A2, die Aktivierungen für die zweite versteckte Ebene werden ebenfalls genauso berechnet wie zuvor. Und wir müssen jetzt die Aktivierungen für diese Ausgabeschicht berechnen, das ist a3. So funktioniert es. Wenn Sie 10 Ausgabeklassen haben, berechnen wir Z1, Z2 bis Z10 mit diesen Ausdrücken. Das ist also tatsächlich sehr ähnlich zu dem, was wir zuvor für die Formel hatten, die Sie zur Berechnung von Z verwenden. Z1 ist W1.product mit a2, den Aktivierungen der vorherigen Ebene plus b1 und so weiter für Z1 bis Z10. Dann ist a1 gleich e für Z1 geteilt durch e für Z1 plus bis zu e für Z10. Und das ist unsere Schätzung der Wahrscheinlichkeit, dass y gleich 1 ist. Und ähnlich für a2 und ähnlich bis zu a10. Das gibt Ihnen also Ihre Schätzungen der Wahrscheinlichkeit, dass y gut ist, auf eins, zwei usw. bis zum 10. möglichen Etikett für y. Und nur der Vollständigkeit halber, wenn Sie angeben möchten, dass dies die Mengen sind, die mit Schicht drei verknüpft sind , sollte ich technisch gesehen diese Superstrip-Drei hinzufügen. Dadurch wird die Notation etwas unübersichtlicher. Dies macht jedoch deutlich, dass dies beispielsweise der Z (3), 1-Wert ist und dies sind die Parameter, die der ersten Einheit der dritten Schicht dieses neuronalen Netzwerks zugeordnet sind. Und damit gibt Ihnen Ihre offene Softmax-Ebene jetzt Schätzungen der Wahrscheinlichkeit, dass y eines dieser 10 möglichen Ausgabelabels ist. Ich möchte erwähnen, dass die Softmax-Ebene manchmal auch als Softmax-Aktivierungsfunktion bezeichnet wird. In einer Hinsicht ist sie im Vergleich zu den anderen Aktivierungsfunktionen, die wir bisher gesehen haben, wie Sigma, Radial und Linear, etwas ungewöhnlich. Wenn wir uns Sigmoid- oder Wert- oder lineare Aktivierungsfunktionen ansehen, war a1 eine Funktion von Z1 und a2 war eine Funktion von Z2 und nur Z2. Mit anderen Worten, um die Aktivierungswerte zu erhalten, könnten wir die Aktivierungsfunktion g, sei es sigmoid oder selten, oder etwas anderes elementweise auf Z1 und Z2 usw. anwenden, um a1 und a2 und a3 und a4 zu erhalten. Beachten Sie jedoch bei der Softmax-Aktivierungsfunktion, dass a1 eine Funktion von Z1 und Z2 und Z3 bis hin zu Z10 ist. Jeder dieser Aktivierungswerte hängt also von allen Werten von Z ab. Und diese Eigenschaft ist ein bisschen einzigartig für die Softmax-Ausgabe oder die Softmax-Aktivierungsfunktion oder anders ausgedrückt, wenn Sie a1 bis a10 berechnen möchten, also eine Funktion von Z1 bis Z 10 gleichzeitig. Und das ist anders als die anderen Aktivierungsfunktionen, die wir bisher gesehen haben. Schauen wir uns abschließend an, wie Sie dies in Tensorflow implementieren würden. Wenn Sie das neuronale Netzwerk implementieren möchten, das ich hier auf dieser Folie gezeigt habe, ist dies der Code dafür. Ähnlich wie zuvor erfolgt die Spezifizierung und das Training des Modells in drei Schritten. Der erste Schritt besteht darin, Tensorflow anzuweisen, drei Schichten nacheinander aneinander zu reihen. Die erste Ebene sind das 25 Einheiten mit Rail-You-Aktivierungsfunktion. Zweite Schicht, 15 Einheiten der Rallye-Aktivierungsfunktion. Und dann die dritte Ebene, weil es jetzt 10 Ausgabeeinheiten gibt, möchten Sie a1 bis a10 ausgeben, also sind es jetzt 10 Ausgabeeinheiten. Und wir werden Tensorflow anweisen, die Softmax-Aktivierungsfunktion zu verwenden. Und die Kostenfunktion, die Sie im letzten Video gesehen haben, Tensorflow nennt sie die Funktion SparseCategoricalCrossEntropy. Ich weiß also, dass dieser Name etwas übertrieben ist, wohingegen wir für die logistische Regression die Funktion BinaryCrossEntropy hatten, hier verwenden wir die Funktion SparseCategoricalCrossEntropy. Und worauf sich Sparse Categorial bezieht, ist, dass Sie immer noch in Kategorien eingeteilt werden. Es ist also kategorisch. Dies nimmt Werte von 1 bis 10 an. Und sparse bedeutet, dass y nur einen dieser 10 Werte annehmen kann. Jedes Bild ist also entweder 0 oder 1 oder 2 oder so weiter bis zu 9. Sie werden kein Bild sehen, das gleichzeitig die Zahl Zwei und Sieben ist, so spärlich, dass jede Ziffer nur eine dieser Kategorien ist. Aber aus diesem Grund wird die Verlustfunktion, die Sie im letzten Video gesehen haben, als intensiv bezeichnet, obwohl sie die spärliche kategoriale Kreuzentropie-Verlustfunktion ist. Und dann ist der Code für das Training des Modells genauso wie zuvor. Und wenn Sie diesen Code verwenden, können Sie ein neuronales Netzwerk anhand eines Klassifizierungsproblems mit mehreren Klassen trainieren. Nur ein wichtiger Hinweis: Wenn Sie diesen Code genau so verwenden, wie ich ihn hier geschrieben habe, funktioniert er, aber verwenden Sie diesen Code nicht wirklich, da sich herausstellt, dass es in Tensorflow eine bessere Version des Codes gibt, mit der Tensorflow besser funktioniert. Also obwohl der auf dieser Folie gezeigte Code funktioniert. Verwende diesen Code nicht so, wie ich ihn hier geschrieben habe, denn in einem späteren Video dieser Woche siehst du eine andere Version, die eigentlich die empfohlene Version für die Implementierung ist, die besser funktionieren wird. Aber das werden wir uns in einem späteren Video ansehen. Jetzt wissen Sie also, wie man ein neuronales Netzwerk mit einer Softmax-Ausgabeschicht mit einem Caveal trainiert. Es gibt eine andere Version des Codes, mit der Tensorflow diese Wahrscheinlichkeiten viel genauer berechnen kann. Schauen wir uns das im nächsten Video an. Wir sollten Ihnen auch den eigentlichen Code zeigen, den ich Ihnen empfehle, wenn Sie ein neuronales Softmax-Netzwerk trainieren. Gehen wir zum nächsten Video über.
Verbesserte Implementierung von Softmax
Die Implementierung, die Sie im letzten Video eines neuronalen Netzwerks mit einer Softmax-Schicht gesehen haben, funktioniert einwandfrei. Aber es gibt einen noch besseren Weg, es zu implementieren. Schauen wir uns an, was mit dieser Implementierung schief gehen kann und wie sie verbessert werden kann. Lassen Sie mich Ihnen zwei verschiedene Möglichkeiten zeigen, dieselbe Menge in einem Computer zu berechnen. Option 1, wir können x gleich 2/10.000 setzen. Option 2: Wir können x gleich 1 plus 1/10.000 minus 1 minus 1/10.000 setzen, was Sie zuerst berechnen, dann berechnen Sie dies und nehmen die Differenz. Wenn Sie diesen Ausdruck vereinfachen, ergibt sich, dass dies 2/10.000 entspricht. Lassen Sie mich das in diesem Notizbuch veranschaulichen. Lassen Sie uns zunächst x auf 2/10.000 setzen und das Ergebnis mit einer Genauigkeit von vielen Dezimalstellen drucken. Das sieht ziemlich gut aus. Lassen Sie mich zweitens x gleich setzen. Ich werde darauf bestehen, 1/1 plus 10.000 zu berechnen und dann 1 minus 1/10.000 zu subtrahieren. Drucken wir das aus. Es sieht nur ein bisschen anders aus, als ob es einen Rundungsfehler gibt. Da der Computer nur über eine begrenzte Menge an Speicher zum Speichern jeder Zahl verfügt, die in diesem Fall als Gleitkommazahl bezeichnet wird, kann das Ergebnis je nachdem, wie Sie den Wert 2/10.000 berechnen, mehr oder weniger numerische Rundungsfehler aufweisen. Es stellt sich heraus, dass die Art und Weise, wie wir die Kostenfunktion für Softmax berechnet haben, zwar korrekt ist, es jedoch eine andere Art der Formulierung gibt, die diese numerischen Rundungsfehler reduziert, was zu genaueren Berechnungen in TensorFlow führt. Lassen Sie mich dies zunächst anhand der logistischen Regression etwas genauer erklären. Dann werden wir zeigen, wie sich diese Ideen auf die Verbesserung unserer Softmax-Implementierung auswirken. Lassen Sie mich diese Ideen zunächst anhand der logistischen Regression veranschaulichen. Dann zeigen wir Ihnen, wie Sie auch Ihre Implementierung von Softmax verbessern können. Denken Sie daran, dass Sie für die logistische Regression, wenn Sie die Verlustfunktion für ein gegebenes Beispiel berechnen möchten, zuerst diese Ausgabeaktivierung a berechnen würden, die g von z oder 1/1 plus e zum negativen z ist. Dann berechnen Sie den Verlust mit diesem Ausdruck hier. Tatsächlich würden die Codes für eine logistische Ausgabeschicht mit diesem binären Kreuzentropieverlust so aussehen. Bei der logistischen Regression funktioniert das gut, und normalerweise sind die numerischen Rundungsfehler nicht so schlimm. Es stellt sich jedoch heraus, dass, wenn Sie TensorFlow zulassen, a nicht als Zwischenbegriff berechnen müssen. Aber stattdessen, wenn Sie TensorFlow mitteilen, dass sie diesen Ausdruck hier unten verlieren. Ich habe nur einen genommen und ihn zu diesem Ausdruck hier unten erweitert. Dann kann TensorFlow die Begriffe in diesem Ausdruck neu anordnen und eine numerisch genauere Methode zur Berechnung dieser Verlustfunktion finden. Das ursprüngliche Verfahren war so, als würde man auf der Berechnung als Zwischenwert bestehen, 1 plus 1/10.000 und einem weiteren Zwischenwert, 1 minus 1/10.000, und dann diese beiden manipulieren, um 2/10.000 zu erhalten. Diese teilweise Implementierung bestand darauf, a explizit als Zwischengröße zu berechnen. Durch die direkte Angabe dieses Ausdrucks unten als Verlustfunktion erhält TensorFlow jedoch mehr Flexibilität bei der Berechnung und der Frage, ob eine explizit berechnet werden soll oder nicht. Der Code, den Sie dazu verwenden können, wird hier gezeigt. Dadurch wird die Ausgabeschicht so eingestellt, dass sie nur eine lineare Aktivierungsfunktion verwendet, und sowohl die Aktivierungsfunktion, 1/1 plus auf das negative z, als auch diesen Kreuzentropieverlust werden hier in die Spezifikation der Verlustfunktion aufgenommen. Das ist es, wozu dieses Argument von logits equals true TensorFlow veranlasst. Falls Sie sich fragen, was die Logits sind, es ist im Grunde diese Zahl z. TensorFlow berechnet z als Zwischenwert, kann aber Begriffe neu anordnen, damit dies genauer berechnet wird. Ein Nachteil dieses Codes ist, dass er etwas weniger lesbar wird. Dies führt jedoch dazu, dass TensorFlow einen etwas geringeren numerischen Rundungsfehler aufweist. Im Fall der logistischen Regression funktioniert jede dieser Implementierungen tatsächlich einwandfrei, aber die numerischen Rundungsfehler können sich verschlimmern, wenn es um Softmax geht. Nehmen wir nun diese Idee und wenden sie auf die Softmax-Regression an. Erinnern Sie sich, was Sie im letzten Video gesehen haben, war, dass Sie die Aktivierungen wie folgt berechnet haben. Die Aktivierungen sind g von z_1 bis z_10, wobei a_1 zum Beispiel e zu z_1 geteilt durch die Summe von e zu z_j ist, und dann war der Verlust dies, je nachdem, welcher tatsächliche Wert von y ein negativer Logarithmus von aj für eines der aj ist, also war dies der Code, mit dem wir diese Berechnung in zwei separaten Schritten durchführen mussten. Aber noch einmal, wenn Sie stattdessen angeben , dass der Verlust entsteht, wenn y gleich 1 ist, ist der negative Logarithmus dieser Formel usw. Wenn y in dieser Formel gleich 10 ist, dann gibt dies TensorFlow die Möglichkeit, Terme neu anzuordnen und dieses Integral numerisch genau zu berechnen. Nur um Ihnen eine Vorstellung davon zu geben, warum TensorFlow dies tun möchte, stellt sich heraus, dass, wenn eine der z wirklich kleiner als e bis eine negative kleine Zahl sehr, sehr klein wird oder wenn eine der z eine sehr große Zahl ist, dann kann e zu z eine sehr große Zahl werden und durch die Neuanordnung von Begriffen kann TensorFlow einige dieser sehr kleinen oder sehr großen Zahlen vermeiden und daher mehr Schauspielerberechnungen für die Verlustfunktion. Der Code dafür ist hier in der Ausgabeschicht dargestellt. Wir verwenden jetzt nur eine lineare Aktivierungsfunktion, sodass die Ausgabeschicht einfach z_1 bis z_10 berechnet und diese gesamte Berechnung des Verlusts dann in der Verlustfunktion hier erfasst wird, wo wir wieder den Parameter from_logists equals true haben. Auch hier machen diese beiden Codeteile so ziemlich dasselbe, außer dass die empfohlene Version numerisch genauer ist, obwohl sie leider auch etwas schwieriger zu lesen ist. Wenn Sie den Code einer anderen Person lesen und das sehen und sich fragen, was vor sich geht, entspricht das tatsächlich der ursprünglichen Implementierung, zumindest vom Konzept her, außer dass das numerisch genauer ist. Die numerischen Rundungsfehler für die _logist Regression sind nicht so schlimm, aber es wird empfohlen, stattdessen diese Implementierung bis zum Ende zu verwenden, und vom Konzept her macht dieser Code dasselbe wie die erste Version, die Sie zuvor hatten, außer dass er numerisch etwas genauer ist. Obwohl der Nachteil vielleicht auch ein bisschen schwieriger zu interpretieren ist. Jetzt gibt es nur noch ein Detail: Wir haben das neuronale Netzwerk so geändert, dass es eine lineare Aktivierungsfunktion anstelle einer Softmax-Aktivierungsfunktion verwendet. Die letzte Schicht des neuronalen Netzes gibt diese Wahrscheinlichkeiten A_1 bis A_10 nicht mehr aus. Es ist, anstatt z_1 durch z_10 zu setzen. Ich habe im Fall der logistischen Regression nicht darüber gesprochen, aber wenn Sie die logistische Funktion der Ausgabe mit der Verlustfunktion kombinieren, müssen Sie für logistische Regressionen auch den Code auf diese Weise ändern, um den Ausgabewert zu nehmen und ihn durch die logistische Funktion abzubilden, um die Wahrscheinlichkeit tatsächlich zu erhalten. Sie wissen jetzt, wie Sie mit einer Softmax-Ausgabeschicht eine Mehrklassenklassifizierung durchführen und wie Sie dies auf numerisch stabile Weise tun. Bevor ich die Klassifizierung mit mehreren Klassen abschließe, möchte ich Ihnen eine andere Art von Klassifizierungsproblem vorstellen, das als Klassifizierungsproblem mit mehreren Labels bezeichnet wird. Lassen Sie uns im nächsten Video darüber sprechen.
Klassifizierung mit mehreren Ausgängen (optional)
Sie haben etwas über die Klassifizierung mit mehreren Klassen gelernt, bei der die Ausgabebezeichnung Y eine von zwei oder potenziell mehr als zwei möglichen Kategorien sein kann. Es gibt eine andere Art von Klassifizierungsproblem , das als Multi-Label-Klassifizierungsproblem bezeichnet wird. Dabei kann es sich bei jedem Bild um mehrere Labels handeln. Lass mich dir zeigen, was ich damit meine. Wenn Sie ein selbstfahrendes Auto oder vielleicht ein Fahrerassistenzsystem bauen und dann ein Bild von dem haben, was sich vor Ihrem Auto befindet, möchten Sie vielleicht eine Frage stellen wie: Gibt es ein Auto oder mindestens ein Auto? Oder gibt es einen Bus, oder gibt es einen Fußgänger oder gibt es Fußgänger? In diesem Fall gibt es ein Auto, es gibt keinen Bus und es gibt mindestens einen Fußgänger oder in diesem zweiten Bild keine Autos, keine Busse und ja zu Fußgängern und ja Auto, ja Bus und keine Fußgänger. Dies sind Beispiele für Probleme bei der Klassifizierung mehrerer Beschriftungen , da Bild X in Verbindung mit einer einzigen Eingabe drei verschiedene Beschriftungen enthält, die angeben, ob sich Autos , Busse oder Fußgänger im Bild befinden oder nicht. In diesem Fall ist das Ziel des Y tatsächlich ein Vektor aus drei Zahlen, und dies unterscheidet sich von der Mehrklassenklassifizierung, bei der Y beispielsweise bei der handschriftlichen Ziffernklassifizierung nur eine einzelne Zahl war, auch wenn diese Zahl 10 verschiedene mögliche Werte annehmen könnte. Wie baut man ein neuronales Netzwerk für die Multi-Label-Klassifizierung auf? Eine Möglichkeit besteht darin, dies einfach als drei völlig separate Probleme des maschinellen Lernens zu behandeln. Sie könnten ein neuronales Netzwerk aufbauen, um zu entscheiden, ob es Autos gibt? Die zweite zur Erkennung von Bussen und die dritte zur Erkennung von Fußgängern. Das ist eigentlich kein unvernünftiger Ansatz. Hier ist das erste neuronale Netzwerk zur Erkennung von Autos, das zweite zur Erkennung von Bussen und das dritte zur Erkennung von Fußgängern. Aber es gibt noch eine andere Möglichkeit, das zu tun, nämlich ein einzelnes neuronales Netzwerk so zu trainieren, dass es alle drei Autos , Busse und Fußgänger gleichzeitig erkennt. Wenn Ihre neuronale Netzwerkarchitektur so aussieht, gibt es Eingabe X. Die erste versteckte Schicht bietet a^1, die zweite versteckte Schicht bietet a^2 und dann die letzte Ausgabeschicht, in diesem Fall haben wir drei Ausgangsneuralen und wir geben a^3 aus, was ein Vektor aus drei Zahlen. Weil wir drei binäre Klassifikationsprobleme lösen, gibt es also ein Auto? Gibt es einen Bus? Gibt es einen Fußgänger? Sie können eine Sigmoid-Aktivierungsfunktion für jeden dieser drei Knoten in der Ausgabeschicht verwenden, und so ist a^3 in diesem Fall a_1^3, a_2^3 und a_3^3, was darauf ankommt, ob das Lernen [unhörbar] als Auto und ohne Bus und ohne Fußgänger im Bild erfolgt oder nicht. Die Klassifizierung mehrerer Klassen und die Klassifizierung mit mehreren Labels werden manchmal miteinander verwechselt. Deshalb möchte ich Ihnen in diesem Video auch nur eine Definition von Problemen mit der Klassifizierung mit mehreren Labels vorstellen, sodass Sie je nach Ihrer Anwendung die richtige für die gewünschte Aufgabe auswählen können. Das war’s also mit der Multi-Label-Klassifizierung. Ich finde, dass die Klassifizierung mehrerer Klassen und die Klassifizierung mit mehreren Labels manchmal mit anderen verwechselt werden. Deshalb wollte ich Ihnen in diesem Video ausdrücklich erklären, was eine Klassifizierung mit mehreren Labels ist, sodass Sie je nach Ihrer Bewerbung wählen können, ob Sie für den Job, den Sie erledigen möchten, schreiben möchten. Und damit ist der Abschnitt über die Klassifizierung mit mehreren Klassen und mehreren Labels abgeschlossen. Im nächsten Video werden wir uns einige fortgeschrittenere Konzepte neuronaler Netzwerke ansehen, darunter einen Optimierungsalgorithmus , der sogar besser ist als Gradient Descent. Schauen wir uns diesen Algorithmus im nächsten Video an, denn er wird dir helfen, deine Lernalgorithmen viel schneller lernen zu lassen. Gehen wir zum nächsten Video über.
Erweiterte Optimierung
Gradient Descent ist ein Optimierungsalgorithmus , der im maschinellen Lernen weit verbreitet ist und die Grundlage vieler Algorithmen wie linearer Regression und logistischer Regression sowie früher Implementierungen neuronaler Netzwerke war. Es stellt sich jedoch heraus, dass es jetzt einige andere Optimierungsalgorithmen zur Minimierung der Kostenfunktion gibt, die sogar besser sind als der Gradientenabstieg. In diesem Video werfen wir einen Blick auf einen Algorithmus, mit dem Sie Ihr neuronales Netzwerk viel schneller trainieren können als mit Gradient Descent. Denken Sie daran, dass dies der Ausdruck für eine Stufe des Gradientenabstiegs ist. Ein Parameter w_j wird aktualisiert als w_j abzüglich der Lernrate Alpha mal diesem Term der partiellen Ableitung. Wie können wir dafür sorgen, dass das noch besser funktioniert? In diesem Beispiel habe ich die Kostenfunktion J mithilfe eines Konturdiagramms dargestellt, das diese Ellipsen umfasst, und das Minimum dieser Kostenfunktion befindet sich in der Mitte dieser Ellipse hier unten. Wenn du nun hier unten mit dem Steigungsabstieg beginnen würdest, könnte dich ein Schritt des Steigungsabstiegs, wenn Alpha klein ist, ein bisschen in diese Richtung führen. Dann noch ein Schritt, dann noch ein Schritt, dann noch ein Schritt, dann noch ein Schritt, und Sie stellen fest, dass jeder einzelne Schritt des Gradientenabstiegs so ziemlich in dieselbe Richtung geht, und wenn Sie sehen, dass dies der Fall ist , fragen Sie sich vielleicht, warum wir Alpha nicht größer machen, können wir einen Algorithmus haben, der Alpha automatisch erhöht? Sie lassen es einfach größere Schritte machen und schneller auf das Minimum kommen. Es gibt einen Algorithmus namens Adam-Algorithmus, der das kann. Wenn es feststellt, dass die Lernrate zu gering ist und wir nur immer wieder winzige kleine Schritte in eine ähnliche Richtung unternehmen, sollten wir einfach die Alpha-Lernrate erhöhen. Im Gegensatz dazu ist auch hier wieder dieselbe Kostenfunktion, wenn wir hier anfangen und eine relativ große Lernrate Alpha haben, dann führt uns vielleicht ein Schritt des Gradientenabstiegs hierher, im zweiten Schritt führt uns der dritte Schritt und der vierte Schritt und der fünfte Schritt und der sechste Schritt, und wenn Sie sehen, dass der Gradientenabstieg dabei hin und her oszilliert. Sie wären versucht zu sagen, nun, warum reduzieren wir nicht die Lernquoten? Der Adam-Algorithmus kann dies auch automatisch tun, und mit einer geringeren Lernrate können Sie dann einen reibungsloseren Weg zum Minimum der Kostenfunktion einschlagen. Je nachdem, wie der Gradientenabstieg verläuft, wünscht man sich manchmal eine höhere Lernrate Alpha, und manchmal wünscht man sich eine kleinere Lernrate Alpha. Der Adam-Algorithmus kann die Lernrate automatisch anpassen. Adam steht für Adaptive Moment Estimation oder A-D-A-M, und mach dir keine Sorgen darüber, was dieser Name bedeutet, es ist genau das, was die Autoren diesen Algorithmus genannt haben. Interessanterweise verwendet der Adam-Algorithmus jedoch keine einzige globale Lernrate Alpha. Es verwendet unterschiedliche Lernraten für jeden einzelnen Parameter Ihres Modells. Wenn Sie die Parameter w_1 bis w_10 haben, wie es bei b der Fall war, dann hat er tatsächlich 11 Lernratenparameter, Alpha_1, Alpha_2, bis hin zu Alpha_10 für w_1 bis w_10, und ich nenne ihn Alpha_11 für den Parameter b. Die Intuition hinter dem Adam-Algorithmus ist, wenn sich ein Parameter w_j oder b immer in ungefähr dieselbe Richtung zu bewegen scheint. Dies haben wir im ersten Beispiel auf der vorherigen Folie gesehen. Aber wenn es so aussieht, als ob es sich weiterhin in ungefähr dieselbe Richtung bewegt, erhöhen wir die Lernrate für diesen Parameter. Gehen wir schneller in diese Richtung. Umgekehrt, wenn ein Parameter ständig hin und her oszilliert, haben Sie dies im zweiten Beispiel auf der vorherigen Folie gesehen. Dann lassen wir es nicht weiter oszillieren oder hin und her springen. Lassen Sie uns Alpha_j für diesen Parameter ein wenig reduzieren. Die Einzelheiten, wie Adam das macht , sind etwas kompliziert und würden den Rahmen dieses Kurses sprengen. Wenn Sie jedoch später einige fortgeschrittenere Deep-Learning-Kurse belegen, erfahren Sie möglicherweise mehr über die Details dieses Adam-Algorithmus, aber in Codes implementieren Sie ihn auf diese Weise. Das Modell ist genau das gleiche wie zuvor, und die Art und Weise, wie Sie das Modell kompilieren, ist der vorherigen sehr ähnlich, außer dass wir der Kompilierungsfunktion jetzt ein zusätzliches Argument hinzufügen, nämlich dass wir angeben, dass der Optimierer, den Sie verwenden möchten, tf.keras.Optimizers.Adam Optimizer ist. Der Adam-Optimierungsalgorithmus benötigt eine standardmäßige anfängliche Lernrate Alpha, und in diesem Beispiel habe ich diese anfängliche Lernrate auf 10^ negativ 3 festgelegt. Aber wenn Sie den Adam-Algorithmus in der Praxis verwenden, lohnt es sich, einige Werte für diese globale Standardlernrate auszuprobieren. Probiere einige große und einige kleinere Werte aus, um herauszufinden, was dir die schnellste Lernleistung bringt. Im Vergleich zum ursprünglichen Gradientenabstiegsalgorithmus , den Sie im vorherigen Kurs gelernt hatten, dem Adam-Algorithmus, ist er jedoch robuster gegenüber der genauen Wahl der von Ihnen ausgewählten Lernrate, da er die Lernrate ein wenig automatisch anpassen kann. Es gibt jedoch immer noch Möglichkeiten, diesen Parameter ein wenig zu optimieren, um zu sehen, ob Sie etwas schneller lernen können. Das war’s für den Adam-Optimierungsalgorithmus. Es funktioniert in der Regel viel schneller als Gradient Descent und hat sich zu einem De-facto-Standard für das Training neuronaler Netzwerke in der Praxis entwickelt. Wenn Sie entscheiden möchten, welchen Lernalgorithmus Sie verwenden möchten, mit welchem Optimierungsalgorithmus Sie Ihr neuronales Netzwerk trainieren möchten. Eine sichere Wahl wäre, einfach den Adam-Optimierungsalgorithmus zu verwenden, und die meisten Praktiker werden heute Adam anstelle des optionalen Gradientenabstiegsalgorithmus verwenden , und damit hoffe ich, dass Ihre Lernalgorithmen viel schneller lernen können. In den nächsten Videos möchte ich nun auf einige fortgeschrittenere Konzepte für neuronale Netze eingehen, und im nächsten Video wollen wir uns insbesondere einige alternative Ebenentypen ansehen.
Zusätzliche Ebenentypen
Alle neuronalen Netzwerkschichten, die Sie bisher hatten, waren vom Typ der dichten Schicht, bei dem jedes Neuron in der Ebene seine Eingaben alle Aktivierungen von der vorherigen Ebene erhält. Und es stellt sich heraus, dass Sie allein mit dem Typ der dichten Schicht tatsächlich einige ziemlich leistungsstarke Lernalgorithmen erstellen können. Und um Ihnen zu helfen, ein tieferes Verständnis dafür zu entwickeln, was neuronale Netzwerke leisten können. Es stellt sich heraus, dass es auch einige andere Arten von Ebenen mit anderen Eigenschaften gibt. In diesem Video möchte ich kurz darauf eingehen und Ihnen ein Beispiel für eine andere Art von neuronaler Netzwerkschicht geben. Werfen wir einen Blick auf die dichte Schicht, die wir verwendet haben, um die Aktivierung eines Neurons zusammenzufassen, sagen wir, dass die zweite versteckte Schicht eine Funktion jedes einzelnen Aktivierungswerts aus der vorherigen Schicht einer Eins ist. Es stellt sich jedoch heraus, dass jemand, der ein neuronales Netzwerk entwirft, für einige Anwendungen möglicherweise einen anderen Schichttyp verwendet. Ein anderer Ebenentyp, den Sie möglicherweise in einigen Arbeiten sehen, wird als Faltungsschicht bezeichnet. Lassen Sie mich das an einem Beispiel veranschaulichen. Was ich also links zeige, ist die Eingabe X. Das ist eine handgeschriebene Ziffer Neun. Und was ich tun werde, ist eine versteckte Ebene zu konstruieren, die verschiedene Aktivierungen als Funktionen dieses Eingabebildes X berechnet. Aber hier ist etwas, was ich für die erste versteckte Einheit tun kann, die ich blau gezeichnet habe, anstatt zu sagen, dass dieses Neuron alle Pixel in diesem Bild betrachten kann. Ich könnte sagen, dass dieses Neuron nur die Pixel in diesem kleinen rechteckigen Bereich betrachten kann. Das zweite Neuron, das ich in Magenta illustrieren werde, wird auch nicht das gesamte Eingabebild X betrachten, sondern nur die Pixel in einem begrenzten Bereich des Bildes. Und so weiter für das dritte Neuron und das 4. Neuron und so weiter und so weiter. Bis zum letzten Neuron, das möglicherweise nur diesen Bereich des Bildes betrachtet. Also warum willst du das vielleicht tun? Warum lässt du nicht jedes Neuron auf alle Pixel schauen, sondern nur auf einige der Pixel? Nun, einige der Vorteile stehen an erster Stelle, es beschleunigt die Berechnung. Und der zweite Vorteil besteht darin, dass ein neuronales Netzwerk, das diese Art von Schicht verwendet, die als Faltungsschicht bezeichnet wird , weniger Trainingsdaten benötigt oder alternativ auch weniger anfällig für Überanpassungen ist. Du hast gehört, dass ich in ihrem vorherigen Kurs ein bisschen über Overfit gesprochen habe, aber darauf werde ich in der nächsten Woche auch näher eingehen. Wenn wir über praktische Tipps zur Verwendung von Lernalgorithmen sprechen und dies ist die Art von Schicht, bei der jedes Neuron nur auf einen Bereich des Eingabebildes schaut, wird als Faltungsschicht bezeichnet. Es war ein Forscher John Macoun, der viele Details herausgefunden hatte, wie man Faltungsschichten zum Laufen bringt, und ihre Verwendung populär gemacht hatte. Lassen Sie mich eine Faltungsschicht genauer veranschaulichen. Und wenn Sie in einem neuronalen Netzwerk mehrere Faltungsschichten haben, wird dies manchmal als neuronales Faltungsnetzwerk bezeichnet. Um die Faltungsschicht eines neuronalen Faltungsnetzes auf dieser Folie zu veranschaulichen, verwende ich anstelle einer Zwei-D-Bildeingabe. Ich werde eine eindimensionale Eingabe verwenden und das motivierende Beispiel, das ich verwenden werde, ist die Klassifizierung von E K G-Signalen oder Elektrokardiogrammen. Wenn Sie also zwei Elektroden auf Ihre Brust legen, zeichnen Sie die Spannungen auf, die so aussehen und Ihrem Herzschlag entsprechen. Das ist tatsächlich etwas, woran meine Stanford-Forschungsgruppe geforscht hat. Wir haben tatsächlich EKG-Signale gelesen, die tatsächlich so aussehen, um zu diagnostizieren, ob Patienten möglicherweise ein Herzproblem haben. Also ein E K G-Signal und ein Wahlkardia-Graham E C G an einigen Stellen E K G. An manchen Orten gibt es nur eine Liste von Zahlen , die der Höhe der Oberfläche zu verschiedenen Zeitpunkten entsprechen. Sie können also sagen, 100 Zahlen haben, die der Höhe dieser Kurve zu 100 verschiedenen Zeitpunkten entsprechen. Und die Lernprozesse angesichts dieser Zeitreihe, angesichts dieses E K G-Signals zur Klassifizierung sagen, ob dieser Patient eine Herzerkrankung oder irgendwelche diagnostizierbaren Herzerkrankungen hat. Folgendes könnte das Convolutional Neural Network tun. Also nehme ich das EKG-Signal und drehe es um 90 Grad, um es auf die Seite zu legen. Und so haben wir hier 100 Eingänge X eins X zwei bis X 100. Wie. Also und wenn ich die erste versteckte Ebene konstruiere, geben wir statt der ersten versteckten Einheit alle 100 Zahlen ein. Gebt mir die erste versteckte Einheit. Schauen Sie sich nur X eins bis X 20 an. Das entspricht also dem Betrachten nur eines kleinen Fensters dieses E K G-Signals. Die zweite versteckte Einheit ist hier in einer anderen Farbe dargestellt. Schauen wir uns X 11 bis X 30 an, also schaut man sich ein anderes Fenster in diesem E K G-Signal an. Und das dritte, das dort versteckt ist, schaut auf ein anderes Fenster X21 bis X 40 und so weiter. Und die letzten versteckten Einheiten in diesem Beispiel. Schauen Sie sich X 81 bis X100 an. Es sieht also aus wie ein kleines Fenster gegen Ende dieser EKG-Zeitreihe. Dies ist also eine Faltungsschicht, da diese Einheiten in dieser Ebene nur ein begrenztes Eingabefenster betrachten. Jetzt hat diese Schicht des neuronalen Netzwerks neun Einheiten. Die nächste Schicht kann auch eine Faltungsschicht sein. Lassen Sie mich also in der zweiten versteckten Ebene meine erste Einheit so gestalten, dass sie nicht alle neun Aktivierungen der vorherigen Ebene betrachtet, sondern beispielsweise nur die ersten 5 Aktivierungen der vorherigen Ebene. Und dann meine zweite Einheit In dieser Sekunde versteckt sich vielleicht noch fünf weitere Zahlen, sagen wir A3-A7. Und die dritte und letzte versteckte Einheit in dieser Ebene betrachtet nur A5 bis A9. Und dann vielleicht endlich diese Aktivierungen. A2 erhält Eingaben für eine Sigmoideinheit, die alle drei dieser Werte von A2 betrachtet, um eine binäre Klassifizierung bezüglich des Vorhandenseins oder Nichtvorhandenseins einer Herzerkrankung vorzunehmen. Dies ist also das Beispiel eines neuronalen Netzwerks, bei dem die erste versteckte Schicht eine Faltungsschicht ist. Die zweite versteckte Schicht ist ebenfalls eine Faltungsschicht und dann ist die Ausgangsschicht eine Sigmoidschicht. Und es stellt sich heraus, dass Sie bei Faltungsschichten viele Architekturoptionen haben, z. B. wie groß das Eingabefenster ist, das ein einzelnes Neuron betrachten sollte, und wie viele Neuronen eine Schicht haben sollte. Und wenn Sie diese Architekturparameter effektiv wählen, können Sie neue Versionen neuronaler Netzwerke erstellen, die für einige Anwendungen sogar effektiver sein können als die dichte Schicht. Um es noch einmal zusammenzufassen: Das war’s für die Convolutional Layer und Convolutional Neural Networks. Ich werde in diesem Kurs nicht näher auf Faltungsnetzwerke eingehen und Sie müssen nichts über sie wissen, um die Hausaufgaben zu machen und diesen Kurs erfolgreich abzuschließen. Aber ich hoffe, dass Sie diese zusätzliche Intuition, dass neuronale Netzwerke auch andere Arten von Schichten haben können, nützlich finden. Und tatsächlich, wenn Sie manchmal von den neuesten hochmodernen Architekturen wie einem Transformatormodell oder einem LS TM- oder einem Attention-Modell hören. Ein Großteil dieser Forschung zu neuronalen Netzwerken bezieht sich auch heute noch auf Forscher, die versuchen, neue Arten von Schichten für neuronale Netzwerke zu erfinden. Und diese verschiedenen Arten von Schichten als Bausteine zusammenzufügen, um noch komplexere und hoffentlich leistungsfähigere neuronale Netzwerke zu bilden. Das war’s also mit den benötigten Videos für diese Woche. Vielen Dank und herzlichen Glückwunsch, dass Sie die ganze Zeit bei mir geblieben sind. Und ich freue mich darauf, Sie auch nächste Woche zu sehen, wo wir anfangen werden, über praktische Ratschläge zu sprechen, wie Sie Systeme für maschinelles Lernen erstellen können. Ich hoffe, dass die Tipps, die Sie nächste Woche lernen, Ihnen helfen werden, nützliche Systeme für maschinelles Lernen viel effektiver zu entwickeln. Also freue ich mich auch darauf, dich nächste Woche zu sehen.
Was ist ein Derivat? (Fakultativ)
Sie haben gesehen, wie Sie in TensorFlow eine neuronale Netzwerkarchitektur angeben können, um die Ausgabe y als Funktion der Eingabe x zu berechnen, und auch eine Kostenfunktion angeben können. TensorFlow verwendet dann automatisch Backpropagation, um Ableitungen zu berechnen und Gradientenabstieg oder Adam zum Trainieren der Parameter eines neuronalen Netzwerks zu verwenden. Der Backpropagation-Algorithmus, der Ableitungen Ihrer Kostenfunktion in Bezug auf die Parameter berechnet, ist ein Schlüsselalgorithmus beim Lernen neuronaler Netzwerke. Aber wie funktioniert das eigentlich? In diesem und den nächsten optionalen Videos werden wir versuchen, einen Blick darauf zu werfen, wie Backpropagation Ableitungen berechnet. Diese Videos sind völlig optional und gehen nur ein wenig in die Infinitesimalrechnung ein. Wenn Sie bereits mit Infinitesimalrechnung vertraut sind, hoffe ich, dass Ihnen diese Videos gefallen, aber wenn nicht, ist das völlig in Ordnung. Wir werden von den Grundlagen der Infinitesimalrechnung ausgehen, um sicherzustellen, dass Sie über die nötige Intuition verfügen, um zu verstehen, wie Backpropagation funktioniert. Lass uns einen Blick darauf werfen. Ich werde eine vereinfachte Kostenfunktion verwenden, J oder w entspricht w im Quadrat. Die Kostenfunktion ist eine Funktion der Parameter w und sagen wir, b und für diese vereinfachte Kostenfunktion tun wir einfach so, als wäre J von w im Quadrat. Ich werde b für dieses Beispiel ignorieren. Nehmen wir an, der Wert des Parameters w ist gleich 3. J von w entspricht 9, w dem Quadrat von 3 Quadraten. Wenn wir W nun um einen winzigen Betrag erhöhen würden, sagen wir Epsilon, den ich auf 0,001 setze. Wie ändert sich der Wert von J oder w? Wenn wir w um 0,001 erhöhen, wird w zu 3 plus 0,001, also 3,001. J von w, was ein Quadrat von w ist, das wir oben definiert haben, ist jetzt dieses 3,001-Quadrat, was 9,006001 ist. Was wir sehen ist, dass, wenn w um 0,001 steigt, ich diesen Aufwärtspfeil hier verwende, um zu bezeichnen, dass w um 0,001 steigt, wobei 0,001 dieser kleine Wert Epsilon ist. Dann steigt J von w ungefähr um das Sechsfache, das Sechsfache von 0,001. Das ist nicht ganz genau. Es steigt tatsächlich nicht auf 9.006, sondern auf 9.006001. Aber es stellt sich heraus, dass, wenn Epsilon infinitesimal klein wäre, und mit infinitesimal klein meine ich sehr klein. Epsilon ist ziemlich klein, aber nicht verschwindend klein. Wenn Epsilon 0,00000 war, viele Nullen gefolgt von einer Eins, dann wird das immer genauer. In diesem Beispiel sehen wir, dass, wenn w um Epsilon steigt, J ungefähr um das Sechsfache von Epsilon steigt. In der Infinitesimalrechnung würden wir sagen, dass die Ableitung von J von w in Bezug auf w gleich 6 ist. Das heißt nur, wenn w um einen winzigen Betrag steigt, steigt J von w sechsmal so stark. Was wäre, wenn Epsilon einen anderen Wert annehmen würde? Was wäre, wenn Epsilon 0,002 wäre. In diesem Fall wäre w 3 plus 0,002, und aus dem Quadrat von w wird 3,002 im Quadrat, also 9,012004. In diesem Fall kommen wir zu dem Schluss, dass, wenn w um 0,002 steigt, J von w um ungefähr das Sechsfache von 0,002 steigt. Es steigt ungefähr auf 9,012, und diese 0,012 sind ungefähr 6 mal 0,002. Das ist wieder ein bisschen falsch. Das sind hier zusätzliche 0,00004, weil Epsilon nicht ganz verschwindend klein ist. Wieder einmal sehen wir dieses Verhältnis von sechs zu eins zwischen dem, um wie viel w steigt, und dem, um wie viel J von w steigt. Deshalb ist die Ableitung von J von w in Bezug auf w gleich sechs. Je kleiner Epsilon desto genauer wird das. Du kannst das Video übrigens gerne pausieren und diese Berechnung jetzt selbst mit anderen Werten von Epsilon ausprobieren. Der Schlüssel ist, dass, solange Epsilon ziemlich klein ist, das Verhältnis , um das J von w steigt, zu dem Betrag, um den w steigt, 6-1 sein sollte. Probieren Sie es gerne selbst mit anderen Werten von Epsilon aus und überprüfen Sie dann, ob dies wirklich zutrifft. Dies führt uns zu einer informellen Definition der Ableitung, die besagt, dass jedes Mal, wenn w um einen winzigen Betrag von Epsilon steigt, J von w um das k-fache von Epsilon steigt. In unserem Beispiel war k gerade gleich sechs. Dann sagen wir, dass die Ableitung von J von w in Bezug auf w gleich k ist, was im Beispiel gerade 6 war. Sie erinnern sich vielleicht daran, dass Sie bei der Implementierung des Gradientenabstiegs diese Regel wiederholt verwenden werden, um den Parameter w J zu aktualisieren, wobei Alpha wie üblich die Lernrate ist. Was macht Gradient Descent? Beachten Sie, dass, wenn die Ableitung klein ist, diese Aktualisierung eine kleine Aktualisierung des Parameters W_j zur Folge hat, wohingegen eine große Änderung des Parameters W_j eine große Änderung bedeutet. Das ist sinnvoll, weil dies im Grunde bedeutet, dass eine Änderung von w keinen großen Unterschied für den Wert von j macht, also sollten wir uns nicht die Mühe machen, eine große Änderung an W_j vorzunehmen. Aber wenn die Ableitung ist groß, das bedeutet, dass selbst eine winzige Änderung des W_j einen großen Unterschied machen kann um wie viel Sie die Kostenfunktion j von w ändern oder verringern können. In diesem Fall nehmen wir eine größere Änderung an W_j vor, da dies tatsächlich einen großen Unterschied darin macht, wie stark wir die Kostenfunktion J reduzieren können. Schauen wir uns einige weitere Beispiele für Ableitungen an. Was Sie gerade im Beispiel gesehen haben , war, dass, wenn w gleich 3 ist und j von w dem Quadrat von w gleich 9 ist, wenn w um 0,01 um Epsilon steigt, dann wird j von w zu j von 3,01 und ist jetzt 9,006001. Oder mit anderen Worten, j ist um etwa 0,006 gestiegen, was 6 mal 0,001 oder 6 mal Epsilon ist, weshalb die Ableitung von w in Bezug auf W gleich 6 ist. Schauen wir uns an, wie die Ableitung für andere Werte von w aussehen wird. Nehmen wir an, w ist gleich 2. In diesem Fall ist j von w, das Quadrat von w ist jetzt gleich 4, und wenn w um 0,001 steigt, dann wird J von w zu j von 2,001, was 4,004001 entspricht, und so ist j von w von vier auf diesen Wert hier gestiegen, was ungefähr viermal Epsilon größer als vier ist, weshalb die Ableitung jetzt vier ist. Weil ein Anstieg von w um Epsilon dazu geführt hat, dass j von w viermal so stark gestiegen ist. Auch hier gibt es zusätzliche 0,001, weil es nicht ganz genau ist, weil Epsilon unendlich klein ist. Oder schauen wir uns ein anderes Beispiel an. Was wäre, wenn wir gleich minus 3 wären? J von w, was ein Quadrat von w ist, ist immer noch gleich 9, weil negative 3 Quadrate 9 sind. Wenn w wieder um Epsilon steigen würde, dann hast du jetzt w gleich minus 2,999, das ist also j von minus 2,999. Das Quadrat von minus 2,999 entspricht 8,994001, weil w minus 3 plus 0,001 ist. Beachten Sie hier, dass j von w um etwa 0,006 gesunken ist, was dem Sechsfachen von Epsilon entspricht. Was wir in diesem Beispiel haben, ist, dass j mit 9 beginnt, aber jetzt gesunken ist. Beachten Sie diesen Abwärtspfeil hier [unhörbar] um das 6-fache Epsilon oder gleichwertig um das negative 6-fache von Epsilon gestiegen. Deshalb ist die Ableitung in diesem Fall gleich minus 6. Weil w um Epsilon steigt, bewirkt, dass j von w um das negative 6-fache von Epsilon steigt, wenn Epsilon klein ist. Eine andere Möglichkeit, dies zu visualisieren, besteht darin, die Funktion J von w so darzustellen, dass die horizontale Achse w und dies J von w ist. Wenn w gleich 3 ist, ist J von w gleich 9. Wenn es negativ 3 ist, ist es auch gleich 9, und wenn es 2 ist, ist J von w gleich 4. Lassen Sie mich eine Bemerkung machen, die relevant sein könnte, wenn Sie schon einmal einen Kurs in Infinitesimalrechnung besucht haben. Aber wenn Sie es nicht getan haben, macht das, was ich in den nächsten 60 Sekunden sage, vielleicht keinen Sinn, aber machen Sie sich darüber keine Sorgen. Sie müssen es verstehen, um den Rest dieser Videos vollständig verfolgen zu können. Wenn Sie einmal einen Kurs in Infinitesimalrechnung besucht haben, werden Sie vielleicht erkennen, dass die Ableitungen der Steigung einer Linie entsprechen, die gerade die Funktion J von w an diesem Punkt berührt, sagen wir, wo w gleich 3 ist. Die Steigung dieser Linie an diesem Punkt, und die Steigung ist diese Höhe über dieser Breite, ergibt sich als gleich 6, wenn w gleich 3 ist, die Steigung dieser Linie stellt sich als 4 heraus, wenn w gleich 2 ist, und die Steigung dieser Linie stellt sich als minus 6 heraus, wenn w gleich minus 3 ist. In der Infinitesimalrechnung stellt sich heraus, dass die Steigung dieser Linien der Ableitung der Funktion entspricht. Aber wenn Sie noch nie einen Kurs in Infinitesimalrechnung besucht haben und dieses Steigungskonzept noch nie gesehen haben , machen Sie sich darüber keine Sorgen. Nun, es gibt noch eine letzte Beobachtung, die ich machen möchte, bevor ich weitermache, nämlich dass Sie in allen drei Beispielen sehen, dass J von w dieselbe Funktion ist, J von w gleich dem Quadrat von w ist. Aber die Ableitung von J von w hängt von w ab. Wenn w drei ist, ist die Ableitung sechs. Wenn w zwei ist, ist die Ableitung vier. Wenn w negativ 3 ist, ist die Ableitung negativ 6. Es stellt sich heraus, dass Infinitesimalrechnung es uns ermöglichen kann, die Ableitung von J von w in Bezug auf w als 2 mal w zu berechnen. In Kürze werde ich Ihnen zeigen, wie Sie Python verwenden können, um diese Ableitungen mit einem schicken Python-Paket namens SymPy selbst zu berechnen. Aber weil die Infinitesimalrechnung uns sagt, dass die Ableitung von w zum Quadrat J von w 2 w ist, ist die Ableitung, wenn w drei ist, 2 mal 3 ist oder wenn zwei ist 2 mal 2, oder wenn negativ 3 ist, ist 2 mal negativ 3, weil dieser Wert von w mal 2 dir die Ableitung ergibt. Lassen Sie uns noch ein paar Beispiele durchgehen, bevor wir zum Abschluss kommen. Für diese Beispiele setze ich w gleich 2. Sie haben auf der letzten Folie gesehen, dass, wenn J von w quadriert ist, die von mir angegebene Ableitung 2 mal w wäre, also 4. Wenn w um 0,01 steigt, also Epsilon ist, wird J von w so, also ungefähr steigt J von w um das Vierfache von Epsilon. Schauen wir uns ein paar andere Funktionen an. Was ist, wenn J oder w gleich einem Würfel ist? In diesem Fall wären w würfelförmig, 2 Würfel gleich 8, oder was ist, wenn J von w gerade gleich w ist? Hier wird w gleich 2 sein. Oder was wäre, wenn J oder w 1 über w wäre? In diesem Fall wäre 1 über w, 1 über 2 1/2 oder 0,5. Was ist die Ableitung von J von w in Bezug auf w, wenn die Kostenfunktion J von w entweder w würfelförmig oder w oder 1 über w ist. Lassen Sie mich Ihnen zeigen, wie Sie diese Ableitungen selbst mit einer Bibliothek und einem Paket namens SymPy berechnen können. Lassen Sie mich zuerst SymPy importieren. Was ich tun werde, ist SymPy mitzuteilen, dass ich J und w als Symbole für die Berechnung von Ableitungen verwenden werde. Für unser erstes Beispiel hatten wir, dass die Kostenfunktion J gleich w im Quadrat war. Beachten Sie, wie SymPy es auch hier tatsächlich in dieser raffinierten Schrift wiedergibt. Wenn wir SymPy verwenden würden, um die Ableitung von J nach w zu ziehen, sollten wir wie folgt vorgehen. Sie sehen, dass SymPy Ihnen sagt, dass diese Ableitung 2W ist. Lassen Sie mich tatsächlich eine Variable wählen, dJ, dw, wir setzen das so, dass sie gleich ist, geben Sie sie einfach hier erneut ein. Drucken Sie es aus. Es gibt 2 W. Wenn Sie den Wert von w in diesen Ausdruck einfügen möchten, um ihn auszuwerten, können Sie die Methode derivative.subs w, 2 ausführen. Das bedeutet, dass Sie einen Wert von w, der gleich 2 ist, in diesen Ausdruck einfügen und ihn auswerten. Das ergibt den Wert vier, weshalb wir gesehen haben, dass, wenn w gleich 2 ist, die Ableitung von J gleich 4 war. Schauen wir uns einige andere Beispiele an. Was wäre, wenn ich ein Würfel wäre? Dann wird die Ableitung dreimal quadriert. Es ergibt sich aus der Infinitesimalrechnung, und das berechnet SymPy für uns: Wenn J ein Würfel ist, dann ist die Ableitung von J in Bezug auf w 3w im Quadrat. Je nachdem, was w ist, ändert sich auch der Wert der Ableitung. Wir können einstecken, wenn w gleich 2 ist, in diesem Fall erhalten Sie 12. Oder was wäre, wenn J gleich w wäre? In diesem Fall ist die Ableitung gerade gleich 1. Oder das letzte Beispiel, das wir haben, war, was ist, wenn J gleich 1 über w ist? In diesem Fall stellt sich heraus, dass die Ableitung über einem Quadrat negativ 1 ist. Das ist minus 1 über 4. Was ich tun werde, ist die Derivate, die wir ausgearbeitet haben, zu nehmen. Denken Sie daran, für ein Quadrat waren es 2 W, für einen Würfel waren es 3 W im Quadrat. Da w nur 1 und 1 über w ist, ist es minus 1 über dem Quadrat. Kopieren wir das zurück auf unsere andere Folie. Was SymPy oder die Realrechnung uns gezeigt hat, ist, dass, wenn J von w ein Würfel ist, die Ableitung 3w im Quadrat ist, was gleich 12 ist, wenn w gleich 2 ist, wenn J von w gleich w ist, ist die Ableitung gerade gleich 1. Wenn J von w 1 über w ist, ist 1 über dem Quadrat von w negativ, was minus 1/4 ist, wenn w gleich 2 ist. Lass uns anfangen. Wir werden überprüfen, ob diese Ausdrücke , die wir von SymPy erhalten haben, korrekt sind. Versuchen wir, w um Epsilon zu erhöhen, in diesem Fall J von w. Sie können das Video gerne anhalten und diese Mathematik auf Ihrem eigenen Taschenrechner überprüfen, wenn Sie möchten. Aber in diesem Fall wird J von w bis 0,001 Würfeln zu diesem Wert. Also ist J ungefähr von 8 auf 8.012 gestiegen. Es ist ungefähr um das 12-fache gestiegen Epsilon. Somit ist die Ableitung tatsächlich 12. Oder wenn J von w gleich w ist, wenn w um Epsilon steigt, dann ist J von w, was nur w ist, jetzt 2,001. Es ist also um 0,01 gestiegen, was genau dem Wert von Epsilon entspricht. Also ist J of w um das 1-fache gestiegen Epsilon. Die Ableitung ist tatsächlich gleich 1. Beachten Sie, dass dies hier eigentlich genau Epsilon ist, obwohl Epsilon verschwindend klein ist. Wenn in unserem letzten Beispiel J von w gleich 1/w ist, wenn w um Epsilon steigt, dann ist w 1/2,001, dann stellt sich heraus, dass J von w ungefähr 4,9975 ist, mit einigen zusätzlichen Ziffern, die gekürzt werden. Dies stellt sich jedoch als 0,5 minus 0,00025 heraus. J of w hat bei 0,5 angefangen und ist um 0,00025 gesunken. Das ist 0,00025, das ist das 0,25-fache von Epsilon. Es ist um diesen Betrag gesunken oder um das negative 0,25-fache Epsilon gestiegen, weil das negative 0,25-fache von Epsilon dieser Summe hier entspricht. Wir sehen, dass, wenn w um Epsilon steigt, J von w um minus 1/4 oder negativ um das 0,25-fache von Epsilon steigt, weshalb die Ableitung in diesem Fall negativ 1/4 ist. Ich hoffe, dass Sie anhand dieser Beispiele ein Gefühl dafür haben, was die Ableitung in Bezug auf w von J von w bedeutet. Es ist nur so, wenn w um Epsilon steigt, um wie viel steigt J von w um ein gewisses konstantes k-faches Epsilon. Diese Konstante k ist die Ableitung. Der Wert von k hängt sowohl von der Funktion J von w als auch vom Wert von w ab. Bevor wir dieses Video abschließen, möchte ich kurz auf die Notation eingehen, die zum Schreiben von Ableitungen verwendet wird, die Sie möglicherweise in anderen Texten sehen. Das heißt, wenn J von w eine Funktion einer einzelnen Variablen ist, sagen wir w, dann schreiben Mathematiker manchmal die Ableitung als d/dw von J von w. Beachten Sie, dass in dieser Notation der Kleinbuchstabe d verwendet wird. Wenn J dagegen eine Funktion von mehr als einer Variablen ist, verwenden Mathematiker manchmal diese schnörkelige Alternative d, um die Ableitung von J in Bezug auf einen der Parameter w_i zu bezeichnen. Meiner Meinung nach, diese Notation, die zwischen diesem regulären Buchstaben d und diesem stilisierten Infinitesimalrechner-Ableitungssymbol d unterscheidet, es macht für mich wenig Sinn, diese Unterscheidung zu treffen, und diese Notation macht meiner Meinung nach die komplizierte Infinitesimalrechnung und leitet diese Notation ab. Aus historischen Gründen verwendet Analysis jedoch diese beiden unterschiedlichen Notationen, je nachdem, ob J eine Funktion einer einzelnen Variablen oder eine Funktion mehrerer Variablen ist. Aber ich denke, aus praktischen Gründen tendiert diese Notationskonvention dazu, die Dinge einfach zu komplizieren, und zwar auf eine Weise, die ich für nicht wirklich notwendig halte. Für diese Klasse werde ich diese Notation einfach überall verwenden, auch wenn es nur eine einzige Variable gibt. Tatsächlich ist die Funktion J für die meisten unserer Anwendungen eine Funktion von mehr als einer Variablen. Diese andere Notation, die manchmal als partielle Ableitungsnotation bezeichnet wird, ist eigentlich fast immer die richtige Schreibweise, da J normalerweise mehr als eine Variable hat. Aber ich hoffe, dass die Verwendung dieser Notation in diesen Vorlesungen die Präsentation vereinfacht und die Ableitungen etwas verständlicher macht. Tatsächlich ist diese Notation die, die Sie in den Videos davor gesehen haben. Der Kürze halber, anstatt diesen vollständigen Ausdruck hier aufzuschreiben, sieht man ihn manchmal auch abgekürzt als Ableitung oder partielle Ableitung von J in Bezug auf w_i oder so geschrieben. Dies sind nur vereinfachte abgekürzte Formen dieses Ausdrucks hier. Ich hoffe, das gibt Ihnen einen Eindruck davon, was Derivate sind. Es geht nur darum, wenn w um Epsilon um ein bisschen steigt, wie sehr ändert sich J oder w als Konsequenz. Schauen wir uns als Nächstes an, wie Sie Ableitungen in einem neuronalen Netzwerk berechnen können. Dazu müssen wir uns etwas ansehen, das als Berechnungsgraph bezeichnet wird. Schauen wir uns das im nächsten Video an.
Berechnungsdiagramm (Optional)
Der Berechnungsgraph ist eine Schlüsselidee beim Deep Learning und dient auch dazu, wie Programmier-Frameworks wie TensorFlow automatische Ableitungen Ihrer neuronalen Netzwerke berechnen. Schauen wir uns an, wie es funktioniert. Lassen Sie mich das Konzept eines Berechnungsgraphen anhand eines kleinen neuronalen Netzes veranschaulichen. Dieses neuronale Netzwerk hat nur eine Schicht, die auch die Ausgabeschicht ist, und nur eine Einheit in der Ausgabeschicht. Es nimmt uns Eingaben x, wendet eine lineare Aktivierungsfunktion an und gibt Deaktivierung a aus. Genauer gesagt ist diese Ausgabe a gleich wx plus b. Diese im Grunde lineare Regression, aber ausgedrückt als neuronales Netzwerk mit einer Ausgabeeinheit. Angesichts der Ausgabe ist die Ursachenfunktion dann 1/2a, das ist der vorhergesagte Wert abzüglich des tatsächlich beobachteten Werts von y. Für dieses kleine Beispiel haben wir nur ein einziges Trainingsbeispiel, bei dem das Trainingsbeispiel ist, dass die Eingabe x gleich minus 2 ist. Der Ground-Truth-Ausgabewert y ist gleich 2, und die Parameter dieses Netzwerks sind: w ist gleich 2 und b ist gleich 8. Ich möchte zeigen, wie die Berechnung der Ursachenfunktion J anhand eines Berechnungsgraphen Schritt für Schritt berechnet werden kann. Nur zur Erinnerung: Beim Lernen betrachten wir die Ursachenfunktion J gerne als Funktion der Parameter w und b. Nehmen wir die Berechnung von J und zerlegen sie in einzelne Schritte. Zuerst haben Sie den Parameter w , der eine Eingabe für die Ursachenfunktion J ist, und dann müssen wir zuerst w mal x berechnen. Lassen Sie mich das einfach wie folgt nennen: w ist gleich 2, x ist gleich minus 2, und c wäre also negativ 4. Ich werde einfach den Wert hier oben auf diesen Pfeil schreiben, um den Wert anzuzeigen, der Ihre Ausgabe auf diesem Pfeil ist. Der nächste Schritt ist dann die Berechnung von a, was wx plus b ist. Lassen Sie mich hier also einen weiteren Knoten erstellen. Dazu muss b eingegeben werden, der andere Parameter, der in die Ursachenfunktion J eingegeben wird, und a entspricht wx plus b ist gleich c plus b. Wenn Sie diese addieren, ergibt sich das als 4. Dies beginnt mit der Erstellung eines Berechnungsgraphen, in dem die Schritte, die wir zur Berechnung der Ursachenfunktion J benötigen, in kleinere Schritte unterteilt werden. Der nächste Schritt besteht darin, ein minus y zu berechnen, das ich d nenne. Lassen Sie mich den Knoten d haben , der ein Minus y berechnet. Y ist gleich 2, also 4 minus 2 ist 2. Schließlich ist J die Ursache für 1/2 eines minus Y-Quadrats oder 1/2 von d im Quadrat, was gerade 2 entspricht. Wir haben gerade einen Berechnungsgraphen erstellt. Dies ist ein Graph, nicht im Sinne von Diagrammen mit X- und Y-Achsen, sondern das ist die andere Bedeutung des Wortes Graph in der Informatik, nämlich dass es sich um eine Menge von Knoten handelt, die in diesem Fall durch Kanten oder in diesem Fall durch Pfeile verbunden sind. Dieses Berechnungsdiagramm zeigt den Forward-Prop-Schritt, mit dem wir die Ausgabe a des neuronalen Netzwerks berechnen. Aber dann gehe noch weiter und berechne auch den Wert der Ursachenfunktion J. Die Frage ist nun, wie finden wir die Ableitung von J in Bezug auf die Parameter w und b? Schauen wir uns das als Nächstes an. Hier ist das Berechnungsdiagramm aus der vorherigen Folie, das wir für ein Problem abgeschlossen haben, bei dem wir berechnet haben, dass J, die Ursachenfunktion, durch all diese Schritte von links nach rechts für eine Requisite im Berechnungsdiagramm, gleich 2 ist. Was wir jetzt tun möchten, ist die Ableitung von J in Bezug auf w und die Ableitung von J in Bezug auf b. Es stellt sich heraus, dass, während für eine Requisite eine Berechnung von links nach rechts war, die Berechnung der Ableitungen eine Berechnung von rechts nach links ist, weshalb sie Backprop genannt wird, rückwärts von rechts nach links ging. Der letzte Rechenknoten dieses Graphen ist dieser hier, der berechnet, dass J gleich 1/2 von d im Quadrat ist. Im ersten Schritt von Backprop wird gefragt, ob der Wert von d, der die Eingabe für diesen Knoten war, ein wenig geändert wurde. Wie stark ändert sich der Wert von j? Insbesondere werde ich fragen, ob d ein wenig steigen würde, sagen wir 0,001, und das wäre in diesem Fall unser Wert von Epsilon, wie würde sich der Wert von j ändern? Es stellt sich heraus, dass in diesem Fall, wenn d von 2-2,01 geht, dann j von 2-2,02 geht. Wenn also d um Epsilon steigt, steigt j um ungefähr das Zweifache von Epsilon. Wir schließen daraus, dass die Ableitung von J in Bezug auf diesen Wert d, der an diesem letzten Knoten eingegeben wird, gleich zwei ist. Der erste Schritt von Backprop wäre, diesen Wert zwei hier einzugeben, wobei dieser Wert die Ableitung von j in Bezug auf diesen Eingabewert d ist. Wir wissen, wenn d sich ein wenig ändert, ändert sich j um das Doppelte, weil diese Ableitung gleich zwei ist. Der nächste Schritt besteht darin, sich den Knoten davor anzusehen und zu fragen, was die Ableitung von j in Bezug auf a ist? Um das zu beantworten, müssen wir fragen, nun, wenn a um 0,001 steigt, wie ändert sich das j? Nun, wir wissen, dass, wenn a um 0,001 steigt, d nur ein Minus y ist. Wenn a zu 4,001 wird, wird d, was ein minus y ist, wird 4,001 minus y gleich 2, also wird Sub-A um 0,001, und d steigt ebenfalls um 0,001. Aber wir waren bereits zuvor zu dem Schluss gekommen, dass d um 0,001 und j um das Doppelte steigt. Jetzt wissen wir, wenn a um 0,001 steigt, d um 0,001 steigt, dann steigt j ungefähr um das Zweifache von 0,001. Dies sagt uns, dass die Ableitung von j in Bezug auf a ebenfalls gleich zwei ist. Also werde ich den Wert hier eintragen. Dass dies die Ableitung von j in Bezug auf a ist. So wie dies die Ableitung von j nach d war. Wenn Sie schon einmal einen Kurs in Infinitesimalrechnung besucht haben und von der Kettenregel gehört haben, werden Sie vielleicht erkennen, dass dieser Berechnungsschritt, den ich gerade gemacht habe, tatsächlich auf der Kettenregel für Infinitesimalrechnung beruht. Wenn Sie mit der Kettenregel nicht vertraut sind, machen Sie sich darüber keine Sorgen. Für den Rest dieser Videos musst du es nicht wissen. Aber wenn Sie die Kettenregel gesehen haben, werden Sie vielleicht erkennen, dass die Ableitung von j in Bezug auf a fragt, wie stark sich d in Bezug auf a ändert, was die Ableitung von d gegenüber a mal die Ableitung von j in Bezug auf d ist, und wenig Berechnungen zeigen, dass der Teil von t in Bezug auf a eins ist, und wir würden EZ zeigen, dass die Ableitung von J in Bezug auf d gleich zwei ist, weshalb die Ableitung von J in Bezug auf d gleich zwei ist, weshalb die Ableitung von J in Bezug auf a ist eins mal zwei, was gleich zwei ist. Das ist der Wert, den wir bekommen haben. Aber auch hier gilt: Wenn Sie mit der Kettenregel nicht vertraut sind, machen Sie sich darüber keine Sorgen. Die Logik, die wir gerade hier durchgemacht haben, ist der Grund, warum wir wissen, dass j doppelt so stark steigt wie a. Deshalb entspricht dieser abgeleitete Begriff zwei. Der nächste Schritt besteht dann darin, weiter von rechts nach links zu gehen, wie wir es bei Backprop tun. Wir werden fragen, wie sehr eine kleine Änderung in c dazu führt, dass sich j ändert, und wie stark sich y in b verändert, bewirkt, dass sich j ändert? Wir finden das heraus, indem wir uns fragen, was ist, wenn c um Epsilon 0,001 steigt, um wie viel ändert sich? Nun, a ist gleich c plus b. Es stellt sich heraus, dass, wenn c negativ 3,999 ist, aus a, das minus 3,999 plus 8 ist, 4,001 wird. Wenn c um Epsilon steigt, steigt a um Epsilon. Wir wissen, ob a um Epsilon steigt, und weil die Ableitung von J in Bezug auf a zwei ist, wissen wir, dass dies wiederum dazu führt, dass j um das Zweifache von Epsilon steigt. Wir können daraus schließen, dass, wenn c um ein wenig steigt, J um das Doppelte steigt. Wir wissen das, weil wir wissen, dass die Ableitung von J in Bezug auf a 2 ist. Dies lässt den Schluss zu, dass die Ableitung von J in Bezug auf c ebenfalls gleich 2 ist. Ich gebe den Wert hier ein. Nochmals, nur wenn Sie mit der Kettenregel vertraut sind, eine andere Schreibweise ist die Ableitung von J in Bezug auf c, die Ableitung von a nach c. Dies stellt sich heraus , dass dies das 1-fache der Ableitung von J in Bezug auf a ist, von der wir zuvor herausgefunden haben, dass sie gleich 2 ist. Nach einer ähnlichen Berechnung steigt b um 0,001, dann steigt a ebenfalls um 0,001 und J steigt um 2 mal 0,001, weshalb diese Ableitung auch gleich 2 ist. Wir haben hier die Ableitung von J in Bezug auf b und hier die Ableitung von J in Bezug auf c eingegeben. Nun ein letzter Schritt, nämlich, was ist die Ableitung von J in Bezug auf w? W steigt um 0,001. Was passiert? C, das w mal x ist, wenn w 2,001 wäre, wird c, was w mal x ist, 2 mal 2,001 negativ, also wird es negativ 4,002. Wenn w um Epsilon steigt, sinkt c um 2 mal 0,001, oder entsprechend steigt c um minus 2 mal 0,001. Wir wissen, dass, wenn c um minus 2 mal 0,001 steigt, weil die Ableitung von J in Bezug auf c 2 ist, dies bedeutet, dass J um minus 4 mal 0,001 steigt, denn wenn c um einen bestimmten Betrag steigt, ändert sich J um das 2-fache, also negativ 2 mal, das ist minus 4 mal so. Daraus können wir schließen, dass, wenn w um 0,001 steigt, J um das 4-fache von 0,001 steigt. Die Ableitung von J nach w ist negativ 4. Ich werde hier negative 4 schreiben, weil die Ableitung von J in Bezug auf w besteht. Auch hier ist die Kettenregelberechnung, falls Sie damit vertraut sind, diese. Es ist die Ableitung von c in Bezug auf w mal die Ableitung von J in Bezug auf c. Das ist 2 und das ist minus 2, weshalb wir am Ende negative 4 haben, aber machen Sie sich auch hier keine Sorgen, wenn Sie mit der Kettenregel nicht vertraut sind. Um das, was wir gerade getan haben, abzuschließen, führen Sie Backprop in diesem Berechnungsdiagramm manuell aus. Während Forward Prop eine Berechnung von links nach rechts war, bei der w gleich 2 war, konnten wir c berechnen. Dann hatten wir b und das ermöglicht es uns, a und dann d zu berechnen, und dann ging J Backprop von rechts nach links und wir würden zuerst die Ableitung von J in Bezug auf d berechnen und dann zurückgehen, um die Ableitung von J in Bezug auf a zu berechnen, dann die Ableitung von J mit Respekt vor c und schließlich die Ableitung von J in Bezug auf w. Deshalb ist Backprop eine Berechnung von rechts nach links, wohingegen Forward Prop eine Berechnung von links nach rechts war. Lassen Sie uns die Berechnung, die wir gerade durchgeführt haben, noch einmal überprüfen. J mit diesen Werten von w, b, x und y ist gleich dem halben Mal wx plus b minus y im Quadrat, was eineinhalb mal 2 mal negativ 2 plus 8 minus 2 quadriert ist, was gleich 2 ist. Wenn w nun um 0,001 steigen würde, dann wird J zum Halbfachen, w ist jetzt 2,001 mal x, was minus 2 ist, plus b, was 8 minus y im Quadrat ist. Rechnet man das heraus, ergibt das 1,996002. Ungefähr ist J von 2 auf 1,996 gesunken, und dann zusätzliche 002 und J ist daher um das Vierfache von Epsilon gesunken. Dies zeigt, dass, wenn W um Epsilon steigt, J um das Vierfache des Epsilon-Kugeläquivalents sinkt, das J um das negative Vierfache von Epsilon steigt, was y. Die Ableitung von j in Bezug auf w ist minus 4, was wir hier herausgefunden haben. Wenn Sie möchten, können Sie das Video gerne anhalten und diese Mathematik auch selbst überprüfen, um zu überprüfen, was in b passiert. Der andere Parameter wird um Epsilon erhöht und Sie werden hoffentlich feststellen, dass die Ableitung von j in Bezug auf b tatsächlich zwei ist. Dass b um Epsilon steigt, j um das Zweifache von Epsilon steigt, wie durch diese Ableitungsrechnung vorhergesagt. Warum verwenden wir den Backprop-Algorithmus, um Ableitungen zu berechnen? Es stellt sich heraus, dass Hintergrund eine effiziente Methode zur Berechnung von Ableitungen ist. Der Grund, warum wir dies als Rechts-nach-Links-Berechnung sequenzieren, ist, wenn Sie zunächst fragen würden, was die Ableitung von j in Bezug auf w ist? Um dann zu wissen, wie stark sich die Änderung in w auf die Veränderung in j auswirkt, wenn w um Epsilon steigen würde, wie stark würde j um Epsilon steigen? Nun, das erste, was wir wissen wollen, ist, was ist die Ableitung von j in Bezug auf c? Weil eine Änderung in w diese erste Menge hier ändert. Um zu wissen, wie stark sich eine Änderung in w auf j auswirkt, wollen wir wissen, wie stark sich eine Änderung in c auf j auswirkt. Um zu wissen, wie stark sich eine Änderung in c auf j auswirkt, wäre es am nützlichsten, dies zu berechnen, dass die Änderung von c a verändert. Sie möchten wissen, wie stark sich diese Änderung in einem Effekt j usw. auswirkt. Aus diesem Grund können Sie eine Sequenz als Berechnung von rechts nach links zurückstellen. Denn wenn Sie die Berechnung von rechts nach links durchführen, können Sie herausfinden, wie sich die Änderung von d auf die Änderung in j auswirkt. Dann können Sie herausfinden, wie stark diese Änderung in einem Effekt j usw. ist. Bis Sie die Ableitungen jeder dieser Zwischengrößen c, a und d sowie die Parameter w und b gefunden haben. Dass Sie mit einer Rechts-nach-links-Berechnung herausfinden können, wie stark sich diese Zwischengrößen c, a oder d sowie die Eingabeparameter w und b ändern. Wie viel Änderung an einem dieser Dinge den endgültigen Ausgabewert j beeinflusst. Eine Sache, die Backprop effizient macht, ist, dass Sie feststellen, wenn wir rechnen von rechts nach links, wir mussten diesen Term berechnen, die Ableitung von j mit Respekt vor einem einzigen Mal. Diese Größe wird dann verwendet, um sowohl die Ableitung von g nach w als auch die Ableitung von j nach b zu berechnen. Es stellt sich heraus, dass wir in diesem Fall zwei Parameter haben, wenn ein Berechnungsgraph n Knoten hat, also Ihre n dieser Boxen und p-Parameter. Dieses Verfahren ermöglicht es uns, alle Ableitungen von j in Bezug auf alle Parameter in ungefähr n plus p Schritten zu berechnen, anstatt in n mal p-Schritten. Wenn Sie ein neuronales Netzwerk mit beispielsweise 10.000 Knoten und vielleicht 100.000 Parametern haben. Dies würde nach modernen Maßstäben nicht einmal als sehr großes neuronales Netzwerk angesehen werden. In der Lage zu sein, die Ableitungen und 10.000 plus 100.000 Schritte zu berechnen, was Punch und 10.000 entspricht, ist viel besser, als 10.000 mal 100.000 Schritte zu treffen , was einer Milliarde Schritten entspricht. Der Backpropagation-Algorithmus, der mithilfe des Berechnungsdiagramms erstellt wurde, bietet Ihnen eine sehr effiziente Möglichkeit, alle Ableitungen zu berechnen. Deshalb ist es eine so wichtige Idee dafür, wie Deep-Learning-Algorithmen heute implementiert werden. In diesem Video haben Sie gesehen, wie der Berechnungsgraph alle Schritte der Berechnung durchführt, die zur Berechnung der Leistung eines neuronalen Netzes a sowie die Kostenfunktion j erforderlich sind. Er führt schrittweise Berechnungen durch und unterteilt sie in die verschiedenen Knoten des Berechnungsgraphen. Verwendet dann eine Links-nach-Rechts-Berechnung für eine Requisite, um die Kostenfunktion J zu berechnen. Dann eine Rechts-nach-Links-Berechnung oder Backpropagation-Berechnung, um alle Ableitungen zu berechnen. In diesem Video haben Sie gesehen, wie diese Ideen auf ein Beispiel für ein kleines neuronales Netzwerk angewendet wurden. Lassen Sie uns im nächsten Video diese Ideen auf ein größeres neuronales Netzwerk anwenden. Gehen wir zum nächsten Video über.
Größeres Beispiel für ein neuronales Netzwerk (optional)
Video 31
Schauen wir uns in diesem letzten Video zur Intuition für Backprop an, wie der Berechnungsentwurf an einem größeren Beispiel für ein neuronales Netzwerk funktioniert. Hier ist das Netzwerk, das wir mit einer einzigen versteckten Ebene verwenden werden, mit einer einzigen versteckten Einheit, die a1 ausgibt, die in die Ausgabeschicht eingespeist wird, die die endgültige Vorhersage a2 ausgibt. Um die Mathematik leichter handhabbar zu machen, werde ich weiterhin nur ein einziges Trainingsbeispiel mit den Eingaben x = 1, y = 5 verwenden. Und das werden die Parameter des Netzwerks sein. Und durchgehend werden wir die ReLU-Aktivierungsfunktionen von g (z) = max (0, z) verwenden. Für Requisite in Ihrem Netzwerk sieht das also so aus. Wie üblich ist a1 gleich g (w1 mal x + b1). Und so stellt sich heraus, dass w1x + b positiv sein wird. Wir befinden uns also bei max (0, z) = z, Teilen dieser Aktivierungsfunktion. Das entspricht also einfach dem, was 2 mal 1 ist, das ist w1 ist 2 mal x1 + 0, das ist b1, was gleich 2 ist. Und dann entspricht a2 dem, g (w2a1 + b2), was w2 mal a1 + b ist. Nochmals, weil wir uns im positiven Teil der ReLU-Aktivierungsfunktion befinden, der 3 x 2 + 1 = 7 ist. Schließlich verwenden wir die quadratische Fehlerkostenfunktion. Also j (w, b) ist 1/2 (a2-y) Quadrat = 1/2 (7-5) Quadrat, was 1/2 von 2 Quadraten ist, was gerade 2 entspricht. Nehmen wir also diese Berechnung, die wir gerade gemacht haben, und schreiben sie in Form eines Berechnungsdiagramms auf. Um die Berechnung Schritt für Schritt durchzuführen, müssen wir zuerst w1 nehmen und das mit x multiplizieren. Wir haben also w1, das in den Rechenknoten eingespeist wird, der w1 mal x berechnet. Und ich werde das eine temporäre Variable t1 nennen. Als nächstes berechnen wir z1, das ist dieser Begriff hier, der t1 + b1 ist. Also haben wir auch diese Eingabe b1 hier drüben. Und schließlich ist a1 gleich g (z1). Wir wenden die Aktivierungsfunktion an und erhalten hier wieder diesen Wert, 2. Und dann müssen wir als nächstes t2 berechnen, was w2 mal a1 ist. Also, mit w2, gibt uns das diesen Wert, der 6 ist. Dann z2, das ist diese Menge, wir mussten sie b2 und das gibt uns 7. Und schließlich wenden Sie die Aktivierungsfunktion an, g. Am Ende haben wir immer noch 7. Und schließlich ist j ein halbes (a2-y) Quadrat. Und das gibt uns 2. Was war diese Kostenfunktion hier. So führen Sie die schrittweisen Berechnungen für größere neuronale Netzwerke durch und schreiben sie in das Berechnungsdiagramm. Sie haben bereits im letzten Video die Mechanik gesehen, wie Backprop ausgeführt wird. Ich werde die Berechnungen hier nicht Schritt für Schritt durchgehen. Aber wenn Sie Backprop ausführen würden, fragen Sie sich als Erstes, was ist die Ableitung der Kostenfunktion j von a2? Und wenn Sie das berechnen, stellt sich heraus, dass es 2 sind. Also füllen wir das hier aus. Und im nächsten Schritt wird gefragt, wie sich die Kosten j von z2 ableiten lassen. Und mit dieser Ableitung, die wir zuvor berechnet haben, können Sie herausfinden, dass dies 2 ist. Denn wenn z um epsilon steigt, können Sie zeigen, dass für die aktuelle Einstellung aller Parameter a2 um epsilon steigt. Und deshalb werde ich um das 2-fache von Epsilon steigen. Diese Ableitung ist also gleich 2 und so weiter. Schritt für Schritt. Wir können dann herausfinden, dass die Ableitung von j bzw. b2 ebenfalls gleich 2 ist. Die Ableitung nach t2 ist gleich 2 und so weiter und so weiter. Bis Sie schließlich die Ableitung von j in Bezug auf alle Parameter w1, b1, w2 und b2 berechnet haben. Und das ist Backprop. Und auch hier habe ich nicht die mechanischen Schritte jedes einzelnen Schritts der Backprop durchlaufen. Aber es ist im Grunde der Prozess, den Sie im vorherigen Video gesehen haben. Lassen Sie mich eines dieser Beispiele noch einmal überprüfen. Wir haben hier also gesehen, dass die Ableitung von j respektiere w1 gleich 6 ist. Dies sagt also voraus, dass, wenn w1 um Epsilon steigt, j um ungefähr das Sechsfache von Epsilon steigen sollte. Schauen wir uns die Karte an und sehen wir, ob das wirklich stimmt. Dies sind die Berechnungen, die wir erneut durchgeführt haben. Wenn also w, das 2 war, 2,001 wäre, um Epsilon steigt, dann wird aus a1, schauen wir mal, statt 2 auch 2,001. Also a1 statt 2 ist jetzt 2,001. Also 3 x 2,001 + 1, das ergibt 7,003. Und wenn a2 7,003 ist, dann wird einfach 7,003-5 im Quadrat. Das ergibt also 2,003 im Quadrat über 2, was sich als 2,006005 herausstellt. Wenn Sie also einige der zusätzlichen Ziffern ignorieren, sehen Sie anhand dieser kleinen Berechnung, dass, wenn w1 um 0,001 steigt, j von w ungefähr von 2 auf 2,006 gestiegen ist. Also 6 mal so viel. Die Ableitung von j in Bezug auf w1 ist also tatsächlich gleich 6. Das Backprop-Verfahren bietet Ihnen also eine sehr effiziente Möglichkeit, all diese Ableitungen zu berechnen. Was Sie dann in den Gradientenabstiegsalgorithmus oder den Adam-Optimierungsalgorithmus einspeisen können, um dann die Parameter Ihres neuronalen Netzwerks zu trainieren. Und auch hier ist der Grund, warum wir dafür Hintergrund verwenden, eine sehr effiziente Methode, um alle Ableitungen von j in Bezug auf w1, j in Bezug auf b1, j in Bezug auf w2 und j in Bezug auf b2 zu berechnen. Ich habe gerade illustriert, wie wir w1 ein wenig erhöhen und sehen können, wie sehr sich j ändert. Aber das war eine Berechnung von links nach rechts. Und dann mussten wir dieses Verfahren für jeden Parameter durchführen, einen Parameter nach dem anderen. Wenn wir w um 0,001 erhöhen müssten, um zu sehen, wie sich das ändert j. Erhöhen Sie b1 ein wenig, um zu sehen, wie sich j ändert, und jeden Parameter einzeln um ein wenig erhöhen, um zu sehen, wie sich das ändert. Dann wird das eine sehr ineffiziente Berechnung. Und wenn Sie N Knoten in Ihrem Berechnungsdiagramm und P Parameter hätten, würde dieses Verfahren am Ende N mal P Schritte erfordern, was sehr ineffizient ist. Wohingegen wir alle vier dieser Ableitungen N + P anstelle von N mal P Schritten erhalten haben. Und das macht einen großen Unterschied in praktischen neuronalen Netzwerken, in denen die Anzahl der Knoten und die Anzahl der Parameter sehr groß sein können. Das ist also das Ende des Videos für diese Woche. Danke, dass du bis zum Ende dieser optionalen Videos bei mir geblieben bist. Und ich hoffe, dass Sie jetzt ein Gespür dafür haben, wann Sie ein Programm-Framework wie Tensorflow verwenden, um ein neuronales Netzwerk zu trainieren. Was passiert eigentlich unter der Haube und wie wird der Berechnungsgraph verwendet, um Ableitungen effizient für Sie zu berechnen. Vor vielen Jahren, vor dem Aufkommen von Frameworks wie Tensorflow und Pytorch, mussten Forscher die Ableitungen der neuronalen Netzwerke, die sie trainieren wollten, manuell mithilfe von Infinitesimalrechnung berechnen. Und so können Sie in modernen Programm-Frameworks Forwardprop spezifizieren und es sich um Backprop kümmern lassen. Vor vielen Jahren schrieben Forscher das neuronale Netzwerk von Hand auf und berechneten die Ableitungen manuell mit Infinitesimalrechnung. Und dann implementieren Neural eine Reihe von Gleichungen, die sie mühsam auf Papier abgeleitet hatten, um Backprop zu implementieren. Dank des Berechnungsdiagramms und dieser Techniken zur automatischen Durchführung von Ableitungsberechnungen. Wird manchmal Autodiff genannt, zur automatischen Differenzierung. Dieser Prozess, bei dem Forscher manuell Infinitesimalrechnung verwenden, um Ableitungen zu ziehen, wird nicht mehr wirklich durchgeführt. Zumindest musste ich das seit vielen Jahren nicht mehr selbst machen, wegen Autodiff. Vor vielen Jahren lag die Messlatte für die Menge an Infinitesimalrechnung, die man kennen muss, also höher, um neuronale Netze nutzen zu können. Aber dank automatischer Differenzierungsalgorithmen, die normalerweise auf dem Berechnungsgraphen basieren, können Sie jetzt ein neuronales Netzwerk implementieren und Ableitungen einfacher als zuvor für Sie berechnen lassen. Vielleicht ist mit der Reifung neuronaler Netzwerke die Menge an Infinitesimalrechnung, die Sie benötigen, um diese Algorithmen zum Laufen zu bringen, sogar gesunken. Und das war für viele Menschen ermutigend. Und das war’s mit den Videos für diese Woche. Ich hoffe, Ihnen gefallen die Labs und ich freue mich darauf, Sie nächste Woche zu sehen.
Entscheiden Sie, was Sie als nächstes versuchen möchten
Hallo, und willkommen zurück. Inzwischen haben Sie viele verschiedene Lernalgorithmen gesehen, darunter lineare Regression, logistische Regression, sogar Deep Learning oder neuronale Netzwerke, und nächste Woche werden Sie auch Entscheidungsbäume sehen. Sie haben jetzt viele leistungsstarke Tools für maschinelles Lernen, aber wie setzen Sie diese Tools effektiv ein? Ich habe manchmal Teams gesehen, sagen wir sechs Monate, um ein System für maschinelles Lernen aufzubauen , was ein kompetenteres Team meiner Meinung nach in nur ein paar Wochen hätte erledigen können. Wie schnell Sie ein maschinelles Lernsystem zum Laufen bringen können, hängt zu einem großen Teil davon ab, wie gut Sie im Verlauf eines Machine-Learning-Projekts wiederholt gute Entscheidungen darüber treffen können, was als Nächstes zu tun ist. In dieser Woche hoffe ich, Ihnen eine Reihe von Tipps geben zu können, wie Sie Entscheidungen darüber treffen können, was als Nächstes im Projekt für maschinelles Lernen zu tun ist. Ich hoffe, dass Sie dadurch viel Zeit sparen. Schauen wir uns einige Ratschläge zum Aufbau von Systemen für maschinelles Lernen an. Beginnen wir mit einem Beispiel : Nehmen wir an, Sie haben die regularisierte lineare Regression zur Vorhersage der Immobilienpreise implementiert, sodass Sie die übliche Kostenfunktion für Ihren Lernalgorithmus haben, den quadratischen Fehler plus diesen Regularisierungsterm. Aber wenn Sie das Modell trainieren und feststellen, dass es in seinen Vorhersagen unannehmbar große Fehler macht, was versuchen Sie dann als Nächstes? Wenn Sie einen Algorithmus für maschinelles Lernen erstellen, gibt es normalerweise viele verschiedene Dinge, die Sie ausprobieren könnten. Sie könnten sich zum Beispiel für mehr Trainingsbeispiele entscheiden, da es den Anschein hat, dass mehr Daten hilfreich sein sollten, oder vielleicht denken Sie, dass Sie zu viele Funktionen haben, sodass Sie einen kleineren Satz von Funktionen ausprobieren könnten. Oder vielleicht möchten Sie zusätzliche Funktionen erhalten, z. B. endlich zusätzliche Eigenschaften der Häuser, die Sie in Ihre Daten aufnehmen können, und vielleicht hilft Ihnen das dabei, besser zu werden. Oder Sie nehmen die vorhandenen Features x_1, x_2 usw. und versuchen, die Polynommerkmale x_1 im Quadrat, x_2 im Quadrat, x_1, x_2 usw. hinzuzufügen. Oder Sie fragen sich vielleicht, ob der Wert von Lambda gut gewählt ist, und Sie könnten sagen, vielleicht ist er zu groß, ich möchte ihn verringern. Oder du sagst vielleicht, vielleicht ist es zu klein, ich möchte versuchen, es zu vergrößern. Bei jeder Anwendung des maschinellen Lernens stellt sich oft heraus, dass einige dieser Dinge fruchtbar sein könnten und andere nicht fruchtbar sein könnten. Der Schlüssel zur effektiven Entwicklung eines Algorithmus für maschinelles Lernen liegt darin, einen Weg zu finden, gute Entscheidungen darüber zu treffen, wo Sie Ihre Zeit investieren möchten. Ich habe zum Beispiel gesehen, wie Teams buchstäblich viele, viele Monate damit verbracht haben, mehr Trainingsbeispiele zu sammeln, weil sie dachten, dass mehr Trainingsdaten helfen würden, aber es stellt sich heraus, dass sie manchmal sehr hilfreich sind und manchmal nicht. In dieser Woche erfahren Sie, wie Sie eine Reihe von Diagnosen durchführen. Mit Diagnose meine ich einen Test, den Sie ausführen können, um herauszufinden, was mit einem Lernalgorithmus funktioniert oder nicht, um Hinweise zur Verbesserung seiner Leistung zu erhalten. Bei einigen dieser Diagnosen erfahren Sie beispielsweise, ob es sich lohnt, Wochen oder sogar Monate mehr Trainingsdaten zu sammeln, denn wenn ja, können Sie dann die Investition tätigen, um mehr Daten zu erhalten, was hoffentlich zu einer besseren Leistung führt, oder wenn nicht, hätte Ihnen die Durchführung dieser Diagnose Monate Zeit sparen können. Eine Sache, die Sie auch diese Woche sehen, ist, dass die Implementierung von Diagnosen einige Zeit in Anspruch nehmen kann, deren Ausführung jedoch eine sehr gute Nutzung Ihrer Zeit sein kann. Diese Woche werden wir viel Zeit damit verbringen, über verschiedene Diagnosen zu sprechen, die Sie verwenden können, um Ihnen Hinweise zu geben, wie Sie die Leistung Ihres Lernalgorithmus verbessern können. Schauen wir uns zunächst an, wie Sie die Leistung Ihres Lernalgorithmus bewerten können. Lass uns das im nächsten Video machen.
Ein Modell auswerten
Schauen wir uns an, Sie haben ein Modell für maschinelles Lernen trainiert. Wie bewerten Sie die Leistung dieses Modells? Sie stellen fest, dass eine systematische Methode zur Leistungsbewertung auch einen klareren Weg aufzeigt, wie seine Leistung verbessert werden kann. Schauen wir uns also an, wie das Modell bewertet wird. Nehmen wir das Beispiel des Lernens, Immobilienpreise als Funktion der Größe vorherzusagen. Nehmen wir an, Sie haben das Modell trainiert, um Immobilienpreise als Funktion der Größe x vorherzusagen. Und für das Modell ist das ein Polynom vierter Ordnung. Also verfügt über x, x quadriert, ausführen und x für die 4. Da wir ein Polynom 1/4 Ordnung an einen Trainingssatz mit fünf Datenpunkten anpassen, passt das sehr gut zu den Trainingsdaten. Dieses Modell gefällt uns jedoch nicht besonders, denn obwohl das Modell gut zu den Trainingsdaten passt, glauben wir, dass es sich nicht auf neue Beispiele verallgemeinern lässt, die nicht im Trainingssatz enthalten sind. Wenn Sie also Preise vorhersagen, nur ein einzelnes Merkmal an der Größe des Hauses, könnten Sie das Modell so zeichnen und wir könnten sehen, dass die Kurve sehr schwach ist, sodass wir wissen, dass diese Parodie kein gutes Modell ist. Aber wenn Sie dieses Modell mit noch mehr Funktionen ausstatten würden, sagen wir, wir hätten x1 für die Größe des Hauses, die Anzahl der Schlafzimmer, die Anzahl der Stockwerke des Hauses und auch das Alter des Hauses in Jahren, dann wird es viel schwieriger, f zu plotten, weil f jetzt eine Funktion von x1 bis x4 ist. Und wie zeichnet man eine vierdimensionale Funktion auf? Um also festzustellen, ob Ihr Modell gut abschneidet, insbesondere für Anwendungen, bei denen Sie mehr als ein oder zwei Merkmale haben, was es schwierig macht, f von x zu plotten. Wir benötigen eine systematischere Methode, um zu bewerten, wie gut Ihr Modell abschneidet. Hier ist eine Technik, die Sie verwenden können. Wenn Sie über einen Trainingssatz verfügen und dies ein kleiner Trainingssatz mit nur 10 hier aufgeführten Beispielen ist, können Sie den Trainingssatz stattdessen in zwei Teilmengen aufteilen, anstatt all Ihre Daten zum Trainieren der Parameter w und p des Modells zu verwenden. Ich werde hier einen Schlussstrich ziehen und 70% der Daten in den ersten Teil stecken und das nenne ich das Trainingsset. Und den zweiten Teil der Daten, sagen wir mal 30% der Daten, werde ich hineinlegen, ist festgelegt. Und was wir tun werden, ist, die Modelle und Parameter auf dem Trainingssatz mit diesen ersten etwa 70% der Daten zu trainieren und dann werden wir seine Leistung an diesem Testset testen. In der Notation verwende ich x1, y1? Wie zuvor, um die Trainingsbeispiele mit xm, ym zu bezeichnen, nur dass das jetzt explizit gemacht werden soll. In diesem kleinen Beispiel hätten wir also sieben Trainingsbeispiele. Und um eine neue Notation einzuführen, verwende ich meinen Tiefzug. M train ist eine Reihe von Trainingsbeispielen, die in diesem kleinen Datensatz 7 sind. Der Indexzug betont also nur, ob wir uns den Trainingsset-Teil der Daten ansehen. Und für den Testsatz verwende ich die Notation x1, tiefgestellter Test, Komma y1, Index Test, um das erste Testbeispiel zu bezeichnen, und das gilt bis zu x mtest tiefgezogenen Tests, und m Tests ist die Anzahl der Testbeispiele, die in diesem Fall 3 ist. Und es ist nicht ungewöhnlich, dass Sie Ihren Datensatz nach einer Aufteilung von 70, 30 oder 80, 20 aufteilen, wobei die meisten Ihrer Daten in den Trainingssatz und dann ein kleinerer Bruchteil in den Testsatz fließen. Um ein Modell zu trainieren und auszuwerten, würde es also so aussehen, wenn Sie eine lineare Regression mit quadratischen Fehlerkosten verwenden. Beginnen Sie mit der Anpassung der Parameter, indem Sie die Kostenfunktion j von w, b minimieren. Dies ist also die übliche Kostenfunktion, die über w, b dieser quadratischen Fehlerkosten minimiert wird, plus den Regularisierungsterm, der länger als 2 m ist, mal einen Teil des w, j-Quadrats. Und um dann festzustellen, wie gut dieses Modell abschneidet, würden Sie den J-Test von w, b berechnen, was dem durchschnittlichen Fehler im Testsatz entspricht, und das entspricht gerade dem 1/2-fachen M-Test. Das ist die Anzahl der Testbeispiele. Und dann, von einigen insgesamt, die Beispiele von r gleich 1, bis hin zur Anzahl der Testbeispiele der quadratischen Ära auf jedem der Testbeispiele wie folgt. Es handelt sich also um eine Vorhersage auf der Eingabe des If-Testbeispiels abzüglich des tatsächlichen Preises des Hauses im Quadrat des Testbeispiels. Und beachten Sie, dass die Testfehlerformel J-Test diesen Regularisierungsterm nicht enthält. Und das gibt Ihnen ein Gefühl dafür, wie gut Ihr Lernalgorithmus abschneidet. Eine der Größen, die für den Computer oft nützlich sind, sowie der Trainingsfehler, der ein Maß dafür ist, wie gut Ihr Lernalbum auf dem Trainingsset abschneidet. Lassen Sie mich also definieren, dass J train of w, b dem Durchschnitt des Trainingssatzes entspricht. 1 über bis 2 m oder 1/2 m tiefgezogener Zug von einigen über Ihrem Trainingssatz von diesem quadratischen Fehlerterm. Und auch hier ist der Regularisierungsterm nicht enthalten, im Gegensatz zu der Kostenfunktion, die Sie minimieren, um die Parameter anzupassen. In dem Modell, wie wir es zuvor in diesem Video gesehen haben, wird J train of w, b also niedrig sein, da die durchschnittliche Ära in Ihren Trainingsbeispielen Null oder sehr nahe Null sein wird. Ich trainiere also sehr nahe Null. Aber wenn du noch ein paar zusätzliche Beispiele in deinem Testset hast, an denen das Album nicht trainiert wurde, dann diese Testbeispiele, mein Liebesleben, diese. Und es gibt eine große Lücke zwischen dem, was das Album als geschätzten Immobilienpreis vorhersagt, und dem tatsächlichen Wert dieser Immobilienpreise. Deshalb werden die J-Tests hoch sein. Wenn Sie also sehen, dass der J-Test bei diesem Modell ganz oben steht, können Sie erkennen, dass er zwar im Trainingssatz gut abschneidet, aber nicht so gut darin ist, neue Beispiele auf neue Datenpunkte zu verallgemeinern, die nicht im Trainingssatz enthalten waren. Das war also Regression mit quadratischen Fehlerkosten. Schauen wir uns nun an, wie Sie dieses Verfahren auf ein Klassifizierungsproblem anwenden. Wenn Sie beispielsweise zwischen handgeschriebenen Ziffern klassifizieren, die entweder 0 oder 1 sind, also wie zuvor, passen Sie die Parameter an, indem Sie die Kostenfunktion minimieren, um die Parameter w, b zu ermitteln. Wenn Sie beispielsweise die logistische Regression trainieren, dann wäre dies die Kostenfunktion J von w, b, wobei dies die übliche logistische Verlustfunktion ist, und dann noch der Regularisierungsterm. Und um den Testfehler zu berechnen, ist der J-Test dann der Durchschnitt Ihrer Testbeispiele, das sind die 30% Ihrer Daten, die nicht im Trainingssatz des logistischen Verlusts in Ihrem Testsatz enthalten waren. Und der Trainingsfehler, den Sie auch mit dieser Formel berechnen können, ist der durchschnittliche logistische Verlust Ihrer Trainingsdaten, den das Album verwendet hat, um die Kostenfunktion J von w, b zu minimieren. Nun, wenn ich das hier beschrieben habe, funktioniert es, okay, um herauszufinden, ob Ihr Lernalgorithmus gut abschneidet, indem ich sehe, wie ich in Bezug auf Testfehler abgeschnitten habe. Bei der Anwendung von maschinellem Lernen auf Klassifikationsprobleme gibt es tatsächlich eine andere Definition von J-Tests und J-Train, die vielleicht noch häufiger verwendet wird. Das heißt, anstatt den logistischen Verlust zu verwenden, um den Testfehler zu berechnen, und den Trainingsfehler, um stattdessen zu messen, was der Bruchteil des Testsatzes und der Bruchteil des Trainingssatzes ist, den der Algorithmus falsch klassifiziert hat. Speziell für das Testset können Sie den Algorithmus also für jedes Testbeispiel eine Vorhersage von 1 oder 0 treffen lassen. Denken Sie also daran, dass wir uns 1 vorhersagen würden, wenn f von x größer als gleich 4,5 ist, und Null, wenn es kleiner als 0,5 ist. Und Sie können dann im Testset den Bruchteil der Beispiele hochzählen, bei denen y_hat nicht dem tatsächlichen Ground-Truth-Label entspricht, während es sich im Testsatz befindet. Konkret ausgedrückt, wenn Sie handgeschriebene Ziffern 0, 1 durch neue Klassifikationswürfe klassifizieren, dann wären J-Tests der Bruchteil dieses Testsatzes, wobei 0 als 1 von 1 klassifiziert wurde und als 0 klassifiziert wurde. Und in ähnlicher Weise ist J Train ein Bruchteil des Trainingssatzes, der falsch klassifiziert wurde. Wenn Sie einen Datensatz nehmen und ihn in einen Trainingssatz und einen separaten Testsatz aufteilen, können Sie systematisch bewerten, wie gut Ihre Lernergebnisse abschneiden. Indem Sie sowohl J-Tests als auch J-Train berechnen, können Sie jetzt messen, wie sich der Testsatz und der Trainingssatz entwickelt haben. Dieses Verfahren ist ein Schritt zu dem, was Sie automatisch auswählen können, welches Modell für eine bestimmte Anwendung für maschinelles Lernen verwendet werden soll. Wenn Sie beispielsweise versuchen, Immobilienpreise vorherzusagen, sollten Sie eine gerade Linie an Ihre Daten anpassen oder ein Polynom zweiter Ordnung oder ein Polynom dritter Ordnung vierter Ordnung anpassen? Es stellt sich heraus, dass Sie mit einer weiteren Verfeinerung der Idee, die Sie in diesem Video gesehen haben, einen Algorithmus verwenden können, der Ihnen hilft, diese Art von Entscheidung automatisch und gut zu treffen. Schauen wir uns im nächsten Video an, wie das geht.
Modellauswahl und Training/Kreuzvalidierung/Testsätze
Im letzten Video haben Sie gesehen, wie Sie das Testset verwenden, um die Leistung eines Modells zu bewerten. Lassen Sie uns diese Idee in diesem Video noch weiter verfeinern, sodass Sie die Technik verwenden können, um automatisch ein gutes Modell für Ihren Algorithmus für maschinelles Lernen auszuwählen. Eine Sache, die wir gesehen haben, ist, dass, sobald die Parameter w und b des Modells an den Trainingssatz angepasst wurden. Der Trainingsfehler ist möglicherweise kein guter Indikator dafür, wie gut der Algorithmus abschneidet oder wie gut er sich auf neue Beispiele verallgemeinern lässt, die nicht im Trainingssatz enthalten waren , und insbesondere für dieses Beispiel wird der Trainingsfehler so gut wie Null sein. Das ist wahrscheinlich viel niedriger als der tatsächliche Generalisierungsfehler, und damit meine ich den durchschnittlichen Fehler bei neuen Beispielen, die nicht im Trainingssatz enthalten waren. Was Sie im letzten Video gesehen haben, ist , dass ich die Leistung des Algorithmus an Beispielen teste, nicht darauf trainiert ist. Das ist ein besserer Indikator dafür, wie gut das Modell bei neuen Daten wahrscheinlich abschneiden wird. Damit meine ich andere Daten, die nicht im Trainingssatz enthalten sind. Schauen wir uns an, wie sich das auswirkt und wie wir ein Testset verwenden könnten, um ein Modell für eine bestimmte Anwendung des maschinellen Lernens auszuwählen. Wenn Sie eine Funktion zur Vorhersage von Immobilienpreisen oder ein anderes Regressionsproblem anpassen möchten, könnten Sie ein Modell in Betracht ziehen, ein lineares Modell wie dieses anzupassen. Dies ist ein Polynom erster Ordnung, und wir verwenden auf dieser Folie d gleich 1, um die Anpassung eines Polynoms erster Ordnung zu bezeichnen. Wenn Sie ein solches Modell an Ihren Trainingssatz anpassen würden, erhalten Sie einige Parameter, w und b, und Sie können dann J-Tests berechnen, um abzuschätzen, wie gut sich das auf neue Daten verallgemeinern lässt? Auf dieser Folie verwende ich w^1, b^1, um zu kennzeichnen, dass dies die Parameter sind, die Sie erhalten, wenn Sie ein Polynom erster Ordnung, einen Grad eins, anpassen, d entspricht 1 Polynom. Jetzt könnten Sie auch erwägen, ein Polynom oder ein quadratisches Modell zweiter Ordnung anzupassen, also ist dies das Modell. Wenn Sie dies an Ihren Trainingssatz anpassen würden, würden Sie einige Parameter erhalten, w^2, b^2, und Sie können diese Parameter dann auf ähnliche Weise in Ihrem Testsatz auswerten und J testen w^2, b^2, und das gibt Ihnen ein Gefühl dafür, wie gut das Polynom zweiter Ordnung abschneidet. Sie können versuchen, dass d gleich 3 ist, das ist ein Polynom dritter Ordnung oder ein Polynom dritten Grades, das so aussieht, und Parameter anpassen und auf ähnliche Weise den J-Test erhalten. Sie könnten so lange weitermachen, bis Sie beispielsweise ein Polynom 10. Ordnung versuchen und am Ende einen J-Test von w^10, b^10 haben. Das gibt Ihnen ein Gefühl dafür, wie gut das Polynom 10. Ordnung abschneidet. Ein Verfahren, das Sie ausprobieren könnten, es stellt sich heraus, dass es nicht das beste Verfahren ist, aber eine Sache, die Sie versuchen könnten, ist, sich all diese J-Tests anzusehen und herauszufinden, welcher Ihnen den niedrigsten Wert bietet. Sagen wir, Sie stellen fest, dass, J teste auf das Polynom fünfter Ordnung für w^5, sich b^5 als das niedrigste herausstellt. Wenn das der Fall ist, könnten Sie entscheiden, dass das Polynom d gleich 5 fünfter Ordnung am besten abschneidet, und dieses Modell für Ihre Anwendung wählen. Wenn Sie abschätzen möchten, wie gut dieses Modell abschneidet, könnten Sie eine Sache tun, die sich jedoch als leicht fehlerhaft herausstellt, darin, den Testsatzfehler zu melden, J test w^5, b^5. Der Grund, warum dieses Verfahren fehlerhaft ist, ist der J-Test von w^5. b^5 ist wahrscheinlich eine optimistische Schätzung des Generalisierungsfehlers. Mit anderen Worten, es ist wahrscheinlich niedriger als der tatsächliche Generalisierungsfehler, und der Grund dafür ist, dass in dem Verfahren, über das wir auf dieser Folie mit grundlegenden Anpassungen gesprochen haben, ein zusätzlicher Parameter, nämlich d, der Grad des Polynoms, und wir haben diesen Parameter anhand des Testsatzes ausgewählt. Auf der vorherigen Folie haben wir gesehen, dass, wenn Sie w, b an die Trainingsdaten anpassen würden, die Trainingsdaten eine zu optimistische Schätzung des Generalisierungsfehlers wären. Es stellt sich auch heraus, dass, wenn Sie den Parameter d anhand des Testsatzes wählen möchten, der J-Test der Testmenge jetzt zu optimistisch ist, d. h. die tatsächliche Schätzung des Generalisierungsfehlers ist niedriger als die tatsächliche Schätzung. Das Verfahren auf dieser speziellen Folie ist fehlerhaft und ich empfehle nicht, es zu verwenden. Stattdessen, wenn Sie automatisch ein Modell auswählen möchten, z. B. entscheiden, welches Gradpolynom verwendet werden soll. So ändern Sie das Trainings- und Testverfahren, um die Modellauswahl durchzuführen. Wobei Modellauswahl meine ich die Auswahl zwischen verschiedenen Modellen, wie diesen 10 verschiedenen Modellen, die Sie möglicherweise für Ihre Anwendung für maschinelles Lernen verwenden möchten. Wir modifizieren das Verfahren so, dass wir Ihre Daten nicht in nur zwei Teilmengen aufteilen, den Trainingssatz und den Testsatz, sondern Ihre Daten in drei verschiedene Teilmengen aufteilen, die wir den Trainingssatz, den Kreuzvalidierungssatz und dann auch den Testsatz nennen. Wenn wir unser vorheriges Beispiel dieser 10 Trainingsbeispiele verwenden, könnten wir es so aufteilen, dass 60 Prozent der Daten in den Trainingssatz eingegeben werden. Die Notation, die wir für den Teil des Trainingssatzes verwenden, ist dieselbe wie zuvor, außer dass jetzt M train die Anzahl der Trainingsbeispiele sechs ist und wir 20 Prozent der Daten in den Kreuzvalidierungssatz eingeben könnten und eine Notation, die ich verwenden werde, ist x_cv von eins für die erste Beispiel für eine Kreuzvalidierung. CV steht also für Kreuzvalidierung, bis hin zu x_cv von m_cv und y_cv von m_cv. Wo in diesem Beispiel m_cv gleich 2 ist, ist dies die Anzahl der Kreuzvalidierungsbeispiele. Dann haben wir endlich den gleichen Testsatz wie zuvor, also x1 bis x m Tests und y1 bis y m, wobei m Tests gleich 2 sind. Dies ist die Anzahl der Testbeispiele. Wir sehen uns auf der nächsten Folie, wie Sie das Kreuzvalidierungssatz verwenden. Wir werden das Verfahren so modifizieren, dass Sie den Trainingssatz und den Testsatz bereits gesehen haben und wir werden eine neue Teilmenge der Daten einführen, die als Kreuzvalidierungssatz bezeichnet wird. Der Name Kreuzvalidierung bezieht sich darauf , dass es sich um einen zusätzlichen Datensatz handelt, den wir verwenden werden , um die Gültigkeit oder tatsächliche Genauigkeit verschiedener Modelle zu überprüfen oder ihnen zu vertrauen. Ich denke nicht, dass es ein guter Name ist, aber so haben die Leute im Bereich maschinelles Lernen diesen zusätzlichen Datensatz genannt. Sie hören vielleicht auch, dass Leute das kurz Validierungssatz nennen, es sind nur weniger Silben als Kreuzvalidierung, oder in einigen Anwendungen wird dies auch als Entwicklungssatz bezeichnet. Bedeutet im Grunde dasselbe oder kurz gesagt. Manchmal hört man, dass die Leute das Entwicklerset nennen, aber all diese Begriffe bedeuten dasselbe wie Kreuzvalidierungssatz. Ich persönlich verwende den Begriff Dev-Set am häufigsten, weil es die kürzeste und schnellste Art ist, ihn auszudrücken, aber Kreuzvalidierung wird von Praktikern des maschinellen Lernens etwas häufiger verwendet. Anhand dieser drei Teilmengen des Datentrainingssatzes, des Kreuzvalidierungssatzes und des Testsatzes können Sie dann den Trainingsfehler, den Kreuzvalidierungsfehler und den Testfehler mithilfe dieser drei Formeln berechnen. Während normalerweise keiner dieser Begriffe den Regularisierungsterm enthält, der im Trainingsziel enthalten ist, und diesen neuen Term in der Mitte, ist der Kreuzvalidierungsfehler nur der Durchschnitt Ihrer m_cv-Kreuzvalidierungsbeispiele für den durchschnittlichen, sagen wir quadratischen Fehler. Dieser Begriff wird nicht nur als Kreuzvalidierungsfehler bezeichnet, sondern auch allgemein kurz als Validierungsfehler oder sogar als Development Set Error oder Dev-Fehler bezeichnet. Mit diesen drei Messgrößen für die Leistung des Lernalgorithmus können Sie dann auf diese Weise die Modellauswahl durchführen. Bei den 10 Modellen können Sie, genau wie zuvor auf dieser Folie, wobei d gleich 1, d gleich 2 ist, bis hin zu einem Polynom 10. Grad oder 10. Ordnung, dann die Parameter w_1, b_1 anpassen. Aber anstatt dies an Ihrem Testset auszuwerten, werten Sie diese Parameter stattdessen in Ihren Kreuzvalidierungssätzen aus und berechnen J_cv von w1, b1, und in ähnlicher Weise erhalten wir für das zweite Modell j_CV von w2, v2 und bis hinunter zu J_cv von w10, b10. Um ein Modell auszuwählen, schauen Sie sich dann an, welches Modell den niedrigsten Kreuzvalidierungsfehler aufweist, und nehmen wir konkret an, dass j_CV von w4, b4 so niedrig wie ist, und das bedeutet, dass Sie dieses Polynom vierter Ordnung als das Modell wählen, das Sie für diese Anwendung verwenden werden. Schließlich, wenn Sie eine Schätzung des Generalisierungsfehlers angeben möchten, wie gut dieses Modell bei neuen Daten abschneidet. Sie verwenden dazu diese dritte Teilmenge Ihrer Daten, den Testsatz, und Sie melden Jtest von w4, b4 aus. Sie stellen fest, dass Sie während des gesamten Vorgangs diese Parameter mithilfe des Trainingssets angepasst haben. Sie haben dann den Parameter d oder den Grad des Polynoms mithilfe des Kreuzvalidierungssatzes ausgewählt. Bis zu diesem Zeitpunkt haben Sie keine Parameter, weder w noch b oder d, an den Testsatz angepasst, und deshalb ist Jtest in diesem Beispiel eine faire Schätzung des Generalisierungsfehlers dieses Modells, also die Parameter w4, b4. Dies bietet ein besseres Verfahren für die Modellauswahl und ermöglicht es Ihnen, automatisch eine Entscheidung zu treffen, z. B. welches Polynom der Ordnung für Ihr lineares Regressionsmodell ausgewählt werden soll. Dieses Modellauswahlverfahren funktioniert auch für die Auswahl zwischen anderen Modelltypen. Zum Beispiel die Wahl einer neuronalen Netzwerkarchitektur. Wenn Sie ein Modell für die Erkennung handgeschriebener Ziffern anpassen, könnten Sie drei Modelle wie dieses in Betracht ziehen, vielleicht sogar eine größere Modellgruppe als nur ich, aber hier sind ein paar verschiedene neuronale Netzwerke von klein, etwas größer und dann noch größer. Um Ihnen bei der Entscheidung zu helfen, wie viele Schichten das neuronale Netzwerk hat und wie viele versteckte Einheiten pro Schicht Sie haben sollten, können Sie dann alle drei dieser Modelle trainieren und am Ende die Parameter w1, b1 für das erste Modell, w2, b2 für das zweite Modell und w3, b3 für das dritte Modell erhalten. Anschließend können Sie die Leistung neuronaler Netzwerke mithilfe von Jcv anhand Ihres Kreuzvalidierungssatzes bewerten. Da es sich um ein Klassifizierungsproblem handelt, wird Jcv am häufigsten als Bruchteil der Kreuzvalidierungsbeispiele berechnet , die der Algorithmus falsch klassifiziert hat. Sie würden dies mit allen drei Modellen berechnen und dann das Modell mit dem niedrigsten Kreuzvalidierungsfehler auswählen. Wenn in diesem Beispiel der niedrigste Kreuzvalidierungsfehler vorliegt, wählen Sie das zweite neuronale Netzwerk aus und verwenden die mit diesem Modell trainierten Parameter. Wenn Sie schließlich eine Schätzung des Generalisierungsfehlers melden möchten, verwenden Sie den Testsatz, um abzuschätzen, wie gut das neuronale Netzwerk, das Sie gerade ausgewählt haben, abschneiden wird. Es gilt als bewährte Methode beim maschinellen Lernen, dass Sie, wenn Sie Entscheidungen über Ihr Modell treffen müssen, z. B. die Anpassung von Parametern oder die Wahl der Modellarchitektur, z. B. die neuronale Netzwerkarchitektur oder den Polynomgrad, wenn Sie eine lineare Regression anpassen, all diese Entscheidungen nur anhand Ihres Trainingssatzes und Ihres Kreuzvalidierungssatzes treffen und den Testsatz überhaupt nicht betrachten, während Sie noch Entscheidungen über Ihren Lernalgorithmus treffen. Erst nachdem Sie sich ein Modell als endgültiges Modell ausgedacht haben, können Sie es anhand des Testsatzes evaluieren, und da Sie anhand des Testsatzes keine Entscheidungen getroffen haben, wird sichergestellt, dass Ihr Testset eine faire und nicht zu optimistische Schätzung dafür ist, wie gut Ihr Modell auf neue Daten verallgemeinert werden kann. Das ist Modellauswahl und das ist tatsächlich ein sehr weit verbreitetes Verfahren. Ich verwende dies ständig, um automatisch auszuwählen, welches Modell für eine bestimmte Anwendung für maschinelles Lernen verwendet werden soll. Anfang dieser Woche habe ich das Ausführen von Diagnosen erwähnt, um zu entscheiden, wie die Leistung eines Lernalgorithmus verbessert werden kann. Da Sie nun die Möglichkeit haben, Lernalgorithmen zu evaluieren und sogar automatisch ein Modell auszuwählen, wollen wir uns eingehender mit Beispielen einiger Diagnosen befassen. Die leistungsfähigste Diagnose , die ich kenne und die ich für viele Anwendungen des maschinellen Lernens verwendet habe, ist die sogenannte Bias and Variance. Schauen wir uns im nächsten Video an, was das bedeutet.
Diagnose von Verzerrung und Varianz
Der typische Arbeitsablauf bei der Entwicklung eines maschinellen Lernsystems besteht darin, dass Sie eine Idee haben und das Modell trainieren und fast immer feststellen, dass es noch nicht so gut funktioniert, wie Sie es sich wünschen. Wenn ich ein Modell für maschinelles Lernen trainiere, funktioniert es beim ersten Mal so gut wie nie. Der Schlüssel zum Aufbau eines maschinellen Lernsystems besteht darin, zu entscheiden, was als Nächstes zu tun ist , um seine Leistung zu verbessern. Ich habe in vielen verschiedenen Anwendungen festgestellt , dass die Untersuchung der Verzerrung und Varianz eines Lernalgorithmus Ihnen eine sehr gute Anleitung gibt, was Sie als Nächstes ausprobieren sollten. Schauen wir uns an, was das bedeutet. Sie erinnern sich vielleicht an dieses Beispiel aus dem ersten Kurs über lineare Regression. Wenn Sie diesen Datensatz mit einer geraden Linie versehen, schneidet er nicht so gut ab. Wir haben gesagt, dass dieser Algorithmus eine hohe Verzerrung aufweist oder dass er diesen Datensatz unterbewertet. Wenn Sie ein Polynom vierter Ordnung anpassen, weist es eine hohe Varianz auf oder es passt zu weit. In der Mitte sieht es ziemlich gut aus, wenn Sie ein quadratisches Polynom anpassen. Dann sagte ich, das sei genau richtig. Da dies ein Problem mit nur einem einzigen Feature x ist, könnten wir die Funktion f plotten und sie so betrachten. Aber wenn Sie mehr Funktionen hätten, können Sie f nicht so einfach plotten und visualisieren, ob es gut läuft. Anstatt zu versuchen, sich solche Diagramme anzusehen, besteht eine systematischere Methode zur Diagnose oder um herauszufinden, ob Ihr Algorithmus eine hohe Verzerrung oder eine hohe Varianz aufweist, darin, die Leistung Ihres Algorithmus im Trainingssatz und im Kreuzvalidierungssatz zu untersuchen. Schauen wir uns insbesondere das Beispiel links an. Wenn Sie J_Train berechnen würden, wie gut schneidet der Algorithmus im Trainingssatz ab? Nicht so gut. Ich würde sagen, dass J train here hoch wäre, weil es tatsächlich ziemlich große Fehler zwischen den Beispielen und den tatsächlichen Vorhersagen des Modells gibt. Wie wäre es mit J_CV? j_CV wäre, wenn wir ein paar neue Beispiele hätten, vielleicht solche, die der Algorithmus noch nicht gesehen hatte. Hier schneidet der Algorithmus auch bei Beispielen, die er noch nicht gesehen hatte, nicht so gut ab, sodass j_CV ebenfalls hoch sein wird. Ein Merkmal eines Algorithmus mit hohem Bias, also etwas, das zu wenig passt, ist, dass er im Trainingssatz nicht einmal so gut abschneidet. Wenn J_Train hoch ist, ist das Ihr starker Indikator dafür, dass dieser Algorithmus einen hohen Bias aufweist. Schauen wir uns nun das Beispiel auf der rechten Seite an. Wenn du J_Train berechnen würdest, wie gut schneidet das im Trainingssatz ab? Nun, am Trainingsset läuft es wirklich super. Passt sehr gut zu den Trainingsdaten. J_train hier wird niedrig sein. Wenn Sie dieses Modell jedoch an anderen Häusern evaluieren, die nicht im Trainingssatz enthalten sind, stellen Sie fest, dass j_CV, der Kreuzvalidierungsfehler, ziemlich hoch sein wird. Eine charakteristische Signatur oder ein Merkmal Q, dass Ihr Algorithmus eine hohe Varianz hat, von j_CV ist viel höher als J_Train. Mit anderen Worten, es schneidet mit Daten, die es gesehen hat, viel besser ab als mit Daten, die es nicht gesehen hat. Dies stellt sich als starker Indikator dafür heraus, dass Ihr Algorithmus eine hohe Varianz aufweist. Auch hier geht es darum, dass ich J_Train und J_CV berechne und schaue, ob J _train hoch ist oder ob j_CV viel höher als J_train ist. Dies gibt Ihnen ein Gefühl dafür, ob Ihr Algorithmus eine hohe systematische oder eine hohe Varianz aufweist, auch wenn Sie nicht mit der Funktion f plotten können. Endlich die Verfolgungsjagd in der Mitte. Wenn du dir J_Train ansiehst, ist es ziemlich niedrig, also macht es sich am Trainingsset recht gut. Wenn Sie sich ein paar neue Beispiele ansehen, wie beispielsweise die aus Ihrem Kreuzvalidierungssatz, stellen Sie fest, dass j_CV ebenfalls ziemlich niedrig ist. Wenn j_Train nicht zu hoch ist, bedeutet dies, dass es kein Problem mit hoher Verzerrung gibt und dass j_CV nicht viel schlimmer ist als J_Train, was darauf hindeutet, dass es auch kein Problem mit hoher Varianz gibt. Deshalb scheint das quadratische Modell für diese Anwendung ziemlich gut zu sein. Zusammenfassend lässt sich sagen, dass, wenn d für ein lineares Polynom gleich 1 ist, j_TRAIN hoch und j_CV hoch war. Wenn d gleich 4 ist, war J train niedrig, aber j_CV ist hoch. Wenn d gleich 2 ist, waren beide ziemlich niedrig. Lassen Sie uns nun eine andere Sichtweise zu Bias und Varianz einnehmen. Insbesondere möchte ich Ihnen auf der nächsten Folie zeigen, wie die Varianz von J_Train und j_CV als Funktion des Grades des Polynoms, das Sie anpassen, variiert. Lassen Sie mich eine Abbildung zeichnen, bei der die horizontale Achse, dieses d hier, der Polynomgrad ist , den wir an die Daten anpassen. Auf der linken Seite entsprechen wir einem kleinen Wert von d, so dass d gleich 1 ist, was einer passenden geraden Linie entspricht. Auf der rechten Seite entsprechen wir, sagen wir, d entspricht 4 oder noch höheren Werten von d. Wir passen dieses Polynom höherer Ordnung an. Wenn Sie also J train oder W, B als Funktion des Polynomgrades darstellen, stellen Sie fest, dass, wenn Sie ein Polynom höherer und höherer Ordnung anpassen, hier gehe ich davon aus, dass wir keine Regularisierung verwenden, sondern wenn Sie ein Polynom höherer und höherer Ordnung anpassen, der Trainingsfehler tendenziell sinkt, denn wenn Sie eine sehr einfache lineare Funktion haben, passt sie nicht so gut zu den Trainingsdaten, wenn Sie Wenn Sie eine quadratische Funktion oder ein Polynom dritter Ordnung oder ein Polynom vierter Ordnung anpassen, passt es sich den Trainingsdaten immer besser an. Wenn der Grad des Polynoms zunimmt, sinkt der J-Train typischerweise. Schauen wir uns als Nächstes j_CV an. Wie gut schneidet es bei Daten ab, an die es nicht angepasst wurde? Was wir gesehen haben, war, dass, wenn d gleich eins ist, wenn der Polynomgrad sehr niedrig war, j_CV ziemlich hoch war, weil es unterpasst, sodass es im Kreuzvalidierungssatz nicht gut abgeschnitten hat. Auch hier rechts, wenn der Polynomgrad sehr groß ist, sagen wir vier, schneidet er auch im Kreuzvalidierungssatz nicht gut ab und ist daher auch hoch. Aber wenn d dazwischen lag, sagen wir, ein Polynom zweiter Ordnung, dann schnitt es tatsächlich viel besser ab. Wenn Sie den Grad des Polynoms variieren würden, würden Sie tatsächlich eine Kurve erhalten, die so aussieht, die nach unten und dann wieder nach oben geht. Wenn der Polynomgrad zu niedrig ist, passt er zu wenig und der Kreuzvalidierungssatz auch nicht. Wenn er zu hoch ist, passt er zu weit und schneidet auch im Kreuzvalidierungssatz nicht gut ab. Nur wenn es irgendwo in der Mitte liegt, ist das genau richtig, weshalb das Polynom zweiter Ordnung in unserem Beispiel einen niedrigeren Kreuzvalidierungsfehler und weder eine hohe Verzerrung noch eine hohe Varianz aufweist. Zusammenfassend, wie diagnostizieren Sie Verzerrungen und Varianzen in Ihrem Lernalgorithmus? Wenn Ihr Lernalgorithmus eine hohe Verzerrung aufweist oder ungeschlagene Daten enthält, ist der Schlüsselindikator, ob J Train hoch ist. Das entspricht diesem Teil der Kurve ganz links , wo ich genauso hoch trainiere. Normalerweise hast du J-Train und J_CV wird nahe beieinander sein. Wie diagnostizieren Sie, ob Sie eine hohe Varianz haben? Der Schlüsselindikator für eine hohe Varianz ist zwar, ob j_CV viel größer als J ist, aber Zug doppelt so groß ist wie das Vorzeichen, in der Mathematik bezieht sich auf ein viel größeres als, also ist dies größer, und das bedeutet viel größer. In diesem Teil des Diagramms ganz rechts ist j_CV viel größer als J train. Normalerweise ist der J-Train ziemlich niedrig, aber der wichtigste Indikator ist, ob J_CV viel größer als J-Train ist. Das passiert, wenn wir ein Polynom sehr hoher Ordnung an diesen kleinen Datensatz angepasst haben. Obwohl wir gerade Käufer in den Gebieten gesehen haben, stellt sich heraus, dass es in einigen Fällen möglich ist, gleichzeitig eine hohe Voreingenommenheit und eine hohe Varianz zu haben. Bei linearer Regression wird das nicht so häufig passieren, aber es stellt sich heraus, dass es beim Training eines neuronalen Netzwerks einige Anwendungen gibt, bei denen Sie leider eine hohe Verzerrung und eine hohe Varianz haben. Eine Möglichkeit, diese Situation zu erkennen, besteht darin, dass J-Train hoch ist, sodass Sie im Trainingssatz nicht so gut abschneiden, aber noch schlimmer ist, der Kreuzvalidierungsfehler ist wiederum noch viel größer als beim Trainingssatz. Die Vorstellung von hoher Verzerrung und hoher Varianz kommt bei linearen Modellen, die auf eine Tiefe angewendet werden, nicht wirklich vor. Aber um Ihnen eine Vorstellung davon zu geben, wie es aussieht, wäre es so, als ob Sie für einen Teil der Eingabe ein sehr kompliziertes Modell hätten, das überpasst, sodass es für einen Teil der Eingaben überpasst wird. Aber dann passt es aus irgendeinem Grund für andere Teile der Eingabe nicht einmal gut zu den Trainingsdaten und passt daher für einen Teil der Eingabe zu wenig. In diesem Beispiel, das künstlich aussieht, weil es sich um eine einzelne Feature-Eingabe handelt, passen wir den Trainingssatz sehr gut an und wir passen einen Teil der Eingabe übermäßig an, und wir passen nicht einmal die Trainingsdaten gut an, und wir passen den Teil der Eingabe nicht richtig an. Auf diese Weise kann es bei einigen Anwendungen unglücklicherweise zu einer hohen Verzerrung und einer hohen Varianz kommen. Der Indikator dafür ist, ob der Algorithmus auf dem Trainingssatz schlecht abschneidet, und er schneidet sogar viel schlechter ab als auf dem Trainingssatz. Bei den meisten Lernanwendungen haben Sie wahrscheinlich in erster Linie ein Problem mit hoher Verzerrung oder hoher Varianz und nicht beides gleichzeitig. Aber manchmal ist es möglich, dass beide gleichzeitig sind. Ich weiß, dass es viele Prozesse gibt, es gibt viele Konzepte auf den Folien, aber die wichtigsten Erkenntnisse sind, dass eine hohe Verzerrung bedeutet, dass sie im Trainingssatz nicht einmal gut abschneidet, und eine hohe Varianz bedeutet, dass sie im Kreuzvalidierungssatz und im Trainingssatz viel schlechter abschneidet. Wann immer ich einen Algorithmus für maschinelles Lernen trainiere, versuche ich fast immer herauszufinden, inwieweit der Algorithmus ein hohes Bias oder eine Unteranpassung im Vergleich zu einem Problem mit hoher Varianz bei Überanpassung aufweist. Wie wir später in dieser Woche sehen werden, wird dies eine gute Anleitung sein, wie Sie die Leistung des Algorithmus verbessern können. Schauen wir uns jedoch zunächst an, wie sich die Regularisierung auf die Verzerrung und Varianz eines Lernalgorithmus auswirkt, da Sie so besser verstehen, wann Sie die Regularisierung verwenden sollten. Schauen wir uns das im nächsten Video an.
Regularisierung und Verzerrung/Varianz
Sie haben im letzten Video gesehen, wie sich verschiedene Entscheidungen des Polynomgrads D auf die Varianzabweichung Ihres Lernalgorithmus und damit auf seine Gesamtleistung auswirken. Schauen wir uns in diesem Video an, wie sich die Regularisierung, insbesondere die Wahl des Regularisierungsparameters Lambda, auf die Verzerrung und Varianz und damit auf die Gesamtleistung des Algorithmus auswirkt. Es stellt sich heraus, dass dies hilfreich ist, wenn Sie einen guten Lambda-Wert für den Regularisierungsparameter für Ihren Algorithmus auswählen möchten. Lass uns einen Blick darauf werfen. In diesem Beispiel verwende ich ein Polynom vierter Ordnung, aber wir passen dieses Modell mithilfe der Regularisierung an. Wobei hier der Wert von Lambda der Regularisierungsparameter ist, der steuert, wie sehr Sie Kompromisse eingehen, indem Sie die Parameter w klein halten und die Trainingsdaten gut anpassen. Beginnen wir mit dem Beispiel, wie Lambda auf einen sehr großen Wert gesetzt wird. Angenommen, Lambda entspricht 10.000. Wenn Sie das tun würden, würden Sie am Ende ein Modell montieren, das ungefähr so aussieht. Denn wenn Lambda sehr groß wäre, dann ist der Algorithmus hochmotiviert, diese Parameter w sehr klein zu halten, und so erhalten Sie am Ende w_1, w_2, wirklich werden all diese Parameter sehr nahe Null sein. Das Modell ist am Ende f von x ist nur ungefähr b ein konstanter Wert, weshalb Sie am Ende ein Modell wie dieses haben. Dieses Modell weist eindeutig eine hohe Verzerrung auf und unterbewertet die Trainingsdaten, da es nicht einmal im Trainingssatz gut abschneidet und J_Train groß ist. Schauen wir uns das andere Extrem an. Nehmen wir an, Sie setzen Lambda auf einen sehr kleinen Wert. Bei einem kleinen Lambda-Wert gehen wir sogar zum Extrem über und setzen Lambda auf Null. Bei dieser Wahl von Lambda gibt es keine Regularisierung, also passen wir einfach ein Polynom vierter Ordnung ohne Regularisierung an und Sie erhalten die Kurve, die Sie zuvor gesehen haben und die die Daten überpasst. Was wir zuvor gesehen haben, war, dass bei einem solchen Modell j_Train klein ist, aber j_CV ist viel größer als J_Train oder J_cv ist groß. Dies deutet darauf hin, dass wir eine hohe Varianz haben, und diese Daten werden überbewertet. Es wäre, wenn Sie einen Zwischenwert von Lambda haben, nicht wirklich größtenteils 10.000, aber nicht so klein wie Null, dass Sie hoffentlich ein Modell erhalten, das so aussieht, das genau richtig ist und mit kleinen J_Train und kleinen J_cv gut zu den Daten passt. Wenn Sie entscheiden möchten, welcher Lambda-Wert für den Regularisierungsparameter geeignet ist, können Sie dies auch mit der Kreuzvalidierung tun. Schauen wir uns an, wie wir das tun könnten. Nur zur Erinnerung: Das Problem, mit dem wir uns befassen, ist, wenn Sie ein Polynom vierter Ordnung anpassen, also das ist das Modell und Sie verwenden Regularisierung, wie können Sie einen guten Lambda-Wert wählen? Dies wären Verfahren, die denen ähneln, die Sie bei der Auswahl des Polynomgrads D mithilfe der Kreuzvalidierung gesehen haben. Nehmen wir an, wir versuchen, ein Modell mit Lambda gleich 0 anzupassen. Wir würden die Kostenfunktion minimieren, indem wir Lambda gleich 0 verwenden und am Ende einige Parameter w1, b1 erhalten, und Sie können dann den Kreuzvalidierungsfehler j_CV von w1, b1 berechnen. Versuchen wir es nun mit einem anderen Lambda-Wert. Nehmen wir an, Sie versuchen, Lambda entspricht 0,01. Andererseits erhalten Sie durch die Minimierung der Kostenfunktion einen zweiten Satz von Parametern, w2, b2, und Sie können auch sehen, wie gut das mit dem Kreuzvalidierungssatz funktioniert usw. Lassen Sie uns weitere Lambda-Werte ausprobieren und in diesem Beispiel werde ich versuchen, sie zu verdoppeln, sodass Lambda 0,02 entspricht, sodass Sie J_CV von w3, b3 usw. erhalten. Dann verdoppeln wir noch einmal und verdoppeln noch einmal. Nach mehrmaliger Verdoppelung erhalten Sie Lambda, das ungefähr 10 entspricht, und das gibt Ihnen die Parameter w12, b12 und j_CV w12 von b12. Indem Sie einen großen Bereich möglicher Werte für Lambda ausprobieren, Parameter mithilfe dieser verschiedenen Regularisierungsparameter anpassen und dann die Leistung des Kreuzvalidierungssatzes bewerten, können Sie versuchen, den besten Wert für den Regularisierungsparameter auszuwählen. Schnell. Wenn Sie in diesem Beispiel feststellen, dass j_CV von W5, B5 den niedrigsten Wert all dieser verschiedenen Kreuzvalidierungsfehler aufweist, können Sie sich entscheiden, diesen Wert für Lambda auszuwählen und daher W5, B5 als gewählte Parameter zu verwenden. Wenn Sie schließlich eine Schätzung des Generalisierungsfehlers melden möchten, würden Sie den Testsatzfehler melden, J-Tests von W5, B5. Schauen wir uns an, wie Trainingsfehler und Kreuzvalidierungsfehler als Funktion des Parameters Lambda variieren, um die Intuition darüber zu verbessern, was dieser Algorithmus tut. In dieser Abbildung habe ich die X-Achse erneut geändert. Beachten Sie, dass die X-Achse hier mit dem Wert des Regularisierungsparameters Lambda annotiert ist, und wenn wir uns das Extrem von Lambda gleich Null hier auf der linken Seite ansehen, entspricht das der Verwendung keiner Regularisierung, und genau hier sind wir bei dieser sehr wackeligen Kurve gelandet. Wenn Lambda klein oder sogar Null wäre, und in diesem Fall haben wir ein Modell mit hoher Varianz, und so wird J train klein sein und j_CV wird groß sein, weil es bei den Trainingsdaten gut abschneidet, aber bei den Kreuzvalidierungsdaten viel schlechter abschneidet. Dieses Extrem auf der rechten Seite waren sehr große Lambda-Werte. Angenommen, Lambda entspricht 10.000. Am Ende passt ein Modell, das so aussieht. Dies hat eine hohe Verzerrung, es passt zu wenig zu den Daten und es stellt sich heraus, dass J train hoch und j_CV ebenfalls hoch sein wird. Wenn Sie sich ansehen, wie J-Train als Funktion von Lambda variiert, stellen Sie tatsächlich fest, dass J-Train so steigen wird, denn in der Optimierungskostenfunktion versucht der Algorithmus, das Quadrat von W klein zu halten, je größer Lambda ist. Das heißt, je mehr Gewicht diesem Begriff der Regularisierung beigemessen wird, desto weniger Aufmerksamkeit wird darauf gelegt, im Trainingssatz tatsächlich gut abzuschneiden. Dieser Begriff auf der linken Seite ist J-Train. Je mehr versucht wird, die Parameter klein zu halten, desto weniger gut ist es, den Trainingsfehler zu minimieren. Aus diesem Grund nimmt der Trainingsfehler bei J train der Regel zu, wenn Lambda ansteigt. Wie wäre es nun mit dem Kreuzvalidierungsfehler? Es stellt sich heraus, dass der Kreuzvalidierungsfehler so aussieht. Weil wir gesehen haben, dass Lambda, wenn es zu klein oder zu groß ist, im Kreuzvalidierungssatz nicht gut abschneidet. Es passt entweder hier links zu viel oder hier rechts zu wenig. Es wird einen Zwischenwert von Lambda geben, der dafür sorgt, dass der Algorithmus die beste Leistung erbringt. Bei der Kreuzvalidierung werden viele verschiedene Lambda-Werte ausprobiert. Das haben wir auf der letzten Folie gesehen: Test-Lambda ist gleich Null, Lambda ist gleich 0,01, Logik ist 0,02. Probieren Sie viele verschiedene Lambda-Werte aus und bewerten Sie den Kreuzvalidierungsfehler an vielen dieser verschiedenen Punkte. Wählen Sie dann hoffentlich einen Wert mit einem niedrigen Kreuzvalidierungsfehler aus, und dies entspricht hoffentlich einem guten Modell für Ihre Anwendung. Wenn Sie dieses Diagramm mit dem Diagramm aus dem vorherigen Video vergleichen, in dem die horizontale Achse der Polynomgrad war, sehen diese beiden Diagramme ein bisschen nicht mathematisch und nicht formal aus, aber sie sehen ein bisschen wie Spiegelbilder voneinander aus, und das liegt daran, dass bei der Anpassung eines Polynomgrads der linke Teil der Kurve einer Unteranpassung und einer hohen Verzerrung entsprach, der rechte Teil einer Überanpassung Passgenau und hohe Varianz. In diesem Fall lag die hohe Varianz auf der linken Seite und die hohe Verzerrung auf der rechten Seite. Aber deshalb sind diese beiden Bilder ein bisschen wie Spiegelbilder voneinander. In beiden Fällen kann Ihnen die Kreuzvalidierung und die Auswertung verschiedener Werte jedoch dabei helfen, einen guten Wert für t oder einen guten Lambda-Wert auszuwählen. So wirkt sich die Wahl des Regularisierungsparameters Lambda auf die Verzerrung und Varianz sowie die Gesamtleistung Ihres Algorithmus aus, und Sie haben auch gesehen, wie Sie mithilfe der Kreuzvalidierung eine gute Wahl für den Regularisierungsparameter Lambda treffen können. Bisher haben wir darüber gesprochen, dass ein hoher Trainingssatzfehler, ein hoher J-Zug, auf eine hohe Verzerrung hindeutet und dass ein hoher Kreuzvalidierungsfehler von J_CV, insbesondere wenn er viel höher ist als J-Train, auf ein Varianzproblem hindeutet. Aber was bedeuten diese Worte „hoch“ oder „viel höher“ eigentlich? Schauen wir uns das im nächsten Video an, in dem wir uns ansehen, wie Sie sich die Zahlen J train und j_CV ansehen und beurteilen können, ob sie hoch oder niedrig sind, und es stellt sich heraus, dass eine weitere Verfeinerung dieser Ideen, nämlich die Festlegung eines grundlegenden Leistungsniveaus, wir lernen Algorithmus, es Ihnen viel einfacher machen wird, sich diese Zahlen anzusehen, J train, j_CV, und zu beurteilen, ob sie hoch oder niedrig sind. Schauen wir uns im nächsten Video an, was das alles bedeutet.
Festlegung eines Grundniveaus der Leistung
Schauen wir uns einige konkrete Zahlen dafür an, was J-Train und JCV sein könnten, und sehen, wie Sie beurteilen können, ob ein Lernalgorithmus eine hohe Verzerrung oder eine hohe Varianz aufweist. Für die Beispiele in diesem Video werde ich als laufendes Beispiel die Anwendung der Spracherkennung verwenden, an der ich im Laufe der Jahre mehrfach gearbeitet habe. Lass uns einen Blick darauf werfen. Viele Benutzer, die auf einem Mobiltelefon im Internet suchen, verwenden die Spracherkennung, anstatt auf den winzigen Tastaturen unserer Telefone zu tippen, da das Sprechen mit einem Telefon oft schneller ist als das Tippen. Ein typisches Audio, das wir von einer Web-Suchmaschine erhalten, wäre so : „Wie ist das Wetter heute?“ Oder so : „Coffeeshops in meiner Nähe“. Es ist die Aufgabe der Spracherkennungsalgorithmen, die Transkripte auszugeben, unabhängig davon, ob es sich um das heutige Wetter oder um Cafés in meiner Nähe handelt. Wenn Sie nun ein Spracherkennungssystem trainieren und den Trainingsfehler messen, bedeutet der Trainingsfehler, wie viel Prozent der Audioclips in Ihrem Trainingssatz der Algorithmus nicht vollständig korrekt transkribiert. Nehmen wir an, der Trainingsfehler für diesen Datensatz liegt bei 10,8 Prozent , was bedeutet, dass er für 89,2 Prozent Ihres Trainingssatzes perfekt transkribiert wird, aber bei 10,8 Prozent Ihres Trainingssatzes einen Fehler macht. Wenn Sie die Leistung Ihres Spracherkennungsalgorithmus auch an einem separaten Kreuzvalidierungssatz messen würden, nehmen wir an, er weist einen Fehler von 14,8 Prozent auf. Wenn du dir diese Zahlen ansiehst, sieht es so aus, als ob der Trainingsfehler wirklich hoch ist, er hat 10 Prozent falsch gemacht, und dann ist der Fehler bei der Kreuzvalidierung höher, aber wenn du sogar 10 Prozent deines Trainingssatzes falsch machst, scheint das ziemlich hoch zu sein. Es scheint, als ob dieser 10-prozentige Fehler Sie zu dem Schluss führen würde, dass es eine hohe Verzerrung hat, weil es in Ihrem Trainingssatz nicht gut abschneidet, aber es stellt sich heraus, dass es bei der Analyse der Spracherkennung nützlich ist, auch eine andere Sache zu messen, nämlich das menschliche Leistungsniveau? Mit anderen Worten, wie gut können selbst Menschen Sprache aus diesen Audioclips genau transkribieren? Nehmen wir an, Sie messen, wie gut fließende Sprecher Audioclips transkribieren können, und Sie stellen fest, dass die Leistung auf menschlichem Niveau 10,6 Prozent Fehler aufweist. Warum ist die Fehlerquote auf menschlicher Ebene so hoch? Es stellt sich heraus, dass es für die Websuche viele Audioclips gibt, die sich wie folgt anhören : „Ich navigiere zu [unhörbar]“. Es gibt eine Menge lautes Audio, bei dem wirklich niemand das Gesagte genau transkribieren kann, weil das Geräusch im Audio vorhanden ist. Wenn selbst ein Mensch 10,6 Prozent Fehler macht, scheint es schwierig zu erwarten, dass ein Lernalgorithmus viel besser abschneidet. Um zu beurteilen, ob der Trainingsfehler hoch ist, erweist es sich als nützlicher zu überprüfen, ob der Trainingsfehler viel höher ist als das menschliche Leistungsniveau, und in diesem Beispiel schneidet er nur 0,2 Prozent schlechter ab als beim Menschen. Angesichts der Tatsache, dass Menschen wirklich gut darin sind, Sprache zu erkennen, denke ich, wenn ich ein Spracherkennungssystem bauen könnte, das 10,6 Prozent Fehler bei der menschlichen Leistung erzielt, wäre ich ziemlich glücklich, also schneidet es nur ein bisschen schlechter ab als Menschen. Im Gegensatz dazu ist die Lücke oder der Unterschied zwischen JCV und J-Train jedoch viel größer. Tatsächlich gibt es dort eine Lücke von vier Prozent, wohingegen wir zuvor gesagt hatten, dass ein Fehler von 10,8 Prozent bedeutet, dass es sich um eine hohe Verzerrung handelt. Wenn wir es mit der Leistung auf menschlichem Niveau vergleichen, sehen wir, dass der Algorithmus im Trainingssatz tatsächlich recht gut abschneidet, aber das größere Problem ist, dass der Kreuzvalidierungsfehler viel höher ist als der Trainingsfehler, weshalb ich zu dem Schluss kommen würde, dass dieser Algorithmus eher ein Varianzproblem als ein Bias-Problem hat. Es stellt sich heraus, dass es oft nützlich ist, zu beurteilen, ob der Trainingsfehler hoch ist, um ein Ausgangsleistungsniveau zu ermitteln, und mit Ausgangsleistungsniveau meine ich, welches Fehlerniveau Sie vernünftigerweise erwarten können, dass Ihr Lernalgorithmus irgendwann erreicht. Eine gängige Methode, um ein Ausgangsleistungsniveau zu ermitteln, besteht darin, zu messen, wie gut Menschen diese Aufgabe bewältigen können, da Menschen wirklich gut darin sind, Sprachdaten zu verstehen, Bilder zu verarbeiten oder Texte zu verstehen. Die Leistung auf menschlicher Ebene ist oft ein guter Maßstab, wenn Sie unstrukturierte Daten wie Audio , Bilder oder Texte verwenden. Eine andere Möglichkeit, ein Ausgangsleistungsniveau abzuschätzen, besteht darin, dass es einen konkurrierenden Algorithmus gibt, vielleicht eine frühere Implementierung, die jemand anderes implementiert hat, oder sogar den Algorithmus eines Mitbewerbers zur Festlegung eines Ausgangsleistungsniveaus, wenn Sie das messen können, oder manchmal können Sie es aufgrund früherer Erfahrungen erraten. Wenn Sie Zugriff auf dieses grundlegende Leistungsniveau haben, also welches Fehlerniveau können Sie vernünftigerweise erwarten, oder welches ist das gewünschte Leistungsniveau, das Ihr Algorithmus erreichen soll? Wenn Sie dann beurteilen, ob ein Algorithmus eine hohe Verzerrung oder Varianz aufweist, würden Sie das Ausgangsleistungsniveau sowie den Trainingsfehler und den Kreuzvalidierungsfehler berücksichtigen. Die beiden wichtigsten zu messenden Größen sind dann: Was ist der Unterschied zwischen Trainingsfehlern und dem Ausgangsniveau, das Sie zu erreichen hoffen. Dies ist 0,2, und wenn dieser Wert groß ist, würden Sie sagen, dass Sie ein Problem mit hoher Verzerrung haben. Sie werden sich dann auch diese Lücke zwischen Ihrem Trainingsfehler und Ihrem Kreuzvalidierungsfehler ansehen, und wenn diese hoch ist, werden Sie zu dem Schluss kommen, dass Sie ein Problem mit hoher Varianz haben. Aus diesem Grund sind wir in diesem Beispiel zu dem Schluss gekommen, dass wir ein Problem mit hoher Varianz haben, während wir uns das zweite Beispiel ansehen. Wenn das Ausgangsleistungsniveau, also Leistung auf menschlichem Niveau, Trainingsfehler und Kreuzvalidierungsfehler wie folgt aussehen, dann beträgt diese erste Lücke 4,4 Prozent, und es gibt tatsächlich eine große Lücke. Der Trainingsfehler ist viel höher als das, was Menschen tun können und was wir zu erreichen hoffen, wohingegen der Fehler bei der Kreuzvalidierung nur ein bisschen größer ist als der Trainingsfehler. Wenn Ihr Trainingsfehler und Ihr Kreuzvalidierungsfehler so aussehen, würde ich sagen, dass dieser Algorithmus einen hohen Bias aufweist. Wenn Sie sich diese Zahlen, Trainingsfehler und Kreuzvalidierungsfehler ansehen, können Sie intuitiv oder informell ein Gefühl dafür bekommen, inwieweit Ihr Algorithmus ein Problem mit hoher Verzerrung oder hoher Varianz aufweist. Zusammenfassend lässt sich sagen, dass diese Lücke zwischen diesen ersten beiden Zahlen Ihnen ein Gefühl dafür gibt, ob Sie ein Problem mit hoher Verzerrung haben, und die Lücke zwischen diesen beiden Zahlen gibt Ihnen ein Gefühl dafür, ob Sie ein Problem mit hoher Varianz haben. Manchmal kann das Ausgangsleistungsniveau bei Null Prozent liegen. Wenn Ihr Ziel darin besteht, eine perfekte Leistung als das Ausgangsleistungsniveau zu erreichen, kann dies bei Null Prozent liegen. Bei einigen Anwendungen wie der Spracherkennungsanwendung, bei denen einige Audiodaten nur laut sind, kann der Ausgangswert einer Leistung jedoch viel höher als Null sein. Mit der auf dieser Folie beschriebenen Methode können Sie besser erkennen, ob Ihr Algorithmus unter Verzerrungen oder Varianzen leidet. Übrigens ist es möglich, dass Ihre Algorithmen einen hohen Bias und eine hohe Varianz aufweisen. Konkret, wenn Sie Zahlen wie diese erhalten, dann ist die Lücke zwischen dem Ausgangswert und dem Trainingsfehler groß. Das wären 4,4 Prozent, und der Unterschied zwischen Trainingsfehler und Kreuzvalidierungsfehler ist ebenfalls groß. Das sind 4,7 Prozent. Wenn es so aussieht, werden Sie zu dem Schluss kommen, dass Ihr Algorithmus einen hohen Bias und eine hohe Varianz aufweist, obwohl dies bei Ihren Lernanwendungen hoffentlich nicht so oft vorkommt. Zusammenfassend haben wir festgestellt, dass anhand der Tatsache, ob Ihr Trainingsfehler groß ist, festgestellt werden kann, ob Ihr Algorithmus stark verzerrt ist. Bei Anwendungen, bei denen die Daten manchmal nur verrauscht sind und es unmöglich oder unrealistisch ist, jemals einen Nullfehler zu erwarten, ist es nützlich, dieses Ausgangsleistungsniveau festzulegen. Anstatt einfach zu fragen, ob mein Trainingsfehler viel ist, kannst du fragen, ob mein Trainingsfehler im Verhältnis zu dem, was ich hoffentlich irgendwann erreichen kann, groß ist, zum Beispiel, ist mein Training groß im Verhältnis zu dem, was Menschen bei der Aufgabe tun können? So können Sie genauer ablesen, wie weit Sie in Bezug auf Ihren Trainingsfehler von dem Punkt entfernt sind, an dem Sie zu gelangen hoffen. Wenn Sie dann überprüfen, ob Ihr Kreuzvalidierungsfehler viel größer ist als Ihr Trainingsfehler, erhalten Sie ein Gefühl dafür, ob Ihr Algorithmus möglicherweise auch ein Problem mit hoher Varianz hat oder nicht. In der Praxis schaue ich mir diese Zahlen oft an, um zu beurteilen, ob mein Lernalgorithmus ein Problem mit hoher Verzerrung oder hoher Varianz aufweist. Um unsere Intuition darüber, wie sich ein Lernalgorithmus verhält, weiter zu schärfen, gibt es noch eine weitere Sache, die ich nützlich fand, um darüber nachzudenken, was die Lernkurve ist. Schauen wir uns im nächsten Video an, was das bedeutet.
Lernkurven
Mithilfe von Lernkurven können Sie besser verstehen, wie sich Ihr Lernalgorithmus in Abhängigkeit von seinem Erfahrungsschatz verhält, wobei Erfahrung, ich meine zum Beispiel die Anzahl der Trainingsbeispiele, die er hat. Lass uns einen Blick darauf werfen. Lassen Sie mich die Lernkurven für ein Modell darstellen, das auf eine polynomische quadratische Funktion zweiter Ordnung wie folgt passt. Ich werde sowohl j_CV, den Kreuzvalidierungsfehler, als auch j_TRAIN, den Trainingsfehler, grafisch darstellen. In dieser Abbildung wird die horizontale Achse m_train sein. Das ist die Größe des Trainingssatzes oder die Anzahl der Beispiele, aus denen der Algorithmus lernen kann. Auf der vertikalen Achse werde ich den Fehler grafisch darstellen. Mit Irrtum meine ich entweder j_CV oder J_Train. Beginnen wir mit der Darstellung des Kreuzvalidierungsfehlers. Es wird ungefähr so aussehen. So wird j_CV von (w, b) aussehen. Es ist vielleicht keine Überraschung, dass mit m_train die Größe des Trainingssatzes größer wird, Sie dann ein besseres Modell lernen und der Kreuzvalidierungsfehler sinkt. Lassen Sie uns nun j_TRAIN von (w, b) darstellen, wie der Trainingsfehler aussieht, wenn die Größe des Trainingssatzes größer wird. Es stellt sich heraus, dass der Trainingsfehler tatsächlich so aussehen wird. Wenn die Größe des Trainingssatzes größer wird, nimmt der Fehler am Trainingssatz sogar zu. Schauen wir uns an, warum das so ist. Wir beginnen mit einem Beispiel, bei dem Sie nur ein einziges Trainingsbeispiel haben. Nun, wenn Sie ein quadratisches Modell daran anpassen, können Sie die einfachste gerade Linie oder Kurve anpassen und Ihr Trainingsfehler wäre Null. Wie wäre es, wenn Sie zwei Trainingsbeispiele wie dieses haben? Nun, Sie können wieder eine gerade Linie anpassen und keinen Trainingsfehler erzielen. Wenn Sie drei Trainingsbeispiele haben, kann die quadratische Funktion immer noch sehr gut passen und so gut wie keine Trainingsfehler verursachen, aber jetzt, wenn Ihr Trainingsset ein bisschen größer wird, sagen wir, Sie haben vier Trainingsbeispiele, dann wird es etwas schwieriger, alle vier Beispiele perfekt anzupassen. Sie bekommen vielleicht eine Kurve, die so aussieht, ist ziemlich gut, aber Sie sind an einigen Stellen hier und da ein bisschen daneben. Wenn Sie Einträge haben, die Größe des Trainingssatzes auf vier erhöht sich der Trainingsfehler sogar ein wenig. Wie wäre es, wenn wir fünf Trainingsbeispiele haben. Nun, auch hier kann man es ziemlich gut anpassen, aber es wird noch ein bisschen schwieriger , sie alle perfekt zu passen. Wir haben nicht einmal größere Shading-Sets, es wird einfach immer schwieriger, jedes einzelne deiner Trainingsbeispiele perfekt zu passen. Um es noch einmal zusammenzufassen: Bei einer sehr kleinen Anzahl von Trainingsbeispielen wie einem, zwei oder sogar drei ist es relativ einfach, Null oder einen sehr kleinen Trainingsfehler zu erhalten, aber wenn Sie einen größeren Trainingssatz haben, ist es für die quadratische Funktion schwieriger, alle Trainingsbeispiele perfekt zu passen. Aus diesem Grund steigt der Trainingsfehler, je größer das Trainingsset wird, weil es schwieriger ist, alle Trainingsbeispiele perfekt anzupassen. Beachten Sie bei diesen Kurven noch eine weitere Sache, nämlich den Kreuzvalidierungsfehler, der in der Regel höher ist als der Trainingsfehler, da Sie die Parameter an den Trainingssatz anpassen. Du erwartest, dass du zumindest ein bisschen besser abschneidest oder, wenn m klein ist, vielleicht sogar viel besser auf dem Trainingsset als auf dem Trans-Validierungssatz. Schauen wir uns nun an, wie die Lernkurven für einen Durchschnitt mit hoher Verzerrung im Vergleich zu einem Durchschnitt mit hoher Varianz aussehen werden. Fangen wir mit dem Fall hoher Voreingenommenheit oder Unterpassung an. Denken Sie daran, dass ein Beispiel für eine hohe Verzerrung darin besteht, eine lineare Funktion anzupassen, also eine Kurve, die so aussieht. Wenn du den Trainingsfehler grafisch darstellen würdest, würde der Trainingsfehler erwartungsgemäß steigen. Tatsächlich könnte sich diese Kurve der Trainingsfehler allmählich abflachen. Wir nennen es Plateau, was bedeutet, dass es nach einer Weile abflachen wird. Das liegt daran, dass sich Ihr Modell nicht viel mehr ändert, wenn Sie die einfache lineare Funktion anpassen, wenn Sie immer mehr Trainingsbeispiele erhalten. Es passt zu einer geraden Linie und obwohl du immer mehr Beispiele bekommst, gibt es einfach nicht viel mehr zu ändern, weshalb der durchschnittliche Trainingsfehler nach einer Weile flacher wird. In ähnlicher Weise wird Ihr Kreuzvalidierungsfehler nach einer Weile sinken und sich auch verkleinern, weshalb j_CV wieder höher als j_TRAIN ist, aber j_CV wird dazu neigen, so auszusehen. Es ist, weil seien Sie ehrlich, ihre Endpunkte, auch wenn Sie immer mehr Beispiele bekommen, wird sich nicht viel an der Straße ändern, jetzt passen Sie. Es ist einfach ein zu einfaches Modell , um in so viele Daten zu passen. Aus diesem Grund neigen diese beiden Kurven, J_CV und J_Train, dazu, sich nach einer Weile abzuflachen. Wenn Sie ein Maß für dieses Ausgangsleistungsniveau haben, z. B. die Leistung auf menschlichem Niveau, dann ist dieser Wert in der Regel niedriger als Ihr J_Train und Ihr J_CV. Leistung auf menschlicher Ebene könnte so aussehen. Es besteht eine große Lücke zwischen dem Ausgangsleistungsniveau und J_Train, was unser Indikator dafür war, dass dieser Algorithmus eine hohe Verzerrung aufweist. Das heißt, man könnte hoffen, viel besser abzuschneiden, wenn wir nur eine komplexere Funktion als nur eine gerade Linie anpassen könnten. Eine interessante Sache an dieser Handlung ist, dass Sie sich fragen können, was Ihrer Meinung nach passieren wird, wenn Sie ein viel größeres Trainingsset haben könnten? Wie würde es aussehen, wenn wir noch weiter als rechts von diesem Grundstück vergrößern könnten? Sie können wie folgt weiter nach rechts gehen? Nun, Sie können sich vorstellen, wenn Sie diese beiden Kurven nach rechts verlängern, werden sie beide flacher und beide werden wahrscheinlich einfach weiterhin so flach sein. Egal, wie weit man sich nach rechts von dieser Handlung erstreckt, diese beiden Kurven werden nie irgendwie irgendwie einen Weg finden, auf dieses menschliche Leistungsniveau herunterzufallen oder einfach so flach zu bleiben, so ziemlich für immer, egal wie groß das Trainingsset wird. Das führt zu der vielleicht etwas überraschenden Schlußfolgerung, dass, wenn ein Lernalgorithmus einen hohen Bias hat, das Erhalten von mehr Trainingsdaten allein nicht viel Hoffnung macht. Ich weiß, dass wir es gewohnt sind zu denken, dass es gut ist, mehr Daten zu haben , aber wenn Ihr Algorithmus einen hohen Bias hat und Sie dann nur mehr Trainingsdaten hinzufügen, können Sie die Fehlerrate allein nie so stark senken. Das liegt wirklich daran, egal wie viele Beispiele Sie zu dieser Abbildung hinzufügen, die gerade lineare Anpassung wird einfach nicht viel besser werden. Deshalb lohnt es sich, zu überprüfen, ob Ihr Lernalgorithmus stark verzerrt ist, bevor Sie viel Mühe in das Sammeln weiterer Trainingsdaten investieren. Wenn dies der Fall ist, müssen Sie wahrscheinlich andere Dinge tun, als nur weitere Trainingsdaten hinzuzufügen. Schauen wir uns nun an, wie die Lernkurve für Lernalgorithmen mit hoher Varianz aussieht. Sie erinnern sich vielleicht daran, dass, wenn Sie das Urpolynom beispielsweise mit kleinem Lambda oder sogar Lambda gleich Null anpassen, eine Kurve erhalten, die so aussieht, und obwohl sie sehr gut zu den Trainingsdaten passt, verallgemeinert sie sich nicht. Schauen wir uns nun an, wie eine Lernkurve in diesem Szenario mit hoher Varianz aussehen könnte. J-Train wird steigen, wenn die Größe des Trainingssatzes zunimmt, sodass Sie eine Kurve erhalten, die so aussieht, und der J-CV wird viel höher sein, sodass Ihr Kreuzvalidierungsfehler viel höher ist als Ihr Trainingsfehler. Die Tatsache, dass es hier eine große Lücke gibt, ist das, was ich Ihnen sagen kann, dass diese hohe Varianz beim Trainingssatz viel besser abschneidet als bei Ihrem Kreuzvalidierungssatz. Wenn Sie ein Ausgangsleistungsniveau, wie z. B. die Leistung auf menschlichem Niveau, grafisch darstellen, werden Sie vielleicht feststellen, dass es sich hier herausstellt, dass J-Training manchmal sogar niedriger sein kann als die Leistung auf menschlichem Niveau oder vielleicht ist die Leistung auf menschlichem Niveau etwas niedriger. Aber wenn Sie das Trainingssatz zu stark anpassen, können Sie es vielleicht so gut anpassen, dass Sie einen unrealistisch niedrigen Fehler haben, wie zum Beispiel Null Fehler in diesem Beispiel hier, was tatsächlich besser ist, als wie gut Menschen tatsächlich in der Lage sein werden, Immobilienpreise oder was auch immer die Anwendung, an der Sie gerade arbeiten, vorherzusagen. Aber auch hier gilt, um eine hohe Varianz zu signalisieren, ob J cv viel höher ist als J train. Wenn Sie eine hohe Varianz haben, könnte es sehr hilfreich sein, die Größe des Trainingssatzes zu erhöhen, und insbesondere, wenn wir diese Kurven nach rechts extrapolieren, den M-Zug erhöhen könnten, dann wird der Trainingsfehler weiter steigen, aber dann wird der Kreuzvalidierungsfehler hoffentlich sinken und sich dem J-Train nähern. In diesem Szenario könnte es also möglich sein, durch einfaches Erhöhen der Größe des Trainingssatzes den Kreuzvalidierungsfehler zu verringern und Ihren Algorithmus dazu zu bringen, immer besser zu funktionieren. Dies ist im Gegensatz zum Fall mit hoher Verzerrung, bei dem Sie nur mehr Trainingsdaten erhalten, Ihnen das nicht wirklich hilft, die Leistung Ihres Algorithmus zu lernen. Zusammenfassend lässt sich sagen, dass es in der Tat hilfreich ist, mehr Trainingsdaten zu erhalten, wenn ein Lernalgorithmus unter einer hohen Varianz leidet. Denn wenn Sie rechts von dieser Kurve extrapolieren, sehen Sie, dass Sie davon ausgehen können, dass J cv weiter sinkt. In diesem Beispiel kann der Algorithmus allein durch das Abrufen von mehr Trainingsdaten von einem relativ hohen Kreuzvalidierungsfehler zur Leistung auf menschlichem Niveau viel näher kommen. Sie können sehen, dass, wenn Sie viel mehr Trainingsbeispiele hinzufügen und das Polynom vierter Ordnung weiter füllen, Sie einfach eine bessere Polynomanpassung vierter Ordnung an diese Daten erzielen können, als nur eine sehr schwache Kurve oben drauf zu bekommen. Wenn Sie eine Anwendung für maschinelles Lernen erstellen, können Sie die Lernkurven zeichnen, wenn Sie möchten, das heißt, Sie können verschiedene Teilmengen Ihrer Trainingssätze verwenden, und selbst wenn Sie beispielsweise 1.000 Trainingsbeispiele haben, könnten Sie ein Modell anhand von nur 100 Trainingsbeispielen trainieren und sich den Trainingsfehler und den Kreuzvalidierungsfehler ansehen, sie dann aber an 200 Beispielen trainieren, 800 Beispiele halten und sie einfach vorerst nicht verwenden und J train und J cv zeichnen und so auf die Wiederholungen und zeichne auf, wie die Lernkurve aussieht. Wenn wir es auf diese Weise visualisieren würden, könnte das eine weitere Möglichkeit für Sie sein, um zu sehen, ob Ihre Lernkurve eher wie eine hohe Verzerrung oder eine hohe Varianz aussieht. Ein Nachteil der Darstellung solcher Lernkurven ist etwas, das ich gemacht habe, aber ein Nachteil ist, dass es rechnerisch ziemlich teuer ist, so viele verschiedene Modelle mit unterschiedlich großen Teilmengen Ihres Trainingssatzes zu trainieren, also in der Praxis wird es nicht so oft gemacht, aber trotzdem finde ich, dass ich dieses mentale visuelle Bild davon habe, wie das Trainingssatz aussieht, manchmal hilft mir das, zu durchdenken, was mein Lernalgorithmus tut und ob es eine hohe Verzerrung oder eine hohe Varianz aufweist. Ich weiß, dass wir viel über Verzerrung und Varianz erfahren haben. Lassen Sie uns zu unserem früheren Beispiel zurückkehren: Wenn Sie ein Modell für die Immobilienpreisprognose trainiert haben, wie helfen Ihnen Verzerrung und Varianz bei der Entscheidung, was als Nächstes zu tun ist? Kehren wir zu diesem früheren Beispiel zurück, von dem ich hoffe, dass es für Sie jetzt viel sinnvoller ist. Lass uns das im nächsten Video machen.
Die Entscheidung, was ich als Nächstes ausprobieren möchte, revidiert
Sie haben gesehen, wie anhand von J train und Jcv das der Trainingsfehler und der Kreuzvalidierungsfehler ist, oder vielleicht sogar beim Zeichnen einer Lernkurve. Sie können versuchen, ein Gefühl dafür zu bekommen, ob Ihr Lernalgorithmus eine hohe Verzerrung oder eine hohe Varianz aufweist. Dieses Verfahren führe ich routinemäßig durch, wenn ich einen Lernalgorithmus trainiere. Ich betrachte häufiger den Trainingsfehler und den Kreuzvalidierungsfehler, um zu entscheiden, ob mein Algorithmus eine hohe Verzerrung oder eine hohe Varianz aufweist. Es stellt sich heraus, dass dies Ihnen hilft, bessere Entscheidungen darüber zu treffen, was Sie als Nächstes ausprobieren sollten, um die Leistung Ihres Lernalgorithmus zu verbessern. Schauen wir uns ein Beispiel an. Dies ist eigentlich das Beispiel, das Sie zuvor gesehen haben. Was versuchen Sie als Nächstes, wenn Sie die regularisierte lineare Regression bei der Vorhersage von Immobilienpreisen implementiert haben, Ihr Algorithmus jedoch drei große Fehler seit den Prognosen berücksichtigt? Dies waren die sechs Ideen, die wir hatten, als wir uns diese Folie zuvor angesehen hatten. Holen Sie sich weitere Trainingsbeispiele, probieren Sie kleine Funktionen, zusätzliche Funktionen usw. aus. Es stellt sich heraus, dass jedes dieser sechs Elemente entweder dazu beiträgt, ein Problem mit hoher Varianz oder einem Problem mit hoher Verzerrung zu beheben. Insbesondere wenn Ihr Lernalgorithmus einen hohen Bias aufweist, sind drei dieser Techniken nützlich. Wenn Ihr Lernalgorithmus eine hohe Varianz aufweist, sind drei verschiedene dieser Techniken hilfreich. Mal sehen, ob wir herausfinden können, welcher welcher ist. Die erste besteht darin, mehr Trainingsbeispiele zu erhalten. Wir haben im letzten Video gesehen, dass , wenn dein Algorithmus einen hohen Bias hat und wir nur mehr Trainingsdaten erhalten, das allein wahrscheinlich nicht viel hilft. Wenn Ihr Algorithmus dagegen eine hohe Varianz aufweist, beispielsweise wenn er für einen sehr kleinen Trainingssatz überpasst wurde, dann hilft es sehr, mehr Trainingsbeispiele zu erhalten. Diese erste Option oder das Abrufen weiterer Trainingsbeispiele hilft, ein Problem mit hoher Varianz zu beheben. Wie stehts mit den anderen fünf? Glauben Sie, Sie können herausfinden , welche der verbleibenden fünf Probleme mit hoher Verzerrung oder hoher Varianz beheben? Ich werde den Rest in diesem Video in einer Minute durchgehen, aber wenn du es möchtest, kannst du das Video anhalten und sehen, ob du diese fünf anderen Dinge selbst durchdenken kannst. Fühlen Sie sich frei, das Video anzuhalten. Nur Spaß, das war meine Pause und nicht dein Video. Aber ernsthaft, wenn du es willst, pausiere das Video und denke darüber nach, ob du willst oder nicht, und wir werden diese Bewertungen in einer Minute durchgehen. Wie wäre es, einen kleineren Funktionsumfang auszuprobieren? Wenn Ihr Lernalgorithmus zu viele Funktionen hat, gibt er Ihrem Algorithmus manchmal zu viel Flexibilität, um sehr komplizierte Modelle anzupassen. Das ist ein bisschen so, als ob du x, x quadriert, x würfelig, x^4, x^5 und so weiter hättest. Wenn Sie nur einige davon eliminieren würden, wäre Ihr Modell nicht so komplex und hätte keine so hohe Varianz. Wenn Sie vermuten, dass Ihr Algorithmus viele Funktionen enthält, die für die Vorhersage des Immobilienpreises nicht wirklich relevant oder hilfreich sind, oder wenn Sie vermuten, dass Sie sogar etwas redundante Funktionen hatten, können Sie die Flexibilität Ihres Algorithmus verringern, die Daten zu überpassen, wenn Sie die Anzahl der Funktionen eliminieren oder reduzieren. Dies ist eine Taktik, die Ihnen hilft, hohe Varianzen zu beheben. Sich zu unterhalten, zusätzliche Funktionen zu erhalten , also nur zusätzliche Funktionen hinzuzufügen, ist das Gegenteil von einer kleineren Anzahl von Funktionen. Dies wird Ihnen helfen, ein Problem mit hoher Verzerrung zu beheben. Ein konkretes Beispiel: Wenn Sie versuchen, den Preis eines Hauses nur anhand der Größe vorherzusagen, aber sich herausstellt, dass der Preis eines Hauses auch wirklich von der Anzahl der Schlafzimmer und der Anzahl der Stockwerke sowie vom Alter des Hauses abhängt, wird der Algorithmus nie so gut abschneiden, wenn Sie diese zusätzlichen Funktionen nicht hinzufügen. Das ist ein Problem mit hoher Voreingenommenheit, weil du auf dem Trainingssatz einfach nicht so gut abschneiden kannst, wenn nur die Größe, ist, wenn du dem Algorithmus sagst, wie viele Schlafzimmer es gibt, wie viele Stockwerke es gibt? Wie alt ist das Haus, dass es endlich genug Informationen hat, um am Trainingsset noch besser abzuschneiden. Das Hinzufügen zusätzlicher Funktionen ist eine Möglichkeit, ein Problem mit hoher Verzerrung zu beheben. Das Hinzufügen von Polynommerkmalen ist ein bisschen wie das Hinzufügen zusätzlicher Merkmale. Wenn du lineare Funktionen verwendest, können drei Linien sehr gut in den Trainingssatz passen. Wenn du dann zusätzliche Polynommerkmale hinzufügst, kannst du im Trainingssatz besser abschneiden, und wenn du im Trainingssatz besser abschneidest, kannst du ein Problem mit hoher Verzerrung beheben. Wenn Lambda verringert wird, bedeutet dies, dass ein niedrigerer Wert für den Regularisierungsparameter verwendet wird. Das heißt, wir werden diesem Begriff weniger Aufmerksamkeit schenken und diesem Begriff mehr Aufmerksamkeit schenken, um zu versuchen, am Trainingssatz besser abzuschneiden. Auch das hilft Ihnen, ein Problem mit hoher Verzerrung zu beheben. Schließlich Lambda erhöhen, nun, das ist das Gegenteil davon, aber das bedeutet, dass Sie die Daten überanpassen. Eine Erhöhung von Lambda ist sinnvoll, wenn das Trainingssatz zu stark angepasst wird, indem einfach zu viel Aufmerksamkeit darauf verwendet wird, das Trainingssatz anzupassen, aber auf Kosten der Verallgemeinerung auf neue Beispiele. Eine Erhöhung von Lambda würde den Algorithmus zwingen, eine glattere Funktion, möglicherweise eine weniger wackelige Funktion, anzupassen und dies zur Behebung eines Problems mit hoher Varianz zu verwenden. Mir wurde klar, dass das eine Menge Zeug auf dieser Folie war. Aber ich hoffe, Sie haben folgende Erkenntnisse: Wenn Sie feststellen, dass Ihr Algorithmus eine hohe Varianz aufweist, dann sind die beiden wichtigsten Möglichkeiten, dies zu beheben: weder mehr Trainingsdaten abrufen noch Ihr Modell vereinfachen. Mit vereinfachtem Modell meine ich, entweder einen kleineren Satz von Funktionen zu erhalten oder den Regularisierungsparameter Lambda zu erhöhen. Ihr Algorithmus ist weniger flexibel, um sehr komplexe, sehr wackelige Kurven anzupassen. Umgekehrt, wenn dein Algorithmus einen hohen Bias hat, bedeutet das, dass er selbst im Trainingssatz nicht gut abschneidet. Wenn das der Fall ist, bestehen die Hauptkorrekturen darin, Ihr Modell leistungsfähiger zu machen oder es flexibler zu machen, um komplexere oder mehr Wit-me-Funktionen unterzubringen. Einige Möglichkeiten, dies zu tun, bestehen darin, ihm zusätzliche Funktionen zuzuweisen oder diese Polynommerkmale hinzuzufügen oder den Regularisierungsparameter Lambda zu verringern. Wie dem auch sei, falls du dich fragst, ob du hohe Vorurteile beheben solltest, indem du die Größe des Trainingssatzes reduzierst, hilft das nicht wirklich. Wenn Sie die Größe des Trainingssatzes reduzieren, passen Sie den Trainingssatz besser an, aber das verschlechtert tendenziell Ihren Kreuzvalidierungsfehler und die Leistung Ihres Lernalgorithmus. Werfen Sie also nicht zufällig Trainingsbeispiele weg, nur um zu versuchen, ein Problem mit hoher Verzerrung zu beheben. Einer meiner Doktoranden aus Stanford, viele Jahre nachdem er bereits seinen Abschluss in Stanford gemacht hatte, sagte mir einmal, dass er während seines Studiums in Stanford etwas über Vorurteile und Varianz gelernt habe und das Gefühl hatte, sie verstanden zu haben, er habe sie verstanden. Aber später, nach vielen Jahren Berufserfahrung in verschiedenen Unternehmen, wurde ihm klar, dass Voreingenommenheit und Varianz zu den Konzepten gehören, deren Erlernen nur kurze Zeit in Anspruch nimmt, deren Beherrschung jedoch ein Leben lang dauert. Das waren seine genauen Worte. Voreingenommenheit und Varianz sind eine dieser sehr starken Ideen. Wenn ich Lernalgorithmen trainiere, versuche ich fast immer herauszufinden, ob es sich um eine hohe Verzerrung oder eine hohe Varianz handelt. Aber wie Sie das systematisch angehen, werden Sie durch wiederholtes Üben immer besser werden. Sie werden jedoch feststellen, dass das Verständnis dieser Ideen Ihnen dabei hilft, bei der Entwicklung eines Lernalgorithmus viel effektiver zu entscheiden, was Sie als Nächstes ausprobieren möchten. Nun, ich weiß, dass wir in diesem Video eine Menge durchgemacht haben und wenn du das Gefühl hast, Junge, das ist kein verlorenes Zeug hier, ist okay, mach dir keine Sorgen. Später in dieser Woche gibt es in den Übungslaboren und Übungsquizzen auch zusätzliche Möglichkeiten, diese Ideen zu besprechen, damit Sie weitere Übungen sammeln können. Wir denken über Verzerrungen und Varianzen verschiedener Lernalgorithmen nach. Wenn es so aussieht, als ob vieles im Moment okay ist, kannst du diese Ideen später in dieser Woche üben und hoffentlich dein Verständnis dafür zu diesem Zeitpunkt vertieft haben. Bevor wir fortfahren, sind Bias und Varianz auch sehr nützlich, wenn Sie darüber nachdenken, wie ein neuronales Netzwerk trainiert werden kann. Im nächsten Video werfen wir einen Blick auf diese Konzepte, die auf das Training neuronaler Netzwerke angewendet werden. Gehen wir zum nächsten Video über.
Verzerrung/Varianz und neuronale Netzwerke
Es wurde festgestellt, dass ein hoher Bias oder eine hohe Varianz beide in dem Sinne schlecht sind, dass sie die Leistung Ihres Algorithmus beeinträchtigen. Einer der Gründe, warum neuronale Netzwerke so erfolgreich waren, liegt in Ihren Netzwerken, zusammen mit der Idee von Big Data oder hoffentlich großen Datensätzen. Es hat uns neue Möglichkeiten eröffnet, sowohl mit hoher Verzerrung als auch mit hoher Varianz umzugehen. Lass uns einen Blick darauf werfen. Sie haben gesehen, dass, wenn Sie Polynome anderer Ordnung an einen Datensatz anpassen, dann, wenn Sie ein lineares Modell wie dieses auf der linken Seite anpassen würden. Sie haben ein ziemlich einfaches Modell, das eine hohe Verzerrung aufweisen kann, wohingegen Sie ein komplexes Modell anpassen müssten, dann könnten Sie unter einer hohen Varianz leiden. Und da ist dieser Kompromiss zwischen Bias und Varianz, und in unserem Beispiel war es die Wahl eines Polynoms zweiter Ordnung, das Ihnen hilft, einen Kompromiss einzugehen und ein Modell mit dem geringstmöglichen Kreuzvalidierungsfehler auszuwählen. Vor den Tagen neuronaler Netze haben Ingenieure für maschinelles Lernen viel über diesen Kompromiss zwischen Verzerrungen und Varianzen gesprochen, bei dem man die Komplexität, also den Grad des Polynoms, ausbalancieren muss. Oder der Regularisierungsparameter länger, damit Käufer und Varianten nicht zu hoch sind. Und wenn Sie Ingenieure für maschinelles Lernen über den Kompromiss zwischen Bias-Varianz sprechen hören. Darauf beziehen sie sich: Wenn Sie ein zu einfaches Modell haben, haben Sie eine hohe Verzerrung, ein zu komplexes Modell eine hohe Varianz. Und Sie müssen einen Kompromiss zwischen diesen beiden schlechten Dingen finden, um wahrscheinlich das bestmögliche Ergebnis zu erzielen. Aber es stellt sich heraus, dass Ihre Netzwerke uns dieses ganze Dilemma, Vorurteile und Varianz mit einigen Vorbehalten abwägen zu müssen, wegnehmen. Und es stellt sich heraus, dass große neuronale Netzwerke, wenn sie mit kleinen, mittelgroßen Datensätzen trainiert werden, Maschinen mit geringer Verzerrung sind. Und was ich damit meine ist, wenn Sie Ihr neuronales Netzwerk groß genug machen, können Sie Ihr Trainingsset fast immer gut anpassen. Solange dein Trainingsset nicht riesig ist. Und das bedeutet, dass wir damit ein neues Rezept haben, mit dem wir versuchen können, Verzerrungen oder Varianzen nach Bedarf zu reduzieren, ohne wirklich Kompromisse zwischen den beiden eingehen zu müssen. Lassen Sie mich Ihnen ein einfaches Rezept vorstellen, das nicht immer zutrifft. Aber wenn es liefert, kann es sehr leistungsfähig sein, ein genaues Modell mithilfe eines neuronalen Netzwerks zu erhalten, das zuerst Ihren Algorithmus auf Ihrem Trainingssatz trainiert und dann gefragt wird, ob er auf dem Trainingssatz gut abschneidet. Messen Sie also Jtrain und schauen Sie, ob es hoch und mit hoch ist, ich meine zum Beispiel, relativ zur menschlichen Leistung oder zu einem bestimmten Ausgangsleistungsniveau, und wenn es nicht gut läuft, haben Sie ein Problem mit hoher Verzerrung, hohen Zugfehlern. Und eine Möglichkeit, Verzerrungen zu reduzieren, besteht darin, einfach ein größeres neuronales Netzwerk zu verwenden , und mit größerem neuronalen Netzwerk meine ich entweder mehr versteckte Schichten oder mehr versteckte Einheiten pro Schicht. Und dann kannst du diese Schleife weiter durchlaufen und dein neuronales Netzwerk immer größer machen, bis es im Trainingssatz gut abschneidet. Das bedeutet, dass die Fehlerquote in Ihrem Trainingssatz erreicht wird, die in etwa mit der Zielfehlerquote vergleichbar ist, die Sie zu erreichen hoffen, was die Leistung auf menschlichem Niveau sein könnte. Nachdem es auf das Trainingsset gefallen ist, lautet die Antwort auf diese Frage ja. Ihre Frage schneidet dann im Transvalidierungssatz nicht gut ab. Mit anderen Worten, hat es eine hohe Varianz und wenn die Antwort nein ist, dann können Sie schlussfolgern, dass der Algorithmus eine hohe Varianz hat, weil er nicht trainieren möchte, was auf dem Kreuzvalidierungssatz nicht funktioniert. Diese große Lücke in Jcv und Jtrain deutet also darauf hin, dass Sie wahrscheinlich ein Problem mit hoher Varianz haben, und wenn Sie ein Problem mit hoher Varianz haben, können Sie versuchen, es zu beheben, indem Sie mehr Daten abrufen. Um mehr Daten zu erhalten und zurückzugehen und das Modell erneut zu trainieren und es einfach noch einmal zu überprüfen, möchten Sie nur das Trainingsset? Wenn nicht, sollten Sie ein größeres Netzwerk haben, oder es wird geprüft, ob dies der Fall ist, wenn die Cross-Foundation gesetzt ist, und wenn nicht, mehr Daten abrufen. Und wenn Sie diese Schleife immer und immer wieder umdrehen können, bis sie im Kreuzvalidierungssatz schließlich gut abschneidet. Dann sind Sie wahrscheinlich fertig, denn jetzt haben Sie ein Modell, das im Kreuzvalidierungssatz gut abschneidet und sich hoffentlich auch auf neue Beispiele verallgemeinern lässt. Nun gibt es natürlich Einschränkungen bei der Anwendung dieses Rezepts: Das Training eines größeren neuronalen Netzwerks reduziert die Verzerrung nicht, aber irgendwann wird es rechenintensiv. Aus diesem Grund wurde der Aufstieg neuronaler Netze durch das Aufkommen sehr schneller Computer, insbesondere GPUs oder Grafikprozessoren, wirklich unterstützt. Hardware, die traditionell zur Beschleunigung von Computergrafiken verwendet wurde, aber es hat sich herausgestellt, dass sie auch für die Beschleunigung neuronaler Netzwerke sehr nützlich war. Aber selbst bei Hardwarebeschleunigern, die einen bestimmten Punkt überschreiten, sind die neuronalen Netze so groß, dass das Training so lange dauert, dass es unmöglich wird. Und dann ist die andere Einschränkung natürlich mehr Daten. Manchmal kann man nur eine bestimmte Menge Daten abrufen, und ab einem bestimmten Punkt ist es schwierig, viel mehr Daten abzurufen. Aber ich denke, dieses Rezept erklärt einen Großteil des Aufstiegs von Deep Learning in den letzten Jahren, und zwar für Anwendungen, bei denen Sie Zugriff auf viele Daten haben. Wenn Sie dann große neuronale Netzwerke trainieren können, können Sie bei vielen Anwendungen irgendwann eine ziemlich gute Leistung erzielen. Eine Sache, die in dieser Folie implizit enthalten war und vielleicht nicht offensichtlich war, ist, dass Sie bei der Entwicklung eines Lernalgorithmus manchmal feststellen, dass Sie eine hohe Verzerrung haben. In diesem Fall erweitern Sie beispielsweise Ihr neuronales Netzwerk. Aber nachdem Sie Ihr neuronales Netzwerk erweitert haben, stellen Sie möglicherweise fest, dass Sie eine hohe Varianz haben. In diesem Fall könnten Sie andere Dinge tun, z. B. mehr Daten sammeln. Und während der Stunden, Tage oder Wochen, in denen Sie an verschiedenen Stellen einen Algorithmus für maschinelles Lernen entwickeln, können hohe Käufe oder eine hohe Varianz auftreten. Und es kann sich ändern, aber es hängt davon ab, ob Ihr Algorithmus zu diesem Zeitpunkt eine hohe Verzerrung oder eine hohe Varianz aufweist. Dann kann das helfen, eine Anleitung dafür zu geben, was Sie als Nächstes versuchen sollten. Wenn Sie Ihr neuronales Netzwerk trainieren, haben mich die Leute schon einmal gefragt: Hey Andrew, was ist, wenn mein neuronales Netzwerk zu groß ist? Wird das zu einem Problem mit hoher Varianz führen? Es stellt sich heraus, dass ein großes neuronales Netzwerk mit einer gut gewählten Regularisierung normalerweise genauso gut oder besser abschneidet als ein kleineres. Wenn Sie also beispielsweise ein kleines neuronales Netzwerk wie dieses haben und auf ein viel größeres neuronales Netzwerk wie dieses umsteigen würden, würden Sie denken, dass das Risiko einer Überanpassung erheblich steigt. Es stellt sich jedoch heraus, dass, wenn Sie dieses größere neuronale Netzwerk entsprechend regulieren würden, dieses größere neuronale Netzwerk normalerweise mindestens genauso gut oder besser abschneidet als das kleinere. Solange die Regularisierung angemessen gewählt wurde. Eine andere Art, dies zu sagen, ist, dass es fast nie schadet, ein neuronales Netzwerk zu starten, solange Sie es entsprechend reguliert haben, mit einer Einschränkung: Wenn Sie das größere neuronale Netzwerk trainieren, wird es rechenintensiver und teurer. Der Hauptgrund, warum es also weh tut, ist, dass es dein Training und deinen Inferenzprozess verlangsamt und ganz kurz ein neuronales Netzwerk regularisiert. Dies ist, was Sie tun, wenn die Kostenfunktion für Ihr neuronales Netzwerk der durchschnittliche Verlust ist und das letzte Jahr also ein quadratischer Fehler oder ein logistischer Verlust sein könnte. Dann sieht der Regularisierungsterm für ein neuronales Netzwerk so aus, als ob das, was Sie erwarten würden, länger als zwei m mal die Summe von w im Quadrat ist, wobei dies ein Lied über immer W im neuronalen Netzwerk ist. Ähnlich wie bei der Regularisierung für lineare Regression und logistische Regression regulieren wir die Parameter im neuronalen Netzwerk normalerweise nicht, obwohl es in der Praxis kaum einen Unterschied macht, ob Sie dies tun oder nicht. Und die Art und Weise, wie Sie die Regularisierung in Tensorflow implementieren würden, ist, sich daran zu erinnern, dass dies der Code für die Implementierung eines ungeregelten risierten handschriftlichen Ziffernklassifizierungsmodells war. Wir erstellen auf diese Weise drei Ebenen mit der Aktivierung einer Reihe von Anpassungseinheiten und erstellen dann ein sequentielles Modell mit den drei Ebenen. Wenn Sie eine Regularisierung hinzufügen möchten, fügen Sie einfach diesen zusätzlichen Begriff hinzu: Colonel regularize A entspricht l. Zwei und dann 0,01, wobei das der Wert von länger ist, obwohl Sie tatsächlich unterschiedliche Lambda-Werte für verschiedene Ebenen auswählen können, obwohl Sie der Einfachheit halber denselben Lambda-Wert für alle Gewichtungen und alle verschiedenen Ebenen wie folgt wählen können. Und dann können Sie auf diese Weise die Regularisierung in Ihrem neuronalen Netzwerk implementieren. Um also zwei Takeaways zusammenzufassen, ich hoffe ihr habt aus diesem Video einen. Es tut kaum weh, ein größeres neuronales Netzwerk zu haben, solange Sie es entsprechend regulieren. Eine Einschränkung ist, dass ein größeres neuronales Netzwerk Ihren Algorithmus verlangsamen kann. Vielleicht ist das die eine Art, wie es weh tut, aber es sollte die Leistung Ihres Albums größtenteils nicht beeinträchtigen und es könnte sogar erheblich helfen. Und zweitens, solange dein Trainingsset nicht zu groß ist. Dann ist ein neues Netzwerk, insbesondere ein großes neuronales Netzwerk, oft eine Maschine mit geringer Bias. Es passt einfach sehr gut zu sehr komplizierten Funktionen, weshalb ich beim Training neuronaler Netze oft eher mit verschiedenen Problemen als mit Bias-Problemen zu kämpfen habe, zumindest wenn das neuronale Netzwerk groß genug ist. Der Aufstieg von Deep Learning hat also die Art und Weise, wie Praktiker des maschinellen Lernens über Vorurteile und Varianz denken, wirklich verändert. Allerdings ist das, was man als Nächstes tut, oft sehr hilfreich, selbst wenn man ein neuronales Netzwerk trainiert, um Bias und Varianz zu messen und diese dann für Gott zu nutzen. Das war’s also mit Voreingenommenheit und Varianz. Gehen wir zum nächsten Video über. Wir werden alle Ideen, die wir gelernt haben, aufgreifen und sehen, wie sie in den Entwicklungsprozess von maschinellen Lernsystemen passen. Und ich hoffe, dass wir viele dieser Teile zusammenfügen, um Ihnen praktische Ratschläge zu geben, wie Sie die Entwicklung Ihrer Systeme für maschinelles Lernen schnell vorantreiben können.
Iterative Schleife der ML-Entwicklung
In den nächsten Videos möchte ich mit Ihnen teilen, wie es ist, den Prozess der Entwicklung eines maschinellen Lernsystems zu durchlaufen, sodass Sie, wenn Sie dies selbst tun , hoffentlich in der Lage sind, in vielen Phasen des Entwicklungsprozesses für maschinelles Lernen gute Entscheidungen zu treffen. Schauen wir uns zunächst den iterativen Kreislauf der Entwicklung des maschinellen Lernens an. So fühlt sich die Entwicklung eines Modells für maschinelles Lernen oft an. Zunächst entscheiden Sie, wie die Gesamtarchitektur Ihres Systems aussehen soll. Das bedeutet, dass Sie Ihr Modell für maschinelles Lernen auswählen und entscheiden müssen, welche Daten verwendet werden sollen, vielleicht die Hyperparameter auswählen usw. Auf der Grundlage dieser Entscheidungen würden Sie dann ein Modell implementieren und trainieren. Wie ich bereits erwähnt habe, wenn du ein Modell zum ersten Mal trainierst, wird es fast nie so gut funktionieren, wie du es dir wünschst. Der nächste Schritt, den ich dann empfehle, besteht darin, einige Diagnosen zu implementieren oder sich diese anzusehen, z. B. die Verzerrung und Varianz Ihres Algorithmus sowie etwas, das wir im nächsten Video namens Fehleranalyse sehen werden. Basierend auf den Erkenntnissen aus der Diagnose können Sie dann Entscheidungen treffen, z. B. ob Sie Ihr neuronales Netzwerk vergrößern oder den Lambda-Regularisierungsparameter ändern oder vielleicht weitere Daten hinzufügen oder weitere Funktionen hinzufügen oder Funktionen entfernen möchten. Dann umrunden Sie diese Schleife erneut mit Ihrer neuen Architektur, und es werden oft mehrere Iterationen durch diese Schleife benötigt, bis Sie die gewünschte Leistung erreichen. Schauen wir uns ein Beispiel für die Erstellung eines E-Mail-Spam-Klassifikators an. Ich denke, dass viele von uns E-Mail-Spam leidenschaftlich hassen, und das ist ein Problem, an dem ich vor Jahren gearbeitet habe und vor einigen Jahren auch an der Gründung einer Anti-Spam-Konferenz beteiligt war. Das Beispiel auf der linken Seite zeigt, wie eine E-Mail mit hohem Spam-Anteil aussehen könnte. Das Angebot der Woche sind inzwischen Rolex-Uhren. Spammer schreiben manchmal bewusst Wörter wie diese, Uhren, Medikamente und Hypotheken falsch, um zu versuchen, einen Spam-Erkenner auszulöschen. Im Gegensatz dazu ist diese E-Mail auf der rechten Seite eine echte E-Mail, die ich einmal von meinem jüngeren Bruder Alfred über ein Treffen zu Weihnachten erhalten habe. Wie erstellt man einen Klassifikator, um Spam-E-Mails von Nicht-Spam-E-Mails zu unterscheiden? Eine Möglichkeit, dies zu tun, besteht darin, einen Algorithmus für überwachtes Lernen zu trainieren, bei dem die Eingabemerkmale x die Merkmale einer E-Mail und das Ausgabelabel y eins oder null ist, je nachdem, ob es sich um Spam oder Nicht-Spam handelt. Diese Anwendung ist ein Beispiel für die Textklassifizierung, da Sie ein Textdokument, bei dem es sich um eine E-Mail handelt, verwenden und versuchen, es entweder als Spam oder als Nicht-Spam zu klassifizieren. Eine Möglichkeit, die Funktionen der E-Mail zu konstruieren, wäre, die wichtigsten 10.000 Wörter in der englischen Sprache oder in einem anderen Wörterbuch zu nehmen und sie zu verwenden, um die Funktionen x_1, x_2 bis x_10.000 zu definieren. Wenn wir zum Beispiel diese E-Mail auf der rechten Seite haben, wenn die Wortliste, die wir haben, lautet: „ Andrew Buy Deal“, „Rabatt“ und so weiter. Wenn wir dann die E-Mail auf der rechten Seite erhalten, würden wir diese Funktionen beispielsweise auf 0 oder 1 setzen, je nachdem, ob das Wort erscheint oder nicht. Das Wort a erscheint nicht. Das Wort Andrew taucht auf. Das Wort Kaufen erscheint, Angebot tut es, Rabatt nicht und so weiter, und so weiter, und so können Sie 10.000 Funktionen aus dieser E-Mail erstellen. Es gibt viele Möglichkeiten, einen Feature-Vektor zu konstruieren. Eine andere Möglichkeit wäre, diese Zahlen nicht nur 1 oder 0 sein zu lassen , sondern zu zählen, wie oft ein bestimmtes Wort in der E-Mail vorkommt. Wenn „Kaufen“ zweimal erscheint, möchten Sie diesen Wert vielleicht auf 2 setzen, aber nur auf 1 oder 0 setzen. Es funktioniert eigentlich ganz gut. Angesichts dieser Merkmale können Sie dann einen Klassifikationsalgorithmus wie ein logistisches Regressionsmodell oder ein neuronales Netzwerk trainieren, um y anhand dieser Merkmale x vorherzusagen. Wenn Sie Ihr erstes Modell trainiert haben und es nicht so gut funktioniert, wie Sie es sich wünschen, haben Sie wahrscheinlich mehrere Ideen zur Verbesserung der Leistung des Lernalgorithmus. Zum Beispiel ist es immer verlockend, mehr Daten zu sammeln. Tatsächlich habe ich Freunde, die an sehr großen Honeypot-Projekten gearbeitet haben. Dies sind Projekte, die eine große Anzahl gefälschter E-Mail-Adressen erstellen und versuchen, diese gefälschten E-Mail-Adressen bewusst in die Hände von Spammern zu bringen, sodass wir wissen, dass es sich um Spam-E-Mails handelt, wenn sie Spam-E-Mails an diese gefälschten E-Mails senden. Auf diese Weise können Sie viele Spam-Daten abrufen. Oder Sie entscheiden sich dafür, auf der Grundlage des E-Mail-Routing ausgefeiltere Funktionen zu entwickeln. E-Mail-Routing bezieht sich auf die Reihenfolge der Rechendienste. Manchmal auf der ganzen Welt hat die E-Mail den ganzen Weg zurückgelegt, um Sie zu erreichen, und E-Mails enthalten tatsächlich sogenannte E-Mail-Header-Informationen. Das sind Informationen, die verfolgen, wie die E-Mail über verschiedene Server und Netzwerke übertragen wurde, um ihren Weg zu Ihnen zu finden. Manchmal kann Ihnen der Weg, den eine E-Mail zurückgelegt hat, Aufschluss darüber geben, ob sie von einem Spammer gesendet wurde oder nicht. Oder Sie arbeiten vielleicht daran, aus dem E-Mail-Text, der der Text der E-Mail ist, ausgefeiltere Funktionen zu entwickeln. In den Funktionen, über die ich das letzte Mal gesprochen habe, können Rabatt und Rabatt als unterschiedliche Wörter behandelt werden, und vielleicht sollten sie als dieselben Wörter behandelt werden. Oder Sie entscheiden sich dafür, Algorithmen zu entwickeln, um Rechtschreibfehler oder absichtliche Rechtschreibfehler wie Uhren, Medikamente und Hypotheken zu erkennen. Auch dies könnte Ihnen bei der Entscheidung helfen, ob es sich bei einer E-Mail um Spam handelt. Wie können Sie angesichts all dieser und möglicherweise noch mehr Ideen entscheiden, an welchen dieser Ideen Sie arbeiten sollten? Denn wenn Sie den vielversprechenderen Weg wählen, kann Ihr Projekt leicht zehnmal schneller werden, als wenn Sie sich irgendwie für einige der weniger vielversprechenden Richtungen entscheiden würden. Wir haben zum Beispiel bereits festgestellt, dass, wenn Ihr Algorithmus eher eine hohe Verzerrung als eine hohe Varianz aufweist, es nicht die fruchtbarste Richtung ist, Monate und Monate in ein Honeypot-Projekt zu investieren. Wenn Ihr Algorithmus jedoch eine hohe Varianz aufweist, kann das Sammeln weiterer Daten sehr hilfreich sein. Wenn Sie den iterativen Kreislauf von Maschinen und Entwicklung durchziehen, haben Sie vielleicht viele Ideen, wie Sie das Modell oder die Daten modifizieren können, und es werden verschiedene Diagnosen entwickelt, die Ihnen eine Menge Hinweise geben können, welche Optionen für das Modell oder die Daten oder andere Teile der Architektur am vielversprechendsten sein könnten. In den letzten Videos haben wir bereits über Voreingenommenheit und Varianz gesprochen. Im nächsten Video möchte ich Ihnen den Prozess der Fehleranalyse beschreiben, der eine zweite wichtige Reihe von Ideen enthält, um Erkenntnisse darüber zu gewinnen, welche Architekturentscheidungen fruchtbar sein könnten. Das ist die iterative Schleife der Entwicklung maschinellen Lernens am Beispiel der Erstellung eines Spam-Klassifikators. Schauen wir uns an, wie die Fehleranalyse aussieht. Lass uns das im nächsten Video machen.
Fehleranalyse
In Bezug auf die wichtigsten Methoden, die Ihnen bei der Durchführung von Diagnosen helfen können, um zu entscheiden, was Sie als Nächstes ausprobieren möchten, um die Leistung Ihres Lernalgorithmus zu verbessern, würde ich sagen, dass Bias und Varianz wahrscheinlich die wichtigste Idee sind und die Fehleranalyse wahrscheinlich an zweiter Stelle auf meiner Liste stehen würde. Schauen wir uns an, was das bedeutet. Nehmen wir konkret an, dass m_cv 500 Kreuzvalidierungsbeispiele entspricht und Ihr Algorithmus 100 dieser 500 Kreuzvalidierungsbeispiele falsch klassifiziert. Der Prozess der Fehleranalyse bezieht sich lediglich darauf, diese 100 Beispiele manuell durchzusehen und zu versuchen, Erkenntnisse darüber zu gewinnen, wo der Algorithmus falsch läuft. Insbesondere suche ich häufig nach einer Reihe von Beispielen dafür, dass der Algorithmus Beispiele aus dem Kreuzvalidierungssatz falsch klassifiziert hat, und versuche, sie in gemeinsame Themen oder gemeinsame Eigenschaften oder gemeinsame Merkmale zu gruppieren. Wenn Sie zum Beispiel feststellen, dass es sich bei vielen der falsch klassifizierten Spam-E-Mails um Arzneimittelverkäufe handelt, bei denen versucht wird, Medikamente oder Medikamente zu verkaufen, werde ich diese Beispiele durchgehen und von Hand ermitteln, wie viele E-Mails in dieser Kategorie Pharma-Spam sind, und sagen, dass es sich um 21 E-Mails handelt, bei denen es sich um pharmazeutische Spam handelt. Oder wenn Sie vermuten , dass vorsätzliche Rechtschreibfehler über Ihren Spam-Klassifikator stolpern könnten, werde ich das auch durchgehen und nur zählen, wie viele dieser falsch klassifizierten Beispiele einen vorsätzlichen Rechtschreibfehler enthielten. Nehmen wir an, ich finde drei von 100. Oder wenn ich mir die E-Mail-Weiterleitungsinformationen ansehe, finde ich, dass sieben E-Mails ungewöhnlich weiterleiten und 18 E-Mails versuchen, Passwörter oder Phishing-E-Mails zu stehlen. Spam ist manchmal auch: Anstatt die Spam-Nachricht in den E-Mail-Text zu schreiben, erstellen sie stattdessen ein Bild und schreiben dann die Nachricht in ein Bild, das in der E-Mail erscheint, in den Spam. Dies macht es für den Lernalgorithmus etwas schwieriger, herauszufinden, was vor sich geht. Vielleicht handelt es sich bei einigen dieser E-Mails um eingebettete Bild-Spam-Mails. Wenn Sie diese Zahlen haben , zeigt Ihnen das, dass pharmazeutischer Spam und E-Mails, die versuchen, Passwörter oder Phishing-E-Mails zu stehlen, große Probleme zu sein scheinen, wohingegen absichtliche Rechtschreibfehler ein Problem ist, es ist ein kleineres. Diese Analyse zeigt Ihnen insbesondere, dass selbst wenn Sie wirklich ausgeklügelte Algorithmen zur Suche nach absichtlichen Rechtschreibfehlern entwickeln, nur drei von 100 Ihrer falsch klassifizierten Beispiele gelöst werden können. Die Nettoauswirkungen scheinen möglicherweise nicht so groß zu sein. Heißt das nicht, dass es sich nicht lohnt? Wenn Sie jedoch Prioritäten setzen, was zu tun ist, entscheiden Sie sich möglicherweise dafür, dies nicht so hoch zu priorisieren. Übrigens, ich erzähle die Geschichte, weil ich einmal viel Zeit damit verbracht habe, Algorithmen zu entwickeln, um absichtliche Rechtschreibfehler und Spam-E-Mails zu finden, erst viel später wurde mir klar, dass die Nettoauswirkung tatsächlich recht gering war. Dies ist ein Beispiel, bei dem ich mir wünschte, ich hätte eine sorgfältigere Fehleranalyse durchgeführt, bevor ich viel Zeit damit verbracht hätte, diese absichtlichen Rechtschreibfehler zu finden. Nur ein paar Hinweise zu diesem Prozess. Diese Kategorien können sich überschneiden oder mit anderen Worten, sie schließen sich nicht gegenseitig aus. Zum Beispiel kann es sich um eine pharmazeutische Spam-E-Mail handeln, die ebenfalls ungewöhnlich weitergeleitet wird, oder um ein Passwort, das absichtlich falsch geschrieben wurde und ebenfalls versucht, den Phishing-Angriff auszuführen. Eine E-Mail kann in mehreren Kategorien gezählt werden. In diesem Beispiel hatte ich gesagt, dass der Algorithmus als 100 Beispiele klassifiziert ist und wir uns alle 100 Beispiele manuell ansehen werden. Wenn Sie einen größeren Kreuzvalidierungssatz haben, sagen wir, wir hatten 5.000 Kreuzvalidierungsbeispiele, und wenn der Algorithmus 1.000 davon falsch klassifiziert hat, haben Sie je nach Teamgröße und wie viel Zeit Sie für die Arbeit an diesem Projekt haben, möglicherweise nicht die Zeit. Möglicherweise haben Sie nicht die Zeit, sich alle 1.000 Beispiele, die der Algorithmus klassifiziert, manuell anzusehen. In diesem Fall werde ich oft zufällig eine Teilmenge von normalerweise etwa 100, vielleicht ein paar 100 Beispielen auswählen, weil das die Menge ist, die Sie in einer angemessenen Zeit durchsehen können. Wenn Sie sich vielleicht etwa 100 Beispiele ansehen, erhalten Sie hoffentlich genügend Statistiken darüber, ob die häufigsten Fehlerarten und daher möglicherweise am fruchtbarsten sind, um Ihre Aufmerksamkeit zu lenken. Wenn Sie nach dieser Analyse feststellen, dass es sich bei vielen Fehlern um pharmazeutische Spam-E-Mails handelt, könnte Ihnen dies einige Ideen oder Anregungen für die nächsten Schritte geben. Sie können sich beispielsweise dafür entscheiden, mehr Daten zu sammeln, aber nicht mehr Daten von allem, sondern einfach versuchen, mehr Daten von pharmazeutischen Spam-E-Mails zu finden , damit der Lernalgorithmus diese pharmazeutischen Spam-Mails besser erkennen kann. Oder Sie entscheiden sich vielleicht dafür, einige neue Funktionen zu entwickeln, die sich beispielsweise auf bestimmte Namen von Medikamenten oder bestimmte Namen von pharmazeutischen Produkten der Standards beziehen, die Sie verkaufen möchten, damit Ihr Lernalgorithmus diese Art von früherem Spam besser erkennen kann. Andererseits könnte dies Sie dazu inspirieren, spezifische Änderungen am Algorithmus zur Erkennung von Phishing-E-Mails vorzunehmen. Sie könnten sich beispielsweise die URLs in der E-Mail ansehen und einen speziellen Code schreiben, der zusätzliche Funktionen bietet, um festzustellen, ob er auf verdächtige URLs verweist. Oder vielleicht entscheiden Sie sich dafür, mehr Daten von Phishing-E-Mails zu erhalten, damit Ihr Lernalgorithmus diese besser erkennen kann. Der Sinn dieser Fehleranalyse besteht darin, manuell eine Reihe von Beispielen zu untersuchen, die Ihr Algorithmus falsch klassifiziert oder falsch etikettiert. Oft ist dies eine Inspiration dafür, was nützlich sein könnte, es auszuprobieren, und manchmal kann es Ihnen auch zeigen, dass bestimmte Arten von Fehlern so selten sind, dass es nicht so viel Zeit wert ist, sie zu beheben. Zurück zu dieser Liste: Eine systematische Varianzanalyse sollte Ihnen Aufschluss darüber geben, ob das Sammeln weiterer Daten hilfreich ist oder nicht. Basierend auf unserer Fehleranalyse in dem Beispiel, das Lisa durchgemacht hat, sieht es so aus, als könnten ausgefeiltere E-Mail-Funktionen helfen, aber nur ein bisschen, wohingegen ausgefeiltere Funktionen zur Erkennung früherer Spam- oder Phishing-E-Mails sehr hilfreich sein könnten. Diese Erkennung von Rechtschreibfehlern würde nicht annähernd so viel helfen. Im Allgemeinen empfand ich sowohl die Bias-Varianz-Diagnose als auch die Durchführung dieser Form der Fehleranalyse als sehr hilfreich beim Screening oder bei der Entscheidung, welche Änderungen am Modell als nächstes erfolgversprechender sind. Eine Einschränkung der Fehleranalyse besteht darin, dass sie bei Problemen, in denen Menschen gut sind, viel einfacher durchzuführen ist. Sie können sich die E-Mail ansehen und sagen, dass Sie denken, dass es sich um eine Spam-E-Mail handelt. Warum hat der Durchschnitt sie falsch verstanden? Die Fehleranalyse kann bei Aufgaben, in denen selbst Menschen nicht gut sind, etwas schwieriger sein. Zum Beispiel, wenn Sie vorhersagen möchten, auf welche Anzeigen jemand auf der Website klicken wird. Nun, ich kann nicht vorhersagen, worauf jemand klicken wird. Die Fehleranalyse ist dort tatsächlich tendenziell schwieriger. Wenn Sie jedoch die Fehleranalyse auf mögliche Probleme anwenden, kann dies äußerst hilfreich sein, um die Aufmerksamkeit auf die vielversprechenderen Dinge zu lenken, die Sie ausprobieren sollten. Das wiederum kann Ihnen leicht Monate ansonsten fruchtloser Arbeit ersparen. Im nächsten Video möchte ich näher auf das Problem des Hinzufügens von Daten eingehen. Wenn Sie einen Lernalgorithmus trainieren, stellen Sie manchmal fest, dass eine hohe Varianz vorliegt und Sie mehr Daten dafür erhalten möchten. Mit einigen Techniken können Sie das Hinzufügen von Daten erheblich effizienter gestalten. Schauen wir uns das an, damit Sie hoffentlich einige gute Möglichkeiten haben, mehr Daten für Ihre Lernanwendung zu erhalten.
Hinzufügen von Daten
In diesem Video möchte ich Ihnen einige Tipps geben, wie Sie Daten hinzufügen oder mehr Daten sammeln oder manchmal sogar mehr Daten für Ihre Machine Learning-Anwendung erstellen können. Nur eine Vorwarnung, dass dies in den nächsten Videos ein bisschen wie eine Wundertüte verschiedener Techniken wirken wird. Und ich entschuldige mich, wenn es ein bisschen krass erscheint und das liegt daran, dass Anwendungen für maschinelles Lernen unterschiedlich sind. Maschinelles Lernen wird auf so viele verschiedene Probleme angewendet und für manche Menschen ist es großartig, Etiketten zu erstellen. Und für einige können Sie mehr Daten abrufen und für andere nicht. Und das ist der Grund, warum verschiedene Anwendungen manchmal etwas unterschiedliche Techniken erfordern. Aber ich hoffe, dass ich Ihnen in den nächsten Videos einige der Techniken vorstellen kann , die sich für verschiedene Anwendungen als am nützlichsten erwiesen haben, obwohl nicht jede von ihnen für jede einzelne Anwendung gilt. Aber ich hoffe, dass viele von ihnen für viele der Anwendungen nützlich sind, an denen Sie auch arbeiten werden. Schauen wir uns jedoch einige Tipps zum Hinzufügen von Daten für Ihre Anwendung an. Wenn wir Algorithmen für maschinelles Lernen trainieren, wünschen wir uns fast immer, wir hätten fast immer noch mehr Daten. Und so ist es manchmal verlockend, einfach mehr Daten von allem zu bekommen. Der Versuch, mehr Daten aller Art abzurufen, kann jedoch langsam und teuer sein. Stattdessen könnte eine alternative Methode zum Hinzufügen von Daten darin bestehen, sich darauf zu konzentrieren, weitere Daten der Typen hinzuzufügen, bei denen die Analyse gezeigt hat, dass dies hilfreich sein könnte. Auf der vorherigen Folie haben wir gesehen, dass, wenn bei der Fehleranalyse festgestellt wurde, dass Pharma-Spam ein großes Problem darstellt, Sie sich vielleicht dafür entscheiden, gezielter vorzugehen, nicht mehr Daten unter der Sonne zu bekommen, sondern sich darauf zu konzentrieren, mehr Beispiele für Pharma-Spam zu sammeln. Und mit bescheideneren Kosten könnten Sie genau die E-Mails hinzufügen, die Sie benötigen, um zu lernen und intelligenter in der Erkennung von Pharma-Spam zu werden. Ein Beispiel dafür, wie Sie das tun könnten, ist, wenn Sie viele E-Mail-Daten ohne Etikett haben, beispielsweise E-Mails, die herumliegen und sich noch niemand die Mühe gemacht hat, sie als Spam oder Nicht-Spam zu kennzeichnen, können Sie Ihre Mitarbeiter bitten, die unbeschrifteten Daten schnell zu durchsuchen und weitere Beispiele zu finden, insbesondere einen pharmazeutischen Spam. Und dies könnte die Leistung Ihres Lernalgorithmus viel stärker steigern, als nur zu versuchen, mehr Daten aus allen Arten von E-Mails hinzuzufügen. Aber das allgemeinere Muster, das Sie hoffentlich daraus ziehen, ist, wenn Sie einige Möglichkeiten haben, mehr Daten von allem hinzuzufügen, was in Ordnung ist. Daran ist nichts falsch. Aber wenn die Fehleranalyse ergeben hat, dass es bestimmte Teilmengen der Daten gibt, bei denen das Album besonders schlecht abschneidet. Und bei denen Sie die Leistung verbessern und dann mehr Daten von genau den Typen erhalten möchten, bei denen Sie besser werden wollten. Seien es mehr Beispiele für Pharma-Spam oder mehr Beispiele für Phishing-Spam oder etwas anderes. Das könnte eine effizientere Methode sein, nur ein bisschen Daten hinzuzufügen, aber die Leistung Ihrer Algorithmen um einiges zu steigern. Abgesehen davon, brandneue Trainingsbeispiele in die Hände zu bekommen xy. Es gibt noch eine weitere Technik, die sie speziell für Bilder und Audiodaten verwenden, um die Größe Ihres Trainingssets erheblich zu erhöhen. Diese Technik wird als Datenerweiterung bezeichnet. Und was wir tun werden, ist, ein bestehendes Zugbeispiel zu verwenden, um ein neues Trainingsbeispiel zu erstellen. Zum Beispiel, wenn Sie versuchen, die Buchstaben von A bis Z aufgrund eines [UNHÖRBAREN] Problems mit der optischen Zeichenerkennung zu erkennen. Also nicht nur die Ziffern 0-9, sondern auch die Buchstaben von A bis Z. Angesichts eines solchen Bildes könntest du dich entscheiden, ein neues Trainingsbeispiel zu erstellen, indem du das Bild ein wenig rotierst. Oder indem Sie das Bild ein wenig vergrößern oder etwas verkleinern oder indem Sie den Kontrast des Bildes ändern. Und das sind Beispiele für Bildverzerrungen, die nichts an der Tatsache ändern, dass dies immer noch der Buchstabe A ist. Und für einige Buchstaben, aber nicht für andere, kann man auch das Spiegelbild des Buchstabens nehmen und es sieht immer noch aus wie der Buchstabe A. Aber das gilt nur für einige Buchstaben, aber das wäre eine Möglichkeit, ein Trainingsbeispiel X, Y zu nehmen und eine Verzerrung oder Transformation auf die Eingabe X anzuwenden , um ein anderes Beispiel mit derselben Bezeichnung zu erhalten. Und indem Sie das tun, teilen Sie dem Algorithmus mit, dass der Buchstabe A ein bisschen gedreht oder ein bisschen vergrößert oder ein bisschen geschrumpft ist, es ist immer noch der Buchstabe A. Und wenn Sie zusätzliche Beispiele wie dieses erstellen, enthält der Lernalgorithmus, lernen Sie besser, wie man den Buchstaben A erkennt. Für ein fortgeschritteneres Beispiel für Datenerweiterung. Sie können auch den Buchstaben A nehmen und ein Gitter darauf platzieren. Und indem Sie das zufällige Verziehen dieses Rasters einführen, können Sie den Buchstaben A nehmen und War-Pings des Leders A einführen, um eine viel umfangreichere Bibliothek von Beispielen für den Buchstaben A zu erstellen. Und dieser Prozess der Verzerrung dieser Beispiele hat dann aus einem Bild eines Beispiels hier Trainingsbeispiele gemacht, die Sie dem Lernalgorithmus zur Verfügung stellen können, damit er robuster lernt. Was ist der Buchstabe A. Diese Idee der Datenerweiterung funktioniert auch für die Spracherkennung. Nehmen wir an, für eine Sprachsuchanwendung haben Sie einen originalen Audioclip, der so klingt. >> Wie ist das Wetter heute. >> Eine Möglichkeit, Datendokumentation auf Sprachdaten anzuwenden, besteht darin, lautes Hintergrundaudio wie dieses aufzunehmen. So klingt zum Beispiel der Sound einer Menschenmenge. Und es stellt sich heraus, dass, wenn man diese beiden Audioclips nimmt, den ersten und den Lärm der Menge, und sie zusammenzählt, am Ende einen Audioclip erhält, der so klingt. >> Wie ist das Wetter heute. >> Und du hast gerade einen Audioclip erstellt, der klingt, als würde jemand sagen, wie das Wetter heute ist. Aber sie sagen es vor der lauten Menge im Hintergrund. Oder wenn Sie ein anderes Hintergrundgeräusch nehmen würden, sagen wir, jemand im Auto, so klingt das Hintergrundgeräusch eines Autos. Und du willst den originalen Audioclip zum Autolärm hinzufügen, dann bekommst du das. >> Wie ist das Wetter heute. >> Und es klingt wie der originale Audioclip, aber als würde der Lautsprecher es aus einem Auto sagen. Und der fortgeschrittenere Schritt zur Datenerweiterung wäre, wenn Sie das Originalaudio so klingen lassen, als würden Sie es über eine schlechte Handyverbindung wie diese aufnehmen. Und so haben wir gesehen, wie du einen Audioclip nehmen und daraus drei Trainingsbeispiele machen kannst, einen mit Hintergrundgeräuschen der Menge, einen mit Hintergrundgeräuschen im Auto und einen, als ob er über eine schlechte Handyverbindung aufgenommen worden wäre. Und als ich an Spracherkennungssystemen gearbeitet habe, war das eine wirklich wichtige Technik, um die Größe der Trainingsdaten künstlich zu erhöhen. Ich musste einen genaueren Spracherkenner bauen. Ein Tipp zur Datenerweiterung ist, dass die Änderungen oder Verzerrungen, die Sie an den Daten vornehmen, repräsentativ für die Arten von Rauschen oder Verzerrungen im Testsatz sein sollten. Wenn Sie also zum Beispiel den Buchstaben a nehmen und ihn so verzerren, sieht das immer noch nach Beispielen für Buchstaben aus, die Sie vielleicht dort draußen sehen und die Sie gerne wiedererkennen würden. Oder für Audio, das Hintergrundgeräusche oder schlechte Handyverbindung hinzufügt , wenn das repräsentativ für das ist, was Sie hier im Testset erwarten, dann sind dies hilfreiche Methoden, um eine Datenerweiterung Ihrer Audiodaten durchzuführen. Im Gegensatz dazu ist das rein zufällige bedeutungslose Rauschen der Daten in der Regel nicht so hilfreich. Sie haben zum Beispiel den Buchstaben A genommen und ich habe ein Rauschen pro Pixel hinzugefügt. Wenn Xi die Intensität oder die Helligkeit von Pixel i ist, wenn ich nur Rauschen zu jedem Pixel hinzufüge, erhalten sie Bilder, die so aussehen. Aber in dem Maße, in dem dies nicht so repräsentativ für das ist, was Sie im Testset sehen, weil Sie im Testset nicht oft solche Bilder erhalten, wird es tatsächlich weniger hilfreich sein. Eine Möglichkeit, über Datenerweiterung nachzudenken, ist also, wie Sie Ihre Daten modifizieren, verzerren oder mehr Rauschen erzeugen können. Aber so , dass das, was Sie bekommen, immer noch dem ähnelt, was Sie in Ihrem Testset haben , denn darin wird der Lernalgorithmus letztendlich gut abschneiden. Nun, bei der Datenerweiterung wird ein vorhandenes Trainingsbeispiel verwendet und es so modifiziert, dass ein weiteres Trainingsbeispiel erstellt wird. Es gibt eine der Techniken, nämlich die Datensynthese, bei der Sie brandneue Beispiele von Grund auf neu erstellen. Nicht indem Sie ein vorhandenes Beispiel modifizieren, sondern indem Sie brandneue Beispiele erstellen. Nehmen wir das Beispiel der Foto-OCR. Foto-OCR oder optische Bilderkennung bezieht sich auf das Problem, ein Bild wie dieses zu betrachten und automatisch einen Computer den Text lesen zu lassen, der in diesem Bild erscheint. Dieses Bild enthält also viel Text. Wie kann man den OCR-Algorithmus trainieren, um Text aus einem solchen Bild zu lesen? Nun, wenn Sie sich genau ansehen, wie die Buchstaben auf diesem Bild aussehen, sehen sie tatsächlich so aus. Das sind also echte Daten aus einer Foto-OCR-Aufgabe. Und ein wichtiger Schritt bei der Foto-OCR-Aufgabe besteht darin, das kleine Bild wie folgt betrachten und den Buchstaben in der Mitte erkennen zu können. Das hat also T in der Mitte, das hat den Buchstaben L in der Mitte, das hat den Buchstaben C in der Mitte und so weiter. Eine Möglichkeit, künstliche Daten für diese Aufgabe zu erstellen, besteht darin, dass Sie im Texteditor Ihres Computers feststellen, dass er viele verschiedene Schriftarten enthält. Sie können diese Schriftarten verwenden und im Grunde zufälligen Text in Ihren Texteditor eingeben. Und wenn Sie Screenshots mit verschiedenen Farben und unterschiedlichen Kontrasten und sehr unterschiedlichen Schriftarten gemacht haben, erhalten Sie synthetische Daten wie diese auf der rechten Seite. Die Bilder auf der linken Seite waren echte Daten von echten Bildern, die auf der Welt aufgenommen wurden. Die Bilder auf der rechten Seite wurden mit Mitteln auf dem Computer synthetisch generiert und sehen tatsächlich ziemlich realistisch aus. Mit einer solchen synthetischen Datengenerierung können Sie also eine sehr große Anzahl von Bildern oder Beispielen für Ihre Foto-OCR-Aufgabe generieren. Es kann eine Menge Arbeit sein, den Code zu schreiben, um realistisch aussehende synthetische Daten für eine bestimmte Anwendung zu generieren. Aber wenn Sie die Zeit dafür aufwenden, kann es Ihnen manchmal helfen, eine sehr große Datenmenge für Ihre Anwendung zu generieren und die Leistung Ihres Albums enorm zu steigern. Synthetische Datengenerierung wurde höchstwahrscheinlich für Computer Vision-Wurf und weniger für andere Anwendungen verwendet. Auch nicht so viel für Audiogespräche. Alle Techniken, die Sie in diesem Video gesehen haben, beziehen sich auf die Suche nach Möglichkeiten, die von Ihrem System verwendeten Daten zu manipulieren. So wie sich maschinelles Lernen in den letzten Jahrzehnten, vielen Jahrzehnten, entwickelt hat. Die Aufmerksamkeit der meisten Forscher für maschinelles Lernen galt dem konventionellen modellzentrierten Ansatz, und hier ist, was ich meine. Ein maschinelles Lernsystem oder ein KI-System umfasst sowohl Code zur Implementierung Ihres Albums oder Ihres Modells als auch die Daten, mit denen Sie das Algorithmusmodell trainieren. und in den letzten Jahrzehnten haben die meisten Forscher, die am maschinellen Lernen forschen, den Datensatz heruntergeladen und die Daten gespeichert, während sie sich auf die Verbesserung des Codes, des Algorithmus oder des Modells konzentrierten. Dank dieses Paradigmas der maschinellen Lernforschung. Ich finde, dass die Algorithmen, auf die wir heute Zugriff haben, wie lineare Regression, logistische Regression, neuronale Netze und Entscheidungsbäume, wir nächste Woche sehen sollten. Es gibt Algorithmen, die bereits sehr gut sind und für viele Anwendungen gut funktionieren werden. Daher kann es manchmal fruchtbarer sein, mehr Zeit mit einem datenzentrierten Ansatz zu verbringen, bei dem Sie sich auf die Entwicklung der von Ihrem Algorithmus verwendeten Daten konzentrieren. Dabei kann es sich um alles Mögliche handeln, beispielsweise um das Sammeln weiterer Daten zu pharmazeutischem Spam. Wenn es das ist, was die Fehleranalyse Ihnen gesagt hat. Zur Verwendung von Datenerweiterung, um mehr Bilder oder mehr Audio zu erzeugen, oder zur Verwendung von Datensynthese, um einfach mehr Trainingsbeispiele zu erstellen. Und manchmal kann der Fokus auf die Daten eine effiziente Methode sein, um Ihrem Lernalgorithmus zu helfen, seine Leistung zu verbessern. Ich hoffe, dass Ihnen dieses Video eine Reihe von Tools bietet, mit denen Sie effizient und effektiv mehr Daten hinzufügen können, damit Ihr Lernalgorithmus besser funktioniert. Jetzt gibt es auch einige Anwendungen, bei denen Sie einfach nicht so viele Daten haben und es wirklich schwierig ist, mehr Daten zu erhalten. Es stellt sich heraus, dass es eine Technik namens Transfer Learning gibt, die in dieser Umgebung angewendet werden könnte, um die Leistung Ihres Lernalgorithmus enorm zu steigern. Und die Schlüsselidee besteht darin, Daten aus völlig anderen, kaum verwandten Aufgaben zu übernehmen. Bei der Verwendung eines neuronalen Netzwerks gibt es jedoch manchmal Möglichkeiten, diese Daten aus ganz anderen Aufgaben zu verwenden, damit Ihr Algorithmus in Ihrer Anwendung besser abschneidet. Gilt nicht für alles, aber wenn doch, kann es sehr mächtig sein. Schauen wir uns im nächsten Video an, wie Transfer Learning funktioniert.
Transfer-Lernen: Verwendung von Daten aus einer anderen Aufgabe
Für eine Anwendung, in der Sie nicht über so viele Daten verfügen, ist Transfer Learning eine wunderbare Technik, mit der Sie Daten aus einer anderen Aufgabe verwenden können, um Ihre Anwendung zu unterstützen. Dies ist eine dieser Techniken, die ich sehr häufig verwende. Schauen wir uns an, wie Transfer Learning funktioniert. So funktioniert Transfer Learning. Nehmen wir an, Sie möchten die handschriftlichen Ziffern von Null bis Neun erkennen, haben aber nicht so viele beschriftete Daten dieser handgeschriebenen Ziffern. Folgendes können Sie tun. Angenommen, Sie finden einen sehr großen Datensatz mit einer Million Bildern von Bildern von Katzen , Hunden, Autos, Menschen usw., tausend Klassen. Sie können dann damit beginnen, ein neuronales Netzwerk an diesem großen Datensatz von einer Million Bildern mit tausend verschiedenen Klassen zu trainieren und den Algorithmus so zu trainieren, dass er ein Bild X als Eingabe verwendet und lernen kann, eine dieser 1.000 verschiedenen Klassen zu erkennen. In diesem Prozess lernen Sie am Ende die Parameter für die erste Schicht des neuronalen Netzwerks W^1, b^1, für die zweite Schicht W^2, b^2 usw., W^3, W^4, b^4 und W^5, b^5 für die Ausgabeschicht. Um Transferlernen anzuwenden, erstellen Sie dann eine Kopie dieses neuronalen Netzwerks, in der Sie die Parameter W^1, b^1, W^2, b^2, W^3, b^3 und W^4, b^4 chippen. Für die letzte Ebene würden Sie jedoch die Ausgabeschicht entfernen und durch eine viel kleinere Ausgabeschicht mit nur 10 statt 1.000 Ausgabeeinheiten ersetzen. Diese 10 Ausgabeeinheiten entsprechen den Klassen Null, Eins und Neun, die Ihr neuronales Netzwerk erkennen soll. Beachten Sie, dass die Parameter W^5, b^5 nicht kopiert werden können, da sich die Dimension dieser Ebene geändert hat. Sie müssen sich also neue Parameter W^5, b^5 einfallen lassen, die Sie von Grund auf neu trainieren müssen, anstatt sie einfach aus dem vorherigen neuronalen Netzwerk zu kopieren. Beim Transferlernen können Sie die Parameter der ersten vier Schichten, also wirklich aller Schichten außer der letzten Ausgabeschicht, als Ausgangspunkt für die Parameter verwenden und dann einen Optimierungsalgorithmus wie Gradient Descent oder den Adam-Optimierungsalgorithmus ausführen, wobei die Parameter anhand der Werte aus diesem neuronalen Netzwerk initialisiert werden. Im Detail gibt es zwei Möglichkeiten, wie Sie diese Parameter neuronaler Netzwerke trainieren können. Option 1 ist, dass Sie nur die Parameter der Ausgabelayer trainieren. Sie würden die Parameter W^1, b^1, W^2, b^2 bis W^4, b^4 als Werte von oben nehmen und sie einfach fest halten und sich nicht einmal die Mühe machen, sie zu ändern, und einen Algorithmus wie den stochastischen Gradientenabstieg oder den Adam-Optimierungsalgorithmus verwenden, um nur W^5, b^5 zu aktualisieren, um die übliche Kostenfunktion zu senken, mit der Sie lernen, diese Ziffern aus einem kleinen Training zu erkennen Satz dieser Ziffern Null bis Neun, das ist also Option 1. Option 2 wäre, alle Parameter im Netzwerk einschließlich W^1, b^1, W^2, b^2 bis W^5, b^5 zu trainieren, aber die ersten vier Ebenenparameter würden mit den Werten initialisiert, die Sie oben trainiert haben. Wenn Sie ein sehr kleines Trainingsset haben, funktioniert Option 1 vielleicht etwas besser, aber wenn Sie ein etwas größeres Trainingsset haben, funktioniert Option 2 möglicherweise etwas besser. Dieser Algorithmus wird Transferlernen genannt , weil die Intuition darin besteht, Katzen, Hunde, Kühe, Menschen usw. zu erkennen. Es wird hoffentlich einige plausible Parametersätze für die früheren Ebenen zur Verarbeitung von Bildeingaben gelernt haben. Indem wir diese Parameter dann auf das neue neuronale Netzwerk übertragen, beginnt das neue neuronale Netzwerk mit den Parametern an einer viel besseren Stelle , sodass wir nur ein bisschen weiterlernen müssen. Hoffentlich kann es zu einem ziemlich guten Modell werden. Diese beiden Schritte, bei denen zuerst an einem großen Datensatz trainiert und dann die Parameter an einem kleineren Datensatz weiter optimiert werden, werden als überwachtes Vortraining für diesen Schritt zusätzlich bezeichnet. In diesem Fall trainiert man das neuronale Netzwerk anhand eines sehr großen Datensatzes von beispielsweise einer Million Bildern, die nicht ganz der zugehörigen Aufgabe entsprechen. Dann wird der zweite Schritt als Feinabstimmung bezeichnet, bei dem Sie die Parameter verwenden, die Sie initialisiert oder aus dem beaufsichtigten Vortraining erhalten haben, und dann den Gradientenabstieg weiter ausführen, um die Gewichtungen an die spezifische Anwendung der handschriftlichen Ziffernerkennung anzupassen, die Sie möglicherweise haben. Wenn Sie einen kleinen Datensatz haben, sogar Dutzende oder Hunderte oder Tausende oder nur Zehntausende von Bildern der handgeschriebenen Ziffern, kann es die Leistung Ihres Lernalgorithmus erheblich verbessern, wenn Sie aus diesen Millionen Bildern einer nicht ganz verwandten Aufgabe lernen können. Eine nette Sache am Transfer Learning ist auch, dass Sie vielleicht nicht derjenige sein müssen, der beaufsichtigte Vorschulungen durchführt. Für viele neuronale Netze wird es bereits Forscher geben, die bereits ein neuronales Netzwerk auf einem großen Bild trainiert und ein trainiertes neuronales Netzwerk im Internet veröffentlicht haben, das für jedermann kostenlos zum Herunterladen und Verwenden lizenziert ist. Das heißt, anstatt den ersten Schritt selbst durchzuführen, können Sie einfach das neuronale Netzwerk herunterladen, das jemand anderes möglicherweise wochenlang trainiert hat, und dann die Ausgabeschicht durch Ihre eigene Ausgabeschicht ersetzen und entweder Option 1 oder Option 2 durchführen, um ein neuronales Netzwerk zu optimieren , an dem bereits eine andere Person beaufsichtigtes Vortraining durchgeführt hat, und nur ein wenig Feinabstimmung vornehmen, um schnell ein neuronales Netzwerk zu erhalten , das Ihre Aufgabe gut erfüllt. Das Herunterladen eines vorab trainierten Modells, das jemand anderes trainiert und kostenlos zur Verfügung gestellt hat, ist eine dieser Techniken, bei denen wir alle viel bessere Ergebnisse erzielen können, wenn wir auf der Arbeit der anderen Community für maschinelles Lernen aufbauen. Durch die Großzügigkeit anderer Forscher, die ihre neuronalen Netzwerke vorab trainiert und online gestellt haben. Aber warum funktioniert Transferlernen überhaupt? Wie können Sie anhand von Parametern, die Sie durch die Erkennung von Katzen, Hunden, Autos und Menschen erhalten haben, etwas so Anderes wie handgeschriebene Ziffern erkennen? Hier steckt eine gewisse Intuition dahinter. Wenn Sie ein neuronales Netzwerk trainieren, um beispielsweise verschiedene Objekte aus Bildern zu erkennen, lernt die erste Schicht eines neuronalen Netzwerks möglicherweise, Kanten im Bild zu erkennen. Wir betrachten diese als etwas untergeordnete Merkmale im Bild, die Kanten erkennen sollen. Jedes dieser Quadrate ist eine Visualisierung dessen, was ein einzelnes Neuron gelernt hat zu erkennen, indem es lernt, Pixel zu gruppieren, um Kanten in einem Bild zu finden. Die nächste Schicht des neuronalen Netzwerks lernt dann, Kanten zu gruppieren, um Ecken zu erkennen. Jedes dieser Elemente ist eine Visualisierung dessen, was ein Neuron möglicherweise gelernt hat zu erkennen gelernt hat und lernen muss, technische, einfache Formen wie diese zu erkennen. Die nächste Schicht des neuronalen Netzwerks hat möglicherweise gelernt, einige zu erkennen, die komplexer sind. Sie speichern generische Formen wie Basiskurven oder kleinere Formen wie diese. Deshalb bringen Sie dem neuronalen Netzwerk bei, Kanten, Ecken und Grundformen zu erkennen, indem Sie lernen, viele verschiedene Bilder zu erkennen. Indem Sie einem neuronalen Netzwerk beibringen, so unterschiedliche Dinge wie Katzen, Hunde, Autos und Menschen zu erkennen, helfen Sie ihm, diese ziemlich generischen Merkmale von Bildern zu erkennen und Kanten, Ecken, Kurven und Grundformen zu finden. Dies ist für viele andere Computer-Vision-Aufgaben nützlich, z. B. für die Erkennung handgeschriebener Ziffern. Eine Einschränkung des Vortrainings besteht jedoch darin, dass der Bildtyp x für die Schritte vor dem Training und der Feinabstimmung derselbe sein muss. Wenn die letzte Aufgabe, die Sie lösen möchten, eine Computer-Vision-Aufgabe ist, dann war der Vortrainingsschritt ebenfalls ein neuronales Netzwerk, das mit derselben Art von Eingabe trainiert wurde, nämlich einem Bild mit den gewünschten Abmessungen. Umgekehrt, wenn Ihr Ziel darin besteht, ein Spracherkennungssystem für die Verarbeitung von Audio zu entwickeln, dann wird ein neuronales Netzwerk, das mit Bildern vortrainiert wurde, bei Audio wahrscheinlich nicht viel nützen. Stattdessen möchten Sie ein neuronales Netzwerk , das mit Audiodaten vorab trainiert wurde. Dort können Sie dann Ihren eigenen Audiodatensatz optimieren und das Gleiche für andere Arten von Anwendungen tun. Sie können ein neuronales Netzwerk vorab anhand von Textdaten trainieren. Wenn Ihre Anwendung über eine Funktion zum Speichern von Textdaten verfügt, können Sie dieses neuronale Netzwerk anhand Ihrer eigenen Daten feinabstimmen. Zusammenfassend sind dies die beiden Schritte für das Transferlernen. Schritt 1 ist das Herunterladen eines neuronalen Netzwerks mit Parametern , die auf einem großen Datensatz mit demselben Eingabetyp wie Ihre Anwendung vorab trainiert wurden. Dieser Eingabetyp kann Bilder, Audio, Texte oder etwas anderes sein, oder wenn Sie das neuronale Netzwerk nicht herunterladen möchten, können Sie vielleicht Ihr eigenes trainieren. In der Praxis ist es jedoch viel üblicher, wenn Sie beispielsweise Bilder verwenden, das vortrainierte neuronale Netzwerk einer anderen Person herunterzuladen. Trainieren Sie das Netzwerk dann weiter oder optimieren Sie es anhand Ihrer eigenen Daten. Ich habe festgestellt, dass, wenn Sie ein neuronales Netzwerk mit großen Datensätzen, sagen wir einer Million Bildern, vorab trainieren können, dann können Sie manchmal einen viel kleineren Datensatz verwenden, vielleicht tausend Bilder, vielleicht sogar kleinere, um das neuronale Netzwerk auf Ihre eigenen Daten abzustimmen und ziemlich gute Ergebnisse zu erzielen. Manchmal trainierte ich neuronale Netze mit nur 50 Bildern , die mit dieser Technik recht gut waren, obwohl sie bereits mit einem viel größeren Datensatz vortrainiert wurden. Diese Technik ist kein Allheilmittel. , Sie können nicht jede Anwendung dazu bringen, nur mit 50 Bildern zu arbeiten, aber es hilft sehr, wenn der Datensatz, den Sie für Ihre Anwendung haben, nicht so groß ist. Übrigens, wenn Sie in den Nachrichten von fortgeschrittenen Techniken wie GPT-3 oder BERTs oder neuronalen Netzwerken gehört haben, die auf ImageNet vortrainiert wurden, sind dies tatsächlich Beispiele für neuronale Netzwerke, die von jemand anderem an sehr großen Bild – oder Textdatensätzen vortrainiert wurden. Sie können dann für andere Anwendungen optimiert werden. Wenn Sie noch nichts von GPT-3, BERTs oder ImageNet gehört haben, machen Sie sich keine Sorgen, ob Sie es getan haben. Dies waren erfolgreiche Anwendungen von Vorschulungen in der Literatur zum maschinellen Lernen. Eines der Dinge, die ich am Transfer Learning mag, ist die Art und Weise, wie die Community für maschinelles Lernen Ideen , Code und sogar Parameter miteinander geteilt hat, und das dank der Forscher, die große neuronale Netze vorab trainiert und die Parameter kostenlos im Internet veröffentlicht haben, damit jeder andere sie herunterladen und verwenden kann. Auf diese Weise kann jeder Modelle, die vorab trainiert wurden, verwenden, um potenziell viel kleinere Datensätze zu optimieren. Beim maschinellen Lernen bauen wir alle oft auf der Arbeit der anderen auf, und der offene Austausch von Ideen, von Codes und trainierten Parametern ist eine der Möglichkeiten, mit denen die Gemeinschaft für maschinelles Lernen, wir alle gemeinsam, viel bessere Arbeit leisten können als jede einzelne Person allein. Ich hoffe, dass Sie der Community für maschinelles Lernen beitreten und vielleicht eines Tages einen Weg finden, auch zu dieser Community beizutragen. Das war’s für das Vortraining. Ich hoffe, Sie finden diese Technik nützlich. Im nächsten Video möchte ich Ihnen einige Gedanken zum gesamten Zyklus eines maschinellen Lernprojekts mitteilen. Ob beim Aufbau eines maschinellen Lernsystems alle Schritte, über die es sich nachzudenken lohnt. Schauen wir uns das im nächsten Video an.
Der gesamte Zyklus eines Projekts zum maschinellen Lernen
Bisher haben wir viel darüber gesprochen, wie man ein Modell trainiert, und auch ein wenig darüber, wie man Daten für Ihre Machine Learning-Anwendung erhält. Aber wenn ich ein maschinelles Lernsystem baue, stelle ich fest, dass das Trainieren eines Modells nur ein Teil des Puzzles ist. In diesem Video möchte ich mit Ihnen teilen, was ich als den gesamten Zyklus eines maschinellen Lernprojekts betrachte. Das heißt, wenn Sie ein wertvolles maschinelles Lernsystem aufbauen, welche Schritte müssen Sie berücksichtigen und einplanen? Schauen wir uns das an, lassen Sie mich die Spracherkennung als Beispiel verwenden, um den gesamten Zyklus eines maschinellen Lernprojekts zu veranschaulichen. Der erste Schritt des Projekts für maschinelles Lernen besteht darin, den Umfang des Projekts zu ermitteln. Mit anderen Worten, entscheiden Sie, was das Projekt ist und woran Sie arbeiten möchten. Ich habe zum Beispiel einmal beschlossen, an der Spracherkennung für die Sprachsuche zu arbeiten. Das heißt, Sie führen die Websuche durch , indem Sie mit Ihrem Mobiltelefon sprechen, anstatt etwas in Ihr Mobiltelefon einzugeben. Dieser Projektumfang. Nachdem Sie entschieden haben, woran Sie arbeiten möchten, müssen Sie Daten sammeln. Entscheiden Sie, welche Daten Sie zum Trainieren Ihres maschinellen Lernsystems benötigen, und machen Sie sich an die Arbeit, um das Audio und die Transkripte der Labels für Ihren Datensatz abzurufen. Das ist Datenerfassung. Nach der ersten Datenerfassung können Sie mit dem Trainieren des Modells beginnen. Hier trainierst du ein Spracherkennungssystem und eine Karavellen-Fehleranalyse und verbesserst dein Modell iterativ. Ist überhaupt nicht ungewöhnlich. Nachdem Sie begonnen haben, das Modell für die Fehleranalyse oder für eine Bias-Varianz-Analyse zu trainieren, um Ihnen mitzuteilen , dass Sie möglicherweise zurückkehren möchten, um weitere Daten zu sammeln. Sammeln Sie vielleicht mehr Daten von allem oder sammeln Sie einfach mehr Daten eines bestimmten Typs, bei denen Ihre Fehleranalyse zeigt, dass Sie die Leistung Ihres Lernalgorithmus verbessern möchten. Zum Beispiel habe ich einmal bei der Arbeit an Sprache festgestellt, dass mein Modell besonders schlecht abschneidet, wenn im Hintergrund Autolärm zu hören war. Das klang, als würde jemand in einem Auto sprechen. Mein Sprachsystem funktioniert schlecht, wenn ich entschieden habe, mehr Daten zu erhalten. Ich verwende tatsächlich Datenerweiterung, um mehr Sprachdaten zu erhalten, die sich anhören, als wäre es ein Auto, um die Leistung meines Lernalgorithmus zu verbessern. Man umgeht diesen Kreislauf ein paar Mal, trainiert das Modell, analysiert Fehler, sammelt wieder mehr Daten, vielleicht macht man das für eine Weile, bis man irgendwann sagt, dass das Modell gut genug ist, um es dann in einer Produktionsumgebung einzusetzen. Das bedeutet, dass Sie es Benutzern zur Nutzung zur Verfügung stellen. Wenn Sie ein System bereitstellen, müssen Sie auch sicherstellen, dass Sie die Leistung des Systems weiterhin überwachen und das System warten, falls sich die Leistung verschlechtert, um die Leistung wieder zu erhöhen, anstatt Ihr Machine Learning-Modell nur auf einem Server zu hosten. Ich werde auf der nächsten Folie etwas mehr darüber sagen, warum Sie diese Systeme für maschinelles Lernen warten müssen. Aber nach dieser Bereitstellung stellen Sie manchmal fest, dass das nicht so gut funktioniert, wie Sie es sich erhofft hatten, und Sie trainieren das Modell erneut, um es zu verbessern, oder gehen sogar zurück und erhalten mehr Daten. Wenn Benutzer und Sie die Erlaubnis haben, Daten aus Ihrer Produktionsbereitstellung zu verwenden, können Ihnen diese Daten aus Ihrem funktionierenden Sprachsystem manchmal sogar Zugriff auf noch mehr Daten geben, mit denen Sie die Leistung Ihres Systems weiter verbessern können. Ich denke, Sie haben ein Gefühl dafür, was der Umfang eines Projekts bedeutet, und wir haben in diesem Kurs viel über das Sammeln von Daten und das Trainieren von Modellen gesprochen. Aber lassen Sie mich Ihnen etwas mehr darüber erzählen, wie der Einsatz in der Produktion aussehen könnte. Nachdem Sie ein leistungsstarkes Modell für maschinelles Lernen trainiert haben, sagen wir ein Spracherkennungsmodell, besteht eine gängige Methode zur Bereitstellung des Modells darin, Ihr maschinelles Lernmodell auf einem Server zu implementieren, den ich als Inferenzserver bezeichnen werde, dessen Aufgabe es ist, Ihr maschinelles Lernmodell, Ihr trainiertes Modell, aufzurufen, um Vorhersagen zu treffen. Wenn Ihr Team dann eine mobile App implementiert hat, beispielsweise eine soziale Anwendung, kann die mobile App, wenn ein Benutzer mit der mobilen App spricht, einen API-Aufruf tätigen, um den aufgezeichneten Audioclip an Ihren Inferenzserver weiterzuleiten, und die Aufgabe des Inferenzservers besteht darin, ihm das Modell für maschinelles Lernen bereitzustellen und ihm dann die Vorhersage Ihres Modells zurückzugeben, in diesem Fall die Texttranskripte dessen, was gesagt wurde. Dies wäre eine gängige Methode zur Implementierung einer Anwendung, die über die API und den Inferenzserver aufruft, sodass Ihr Modell wiederholt Vorhersagen auf der Grundlage der Eingabe x trifft. Dies waren gängige Muster, bei denen Depend von der Anwendung implementiert ist. Sie haben einen API-Aufruf, um Ihrem Lernalgorithmus D input, x und Ihr Machine Learning-Modell innerhalb der Ausgabe zur Vorhersage zu geben, sagen wir mal. Um dies zu implementieren, ist möglicherweise etwas Softwareentwicklung erforderlich, um den gesamten Code zu schreiben, der all diese Dinge tut. Je nachdem, ob Ihre Anwendung nur ein paar Handvoll Benutzer oder Millionen von Benutzern bedienen muss, kann die Anzahl der benötigten Softwareingenieure sehr unterschiedlich sein. Ich habe Software entwickelt, die nur einer Handvoll Benutzern auf meinem Laptop dient, und ich habe auch Software entwickelt, die Hunderte von Millionen von Benutzern bedient, die erhebliche Rechenzentrumsressourcen benötigen. Je nachdem, welche Skalenanwendung benötigt wird, kann Softwareentwicklung erforderlich sein, um sicherzustellen , dass Ihr Inferenzserver in der Lage ist, zuverlässige und effiziente Vorhersagen über die nicht zu hohen Rechenkosten zu treffen. Softwareentwicklung kann erforderlich sein, um die Skalierung für eine große Anzahl von Benutzern zu verwalten. Oft möchten Sie die Daten, die Sie erhalten, sowohl die Eingaben x als auch die Vorhersagen protokollieren, vorausgesetzt, dass der Datenschutz und die Zustimmung der Benutzer es Ihnen ermöglichen, diese Daten zu speichern. Diese Daten sind, sofern Sie darauf zugreifen können, auch für die Systemüberwachung sehr nützlich. Ich habe zum Beispiel einmal ein Spracherkennungssystem auf der Grundlage eines bestimmten Datensatzes aufgebaut, den ich hatte, aber als es neue Prominente gab, die plötzlich bekannt wurden, oder Wahlen dazu führen, dass neue Politiker gewählt werden und die Leute nach diesen neuen Namen suchen, die nicht im Trainingssatz waren, und dann schnitt mein System schlecht ab. Das lag daran, dass wir das System überwachten und so herausfinden konnten, wann sich die Daten änderten und der Algorithmus ungenauer wurde. Dies ermöglichte es uns, das Modell neu zu trainieren und dann ein Modellupdate durchzuführen, um das alte Modell durch ein neues zu ersetzen. Der Bereitstellungsprozess kann ein gewisses Maß an Softwareentwicklung erfordern. Für einige Anwendungen ist möglicherweise nicht so viel Softwareentwicklung erforderlich, wenn Sie sie nur auf einem Laptop oder auf einem oder zwei Servern ausführen. Je nachdem, in welchem Team Sie arbeiten, ist es möglich, dass Sie das Modell für maschinelles Lernen entwickelt haben, aber es könnte ein anderes Team für die Bereitstellung verantwortlich sein. Aber es gibt ein wachsendes Feld des maschinellen Lernens namens MLOps. Dies steht für Machine Learning Operations. Dies bezieht sich auf die Praxis, wie Systeme für maschinelles Lernen systematisch aufgebaut, bereitgestellt und gewartet werden. Um all diese Dinge zu tun, um sicherzustellen, dass Ihr Modell für maschinelles Lernen zuverlässig ist, gut skaliert , über gute Gesetze verfügt, überwacht wird und Sie dann die Möglichkeit haben, das Modell gegebenenfalls zu aktualisieren, damit es weiterhin gut läuft. Wenn Sie Ihr System beispielsweise für Millionen von Benutzern bereitstellen, sollten Sie sicherstellen, dass Sie über hochoptimierte Implementierungen verfügen , damit die Rechenkosten für die Bedienung von Millionen von Menschen nicht zu hoch sind. In diesem und den letzten Parsern habe ich viel Zeit damit verbracht, darüber zu sprechen, wie man ein Modell für maschinelles Lernen trainiert, und das ist absolut entscheidend, um sicherzustellen, dass Sie ein Hochleistungssystem haben. Wenn Sie jemals ein System für Millionen von Menschen bereitstellen müssen, sind dies einige zusätzliche Schritte , die Sie wahrscheinlich in Angriff nehmen müssen. Denken Sie an dieser Stelle auch an das [Unhörbare]. Bevor ich zum Thema des Entwicklungsprozesses für maschinelles Lernen übergehe, möchte ich Ihnen noch eine Reihe von Ideen mitteilen, die sich auf die Ethik beim Aufbau von Systemen für maschinelles Lernen beziehen. Dies ist ein entscheidendes Thema für viele Anwendungen. Schauen wir uns das im nächsten Video an.
Fairness, Voreingenommenheit und Ethik
Alben für maschinelles Lernen betreffen heute Milliarden von Menschen. Du hast gehört, dass ich Ethik schon in anderen Videos erwähnt habe. Und ich hoffe, dass Sie, wenn Sie ein System für maschinelles Lernen entwickeln , das Menschen betrifft, darüber nachdenken, sicherzustellen, dass Ihr System einigermaßen fair und einigermaßen frei von Vorurteilen ist. Und dass Sie bei Ihrer Bewerbung einen ethischen Ansatz verfolgen. Werfen wir einen Blick auf einige Themen im Zusammenhang mit Fairness, Voreingenommenheit und Ethik. Leider gab es in der Geschichte des maschinellen Lernens einige Systeme, von denen einige weithin bekannt waren, und die ein völlig inakzeptables Maß an Voreingenommenheit aufwiesen. Zum Beispiel gab es eine Einstellung von zwei Personen, von denen sich einmal herausgestellt hat, dass sie Frauen diskriminieren. Das Unternehmen, das das System gebaut hat, hat aufgehört, es zu verwenden, aber man wünscht sich, dass das System gar nicht erst eingeführt worden wäre. Oder es gab auch gut dokumentierte Beispiele für Gesichtserkennungssysteme, die dunkelhäutige Personen viel häufiger kriminellen Fahndungsfotos zuordnen als hellhäutige Personen. Und das ist eindeutig nicht akzeptabel und das sollten wir tun. Ja, das ist der Punkt, an dem die Community einfach keine Systeme mit einem solchen Problem entwickelt und einsetzt. Erstens gibt es Systeme, die Bankkredite in einer Weise bewilligt haben, die Untergruppen voreingenommen und diskriminiert. Und wir mögen es auch sehr, Algorithmen zu lernen, um nicht den toxischen Effekt zu haben, negative Stereotypen zu verstärken. Ich habe zum Beispiel eine Tochter und wenn sie online nach bestimmten Berufen sucht und niemanden sieht, der wie sie aussieht, würde ich es hassen, wenn das sie davon abhält, bestimmte Berufe anzunehmen. Neben den Problemen der Voreingenommenheit und der fairen Behandlung von Einzelpersonen gab es auch negative Anwendungsfälle oder negative Anwendungsfälle von Algorithmen für maschinelles Lernen. Zum Beispiel gab es diese viel zitierte und viel angesehene Videoveröffentlichung mit vollständiger Offenlegung und voller Transparenz. Von der Firma Buzzfeed eines Deepfakes des ehemaligen US-Präsidenten Barack Obama und ihr könnt das ganze Video tatsächlich online finden und anschauen, wenn ihr wollt. Das Unternehmen, das dieses Video erstellt hat, hat dies jedoch mit voller Transparenz und vollständiger Offenlegung getan. Es wäre jedoch eindeutig unethisch, diese Technologie zur Generierung gefälschter Videos ohne Zustimmung und ohne Offenlegung zu verwenden. Leider haben wir auch gesehen, dass soziale Medien manchmal giftige oder aufhetzende Äußerungen verbreiten, weil die Optimierung der Nutzerinteraktion dazu geführt hat, dass Algorithmen dies tun. Es gab Boote, mit denen gefälschte Inhalte entweder für kommerzielle Zwecke wie das Posten gefälschter Kommentare zu Produkten oder für politische Zwecke generiert wurden. Und es gibt Anwender, die maschinelles Lernen nutzen, um schädliche Produkte zu entwickeln, Betrug zu begehen und so weiter. Und in Teilen der Welt des maschinellen Lernens gab es, genau wie bei E-Mails, einen Kampf zwischen den Spammern und der Anti-Spam-Community. Ich sehe heute zum Beispiel in der Finanzbranche einen Kampf zwischen Menschen, die versuchen, Betrug zu begehen, und Menschen, die Betrug bekämpfen. Und leider wird maschinelles Lernen von einigen Betrügern und einigen Standards verwendet. Um Himmels Willen, bauen Sie bitte kein maschinelles Lernsystem , das sich negativ auf die Gesellschaft auswirkt. Und wenn Sie gebeten werden, an einer Bewerbung zu arbeiten, die Sie für unethisch halten, fordere ich Sie dringend auf, für das, was sie wert ist, wegzugehen. Ich habe mir das Projekt mehrfach angesehen, das finanziell solide zu sein schien. Du wirst Geld für irgendeine Firma verdienen. Aber ich habe das Projekt nur aus ethischen Gründen eingestellt, weil ich denke, dass die finanziellen Argumente zwar stimmen, ich aber das Gefühl hatte, dass es der Welt schlechter geht, und ich möchte einfach niemals an einem solchen Projekt beteiligt sein. Ethik ist ein sehr kompliziertes und sehr reichhaltiges Thema, das die Menschheit seit mindestens ein paar 1000 Jahren studiert. Als KI weiter verbreitet wurde, habe ich tatsächlich mehrere Bücher über Philosophie und mehrere Bücher über Ethik gelesen, weil ich hoffte, dass wir naiv gehofft hatten, dass wir uns eine Checkliste mit fünf Dingen ausdenken könnten, die wir tun könnten, und wenn wir diese fünf Dinge tun, können wir ethisch handeln, aber ich habe versagt Und ich glaube nicht, dass es jemals jemandem gelungen ist, eine einfache Checkliste mit Dingen zu erstellen, die zu tun sind, um ein solches Maß an konkreter Anleitung zu geben sei ethisch. Ich hoffe, dass ich stattdessen keine Checkliste mit Ihnen teilen kann, denn ich hatte nicht einmal eine mit einigen allgemeinen Anleitungen und einigen Vorschlägen, wie die Arbeit weniger voreingenommen, fairer und ethischer gestaltet werden kann. Und ich hoffe, dass einige dieser Anleitungen, von denen einige relativ allgemein gehalten sind, Ihnen auch bei Ihrer Arbeit helfen werden. Hier sind einige Vorschläge, wie Sie Ihre Arbeit fairer, weniger voreingenommen und ethischer gestalten können, bevor Sie ein System einsetzen, das Schaden anrichten könnte. Normalerweise versuche ich, ein vielfältiges Team zusammenzustellen, um mögliche Dinge zu besprechen, die schief gehen könnten, wobei der Schwerpunkt auf möglichen Schäden liegt. Zwei gefährdete Gruppen, die ich in meinem Leben oft erlebt habe, haben ein vielfältigeres Team und mit vielfältig meine ich Vielfalt in mehreren Dimensionen, die von Geschlecht über ethnische Zugehörigkeit bis hin zu Kultur und vielen anderen Merkmalen reichen. Ich habe festgestellt, dass ein Team mit mehr Diversität insgesamt besser darin ist, Ideen für Dinge zu entwickeln, die schief gehen könnten, und dass dadurch die Wahrscheinlichkeit steigt, das Problem zu erkennen und zu beheben, bevor das System eingeführt wird und dass dadurch einer bestimmten Gruppe Schaden zugefügt wird. Zusätzlich zu einer Vielfalt und durchgeführten Brainstorming. Ich fand es auch nützlich, eine Literaturrecherche zu allen Standards oder Richtlinien für Ihre Branche oder einen bestimmten Anwendungsbereich durchzuführen. In der Finanzbranche gibt es beispielsweise allmählich etablierte Standards dafür, was es bedeutet, ein System zu sein. Sie wollen also, dass das entscheidet, wer diese beiden genehmigt, was es bedeutet, dass ein System wie dieses einigermaßen fair und frei von Vorurteilen ist und dass die Standards, die sich in verschiedenen Sektoren immer noch herausbilden, Ihre Arbeit beeinflussen könnten, je nachdem, woran Sie gerade arbeiten. Nach der Identifizierung möglicher Probleme. Ich fand es nützlich, das System dann anhand dieser identifizierten Abmessungen eines möglichen Zuhauses zu überprüfen. Vor der Bereitstellung haben Sie im letzten Video den gesamten Projektzyklus des maschinellen Lernens gesehen. Und ein wichtiger Schritt, der oft eine entscheidende Verteidigungslinie gegen den Einsatz von Problemen darstellt, ist das Trainieren des Modells. Wenn das Team jedoch vor dem Einsatz in der Produktion ein Brainstorming durchgeführt hat, kann es sein, dass es bestimmten Untergruppen wie bestimmten Geschlechtern oder bestimmten Ethnien voreingenommen gegenübersteht. Anschließend können Sie das System anweisen, die Leistung zu messen, um festzustellen, ob es sich tatsächlich um eine Voreingenommenheit gegenüber bestimmten Geschlechtern, Ethnien oder anderen Untergruppen handelt, und um sicherzustellen, dass alle Probleme identifiziert und behoben werden. Vor dem Einsatz. Schließlich fand ich es nützlich, gegebenenfalls einen Plan zur Schadensbegrenzung zu entwickeln. Und ein einfacher Plan zur Schadensbegrenzung wäre die Rückkehr zu dem früheren System, von dem wir wussten, dass es einigermaßen fair war. Und auch nach dem Einsatz, um den Schaden weiterhin zu überwachen , sodass Sie dann einen Plan zur Schadensbegrenzung auslösen und schnell handeln können, falls ein Problem auftritt, das behoben werden muss. Zum Beispiel hatten alle Teams für selbstfahrende Autos, bevor sie selbstfahrende Autos auf die Straße brachten, Pläne zur Schadensbegrenzung entwickelt, was zu tun ist, falls das Auto jemals in einen Unfall verwickelt wird. So gab es bereits einen Plan zur Schadensbegrenzung, den sie sofort ausführen konnten, anstatt ein Auto in einen Unfall verwickeln zu lassen und dann erst im Nachhinein herauszufinden, was zu tun ist. Ich habe an vielen maschinellen Lernsystemen gearbeitet und möchte Ihnen die Themen Ethik, Fairness und Voreingenommenheit erläutern, die wir ernst nehmen sollten. Es ist nichts zum Abbürsten. Es ist nicht wahrscheinlich. Natürlich gibt es einige Projekte mit schwerwiegenderen ethischen Implikationen als andere. Wenn ich zum Beispiel ein neuronales Netzwerk aufbaue, um zu entscheiden , wie lange meine Kaffeebohnen geröstet werden sollen, sind die ethischen Auswirkungen deutlich geringer, als wenn Sie beispielsweise ein System aufbauen, das entscheidet, welche Kredite vergeben werden. Bankdarlehen werden genehmigt, was, wenn es sich um Käufer handelt, erheblichen Schaden anrichten kann. Aber ich hoffe, dass wir alle, die gemeinsam am maschinellen Lernen arbeiten, diese Themen immer besser diskutieren können. Erkennen Sie Probleme, beheben Sie sie, bevor sie Schaden anrichten, sodass wir gemeinsam einige der Fehler vermeiden können, die die Welt des maschinellen Lernens zuvor gemacht hat, weil diese Dinge wichtig sind und die von uns entwickelten Systeme viele Menschen betreffen können. Und das war’s mit dem Prozess der Entwicklung eines maschinellen Lernsystems und herzlichen Glückwunsch, dass Sie das Ende der erforderlichen Videos dieser Woche erreicht haben. Ich habe diese Woche nur zwei weitere optionale Videos für Sie, die sich mit verzerrten Datensätzen befassen, und das bedeutet, dass Steve sagt, wo das Verhältnis von positiven zu negativen Beispielen sehr weit von 50, 50 entfernt ist. Und es stellt sich heraus, dass einige spezielle Techniken erforderlich sind, um solche Anwendungen des maschinellen Lernens zu adressieren. Ich hoffe, Sie im nächsten Video zu sehen (optionales Video zum Umgang mit verzerrten Datensätzen).
Fehlermetriken für schiefe Datensätze
Wenn Sie an einer Anwendung für maschinelles Lernen arbeiten, bei der das Verhältnis von positiven zu negativen Beispielen sehr schief ist, sehr weit von 50-50, dann stellt sich heraus, dass die üblichen Fehlermetriken wie Genauigkeit nicht so gut funktionieren. Fangen wir mit einem Beispiel an. Nehmen wir an, Sie trainieren einen binären Klassifikator, um eine seltene Krankheit bei Patienten anhand von Labortests oder anderen Patientendaten zu erkennen. Y ist gleich 1, wenn die Krankheit vorliegt, und y ist andernfalls gleich 0. Angenommen, Sie stellen fest, dass Sie beim Testset einen Fehler von einem Prozent erzielt haben, sodass Sie eine zu 99 Prozent korrekte Diagnose haben. Das scheint ein großartiges Ergebnis zu sein. Es stellt sich jedoch heraus, dass, wenn es sich um eine seltene Krankheit handelt, also y sehr selten gleich 1 ist, dies möglicherweise nicht so beeindruckend ist, wie es sich anhört. Insbesondere, wenn es sich um eine seltene Krankheit handelt und nur 0,5 Prozent der Patienten in Ihrer Population an der Krankheit leiden, wenn Sie stattdessen das Programm geschrieben haben, das gerade heißt, geben Sie y gleich 0 aus. Es sagt voraus, dass y die ganze Zeit gleich 0 ist. Dieser sehr einfache Algorithmus, auch wenn er nicht lernt, weil er immer nur sagt, dass y gleich 0 ist, hat er tatsächlich eine Genauigkeit von 99,5 Prozent oder einen Fehler von 0,5 Prozent. Dieser wirklich dumme Algorithmus übertrifft Ihren Lernalgorithmus , der einen Fehler von einem Prozent hatte, viel schlimmer als 0,5 Prozent Fehler. Aber ich denke, eine Software, die einfach y gleich 0 ausgibt, ist kein sehr nützliches Diagnosetool. Was das wirklich bedeutet, ist, dass Sie nicht sagen können , ob ein Fehler von einem Prozent tatsächlich ein gutes oder ein schlechtes Ergebnis ist. Insbesondere, wenn Sie einen Algorithmus haben, der eine Genauigkeit von 99,5 Prozent erreicht, einen anderen, der eine Genauigkeit von 99,2 Prozent erreicht, und einen anderen, der eine Genauigkeit von 99,6 Prozent erreicht. Es ist schwierig zu wissen, welcher von diesen Algorithmen tatsächlich der beste ist. Denn wenn Sie einen Algorithmus haben , der einen Fehler von 0,5 Prozent erreicht, und einen anderen, der einen Fehler von einem Prozent erreicht, und einen anderen, der einen Fehler von 1,2 Prozent erreicht, ist es schwierig zu wissen, welcher dieser Algorithmen der beste ist. Weil die mit dem geringsten Fehler vielleicht nicht besonders nützlich ist, ist eine Vorhersage wie diese, die immer y gleich 0 vorhersagt und niemals einen Patienten mit dieser Krankheit diagnostiziert. Möglicherweise könnte ein Algorithmus mit einem Fehler von einem Prozent nützlicher sein, bei dem aber zumindest bei einigen Patienten diagnostiziert wird, dass sie an der Krankheit leiden, als ständig y gleich 0 zu drucken. Wenn wir an Problemen mit schiefen Datensätzen arbeiten, verwenden wir normalerweise eine andere Fehlermetrik und nicht nur einen Klassifikationsfehler, um herauszufinden, wie gut Ihr Lernalgorithmus abschneidet. Ein gängiges Paar von Fehlermetriken sind Präzision und Erinnerung, die wir auf der Folie definieren werden. In diesem Beispiel entspricht y eins. Dies ist die seltene Klasse, z. B. die seltene Krankheit, die wir möglicherweise erkennen möchten. Insbesondere, um die Leistung eines Lernalgorithmus mit einer seltenen Klasse von Nützlichem zu bewerten, um eine sogenannte Konfusionsmatrix zu erstellen, bei der es sich um eine Zwei-mal-Zwei-Matrix oder eine Zwei-mal-Zwei-Tabelle handelt, die wie folgt aussieht. Auf der obersten Achse schreibe ich die eigentliche Klasse, die eins oder null sein kann. Auf der vertikalen Achse schreibe ich die vorhergesagte Klasse. Welche hat Ihr Lernalgorithmus für ein gegebenes Beispiel vorhergesagt, eins oder null? Um die Leistung Ihres Algorithmus beispielsweise im Kreuzvalidierungssatz oder im Testset zu bewerten, werden wir dann wie viele Beispiele zählen? War die tatsächliche Klasse 1 und die vorhergesagte Klasse 1? Vielleicht haben Sie 100 Beispiele für Kreuzvalidierungen und bei 15 von ihnen hatte der Lernalgorithmus eines vorhergesagt und das tatsächliche Etikett war ebenfalls eins. Hier würden Sie die Anzahl der Beispiele in C oder Kreuzvalidierungssatz hochzählen, bei denen die tatsächliche Klasse Null war und Ihr Algorithmus eine vorhergesagt hat. Vielleicht haben Sie dort fünf Beispiele und hier vorhergesagte Klasse 0, tatsächliche Klasse 1. Sie haben 10 Beispiele und sagen wir 70 Beispiele mit vorhergesagter Klasse 0 und tatsächlicher Klasse 0. In diesem Beispiel ist die Schräglage nicht so extrem wie auf der vorherigen Folie. Denn in diesen 100 Beispielen in Ihrem Kreuzvalidierungssatz haben wir insgesamt 25 Beispiele, bei denen die tatsächliche Klasse eins war, und 75, bei denen die tatsächliche Klasse Null war, indem wir diese Zahlen vertikal addieren. Sie werden auch feststellen, dass ich verschiedene Farben verwende, um diese vier Zellen in der Tabelle anzuzeigen. Ich werde diesen vier Zellen tatsächlich Namen geben. Wenn die tatsächliche Klasse eins und die vorhergesagte Klasse eins ist, werden wir das als wirklich positiv bezeichnen, weil Sie positiv vorhergesagt haben und es wahr war, es gibt ein positives Beispiel. In dieser Zelle unten rechts, in der die tatsächliche Klasse Null und die vorhergesagte Klasse Null ist, nennen wir das ein echtes Negativ, weil Sie negativ vorhergesagt haben und es wahr war. Es war wirklich ein negatives Beispiel. Diese Zelle oben rechts wird als falsch positiv bezeichnet, da der Algorithmus ein positives Ergebnis vorhergesagt hat, es aber falsch war. Es ist nicht wirklich positiv, daher wird es als falsch positiv bezeichnet. Diese Zelle wird die Anzahl der falsch negativen Ergebnisse genannt, weil der Algorithmus Null vorhergesagt hat, sie aber falsch war. Es war nicht wirklich negativ. Die eigentliche Klasse war eine. Nachdem Sie die Klassifizierungen in diese vier Zellen aufgeteilt haben, können Sie zwei gängige Metriken berechnen: Genauigkeit und Erinnerungsfähigkeit. Hier ist, was sie bedeuten. Die Präzision des Lernalgorithmus berechnet von allen Patienten, bei denen wir vorhergesagt haben, dass y gleich 1 ist, welcher Anteil tatsächlich an der seltenen Krankheit leidet. Mit anderen Worten, Präzision ist definiert als die Anzahl der echten positiven Ergebnisse geteilt durch die als positiv klassifizierte Zahl. Mit anderen Worten, welchen Bruchteil aller Beispiele, die Sie als positiv vorhergesagt haben, haben wir tatsächlich richtig verstanden? Eine andere Möglichkeit, diese Formel zu schreiben, besteht darin, echte positive Ergebnisse durch wahrhaft positive plus falsch positive Ergebnisse zu teilen, da Sie durch die Summierung dieser Zelle und dieser Zelle am Ende die Gesamtzahl erhalten , die als positiv vorhergesagt wurde. In diesem Beispiel wäre der Zähler, also echte positive Werte, 15 und geteilt durch 15 plus 5, das ergibt also 15 über 20 oder drei Viertel, 0,75. Wir sagen also, dass dieser Algorithmus eine Genauigkeit von 75 Prozent hat, weil er all die Dinge, die er als positiv vorhergesagt hat, von allen Patienten, von denen er annahm, dass sie an dieser seltenen Krankheit leiden, in 75 Prozent der Fälle richtig lag. Die zweite Metrik, deren Berechnung nützlich ist, ist der Rückruf. Und Recall fragt: Welcher Anteil aller Patienten, die tatsächlich an der seltenen Krankheit leiden, haben wir korrekt festgestellt? Der Rückruf ist definiert als die Anzahl der echten positiven Ergebnisse geteilt durch die Anzahl der tatsächlich positiven Ergebnisse. Alternativ können wir das als Anzahl der echten positiven Ergebnisse geteilt durch die Anzahl der tatsächlich positiven Ergebnisse schreiben. Nun, es ist diese Zelle plus diese Zelle. Es ist also die Anzahl der echten positiven Ergebnisse plus die Anzahl der falsch negativen Ergebnisse, denn wenn Sie diese obere linke Zelle und diese untere linke Zelle zusammenfassen, erhalten Sie die Anzahl der tatsächlichen positiven Beispiele. In unserem Beispiel wäre dies 15 geteilt durch 15 plus 10, was 15 über 25 entspricht, was 0,6 oder 60 Prozent entspricht. Dieser Lernalgorithmus hätte eine Genauigkeit von 0,75 und einen Erinnerungswert von 0,60. Sie stellen fest, dass Sie auf diese Weise erkennen können, ob der Lernalgorithmus immer nur y gleich 0 ausgibt. Denn wenn es die ganze Zeit Null vorhersagt, wäre der Zähler dieser beiden Größen Null. Es hat keine wirklich positiven Aspekte. Insbesondere die Recall-Metrik hilft Ihnen zu erkennen, ob der Lernalgorithmus ständig Null vorhersagt. Denn wenn Ihr Lernalgorithmus nur ausgibt, dass y gleich 0 ist, dann ist die Anzahl der echten positiven Ergebnisse Null, da er niemals positiv vorhersagt, und so ist der Rückruf gleich Null geteilt durch die Anzahl der tatsächlich positiven Ergebnisse, was gleich Null ist. Im Allgemeinen ist ein Lernalgorithmus mit einer Genauigkeit von Null oder einem Abruf kein nützlicher Algorithmus. Aber nur als Randnotiz: Wenn ein Algorithmus tatsächlich ständig Null vorhersagt, wird die Präzision tatsächlich undefiniert, weil sie tatsächlich Null über Null liegt. Null. Aber in der Praxis sagen wir einfach, dass die Genauigkeit auch gleich Null ist, wenn ein Algorithmus nicht einmal ein einziges Positiv vorhersagt. Wir werden jedoch feststellen, dass die Berechnung von Präzision und Erinnerungsfähigkeit es einfacher macht, zu erkennen , ob ein Algorithmus beide einigermaßen genau ist , da, wenn er sagt, dass ein Patient an einer Krankheit leidet, eine gute Wahrscheinlichkeit besteht, wie in diesem Beispiel 0,75, und dass auch sichergestellt wird, dass von allen Patienten, die an dieser Krankheit leiden, es hilft, einen angemessenen Teil von ihnen zu diagnostizieren, wie hier 60 Prozent von ihnen. Wenn du einen seltenen Kurs hast, bei dem du auf Präzision und Erinnerungsvermögen achtest und sicherstellst, dass beide Zahlen anständig hoch sind, hilft dir das hoffentlich dabei, dir zu versichern, dass dein Lernalgorithmus tatsächlich nützlich ist. Der Begriff Rückruf wurde durch die Beobachtung motiviert, dass, wenn Sie eine Gruppe von Patienten oder eine Patientenpopulation haben, sich daran erinnern, wie viele Patienten Sie genau diagnostiziert hätten, dass sie an der Krankheit erkrankt sind. Wenn Sie also verzerrte Klassen oder eine seltene Klasse haben, die Sie erkennen möchten, können Sie anhand von Präzision und Erinnerung feststellen, ob Ihr Lernalgorithmus gute oder nützliche Vorhersagen trifft. Nachdem wir nun diese Metriken haben, anhand derer Sie feststellen können, wie gut Ihr Lernalgorithmus abschneidet , schauen wir uns im nächsten Video an, wie Sie zwischen Präzision und Erinnerung abwägen können, um die Leistung Ihres Lernalgorithmus zu optimieren.
Abwägen von Präzision und Wiedererkennung
Im Idealfall bevorzugen wir Lernalgorithmen, die eine hohe Präzision und ein hohes Erinnerungsvermögen aufweisen. Hohe Präzision würde bedeuten, dass, wenn eine Diagnose bei Patienten mit dieser seltenen Krankheit gestellt wird, wahrscheinlich auch der Patient daran leidet und es sich um eine genaue Diagnose handelt. Hohe Erinnerungsrate bedeutet, dass der Algorithmus bei einem Patienten mit dieser seltenen Krankheit wahrscheinlich korrekt erkennt, dass er an dieser Krankheit leidet. Es stellt sich jedoch heraus, dass in der Praxis oft ein Kompromiss zwischen Präzision und Erinnerung besteht. In diesem Video werfen wir einen Blick auf diesen Kompromiss und darauf, wie Sie einen guten Punkt innerhalb dieses Kompromisses auswählen können. Hier sind die Definitionen aus dem letzten Video zu Präzision und Erinnerung, ich schreibe sie einfach hier. Nun, Sie erinnern sich, dass Präzision die Anzahl der echten positiven Ergebnisse geteilt durch die Gesamtzahl ist, die als positiv vorhergesagt wurde, und Erinnerung ist die Anzahl der wahrhaft positiven Ergebnisse geteilt durch die tatsächliche Gesamtzahl der positiven Ergebnisse. Wenn Sie die logistische Regression verwenden, um Vorhersagen zu treffen, gibt das logistische Regressionsmodell Zahlen zwischen 0 und 1 aus. Normalerweise würden wir die Ausgabe der logistischen Regression auf 0,5 beschränken und 1 vorhersagen, wenn f von x größer als gleich 0,5 ist, und 0 vorhersagen, wenn es kleiner als 0,5 ist. Aber nehmen wir an, wir wollen vorhersagen, dass y gleich 1 ist. Das heißt, die seltene Krankheit liegt nur vor, wenn wir sehr zuversichtlich sind. Unsere Philosophie lautet: Wann immer wir vorhersagen, dass der Patient an einer Krankheit leidet, müssen wir ihn möglicherweise zu einer möglicherweise invasiven und teuren Behandlung schicken. Wenn die Folgen der Krankheit nicht so schlimm sind, auch wenn sie nicht aggressiv behandelt wird, sollten wir vielleicht nur dann vorhersagen, dass y gleich 1 ist, wenn wir sehr zuversichtlich sind. In diesem Fall können wir uns dafür entscheiden, einen höheren Schwellenwert festzulegen, bei dem wir nur dann vorhersagen, dass y gleich 1 ist, wenn f von x größer oder gleich 0,7 ist. Das heißt also, dass wir sagen, dass y gleich 1 ist, nur wenn wir uns zu mindestens 70 Prozent sicher sind, und nicht nur zu 50 Prozent sicher, sodass diese Zahl ebenfalls 0,7 wird. Beachten Sie, dass diese beiden Zahlen identisch sein müssen, da Sie 1 oder 0 nur davon abhängen, ob sie größer oder gleich oder kleiner als diese Zahl ist. Wenn Sie diesen Schwellenwert erhöhen, sagen Sie voraus, dass y nur dann gleich 1 ist, wenn Sie ziemlich sicher sind, und das bedeutet, dass die Präzision steigt, denn wann immer Sie einen vorhersagen, haben Sie mit größerer Wahrscheinlichkeit Recht. Eine Erhöhung der Schwellenwerte führt also zu einer höheren Präzision, aber auch zu einer geringeren Erinnerungsrate , da wir jetzt seltener einen vorhersagen und von der Gesamtzahl der Patienten mit dieser Krankheit weniger richtig diagnostizieren werden. Wenn Sie diesen Schwellenwert auf 0,7 erhöhen, erhalten Sie eine höhere Präzision, aber eine geringere Erinnerungsfähigkeit. Wenn Sie Y nur dann vorhersagen möchten, wenn Sie sehr sicher sind, können Sie diesen Wert sogar auf 0,9 erhöhen, was zu einer noch höheren Genauigkeit führt. Wenn Sie also vorhersagen, dass der Patient an der Krankheit leidet, haben Sie wahrscheinlich recht, und das wird Ihnen eine sehr hohe Präzision geben. Der Rückruf wird noch weiter nach unten gehen. Nehmen wir auf der anderen Seite an, wir wollen verhindern , dass zu viele Fälle der seltenen Krankheit übersehen werden. Wenn wir also im Zweifelsfall y gleich 1 vorhersagen wollen, könnte dies der Fall sein, wenn die Behandlung nicht zu invasiv, schmerzhaft oder teuer ist, aber eine unbehandelte Krankheit viel schlimmere Folgen für den Patienten hat. In diesem Fall könnte man sagen, im Zweifelsfall sollten wir aus Sicherheitsgründen einfach voraussagen, dass sie es haben, und sie zur Behandlung in Betracht ziehen, da unbehandelte Fälle ziemlich schlimm sein können. Wenn dies für Ihre Anwendung die bessere Art ist, Entscheidungen zu treffen, würden Sie diesen Schwellenwert verwenden, ihn stattdessen senken , z. B. auf 0,3 setzen. In diesem Fall prognostizieren Sie eine Eins, solange Sie glauben, dass die Wahrscheinlichkeit, dass die Krankheit vorliegt, bei 30 Prozent oder besser liegt, und Sie sagen nur Null voraus, wenn Sie sich ziemlich sicher sind, dass die Krankheit nicht vorhanden ist. Wie Sie sich vorstellen können, werden die Auswirkungen auf Präzision und Erinnerungsfähigkeit das Gegenteil von dem sein, was Sie hier oben gesehen haben, und eine Senkung dieses Schwellenwerts wird zu einer geringeren Präzision führen, weil wir jetzt lockerer sind, wir sind eher bereit, eine vorherzusagen, auch wenn wir uns nicht sicher sind, aber das führt zu einer höheren Erinnerung, weil wir von all den Patienten, die an dieser Krankheit leiden, wahrscheinlich mehr von ihnen richtig identifizieren werden. Allgemeiner gesagt haben wir die Flexibilität, einen Wert nur dann vorherzusagen, wenn f über einem bestimmten Schwellenwert liegt, und indem wir diesen Schwellenwert wählen, können wir verschiedene Kompromisse zwischen Präzision und Erinnerung eingehen. Es stellt sich heraus, dass bei den meisten Lernalgorithmen ein Kompromiss zwischen Präzision und Erinnerung besteht. Präzision und Erinnerung liegen beide zwischen Null und Eins, und wenn Sie einen sehr hohen Schwellenwert festlegen, sagen wir einen Schwellenwert von 0,99, dann beginnen Sie mit sehr hoher Präzision, aber geringerer Erinnerungsfähigkeit und wenn Sie den Wert dieses Schwellenwerts reduzieren, erhalten Sie eine Kurve, die zwischen Präzision und Erinnerung abwägt, bis Sie schließlich, wenn Sie einen sehr niedrigen Schwellenwert haben, sodass der Schwellenwert 0,01 beträgt, dann haben Sie am Ende eine sehr niedrige Präzision, aber eine relativ hohe Erinnerung. Manchmal können Sie durch das Zeichnen dieser Kurve versuchen, einen Schwellenwert auszuwählen , der der Auswahl eines Punkts auf dieser Kurve entspricht. Die Salden, die Kosten falsch positiver und falsch negativer Ergebnisse oder der Salden, die Vorteile hoher Präzision und hoher Erinnerungsfähigkeit. Durch die grafische Genauigkeit und den Abruf verschiedener Schwellenwerte können Sie einen Punkt auswählen, den Sie möchten. Beachten Sie, dass die Auswahl des Schwellenwerts mit der Kreuzvalidierung nicht wirklich möglich ist, da es an Ihnen liegt, die besten Punkte anzugeben. Bei vielen Anwendungen ist es am Ende das, was Sie tun müssen, den Schwellenwert zwischen Präzision und Erinnerungsfähigkeit manuell festzulegen. Es stellt sich heraus, dass, wenn Sie automatisch zwischen Präzision und Erinnerung abwägen möchten, anstatt dies selbst tun zu müssen, eine weitere Metrik namens F1-Score gibt, die manchmal verwendet wird, um die präzise Erinnerung automatisch zu kombinieren, sodass Sie den besten Wert oder den besten Kompromiss zwischen den beiden auswählen können. Eine Herausforderung bei Precision Recall besteht darin , dass Sie Ihre Algorithmen jetzt anhand von zwei verschiedenen Metriken auswerten. Wenn Sie also drei verschiedene Algorithmen trainiert haben und die Precision-Recall-Zahlen so aussehen, ist es nicht so offensichtlich, wie Sie den zu verwendenden Algorithmus auswählen sollen. Wenn es einen Algorithmus gäbe, der eine bessere Präzision und eine bessere Erinnerungsfähigkeit bietet, dann würden Sie sich wahrscheinlich für diesen entscheiden. Aber in diesem Beispiel hat Algorithmus 2 die höchste Präzision, aber Algorithmus 3 hat den höchsten Recall, und Algorithmus 1 tauscht die beiden dazwischen aus, sodass offensichtlich kein Algorithmus die beste Wahl ist. Um Ihnen bei der Entscheidung zu helfen, welchen Algorithmus Sie wählen sollten, kann es nützlich sein, einen Weg zu finden, Präzision und Erinnerung in einem einzigen Ergebnis zu kombinieren, sodass Sie sich einfach ansehen können, welcher Algorithmus die höchste Punktzahl hat, und sich vielleicht für diesen entscheiden. Eine Möglichkeit, Präzision und Erinnerungsvermögen zu kombinieren, besteht darin, den Durchschnitt zu nehmen. Dies stellt sich als kein guter Weg heraus, daher empfehle ich ihn nicht wirklich. Aber wenn wir den Durchschnitt nehmen, erhalten Sie 0,45 , 0,4 und 0,5. Aber es stellt sich heraus, dass die Berechnung des Durchschnitts und die Auswahl des Algorithmus mit dem höchsten Durchschnitt zwischen Präzision und Erinnerung nicht so gut funktioniert, weil dieser Algorithmus eine sehr niedrige Präzision hat , und tatsächlich entspricht dies vielleicht einem Algorithmus, der tatsächlich y gleich 1 ausgibt und bei allen Patienten diagnostiziert, dass sie an der Krankheit leiden. Deshalb ist die Erinnerung perfekt, aber die Präzision ist sehr gering. Algorithmus 3 ist eigentlich kein besonders nützlicher Algorithmus, obwohl der Durchschnitt zwischen Präzision und Erinnerung ziemlich hoch ist. Lassen Sie uns nicht den Durchschnitt zwischen Präzision und Erinnerung verwenden. Stattdessen ist die gängigste Methode zur Kombination von Precision Recall die Berechnung eines sogenannten F1-Scores, und der F1-Wert ist eine Methode, P- und R-Präzision und Erinnerung zu kombinieren, wobei jedoch der niedrigere Wert stärker betont wird. Denn es stellt sich heraus, dass es nicht so nützlich ist, ob ein Algorithmus eine sehr niedrige Präzision oder einen sehr geringen Erinnerungswert hat. Der F1-Score ist eine Methode, um einen Durchschnitt zu berechnen, wobei dem, was niedriger ist, mehr Aufmerksamkeit geschenkt wird. Die Formel für die Berechnung des F1-Scores lautet wie folgt: Sie berechnen einen über P und einen über R, ermitteln den Durchschnitt und nehmen dann die Umkehrung davon. Anstatt den Durchschnitt der P- und R-Präzisionserinnerung zu ermitteln, werden wir einen Durchschnitt über P und einen über R ermitteln und dann einen über diesen Wert nehmen. Wenn Sie diese Gleichung vereinfachen, kann sie auch wie folgt berechnet werden. Durch die Mittelwertbildung von eins über P und eins über R wird jedoch viel stärker betont, ob sich entweder P oder R als sehr klein herausstellt. Wenn Sie den F1-Wert für diese drei Algorithmen berechnen, werden Sie feststellen, dass der F1-Wert für Algorithmus 1 0,444 und für den zweiten Algorithmus 0,175 beträgt. Sie stellen fest, dass 0,175 dem niedrigeren Wert viel näher als dem höheren Wert liegt und für den dritten Algorithmus 0,0392 ist. Der F1-Score gibt Aufschluss über Kompromisse zwischen Präzision und Erinnerungsfähigkeit, und in diesem Fall wird uns das sagen, dass der erste Algorithmus vielleicht besser ist als der zweite oder der dritte Algorithmus. In der Mathematik wird diese Gleichung übrigens auch als harmonisches Mittel von P und R bezeichnet, und das harmonische Mittel ist eine Methode, um einen Durchschnitt zu ermitteln, der die kleineren Werte stärker betont. Für die Zwecke dieser Klasse müssen Sie sich jedoch keine Gedanken über die Terminologie des harmonischen Mittelwerts machen. Herzlichen Glückwunsch zum letzten Video dieser Woche und danke dir auch, dass du mir diese beiden optionalen Videos angesehen hast. In dieser Woche haben Sie viele praktische Tipps und praktische Ratschläge für den Aufbau eines maschinellen Lernsystems gelernt, und wenn Sie diese Ideen anwenden, könnten Sie meiner Meinung nach sehr effektiv Algorithmen für maschinelles Lernen entwickeln. Nächste Woche kommen wir zurück, um über einen weiteren sehr leistungsstarken Algorithmus für maschinelles Lernen zu sprechen. Unter den fortschrittlichen Techniken, die wir in vielen kommerziellen Produktionsumgebungen verwenden, stehen meiner Meinung nach neuronale Netze und Entscheidungsbäume ganz oben auf der Liste. Nächste Woche werden wir über Entscheidungsbäume sprechen, was meiner Meinung nach eine weitere sehr leistungsstarke Technik sein wird, mit der Sie auch viele erfolgreiche Anwendungen erstellen werden. Ich freue mich darauf, dich nächste Woche zu sehen.
Entscheidungsbaum-Modell
Willkommen zur letzten Woche dieses Kurses über fortgeschrittene Lernalgorithmen. Einer der Lernalgorithmus ist dieser sehr leistungsfähige Grund, weshalb wir viele Anwendungen verwenden, die auch von vielen genutzt werden, um Wettbewerbe für maschinelles Lernen zu gewinnen, Entscheidungsbäume und Baumensembles. Trotz all der Erfolge von Entscheidungsbäumen haben sie in der akademischen Welt nicht so viel Aufmerksamkeit erhalten, sodass Sie vielleicht nicht annähernd so viel über Entscheidungsbäume hören, aber es ist ein Tool, das es wert ist, in Ihrer Toolbox zu haben. In dieser Woche lernen wir mehr über Entscheidungsbäume und Sie werden sehen, wie Sie sie für sich selbst zum Laufen bringen können. Lass uns eintauchen. Um zu erklären, wie Entscheidungsbäume funktionieren, werde ich diese Woche ein Beispiel für die Klassifizierung von Katzen als laufendes Beispiel verwenden. Sie betreiben ein Katzenadoptionszentrum und möchten anhand einiger Funktionen einen Klassifikator trainieren, der Ihnen schnell sagt, ob es sich bei einem Tier um eine Katze handelt oder nicht. Ich habe hier 10 Trainingsbeispiele. Zu jedem dieser 10 Beispiele gehören Merkmale zur Ohrform des Tieres, zur Gesichtsform, ob es Schnurrhaare hat, und dann das Ground-Truth-Label, mit dem Sie dieses Tier vorhersagen möchten. Das erste Beispiel hat spitze Ohren, rundes Gesicht, Schnurrhaare sind vorhanden und es ist eine Katze. Das zweite Beispiel hat Schlappohren, die Gesichtsform ist nicht rund, Schnurrhaare sind vorhanden, und ja, das ist eine Katze, und so weiter für die restlichen Beispiele. Dieser Datensatz enthält fünf Katzen und fünf Hunde. Die Eingabe-Features X sind diese drei Spalten, und die Zielausgabe, die Sie vorhersagen möchten, Y, ist diese letzte Spalte von, ist das eine Katze oder nicht? In diesem Beispiel nehmen die Features X kategoriale Werte an. Mit anderen Worten, die Merkmale nehmen nur wenige diskrete Werte an. Ihre Formen sind entweder spitz oder locker. Die Gesichtsform ist entweder rund oder nicht rund und Schnurrhaare sind entweder vorhanden oder fehlen. Dies ist eine binäre Klassifizierungsaufgabe , da die Bezeichnungen ebenfalls eins oder null sind. Vorerst nimmt jedes der Features X_1, X_2 und X_3 nur zwei mögliche Werte an. Wir werden später in dieser Woche über Funktionen sprechen, die mehr als zwei mögliche Werte annehmen können, sowie über Funktionen mit kontinuierlichem Wert. Was ist ein Entscheidungsbaum? Hier ist ein Beispiel für ein Modell, das Sie möglicherweise erhalten, nachdem Sie einen Entscheidungsbaum-Lernalgorithmus mit dem Datensatz trainiert haben, den Sie gerade gesehen haben. Das Modell, das der Lernalgorithmus ausgibt, sieht aus wie ein Baum, und ein Bild wie dieses nennen Informatiker einen Baum. Wenn es für Sie nicht wie die biologischen Bäume aussieht, die Sie da draußen sehen, ist das in Ordnung, machen Sie sich keine Sorgen. Wir werden anhand eines Beispiels sicherstellen, dass diese Informatik-Definition eines Baums auch für Sie sinnvoll ist. Jedes dieser Ovale oder Rechtecke wird als Knoten im Baum bezeichnet. Dieses Modell funktioniert so, wenn Sie ein neues Testbeispiel haben: Sie hat eine Katze, bei der die Ohrform spitz ist, die Gesichtsform rund ist und Schnurrhaare vorhanden sind. Dieses Modell wird dieses Beispiel betrachten und eine Klassifizierungsentscheidung treffen, indem wir mit diesem Beispiel an diesem obersten Knoten des Baums beginnen, der als Wurzelknoten des Baums bezeichnet wird, und wir werden uns das darin geschriebene Merkmal ansehen, das die Form eines Ohrs hat. Basierend auf dem Wert der Ohrform in diesem Beispiel gehen wir entweder nach links oder nach rechts. Der Wert der Ohrform in diesem Beispiel ist spitz, also gehen wir den linken Ast des Baums hinunter, etwa so, und landen an diesem ovalen Knoten hier drüben. Wir schauen uns dann die Gesichtsform dieses Beispiels an, die sich als rund herausstellt, und folgen diesem Pfeil hier nach unten. Der Algorithmus wird daraus schließen , dass er denkt, dass es sich um eine Katze handelt. Sie gelangen zu diesem Knoten und der Algorithmus sagt voraus , dass es sich um eine Katze handelt. Was ich auf dieser Folie gezeigt habe, ist ein bestimmtes Entscheidungsbaummodell. Um etwas mehr Terminologie einzuführen: Dieser oberste Knoten im Baum wird als Wurzelknoten bezeichnet. Alle diese Knoten , also all diese ovalen Formen, aber mit Ausnahme der Kästchen am unteren Rand, werden alle Entscheidungsknoten genannt. Sie sind Entscheidungsknoten, weil sie sich mit einem bestimmten Feature befassen und dann auf der Grundlage des Werts des Features entscheiden, ob Sie in der Baumstruktur nach links oder rechts gehen möchten. Schließlich werden diese Knoten unten, diese rechteckigen Kästchen, Blattknoten genannt. Sie machen eine Vorhersage. Wenn Sie die Definitionen von Bäumen durch Informatiker noch nicht gesehen haben, mag es nicht intuitiv erscheinen, dass die Wurzeln des Baumes oben und die Blätter des Baumes unten unten sind. Eine Möglichkeit, darüber nachzudenken, ist vielleicht, dass dies eher einer Hängepflanze für den Innenbereich ähnelt, weshalb die Wurzeln oben sind und die Blätter dann dazu neigen, auf die Unterseite des Baumes zu fallen. Auf dieser Folie habe ich nur ein Beispiel für einen Entscheidungsbaum gezeigt. Hier sind ein paar andere. Dies ist ein anderer Entscheidungsbaum für den Versuch, Katze und Nichtkatze zu klassifizieren. Um in dieser Struktur eine Klassifizierungsentscheidung zu treffen, würden Sie erneut an diesem obersten Stammknoten beginnen. Abhängig von der Ohrform eines Beispiels würdest du entweder nach links oder rechts gehen. Wenn die Ohrform spitz ist, dann schaust du dir das Schnurrhaar-Merkmal an, und je nachdem, ob Schnurrhaare vorhanden sind oder nicht, gehst du nach links oder rechts, um Katze zu gewinnen und zu klassifizieren. Nur zum Spaß, hier ist ein zweites Beispiel für einen Entscheidungsbaum, hier ist ein dritter und hier ist ein vierter. Unter diesen verschiedenen Entscheidungsbäumen werden einige in den Trainingssätzen oder in den Kreuzvalidierungs- und Testsätzen besser und andere schlechter abschneiden. Die Aufgabe des Entscheidungsbaum-Lernalgorithmus besteht darin, aus allen möglichen Entscheidungsbäumen einen auszuwählen, der hoffentlich im Trainingssatz gut abschneidet und sich dann idealerweise auch gut auf neue Daten wie Ihre Kreuzvalidierung und Testsätze verallgemeinern lässt. Es scheint, als gäbe es viele verschiedene Entscheidungsbäume, die man für eine bestimmte Anwendung erstellen könnte. Wie bringt man einen Algorithmus dazu, anhand eines Trainingssatzes einen bestimmten Entscheidungsbaum zu lernen? Schauen wir uns das im nächsten Video an.
Entscheidungsbaum-Modell
Der Prozess der Erstellung eines Entscheidungsbaums anhand eines Trainingssatzes umfasst einige Schritte. In diesem Video werfen wir einen Blick auf den Gesamtprozess dessen, was Sie tun müssen, um einen Entscheidungsbaum zu erstellen. Anhand eines Trainingssatzes mit 10 Beispielen für Katzen und Hunde, wie Sie es im letzten Video gesehen haben. Der erste Schritt beim Lernen von Entscheidungsbäumen besteht darin, zu entscheiden, welche Funktion am Stammknoten verwendet werden soll. Das ist der erste Knoten ganz oben im Entscheidungsbaum. Über einen Algorithmus, über den wir in den nächsten Videos sprechen werden. Nehmen wir an, wir haben uns für das Merkmal und den Wurzelknoten für das Ohrformmerkmal entschieden. Das heißt, wir werden uns entscheiden, uns alle unsere Trainingsbeispiele anzusehen, alle hier gezeigten Tangentenbeispiele. Ich habe sie nach dem Wert des Ohrformmerkmals aufgeteilt. Lassen Sie uns insbesondere die fünf Beispiele mit spitzen Ohren heraussuchen und sie nach links verschieben. Wählen wir die fünf Beispiele mit Schlappohren aus und verschieben sie nach rechts. Der zweite Schritt konzentriert sich nur auf den linken Teil, der manchmal auch als linker Zweig des Entscheidungsbaums bezeichnet wird, um zu entscheiden, welche Knoten dort platziert werden sollen. Insbesondere, auf welche Funktion wir uns aufteilen möchten oder welche Funktion wir als Nächstes verwenden möchten. Über einen Algorithmus, über den wir noch einmal in dieser Woche sprechen werden. Nehmen wir an, Sie entscheiden sich dafür, dort die Gesichtsformfunktion zu verwenden. Jetzt nehmen wir diese fünf Beispiele und teilen diese fünf Beispiele auf der Grundlage ihres Werts der Gesichtsform in zwei Teilmengen auf. Wir nehmen die vier Beispiele aus diesen fünf mit einer runden Gesichtsform und verschieben sie nach links. Das eine Beispiel mit einer nicht runden Gesichtsform und verschiebe es nach unten nach rechts. Schließlich stellen wir fest, dass es sich bei diesen vier Beispielen ausschließlich um Katzen handelt, vier davon sind Katzen. Anstatt weiter zu spalten, wurden Blattknoten geschaffen, die eine Vorhersage treffen, dass Dinge, die darauf hinauslaufen, keine anderen Katzen. Hier stellen wir fest, dass keines der Beispiele, null der einen Beispiele, Katzen oder alternativ 100 Prozent der Beispiele hier Hunde sind. Wir können hier einen Blattknoten erstellen, der vorhersagt, dass es sich nicht um Katze handelt. Nachdem wir dies im linken Teil dieses Entscheidungsbaums getan haben, wiederholen wir nun einen ähnlichen Vorgang im rechten oder rechten Teil dieses Entscheidungsbaums. Konzentrieren Sie sich nur auf diese fünf Beispiele, die einen Kapitän für Hunde enthalten. Wir müssten hier eine Funktion auswählen, um die Aufteilung dieser fünf Beispiele weiter zu verwenden. Wenn wir am Ende die Funktion Whisker wählen, würden wir diese fünf Beispiele dann aufteilen, je nachdem, wo die Schnurrhaare vorhanden sind oder nicht, etwa so. Sie stellen fest, dass eins von einem Beispiel auf der linken Seite für Katzen und Nullen von vier Katzen sind. Jeder dieser Knoten ist völlig rein, das heißt, alle Katzen hin oder her und es gibt keine Mischung aus Katzen und Hunden mehr. Wir können diese Blattknoten erstellen, indem wir links eine Katzenprognose und hier rechts eine Nachtkappen-Vorhersage treffen. Dies ist ein Prozess der Erstellung eines Entscheidungsbaums. Während dieses Prozesses gab es einige wichtige Entscheidungen, die wir in verschiedenen Schritten des Algorithmus treffen mussten. Lassen Sie uns besprechen, was diese wichtigsten Entscheidungen waren, und wir werden in den nächsten Videos näher darauf eingehen, wie diese Entscheidungen getroffen werden können. Die erste wichtige Entscheidung war, wie wählen Sie aus, welche Funktionen Sie für die Aufteilung an jedem Knoten verwenden möchten? Am Wurzelknoten sowie am linken und rechten Zweig des Entscheidungsbaums mussten wir entscheiden, ob es an diesem Knoten einige Beispiele mit einer Mischung aus Katzen und Hunden gab. Möchten Sie das ohrförmige Merkmal oder das Gesichtsmerkmal oder das Schnurrhaar-Merkmal unterscheiden? Im nächsten Video werden wir sehen, dass Entscheidungsbäume auswählen, auf welches Merkmal aufgeteilt werden soll, um zu versuchen, die Reinheit zu maximieren. Mit Reinheit meine ich, du willst zu welchen Untergruppen kommen, die allen Katzen oder allen Hunden so nahe wie möglich kommen. Wenn wir zum Beispiel eine Funktion hätten, die besagt, ob dieses Tier Katzen-DNA hat, hätten wir diese Funktion nicht wirklich. Aber wenn wir das getan hätten, hätten wir uns bei diesem Feature am Stammknoten aufteilen können, was zu fünf von fünf Katzen im linken Zweig und Null der fünf Katzen im rechten Zweig geführt hätte. Sowohl diese linke als auch die rechte Teilmenge der Daten sind völlig rein, was bedeutet, dass es nur eine Klasse gibt, entweder nur Katzen oder nur Katzen in diesen beiden linken und rechten Unterzweigen, weshalb die Katzen-DNA-Funktion, wenn wir diese Funktion gehabt hätten, eine großartige Funktion gewesen wäre. Aber mit den Merkmalen, die wir tatsächlich haben, mussten wir entscheiden, was die Aufteilung der Jahresform ist, was dazu führt , dass vier von fünf Beispielen auf der linken Seite Katzen und eines der fünf Beispiele auf der rechten Seite Katzen oder Gesichtsform sind, was dazu führte, dass vier der sieben Beispiele links und eines der drei rechts oder Schnurrhaare sind, was dazu führte, dass drei von vier Exemplaren links geworfen wurden und zwei von sechs keine Katzen waren. auf der rechten Seite. Der Entscheidungsbaum-Lernalgorithmus muss zwischen Ohrform, Gesichtsform und Schnurrhaar wählen. Welches dieser Merkmale führt zu der höchsten Reinheit der Etiketten auf dem linken und rechten Teilzweig? Denn wenn Sie zu einer sehr reinen Teilmenge von Beispielen gelangen, können Sie entweder Katze oder Katze nicht vorhersagen und es größtenteils richtig machen. Im nächsten Video zur Entropie werden wir darüber sprechen, wie Verunreinigung geschätzt und Verunreinigungen minimiert werden können. Die erste Entscheidung, die wir beim Erlernen eines Entscheidungsbaums treffen müssen, ist die Auswahl der Funktion, des Salons und der einzelnen Knoten. Die zweite wichtige Entscheidung, die Sie beim Aufbau eines Entscheidungsbaums treffen müssen, ist zu entscheiden, wann Sie mit dem Teilen aufhören. Die Kriterien, die wir gerade verwenden, waren, bis ich weiß, dass es entweder 100 Prozent, alle Katzen oder 100 Prozent Hunde und keine Katzen gibt. Denn an diesem Punkt erscheint es naheliegend, einen Blattknoten zu erstellen, der nur eine Klassifizierungsprognose macht. Alternativ können Sie sich auch dafür entscheiden, beim Teilen mit dem Teilen aufzuhören, sodass der Baum die maximale Tiefe nicht mehr überschreitet. Wobei die maximale Tiefe , bis zu der der Baum gehen darf, ein Parameter ist, den man einfach sagen könnte. Im Entscheidungsbaum wird die Tiefe eines Knotens als die Anzahl der Sprünge definiert , die benötigt werden, um vom Wurzelknoten, der als oberster Knoten bezeichnet wird, zu diesem bestimmten Knoten zu gelangen. Der Wurzelknoten benötigt also keine Sprünge, er holt sich selbst und hat Tiefe 0. Die Anmerkungen darunter befinden sich in Tiefe eins und in den folgenden Anmerkungen wäre es Tiefe 2. Wenn Sie entschieden hätten, dass die maximale Tiefe des Entscheidungsbaums beispielsweise zwei beträgt, würden Sie beschließen, keine Knoten unter dieser Ebene aufzuteilen, sodass der Baum niemals Tiefe 3 erreicht. Ein Grund, warum Sie die Tiefe des Entscheidungsbaums einschränken sollten, besteht darin, sicherzustellen, dass der Baum nicht zu groß und unhandlich wird, und zweitens, indem Sie den Baum klein halten, ist er weniger anfällig für Überpassungen. Ein weiteres Kriterium, anhand dessen Sie entscheiden könnten, das Splitten zu beenden, könnte sein, dass die Verbesserungen der Prioritätsbewertung, die Sie in einem späteren Video sehen, unter einem bestimmten Schwellenwert liegen. Wenn das Aufteilen eines Knotens zu minimalen Reinheitsverbesserungen führt oder Sie sehen, dass die Verunreinigung tatsächlich abnimmt. Aber wenn die Gewinne zu gering sind, stören sie sich vielleicht nicht. Auch hier gilt, um die Bäume kleiner zu halten und das Risiko einer Überfüllung zu verringern. Wenn die Anzahl der Beispiele dafür, dass ein Knoten unter einem bestimmten Schwellenwert liegt, können Sie sich schließlich auch dafür entscheiden, die Aufteilung zu beenden. Wenn wir zum Beispiel am Wurzelknoten das Gesichtsformmerkmal geteilt haben, dann hat der rechte Zweig nur drei Trainingsbeispiele mit einer Katze und zwei Hunden gehabt, und anstatt dies in noch kleinere Untergruppen aufzuteilen, wenn Sie sich entscheiden, weitere Beispiele nicht mit nur drei Ihrer Beispiele zu teilen, erstellen Sie einfach einen Entscheidungsknoten und weil es hier vielleicht Hunde für andere drei Erwachsene gibt, wäre dies ein Knoten und dies macht eine Vorhersage von nicht Katze. Auch hier ist ein Grund, warum Sie entscheiden könnten, dass es sich nicht lohnt, den Baum zu teilen, darin, den Baum kleiner zu halten und eine Überanpassung zu vermeiden. Wenn ich mir selbst Entscheidungsbaum-Lernaufgaben ansehe, habe ich manchmal das Gefühl, Junge, in diesem Algorithmus gehen viele verschiedene Teile und viele verschiedene Dinge vor sich. Ein Grund, warum es sich anfühlen könnte, liegt in der Entwicklung der Entscheidungsbäume. Es gab einen Forscher, der eine Basisversion von Entscheidungsbäumen vorschlug, und dann sagte ein anderer Forscher, oh, wir können das Ding auf diese Weise modifizieren, zum Beispiel seine neuen Kriterien für die Aufteilung. Dann lässt sich ein anderer Forscher etwas anderes einfallen wie, oh, vielleicht sollten wir aufhören zu schwitzen, wenn es eine bestimmte maximale Tiefe erreicht. Im Laufe der Jahre haben verschiedene Forscher unterschiedliche Verfeinerungen des Algorithmus entwickelt. Infolgedessen funktioniert es wirklich gut, aber wir schauen uns alle Details an, wie eine Entscheidung umgesetzt werden kann G. Es fühlt sich an, als ob es viele verschiedene Dinge gibt, wie zum Beispiel, warum es so viele verschiedene Möglichkeiten gibt, zu entscheiden, wann man mit dem Teilen aufhören soll. Wenn es sich für dich wie ein etwas komplizierter, chaotischer Durchschnitt anfühlt, tut es das für mich auch. Aber diese verschiedenen Teile fügen sich zu einem sehr effektiven Lernalgorithmus zusammen, und was Sie in diesem Kurs lernen, sind die wichtigsten Ideen, wie Sie ihn gut funktionieren lassen können, und am Ende dieser Woche werde ich Ihnen auch einige Anleitungen und einige Vorschläge zur Verwendung von Open-Source-Paketen geben, damit Sie nicht zwei komplizierte Verfahren haben müssen, um all diese Entscheidungen zu treffen. Wie entscheide ich mich zum Beispiel, mit dem Teilen aufzuhören? Du bringst diese Atome wirklich dazu, für dich selbst gut zu funktionieren. Aber ich möchte Ihnen versichern, dass dieser Algorithmus, wenn er kompliziert und chaotisch erscheint, mir das ehrlich gesagt auch tut, aber er funktioniert gut. Die nächste wichtige Entscheidung, auf die ich näher eingehen möchte, ist, wie Sie entscheiden, wie ein Knoten aufgeteilt werden soll. Schauen wir uns im nächsten Video diese Definition von Entropie an, mit der wir die Reinheit oder genauer gesagt die Verunreinigung in einem Knoten messen können. Gehen wir zum nächsten Video über.
Reinheit messen
In diesem Video werden wir uns anhand einer Reihe von Beispielen ansehen, wie die Reinheit gemessen wird. Wenn die Beispiele alle Katzen einer einzigen Klasse sind, dann ist das sehr rein, wenn es nicht alles Katzen sind, ist das auch sehr rein, aber wenn es irgendwo dazwischen liegt, wie quantifiziert man, wie rein die Menge der Beispiele ist? Schauen wir uns die Definition von Entropie an, die ein Maß für die Verunreinigung eines Datensatzes ist. Ausgehend von sechs Beispielen wie diesem, wir haben drei Katzen und drei Hunde, definieren wir p_1 als den Bruchteil der Beispiele, die Katzen sind, also den Bruchteil der Beispiele mit der Bezeichnung eins, darauf weist der Index eins hin. p_1 ist in diesem Beispiel gleich 3/6. Wir werden die Verunreinigung einer Reihe von Beispielen mit einer Funktion namens Entropie messen, die so aussieht. Die Entropiefunktion wird üblicherweise als Großbuchstabe H dieser Zahl p_1 bezeichnet und die Funktion sieht aus wie diese Kurve hier, wo die horizontale Achse p_1 ist, der Anteil der Katzen in der Stichprobe, und die vertikale Achse der Wert der Entropie ist. In diesem Beispiel, in dem p_1 3/6 oder 0,5 ist, wäre der Wert der Entropie von p_1 gleich eins. Sie stellen fest, dass diese Kurve am höchsten ist, wenn Ihre Beispielgruppe 50-50 ist, also am unreinsten ist sie als Verunreinigung von eins oder mit einer Entropie von eins, wenn Ihre Beispielgruppe 50-50 ist, wohingegen die Entropie, wenn Ihre Beispielgruppe entweder nur Katzen oder keine Katzen waren, die Entropie Null ist. Lassen Sie uns einfach ein paar weitere Beispiele durchgehen, um mehr über Entropie und ihre Funktionsweise zu erfahren. Hier ist eine andere Reihe von Beispielen mit fünf Katzen und einem Hund, also p_1 ist der Anteil der positiven Beispiele, ein Bruchteil der mit eins bezeichneten Beispiele ist 5/6 und p_1 ist also etwa 0,83. Wenn Sie diesen Wert bei etwa 0,83 ablesen, stellen wir fest , dass die Entropie von p_1 etwa 0,65 beträgt. Und hier schreibe ich es nur bis zu zwei signifikanten Ziffern. Hier ist ein weiteres Beispiel. Dieses Beispiel von sechs Bildern enthält alle Katzen, also ist p_1 sechs von sechs, weil alle sechs Katzen sind und die Entropie von p_1 dieser Punkt hier drüben ist, der Null ist. Wir sehen, dass, wenn man von 3/6 auf sechs von sechs Katzen steigt, die Verunreinigung von eins auf Null abnimmt, oder mit anderen Worten, die Reinheit steigt, wenn man von einer 50-50-Mischung aus Katzen und Hunden auf alle Katzen übergeht. Schauen wir uns noch ein paar Beispiele an. Hier ist ein weiteres Beispiel mit zwei Katzen und vier Hunden, also p_1 hier ist 2/6, was 1/3 ist, und wenn Sie die Entropie bei 0,33 ablesen, stellt sich heraus, dass es ungefähr 0,92 ist. Das ist eigentlich ziemlich unrein und insbesondere dieses Set ist unreiner als dieses Set, weil es eher einer 50-50-Mischung entspricht, weshalb die Verunreinigung hier 0,92 und nicht 0,65 beträgt. Zum Schluss noch ein letztes Beispiel: Wenn wir eine Menge aller sechs Hunde haben, dann ist p_1 gleich 0 und die Entropie von p_1 ist genau diese Zahl hier unten, die gleich 0 ist, also gibt es keine Verunreinigung oder das wäre eine völlig reine Menge von allem, nicht Katzen oder allen Hunden. Schauen wir uns nun die tatsächliche Gleichung für die Entropiefunktion H (p_1) an. Denken Sie daran, dass p_1 der Bruchteil der Beispiele ist, die Katzen entsprechen. Wenn Sie also eine Stichprobe haben, die aus 2/3 Katzen besteht, muss diese Stichprobe 1/3 keine Katzen enthalten. Lassen Sie mich p_0 so definieren, dass er dem Bruchteil der Beispiele, die keine Katzen sind, entspricht und einfach 1 minus p_1 entspricht. Die Entropiefunktion wird dann als negativ p_1log_2 (p_1) definiert, und konventionell nehmen wir bei der Berechnung der Entropie Logs zur Basis zwei statt zur Basis e und dann minus p_0log_2 (p_0). Alternativ ist dies auch gleich negativ p_1log_2 (p_1) minus 1 minus p_1 log_2 ( 1 minus p_1). Wenn Sie diese Funktion in einem Computer plotten, werden Sie feststellen , dass es genau diese Funktion auf der linken Seite sein wird. Wir nehmen log_2, nur um den Peak dieser Kurve gleich eins zu machen, wenn wir log_e oder die Basis natürlicher Logarithmen nehmen würden, dann skaliert das diese Funktion nur vertikal, und es wird immer noch funktionieren, aber die Zahlen werden etwas schwer zu interpretieren, weil der Peak der Funktion keine schöne runde Zahl wie Eins mehr ist. Ein Hinweis zur Berechnung dieser Funktion: Wenn p_1 oder p_0 gleich 0 ist, dann sieht ein Ausdruck wie dieser aus wie 0log (0), und log (0) ist technisch undefiniert, es ist tatsächlich negativ unendlich. Konventionell für die Berechnung der Entropie gehen wir jedoch davon aus, dass 0log (0) gleich 0 ist, und das berechnet die Entropie korrekt als Null oder als Eins, um gleich Null zu sein. Wenn Sie denken, dass diese Definition von Entropie ein bisschen der Definition des logistischen Verlusts ähnelt, über die wir im letzten Kurs gelernt haben, gibt es tatsächlich eine mathematische Begründung dafür, warum diese beiden Formeln so ähnlich aussehen. Aber du musst dir darüber keine Gedanken machen und wir werden in diesem Kurs nicht darauf eingehen. Aber die Anwendung dieser Formel für die Entropie sollte gut funktionieren, wenn Sie einen Entscheidungsbaum erstellen. Zusammenfassend lässt sich sagen, dass die Entropiefunktion ein Maß für die Verunreinigung eines Datensatzes ist. Es beginnt bei Null, steigt auf eins und fällt dann als Funktion des Anteils der positiven Beispiele in Ihrer Stichprobe wieder auf Null zurück. Es gibt andere Funktionen, die so aussehen, sie gehen von Null auf Eins und dann wieder runter. Wenn Sie zum Beispiel in Open-Source-Paketen nachschauen, hören Sie vielleicht auch von etwas, das Gini-Kriterien genannt wird. Dies ist eine weitere Funktion, die der Entropiefunktion sehr ähnlich sieht und sich auch gut für die Erstellung von Entscheidungsbäumen eignet. Aber der Einfachheit halber werde ich mich in diesen Videos auf die Verwendung der Entropiekriterien konzentrieren, die normalerweise für die meisten Anwendungen gut funktionieren. Da wir nun diese Definition von Entropie haben, schauen wir uns im nächsten Video an, wie Sie sie tatsächlich verwenden können, um Entscheidungen darüber zu treffen, auf welches Feature in den Knoten eines Entscheidungsbaums aufgeteilt werden soll.
Die Wahl eines Splits: Informationsgewinn
Wenn wir einen Entscheidungsbaum erstellen, hängt die Art und Weise, wie wir entscheiden, auf welches Feature wir an einem Knoten aufgeteilt werden, davon ab, welche Merkmalsauswahl die Entropie am stärksten reduziert. Reduziert die Entropie oder reduziert die Verunreinigung oder maximiert die Reinheit. Beim Lernen von Entscheidungsbäumen wird die Reduzierung der Entropie als Informationsgewinn bezeichnet. Schauen wir uns in diesem Video an, wie der Informationsgewinn berechnet wird, und wählen wir daher aus, welche Funktionen für die Aufteilung an jedem Knoten in einem Entscheidungsbaum verwendet werden sollen. Nehmen wir das Beispiel für die Entscheidung, welche Funktion am Stammknoten des Entscheidungsbaums verwendet werden soll, den wir gerade erstellt haben, um Katzen und Nichtkatzen zu erkennen. Wenn wir anhand ihrer Ohrform am Wurzelknoten geteilt hätten, hätten wir das bekommen, fünf Beispiele links und fünf rechts. Auf der linken Seite hätten wir vier von fünf Katzen, also wäre P1 gleich 4/5 oder 0,8. Auf der rechten Seite ist eine von fünf Katzen, also entspricht P1 1/5 oder 0,2. Wenn Sie die Entropieformel aus dem letzten Video auf diese linke Teilmenge von Daten und diese rechte Teilmenge von Daten anwenden, stellen wir fest, dass der Grad der Verunreinigung auf der linken Seite eine Entropie von 0,8 ist, was etwa 0,72 entspricht, und auf der rechten Seite stellt sich heraus, dass die Entropie von 0,2 ebenfalls 0,72 ist. Dies wäre die Entropie am linken und rechten Unterzweig, wenn wir uns nach dem Ohrformmerkmal aufteilen würden. Eine andere Möglichkeit wäre, das Gesichtsform-Feature zu teilen. Wenn wir das getan hätten, wären links vier der sieben Beispiele Katzen, also P1 ist 4/7 und rechts sind 1/3 Katzen, also P1 auf der rechten Seite ist 1/3. Die Entropie von 4/7 und die Entropie von 1/3 sind 0,99 und 0,92. Der Grad der Verunreinigung im linken und rechten Knoten scheint also viel höher zu sein, 0,99 und 0,92 im Vergleich zu 0,72 und 0,72. Schließlich wäre die dritte mögliche Funktion, die am Stammknoten verwendet werden soll, die Whiskers-Funktion. In diesem Fall teilen Sie die Funktion auf, je nachdem, ob Whisker vorhanden sind oder nicht. In diesem Fall ist P1 auf der linken Seite 3/4, P1 auf der rechten Seite ist 2/6 und die Entropiewerte sind wie folgt. Die zentrale Frage, die wir beantworten müssen, ist angesichts dieser drei Optionen einer Funktion, die am Stammknoten verwendet werden soll, welche unserer Meinung nach am besten funktioniert? Es stellt sich heraus, dass es nützlich wäre, einen gewichteten Durchschnitt von ihnen zu nehmen, anstatt sich diese Entropiezahlen anzusehen und sie zu vergleichen, und hier ist, was ich meine. Wenn es einen Knoten mit vielen Beispielen mit hoher Entropie gibt , scheint das schlimmer zu sein, als wenn es einen Knoten mit nur wenigen Beispielen mit hoher Entropie gäbe. Weil die Entropie als Maß für Verunreinigung schlechter ist, wenn Sie einen sehr großen und unreinen Datensatz haben, verglichen mit nur wenigen Beispielen und einem Ast des Baumes, der sehr unrein ist. Die wichtigste Entscheidung ist, welche dieser drei möglichen Funktionen, die am Root-Knoten verwendet werden sollen, möchten wir verwenden? Jeder dieser Teilungen sind zwei Zahlen zugeordnet, die Entropie auf dem linken Unterzweig und die Entropie auf dem rechten Unterzweig. Um aus diesen Zahlen auszuwählen, kombinieren wir diese beiden Zahlen gerne zu einer einzigen Zahl. Sie können also einfach eine dieser drei Optionen auswählen, welche ist die beste? Die Art und Weise, wie wir diese beiden Zahlen kombinieren werden, besteht darin, einen gewichteten Durchschnitt zu verwenden. Denn wie wichtig es ist, beispielsweise im linken oder rechten Unterzweig eine niedrige Entropie zu haben, hängt auch davon ab, wie viele Beispiele in den linken oder rechten Unterzweig aufgenommen wurden. Denn wenn es beispielsweise im linken Unterzweig viele Beispiele gibt, scheint es wichtiger, sicherzustellen, dass der Entropiewert dieses linken Unterzweigs niedrig ist. In diesem Beispiel gingen fünf der 10 Beispiele in den linken Teilzweig, sodass wir den gewichteten Durchschnitt als 5/10-mal die Entropie von 0,8 berechnen und dann hinzufügen können, dass 5/10 Beispiele auch in den rechten Unterzweig gingen, plus das 5/10-fache der Entropie von 0,2. Nun, für dieses Beispiel in der Mitte, hatte der linke Zweig sieben von zehn Beispielen erhalten. und so berechnen wir das 7/10-fache der Entropie von 0,57 plus, der rechte Unterzweig hatte drei von 10 Beispielen, also plus die 3/10-fache Entropie von 0,3 von 1/3. Schließlich berechnen wir auf der rechten Seite die 4/10-fache Entropie von 0,75 plus die 6/10-fache Entropie von 0,33. Die Art und Weise, wie wir eine Aufteilung wählen, besteht darin, diese drei Zahlen zu berechnen und die niedrigste auszuwählen, da wir dadurch die linken und rechten Unterzweige mit der niedrigsten durchschnittlichen gewichteten Entropie erhalten. In der Art und Weise, wie Entscheidungsbäume erstellt werden, werden wir tatsächlich eine weitere Änderung an diesen Formeln vornehmen, um uns an die Konvention bei der Erstellung von Entscheidungsbäumen zu halten, aber das wird das Ergebnis nicht wirklich ändern. Das heißt, anstatt diese gewichtete durchschnittliche Entropie zu berechnen, werden wir die Verringerung der Entropie berechnen, verglichen mit dem, wenn wir überhaupt nicht geteilt hätten. Wenn wir zum Wurzelknoten gehen, denken Sie daran, dass der Wurzelknoten, den wir mit allen 10 Beispielen im Wurzelknoten mit fünf Katzen und Hunden begonnen haben, und dass wir am Wurzelknoten p_1 gleich 5/10 oder 0,5 hatten. Die Entropie der Wurzelknoten, eine Entropie von 0,5, war tatsächlich gleich 1. Dies war die höchste Reinheit , da es sich um fünf Katzen und fünf Hunde handelte. Die Formel, die wir tatsächlich für die Auswahl einer Aufteilung verwenden werden, ist nicht diese Art der Entropie an den linken und rechten Teilzweigen, sondern die Entropie am Wurzelknoten, also eine Entropie von 0,5, dann abzüglich dieser Formel. Wenn Sie in diesem Beispiel die Mathematik berechnen, ergibt sich ein Wert von 0,28. Für das Beispiel mit der Gesichtsform können wir die Entropie des Wurzelknotens berechnen, eine Entropie von 0,5 minus diesem, was sich als 0,03 herausstellt, und für Whisker die Entropie berechnen, was sich als 0,12 herausstellt. Diese Zahlen, die wir gerade berechnet haben, 0,28, 0,03 und 0,12, werden als Informationsgewinn bezeichnet, und was sie messen, ist die Verringerung der Entropie, die Sie in Ihrem Baum erhalten, wenn Sie eine Teilung vornehmen. Da die Entropie ursprünglich eins am Wurzelknoten war und wenn Sie die Aufteilung vornehmen, erhalten Sie am Ende einen niedrigeren Entropiewert und der Unterschied zwischen diesen beiden Werten ist eine Verringerung der Entropie, und das sind 0,28, wenn die Ohrform geteilt wird. Warum machen wir uns die Mühe, die Entropiereduktion zu berechnen und nicht nur die Entropie am linken und rechten Teilzweig? Es stellt sich heraus, dass eines der Stoppkriterien für die Entscheidung, wann man sich nicht die Mühe machen sollte, weiter zu spalten, darin besteht, dass die Entropiereduktion zu gering ist. In diesem Fall könnten Sie entscheiden, den Baum nur unnötig zu vergrößern und durch das Teilen eine Überanpassung zu riskieren und sich einfach die Mühe zu machen, wenn die Entropieabnahme zu gering ist oder unter einem Schwellenwert liegt. In diesem anderen Beispiel führt das Spucken auf die Ohrform zur größten Entropiereduktion, 0,28 ist größer als 0,03 oder 0,12 und wir würden uns daher für die Aufteilung auf das Ohrformmerkmal am Wurzelknoten entscheiden. Lassen Sie uns auf der nächsten Folie eine formellere Definition des Informationsgewinns geben. Übrigens, eine zusätzliche Notation, die wir auch auf der nächsten Folie vorstellen werden, sind diese Zahlen, 5/10 und 5/10. Ich nenne das w^left , weil das der Bruchteil der Beispiele ist, der in den linken Zweig ging, und ich nenne das w^right, weil das der Bruchteil der Beispiele ist, der in den rechten Zweig ging. Für dieses andere Beispiel wäre w^left 7/10 und w^right 3/10. Lassen Sie uns nun die allgemeine Formel für die Berechnung des Informationsgewinns aufschreiben. Lassen Sie mich anhand des Beispiels für die Aufteilung des Ohrformmerkmals p_1^left so definieren, dass es dem Bruchteil der Beispiele im linken Teilbaum entspricht, die eine positive Bezeichnung haben, also Katzen sind. In diesem Beispiel entspricht p_1^left 4/5. Lassen Sie mich auch w^left als den Bruchteil der Beispiele aller Beispiele des Wurzelknotens definieren, die zum linken Unterzweig gingen, also wäre w^left in diesem Beispiel 5/10. Definieren wir auf ähnliche Weise p_1^right als eines der Beispiele im rechten Zweig. Der Bruchteil, bei dem es sich um positive Beispiele handelt und wenn eines der fünf Beispiele Katzen sind, wird es 1/5 geben, und ebenso ist w^right 5/10, der Bruchteil der Beispiele, die in den rechten Unterzweig gingen. Definieren wir auch p_1^root als den Bruchteil der positiven Beispiele im Wurzelknoten. In diesem Fall wäre das 5/10 oder 0,5. Der Informationsgewinn ist dann definiert als die Entropie von p_1^root, also was ist die Entropie am Wurzelknoten, abzüglich der gewichteten Entropieberechnung, die wir auf der vorherigen Folie hatten, minus w^left, das waren 5/10 im Beispiel, mal die Entropie, die auf p_1^left angewendet wurde, das ist Entropie auf dem linken Unterzweig, plus w^right der Bruchteil der Beispiele, die zum rechten Zweig gingen, mal Entropie von p_1^right. Mit dieser Definition von Entropie können Sie den Informationsgewinn berechnen, der mit der Auswahl eines bestimmten Features verbunden ist, das im Knoten aufgeteilt werden soll. Aus allen möglichen Zukunftsperspektiven, auf die Sie sich aufteilen könnten, können Sie dann die auswählen, die Ihnen den höchsten Informationsgewinn bietet. Das wird hoffentlich dazu führen, dass die Reinheit Ihrer Teilmengen von Daten erhöht wird, die Sie in den linken und rechten Unterzweigen Ihres Entscheidungsbaums erhalten, und das wird dazu führen, dass Sie ein Feature auswählen, das aufgeteilt werden soll und das die Reinheit Ihrer Teilmengen von Daten sowohl im linken als auch im rechten Unterzweig Ihres Entscheidungsbaums erhöht. Da Sie nun wissen, wie Sie den Informationsgewinn oder die Verringerung der Entropie berechnen, wissen Sie, wie Sie ein Feature auswählen, das auf einem anderen Knoten aufgeteilt werden soll. Lassen Sie uns all die Dinge, über die wir gesprochen haben, in den Gesamtalgorithmus für die Erstellung eines Entscheidungsbaums anhand eines Trainingssatzes zusammenfassen. Sehen wir uns das im nächsten Video an.
Zusammenstellen
Anhand der Kriterien für den Informationsgewinn können Sie entscheiden , wie Sie ein Feature auswählen, um einen Knoten aufzuteilen. Nehmen wir das und verwenden wir es an mehreren Stellen in einem Entscheidungsbaum, um herauszufinden, wie ein großer Entscheidungsbaum mit mehreren Knoten erstellt werden kann. Hier ist der Gesamtprozess der Erstellung eines Entscheidungsbaums. Beginnt mit allen Trainingsbeispielen am Wurzelknoten des Baums und berechnet den Informationsgewinn für alle möglichen Merkmale und wählt das Feature aus, auf das aufgeteilt werden soll, das den höchsten Informationsgewinn bietet. Nachdem Sie dieses Feature ausgewählt haben, teilen Sie den Datensatz entsprechend dem ausgewählten Feature in zwei Teilmengen auf, erstellen linke und rechte Zweige des Baums und senden die Trainingsbeispiele entweder an den linken oder rechten Zweig, je nachdem, welchen Wert dieses Feature für dieses Beispiel hat. Auf diese Weise können Sie am Root-Knoten eine Aufteilung vorgenommen haben. Danach wiederholen Sie den Teilungsprozess am linken Ast des Baums, am rechten Ast des Baums und so weiter. Machen Sie so weiter, bis die Stoppkriterien erfüllt sind. Die Stoppkriterien können sein, wenn ein Knoten zu 100 Prozent aus einer einzigen Klausel besteht, jemand die Entropie von Null erreicht hat, oder wenn das weitere Teilen eines Knotens dazu führt , dass der Baum die von Ihnen festgelegte maximale Tiefe überschreitet oder wenn der Informationsgewinn aus zusätzlichen Teilungen unter dem Schwellenwert liegt oder wenn die Anzahl der Beispiele in einem Knoten unter einem Schwellenwert liegt. Sie wiederholen den Teilungsprozess so lange, bis die von Ihnen ausgewählten Stoppkriterien, bei denen es sich um eines oder mehrere dieser Kriterien handeln kann, erfüllt sind. Schauen wir uns ein Beispiel an, wie dieser Prozess funktionieren wird. Wir haben alle Beispiele an den Wurzelknoten begonnen und auf der Grundlage der Berechnung des Informationsgewinns für alle drei Merkmale entschieden, dass die Ohrform das beste Feature für die Aufteilung ist. Darauf aufbauend erstellen wir einen linken und einen rechten Unterzweig und senden die Teilmengen der Daten mit spitzem oder Floppy-Ohr an linke und rechte Unterzweige. Lassen Sie mich den Wurzelknoten und den rechten Unterzweig behandeln und mich nur auf den linken Unterzweig konzentrieren, in dem wir diese fünf Beispiele haben. Lassen Sie uns sehen, dass das Trennkriterium darin besteht, so lange zu teilen, bis alles im Knoten zu einer einzigen Klasse gehört, also entweder alle Knoten löschen. Wir werden uns diesen Knoten ansehen und sehen, ob er die Teilungskriterien erfüllt, und das tut er nicht, weil es hier eine Mischung aus Katzen und Hunden gibt. Der nächste Schritt besteht darin, ein Feature auszuwählen, auf das aufgeteilt werden soll. Wir gehen dann die Funktionen nacheinander durch und berechnen den Informationsgewinn jedes dieser Merkmale, als ob dieser Knoten der neue Wurzelknoten eines Entscheidungsbaums wäre, der anhand von nur fünf hier gezeigten Trainingsbeispielen trainiert wurde. Wir würden den Informationsgewinn bei der Aufteilung auf das Whiskers-Merkmal und den Informationsgewinn bei der Aufteilung auf das V-förmige Merkmal berechnen. Es stellt sich heraus, dass der Informationsgewinn bei der Aufteilung nach der Ohrform gleich Null ist, da sie alle dieselbe Punktohrform haben. Zwischen Schnurrhaaren und V-Form weist die V-Form den höchsten Informationsgewinn auf. Wir werden in V-Form teilen und das ermöglicht es uns, linke und rechte Unterzweige wie folgt zu erstellen. Für den linken Zweig überprüfen wir die Kriterien, ob wir mit dem Splitten aufhören sollen oder nicht, und wir haben alle Katzen hier. Die Stoppkriterien sind erfüllt und wir erstellen einen Blattknoten, der eine Katzenprognose macht. Für den richtigen Unterzweig stellen wir fest, dass es sich nur um Hunde handelt. Wir werden auch mit dem Teilen aufhören, da wir die Teilungskriterien erfüllt haben, und dort einen Blattknoten platzieren , der keine Katze vorhersagt. Nachdem wir diesen linken Teilbaum erstellt haben, können wir uns nun dem Aufbau des rechten Teilbaums zuwenden. Lassen Sie mich jetzt noch einmal den Wurzelknoten und den gesamten linken Teilbaum abdecken. Um den richtigen Unterbaum zu erstellen, haben wir diese fünf Beispiele hier. Auch hier überprüfen wir zunächst, ob die Kriterien für die Beendigung der Aufteilung erfüllt wurden, ob ihre Kriterien erfüllt sind oder nicht. Alle Beispiele sind eine einzige Klausel, wir haben diese Kriterien nicht erfüllt. Wir werden uns entscheiden, uns auch in diesem rechten Unterzweig weiter aufzuteilen. Tatsächlich wird das Verfahren zum Aufbau des richtigen Unterzweigs fast so sein, als ob Sie einen Entscheidungsbaum-Lernalgorithmus von Grund auf neu trainieren würden, wobei der Datensatz, den Sie haben, nur aus diesen fünf Trainingsbeispielen besteht. Auch hier stellt man bei der Berechnung des Informationsgewinns für alle möglichen Features, auf die aufgeteilt werden kann, fest, dass die Whisker-Funktion den höchsten Informationsgewinn nutzt. Teilen Sie diesen Satz von fünf Beispielen auf, je nachdem, ob Schnurrhaare vorhanden sind oder nicht. Prüfen Sie hier, ob die Kriterien zum Beenden der Aufteilung in den linken und rechten Unterzweigen erfüllt sind, und entscheiden Sie, dass dies der Fall ist. Am Ende haben Sie Blattknoten, die Katze und Hundekatze vorhersagen. Dies ist der Gesamtprozess für die Erstellung des Entscheidungsbaums. Beachten Sie, dass das, was wir getan haben, interessante Aspekte enthält. Nachdem wir entschieden hatten, worauf wir am Stammknoten aufgeteilt werden sollten, haben wir den linken Teilbaum erstellt, indem wir einen Entscheidungsbaum auf einer Teilmenge von fünf Beispielen aufgebaut haben. Die Art und Weise, wie wir den richtigen Teilbaum erstellt haben, bestand wiederum darin, einen Entscheidungsbaum auf einer Teilmenge von fünf Beispielen zu erstellen. In der Informatik ist dies ein Beispiel für einen rekursiven Algorithmus. Das bedeutet lediglich, dass Sie einen Entscheidungsbaum an der Wurzel erstellen, indem Sie weitere kleinere Entscheidungsbäume in den linken und rechten Unterzweigen erstellen. Rekursion bezieht sich in der Informatik auf das Schreiben von Code, der sich selbst aufruft. Das ergibt sich beim Aufbau eines Entscheidungsbaums so, dass Sie den gesamten Entscheidungsbaum erstellen, indem Sie kleinere Unterentscheidungsbäume erstellen und sie dann alle zusammenfügen. Aus diesem Grund werden Sie, wenn Sie sich Softwareimplementierungen von Entscheidungsbäumen ansehen, manchmal Verweise auf einen rekursiven Algorithmus finden. Aber wenn Sie das Gefühl haben, dieses Konzept rekursiver Algorithmen nicht vollständig verstanden zu haben, machen Sie sich darüber keine Sorgen. Sie können die Aufgaben dieser Woche immer noch vollständig erledigen und Bibliotheken verwenden, um Entscheidungsbäume für sich selbst zum Laufen zu bringen. Wenn Sie jedoch einen Entscheidungsbaum-Algorithmus von Grund auf neu implementieren, stellt sich heraus, dass ein rekursiver Algorithmus einer der Schritte ist, die Sie implementieren müssten. Übrigens fragen Sie sich vielleicht, wie Sie den Parameter für die maximale Tiefe auswählen sollen. Es gibt viele verschiedene Möglichkeiten, aber einige der Open-Source-Bibliotheken verfügen über gute Standardoptionen, die Sie verwenden können. Eine Intuition ist, je größer die maximale Tiefe, desto größer der Entscheidungsbaum, den Sie erstellen möchten. Das ist ein bisschen so, als würde man ein Polynom höheren Grades anpassen oder ein größeres neuronales Netzwerk trainieren. Dadurch kann der Entscheidungsbaum ein komplexeres Modell lernen, aber es erhöht auch das Risiko einer Überanpassung, wenn dadurch eine sehr komplexe Funktion an Ihre Daten angepasst wird. Theoretisch könnten Sie die Kreuzvalidierung verwenden, um Parameter wie die maximale Tiefe auszuwählen, wobei Sie verschiedene Werte der maximalen Tiefe ausprobieren und auswählen, was für den Kreuzvalidierungssatz am besten funktioniert. In der Praxis bieten die Open-Source-Bibliotheken jedoch noch etwas bessere Möglichkeiten , diesen Parameter für Sie auszuwählen. Oder ein anderes Kriterium, anhand dessen Sie entscheiden können, wann das Teilen beendet werden soll, ist, ob die aus einer zusätzlichen Spalte gewonnenen Informationen unter einem bestimmten Schwellenwert liegen. Wenn ein Feature geschlitzt wird, nur eine geringe Entropiereduzierung oder einen sehr geringen Informationsgewinn erzielt, können Sie sich auch dafür entscheiden, sich nicht die Mühe zu machen. Schließlich können Sie auch entscheiden, mit dem Teilen zu beginnen , wenn die Anzahl der Beispiele im Knoten unter einem bestimmten Schwellenwert liegt. Das ist der Prozess der Erstellung eines Entscheidungsbaums. Nachdem Sie nun den Entscheidungsbaum gelernt haben, können Sie, wenn Sie eine Vorhersage treffen möchten, dem Verfahren folgen, das Sie im allerersten Video dieser Woche gesehen haben. Sie nehmen ein neues Beispiel, sagen wir ein Testbeispiel, und beginnen eine Route und folgen den Entscheidungen weiter, bis Sie zu Leaf Note gelangen, die dann die Vorhersage macht. Nachdem Sie nun den grundlegenden Algorithmus für das Lernen des Entscheidungsbaums kennen, möchte ich in den nächsten Videos auf einige weitere Verfeinerungen dieses Algorithmus eingehen. Bisher haben wir nur Funktionen verwendet , um zwei mögliche Werte anzunehmen. Aber manchmal gibt es ein Feature, das kategoriale oder diskrete Werte annimmt, aber vielleicht mehr als zwei Werte. Schauen wir uns im nächsten Video an, wie man mit diesem Fall umgeht.
Verwendung der One-Hot-Kodierung kategorialer Merkmale
In dem Beispiel, das wir bisher gesehen haben, könnte jedes der Features nur einen von zwei möglichen Werten annehmen. Die Ohrform war entweder spitz oder schlaff, die Gesichtsform war entweder rund oder nicht rund und Schnurrhaare waren entweder vorhanden oder fehlten. Unabhängig davon, ob Sie Funktionen haben, die mehr als zwei diskrete Werte annehmen können, werden wir uns in diesem Video ansehen, wie Sie One-Hot-Codierung verwenden können , um solche Funktionen zu adressieren. Hier ist ein neues Trainingsset für unsere Anwendung im Adoptionszentrum für Haustiere, bei dem alle Daten bis auf die ohrförmige Funktion identisch sind. Anstatt nur spitz und schlaff zu sein, kann es jetzt auch eine ovale Form annehmen. Das ursprüngliche Merkmal ist also immer noch ein kategoriales Wertmerkmal, aber es kann drei mögliche Werte anstelle von nur zwei möglichen Werten annehmen. Und das bedeutet, dass Sie, wenn Sie sich bei dieser Funktion aufteilen, am Ende drei Teilmengen der Daten und am Ende drei Unterzweige für diesen Baum erstellen. In diesem Video möchte ich jedoch eine andere Art der Adressierung von Funktionen beschreiben , die mehr als zwei Werte annehmen können, nämlich die Verwendung der One-Hot-Codierung. Insbesondere können sie, anstatt ein ohrförmiges Merkmal zu verwenden, einen von drei möglichen Werten annehmen. Wir werden stattdessen drei neue Funktionen erstellen, wobei ein Merkmal darin besteht, ob dieses Tier spitze Ohren hat, ein zweites seine Schlappohren und das dritte, ob es ovale Ohren hat. Also für das erste Beispiel, wo wir früher die Ohrform als spitz hatten, sagen wir jetzt stattdessen, dass dieses Tier einen Wert für das Merkmal „Spitzohr“ von 1 und 0 für Floppy und Oval hat. Während wir zuvor für das zweite Beispiel gesagt haben, dass es ovale Ohren hat, sagen wir jetzt, dass es für spitze Ohren den Wert 0 hat, weil es keine spitzen Ohren hat. Es hat auch keine Schlappohren, aber es hat ovale Ohren, weshalb dieser Wert hier für die restlichen Beispiele im Datensatz 1 ist und so weiter. Anstatt dass ein Feature drei mögliche Werte annimmt, haben wir jetzt drei neue Features entwickelt, von denen jedes nur einen von zwei möglichen Werten annehmen kann, entweder 0 oder 1. Etwas genauer: Wenn ein kategoriales Merkmal k mögliche Werte annehmen kann, k war in unserem Beispiel drei, dann ersetzen wir es, indem wir k binäre Merkmale erstellen, die nur die Werte 0 oder 1 annehmen können. Und Sie stellen fest, dass unter all diesen drei Funktionen, wenn Sie sich eine Rolle hier ansehen, genau 1 der Werte gleich 1 ist. Und das gibt dieser Methode der zukünftigen Konstruktion den Namen One-Hot-Encoding. Und weil eine dieser Funktionen immer den Wert 1 annimmt, ist das die heiße Funktion und daher der Name One-Hot-Encoding. Und mit dieser Auswahl an Funktionen sind wir jetzt wieder bei der ursprünglichen Einstellung, bei der jedes Feature nur einen von zwei möglichen Werten annimmt, sodass der Entscheidungsbaum-Lernalgorithmus, den wir zuvor gesehen haben, ohne weitere Änderungen auf diese Daten angewendet werden. Nebenbei, obwohl sich das Material dieser Woche auf das Training von Entscheidungsbaummodellen konzentriert hat, funktioniert die Idee, One-Hot-Kodierungen zur Codierung kategorialer Merkmale zu verwenden, auch für das Training neuronaler Netzwerke. Insbesondere, wenn Sie das Gesichtsform-Feature nehmen und rund und nicht rund durch 1 und 0 ersetzen würden, wobei rund die Materie 1, nicht die Runde die Materie 0 erhält und so weiter. Und für Schnurrhaare ersetzen Sie in ähnlicher Weise Präsenz durch 1 und Abwesenheit durch 0. Sie haben festgestellt, dass wir alle kategorischen Merkmale, die wir hatten, bei denen wir drei mögliche Werte für die Ohrform, zwei für die Gesichtsform und einen für Schnurrhaare hatten, als Liste dieser fünf Merkmale codiert haben. Drei aus der One-Hot-Kodierung der Ohrform, eins aus der Gesichtsform und aus Schnurrhaaren und jetzt kann diese Liste von fünf Merkmalen auch in ein neues Netzwerk oder in eine logistische Regression eingespeist werden, um zu versuchen, einen Katzenklassifikator zu trainieren. Die One-Hot-Kodierung ist also eine Technik, die nicht nur für das Lernen von Entscheidungsbäumen funktioniert, sondern es Ihnen auch ermöglicht, kategoriale Merkmale mit Einsen und Nullen zu codieren, sodass sie auch als Eingaben in ein neuronales Netzwerk eingespeist werden können, das Zahlen als Eingaben erwartet. Das war’s also, mit einer One-Hot-Codierung können Sie Ihren Entscheidungsbaum für Funktionen verwenden, die mehr als zwei diskrete Werte annehmen können, und Sie können dies auch auf neue Netzwerk- oder lineare Regressions- oder logistische Regressionstrainings anwenden. Aber wie sieht es mit Merkmalen aus, bei denen es sich um Zahlen handelt, die jeden beliebigen Wert annehmen können, nicht nur eine kleine Anzahl diskreter Werte. Sehen wir uns im nächsten Video an, wie Sie den Entscheidungsbaum dazu bringen können, Merkmale mit kontinuierlichen Werten zu verarbeiten, bei denen es sich um eine beliebige Zahl handeln kann.
Kontinuierlich bewertete Merkmale
Schauen wir uns an, wie Sie die Entscheidungsstruktur so ändern können, dass sie mit Funktionen funktioniert, die nicht nur einen Streitwert, sondern einen kontinuierlichen Wert haben. Das sind Funktionen, bei denen es sich um eine beliebige Zahl handeln kann. Lassen Sie uns mit einem Beispiel beginnen: Ich habe das Katzenadoptionszentrum des Datensatzes geändert, um ein weiteres Merkmal hinzuzufügen, nämlich das Gewicht des Tieres. In Pfund im Durchschnitt zwischen Katzen und Hunden sind Katzen etwas leichter als Hunde, obwohl es einige Katzen gibt, die schwerer sind als manche Hunde. Das Gewicht eines Tieres ist jedoch ein nützliches Merkmal, um zu entscheiden, ob es sich um eine Katze handelt oder nicht. Wie bekommt man also einen Entscheidungsbaum, um eine solche Funktion zu verwenden? Der Entscheidungsbaum-Lernalgorithmus wird ähnlich wie zuvor vorgehen, nur dass er nicht nur die Ohrform, die Gesichtsform und die Schnurrhaare einschränkt. Sie müssen nach Ohrform, Gesichtsform, Schnurrhaar oder Gewicht aufgeteilt werden. Und wenn die Aufteilung nach der Gewichtung einen besseren Informationsgewinn bietet als die anderen Optionen. Dann teilen Sie sich die Gewichtsfunktion auf. Aber wie entscheidet man, wie man die Gewichtsfunktion aufteilt? Lass uns einen Blick darauf werfen. Hier ist ein Diagramm der Daten an der Wurzel. Nicht auf der horizontalen Achse dargestellt. Der Weg zum Tier und zur vertikalen Achse ist Katze oben und nicht Katze unten. Die vertikale Achse gibt also die Bezeichnung an, wobei y 1 oder 0 ist. Die Aufteilung der Gewichtungsfunktion wäre, wenn wir die Daten danach aufteilen würden, ob das Gewicht kleiner oder gleich einem bestimmten Wert ist oder nicht. Sagen wir 8 oder ein Teil der Zahl. Das wird die Aufgabe des Lernalgorithmus sein, zu wählen. Und was wir tun sollten, wenn Einschränkungen für das Gewichtungsmerkmal aufgeteilt werden, ist, viele verschiedene Werte dieses Schwellenwerts zu berücksichtigen und dann den besten auszuwählen. Und mit dem Besten meine ich den, der zum besten Informationsgewinn führt. Wenn Sie also erwägen, die Beispiele danach aufzuteilen, ob das Gewicht kleiner oder gleich 8 ist, werden Sie diesen Datensatz in zwei Teilmengen aufteilen. Wobei die Untergruppe auf der linken Seite zwei Katzen und die Untergruppe auf der rechten Seite drei Katzen und fünf Hunde hat. Wenn Sie also unsere übliche Berechnung des Informationsgewinns berechnen würden, berechnen Sie die Entropie am Grundton N C p f 0,5 minus jetzt 2/10 mal Entropie der linken Spalte hat zwei andere zwei Katzen. Es sollte also 2/2 sein plus die rechte Aufteilung hat acht von zehn Beispielen und eine Entropie F. Das sind von den acht Beispielen auf der rechten Seite drei Katzen. Bei Eingabe von 3/8 ergibt sich ein Wert von 0,24. Das wäre also ein Informationsgewinn, wenn Sie aufteilen würden, ob das Gewicht weniger als gleich 8 ist, aber wir sollten auch andere Werte ausprobieren. Was wäre, wenn Sie sich darauf einigen würden, ob das Gewicht kleiner als 9 ist oder nicht , und das entspricht dieser neuen Zeile hier. Und die Berechnung des Informationsgewinns wird H (0,5) minus. Jetzt haben wir also vier Beispiele und links alle Katzen aufgeteilt. Das ist also 4/10 mal Entropie von 4/4 plus sechs Beispiele auf der rechten Seite, von denen Sie eine Katze haben. Das ist also jeweils 6/10 mal 1/6, was 0,61 ergibt. Der Informationsgewinn hier sieht also viel besser aus, der Informationsgewinn von 0,61 ist viel höher als 0,24. Oder wir könnten einen anderen Wert versuchen, sagen wir 13. Und die Berechnung sieht so aus, was 0,40 ist. Im allgemeineren Fall versuchen wir nicht nur drei Werte, sondern mehrere Werte entlang der X-Achse. Und eine Konvention wäre, alle Beispiele nach dem Gewicht oder dem Wert dieser Funktion zu sortieren und alle Werte zu verwenden, die Mittelpunkte zwischen der sortierten Trainingsliste sind. Beispiele für die zu berücksichtigenden Werte für diesen Schwellenwert finden Sie hier. Auf diese Weise testen Sie, wenn Sie 10 Trainingsbeispiele haben, neun verschiedene mögliche Werte für diesen Schwellenwert und versuchen dann, den Wert auszuwählen, der Ihnen den höchsten Informationsgewinn bietet. Und schließlich, wenn der Informationsgewinn aus der Aufteilung anhand eines bestimmten Werts dieses Schwellenwerts besser ist als der Informationsgewinn aus der Aufteilung für ein anderes Feature, dann entscheiden Sie sich dafür, diese Notiz an diesem Feature zu teilen. Und in diesem Beispiel stellt sich heraus, dass ein Informationsgewinn von 0,61 höher ist als der aller anderen Funktionen. Es stellt sich heraus, dass es sich tatsächlich um zwei Schwellenwerte handelt. Angenommen, der Algorithmus wählt dieses Merkmal für die Aufteilung aus, teilen Sie den Datensatz also danach auf, ob das Gewicht des Tieres weniger als 9 Pfund beträgt oder nicht. So erhalten Sie am Ende zwei Teilmengen der Daten und können dann rekursive, zusätzliche Entscheidungsbäume erstellen, indem Sie diese beiden Teilmengen der Daten verwenden, um den Rest des Baums zu erstellen. Um es zusammenzufassen, damit der Entscheidungsbaum bei jeder Note mit kontinuierlichen Wertmerkmalen funktioniert. Wenn Sie Splits verwenden, würden Sie einfach verschiedene Werte für die Aufteilung in Betracht ziehen, die übliche Berechnung des Informationsgewinns durchführen und entscheiden, anhand dieses Features mit kontinuierlichen Werten aufzuteilen, wenn es den größtmöglichen Informationsgewinn bietet. Auf diese Weise bringen Sie also den Entscheidungsbaum dazu, mit Funktionen mit kontinuierlichen Werten zu arbeiten. Probieren Sie verschiedene Schwellenwerte aus, führen Sie die übliche Berechnung des Informationsgewinns durch und teilen Sie das Merkmal mit kontinuierlichem Wert mit dem ausgewählten Schwellenwert auf, wenn Sie damit den bestmöglichen Informationsgewinn aus allen möglichen Merkmalen für die Aufteilung erzielen. Und das war’s für die erforderlichen Videos zum zentralen Entscheidungsbaum-Algorithmus. Danach gibt es ein optionales Video, das Sie sich ansehen können oder nicht, das den Entscheidungsbaum-Lernalgorithmus auf Regressionsbäume verallgemeinert. Bisher haben wir nur über die Verwendung von Entscheidungsbäumen gesprochen, um Vorhersagen zu treffen, bei denen es sich um Klassifizierungen handelt, die eine bestimmte Kategorie vorhersagen, z. B. Katze oder nicht Katze. Aber was ist, wenn Sie ein Regressionsproblem haben, bei dem Sie im nächsten Video eine Zahl vorhersagen möchten? Ich werde über eine Verallgemeinerung von Entscheidungsbäumen sprechen, um damit umzugehen.
Regressionsbäume (optional)
Bisher haben wir nur von Entscheidungsbäumen als Klassifikationsalgorithmen gesprochen. In diesem optionalen Video verallgemeinern wir Entscheidungsbäume als Regressionsalgorithmen, sodass wir eine Zahl vorhersagen können. Lass uns einen Blick darauf werfen. Das Beispiel, das ich für dieses Video verwenden werde, ist die Verwendung dieser drei Funktionen, die wir zuvor hatten, also diese Funktionen X, um das Gewicht des Tieres vorherzusagen, Y. Nur um das klarzustellen, das Gewicht hier ist, anders als im vorherigen Video, kein Eingabemerkmal mehr. Stattdessen ist dies die Zielleistung Y, die wir vorhersagen wollen, anstatt vorherzusagen, ob ein Tier eine Katze ist oder nicht. Dies ist ein Regressionsproblem, weil wir eine Zahl, Y, vorhersagen wollen. Schauen wir uns an, wie ein Regressionsbaum aussehen wird. Hier habe ich bereits einen Baum für dieses Regressionsproblem konstruiert, bei dem sich der Wurzelknoten an der Ohrform und dann der linke und rechte Teilbaum an der Gesichtsform und hier rechts auch an der Gesichtsform teilen. Und an einem Entscheidungsbaum, der sich dafür entscheidet, dasselbe Feature sowohl im linken als auch im rechten Seitenzweig zu teilen, ist nichts falsch. Es ist völlig in Ordnung, wenn der Splitting-Algorithmus sich dafür entscheidet. Wenn du dich während des Trainings für diese Splits entschieden hättest, dann hätte dieser Knoten hier unten diese vier Tiere mit den Gewichten 7,2, 7,6 und 10,2. Dieser Knoten hätte dieses eine Tier mit einem Gewicht von 9,2 usw. für die verbleibenden zwei Knoten. Das Letzte, was wir für diesen Entscheidungsbaum ausfüllen müssen, ist, wenn es ein Testbeispiel gibt, das auf diesen Knoten hinausläuft, welche Gewichte sollten wir für ein Tier mit spitzen Ohren und runder Gesichtsform vorhersagen? Der Entscheidungsbaum wird eine Vorhersage treffen, die auf dem Durchschnitt der Gewichte in den Trainingsbeispielen hier unten basiert. Und wenn Sie den Durchschnitt dieser vier Zahlen berechnen, erhalten Sie 8,35. Wenn andererseits ein Tier spitze Ohren und eine nicht runde Gesichtsform hat, dann sagt es 9,2 oder 9,2 Pfund voraus, weil das das Gewicht dieses einen Tieres hier unten ist. Und in ähnlicher Weise werden dies 17,70 und 9,90 sein. Dieses Modell wird also anhand eines neuen Testbeispiels den Entscheidungsknoten wie gewohnt folgen, bis es zu einem Blattknoten kommt, und dann den Wert am Blattknoten vorhersagen, den ich gerade berechnet hatte, indem ich den Durchschnitt der Gewichte der Tiere genommen habe, die während des Trainings auf denselben Blattknoten heruntergekommen sind. Also, wenn Sie mithilfe dieses Datensatzes einen Entscheidungsbaum von Grund auf neu erstellen würden, um das Gewicht vorherzusagen. Wie ihr Anfang dieser Woche gesehen habt, wird die wichtigste Entscheidung sein: Wie wählt ihr aus, auf welches Feature ihr euch aufteilen wollt? Lassen Sie mich anhand eines Beispiels veranschaulichen, wie Sie diese Entscheidung treffen können. Am Wurzelknoten könntest du zum einen die Ohrform aufteilen und wenn du das tust, hast du am Ende einen linken und rechten Ast des Baumes mit fünf Tieren auf der linken und rechten Seite mit den folgenden Gewichten. Wenn Sie den Spieß auf der Gesichtsform wählen würden, landen Sie links und rechts bei diesen Tieren mit den entsprechenden Gewichten, die unten angegeben sind. Und wenn Sie sich entscheiden würden, ob Schnurrhaare anwesend oder nicht vorhanden sind, würden Sie am Ende genau das tun. Angesichts dieser drei möglichen Merkmale, auf die man sich am Wurzelknoten verteilen kann, stellt sich die Frage, welches das Gewicht des Tieres am besten vorhersagen lässt? Wenn wir einen Regressionsbaum erstellen, versuchen wir nicht, die Entropie zu reduzieren, was das Maß für die Verunreinigung war, das wir für ein Klassifikationsproblem hatten, sondern versuchen stattdessen, die Varianz der Gewichtung der Werte Y in jeder dieser Teilmengen der Daten zu reduzieren. Wenn Sie also den Begriff Varianten in anderen Kontexten gesehen haben, ist das großartig. Dies ist der statistische mathematische Begriff von Varianten, den wir gleich verwenden werden. Aber wenn Sie noch nicht gesehen haben, wie man die Varianz einer Reihe von Zahlen berechnet, machen Sie sich darüber keine Sorgen. Alles, was Sie für diese Folie wissen müssen, ist, dass Varianten informell berechnet, wie stark eine Reihe von Zahlen variiert. Für diesen Satz von Zahlen 7,2, 9,2 usw., bis 10,2, stellt sich heraus, dass die Varianz 1,47 beträgt, sodass sie nicht so stark variiert. Bei 8,8, 15, 11, 18 und 20 reichen diese Zahlen dagegen von 8,8 bis 20. Und so ist die Varianz viel größer, es ergibt sich die Varianz von 21,87. Wir bewerten also die Qualität der Aufteilung so, dass wir wie zuvor berechnen, W links und W rechts als Bruchteil der Beispiele, die in den linken und rechten Zweig gegangen sind. Und die durchschnittliche Varianz nach der Aufteilung wird 5/10 betragen, was W links mal 1,47 ist, was der Varianz auf der linken Seite und dann plus 5/10 mal der Varianz auf der rechten Seite entspricht, was 21,87 ist. Diese gewichtete durchschnittliche Varianz spielt also eine sehr ähnliche Rolle wie die gewichtete durchschnittliche Entropie, die wir bei der Entscheidung verwendet hatten, welche Aufteilung für ein Klassifikationsproblem verwendet werden sollte. Und wir können diese Berechnung dann für die anderen möglichen Features wiederholen, auf die aufgeteilt werden soll. Hier im Baum in der Mitte stellt sich heraus, dass die Varianz dieser Zahlen 27,80 beträgt. Die Varianz ist hier 1,37. Wenn also W links sieben Zehntel und W rechts drei Zehntel entspricht, können Sie mit diesen Werten die gewichtete Varianz wie folgt berechnen. Für das letzte Beispiel schließlich: Wenn Sie bei der Whiskers-Funktion teilen würden, ist dies die Varianz links und rechts, es gibt W links und W rechts. Das Gewicht der Varianz ist also das. Eine gute Möglichkeit, eine Aufteilung zu wählen, wäre, einfach den Wert der gewichteten Varianz zu wählen, der am niedrigsten ist. Ähnlich wie bei der Berechnung des Informationsgewinns werde ich nur eine weitere Änderung an dieser Gleichung vornehmen. Genau wie beim Klassifikationsproblem haben wir nicht nur die durchschnittliche gewichtete Entropie gemessen, wir haben auch die Verringerung der Entropie gemessen, und das war Informationsgewinn. Für einen Regressionsbaum messen wir auf ähnliche Weise auch die Verringerung der Varianz. Wenn Sie sich alle Beispiele im Trainingssatz ansehen, alle zehn Beispiele und die Varianz aller Beispiele berechnen, stellt sich heraus, dass die Varianz aller Beispiele 20,51 beträgt. Und das ist natürlich in all diesen Fällen derselbe Wert für den Roots-Knoten, weil es dieselben zehn Beispiele für den Roots-Knoten sind. Was wir also tatsächlich berechnen, ist die Varianz des Wurzelknotens, die 20,51 minus diesem Ausdruck hier unten ist, was sich als gleich 8,84 herausstellt. Am Wurzelknoten lag die Varianz also bei 20,51, und nach Aufteilung der Ohrform ist die durchschnittliche gewichtete Varianz an diesen beiden Knoten um 8,84 niedriger. Die Verringerung der Varianz beträgt also 8,84. Und wenn Sie in ähnlicher Weise den Ausdruck für die Varianzreduzierung für dieses Beispiel in der Mitte berechnen, ist er 20,51 minus diesem Ausdruck, den wir zuvor hatten, was sich als gleich 0,64 herausstellt. Dies ist also eine sehr geringe Verringerung der Varianz. Und für die Whiskers-Funktion erhalten Sie am Ende diese, die 6,22 ist. Von allen drei Beispielen ergibt 8,84 also die größte Varianzreduzierung. So wie wir zuvor für einen Regressionsbaum das Merkmal auswählen würden, das Ihnen den größten Informationsgewinn bietet, wählen Sie das Merkmal, das Ihnen die größte Varianzreduzierung bietet, weshalb Sie die Ohrform als Merkmal wählen, auf das aufgeteilt werden soll. Nachdem Sie die jahresförmigen Merkmale ausgewählt haben, auf die gespuckt werden soll, haben Sie nun zwei Teilmengen von fünf Beispielen in den linken und rechten Seitenzweigen. Dann würden Sie wiederum, wir sagen rekursiv, wobei Sie diese fünf Beispiele nehmen und einen neuen Entscheidungsbaum erstellen, der sich nur auf diese fünf Beispiele konzentriert , wiederum verschiedene Optionen von Features zum Teilen bewertet und diejenige auswählen, die Ihnen die größte Varianzreduzierung bietet. Und ähnlich auf der rechten Seite. Und du teilst so lange, bis du die Kriterien erfüllst, nach denen du nicht weiter splitten darfst. Und das war’s. Mit dieser Technik können Sie Ihre Entscheidung genießen, nicht nur Klassifikationsprobleme, sondern auch Regressionsprobleme zu lösen. Bisher haben wir darüber gesprochen, wie man einen einzelnen Entscheidungsbaum trainiert. Es stellt sich heraus, dass Sie ein viel besseres Ergebnis erzielen können, wenn Sie viele Entscheidungsbäume trainieren, wir nennen das ein Ensemble von Entscheidungsbäumen. Schauen wir uns im nächsten Video an, warum und wie das geht.
Mehrere Entscheidungsbäume verwenden
Eine der Schwächen bei der Verwendung eines einzelnen Entscheidungsbaums besteht darin , dass dieser Entscheidungsbaum sehr empfindlich auf kleine Änderungen in den Daten reagieren kann. Eine Lösung, um den Pfeil weniger empfindlich oder robuster zu machen, besteht darin, nicht einen Entscheidungsbaum, sondern viele Entscheidungsbäume zu erstellen, und das nennen wir ein Baumensemble. Lass uns einen Blick darauf werfen. In dem Beispiel, das wir verwendet haben, stellte sich heraus, dass das beste Merkmal für die Aufteilung am Wurzelknoten die Ohrform war, was zu diesen beiden Teilmengen der Daten führte und dann weitere Teilbäume auf diesen beiden Teilmengen der Daten aufbaute. Es stellt sich jedoch heraus, dass, wenn Sie nur eines der zehn Beispiele nehmen und es durch eine andere Katze ersetzen, sodass diese neue Katze keine spitzen Ohren, rundes Gesicht und keine Schnurrhaare hat, sondern Schlappohren, rundes Gesicht und Schnurrhaare vorhanden sind. Wenn Sie nur ein einziges Trainingsbeispiel ändern, wird das Merkmal mit dem höchsten Informationsgewinn, auf das aufgeteilt wird, das Merkmal Schnurrhaare anstelle des Ohrformmerkmals. Infolgedessen werden die Teilmengen der Daten, die Sie in den linken und rechten Teilbäumen erhalten, völlig unterschiedlich, und wenn Sie den Entscheidungsbaum-Lernalgorithmus weiterhin rekursiv ausführen, erstellen Sie links und rechts völlig unterschiedliche Teilbäume. Die Tatsache, dass die Änderung nur eines Trainingsbeispiels dazu führt, dass der Algorithmus eine andere Aufteilung an der Wurzel und damit einen völlig anderen Baum erstellt, macht diesen Algorithmus einfach nicht so robust. Deshalb erhalten Sie bei der Verwendung von Entscheidungsbäumen oft ein viel besseres Ergebnis, d. h. Sie erhalten genauere Vorhersagen, wenn Sie nicht nur einen einzelnen Entscheidungsbaum, sondern eine ganze Reihe verschiedener Entscheidungsbäume trainieren. Das nennen wir ein Baumensemble, was einfach eine Sammlung mehrerer Bäume bedeutet. In den nächsten Videos werden wir sehen, wie man dieses Baumensemble baut. Aber wenn Sie dieses Ensemble mit drei Bäumen hätten, ist jeder von ihnen vielleicht eine plausible Methode, um Katze und Nichtkatze zu klassifizieren. Wenn Sie ein neues Testbeispiel hätten , das Sie klassifizieren möchten, würden Sie alle drei dieser Bäume für Ihr neues Beispiel ausführen und sie dazu bringen, darüber abzustimmen, ob es sich um die endgültige Vorhersage handelt. Dieses Testbeispiel hat spitze Ohren, eine nicht runde Gesichtsform und Schnurrhaare sind vorhanden, sodass der erste Baum solche Schlüsse ziehen und vorhersagen würde, dass es sich um eine Katze handelt. Die Folgerung des zweiten Baums würde diesem Pfad durch den Baum folgen und somit vorhersagen, dass es sich nicht um eine Katze handelt. Der dritte Baum würde diesem Weg folgen und daher vorhersagen, dass es sich um eine Katze handelt. Diese drei Bäume haben unterschiedliche Vorhersagen getroffen, und was wir tun werden, ist, sie tatsächlich zur Wahl zu bringen. Die Mehrheit der Vorhersagen unter diesen drei Bäumen lautet: Katze. Die endgültige Vorhersage dieses Baumensembles lautet, dass es sich um eine Katze handelt, was zufällig die richtige Vorhersage ist. Der Grund, warum wir ein Ensemble von Bäumen verwenden, liegt darin , dass wir viele Entscheidungsbäume haben und sie abstimmen lassen. Dadurch wird Ihr Gesamtalgorithmus weniger empfindlich darauf, was ein einzelner Baum tun könnte, weil er nur eine von drei oder eine Stimme von vielen, vielen verschiedenen Stimmen erhält und Ihr Gesamtalgorithmus robuster wird. Aber wie kommen Sie auf all diese verschiedenen plausiblen, aber vielleicht etwas unterschiedlichen Entscheidungsbäume, um sie zur Abstimmung zu bringen? Im nächsten Video werden wir über eine Technik aus der Statistik sprechen, die Sampling with Replacement genannt wird. Dies wird sich als eine Schlüsseltechnik herausstellen, die wir im folgenden Video verwenden werden, um dieses Ensemble von Bäumen zu bauen. Gehen wir zum nächsten Video über, um über Probenahme mit Ersatz zu sprechen.
Stichproben mit Ersatz
Um ein Baumensemble zu erstellen, benötigen wir eine Technik namens Sampling with Replacement. Schauen wir uns an, was das bedeutet. Um zu veranschaulichen, wie die Probenentnahme mit Ersatz funktioniert, zeige ich Ihnen eine Demonstration der Probenentnahme mit Ersatz anhand von vier rot, gelb, grün und blau gefärbten Token. Ich habe hier tatsächlich vier Farbmarken dabei, rot, gelb, grün und blau. Ich werde zeigen, wie die Probenahme mit Ersatz aussieht, wenn sie verwendet werden. Hier ist ein schwarzer Samtbeutel, leer. Ich nehme dieses Beispiel mit vier Tokens und lege sie ein. Ich werde viermal mit Ersatz aus diesem Beutel probieren. Was das heißt, ich werde es aufmischen und kann nicht sehen, wenn ich einen Stein pflücke, der sich als grün herausstellt. Der Begriff mit Ersatz bedeutet, dass , wenn ich die nächste Münze herausnehme, diese nehme und sie wieder hineinlege, sie erneut schüttele und dann eine andere, gelbe, nehme. Ersetze es. Das ist ein kleines Ersatzteil. Dann geh nochmal, tausche es wieder blau aus und wähle dann noch eins aus, das wieder blau ist. Die Sequenz von Tokens, die ich bekommen habe , war grün, gelb, blau, blau. Beachten Sie, dass ich zweimal blau und kein einziges Mal rot wurde. Wenn Sie diese Probenentnahme mit Ersatzverfahren mehrmals wiederholen, erhalten Sie möglicherweise Rot, Gelb, Rot, Grün oder Grün, Grün, Blau, Rot. Oder vielleicht bekommst du auch Rot, Blau, Gelb, Grün. Beachten Sie, dass der Teil mit Ersatz von entscheidender Bedeutung ist, denn wenn ich nicht jedes Mal, wenn ich eine Probe verwende, eine Münze aus meinem Viererbeutel einfüllen würde, erhalte ich immer dieselben vier Jetons. Deshalb ist es wichtig, einen Token zu ersetzen, nachdem ich ihn jedes Mal herausgezogen habe, um sicherzustellen, dass ich nicht jedes Mal dieselben vier Token erhalte. Für den Bau eines Ensembles von Bäumen gilt die folgende Art und Weise, wie Probenahme mit Ersatz angewendet wird. Wir werden mehrere zufällige Trainingssets erstellen , die sich alle geringfügig von unserem ursprünglichen Trainingssatz unterscheiden. Insbesondere werden wir unsere 10 Beispiele für Katzen und Hunde nehmen. Wir packen die 10 Trainingsbeispiele in eine theoretische Tasche. Bitte stecken Sie keine echte Katze oder keinen echten Hund in eine Tasche. Das klingt unmenschlich, aber Sie können ein Trainingsbeispiel nehmen und es in eine theoretische Tasche stecken, wenn Sie möchten. Ich verwende diese theoretische Tasche, wir werden einen neuen zufälligen Trainingssatz mit 10 Beispielen erstellen, die genau dieselbe Größe wie der ursprüngliche Datensatz haben. Dazu greifen wir zu einem zufälligen Trainingsbeispiel und suchen es aus. Nehmen wir an, wir erhalten dieses Trainingsbeispiel. Dann legen wir es wieder in die Tasche und suchen uns dann wieder zufällig ein Trainingsbeispiel aus und das bekommst du. Du wählst immer wieder und wieder. Beachten Sie, dass dieses fünfte Trainingsbeispiel mit dem zweiten identisch ist, das wir da draußen hatten. Aber das ist in Ordnung. Du machst weiter und weiter, und wir bekommen ein weiteres, das Beispiel wiederholt und so weiter und so fort. Bis Sie schließlich bei 10 Trainingsbeispielen landen, von denen einige Wiederholungen sind. Sie stellen auch fest, dass dieses Trainingsset nicht alle 10 Original-Trainingsbeispiele enthält, aber das ist okay. Das ist Teil des Verfahrens zur Probenahme mit Austausch. Durch den Prozess der Probennahme mit Austausch können Sie ein neues Trainingsset zusammenstellen , das Ihrem ursprünglichen Trainingsset ein wenig ähnelt, sich aber auch stark von ihm unterscheidet. Es stellt sich heraus, dass dies der wichtigste Baustein für den Bau eines Baumensembles wäre. Schauen wir uns im nächsten Video an, wie Sie das machen könnten.
Random Forest Algorithmus
Jetzt haben wir die Möglichkeit, etwas mit Ersatzmaterial zu verwenden, um neue Trainingssets zu erstellen, die dem ursprünglichen Trainingssatz ein bisschen ähnlich sind, sich aber auch deutlich von ihm unterscheiden. Wir sind bereit, unseren ersten Baumensemble-Algorithmus zu erstellen. In diesem Video werden wir insbesondere über den Random-Forest-Algorithmus sprechen, einen leistungsstarken Tree-on-Sample-Algorithmus, der viel besser funktioniert als die Verwendung eines einzelnen Entscheidungsbaums. So können wir ein Ensemble von Bäumen erzeugen. Wenn Sie einen Trainingssatz der Größe M erhalten, dann entspricht für B 1 dem Großbuchstaben b, also machen wir diesen Großbuchstaben B mal. Sie können etwas mit Ersatz verwenden, um einen neuen Trainingssatz der Größe M zu erstellen. Wenn Sie also 10 Trainingsbeispiele haben, legen Sie die 10 Trainingsbeispiele in diese virtuelle Tasche und die Stichprobe 10 Mal, um einen neuen Trainingssatz mit ebenfalls 10 Beispielen zu erstellen, und dann würden Sie einen Entscheidungsbaum mit diesem Datensatz trainieren. Also hier ist der Datensatz, den ich mit etwas mit Ersatz generiert habe. Wenn Sie genau hinschauen, stellen Sie möglicherweise fest, dass einige der Trainingsbeispiele wiederholt werden, und das ist in Ordnung. Und wenn Sie die Entscheidung anhand dieser Daten trainieren, erhalten Sie am Ende diesen Entscheidungsbaum. Und wenn wir das einmal gemacht haben, würden wir es ein zweites Mal wiederholen. Verwenden Sie etwas mit Ersatz, um einen weiteren Trainingssatz mit M oder 10 Trainingsbeispielen zu erstellen. Das sieht wieder ein bisschen wie das ursprüngliche Trainingsset aus, ist aber auch ein bisschen anders. Dann trainierst du den Entscheidungsbaum mit diesem neuen Datensatz und am Ende hast du einen etwas anderen Entscheidungsbaum. Und so weiter. Und das kannst du insgesamt mit Großbuchstaben B machen. Typische Wahl von Großbuchstabe B Die Anzahl solcher Bäume, die Sie gebaut haben, könnte bei etwa 100 liegen, die Leute empfehlen einen beliebigen Wert von sagen wir 64, 228. Und wenn Sie ein Ensemble aus beispielsweise 100 verschiedenen Bäumen erstellt haben, würden Sie, wenn Sie versuchen, eine Vorhersage zu treffen, diese Bäume alle Stimmen für die richtige endgültige Vorhersage erhalten. Es stellt sich heraus, dass ein höheres Kapital B nie der Performance schadet, aber ab einem bestimmten Punkt werden die Renditen sinken, und es wird nicht wirklich viel besser, wenn B viel größer als beispielsweise 100 oder so ist. Und deshalb verwende ich niemals, sagen wir, 1000 Bäume, die die Berechnung nur erheblich verlangsamen, ohne die Leistung des gesamten Algorithmus signifikant zu erhöhen. Nur um diesem Album einen Namen zu geben. Diese spezifische Instanzerstellung eines Baumensembles wird manchmal auch als Entscheidungsbaum mit Baggs bezeichnet. Und das bezieht sich darauf, Ihre Trainingsbeispiele in diese virtuelle Tasche zu legen. Und deshalb verwenden wir hier auch das kleine B und das große B, weil das für Tasche steht. Es gibt eine Modifikation an diesem Album, durch die es sogar noch viel besser funktioniert und die diesen Algorithmus, den Rückentscheidungsbaum, in den Random-Forest-Algorithmus umwandelt. Die Grundidee ist, dass selbst bei diesem Sampling-Verfahren mit Ersetzung manchmal immer derselbe Split am Wurzelknoten und sehr ähnliche Splits in der Nähe des Grundtons verwendet werden. Das ist in diesem speziellen Beispiel nicht passiert, bei dem eine kleine Änderung der Trainings zu einer anderen Aufteilung im Grundton führte. Bei anderen Trainingssätzen ist es jedoch nicht ungewöhnlich, dass Sie bei vielen oder sogar allen großen B-Trainingssätzen am Wurzelknoten und bei einigen Noten in der Nähe des Grundtons dieselbe Featureauswahl haben. Es gibt also eine Modifikation am Algorithmus, um weiter zu versuchen, die Feature-Auswahl bei jeder Note nach dem Zufallsprinzip zu bestimmen, was dazu führen kann, dass die Baumgruppe entsteht und Sie lernen, sich stärker voneinander zu unterscheiden. Wenn Sie sie also wählen, erhalten Sie am Ende eine noch genauere Vorhersage. Dies geschieht in der Regel bei jeder Notiz, wenn ein Feature ausgewählt wird, das zum Aufschneiden verwendet werden soll, wenn Endmerkmale verfügbar sind. In unserem Beispiel waren also drei Funktionen verfügbar, anstatt aus allen Endfunktionen auszuwählen, sondern wir wählen stattdessen eine zufällige Teilmenge von K weniger als N Merkmalen aus. Und erlauben Sie dem Algorithmus, nur aus dieser Teilmenge von K-Merkmalen auszuwählen. Mit anderen Worten, Sie würden K Merkmale als zulässige Merkmale auswählen und dann aus diesen K Merkmalen dasjenige mit dem höchsten Informationsgewinn als die Wahl des Merkmals auswählen, das die Aufteilung verwenden soll. Wenn N groß ist, sagen wir, n ist Dutzende oder Zehner oder sogar Hunderte. Eine typische Wahl für den Wert von K wäre, ihn als Quadratwurzel von N zu wählen. In unserem Beispiel haben wir nur drei Merkmale und diese Technik wird eher für größere Probleme mit einer größeren Anzahl von Merkmalen verwendet. Und wenn Sie den Algorithmus einfach weiter ändern, erhalten Sie den Random-Forest-Algorithmus, der normalerweise viel besser funktioniert und viel robuster wird als nur ein einziger Entscheidungsbaum. Eine Möglichkeit, darüber nachzudenken, warum dies robuster ist als ein einzelner Entscheidungsbaum, besteht darin, dass der Algorithmus mit dem Ersetzungsverfahren bereits viele kleine Änderungen an den Daten untersucht und verschiedene Entscheidungsbäume trainiert und den Durchschnitt über all die Änderungen an den Daten berechnet, die das Etwas mit dem Ersetzungsverfahren verursacht. Das bedeutet also, dass jede noch so kleine Änderung am Trainingssatz die Wahrscheinlichkeit verringert, dass sich dies auf die Gesamtleistung des gesamten Random-Forest-Algorithmus auswirkt. Weil es bereits erforscht wurde und aus vielen kleinen Änderungen am Trainingssatz der Durchschnitt berechnet wird. Bevor ich dieses Video abschließe, gibt es noch einen weiteren Gedanken, den ich teilen möchte. Also, wo campt ein Ingenieur für maschinelles Lernen? In einem zufälligen Wald. Alles klar. Geh und erzähl diesen Witz deinen Freunden. Ich hoffe es gefällt euch. Der Random Forest ist ein effektiver Raum und ich hoffe, Sie nutzen ihn besser für Ihre Arbeit. Jenseits des zufälligen Waldes Es stellt sich heraus, dass es einen anderen Algorithmus gibt, der noch besser funktioniert. Welches ist ein verbesserter Entscheidungsbaum. Lassen Sie uns im nächsten Video über einen verstärkten Entscheidungsbaum-Algorithmus namens X G Boost sprechen.
XGBoost
Im Laufe der Jahre haben Forscher des maschinellen Lernens viele verschiedene Methoden entwickelt, um Entscheidungsbäume und Entscheidungsbäume anhand von Stichproben zu erstellen. Die heute mit Abstand am häufigsten verwendete Methode zur Implementierung von Entscheidungsbaum-Ensembles oder Entscheidungsbäumen ist ein Album namens XGBoost. Es läuft schnell, die Open-Source-Implementierungen sind einfach zu verwenden und wurde auch sehr erfolgreich eingesetzt, um viele Wettbewerbe für maschinelles Lernen sowie in vielen kommerziellen Anwendungen zu gewinnen. Schauen wir uns an, wie XGBoost funktioniert. Der Back-Decision-Tree-Algorithmus, den wir im letzten Video gesehen haben, wurde modifiziert, wodurch er viel besser funktioniert. Hier ist wieder das Album, das wir zuvor aufgeschrieben hatten. Angesichts des Trainingssatzes, um sie zu dimensionieren, wiederholen Sie B-mal, verwenden etwas mit Ersatz, um einen neuen Trainingssatz der Größe M zu erstellen, und trainieren dann den Entscheidungsbaum mit dem neuen Datensatz. Beim ersten Durchlaufen dieser Schleife können wir also ein solches Trainingssatz erstellen und einen Entscheidungsbaum wie diesen trainieren. Aber hier werden wir den Algorithmus ändern, der jedes Mal diese Schleife durchläuft, außer beim ersten Mal, das ist das zweite Mal, das ist das dritte Mal und so weiter. Anstatt aus allen m Beispielen gleicher Wahrscheinlichkeit mit einer Wahrscheinlichkeit von eins über m zu wählen, sollten wir die Wahrscheinlichkeit erhöhen, dass wir falsch klassifizierte Beispiele auswählen, bei denen die zuvor trainierten Bäume schlecht abschneiden. In der Aus- und Weiterbildung gibt es eine Idee, die als bewusste Praxis bezeichnet wird. Zum Beispiel, wenn Sie Klavier spielen lernen und versuchen, ein Stück auf dem Klavier zu beherrschen, anstatt das gesamte, sagen wir fünfminütige Stück immer wieder zu üben, was ziemlich zeitaufwändig ist. Wenn du stattdessen das Stück spielst und deine Aufmerksamkeit dann nur auf die Teile des Stücks konzentrierst, die du in der Praxis noch nicht so gut spielst, diese kleineren Teile immer und immer wieder. Dann stellt sich heraus, dass dies eine effizientere Methode für Sie ist, gut Klavier spielen zu lernen. Und so ist diese Idee des Boostens ähnlich. Wir werden uns die Entscheidungsbäume ansehen, die wir bisher trainiert haben, und schauen uns an, worin wir immer noch nicht gut abschneiden. Und dann werden wir beim Aufbau des nächsten Entscheidungsbaums mehr Aufmerksamkeit auf die Beispiele richten, bei denen wir noch nicht gut abschneiden. Anstatt uns also alle Trainingsbeispiele anzusehen, konzentrieren wir uns mehr auf die Teilmenge der Beispiele, bei denen es noch nicht gut läuft, und holen uns den neuen Entscheidungsbaum, das nächste Entscheidungsbaum-Berichtsensemble, das versucht, bei ihnen gut abzuschneiden. Und das ist die Idee hinter Boosting und es stellt sich heraus, dass es dem Lernalgorithmus hilft, schneller zu lernen, besser zu werden. Also werden wir uns diesen Baum, den wir gerade gebaut haben, im Detail ansehen und zum ursprünglichen Trainingsset zurückkehren. Beachten Sie, dass dies das Original-Trainingssatz ist und nicht eines, das durch einen Ersatz generiert wurde. Und wir werden alle zehn Beispiele durchgehen und uns ansehen, was dieser erlernte Entscheidungsbaum für alle zehn Beispiele vorhersagt. Diese viertgrößte Spalte enthält also ihre Vorhersagen und neben jedem Beispiel wird ein Häkchen gesetzt, je nachdem, ob die Baumklassifizierung korrekt oder falsch war. Was wir also beim zweiten Durchlauf dieser Schleife tun werden, ist, etwas mit Ersatz zu verwenden, um einen weiteren Trainingssatz mit zehn Beispielen zu generieren. Aber jedes Mal, wenn wir ein Beispiel aus diesen zehn auswählen, steigt die Wahrscheinlichkeit, eines der drei Beispiele auszuwählen, die immer noch falsch klassifiziert wurden. Und so konzentriert sich die Aufmerksamkeit des zweiten Entscheidungsbaums über einen Prozess wie bewusstes Üben auf die Beispiele, dass das Album immer noch nicht so gut abschneidet. Und das Boosting-Verfahren macht das insgesamt B-mal, wobei man sich bei jeder Iteration anschaut, worin das Ensemble der Bäume 1, 2 bis (b-1) noch nicht so gut abschneidet. Und wenn Sie Baum Nummer b bauen, haben Sie eine höhere Wahrscheinlichkeit, Beispiele auszuwählen, bei denen das Ensemble der vorherigen Musterbäume noch nicht gut abschneidet. Die mathematischen Details, um wie viel die Wahrscheinlichkeit erhöht werden muss , dieses Beispiel im Vergleich zu dem Beispiel auszuwählen, sind ziemlich komplex, aber Sie müssen sich keine Gedanken darüber machen, um Rostbaumimplementierungen zu verwenden. Und von den verschiedenen Arten, Boosting zu implementieren, ist XGBoost, die heute am weitesten verbreitete ist XGBoost, was für Extreme Gradient Boosting steht, eine Open-Source-Implementierung von Boosted Trees, die sehr schnell und effizient ist. XGBoost bietet auch eine gute Auswahl an Standard-Splitting-Kriterien und Kriterien, wann das Splitten beendet werden soll. Und eine der Neuerungen in XGBoost ist, dass es auch eine Regularisierung eingebaut hat, um eine Überanpassung zu verhindern, und in Wettbewerben für maschinelles Lernen, wie es eine weit verbreitete Wettbewerbsseite namens Kaggle tut. XGBoost ist oft ein hart umkämpfter Algorithmus. Tatsächlich scheinen XGBoost- und Deep-Learning-Algorithmen die beiden Arten von Algorithmen zu sein, die viele dieser Wettbewerbe gewinnen. Und ein technischer Hinweis, anstatt etwas mit Ersatz-XGBoost zu tun, weist verschiedenen Trainingsbeispielen tatsächlich unterschiedliche Wege zu. Es müssen also nicht wirklich viele zufällig ausgewählte Trainingssätze generiert werden, und das macht es sogar ein bisschen effizienter als die Verwendung eines Samplings mit Ersatzverfahren. Aber die Intuition, die Sie auf der vorherigen Folie gesehen haben, ist immer noch richtig, wenn es darum geht, wie XGBoost Beispiele auswählt, auf die Sie sich konzentrieren möchten. Die Details von XGBoost sind ziemlich komplex zu implementieren, weshalb viele Praktiker die Open-Source-Bibliotheken verwenden, die XGBoost implementieren. Dies ist alles, was Sie tun müssen, um XGBoost zu verwenden. Sie importieren die XGBoost-Bibliothek wie folgt und initialisieren ein Modell als XGBoost-Klassifikator. Weiteres Modell und dann endlich können Sie mit diesem Boosted Decision Trees-Algorithmus Vorhersagen treffen. Ich hoffe, dass Sie diesen Algorithmus für viele Anwendungen nützlich finden, die Sie in Zukunft entwickeln werden. Oder alternativ, wenn Sie XGBoost eher für die Regression als für die Klassifizierung verwenden möchten, dann wird diese Zeile hier einfach zu xgbRegressor und der Rest des Codes funktioniert ähnlich. Das war’s also mit dem XGBoost-Algorithmus. Wir haben nur ein letztes Video für diese Woche und für diesen Kurs, in dem wir abschließen und auch darüber sprechen, wann Sie einen Entscheidungsbaum verwenden sollten und wann Sie vielleicht das neuronale Netzwerk verwenden sollten. Gehen wir zum letzten und letzten Video dieser Woche über.
Wann Sie Entscheidungsbäume verwenden sollten
Sowohl Entscheidungsbäume, einschließlich Baumensembles, als auch neuronale Netze sind sehr leistungsfähige, sehr effektive Lernalgorithmen. Wann solltest du das eine oder das andere wählen? Schauen wir uns einige der Vor- und Nachteile der einzelnen Optionen an. Entscheidungsbäume und Baumensembles eignen sich häufig gut für tabellarische Daten, die auch als strukturierte Daten bezeichnet werden. Das heißt, wenn Ihr Datensatz wie eine riesige Tabelle aussieht, wären Entscheidungsbäume eine Überlegung wert. In der Anwendung zur Vorhersage der Immobilienpreise hatten wir beispielsweise einen Datensatz mit Merkmalen , die der Größe des Hauses, der Anzahl der Schlafzimmer, der Anzahl der Stockwerke und dem Alter zu Hause entsprachen. Diese Art von Daten, die in einer Tabelle mit kategorischen oder kontinuierlich bewerteten Merkmalen gespeichert werden, und zwar sowohl für die Klassifizierung als auch für Regressionsaufgaben, bei denen Sie versuchen, eine diskrete Kategorie oder eine Zahl vorherzusagen. Bei all diesen Problemen können Entscheidungsbäume gut abschneiden. Im Gegensatz dazu empfehle ich nicht, Entscheidungsbäume und Baumensembles für unstrukturierte Daten zu verwenden. Das sind Daten wie Bilder, Video, Audio und Texte, die Sie mit geringerer Wahrscheinlichkeit in einem Tabellenkalkulationsformat speichern. Neuronale Netzwerke werden, wie wir gleich sehen werden, für unstrukturierte Datenaufgaben tendenziell besser funktionieren. Ein großer Vorteil von Entscheidungsbäumen und Baumensembles ist, dass sie sehr schnell trainiert werden können. Sie erinnern sich vielleicht an dieses Diagramm aus der Vorwoche , in dem wir über die iterative Schleife der Entwicklung des maschinellen Lernens gesprochen haben. Wenn das Training Ihres Modells viele Stunden dauert , begrenzt dies die Geschwindigkeit, mit der Sie diese Schleife durchlaufen und die Leistung Ihres Algorithmus verbessern können. Aber weil Entscheidungsbäume, einschließlich Baumensembles, in der Regel ziemlich schnell zu trainieren sind , können Sie schneller zu dieser Schleife wechseln und möglicherweise die Leistung Ihres Lernalgorithmus effizienter verbessern. Schließlich sind kleine Entscheidungsbäume vielleicht für Menschen interpretierbar. Wenn Sie nur einen einzelnen Entscheidungsbaum trainieren und dieser Entscheidungsbaum nur ein paar Dutzend Notizen enthält, können Sie möglicherweise einen Entscheidungsbaum ausdrucken, um genau zu verstehen, wie Entscheidungen getroffen werden. Ich denke, dass die Interpretierbarkeit von Entscheidungsbäumen manchmal etwas übertrieben ist, denn wenn Sie ein Ensemble aus 100 Bäumen erstellen und jeder dieser Bäume Hunderte von Knoten hat, wird es schwierig, sich dieses Ensemble anzusehen, um herauszufinden, was es tut, und möglicherweise sind einige separate Visualisierungstechniken erforderlich. Aber wenn Sie einen kleinen Entscheidungsbaum haben, können Sie ihn sich ansehen und sehen, oh, er klassifiziert, ob etwas ein Schnitt ist, indem Sie bestimmte Merkmale auf bestimmte Weise betrachten. Wenn Sie sich für einen Entscheidungsbaum oder ein Baumensemble entschieden haben, würde ich XGBoost wahrscheinlich für die meisten Anwendungen verwenden, an denen ich arbeiten werde. Ein kleiner Nachteil eines Baumensembles ist, dass es etwas teurer ist als ein einzelner Entscheidungsbaum. Wenn Sie ein sehr begrenztes Rechenbudget hätten, könnten Sie einen einzelnen Entscheidungsbaum verwenden, aber abgesehen von dieser Einstellung würde ich fast immer ein Baumensemble verwenden und insbesondere XGBoost verwenden. Wie steht es mit neuronalen Netzwerken? Im Gegensatz zu Entscheidungsbäumen und Baumensembles eignet es sich gut für alle Arten von Daten, einschließlich tabellarischer oder strukturierter Daten sowie unstrukturierter Daten. Sowie gemischte Daten, die sowohl strukturierte als auch unstrukturierte Komponenten enthalten. Während neuronale Netzwerke und Entscheidungsbäume bei tabellarischen strukturierten Daten wie Bildern, Video, Audio und Text oft beide miteinander konkurrieren, ist ein neuronales Netzwerk wirklich der bevorzugte Algorithmus und nicht der Entscheidungsbaum oder ein Baumensemble. Auf der anderen Seite können neuronale Netzwerke jedoch langsamer sein als ein Entscheidungsbaum. Das Training eines großen neuronalen Netzwerks kann einfach lange dauern. Zu den weiteren Vorteilen neuronaler Netze gehört, dass sie mit Transferlernen funktionieren, und das ist wirklich wichtig, da wir für viele Anwendungen nur einen kleinen Datensatz haben, der Transferlernen nutzen und Vortraining mit einem viel größeren Datensatz durchführen kann, was für die Wettbewerbsfähigkeit von entscheidender Bedeutung ist. Wenn Sie schließlich ein System mit mehreren Modellen für maschinelles Lernen erstellen, die zusammenarbeiten, ist es möglicherweise einfacher, mehrere neuronale Netzwerke miteinander zu verknüpfen und zu trainieren als mehrere Entscheidungsbäume. Die Gründe dafür sind ziemlich technisch und Sie müssen sich für diesen Kurs keine Gedanken darüber machen. Aber es bezieht sich darauf, dass selbst wenn Sie mehrere neuronale Netzwerke miteinander verbinden, Sie sie alle mithilfe des Gradientenabstiegs trainieren können. Bei Entscheidungsbäumen können Sie jedoch jeweils nur einen Entscheidungsbaum trainieren. Das ist alles. Sie haben das Ende der Videos für diesen Kurs über fortgeschrittene Lernalgorithmen erreicht. Danke, dass du so lange bei mir geblieben bist und herzlichen Glückwunsch, dass du das Ende der Videos über fortgeschrittene Lernalgorithmen erreicht hast. Sie haben jetzt gelernt, wie Sie sowohl neuronale Netze als auch Entscheidungsbäume erstellen und verwenden, und Sie haben auch von einer Vielzahl von Tipps und praktischen Ratschlägen gehört, wie Sie diese Algorithmen für Sie optimal nutzen können. Aber selbst wenn all das, was Sie über überwachtes Lernen gesehen haben, ist das nur ein Teil dessen, was Lernalgorithmen können. Für überwachtes Lernen benötigen Sie beschriftete Datensätze mit der Bezeichnung Y auf Ihrem Trainingssatz. Es gibt noch einen weiteren Satz sehr leistungsfähiger Algorithmen, sogenannte Algorithmen für unüberwachtes Lernen, bei denen Sie nicht einmal die Bezeichnungen Y benötigen, damit der Algorithmus sehr interessante Muster herausfinden und Dinge mit den vorhandenen Daten tun kann. Ich freue mich darauf, Sie auch im dritten und letzten Kurs dieser Spezialisierung zu sehen, der sich mit unbeaufsichtigtem Lernen befassen sollte. Bevor Sie diesen Kurs beenden, hoffe ich, dass Sie auch Spaß daran haben, die Ideen von Entscheidungsbäumen in ihren Übungsquiz und in ihren Übungslabors zu üben. Ich wünsche Ihnen viel Glück in den Übungslabors oder denjenigen unter Ihnen, die vielleicht Star Wars-Fans sind, lassen Sie mich sagen, möge der Wald mit Ihnen sein.
Andrew Ng und Chris Manning über natürliche Sprachverarbeitung
[MUSIK] Hallo, ich freue mich sehr, mit meinem alten Freund und Mitarbeiter Professor Chris Manning hier zu sein. Chris hat eine sehr lange und beeindruckende Biographie, aber nur kurz gesagt, er ist Professor für Informatik an der Stanford University und auch Direktor des Stanford KI-Labors. Und er hat auch die Auszeichnung, der am häufigsten zitierte Forscher im Bereich NLP oder Natural Language Processing zu sein. Also, wirklich schön, hier bei dir zu sein, Chris. >> Gut, die Gelegenheit zu haben, mit Andrew zu chatten. >> Wir kennen uns also seit vielen Jahren und ein interessanter Teil Ihres Hintergrunds, den ich immer dachte, war, dass Sie heute zwar ein angesehener Forscher für maschinelles Lernen im NLP sind, aber tatsächlich in einem ganz anderen Bereich angefangen haben. Wenn ich mich recht erinnere, haben Sie in Linguistik promoviert und Sie haben die Syntax der Sprache studiert. Wie sind Sie also vom Syntaxstudium zum NLP-Forscher geworden? >> Davon kann ich Ihnen sicherlich erzählen, aber ich sollte auch darauf hinweisen, dass ich eigentlich immer noch Professor für Linguistik bin. Ich habe einen gemeinsamen Termin in Stanford. Und alle Jubeljahre, nicht sehr oft, unterrichte ich tatsächlich immer noch echte Linguistik sowie computergestützte natürliche Sprachverarbeitung. Zu Beginn interessierte ich mich sehr für menschliche Sprachen und wie sie funktionieren, wie Menschen sie verstehen, wie sie erfragt werden, erworben werden. Ich hatte also diese Art von Appell, ich habe diesen Appell in menschlichen Sprachen gesehen. Aber das hat mich auch dazu gebracht, über Ideen nachzudenken, die wir heute eher als maschinelles Lernen oder rechnergestützte Ideen betrachten. Zwei der zentralen Ideen der menschlichen Sprache: Wie erwerben kleine Kinder die menschliche Sprache? Und für Erwachsene, naja, wir reden gerade miteinander und wir verstehen uns ziemlich gut. Und das ist wirklich erstaunlich, wie wir das schaffen. Welche Art der Verarbeitung ermöglicht das also? Und das hat mich schon früh dafür interessiert, mich mit maschinellem Lernen zu befassen. Tatsächlich habe ich, noch bevor ich es auf die Graduiertenschule geschafft hatte, kleine Schritte gemacht und aus diesen Interessen heraus maschinelles Lernen gelernt. >> Dass die gesamte menschliche Sprache gelernt hat, wir hatten irgendwann im Leben gelernt, Englisch zu sprechen und wir sind an einem anderen Ort aufgewachsen, wir hätten eine völlig andere Sprache gelernt. Es ist unglaublich, sich vorzustellen, wie Menschen das machen und jetzt vielleicht auch Maschinen Sprache lernen. Aber erzähle uns einfach mehr über deine Reise. Sie hatten also einen Doktortitel in Linguistik und wie haben Sie es dann gemacht? >> Davor gibt es also auch einige Dinge. Also ich meine, als ich Student war, naja, offiziell habe ich tatsächlich drei Hauptfächer gemacht. Dies war in Australien, einer in Mathematik, einer in Informatik und einer in Linguistik. Jetzt bekommen die Leute ein leicht übertriebenes Gefühl dafür, was das bedeutet, wenn man in einem amerikanischen Kontext ist, weil es meiner Meinung nach unmöglich wäre, drei Hauptfächer zu absolvieren, den Bachelor in Stanford. Aber wo ich als Student war, habe ich ein Kunststudium gemacht, damit ich machen konnte, was ich wollte, zum Beispiel Linguistik. Man musste zwei Hauptfächer machen, um das Kunststudium abzuschließen. Es war also eher ein Doppelstudium, vielleicht in US-amerikanischer Hinsicht. >> Sie wissen das wahrscheinlich nicht über mich, aber Mellon, ich hatte tatsächlich ein Dreifachstudium, das war einmal in Statistik und Wirtschaftswissenschaften. Okay, wir sind beide Triple Majors. >> Ja, jedenfalls hatte ich einen Hintergrund und Interesse daran, Dinge mit Informatik zu tun. Meine Interessen waren also ziemlich gemischt und ich meine, als ich mich für Graduiertenschulen beworben habe, war einer der Orte, an denen ich mich beworben habe, Carnegie Mellon, weil sie stark in Computerlinguistik waren. Und wenn ich dorthin gegangen wäre, wäre ich als Informatik-Student eingeschrieben worden, aber ich bin als Linguistik-Student gelandet, weil es zu dieser Zeit noch keine Verarbeitung natürlicher Sprache in der Informatikabteilung gab. Aber ich war immer noch daran interessiert, Ideen zur Verarbeitung natürlicher Sprache zu verfolgen. Aber zu diesem Zeitpunkt in den frühen neunziger Jahren begannen sich die Dinge gerade zu ändern. Der Großteil der Verarbeitung natürlicher Sprache bestand jedoch aus regelbasierten logischen deklarativen Systemen. Aber es war auch in diesen Jahren zu Beginn der neunziger Jahre, als sie anfingen, viel menschliches Sprachmaterial, Text und Sprache digital verfügbar zu machen. Das war also wirklich kurz bevor das World Wide Web explodierte. Aber es waren bereits Dinge wie legales Material und Zeitungsartikel und parlamentarische Hand SARS, wo man zuletzt Millionen von Wörtern menschlicher Sprache in die Finger bekommen konnte. Und es schien einfach wirklich klar, dass es spannende Dinge geben musste, die man tun konnte, wenn man empirisch mit viel menschlicher Sprache arbeitete. Und das hat mich wirklich dazu gebracht, mich mit einer neuen Art der Verarbeitung natürlicher Sprache zu beschäftigen, was dann zu meiner späteren Karriere führte. >> Es hört sich so an, als ob Ihre Karriere anfangs eher aus Linguistik bestand und mit dem Aufkommen von Daten und maschinellem Lernen und empirischen Methoden sie sich auf das verlagerte, was NLP und maschinelles Lernen und NLP betrifft. >> Ja, ich meine, es hat sich mit Sicherheit geändert und ich bin sicherlich viel mehr dazu übergegangen, sowohl Modelle für die Verarbeitung natürlicher Sprache als auch für maschinelles Lernen zu verwenden. In gewissem Maße hat sich das Gleichgewicht jedoch verändert. Aber ich beschäftige mich schon eine Weile damit, eigentlich als Student für meine Doktorarbeit, es ging darum, die Formen von Wörtern zu lernen. Wie kann man das, was zu einem berühmten Problem des Lernens wurde, vorbei an Zelten englischer Verben und der frühen Verbindungsliteratur. Und ich habe versucht, Paradigmen von Verbformen zu lernen. Und ich habe Regeln für die verschiedenen Formen mithilfe des C 4.5-Entscheidungsbaum-Lernalgorithmus gelernt. [LACHT] Falls du dich daran erinnerst. >> Ja richtig, gute Zeiten. Ja und es ist überraschenderweise nicht intuitiv, oder? Wie der Übergang von der Gegenwart zur Vergangenheitsform von ich weiß nicht zu und all die anderen Sonderfälle sein können. >> Ja. >> Ja, also haben wir viel über NLP Natural Language Processing gesprochen. Können Sie also sagen, was ist NLP für einige der Lernenden, die zum ersten Mal maschinelles Lernen lernen? >> Sicher, absolut, ja. NLP steht also für Natural Language Processing, ein anderes Wort oder Begriff, der manchmal dafür verwendet wird, ist Computerlinguistik, es ist dasselbe. Ich meine, natürliche Sprachverarbeitung ist eigentlich ein seltsamer Begriff, oder? Es bedeutet also, dass wir Dinge mit menschlichen Sprachen machen. Sie müssen also die Vorstellung haben, dass Sie Informatiker genug sind, damit Sie, wenn Sie Sprache sagen, in Ihrer Gehirnprogrammiersprache denken. Deshalb müssen Sie natürliche Sprache sagen, um zu bedeuten, dass Sie über die Sprachbilder sprechen, die Menschen verwenden. Insgesamt macht die Verarbeitung natürlicher Sprache also alles Intelligente mit menschlichen Sprachen. In gewissem Sinne bedeutet das, menschliche Sprachen zu verstehen, menschliche Sprachen zu produzieren, menschliche Sprachen zu erwerben, obwohl die Menschen oft auch im Hinblick auf verschiedene Anwendungen darüber nachdenken. Und dann denken Sie vielleicht über Dinge wie maschinelle Übersetzung oder das Beantworten von Fragen oder das Generieren von Werbetexten oder Zusammenfassungen nach. Es gibt so viele verschiedene Aufgaben, an denen Menschen mit bestimmten Zielen arbeiten, wenn man Dinge mit menschlicher Sprache macht. Und es gibt eine Menge natürlicher Sprachverarbeitung, weil so viel von dem, was die Welt auf unserer menschlichen Welt funktioniert, in Form von menschlichem Sprachmaterial behandelt und übertragen wird. Also, wegen all dieser Anwendungen oder sogar der Websuche, oder? Die meisten von uns verwenden NLP. >> Ja. >> Viele, viele Male [unverständlich] >> Sie haben Recht, in gewisser Weise ist die Websuche die größte Anwendung natürlicher Sprache, oder? [LACHT] Und das ist wirklich das Wichtigste, ich meine , traditionell war es eine ziemlich einfache, oder? In der guten alten Zeit gab es, weißt du, verschiedene Wartefaktoren und so weiter, aber es waren hauptsächlich passende Keywords, dann deine Suchbegriffe und dann einige Faktoren, die die Qualität der Seite betrafen. Es fühlte sich nicht wirklich nach Sprachverstehen an, aber das hat sich im Laufe der Jahre wirklich geändert. Wenn Sie heutzutage eine Frage an eine Suchmaschine stellen, erhalten Sie häufig ein Antwortfeld, in das sie einen Text extrahiert und die Antwort, die sie für die Antwort hält, fett oder farbig oder so ähnlich einfügt. Das ist dann diese Aufgabe der Beantwortung von Fragen und dann ist es wirklich eine Aufgabe, die natürliche Sprache zu verstehen. >> Ja, ja, und ich habe das Gefühl, zusätzlich zur Websuche vielleicht die große, selbst wenn wir auf eine Online-Shopping-Website oder eine Filmwebsite gehen und eingeben, was wir wollen, und eine Webseitensuche auf einer viel kleineren Website als die großen Suchmaschinen durchführen. Das verwendet auch zunehmend ausgeklügelte NLP-Algorithmen und schafft auch eine Menge Wert. Vielleicht ist es für dich nicht das richtige NLP, aber es scheint trotzdem sehr wertvoll zu sein. >> Ich stimme zu, es ist sehr wertvoll. Und auf jeder E-Commerce-Website gibt es viele interessante Probleme, da die Suche sehr schwierig ist, wenn die Leute die Art von Waren beschreiben, die sie wollen. Und Sie müssen versuchen, es den verfügbaren Produkten zuzuordnen, das ist kein einfaches Problem, wie sich herausstellt. >> Ja, das stimmt, ja. In den letzten, ich weiß nicht, ein paar Jahrzehnten hat NLP also einen großen Wandel durchgemacht, weg von den eher regelbasierten Techniken, auf die Sie gerade angespielt haben, hin zu einer viel umfassenderen Nutzung von echtem maschinellem Lernen. Sie waren also einer der Leute, die einen Teil dieser Aufgabe leiteten und jeden Schritt des Weges mitverfolgten, Sie kreierten einige der Strukturen, während sie passierten. Können Sie etwas über diesen Prozess und das, was Sie gesehen haben, sagen? >> Sicher, absolut. Ja, als ich als Doktorand angefangen habe, wurde der größte Teil der Verarbeitung natürlicher Sprache mit handgefertigten Systemen durchgeführt, die auf verschiedene Weise Regeln und Inferenzverfahren verwendeten, um sozusagen zu versuchen, einen Pfad und ein Verständnis für einen Text aufzubauen. >> Was ist ein Beispiel für ein Regel- oder Inferenzsystem? Eine Regel könnte also Teil der Struktur der menschlichen Sprache sein. Wie im Englischen besteht ein Satz normalerweise aus einer Subjekt-Nominalphrase, gefolgt von einem Verb und einer Objekt-Nominalphrase. Und das gibt Ihnen eine Vorstellung davon, wie Sie die Bedeutung des Satzes verstehen können. Es könnte aber auch etwas darüber aussagen, wie ein Wort interpretiert werden muss , sodass viele Wörter auf Englisch sehr zweideutig sind. Aber wenn Sie so etwas wie das Wort Stern haben und es im Zusammenhang mit einem Film steht, dann bezieht es sich wahrscheinlich auf einen Menschen auf diesem astronomischen Objekt. Und in jenen Tagen versuchten die Leute, mit solchen Dingen umzugehen, indem sie Regeln dieser Art verwendeten. Das scheint uns heutzutage nicht sehr wahrscheinlich zu funktionieren, aber das war einmal ziemlich normal. Und so schien es erst, als viele digitale Texte und Sprache verfügbar wurden, wirklich so, als gäbe es diese andere Methode, mit der wir stattdessen anfangen könnten, Statistiken über menschliche Sprache und Material zu berechnen und Modelle für maschinelles Lernen zu erstellen. Und das war das Erste, worauf ich mich einließ, Mitte bis Ende der 1990er Jahre. Der erste Bereich, in dem ich angefangen habe, viel zu recherchieren und Artikel zu veröffentlichen und mir einen Namen zu machen, war der Aufbau dessen, was wir in der Anfangszeit oft als statistische Verarbeitung natürlicher Sprache bezeichneten. Später ging es jedoch in allgemeine Probansätze für künstliche Intelligenz und maschinelles Lernen über. Und das hat uns sozusagen bis ungefähr 2010 geführt, sagen wir mal. Und das war ungefähr der Zeitpunkt, an dem das neue Interesse an Deep Learning unter Verwendung großer künstlicher neuronaler Netze zunahm. Für mein Interesse daran muss ich Andrew wirklich danken, denn zu diesem Zeitpunkt ist Andrew immer noch Vollzeit in Stanford und er war im Büro neben mir und er war wirklich begeistert von den neuen Dingen, die im Bereich Deep Learning passieren, schätze ich. Jeder, der in sein Büro kam, sagte er ihnen, es ist irgendwie aufregend für das, was jetzt passiert und ich bin im neuronalen Netzwerk, du musst anfangen, dir das anzusehen. Und das war wirklich der Anstoß, der mich ziemlich früh dazu gebracht hat, Dinge in neuronalen Netzwerken zu betrachten. Ich hatte tatsächlich schon ein bisschen davon gesehen, also als ich hier als Doktorand hier war, war Dave Rummelhardt in Stanford in Psych und ich hatte seinen Kurs über neuronale Netzwerke besucht. Also, ich hatte einiges davon gesehen, aber es war nicht wirklich das, worauf ich mich bei meinen eigenen Recherchen eingelassen hatte. Also- >> Das wusste ich nicht, danke, ja. >> Ja. >> Und dann haben wir gemeinsam einige Studenten betreut. >> Ja, absolut. >> Ich würde gerne den Aufstieg von Deep Learning und NLP hören. Was haben Sie gesehen, seit Sie in diesem Bereich tätig waren? >> Ja, also ab etwa 2010 fing ich an, die ersten Vorträge und Deep Learning für NLP-Konferenzen zu schreiben. Es ist immer schwierig, wenn man versucht, etwas Neues zu machen. Wir hatten genau die gleichen Erfahrungen, die Leute vor etwa 15 Jahren gemacht hatten, als sie anfingen, statistisches NLP zu machen: Wenn es eine etablierte Vorgehensweise gibt, ist es wirklich schwierig, neue Ideen durchzusetzen. Einige unserer ersten Beiträge wurden also von Konferenzen abgelehnt und stattdessen auf Konferenzen zum maschinellen Lernen oder Deep-Learning-Workshops veröffentlicht, aber das änderte sich sehr schnell und die Leute waren sehr interessiert an Ideen für neuronale Netzwerke. Aber ich habe das Gefühl, dass die Phase der neuronalen Netzwerke, die quasi 2010 begann, sich selbst in zwei Teile teilt, weil für die erste Phase, sagen wir, im Grunde genommen bis 2018 dauert. Wir waren sehr erfolgreich beim Aufbau neuer Netzwerke für alle möglichen Aufgaben. Wir haben sie für syntaktisches Parsing und Stimmungsanalyse entwickelt. Und was noch, Alter? >> Beantwortung von Fragen. Aber es war so, als würden wir dasselbe tun, was wir früher mit anderen Arten von maschinellen Lernmodellen gemacht haben, außer dass wir jetzt ein besseres Modell für maschinelles Lernen hatten. Und wir haben sozusagen, anstatt eine logistische Regression oder eine Support-Vektor-Maschine zu trainieren, immer noch dieselbe Art von Stimmungsanalyse durchgeführt , aber jetzt machen wir es mit einem neuronalen Netzwerk. Wenn ich jetzt zurückblicke, denke ich, dass die größere Veränderung in gewisser Weise um 2018 herum eingetreten ist. Denn zu diesem Zeitpunkt entstand die Idee, nun ja, wir könnten einfach mit einer großen Menge an menschlichem Sprachmaterial beginnen und große, selbstüberwachte Modelle bauen. Das waren also damals Modelle und wie [UNHÖRBAR] und GPTs und Nachfolgemodelle dazu. Und sie könnten sich einfach durch Wortvorhersagen über eine riesige Textmenge dieses erstaunliche Wissen über menschliche Sprachen aneignen. Und ich denke wirklich, dass das im Nachhinein wahrscheinlich als der größere Schnittpunkt angesehen werden wird, an dem sich die Art und Weise, wie Dinge gemacht wurden, wirklich verändert hat. >> Ja, ich denke, es gibt diesen Trend für große Sprachmodelle, die aus riesigen Datenmengen lernen. Ich denke, schon im Vorfeld gab es eine Ihrer Forschungsarbeiten, die mich wirklich leicht umgehauen hat, nämlich ein Handschuhpapier. Also, weil bei Worteinbettungen, bei denen Sie mithilfe eines neuronalen Netzwerks die Vektorzahlen lernen, um ein Wort darzustellen. Das war ziemlich umwerfend für mich. Und dann hat die Handschuharbeit, die du geleistet hast, die Mathematik wirklich bereinigt, sie so viel einfacher gemacht. Und dann erinnere ich mich, dass ich gesagt habe, das ist alles, was zu tun ist. Und dann können Sie diese wirklich überraschend detaillierten Darstellungen des Computers lernen, die Nuancen dessen, was Wörter bedeuten. >> Absolut. Ja, also sollte ich anderen ein bisschen Anerkennung zollen. Andere Leute arbeiteten auch an ähnlichen Ideen, darunter Ja Weston und Kollegen bei Google. Aber die Handschuhwortvektoren sind eines der bekanntesten Systeme von Wortvektoren. Diese Wortvektoren haben es also bereits getan. Ja, du hast recht, veranschauliche diese Idee des selbstüberwachten Lernens, dass wir einfach riesige Textmengen aufgenommen haben. Und dann könnten wir diese Modelle bauen, die eine enorme Menge über die Bedeutung von Wörtern wussten. Es ist immer noch etwas, das ich den Leuten jedes Jahr in der ersten Vorlesung meines NLP-Kurses zeige. Weil es etwas Einfaches ist, aber es funktioniert einfach so überraschend gut. Sie können diese Art von einfacher Modellierung durchführen, indem Sie versuchen, ein Wort anhand der Wörter im Kontext vorherzusagen, und indem Sie einfach die Mathematik des Lernens ausführen, um diese Vorhersagen zu treffen. Nun, du lernst all diese Dinge über die Bedeutung von Wörtern und du kannst diese wirklich schönen Muster von ähnlichen Wortbedeutungen oder Analogien von etwas machen, das Bleistift ist die Zeichnung wie der Pinsel auch und es wird Malerei sagen, oder? Dass es schon eine Menge erfolgreicher Lernerfolge zeigt. Das war also der Vorläufer dessen, was dann in der nächsten Phase mit Dingen wie Burton GPT weiterentwickelt wurde, wo es nicht nur um Bedeutungen einzelner Wörter ging. Aber Bedeutungen ganzer Textteile und Kontexte. >> Ja, also ich fand es toll, dass man ein kleines neuronales Netzwerk oder irgendein Modell nehmen und ihm dann viele englische Sätze oder eine andere Sprache geben und das Wort verstecken kann. Bitten Sie es, vorherzusagen, welches Wort ich gerade getroffen habe, und das ermöglicht es ihm, diese Analogien zu lernen. Und diese sehr tiefen, was du denkst, sind wirklich tiefgründige Dinge hinter der Bedeutung des Wortes. Und dann 2018, vielleicht dieser andere Infektionspunkt, was ist danach passiert? >> Ja. Also, im Jahr 2018 war das der Punkt, an dem nun , wirklich zwei Dinge passiert sind. Eine Sache ist, dass die Menschen, oder wirklich im Jahr 2017, diese neue Architektur entwickelt hatten. Welches war auf moderne parallele GPUs viel skalierbarer. Und das war die Transformator-Architektur. Der zweite Teil war jedoch, dass die Leute es vielleicht wiederentdecken, weil ich den gleichen Trick wie beim Handschuhmodell verwendet habe, nämlich, wenn man die Aufgabe hat, ein Wort in einem bestimmten Kontext vorherzusagen. Entweder ein Kontext auf beiden Seiten oder die vorangegangenen Wörter, die sich einfach als erstaunliche Lernaufgabe herausstellen. Und das überrascht viele Leute. Und oft sieht man Diskussionen, in denen Leute abwertende Dinge darüber sagen, dass nichts Interessantes passiert. Und alles, was es tut, sind Statistiken, um vorherzusagen, welches Wort am wahrscheinlichsten nach den vorangegangenen Wörtern kommt. Und ich denke, das wirklich Interessante ist, dass das stimmt, aber es ist nicht wahr. Denn ja, die Aufgabe ist, dass Sie das nächste Wort anhand der vorangegangenen Wörter vorhersagen. Aber das wirklich Interessante ist, wenn Sie diese Aufgabe wirklich so gut wie möglich erledigen möchten. Dann hilft es tatsächlich, den ganzen Rest des Satzes zu verstehen und zu wissen, wer was mit wem macht und was in dem Satz steht. Aber mehr als das, es hilft auch, die Welt zu verstehen, denn wenn Ihr Text etwas in der Art der auf Fidschi verwendeten Währung lautet, dann ist es das. Nun, Sie müssen über etwas Weltwissen verfügen, um zu wissen, was die richtige Antwort darauf ist. Gute Vorbilder, die das können, lernen, sowohl der Struktur von Sätzen und ihrer Bedeutung zu folgen als auch Fakten über die Welt zu kennen, um sie vorhersagen zu können. Und deshalb wird das zu einer Aufgabe, die manchmal als KI-Komplettaufgabe bezeichnet wird, oder? Das brauchst du wirklich. Es gibt nichts, was bei der Beantwortung dieser Frage nicht nützlich sein könnte, welches Wort kommt als nächstes, oder? Man kann mit den Mannschaften im Halbfinale der Weltmeisterschaft sein und man muss etwas über Fußball wissen [LACHT], um die richtige Antwort zu geben. >> Ich vervollständige dieses lustige Konzept, oder? Ist die Idee, dass man dieses eine Problem lösen kann, man kann alles in KI lösen oder eine Analogie zu kompletten NP-Problemen aus der Computertheorie ziehen. Was denkst du? Glaubst du, dass die Vorhersage des Knicks-Wortes vollständig ist? Ich selbst habe diesbezüglich sehr gemischte Gefühle. Ich kann sagen, ich glaube nicht, dass es wahr ist. Ich bin gespannt, was du denkst. Ich denke, das stimmt nicht ganz, denn ich denke, es gibt noch andere Dinge, die Menschen bewältigen können. Es gibt Menschen, die kluge Einblicke in Mathematik haben, oder es gibt Menschen, die sich etwas ansehen, das viel mehr ist. Dreidimensionales Puzzle in der realen Welt, bei dem man sozusagen herausfindet , wie man etwas Mechanisches oder ähnliches macht. Und das ist einfach kein Sprachproblem. Aber auf der anderen Seite denke ich, dass Sprache der Universalität näher kommt, als manche Leute denken , weil wir in dieser 3D-Welt leben. Und operieren Sie darin mit unserem Körper und unseren Gefühlen und anderen Kreaturen und Artefakten in seiner Umgebung. Und man könnte denken, naja, davon gibt es nicht viel in der Sprache. Aber eigentlich über all die Dinge, über die wir nachdenken, wir sprechen, wir schreiben darüber in Sprache. Wir können die Positionen der Dinge zueinander in der Sprache beschreiben. Ein überraschender Teil der anderen Teile der Welt spiegelt sich also in der Sprache wider. Und deshalb lernst du auch etwas über sie alle. Wenn Sie etwas über Sprachgebrauch lernen. >> Man lernt einen Aspekt von vielen Dingen kennen, auch wenn Dinge, wie man Fahrrad fährt, nicht wirklich können. >> Du lernst nicht wirklich, wie man Fahrrad fährt, [LACHT], aber du lernst einige Aspekte dessen, was es bedeutet, das Gleichgewicht zu halten. Und du musst deine Füße in die Pedale stellen und sie drücken und all diese Dinge. Ja. >> Angesichts dieses LOP-Trends waren die letzten Sprachmodelle in den letzten Jahren sehr aufregend. Was sind deine Gedanken darüber, wohin das alles führen wird? >> Nun ja, es war einfach unglaublich. Erfolgreich und aufregend, oder? Deshalb haben wir nicht wirklich alle Details erklärt, oder? Es gibt also die erste Phase des Lernens dieser großen Sprachmodelle, in der die Aufgabe nur darin besteht, das nächste Wort vorherzusagen. Und das machst du milliardenfach über einen sehr großen Text. Und siehe da, Sie erhalten dieses große neuronale Netzwerk, das einfach ein wirklich nützliches Artefakt für alle Arten von Verarbeitungsaufgaben natürlicher Sprache ist. Aber dann muss man immer noch etwas damit anfangen, wenn man eine bestimmte Aufgabe erledigen will, sei es das Beantworten oder Zusammenfassen von Fragen oder das Aufspüren toxischer Inhalte in sozialen Medien oder etwas Ähnliches. Und an diesem Punkt gibt es eine Auswahl an Dingen, die Sie damit machen könnten. Die traditionelle Antwort war, dass Sie dann eine bestimmte Aufgabe hatten, sagen wir, es geht darum, giftige Kommentare in sozialen Medien zu erkennen. Und dafür würden Sie einige überwachte Daten verwenden und dann das Sprachmodell verfeinern, um diese Klassifizierungsaufgabe zu beantworten. Aber diese Basis dieses großen selbstüberwachten Modells hat Ihnen enorm geholfen, weil das Modell dadurch über enorme Sprachkenntnisse verfügte und sich sehr schnell verallgemeinern ließ. Im Gegensatz zu den üblichen alten Zeiten des überwachten Lernens, wo es irgendwie, nun ja, wenn Sie mir 10.000 beschriftete Beispielbeispiele geben, kann ich vielleicht ein halbwegs anständiges Modell für Sie erstellen. Aber wenn Sie mir 50.000 beschriftete Beispiele geben, wird es viel besser sein. Es hat es irgendwie in diese Welt von verwandelt. Nun, wenn Sie mir 100 beschriftete Beispiele geben und ich ein großes Sprachmodell verfeinere, kann ich viel besser abschneiden als mit den 50.000 Beispielen in der alten Welt. Einige der neueren aufregenden Arbeiten, die sogar darüber hinausgehen, ist es jetzt, naja, vielleicht müssen Sie das Modell überhaupt nicht feintunen. Die Leute haben also viel mit Methoden gearbeitet, die manchmal als Aufforderung oder Anweisung bezeichnet werden, wo man dem Modell einfach in natürlicher Sprache, vielleicht mit Beispielen, vielleicht mit expliziten Anweisungen, einfach sagen kann, was es tun soll, und das tut es, und das sogar als jemand, der seit 30 Jahren in der Verarbeitung natürlicher Sprache arbeitet. Ich meine, es ist einfach umwerfend, wie gut das funktioniert. Ich glaube, ich habe vor einem Jahrzehnt nicht gedacht, dass wir das Modell jetzt einfach sagen können, ich möchte , dass Sie diesen Text hier zusammenfassen und dann werden sie ihn zusammenfassen. Ich finde das unglaublich. Ja, wir befinden uns in einer sehr aufregenden Zeit, in der sich viele neue Fähigkeiten der natürlichen Sprache entfalten. Ich denke, in den nächsten Jahren besteht überhaupt kein Zweifel daran, dass die Zukunft extrem vielversprechend ist, da die Leute verschiedene Dinge und unterschiedliche Vorgehensweisen ausarbeiten und die Leute beginnen, sich in verschiedenen Anwendungsbereichen zu bewerben. Die Art von Fähigkeiten, die mit den jüngsten technologischen Entwicklungen erschlossen wurden. In der Technologie stellt sich immer die Frage, ob die Kurve weiter steil nach oben geht oder ob es dann neue Dinge gibt, wir müssen herausfinden, wie das geht. >> Es geht schon eine ganze Weile bergauf. Hoffentlich ist Extrapolation immer gefährlich. Aber wir werden sehen, ich bin nur neugierig, weißt du, du, du hast das Schreiben von Eingabeaufforderungen für das MRP-System erwähnt, das große Sprachmodell, was du willst und es scheint es auf magische Weise zu tun. Ich bin neugierig, glauben Sie, dass Prompt Engineering der Weg der Zukunft ist? Wenn ich diese Prompts schreibe, finde ich manchmal, dass es auf wundersame Weise funktioniert und manchmal frustriert es, meine Anweisungen neu zu formulieren, um den Wortlaut zu optimieren, damit er genau richtig ist, um das gewünschte Ergebnis zu erzielen. Denken Sie also, dass Problem-Engineering der Weg der Zukunft ist, oder glauben Sie, dass es sich um einen Zwischenfall handelt, bis jemand einen besseren Weg findet , diese zu kontrollieren, die Ausgänge dieser Systeme zu kontrollieren? >> Ich denke, es ist beides, ich denke, es wird der Weg der Zukunft sein, aber ich denke auch, dass die Leute im Moment, ja, viel herumhacken und umformulieren, um zu versuchen, die Dinge besser zum Laufen zu bringen, und mit etwas Glück mit ein paar weiteren Jahren der Entwicklung wird das langsam verschwinden. Ich meine, eine Möglichkeit, über den Unterschied nachzudenken, ist der Vergleich zu der Art von Sprachunterstützung oder virtueller Unterstützung, die heutzutage auf Telefonlautsprechern wie Amazon oder Alexa verfügbar sind, oder? Ich denke, wir alle haben die Erfahrung gemacht, dass die Präsentation dieser Geräte nicht immer großartig ist, aber wenn man weiß, wie man Dinge richtig formuliert, wird es etwas bewirken. Aber wenn Sie die falsche Formulierung verwenden, wird dies nicht der Fall sein, und der Unterschied zu Menschen besteht im Großen und Ganzen darin, dass Sie nicht darüber nachdenken müssen. Sie können sagen, was Sie wollen, und es spielt keine Rolle, welche Wörter Sie wählen, sie werden die andere Person annehmen, dass jemand, der dieselbe Sprache spricht , usw. Sie versteht und tut, was Sie wollen. Und ich denke und hoffe, dass wir bei diesen Modellen die gleichen Fortschritte sehen werden, dass das Herumspielen an der jeweiligen Formulierung, die Sie verwenden, einen sehr großen Unterschied darin machen kann, wie gut sie funktionieren. Aber hoffentlich wird das in ein paar Jahren einfach nicht wahr sein, Sie können verschiedene Formulierungen verwenden und es wird immer noch funktionieren. Aber die Grundidee ist, dass wir uns in ein Zeitalter bewegen, in dem die menschliche Sprache tatsächlich als Unterrichtssprache verwendet werden kann, um Ihrem Computer zu sagen, was er tun soll. Anstatt also Menüs und Optionsfelder und solche Dinge verwenden zu müssen oder Python-Code zu schreiben, anstatt eines der Dinge, mit denen Sie auf dem Computer sagen können, was Sie wollen, wird es tun. Ich denke, dass sich vor uns ein Zeitalter auftut, das sich weiter entwickeln wird und das enorm transformativ sein wird. >> Es fühlt sich an, als ob ein langer Weg zurückgelegt wurde, aber es liegt nur noch viel mehr vor uns und noch viel mehr vor uns. >> Ja, absolut. >> Was die Entwicklung der NLP-Technologie betrifft, ist das Einzige, was ich Sie fragen möchte, und ich vermute, dass Sie und ich diesbezüglich unterschiedliche Sichtweisen haben könnten. In den letzten Jahrzehnten ging der Trend jedoch dahin, weniger auf regelbasiertes Engineering als vielmehr auf maschinelles Lernen mit Daten zu setzen. Manchmal blicken viele Daten in die Zukunft. Wo denken Sie, diese Mischung aus handcodierten Einschränkungen oder anderen Einschränkungen, expliziten Einschränkungen oder lassen Sie uns ein neues Netzwerk erstellen und viele Daten darauf werfen. Wo wird sich dieses Gleichgewicht Ihrer Meinung nach verändern? >> Ich denke, es besteht kein Zweifel daran, dass das Lernen aus Daten der Weg in die Zukunft ist und was wir auch weiterhin tun werden. Aber ich denke, es gibt immer noch Spielraum für Modelle mit mehr Struktur, mehr induktiven Vorurteilen, die irgendeine Grundlage haben, um die Natur der Sprache auszunutzen. In den letzten Jahren waren das neuronale Transformator-Netzwerk und die Transformator-Neuronennetze, im Grunde diese riesige Assoziationsmaschine, das Modell, das in den letzten Jahren enorm erfolgreich war. Es wird also einfach Assoziationen von überall her aussaugen. >> Und sieh dir zwei Wörter an und finde heraus, welche Wörter zu welchem anderen Wort gehören. >> Ja. Sie verwenden also alles, um etwas vorherzusagen, und tun es immer wieder und Sie werden alles bekommen, was Sie wollen. Und wissen Sie, das war unglaublich, unglaublich erfolgreich, aber es war unglaublich erfolgreich in dem Bereich, in dem Sie riesige Datenmengen haben. Richtig, sodass diese Transformer-Modelle für diese großen Sprachmodelle jetzt an zig Milliarden von Textwörtern trainiert werden. Als ich mit statistischer Verarbeitung natürlicher Sprache begann. Und einige der traditionellen Linguisten beschwerten sich früher darüber , dass ich Statistiken aus 30 Millionen Wörtern von Newswire sammelte. Und ein prädiktives Modell zu entwickeln und zu denken, darum ging es in der Linguistik einfach nicht. Ich hatte das Gefühl, eine absolut gute Antwort zu haben, nämlich dass ein Menschenkind Sprache lernt. Sie sind tatsächlich, naja, mehr als 30 Millionen Wörtern an Daten ausgesetzt. Aber diese Art von Datenmenge, also die Art der Menge einiger Daten, die wir verwendeten, waren völlig vernünftige Datenmengen, die wir verwenden konnten. Nicht gerade zu versuchen, den menschlichen Spracherwerb zu modellieren. Aber darüber nachzudenken, wie wir für viele Daten etwas über Sprache lernen können. Aber diese modernen Transformatoren verwenden jetzt bereits mindestens zwei Größenordnungen mehr Daten. Und die meisten Menschen denken, dass der Weg, Dinge auf die nächste Stufe zu bringen , darin besteht, noch mehr zu verwenden und sie um drei Größenordnungen zu erhöhen. Und in gewisser Hinsicht war diese Skalierungsstrategie äußerst effektiv. Ich kann es also niemandem verübeln, wenn er sagt, lassen Sie uns eine weitere Größenordnung der Automatisierung erhöhen und sehen, welche großartigen Dinge wir tun können. Es zeigt aber auch, dass menschliches Lernen einfach viel, viel besser ist, da es in der Lage ist, aus einer recht begrenzten Datenmenge viel mehr Informationen zu extrahieren. Und an diesem Punkt können Sie verschiedene Hypothesen haben. Aber ich denke, es ist vernünftig anzunehmen, dass menschliches Lernen in gewisser Weise an der Struktur der Welt orientiert ist. Und Dinge, die es auf der Welt sieht und die es ihm ermöglichen, schneller aus weniger Daten zu lernen. >> Richtig, da stimme ich dir zu. Ich denke, unsere Räume, unser derzeitiges maschinelles Lernen, unsere Räume sind viel weniger effizient oder nutzen Daten viel weniger effizient. Es gibt also viel mehr Daten als jedes Kind. Und dann überlege ich, ob die verbesserten Lernalgorithmen auf linguistischen Regeln basieren oder ob es nur Ingenieure sein werden. Entwicklung viel effizienterer Versionen des Transformators oder was auch immer danach kommt. Ich denke, das wird so sein. >> Das wird traditionell sein. Ich glaube nicht, dass es so sein wird, dass die Leute explizit traditionelle Sprachregeln in das System aufnehmen. Ich glaube nicht, dass das der richtige Weg ist. Andererseits denke ich, dass wir langsam beobachten, dass Modelle wie diese Transformer-Modelle die Struktur der Sprache tatsächlich selbst entdecken, oder? Also die breite Wirkung der menschlichen Sprache, dass Englisch das Subjekt vor dem Verb und das Objekt danach hat. Im Japanischen dagegen stehen die Verben am Ende des Satzes sowie Subjekt und Objekt normalerweise in dieser Reihenfolge davor. Könnte aber in der anderen Reihenfolge sein, tatsächlich lernen Transformatormodelle diese Fakten. Sie können sie befragen und feststellen, dass sie diese Begriffe kennen, obwohl ihnen nie explizit über Subjekte und Objekte erzählt wurde. Ich denke, sie entdecken auch noch viel mehr über Sprachgebrauch und Kontext und die Bedeutung und den Sinn von Wörtern und darüber, was unangenehme Sprache ist und was nicht. Aber ein Teil dessen, was sie lernen, ist dieselbe Art von Struktur, die Linguisten als Struktur verschiedener menschlicher Sprachen dargestellt haben. >> Es ist also, als hätten Linguisten über viele Jahrzehnte hinweg bestimmte Dinge entdeckt. Und durch das Training mit Milliarden von Wörtern entdecken Transformatoren dieselben Dinge, die Linguisten bei Menschen entdeckt haben. Das ist cool. Das alles ist also ein wirklich aufregender Fortschritt im NLP, der durch maschinelles Lernen und andere Dinge vorangetrieben wird. Für jemanden, der das Feld betritt, maschinelles Lernen oder KI oder NLP. Es ist einfach eine Menge los. Welchen Rat hätten Sie für jemanden, der in maschinelles Lernen einsteigen möchte? >> Ja. Nun, es ist eine großartige Zeit, um einzubrechen. Ich denke, es besteht überhaupt kein Zweifel daran, dass wir uns noch in einem frühen Stadium befinden, in dem die Auswirkungen dieses neuen Ansatzes, bei dem die Softwareinformatik auf der Grundlage eines viel stärkeren Einsatzes von maschinellem Lernen neu erfunden wird, sichtbar werden. Und die verschiedenen anderen Dinge, die sich daraus ergeben. Und generell gibt es branchenübergreifend einfach viele Möglichkeiten für mehr Automatisierung. Die Interpretation menschlicher Sprachmaterialien für mich oder in anderen Bereichen wie Vision und Robotik stärker zu nutzen, die gleichen Dinge. Also, viele Möglichkeiten. An diesem Punkt gibt es also offensichtlich viel zu tun, um eine gute Grundlage zu haben, richtig. Also einige der wichtigsten technischen Methoden des maschinellen Lernens zu kennen und Ideen zu verstehen, wie Modelle aus Daten erstellt werden können. Schauen Sie sich Verluste an, trainieren Sie, diagnostizieren Sie Fehler, all diese wichtigen Dinge. Das ist auf jeden Fall nützlich, insbesondere für die Verarbeitung natürlicher Sprache, einige dieser Fähigkeiten sind absolut relevant. Aber dann gibt es bestimmte Modelle, die häufig verwendet werden, einschließlich des Transformators, über den wir heute viel gesprochen haben. Sie sollten auf jeden Fall etwas über Transformatoren wissen, und tatsächlich werden sie zunehmend in allen anderen Bereichen des maschinellen Lernens sowie für die Vision-Bioinformatik eingesetzt, sogar die Robotik verwendet jetzt Transformatoren. Aber darüber hinaus denke ich, dass es auch nützlich ist, etwas über die menschliche Sprache und die Art der damit verbundenen Probleme zu lernen. Denn obwohl die Leute die Regeln der menschlichen Sprache nicht direkt in ihr Computersystem codieren werden. Ein Gespür dafür, welche Dinge in der Sprache passieren und worauf man achten muss und was man vielleicht modellieren möchte, das ist immer noch eine nützliche Fähigkeit. >> Und dann, was das Erlernen der Grundlagen angeht, das Erlernen dieser Konzepte. Sie waren mit einem sprachlichen Hintergrund in die KI eingestiegen, und jetzt sehen wir Menschen aus allen Gesellschaftsschichten, die anfangen wollen, im Bereich KI zu arbeiten. Was sind deine Gedanken zu der Vorbereitung, die man haben sollte oder wie du mit etwas anderem als Informatik oder KI beginnen kannst. Es gibt also viele Orte, von denen man kommen und über die man Vektorgrafiken kann, und verschiedene Wege. Und wir sehen Unmengen von Leuten, die das tun, das sind Leute, die in verschiedenen Bereichen angefangen haben, sei es Chemie, Physik oder noch viel weiter. Und Menschen haben Geschichte, was auch immer sie angefangen haben, sich mit maschinellem Lernen zu befassen. Ich denke, da gibt es quasi zwei Antwortebenen. Eine Ebene der Antwort ist, dass eine der erstaunlichen Veränderungen darin besteht, dass es jetzt diese sehr guten Softwarepakete gibt, mit denen Sie Dinge mit Ihren Netzwerkmodellen erledigen können. Diese Software ist wirklich einfach zu bedienen. Sie müssen eigentlich nicht viel hochtechnisches Zeug verstehen. Sie müssen eine allgemeine Vorstellung davon haben, was die Idee des maschinellen Lernens ist. Und wie trainiere ich ein Modell und was muss ich mir ansehen und die Zahlen, die ausgedruckt werden, um zu sehen, ob es funktioniert, richtig. Aber man muss eigentlich keinen höheren Abschluss haben, um diese Modelle bauen zu können. Ich meine, und was wir in der Tat sehen, ist, dass viele Gymnasiasten sich darauf einlassen, das zu tun, weil es tatsächlich etwas ist, das man, wenn man über grundlegende Computerkenntnisse und ein bisschen Programmieren verfügt, lernen und tun kann. Es ist einfach viel zugänglicher als viele Dinge, die bei KI außerhalb von KI und anderen Bereichen wie Betriebssystemen oder Sicherheit passiert sind. Aber wenn Sie auf eine tiefere Ebene gelangen und tatsächlich mehr von dem verstehen möchten, was vor sich geht. Ich denke, man kann das nicht wirklich erreichen, wenn man keine bestimmten mathematischen Grundlagen hat, zum Beispiel, dass DeepLearning auf Infinitesimalrechnung basiert und man Funktionen optimieren muss. Und wenn Sie in dieser Hinsicht keinen Hintergrund haben, denke ich, dass das irgendwann in einem Krieg endet. Also >> Das maschinelle Lernen in der Datenwissenschaft. Es ist nützlich für einige der Arbeiten, die wir >> Ja. Ich denke also, auf einer gewissen Ebene, wenn Sie Geschichte oder nichtmathematische Fächer der Psychologie studieren, habe ich tatsächlich einen guten Freund, der, ja, er hat in der Graduiertenschule Infinitesimalrechnung gelernt, weil er Psychologe war und das noch nie gemacht hat. Und beschloss, dass er anfangen wollte, etwas über diese neuen Modelle zu lernen, und entschied, dass es noch nicht zu spät war, einen Kuhkurs zu belegen. Und das hat er auch getan, richtig. Du musst also einiges davon wissen, aber für viele Leute, wenn sie etwas davon schon einmal gesehen haben, auch wenn du irgendwie eingerostet bist. Ich denke, du kannst irgendwie wieder in die Zone zurückkehren und es spielt keine Rolle, dass du als Student noch keine KI oder maschinelles Lernen und solche Dinge gemacht hast, dass du wirklich anfangen kannst, diese Modelle zu bauen und Dinge zu tun , und das ist wirklich meine eigene Geschichte, oder? Obwohl sie mich heutzutage an der School of Engineering in Stanford sitzen lassen, habe ich keinen Hintergrund als Ingenieur. Mein Doktortitel ist in Linguistik, und ich habe quasi größtenteils von einigen Kenntnissen in Mathematik und Linguistik über Programmierkenntnisse hinweg quasi viel mehr in die Entwicklung von KI-Modellen überführt. >> Ich über etwas. Denken Sie, dass die verbesserten Bibliotheken und Abstraktionen, die jetzt verfügbar sind, Codierungs-Frameworks wie Tensor Flow von P Torch ähneln? Denken Sie, das reduziert die Notwendigkeit, Infinitesimalrechnung zu verstehen? Denn Junge, es ist schon eine Weile her, dass ich aufgrund der automatischen Differenzierung tatsächlich ein Derivat nehmen musste, um überhaupt eine neue Neuronetzwerkarchitektur zu implementieren oder zu erstellen >> Ja, ich meine, absolut. Ich meine, also in den frühen Tagen, als wir Dinge wie 2010 bis 2015 gemacht haben, oder? Für jedes Modell, das wir gebaut haben, haben wir die Derivate von Hand ausgearbeitet und dann Code geschrieben und was auch immer es war. Manchmal war es Python, aber manchmal war es Java oder C [LACHT], um diese Ableitungen zu berechnen und zu überprüfen, ob wir sie richtig gemacht haben usw., wo man heutzutage eigentlich nichts davon wissen muss, um DeepLearning-Modelle zu erstellen. Ich meine, das ist tatsächlich etwas, worüber ich nachgedacht habe, sogar in Bezug auf meinen eigenen Kurs zur Verarbeitung natürlicher Sprache mit DeepLearning, den ich unterrichte. Am Anfang machen wir noch Matrixrechnung und stellen sicher, dass die Leute über Jacobian und solche Dinge Bescheid wissen, damit sie verstehen, was im Bereich Backpropagation, DeepLearning, getan wird. Aber es gibt so etwas, bei dem das bedeutet, dass wir ihnen einfach zwei Wochen lang die Hölle heiß machen. Es ist wie ein Bootcamp oder etwas, das sie leiden lässt. Und dann sagen wir, aber du machst den Rest der Klasse mit Pytorch und Sie müssen irgendwie nie wieder etwas davon erfahren, oder? Es stellt sich immer die Frage, wie tief Sie in die technischen Grundlagen gehen wollen, richtig. Du kannst weitermachen, oder? So wie ein Informatiker im Jahr 2020 verstehen muss, Elektronik und Transistoren oder was in Ihrer CPU passiert. Nun, es ist kompliziert, ich meine, in vielerlei Hinsicht ist es hilfreich, einige dieser Dinge zu wissen. Ich meine, ich kenne Andrew, du warst einer der Pioniere, als es darum ging, maschinelles Lernen auf GPU zu bringen, und nun ja, das bedeutet, dass du ein gewisses Gefühl dafür haben musstest, dass es diese neue Hardware da draußen gibt. Und es hat einige Eigenschaften der Parallelität, was bedeutet, dass es wahrscheinlich etwas Aufregendes tun kann. Es ist also nützlich, etwas umfassenderes Wissen und Verständnis zu haben, und manchmal geht etwas kaputt und wenn man etwas tieferes Wissen hat, kann man verstehen, warum es kaputt gegangen ist. Aber es gibt noch einen anderen Sinn, in dem die meisten Menschen einige Dinge auf Vertrauen annehmen müssen und Sie können das meiste, was Sie heutzutage in der Modellierung neuronaler Netzwerke tun möchten, ohne sich mit Infinitesimalrechnung auskennen zu müssen. >> Ja, ich denke, das ist ein großartiger Punkt. Ich habe das Gefühl, dass manchmal die Zuverlässigkeit der Abstraktion bestimmt, wie oft man reingehen muss, um etwas zu reparieren, das kaputt ist. Also ich bin, eigentlich ist mein Verständnis der Quantenphysik sehr schwach. Ich verstehe es kaum. Man könnte also argumentieren, dass ich nicht verstehe, wie Computer funktionieren, weil Transistoren in der Quantenphysik gebaut werden. Aber glücklicherweise musste ich nie hart arbeiten, um es zu reparieren, wenn etwas mit dem Transistor schief gelaufen ist, [CROSSTALK], glaube ich. Und so denke ich, oder ein anderes Beispiel, die Sortierfunktion, die Bibliothek zum Sortieren von Dingen, und manchmal funktionieren sie tatsächlich nicht, richtig, tauschen den Speicher aus oder was auch immer. Und dann können Sie, wenn Sie wirklich verstehen, wie die Sortierfunktion funktioniert, das Problem beheben. Aber manchmal, wenn wir Abstraktionen, Bibliotheken und APIs haben, die zuverlässig genug sind, dann verringert die Tatsache, dass diese Abstraktionen nett sind, die Notwendigkeit, einige der Dinge zu verstehen, die mir passieren. Es ist also eine aufregende Welt. Es fühlt sich an, als hätten wir Riesen, die auf den Schultern von Riesen bauen, und all diese Dinge werden wirklich von Monat zu Monat komplexer und aufregender. >> Ja, absolut. >> Also danke Chris, das war wirklich interessant und inspirierend und ich wünsche allen, die sich diese Anhörung ansehen, Chris eigener Weg, Informatiker zu werden. Und um ein führender, vielleicht der führende NFP-Informatiker zu werden, sowie all diese aufregenden Arbeiten, die gerade in NFP passieren. Ich hoffe, das inspiriert Sie auch dazu, in den Dampf zu springen und es auszuprobieren. Es gibt einfach noch viel mehr Arbeit, die von unserer Community gemeinsam geleistet werden muss, also ich denke, je mehr von uns daran arbeiten, desto besser wird es der Welt gehen. Also vielen Dank, Chris. Es war wirklich toll, dich hier zu haben. >> Vielen Dank, Andrew. Es hat Spaß gemacht zu chatten. [MUSIK]