siamese networks for one shot learning

One Shot Learning: Eure Fragen beantwortet

Autor:in
Lesezeit
10 ​​min

Bei unserem Meetup zum Thema One Shot Learning blieben einige Fragen unbeantwortet. Mai und Sebastian haben sich dieser angenommen und an dieser Stelle beantwortet. Hast du noch weitere Fragen? Dann stelle sie unseren Expert:innen gerne in den Kommentaren!

Gibts die Slides zum Download?

Klar! Ihr findet sie auf inovex.de.

Wie gehe ich vor, um mich weiterführend in das Thema einzuarbeiten? Welche Literatur würdet ihr empfehlen?

Dieser Blogpost über One Shot Learning in der Bild Klassifikation ist super verständlich geschrieben und zum Einstieg in die Thematik mit Siamese Netzwerken gut geeignet.

Ihr findet einen Überblick zu relevanten Papern in den Slides (Folie 21). Außerdem verweisen wir in den weiteren Antworten auf eure Fragen noch auf einige weitere Arbeiten.

Bitte erläutert nochmal, wie das Training mit einem Shot denn überhaupt abläuft. Sind die nicht trainierten Klassen dann jeweils nur eine Klasse (sozusagen der Rest)? Wie habt Ihr die Trainings-Paare für das Siamese-Network ausgewählt?

Unser One Shot Learning Setting bezieht sich auf die Inferenz und nicht auf das Training (in Anlehnung an [1] und [2]). Wir verwenden ⅔ der verfügbaren Klassen für das Training. Das verbleibende ⅓ der Klassen wird im Training nie gesehen und dienen als Holdout Set.

Während des Trainings werden dem Siamese-Netzwerk Batches mit Satzpaaren präsentiert. 50% der Paare im Batch sind aus derselben Klasse und werden mit einer Ähnlichkeit von 1 versehen. 50% der Paare sind aus unterschiedlichen Klassen und mit einer Ähnlichkeit von 0 annotiert. Die Paare werden während der Laufzeit zufällig gezogen.

Ziel der Evaluierung ist es, Beispiele aus den Holdout-Klassen anhand ihrer Ähnlichkeit zu den potentiellen Klassen zu klassifizieren. Zu diesem Zweck werden zufällig Kandidaten aus den Holdout-Klassen gezogen. Für jeden dieser Kandidaten werden dann zufällig Vergleichskandidaten pro Klasse bestimmt. Der gewählte Kandidat wird dann mit den Vertretern aller Klassen verglichen und der Klasse, zu dem er die höchste Ähnlichkeit besitzt, zugewiesen.

[1] Koch et al. (2015) – Siamese Networks for One Shot Learning Recognition

[2] Brown et al. (2020) – Language Models are Few Shot Learners

Was ist der Unterschied zwischen One und Zero Shot Learning?

In Analogie zur vorherigen Frage beziehen wir uns bei den Begriffen One und Zero Shot Learning auf die Inferenz. Der zu klassifizierende Kandidat aus dem Holdout-Set ist stets ein Text. Der Unterschied zwischen One und Zero Shot Learning liegt auf der Seite der Vergleichskandidaten. Beim One Shot Learning sind die Vergleichskandidaten ebenfalls Texte. In unserem Setting stehen im Falle von Zero Shot Learning keine zusätzlichen Texte zur Verfügung, deswegen vergleicht man hier direkt mit den Klassen-Labels. Zero Shot Klassifizierung wurde lediglich mit dem vortrainierten DistilBart Modell durchgeführt.

Wie sah die Architektur des TripletNet aus, z.B. wie viele Layer folgten auf das jeweilige GUSE-Embedding? Wieviele Layer/Parameter haben eure Modelle ?

Wir haben verschiedene Architekturen ausprobiert und dabei bspw. die Anzahl der Layer, die Aktivierungen und die Merge-Layer variiert. Bei den Siamese-Netzwerken hat ein Dense-Layer (ReLU) nach den USE Embeddings, absolute Distanz für den Merge Layer und ein weiterer Dense-Layer mit einer Sigmoid-Aktivierung als Output zu den besten Ergebnissen geführt. Die Anzahl der Units pro Layer haben wir von 16 bis 1024 variiert und konnten bei 256 bzw. 512 Units pro Layer die beste und stabilste Performance beobachten. Bei den Triplet-Netzwerken konnten wir dieselben Effekte beobachten. Allerdings entfällt bei diesen der Merge-Layer, da die Hidden States direkt in den Triplet-Loss einfließen.

