Achtung für Dummies und Implementierung in Keras

Über Artikel zur künstlichen Intelligenz in russischer Sprache


Trotz der Tatsache, dass der Aufmerksamkeitsmechanismus in der englischen Literatur beschrieben ist, habe ich im russischsprachigen Sektor noch keine anständige Beschreibung dieser Technologie gesehen. Es gibt viele Artikel über künstliche Intelligenz (KI) in unserer Sprache. Die gefundenen Artikel enthüllen jedoch nur die einfachsten KI-Modelle, zum Beispiel Faltungsnetzwerke, generative Netzwerke. Nach den neuesten Entwicklungen auf dem Gebiet der KI gibt es im russischsprachigen Sektor jedoch nur sehr wenige Artikel.

Das Fehlen von Artikeln in russischer Sprache über die neuesten Entwicklungen wurde für mich zu einem Problem, als ich mich mit dem Thema befasste und den aktuellen Stand der Dinge auf dem Gebiet der KI studierte. Ich kann gut Englisch, ich lese Artikel auf Englisch zu AI-Themen. Wenn jedoch ein neues Konzept oder ein neues Prinzip der KI herauskommt, ist das Verständnis in einer Fremdsprache schmerzhaft und langwierig. Englischkenntnisse, um in einem komplexen Objekt in einen Nicht-Muttersprachler einzudringen, sind immer noch viel mehr Zeit und Mühe wert. Nachdem Sie die Beschreibung gelesen haben, stellen Sie sich die Frage: Wie viele Prozent verstehen Sie? Wenn es einen Artikel auf Russisch gäbe, würde ich nach der ersten Lesung 100% verstehen. Dies geschah mit generativen Netzwerken, für die es eine hervorragende Artikelserie gibt: Nach dem Lesen wurde alles klar. In der Welt der Netzwerke gibt es jedoch viele Ansätze, die nur auf Englisch beschrieben werden und die tagelang behandelt werden mussten.

Ich werde regelmäßig Artikel in meiner Muttersprache schreiben und Wissen in unser Sprachfeld bringen. Wie Sie wissen, ist der beste Weg, ein Thema zu verstehen, es jemandem zu erklären. Also, wer anders als ich sollte eine Reihe von Artikeln über die modernste, komplexeste und fortschrittlichste Architektur-KI beginnen. Am Ende des Artikels werde ich selbst einen 100% igen Ansatz verstehen, und er wird für jemanden nützlich sein, der sein Verständnis liest und verbessert (übrigens, ich liebe Gesser, aber besser ** Blanche de bruxelles **).

Wenn Sie das Thema verstehen, gibt es 4 Ebenen des Verständnisses:

  1. Sie verstehen das Prinzip und die Ein- und Ausgänge des Algorithmus / Levels
  2. Sie verstehen die Sammelausgänge und allgemein, wie es funktioniert
  3. Sie verstehen alle oben genannten Punkte sowie das Gerät jeder Netzwerkebene (zum Beispiel haben Sie im VAE-Modell das Prinzip verstanden und auch die Essenz des Reparametrisierungstricks verstanden).
  4. Ich habe alles verstanden, einschließlich aller Ebenen, ich habe auch verstanden, warum alles lernt, und gleichzeitig kann ich Hyperparameter für meine Aufgabe auswählen, anstatt vorgefertigte Lösungen zu kopieren und einzufügen.

Für neue Architekturen ist der Übergang von Stufe 1 zu Stufe 4 oft schwierig: Die Autoren betonen, dass sie verschiedene wichtige Details oberflächlich näher beschreiben (haben sie sie selbst verstanden?). Oder Ihr Gehirn enthält keine Konstruktionen, sodass es selbst nach dem Lesen der Beschreibung nicht entschlüsselt und nicht zu Fähigkeiten wurde. Dies passiert, wenn Sie während Ihrer Studienzeit nach einer Nachtparty, bei der Sie die richtige Matte gegeben haben, in derselben Matan-Stunde geschlafen haben. Apparate. Und genau hier brauchen wir Artikel in unserer Muttersprache, die die Nuancen und Feinheiten jeder Operation enthüllen.

