Jekyll2022-03-30T15:19:19+02:00kuenstliche-intelligenz-in-a-nutshell.at//feed.xmlDer Blog zu künstlicher IntelligenzKI, artificial intelligence, machine learning - Artikel über die Anwendung künstlicher Intelligenz in praktischen Projekten.Anwendungen künstlicher Intelligenz in der Medizin2021-03-15T00:00:00+01:002021-03-15T00:00:00+01:00kuenstliche-intelligenz-in-a-nutshell.at//2021/03/15/kuenstliche-intelligenz-medizin<p>Kann künstliche Intelligenz bereits in der Medizin produktiv eingesetzt werden? Wie kann ich eine Anwendung künstlicher Intelligenz in der Medizin progammieren? Sind Programmierer die Ärzte der Zukunft?</p>
<p>Wir haben nun einen eigenen <a href="https://academy.we-make.ai/courses/kuenstliche-intelligenz-medizin/">Spezial Online-Kurs</a> gestartet, in dem Interessierte lernen, wie man selbst einen Bild-Klassifizierer mithilfe vom fastai deep learning Framework programmieren kann, der in der Medizin eingesetzt werden kann.</p>
<p><a href="https://academy.we-make.ai/courses/kuenstliche-intelligenz-medizin/"><strong>Mehr Infos zum Online-Kurs “Anwendungen künstlicher Intelligenz in der Medizin”</strong></a></p>
<h1 id="welche-anwendungen-künstlicher-intelligenz-sind-in-der-medizin-möglich">Welche Anwendungen künstlicher Intelligenz sind in der Medizin möglich?</h1>
<p>Die Medizin und verwandte Gebiete, die die medizinische Forschung betriffen, sind aufstrebende Bereiche für den Einsatz und die Anwendung von Lösungen mithilfe künstlicher Intelligenz. Wir haben uns diesem Thema gewidmet und einen zeigen in diesem Spezialkurs, wie man mithilfe von fastai und einem Convolutional Neural Network einen Bildklassifizierer zur Analyse von Röntgenbildern bietet.</p>
<p>Gerade die bildgebende Diagnostik in der Medizin ist ein wesentliches Gebiet, in dem künstliche Intelligenz eingesetzt werden kann. Künstliche Intelligenz hat in Vergangenheit große Erfolge im Bereich der Bildanalyse erreicht. So bietet die moderne Medizin ein riesiges Füllhorn an Bilddaten, die Mediziner und Ärzte in der Diagnostik unterstützen.</p>
<p>Egal ob Röntgenbilder, CT- oder MRT-Aufnahmen oder die Ergebnisse einer Ultraschalluntersuchung. Die Medizin liefert viele Bilddaten, die sich für die automatisierte Analyse durch ein KI-System anbieten.</p>
<h2 id="welche-anwendungsmöglichkeiten-für-künstliche-intelligenz-gibt-es-in-der-medizin">Welche Anwendungsmöglichkeiten für künstliche Intelligenz gibt es in der Medizin?</h2>
<p>Die Anwendungsgebiete für künstliche Intelligenz sind sehr breit und so haben wir auch in der Medizin eine ganze Reihe an Möglichkeiten. In der Medizin kann KI eine wesentliche Entscheidungshilfe für Ärzte darstellen. So kann die Anwendung künstlicher Intelligenz die Patientenversorgung enorm verbessern und das medizinische Personal entlasten.</p>
<h2 id="einsatz-künstlicher-intelligenz-bei-der-krebsdiagnostik">Einsatz künstlicher Intelligenz bei der Krebsdiagnostik</h2>
<p>Künstliche Intelligenz kann heute bereits Hautkrebs in gutartige und bösartige Tumore besser unterscheiden als der durchschnittliche Arzt das kann. Natürlich gibt es hier auch immer wieder Situationen, die eine gesonderte Analyse bedürfen, in der menschliche Ärzte einfach die besseren Möglichkeiten der Verknüpfung von verschiedenen Wissensquellen ermöglichen.</p>
<p>Hier sieht man, dass künstliche Intelligenz im Wesentlichen zur Entlastung der Mediziner bei Routineaufgaben beitragen kann. Weiters trägt künstliche Intelligenz zur Verlagerung der Medizin hin zum Patienten bei. Patienten können Muttermale mithilfe künstlicher Intelligenz und einer entsprechenden App selbst analysieren können und nur bei schwierigen Fällen der Besuch in der Arztordination erfolgen muss. Auf diesem Weg wird auch die verstärkte Digitalisierung der Medizin immer klarer. Der Blogeintrag <a href="https://doctory.at/ordination/digitalisierung/2021/01/25/Digitalisierung-Arzt-Ordination/">Digitalisierung in der Arztpraxis - die digitale Ordination?!</a> zeigt hier Trends und Signale in Richtung einer digitalen Arzt-Patienten Kommunikation, aber auch eine digitale Kommunikation zwischen verschiedenen Ärzten auf.</p>
<p>Doch kann künstliche Intelligenz in der Medizin nicht nur für die Diagnose von Bildern, sondern eben auch zur Analyse von anderen Ergebnissen der bildgebenden Diagnostik eingesetzt werden. Tumore können wiederum mithilfe von CT- oder MRT-Bilddaten und künstlicher Intelligenz analysiert werden. Der Einsatz von KI ersetzt in diesem Bereich häufig eine für Patienten schmerzhafte Biopsie.</p>
<p>Neben der Analyse und Diagnostik von Tumoren wird künstliche Intelligenz auch bei der Wahl und Planung einer individuellen Therapie für Patienten eingesetzt.</p>
<h2 id="schnelle-diagnose-und-frühzeitige-erkennung-von-erkrankungen-durch-ki-anwendung">Schnelle Diagnose und frühzeitige Erkennung von Erkrankungen durch KI-Anwendung</h2>
<p>Künstliche Intelligenz ist vielfach in der Lage, Erkrankungen bereits deutlich früher erkennen, als das für menschliche Mediziner möglich ist.</p>
<p>Bei der Alzheimer-Erkrankung ist eine Diagnose im klassischen Sinn meist erst dann möglich, wenn bereits die ersten Symptome auftreten. Durch den Einsatz von künstlicher Intelligenz bei der Alzheimer-Diagnose kann diese Krankheit viel früher erkannt werden - noch bevor Symptome für die Erkrankten erkennbar sind. Das heißt, es kann eine frühe Behandlung gestartet werden, die zumindest den Krankheitsverlauf hinauszögern kann.</p>
<h1 id="die-ki-kurse-von-we-makeai-in-der-aiacademy">Die KI-Kurse von we-make.ai in der ai.academy</h1>
<p><strong>Unsere Kursreihe zu künstlicher Intelligenz in der ai.academy:</strong></p>
<ul>
<li><a href="https://www.udemy.com/course/welcome-to-ki-einstieg-in-die-kuenstliche-intelligenz/?referralCode=E1CCD1DB60587E638810">Welcome2KI: Einstieg in die künstliche Intelligenz</a>: Dieser Kurs startet ganz einfach und erklärt, welche Formen von künstlicher Intelligenz es gibt, wo KI heute bereits eingesetzt wird (ohne, dass wir es vielfach ahnen) und welchen Nutzen Unternehmen aus dem Einsatz künstlicher Intelligenz für ihr Geschäftsmodell ziehe können.</li>
<li><a href="https://www.udemy.com/course/welcome-to-ki-2-anwendungen-kuenstlicher-intelligenz/?referralCode=79D95AF77869C4A194B2">Welcome2KI 2: Anwendungen künstlicher Intelligenz</a>: Geht stärker auf den Aspekt der Anwendungen und des konkreten Einsatzes künstlicher Intelligenz ein und bereitet so auf den dritten Teil der Kursreihe vor, in dem es um die eigene Entwicklung von KI und Deep Learning Systemen mithilfe von Python, PyTorch und dem fastai Framework geht.</li>
</ul>
<p>Der dritte online-Kurs behandelt die konkrete Umsetzung und Implementierung von KI-Projekten mit dem PyTorch und fastai Framework. Für diesen Kurs benötigen Sie Basisprogrammierkenntnisse in der Programmiersprache Python. Sie können sich Python Kenntnisse aber natürlich auch parallel dazu aneignen. Auf wesentliche Python-Konstrukte gehen wir auch während des Kurses ein.</p>
<ul>
<li><a href="https://www.udemy.com/course/welcome2ki-teil-3-ki-deep-learning-projekte-selbst-umsetzen/?referralCode=3F0338749235870E3B18">Welcome2KI 3: Deep-Learning Projekte selbst umsetzen</a>: Im dritten Kurs behandlen wir die konkrete Umsetzung von KI-Projekten. Wir behandeln die Themen Computer Vision (Convolutional Neural Networks) und tabellarische Daten. Wir bauen ein eigenes Trainingsdatenset mit Bildern aus dem Web auf, entwickeln ein Deep-Learning Modell mithilfe neuronaler Netze und stellen dieses KI-Modell als WebApplikation im Internet zur Verfügung.</li>
</ul>
<h1 id="begleitende-literatur-der-aiacademy">Begleitende Literatur der ai.academy</h1>
<p>Zusätzlich zu den online-Kursen bieten wir folgende beide Bücher an (beide über Amazon erhältlich):</p>
<ul>
<li><a href="https://amzn.to/37b3us6">Die KI-Revolution im Management: Warum Unternehmen ohne künstliche Intelligenz keine Zukunft haben</a>: Dieses Buch bietet sich als begleitende Literatur zu den ersten beiden Kursen an. Wir stellen darin ein Prozessmodell vor, das es ermöglicht, Ihr Unternehmen in ein KI-getriebenes Unternehmen zu transformieren und so von der “neuen industriellen Revolution” zu profitieren!</li>
<li><a href="https://amzn.to/33oSqGM">Deep Learning Examples with PyTorch and fastai: A Developers’ Cookbook</a>: Diese Buch ergänzt die Inhalte des dritten Online-Kurses um weitere wertvolle “Rezepte”, wie wir typische Anwendungsfälle für künstliche Intelligenz bzw. Deep-Learning mithilfe neuronaler Netze lösen. Das Buch beinhaltet bewusst wenig Prosatext, sondern konzentriert sich tatsächlich auf den Sourcecode.</li>
</ul>
<h1 id="warum-sollte-ich-die-aiacademy-absolvieren">Warum sollte ich die ai.academy absolvieren?</h1>
<p>Das Programm der ai.academy bietet in sehr kompakter und komprimierter Form einen schnellen Einstieg in das Thema <strong>künstliche Intelligenz</strong>. Sie durchstreifen viele verschiedene Aspekte, von der wirtschaftlichen Anwendung künstlicher Intelligenz über gesellschaftliche, ethische Bereiche bis hin zur konkreten Implementierung von KI-Anwendungen. Auf diese Weise liefert Ihnen die ai.academy das notwendige Wissen und Handwerkszeug, um den Einsatz und das Potential künstlicher Intelligenz für Ihr Unternehmen bewerten und einschätzen zu können.</p>Bernhard J. Mayrb.mayr@we-make.aiKann künstliche Intelligenz bereits in der Medizin produktiv eingesetzt werden? Wie kann ich eine Anwendung künstlicher Intelligenz in der Medizin progammieren? Sind Programmierer die Ärzte der Zukunft?Online Akademie für kuenstliche Intelligenz2020-11-20T00:00:00+01:002020-11-20T00:00:00+01:00kuenstliche-intelligenz-in-a-nutshell.at//2020/11/20/kuenstliche-intelligenz-kurse<p>Nach langer Vorbereitung können wir nun endlich unsere Online Akademie für künstliche Intelligenz präsentieren.</p>
<p>Unser Ziel war es, für möglichst viele Interessierte einen einfachen und schnellen Zugang zu Wissen rund um die Themen <strong>“künstliche Intelligenz”</strong>, <strong>“Machine Learning”</strong> und <strong>“Deep Learning</strong> mithilfe neuronaler Netze zu ermöglichen.</p>
<p><img src="/images/2020-11-20-artificial_intelligence_pixabay.jpg" alt="Header-artificial-intelligence" /></p>
<p>Dafür haben wir zum einen online Kurse und zum anderen Literatur in Form von Büchern erstellt und aufbereitet.</p>
<h1 id="für-welche-zielgruppe-ist-die-aiacademy-geeignet">Für welche Zielgruppe ist die ai.academy geeignet?</h1>
<p>Mit der ai.academy sprechen wir vor allem Technik Interessierte mit oder ohne Vorwissen an. Die ersten beiden Kurse setzen keinerlei technisches Vorwissen voraus und eigenen sich so auch besonders für Unternehmer an, die einen möglichen Einsatz künstlicher Intelligenz aus wirtschaftlicher Sicht abwägen können möchten.</p>
<p>Für den dritten Kurs, der sich mit der technischen Umsetzung von Deep Learning / KI-Projekten mithilfe neuronaler Netze beschäftigt, benötigen Sie Basisprogrammierkenntnisse in der Programmiersprache <em>Python</em>.</p>
<h1 id="was-lerne-ich-in-der-aiacademy">Was lerne ich in der ai.academy?</h1>
<p>Die ai.academy zielt darauf ab, dass wir den Bogen von den grundlegenden Einsatzmöglichkeiten künstlicher Intelligenz in Gesellschaft und Unternehmen hin zu der tatsächlichen technischen Umsetzung von eigenen Deep-Learning Projekten aufspannen.</p>
<p>Dabei spielen jedoch auch gesellschaftliche Themen ein wichtige Rolle, wie etwa künstliche Intelligenz und Ethik / Moral. Soll eine künstliche Intelligenz wirklich alles dürfen? Wo liegen die Grenzen vom Einsatz künstlicher Intelligenz aus moralischer Sicht?</p>
<p>Aus technischer Sicht setzen wir auf das fastai Framework. Dieses baut auf Python auf und bietet aus didaktischer, wie auch aus technischer Sicht wesentliche Vorteile gegenüber der reinen Verwendung von Pytorch.</p>
<h1 id="die-ki-kurse-von-we-makeai-in-der-aiacademy">Die KI-Kurse von we-make.ai in der ai.academy</h1>
<p><strong>Unsere Kursreihe zu künstlicher Intelligenz in der ai.academy:</strong></p>
<ul>
<li><a href="https://www.udemy.com/course/welcome-to-ki-einstieg-in-die-kuenstliche-intelligenz/?referralCode=E1CCD1DB60587E638810">Welcome2KI: Einstieg in die künstliche Intelligenz</a>: Dieser Kurs startet ganz einfach und erklärt, welche Formen von künstlicher Intelligenz es gibt, wo KI heute bereits eingesetzt wird (ohne, dass wir es vielfach ahnen) und welchen Nutzen Unternehmen aus dem Einsatz künstlicher Intelligenz für ihr Geschäftsmodell ziehe können.</li>
<li><a href="https://www.udemy.com/course/welcome-to-ki-2-anwendungen-kuenstlicher-intelligenz/?referralCode=79D95AF77869C4A194B2">Welcome2KI 2: Anwendungen künstlicher Intelligenz</a>: Geht stärker auf den Aspekt der Anwendungen und des konkreten Einsatzes künstlicher Intelligenz ein und bereitet so auf den dritten Teil der Kursreihe vor, in dem es um die eigene Entwicklung von KI und Deep Learning Systemen mithilfe von Python, PyTorch und dem fastai Framework geht.</li>
</ul>
<p>Der dritte online-Kurs behandelt die konkrete Umsetzung und Implementierung von KI-Projekten mit dem PyTorch und fastai Framework. Für diesen Kurs benötigen Sie Basisprogrammierkenntnisse in der Programmiersprache Python. Sie können sich Python Kenntnisse aber natürlich auch parallel dazu aneignen. Auf wesentliche Python-Konstrukte gehen wir auch während des Kurses ein.</p>
<ul>
<li><a href="https://www.udemy.com/course/welcome2ki-teil-3-ki-deep-learning-projekte-selbst-umsetzen/?referralCode=3F0338749235870E3B18">Welcome2KI 3: Deep-Learning Projekte selbst umsetzen</a>: Im dritten Kurs behandlen wir die konkrete Umsetzung von KI-Projekten. Wir behandeln die Themen Computer Vision (Convolutional Neural Networks) und tabellarische Daten. Wir bauen ein eigenes Trainingsdatenset mit Bildern aus dem Web auf, entwickeln ein Deep-Learning Modell mithilfe neuronaler Netze und stellen dieses KI-Modell als WebApplikation im Internet zur Verfügung.</li>
</ul>
<h1 id="begleitende-literatur-der-aiacademy">Begleitende Literatur der ai.academy</h1>
<p>Zusätzlich zu den online-Kursen bieten wir folgende beide Bücher an (beide über Amazon erhältlich):</p>
<ul>
<li><a href="https://amzn.to/37b3us6">Die KI-Revolution im Management: Warum Unternehmen ohne künstliche Intelligenz keine Zukunft haben</a>: Dieses Buch bietet sich als begleitende Literatur zu den ersten beiden Kursen an. Wir stellen darin ein Prozessmodell vor, das es ermöglicht, Ihr Unternehmen in ein KI-getriebenes Unternehmen zu transformieren und so von der “neuen industriellen Revolution” zu profitieren!</li>
<li><a href="https://amzn.to/33oSqGM">Deep Learning Examples with PyTorch and fastai: A Developers’ Cookbook</a>: Diese Buch ergänzt die Inhalte des dritten Online-Kurses um weitere wertvolle “Rezepte”, wie wir typische Anwendungsfälle für künstliche Intelligenz bzw. Deep-Learning mithilfe neuronaler Netze lösen. Das Buch beinhaltet bewusst wenig Prosatext, sondern konzentriert sich tatsächlich auf den Sourcecode.</li>
</ul>
<h1 id="warum-sollte-ich-die-aiacademy-absolvieren">Warum sollte ich die ai.academy absolvieren?</h1>
<p>Das Programm der ai.academy bietet in sehr kompakter und komprimierter Form einen schnellen Einstieg in das Thema <strong>künstliche Intelligenz</strong>. Sie durchstreifen viele verschiedene Aspekte, von der wirtschaftlichen Anwendung künstlicher Intelligenz über gesellschaftliche, ethische Bereiche bis hin zur konkreten Implementierung von KI-Anwendungen. Auf diese Weise liefert Ihnen die ai.academy das notwendige Wissen und Handwerkszeug, um den Einsatz und das Potential künstlicher Intelligenz für Ihr Unternehmen bewerten und einschätzen zu können.</p>Bernhard J. Mayrb.mayr@we-make.aiNach langer Vorbereitung können wir nun endlich unsere Online Akademie für künstliche Intelligenz präsentieren.Content Auswertung durch den Einsatz künstlicher Intelligenz automatisieren2020-04-22T00:00:00+02:002020-04-22T00:00:00+02:00kuenstliche-intelligenz-in-a-nutshell.at//2020/04/22/digitale-Content-Auswertung-Analyse-k<p>Warum ist es heute notwendig, die Medienlandschaft mithilfe von autonomen Algorithmen zu analysieren? Warum ist es nicht möglich, die wichtigsten Websites, die meine Unternehmen betreffen, einfach regelmäßig durchsehen, so wie ich die Headlines der wichtigsten Nachrichtenmagazine querlese und so einen guten Überblick über aktuelle Themen erhalte?</p>
<p>Um diese und ähnliche Fragen beantworten zu können, betrachten wir den Unterschied zwischen den traditionellen Printmedien und der digitalen Medienlandschaft.</p>
<h2 id="der-unterschied-zwischen-printmedien-und-digitaler-medienlandschaft">Der Unterschied zwischen Printmedien und digitaler Medienlandschaft</h2>
<p>Klassische (Print-)Medien sind relativ leicht überschaubar. Zu den Printmedien zählen Tageszeitungen, Zeitschriften, aber auch wissenschaftliche Journals. Als Unternehmen betreffen mich selten alle Kategorien von Printmedien. Meist liegt mein Fokus auf einer Gatting. Als modeaffines Unternehmen liegt etwa mein Hauptinteresse auf entsprechenden Zeitschriften. Wissenschaftliche Journals werden mich nicht berühren. Die klassische Medienlandschaft ist zudem ausgesprochen statisch. Es dauert relativ lange, bis neue Journale erscheinen. Jedes Medium hat einen fixen Releasezyklus, innerhalb dessen eine neue Ausgabe erscheint. Gänzlich neue Printmedien kommen nur langsam hinzu, dass es immer einen Verlag benötigt, der für die Distribution sorgt.</p>
<p>Die Distribution erfolgt auf physischem Weg, weshalb klassische Medien meist auch einen sehr starken geographischen Bezug haben. Die Auslieferung erfolgt nur in Gebieten, die für das Magazin interessant sind. Tageszeitungen haben per se einen sehr regionalen Fokus. Summa summarum ist die Änderungsrate in der klassischen Medienlandschaft als eher gering einzustufen. Aus diesem Grund lassen sich diese Medien auch relativ gut manuell überblicken.</p>
<p>Bei klassischen Medien ist zudem die Interaktionsmöglichkeit zwischen Lesern sehr eingeschränkt. Zwar bieten beinahe alle Medien die Möglichkeit, Leserbriefe einzusenden, behalten sich aber das Recht der Veröffentlichung vor. Die Leserreaktion erfolgt zudem frühestens in der nächstfolgenden Ausgabe. Ein direkte Diskussion zwischen Lesern ist auf diese Weise nicht möglich. Daher ist auch ausgeschlossen, dass sich Diskussion über Leserbriefe gegenseitig aufschaukeln.</p>
<p>Betrachten wir nun unter den gleichen Aspekten die digitale Welt, so zeichnet sich ein deutlich anderes Bild. Digitale Medien sind weitgehend unabhängig von äußeren Einflußfaktoren. Es treten verschiedene Mitspieler auf den Markt. Digitale Inhalten, die von klassischen Verlagen stammen gemischt mit Inhalten von Privatpersonen. Es braucht keinen Verlag, keine Vertriebslogistik, um digital Content zu verbreiten. Verbreiten bedeutet daher auch ohne regionale Grenze. Das Web ist weltweit verfügbar und so auch der präsentierte Inhalt - ohne zeitliche Verzögerung. Es gibt keine Vorlaufzeiten für eine neue Ausgabe. Neuer Inhalt kann jederzeit und kurzfristig publiziert werden. Genauso ist keine Basis für die Content Generierung erforderlich. Ein Computer mit Internetzugang reicht aus, um selbst Verleger zu werden. So können jederzeit und überall neue Teilnehmer im digitalen Markt erscheinen und mit ihren Inhalten die Meinung der Leser beeinflussen. Digitaler Content wird vielfach mithilfe von Push-Diensten konsumiert. D. h. der Leser muss nicht explizit auf die Webseite surfen, um aktuelle Inhalte lesen zu können. Er bekommt den Inhalt direkt auf sein Mobilgerät geliefert und wird so zu just-in-time Konsumenten. Doch ist der Konsument gleichzeitig auch Produzent von Inhalten. Digital besteht beinaher überall eine Kommentar- bzw. Diskussionsfunktion. Die so generierten Leserreaktionen erscheinen in Echtzeit. Andere Leser können wiederum reagieren. Die Dynamik und das Potential für Meinungsbildung der Interaktionen mit Artikeln ist digital enorm. Diese Diskussion kann sich innerhalb kürzester Zeit derart aufschaukeln, dass ein Produkt viral durch die Decke geht oder sich ein Shitstorm über das Unternehmen ergießt. Digitale Medien weisen daher ein enormes Marktveränderungspotential auf, wofür nicht nur der ursprüngliche Inhalt, sondern auch die Leserreaktionen darauf verantwortlich sind.</p>
<p>Im Unterschied zu klassischen Printmedien gewinnt die Form von Inhalten im digitalen Bereich eine zusätzliche Variabilität hinzu. Während in Printmedien Fotos eher der Unterstreichung eines Artikels dienen, werden Bilder im digitalen Raum vielfach direkt als Informationsträger genutzt. Zusätzlich nehmen Videos als Kommunikationsformat einen immer größeren Stellenwert ein. Videoplattformen wie Youtube bieten Informationen in Form von Videos aber auch in Form von Diskussionsmöglichkeit zu den veröffentlichten Inhalten.</p>
<h2 id="strategien-zur-auswertung-und-analyse-von-inhalten-und-content">Strategien zur Auswertung und Analyse von Inhalten und Content</h2>
<p>Für klassische (Print-)Medien bestehen im Grunde nur zwei Möglichkeiten der Auswertung: entweder man liest die wichtigsten Medien selbst quer oder man beauftragt einen Presse-Clipping-Dienst. Das Presse-Clipping liefert die Resultate einer Schlagwortsuche und die entsprechenden Artikel dazu. Diese müssen dann wiederum manuell durchgearbeitet werden. Reaktionen auf diese Artikel (Leserbriefe) finden auf diesem Weg keine Berücksichtigung in der Auswertung. Der Schlagwortsuche haftet ein weiterer massiver Mangel an: sie berücksichtigt keinen Kontext des Inhalts. Findet sich im Artikel etwa der Begriff “Weber” ist nicht klar, ob sich dabei um eine Berufsbezeichnung, einen Markennamen oder etwas ganz anderes handelt. Daher kann eine Schlagwortsuche auch nicht kontextbezogen definiert werden. Die semantische Analyse des Inhalts obliegt beim Presse-Clipping dem Auftraggeber.</p>
<p>Im digitalen Medienbereich sind die Inhalte mannigfaltiger und umfangreicher. Denken an die verschiedensten Bewertungsplattformen! Welche kennen Sie? Google Bewertungen? Tripadvisor? Yelp? …. Selbst in diesem recht eng abgegrenzten Segment der Bewertungsplattformen reicht es nicht, nur einige wenige manuell zu überwachen.</p>
<p>Der Versuch, diese Flut an Information manuell auszuwerten fußt zumeist in blindem Aktionismus. Es wird “auf gut Glück” versucht, Inhalte über soziale Netzwerke an potentielle Kunden zu bringen, ohne einen Überblick über die aktuelle Situation im digitalen Raum zu haben. Es wird also versucht, einen Sichtflug direkt im Nebel durchzuführen. Content im digitalen Raum zu steuern, bedeutet, dass ich zuallererst wissen muss, wie die aktuelle Stimmungslage aussieht, wer die “global player” sind, worauf die Leserschaft anspricht, etc. Diese Auswertung ist manuell nicht durchführbar. Daher ist eine automatisierte Auswertung digitaler Inhalte unumgänglich.</p>
<p>Um eine zielorientierte Strategie umsetzen zu können, ist es primär erforderlich, den aktuellen IST-Stand zu kennen. Diese IST-Zustandsanalyse kann digital durch automatische Auswertungen generiert werden. Ein auf künstliche Intelligenz gestützte Auswertung von Inhalten geht über eine reine Schlagwortsuche weit hinaus. Derartige Systeme sind in der Lage, semantische Analysen durchzuführen und den Kontext der Informationen auszuwerten. Hier ist es möglich, den digitalen Raum nach Suchbegriffen zu durchleuchten, die einer bestimmten Entitätsklasse zugehörig sind. Möchten wir etwa gezielt nach Inhalten suchen, die den Ausdruck “Weber” als Marken- bzw. Unternehmensnamen beinhalten, können wir die KI-gestützte Suche auf diese Ausrichtung hin parametrisieren. Die KI-Engine ist in der Lage, übergeordnete Konzepte zu extrahieren und so Webseiten und social media channels zu klassifizieren. Beinhaltet ein Text etwa die Begriffe Higgs-Boson und Cern ist ein solches Suchsystem in der Lage, daraus das übergeordnete Konzept “Hadronenbeschleuniger” abzuleiten, ohne dass dieser Begriff explizit im Text vorkommt. Doch auch die Bewertung von Stimmungslagen ist mithilfe eines automatisierten Systems möglich. Dazu wird jeder Text hinsichtlich einer positiven, neutralen oder negativen Grundstimmung analysiert. Warum ist eine derartige Analyse interessant? Wie bereits im Abschnitt über die Charakteristik von digitalen Medien angesprochen, sind diese äußerst schnelllebig und dynamisch, was die Nutzerinteraktion angeht. So kann mithilfe einer derartigen Sentimentanalyse überwacht werden, ob die Diskussionen zu Inhalten die gleiche Stimmung aufweisen, wie der Artikel selbst. Beispielsweise schalten Sie für Ihr Unternehmen ein Video, das ein bestimmtes Produkt bzw. eine Dienstleistung erklärt. Dieses Video wird sicherlich positiv sein. Doch was, wenn die Nutzer nun einen bestimmten Schwachpunkt im Rahmen der Kommentarfunktion intensiv diskutieren? Sofern Sie dies ohne automatisierte Überwachung überhaupt rechtzeitig erkennen, können Sie vielleicht die Kommentarfunktion sperren. Das Resultat wird sein, dass sich die Diskussion verlagert (der digitale Raum ist unabhängig) und diese Aktion dem Ansehen Ihres Produkts / Ihrer Dienstleistung weiter schadet. Wenn Sie die Diskussionen zu Ihren Inhalten jedoch laufend automatisiert überwachen, erhalten Sie frühzeitig Hinweise auf mögliche negative Stimmungen und können zeitgerecht und zielgerichtet reagieren.</p>
<p>Die Schnelllebigkeit im digitalen Raum betrifft auch neue Quellen. Jederzeit können neue Blogs erscheinen, die innerhalb kürzester Zeit ein großes Zielpublikum, Reichweite und Impactfactor aufbauen. Wie erkennen Sie, welche neuen Webseiten für Sie relevant sind? Eine tägliche google-Suche manuell zu allen relevanten Themenbereichen anzustoßen wäre eine Möglichkeit. Ich bin mir aber sicher, Sie werden nicht alle finden (suchen Sie auch am Wochenende und im Urlaub?) und Sie haben bessere Einsatzmöglichkeiten für Ihr qualifiziertes Personal. Eine automatisierte Auswertung durchleuchtet täglich das Web auf neue Inhalte (genauso, wie google laufend das Web indiziert). Die gefundenen Quellen werden mithilfe von KI analysiert und kategorisiert. Stimmt die inhaltliche Analyse mit meinen marketingrelevanten Themen überein, so wird die Quelle automatisch in die regelmäßige Auswertung hinzugefügt..
Ohne eine verlässliche, automatisierte Analyse läuft man sehr schnell Gefahr, die notwendige Orientierung im digitalen Raum zu verlieren und gibt damit das Steuer aus der Hand.</p>Bernhard J. Mayrb.mayr@we-make.aiWarum ist es heute notwendig, die Medienlandschaft mithilfe von autonomen Algorithmen zu analysieren? Warum ist es nicht möglich, die wichtigsten Websites, die meine Unternehmen betreffen, einfach regelmäßig durchsehen, so wie ich die Headlines der wichtigsten Nachrichtenmagazine querlese und so einen guten Überblick über aktuelle Themen erhalte?Einsatz künstlicher Intelligenz im Recruiting (bzw. Human Resources)2020-04-14T00:00:00+02:002020-04-14T00:00:00+02:00kuenstliche-intelligenz-in-a-nutshell.at//2020/04/14/K%C3%BCnstliche-Intelligenz-Recruiting-Hum<p>Durch künstliche Intelligenz werden immer mehr Bereiche (teil-)automatisiert, von denen es bislang nicht denkbar war. Man war der Ansicht, dass in solchen Positionen eine fundierte und langjährige Ausbildung gepaart mit praktischer Berufserfahrung absolut notwending sind, um Erfolge verzeichnen zu können.</p>
<p>War vor einigen Jahren die Hauptsorge in Hinblick auf Automatisierung den weniger qualifizierten Jobs geschuldet, so hat die <strong>Automatisierung mittels künstlicher Intelligenz auch in immer höher qualifizierten Berufen Einzug</strong> gehalten. Beispiele hierfür sind etwa:</p>
<ul>
<li><strong>Buchhaltung und Bilanzanalyse</strong></li>
<li><strong>Kreditvergabe</strong></li>
<li><strong>Diagnosen in der bildgebenden Medizin</strong></li>
</ul>
<p>Bislang können Systeme, die auf künstlicher Intelligenz basieren in solchen Teilgebieten bereits bessere Leistungen erbringen, als die menschlichen Anwender dies können.</p>
<h2 id="personalmanagement--recruiting--human-resources">Personalmanagement / Recruiting / Human Resources</h2>
<p>Der Personalbereich ist nach wie vor ein Schlüsselbereich aller Unternehmen, kommt es doch auf die erfolgreiche Anwerbung und Einstellung von qualifizierten Mitarbeitern an. In diesem Bereich verlassen sich viele Unternehmen auf Personalleiter und Recruiter mit langjähriger Erfahrung. Insbesondere die dadurch erworbene Menschenkenntnis kann durch nichts ersetzt werden - oder doch?</p>
<p>Insbesondere die Datenskandale rund um Facebook und die verbundene Firma <em>Cambridge Analytica</em> zeigten, dass die <strong>Interaktionen auf sozialen Netzwerken beinahe die gleiche Qualität einer Persönlichkeitsanalyse aufweisen, wie durch Psychologen erstellte Persönlichkeitsprofile</strong>. (https://edition.cnn.com/2018/04/10/health/facebook-likes-psychographics/index.html)</p>
<p><strong>Big Data kombiniert mit künstlicher Intelligenz</strong> kann und wird also auch den Bereich der Personalbeschaffung dauerhaft verändern.</p>
<p>Möglicherweise haben Unternehmen in Zukunft die Möglichkeit, potentielle Mitarbeiter aufgrund deren Aktivität in sozialen Netzwerken gezielt anwerben zu können. Auf diese Weise würden sich Unternehmen die mühevolle Vorauswahl potentieller Mitarbeiter ersparen und könnten sich auf Detailinterviews konzentrieren.</p>
<h2 id="big-five-persönlichkeitsanalyse-mithilfe-künstlicher-intelligenz">Big-Five Persönlichkeitsanalyse mithilfe künstlicher Intelligenz</h2>
<p>Wir haben ein System entwickelt, das aufgrund des Schreibstils einer Person ein Persönlichkeitsprofil nach den <strong>Big-Five</strong>-Merkmalen erstellt. (Im Englischen auf häufig als <strong>OCEAN-Modell</strong> bezeichnet.)</p>
<p><img src="/images/2020-04-14-Künstliche-Intelligenz-Recruiting-Human-Resources-f4cb4136.webp" alt="" /></p>
<p>Diesem Modell zufolge gibt es für jeden Menschen fünf Hauptdimensionen der Persönlichkeit:</p>
<ul>
<li>Offenheit für Erfahrungen</li>
<li>Gewissenhaftigkeit</li>
<li>Extraversion</li>
<li>Verträglichkeit</li>
<li>Neurotizismus</li>
</ul>
<p>Quelle: Wikipedia - <a herf="https://de.wikipedia.org/wiki/Big_Five_(Psychologie)">https://de.wikipedia.org/wiki/Big_Five_(Psychologie)</a></p>
<h2 id="big-five-persönlichkeitsmodell-durch-künstliche-intelligenz">Big-Five-Persönlichkeitsmodell durch künstliche Intelligenz</h2>
<p>Wir haben ausgehend von einer riesigen Datenbasis ein auf künstlicher Intelligenz basierendes System entwickelt, das in der Lage ist, aufgrund von textueller Information (E-Mails, Twitter Postings, Anschreiben, persönliche Notizen, etc.), Persönlichkeitsprofile nach dem Big-Five-Modell zu erstellen.</p>
<hr />
<p><strong>Testen Sie gleich den Einsatz unseres Modells:</strong> <a href="https://big-five-personality.herokuapp.com/">https://big-five-personality.herokuapp.com</a></p>
<hr />
<p>Unser Modell basiert auf einer <strong>Kombination aus psychologischen-linguistischen Modellen und analytischen Algorithmen</strong>. Die Daten stammen aus verschiedenen wissenschaflichen Studien. Ziel war die <strong>Ableitung von Persönlichkeitsmerkmalen aus Daten sozialer Medien</strong>. Es zeigte sich, dass Personen mit bestimmten Persönlichkeitsmerkmalen auch deutlich abgrenzbare Verhaltensweisen hinsichtlich des Umgangs mit sozialen Medien aufwiesen.</p>
<p>Andere Studien aus dem <strong>Bereich des Einzelhandels</strong> zeigten, dass Personen mit hohen Werten in den Bereichen Ordnung, Selbstdisziplin und Vorsicht zu etwa 40% stärke auf Rabattaktionen ansprechen, als zufällig ausgewählte Testpersonen.</p>
<h2 id="anwendungsfälle-von-künstlicher-intelligenz-und-psychologie">Anwendungsfälle von künstlicher Intelligenz und Psychologie</h2>
<p>Für diese Kombination aus Algorithmen künstlicher Intelligenz und Psychologie gibt es vielschichtige Anwendungsmöglichkeiten:</p>
<ul>
<li><strong>Personalmanagement:</strong> Hier kann z.B. eine <strong>automatisierte Vorauswahl von Kandidaten erfolgen</strong>, um die Arbeitslast der Recruitingabteilung zu reduzieren. Auch bei der Zusammenstellung von Teams, die bestmöglich kooperieren sollen, kann ein deratiges System hilfreich sein.</li>
<li><strong>Kundenmanagement:</strong> Je besser ich meine Kunden kenne, um gezielter kann ich sie ansprechen. Hier könnte ich <strong>automatisiert gezielte Kommunikation mit meinen Kunden</strong> betreiben. Gezielte Werbung bedeutet höhere Output bei geringeren Kosten. Im Bereich Support und Service kann ich den Kunden bestmöglich ansprechen, um seine Sorgen und Schwierigkeiten abzufangen und so zu einem zufriedenen Kunden machen.</li>
<li><strong>Bewerberberatung:</strong> Natürlich können solche Systeme auch zur <strong>gezielten Beratung und Vermittlung von Bewerbern</strong> eingesetzt werden.</li>
</ul>
<p>Wir von <a href="https://www.we-make.ai">we-make.ai</a> sind der Ansicht, dass insbesondere im sozialen Zusammenspiel eine persönliche Komponente auch in Zukunft wichtig und wahrscheinlich auch unersetzlich sein wird. Doch insbesondere in der Optimierung der Kommunikation und in der Erleichterung von Routineaufgaben werden sich auch in diesem Bereich Automatisierungen mithilfe von künstlicher Intelligenz durchsetzen.</p>Bernhard J. Mayrb.mayr@we-make.aiDurch künstliche Intelligenz werden immer mehr Bereiche (teil-)automatisiert, von denen es bislang nicht denkbar war. Man war der Ansicht, dass in solchen Positionen eine fundierte und langjährige Ausbildung gepaart mit praktischer Berufserfahrung absolut notwending sind, um Erfolge verzeichnen zu können.Kaiming Initialization für neuronale Netze2020-04-06T00:00:00+02:002020-04-06T00:00:00+02:00kuenstliche-intelligenz-in-a-nutshell.at//2020/04/06/kaiming-initialization-neural-nets<p>Nachdem wir in den letzten beiden Posts - <a href="/2020/04/04/xavier-initialization-neural-nets.html">Xavier Initialisierung</a>) und <a href="/2020/04/02/Parameter-Weight-Initialiserung-Standardabweichung-Kaiming.html">Parameter Initialiserung</a> die Auswirkungen verschiedener Möglichkeiten der Initialisierung der Parametermatrix in neuronalen Netzen betrachtet haben, wenden wir uns in diesem Post einer weiteren Technik zu: <strong>Kaiming Initialisierung</strong>.</p>
<p>Grundsätzlich macht es Sinn, bei Aktivierungsfunktionen wie <code class="language-plaintext highlighter-rouge">tanh</code>, die symmetrisch rund um den Nullpunkt sind und Ergebnisse im Wertebereich von [-1, 1] liefern, die Ausgaben der Aktivierungen für jeden Layer auf einen Mittelwert von <code class="language-plaintext highlighter-rouge">0</code> mit einer Standardabweichung von <code class="language-plaintext highlighter-rouge">1</code> zu normalisieren. <em>Genau das macht die Xavier Initialiserung!</em></p>
<p>Doch was ist, wenn wir nun eine <code class="language-plaintext highlighter-rouge">ReLU</code> Aktivierungsfunktion verwenden?</p>
<p><img src="/images/2020-04-06-kaiming-initialization-neural-nets-b69afac2.webp" alt="Relu activation function" width="400" />
<em>ReLU activation function. Quelle: <a href="https://medium.com/@kanchansarkar/relu-not-a-differentiable-function-why-used-in-gradient-based-optimization-7fef3a4cecec">Sarkar’s blog</a></em></p>
<p>Prüfen wir das wieder mit unserem kleinen neuronalen Netz und etwas Python Code:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">relu</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="k">return</span> <span class="n">x</span><span class="p">.</span><span class="n">clamp_min</span><span class="p">(</span><span class="mf">0.</span><span class="p">)</span>
<span class="n">mean</span><span class="p">,</span> <span class="n">var</span> <span class="o">=</span> <span class="mf">0.</span><span class="p">,</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10000</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">relu</span><span class="p">(</span><span class="n">a</span> <span class="o">@</span> <span class="n">x</span><span class="p">)</span>
<span class="n">mean</span> <span class="o">+=</span> <span class="n">y</span><span class="p">.</span><span class="n">mean</span><span class="p">().</span><span class="n">item</span><span class="p">()</span>
<span class="n">var</span> <span class="o">+=</span> <span class="n">y</span><span class="p">.</span><span class="nb">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">).</span><span class="n">mean</span><span class="p">().</span><span class="n">item</span><span class="p">()</span>
<span class="n">mean</span><span class="o">/</span><span class="mi">10000</span><span class="p">,</span> <span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">var</span><span class="o">/</span><span class="mi">10000</span><span class="p">)</span>
</code></pre></div></div>
<blockquote>
<p>(9.027289896678925, 16.01248299986557)</p>
</blockquote>
<p>Wenn wir also <code class="language-plaintext highlighter-rouge">ReLU</code> als Aktivierungsfunktion verwenden, nähert sich die Standardabweichung jedes Layers in etwa dem Wert von $\sqrt(512)/\sqrt(2)$.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">512</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
</code></pre></div></div>
<blockquote>
<p>16.0</p>
</blockquote>
<p>Wenn wir nun die Werte der Parametermatrix <code class="language-plaintext highlighter-rouge">a</code> mit genau diesem Wert skalieren, erhalten wir im Mittel eine Standardabweichung von <code class="language-plaintext highlighter-rouge">1</code>.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mean</span><span class="p">,</span> <span class="n">var</span> <span class="o">=</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10000</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">relu</span><span class="p">(</span><span class="n">a</span> <span class="o">@</span> <span class="n">x</span><span class="p">)</span>
<span class="n">mean</span> <span class="o">+=</span> <span class="n">y</span><span class="p">.</span><span class="n">mean</span><span class="p">().</span><span class="n">item</span><span class="p">()</span>
<span class="n">var</span> <span class="o">+=</span> <span class="n">y</span><span class="p">.</span><span class="nb">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">).</span><span class="n">mean</span><span class="p">().</span><span class="n">item</span><span class="p">()</span>
<span class="n">mean</span><span class="o">/</span><span class="mi">10000</span><span class="p">,</span> <span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">var</span><span class="o">/</span><span class="mi">10000</span><span class="p">)</span>
</code></pre></div></div>
<blockquote>
<p>(0.5636869582474232, 0.999786368072371)</p>
</blockquote>
<p>Wenn wir also die Standardabweichung der Parameter für jeden Layer rund um <code class="language-plaintext highlighter-rouge">1</code> halten können, können wir zusätzliche Layer in unser neuronales Netz aufnehmen, ohne Gefahr zu laufen, dass die Gradienten <em>explodieren</em> oder <em>verschwinden</em> (exploding / vanishing gradients problem).</p>
<p>Diese Analyse, wie man die Parameter von tiefen neuronalen Netzen (<em>deep neural nets</em>) am erfolgreichsten durchführen kann, brachte Kaiming He et. al. dazu, ihr eigenens Schema der Initialisierung zu publizieren. In ihrem Paper [Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification] (https://arxiv.org/pdf/1502.01852.pdf) präsentierten sie ein Initialisierungsschema, das besonders für tiefe neuronale Netze mit asymmetrischen, nicht-linearen Aktivierungsfunktionen geeignet ist.</p>
<p>Sie zeigten, dass tiefe Netze (im konkreten Fall ein <em>deep-convolutional-neural-net</em> mit 22 Layern) unter folgenden Initialisierungsbedingungen schneller konvergieren:</p>
<ul>
<li>Erstelle einen Tensor von der Größe der Parametermatrix des jeweiligen Layers. Fülle diesen Tensor mit Zufallswerten aus einer Standard-Normalverteilung.</li>
<li>Multipliziere nun jeden dieser Werte mit $\sqrt(2)/\sqrt(n)$, wobei <code class="language-plaintext highlighter-rouge">n</code> der Anzahl von der eingehenden Verbindungen in einen Knoten ist (<em>fan-in</em>).</li>
<li>Bias-Tensoren werden mit <code class="language-plaintext highlighter-rouge">0</code> initialisiert.</li>
</ul>
<p>Setzen wir diese Anweisungen nun wieder für unser neuronales Netz um:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">kaiming</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">h</span><span class="p">):</span>
<span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span><span class="o">*</span><span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mf">2.</span><span class="o">/</span><span class="n">m</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">kaiming</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">relu</span><span class="p">(</span><span class="n">a</span> <span class="o">@</span> <span class="n">x</span><span class="p">)</span>
<span class="n">x</span><span class="p">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">x</span><span class="p">.</span><span class="n">std</span><span class="p">()</span>
</code></pre></div></div>
<blockquote>
<p>(tensor(0.2789), tensor(0.4226)))</p>
</blockquote>
<p>Vergleichen wir dies nun mit dem Einsatz einer <em>Xavier Initialisierung</em>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">xavier</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">relu</span><span class="p">(</span><span class="n">a</span> <span class="o">@</span> <span class="n">x</span><span class="p">)</span>
<span class="n">x</span><span class="p">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">x</span><span class="p">.</span><span class="n">std</span><span class="p">()</span>
</code></pre></div></div>
<blockquote>
<p>(tensor(5.3571e-16), tensor(7.7803e-16))</p>
</blockquote>
<p>Durch den Einsatz einer <em>Xavier Initialisierung</em> reduzierten wir die Gradienten auf nahezu <code class="language-plaintext highlighter-rouge">0</code> bei 100 Layern.</p>
<p>Zufällig fanden <em>Kaiming e.a.</em> heraus, dass noch tiefere Netze (<em>30-layer Convolutional-Neural-Net</em>) in Kombination mit einer <code class="language-plaintext highlighter-rouge">ReLU</code>-Aktivierungsfunktion überhaupt nicht mehr lernten während des Trainingsprozesses. Wurden die Parameter jedoch nach den oben angeführenten Anweisungen initialisiert, konnte die Lernfähigkeit des Netzes ausgebaut werden.</p>
<p><img src="/images/2020-04-06-kaiming-initialization-neural-nets-b41d5424.webp" alt="Kaiming initialization with deep neural networks" width="500" />
<em>Konvergenz eines 30-Layer CNN mit Kaiming Initialisierung. Quelle: <a href="https://arxiv.org/pdf/1502.01852.pdf">Kaiming e.a.</a></em></p>
<h2 id="schlussfolgerung">Schlussfolgerung</h2>
<p>Aus den Überlegungen, die wir nun allesamt angestellt und mit unserem kleinen neuronalen Netz geprüft haben, können wir ableiten, dass für jedes neuronale Netz (insbesondere im Bereich <em>Computer Vision</em>), das <code class="language-plaintext highlighter-rouge">ReLU</code>-Aktivierungen (oder entsprechende wie leaky ReLUs) verwendet, die Intialisierung nach <em>Kaiming</em> auf jeden Fall erfolgverpsrechend ist und mit hoher Wahrscheinlichkeit bessere Ergebnisse liefert, als andere Methoden der Initialisierung.</p>
<p><strong>Lesen Sie auch die vorherigen Posts dieser Serie:</strong></p>
<ul>
<li><a href="/2020/04/02/Parameter-Weight-Initialiserung-Standardabweichung-Kaiming.html">Parameter Weight Initialiserung Standardabweichung Kaiming</a></li>
<li><a href="/2020/04/04/xavier-initialization-neural-nets.html">Xavier Initialization Neural Nets</a></li>
</ul>
<p><sub><em>Quelle: https://towardsdatascience.com/weight-initialization-in-neural-networks-a-journey-from-the-basics-to-kaiming-954fb9b47c79</em></sub></p>Bernhard J. Mayrb.mayr@we-make.aiNachdem wir in den letzten beiden Posts - Xavier Initialisierung) und Parameter Initialiserung die Auswirkungen verschiedener Möglichkeiten der Initialisierung der Parametermatrix in neuronalen Netzen betrachtet haben, wenden wir uns in diesem Post einer weiteren Technik zu: Kaiming Initialisierung.Xavier Initialization von neuronalen Netzen2020-04-04T00:00:00+02:002020-04-04T00:00:00+02:00kuenstliche-intelligenz-in-a-nutshell.at//2020/04/04/xavier-initialization-neural-nets<p>Die bis vor wenigen Jahren am häufigsten genutzten Aktivierungsfunktionen in neuronalen Netzen waren symmetrische Funktionen um einen fixen Punkt. Beide Enden näherten sich asymtotisch bestimmten Werten, die jeweils die gleiche fixe Distanz vom Mittelpunkt entfernt waren. Die gebräuchlichste darunter war die hyperbolische Tangens Funktion.</p>
<p><img src="/images/2020-04-04-xavier-initialization-neural-nets-3543854c.webp" alt="" width="500" />
<em>Tanh and softsign activation functions. Quelle: <a href="https://sefiks.com/2017/11/10/softsign-as-a-neural-networks-activation-function/">Serengil’s blog</a>.</em></p>
<p>Fügen wir also eine <em><code class="language-plaintext highlighter-rouge">tanh</code></em>-Aktivierungsfunktion zu jeden unserer 100 Layer hinzu und analysieren wieder, was danach während des <em>forward-pass</em> passiert.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">tang</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="n">tanh</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mf">1.</span><span class="o">/</span><span class="mi">512</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">tanh</span><span class="p">(</span><span class="n">a</span> <span class="o">@</span> <span class="n">x</span><span class="p">)</span>
<span class="n">x</span><span class="p">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">x</span><span class="p">.</span><span class="n">std</span><span class="p">()</span>
</code></pre></div></div>
<blockquote>
<p>(tensor(-0.0034, tensor(0.0613))</p>
</blockquote>
<p>Die Standardabweichung liegt nun bei etwa 0.06 - also sehr niedrig. Zumindest sind die Gradienten aber nicht vollständig verschwunden.</p>
<p>Auch wenn unsere bisherige Strategie der Initialisierung der Parameter-Matrix für unser neuronales Netz wahrscheinlich sehr einleuchtend und logisch erscheint, war das nicht <em>state-of-the-art</em> vor dem Jahr 2010.</p>
<p>Als <strong>Xavier Glorot</strong> und <strong>Yoshua Bengio</strong> das entscheidenden Paper <a href="http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf">Understanding the difficulty of training deep feedforward neural networks</a> im Jahr 2010 veröffentlichten, war die gängige Vorgehensweise der Parameterinitialisierung die Verwendung einer Normalverteilung im Wertebereich [-1,1] verbunden mit einer Skalierung von $1/\sqrt{n}$.</p>
<p>Jedoch zeigt sich, dass dieser <em>Standardprozess</em> der Initialisierung nicht besonders erfolgreich war. Wir können dies leicht mit einem kleinen Python Script nachprüfen:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">Tensor</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">).</span><span class="n">uniform_</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mf">1.</span><span class="o">/</span><span class="mi">512</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">tanh</span><span class="p">(</span><span class="n">a</span> <span class="o">@</span> <span class="n">x</span><span class="p">)</span>
<span class="n">x</span><span class="p">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">x</span><span class="p">.</span><span class="n">std</span><span class="p">()</span>
</code></pre></div></div>
<blockquote>
<p>(tensor(3.7060e-26), tensor(9,9678e-25))</p>
</blockquote>
<p>Wenn wir also unser neuronales Netz wiederum über 100 Durchgänge mit dieser Parameterinitialisierung laufen lassen, werden unsere Gradienten unendlich klein.</p>
<p>Diese extrem schwachen Ergebnisse brachten Glorot und Bengio dazu, ihre eigenen Vorstellung der Parameterinitialisierung zu formulieren. In ihrem Paper bezeichneten sie diese als <em>normalized initialization</em>. Heute wird auf diese Initialisierung als <em>Xavier initialization</em> referenziert.</p>
<p>Xavier setzt mit seiner Initialisierung die Parameterwerte eines Layers auf zufällige Werte aus einer Normalverteilung mit folgendem Intervall:</p>
<p>${+/-}{\sqrt{6}/\sqrt{n_i+n_{i+1}}}$</p>
<p>Dabei ist n<sub>i</sub> die Anzahl an eingehenden Knoten in einen Layer (<em>fan-in</em>) und n<sub>i+1</sub> die Anzahl an ausgehenden Knoten (<em>fan-out</em>).</p>
<p>Glorot und Bengio waren davon überzeugt, dass diese Initialisierung der Parameter die Varianz der einzelnen Aktivierungen und Gradienten im Zuge des Back-Propagation Prozesses über alle Layer hinweg konstant halten würde. Sie belegten dies mit einer Untersuchung eines neuronalen Netzes mit 5 Layern.</p>
<p><img src="images/2020-04-04-xavier-initialization-neural-nets-cb39ca4f.webp" alt="" width="600" />
<em>Varianz der Layer mit Xavier Initialisierung. Quelle: http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf</em></p>
<p>Im Gegensatz dazu zeigte sich, dass neuronale Netze mit einer “<em>Standard</em>“-Initialisierung viel größere Unterschiede in der Varianz der einzelnen Parameter in den ersten Layern zeigten, als in den letzten.</p>
<p><img src="images/2020-04-04-xavier-initialization-neural-nets-5cde6472.webp" alt="" width="600" />
<em>Varianz der Layer ohne Xavier Initialisierung. Quelle: http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf</em></p>
<p>Glorot und Bengio zeigten in ihren Untersuchungen, dass neuronale Netze, die nach ihren Vorgaben initialisiert wurden, deutlich schneller und mit einer größeren Genauigkeit konvergierten.</p>
<p>Wir können dies nun wieder an unserem simplen neuronalen Netz nachprüfen:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">xavier</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">h</span><span class="p">):</span>
<span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="n">Tensor</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">h</span><span class="p">).</span><span class="n">uniform_</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mf">6.</span><span class="o">/</span><span class="p">(</span><span class="n">m</span><span class="o">+</span><span class="n">h</span><span class="p">))</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">xavier</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">tanh</span><span class="p">(</span><span class="n">a</span> <span class="o">@</span> <span class="n">x</span><span class="p">)</span>
<span class="n">x</span><span class="p">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">x</span><span class="p">.</span><span class="n">std</span><span class="p">()</span>
</code></pre></div></div>
<blockquote>
<p>(tensor(0.0011), tensor(0.0831))</p>
</blockquote>
<p>Unser Beispiel liefert in etwa die gleiche Performance, wie das von uns vorher selbst abgeleitete Modell der Initialisierung der Parametermatrix, bei der wir die zufälligen Werte aus einer Normalverteilung mit $\sqrt{fan-in}$ normalisiert haben.</p>
<p><strong>Weitere Posts aus dieser Serie:</strong></p>
<ul>
<li><a href="/2020/04/02/Parameter-Weight-Initialiserung-Standardabweichung-Kaiming.html">Parameter Weight Initialiserung Standardabweichung Kaiming</a></li>
<li><a href="/2020/04/06/kaiming-initialization-neural-nets.html">Kaiming Initialization</a></li>
</ul>
<p><sub><em>Quelle: https://towardsdatascience.com/weight-initialization-in-neural-networks-a-journey-from-the-basics-to-kaiming-954fb9b47c79</em></sub></p>Bernhard J. Mayrb.mayr@we-make.aiDie bis vor wenigen Jahren am häufigsten genutzten Aktivierungsfunktionen in neuronalen Netzen waren symmetrische Funktionen um einen fixen Punkt. Beide Enden näherten sich asymtotisch bestimmten Werten, die jeweils die gleiche fixe Distanz vom Mittelpunkt entfernt waren. Die gebräuchlichste darunter war die hyperbolische Tangens Funktion.Initialisierung der Gewichte / Parameter in neuronalen Netzen2020-04-02T00:00:00+02:002020-04-02T00:00:00+02:00kuenstliche-intelligenz-in-a-nutshell.at//2020/04/02/Parameter-Weight-Initialiserung-Standardabweichung-Kaiming<p>Zu Beginn des Trainingsprozesses müssen die Parameter eines neuronalen Netzes mit Werten gefüllt werden.
Die Parameter sind ja genau das Herzstück eines neuronalen Netzes, in dem das trainierte “Wissen” gespeichert wird. Doch welche initialen Werte sollte man verwenden?</p>
<p>Die Forschung der letzten Jahre zeigte bereits, dass die</p>
<blockquote>
<p>Auswahl der Initialisierung einen wesentlichen Einfluß auf die Leistungs- und Lernfähigkeit des jeweiligen neuronalen Netzes hat.</p>
</blockquote>
<p>In diesem Artikel werden wir schrittweise verschiedene Möglichkeiten der Initialisierung besprechen. Die Implementierungen der Beispiele basieren auf den Arbeiten von <a href="https://www.usfca.edu/faculty/jeremy-howard">Jeremy Howard</a> von der UCSF.</p>
<h2 id="warum-überlegungen-zu-initialisierung-von-parametern">Warum Überlegungen zu Initialisierung von Parametern?</h2>
<p>Das primäre Ziel einer guten Initialisierung der Parameter eines neuronalen Netzes soll folgende Probleme während des Trainingsprozesses verhindern:</p>
<ul>
<li><strong>Exploding Gradients</strong>: Während der Multiplikation der Gradienten entstehen derartig große Zahlen, dass diese nicht mehr durch den entsprechenden Zahlentyp im Computer dargestellt werden.</li>
<li><strong>Vanishing Gradients</strong>: Die Gradienten erhalten sehr kleine Werte, die durch laufende Multiplikation so klein werden, dass der Zahlentyp im Computer nur mehr 0-Werte darstellen kann.</li>
</ul>
<p>Beide Probleme führen dazu, dass das neuronale Netz nur sehr langsam oder gar nicht lernt.</p>
<p>Aus den Erklärungen zu <em>explodierenden</em> bzw. <em>verschwindenden</em> Gradienten kann man bereits ableiten, dass diese Probleme umso tragender werden, je tiefer das neuronale Netz ist - sprich, je mehr Layers im Netz enthalten sind.</p>
<p>Die Berechnungen während eines Trainingsvorgangs in einem neuronalen Netz basieren im Wesentlichen auf Matrix-Multiplikationen. Ein Vorwärtsprozess (<em>forward pass</em>) in einem neuronalen Netz bedeutet eine Verkettung von Matrixmultiplikationen über die verschiedenen Layer hinweg. Die beiden beteiligten Matrizen sind die jeweiligen Parameter des Layers und die Eingangswerte des Layers. Das Ergebnis einer solchen Multiplikation wird zum Eingangswert für den nachfolgenden Layer.</p>
<h3 id="matrixmultiplikation-innerhalb-eines-neuronalen-netzes">Matrixmultiplikation innerhalb eines neuronalen Netzes</h3>
<p>Um diese Multiplikationen zu verdeutlichen, betrachten wir folgendes Beispiel. Unser Eingangswert ist ein Vektor <code class="language-plaintext highlighter-rouge">X</code>. Das Standardvorgehen beim Training von neuronalen Netzen ist die Normalisierung der Eingangswerte auf eine Normalverteilung mit einem Mittelwert von 0 und einer Standardabweichung von 1.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</code></pre></div></div>
<p>Weiter wollen wir annehmen, dass wir ein einfachen neuronales Netz ohne Aktivierungen mit 100 Layer bauen. Jeder Layer in unserem Netz hat also eine Matrix <code class="language-plaintext highlighter-rouge">a</code>, welche die Parameterwerte für den jeweiligen Layer beinhaltet.</p>
<p>Wenn wir nun einen <em>forward-pass</em> in unserem Netz simulieren wollen, müssen wir für jeden Layer die Eingangswerte, mit der jeweiligen Parameter-Matrix multiplizieren. Dies machen wir für alle 100 Layer unseres Netzes:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">a</span> <span class="o">@</span> <span class="n">x</span>
</code></pre></div></div>
<p>Geben wir nach der Berechnung die den Mittelwert und die Standardabweichung von <code class="language-plaintext highlighter-rouge">x</code> aus:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">x</span><span class="p">.</span><span class="n">std</span><span class="p">())</span>
</code></pre></div></div>
<p>So würden wir folgendes Ergebnis erhalten:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(tensor(nan), tensor(nan))
</code></pre></div></div>
<p>Das bedeutet, dass die Werte für die Parameter innerhalb des neuronalen Netzes so hoch geworden sind, dass auch der Computer nicht mehr in der Lage war, die Standardabweichung und den Mittelwert als Zahlenwerte zu interpretieren.</p>
<p>Wir können nun prüfen ab welchem Layer die konkreten Werte über den Zahlenbereich des Computers hinausgeschossen sind (also “<em>explodiert</em>” sind).</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">a</span> <span class="o">@</span> <span class="n">x</span>
<span class="k">if</span> <span class="n">torch</span><span class="p">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">std</span><span class="p">()):</span> <span class="k">break</span>
<span class="k">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div></div>
<p>Wir erhalten <code class="language-plaintext highlighter-rouge">28</code> als Ausgabe. Das heißt, bereits nach nicht einmal einem Drittel aller Layer konnte der Mittelwert bzw. die Standardabweichung nicht mehr bestimmt werden.</p>
<blockquote>
<p><strong>Offensichtlich haben wir unsere Parameter also mit zu hohen Werten initialisiert!</strong></p>
</blockquote>
<p>Unser neuronales Netz kann also aufgrund der zu hohen initialen Werte der Parameter nicht lernen.</p>
<h2 id="wie-finden-wir-die-optimale-initialisierung-der-parameter-in-einem-neuronalen-netz">Wie finden wir die optimale Initialisierung der Parameter in einem neuronalen Netz?</h2>
<p>Die Berechnungen, die während des <em>forward-pass</em> durch unser Netzwerk durchgführt werden, sind reine Matrix-Multiplikationen. Das heißt, auf jedem Layer ist das Ergebnis <code class="language-plaintext highlighter-rouge">y</code> nur das Produkt aus Eingangswerten und Parametermatrix. Diese Multikationen werden über alle Layer hinweg durchgeführt. Somit ergibt sich am Ende für jedes einzelne Element <em><code class="language-plaintext highlighter-rouge">i</code></em> aus <code class="language-plaintext highlighter-rouge">y</code> folgende Formel:</p>
<blockquote>
<p>$y_i=\sum_{k=0}^{n-1}a_{ik}x_k$</p>
</blockquote>
<p>…wobei <code class="language-plaintext highlighter-rouge">_i_</code> der Zeilenindex der Parametermatrix <code class="language-plaintext highlighter-rouge">a</code> ist und <em>k</em> der Spaltenindex in der Parametermatrix und der Elementindex im Ergebnisvektor <code class="language-plaintext highlighter-rouge">y</code>. Die Variable <code class="language-plaintext highlighter-rouge">n</code> ist die Gesamtanzahl von Elementen in der Eingangsmatrix <code class="language-plaintext highlighter-rouge">X</code>.</p>
<p>Die mathematische Formulierung können wir so als Python Code schreiben:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">([</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span><span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">x</span><span class="p">)])</span>
</code></pre></div></div>
<p>Nun können wir auch zeigen, dass für einen bestimmten Layer, das Matrizzenprodukt aus der Eingangsmatrix <code class="language-plaintext highlighter-rouge">X</code> und der Parametermatrix <code class="language-plaintext highlighter-rouge">a</code> die Standardabweichung im Mittel rund um einen Wert von $\sqrt{512}$ hat. Die <code class="language-plaintext highlighter-rouge">512</code> sind in unserem Fall die Anzahl der Eingangswerte in unser neuronales Netz. Verallgemeinert können wir also sagen, dass die mittlere Standardabweichung über alle Layer hinweg im Bereich von $\sqrt{n}$ liegt - wobei <code class="language-plaintext highlighter-rouge">n</code> die Anzahl von Eingangswerten in den ersten Layer darstellt.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mean</span><span class="p">,</span> <span class="n">var</span> <span class="o">=</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10000</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">a</span> <span class="o">@</span> <span class="n">x</span>
<span class="n">mean</span> <span class="o">+=</span> <span class="n">y</span><span class="p">.</span><span class="n">mean</span><span class="p">().</span><span class="n">item</span><span class="p">()</span>
<span class="n">var</span> <span class="o">+=</span> <span class="n">y</span><span class="p">.</span><span class="nb">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">).</span><span class="n">mean</span><span class="p">().</span><span class="n">item</span><span class="p">()</span>
<span class="n">mean</span><span class="o">/</span><span class="mi">10000</span><span class="p">,</span> <span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">var</span><span class="o">/</span><span class="mi">10000</span><span class="p">)</span>
</code></pre></div></div>
<p>Ausgabe:</p>
<blockquote>
<p>0.00889449315816164, 22.629779825053976</p>
</blockquote>
<p>Betrachten wir nun zum Vergleich $\sqrt{512}$:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</code></pre></div></div>
<p>Ausgabe:</p>
<blockquote>
<p>22.627416997969522</p>
</blockquote>
<p>Dieses Ergebnis ist nicht weiter verwunderlich. Denn im Zuge der Matrixmultiplikation add wir 512 Produkt der elementweisen Multplikation eines Elements der Eingangsmatrix <code class="language-plaintext highlighter-rouge">X</code> mit einer Spalte aus der Parametermatrix <code class="language-plaintext highlighter-rouge">a</code>. In unserem Beispiel haben wir sowohl <code class="language-plaintext highlighter-rouge">X</code>, wie auch <code class="language-plaintext highlighter-rouge">a</code> mit Werten aus einer Normalverteilung befüllt. Jedes dieser 512 Produkte hat einen Mittelwert von <code class="language-plaintext highlighter-rouge">0</code> und eine Standardabweichung von <code class="language-plaintext highlighter-rouge">1</code>.</p>
<p>Daher muss auch die Summe dieser 512 Produkte einen Mittelwert von <code class="language-plaintext highlighter-rouge">0</code> und deshalb eine Standardabweichung von $\sqrt{512}$ haben.</p>
<blockquote>
<p>Genau aus diesem Grund haben wir bei unserem vorigen Beispiel ein “Explodieren” der Gradienten bereits nach 28 Multiplikationen feststellen können.</p>
</blockquote>
<p>In unserem einfachen neuronalen Netz mit 100 Layern möchten wir eine Standardabweichung von <code class="language-plaintext highlighter-rouge">1</code> für jeden einzelnen Layer. Auf diese Weise könnten wir beliebig viele Matrixmultiplikationen aneinander ketten, ohne dass die Gradienten Gefahr laufen zu <em>explodieren</em> oder zu <em>verschwinden</em>. Wir könnten auf diese Weise also die Gefahren der <em>exploding</em> bzw. <em>vanishing</em> gradients abweisen.</p>
<p>Wenn wir also zu Beginn jeden zufälligen Wert in unserer Parametermatrix <code class="language-plaintext highlighter-rouge">a</code> durch $\sqrt{512}$ dividieren, bedeutet dies in Folge, dass die elementweise Multiplikation, die jeweils ein Element in unseren Ergebnisvektor <code class="language-plaintext highlighter-rouge">y</code> liefert, im Mittel eine Varianz von $1/\sqrt{n}$ aufweist.</p>
<p>Wir können dies wieder mit einem kleinen Python-Script testen:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mean</span><span class="p">,</span> <span class="n">var</span> <span class="o">=</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10000</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">,</span><span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mf">1.</span><span class="o">/</span><span class="mi">512</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">a</span><span class="o">*</span><span class="n">x</span>
<span class="n">mean</span> <span class="o">+=</span> <span class="n">y</span><span class="p">.</span><span class="n">item</span><span class="p">()</span>
<span class="n">var</span> <span class="o">+=</span> <span class="n">y</span><span class="p">.</span><span class="nb">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">).</span><span class="n">item</span><span class="p">()</span>
<span class="n">mean</span><span class="o">/</span><span class="mi">10000</span><span class="p">,</span> <span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">var</span><span class="o">/</span><span class="mi">10000</span><span class="p">)</span>
</code></pre></div></div>
<blockquote>
<p>(-2.091224115950183e-05, 0.0020251519136443882)</p>
</blockquote>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">1</span><span class="o">/</span><span class="mi">512</span>
</code></pre></div></div>
<blockquote>
<p>0.001953125</p>
</blockquote>
<p>Die Standardabweichung unseres Ergebnisvektors <code class="language-plaintext highlighter-rouge">y</code>, der durch die Matrixmultiplikationen berechnet wurde, ist somit genau <code class="language-plaintext highlighter-rouge">1</code>. Auch das testen wir wieder mit einem kleinen Script:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mean</span><span class="p">,</span> <span class="n">var</span> <span class="o">=</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10000</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span><span class="o">*</span><span class="p">,</span><span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mf">1.</span><span class="o">/</span><span class="mi">512</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">a</span> <span class="o">@</span> <span class="n">x</span>
<span class="n">mean</span> <span class="o">+=</span> <span class="n">y</span><span class="p">.</span><span class="n">mean</span><span class="p">().</span><span class="n">item</span><span class="p">()</span>
<span class="n">var</span> <span class="o">+=</span> <span class="n">y</span><span class="p">.</span><span class="nb">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">).</span><span class="n">mean</span><span class="p">().</span><span class="n">item</span><span class="p">()</span>
<span class="n">mean</span><span class="o">/</span><span class="mi">10000</span><span class="p">,</span> <span class="n">math</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">var</span><span class="o">/</span><span class="mi">10000</span><span class="p">)</span>
</code></pre></div></div>
<blockquote>
<p>(0.0005563282515970058, 1.0004933748755085)</p>
</blockquote>
<p>Nun können wir mit diesem Wissen unser ursprüngliches neuronales Netz mit 100 Layern erneut berechnen:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">512</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">a</span> <span class="o">@</span> <span class="n">x</span>
<span class="n">x</span><span class="p">.</span><span class="n">mean</span><span class="p">(),</span> <span class="n">x</span><span class="p">.</span><span class="n">std</span><span class="p">()</span>
</code></pre></div></div>
<blockquote>
<p>(tensor(0.0358), tensor(1.0825))</p>
</blockquote>
<p>Und tatsächlich, keine <em>vanishing</em> oder <em>exploding</em> gradients mehr - auch nach unseren 100 Layern nicht.</p>
<blockquote>
<p>Doch sind wir noch nicht ganz am Ziel. Wir haben aus Gründen der Einfachheit die Aktivierungsfunktionen der Layer außer Acht gelassen! Ein neuronales Netz ohne Aktivierungsfunktionen würden wir jedoch in der Praxis nicht einsetzen. Erst durch den Einsatz, dieser nicht-linearen, Funktionen können tiefe neuronale Netze jene Erfolge liefern, die wir in der jüngeren Vergangenheit gesehen haben.</p>
</blockquote>
<p><strong>Weitere Posts aus dieser Serie:</strong></p>
<ul>
<li><a href="/2020/04/04/xavier-initialization-neural-nets.html">Xavier Initialization Neural Nets</a></li>
<li><a href="/2020/04/06/kaiming-initialization-neural-nets.html">Kaiming Initialization</a></li>
</ul>
<p><sub><em>Quelle: https://towardsdatascience.com/weight-initialization-in-neural-networks-a-journey-from-the-basics-to-kaiming-954fb9b47c79</em></sub></p>Bernhard J. Mayrb.mayr@we-make.aiZu Beginn des Trainingsprozesses müssen die Parameter eines neuronalen Netzes mit Werten gefüllt werden. Die Parameter sind ja genau das Herzstück eines neuronalen Netzes, in dem das trainierte “Wissen” gespeichert wird. Doch welche initialen Werte sollte man verwenden?Einführung in das Thema Self-Supervised Learning2020-03-14T00:00:00+01:002020-03-14T00:00:00+01:00kuenstliche-intelligenz-in-a-nutshell.at//2020/03/14/Self-Supervised-Learning-Computer-Vis<p>Egal in welchem Kontext. Wenn wir neuronale Netze verwenden, sollten wir imm von vortrainierten Netzen ausgehen und das Konzept von <em>Transfer-Learning</em> nutzen, anstatt mit zufälligen Werten für die Parameter bzw. Gewichte im Netz zu beginnen. Durch den Einsatz von vortrainierten Netzen kommen wir etwa mit einem 1/1000 der Anzahl an erforderlichen Trainingsdatensätzen aus.</p>
<p>Aber was mache ich, wenn es in meiner spezifischen fachlichen Domäne keine oder nur sehr wenige vortrainierte Modell gibt? So stellt das Feld der medizinischen Bilddaten zwar ein großes Anwendungsgebiet für Computer Vision Projekte dar, gleichzeitig gibt es aber bislang nur sehr wenige vortrainierte Modelle. In einem kürzlich erschienenen Paper - <a href="https://arxiv.org/abs/1902.07208">Transfusion: Understanding Transfer Learning for Medical Imaging</a> - gingen die Autoren dieser Frage nach und kamen zu dem Ergebnis, dass bereits die Verwendung von einigen der untersten Layers eines vortrainierten ImageNet-Models die Trainingsgeschwindigkeit wie auch die spätere Genauigkeit des eigenen Modells massiv positiv beeinflussen können. Dennoch ist die finale Auswirkung im medizinischen Bereich nicht herausragend.</p>
<p>Aus diesem Grund benötigen wir ein alternatives Konzept, das besser funktioniert, ohne Unmengen an Trainingsdaten zu benötigen. Diese Möglichkeit bietet uns <em><strong>Self-Supervised-Learning</strong></em>.</p>
<p>Die grundlegenden Ideen dazu fasste Jürgen Schmidhuber in dem Paper <a href="http://people.idsia.ch/~juergen/FKI-126-90_%28revised%29bw_ocr.pdf">Making the World Differentiable</a> bereits im Jahr 1989 zusammen. Auch das Paper <a href="http://papers.nips.cc/paper/831-learning-classification-with-unlabeled-data.pdf">Learning Classification with Unlabeled Data</a> stellte einen ähnlichen Ansatz 1994 vor. Die Autoren verwendeten die Labels einer Quelle von Daten gleichzeitig für eine andere. Beispielsweise Audio- und Videodaten: Hört man in den Audiodaten “<em>Muuh</em>“-Laute können diese für Bilddaten, auf denen Kühe zu sehen sind, als Labels verwendet werden.</p>
<p><strong>Self-Supervised-Learning</strong> bildet auch das Herzstück von ULMFiT<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote">1</a></sup> - ein Ansatz aus dem Bereich <em>Natural-Language-Processing</em>. Auch dieses Modell steigerte den state-of-the-art auf neue Höhen. Im ULMFiT Ansatz wird zuerst ein allgemeines <em>Sprachmodell</em> trainiert. Dieses Modell ist in der Lage in einem Text das folgende Wort vorherzusagen. Dieses Modell lernt Strukturen der jeweiligen Sprache zu erfassen und eignet sich daher ausgesprochen gut, mittels <em>Transfer-Learning</em> für andere Aufgaben aus dem NLU (<em>Natural-Language-Understanding</em>) trainiert zu werden.</p>
<h1 id="self-supervised-learning-im-bereich-computer-vision">Self-Supervised-Learning im Bereich <em>Computer-Vision</em></h1>
<p>Die erste Aufgabenstellung bei <em>Self-Supervised-Learning</em> wird als <em>pretext task</em> bezeichnet. Jene Schritte, die wir dann im Zuge von Finetuning setzen werden als <em>downstream tasks</em> bezeichnet. Auch wenn heute <em>Self-Supervised-Learning</em> im Bereich NLU als <em>Standard</em> verwendet wird, findet sich die Umsetzung im Bereich Computer Vision noch kaum. Möglicherweise trägt die Verbreitung der Verwendung von vortrainierten <em>ImageNet</em> Modellen dazu bei. Dennoch möchte ich in diesem Blog-Artikel die Verwendung von <em>Self-Supervised-Learning</em> im Bereich Computer Vision vorstellen und damit mehr Anwender motivieren, diese Möglichkeit für ihre eigenen Modelle anzuwenden und zu testen.</p>
<p>Die wichtigste Frage, die in Zusammenhang mit <em>Self-Supervised-Learning</em> im Computer-Vision Bereich beantwortet werden muss, lautet: “Welche Art von <em>pretex-Aufgaben</em> sollte ich einsetzen?”. Natürlich gibt es eine Vielzahl an Möglichkeiten, aus denen man die gewünschte auswählen kann. Ich werde im Folgenden einige der Möglichkeiten exemplarisch aufzeigen und die Papers zitieren, aus denen sie stammen.</p>
<h2 id="colorization">Colorization</h2>
<p>Durch die Verwendung von verschiedenen Farbschemen können zusätzliche Trainingsdaten erstellt werden.</p>
<p><img src="/images/2020-03-14-Self-Supervised-Learning-Computer-Vision-046bb3d1.webp" alt="colorization pretex sample" width="600" /></p>
<p>Quellen:</p>
<ul>
<li>https://arxiv.org/abs/1603.08511</li>
<li>https://arxiv.org/abs/1603.06668</li>
<li>https://arxiv.org/abs/1806.09594</li>
</ul>
<h2 id="teilbilder-richtig-im-gesamtkontext-plazieren">Teilbilder richtig im Gesamtkontext plazieren</h2>
<p>Einzelne Teilausschnitte eines Bildes werden im Gesamtkontext an der richtigen Position plaziert.</p>
<p><img src="/images/2020-03-14-Self-Supervised-Learning-Computer-Vision-65582e2b.webp" alt="Teilbilder richtig im Gesamtkontext plazieren" width="600" /></p>
<p>Quellen:</p>
<ul>
<li>https://arxiv.org/abs/1603.09246</li>
<li>https://arxiv.org/abs/1505.05192</li>
</ul>
<h2 id="bilder-in-der-richtigen-reihenfolge-sortieren">Bilder in der richtigen Reihenfolge sortieren</h2>
<p>Eine Sequenz von Bildern wird in zufälliger Reihenfolge dargestellt und anschließend sortiert.</p>
<p><img src="/images/2020-03-14-Self-Supervised-Learning-Computer-Vision-7555cdf5.webp" alt="Bilder in der richtigen Reihenfolge sortieren" width="600" /></p>
<p>Quellen:</p>
<ul>
<li>https://arxiv.org/abs/1708.01246</li>
<li>https://arxiv.org/abs/1603.08561</li>
</ul>
<h2 id="inpainting">Inpainting</h2>
<p>Ein Bildausschnitt wird aus dem Bild entfernt und anschließend durch das neuronale Netz neu berechnet.</p>
<p><img src="/images/2020-03-14-Self-Supervised-Learning-Computer-Vision-a5508cd3.webp" alt="Inpainting" width="600" /></p>
<p>Quelle:</p>
<ul>
<li>https://arxiv.org/abs/1604.07379</li>
</ul>
<h2 id="bildrestauration">Bildrestauration</h2>
<p>Die grünen Bilder in diesem Beispiel stellen korrekte Bilder dar, während die roten Bilder mit (künstlichen) Defekten darstellen. Ein zu einfaches Schema, wie die Bilder korrumpiert werden, könnte allerdings einen zu einfachen <em>pre-text-task</em> darstellen und würde somit auch keine weiteren nützlichen Features generieren. Der Ansatz im zitierten Paper verwendet einen einfallsreichen Modus für die Korrumpierung der Bilder, welcher an den Features vom Autoencoder des neuronalen Netzes ansetzt und danach versucht, diese wiederherzustellen.</p>
<p><img src="/images/2020-03-14-Self-Supervised-Learning-Computer-Vision-dffc2481.webp" alt="Bildrestauration" width="600" /></p>
<h1 id="den-richtigen-pretext-task-auswählen">Den richtigen <em>pretext-task</em> auswählen</h1>
<p>Der Task, den wir für unseren Anwendungsfall auswählen, sollte einer sein, der ein Verständnis über die zugrundliegenden Daten verlangt, welches auch für die Durchführung der nachgelagerten Daten-Pipeline erforderlich ist.</p>
<p>Oftmals wurden für diesen Zweck <em>Autoencoder</em> verwendet. Ein derartiger <em>Autoencoder</em> verwandelt ein übergebenes Bild in eine stark vereinfachte Form (mithilfe eines <em>bottelneck-layers</em>) und konvertiert dieses danach in ein neues Bild, das dem Original so ähnlich wie möglich sehen sollte. Der tatsächliche <em>pretext-task</em> in diesem Fall ist also eine Form von Kompression des Bildes. So muss dieser Task nicht nur das Originalbild herstellen können, sondern auch ein etwaiges Rauschen im Originalbild. Wenn also der tatsächliche Einsatzzweck des KI-Systems die Qualitätsverbesserung von Bildern ist, so wäre dieser <em>pretext-task</em> eine eher schlechte Wahl.</p>
<p>Jeder <em>pretext-task</em> sollte auch von einem Menschen leicht durchführbar sein. So könnte ein <em>pretext-task</em> etwa die Erstellung des nächsten Frames eines Videos sein. Sollte der Frame, den wir erstellen wollen, jedoch zu weit in der Zukunft liegen, könnte dieser zukünftige Frame zu einer ganz anderen Szene gehören. Dadurch wäre es beinahe unmöglich, diesen im Vorfeld zu konstruieren.</p>
<h1 id="feinadjustierung-des-modells">Feinadjustierung des Modells</h1>
<p>Nachdem wir unser Modell mithilfe der <em>pretext-tasks</em> vortrainiert haben, können wir uns an die Feinabstimmung unsers Modells begeben. Ab diesem Zeitpunkt stellt die Aufgabe eine Instanz von <em>Transfer-Learning</em> dar, weshalb wir jedes weitere Training mit Vorsicht durchführen sollten, um nicht die bereits vortrainierten Parameter unseres Modells zu stören. Techniken dazu sind etwa: <em>gradual unfreezing</em>, <em>discriminate learning rates</em> und <em>one-cycle-training</em>. Mehr Informationen über die Theorie hinter diesen Techniken finden sich im Paper zu ULMFiT<sup id="fnref:1:1" role="doc-noteref"><a href="#fn:1" class="footnote">1</a></sup>.</p>
<p>Generell wird man die besten Erfahrungen machen, nicht allzuviel Ressourcen auf die Entwicklung des bestmöglichen vortrainierten Modells zu verwenden, sondern ein Modell zu bauen, das vernüftige und schnelle Ergebnisse liefert. Danach kann man prüfen, ob das Modell für den geplanten Einsatzzweck ausreichend gut ist.</p>
<p>Natürlich können auch mehrere Runden zwischen Pretraining und regulärem Training gedreht werden. Beispielsweise verwendet man ein der oben zitierten Techniken für das pretraining, danach Segmentation für zusätzliches Pretraining und danach das reguläre Training des Modells.</p>
<p>Gernerell gilt auch hier: versuche stets mit der einfachsten Methode zu beginnen und steigere erst sukzessive die Komplexität, wenn das aktuelle Modell nicht ausreicht.</p>
<h1 id="consistency-loss--noise-constractive-estimation">Consistency Loss / Noise Constractive Estimation</h1>
<p>Die beiden Terme <em>Consistency Loss</em> bzw. <em>Noise Constractive Estimation</em> bezeichnen eine Möglichkeit, die man zusätzlich zu self-supervised training im Bereich Computer Vision anwenden kann.</p>
<p>Die Basisidee hinter Consistency Loss (bzw. Noise Constractive Estimation) kann folgendermaßen umschrieben werden: Der pretext-task verursacht in irgendeinerweise ein verstärktes Maß an Chaos in den Rohdaten (wie Drehung, Verschieben, Verändern der Reihenfolge, etc.). In jedem Fall hoffen wir aber, dass die Originaldaten und die veränderten Daten zur gleichen Vorhersage führen. So generieren wir die gleichen Features in den verschiedenen Repräsentationsstadien innerhalb des Netzes. Weiters hoffen wir, dass auch zwei gleiche Rohdaten, die auf unterschiedliche Weise verändert wurden, zur gleichen Vorhersage führen.</p>
<p>Aus diesem Grund fügen wir unserer <em>Loss-Function</em> ein Element hinzu, das unterschiedliche Prognosen von gleichen Rohdaten entsprechend “bestraft”. Die schematische Abbildung dazu habe ich aus einem Posting von Google entnommen<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote">2</a></sup>:</p>
<p><img src="/images/2020-03-14-Self-Supervised-Learning-Computer-Vision-7032e569.webp" alt="" width="600" /></p>
<p>Durch diesen Ansatz kann die erforderliche Menge an Trainingsdaten um den Faktor 1000 reduziert werden. Die Transformation dieser Idee vom Bereich NLU auf den Bereich Computer Vision zeigt Facebook in diesen beiden Papers:</p>
<ul>
<li><a href="https://arxiv.org/abs/1912.01991">Self-Supervised Learning of Pretext-Invariant Representations</a></li>
<li><a href="https://arxiv.org/abs/1911.05722">Momentum Contrast for Unsupervised Visual Representation Learning</a></li>
</ul>
<p>Aus diesem Erfahrungen heraus kann man sagen, dass es auf jeden Fall einen Versuch wert ist, einen <em>Consistency Loss Layer</em> dem eigenen Modell hinzuzufügen.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>https://arxiv.org/abs/1801.06146 <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a> <a href="#fnref:1:1" class="reversefootnote" role="doc-backlink">↩<sup>2</sup></a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>https://ai.googleblog.com/2019/07/advancing-semi-supervised-learning-with.html <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>Bernhard J. Mayrb.mayr@we-make.aiEgal in welchem Kontext. Wenn wir neuronale Netze verwenden, sollten wir imm von vortrainierten Netzen ausgehen und das Konzept von Transfer-Learning nutzen, anstatt mit zufälligen Werten für die Parameter bzw. Gewichte im Netz zu beginnen. Durch den Einsatz von vortrainierten Netzen kommen wir etwa mit einem 1/1000 der Anzahl an erforderlichen Trainingsdatensätzen aus.Wie baue ich gute Trainings-, Validation- und Testsets für meine Machine Learning Modelle auf?2020-03-10T00:00:00+01:002020-03-10T00:00:00+01:00kuenstliche-intelligenz-in-a-nutshell.at//2020/03/10/Trainingset-Validationset-Testset<p>Zum Trainieren von Machine Learning Modellen benötigen wir Trainingsdaten - egal, um welche Architektur von Modellen es sich handelt. Doch wie baue ich diese Datensets am besten auf? Und wozu verwende ich Trainingsdaten, Validierungsdaten und Testdaten?</p>
<h2 id="warum-benötige-ich-mehrere-datensets-für-das-training">Warum benötige ich mehrere Datensets für das Training?</h2>
<p>Stellen wir uns folgenden Fall vor: Wir möchten ein Modell bauen, dass unterscheiden kann, ob auf einem Bild eine Katze oder ein Hund abgebildet ist. Dafür haben wir 500 Bilder von Katzen und 500 Bilder von Hunden. Nun könnten wir alle 1000 Bilder in unser Trainingsset aufnehmen und unser Modell anhand dieser 1000 Bilder lernen lassen. Soweit so gut.</p>
<p><em>Doch wie messen wir den Erfolg unseres Modells?</em></p>
<p>Wir könnten jetzt wahlweise einzelne Fotos aus den Trainingsdaten verwenden und diese durch unser Modell durchschicken. Wir erhalten eine Prognose und können diese Prognose des Modells mit den tatsächlichen Werten (<em>ground truth</em>) vergleichen. So könnten wir feststellen, in wievielen Fällen unser Modell richtig gelegen ist und in wievielen wir eine falsche Prognose erhalten haben.</p>
<p>Was wir dabei aber nicht berücksichtigt haben, die Bilder aus diesem <em>“Test-Set”</em> hat unser Modell schon während des Trainings gesehen. Wir können also nicht mit letztgültiger Sicherheit sagen, wie das Modell auf vollständig unbekannte Bilder reagieren würde.</p>
<p>Und wie bewerten wir den Trainingserfolg während des Trainings?</p>
<p>Rufen wir uns nochmals den Prozess des Trainierens eines Machinelearning Modells hervor. Unser Modell bekommt <em>Inputs</em> gemeinsam mit den <em>Parametern</em> (bzw. <em>Weights</em>) und errechnet daraus seine Ergebnisse bzw. Prognosen. Nun muss das Modell jedoch evaluieren, wie gut diese Prognosen waren, um im nächsten Schrtt die Parameter anpassen zu können.</p>
<p><img src="/images/2020-03-10-Trainingset-Validationset-Testset-712b1b1f.webp" alt="Trainingsprozess eine neuronalen Netzes" width="500" /></p>
<p>Dafür benötigen wir nun auch wieder ein <em>“Test-Datenset”</em>, auf das wir nach einem Trainingsdurchlauf zugreifen können. Auch hierfür wollen wir Daten verwenden, die das Modell während des Trainings noch nicht gesehen hat.</p>
<p>Diese Inputs aus dem Validationset dürfen jedoch nach Abschluss des Trainings nicht im Testset auftauchen. Denn nur so kann mit dem Testset tatsächlich unabhängig die Performance des Modell geprüft werden.</p>
<h2 id="training---validationsplit">Training- / Validationsplit</h2>
<p>Um also stabile Modelle bauen zu können, teilen wir die Daten zumindest in ein Trainingsset und ein Validierungsset (Training-/ Validationsplit). Das Verhältnis von Trainings- zu Validationdaten wird in der Literatur in der Regel mit 80 zu 20 Prozent angegeben - muss jedoch an das individuelle Modell und die vorhandenen Daten angepasst werden.</p>
<p>Durch die Verwendung von eigenen Trainings- und Validationdatensets können wir vermeiden, dass unser Modell die Trainingsdaten “auswendig” lernt und so reine Zuordnung memorisiert (z.B. “<em>das dritte Bild ist eine Katze</em>”), ohne tatsächlich die Merkmale von Hunden oder Katzen zu lernen. Wir können dies mit dem Lernen von Vokabeln vergleichen. Lernen wir die Vokabel immer in der gleichen Reihenfolge, so werden wir diese nach kurzer Zeit gut aufzählen können, sollen wir jedoch eine Übersetzung wiedergeben, fällt diese Aufgabenstellung umso schwerer.</p>
<h2 id="das-testdatenset">Das Testdatenset</h2>
<p>Nun können wir noch zusätzlich (ca. 10% der Daten) als optionales Testdatenset vorhalten. Nachdem der Trainingsprozess unseres Modells abgeschlossen ist, können wir mit dem Testdatenset feststellen, wie gut unser Modell auf Daten reagiert, die es noch nie gesehen hat.</p>
<p>Doch nicht nur bei der Entwicklung von eigenen Modellen für künstliche Intelligenz kann ein Testdatenset wertvoll sein. Auch wenn externe Dienstleister mit der Entwicklung von Machine Learning Modellen beauftragt werden, kann ich anhand der zurückgehaltenen Testdaten die Performance des eingekauften Modells völlig unabhängig testen.</p>
<h2 id="auswahl-von-validation--bzw-testdatensets">Auswahl von Validation- bzw. Testdatensets</h2>
<p>Wie wähle ich nun jene Datensätze aus meiner Gesamtmenge aus, die in das Datenset für die Validierung bzw. die Tests meine Machinelearning Modells fließen?</p>
<p>Dies hängt stark von den Ausgangsdaten ab. Allgemein werde ich immer eine randomisierte Auswahl treffen. Doch ist das Zufallsprinzip nicht in allen Situationen vorteilhaft. Insbesondere bei Zeitreihendaten kann eine zufällige Auswahl der Validierungsdaten nicht das gewünschte Ergebnis bringen.</p>
<p>Sehen wir uns etwas folgende Daten einer fiktiven Umsatzprognose an:</p>
<p><img src="/images/2020-03-10-Trainingset-Validationset-Testset-0174041a.webp" alt="Zeitreihendaten Umsatzprognose" width="500" /></p>
<p>Wählen wir nun zufällige Datensätze für unser Testset aus, so könnte die Auswahl z.B. so aussehen:</p>
<p><img src="/images/2020-03-10-Trainingset-Validationset-Testset-92f20cc7.webp" alt="Zeitreihendaten Auswahl zufälliger Testdaten" width="500" /></p>
<p>Diese zufällige Auswahl ist bei Zeitreihendaten ausgesprochen ungünstig, da wir ja ein Modell brauchen, das die Daten für die Zukunft vorhersagt und nicht den Umsatz vom letzten Jahr prognostiziert. Aus diesem Grund sollten wir bei zeitlich voneinander abhängigen Daten immer die aktuellsten 10% Prozent der Daten in das Testset aufnehmen.</p>
<p>Unsere Umsatzdaten könnten dann nach dem Training-Test-Split etwa so aussehen:</p>
<p><img src="/images/2020-03-10-Trainingset-Validationset-Testset-72b2dc5a.webp" alt="Split in Trainings- und Testdaten bei Zeitreihendaten" width="500" /></p>Bernhard J. Mayrb.mayr@we-make.aiZum Trainieren von Machine Learning Modellen benötigen wir Trainingsdaten - egal, um welche Architektur von Modellen es sich handelt. Doch wie baue ich diese Datensets am besten auf? Und wozu verwende ich Trainingsdaten, Validierungsdaten und Testdaten?Erfolgreich Modelle künstlicher Intelligenz in der Praxis einsetzen.2020-03-10T00:00:00+01:002020-03-10T00:00:00+01:00kuenstliche-intelligenz-in-a-nutshell.at//2020/03/10/Machine-Learning-erfolgreich-einsetze<p>Meist sind die KI-Experten auf die Datenaufbereitung und die Entwicklung von Modellen konzentriert. Doch dies ist in der Regel nur ein kleiner Teil des gesamten Ökosystems in dem das Machine Learning Modell dann später eingesetzt werden soll. Jedes datengetriebene Produkt verlangt, den gesamten Prozess, in dem das Modell genutzt wird, von Anfang bis zum Ende zu durchdenken.</p>
<p>Dieser Blogpost behandelt nicht alle Themen, die damit in Zusammenhang stehen (wie die Verwaltung verschiedener Versionen von Modellen, A/B Tests, Refreshing der Datensamples, etc.). Wer mehr zu diesen Kernthemen lesen möchte, sei an dieser Stelle auf das Buch <a href="https://amzn.to/2R6q2CY">Building Machine Learning Powered Applications</a> von Emmanuel Ameisen verwiesen.</p>
<h2 id="testen-und-verstehen-von-machinelearning-modellen">Testen und Verstehen von MachineLearning Modellen</h2>
<p>Der zentrale Punkt ist, dass das Testen und Verstehen von Modellen, die im Zuge künstlicher Intelligenz eingesetzt werden, viel schwieriger und aufwändiger ist, als bei klassischem Programmcode. Bei einem klassischen Computerprogramm kann der Quellcode Schritt für Schritt nachvollzogen werden. Das Programm ist deterministisch und muss für die gleichen Inputs immer auch die gleichen Outputs liefern. Dies unterscheidet ein ML-Modell drastisch. Denn bei einem neuronalen Netz entsteht das Verhalten des Systems aus dem Versuch, sich den Trainingsdaten anzupassen. Und darin liegt die größte Schwierigkeit beim Testen und Verstehen.</p>
<blockquote>
<p>So kann das Ausrollen eines Modells zum Desaster führen!</p>
</blockquote>
<h2 id="dem-deployment-desaster-vorbeugen">Dem Deployment-Desaster vorbeugen</h2>
<p>Nehmen wir folgendes Beispiel an: <em>Wir möchten ein System entwickeln, das autonom Bären erkennt und Camper warnen kann.</em></p>
<p>Wie gehen wir hinsichtlich der Umsetzung vor:</p>
<ol>
<li>Wir generieren ein Datenset mit Trainingsdaten. Also Fotos von Bären und entsprechende Labels, um welche Bären es sich handelt. Dazu laden wir eine große Anzahl entsprechender Fotos aus dem Internet.</li>
</ol>
<h3 id="probleme-mit-unseren-trainingsdaten-für-das-machinelearning-modell">Probleme mit unseren Trainingsdaten für das Machinelearning Modell</h3>
<p>Aber welche Probleme hinsichtlich des späteren Einsatzzwecks können durch unsere Trainingsdaten entstehen?</p>
<p>Unser Produktivsystem muss:</p>
<ul>
<li>mit Video und nicht nur Bilddaten arbeiten (können)</li>
<li>auch in der Nach korrekt funktionieren (sind Nachtfotos in unseren Trainingsdaten enthalten?)</li>
<li>möglicherweise Bilder in schlechter Auflösung korrekt verarbeiten</li>
<li>sicherstellen, dass die Klassifizierung der Bilder schnell genug errechnet wird</li>
<li>Bären in unterschiedlichesten Positionen (auch hinter Büschen und Bäumen) erkennen können</li>
</ul>
<p>Es kommt also bereits bei den Trainingsdaten darauf an, solche Daten zu nutzen, die dem späteren Einsatzgebiet gleichen. Wenn wir Bärenfotos aus dem Internet verwenden, werden dies in der überwiegenden Zahl sicher “gute” Fotos von Bären sein. Sie entsprechen aber möglicherweise nicht den Bildern von Bären, denen unser MachineLearning-Modell im späteren Produktiveinsatz gegenüber steht.</p>
<h2 id="out-of-domain-daten"><code class="language-plaintext highlighter-rouge">Out-of-Domain</code> Daten</h2>
<p>Das beschriebene Problem mit unseren Trainingsdaten ist ein konkretes Beispiel dessen, was allgemein als <strong>out of domain data</strong> beschrieben wird. Ganz allgemein formuliert bedeutet dies, dass unser Modell während des Produktiveinsatzes möglicherweise andere Daten sehen wird, als während des Trainingsprozesses. Da es für dieses Problem keine eindeutige technische Lösung gibt, muss man bei der Zusammenstellung der Trainingsdaten bereits den späteren Einsatzzweck des Modells im Kopf haben.</p>
<p>Doch gibt es auch noch andere Schwierigkeiten, die uns hinsichtlich der eingesetzten Trainingsdaten treffen können.</p>
<h2 id="domain-shift-problem">Domain-Shift Problem</h2>
<p>Eines dieser ist das <code class="language-plaintext highlighter-rouge">domain shift problem</code>. Dieses beschreibt jene Situation in der unser KI-Modell während der Produktivphase veränderte Daten erhält. Beispielsweise kann ein MachineLearning Modell, das in einer Versicherung eingesetzt wird, auf eine bestehende Kundengruppe trainiert worden sein. Ändert sich nun in der Praxis die Zusammensetzung der Kundengruppe, so muss auch unser Modell angepasst werden, um noch adäquate Entscheidungen treffen zu können.</p>
<h2 id="wege-um-diese-probleme-zu-verhindern">Wege, um diese Probleme zu verhindern</h2>
<p>Die Ursache dieser Probleme liegt in der Komplexität von neuronalen Netzen, die es unmöglich macht, ihr Verhalten vollends zu verstehen und vorwegzunehmen. Doch gerade diese Komplexität ist es, was neuronale Netze derartig mächtig in der Anwendung macht.</p>
<p>Um also die Vorteile bestmöglich im Produktivbetrieb nutzen zu können, empfehlen wir einen 3-stufigen Einführungsplan:</p>
<ol>
<li><strong>Manueller Prozess</strong>: Die künstliche Intelligenz läuft parallel zu ganz normalen manuellen Abarbeitung des Prozesses.</li>
<li><strong>Einführung mit eingeschränktem Fokus</strong>: In einem zeitlich und geografisch eingegrenztem Raum wird die künstliche Intelligenz eingeführt. Der Prozess wird von einem menschlichen Anwender überwacht.</li>
<li><strong>Schrittweise Erweiterung</strong>: Schritt für Schritt wird der KI-Einsatz zeitlich und geografisch ausgeweitet.</li>
</ol>
<p>Wenn immer möglich, sollte im ersten Schritt die künstliche Intelligenz (bzw. das Machine Learning Modell) nur im Hintergrund mitlaufen. Der tatsächliche Prozess wird jedoch von einem menschlichen Anwender durchgeführt. Während dieser Phase können erste Erfahrungen gesammelt werden und man erkennt schnell, ob die KI auch richtig agiert.</p>
<p>Im zweiten Schritt übernimmt dann die KI die Führungsrolle. Der Prozess wird jedoch von einem menschlichen Anwender permanent überwacht. Wichtig ist, die Stufe von Schritt 1 auf Schritt 2 nicht überall zeitgleich durchzuführen, sondern Teil für Teil die Anwendung des Systems auszuweiten.</p>
<p>Danach kann der Umfang und Fokus der künstlichen Intelligenz laufend erweitert werden. Wichtig ist, während dieser Phase auf genaue Protokolle und ein etabliertes Reportingsystem zu achten.</p>
<p>Quelle: <a href="https://amzn.to/344ZoQq">Deep Learning for Coders with fastai and PyTorch: AI Applications Without a PhD</a></p>Bernhard J. Mayrb.mayr@we-make.aiMeist sind die KI-Experten auf die Datenaufbereitung und die Entwicklung von Modellen konzentriert. Doch dies ist in der Regel nur ein kleiner Teil des gesamten Ökosystems in dem das Machine Learning Modell dann später eingesetzt werden soll. Jedes datengetriebene Produkt verlangt, den gesamten Prozess, in dem das Modell genutzt wird, von Anfang bis zum Ende zu durchdenken.