我們?cè)?6.4 節(jié)介紹了自然語(yǔ)言推理任務(wù)和 SNLI 數(shù)據(jù)集。鑒于許多基于復(fù)雜和深層架構(gòu)的模型, Parikh等人。( 2016 )提出用注意力機(jī)制解決自然語(yǔ)言推理,并將其稱為“可分解注意力模型”。這導(dǎo)致模型沒有循環(huán)層或卷積層,在 SNLI 數(shù)據(jù)集上以更少的參數(shù)獲得了當(dāng)時(shí)最好的結(jié)果。在本節(jié)中,我們將描述和實(shí)現(xiàn)這種用于自然語(yǔ)言推理的基于注意力的方法(使用 MLP),如圖 16.5.1所示。
16.5.1。該模型
比保留前提和假設(shè)中標(biāo)記的順序更簡(jiǎn)單的是,我們可以將一個(gè)文本序列中的標(biāo)記與另一個(gè)文本序列中的每個(gè)標(biāo)記對(duì)齊,反之亦然,然后比較和聚合這些信息以預(yù)測(cè)前提和假設(shè)之間的邏輯關(guān)系。類似于機(jī)器翻譯中源句和目標(biāo)句之間的 token 對(duì)齊,前提和假設(shè)之間的 token 對(duì)齊可以通過注意力機(jī)制巧妙地完成。
圖 16.5.2描述了使用注意機(jī)制的自然語(yǔ)言推理方法。在高層次上,它由三個(gè)聯(lián)合訓(xùn)練的步驟組成:參與、比較和聚合。我們將在下面逐步說明它們。
import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l
16.5.1.1。出席
第一步是將一個(gè)文本序列中的標(biāo)記與另一個(gè)序列中的每個(gè)標(biāo)記對(duì)齊。假設(shè)前提是“我確實(shí)需要睡覺”,假設(shè)是“我累了”。由于語(yǔ)義相似,我們可能希望將假設(shè)中的“i”與前提中的“i”對(duì)齊,并將假設(shè)中的“tired”與前提中的“sleep”對(duì)齊。同樣,我們可能希望將前提中的“i”與假設(shè)中的“i”對(duì)齊,并將前提中的“需要”和“睡眠”與假設(shè)中的“疲倦”對(duì)齊。請(qǐng)注意,使用加權(quán)平均的這種對(duì)齊是軟的,其中理想情況下較大的權(quán)重與要對(duì)齊的標(biāo)記相關(guān)聯(lián)。為了便于演示,圖 16.5.2以硬方式顯示了這種對(duì)齊方式 。
現(xiàn)在我們更詳細(xì)地描述使用注意機(jī)制的軟對(duì)齊。表示為 A=(a1,…,am)和 B=(b1,…,bn)前提和假設(shè),其標(biāo)記數(shù)為m和n,分別在哪里 ai,bj∈Rd (i=1,…,m,j=1,…,n) 是一個(gè)d維詞向量。對(duì)于軟對(duì)齊,我們計(jì)算注意力權(quán)重 eij∈R作為
哪里的功能f是在以下函數(shù)中定義的 MLP mlp
。的輸出維度fnum_hiddens
由的參數(shù)指定 mlp
。
def mlp(num_inputs, num_hiddens, flatten):
net = []
net.append(nn.Dropout(0.2))
net.append(nn.Linear(num_inputs, num_hiddens))
net.append(nn.ReLU())
if flatten:
net.append(nn.Flatten(start_dim=1))
net.append(nn.Dropout(0.2))
net.append(nn.Linear(num_hiddens, num_hiddens))
net.append(nn.ReLU())
if flatten:
net.append(nn.Flatten(start_dim=1))
return nn.Sequential(*net)
需要強(qiáng)調(diào)的是,在(16.5.1) f接受輸入ai和bj分開而不是將它們中的一對(duì)一起作為輸入。這種分解技巧只會(huì)導(dǎo)致m+n的應(yīng)用(線性復(fù)雜度) f而不是mn應(yīng)用程序(二次復(fù)雜度)。
對(duì)(16.5.1)中的注意力權(quán)重進(jìn)行歸一化,我們計(jì)算假設(shè)中所有標(biāo)記向量的加權(quán)平均值,以獲得與由索引的標(biāo)記軟對(duì)齊的假設(shè)表示i在前提下:
評(píng)論
查看更多