sb-wettbewerb_kleinDieser Artikel ist Teil des ScienceBlogs Blog-Schreibwettbewerb 2018. Informationen zum Ablauf gibt es hier. Leserinnen und Leser können die Artikel bewerten und bei der Abstimmung einen Preis gewinnen – Details dazu gibt es hier. Eine Übersicht über alle am Bewerb teilnehmenden Artikel gibt es hier. Informationen zu den Autoren der Wettbewerbsartikel finden sich in den jeweiligen Texten.
————————————————————————————————————–
Wie Computer intelligent(er) wurden

von Jörg D.

Ich habe theoretische Physik im wunderschönen Jena studiert. Heute schreibe ich aber über meine zweite große Leidenschaft: Neuronale Netzwerke und künstliche Intelligenz

Neuronale Netzwerke sind in aller Munde. Sie besiegen Weltmeister im Go, sie malen Bilder, sie hören uns zu und übersetzen unsere Sprache. Das sind alles Tätigkeiten, die recht komplex erscheinen, sind neuronale Netzwerke (NNs) also super-komplizierte Gebilde, die nur die intelligentesten 0,1 % der Weltbevölkerung jemals verstehen könnten? In diesem Beitrag möchte ich zeigen, dass dies nicht ansatzweise stimmt, dass jeder zumindest die Grundlagen neuronaler Netze verstehen kann.

Ich stand vor einiger Zeit vor der Aufgabe, eine Software zu entwickeln, die entscheiden kann, ob in einem Bild ein Mensch, ein Auto oder ein Hund zu sehen ist. Diese Aufgabenstellung ist viel älter als der aktuelle Hype um künstliche Intelligenz und man findet viele Arbeiten zu diesem Thema. Ich habe auch zunächst mit „klassischen“ Ansätzen wie Haarfiltern (hat nichts mit Haaren zu tun), HOGs (hat nichts mit Wildschweinen zu tun) und Supportvektormaschinen (hat zwar mit Supportvektoren zu tun, aber das Wort Maschine ist hier sehr frei benutzt) experimentiert und deren Ergebnisse waren zwar durchaus gut, aber längst nicht gut genug für mich. Ich hatte zwar zu dieser Zeit schon von NNs gehört, aber ich dachte, dieses Thema wäre doch viel zu groß für mich und ich müsste nochmal 5 Jahre studieren, um die verstehen zu können. Ich hätte nicht falscher liegen können!

Als die Frustration zu groß wurde, aber auch die Neugier stieg, habe ich doch mal einen Wikipedia-Artikel gelesen, dann noch ein paar weitere Artikel und schließlich innerhalb einer Woche ein sehr schönes Online-Buch verschlungen und plötzlich hatte ich ein recht gutes Verständnis von NNs. Hier möchte ich meine Erkenntnisse teilen.

Vorweg: Ich werde über einen recht einfachen Typ von NNs schreiben, die lediglich ein Bild entgegennehmen und dann entscheiden, ob es zu einer vorher festgelegten Kategorie gehört. Netzwerke, die die in der Einleitung genannten Aufgaben meistern, sind nochmal eine Stufe umfangreicher, aber mit diesem Artikel hat man, hoffe ich, zumindest genug Grundlagen, um sich auch darin einzulesen.

Der Input

Wir geben dem Computer also ein Bild. Dieses Bild ist für den Computer aber nur eine Menge aus Zahlen, darüberhinaus sieht er nicht so, wie wir Menschen dies können. Jeder Pixel des Bildes besteht aus Zahlen, und zwar 3: Eine für den Rot-Anteil, eine für den Blau-Anteil und eine für den Grün-Anteil. Aus diesen Informationen kann der Bildschirm dann später berechnen, welches Licht er abstrahlen muss.

Der Einfachheit halber möchte ich mich hier auf Graustufenbilder beschränken, die an jedem Pixel nur eine Zahl haben, die die Helligkeit angibt. Meistens sind die Zahlen dann auf den Bereich von 0 bis 255 normiert, sodass 0 schwarz und 255 weiß bedeutet und die Zahlen dazwischen die entsprechenden Graustufen sind. Diese Ansammlung aus Zahlen, die ja im Falle zweidimensionaler Bilder in Zeilen und Spalten angeordnet sind, kann man dabei gut und gerne als Matrix interpretieren.

Der erste Filter

Diese Matrix wird nun analysiert. Dazu werden Filter über die einzelnen Einträge gelegt. Ein Filter ist nur eine weitere Matrix, zum Beispiel mit 3×3 Einträgen. Legt man diese über unsere Bild-Matrix wie in Abb. 1 angedeutet, kann man die Einträge, die „aufeinanderliegen“ miteinander multiplizieren und zum Schluss alles addieren.
Das klingt alles sehr theoretisch und mathematisch-langweilig. (Das ist natürlich ein sehr schlechter Witz. Mathe ist niemals langweilig!) Interessant wird es aber, wenn wir uns den Filter genauer ansehen: Es gibt positive und negative Einträge. Wann erzeugt der Filter das größte Ergebnis? Dann, wenn die Einträge der Bild-Matrix, die dort liegen, wo der Filter positiv ist, möglichst groß sind (255 ist ja das Maximum) und die Einträge der Bild-Matrix, die bei negativen Filter-Einträgen liegen, möglichst klein sind (0 ist das Minimum).

Abb.1 Allgemeiner Ablauf der Filterung (Ausgeburt meiner Paint-Künste)

Abb.1 Allgemeiner Ablauf der Filterung (Ausgeburt meiner Paint-Künste)

Nun kann man den Filter auch wieder als Bild interpretieren (die negativen Einträge setzen wir dann zu 0). Das heißt, der Filter erzeugt ein großes Ergebnis, wenn die Bild-Matrix an dieser Stelle ihm möglichst ähnlich sieht. Sieht die Bild-Matrix ganz anders aus, wird das Ergebnis sehr klein, vielleicht 0 oder sogar negativ.

