一、multi-head attention
Multi-head attention是transformer模型中用於編碼和解碼序列的一種新型注意力機制。在傳統的注意力機制中,模型通常只會使用一個query,對於整個序列執行一次注意力操作。然而,這種方法的性能在處理複雜任務時顯得有些不足。因此,multi-head attention機制應運而生。它將單個的query分拆成多個頭(head),然後將每個頭針對不同的子空間(sub-space)執行單獨的注意力操作。這使multi-head attention模型能夠同時關注序列不同的上下文,得到更好的表示效果。
二、multi-head self-attention
除了用於編碼和解碼序列,multi-head attention模型還可以用於處理自注意力任務。另一個重要的注意力機制是multi-head self-attention。在這種模式下,我們可以通過模型學會如何將單個輸入序列中的信息編碼為多個平行的表示形式,以更好地進行表示和預測。在處理相對短的序列時,這個機製表現得尤為優秀,因為它可以允許模型學會包含多個方面的信息,而無需關注到序列的特定順序。
三、multi-head attention與其他attention的比較
相對於其他的attention模型,如feedforward attention和scalar attention,multi-head attention具有以下的優勢:
1、multi-head attention將計算分為多個頭,每個頭可以學習到不同的特徵表示;
2、multi-head attention的計算相對較為平行化,計算效率較高;
3、multi-head attention模型對於長序列具有較好的魯棒性和表現力。
示例代碼
import torch import torch.nn as nn class MultiHeadAttention(nn.Module): """ Implementation of multi-head self-attention module. """ def __init__(self, n_heads, d_model): super(MultiHeadAttention, self).__init__() self.n_heads = n_heads self.d_model = d_model self.query_proj = nn.Linear(d_model, d_model) self.key_proj = nn.Linear(d_model, d_model) self.value_proj = nn.Linear(d_model, d_model) self.output_proj = nn.Linear(d_model, d_model) def _reshape(self, x): batch_size, length, _ = x.size() x = x.view(batch_size, length, self.n_heads, self.d_model // self.n_heads) x = x.permute(0, 2, 1, 3) x = x.contiguous().view(batch_size * self.n_heads, length, self.d_model // self.n_heads) return x def forward(self, query, key, value, mask=None): query = self.query_proj(query) key = self.key_proj(key) value = self.value_proj(value) query = self._reshape(query) key = self._reshape(key) value = self._reshape(value) scores = torch.bmm(query, key.transpose(1, 2)) scores = scores / (self.d_model // self.n_heads) ** 0.5 if mask is not None: scores = scores.masked_fill(mask == 0, -1e9) attention = nn.Softmax(dim=-1)(scores) x = torch.bmm(attention, value) x = x.view(-1, self.n_heads, x.size(1), x.size(2)) x = x.permute(0, 2, 1, 3) x = x.contiguous().view(x.size(0), x.size(1), self.n_heads * (self.d_model // self.n_heads)) return self.output_proj(x)
四、應用
Multi-head attention模型應用廣泛, 如機器翻譯、文本相似度計算、自然語言處理、語音識別、圖像分割、圖像分類、視頻內容分析、以及推薦系統等方向。其中,有不少最先進的模型都是基於transformer或者它的變種構建的,而multi-head attention是其中最為重要的組件之一。
原創文章,作者:ARFJ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131248.html