0. 前言
注意力機(jī)制能夠用于構(gòu)建先進(jìn)的文本生成模型,Transformer
是用于序列建模的強(qiáng)大神經(jīng)網(wǎng)絡(luò),該神經(jīng)網(wǎng)絡(luò)不需要復(fù)雜的循環(huán)或卷積架構(gòu),而只依賴(lài)于注意力機(jī)制。這種方法克服了循環(huán)神經(jīng)網(wǎng)絡(luò) (Recurrent Neural Network
, RNN
) 方法難以并行化的缺陷( RNN
必須逐符號(hào)處理序列)。Transformers
高度可并行化運(yùn)算,能夠在大規(guī)模數(shù)據(jù)集上進(jìn)行訓(xùn)練。在本節(jié)中,我們將學(xué)習(xí)文本生成模型如何利用 Transformer
架構(gòu)提高文本性能,并介紹自回歸模型 GPT
(Generative Pre-Trained transformer
)。
1. GPT 簡(jiǎn)介
OpenAI
于 2018
年提出 GPT
(Generative Pre-Trained transformer
),將 Transformer
架構(gòu)用于訓(xùn)練大規(guī)模文本數(shù)據(jù),以預(yù)測(cè)序列數(shù)據(jù)中的下一個(gè)單詞,然后再針對(duì)特定的下游任務(wù)進(jìn)行微調(diào)。GPT
的預(yù)訓(xùn)練過(guò)程使用大型文本語(yǔ)料庫(kù) BookCorpus
(來(lái)自 7000
本不同類(lèi)型書(shū)籍的 4.5GB
文本)訓(xùn)練模型。在預(yù)訓(xùn)練過(guò)程中,模型會(huì)根據(jù)先前的單詞預(yù)測(cè)序列中的下一個(gè)單詞,這一過(guò)程稱(chēng)為語(yǔ)言建模 (language modeling
),用于訓(xùn)練模型理解自然語(yǔ)言的結(jié)構(gòu)和模式。
在預(yù)訓(xùn)練之后,通過(guò)使用一個(gè)特定任務(wù)的小規(guī)模數(shù)據(jù)集,可以對(duì) GPT
模型進(jìn)行微調(diào)。微調(diào)表示調(diào)整模型的參數(shù)以更好地適應(yīng)當(dāng)前任務(wù)。例如,可以針對(duì)分類(lèi)、問(wèn)答等任務(wù)對(duì)模型進(jìn)行微調(diào)。OpenAI
對(duì) GPT
架構(gòu)進(jìn)行了改進(jìn)和擴(kuò)展,后續(xù)提出了 GPT-2
、GPT-3
、GPT-3.5
和 GPT-4
等模型。這些模型在更大的數(shù)據(jù)集上進(jìn)行訓(xùn)練,具有更大的容量,因此可以生成更復(fù)雜、更連貫的文本,GPT
模型已經(jīng)被廣泛應(yīng)用于自然語(yǔ)言處理相關(guān)任務(wù)中。
在本節(jié)中,我們將使用相同的組件和基本原理構(gòu)建 GPT
模型,不同的是,我們使用較少的數(shù)據(jù)進(jìn)行訓(xùn)練。
2. 葡萄酒評(píng)論數(shù)據(jù)集
在本節(jié)中,使用 Kaggle
中的葡萄酒評(píng)論數(shù)據(jù)集訓(xùn)練 GPT
模型,數(shù)據(jù)集中包含超過(guò) 130,000
條葡萄酒評(píng)論,以及相關(guān)描述和價(jià)格等元數(shù)據(jù)。
可以在 Kaggle
中下載數(shù)據(jù)集,解壓后,將葡萄酒評(píng)論和相關(guān)元數(shù)據(jù)保存到 ./data
文件夾中。數(shù)據(jù)準(zhǔn)備流程與使用 LSTM 訓(xùn)練生成模型中所用的數(shù)據(jù)準(zhǔn)備步驟相同:
- 加載數(shù)據(jù)并創(chuàng)建一個(gè)包含所有葡萄酒文本描述的字符串列表
- 用空格分隔標(biāo)點(diǎn)符號(hào),以便每個(gè)標(biāo)點(diǎn)符號(hào)被視為一個(gè)單獨(dú)的單詞
- 通過(guò)
TextVectorization
層將字符串進(jìn)行分詞,并將每個(gè)字符串填充/截?cái)酁楣潭ㄩL(zhǎng)度 - 創(chuàng)建訓(xùn)練集,其中輸入是分詞后的文本字符串,輸出是將相同字符串向后移動(dòng)一個(gè)符號(hào)的字符串
3. 注意力機(jī)制
理解 GPT
工作原理的第一步是理解注意力機(jī)制 (attention mechanism
),注意力機(jī)制使得 Transformer
架構(gòu)在語(yǔ)言建模方面與循環(huán)神經(jīng)網(wǎng)絡(luò)有所不同。理解了注意力機(jī)制后,便能了解如何在 Transformer
架構(gòu)(如 GPT
)中使用注意力機(jī)制。
當(dāng)我們寫(xiě)作時(shí),句子中的下一個(gè)單詞受到已經(jīng)寫(xiě)完的其他單詞的影響。例如,假設(shè)以以下方式開(kāi)始一個(gè)句子:
"The write elephant tried to get into the boat but it was too"
顯然,下一個(gè)詞應(yīng)該是與 “big
” 意思相近的單詞。句子中的其他詞對(duì)于下一單詞的選擇非常重要。例如,它是 elephant
而不是 bird
,這意味著我們更傾向于選取 “big
” 而不是 “small
”,如果句中使用 “pool
” 而不是 “boat
”,我們可能會(huì)選擇 “scared
” 替代 “big
”。最后,把 “elephant
” 放進(jìn)小船里意味著尺寸是問(wèn)題所在,如果大象試圖摧毀小船,我們可能會(huì)選擇 “flexible
” 作為最后一個(gè)詞,其中 “it
” 指的是 “boat
”。
除此之外,句子中的其他詞則并不重要。例如,大象是 “white
” 或“black”對(duì)于選擇最后一個(gè)詞沒(méi)有任何影響。同樣,句子中的其他單詞,如 the
,but
,it
等,為句子構(gòu)成了正確的語(yǔ)法形式,但對(duì)于確定下一個(gè)所需單詞并不重要。換句話(huà)說(shuō),我們只關(guān)注句子中的某些單詞,而對(duì)其他詞只付出少量關(guān)注,我們希望深度學(xué)習(xí)模型同樣能夠做到這一點(diǎn)。Transformer
中的注意力機(jī)制(也稱(chēng)為注意力頭)就是為了實(shí)現(xiàn)這一目的。它能夠決定在輸入中從哪些部分中獲取信息,以便高效地提取有用的信息而不被無(wú)關(guān)細(xì)節(jié)所干擾。這使得它能夠適應(yīng)各種情況,因?yàn)樗梢栽谕评頃r(shí)決定在哪些部分中尋找信息。
相比之下,循環(huán)層試圖構(gòu)建一個(gè)通用的隱藏狀態(tài),用以在每個(gè)時(shí)間步捕捉輸入的整體表示。這種方法的一個(gè)缺點(diǎn)是,合并到隱藏向量中的許多單詞對(duì)于當(dāng)前任務(wù)(如預(yù)測(cè)下一個(gè)單詞)可能并不直接相關(guān)。注意力頭則可以避免此問(wèn)題,因?yàn)樗鼈兛梢赃x擇如何結(jié)合上下文的信息。
3.1 查詢(xún)、鍵和值
接下來(lái),我們介紹注意力機(jī)制如何決定在哪里尋找信息,我們繼續(xù)使用上一節(jié)中所用示例。
為了能夠預(yù)測(cè)單詞 “too
” 之后的內(nèi)容,前面的其他單詞都會(huì)有所貢獻(xiàn),但它們的貢獻(xiàn)取決于它們對(duì)于預(yù)測(cè) “too
” 后續(xù)單詞的能力的自信程度。例如,單詞 “elephant
” 可能會(huì)自信地貢獻(xiàn)出與尺寸相關(guān)的詞,而單詞 “was
” 沒(méi)有提供太多的信息來(lái)縮小可能性。
換句話(huà)說(shuō),我們可以將注意力頭看作一種信息檢索系統(tǒng),其中查詢(xún)(“接在 too
之后的詞是什么?”)被轉(zhuǎn)化為鍵/值存儲(chǔ)(句子中的其他單詞),輸出結(jié)果是值的總和,并根據(jù)查詢(xún)與每個(gè)鍵之間的相關(guān)度進(jìn)行加權(quán)。此過(guò)程詳細(xì)步驟如下圖所示,我們的仍然使用上一節(jié)所用示例。
查詢(xún) (query
, Q
) 可以表示當(dāng)前任務(wù)(例如,“接在 too
之后的詞是什么?”)。在本例中,通過(guò)將單詞 “too
” 的嵌入傳遞到權(quán)重矩陣
W
Q
W_Q
WQ? 中,從維度
d
e
d_e
de? 變換為維度
d
k
d_k
dk?,得到了查詢(xún)。
鍵向量 (key
, K
) 是句子中每個(gè)單詞的表示,可以將其視為每個(gè)單詞可以幫助完成的預(yù)測(cè)任務(wù)的貢獻(xiàn)。它們與查詢(xún)的產(chǎn)生方式類(lèi)似,通過(guò)將每個(gè)嵌入傳遞到權(quán)重矩陣
W
K
W_K
WK? 中,將每個(gè)向量的維度從
d
e
d_e
de? 變換為
d
k
d_k
dk?,鍵和查詢(xún)的長(zhǎng)度相同。
在注意力頭中,使用每對(duì)向量 (
Q
K
Q_K
QK?) 之間的點(diǎn)積將每個(gè)鍵與查詢(xún)進(jìn)行比較(這就是鍵和查詢(xún)必須具有相同的長(zhǎng)度的原因)。鍵/查詢(xún)對(duì)的點(diǎn)積結(jié)果數(shù)值越高,鍵與查詢(xún)的相關(guān)度就越強(qiáng),因此允許它對(duì)注意力頭的輸出做出更大的貢獻(xiàn)。得到的向量乘以
d
k
d_k
dk?,以保持向量和的方差穩(wěn)定(大約等于 1
),并應(yīng)用 softmax
函數(shù)確保貢獻(xiàn)總和為 1
,這便是注意力權(quán)重向量。
值向量 (value
, V
) 也是句子中單詞的表示,可以將其視為每個(gè)單詞的未加權(quán)貢獻(xiàn)。通過(guò)將每個(gè)嵌入傳遞到權(quán)重矩陣
W
V
W_V
WV? 中,將每個(gè)向量的維度從
d
e
d_e
de? 變換為
d
v
d_v
dv?,得到值向量。需要注意的是,值向量不一定與鍵和查詢(xún)具有相同的長(zhǎng)度(但通常為簡(jiǎn)單起見(jiàn),使用相同長(zhǎng)度)。
值向量乘以注意力權(quán)重,得到給定
Q
Q
Q、
K
K
K 和
V
V
V 的注意力:
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
Attention(Q,K,V)=softmax(\frac {QK^T} {\sqrt {d_k}})V
Attention(Q,K,V)=softmax(dk??QKT?)V
為了從注意力頭獲得最終輸出向量,將注意力進(jìn)行求和,得到長(zhǎng)度為
d
v
d_v
dv? 的向量。這個(gè)上下文向量捕捉了句子中的單詞對(duì)于預(yù)測(cè)接在 too
之后的詞的任務(wù)的共同意見(jiàn)。
3.2 多頭注意力
在 Keras
中,可以構(gòu)建 MultiHeadAttention
層,該層將多個(gè)注意力頭的輸出連接起來(lái)構(gòu)成多頭注意力 (Multihead Attention
),允許每個(gè)頭學(xué)習(xí)不同的注意力機(jī)制,以便整個(gè)層可以學(xué)習(xí)更復(fù)雜的關(guān)系。
連接后的輸出通過(guò)最終的權(quán)重矩陣
W
O
W_O
WO? 進(jìn)行投影,將向量投影到期望的輸出維度上。在本節(jié)下,輸出維度與查詢(xún)的輸入維度相同 (
d
e
d_e
de?),以便可以將層按順序堆疊在一起。下圖顯示了 MultiHeadAttention
層輸出的構(gòu)建方式。
在 Keras
中創(chuàng)建 MultiHeadAttention
層:
layers.MultiHeadAttention(
# 此多頭注意力層有四個(gè)注意力頭
num_heads = 4,
# 鍵(和查詢(xún))是長(zhǎng)度為 128 的向量
key_dim = 128,
# 值(也是每個(gè)頭的輸出)是長(zhǎng)度為 64 的向量
value_dim = 64,
# 輸出向量的長(zhǎng)度為 256
output_shape = 256
)
3.3 因果掩碼
在以上介紹中,我們假設(shè)注意力頭的查詢(xún)輸入是一個(gè)單一的向量。然而,為了在訓(xùn)練期間提高效率,理想情況下我們希望注意力層能夠同時(shí)處理輸入中的每個(gè)單詞,為每個(gè)單詞預(yù)測(cè)后續(xù)的單詞。換句話(huà)說(shuō),我們希望我們的 GPT
模型能夠同時(shí)處理一組查詢(xún)向量(即矩陣)。
為了將向量批處理成一個(gè)矩陣,并使用線(xiàn)性代數(shù)進(jìn)行處理,我們需要一個(gè)額外的步驟,我們需要對(duì)查詢(xún)/鍵的點(diǎn)積應(yīng)用掩碼,以避免未來(lái)單詞的信息泄漏,這稱(chēng)為因果掩碼 (Causal Masking
),如下圖所示。
如果沒(méi)有這個(gè)掩碼,GPT
模型將能夠完美地猜出句子中的下一個(gè)單詞,因?yàn)樗鼘⑹褂脕?lái)自單詞本身的鍵作為一個(gè)特征。使用 Keras
創(chuàng)建因果掩碼,下圖顯示了 Numpy
形式的結(jié)果數(shù)組(為了與圖相匹配,將結(jié)果數(shù)組進(jìn)行了轉(zhuǎn)置)。
def causal_attention_mask(batch_size, n_dest, n_src, dtype):
i = tf.range(n_dest)[:, None]
j = tf.range(n_src)
m = i >= j - n_src + n_dest
mask = tf.cast(m, dtype)
mask = tf.reshape(mask, [1, n_dest, n_src])
mult = tf.concat(
[tf.expand_dims(batch_size, -1), tf.constant([1, 1], dtype=tf.int32)], 0
)
return tf.tile(mask, mult)
print(np.transpose(causal_attention_mask(1, 10, 10, dtype=tf.int32)[0]))
因果掩碼僅在解碼器 Transformer
(如 GPT
)中需要,在這些模型中,任務(wù)是根據(jù)先前的符號(hào)順序生成符號(hào),在訓(xùn)練期間掩碼掉未來(lái)的符號(hào)是至關(guān)重要的。
其他類(lèi)型的 Transformer
(例如編碼器 Transformer
)不需要因果掩碼,因?yàn)樗鼈儾皇峭ㄟ^(guò)預(yù)測(cè)下一個(gè)符號(hào)來(lái)訓(xùn)練的。例如,Google
的 BERT
在給定句子中預(yù)測(cè)待填空的單詞,因此它可以使用該詞前后的上下文。Transformer
中的多頭注意力機(jī)制中,層的可學(xué)習(xí)參數(shù)僅由每個(gè)注意力頭的三個(gè)權(quán)重矩陣 (
W
Q
W_Q
WQ?、
W
K
W_K
WK?、
W
V
W_V
WV?) 和一個(gè)用于重塑輸出的權(quán)重矩陣 (
W
O
W_O
WO?) 組成,在多頭注意力層中完全沒(méi)有卷積或循環(huán)機(jī)制。
下一節(jié)中,我們將介紹如何使用多頭注意力層構(gòu)建 Transformer
塊。
4. Transformer
4.1 Transformer 塊
Transformer
塊是 Transformer
內(nèi)的一個(gè)組件,它在多頭注意力層間應(yīng)用了跳躍連接、前饋(全連接)層 (Feed-forward layers
) 和歸一化,Transformer
塊的結(jié)構(gòu)如下圖所示。
首先,將查詢(xún)傳遞到多頭注意力層并直接添加到輸出中,這是一種跳躍連接,可以用其構(gòu)建非常深的神經(jīng)網(wǎng)絡(luò),而不會(huì)受到梯度消失問(wèn)題的影響,因?yàn)樘S連接提供了一個(gè)無(wú)梯度的數(shù)據(jù)通道,使網(wǎng)絡(luò)能夠直接傳遞信息。
其次,在 Transformer
塊中的層歸一化用于提高訓(xùn)練過(guò)程的穩(wěn)定性。我們已經(jīng)介紹了如何使用批歸一化層,在批歸一化中,每個(gè)通道的輸出被歸一化為均值為 0
,標(biāo)準(zhǔn)差為 1
,歸一化統(tǒng)計(jì)信息是根據(jù)批和空間維度計(jì)算的。
而在 Transformer
塊中的層歸一化通過(guò)在通道維度上計(jì)算歸一化統(tǒng)計(jì)信息,對(duì)批數(shù)據(jù)中每個(gè)序列的每個(gè)位置進(jìn)行歸一化。就統(tǒng)計(jì)信息的計(jì)算方式而言,它與批歸一化完全相反,下圖展示了批歸一化和層歸一化之間的差異。
層歸一化常用于基于文本的任務(wù)中,以避免在批處理中跨序列創(chuàng)建歸一化依賴(lài)關(guān)系。然而,Shen
等人表明在 Transformer
內(nèi)部可以使用一種形式的批歸一化進(jìn)行調(diào)整,從而優(yōu)于傳統(tǒng)的層歸一化方法。
最后,在 Transformer
塊中包含了一組前饋(全連接)層( Feed-forward layers
),以使組件能夠在網(wǎng)絡(luò)中深入提取更高級(jí)別的特征。
使用 Keras
實(shí)現(xiàn)一個(gè) Transformer
塊。
class TransformerBlock(layers.Layer):
# 在初始化函數(shù)中定義構(gòu)成 TransformerBlock 層的子層
def __init__(self, num_heads, key_dim, embed_dim, ff_dim, dropout_rate=0.1):
super(TransformerBlock, self).__init__()
self.num_heads = num_heads
self.key_dim = key_dim
self.embed_dim = embed_dim
self.ff_dim = ff_dim
self.dropout_rate = dropout_rate
self.attn = layers.MultiHeadAttention(
num_heads, key_dim, output_shape=embed_dim
)
self.dropout_1 = layers.Dropout(self.dropout_rate)
self.ln_1 = layers.LayerNormalization(epsilon=1e-6)
self.ffn_1 = layers.Dense(self.ff_dim, activation="relu")
self.ffn_2 = layers.Dense(self.embed_dim)
self.dropout_2 = layers.Dropout(self.dropout_rate)
self.ln_2 = layers.LayerNormalization(epsilon=1e-6)
def call(self, inputs):
input_shape = tf.shape(inputs)
batch_size = input_shape[0]
seq_len = input_shape[1]
# 創(chuàng)建因果掩碼,以隱藏查詢(xún)中未來(lái)的鍵
causal_mask = causal_attention_mask(
batch_size, seq_len, seq_len, tf.bool
)
# 創(chuàng)建多頭注意力層,并指定注意力掩碼
attention_output, attention_scores = self.attn(
inputs,
inputs,
attention_mask=causal_mask,
return_attention_scores=True,
)
attention_output = self.dropout_1(attention_output)
# 第一個(gè) add 和歸一化層
out1 = self.ln_1(inputs + attention_output)
# 前饋層
ffn_1 = self.ffn_1(out1)
ffn_2 = self.ffn_2(ffn_1)
# 第二個(gè) add 和歸一化層
ffn_output = self.dropout_2(ffn_2)
return (self.ln_2(out1 + ffn_output), attention_scores)
4.2 位置編碼
在訓(xùn)練 GPT
模型之前,還有一個(gè)最后一步需要處理。在多頭注意力層中,并沒(méi)有關(guān)注鍵的順序。每個(gè)鍵與查詢(xún)之間的點(diǎn)積是并行計(jì)算的,而非像循環(huán)神經(jīng)網(wǎng)絡(luò)那樣順序計(jì)算。這樣可以并行化處理以提高效率,但也帶來(lái)了一個(gè)問(wèn)題,因?yàn)槲覀冃枰⒁饬幽軌蚩紤]文本的上下文信息,例如,針對(duì)以下兩個(gè)句子預(yù)測(cè)不同的輸出:
The dog looked at the boy and … (barked?)
The boy looked at the dog and … (smiled?)
為了解決這個(gè)問(wèn)題,在創(chuàng)建初始的 Transformer
塊的輸入時(shí),我們使用一種稱(chēng)為位置編碼 (positional encoding
) 的技術(shù)。我們不僅使用符號(hào)嵌入 (token embedding
) 來(lái)編碼每個(gè)符號(hào),還使用位置嵌入 (position embedding
) 來(lái)編碼符號(hào)的位置。
符號(hào)嵌入使用標(biāo)準(zhǔn)的嵌入層將每個(gè)符號(hào)轉(zhuǎn)換為一個(gè)可學(xué)習(xí)向量。我們可以使用相同的方式創(chuàng)建位置編碼,使用標(biāo)準(zhǔn)的嵌入層將每個(gè)整數(shù)位置轉(zhuǎn)換為一個(gè)可學(xué)習(xí)向量。雖然 GPT
使用嵌入層來(lái)嵌入位置信息,但原始 Transformer
論文使用三角函數(shù)。
為了構(gòu)建聯(lián)合的符號(hào)-位置編碼,將符號(hào)嵌入添加到位置嵌入中,如下圖所示。這樣,就可以在一個(gè)向量中同時(shí)捕捉序列中每個(gè)詞的含義和位置信息。
使用 Keras
定義 TokenAndPositionEmbedding
層:
class TokenAndPositionEmbedding(layers.Layer):
def __init__(self, max_len, vocab_size, embed_dim):
super(TokenAndPositionEmbedding, self).__init__()
self.max_len = max_len
self.vocab_size = vocab_size
self.embed_dim = embed_dim
# 符號(hào)使用 Embedding 層獲取嵌入
self.token_emb = layers.Embedding(
input_dim=vocab_size, output_dim=embed_dim
)
# 符號(hào)的位置同樣使用 Embedding 層獲取嵌入
self.pos_emb = layers.Embedding(input_dim=max_len, output_dim=embed_dim)
def call(self, x):
maxlen = tf.shape(x)[-1]
positions = tf.range(start=0, limit=maxlen, delta=1)
positions = self.pos_emb(positions)
x = self.token_emb(x)
# TokenAndPositionEmbedding 層的輸出是符號(hào)嵌入和位置嵌入之和
return x + positions
5. 訓(xùn)練GPT
接下來(lái),構(gòu)建并訓(xùn)練 GPT
模型。將輸入文本通過(guò)符號(hào)和位置嵌入層,然后通過(guò) Transformer
塊,網(wǎng)絡(luò)的最終輸出是一個(gè)使用 softmax
激活函數(shù)的 Dense
層,輸出的維度是詞匯表中的單詞數(shù)。為了簡(jiǎn)單起見(jiàn),我們僅使用一個(gè) Transformer
塊( GPT
論文中使用 12
個(gè)),整體架構(gòu)如下圖所示。
使用 Keras
實(shí)現(xiàn)此架構(gòu):
# 用 0 填充輸入
inputs = layers.Input(shape=(None,), dtype=tf.int32)
# 文本使用 TokenAndPositionEmbedding 層獲取嵌入
x = TokenAndPositionEmbedding(MAX_LEN, VOCAB_SIZE, EMBEDDING_DIM)(inputs)
# 嵌入通過(guò) TransformerBlock 進(jìn)行傳遞
x, attention_scores = TransformerBlock(N_HEADS, KEY_DIM, EMBEDDING_DIM, FEED_FORWARD_DIM)(x)
# 轉(zhuǎn)換后的輸出通過(guò)使用 softmax 激活函數(shù)的 Dense 層進(jìn)行傳遞,以預(yù)測(cè)后續(xù)單詞的分布
outputs = layers.Dense(VOCAB_SIZE, activation="softmax")(x)
# 模型以單詞符號(hào)序列作為輸入,并輸出預(yù)測(cè)的后續(xù)單詞分布。還返回了 Transformer 塊的輸出,以便檢查模型中注意力機(jī)制的作用
gpt = models.Model(inputs=inputs, outputs=[outputs, attention_scores])
# 模型使用 SparseCategoricalCrossentropy 損失函數(shù)編譯并訓(xùn)練
gpt.compile("adam", loss=[losses.SparseCategoricalCrossentropy(), None])
print(gpt.summary())
gpt.fit(train_ds,epochs=EPOCHS,)
6. GPT 分析
訓(xùn)練 GPT
模型后,就可以使用 GPT
生成長(zhǎng)文本,還可以獲取 TransformerBlock
輸出的注意力權(quán)重,以了解 Transformer
在生成過(guò)程中不同位置尋找信息的方式。
6.1 生成文本
我們可以通過(guò)以下過(guò)程生成新文本:
- 將現(xiàn)有的單詞序列輸入到網(wǎng)絡(luò)中,以預(yù)測(cè)下一個(gè)單詞
- 將此單詞附加到現(xiàn)有序列中,并重復(fù)此過(guò)程
從網(wǎng)絡(luò)輸出的一組概率中進(jìn)行抽樣,使文本生成過(guò)程具有隨機(jī)性,而不是確定性的。
為了控制采樣過(guò)程的確定性程度,重用 LSTM 文本生成中的 TextGenerator
類(lèi),其使用溫度參數(shù)來(lái)指定采樣過(guò)程中的確定性程度,使用兩個(gè)不同的溫度值對(duì)比生成結(jié)果。溫度為 1.0
的生成文本比溫度為 0.5
的樣本具有更高的隨機(jī)性,因此準(zhǔn)確率較低。由于模型從方差較大的概率分布中進(jìn)行抽樣,因此使用溫度為 1.0
生成多個(gè)樣本將具有更多的多樣性。
6.2 注意力分?jǐn)?shù)
我們還可以令模型輸出,在決定句子中的下一個(gè)單詞時(shí),每個(gè)單詞的注意力分?jǐn)?shù)。TransformerBlock
輸出每個(gè)注意力頭的注意力權(quán)重,該權(quán)重是句子中前面單詞的 softmax
分布。
為了進(jìn)行說(shuō)明,下圖顯示了對(duì)于三個(gè)不同的輸入,具有最高概率的前五個(gè)符號(hào),以及相對(duì)于前面每個(gè)單詞,兩個(gè)注意力頭的平均注意力。根據(jù)其注意力分?jǐn)?shù)對(duì)前面的單詞進(jìn)行著色,較深的顏色表示對(duì)該單詞的注意力更高。
以這種方式查看網(wǎng)絡(luò),可以準(zhǔn)確地了解網(wǎng)絡(luò)從何處獲取信息,以便對(duì)隨后的每個(gè)單詞做出準(zhǔn)確預(yù)測(cè)。通過(guò)修改輸入,觀(guān)察是否可以使模型關(guān)注到句子中相距較遠(yuǎn)的單詞,以充分證明基于注意力的模型相對(duì)于傳統(tǒng)的循環(huán)模型更強(qiáng)大。
小結(jié)
在本節(jié)中,我們介紹了 Transformer
模型架構(gòu),并構(gòu)建了一個(gè) GPT
模型,以實(shí)現(xiàn)文本生成。GPT
利用了注意力機(jī)制,消除了對(duì)循環(huán)層(如長(zhǎng)短時(shí)記憶網(wǎng)絡(luò))的需求。注意力機(jī)制類(lèi)似于一個(gè)信息檢索系統(tǒng),利用查詢(xún)、鍵和值來(lái)決定從每個(gè)輸入符號(hào)中提取多少信息。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-838870.html
系列鏈接
AIGC實(shí)戰(zhàn)——生成模型簡(jiǎn)介
AIGC實(shí)戰(zhàn)——深度學(xué)習(xí) (Deep Learning, DL)
AIGC實(shí)戰(zhàn)——卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)
AIGC實(shí)戰(zhàn)——自編碼器(Autoencoder)
AIGC實(shí)戰(zhàn)——變分自編碼器(Variational Autoencoder, VAE)
AIGC實(shí)戰(zhàn)——使用變分自編碼器生成面部圖像
AIGC實(shí)戰(zhàn)——生成對(duì)抗網(wǎng)絡(luò)(Generative Adversarial Network, GAN)
AIGC實(shí)戰(zhàn)——WGAN(Wasserstein GAN)
AIGC實(shí)戰(zhàn)——條件生成對(duì)抗網(wǎng)絡(luò)(Conditional Generative Adversarial Net, CGAN)
AIGC實(shí)戰(zhàn)——自回歸模型(Autoregressive Model)
AIGC實(shí)戰(zhàn)——改進(jìn)循環(huán)神經(jīng)網(wǎng)絡(luò)
AIGC實(shí)戰(zhàn)——像素卷積神經(jīng)網(wǎng)絡(luò)(PixelCNN)
AIGC實(shí)戰(zhàn)——?dú)w一化流模型(Normalizing Flow Model)
AIGC實(shí)戰(zhàn)——能量模型(Energy-Based Model)
AIGC實(shí)戰(zhàn)——擴(kuò)散模型(Diffusion Model)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-838870.html
到了這里,關(guān)于AIGC實(shí)戰(zhàn)——GPT(Generative Pre-trained Transformer)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!