Abb. 2 Verschiedene Bilder mit dem gleichen Filter (Noch ein Produkt meines Paint)

Abb. 2 Verschiedene Bilder mit dem gleichen Filter (Noch ein Produkt meines Paint)

In Abbildung 2 habe ich mal ein paar Beispiele gezeigt: Der Filter sieht aus wie eine schräge Kante. Wenn das Bild auch wie eine schräge Kante aussieht, bekommen wir ein sehr großes Ergebnis. (in der Praxis teilt man übrigens noch durch alle möglichen Werte und arbeitet mit kleineren Zahlen) In der zweiten Zeile im Bild (oder der dritten, aber da Programmierer bei 0 anfangen, zu zählen, ist „zwei“ auch in Ordnung) sieht das Bild ein wenig nach schräger Kante aus, aber sie ist nicht ganz perfekt. Wir bekommen aber immer noch ein recht hohes Ergebnis. Das ist sinnvoll, da die reale Welt ziemlich schmutzig ist und Schatten, schlechte Kameras oder Hindernisse eine perfekte Kante schnell zunichte machen können.
In der dritten Zeile haben wir dann das genaue Gegenteil unseres Filters (eigentlich ist es ja auch eine schräge Kante, aber in die umgekehrte Richtung), entsprechend wird das Ergebnis sehr negativ.

Zwei Details sind dabei noch zu beachten: Zum einen wird auf das Ergebnis des Filters immer noch ein Wert addiert (oder subtrahiert, falls der Wert negativ ist). Auf diese Art kann man bestimmte Filter, z.B. gerade Kanten, „wichtiger“ machen und andere Arten von Kanten quasi unterdrücken. (Beispiel: Wir wollen mit unserem Netzwerk Bälle finden. Es ist zwar schon, wenn wir dabei gerade Kanten finden, aber eigentlich haben Bälle nur runde Kanten, also bekommen die geraden Kanten eine kleinere Wichtigkeit)
Das andere Detail ist, dass negative Ergebnisse tatsächlich nicht einfach behalten werden, sondern zu 0 gesetzt werden. Das bringt die nötige mathematische Nichtlinearität und damit Kompliziertheit, um so komplizierte Aufgaben wie Objekterkennung wirklich meistern zu können. (das war jetzt ein wenig schwammig, aber tatsächlich steckt die ganze Theorie hinter NNs noch ziemlich in den Kinderschuhen. Viele Sachen werden gemacht, weil sie funktionieren)

Nun können wir unseren Filter über jede Stelle unseres Bildes fahren lassen und jedes Mal das Ergebnis notieren. So wie der Filter dann über die Zeilen und Spalten des Bildes fährt, können wir die Ergebnisse wieder in Zeilen und Spalten anordnen. Wir erhalten also eine neues Bild, das eine hohe Zahl hat (und damit besonders weiß erscheint), wo das alte Bild dem Filter ähnlich war. Wenn der Filter also z.B. aussah wie eine schräge Kante, dann ist das Ergebnis eine Art Karte, die zeigt, wo im Bild schräge Kanten waren. In Abbildung 3 und 4 habe ich dies mal für mehrere Filter aus einem von mir selbst erstellten Netzwerk gezeigt. (Ich habe Buchstaben genommen, weil man dort Kanten besonders schön sieht und man diese gut verkleinern kann, um alles in ein Bild zu bekommen, und trotzdem noch etwas erkennt) Man sieht stellenweise sehr schön, wie das Ergebnis besonders „hell“ ist, wo eine Kante bestimmter Richtung zu sehen ist. Stellenweise ist das ganze Bild mehr oder weniger hell, wird an Kanten aber erst richtig weiß. Im zweiten Bild von links in der zweiten Zeile sieht man jeweils – nichts. Da war wohl nichts da, was den Filter angesprochen hätte.

Ein Bild von einer 8, nachdem 32 Filter darübergelaufen sind (Produkt meines höchst-eigenen Python-Skipts und eines selbstgemachten NNs)

Ein Bild von einer 8, nachdem 32 Filter darübergelaufen sind (Produkt meines höchst-eigenen Python-Skipts und eines selbstgemachten NNs)

Noch ein Bild von einem W mit den gleichen Filtern (ebenfalls 100% von mir)

Noch ein Bild von einem W mit den gleichen Filtern (ebenfalls 100% von mir)

Nun verwendet man für ein NN nicht nur einen solchen Filter, sondern viele. Wie viele genau, das ist nicht festgelegt. Im Zweifelsfall findet man durch experimentieren heraus, mit welcher Anzahl man die besten Ergebnisse erhält. Im oben erwähnten Beispiel habe ich 32 Filter benutzt, hatte nach dem ersten Schritt also 32 „Kanten-Bilder“, wie die eine oder andere vielleicht schon nachgezählt hat. (die Filter müssten nicht wie Kanten aussehen, sondern können eigentlich beliebige Formen haben, aber der Einfachheit halber spreche ich auch im Folgenden von Kanten)

Ein Wort zum Vokabular noch: Die Operation, eine Filter-Matrix auf die Bild-Matrix anzuwenden, wird von Mathematikern als „Faltung“ bezeichnet, auf Englisch: Convolution. Daher hat dieser Typ NN seinen Namen: Convolutional Neural Network, oder kurz CNN.

Die weiteren Filter
Wir haben nun also 32 Kanten-Bilder. Das ist schön, aber noch nutzlos. Wir können auf diese Bilder nun aber wieder neue Filter anwenden. Im ersten Schritt war ein Filter ja eine 3×3-Matrix, nun besteht ein Filter aber aus 32 3×3-Matrizen, jede wird auf ein Kanten-Bild angewendet und alle Ergebnisse werden addiert. Im ersten Schritt haben wir helle und dunkle Pixel zu Kanten zusammengebaut. Nun können wir Kanten zusammenbauen zu – naja, zum Beispiel zu geometrischen Formen: Zum Beispiel können 2 senkrechte und 2 waagerechte Kanten ein Viereck bilden. Wir können also einen Filter bauen, der diesmal zeigen wird, wo im originalen Bild Vierecke waren. Ein anderer Filter könnte Kreise oder Dreiecke zeigen.

