NLP學習記錄十:多頭注意力

一、單頭注意力

單頭注意力的大致流程如下:

① 查詢編碼向量、鍵編碼向量和值編碼向量分別經過自己的全連接層(Wq、Wk、Wv)后得到查詢Q、鍵K和值V;

②?查詢Q和鍵K經過注意力評分函數(如:縮放點積運算)得到值權重矩陣;

③ 權重矩陣與值向量相乘,得到輸出結果。

?圖1 單頭注意力模型

?

二、多頭注意力?

2.1 使用多頭注意力的意義? ? ??

? ? ? ? 看了一些對多頭注意力機制解釋的視頻,我自己的淺顯理解是:在實踐中,我們會希望查詢Q能夠從給定內容中盡可能多地匹配到與自己相關的語義信息,從而得到更準確的預測輸出。而多頭注意力將查詢、鍵和值分成不同的子空間表示(representation subspaces)(有點類似于子特征?),使得匹配過程更加細化。

2.2 代碼實現

????????也許直接看代碼能更快地理解這個過程:

import torch
from torch import nn
from attentionScore import DotProductAttention
# 多頭注意力模型
class MultiHeadAttention(nn.Module):def __init__(self, key_size, query_size, value_size, num_hiddens,num_heads, dropout, bias=False, **kwargs):super(MultiHeadAttention, self).__init__(**kwargs)self.num_heads = num_headsself.attention = DotProductAttention(dropout)self.W_q = nn.Linear(query_size, num_hiddens, bias=bias)self.W_k = nn.Linear(key_size, num_hiddens, bias=bias)self.W_v = nn.Linear(value_size, num_hiddens, bias=bias)self.W_o = nn.Linear(num_hiddens, num_hiddens, bias=bias)# queries:(batch_size,查詢的個數,query_size)# keys:(batch_size,“鍵-值”對的個數,key_size)# values:(batch_size,“鍵-值”對的個數,value_size)def forward(self, queries, keys, values, valid_lens):# queries,keys,values的形狀:(batch_size,查詢或者“鍵-值”對的個數,num_hiddens)queries = self.W_q(queries)keys = self.W_k(keys)values = self.W_v(values)# 經過變換后,輸出的queries,keys,values的形狀:(batch_size*num_heads,查詢或者“鍵-值”對的個數,num_hiddens/num_heads)queries = transpose_qkv(queries, self.num_heads)keys = transpose_qkv(keys, self.num_heads)values = transpose_qkv(values, self.num_heads)# valid_lens的形狀:(batch_size,)或(batch_size,查詢的個數)if valid_lens is not None:# 在軸0,將第一項(標量或者矢量)復制num_heads次,然后如此復制第二項,然后諸如此類。valid_lens = torch.repeat_interleave(valid_lens, repeats=self.num_heads, dim=0)# output的形狀:(batch_size*num_heads,查詢的個數,num_hiddens/num_heads)output = self.attention(queries, keys, values, valid_lens)# output_concat的形狀:(batch_size,查詢的個數,num_hiddens)output_concat = transpose_output(output, self.num_heads)return self.W_o(output_concat)
# 為了多注意力頭的并行計算而變換形狀
def transpose_qkv(X, num_heads):# 輸入X的形狀:(batch_size,查詢或者“鍵-值”對的個數,num_hiddens)# 輸出X的形狀:(batch_size,查詢或者“鍵-值”對的個數,num_heads,num_hiddens/num_heads)X = X.reshape(X.shape[0], X.shape[1], num_heads, -1)# 輸出X的形狀:(batch_size,num_heads,查詢或者“鍵-值”對的個數, num_hiddens/num_heads)X = X.permute(0, 2, 1, 3)# 最終輸出的形狀:(batch_size*num_heads,查詢或者“鍵-值”對的個數, num_hiddens/num_heads)return X.reshape(-1, X.shape[2], X.shape[3])
# 逆轉transpose_qkv函數的操作
def transpose_output(X, num_heads):X = X.reshape(-1, num_heads, X.shape[1], X.shape[2])X = X.permute(0, 2, 1, 3)return X.reshape(X.shape[0], X.shape[1], -1)

????????可以發現,前面的處理流程和單頭注意力的第①步是一樣的,都是使用全連接層計算查詢Q、鍵K、值V。但在進行點積運算之前,模型使用transpose_qkv函數對QKV進行了切割變換,下圖可以幫助理解這個過程:

