Wann entstehen diese ungültigen Verbindungen und warum müssen wir sie ausblenden? Ist das ein häufiges Vorkommen?
Was ist die Bedeutung dieses Codeausschnitts? Woher stammt er wahrscheinlich und warum wird er benötigt?

val attnMaskMul = sciCore.triangle(DataType.FLOAT32, seqLen, seqLen, 0.0, 1.0)
val attnMaskAdd = sciCore.triangle(DataType.FLOAT32, seqLen, seqLen, Double.NEGATIVE_INFINITY, 0.0)

att * attnMaskMul + attnMaskAdd Dieser Codeausschnitt stammt wahrscheinlich aus einer Implementierung des Aufmerksamkeitsmechanismus in einem Deep-Learning-Modell. Konkret wird er verwendet, um bestimmte Elemente in der Aufmerksamkeitswertematrix auszublenden, die ungültige Verbindungen zwischen Elementen in der Eingabesequenz darstellen könnten.

Der Code erstellt zunächst zwei Matrizen, attnMaskMul und attnMaskAdd, beide der Größe seqLen mal seqLen und mit dem Datentyp FLOAT32. Diese Matrizen werden mit Werten gefüllt, die eine dreieckige Maske bilden, wobei die Werte über der Diagonalen auf 1.0 für attnMaskMul und 0.0 für attnMaskAdd gesetzt werden und die Werte unter der Diagonalen auf 0.0 für attnMaskMul und negativem Unendlichkeitswert für attnMaskAdd gesetzt werden.

Wenn die Aufmerksamkeitswertematrix att elementweise mit attnMaskMul multipliziert wird, werden die Werte für ungültige Verbindungen auf 0.0 gesetzt und somit ausgeblendet. Anschließend wird attnMaskAdd zum Ergebnis addiert, um sicherzustellen, dass die Werte für gültige Verbindungen unverändert bleiben, während die Werte für ungültige Verbindungen auf negativ Unendlichkeitswert gesetzt werden. Dies wird während der anschließenden Softmax-Operation als sehr niedrige Wahrscheinlichkeit interpretiert. Dadurch wird sichergestellt, dass die Aufmerksamkeitsverteilung keine Aufmerksamkeitsgewichte für ungültige Verbindungen zuweist.

Zusammenfassend erstellt dieser Code zwei dreieckige Matrizen, um ungültige Aufmerksamkeitsverbindungen im Aufmerksamkeitsmechanismus eines Deep-Learning-Modells auszublenden, und wendet sie auf die Aufmerksamkeitswertematrix att an.
Die ungültigen Verbindungen entstehen durch den Trainingsprozess, und die dreieckige Maske wird verwendet, um sie auszublenden. Um zu verstehen, warum eine solche Maske benötigt wird, werfen wir einen Blick darauf, wie und warum dreieckige Masken verwendet werden.

Nehmen wir an, das oben genannte Aufmerksamkeitsmodell ist ein autoregressiver Transformer. Das bedeutet, dass die Vorhersage des nächsten Tokens nur von seinen vorherigen Tokens abhängt.

Um also das nächste Token vorherzusagen, muss sichergestellt werden, dass nur die vorherigen Tokens betrachtet werden. (Wenn nicht, wäre dies beim Training so etwas wie Schummeln, da das Modell bereits weiß, was als nächstes kommt).

Eine Aufmerksamkeitsmaske würde wie folgt aussehen:
```block
[0, 1, 1, 1, 1]
[0, 0, 1, 1, 1]
[0, 0, 0, 1, 1]
[0, 0, 0, 0, 1]
[0, 0, 0, 0, 0]
```

Beispiel: Wenn du Englisch ins Spanische übersetzt
Eingabe: How are you ?
Ziel: ```< start > Como estas ? < end >```
Dann wird der Decoder etwas Ähnliches vorhersagen (start wird dem Decoder als Anfangstoken gegeben)
```block
< start > 
< start > Como
< start > Como estas
< start > Como estas ?
< start > Como estas ? < end >
```

Vergleiche nun diese schrittweisen Vorhersagesequenzen mit der oben gegebenen Aufmerksamkeitsmaske und sieh, wie die Einsen den gültigen Verbindungen entsprechen, auf die wir während des Aufbaus der Sequenz achten möchten, und die Nullen der Maske entsprechen dem Dreieck, das wir ausblenden möchten, den ungültigen Verbindungen, die wir aus der Aufmerksamkeit entfernen möchten. Ja, in diesem Sinne sind ungültige Verbindungen nicht nur häufig, sondern inhärent.