Aufmerksamkeitskonzept und Anwendung


Das Obige ist ein Szenario von Verständnisebenen. Um die Aufmerksamkeit zu analysieren, beginnen wir mit Stufe eins. Bevor wir die Ein- und Ausgänge beschreiben, werden wir das Wesentliche analysieren: Auf welchen Grundkonzepten, die selbst für ein Kind verständlich sind, basiert dieses Konzept. In dem Artikel werden wir den englischen Begriff Attention verwenden, da es sich in dieser Form auch um einen Aufruf der Keras-Bibliotheksfunktion handelt (sie ist nicht direkt darin implementiert, ein zusätzliches Modul ist erforderlich, aber mehr dazu weiter unten). Um weiterlesen zu können, müssen Sie die Keras- und Python-Bibliotheken kennen, da der Quellcode bereitgestellt wird.

Aufmerksamkeit übersetzt aus dem Englischen als "Aufmerksamkeit". Dieser Begriff beschreibt das Wesentliche des Ansatzes korrekt: Wenn Sie Autofahrer sind und der Verkehrspolizei-General auf dem Foto abgebildet ist, legen Sie unabhängig vom Kontext des Fotos intuitiv Wert darauf. Sie werden sich den General wahrscheinlich genauer ansehen. Sie belasten Ihre Augen, schauen sich die Schultergurte genau an: wie viele Sterne hat er speziell dort. Wenn der General nicht sehr groß ist, ignorieren Sie ihn. Andernfalls betrachten Sie es als einen Schlüsselfaktor für Entscheidungen. So funktioniert unser Gehirn. In der russischen Kultur wurden wir von Generationen darauf trainiert, auf hohe Ränge zu achten. Unser Gehirn legt automatisch großen Wert auf solche Objekte.

Aufmerksamkeit ist eine Möglichkeit, dem Netzwerk mitzuteilen, worauf Sie mehr achten sollten, dh die Wahrscheinlichkeit eines bestimmten Ergebnisses in Abhängigkeit vom Zustand der Neuronen und den Eingabedaten zu melden. Die in Keras selbst implementierte Aufmerksamkeitsschicht identifiziert Faktoren basierend auf dem Trainingssatz, dessen Aufmerksamkeit den Netzwerkfehler verringert. Die Identifizierung wichtiger Faktoren erfolgt durch das Verfahren der Rückausbreitung von Fehlern, ähnlich wie dies für Faltungsnetzwerke erfolgt.

Im Training zeigt Attention seinen probabilistischen Charakter. Der Mechanismus selbst bildet eine Matrix von Wichtigkeitsskalen. Wenn wir die Aufmerksamkeit nicht geschult hätten, hätten wir die Bedeutung beispielsweise empirisch festlegen können (der General ist wichtiger als der Fähnrich). Wenn wir jedoch ein Netzwerk auf Daten trainieren, wird die Wichtigkeit eine Funktion der Wahrscheinlichkeit eines bestimmten Ergebnisses, abhängig von den Daten, die am Eingang des Netzwerks empfangen werden. Wenn wir zum Beispiel einen im zaristischen Russland lebenden General treffen würden, wäre die Wahrscheinlichkeit hoch, Stulpen zu bekommen. Nachdem dies festgestellt worden wäre, wäre es möglich, durch mehrere persönliche Treffen Statistiken zu sammeln. Danach wird unser Gehirn die Tatsache des Treffens dieses Themas angemessen belasten und Markierungen auf Schultergurten und Streifen anbringen. Es sollte beachtet werden, dass der gesetzte Marker nicht wahrscheinlich ist: Jetzt hat das Treffen des Generals völlig andere Konsequenzen für Sie als damals, außerdem kann das Gewicht mehr als eins sein. Das Gewicht kann jedoch durch Normalisierung auf die Wahrscheinlichkeit reduziert werden.

