Ja, hallo liebe Hörerinnen und Hörer. Willkommen bei der 13. Episode vom Python-Podcast.
Hier ist der Dominik, wir sind bei Jochen.
Jo, hallo.
Ja, heute haben wir ein schönes Thema für euch mitgebracht und zwar wollten wir über naive Base-Klassifikation sprechen und ein bisschen BEM sortieren.
Genau, also eigentlich für mich die Idee dabei war, mal wieder so ein bisschen was Einsteigermäßiges mehr zu machen.
Und dann habe ich mir kurz Jochen's Repo angeguckt und so einsteigerfreundlich ist das nicht. Aber wenn euch das natürlich interessiert.
Genau, oder sagen wir mal so einfach, weil ich denke, ich habe halt nach einem Beispiel gesucht, was man relativ leicht in Python machen kann und wo man jetzt in anderen Sprachen ein Problem hätte,
dass in der gleichen...
Ja, kürze so hinzubekommen.
Da kann man auf jeden Fall wieder sehen, Python kann das richtig gut.
Aber wenn ihr wirklich ein Einstiegsbeispiel haben wollt, also in der nächsten Folge haben wir wieder, glaube ich, was vor oder in der übernächsten, wirklich für Einfänger noch.
Da machen wir mal so wirklich Einsteigergeschichten, einfach grundsätzliche Datentypen und so.
Ich habe jetzt auch versucht, mich dabei dem Beispiel auf so die grundlegenden Datenstrukturen zu beschränken, die es halt irgendwie eingebaut gibt.
Aber gut, so ganz super einsteigerfreundlich ist es vielleicht nicht.
Ja, aber seid gespannt.
Vielleicht trotzdem interessant.
Wir haben übrigens Ende August mittlerweile 2019.
2019 immer noch und es ist tatsächlich immer noch so unglaublich warm wieder.
Also heute, ich weiß nicht.
Ja, aber irgendwie, keine Ahnung, wir können ja erstmal so ein bisschen darüber reden, was passiert ist in letzter Zeit, was wir an so Dingen gesehen haben.
Also wir waren auf der Frostcon, also ich noch ganz kurz und du ein bisschen länger.
Ja.
Ja, das heißt, du hast ein bisschen mehr Vorträge gesehen.
Ich habe nur den einen letzten zu Reinforced Learning mehr angehört.
Du meinst den Workshop?
Ja.
Deep Learning Workshop, ja genau.
Genau.
Ja, dazu gab es auch ein paar.
Den Vortrag, den habe ich auch geguckt.
Genau, ja.
Ich habe auch sowieso wahnsinnig viele Talks, habe ich gar nicht angeguckt.
Du hast genetzt werden, oh.
Aber ansonsten, doch, ja, so ein paar Sachen habe ich auch schon gesehen, das stimmt.
Ja, aber es war sehr interessant, es war viel los und es gab eine ganz tolle Kinderbetreuung.
Ja, wenn ich das mal vorher gewusst hätte, ist es mir gar nicht so aufgefallen, aber es gab einen riesen Hüpfbock und so.
Ja, hätte man.
Hätten die Mädels Spaß haben können.
Ja.
Äh, genau, ähm, was, äh, also, ich, genau, dieser, dieser Deep Learning Vortrag war jetzt, für mich war der jetzt, also, es ist interessant, weil mich das Thema natürlich interessiert und so, aber so wahnsinnig viel Neues war jetzt nicht dabei für mich.
Auch der Workshop war jetzt, also, war wahrscheinlich schon interessant für Leute, die das jetzt noch gar nicht kennen, war das Katzen-versus-Hunde-Beispiel aus Kegel.
Das hatten wir auch schon mal.
Das ich auch schon mal, das wir auch schon mal gemacht hatten, deswegen fand ich das auch interessant, ob das Leute vielleicht auch aus einem anderen Blickwinkel etwas, äh, besser darstellen oder was die da so zu erzählen haben.
Und, ähm, ja, also, die haben da, äh, irgendwie bessere Netze verwendet, also, die Zahlen waren hinterher besser, das war, das war tatsächlich ganz cool zu sehen und da muss ich ja mal gucken, ob ich da nicht vielleicht einfach nochmal so ein bisschen ein paar stärkere Modelle mit reinbaue.
Aber so, ansonsten war das jetzt, äh, für mich jetzt gar nicht, also, war jetzt, war jetzt so nicht so viel Neues dabei.
Ähm.
Ja.
Ja, und wir haben, äh, Post bekommen.
Nette Post.
Ah, genau, natürlich.
Äh, ja.
Einen ganz schönen Brief von Thorsten.
Vielen Dank für deinen, äh, super netten Brief.
Ja, dankeschön.
Wir haben es irgendwie nicht so richtig geschafft, darauf zu antworten, weil gerade viel Stress war.
Es ist immer noch viel Stress.
Hier hört nicht auf.
Aber, äh, genau.
Ja, willkommen zum Atmen, ja, ja.
Ähm, ja, aber, aber trotzdem hat uns sehr gefreut und, ähm, äh, genau, wir hatten auch noch eine Mail bekommen von, äh, von jemandem, der sich dafür interessiert hat, wie das mit den, äh, Generatoren so funktioniert.
Genau.
Ja, und das ist natürlich auch eine interessante Frage und, äh, vielleicht kann man das eigentlich auch hier aufkürzen.
Genau.
Ja, Jochen, sag doch mal bitte, was, was ist denn mit einem Generator?
Wann braucht man den, was muss der denn?
Genau, man kann auch einfach Listen nehmen und dann, äh, funktioniert das, äh, auch alles.
Ja, äh, kann man, aber manchmal ist es halt, äh, schlauer, einen Generator zu nehmen.
Also, wenn man zum Beispiel, äh, eine sehr große Datenstruktur hat mit vielen Elementen in der Liste und darüber iteriert, dann, äh, ähm, passt die vielleicht gar nicht komplett in den Hauptspeicher.
Das wäre natürlich dann schlecht, weil dann wird das nicht funktionieren.
Ist das nicht auch einer der Unterschiede von Python 2 auf Python 3 gewesen, dass bestimmte Sachen dann, äh.
Als Generatoren zurückgegeben wurden, wie vorher.
Ja, also bei, bei Dedict ist es irgendwie ab Python 3 so, dass Items, äh, einen Generator zurückliefert, während, äh, bei Python 2, glaube ich, Iter-Items musste man dann aufrufen.
Ich bin mir noch nicht sicher, ob das wirklich der Unterschied zwischen 2 und 3 war.
Kann, kann, kann aber gut sein.
Einer von denen.
Oder das Range, Range und X-Range.
Genau, Range.
Bei Python 2 musste man X-Range.
Range gab eine Liste.
Ja.
Und, äh, X-Range dann den Generator und jetzt mittlerweile ist es halt so, dass Range einen Generator zurückgibt.
Was, ja, halt auch irgendwie sinnvoller ist, weil, äh, wenn man Range, äh, irgendwie, äh, äh, ich weiß nicht, wie, wie groß die Zahl sein muss, die man in Range reinsteckt, damit, äh, äh, man den Hauptspeicher dann platt macht und das Programm sofort, äh, beendet wird vom Kernel, ähm, wahrscheinlich muss man eine große Zahl nehmen, aber dann ist halt, das ist so ein bisschen frustrierendes Erlebnis vielleicht, wenn dann einfach gar nichts mehr geht.
Ja, aber genau, was ist überhaupt ein Generator?
Also eine Liste, ähm, wir wissen ja vielleicht, da ist irgendwie eine kleine Datenschruktur, wo verschiedene Elemente drinstehen, über die man, äh,
sowas kann wie iterieren, das heißt, man geht über jedes einzelne Listenelement durch und, äh, kann dann damit Dinge anstellen.
Ja, der, der große Unterschied ist im Grunde, dass die Liste halt schon fertig ist, also alle Elemente der Liste sind halt schon drin und das Ding ist irgendwie eine Datenschruktur, die im Hauptspeicher liegt.
Bei dem Generator ist es so, dass, äh, ähm, wenn man darüber iteriert, halt immer das Objekt gefragt wird, was ist denn das nächste Element, sozusagen gibt man das nächste Ding oder so und intern sieht das dann halt so aus, dass eine Funktion meistens dann irgendwas rausgildet.
Also nicht Return, sondern...
Ja, genau, und, äh, hielt es dann das nächste Ding raus und, ähm, muss aber die Sachen vorher und nachher gar nicht alles speichern, sondern betrachtet immer nur das, äh, aktuelle, äh, Element sozusagen oder das aktuelle Ergebnis einer Berechnung und, ähm, wird dann halt weiterhin, weiter ausgeführt beim, bei, bei der nächsten Iteration.
Also, äh, das heißt, man kann halt über eine, eben, wenn man das Beispiel Range nimmt, äh, äh, eine Liste von, weiß ich nicht, einer Billion Zahlen iterieren.
Ohne diese Liste der Billionen Zahlen jemals irgendwo tatsächlich halten zu müssen.
Aber es könnte an einer Stelle ein bisschen länger dauern, es zu berechnen, diesen einen Schritt zu gehen, was wahrscheinlich relativ marginal ist bei der CPU, aber, ähm, die Liste würde sonst im Speicher schon komplett liegen.
Genau.
Bei der Liste, ja.
Äh, also...
Also der Generator hat dann viel weniger Speicher, den er verbraucht, gerade bei so großen Datenmengen.
Genau, und, ähm, ja, also es ist halt...
Dementsprechend auch schneller, ja?
Äh...
Warum ist denn der Generator so viel schneller als die Liste?
Ja, das kommt drauf an.
Also das würde ich jetzt so nicht sagen.
Dass der Generator immer schneller ist, das kann man so nicht sagen.
Okay.
Er wahrscheinlich ein bisschen langsamer, aber, äh, es hat halt andere Vorteile.
Also der Vorteil ist halt, man kann damit Dinge tun, die mit Listen halt nicht gehen.
Und, ähm, ja, äh, äh, also, äh, auch wenn man jetzt irgendwie zum Beispiel Files passt oder so, man möchte halt möglicherweise, also, das wäre vielleicht auch so ein Beispiel für, äh, du kannst natürlich irgendwie, wenn du ein großes XML-Dokument beispielsweise hast, auch das Ding komplett, ähm, in den Hauptspeicher...
...parsen als Datenstruktur und dann damit irgendwas machen oder du kannst halt da Schritt für Schritt durchgehen.
Und, ähm, Generatoren werden halt sozusagen, also sozusagen, das wäre eine andere Möglichkeit, das zu vergleichen, ja, so irgendwie DOM, ähm, Parser versus, äh, Sachs Parser.
Das kennt wahrscheinlich auch keiner.
Was ist denn bitte ein Sachs Parser?
Ach, warte, warte.
Ja, das ist...
Also DOM ist das Webseiten, äh, Strukturelement von den HTML...
...Objektmodel, ja, genau.
Ähm, also den, diesen, diesen Baum gibt es.
Aber nicht nur jetzt bei HTML-Seiten, sondern halt, wenn du jetzt irgendwie beliebige XML-Geschichten hast, äh, kann man halt auch entweder das so parsen oder sich vom Parser so zurückgeben lassen, dass man halt den kompletten Baum im Hauptspeicher hat.
Was bei kleineren Sachen ja gar kein Problem ist und es ist halt ein bisschen komfortabler, weil man halt, äh, irgendwie, äh, da hin und her springen kann, äh, oder aber man, äh, sozusagen, äh, pars das Event basiert und lässt sich halt vom Parser Events geben, wie zum Beispiel, da kommt jetzt ein neues Element vorbei oder so.
Und dafür muss man...
Dafür muss das Ding aber dann halt nicht komplett im Hauptspeicher liegen, sondern das wird dann halt sozusagen iterativ geparsed und dann kann man halt Sachen parsen, die halt so groß sind, dass man, ich meine, man braucht, wenn man das, äh, wenn man XML komplett parsed, wahrscheinlich das, den zwei-, drei-, vierfachen Speicher von dem, wie es auf der, wenn es auf der Platte liegt, äh, im Hauptspeicher und wenn jetzt zwei Gigabyte, äh, weiß ich nicht, Ding auf der Platte liegen hat, dann hat man unter Umständen ein Problem, weil früher war das schlimmer.
Früher bei 32, als 32-Bit-Systeme noch, das, äh, da, da war schnell Ende.
Ein V-Speicher voll.
Ja, war halt mit drei Gigabyte, äh, vier, ja, das ist halt Hauptspeicher voll.
Also, um war out of mana, ne?
Ja.
Äh, mittlerweile kann man ja auch viele Hauptspeicher einstecken, also begegnet es einem wahrscheinlich eher selten, dass man irgendwie, äh, dass ein Hauptspeicher ausgeht, wenn man irgendwas parst, aber, ähm, selbst das kann natürlich immer noch passieren und, ähm, wenn man jetzt, äh, sozusagen, ähm, auch in der Lage sein möchte, Daten zu verarbeiten, die jetzt nicht in den Hauptspeicher passen, dann macht man eben sowas, äh, und parst halt eventuell.
Eventbasiert.
Ist ein bisschen mehr Arbeit dann, sozusagen, äh, beim Programmieren, aber, äh, verbraucht halt nicht so viel Hauptspeicher.
Und solche Arten von Fällen gibt's natürlich viele, wo man irgendwie, wo Ströme von Daten hat, ne?
Irgendwie auch, wenn man irgendwie sich an irgendwelche APIs dranhängt und dann kriegt man halt da irgendwie...
Rewebchen weiter, irgendwelche Requests.
Genau, genau, dann, äh, ja, für all diese Dinge ist das halt sehr sinnvoll und, ähm, ja, man kann Generatoren halt auch, äh, quasi mehr oder weniger, äh, also, man kann diese Funktionssyntax mit Yield verwenden oder halt, äh, das, ja, Iterator-Protokoll beziehungsweise Generator-Protokoll dann halt verwenden oder man kann halt auch einfach ne, äh, Generator-Expression schreiben, das ist so ähnlich wie List Comprehension, bloß halt mit runden Klammern statt eckigen und dann hat man das halt auch in einer Zeile irgendwie hingeschrieben, was halt auch unter Umständen sehr praktisch ist.
Aha, das heißt also, wenn ich eine List Comprehension mit runden Klammern schreibe, habe ich automatisch einen Generator und das funktioniert genauso.
Ja, und wenn man jetzt noch ne andere Geschichte mit dazu nimmt, dann hat man sogar, äh, also, wenn man jetzt nicht nur Sachen aus einer Funktion rausyielden kann, also sozusagen, da passiert ja folgendes, äh, also wenn normalerweise so eine Funktion retornt, dann ist die Funktion ja fertig, aber wenn man, ähm, etwas rausyieldet, dann wird die Funktion sozusagen nur unterbrochen, bis halt sozusagen das nächste Ergebnis da rausgeholt wird.
Äh, und wenn man jetzt auch noch Sachen da reinstecken kann, dann, äh, kann man tatsächlich so bidirektionale Kommunikation irgendwie haben und dann kann man sowas haben wie ein Websocket-Server oder irgendwie ein Server, der halt Sachen annimmt und wieder Sachen zurückschickt und das halt, äh, das wäre dann jetzt nicht mehr wirklich Generator, sondern das wäre dann irgendwie so Co-Routine, aber das, das, was kann man da machen und, ähm, ja, äh, sehr nett.
Ähm.
Trotz selber irgendwie Platz und dann hat man halt nicht das, was das Ding eigentlich brauchen würde, nämlich irgendwie 8-Byte bei einem 64-Bit.
C-Programmierer werden sagen, völlig ineffektiv wollen wir.
Ja, nicht so super ineffizient, sondern halt irgendwie das mal 3 oder sowas oder 4, äh, was immer noch ganz okay ist, aber, ähm, das macht natürlich schon einen großen Unterschied, wenn man jetzt Listen mit, äh, einer großen Menge von, von, äh, ja, Zahlen im gleichen Datentyp hat oder so, dann denkt man sich so, naja, gut, irgendwie bekloppt.
Also, ähm, früher eine Möglichkeit, das Array-Area, äh, das Array-Modul in der Standardbibliothek zu verwenden, das macht das einfach quasi so ein Type-Num-Review in C, da ist das auch, dem gibt man halt einen Typ an und dann braucht das genauso viel Platz, wie man da, wie der Typ halt braucht, nativ.
Ähm, oder man nimmt einen NumPy, da geht das auch.
NumPy ist natürlich jetzt nicht in der Standardbibliothek, aber, ähm, so, und, ähm, jetzt habe ich halt nachgeguckt, okay, wie viel wir brauchen, das ist eine Liste und da war, da habe ich eine, irgendwie eine Liste mit 100.
Millionen Dingern genommen oder so und das hat dann nur noch, irgendwie, 860, äh, knapp 68 Megabyte Hauptspeicher gebraucht auf meinem System und ich dachte so, huch, wie ist das, was ist das denn?
Ehrlich gesagt, ich weiß nicht genau, woran das liegt, ich, das müsste ich vielleicht auch, vielleicht bis zum nächsten Mal recherchieren, woran das liegt, aber das ist ja, das ist ja super, also, das ist viel weniger, als das früher war.
Und.
Wie viel hätte das früher so im Bereich, ähm, dann vielmals viel oder deutlich mehr, ne?
Ja, da hätte ich ja eher erwartet, dass das dann so drei Gigabyte werden oder so.
Weil, äh, ja.
Und spart Platz.
Irgendjemand hat das vernünftig implementiert.
Irgendwas ist da optimiert worden.
Lass mal, vielleicht weiß das ja auch jemand, was da passiert ist.
Ja, ja, Generatoren, liebe.
Genau, Generatoren.
Chaptermark ist, ist, ist Zeit jetzt, glaube ich, für.
Ja.
Äh.
Oh, ich habe gerade zufällig mein Handy geklaut.
Herzlich Glückwunsch an meine Cousine, sie hat gerade einen Heiratsantrag bekommen.
Oha.
Ja, ja.
Wir freuen uns alle für sie mit.
Ja, äh, genau.
Ähm.
Ja, was hatten wir denn noch?
Ah, genau.
Dann habe ich irgendwie Podcasts gehört, das war auch irgendwie wieder sehr nett.
Du hörst sowas?
Ja, ja.
Der Django, äh, Django-Chat-Podcast hatte wieder eine ganz nette Folge mit, ähm.
Bevor du davon erzählst, also ich höre ja auch ab und zu meinen gerne Podcasts, also ich höre auch was zum Bilden, aber manchmal auch einfach Eishockey-Short in den News.
Wenn ich ja einmal kurz Werbung machen darf.
Ah, okay.
Falls jemand sich noch für Eishockey interessiert, das ist nicht so wahrscheinlich, aber vielleicht gibt es ja Menschen.
Ja, toller, tolles Ding, tolles Ding.
Gab es einen kleinen Skandal?
Nein, egal.
Ähm, ja, Düsseldorf und Eishockey, ja, doch, hat ja auch irgendwie.
Ja, ja, man hat sich über einen der Sponsoren aufgeregt, der war, äh, nicht so ganz, äh, der hat so ein paar komische Sachen gepostet.
Das haben die, äh, investigativen Journalisten von John Estern aufgedeckt.
Mal gucken, ob wir nächstes Jahr noch in der Liga, äh, in den Saisen kommen.
Tja.
Äh, äh, genau, ja, nee, ich, äh, ähm, ich höre auch noch andere Podcasts, aber, aber auch viel, äh, äh, Zeugs.
Und das, ähm, genau, da gab es eine Episode mit Andrew Godwin, der, der, äh, das ist auch ein bekannter Django-Entwickler, hat viel, äh,
der, der, der, von dem ich glaube, das ganze Migrations, äh, Framework, was jetzt, äh, äh, was bei 1.7, glaube ich, in, in, in Django reingekommen ist.
Früher hieß es South.
Und was musst du denn früher machen, bevor man Django Migrations machen konnte?
Naja, da gab es halt drei, ich glaube, es gab drei unterschiedliche Systeme.
Es gab eins von, von Andrew Godwin, das heißt South, es gab eins von Simon Willison und es gab noch eins von, äh,
Das hört sich an, als wäre es deutlich mehr Arbeit gewesen früher irgendwie.
Ja, also die meisten Leute haben dann dann schon South verwendet, äh, irgendwie, äh, insofern, äh, was ich nicht wusste, ist,
es ist komplett reimplementiert worden, als es dann bei Django 1.7 reinkam.
Also er hat das halt, äh, nicht einfach übernommen, sozusagen, sondern er hat es nochmal komplett neu geschrieben.
Ja, aber das war nicht so alles lernt, wenn man irgendwie zwei Jahre weiter ist, ne?
Ja.
Oh, nee, so macht man das, aha, nee, so, was hab ich denn da geschrieben, so ein Unsinn, ja.
Äh, naja, jedenfalls, äh, der, äh, macht einen Tarnbeschäftigter, ist ja ganz viel,
damit, ähm, ja, damit Django so ein bisschen mehr auf diese, äh, Async, äh, äh, Schiene zu kriegen,
weil das ist ja so ein Ding, das ist halt Django überhaupt gar nicht, also die ganzen großen Frameworks sind das nicht,
Flask ist es auch nicht.
Äh, bei Django ist es halt aber schwierig, das zu ändern, weil das einfach so viel Zock ist.
Und, ähm, weil halt die API, also die, äh, äh, Whiskey API gibt es halt nicht her.
Äh, es gab...
Whiskey Prost.
Ja.
Hahaha, die wollte ich schon immer noch bringen.
Äh, er hatte da vorher ein Projekt, äh, Django Channels, ähm, oder das, das gibt es natürlich immer noch,
er ist dann halt, irgendwann hat die Mentenz davon abgegeben, aber, äh, jetzt geht's darum, halt, äh, sozusagen Django selber, äh, Async fähig zu machen.
Was halt auch eines der Ziele ist für, für jetzt Django 3, äh, irgendwie, und, ähm, er hat da irgendwie ein Projekt, ein großes Projekt gestartet.
Das ist ja auf einmal ungeahnte, weiten...
Das wird, das wird, das wird tatsächlich sehr interessant.
Also, äh, ich bin, ich bin schon sehr gespannt, also das wäre natürlich, also meine Idealvorstellung auch,
dass man, ja, naja, gut, das wird halt auch lange dauern, aber, äh, dass halt alles asynchron ist von, äh, also einmal, dass man Web-Stalker-Geschichten halt auch direkt machen kann,
dass man Clients irgendwie, wenn sich irgendwas geändert hat, benachrichtigen kann und dass man halt auch irgendwie eine Menge Datenbankabfragen oder halt auch API-Anfragen an andere Geschichten,
dass man halt sozusagen, äh, Endpunkte hat, die dann wiederum andere API-Endpunkte anfragen, irgendwo anders vielleicht, äh, und dass man das,
dass man dann auch wieder asynchron zusammen aggregieren kann und dann nicht das Synchron hintereinander machen muss, wie das momentan passiert.
Und dann hat man halt irgendwie 200 Abfragen, die man irgendwo hinmacht, dann darf man, macht man vielleicht 100 Statements und dann macht man irgendwie noch, fragt man noch irgendwie ein paar APIs
und dann muss man halt manchmal vielleicht auch zwei oder drei Requests machen und dann, äh, verbreitet man unheimlich viel Zeit dabei zu warten.
Und das ist natürlich blöd, weil die Latenz natürlich irgendwie entscheidend ist.
Und, äh, wenn man das asynchron machen würde, dann müsste man halt sozusagen nur, dann würde der längst laufende, äh, Request halt dann noch die Latenz,
die Latenz bestimmen, aber, äh, ja, wenn, wenn der halt auch relativ schnell wieder da ist, dann kann das, kann das relativ flott gehen.
Das ist ja sehr schön.
Nicht schlecht.
Ja, äh, äh, jedenfalls, genau, der hat auch irgendwas, äh, der hat tolle Sachen erzählt, der arbeitet irgendwie bei, äh, Eventbrite und also zum Beispiel eine Geschichte, wo ich dachte so, hätte ich nie gedacht, dass Leute damit Probleme kriegen können,
ist, dass sie teilweise sehr schnell, äh, darauf reagieren müssen, wenn sich irgendwie Traffic, Traffic ändert bei ihnen, weil manchmal kommen so, kriegen sie sehr kurz,
Bescheid gesagt und dann, ähm, sehr viel, sehr viel Traffic.
300.000 Leute wollen in den nächsten 15 Sekunden unseren Service.
Ja.
Und da müssen sie halt entsprechend Maschinen hochfahren oder, oder, oder zumindest irgendwie neue Applikationsserver oder so für eine bestimmte Geschichte.
Und, äh, sie haben das Problem, dass Django bei ihnen sehr langsam mittlerweile startet.
Also das ist halt auch so ein, äh, Eventbrite hat irgendwie so knapp über eine Million Zeilen Python-Code.
In Django.
Und ist ein Django-Projekt, ja.
Äh, und, ähm, das startet relativ langsam.
Äh, Eventbrite kennt ihr doch, oder?
Ja, ja, kennt ihr.
Ja, das ist, denke ich, auch, äh, bekannte Geschichte.
Und, äh, das Ding braucht halt mindestens 30 Sekunden zum Starten, weil das einfach so lange dauert, bis die ganzen Imports aufgelöst sind.
Also, oh Gott, oh Gott, oh Gott, ja.
Da musst du 30 Sekunden vorher wissen, was passiert.
Hm.
Ja, und dann, das Problem ist, du kannst es halt nicht optimieren.
Das ist halt, äh, wenn die Imports so lange dauern, dann dauert es halt so lange, dann kannst du nicht viel machen.
Das ist natürlich schon bitter.
Ja, aber, äh, das geht ja auch nicht.
Äh, ja, hm, also, hoffentlich, äh, also, ja, muss man schon sagen, dass, äh, hm, ja, vielleicht dann doch irgendwie an der Zeit dann mal so den Monolith, äh, monolithischen Ansatz irgendwie, äh, was heißt das?
Es gibt ja mehrere, mehrere Optionen, wie man sowas aus, ausmisten kann, ne?
Irgendwo ab und zu mal ein paar Sachen abfackeln, gucken, was noch stehen bleibt.
Oder, äh, mal wirklich mühevoll drangehen, alles neu umsortieren.
Hm, das ist halt die Frage.
Wie lange dauert so ein Refactoring, wenn du dann komplett auf...
Ja, aber du kannst, du kannst nicht viel machen.
Also, Refactoring hilft dir auch nicht.
Ja, aber alle Features erstmal rausschmeißen.
Ja, du kannst ja die ganzen Features streichen, aber das ist natürlich auch...
Ja, aber du könntest ja zum Beispiel, kannst du nicht sowas machen wie Features nur dann laden, wenn du sie wirklich brauchst?
Und dann dafür irgendwelche extra Requests machen, weil die ganzen Wartesachen vielleicht brauchen die gar nicht.
Ja, also, bei, bei Django ist es so, da werden deine Installed-Apps, die werden alle importiert, da, äh, du kannst es, soweit ich weiß, auch später nicht ändern.
Du kannst nicht sagen, jetzt irgendwas in der Installed-App sind.
Dann zufügen, dynamisch, also, wahrscheinlich geht es schon, doch.
Wenn man, wenn man sich da genug Mühe gibt, dann kriegt man das wahrscheinlich hin.
Aber das ist so nicht, sondern das passiert beim Starten.
Da wird, gehen, genau, wenn die ganzen Installed-Apps gehen, dann geht, geht man durch und importiert die ganzen Dinger.
Hm.
Ja, falls jetzt noch jemand zuhört, der neugierig ist, freut sich.
Achso, ja, genau.
Ey, Moment, wir sind noch nicht ganz, ganz durch mit den, äh, äh, Geschichten.
Äh, was haben wir denn, äh, was haben wir denn noch, ähm...
Nee, oder sind wir doch durch?
Hattest du noch irgendwas?
Nö, gerade für jetzt.
Alles klar, okay, dann haben wir doch, sind wir doch mit dem News-Teil durch.
Alles klar.
Ja, ja, ja.
Okay.
Hm.
Dann mache ich hier mal Kapitelmarke zu, äh, ähm, ja, zum eigentlichen Thema.
Und, ähm...
Ja, wir wollten natürlich jetzt erklären, was naiv-based denn ist.
Was macht das denn?
Wofür braucht man das denn?
Und, äh, erst mal ist das, erst mal, glaube ich, so eine Beschreibung einfach nur für so ein statistisches...
Ja, äh, also die...
Base, Base-Riegel, äh, kennt man ja vielleicht, äh...
Kennt man das?
Ja, warte, lass mich nochmal...
Ja, das geht ja, also bedingte Wahrscheinlichkeiten und, äh, bedingte Wahrscheinlichkeiten von Ereignissen berechnet, die in der Zukunft stattfinden.
Oder anhand dessen von der Eintrittswahrscheinlichkeit, die in der Vergangenheit, die man schon kannte, von ähnlichen Dingen.
Und, ja, dann kann man die miteinander kombinieren.
Also, Base, Base-Theorem ist eigentlich einfach nur...
Wir gucken jetzt nicht wirklich bei Wikipedia nach und lesen Wikipedia vor, oder?
Nein.
Wie das? So ein Kibitz.
zu und das gefetzt ist.
Naja,
also ja, im Grunde ist das einfach nur eine
Möglichkeit, wie man halt
sozusagen, ja,
die Wahrscheinlichkeiten umdrehen kann.
Also man weiß
halt die Wahrscheinlichkeit
von B,
wenn A, ja, und jetzt muss man das irgendwie umdrehen.
Dafür gibt es halt diese Regel, die das dann sagt, wie das geht.
Ja, nur mal als Beispiel, was kann man das denn?
Also ihr habt jetzt ein Kartenspiel oder sowas,
ja, die Wahrscheinlichkeit dafür, dass ihr einen König zieht,
wie viel ist das denn? 4,52
oder so, ne?
Und dann willst du halt wissen, wie hoch die Wahrscheinlichkeit ist,
dass du ein Bild ziehst und dann hast du wie viel?
Dreimal,
4,52 und dann kannst du dir überlegen,
ja, die Wahrscheinlichkeit,
dass du einen König ziehst und es ein Bild ist.
Dann hast du die Wahrscheinlichkeit, dass es ein Bild ist
und die Wahrscheinlichkeit, dass es ein König ist und andersrum.
Ja.
Aber die Wahrscheinlichkeit, dass es ein Bild ist
und die Bedingung, dass es ein König ist, ist halt 1,
weil jeder König ein Bild ist und andersrum kannst du dann halt
ausrechnen, was kommt denn da raus.
Ja, also verknüpfst du halt die beiden Wahrscheinlichkeiten
mit den Ereignissen und so kann man ein bisschen
in die Zukunft schauen. Das ist ja das, was die Statistiker
so gerne tun.
Darüber reibeln.
Ja, wir haben eine Eintrittswahrscheinlichkeit, die würden wir gerne bestimmen
anhand von, ja,
Features und das ist ja das, was uns dann hinterher
dann in diesem Machine Learning Ding, glaube ich, am meisten
interessiert, wie man aus diesem einfachen
Beispiel von
Feature-Dingern, ich glaube, wir haben gesagt,
wir machen das anhand diesem Spam-Beispiel, das heißt, es geht darum,
glaube ich, welche Worte
da kommen.
Im Grunde sind halt die,
was man halt weiß, ist
sozusagen die Wahrscheinlichkeit,
dass wenn man bestimmte Worte
sieht, ob das jetzt Spam ist oder nicht, man möchte es halt umdrehen,
man möchte halt sagen können,
ja, wenn ich jetzt diese
Nachricht mit den Worten gesehen habe, welche Wahrscheinlichkeit habe ich
denn jetzt?
Ja, das ist das Gute an, deswegen ist das ja auch naiv,
weil man
tut so, als wären die unabhängig voneinander, als wäre ein Wort
entweder Spam oder nicht. Genau, und das ist
natürlich nicht so richtig, das stimmt nicht
und man darf das nicht einfach so alles aufmultiplizieren.
Man kann auch Idiot-Base sagen oder so
eine Scheiße.
Ja, aber es funktioniert tatsächlich relativ gut.
Genau, das ist ja auch
irgendwie sozusagen der erste
funktionierende Ansatz gewesen, um irgendwie mit
diesem Spam-Ding fertig zu werden.
2004, Programme, Plan for Spam.
Ich habe das jetzt ehrlich gesagt gar nicht so
deswegen gewählt, weil das für Machine Learning so eine
interessante Geschichte ist, weil eigentlich ist es das nicht.
Das verwendet man, ja,
also Bildklassifikation,
so einfache Dinge, ja, nein, bist du drauf,
nicht? Nein. Ist mein Gesicht drauf, nicht?
Kann ich nicht mit Base machen?
Nee, da wird es wahrscheinlich eher, das wird schon nicht mehr gehen.
Aber
es ist trotzdem interessant, und zwar, also
ich habe das vor allen Dingen deswegen
mir jetzt nochmal angeguckt, beziehungsweise überlegt, dass das ein
gutes Beispiel wäre, weil
ich ein Beispiel haben wollte für
etwas, was man in
Pure Python sozusagen machen kann,
wo man nur die simplen Daten,
Strukturen irgendwie nimmt, die man
halt irgendwie so dabei hat, also
Skalare, Listen,
ja, oder beziehungsweise
Strings als eine Form von irgendwie
Variablen, die jetzt halt einen bestimmten Wert haben,
Listen,
Dictionaries,
und das war es eigentlich.
Und mehr braucht man gar nicht.
Und man hat halt dann noch Funktionen, die man
irgendwie aufruft, und das war es.
Und das ist halt...
Ihr seht, wir sind bei einer brutalen Einstecker-Folge
angekommen. Ja, eigentlich schon.
Ja, also das ist halt das
Interessante, dass man damit halt so wahnsinnig
viel machen kann. Und das ist halt
etwas, was ich gerne irgendwie vermitteln würde,
weil das, also wenn man das hinkriegt,
wenn man das versteht,
dann hat man schon ganz viel,
ja. Okay, das heißt, anhand Python lernen,
ein bisschen anhand von Jochen's Beispiel,
mit dem man auch Machine Learning machen kann,
und zwar er hat ein Notebook, hast du auch
auf deinem GitHub? Genau, das kann ich
dann auch in den Show Notes verlinken, wo da halt
dieses Notebook drin ist, und sich das mal angucken
kann. Ich benutze
einfach irgendwie, es gibt so ein SMS
Spam-Dataset
über Kekkel.
Das habe ich mir runtergeladen, irgendwie auf meinen
S3 gepackt, und das Notebook
zieht sich das davon einfach und lädt das runter,
und dann hat man das. Das ist nicht so viel, das sind
irgendwie... Warte, lass mich mal grad gucken.
Ich werde die Stadt, das ist dieses Ding hier auch einfach mal erstmal neu.
Okay, grad...
Okay, lad das mal
runter, das sind irgendwie nur so 200 Kilobyte.
Okay, so.
Dann parseln wir das mal.
So. Okay, wie
viele Nachrichten haben wir denn da drin?
5.500
und
davon sind
ich weiß jetzt gar nicht genau, wie viele
1.500 sind...
Ah, nee, ich weiß nicht, ihr müsst ja nachgucken.
Also es sind deutlich mehr
Hemm als Spam, aber...
Ein Schinken? Ja, genau.
Und, ähm...
Ja, aber es sind halt eigentlich nicht viele
Datenpunkte oder Beobachtungen,
sozusagen, wenn man jetzt so heutige Maßstäbe anlegt,
aber es ist auf jeden Fall ein
Datastat, wenn man schon so ein bisschen was machen kann, und
ja, es tut halt auch nicht weh, wenn man es irgendwo hin runterlädt.
Ja, du konntest ja auch erstmal so ein bisschen Handling
dafür bekommen, wie funktioniert das denn mit der
Klassifikation, wenn ich jetzt so zwei Dinge
habe, die ich voneinander trennen möchte, ne? Genau.
Dieses Ding, das Beispiel hier würde übrigens auch
für, äh,
sozusagen beliebig, also ganz beliebig vielleicht
nicht, aber mehr als zwei auf jeden Fall auch
funktionieren, also ganz genauso. Also aber
es wäre Multiklass-Klassifikation,
das heißt, man würde hinterher
sozusagen die bestpassendste Klasse
rausfallen, man würde nicht mehrere
äh, äh, Klassen,
zu denen jetzt irgendwas gehört, bekommen. Also man
könnte sich ja vorstellen, es gibt jetzt nicht nur
äh, Spam und Hemm, sondern es gibt auch noch
irgendwie Newsletter oder
irgendwie Notifikationen
von irgendwelchen Social Networks oder sowas.
Ah, das Spam. Ja,
aber vielleicht möchte man das ja aus welchen Gründen auch
immer irgendwie feiner unterteilen, und, ähm,
die Notifikationen sehen, die dich irgendwie
dahin latschen sollen, doch mal wieder ein bisschen Zeit
irgendwie auf Facebook zu verbringen oder so.
Ähm,
und, äh,
dann würde man jetzt mit dem Ansatz auch immer
nur, äh, eine von den Klassen kriegen. Aber es
könnte natürlich eben sein, dass es zum Beispiel eine Notifikation
ist und Spam.
Ja, also dann, weil das da rausfällt,
ne? Weil Naive Base halt einfach sagt, nö,
ich will jetzt nur eins haben.
Also das wäre jetzt, also das, was wir,
das, was in den Roadbooks drinsteht,
da fällt halt hinterher eine Kategorie
bei raus. Man könnte es auch so umbauen,
dass es, dass es Multilabel kann,
aber ist halt nicht so.
Wir machen ja das eine Anfänger-Base. Wir machen jetzt eine
einfache Spice-Base, genau.
Also, genau, äh,
so, was wir jetzt, was wir
jetzt da zuerst machen, ist das halt
in Training- und Test-Dinger aufzuteilen.
Da habe ich das einfach zufällig getrennt nach,
also 25% sind halt
Test, äh, der Rest ist Training.
Das ist 75, 75%.
Und, ähm,
ja, das, was ich jetzt eigentlich,
sozusagen, äh,
und das wäre natürlich
schon schön, wenn man sich das irgendwie angucken würde,
oder so, aber was ich jetzt eigentlich,
äh, äh,
zeigen wollen würde, ist,
dass, äh, wie einfach das ist,
äh,
sozusagen ein Modell zu trainieren,
das jetzt zwischen Spam und Nicht-Spam unterscheiden kann.
Und zwar das schon relativ gut.
Also dem ist einfach die bedingte Wahrscheinlichkeit
vorhersagt, dass es, äh, Wörtern hält,
die Spam sind, unter der Bindung, äh, könnte Spam
sein. Ja. Ja.
Äh, ich kann ja mal kurz versuchen, mit Worten
zu beschreiben, wie dieser Trainingsprozess, äh,
aussieht. Und der ist halt,
man, äh, geht jetzt
über alle, äh, Dokumente, die entweder
Spam oder Ham sind, drüber. Die in den Trainingsdaten
steht ja dran, ob es Spam ist oder nicht. Und guckt, ob Penis drinsteht.
Ja, genau. Teilt, äh,
das, äh, teilt, äh,
irgendwie diese SMS halt auf
in die Wörter, aus denen sie besteht.
Äh. Und da guckt man in
alle, also man hat ja Trainingsdaten, wo halt drinsteht,
dass es Spam ist oder es nicht Spam ist. Genau. Und wenn
man jetzt sagt, okay, in denen, wo es
Spam ist, kommt 50 Mal Penis vor und
in denen, wo nicht Spam ist, kommt nur einmal Penis
vor, dann hat man so eine bedingte Wahrscheinlichkeit.
Ah, die Wahrscheinlichkeit, dass Penis vorkommt und es
kein Spam ist und die Wahrscheinlichkeit, dass Penis drin vorkommt, ist
Spam ist. Und daraus hat man jetzt auch
nach Base so eine kombinatorische
Möglichkeit, sich das rauszurichten.
Genau. Man hat jetzt für jedes einzelne
Wort eine Wahrscheinlichkeit dafür,
dass dieses
Wort irgendwie in dieser Kategorie
vorkommt. Genau. Sozusagen. Das ist einfach die Frequenz
von dem Wort in der Kategorie. Also wenn
halt, äh, äh,
ähm, ja, ähm,
also man muss das natürlich immer noch eben
teilen durch die Anzahl der Worte, die überhaupt
irgendwie in der Kategorie vorgekommen sind. Deswegen muss man sich das
halt auch noch merken. Also was man tut, ist, man geht halt über
alle Dokumente, merkt sich, okay,
äh, wie viel, äh,
Wörter habe ich denn jetzt
bisher gesehen für die, ähm,
Klasse Spam
oder Ham und zählt das dann halt
hoch. Je nachdem, ob das... Haben wir heute
schon mal Penis gesagt? Entschuldige, bitte.
Ich war halbart. Oh, wir fliegen bei
iTunes raus, Mann.
Ah, wo, wir sind auf iTunes?
Na gut. Keine Ahnung.
Nee, ich glaube nicht, aber...
Das könnte
eine sehr gefährliche Folge werden. Wir lesen
keine Spam-Geschichten vor. Na gut.
Auch wenn wir damit reich werden können.
Reich werden?
Nee, das ist ein altes, altes
SMS-Spam.
Okay, wir denken euch gerade ab davon.
Also, das, was eigentlich,
was man da eigentlich macht, ist, man geht halt über
alle Wörter drüber und merkt sich halt sozusagen
für das entsprechende
Label, was man gerade gesehen hat, irgendwie
ja, man hat jetzt,
man zählt da halt hoch, wie viele Wörter
hat man in dieser Kategorie überhaupt gesehen
und man zählt jetzt sozusagen
noch hoch quasi
welche Worte man
wie oft gesehen hat in dieser Kategorie. Und dann kann man
hinterher sagen, okay, wenn ich jetzt
eben
in der Kategorie
Spam 10 Mal Penis
gesehen habe und ich habe insgesamt 1000
Wörter gesehen,
unterschiedliche Wörter, dann
ist...
ist die Wahrscheinlichkeit, dass es Spam ist,
wenn ich jetzt
das Wort Penis sehe,
ist es halt, was ist das dann?
Ein Prozent oder sowas.
Ich habe jetzt nicht genau mitgerechnet,
aber...
Ja, es ist immer blöd sowas.
Also, genau.
Und das macht man jetzt, also
nochmal, ich gehe einfach jetzt...
Verdammt, das ist gar nicht so einfach.
Also, die Trainingsfunktion ist einfach nur,
ja, man geht über
alle Dokumente drüber, zählt
für das Label halt
hoch, wie viele Dokumente man...
Ach, Quatsch,
jetzt habe ich das auch noch falsch erklärt.
Ja, da musst du nochmal von vorne anfangen.
Ja.
Was man
eigentlich...
Du wusstest, dass du Landfahrer warst?
Ja, ja, natürlich. Landfahrer.
Dazu kann ich was erzählen.
Mit
Diveways habe ich offenbar keine Ahnung von,
aber, nee, das ist eine
ganz, ganz, das ist eine ultrainteressante
Geschichte,
dass in,
also im
in England
gab es halt diese Kaste der Landfahrer, die waren reich.
Das, wenn man
zum Beispiel, na, wie heißt das?
Eine Abtei,
ein Gutshof.
Priorei,
wenn es darum geht.
Wie hieß
dieses Buch nochmal?
Pride and Prejudice.
Genau.
Also, ich frage so, irgendwie, ja,
das spielt ja so ein bisschen,
ja, eigentlich
ein gutes Buch, kann ich empfehlen.
Und dann kommt da plötzlich
dieser Pfarrer, wie kann das sein?
Das gehört doch eigentlich gar nicht dazu.
Die spielten da mit.
Das war eine Klasse von Leuten, die relativ
viel verdient haben
für die damaligen Verhältnisse, oder
waren halt so uns.
Sie mussten praktisch nichts tun dafür.
Voll gut.
Ab und zu mal vor der Kanzel, Herr Wunter.
Und es gab sehr viele davon.
Und das gab denen Zeit, sich mit allen möglichen,
abseitigen,
in allen möglichen
Richtungen ihren Interessen nachzugehen.
Das war schon ein bisschen Nachbrudertakt, oder?
Ich stelle mir gerade so, wie jemand aussieht wie ich,
mit so einem großen Fass am Bauch.
Deutlich später.
Aber es gibt Leute,
die tatsächlich ernsthaft behaupten,
dass das einer der Gründe dafür ist,
warum die Industrialisierung irgendwie so abgehoben hat
und warum so viele
coole neue Sachen da irgendwie rausgekommen sind.
Weil es gab halt eine Menge Leute, die hatten viel Zeit,
viel Geld und echt nichts zu tun.
Und dann haben die halt irgendwie sich einfach da so interessiert,
wie baut man eine Dampfmaschine?
Oder ich meine, Darwin war auch so jemand, ne?
Also, ähm, ja.
Bayes war so jemand.
Mir fällt das jetzt nicht ein, aber es gab eine ganze Menge,
eine ganze Menge der Leute, die jetzt so total bekannt sind,
wo man sich denkt so, wow, die haben großartige Sachen gemacht.
Waren Landfahrer in England.
Ja, war gut.
Ja, dritte rückwärts Induktion.
Ja, äh, genau.
Also, was ich jetzt gerade blödsinnigerweise falsch erzählt habe,
ist, dass man sich nicht merkt,
wie viele Worte jetzt in der Kategorie vorkommen,
sondern merkt sich halt, wie viele Dokumente kommen jetzt
pro Kategorie eigentlich vor.
Und, äh,
genau. Also, was man sich eigentlich merkt,
ist, ähm,
wie viele Dokumente hat man jetzt
pro Kategorie gesehen?
Und dann halt noch für jedes Wort da drin,
sozusagen, wie oft kam denn dieses Wort in der Kategorie vor?
Und dann hat man die Wahrscheinlichkeit,
dass ein Wort vorgekommen ist,
wie zum Beispiel ein Piep,
unter der Bedingung, dass es Spam ist.
Ja.
Oder das Wort Piep, unter der Bedingung, dass es kein Spam ist.
Und das hat man zwei bedingte Wahrscheinlichkeiten.
Und daraus kann man jetzt mit der allgemeinen Wahrscheinlichkeit
für das Vorkommen dieses Wortes
rausrechnen, wie hoch die Wahrscheinlichkeit denn sein könnte.
Genau. Aber das klingt halt alles
irgendwie so relativ kompliziert, wenn man es so erklärt.
In Code ist das sehr wenig Zeilen.
Ja, das ist so ein bisschen Brain hin und her.
Also, diese Train-Funktion, die hat halt,
lass mich nicht lügen,
eins, zwei, drei, vier, fünf, sechs, sieben Zeilen.
Das ist alles.
Und die sind alle relativ kurz.
Also, keine von diesen Zeilen
hat mehr als
30 Characters oder sowas.
Also, es ist wirklich sehr, sehr
einfach.
Und, ja, man kommt mit
den ganz simplen Datenstrukturen.
Ich habe jetzt an der Stelle Default-Stick genommen,
weil das in Zellen halt schöner ist, als
wenn man das normale Dick nimmt. Da muss man so oft Get schreiben.
Aber was ist Default-Stick?
Ach, das ist eine Bibliothek aus der Standardbibliothek.
Nee, ja, es ist eine Standardbibliothek.
Genau, und zwar aus dem
Collections-Modul.
Und was das macht, ist, dass man,
also, das sollte man vielleicht schon kennen,
beim Dict kann man sagen,
irgendwie Dict.setDefault,
dann gibt man
einen Key an, dann halt der,
ja, dann den Wert
oder halt eine Datenstruktur,
also ganz oft, was man halt macht
oder früher gemacht hat, heute nimmt man wahrscheinlich
Default-Stick, ist halt irgendwie, du hast
halt
irgendeinen Dict, einen Key
und dann eine Liste von Sachen, die da dranhängen
und dann sagst du irgendwie,
dieses Dict.setDefault, irgendwie
dein Key, Komma,
ja, Ecke-Klammer auf, Ecke-Klammer zu,
also Liste, Klammer zu, Punkt, Append,
irgendwie da einen Wert rein.
Das kann man auch machen, man kann
das auch mit
SetDefault machen, aber dann ist die Zeile
relativ lang und dann wird es so ein bisschen eklig.
Ich hoffe, ihr habt mitgeschrieben.
Da halt ein Default-Dict
macht das halt alles sehr viel einfacher und
standardisiert das sozusagen, sagt man halt irgendwie,
okay, wenn ich jetzt ein Default-Dict
habe von List, dann macht
es genau das und dann muss man nicht SetDefault die ganze Zeit
sagen, sondern normalerweise würde
ja, wenn ich ein Dict nehme und
da einfach irgendwie ein Key reinsetze und
dann dem irgendwie, dann sage Append
irgendwas oder so oder dem Wertzuweiser,
dann kracht es halt, weil das sagt dann halt Key-Error,
die Key gibt es da gar nicht.
Und wenn man ein Default-Dict nimmt, dann passiert das nicht.
Also, weil er dann immer die leere Liste
drin hat. Wenn es das noch nicht
gibt, dann erzeugt er halt in dem Moment halt
entsprechend eben eine Liste oder halt ein Integer,
oder wenn man sagt Default-Dict von Int,
dann wird halt, kann man halt sagen,
irgendwie
Dict, Ecke-Klammer auf, Key, Ecke-Klammer
zu, plus gleich irgendwas,
plus gleich eins zum Beispiel und zählt
damit halt hoch, ohne dass es ein Key-Error
gibt, auch wenn es den Key darin noch nicht gab, weil
wenn es den Key nicht gibt,
dann wird das halt erzeugt.
Und zwar, ja.
Schön, Default-Keys direkt mit den Keys.
Hatte ich ja schon mal, dass ihr irgendwie auf einen Key zugreifen
wolltet, in dessen ein Error gab und euer Programm
durchgeflogen ist mit SetDefault.
Das ist nicht passiert. Genau, also
SetDefault hat man dann früher gemacht und heute
denke ich, machen die meisten Leute tatsächlich, oder ich weiß es nicht,
es ist ja interessant, Default-Dict
und man kann das dann auch noch ineinander schachteln, also für die Counts
der Wörter in den einzelnen Kategorien habe ich
jetzt ein... Ah, das ist ja so unheimlich kompliziert,
wenn man in Statistik irgendwie die ganzen bedingten
Wahrscheinlichkeiten immer gegenseitig umdreht, aber hey, wir können
Dicts ineinander schachteln, das ist doch schön.
Ja. Jason hört sich das an, wie Jason.
Ja, Dicts und Jason
haben ja auch viel miteinander zu tun, also das ist ja sowas ganz
ähnliches, es ist halt, könnte es Dicts
als Jason rausrealisieren,
also na gut, wenn es halt, du hast halt Objekte,
die sich nicht in Jason rausrealisieren lassen,
was natürlich auch sein kann, wie...
Ja, und was ich total nett finde, ist, dass
bei Jason, wenn ich das richtig im Kopf habe, dass
immer bei den letzten Elementen das
Komma nicht dastehen darf. Ach ja,
das ist anders. Ja, Jason hat so ein paar so hässliche
Seiten, ja, das ist so ein bisschen,
genau, Jason zu parsen ist so ein bisschen
ätzend.
Aber genau, also das
ist wirklich, wirklich wenig,
wirklich wenig
Zeilen und trotzdem hat man damit
ein Modell gebaut, das dann ganz
ganz ordentlich funktioniert.
Die Klassifikation ist jetzt ein bisschen
schwieriger.
Ja, wir möchten gerne
jetzt klassifizieren.
Das beschreibe ich jetzt nicht, das hat schon beim Trainieren, das ist
total einfach, hat das nicht gut funktioniert und jetzt beim
Klassifizieren, also da kann man sich angucken, wenn einem das
interessiert. Im Grunde, was passiert ist
eigentlich nur, dass man
halt bei einer neuen Nachricht, bei der man nicht weiß,
ist das jetzt bei mir oder nicht, das legt man auch
wieder in Worte und
ziert dann halt in, für jede Kategorie
halt sozusagen die Kategoriefrequenz
dieses Wortes auf.
Ja, also, um das erstmal nochmal zu simplifizieren,
zu sagen, ohne dass das technisch vielleicht ganz korrekt ist, man nimmt
einfach die Wahrscheinlichkeit jedes einzelnen
Wortes, ob es Spam ist oder nicht Spam
ist, also bei Viagra oder
Peep, ist es vielleicht relativ hoch, dass
dann die Mail Spam ist und multipliziert die miteinander
und bekommt dann einen Gesamtwert raus, ob es
jetzt nur Spam sein könnte oder nicht.
Genau.
Diese Zahlen sind dann halt
sehr niedrig oft, weil
entsprechend halt, ja, Worte auch nicht
jetzt so, meistens gibt es...
Hier muss man natürlich noch mit der Anzahl normalisieren oder sowas.
Genau, also normalerweise
man muss auch ein bisschen aufpassen, man muss ein bisschen tricksen,
damit man da nicht irgendwie so in,
es wird halt null irgendwie
dadurch, dass man zu oft kleine Zahlen
miteinander multipliziert hat.
Ja, also ich glaube auch, wenn du größere Zahlen miteinander multiplizierst,
die unter 1 sind, wird es irgendwann null.
Eben, genau, genau. Und das ist halt, also
muss man halt gucken, wenn die Texte lang werden,
jetzt bei Essen auch praktisch sind sie nicht so lang, aber
da muss man halt Maßnahmen ergreifen, ich weiß nicht,
ob ich das hier getan habe, dass das
nicht null wird. Es ist aber auch
im Grunde egal, es geht ja nicht darum,
eine exakte Wahrscheinlichkeit auszurechnen,
sondern das irgendwie klassifizieren
zu können. Du könntest einfach den Logarithmus davon nehmen.
Ja, genau, das könnte man zum Beispiel machen, ja.
Und
was ich jetzt da gemacht habe, ist
es einfach so zu normalisieren,
dass halt hinterher die Summe der
beiden
Zahlen, die aber rauskommen, halt wieder 1 ist,
sodass man das halt als Wahrscheinlichkeit interpretieren kann.
Ja,
und
dann wisst ihr halt, ne, das ist tatsächlich so,
der Quotient ist Spam, ist kein Spam
und dann habt ihr tatsächlich daraus
logischerweise eure Wahrscheinlichkeit.
Genau, und das funktioniert
halt jetzt, also bei dem Dataset war das so...
Und das wäre das Coole an der E-Face, dass es funktioniert mit relativ
wenig Daten, wie ihr gerade gehört habt und
schnell sogar. Es ist sau schnell,
es ist, also das ist wahrscheinlich
schneller als so ziemlich alles andere, auch deswegen,
weil das halt kaum was macht, ne,
das ist halt irgendwie
und, oder ich
bin mir ziemlich sicher, dass es wahrscheinlich schneller ist
als die meisten anderen
Machine Learning Verfahren.
Es ist sau schnell, man braucht keine
Spezialbibliotheken wie NumPy oder sowas.
Aber ist das schon richtiges Machine Learning,
weil im Prinzip berechnest du ja nur die einzelnen Wahrscheinlichkeiten
von den einzelnen Kategorien? Ja, aber ist es, ja.
Na gut, jetzt wissen wir, warum
Statistiker sagen Haha.
Ja, ja, natürlich, also sie haben ja auch so ein bisschen
Recht, das ist schon so, aber
trotzdem,
ich meine, du kannst damit halt Sachen machen,
wo Statistiker
halt Schwierigkeiten mit hätte.
Also wenn man das jetzt auf Papier
machen wollen würde.
Der Unterschied zwischen Statistik und Machine Learning ist, man schreibt es in einen Computer.
Ja, ich würde tatsächlich sagen,
das ist einer der Hauptunterschiede, dass du es halt mit Computern
machst und auch damit rumspielen kannst
und während du auf, weil
ja, klassischer
Statistik irgendwie
die Formeln ausschreiben musst. Genau,
dann machst du es auf Papier alles und guckst halt,
was ja auch viel oft dann genauer geht, ja,
du kannst dann halt dein Modell viel besser
irgendwie
äh,
bauen und so, aber
und du hast halt nur wenige
Beispiele oft, während bei
Machine Learning ist es so oft, ob das
jetzt alles so genau passt oder so, das interessiert dich
gar nicht, sondern es muss halt hinterher ein gutes Ergebnis
rauskommen, das kannst du evaluieren
und warum das jetzt nicht funktioniert.
Man kann auch mal statistische Fehlerchen machen.
Ja, das kann man natürlich auch.
Es geht ja nur darum, ob morgen Wetter, Sonne
scheint oder nicht.
Ja, ja, also sagen wir mal so,
die Kritik ist teilweise schon prächtig, aber
man muss halt immer mit seinen Daten auch ein bisschen
aufpassen, ne, stimmen die denn? Und das Problem bei solchen Dingen
ist halt, ihr habt halt meistens Abhängigkeit
zwischen einzelnen Merkmalen irgendwie dann doch
und, ähm, ja, also nur eine Mail
in den Müll zu schmeißen, weil jetzt Piep drin vorkommt,
äh, ist vielleicht blöd, vielleicht habt ihr auch eine nette
Mail geschrieben von eurer, äh,
oder eurem zukünftigen Geliebten, der wollte euch irgendwas Nettes schreiben und dann ist er im Spam-Ordner gelandet oder sowas.
Ja, genau. Aber wenn man das jetzt evaluiert, also was dabei rauskommt, ist schon ganz gut.
Genauigkeit ist ein bisschen irreführend, gerade wenn die Klassen nicht so viel, wenn das halt nicht gleich verteilt ist, sondern sehr unterschiedlich.
Da gibt es auch immer ein schönes Beispiel bei Spam, wenn halt irgendwie die Wahrscheinlichkeit, und das ist tatsächlich so,
ich glaube mittlerweile, es kann sein, dass mehr als 99% aller verschickten Mail irgendwie Spam ist.
Und wenn man dann einen Klassifikator macht, der einfach immer sagt, es ist Spam, dann hat er eine Accuracy von 99%.
Tja, verdammt.
Sieht gut aus, ist aber nicht wirklich sinnvoll, weil das Problem ist, man bekommt keine...
Keine tiefere Erkenntnis.
Ja, der guten Mail kommt noch durch, das heißt, man kriegt gar keine Mail mehr, was so ein bisschen vielleicht nicht der Sinn von Mail ist.
Ja, wäre kontraproduktiv tatsächlich.
Ja, aber sehr halt in dieser...
Kommst du auf viel Spam?
Ich weiß es ehrlich gesagt nicht, es kommt kaum was durch.
Ich habe letztens eine gekommen, die kam super durch, das war sehr spannend.
Ja?
Ich habe gefragt, ob ich mich nicht sofort für schnellen Text treffen möchte und noch heute und ich müsste auch einfach nur hier draufklicken.
Wirklich, also sowas habe ich noch nie bekommen, das war das erste Mal seit bestimmt acht Jahren oder sowas, dass sowas in meinem Postfach landete einfach.
Okay, ist interessant, wie Sie das geschafft haben, durch die Spamfilter durchzukommen.
Ich habe keine Ahnung.
Ja, Werbung, genau, ich weiß es nicht genau, ich gucke jetzt hier gerade mal in meinen Spamfilter, doch, es kommt jeden Tag, ich weiß es jetzt nicht, allein heute sehe ich also wahrscheinlich schon so 40, 50 Spam-Mails oder sowas.
Wie viele E-Mails bekommst du eigentlich jeden Tag? Ich habe das irgendwann mal komplett raus sortiert und...
Ich weiß es nicht, meine Inbox hier hat gerade so 5.600 ungelesene Mails.
Von 10.000 reduziert, ich bekomme relativ schnell voll, aber so 100, 200 Stück bleibt da.
Die ganzen Mails, alle deabonniert, alles rausgekickt, alles gelöscht, wollte ich alles nicht mehr haben, meine Dokus, nö.
Ja, also dieses, ja, also, ja, Mail ist problematisch.
Ich bekomme natürlich jeden Tag immer zehnmal Fanpost von Hörern von diesem wunderschönen Podcast.
Ja, da geht es gerade noch so, da könnte, das ist okay.
Also, wenn ihr möchtet, schreibt uns dann, hallo.
Ja, das ist schon okay.
Es gibt ja auch keine, das Blöde ist halt irgendwie, es gibt ja auch keine Lösung.
Natürlich kann man sagen...
Man nimmt einfach keine Mail mehr an oder man liest das nicht oder so, das ist auch...
Also, ihr könntet mal einen Test machen, ihr könntet ein Piep in das nächste E-Mail, Fan-E-Mail dann uns schreiben.
Also, einmal das Wort und mal gucken, ob es bei uns im Filter landet.
Also, wir sehen das auch, also, ich gucke zumindest in den Filter, ab und zu mal rein, liest du auch?
Ja.
Also, ich schon, ich kann...
Ich verlasse mich darauf, dass das irgendwie funktioniert.
Okay.
Und dass Leute, wenn es irgendwas Wichtiges war, dann halt andere Wege versuchen, mich zu erreichen.
Naja, also, glaubt ihr wirklich an einen Hörer, wenn er uns...
Nee, das kann sein.
Ich versuche eine Liebeserklärung zu...
Ja, das...
Das funktioniert leider nicht, ne?
Ja.
Ja, ja, ja.
Aber, genau, also, was ich halt an dieser Geschichte schick finde, ist, also, man kann halt mit wenigen Zeilen Pipen, kann man halt einen Arc-Base-Classifier schreiben, der schnell ist, der relativ genau funktioniert.
Man würde das jetzt nicht wirklich verwenden, wenn man tatsächlich in den Spam...
Wie groß war jetzt nochmal der Trainingsdatensatz?
5.000, hast du gesagt?
5.500.
Vorpräsentierte Nachrichten.
Könnte man noch zusammentragen, wenn man...
Wenn man so ein Classifier-Problem selber lösen wollen würde.
Ja, ja, nein.
Also, ich meine, man würde das jetzt nicht, wenn man jetzt irgendwie einen Spam-Fühler tatsächlich verwendet in einem Mail-Client oder so, da würde man jetzt diesen Ansatz nicht nehmen.
Aber...
Also, weil das halt nicht so genau ist.
Ich hab das jetzt mal verglichen, da drunter sind noch so irgendwie zwei andere Dinge.
Ich hab einmal einfach nur eine lineare Support-Factor-Maschine genommen, die ist halt ein Stückchen besser.
Und auch nicht viel lang, also die ist auch sehr schnell.
Und dann hab ich auch nochmal Spacey genommen.
Mit so einem 1D-Convolutional-Netz.
Und das ist unfassbar viel langsamer.
Alle wieder abgehängt.
Ja, also, der Witz ist...
Also, eigentlich natürlich nimmt man nicht NaiveBase.
Aber es könnte Situationen geben, in denen das total sinnvoll ist, sowas zu benutzen.
Wie zum Beispiel...
Also, ein Szenario wäre, du möchtest Trainingsdaten generieren.
Ja.
Und du hast jetzt...
Möchtest das aber im Frontend machen, sodass das halt sich für denjenigen, der das editiert, halt irgendwie...
Ja.
Schnell und so anfühlt es, dass er damit irgendwie gut arbeiten kann.
Und jetzt...
Möchtest du halt nicht jedes Mal ein Request machen und uns irgendwie einen Server schicken, wo dann irgendwie irgendwas installiert ist mit NumPy oder so, was dann halt irgendwie ordentlich einen Classifier hat.
Sondern dir ist wichtiger, dass es schnell ist.
Und das letzte Prozent Genauigkeit interessiert dich nicht.
Oder das letzte Prozent F1-Wert oder so.
Weil es einfach nur darum geht, möglichst schnell viele Trainingsdaten zu erzeugen.
Und dich interessiert vielleicht noch...
Ob ein Ding schwer oder leicht zu klassifizieren ist.
Aber nicht, ob das jetzt ganz genau stimmt oder nicht.
Weil es guckt ja eh jemand auch mal drauf.
Und da kann halt das...
Dieses Naiv-Based-Ding könntest du auch in JavaScript problemlos implementieren.
Es wären ein paar Zahlen mehr, nicht viel mehr Zahlen.
Und es wäre auch sauschnell in JavaScript.
Und du könntest das halt im Frontend verwenden, um halt basierend...
Also jemand sagt, das ist Spam, das ist Spam.
Okay, sortier mir nochmal um, sodass die uneindeutigen Fälle oben sind halt.
Äh...
Und dann sortierst du nochmal.
Machst nochmal 20 Beispiele für die, 20 Beispiele für die Gruppe.
Sortierst nochmal um.
Dann kannst du halt wahrscheinlich tausende von Dingen in relativ wenig Zeit irgendwie labeln.
Und benutzt halt zum Sortieren einen Classifier, der halt im Frontend-Code in JavaScript so läuft.
Und für den Fall...
Aber wir sind doch hier beim Python-Podcast.
Ja, natürlich.
Also du kannst das halt auch in Python machen.
TypeScript ist ja auch relativ nah dran, tatsächlich.
Ja, äh...
Aber, ähm...
Also, sagen wir mal so, das ist halt ein Vorteil, den fast alle diese sogenannten Skript-Sprachen halt haben.
Also ich finde das immer so ein bisschen, ähm...
Ja, man könnte das auch direkt wieder rausrennen dann, ne?
Und irgendeine Datenbank, kleine...
Äh, äh, äh...
Irreführend, wenn die dann halt so abwehren als Skript-Sprachen.
Weil das ist halt, das ist eine große Stärke.
Also du kannst halt wirklich solche Sachen...
Du brauchst im Grunde nur diese drei Grund-Datentypen, wie eben, ja, Zahlen, Strings, äh, also Variablen, wo halt ein Ding irgendwie drin ist, äh, Listen und Dicks.
Und kannst damit halt schon...
Und kannst damit halt schon sehr, sehr viel bauen.
Und, ähm...
Äh, ja, musst da nicht irgendwie großartig, äh, irgendwie Boilerplate schreiben und irgendwie eine Klassenhierarchie, äh, aufbauen, äh, und irgendwie UML-Diagramme malen.
Sondern du kannst das halt einfach mal so kurz runterschreiben und kommst damit, äh, wenn du es richtig machst, halt, äh, in Performance-Regionen, die sonst schwer zu erreichen sind.
Also wenn du jetzt zum Beispiel einen C++ machen wolltest und versuchst, schneller zu sein als diese Python-Implementation, wird das, das wird schwer.
Weil die Dict-Implementation ist in Python...
In Python relativ, relativ stark optimiert.
Da geht dann so viel Zeit rein, um das zu entwickeln.
In der Zeit hätte man einen Algorithmus.
Ja, es ist wirklich, äh, ja, ich meine, ich hab das ja dann auch schon häufig...
Also wenn du das dann in C++ machst und ansonsten die Hashmap aus der Standardbibliothek oder so, kann es gut sein, dass du langsamer bist als Python.
Weil, ja, die Implementation nicht so optimiert ist.
Und du kannst es mit C++ viel schneller hinkriegen.
Aber du würdest halt, äh, ja, derartig viel mehr Zeit dafür brauchen.
Und die Frage ist, brauchst du es halt so genau und so schnell?
Äh, bist du bereit dafür, so viel Zeit zu investieren?
Die Antwort ist oft, nein.
Es ist viel besser, irgendwie weniger Zeit zu brauchen.
Und, äh, etwas zu haben, das vielleicht nicht total super optimal ist, aber halt auch schon sehr gut.
Und das geht.
Und das ist halt, das ist das, was ich eigentlich damit sagen wollte.
Pre-Labeling von Trainingsdaten.
Ja.
Ja, wenn du, genau.
Oder halt auch, um zu verstehen, wie das funktioniert.
Um wirklich sagen zu können, okay, ich kann mich jetzt darauf verlassen, dass das halt wirklich klappt.
Weil das Problem ist ja immer an den, also Blackbox-neuronalen Netzgeschichten oder so auch.
Äh, du kannst da nicht so richtig gut...
Gut reingucken, natürlich kann man irgendwie, äh, das alles evaluieren oder so.
Aber du verstehst halt auch nicht so wirklich, was das tut.
Und es ist immer gut, so ein paar Sachen da zu haben, bei denen man wirklich auch das insofern verstanden hat,
dass man es einfach mal selber implementiert hat.
Weil man dann beurteilen kann, was da passiert.
Und wenn das halt ganz andere Ergebnisse liefert oder so,
dann hat man auch einen interessanten Ansatzpunkt, äh, wo man nachfragen kann, was ist denn da jetzt eigentlich passiert.
Und, ähm, genau.
Daher finde ich das super sinnvoll, ab und zu mal so ein Verfahren auch selber zu implementieren oder in NaiveBase.
War super, weil es halt so super einfach ist.
Ähm, genau.
Und, ähm...
Ja, also in Notebook hast du dann tatsächlich das nochmal verglichen von der Geschwindigkeit her zu den ganzen anderen Verfahren.
Von der Geschwindigkeit nicht, das sind einfach nur die, äh, die, die...
Äh, Präzisionsgrade, Entschuldigung.
Ähm, ja, ja.
Also eigentlich, eben Genauigkeit sollte man sich nicht angucken, sondern Präzision Recall.
Und, äh, ja, da ist halt irgendwie, äh, so lineare Support-Weck von Maschinen sind halt schon so ein bisschen besser.
Jetzt kurz, was ist Präzision Recall?
Ja, das ist halt Genauigkeit eben.
Ähm, Argument von eben ist halt, äh, äh...
Äh, wenn, wenn mehr als 99% der Mails, die man halt so sieht, Spam sind, dann, äh, ist Genauigkeit von 99% sagt halt nichts aus.
Weil...
Und dann benutzt man den Recall-Wert und...
Benutzt dann Präzision und Recall.
Und, äh, äh, Präzision ist halt, äh, sozusagen die, also man kann, es gibt vier Fälle, die auftreten können, wenn du jetzt, äh, irgendwie Spam klassifizierst.
Es kann halt sein...
Alpha-Fehler, Beta-Fehler, ja und nein.
Genau, genau.
Oder bei Machine Learning nennt man das oft, äh, True-Positive.
False-Positive, False-Negative und True-Negative.
Also sozusagen ist es...
Es ist Spam und du hast es als Spam erkannt.
Genau, das wäre True-Positive.
Es ist Spam und es ist bei deinem Impost-Eingang gelandet.
Das wäre, äh, äh, äh, äh, äh, False-Negative, ja.
Ja, oder es ist kein Spam und du hast es als Spam erkannt und es ist False-Positive.
Oder...
Es ist kein Spam und du hast es als Impost-Eingang, was genau das ist.
Ja, bei der, bei der Geschichte, also True-Negatives spielen bei uns jetzt keine Rolle, weil das ist halt das Gleiche, wenn du jetzt nur zwei Klassen hast.
Äh, wenn du jetzt mehrere Klassen hättest, müsstest du das halt dann auch nochmal unterscheiden.
Oder bei Multilabel musst du das unterscheiden.
Weil es dann ja auch sein kann, dass etwas in keiner Klasse liegt oder so.
Aber das, den Fall haben wir ja gar nicht, wir haben ja nur, äh, irgendwie Spam oder Ham.
Wir binär, genau.
Ähm, und, äh, genau, dann ist Precision, ist einfach True-Positive, Anzahl der Dinge, äh, Anzahl der True-Positives geteilt durch, äh, äh, äh, True-Positive plus False-Positive.
Also nochmal, äh, True-Positive ist ein, äh, Mail, die kein Spam ist und die im Post-Eingang landet.
Nee, True-Positive ist, äh, es ist, es ist kein Spam und es ist im Post-Eingang gelandet.
Also, und es wurde richtig gelaufen.
Habe ich das nicht gesagt?
Oder hast du das gesagt?
Ja, damit.
Okay, dann habe ich es nur falsch verstanden.
Musst du mal zurückspulen, nochmal neu hören.
Ja.
Genau, also es ist alles richtig gelaufen, das True-Positive.
False-Positive wäre halt, äh, irgendwie, es wurde als Spam erkannt, es war aber kein Spam.
Und jetzt, äh, addiert man halt die False-Positives auf die True-Positives.
Und, äh, wenn man jetzt sozusagen die True-Positives teilt dadurch, durch die größere Zahl,
dann die Quote der, äh, ja, wie kann man das sagen, die, die Quote der, äh.
Die man recht hat.
Weil jetzt, bei denen es richtig gelaufen ist, sozusagen.
Aber das ist jetzt nicht so wie bei der Genauigkeit, äh, sondern es ist halt, da wäre halt,
wenn man jetzt, äh, äh, sozusagen einen Classifier hätte, der immer sagt, ähm, Spam.
Ja, der hätte halt eine irre hohe Anzahl von False-Positives.
Und der hätte dann halt eine Precision von Null, mehr oder weniger.
Ja, und das heißt, er hätte, äh.
Da taugt jetzt nicht viel.
Ja, genau.
Ähm.
Okay, Recall.
Und Recall ist halt sozusagen das Gleiche, bloß, äh, irgendwie mit, äh, äh, False-Negatives statt True-Positives.
Und das beschreibt im Grunde, wie viel von denen, die ich hätte erkennen sollen, habe ich tatsächlich erkannt.
Ja, äh, äh, gibt's ja auch, man, man kann halt einfach auf Precision optimieren, indem man sagt, äh, irgendwie, äh, ja, man, man, äh, klassifiziert nur das Ding, wo man sich super sicher ist, als, äh, nur eins als super sicher, äh, äh, äh, als, als das, was man, wovon man es hält, ja, dann hat man wahrscheinlich eine Precision von eins.
Aber wenn man jetzt nicht alle findet, sondern, äh, irgendwie, äh, viele, äh, Spams halt durchgehen.
Es gibt so ein paar Machine Learning-Beispiele, für die das vielleicht gar nicht so irrelevant ist.
Also, wenn man jetzt zum Beispiel, äh.
Entscheidet, ob man jetzt einen Laser auf einen Insekt richtet und das dann abzuschießen oder nicht.
Und das ist aus Versehen dann die Katze oder der Hund.
Das wäre dann vielleicht nicht ganz so gut, wenn man dann so ein paar False-Positives.
Das sind False-Positives, genau.
Das wäre auch, das ist auch, aber es ist je nach Problem, ist es halt, äh, unterschiedlich schlimm, ob jetzt False-Positives oder False-Negatives auftreten.
Äh, ist aber beides natürlich blöd.
Das sind halt einfach unterschiedliche Arten.
Also, im einen Fall kommt einfach die Mücke dann trotzdem rein und sticht dich.
Und im anderen Fall ist vielleicht deine Katze, äh.
Genau, in dem Fall würde man wahrscheinlich eher False-Positives versuchen wollen zu vermeiden.
Aber, ja.
Es hängt halt von dem Problem ab und man kann sich sozusagen meistens aussuchen, was man jetzt lieber hätte.
Man kann halt darauf optimieren.
Das heißt, du definierst quasi die Irrtumswahrscheinlichkeit, die du nicht unterschreiten willst und darauf optimierst du dann dein, der Modell.
Genau.
Man kann sagen, also ich möchte nicht, äh, dass mir so und so viel, ähm, echte Mails verloren gehen.
Äh, das wäre wahrscheinlich das, ähm, Seven-Class-Fact.
Drei klassische Grenzen, ein Prozent, zwei Prozent, fünf Prozent oder sowas, ja.
Ja, also die aktuellen Geschichten sind wahrscheinlich alle noch deutlich drunter.
Aber, ähm, genau.
Und dann, ähm, äh, sagt man, okay.
Dann mit dem anderen Fehler lebt man dann halt, ja.
Also in dem Fall von Spam-Classifier würde man halt eher damit leben, dass halt ein bisschen Spam durchkommt.
Aber man möchte eigentlich nicht, dass echte Mail irgendwie, äh, weglottiert wird.
Ja, das wäre nicht so gut.
Ähm, aber wie gesagt, je nach Anwendung kann das halt unterschiedlich sein.
Es gibt auch Anwendungen, bei denen es andersrum ist.
Ähm, also medizinische Anwendungen sind oft dann zum Beispiel dann eher darauf optimiert, dass das Recall, Recall hoch ist und False-Positives sind egal.
Aber man möchte halt nicht, dass man jemanden undiagnostiziert lässt.
Ja, ja.
Vielleicht, je nachdem, was es für eine Klarheit ist.
Ja.
Also, ja.
Äh, kommt.
Tatsächlich ist Spam-Fall noch ganz interessant.
Also, um jetzt mal auf das echte Beispiel zurückzukommen, ähm, würde man dann vielleicht hingehen und, äh, bestimmte Ausnahmekriterien noch hinterher filtern?
Beispielsweise, wenn du jetzt von mir eine Mail bekommst und ich bin ja wahrscheinlich irgendwie in deinem Adressbuch drin, äh, dass du mich dann trotzdem kriegst, obwohl, äh, ich jetzt dir ganz viele Schimpfworte schreibe, oder?
Genau.
Also, natürlich, das ist jetzt nicht ein echtes System oder so, sondern das ist einfach nur, äh, zum Beispiel.
Aber, ja, natürlich diese ganzen Signale oder Features oder so, das, das würde man alles mit rein...
Äh, mitziehen eigentlich.
Ich weiß schon, was ich jetzt ausprobieren werde.
Ja, ja.
Und, äh, ich glaube, also mittlerweile, ich, ich weiß jetzt nicht, ich weiß nicht mal, was, äh, was da verwendet wird.
Also, bei Google habe ich jetzt noch, also, die, die gerade, die Verfahren, die heutzutage verwendet werden, sind alle sehr, sehr schlau mittlerweile.
Also...
Sie hätten ja schon genug Trainingsdaten, um das noch ein bisschen mehr zu trainieren.
Ja, irgendwie, die, da gibt es ja einen globalen Anteil, zum Beispiel bei Google.
Ich weiß nicht genau, wann ich das letzte Mal ein Paper darüber gelesen habe, was sie machen, aber sie haben dann halt, äh, irgendwie, ihr Modell besteht teilweise halt aus so globalen...
Spam-Geschichten, weil sie halt sehr viel Spam und Nicht-Spam haben, sozusagen, dass sie, die sie als Trainingsdaten verwenden können.
Und dann hast, ist, äh, ist das Modell auch immer noch teilweise personalisiert auf dich, weil es gibt halt vielleicht auch Leute, die, äh, wenn ich jetzt irgendwie, keine Ahnung, ein, äh, äh, jemand bin, der sich professionell damit beschäftigt, Spam von Nicht-Spam zu unterscheiden.
Ja, und dann, äh, mir die Leute Spam schicken als Beispiele und ich das nicht, äh, kriege, weil, äh, das heißt, es muss auch ein, äh, manche Leute, bei manchen Leuten ist das ja vielleicht okay, ja, oder, äh, weil, wenn ich jetzt,
zum Beispiel, äh, ein nigerianischer Prinz bin, der irgendwie ein Bankkonto in der Schweiz hat, dann, äh, ja.
Ich wäre schon froh, wenn die ganzen Leute, äh, meine Hilfe versuchen, ich will den Geld trinken und keiner will es haben, also, so, haha, ja.
Ja, also, äh, ja, die, die bestehen halt aus so einer, äh, globalen, äh, so einem globalen, äh, Teil und halt aus so einem personalisierten Teil.
Mir passiert das immer mit meinem Nachnamen, Leute sagen immer, haha, verarsch mich nicht.
Ja.
Ja, ist so, voice positive, ja, oder, was sagst du, ja?
Äh, äh, werden voice positive, ja, das wird als Spam erkannt, weil man eigentlich was, alles in Ordnung, ja.
Ähm, genau, und, ja, ähm, ja.
Ich denke halt immer, ich mache mich lustig und finde meinen Humor doof.
Ja.
Ja, äh, äh, ja, also, die, die Dinger funktionieren so, also, ich habe, äh, es, weder das Spam durchgekommen ist, noch, dass ich, okay, vielleicht kriege ich einfach nicht mit, dass, äh, bei mir eine normale Mail verschwindet, aber, also, früher war das tatsächlich immer noch so ein Problem und mittlerweile,
ist das alles so gut, ich würde immer einfach sagen, es funktioniert.
Ja, ähm, genau, ja, ich habe dann halt noch so ein paar Sachen probiert und, äh, eben zum Beispiel, äh, jetzt hier die, äh, also, äh, irgendwie State of the Art, äh, irgendwie, äh, Textklassifikationsgeschichte ist schon besser als, äh, äh, äh, als Nike Base, aber nicht so wahnsinnig, also, in dem Fall halt gar nicht so wahnsinnig viel, halt irgendwie, ja, bisschen mehr F1,
irgendwie, äh, Prozent oder anderthalb oder sowas, aber viel mehr auch nicht.
Also, ach so, F1, äh, harmonische Mittel zwischen Precision und Tricor.
Wir haben das, glaube ich, bei der Textklassifikationsfolge auch schon nochmal alles erzählt.
Ja, aber wir wollten jetzt auch nicht, dass alle das alles nochmal, wir müssen gerade die auch gerade einschalten oder nur von der F-Base zuhören.
Also, ähm, du musst vielleicht nochmal deswegen kurz erwähnen, was eine Support-Weck-Maschine ist und was Base hier ist.
Ja, äh, richtig, also, Support-Weck-Maschinen, äh, sind, äh, auch eine Art von, äh, ja, Machine Learning.
Motor.
Verfahren, Modellen, ähm, so ein bisschen, also, manchmal, manche Namen sind halt ein bisschen blöd, da würde ich sagen, auch der Name ist ein bisschen, also, sagt einem halt nicht, was das macht.
Was das, äh, eigentlich tut, ist, äh.
Protagonale Vektoren auf irgendwelchen Ebenen erzeugen.
Ja, es ist ein diskriminatives, äh, Machine Learning-Modell, das halt lernt, äh, sozusagen zwischen, wenn man jetzt ein paar Spam und Nicht-Spam nimmt, äh, zwischen diesen beiden Klassen.
Das interpretiert halt auch, wie eigentlich fast alle Machine Learning-Modelle jetzt außerdem, na, die F-Base jetzt, das hat, das macht das nicht so, aber, äh, interpretiert halt,
äh, Texte als Vektoren in einem, äh, dimensionalen Vektorraum, ja, wobei halt, also, das wäre ja auch, also, klassischer Back-of-Words-Ansatz, dass halt jedes Wort ist sozusagen eine Dimension und, äh, der Text ist halt einfach, äh, ja, der Vektor, der dann entsteht, wenn du, äh, sozusagen bei allen Wörtern, du gesehen hast, diese Dimensionen, denen ein Gewicht gibt, also, du kannst auch einfach eins setzen, dann wäre es halt binär, aber du kannst, äh, also, eins, du hast ein Wort, das Wort gesehen oder null, du hast das Wort halt nicht gesehen.
Also, was kannst du dir so vorstellen vor deinem inneren Auge, wenn du versuchst, sie zu visualisieren?
Das ist nicht, das ist nicht schlimm, das muss man sich nicht, äh, großartig vorstellen.
Das muss man sich gar nicht vorstellen.
Nee, also, ich, was ich mir vorstelle, ist halt irgendwas Dreidimensionales vielleicht. Aber man kann ja sagen, okay, das ist jetzt nicht gerade dreidimensional, sondern halt, äh, hunderttausenddimensional oder so. Ist ja, die Anschauung fügt einen dann halt unter Umständen.
Also, viel geht vielleicht auch noch, wenn man sich so einen feststehenden Raum im Laufe des Zeitablaufs, wie der sich verändert, vorstellt. Fünf vielleicht noch, wenn da zwischendurch jemand den Vorhang aufmacht und reinguckt und sagt,
Hallo, und dann da so einen Tunnel durchmacht, aber sechs, sieben, acht, ah.
Ja, aber es ist ja, aber sich vorzustellen, dass, also, sich einen Text als Vektor hinzuschreiben, das kann man sich ja angucken, das ist nicht so schlimm.
Ja, aber dann macht man das ja flach, man, also, die Betrachtung macht man ja dann irgendwie auf so ein Blatt Papier.
Ja, also, das, was man dann tatsächlich macht, also, wenn man das jetzt erzählt, dann klingt das irgendwie, äh, kompliziert, aber es ist eigentlich total simpel.
Man macht eigentlich nur Spalten auf von einer Zeile.
Ja, und das, was ich auch komisch interpretieren wollte, ist, dass, wenn ich jetzt zum Beispiel, ähm, Vektoren, also, einmal habe ich halt da Werte drinstehen, nicht nur Einsen und Nullen, und diese Werte, diese Gewichte sind halt, äh, Term Frequency mal, äh, Inverse Document Frequency, sozusagen, wie wichtig ist dieses Wort üblicherweise in Texten, also, ist das eher charakteristisch für bestimmte Sachen oder eher nicht so charakteristisch?
Äh, Wörter wie der, die das wären, halt, üblicherweise nicht, bekommen kein hohes Gewicht, weil, äh, ja, kann man entweder rausfiltern oder es ist halt, weil die sind einfach nicht, ne, das, daraus kann ich einfach nicht, äh,
jetzt nicht schließen, ob das Spam oder nicht Spam war, während eben sowas wie Viagra oder das Penis oder so, das ist wahrscheinlich, oder, äh, das, das ist deutlich charakteristischer, die werden bekommen ein höheres Gewicht und, äh, man, man guckt sich halt immer die Winkel zwischen Dingen an, äh, äh, in, in, in diesen Vektorräumen und das, die kann man einfach ausrechnen, indem man halt Sachen, das Skalarprodukt bildet zwischen, äh, zwischen, also man, und das auch wieder bei Phasenvektoren super einfach, weil, da man muss nur diese, die sind ja überall Null, nur an bestimmten Stellen nicht und man muss nur diese Stellen sich angucken, weil, äh,
was dann halt auch wieder sehr schnell geht, also, was man dann dann letztendlich macht, ist total simpel, aber es klingt irgendwie, oh, Winkel, äh, in einem hunderttausenddimensionalen Raum, krass, klingt irgendwie voll, voll aufgefahren, ist aber eigentlich total einfach, also, wenn man sich jetzt anguckt, was wirklich passiert und, ähm, äh, also, da ist nichts Wildes dabei, das, was aber jetzt diese Vortaktormaschine macht an der Stelle, ist halt, wenn man sich jetzt diese Vektoren anguckt und man halt jetzt sozusagen die Wolken an Punkten irgendwie in diesem
Raum, äh, das eine spammen, das andere nicht spammen und dann versucht die Sofort-Vektormaschine eine Ebene so zwischen diese, eine unterteilende, also, äh, eine separierende Hyper-Ebene so zwischen diese beiden, ähm, Klassen zu legen, dass der Abstand maximal wird zu beiden.
So ein bisschen wie bei OLS, Optimal Linear Squares.
Äh, ja, du meinst, äh, Ordinary Linear Squares?
Das ist ein bisschen noch anders, ja.
und diese Margin-Maximierung ist schon charakteristisch für Support-Tractor-Maschinen,
beziehungsweise die Dinger werden halt auch Maximum-Margin-Classifier genannt.
Und es gibt halt einen schönen Beweis, der sagt,
Margin-Maximierung bedeutet halt auch Maximierung der Generalisierung beim Lärm.
Und das ist natürlich auch eine sehr schöne Geschichte.
Man kann es leider aus diversen technischen Gründen nicht so,
also funktioniert es dann doch nicht.
Das Problem ist vielleicht, dass man sich, wenn man sich an allen Punkten orientiert,
so ein bisschen auch an den Extremwerten zu sehr entlanghaltet.
Und wenn man sich mehr an dem Durchschnitt der Werte orientieren würde und da die Ebenen bildet,
wäre die vielleicht ein bisschen präziser.
Also vielleicht kann man die Güte erhöhen, indem man so ein bisschen diese Randwerte so außen vor lässt.
Ja, man rechnet halt eine Verlustfunktion aus.
Das kann man ja einfach machen.
Und das ist halt ein konvexes Optimierungsproblem im Grunde.
Also das Optimierungsverfahren innerhalb von der SVM löst das.
Das ist halt das, was passiert.
Ja, okay.
Und am Schluss kommt halt das Ding raus, was tatsächlich irgendwie diese beiden Teile trennt.
Und zwar, dass die Höherebene hat den größtmöglichen Abstand zwischen diesen beiden.
Da kann man vielleicht noch ein bisschen was dran drehen, indem man so diese Grundgesamtheit so ein bisschen manipuliert.
Aber ja.
Aber sagen wir mal so, das funktioniert halt sehr gut.
Es ist halt auch so, irgendwie in diesem Hochdeutschland,
da ist viel Platz.
Deswegen funktionieren lineare Modelle da so sehr schön, weil man kann die halt auch so durchlegen.
Wenn das weniger dimensional wird, dann geht das halt linear nicht mehr.
Da muss das alles irgendwie gewogen sein, aber das wird alles viel schwieriger.
Und es könnte sein, dass wenn man auf einmal ganz viele komische Werte bekommt,
dass man irgendwie so ein Klassifizierungsproblem hat,
weil man irgendwie vielleicht noch eine Klasse hat, die man übersehen hat oder sowas.
Gut, klar.
Natürlich, das kann auch immer sein.
Genau, aber eigentlich ist das auch...
Also Support-Effekte-Maschinen, schöne Geschichte.
Aber das eigentliche Ding, warum ich das jetzt auch hier verwendet habe, ist,
dass die halt für Text-Klassifikationen super funktioniert haben.
Da gab es halt eben bekannte Arbeit von Thorsten Jochim zu 1997 drüber.
Und seitdem habe ich jedenfalls nicht wirklich substanzielle Fortschritte gesehen.
Also gut, doch.
Also wenn man sagt, Word-Embeddings sind halt nochmal ein ordentlicher Fortschritt gewesen.
Aber das wäre im Grunde nur eine andere Art, irgendwie Texte darzustellen.
Ja, das ist halt schon besser als Back-of-Words.
Aber...
...wird dann halt auch nochmal irgendwie ein bisschen besser.
Aber es ist halt...
Es wird auch durchgehend über alle Datasets und so besser.
Aber es ist halt jetzt nicht so, dass man sagt, okay, das ist jetzt eine ganz andere Kategorie von gut, plötzlich.
Es ist halt...
Also wenn man jetzt TF-IDF-Gewichte nimmt statt binäre, einfach nur 1 zu 0, wird es auch ein bisschen besser.
Und der Vorteil von Word-Embeddings ist, vielleicht noch sogar ein bisschen mehr,
aber so in der gleichen Größenordnung wie von binären Gewichten zu TF-IDF zu gehen.
Du musst ja immer noch sagen, was TF-IDF ist.
Ja, genau.
Das ist halt eben...
Charakteristisch ist ein Wort eigentlich sozusagen...
Für die Kategorie.
Ja, genau.
Kann man sich halt auch ausrechnen.
Darf man natürlich auch auf den Trainingsabend machen, aber...
Genau.
Und...
Ja.
Word-Embeddings sind halt auch nochmal so eine Geschichte.
Müsste ich jetzt eigentlich auch nochmal erklären.
Da ist halt eine andere Art, sozusagen Wörter in einen höherdimensionalen Vektorraum abzubilden.
Und da ist es dann halt nicht mehr so, dass es sozusagen pro Wort eine Dimension gibt,
sondern es gibt halt einen dreihundertdimensionalen Vektorraum oder was auch immer,
ich weiß nicht, kann man sich aussuchen, wie viele Dimensionen man verwenden möchte.
Und jedes Wort ist dann halt ein Vektor da drin.
Sodass man halt auch abbilden kann, dass Worte oft nicht nur sozusagen ein Ding beschreiben oder für einen,
sondern die haben halt Anteile da und Anteile da.
Und man kann damit dann quasi sozusagen gewisserweise auch die Bedeutung so ein bisschen besser mit abbilden.
Hier ist dein Schild.
Ja.
Und das funktioniert sehr gut.
Und das hat halt nochmal irgendwie Arbeit mit Text irgendwie genauer gemacht.
Aber...
Ja, so ein bisschen.
Aber dass es wirklich da jetzt substanzielle Verbesserungen gegeben hätte, habe ich jetzt also seit...
97 schon eine Weile her.
Ist schon relativ lange her und ist eigentlich nicht so...
Oder ich habe irgendwas übersehen, das kann natürlich auch sein.
Aber ich meine, da ist nicht so wahnsinnig viel passiert.
Falls ihr was übersehen habt, bitte schicken.
Bis vor kurzem.
Und ja, das ist vielleicht auch noch eine ganze...
Das möchte ich unbedingt mal selber ausprobieren.
Ach, das ist auch vielleicht...
Genau, wir haben ja mit...
Ja.
Nico hat diese Episode zu Textklassifikation gemacht.
Und der hat jetzt in seinem Podcast Tech-Tiefen auch so eine Miniserie zu Natural Language Processing gemacht.
Und da fand ich einige Sendungen sehr gut.
Unter anderem die, wo er über diese neuen Modelle spricht irgendwie.
Der ganze Startup, das da irgendwie mit...
Genau, genau.
Und halt auch das...
Die Folge über Spacey fand ich sehr gut.
Spacey ist halt so eine Open-Source-Bibliothek für NLP-Geschichten.
Aber halt ein bisschen mehr fokussiert auf Produktionssachen als jetzt zum Beispiel NLTK.
Ist halt eher so Forschungsgeschichten.
Super langsam.
Habe ich früher mal versucht zu verwenden.
Also es gibt sicher Berechtigungen, das zu verwenden.
Aber wenn man jetzt produktiv irgendwas machen möchte, dafür geht es oft nicht gut.
Weil es halt nicht darauf optimiert ist, das schnell zu sein.
Ich habe in NLTK mal ein paar Endgramme über Harry Potter mit ein paar Kindern.
Die haben das sehr gefreut.
Das geht bestimmt alles super.
Aber wenn wir jetzt irgendwie...
Ja, weiß ich nicht.
Wenn ein Geschäft darin besteht, Sachen zu klassifizieren oder so.
Oder schnell zu sein.
Dann ist NLTK vielleicht nicht so die Wahl.
Aber Spacey das.
Also die Geschichten da sind optimiert.
Es ist nicht so, dass es einfach ein Toolkit ist mit allen möglichen Dingen, die man halt verwenden kann.
Sondern die implementieren dann halt die Sachen, die am besten funktionieren.
Auch in schnell.
Und die kann man dann sozusagen verwenden.
Und ja, das ist sowieso interessant, was in dem Bereich alles passiert.
Aber was jetzt in letzter Zeit...
Und tatsächlich...
Da passiert so etwas Ähnliches wie bei ImageNet.
Da gab es ja auch irgendwie mit Deep Learning halt so eine...
ImageNet kennt ihr noch?
Ja.
Hatten wir auch schon mal vorgestellt.
Das ist halt so...
Da gibt es ja diese...
Darauf basierende...
Also auf dem ImageNet-Datastat basiert es halt so eine Challenge...
Wie heißt dieser Wettbewerb noch?
Very Large Data...
Irgendwie Image...
Ich weiß nicht mehr genau.
Hatten wir auch...
Das Ding läuft irgendwie jedes Jahr.
Und 2011 haben ja Leute da irgendwie angefangen, sich wirklich damit mal zu beschäftigen.
So wie man das dann mit Bildklassifikationen kriegt.
Und 2013 hat AlexNet irgendwie dann diese Challenge gewonnen.
Und zwar mit großem Abstand.
So irgendwie Reduktion des Fehlers um die Hälfte oder sowas.
Und ist in Regionen vorgestoßen, wo man vorher gedacht hatte, da kommt man gar nicht hin und so.
Und ja, also da ist etwas passiert, was halt irgendwie...
Ja, und dann Jahr für Jahr danach ist es immer besser geworden.
Und also 2013 ist halt substanziell der Fehler irgendwie runtergegangen.
Dann 2014 nochmal, 2005 nochmal, nach 2016 irgendwie oder so, glaube ich, sind die Modelle irgendwie bei Superhuman Performance.
Also machen weniger Fehler als Menschen beim Labeln.
Mittlerweile, glaube ich, machen die Modelle, die besten Modelle jetzt, machen einen Fehler, der ist halb so groß wie der, den Menschen machen.
Und das bei so Tasks wie...
Ja, ist da eine Katze auf dem Bild oder so?
Wo man sich denkt, so das ist...
Also, ja klar, das sollte man ja können.
Gut, also ich meine, da sind auch fiese Bilder dabei, sowas wie unterschiedliche Hunderassen und sowas.
Oder man sieht nur so ein Hinterteil mit so einem Schwanz und weiß dann nicht, ist das eine Katze oder sonst irgendwas.
Ja, aber das ist halt irgendwie, dass man da Modelle hat, die bei so einem Ding, wo man denkt, da ja gut, also da ist ein Mensch schon nicht so schlecht drin.
Dass die da deutlich besser sind, das ist beeindruckend.
Und zwar ist das halt in sehr kurzer Zeit passiert.
Ja, sozusagen, das ist ja auch sehr beeindruckend.
Also da ist irgendwas passiert, was halt das ganze Feld sozusagen sehr stark in Bewegung gesetzt hat.
Und sowas ähnliches sehen wir jetzt gerade bei NLP-Geschichten halt auch.
Das war mir jetzt bis vor eben kurz noch gar nicht so richtig klar, dass das gerade passiert.
Deutsch.
Ja.
Ja, Deutsch ist halt immer ein bisschen doof.
Das ist eine Sprache, für die sich irgendwie niemand so richtig interessiert.
Dä-düm.
Also, ja, aber da gibt es wohl auch jemanden...
Es gibt halt diese großen...
Sprachmodelle, irgendwie BERT, irgendwie XLNet, TPT2, BERT.
Ja, wir werden... Sesamstraße, wie war das?
Genau, Muppet Show, glaube ich, oder?
Muppet Show.
Oder Sesamstraße, ja.
Also, die sind wahrscheinlich da.
Ja.
Und da werden halt so große Transformer-Modelle trainiert.
Und der Witz daran ist, ich habe mich vorher immer mit sich gewusst, ich habe das schon mitgekriegt, dass das passiert.
Und ich dachte mir so, ja, warum trainiert man dann so riesige Modelle, was soll denn das?
Also, man ist auch sehr teuer und auch verbrennt unfassbar viel Energie und Taktzyklen und so.
Warum macht man das denn jetzt, um ein bisschen besser vorherzusagen, was das nächste Wort im Satz ist?
Ja, gut, das ist schon ein interessantes Problem, aber warum wirft man da so viel Geld drauf und so viele Ressourcen?
Und dann ist es aber genau wie bei ImageNet.
Bei ImageNet ist es ja auch so, dass dadurch, dass es vortrainierte Modelle gibt, die sozusagen ein gutes Verständnis davon haben, wie unsere visuelle Welt halt so aussieht,
kann man die auf neue Probleme sehr gut anpassen.
Dann nimmt man halt irgendwas, wo man jetzt nur wenige Trainingsbeispiele hat und feintunt diese auf ImageNet trainierten Modelle auf dieses Problem
und kriegt damit Sachen hin, die vorher halt völlig unmöglich wären oder wo man halt auch irgendwie hunderttausende Trainingsbeispiele gebraucht hätte oder so.
Und kann dann halt irgendwie in einem konkreten Anwendungsfall halt sehr, sehr gut sein.
Und ich glaube, auch da ist den Leuten noch nicht so richtig bewusst, was das eigentlich bedeutet.
Und Anwendungen gibt es da auch noch nicht so viele.
Aber da gibt es wahrscheinlich, also da werden wir sehr viele Anwendungen sehen, denke ich.
Das ist halt jetzt, also mein Beispiel dafür war halt irgendwie eigentlich, dass irgendwie Flaschenpfandautomaten da so schlecht sind.
Das muss eigentlich nicht sein.
Das könnte alles viel besser gehen.
Und das gilt im Grunde für alle Probleme, wo man irgendwie visuell was erkennen möchte.
Das ist theoretisch durch.
Jetzt muss man es eigentlich nur noch praktisch umsetzen.
Wir haben ja gerade schon ein bisschen davon.
Ja, dieser Mensch darf in die Stadt.
Nein, der darf nicht in die Stadt.
Ja, dieser Mensch darf da und da hinten.
Ja, da könnte es auch sein.
Ja, ja, es ist, ja.
Diese Ampel bleibt für dich rot.
Ja.
Gibt doch nicht mal die guten Tipps.
Ja, es ist nicht ganz unproblematisch.
Das stimmt auch.
Aber eben, also das ist jetzt auch für Sprache halt so ein bisschen passiert, weil man eben, wenn man jetzt so ein Language-Modell trainiert hat auf irgendwie großen, weiß ich nicht, auf einem Website-Crawl oder Wikipedia.
Man braucht eigentlich noch ein bisschen mehr als Wikipedia.
Dann kann man da.
Dann kann man da unterschiedliche Prediction-Heads draufsetzen für unterschiedliche Probleme.
Und man nimmt halt sozusagen irgendwie, aber es sind halt alles Sprachprobleme.
Also auch so ein Text-Klassifikations-Problem kann man halt nehmen.
Jagt das halt, benutzt halt zum Beispiel BERT, um das halt irgendwie sozusagen um diese.
Das ist ein Prediction-Head.
Ja, genau.
Das ist halt.
Im Grunde, die Dinger übersetzen das ja irgendwie in eine interne Repräsentation.
Und dann übersetzen sie es.
Und dann übersetzen sie es wieder zurück in das, was du haben willst.
Und du kannst das austauschen.
Du kannst halt sagen, okay, ich möchte, dass mein Language-Modell mir zum Beispiel Sätze generiert.
Oder ich möchte, dass es halt Text-Klassifikation macht.
Oder ich möchte, dass es irgendwie Named-Athlete-Recognition macht.
Oder irgendwas.
Also sozusagen Namen oder Orte findet in Texten oder sowas.
Klingelt ja direkt die Kasse.
Oder Fragen beantworten kann oder solche Sachen.
Und du kannst das gleiche vortrainierte Modell nehmen für all diese unterschiedlichen Tasks.
Ja, das heißt, du kannst.
Und wie geht es halt?
Ja, du kannst halt.
Ich weiß nicht, wie viel Geld Google ausgegeben hat, um Börse zu trainieren.
Oder weiß ich nicht.
Auf jeden Fall eine ganze Menge.
Das kannst du dir nicht leisten wahrscheinlich.
Und du kannst das vortrainierte Modell nehmen.
Passt es auf deinen Task an.
Wie zum Beispiel jetzt irgendwie Text-Klassifikation von diesem Slam-Zox oder irgendwie.
Und trainierst das halt da drauf.
Und kriegst halt deutlich bessere Ergebnisse.
Fotokasse.
Genau.
Und das würde ich gerne noch ausprobieren.
Das habe ich jetzt noch nicht geschafft.
Aber das mache ich bestimmt demnächst irgendwann.
Aber es gibt schon Papers dazu jetzt.
Ist aber auch jetzt im Frühjahr erschienen.
Glaube ich, eines ist auch des Reuters-Datasets, das wir auch in der Text-Klassifikations-Ding-Episode hatten.
Wo jemand das einfach genommen hat.
Der hat noch zwei andere Text-Klassifikations-Korpus-Datasets benutzt.
Also man sollte halt immer mehrere nehmen.
Weil es kann ja auch Zufall sein, dass mal irgendwas in einem bestimmten Dataset besser funktioniert.
Und da waren, also gegenüber diesen guten Zahlen von 97,
Verbesserung von so 5% im F1-Wert oder sowas.
Was Wahnsinn ist.
Also das ist halt richtig, richtig viel.
Das ist halt so Klasse von irgendwie.
Also in einem Ding, wo man seit 20 Jahren nichts mehr gefunden hat, was es irgendwie besser macht.
Da passiert plötzlich so ein Fortschritt.
Da ist irgendwas Fundamentales passiert.
Also da scheint es so zu sein zumindest,
dass man tatsächlich mehr Informationen aus der Sprache da rausholen kann,
als man das bisher konnte.
Und das ist natürlich ein Hinweis darauf, dass da noch viele...
Und da das jetzt...
Das sind die ersten Ergebnisse.
Da kann man ja dann noch optimieren.
Das heißt, das wird sehr wahrscheinlich noch alles noch viel besser werden.
Also man hat auf jeden Fall jetzt einen Ansatzpunkt,
wo man wieder einen Hebel reinsetzen kann.
Ja, das heißt, wir kriegen jetzt wahrscheinlich auch,
was Probleme angeht, wo man mit Sprache zu tun hat,
irgendwie deutlich bessere Ergebnisse.
Und das betrifft dann eben solche Sachen wie Text-Klassifikation,
Spam, Nicht-Spam.
Gut, das ist schon gelöst irgendwie.
Aber es ist halt auch so ein Spezialproblem.
Und man kann das halt auch mit Spezialgeschichten...
Gut anpacken.
Ich war ein Böses.
Aber man hat diese Probleme ja auch in anderen Bereichen,
wo man dann jetzt nicht so viel Energie reinstecken möchte,
wie in Spam versus Nicht-Spam-Erkennung.
Sondern man hat halt ein paar hundert eigene Datenpunkte oder so
und kriegt dann plötzlich Ergebnisse hin,
wo man sonst viel Engineering hätte reinstecken müssen
oder viel, viel mehr Daten.
Und das ist natürlich schon eine super interessante Geschichte.
Ja, genau.
Also da kommen...
Da kommen bestimmt noch Sachen zu.
Das wird noch cool.
Ha!
Das wird noch cool.
Ich bin schon mal gespannt,
mal diese Dinger rauszuführen.
Ja, ich hatte da einige Horrorgeschichten vielleicht noch,
die man jetzt daran direkt anschließen kann.
Weil es gibt ja dann...
Horrorgeschichten?
Die Möglichkeit, ja leider.
Also auch...
Das war ja Stanford irgendwie, ImageNet.
Und dann, ich weiß jetzt nicht,
wovon das Dings Sprachnetz herkam.
Aber es gibt...
Ja, die Player da momentan sind Google, Facebook.
Also Facebook ist Excel-Net, Google ist Word.
Genau, OpenAI hat GPT-2 gemacht.
Aber ich weiß nicht so...
Aber die großen Player...
Habe ich am MIT so eine lustige Sache gesehen.
Die haben etwas an die Gesichtsmuskeln angeschlossen,
dass dann die Bewegung des Gesichtes
auf deine innere Stimme metten kann.
Und so könnte man tatsächlich dann irgendwie so lesen,
was für Sätze diese Menschen denn gerade denken,
wenn man die irgendwie so mitfilmen würde.
Und daraus dann solche Sachen zu bauen,
ist ein bisschen gruselig.
Alter Ego heißt das Projekt, glaube ich.
Ja, aber da bin ich mir sehr skeptisch,
wenn Leute solche Sachen behaupten.
Ja, aber da bin ich mir sehr skeptisch, wenn Leute solche Sachen behaupten.
Ja, ja, nein, aber ich meine überhaupt,
wenn es darum geht, vorher zu sagen...
Also da geht sozusagen so der interne Bullshit-Alarm los,
weil das natürlich etwas ist, was alle super gerne hätten,
dass sie halt irgendwie Gedanken lesen können.
Auf der anderen Seite aber man...
Also Menschen nicht gut können.
Und Menschen sind ziemlich gut.
Also die Quote...
Zum Beispiel bei erfahrenen Polizisten,
die glauben alle, die könnten das.
Aber wenn du das testest...
Also die Studien jedenfalls...
Ich bin ja jetzt auch kein Experte dafür,
aber ich habe da auch so Sachen gesehen,
wo halt die Quote von guten Polizisten
irgendwie Lügner zu erkennen
in Verhören ist so knapp über 50 Prozent.
Also wenn die eigentlich wahrscheinlich...
Gute Polizisten...
Ich weiß es nicht so genau, aber...
Und wenn die das schon nicht können,
wie soll das ein Modell hinkriegen?
Ja, aber die haben halt so ein Ding auf dem Gesicht.
Also das ist ja interessant.
Guck es dir mal an.
Alter Ego heißt das mit MIT-Projekten.
Okay, muss ich mir mal anschauen.
Ja.
Das ist wirklich spannend.
Ja, also ich glaube,
wir waren fast am Ende mit den Klassefeiern,
aber du hast noch eine Sache,
hast du noch gebaut,
du hast noch andere,
nach der Vektormaschine was anderes getestet.
Ach so, das war Spacey.
Das war Spacey.
Ach, das war Spacey.
Das war so ein neuronales Netz,
das halt...
Also es ist tatsächlich ein bisschen besser als NaiveBase.
Es ist ein bisschen schlechter
als die lineare Support-Vektormaschine
und verbraucht aber wahnsinnig viel Rechenleistung natürlich.
Macht ja natürlich auch viel kompliziertere Sachen,
aber das ist halt auch so ein Ding.
Ich meine, wenn die Daten das halt nicht hergeben
und an der Stelle tun sie es wahrscheinlich nicht,
dann nützt einem das halt nichts.
Sondern man braucht halt dann auch...
Man braucht dann auch entsprechende Trainingsdaten,
um halt diese ganzen Parameter,
diese Modelle halt auch ordentlich zu finden oder so.
Aber ich könnte mir halt...
Also was mich jetzt interessieren würde,
ist, was ist denn jetzt,
wenn ich jetzt so ein vortrainiertes Language-Modell nehme
und dann nochmal gucke.
Vielleicht wird das dann nochmal deutlich besser.
Wobei, mit dem Data-Set, naja.
Ja, okay.
Aber eben, das zeigt halt zum Beispiel auch,
finde ich, dass wenn man jetzt...
Also Spacey ist schon, gilt so als State-of-the-Art
und ich finde, das ist ja auch gut und so.
Und wenn man das jetzt aber so naiv benutzt
für so ein Problem,
wo man jetzt halt irgendwie selber
nicht so viele Daten hat,
dann...
Also ich würde sagen,
da jetzt einfach so naiv Spacey genommen zu haben,
wäre wahrscheinlich nicht unbedingt der richtige Weg gewesen.
Sondern...
Ja.
Lieber naiv Base.
Man muss manchmal so Dinge ausprobieren
und manchmal ist es oft,
zumindest um eine Baseline zu haben,
eine sehr sinnvolle Sache,
ein ganz einfaches Verfahren,
was man gut versteht.
Zumindest mal implementiert zu haben,
zu sehen, ob man nicht irgendwo fundamental
was kaputt macht.
Oder was nicht verstanden hat.
Und für sowas, ja,
das ist eigentlich ganz gut.
Cool.
Ja, ich glaube, damit sind wir eigentlich schon praktisch
mit der Geschichte...
Ja, na, E-Space haben wir ja erklärt.
Jetzt fehlt eigentlich noch der Pick der Woche
und schöne Wünsche fürs...
Ja.
Ja, leider ist es erst Montag, Wochenende.
Aber...
Vielleicht ist es ja bei euch.
Ja, das wird auch noch ein bisschen dauern,
bis die Sendung nicht...
Bis die Sendung raus ist.
Aber ja, wir wissen noch nicht genau,
wann sie erscheinen.
Ja, was ist denn dein Pick der Woche?
Du hast dir ja auch was Schönes rausgesucht.
Genau.
Das ist mein letztes...
Irgendwie über den Weg gelaufen.
Iceford.
Und zwar geht es dabei darum,
dass halt...
Importe sortieren.
Ja.
Man kann ja...
Man kann ja gefahrene Sachen machen,
automatisiert seine Importe.
Eine Standardform bringen ja mit Black und so.
Aber das ändert jetzt zum Beispiel
die Reihenfolge von Importen halt nicht.
Und wenn man das komisch gemacht hat,
dann...
Also Black ist ein Autovermetter,
den man in seinem Editor zum Beispiel einstellen kann
oder mit dem man dann Dateien später
so formatiert,
dass auch eure Kollegen das lesen,
weil die eure ganzen Gewohnheiten zunichte machen
und das so formatieren,
wie man es normalerweise tut.
Genau.
Aber wenn man jetzt viele Imports irgendwie hat,
dann ist es auch vielleicht nicht schlecht,
da eine Struktur drin zu haben.
Und da guckt halt Black höchstens,
dass die Teilen nicht zu lang werden oder so.
Aber halt nicht, wie die sortiert sind.
Weil das spielt halt keine Rolle für Black-Hands.
Aber das ist halt vielleicht,
wenn man da auch irgendwelche Regeln zu haben.
Und das...
Also jedenfalls bringt Iceford das halt auch in Standardformat.
Ich glaube, wenn man das einfach ohne Config oder so benutzt,
dann sortiert es das alphabetisch,
dass es vielleicht auch nicht die sinnvollste Geschichte ist.
Aber man kann dem halt auch sagen,
was es priorisieren soll
oder sagen, okay,
Standard-Modul aus der Standard-Bibliothek nach oben oder so.
Man kann das Ding auch relativ umfangreich konfigurieren.
Und ich fand einfach nett zu sehen,
dass es da überhaupt irgendwie eine Möglichkeit gibt,
das automatisch zu machen.
Ich glaube, es gab sogar so einen Hook in Black oder sowas.
Nee, in Black ist es so,
dass irgendwelche Leute haben da ein GitHub aufgemacht
und gefragt, ob Black das nicht auch machen könnte.
Und dann haben sie gesagt,
naja, vielleicht nicht.
Es gibt doch Iceford.
Und dann hat man irgendwelche Leute gesagt,
oh, Iceford hat aber die und die und die Probleme.
Und gerade in Kombination mit Black
macht das manchmal Sachen kaputt.
Daraufhin hat der Autor von Iceford da geschrieben,
ja, ich sehe das auch alles irgendwie,
dass das problematisch ist.
Und ich arbeite gerade an einer Black-Iceford-Implementation,
die diese Probleme dann nicht hat.
Also, falls ihr mittelgroße oder größere Projekte
automatisch so dienen wollt mit euren Modulen,
guckt euch das doch mal an.
Ja, also mein Pick der Woche war PPtop.
Das macht sowas wie Python-Prozesse anzeigbar wie Htop,
wenn ihr das irgendwie kennt oder so.
Htop, Htop oder Top, irgendwie was unter Linux,
so ein bisschen die Prozesse und Memory-Management
der einzelnen laufenden Prozess-IDs und so weiter euch zeigt.
Macht das was mit Python-Prozessen, das ist relativ cool.
Und ja, kann das so eine Inspektion geben?
Was macht der?
Ja, ein Prozess eigentlich gerade.
Fand ich immer ganz interessant, um mal so ein bisschen rumzuspielen,
mal ein bisschen zu debuggen und zu gucken,
was passiert denn da eigentlich?
Ja, klingt gut, muss ich mal ausprobieren.
Ja.
Ja, so.
Da haben wir es quasi fast heute wieder geschafft, würde ich sagen.
Ja.
Ja, also falls jemand von euch gezählt hat,
wie oft wir Penis gezählt haben,
können da sich eine Folge bündeln.
Noch toller wäre es natürlich, wenn ihr einen Algorithmus schreibt,
der irgendwie die Sprache analysiert und uns genau zeigt,
wo das denn gewesen ist.
Wir wollen euch ja mal ein bisschen motivieren,
zwei Projekte, wer weiß.
Ja, danke, dass ihr wieder zugehört habt.
Bleibt uns gewogen, teilt es wieder rein.
Ja, und auch immer auf Zeit.
Guten Tag, schon morgen Abend,
8 Uhr, bis demnächst.
Bis dann, tschüss.