So können wir wieder 32 neue Bilder erzeugen, diesmal eben für geometrische Formen. (wir können aber auch mehr Filter benutzen und noch mehr Bilder machen, wie gesagt, die Zahlen sind hier nicht gesetzlich festgelegt) Nun können wir auf diese Bilder im nächsten Schritt wieder Filter anwenden, die die geometrischen Formen zu komplizierteren Formen zusammenbauen und so weiter und so weiter. Nach genug Schritten können wir auf diese Art Filter haben, die Gesichter, Autoreifen oder Hundenasen erkennen.

Bildverkleinerung für Zwischendurch
Unser Netzwerk ist also nur eine Reihe von aufeinanderfolgenden Filtern. Richtig? Nicht ganz. Ab und zu schaltet man noch ein sogenanntes MaxPooling dazwischen. Das Prinzip ist ähnlich zu den Filtern: Man nimmt sich z.B. einen 2×2-Bereich eines Bildes heraus und schaut, welche Zahl in diesem Bereich am größten ist. Diese Zahl behält man, alle anderen schmeißt man weg. Damit schrumpft das Bild auf ein Viertel zusammen. Das hat zwei Vorteile: Zum einen werden die Bilder, die man filtern muss, deutlich kleiner. Das spart Rechenzeit. Das ist gut, denn Rechenzeit ist teuer! Zum anderen wird man dadurch ein wenig unabhängiger von der exakten Lage der Kanten/Formen/was-auch-immer im Bild. Ein Mensch bleibt ein Mensch, auch wenn er einen Zentimeter weiter links/rechts/oben/unten ist.

Abb. 5 Ablauf des MaxPoolings (wieder von mir und Paint)

Abb. 5 Ablauf des MaxPoolings (wieder von mir und Paint)

Das Ende: Jeder mit jedem
Nachdem wir nun ein paar mal Filter angewendet haben und ab und zu unser Bild verkleinert haben, haben wir nun eine Ladung kleiner, gefilterter Bilder. Diese müssen nun final ausgewertet werden, um zu entscheiden, ob wir die Arme, Augen und Köpfe darin zu Menschen zusammenbauen können oder ob da doch eher ein Hund zu sehen ist oder nichts von alledem.

Dafür verwenden wir nun keine kleinen 3×3-Filter mehr, sondern die finalen Filter haben die Größe der kompletten Bilder. Es wird alles, also ALLES, zusammengewürfelt, multipliziert und ein Ergebnis notiert. Man hat wieder mehrere solcher Filter, deren Ergebnisse notiert man nun nicht mehr als Matrix, sondern als Vektor. Diesen Vektor könnte man nun wieder filtern und so weiter. Am Ende steht dann aber ein Vektor, der so viele Einträge hat, wie wir Kategorien haben. Wenn wir also Menschen, Hunde und Autos erkennen wollen, hat unser letzter Vektor 3 Einträge. Diese kann man mit ein wenig Mathe-Magie so umrechnen, dass sie Wahrscheinlichkeiten angeben, also z.B. „Mit 90-prozentiger Wahrscheinlichkeit ist das im Bild ein Mensch, mit 9-prozentiger Wahrscheinlichkeit ein Hund und mit 1-prozentiger Wahrscheinlichkeit ein Auto“. Das ist das finale Ergebnis, damit sind wir fertig. Hurra! Unser Computer ist so schlau wie ein Kleinkind. Ein Kleinkind, das nur drei Dinge kennt.

Noch ein Wort zum Vokabular: Weil hier alles mit allem verbunden ist, nennte man diesen Filterabschnitt “Fully Connected Layer”, andernorts sagt man aber auch “Dense Layer”.

Zurück zum Anfang: Das Training
Wer jetzt begeistert seinen bevorzugten Editor öffnet und selbst anfangen will, so ein NN zu programmieren (und so schwer ist das ja eigentlich alles gar nicht), wird vermutlich recht schnell auf eine sehr gewichtige Frage stoßen: Wie genau soll ich die Filter eigentlich aussehen lassen? Welche Zahlen kommen dort rein?

Früher, in der grauen Ära vor neuronalen Netzwerken, haben die Wissenschaftler wirklich noch versucht, alle Parameter selbst zu setzen. Das geniale an NN ist aber, dass das gar nicht notwendig ist, sie finden die richtigen Werte von selbst! Dazu braucht man zunächst eine große Menge von Bildern, die man vorher „per Hand“ sortiert hat, das heißt, man weiß, wo Menschen, Autos etc. sind. Dann nimmt man ein NN her, deren Filter man zunächst mit zufälligen Zahlen gefüllt hat. Unter diesen Umständen kommen vermutlich komplett unsinnige Ergebnisse raus, z.B. bei einem Bild von einem Menschen antwortet der Computer „Mit 24-prozentiger Wahrscheinlichkeit ist das im Bild ein Mensch, mit 62-prozentiger Wahrscheinlichkeit ein Hund und mit 14-prozentiger Wahrscheinlichkeit ein Auto“.

