Ich habe nicht verstanden, wie das 'Ziehen' und 'Drücken' funktioniert. Was ziehen oder drücken wir? Und wie funktioniert es in Bezug auf Code oder Mathematik?
Kannst du Kontrastives Lernen in der maschinellen Lernens in einfachen Worten erklären, für jemanden, der neu in diesem Bereich ist? Natürlich! Nehmen wir an, du möchtest ein Modell erstellen, das zwischen Bildern von Katzen und Hunden unterscheiden kann. Du sammelst deinen Datensatz, bestehend aus vielen Katzen- und Hundebildern. Dann führst du sie durch ein neuronales Netz deiner Wahl, das für jedes Bild eine Repräsentation erzeugt, eine Sequenz von Zahlen wie [0.123, 0.045, 0.334, ...]. Das Problem ist, wenn dein Modell mit Katzen- und Hundebildern nicht vertraut ist, werden diese Repräsentationen ziemlich zufällig sein. Zu einem Zeitpunkt könnten eine Katzen- und eine Hundeaufnahme sehr ähnliche Repräsentationen haben (ihre Zahlen wären nahe beieinander), während zu anderen Zeiten zwei Katzenbilder weit voneinander entfernt dargestellt werden können. Einfach ausgedrückt könnte das Modell Katzen und Hunde nicht unterscheiden. Hier kommt das kontrastive Lernen ins Spiel.

Das Ziel des kontrastiven Lernens besteht darin, Paare von Proben (in diesem Fall Bilder von Katzen und Hunden) zu nehmen und das Modell zu trainieren, ähnliche Paare (Katze-Katze oder Hund-Hund) näher zusammenzubringen und unterschiedliche Paare (Katze-Hund) voneinander zu entfernen. Nachdem du dies für eine ausreichende Anzahl von Schritten durchgeführt hast, wird dein Modell eindeutige, zuverlässige Repräsentationen für Katzen und Hunde erzeugen können, um sie im Wesentlichen voneinander zu unterscheiden.

Diese Methode ist nicht auf Bilder beschränkt, du kannst sie in der Regel mit jedem Datensatz verwenden, der ähnliche und unähnliche Datenpunkte enthält.
Es hat mit einem Vorgang namens Differentiation zu tun, was bedeutet, eine Ableitung zu finden: eine Funktion, die uns sagt, ob eine andere Funktion an einem bestimmten Punkt steigt oder fällt. Zum Beispiel ist die Ableitung von `f(x) = x` gleich `f'(x) = 1`, weil sie immer im Verhältnis 1:1 steigt. Dies kann für verschiedene Funktionen durchgeführt werden; bemerkenswert ist, dass wenn du die Ableitungen von `f(x)` und `g(x)` kennst, du auch die Ableitung von `f(g(x))` mit einer Formel namens Kettenregel berechnen kannst. Neuronale Netzwerke bestehen aus differenzierbaren Funktionen, sodass wir die Ableitung von Teilen oder dem gesamten Netzwerk nehmen können.

Um dies für das 'Drücken' und 'Ziehen' zu nutzen, führen wir zwei Bilder durch das neuronale Netzwerk. Nehmen wir an, die Bilder sind von einer Katze und einem Hund, also möchten wir den Abstand zwischen den beiden vergrößern. Wir wählen ein Neuronengewicht aus dem Netzwerk und machen es zu einer Variablen `x`, dann konstruieren wir eine Funktion, die die Ausgabe des Netzwerks basierend auf diesem Gewicht und allen anderen Parametern berechnet; nennen wir sie `N(x)`. Der Abstand zwischen den Katzen- und Hundeausgaben wäre `f(x) = N(Katze) - N(Hund)`. (Natürlich hätte die tatsächliche Ausgabe mehr als eine Dimension, aber wir vereinfachen.) Wir möchten nun das Gewicht so verändern, dass es die beiden Ausgaben geringfügig weiter auseinander bewegt. Dafür nehmen wir einfach die Ableitung! Wenn `f'(x)` positiv ist, bedeutet das, dass eine Erhöhung des Gewichts sie weiter auseinander bewegt, also sollten wir das tun. Wenn es negativ ist, bewegt es sie näher zusammen, also sollten wir das Gewicht geringfügig verringern. Wende dies auf alle Neuronen oft genug an und dein Netzwerk wird bald zu einem ziemlich guten Katzen-Hunde-Separator konvergieren!