圖2 transpose_qkv函數處理Q

圖3?transpose_qkv函數處理K?

? ? ? ? 這個過程就像是把一個整體劃分為了很多小的子空間。一個不知道恰不恰當的比喻,就像是把“父母”這個詞拆分成了“長輩”、“養育者”、“監護人”、“爸媽”多重含義。

? ? ? ? 對切割變換后的QK進行縮放點積運算,過程如下圖所示:

?圖4 對切割變換后的Q和K進行縮放點積運算

? ? ? ? transpose_output后的輸出結果:

圖5 對值加權結果進行transpose_output變換后?

????????對比單頭注意力的值加權輸出,原來的每個查詢Q匹配到了更多的value:

圖6 多頭注意力與單頭注意力的值加權結果對比

????????整個過程就像是把一個父需求分割成不同的子需求,子需求單獨與不同的子特征進行匹配,最后使得每個父需求獲得了更多的語義信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70849.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70849.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法-二叉樹篇08-完全二叉樹的節點個數

完全二叉樹的節點個數 力扣題目鏈接 題目描述 給你一棵 完全二叉樹 的根節點 root ,求出該樹的節點個數。 完全二叉樹 的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其余每層節點數都達到最大值,并且最下…

【原創工具】同文件夾PDF文件合并 By憐渠客

【原創工具】同文件夾PDF文件合并 By憐渠客 原貼:可批量合并多個文件夾內的pdf工具 - 吾愛破解 - 52pojie.cn 他這個存在一些問題,并非是軟件內自主實現的PDF合并,而是調用的pdftk這一工具,但樓主并沒有提供pdftk,而…

微軟云和金山云和k8有什么區別

Kubernetes(K8s)和微軟云(Microsoft Cloud)是兩種不同的技術,分別用于不同的目的。Kubernetes是一個開源的容器編排系統,用于自動化部署、擴展和管理容器化應用程序,而微軟云是一個提供多種云服…

libGL.so.1: cannot open shared object file: No such file or directory-linux022

in <module> from PyQt5.QtGui import QPixmap, QFont, QIcon ImportError: libGL.so.1: cannot open shared object file: No such file or directory 這個錯誤信息表示XXXX 在啟動時遇到問題&#xff0c;缺少 libGL.so.1 文件。libGL.so.1 是與 OpenGL 圖形庫相關的共…

滲透測試【seacms V9】

搭建seacms環境 我選擇在虛擬機中用寶塔搭建環境 將在官網選擇的下載下來的文件解壓后拖入寶塔面板的文件中 創建網站 添加站點 搭建完成seacmsV9 找到一個報錯口 代碼分析 <?php set_time_limit(0); error_reporting(0); $verMsg V6.x UTF8; $s_lang utf-8; $dfDbn…

論文閱讀筆記:Continual Forgetting for Pre-trained Vision Models

論文閱讀筆記&#xff1a;Continual Forgetting for Pre-trained Vision Models 1 背景2 創新點3 方法4 模塊4.1 問題設置4.2 LoRA4.3 概述4.4 GS-LoRA4.5 損失函數 5 效果6 結論 1 背景 出于隱私和安全考慮&#xff0c;如今從預先訓練的視覺模型中刪除不需要的信息的需求越來…

車載DoIP診斷框架 --- 連接 DoIP ECU/車輛的故障排除

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

【爬蟲基礎】第二部分 爬蟲基礎理論 P1/3

上節內容回顧&#xff1a;【爬蟲基礎】第一部分 網絡通訊 P1/3-CSDN博客 【爬蟲基礎】第一部分 網絡通訊-Socket套接字 P2/3-CSDN博客 【爬蟲基礎】第一部分 網絡通訊-編程 P3/3-CSDN博客 爬蟲相關文檔&#xff0c;希望互相學習&#xff0c;共同進步 風123456789&#xff…

Compose 手勢處理,增進交互體驗

Compose 手勢處理&#xff0c;增進交互體驗 概述常用手勢處理Modifierclickable()combinedClickable()draggable()swipeable()transformable()scrollable()nestedScrollNestedScrollConnectionNestedScrollDispatcher 定制手勢處理使用 PointerInput ModifierPointerInputScope…

ue5 3dcesium中從本地配置文件讀取路3dtilles的路徑