Tatsächlich sollte ein perfektes Netzwerk hier aber 100% Mensch sagen (und 0% für Hund und Auto). Man kann nun eine mathematische Formel angeben, die beschreibt, wie groß der Fehler ist und man versucht, diesen Fehler zu minimieren. Diese Formel bzw. der Fehler hängt nun aber von allen Einträgen der Filter ab, d.h. man kann tun, was Wissenschaftler immer tun, wenn sie eine Formel haben: Sie leiten sie ab. Indem wir wissen, wie sich der Fehler mit den Einträgen der Filter ändert, wissen wir, wie wir die Filter ändern müssen, um dem richtigen Ergebnis näher zu kommen. (Praxistipp: Wenn ihr eine Fehler-Funktion selbst geschrieben habt und diese von Anfang an nur 0 ausgibt und auch dabei bleibt, schaut euch euren Code nochmal an…) Ich schreibe bewusst „näher kommen“, denn man kann das immer nur Schritt für Schritt machen und um ein wirklich gutes Netzwerk zu bekommen, das wirklich lernt, was einen Menschen ausmacht und was einen Hund, sollte man ihm möglichst viele Bilder (hunderte, besser tausende) zeigen. Wer mit NNs arbeitet, verbringt daher einen guten Teil seiner Zeit damit, einfach nur stupide Bilder zu sammeln und mit Labeln zu versehen. (man wünscht sich, man hätte ein Computerprogramm, das Menschen erkennt, um die Daten zu sortieren, damit man dann ein Programm schreiben kann, das Menschen erkennt…)

Zum Schluss kann man als Mensch zwar nur noch schwer nachvollziehen, wie der Computer da eigentlich auf die Zahlen gekommen ist, die er nun verwendet, aber sie funktionieren und sie funktionieren gut!

Nachwort
Ich habe verdammt viele Details ausgelassen. Wie aber eingangs erwähnt, wollte ich nur ein grobes Verständnis geben, wer einmal verstanden hat, wie die Filter und MaxPooling funktionieren, hat eigentlich schon die halbe Miete. In der Praxis setzt man das dann nur noch auf verschiedene Weise zusammen, um die Funktion zu bekommen, die man möchte.

Abb. 6: Ein CNN visualisiert. Die einzelnen Filter-Schritte stellt man sich als Schichten vor. Mit "Subsampling" ist im Bild das MaxPooling gemeint. (wer es bis hier durchgehalten hat, bekommt zur Belohnung noch ein professionelles Bild: Aphex34, Typical cnn, CC BY-SA 4.0 )

Abb. 6: Ein CNN visualisiert. Die einzelnen Filter-Schritte stellt man sich als Schichten vor. Mit “Subsampling” ist im Bild das MaxPooling gemeint. (wer es bis hier durchgehalten hat, bekommt zur Belohnung noch ein professionelles Bild: Aphex34, Typical cnn, CC BY-SA 4.0 )

Die Beschäftigung mit NNs ist übrigens nicht nur sehr cool, man lernt dabei auch vieles über sich selbst: Das Prinzip mit den verschiedenen Filterungen ist vom Gehirn inspiriert. Andere Netzwerktypen versuchen, Spiele zu erlernen wie ein echter Mensch dies tun würde, wieder andere organisieren Daten nach dem Vorbild von Strukturen im Gehirn. Wer sich eher für Mathematik interessiert, kann versuchen, die Theorie hinter NNs besser zu verstehen. Obwohl man nämlich, wie erwähnt, in der Praxis durch gutes altes Ausprobieren schon überwältigende Ergebnisse erzielt hat, ist die ganze Theorie dahinter noch in den Kinderschuhen. Aber auch das Ausprobieren, mit Variablen spielen und dem optimalen Ergebnis Schritt für Schritt näher kommen erinnert mich ehrlich gesagt sehr an mein Physikstudium.

Wer enttäuscht ist, dass ich nur auf die Analyse von Bilder eingegangen bin, nicht aber auf das Erkennen von Sprache oder das Go-Spielen: Sprache lässt sich z.B. als Sonagramm auch in ein Bild umwandeln und das Go-Brett ist im ersten Schritt auch erst mal ein Bild, das man auswerten muss. Also ja, es hängt alles zusammen.

Ich hoffe, ich konnte dem ein oder anderen etwas neues beibringen und freue mich auf rege Diskussionen und interessante Fragen in den Kommentaren.

