Um genau zu sein, Visualisierung vom Attention-Mechanismus von Attention-based Encoder-Decoder Architekturen 1 2. Darum soll es allerdings nicht vordergründlich gehen. Ich arbeite schon seit einer ganzen Weile mit neuronalen Netzen (NNs) um maschinelles Übersetzen zu verbessern. Damit jeder eine grobe Vorstellung hat, von was ich schreibe, ein super-schnell-crash-kurs Neural Machine Translation. Wenn eine Übersetzung generiert wird, passiert das in unserem Fall Wort für Wort. Bei jedem Wort stellt sich die Frage, welche Quell-Wörter sind relevant und welche nicht. Es gibt verschiedene Möglichkeiten dieses Problem zu lösen. Die aktuellen State-of-the-Art Architekturen benutzen einen sogenannten Attention-Mechanismus wie er in den beiden Papern vorgestellt wird. Dabei lernt man für jedes Zielwort eine Wahrscheinlichkeitsverteilung über die Quellwörter. Diese werden dann entsprechend gewichtet als Eingabe für das Netzwerk benutzt (Es ist ein bisschen komplizierter als das, aber das sollte erstmal reichen).

Ein großes Problem mit NNs ist es, dass deren gelernte Parameter nicht auf den ersten Blick interpretierbar sind. Letztlich sind NNs nur eine Ansammlung von verdammt großen Matrizen… Bei den Attentions ist das aber anders, denn sie sind normiert (Summe ist Eins) und man kann sie daher als Wahrscheinlichkeitsverteilung interpretieren und dementsprechend auch visualisieren.

Es gibt ja Menschen, die auf eine Kolonne von zwanzig Zahlen zwischen 0 und 1 schauen und direkt sehen was Sache ist. Ich gehöre nicht dazu. Bisher habe ich mich immer so weit wie Möglich von allem Ferngehalten habe, was auch nur annähernd mit Frontend und Visualisierung zu tun hat. Als ich noch einen Nebenjob als Webentwickler hatte, habe ich es gehasst, wenn ich das CSS anfassen musste oder irgendwas “noch mal hübscher” machen musste. Einfach Text reicht doch, oder? Bei der Arbeit mit NNs habe ich meine Meinung dann doch schnell geändert und es sehr zu schätzen gelernt, wenn jemand eine Visualisierung für die Probleme bereitstellt.

Um nun zum eigentlichen Punkt zu kommen: ich habe angefangen mir kleine Tools zu bauen, die mir die Zahlenkolonnen die unser Übersetzer erzeugt in verständliche Visualisierungen zu bringen.

Ein Tool was dabei herausgekommen ist visualisiert einfach als Overlay welche Wörter wie stark gewichtet worden sind. Fährt man mit dem Cursor über ein Wort im Zielsatz, dann sieht man, welche Wörter aus dem Quellsatz dafür verwendet wurden:

Dieses Tool war sehr hilfreich um eine Intuition dafür zu bekommen, welche Dinge das Model lernen konnte und wo es noch Probleme gibt.

Ein zweites Tool generiert aus den gleichen Daten eine Matrix-Ansicht.

Die zweite Ansicht habe ich vor allem implementiert, damit wir die Grafiken später in Papern benutzen können und daher gibt es einen Download-Button der ein SVG exportiert. Das kann dann in Inkscape o. ä. angepasst werden (auch wenn das wirklich weird ist und auf unterschiedlichen OS unterschiedliche Grafiken erzeugt, anyway… Anderes Thema).

Diese Art von Grafik wird zwar auch von sockeye 3 erzeugt, aber nur als png und dann ist die Auflösung Mist und die Schriftart ist im PDF unterschiedlich. Außerdem kann man an denen nichts mehr verändern. Also habe ich mir vorgenommen, es neu zu implementieren.

SVG Grafiken per Hand zu bauen fand ich irgendwie nicht geil. Also habe ich mich nach Projekten umgesehen, die das vereinfachen. Für dieses Grid habe ich d3js benutzt. Ich war sehr positiv überrascht. Ich muss zugeben, das letzte was ich in JS entwickelt hab war irgendwann 2015 mit jQuery und das war nicht besonders angenehm. Abgesehen von der manchmal etwas lückenhaften Doku von d3js bin ich davon sehr begeistert. Die ganze Entwicklung hat mich nur wenige Stunden gekostet und ich habe von d3js noch nie gehört vorher.

Beide Tools habe ich auf Github liegen. Das Repository ist ein Fork den ich angelegt habe um eine Beam-Search Visualisierung nach zu implementieren und jetzt sammle ich darin alle meine Visualisierungen. Alles ist immer noch Work-in-Progress, weil ich nur genauso lange daran arbeite, bis es gut genug für den aktuellen Anwendungsfall ist. Alles ist irgendwie schnell zusammen-gehackt und nicht besonders hübsch. Andere nennen es Research-Code. Dafür, finde ich, hat sich die Arbeit aber gelohnt und ich freue mich immer wieder, wenn ich nicht auf Zahlenkolonnen schauen muss, sondern eine interaktive Grafik habe.

  1. Bahdanau, D., Cho, K., & Bengio, Y. (2015). Neural Machine Translation by Jointly Learning to Align and Translate (pp. 1–14). San Diego, Calefornia, USA. Retrieved from http://arxiv.org/pdf/1409.0473v6.pdf 

  2. Luong, T., Pham, H., & Manning, C. D. (2015). Effective Approaches to Attention-based Neural Machine Translation. Emnlp, 1412–1421. 

  3. Hieber, F., Domhan, T., Denkowski, M., Vilar, D., Sokolov, A., Clifton, A., & Post, M. (2017, December 15). Sockeye: A Toolkit for Neural Machine Translation. https://arxiv.org/abs/1712.05690