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