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