Motivierende Selbstaufmerksamkeit | Ryan Xu

0
26


Wir wollen den Wert von nicht vollständig ersetzen v_Riley mit v_dogNehmen wir additionally an, wir nehmen eine Linearkombination von v_Riley Und v_dog als neuer Wert für v_Riley:

v_Riley = get_value('Riley')
v_dog = get_value('canine')

ratio = .75
v_Riley = (ratio * v_Riley) + ((1-ratio) * v_dog)

Das scheint intestine zu funktionieren, wir haben ein wenig von der Bedeutung des Wortes „Hund“ in das Wort „Riley“ eingebettet.

Nun möchten wir versuchen, diese Kind der Aufmerksamkeit auf den gesamten Satz anzuwenden, indem wir die Vektordarstellungen jedes einzelnen Wortes durch die Vektordarstellungen jedes anderen Wortes aktualisieren.

Was läuft hier schief?

Das Kernproblem besteht darin, dass wir nicht wissen, welche Wörter die Bedeutung anderer Wörter annehmen sollen. Wir möchten auch ein Maß dafür haben, wie viel der Wert jedes Wortes zum anderen Wort beitragen sollte.

Teil 2

In Ordnung. Wir müssen additionally wissen, wie sehr zwei Wörter miteinander verbunden sein sollten.

Zeit für Versuch Nummer 2.

Ich habe unsere Vektordatenbank so umgestaltet, dass jedem Wort tatsächlich zwei Vektoren zugeordnet sind. Der erste ist der gleiche Wertvektor wie zuvor, immer noch mit bezeichnet v. Darüber hinaus haben wir jetzt Einheitsvektoren, die mit bezeichnet werden okay die eine Vorstellung von Wortbeziehungen speichern. Wenn insbesondere zwei okay Vektoren nahe beieinander liegen, bedeutet dies, dass die mit diesen Wörtern verbundenen Werte wahrscheinlich die Bedeutung des anderen beeinflussen.

Mit unserem neuen okay Und v Vektoren, wie können wir unser vorheriges Schema ändern, um es zu aktualisieren? v_Riley’s Wert mit v_dog auf eine Weise, die respektiert, wie sehr zwei Wörter miteinander verbunden sind?

Fahren wir mit dem gleichen linearen Kombinationsgeschäft wie zuvor fort, aber nur, wenn die okay Vektoren beider im Einbettungsraum nahe beieinander liegen. Noch besser: Wir können das Skalarprodukt der beiden okay Vektoren (die zwischen 0 und 1 liegen, da es sich um Einheitsvektoren handelt) verwenden, um uns mitzuteilen, wie viel wir aktualisieren sollten v_Riley mit v_dog.

v_Riley, v_dog = get_value('Riley'), get_value('canine')
k_Riley, k_dog = get_key('Riley'), get_key('canine')

relevance = k_Riley · k_dog # dot product

v_Riley = (relevance) * v_Riley + (1 - relevance) * v_dog

Das ist etwas seltsam, denn wenn die Relevanz 1 ist, v_Riley wird komplett ersetzt durch v_dogaber lassen Sie uns das für eine Minute ignorieren.

Stattdessen möchte ich darüber nachdenken, was passiert, wenn wir diese Artwork von Idee auf die gesamte Sequenz anwenden. Das Wort „Riley“ hat über das Skalarprodukt von einen Relevanzwert mit jedem anderen Wort okayS. Vielleicht können wir stattdessen den Wert jedes Wortes proportional zum Wert des Skalarprodukts aktualisieren. Der Einfachheit halber schließen wir auch das Skalarprodukt mit sich selbst ein, um seinen eigenen Wert zu bewahren.

sentence = "Evan's canine Riley is so hyper, she by no means stops transferring"
phrases = sentence.cut up()

# get hold of an inventory of values
values = get_values(phrases)

# oh yeah, that is what okay stands for by the best way
keys = get_keys(phrases)

# get riley's relevance key
riley_index = phrases.index('Riley')
riley_key = keys[riley_index]

# generate relevance of "Riley" to one another phrase
relevances = [riley_key · key for key in keys] #nonetheless pretending python has ·

# normalize relevances to sum to 1
relevances /= sum(relevances)

# takes a linear mixture of values, weighted by relevances
v_Riley = relevances · values

Okay, das reicht für den Second.

Aber ich behaupte noch einmal, dass mit diesem Ansatz etwas nicht stimmt. Es ist nicht so, dass eine unserer Ideen falsch umgesetzt worden wäre, sondern es gibt einen grundsätzlichen Unterschied zwischen diesem Ansatz und der Artwork und Weise, wie wir tatsächlich über Beziehungen zwischen Wörtern denken.

Wenn es in diesem Artikel einen Punkt gibt, an dem ich wirklich wirklich Denken Sie, dass Sie innehalten und nachdenken sollten: Es ist hier. Sogar diejenigen unter Ihnen, die denken, Sie verstehen die Aufmerksamkeit vollständig. Was ist falsch an unserem Ansatz?

Ein Hinweis

Beziehungen zwischen Wörtern sind von Natur aus asymmetrisch! Die Artwork und Weise, wie „Riley“ sich um „Hund“ kümmert, unterscheidet sich von der Artwork und Weise, wie „Hund“ sich um „Riley“ kümmert. Es ist eine viel größere Sache, dass sich „Riley“ auf einen Hund und nicht auf einen Menschen bezieht, als auf den Namen des Hundes.

Im Gegensatz dazu ist das Skalarprodukt eine symmetrische Operation, was bedeutet, dass in unserem aktuellen Aufbau, wenn a sich um b kümmert, dann b ebenso stark um a kümmert! Eigentlich ist das etwas falsch, weil wir die Relevanzwerte normalisieren, aber der Punkt ist, dass die Wörter die Möglichkeit haben sollten, auf asymmetrische Weise zu erscheinen, selbst wenn die anderen Token konstant gehalten werden.

Teil 3

Wir sind quick da! Abschließend stellt sich die Frage:

Wie können wir unser aktuelles Setup am natürlichsten erweitern, um asymmetrische Beziehungen zu ermöglichen?

Was können wir mit einem weiteren Vektortyp machen? Wir haben immer noch unsere Wertevektoren vund unser Beziehungsvektor okay. Jetzt haben wir noch einen weiteren Vektor Q für jeden Token.

Wie können wir unsere Einrichtung und Nutzung ändern? Q um die asymmetrische Beziehung zu erreichen, die wir wollen?

Diejenigen unter Ihnen, die wissen, wie Selbstaufmerksamkeit funktioniert, werden an dieser Stelle hoffentlich schmunzeln.

Anstatt Relevanz zu berechnen k_dog · k_Riley Wenn „Hund“ sich um „Riley“ kümmert, können wir stattdessen Anfrage q_Riley gegen das Style k_dog indem man ihr Skalarprodukt nimmt. Wenn wir umgekehrt rechnen, haben wir q_dog · k_Riley stattdessen – asymmetrische Relevanz!

Hier ist das Ganze zusammen: Berechnen Sie die Aktualisierung für jeden Wert auf einmal!

sentence = "Evan's canine Riley is so hyper, she by no means stops transferring"
phrases = sentence.cut up()
seq_len = len(phrases)

# get hold of arrays of queries, keys, and values, every of form (seq_len, n)
Q = array(get_queries(phrases))
Ok = array(get_keys(phrases))
V = array(get_values(phrases))

relevances = Q @ Ok.T
normalized_relevances = relevances / relevances.sum(axis=1)

new_V = normalized_relevances @ V



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here