【NLP】Transformer自注意机制代码实现
作者 | Ashis Kumar Panda
編譯 | VK
來源 | Towards Data Science
在開始這篇博文之前,我強烈建議訪問我先前的關于Transformers 概述的博文。為了更好地利用這個博客,請按以下順序查看我以前的博客文章。
Transformers — Yo_just need Attention(https://machinelearningmarvel.in/transformers-you-just-need-attention/)
Intuitive Maths and Code behind Self-Attention Mechanism of Transformers(https://machinelearningmarvel.in/intuitive-maths-and-code-behind-self-attention-mechanism-of-transformers-for-dummies/)
Concepts about Positional Encoding Yo_Might Not Know About(https://machinelearningmarvel.in/concepts-about-positional-encoding-you-might-not-know-about/)
這篇博文將深入了解注意機制的細節(jié),并使用python從頭開始創(chuàng)建一個注意機制。代碼和直觀的數(shù)學解釋將齊頭并進。
我們要學什么?
注意機制概念
自注意機制的步驟(直覺數(shù)學理論和代碼)
輸入預處理
查詢、鍵和值矩陣
注意分數(shù)的概念
多頭自注意機制
所以不要再耽擱了,我們開始吧。
注意機制概念
正如前一篇文章所討論的,當一個句子通過注意機制時會發(fā)生什么。例如,假設我們有一個句子“He took the hat and examined it carefully”,注意機制通過記住每個單詞與句子中其他單詞的關系來創(chuàng)建每個單詞的表示(嵌入)。
在上面的句子中,注意機制對句子的理解如此之深,以至于它可以將“it”與“hat”聯(lián)系起來,而不是與“He”聯(lián)系起來。
自注意機制的步驟
1.輸入正確的格式
我們現(xiàn)在都知道文本輸入不適合由Transformer/計算機解釋。因此,我們用數(shù)字向量來表示文本中的每個單詞。讓我們?yōu)橐粋€句子創(chuàng)建嵌入,例如:-“This is book”,假設嵌入維數(shù)為5,那么每個單詞都有一個長度為5的向量,如下所示。
Transformer輸入
print(f”Shape?is?:-?{np.random.randn(3,5).shape}”) X=np.random.randn(3,5) XOutput:-
根據(jù)上面的輸入矩陣,我們將創(chuàng)建兩個新矩陣,即鍵矩陣、查詢矩陣和值矩陣。矩陣在注意機制中起著至關重要的作用。讓我們看看怎么做?
2.獲取查詢、鍵值矩陣
首先,我們需要查詢、鍵和值權重矩陣。目前,我們已經(jīng)隨機初始化了它,但實際上,就像神經(jīng)網(wǎng)絡中的任何其他權重一樣,這些都是在訓練過程中學習的參數(shù)。最后使用最優(yōu)權重。假設這些權重是代碼中所示的最佳權重。下面總結(jié)了我們在代碼部分將要做的工作
query矩陣的優(yōu)化權值
weight_of_query=np.random.randn(5,3) weight_of_queryOutput:-
key矩陣的優(yōu)化權重
weight_of_key=np.random.randn(5,3) weight_of_keyOutput:-
value矩陣的優(yōu)化權重
weight_of_values=np.random.randn(5,3) weight_of_valuesOutput:-
這些權重將乘以我們的輸入矩陣(X),從而得到最終的鍵、查詢和值矩陣
key矩陣的計算
Key=np.matmul(X,weight_of_key) Keyquery矩陣的計算
Query=np.matmul(X,weight_of_query) Queryvalue矩陣的計算
Values=np.matmul(X,weight_of_values) Values查詢、關鍵字和值矩陣中的第一行表示“This”詞的查詢、關鍵字和值向量,以此類推。到目前為止,查詢、鍵和值矩陣可能意義不大。讓我們看看自我注意機制是如何通過使用查詢、鍵和值向量來發(fā)現(xiàn)每個單詞與句子中其他單詞的關系,從而創(chuàng)建每個單詞的表示(嵌入)的。
3.注意得分
注意公式:
dimension=5 Scores=np.matmul(Query,Key.T)/np.sqrt(dimension) Scores在Q.K(轉(zhuǎn)置)中發(fā)生的是查詢和鍵矩陣之間的點積,點積定義了相似性,如下圖所示。
注意:- 以下圖片中的數(shù)字都是為了解釋而虛構的
所以在查詢向量q1(This)和所有關鍵向量k1(This)、k2(is)、k3(book)之間有一個點積。
這個計算告訴我們查詢向量q1(This)如何與鍵矩陣k1(This)、k2(is)、k3(book)中的每個向量相關/相似。同樣,如果我們關注最終的輸出矩陣,我們可以看到每個單詞比句子中的任何其他單詞都更相關,如對角線矩陣所示。這是因為點積值更高。
其次,“This”一詞與上圖中以紅色突出顯示的“book”更相關。如代碼的最后一部分所示,我們將Q.K(轉(zhuǎn)置)除以sqrt(維數(shù))。這是一種標準化步驟,在這里進行,以使梯度穩(wěn)定。
下面代碼中的Softmax有助于將其置于0和1的范圍內(nèi),并分配概率值。
from?scipy.special?import?softmax Softmax_attention_scores=np.array([softmax(x)?for?x?in?Scores]) Softmax_attention_scores上述矩陣是中間softmax標度注意得分矩陣,其中每行對應于順序中每個單詞的中間注意得分/概率得分。它顯示了每個詞是如何與其他詞的概率。為了得到最終的注意向量,我們將上述分數(shù)乘以值矩陣并求和。總結(jié)了與“This”相對應的三個注意向量。
在下面的代碼片段中,softmax_attention_scores[0][0]是該特定單詞的權重,Values[0]是對應于單詞“This”的值向量,依此類推。
Softmax_attention_scores[0][0]*Values[0]+\ Softmax_attention_scores[0][1]*Values[1]+\ Softmax_attention_scores[0][2]*Values[2]類似地,我們可以計算像is和book這樣的詞的注意力。這就是自注意的機制。接下來,我們將探討多頭注意機制,它的基本原理來自于自我注意機制。
多頭自注意機制
簡單地說,多頭注意機制就是多個自我注意機制串聯(lián)在一起。如果我們將每個自我注意流/過程表示為一個頭部,那么我們將把所有的自注意機制連接在一起,得到一個多頭注意機制。
當我們在一篇即將發(fā)表的博文中進行實際操作時,我們將看到每個編碼器的輸出尺寸為512,總共有8個頭。所以所發(fā)生的是,每個自注意模塊都會輸出到一個(no_of_words_in_sentence,64個)維矩陣。
當所有這些維度串聯(lián)起來時,我們將看到最后的矩陣將是(no_of_words_in_sentence,(64*8)=512)維。最后一步是將連接的頭部乘以一個權重矩陣(假設在這個過程中權重矩陣已經(jīng)訓練過),這將是我們多頭部注意力的輸出。
在我們的下一篇博文中,我們將討論Hugging Face Transformers 的實現(xiàn)。如果你覺得這有幫助,請隨時查看其他博客文章
Transformers — Yo_just need Attention(https://machinelearningmarvel.in/transformers-you-just-need-attention/)
Intuitive Maths and Code behind Self-Attention Mechanism of Transformers(https://machinelearningmarvel.in/intuitive-maths-and-code-behind-self-attention-mechanism-of-transformers-for-dummies/)
Concepts about Positional Encoding Yo_Might Not Know About(https://machinelearningmarvel.in/concepts-about-positional-encoding-you-might-not-know-about/)
總結(jié)
以上是生活随笔為你收集整理的【NLP】Transformer自注意机制代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】机器学习中必知必会的 8 种
- 下一篇: C++11新特性探索:原始字符串字面值(