Kommentare (24)

  1. #1 Mars
    22. Oktober 2018

    uiuiui – gestern früh wars schon schwer
    heute muss man sich richtig anstrengen

    aber seeeehr interessant, gut geschrieben
    und die sache mit den zahlen im filter (vom ersten bild im hinterkopf behalten) wurde auch aufgelöst

    ich möchte jetzt nicht sagen: “man, ich bin zu alt für so einen sch…” aber ich wüsste in meinem derzeigen dasein keine anwendung wo ich das auch nutzen könnte – hobbys hab ich schon.

    mir hat es gefallen, aufschlussreich, interessant, gut geschrieben – ist bei den TOP 5.

  2. #2 MartinB
    22. Oktober 2018

    Ab hier war ich raus:
    “Wir haben nun also 32 Kanten-Bilder. Das ist schön, aber noch nutzlos. Wir können auf diese Bilder nun aber wieder neue Filter anwenden. Im ersten Schritt war ein Filter ja eine 3×3-Matrix, nun besteht ein Filter aber aus 32 3×3-Matrizen, jede wird auf ein Kanten-Bild angewendet und alle Ergebnisse werden addiert. ”
    Erst fielen 32 Filter vom Himmel (den einen für die schrägen Kanten habe ich verstanden, wo kamen die anderen her?), die wende ich auf das Bild an und auf die 32 Ergebnisbilder (das sind ja vermutlich die “Kantenbilder”) wende ich jetzt wieder 32 Filter an? Oder wie? Und da jedes von denen ja schon was gefiltert hat, wie kann ich z.B. vertikale und horizontale Kanten filtern – wen ich mit nem vertikalen Filter anfange, sind die horizontalen raus und umgekehrt. Oder Überlagere ich dann alles ?

    Auch das hier ließ mich rätseln:
    “Zum anderen wird man dadurch ein wenig unabhängiger von der exakten Lage”
    Wieso ändert sich die Lage, wenn ich aus nem 200*200-Bild ein 100*100-Bild mache? Ja, ich verstehe, dass ich dann eine Verschiebung um 1 Pixel nicht mehr sehe, jedenfalls dann, wenn die Verschiebung im gleichen 2×2-Quadrat bleibt, aber sonst?

  3. #3 Karl-Heinz
    22. Oktober 2018

    Ich bin begeistert von diesem Thema.
    Werde es abends genau durchlesen. 😉

  4. #4 Aginor
    22. Oktober 2018

    Ich finde den Artikel auch recht spannend und interessant geschrieben.
    Einiges davon kommt mir auch aus meinem Studium noch bekannt vor (NNs nicht, dafür ist es zu lange her, aber das filtern und so). Das ist dann natürlich ein schöner Einstiegspunkt.

    Der Teil mit dem einlernen des NN erklärt übrigens auch schön, warum gerade Google da so viele Fortschritte macht: Wer viele (oft von Menschen ordentlich getaggte) Daten zur Verfügung hat, der kann natürlich ein großes NN irre schnell einlernen im Vergleich.

    Gruß
    Aginor

  5. #5 Kai
    22. Oktober 2018

    @MartinB: Die Filter sind erstmal randomisiert und nehmen dann im Laufe der Optimierung bestimmte Muster wie Kanten oder Rundungen an. Die verschiedenen Filter sind voneinander unabhängig. Du lässt also z.B. einmal einen Filter über das Bild laufen, der nach horizontalen Kanten sucht, und einen der nach vertikalen Kanten sucht. Jeder Filter liefert immer ein Signal, wenn er auf eine bestimmte Position des Bildes passt. Am Ende bekommst du also für jeden Filter wieder ein neues “Bild” (mit schwarzen Punkten überall dort wo der Filter nicht passt und hellen Punkten wo er passt). Wie du schon richtig gesagt hast: willst du diese Bilder kombinieren, musst du sie einfach überlagern (also gewichtet aufaddieren).

  6. #6 Kai
    22. Oktober 2018

    “Wer enttäuscht ist, dass ich nur auf die Analyse von Bilder eingegangen bin, nicht aber auf das Erkennen von Sprache oder das Go-Spielen: Sprache lässt sich z.B. als Sonagramm auch in ein Bild umwandeln und das Go-Brett ist im ersten Schritt auch erst mal ein Bild, das man auswerten muss. Also ja, es hängt alles zusammen.”

    Das ist zwar richtig, aber das heißt nicht, dass es eine gute Idee ist alles als Bild zu interpretieren und in ein neuronales Netz zu stecken. Es gibt so viele unglaublich schlechte Paper wo Wissenschaftler genau das machen (nach dem Motto: ich kann nur Bilder analysieren, also wandle ich alles was ich analysieren will zuerst in Bilder um). Generell muss man sich zu jedem Problem erstmal Gedanken machen, wie man dieses Problem dem Machine Learning Algorithmus sinnvoll präsentiert. Für Bilder haben sich convolutional neuronal networks als die bislang beste Variante herausgestellt, für andere Probleme nicht.

  7. #7 Karl-Heinz
    22. Oktober 2018

    @Kai

    nach dem Motto: ich kann nur Bilder analysieren, also wandle ich alles was ich analysieren will zuerst in Bilder um.

    Könntest du deine Kritik mit ein paar Beispielen untermauern?
    Danke

  8. #8 JD
    22. Oktober 2018

    Ich oute mich mal als Autor und freue mich zunächst über die netten Worte. Zu den Fragen/Anmerkungen:

    @MartinB
    Bei dir als Physiker kann ich mich ja austoben: Wir beginnen mit einer MxN Matrix für ein Bild der Dimensionen M und N. Nach den ersten 32 Filtern kann man das Ergebnis zu einer 32xMxN Matrix zusammensetzen. Solche mathemtaischen Abstraktionen wollte ich den Nicht-Physikern ersparen 😉 Diese Matrix wird nun eben wieder gefiltert, nur dass wir jetzt keine 3×3 Filter mehr haben, sondern 32x3x3. (die genaue Mathematik müsste man sich am besten in Ruhe ansehen. Ich gebe zu, ich habe auch eine Weile gebraucht, bis ich durchgestiegen bin) Diese Filter sind dann aber ganz neue, die haben nichts mit denen im ersten Schritt zu tun, wie Kai korrekt angemerkt haben, werden die während des Trainings gefunden. Aus menschlicher Sicht fallen die wirklich ein wenig vom Himmel, weil der Computer ja die optimalen Werte findet, aber kein Schwein weiß, wie genau er das tut.
    Die Ergebnisse sind auch nicht unbedingt Kanten, das hab ich nur der Anschaulichkeit halber gesagt. Die Einträge der Filter können alle möglichen Werte annehmen, die müssen nicht mal nur 255 und -255 sein sondern auch etwas daziwschen geht, je nachdem eben, was der Computer als sinnvoll erachtet.
    Als Physiker schlage ich vor, von “Hyperkanten” zu sprechen 😀

    Zum Verschieben: Stimmt schon, die Verschiebung im gleichen 2×2 Quadrat sieht man dann nicht mehr. Das wars auch, mehr will man gar nicht bzw. wenn man mehr will, dann benutzt man größere Filter. (andere Techniken fallen mir auf die Schnelle nicht ein, es gibt aber bestimmt welche)

  9. #9 JD
    22. Oktober 2018

    @Kai

    Ja, auf jedes Problem ein NN werfen zu wollen, finde ich auch nicht sinnvoll. Auch wenn ich mich selbst manchmal dabei ertappe. Wenn man einen Hammer hat, sieht eben alles aus wie ein Nagel 😉 Der letzte Satz war auch mehr so die Erkenntis, dass ich nur einen winzigen Aspekt von NNs behandelt habe, obwohl sie so viel mehr können. Böse Wortbeschränkung 😛

    Die gezeigten Techniken basieren ja aber auf Matrizen, und die kann man immer irgendwo als Bild sehen.
    Gerade bei Sprachanalyse wüsste ich aber auch nicht, was besser funktioniert als NN.

    Aber klar, welches Verfahren man nun genau benutzt, sollte man immer von Fall zu Fall neu überlegen, schlechte Paper kenne ich zwar keine, dafür unzählige Blog-Artikel 😀

  10. #10 Kai
    22. Oktober 2018

    @Karl-Heinz: Mein “Liebings”-Paper ist das hier: https://pubs.acs.org/doi/10.1021/acs.jcim.8b00338

    Genauso fragwürdig ist dieses Paper hier: https://arxiv.org/pdf/1610.02415.pdf
    In den medien wird es folgendermaßen beschrieben: “Software Dreams Up New Molecules in Quest for Wonder Drugs” 😉

    (https://www.technologyreview.com/s/602756/software-dreams-up-new-molecules-in-quest-for-wonder-drugs/)

  11. #11 Joselb
    23. Oktober 2018

    @MartinB @Kai: Mir ist der Schritt, wie man von einzelnen Kantenbildern zu komplexeren Features kommt auch deutlich zu kurz gekommen. Wie Kai bereits geschrieben hat, kann man die 32 einzelnen Kantenbilder gewichtet addieren und so weitere Kantenbilder bekommen. Außerdem kann man weitere Faltungen durchführen. Aber da jeder dieser Schritte nur aus Gewichtung und Addition besteht, lässt sich damit nichts erreichen, was nicht auch mit größeren Filtern gehen würde.
    Will man mehr, muss da irgendwo ein nichtlinearer Anteil in die Berechnung eingehen und dafür sind die Neuronen da. Vereinfacht gesagt muss man auf das Ergebnis einer Faltung zusätzlich eine Funktion anwendet. Es gibt eine Vielzahl an möglichen Funktionen. Eine einfache und häufig verwendete ist f(x) = x für x > 0 und f(x) = 0 für x <= 0, die den negativen Teil quasi "wegschneidet". Wenn wir zwei Kantenbilder haben, wobei in einem (A) Kanten zwischen links schwarz und rechts weiß und das andere (B) zwischen links weiß und rechts schwarz zu besonders hohen Werten führen, dann gilt ungefähr B=-A und sie würden sich in Summe gegenseitig aufheben A+B=0. Eine Summe f(A)+f(B) wäre aber für beide Bilder maximal und wir hätten eine Erkennung einer von der Richtung des Farbverlauf unabhängigen senkrechten Kante, welche durch Faltung und Gewichtung alleine nicht erkennbar wäre. Solche Bilder kann man dann wieder falten, gewichtet addieren oder verkleinern und dadurch immer komplexere Muster erkennen.

  12. #12 foobar407
    23. Oktober 2018

    sind neuronale Netzwerke (NNs) also super-komplizierte Gebilde, die nur die intelligentesten 0,1 % der Weltbevölkerung jemals verstehen könnten? In diesem Beitrag möchte ich zeigen, dass dies nicht ansatzweise stimmt, dass jeder zumindest die Grundlagen neuronaler Netze verstehen kann.

    Also zu Grundlagen zu NNs finde ich in dem Artikel so gut wie gar nichts. Ist es nicht eher ein Artikel über eine beispielhafte Anwendung eines NNs mit Schwerpunkt auf Bildercodierung?

    Neuronale Netzwerke sind in aller Munde. Sie besiegen Weltmeister im Go

    Das ist so vereinfacht, dass ich noch mal nachhaken möchte. Das besondere an modernen KI-Systemen ist ja, dass sie verschiedene Techniken der KI geschickt miteinander kombinieren und sie in leistungsfähige Superrechner steckt. Der Durchbruch in Go war doch zum Beispiel erst die Kombination von NN und Monte-Carlo-Simulation, damit man einzelne Stellungen (und damit Spielzüge) überhaupt miteinander vergleichen und das NN überhaupt trainieren kann, oder? Also NN alleine würde ich da die Trophäe nicht überreichen.

    Abgesehen davon, dass aus meiner Sicht die Einleitung nicht ganz zum Artikel passt, ist es aber ein guter Artikel. :-)

  13. #13 JD
    24. Oktober 2018

    @foobar407
    Dem ersten Einwand würde ich gerne widersprechen. Klar, ich habe die historische Entwicklung über Perceptronen und rein “fully connected networks” übersprungen und noch viel mehr Details ausgelassen, aber das meiste, was heutzutage gemacht wird, sind ohnehin CNNs und zu wissen, wie die einzelnen Komoponenten agieren, hat für mich schon was von “Grundlagen” Dass das ganze am Beispiel Bildcodierung vermittelt wurde, ist in meinen Augen nichts verkehrtes.
    Klar kann man sich jetzt vorzüglich über die Begrifflichkeiten streiten, daher gebe ich dir meine Definition: Wenn man nun einem Artikel über neuronale Netzwerke besser folgen kann als vorher, dann hat man ein paar (mehr) Grundlagen.

    Zum zweiten Einwand: Ich gebe zu, wie genau Alpha Go funktioniert, habe ich mir noch nicht angesehen. Hier könnte man jetzt auch wieder streiten, ob die Aussage “NN besiegt Weltmeister” falsch ist wenn “NN besiegt Weltmeister mit Hilfe von Monte Carlo”. Ich bekenne mich hier aber gerne schuldig, ein wenig journalistisch übertrieben zu haben 😉

  14. #14 foobar407
    24. Oktober 2018

    @JD

    Klar, ich habe die historische Entwicklung über Perceptronen und rein “fully connected networks” übersprungen und noch viel mehr Details ausgelassen

    Die Dinge, die ich im Auge hatte, waren eher Begriffe wie Neuron oder Netzwerk. Das sind eben keine Details sondern Grundlagen.

    aber das meiste, was heutzutage gemacht wird, sind ohnehin CNNs

    Das kann sein. Ich bin zwar in meiner Vergangenheit mehrmals mit NNs in Kontakt gekommen (auch schon selber programmiert), aber mit CNNs noch nicht. Als jemand, der die Grundlagen zwar kennt, hätte ich eben Matrix, Filter und Falten nicht direkt den NNs zuordnen können. Aber vielleicht bin ich da einfach auf einem alten Stand.

    Dass das ganze am Beispiel Bildcodierung vermittelt wurde, ist in meinen Augen nichts verkehrtes.

    Dein Artikel ist ganz und gar nicht verkehrt. Ich wollte nur den Punkt erwähnen, dass ich deinen Artikel jemandem, der was Grundlegendes über NNs erfahren möchte, vielleicht eher nicht empfehlen würde. Aber wenn jemand etwas über ein praktisches Anwendungsbeispiel im Bereich der Bildverarbeitung wissen möchte, würde ich deinen Artikel durchaus empfehlen (und ja, in diesem spezifischen Bereich hat er auch was Grundlegendes :-) ).

    Klar kann man sich jetzt vorzüglich über die Begrifflichkeiten streiten, daher gebe ich dir meine Definition: Wenn man nun einem Artikel über neuronale Netzwerke besser folgen kann als vorher, dann hat man ein paar (mehr) Grundlagen.

    In deinem Artikel steht aber nichts über Neuron und nichts über Netzwerk. Nach dem Lesen deines Artikels kann ich einem Artikel über CNNs, Matrix, Filter und Falten besser folgen.

    Ich bekenne mich hier aber gerne schuldig, ein wenig journalistisch übertrieben zu haben

    Das war ja weniger Vorwurf an dich als mehr Ergänzung zum Artikel. Und es ist auch eher eine allgemeine Einordnung von NNs im Zusammenhang mit dem aktuellen Erfolg der KI.
    Nach meiner Erfahrung ist ein NN wirklich nicht schwer zu verstehen und vor allem leicht zu programmieren. Das Problem sind, wie üblich, eher die Details. Also, wie kann ich meine Eingangswerte überhaupt in das NN reinstecken, was erwarte ich eigentlich für Ausgabewerte, welches Netz benutze ich genau, Anzahl Neuronen und Schichten, welche Trainingsdaten benutze ich, etc.? Den Implementierungsaufwand des reinen NNs würde ich da mit ca. 20% ansehen. Und so ähnlich sehe ich viele Anwendungen von NN. Ich muss jetzt raten, aber ich vermute, dass in den Google-Autos das NN (oder sind es vielleicht sogar mehrere) auch keine so große Rolle im Gesamtsystem spielt.

  15. #15 shader
    24. Oktober 2018

    Ich würde mich nicht darüber streiten, dass sprachliche Vereinfachungen wie “Neuronale Netze besiegen den Weltmeister im Go” nicht korrekt sind. Jede Vereinfachung führt zu falschen Aussagen. Ihr kennt das doch als Naturwissenschaftler, jedes Modell was man nimmt, ist falsch, aber manche sind brauchbar. :)

  16. #16 Kai
    24. Oktober 2018

    @foobar: An der Stelle muss ich JD verteidigen. Die Begriffe “Neuron” als auch “Netzwerk” sind sowieso völlig deplatziert und verwirren mehr als sie bringen. Wer neuronale Netze erklärt, sollte das lieber anhand von Matrizen machen. Die meisten neuronalen Netze, die heute so verwendet werden, sind CNNs oder RNNs. Klassische neuronale Netze wie du sie beschreibst verwendet man meines Wissens kaum, da für derlei Anwendungszwecke logistische Regression und Support Vektor Maschinen oft die besseren Ergebnisse bringen (bzw. ein neuronales Netz, wenn man es sauber macht, wieder nur eine Verallgemeinerung einer logistischen Regression ist). Korrigiert mich, wenn ich da falsch liege.

  17. #17 JD
    24. Oktober 2018

    @foobar407

    Ok, ich sehe ein, das Wort “Grundlagen” war etwas fehl am Platze. Da hätte zumindest ein Absatz stehen können, was mein Artikel ist und eben nicht ist und ggf. eine Verlinkung auf einen wirklich einführenden Artikel. (ich habe zwar ein Buch verlinkt, aber selbstverständlich liest sich das keiner mal eben nebenbei durch) Letztendlich war mir bewusst, dass ich in der Kürze der Wörter niemals das Thema angemessen behandeln kann, daher wollte ich zumindest ein paar Konzepte vermitteln, damit jemand, der anderswo über das Thema liest, sich damit vielleicht leichter tut. Ich persönlich habe kein Problem damit, Begrifflichkeiten zu pauken, aber wenn jemand Prinzipien schlecht erklärt, dann verstehe ich nur Bahnhof. Daher wollte ich Prinzipien vermitteln und Begriffe übergehen.

    Aber das alles nur, weil ich Spaß an unserer Diskussion habe. Natürlich freue ich mich über dein Feedback und nehme es mir zu Herzen.

    Was das Programmieren angeht, ist es übrigens heutzutage noch viel leichter: Mit APIs wie Keras ist so ein Netzwerk in wenigen Codezeilen binnen Minuten “programmiert”. (hängt natürlich davon ab, wie kompliziert man es machen möchte) Der ganze Rest ist da wirklich schwieriger. Ich sitze zur Zeit daran, mein fertig trainiertes Netzwerk in ein Programm einzubauen, das auf einem Server läuft, den Input korrekt entgegennimmt, Fehler abfängt, Rückgabewerte übergibt und dabei noch möglichst effizient arbeitet. Das Netzwerk selber nimmt da nur vergleichsweise wenige Zeilen ein. Was das Google-Auto angeht, würde ich daher genauso raten wie du.

  18. #18 Kai
    24. Oktober 2018

    Ich hatte mal einen Vortrag über selbstfahrende Autos gehört. Dort wurde erklärt: Neuronale Netze werden lediglich für die Auswertung von Kamerabildern genutzt. Niemand käme auf die Idee, das Fahren selbst von NNs steuern zu lassen, das sind weiterhin “klassische” Algorithmen. Daher ist es auch äußerst übertrieben, wie immer wieder suggeriert wird, selbstfahrende Autos würden von künstlichen neuronalen Netzen gesteuert.

  19. #19 shader
    24. Oktober 2018

    @Kai, es mag schon sein, dass man neuronale Netze als deplatziert in der Bezeichnung empfindet. Allerdings können noch weniger Leute was mit Matrizen oder Matrizenmultiplikationen oder sigmoide Aktivierungsfunktionen etwas anfangen. Umgangssprachlich hat sich nun mal eingebürgert, Metaphern zu verwenden, damit Zuhörer zumindest sich ein Bild darunter vorstellen können. Wir sprechen auch umgangssprachlich von einem Gerstenkorn bei einer eitrigen Entzündung am Auge, obwohl wir wissen, dass sich nicht wirklich ein Gerstenkorn am Augenlid verklemmt hat. Und so spricht man von Neuronen in den Netzen, um dem Kind einen Namen zu geben und auf eine bestimmte Analogie hinzuweisen.

  20. #20 Kai
    24. Oktober 2018

    Genau. Und nun stell dir vor jemand erklärt in einem Blogbeitrag was ein Gerstenkorn ist und hinterher beschwert sich jemand, dass in der Erklärung nur über so komische Dinge wie Entzündung geschrieben wurde und überhaupt nicht auf Gerste und ihre Bedeutung in der Landwirtschaft eingegangen wurde 😉

    Das man Dinge in der Mathematik/Informatik lustig benennt ist Gang und Gäbe. Aber wenn man etwas erklärt, sollte man das dann auch richtig machen. Kein Mathematiker erklärt “fröhliche Zahlen” als Zahlen die viel Spaß miteinander haben.

    Entsprechend wenn jemand neuronale Netze einem interessierten Publikum erklärt (Leser dieser Blogs lassen sich ja normalerweise von etwas Mathe nicht abschrecken), dann sollte er schon ein klein wenig über lineare Algebra reden und vielleicht hinterher erklären wie die Analogie zu den Neuronen zustande kommt. Ist jedenfalls meine Meinung.

  21. #21 Kai
    24. Oktober 2018

    Zugegeben: ich übertreibe ein wenig. Natürlich kann man neuronale Netze auch als Netzwerk von Neuronen erklären. Aber das ist eben nicht die einzige vernünftige Erklärungsweise. Und sie impliziert eine Menge Dinge die unsinnig sind, z.B. glauben viele immer, dass neuronale Netze so etwas wie biologische Schaltkreise sind – was ja auch irgendwie naheliegend ist, aber im Falle von künstlichen neuronalen Netzen einfach falsch ist.

  22. #22 foobar407
    24. Oktober 2018

    @Kai
    Noch mal. Der Inhalt des Artikels stört mich überhaupt nicht. Ich sehe darin nur eine kleine Diskrepanz zur Einleitung.

    Dafür dass es als Grundlagenartikel zu NN angekündigt war, wird einiges an Vorwissen verlangt. Im Artikel wird nämlich nicht ganz klar, warum eine Sammlung von Matrizen, die man dann als Filter betrachtet, auf ein mal ein Netzwerk ergeben und sogar ein neuronales. Um diese Verbindung herzustellen braucht man Wissen außerhalb des Artikels. Ich finde das überhaupt nicht weiter schlimm. Natürlich kann man das Thema so angehen. Man kann das Thema auch gerne so praktisch angehen, wenn jemand noch gar nichts über NNs weiß. Aber Grundlagen lernt er dabei weniger. Und dabei meine ich überhaupt nicht biologische Neuronen, sondern rein die KI-Seite. Ich denke, JD hat mich in #17 richtig verstanden, und so schlimm war die Kritik ja nicht, dass wir dafür mehrere Kommentare opfern müssen 😉

    Und zur Bilderkennung bei Google-Autos fällt mir immer das hier ein: https://heise.de/-3974483
    Das ist mit etwas Abstand betrachtet schon ziemlich kurios und auch etwas ulkig

  23. #23 JD
    25. Oktober 2018

    Ich glaube, jetzt verstehe ich die Kritik schon besser. Sollte ich in Zukunft an anderer Stelle mal wieder einen Artikel über NNs und CNNs schreiben, behalte ich das gerne im Hinterkopf.

    Der Kommentar #16 von Kai hat mich übrigens ein wenig erinnert, was ich mir dabei gedacht habe, das Wort “Grundlagen” zu benutzen: Was ich im Artikel geschrieben habe, sind sicherlich Grundlagen, wenn man Sachen wie Resnet, MaskRCNN, Gesichtererkennung und auch RNN/LSTM/CTC (letztere verwendet man z.B. in der Spracherkennung) verstehen will. Aber das soll keine Ausrede sein 😉

    Den Artikel mit dem Google Auto habe ich auch gesehen. Passend dazu gibt es hier einen Artikel, wie man Netzwerke (theoretisch) selber austricksen kann: https://medium.com/@ageitgey/machine-learning-is-fun-part-8-how-to-intentionally-trick-neural-networks-b55da32b7196
    Das ist übrigens der letzte Teil einer sehr schönen Serie über NN. Leseempfehlung für alle interessierten!

  24. #24 shader
    25. Oktober 2018

    Übrigens kann man Künstliche Intelligenz nicht nur dafür verwenden, Bilder auszuwerten und zu klassifizieren. Sie kann auch selbst Bilder anhand der menschlichen Vorbilder erstellen, was wiederum Menschen haben wollen: https://derstandard.at/2000090055441/Kunst-per-Algorithmus-Christies-versteigert-erstmals-KI-Gemaelde