Der probabilistische Charakter des Aufmerksamkeitsmechanismus beim Lernen manifestiert sich in maschinellen Übersetzungsaufgaben. Lassen Sie uns beispielsweise das Netzwerk darüber informieren, dass bei der Übersetzung vom Russischen ins Englische das Wort Liebe in 90% der Fälle als Liebe, in 9% der Fälle als Geschlecht und in 1% der Fälle als sonst übersetzt wird. Das Netzwerk markiert sofort viele Optionen und zeigt die beste Qualität des Trainings. Beim Übersetzen sagen wir dem Netzwerk: "Achten Sie beim Übersetzen des Wortes Liebe besonders auf das englische Wort Love und prüfen Sie, ob es noch Sex sein kann."

Der Attention-Ansatz wird angewendet, um mit Text sowie Ton- und Zeitreihen zu arbeiten. Für die Textverarbeitung werden häufig wiederkehrende neuronale Netze (RNN, LSTM, GRU) verwendet. Aufmerksamkeit kann sie entweder ergänzen oder ersetzen und das Netzwerk auf einfachere und schnellere Architekturen verlagern.

Eine der bekanntesten Anwendungen von Attention ist die Verwendung, um das Wiederholungsnetzwerk zu verlassen und zu einem vollständig verbundenen Modell zu wechseln. Wiederkehrende Netzwerke weisen eine Reihe von Mängeln auf: die Unfähigkeit, Schulungen auf der GPU anzubieten, eine schnelle Umschulung. Mit dem Attention-Mechanismus können wir ein Netzwerk aufbauen, das Sequenzen auf der Basis eines vollständig verbundenen Netzwerks lernen kann, es auf der GPU trainieren und Droput verwenden.

Aufmerksamkeit wird häufig verwendet, um die Leistung von Wiederholungsnetzwerken zu verbessern, beispielsweise im Bereich der Übersetzung von Sprache zu Sprache. Bei Verwendung des Codierungs- / Decodierungsansatzes, der in der modernen KI häufig verwendet wird (z. B. Variationsautocodierer). Wenn eine Aufmerksamkeitsschicht zwischen dem Codierer und dem Decodierer hinzugefügt wird, verbessert sich das Ergebnis des Netzwerkbetriebs merklich.

In diesem Artikel zitiere ich keine spezifischen Netzwerkarchitekturen, die Attention verwenden. Dies wird Gegenstand separater Arbeiten sein. Eine Auflistung aller möglichen Verwendungszwecke der Aufmerksamkeit verdient einen gesonderten Artikel.

Implementierung von Aufmerksamkeit in Keras Out of the Box


Wenn Sie verstehen, welche Art von Ansatz Sie verwenden, ist es sehr nützlich, das Grundprinzip zu lernen. Ein vollständiges Verständnis entsteht jedoch oft nur durch die Betrachtung einer technischen Implementierung. Wenn Sie die Datenströme sehen, aus denen sich die Funktion der Operation zusammensetzt, wird klar, was genau berechnet wird. Aber zuerst müssen Sie es ausführen und "Achtung Hallo Wort" schreiben.

Achtung ist derzeit in Keras selbst nicht implementiert. Es gibt jedoch bereits Implementierungen von Drittanbietern, z. B. Aufmerksamkeits-Keras, die mit Github installiert werden können. Dann wird Ihr Code extrem einfach:

from attention_keras.layers.attention import AttentionLayer attn_layer = AttentionLayer(name='attention_layer') attn_out, attn_states = attn_layer([encoder_outputs, decoder_outputs]) 

Diese Implementierung unterstützt die Visualisierungsfunktion der Aufmerksamkeitsskala. Nachdem Sie die Aufmerksamkeit geschult haben, können Sie eine Matrixsignalisierung erhalten, die laut Netzwerk für diesen Typ besonders wichtig ist (Bild von Github auf der Seite der Aufmerksamkeits-Keras-Bibliothek).