Wie funktioniert die Generalisierung basierend auf dem einen Sample der unbekannten Klasse? Da hattet ihr am Rande erwähnt, dass es geht.

Der wesentliche Punkt ist die Abstraktion der Labels. Das Siamese (bzw. Triplet) Netzwerk lernt die Abbildung von [Text A, Text A] auf die Ähnlichkeit 1 und nicht das Label A. Dies bedeutet, dass Embeddings derselben Klassen dichter zueinander gebracht werden, während Embeddings unterschiedlicher Klassen weiter auseinander driften sollten. Daher lässt sich dieser Ansatz im späteren Verlauf auf unbekannte Klassen anwenden. Sie werden embedded und sollten dann idealerweise als entsprechender Cluster abgebildet werden. In diesem Fall ist die Ähnlichkeit zu einem zufälligem Beispiel aus diesem Cluster größer als zu Vertretern der anderen Klassen und ermöglicht eine korrekte Klassifizierung.

Wie würdet ihr z.B. einen TripletNet-Ansatz auf das Few-Shot Setting erweitern?

In unserem Setting würde sich eine Erweiterung auf Few Shot Learning nur auf die Inferenz auswirken. Im Training verwenden wir weiterhin die bekannten Triplets (Anchor, Positiv, Negativ). Für die Inferenz wird dann die Anzahl der Vergleichskandidaten pro Klasse von k=1 auf bspw. k=5 erhöht. Ein zu klassifizierendes Beispiel würde nun mit fünf Vertretern jeder Klasse verglichen und anschließend entsprechend der größten Ähnlichkeit klassifiziert. Charmanterweise erfordert dies keine Anpassung der Architektur oder zusätzliches Training. Je mehr gelabelte Samples der Holdout-Klassen zur Verfügung stehen, desto mehr Vergleichskandidaten werden bereitgestellt.

Der Effekt dieser Erweiterung ist sehr intuitiv. Texte innerhalb einer Klasse unterscheiden sich voneinander. Vergleicht man einen Text mit verschiedenen Texten derselben Klasse ist die Wahrscheinlichkeit größer, einen Ähnlichen anzutreffen, als bei einem Vergleich mit lediglich einem anderen Text.

Könnt ihr kurz Triplet im Verhältnis zu Contrastive learning beschreiben?

Der Contrastive-Loss ist beliebt im Unsupervised Learning und Self-Supervised Learning. Er wird auf Paare angewandt und versucht die Distanz zwischen den Ausprägungen der gleichen Klasse so klein wie möglich und die zwischen den Ausprägungen verschiedener Klassen so weit wie möglich zu halten. Hier wird das Konzept einer Margin eingeführt, die sich auf die minimale Distanz von unterschiedlichen Ausprägungen bezieht.

Im Gegensatz dazu nimmt der Triplet-Loss nicht nur ein Paar, sondern ein Triplet in Betrachtung. Er ist im Bereich der Face Recognition, Person Re-Identification und des Feature Embedding verbreitet. Das Triplet besteht aus einem Anker, einer positiven und einer negativen Ausprägung. Das Ziel ist es die Distanz vom Anker zur positiven Ausprägung zu minimieren und gleichzeitig die Distanz zwischen dem Anker und der negativen Ausprägung zu vergrößern. Das Setup kann nochmal spezifiziert werden, indem wir die negativen Ausprägungen mit folgenden Strategien wählen:

  • Easy Triplets: Triplets, bei denen die negative Ausprägung weiter als die positive Ausprägung am Anker und zudem außerhalb der Margin liegt.
  • Hard Triplets: Triplets, bei denen die negative Ausprägung näher am Anker liegt als die positive Ausprägung
  • Semi-Hard Triplets: Triplets, bei denen die negative Ausprägung weiter als die positive Ausprägung am Anker liegt und zudem innerhalb der Margin liegt.

Weiterführende Informationen:

[1] Hadsell, Chopra, LeCun (2005) – Dimensionality Reduction by Learning an Invariant Mapping

