詳解python架構(gòu)?PyNeuraLogic超越Transformers
引言
展示神經(jīng)符號編程的力量
1. 簡介
在過去的幾年里,我們看到了基于 Transformer 的模型的興起,并在自然語言處理或計算機視覺等許多領(lǐng)域取得了成功的應用。在本文中,我們將探索一種簡潔、可解釋和可擴展的方式來表達深度學習模型,特別是 Transformer,作為混合架構(gòu),即通過將深度學習與符號人工智能結(jié)合起來。為此,我們將在名為 PyNeuraLogic 的 Python 神經(jīng)符號框架中實現(xiàn)模型。
將符號表示與深度學習相結(jié)合,填補了當前深度學習模型的空白,例如開箱即用的可解釋性或缺少推理技術(shù)。也許,增加參數(shù)的數(shù)量并不是實現(xiàn)這些預期結(jié)果的最合理方法,就像增加相機百萬像素的數(shù)量不一定會產(chǎn)生更好的照片一樣。
PyNeuraLogic 框架基于邏輯編程——邏輯程序包含可微分的參數(shù)。該框架非常適合較小的結(jié)構(gòu)化數(shù)據(jù)(例如分子)和復雜模型(例如 Transformers 和圖形神經(jīng)網(wǎng)絡(luò))。另一方面,PyNeuraLogic 不是非關(guān)系型和大型張量數(shù)據(jù)的最佳選擇。
該框架的關(guān)鍵組成部分是一個可微分的邏輯程序,我們稱之為模板。模板由以抽象方式定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的邏輯規(guī)則組成——我們可以將模板視為模型架構(gòu)的藍圖。然后將模板應用于每個輸入數(shù)據(jù)實例,以生成(通過基礎(chǔ)和神經(jīng)化)輸入樣本獨有的神經(jīng)網(wǎng)絡(luò)。這個過程與其他具有預定義架構(gòu)的框架完全不同,這些框架無法針對不同的輸入樣本進行自我調(diào)整。
2. Symbolic Transformers
我們通常傾向于將深度學習模型實現(xiàn)為對批處理成一個大張量的輸入令牌的張量操作。這是有道理的,因為深度學習框架和硬件(例如 GPU)通常針對處理更大的張量而不是形狀和大小不同的多個張量進行了優(yōu)化。 Transformers 也不例外,通常將單個標記向量表示批處理到一個大矩陣中,并將模型表示為對此類矩陣的操作。然而,這樣的實現(xiàn)隱藏了各個輸入標記如何相互關(guān)聯(lián),這可以在 Transformer 的注意力機制中得到證明。
3. Attention 機制
注意力機制構(gòu)成了所有 Transformer 模型的核心。具體來說,它的經(jīng)典版本使用了所謂的多頭縮放點積注意力。讓我們用一個頭(為了清楚起見)將縮放的點積注意力分解成一個簡單的邏輯程序。
注意力的目的是決定網(wǎng)絡(luò)應該關(guān)注輸入的哪些部分。注意通過計算值 V 的加權(quán)和來實現(xiàn),其中權(quán)重表示輸入鍵 K 和查詢 Q 的兼容性。在這個特定版本中,權(quán)重由查詢 Q 和查詢的點積的 softmax 函數(shù)計算鍵 K,除以輸入特征向量維數(shù) d_k 的平方根。
(R.weights(V.I, V.J) <= (R.d_k, R.k(V.J).T, R.q(V.I))) | [F.product, F.softmax_agg(agg_terms=[V.J])], (R.attention(V.I) <= (R.weights(V.I, V.J), R.v(V.J)) | [F.product]
在 PyNeuraLogic 中,我們可以通過上述邏輯規(guī)則充分捕捉注意力機制。第一條規(guī)則表示權(quán)重的計算——它計算維度的平方根倒數(shù)與轉(zhuǎn)置的第 j 個鍵向量和第 i 個查詢向量的乘積。然后我們用 softmax 聚合給定 i 和所有可能的 j 的所有結(jié)果。
然后,第二條規(guī)則計算該權(quán)重向量與相應的第 j 個值向量之間的乘積,并對每個第 i 個標記的不同 j 的結(jié)果求和。
4. Attention Masking
在訓練和評估期間,我們通常會限制輸入令牌可以參與的內(nèi)容。例如,我們想限制標記向前看和關(guān)注即將到來的單詞。流行的框架,例如 PyTorch,通過屏蔽實現(xiàn)這一點,即將縮放的點積結(jié)果的元素子集設(shè)置為某個非常低的負數(shù)。這些數(shù)字強制 softmax 函數(shù)將零指定為相應標記對的權(quán)重。
(R.weights(V.I, V.J) <= ( R.d_k, R.k(V.J).T, R.q(V.I), R.special.leq(V.J, V.I) )) | [F.product, F.softmax_agg(agg_terms=[V.J])],
使用我們的符號表示,我們可以通過簡單地添加一個身體關(guān)系作為約束來實現(xiàn)這一點。在計算權(quán)重時,我們限制第 j 個指標小于或等于第 i 個指標。與掩碼相反,我們只計算所需的縮放點積。
5. 非標準 Attention
當然,象征性的“掩蔽”可以是完全任意的。我們大多數(shù)人都聽說過基于稀疏變換器的 GPT-3?(或其應用程序,例如 ChatGPT)。? 稀疏變換器的注意力(跨步版本)有兩種類型的注意力頭:
- 一個只關(guān)注前 n 個標記 (0 ≤ i − j ≤ n)
- 一個只關(guān)注每第 n 個前一個標記 ((i − j) % n = 0)
兩種類型的頭的實現(xiàn)都只需要微小的改變(例如,對于 n = 5)。
(R.weights(V.I, V.J) <= ( R.d_k, R.k(V.J).T, R.q(V.I), R.special.leq(V.D, 5), R.special.sub(V.I, V.J, V.D), )) | [F.product, F.softmax_agg(agg_terms=[V.J])],
(R.weights(V.I, V.J) <= ( R.d_k, R.k(V.J).T, R.q(V.I), R.special.mod(V.D, 5, 0), R.special.sub(V.I, V.J, V.D), )) | [F.product, F.softmax_agg(agg_terms=[V.J])],
我們可以走得更遠,將對類似圖形(關(guān)系)輸入的注意力進行概括,就像在關(guān)系注意力中一樣。? 這種類型的注意力在圖形上運行,其中節(jié)點只關(guān)注它們的鄰居(由邊連接的節(jié)點)。查詢 Q、鍵 K 和值 V 是邊嵌入與節(jié)點向量嵌入相加的結(jié)果。
(R.weights(V.I, V.J) <= (R.d_k, R.k(V.I, V.J).T, R.q(V.I, V.J))) | [F.product, F.softmax_agg(agg_terms=[V.J])], (R.attention(V.I) <= (R.weights(V.I, V.J), R.v(V.I, V.J)) | [F.product], R.q(V.I, V.J) <= (R.n(V.I)[W_qn], R.e(V.I, V.J)[W_qe]), R.k(V.I, V.J) <= (R.n(V.J)[W_kn], R.e(V.I, V.J)[W_ke]), R.v(V.I, V.J) <= (R.n(V.J)[W_vn], R.e(V.I, V.J)[W_ve]),
在我們的例子中,這種類型的注意力與之前顯示的縮放點積注意力幾乎相同。唯一的區(qū)別是添加了額外的術(shù)語來捕獲邊緣。將圖作為注意力機制的輸入似乎很自然,這并不奇怪,因為 Transformer 是一種圖神經(jīng)網(wǎng)絡(luò),作用于完全連接的圖(未應用掩碼時)。在傳統(tǒng)的張量表示中,這并不是那么明顯。
6. Encoder
現(xiàn)在,當我們展示 Attention 機制的實現(xiàn)時,構(gòu)建整個 transformer 編碼器塊的缺失部分相對簡單。
我們已經(jīng)在 Relational Attention 中看到了如何實現(xiàn)嵌入。對于傳統(tǒng)的 Transformer,嵌入將非常相似。我們將輸入向量投影到三個嵌入向量中——鍵、查詢和值。
R.q(V.I) <= R.input(V.I)[W_q], R.k(V.I) <= R.input(V.I)[W_k], R.v(V.I) <= R.input(V.I)[W_v],
查詢嵌入通過跳過連接與注意力的輸出相加。然后將生成的向量歸一化并傳遞到多層感知器 (MLP)。
(R.norm1(V.I) <= (R.attention(V.I), R.q(V.I))) | [F.norm],
對于 MLP,我們將實現(xiàn)一個具有兩個隱藏層的全連接神經(jīng)網(wǎng)絡(luò),它可以優(yōu)雅地表達為一個邏輯規(guī)則。
(R.mlp(V.I)[W_2] <= (R.norm(V.I)[W_1])) | [F.relu],
最后一個帶有規(guī)范化的跳過連接與前一個相同。
(R.norm2(V.I) <= (R.mlp(V.I), R.norm1(V.I))) | [F.norm],
我們已經(jīng)構(gòu)建了構(gòu)建 Transformer 編碼器所需的所有部分。解碼器使用相同的組件;因此,其實施將是類似的。讓我們將所有塊組合成一個可微分邏輯程序,該程序可以嵌入到 Python 腳本中并使用 PyNeuraLogic 編譯到神經(jīng)網(wǎng)絡(luò)中。
R.q(V.I) <= R.input(V.I)[W_q], R.k(V.I) <= R.input(V.I)[W_k], R.v(V.I) <= R.input(V.I)[W_v], R.d_k[1 / math.sqrt(embed_dim)], (R.weights(V.I, V.J) <= (R.d_k, R.k(V.J).T, R.q(V.I))) | [F.product, F.softmax_agg(agg_terms=[V.J])], (R.attention(V.I) <= (R.weights(V.I, V.J), R.v(V.J)) | [F.product], (R.norm1(V.I) <= (R.attention(V.I), R.q(V.I))) | [F.norm], (R.mlp(V.I)[W_2] <= (R.norm(V.I)[W_1])) | [F.relu], (R.norm2(V.I) <= (R.mlp(V.I), R.norm1(V.I))) | [F.norm],
總結(jié)
在本文中,我們分析了 Transformer 架構(gòu)并演示了它在名為 PyNeuraLogic 的神經(jīng)符號框架中的實現(xiàn)。通過這種方法,我們能夠?qū)崿F(xiàn)各種類型的 Transformer,只需對代碼進行微小的更改,說明每個人都可以如何快速轉(zhuǎn)向和開發(fā)新穎的 Transformer 架構(gòu)。它還指出了各種版本的 Transformers 以及帶有 GNN 的 Transformers 的明顯相似之處。
以上就是詳解python使用 PyNeuraLogic超越Transformers的詳細內(nèi)容,更多關(guān)于PyNeuraLogic超越Transformers的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python使用xmlrpclib模塊實現(xiàn)對百度google的ping功能
這篇文章主要介紹了python使用xmlrpclib模塊實現(xiàn)對百度google的ping功能,實例分析了xmlrpclib模塊的相關(guān)技巧,需要的朋友可以參考下2015-06-06將pandas.dataframe的數(shù)據(jù)寫入到文件中的方法
今天小編就為大家分享一篇將pandas.dataframe的數(shù)據(jù)寫入到文件中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12pandas 取出表中一列數(shù)據(jù)所有的值并轉(zhuǎn)換為array類型的方法
下面小編就為大家分享一篇pandas 取出表中一列數(shù)據(jù)所有的值并轉(zhuǎn)換為array類型的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python+matplotlib實現(xiàn)堆疊圖的繪制
Matplotlib作為Python的2D繪圖庫,它以各種硬拷貝格式和跨平臺的交互式環(huán)境生成出版質(zhì)量級別的圖形。本文將利用Matplotlib庫繪制堆疊圖,感興趣的可以了解一下2022-03-03