Grundsätzlich brauchen Sie nichts anderes: Fügen Sie diesen Code als eine der Ebenen in Ihr Netzwerk ein und genießen Sie das Lernen Ihres Netzwerks. Jedes Netzwerk, jeder Algorithmus wird in den ersten Phasen auf konzeptioneller Ebene entworfen (wie übrigens die Datenbank), wonach die Implementierung vor der Implementierung in einer logischen und physischen Darstellung angegeben wird. Diese Entwurfsmethode wurde noch nicht für neuronale Netze entwickelt (oh ja, dies wird das Thema meines nächsten Artikels sein). Sie verstehen nicht, wie Faltungsschichten im Inneren funktionieren? Das Prinzip wird beschrieben, Sie verwenden sie.

Keras-Implementierung von Attention low


Um das Thema endlich zu verstehen, werden wir im Folgenden die Implementierung von Attention under the Hood im Detail analysieren. Das Konzept ist gut, aber wie genau funktioniert es und warum wird das Ergebnis genau wie angegeben erzielt?

Die einfachste Implementierung des Attention-Mechanismus in Keras dauert nur drei Zeilen:

 inputs = Input(shape=(input_dims,)) attention_probs = Dense(input_dims, activation='softmax', name='attention_probs')(inputs) attention_mul = merge([inputs, attention_probs], output_shape=32, name='attention_mul', mode='mul' 

In diesem Fall wird die Eingabeschicht in der ersten Zeile deklariert, dann kommt eine vollständig verbundene Schicht mit der Softmax-Aktivierungsfunktion, wobei die Anzahl der Neuronen gleich der Anzahl der Elemente in der ersten Schicht ist. Die dritte Schicht multipliziert das Ergebnis der vollständig verbundenen Schicht mit den Eingabedaten Element für Element.

Unten finden Sie die gesamte Attention-Klasse, die einen etwas komplexeren Selbstaufmerksamkeitsmechanismus implementiert, der als vollwertige Ebene im Modell verwendet werden kann. Die Klasse erbt die Keras-Layer-Klasse.

 # Attention class Attention(Layer): def __init__(self, step_dim, W_regularizer=None, b_regularizer=None, W_constraint=None, b_constraint=None, bias=True, **kwargs): self.supports_masking = True self.init = initializers.get('glorot_uniform') self.W_regularizer = regularizers.get(W_regularizer) self.b_regularizer = regularizers.get(b_regularizer) self.W_constraint = constraints.get(W_constraint) self.b_constraint = constraints.get(b_constraint) self.bias = bias self.step_dim = step_dim self.features_dim = 0 super(Attention, self).__init__(**kwargs) def build(self, input_shape): assert len(input_shape) == 3 self.W = self.add_weight((input_shape[-1],), initializer=self.init, name='{}_W'.format(self.name), regularizer=self.W_regularizer, constraint=self.W_constraint) self.features_dim = input_shape[-1] if self.bias: self.b = self.add_weight((input_shape[1],), initializer='zero', name='{}_b'.format(self.name), regularizer=self.b_regularizer, constraint=self.b_constraint) else: self.b = None self.built = True def compute_mask(self, input, input_mask=None): return None def call(self, x, mask=None): features_dim = self.features_dim step_dim = self.step_dim eij = K.reshape(K.dot(K.reshape(x, (-1, features_dim)), K.reshape(self.W, (features_dim, 1))), (-1, step_dim)) if self.bias: eij += self.b eij = K.tanh(eij) a = K.exp(eij) if mask is not None: a *= K.cast(mask, K.floatx()) a /= K.cast(K.sum(a, axis=1, keepdims=True) + K.epsilon(), K.floatx()) a = K.expand_dims(a) weighted_input = x * a return K.sum(weighted_input, axis=1) def compute_output_shape(self, input_shape): return input_shape[0], self.features_dim 

Hier sehen wir ungefähr dasselbe, was oben durch eine vollständig verbundene Keras-Schicht implementiert wurde, die nur durch eine tiefere Logik auf einer niedrigeren Ebene ausgeführt wurde. In der Funktion wird eine parametrische Ebene (self.W) erstellt, die dann skalar mit dem Eingabevektor multipliziert wird (K.dot). Die verdrahtete Logik in dieser Variante ist etwas komplizierter: Verschiebung (wenn der Bias-Parameter angegeben ist), hyperbolische Tangente, Belichtung, Maske (falls angegeben), Normalisierung werden auf den Eingangsvektor mal self.W angewendet, dann wird der Eingangsvektor erneut mit gewichtet das erhaltene Ergebnis. Ich habe keine Beschreibung der in diesem Beispiel festgelegten Logik, ich reproduziere die Operationen des Lesens des Codes. Übrigens, bitte schreiben Sie in die Kommentare, wenn Sie eine mathematische Funktion auf hoher Ebene in dieser Logik erkennen.

Die Klasse hat einen Parameter "Bias", dh Voreingenommenheit. Wenn der Parameter aktiviert ist, wird nach dem Anwenden der dichten Ebene der endgültige Vektor zum Vektor der Ebenenparameter "self.b" hinzugefügt, wodurch nicht nur die "Gewichte" für unsere Aufmerksamkeitsfunktion bestimmt werden können, sondern auch die Aufmerksamkeitsstufe um eine Zahl verschoben werden kann. Lebensbeispiel: Wir haben Angst vor Geistern, haben sie aber nie getroffen. Daher korrigieren wir die Angst um -100 Punkte. Das heißt, nur wenn die Angst um 100 Punkte nachlässt, werden wir Entscheidungen über den Schutz vor Geistern treffen, eine Ghostbusting-Agentur anrufen, Angstgeräte kaufen usw.

Fazit


Der Aufmerksamkeitsmechanismus weist Variationen auf. Die einfachste in der obigen Klasse implementierte Attention-Option heißt Self-Attention. Selbstaufmerksamkeit ist ein Mechanismus zur Verarbeitung sequentieller Daten unter Berücksichtigung des Kontexts jedes Zeitstempels. Es wird am häufigsten zum Arbeiten mit Textinformationen verwendet. Die Implementierung der Selbstaufmerksamkeit kann durch Importieren der Keras-Selbstaufmerksamkeitsbibliothek aus der Box genommen werden. Es gibt andere Varianten der Aufmerksamkeit. Beim Studium englischsprachiger Materialien konnten mehr als 5 Variationen gezählt werden.

Beim Schreiben dieses relativ kurzen Artikels habe ich mehr als 10 englischsprachige Artikel studiert. Natürlich konnte ich nicht alle Daten aus all diesen Artikeln auf 5 Seiten herunterladen. Ich habe nur einen Druck gemacht, um einen „Leitfaden für Dummies“ zu erstellen. Um alle Nuancen des Aufmerksamkeitsmechanismus zu verstehen, benötigen Sie ein Buch mit den Seiten 150-200. Ich hoffe wirklich, dass ich die grundlegende Essenz dieses Mechanismus enthüllen konnte, damit diejenigen, die gerade erst anfangen, maschinelles Lernen zu verstehen, verstehen, wie das alles funktioniert.

Quellen


  1. Aufmerksamkeitsmechanismus in neuronalen Netzen mit Keras
  2. Achtung in tiefen Netzwerken mit Keras
  3. Aufmerksamkeitsbasierte Sequenz-zu-Sequenz in Keras
  4. Textklassifizierung mithilfe des Aufmerksamkeitsmechanismus in Keras
  5. Durchdringende Aufmerksamkeit: 2D-Faltungs-Neuronale Netze für die Vorhersage von Sequenz zu Sequenz
  6. Wie implementiere ich die Aufmerksamkeitsschicht in Keras?
  7. Achtung? Achtung!
  8. Neuronale maschinelle Übersetzung mit Aufmerksamkeit

Source: https://habr.com/ru/post/de458992/


All Articles