關卡藍圖中獲得3dtiles的引用 拉出設置url 設置路徑 至于設置的路徑從哪里來 可以使用varest讀取文件里的接送字符串 path中配置地址 path變量的值為: Data/VillageStartMapConfig.json此地址代表content的地下的data文件夾里的config.json文件 {"FilePath": &quo…

音視頻入門基礎:RTP專題(12)——RTP中的NAL Unit Type簡介

一、引言 RTP封裝H.264時&#xff0c;RTP對NALU Header的nal_unit_type附加了擴展含義。 由《音視頻入門基礎&#xff1a;H.264專題&#xff08;4&#xff09;——NALU Header&#xff1a;forbidden_zero_bit、nal_ref_idc、nal_unit_type簡介》可以知道&#xff0c;nal_unit…

搜索賦能:大型語言模型的知識增強與智能提升

引言 近年來&#xff0c;大型語言模型&#xff08;LLM&#xff09;取得了顯著的進展&#xff0c;并在各個領域展現出強大的能力。然而&#xff0c;LLM也存在一些局限性&#xff0c;尤其是在知識庫方面。由于訓練數據的局限性&#xff0c;LLM無法獲取最新的知識&#xff0c;也無…

EX_25/2/24

寫一個三角形類&#xff0c;擁有私有成員 a,b,c 三條邊 寫好構造函數初始化 abc 以及 abc 的set get 接口 再寫一個等腰三角形類&#xff0c;繼承自三角形類 1&#xff1a;寫好構造函數&#xff0c;初始化三條邊 2&#xff1a;要求無論如何&#xff0c;等腰三角形類對象&#x…

nv docker image 下載與使用命令備忘

1&#xff0c;系統需求 Requirements for GPU Simulation GPU Architectures Volta, Turing, Ampere, Ada, Hopper NVIDIA GPU with Compute Capability 7.0 CUDA 11.x (Driver 470.57.02), 12.x (Driver 525.60.13) Supported Systems CPU architectures x86_64, ARM…

學習記錄:初次學習使用transformers進行大模型微調

初次使用transformers進行大模型微調 環境&#xff1a; 電腦配置&#xff1a; 筆記本電腦&#xff1a;I5&#xff08;6核12線程&#xff09; 16G RTX3070&#xff08;8G顯存&#xff09; 需要自行解決科學上網 Python環境&#xff1a; python版本:3.8.8 大模型&#xff1a…

【Java學習】Object類與接口

面向對象系列五 一、引用 1.自調傳自與this類型 2.類變量引用 3.重寫時的發生 二、Object類 1.toString 2.equals 3.hashCode 4.clone 三、排序規則接口 1.Comparable 2.Comparator 一、引用 1.自調傳自與this類型 似復刻變量調用里面的非靜態方法時&#xff0c;都…

OpenEuler學習筆記(三十五):搭建代碼托管服務器

以下是主流的代碼托管軟件分類及推薦&#xff0c;涵蓋自托管和云端方案&#xff0c;您可根據團隊規模、功能需求及資源情況選擇&#xff1a; 一、自托管代碼托管平臺&#xff08;可私有部署&#xff09; 1. GitLab 簡介: 功能全面的 DevOps 平臺&#xff0c;支持代碼托管、C…

Vscode無法加載文件,因為在此系統上禁止運行腳本

1.在 vscode 終端執行 get-ExecutionPolicy 如果返回是Restricted&#xff0c;說明是禁止狀態。 2.在 vscode 終端執行set-ExecutionPolicy RemoteSigned 爆紅說明沒有設置成功 3.在 vscode 終端執行Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 然后成功后你再在終…

Transformer 架構 理解

大家讀完覺得有幫助記得關注和點贊&#xff01;&#xff01;&#xff01; Transformer 架構&#xff1a;encoder/decoder 內部細節。 的介紹&#xff0c;說明 Transformer 架構相比當時主流的 RNN/CNN 架構的創新之處&#xff1a; 在 transformer 之前&#xff0c;最先進的架構…

事務的4個特性和4個隔離級別

事務的4個特性和4個隔離級別 1. 什么是事務2. 事務的ACID特性2.1 原子性2.2 一致性2.3 持久性2.4 隔離性 3. 事務的創建4. 事務并發時出現的問題4.1 DIRTY READ 臟讀4.2 NON - REPEATABLR READ 不可重復讀4.3 PHANTOM READ 幻讀 5. 事務的隔離級別5.1 READ UNCOMMITTED 讀未提交…