[2] Hoffer, Ailon (2015) – Deep Metric Learning Using Triplet Network

[3] Schroff et al. (2015) – Facenet

[4] Wu et al. (2018) – Sampling Matters in Deep Embedding Learning

Braucht man bei Siamese-Netzen für die Klassifikation mehrere Durchläufe, da sie ja nur einen Similarity Score ausgeben? Also bei 200 Klassen bspw. 200 Vergleiche?

Genau, wir bilden 200 Paare bestehend aus dem zu klassifizierenden Kandidaten und den Vergleichskandidaten der 200 Klassen. Diese Paare werden dann als Batch in das Siamese-Netzwerk gegeben und es sagt 200 Ähnlichkeiten vorher. Der Kandidat wird der Klasse zugeordnet, welcher er am ähnlichsten ist.

Wenn die Ergebnisse sehr vom Datensatz abhängen, dann wahrscheinlich auch vom Task, oder? Habt ihr Erfahrung mit One/Zero-Shot Learning bei Tasks wie NER und Anonymisierung?

Absolut richtig, der Task hat einen wesentlichen Einfluss auf die Ergebnisse. Es gibt Literatur, die sich mit Few Shot Learning für Entity Recognition beschäftigt. Wir haben damit aber bis jetzt noch keine Erfahrungen gemacht. Die Übertragung unseres Ansatzes auf beide genannte Tasks ist aus meiner Sicht nicht trivial, da sich die Klassifikation von der Dokumenten- auf die Wortebene verschiebt. Somit müssen auch die Trainingspaare bzw. -triplets auf Wortebene gebildet werden. Dies muss beim Design der Modelle und des Trainingsprozesses berücksichtigt werden.

Gibt es Erfahrungen mit deutschsprachigen Datensätzen? Welche pre-trained Encoder wären z.B. von Huggingface zu empfehlen für deutsche Triplet-Learner?

Generell lässt sich jeder Klassifizierungs-Datensatz verwenden. In einem experimentellen Setting wie dem unsrigen sollte darauf geachtet werden, dass die Anzahl der Klassen einen brauchbaren Split zwischen Training- und Holdout-Klassen zulässt.

Es existiert eine Cross-linguale Variante des USE namens XLING [1]. Sie wurde für kurze Text (Sätze und kleine Absätze) gestaltet, ist auf Deutsch verfügbar und lässt sich über Tensorflow Hub [2] verwenden. Der XLING-many stellt weitere Sprachen bereit. Neben dem USE lassen sich theoretisch alle vortrainierten Modelle verwenden, die eine Repräsentation auf Dokumentenebene erzeugen können.

[1] Chidambaram et al. (2019) – Learning cross-lingual sentence representations via a multi-task dual-encoder model

[2] XLING EN-DE: https://tfhub.dev/google/universal-sentence-encoder-xling/en-de/1

Ist GUSE besser als Averaging der Wortvektoren? Wenn ja, warum?

It depends! Im Paper von Cer et al. [1] werden leider keine Vergleiche zu anderen Satz Embedding Methoden ausgewiesen. Wir haben einige Experimente auf Basis von aggregierten Word Embeddings (word2vec und GloVe) durchgeführt. Für unseren Use Case hat der USE besser abgeschnitten, jedoch variiert der Mehrwert von Datensatz zu Datensatz.

[1] Cer et al. (2018) – Universal Sentence Encoder

Wie habt ihr die Embedding-Abbildungen erstellt? T-SNE? PCA? Oder andere Techniken?

Um die Embedding-Abbildungen (Folie 16) zu erzeugen, haben wir unser Netzwerk einige Texte klassifizieren lassen. Dabei haben wir dann die Hidden States eines (finalen) Layers abgegriffen. Die von uns extrahierten Hidden States hatten typischerweise 256 oder 512 Dimensionen. Mittels PCA haben wir diese Embeddings dann auf eine kleinere Dimension (50) gebracht. Auf diesen transformierten Daten haben wir dann T-SNE angewendet und die abgebildete 2D Repräsentation erhalten. Der PCA Zwischenschritt diente der Laufzeitoptimierung und ist optional.

Hat dir der Beitrag gefallen?

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Ähnliche Artikel