NLP學習之Transformer(1)

初識 Transformer (1)

1.簡介

1.1主要特點:

self-attention:

自注意力機制,Transformer的核心是自注意力機制,它允許模型在處理某個位置的輸入時,能夠直接與其他位置的輸入交互,而不像CNN、RNN只能順序處理數據。自注意力機制通過計算輸入序列中各位置之間的相似度來決定各位置之間的影響力,從而提高了模型的表現力。

并行化能力

由于Transformer不依賴于序列的順序處理,它的計算過程可以并行化,這就可以顯著提高了訓練效率。

Encoder-Decoder

Transformer 采用了典型的編碼器-解碼器架構。編碼器負責處理輸入序列,將其轉換為上下文相關的表示;解碼器則根據這些表示生成輸出序列。

1.2. 模型結構

Transformer主要由編碼器(Encoder)和解碼器(Decoder)組成,廣泛應用于自然語言處理任務,尤其是機器翻譯。

在這里插入圖片描述

2.代碼實現

2.1 輸入序列

輸入是一個序列,如詞向量序列,假設:
X=(x1,x2,…,xn)∈Rn×d X = (x_1, x_2, \dots, x_n) \in \mathbb{R}^{n \times d} X=(x1?,x2?,,xn?)Rn×d
nnn 個輸入,ddd 是輸入維度,則自注意力的目的是捕獲 nnn 個實體之間的關系。

  #定義一個詞表vocab={"我","是","一個","好","人"}

2.2 詞語關系

it代表的是animal還是street呢,對我們來說簡單,但對機器來說是很難判斷的。self-attention就能夠讓機器把it和animal聯系起來。

2.3 線性變換

自注意力機制依賴于三個核心概念:查詢向量Query、鍵向量Key、值向量Value。他們對輸入 XXX 進行三次線性變換,得到三個矩陣。

#詞嵌入向量num_embedding=len(vocab)embedding=nn.Embdedding(num_embedding,256)#詞嵌入,傳入詞表大小和詞嵌入維度(特征維度)#獲取“我的”的詞向量embed=embedding(torch.Tensor([0]))#映射一個query向量Q=nn.Linear(256,4)(embed)#映射一個key向量K=nn.Linear(256,4)(embed)#映射一個value向量V=nn.Linear(256,4)(embed)
2.3.1 查詢向量

Q = Query, 是自注意力機制中的“詢問者”。每個輸入都會生成一個查詢向量,表示當前詞的需求。

  • 作用:用于與鍵向量計算相似度(通過點積方式),確定當前詞與其他詞的相關性。
  • 生成方式:通過一個權重矩陣將輸入數據(如詞向量)映射到查詢空間。

Q=XWq Q=X W_q Q=XWq?

WqW_qWq? 是可學習權重矩陣,維度為 d×dkd \times d_kd×dk?dkd_kdk?是超參數,表示查詢向量的維度。

2.3.2 鍵向量

**K = **Key,表示其他詞的信息,供查詢向量匹配。每個輸入都會生成一個鍵向量,表示其能夠提供的信息內容。

  • 作用:與查詢向量計算點積,生成注意力權重。點積越大,表示它們之間的相關性越強。
  • 生成方式:通過一個權重矩陣將輸入數據(如詞向量)映射到鍵空間。

K=XWk K=X W_k K=XWk?

WkW_kWk? 是可學習權重矩陣,維度為 d×dkd \times d_kd×dk?dkd_kdk?是超參數,表示鍵向量的維度。

2.3.3 值向量

V = Value, 值向量包含了每個輸入實際的信息內容,相關性決定了信息被聚焦的程度。

  • 作用:使用值向量基于注意力得分進行加權求和,生成最終的輸出表示。
  • 生成方式:通過一個權重矩陣將輸入數據(如詞向量)映射到值空間。

V=XWv V=X W_v V=XWv?

WvW_vWv? 是可學習權重矩陣,維度為 d×dvd \times d_vd×dv?dvd_vdv?是超參數,表示值向量的維度。

2.3.4 以圖示意

通過線性變換得到三個向量的變化如下圖所示:

image-20250218093149466請添加圖片描述

2.4 注意力得分

使用點積來計算查詢向量和鍵向量之間的相似度,除以縮放因子 dk\sqrt{d_k}dk?? 來避免數值過大,使得梯度穩定更新。得到注意力得分矩陣:
Attention(Q,K)=QKTdk \text{Attention}(Q, K) = \frac{QK^T}{\sqrt{d_k}} Attention(Q,K)=dk??QKT?
注意力得分矩陣維度是 n×nn \times nn×n,其中 nnn 是序列的長度。每個元素 (i,j)(i, j)(i,j) 表示第 iii 個元素與第 jjj 個元素之間的相似度。

參考示意圖如下:
請添加圖片描述

   fc = nn.ModuleList(nn.Linear(dim, dim) for _ in range(3))Q = fc[0](sentence_embedding)K = fc[1](sentence_embedding)V = fc[2](sentence_embedding)# print(Q.shape, K.shape, V.shape)# 余弦相似度  []# "I Love Nature Language Processing"sim = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(dim)# print('原始得分:',sim)

.5 歸一化

為了將注意力得分轉換為概率分布,需按行對得分矩陣進行 softmaxsoftmaxsoftmax 操作,確保每行的和為 1,得到的矩陣表示每個元素對其他元素的注意力權重。是的,包括自己。
Attention?Weight=softmax(QKTdk) \text{Attention Weight} = \text{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right) Attention?Weight=softmax(dk??QKT?)

具體到每行的公式如下:
α^1,i=exp?(α1,i)∑jexp?(α1,j) \hat{\alpha}_{1,i} = \frac{\exp(\alpha_{1,i})}{\sum_j \exp(\alpha_{1,j})} α^1,i?=j?exp(α1,j?)exp(α1,i?)?

  • α1,i\alpha_{1,i}α1,i? :第 111 個詞語和第 iii 個詞語之間的原始注意力得分。
  • α^1,i\hat{\alpha}_{1,i}α^1,i? :經過歸一化后的注意力得分。
    score = F.softmax(sim, dim=-1)# print('歸一化操作:', score)

2.6 加權求和

通過將注意力權重矩陣與值矩陣 VVV 相乘,得到加權的值表示。
Output=Attention?Weight×V=softmax(QKTdk)×V \text{Output} =\text{Attention Weight} \times V = \text{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right) \times V Output=Attention?Weight×V=softmax(dk??QKT?)×V

   # 加權求和:我(一開始的詞向量)不再是我(通過上下文進行加權求和之后的我)output = torch.matmul(score, V)print( output[0])

具體計算示意圖如下:

請添加圖片描述

| QK計算相似度后,經 softmaxsoftmaxsoftmax 得到注意力,再乘V,最后相加得到包含注意力的輸出 |

3. 多頭注意力機制

Multi-Head Attention,多頭注意力機制,是對自注意力機制的擴展。

3.1 基本概念

多頭注意力機制的核心思想是,將注意力機制中的 Q、K、VQ、K、VQKV 分成多個頭,每個頭計算出獨立的注意力結果,然后將所有頭的輸出拼接起來,最后通過一個線性變換得到最終的輸出。請添加圖片描述
3.2 多頭機制請添加圖片描述

3.2.1 映射權重

分頭的過程是通過權重矩陣映射實現的,而不是直接切分

 head_num=8head_dim=dim // head_numfc=nn.ModuleList(nn.Linear(dim,dim) for _ in range(3))#映射QueryKeyValue矩陣Q=fc[0](sentence_embedding)K=fc[1](sentence_embedding)V=fc[2](sentence_embedding)#分成八個頭#每個映射創建出八個線性層multi_head_Q_fc=nn.ModuleList(nn.Linear(dim, head_dim) for _ in range(head_num))multi_head_K_fc=nn.ModuleList(nn.Linear(dim, head_dim) for _ in range(head_num))multi_head_V_fc=nn.ModuleList(nn.Linear(dim, head_dim) for _ in range(head_num))#將不同的注意力頭進行映射然后堆疊起來multi_head_Q = torch.stack([multi_head_Q_fc[i](Q) for i in range(head_num)])print(multi_head_Q.shape)multi_head_K = torch.stack([multi_head_K_fc[i](K) for i in range(head_num)])print(multi_head_K.shape)multi_head_V = torch.stack([multi_head_V_fc[i](V) for i in range(head_num)])print(multi_head_V.shape)

3.3 加權求和

每個頭是獨立計算的,使用自己的一套參數,得到每個頭的輸出:
Oh=AhVh O_h = A_h V_h Oh?=Ah?Vh?
其中,Oh∈Rn×dvO_h \in \mathbb{R}^{n \times d_v}Oh?Rn×dv? 是第 hhh 個頭的輸出。

  # 計算各自的注意力得分scores_list = torch.stack([torch.matmul(Query_list[i], Key_list[i].transpose(0, 1))for i in range(head_num)])scores_list = torch.stack([scores_list[i] / math.sqrt(d_k) for i in range(head_num)])# 進行歸一化操作scores_list = torch.stack([F.softmax(scores_list[i], dim=-1) for i in range(head_num)])print(scores_list)

3.4 輸出拼接

將所有頭的輸出進行拼接:
Oconcat=[O1,O2,…,Oh]∈Rn×h?dv O_{\text{concat}} = [O_1, O_2, \dots, O_h] \in \mathbb{R}^{n \times h \cdot d_v} Oconcat?=[O1?,O2?,,Oh?]Rn×h?dv?
其中,OconcatO_{\text{concat}}Oconcat? 是所有頭拼接的結果,維度是 n×(h?dv)n \times (h \cdot d_v)n×(h?dv?),其中 hhh 是頭的數量,dvd_vdv? 是每個頭的值向量的維度。

# 對8個頭進行拼接,拼接形狀:(seq_len, d_k)Output = torch.cat(Output_list, dim=-1)print(Output.shape) # torch.Size([7, 512])

3.5 線性變換

拼接后通過一個線性變換矩陣 WOW^OWO 映射為最終輸出:
Output=OconcatWO \text{Output} = O_{\text{concat}} W^O Output=Oconcat?WO
其中,WO∈R(h?dv)×dW^O \in \mathbb{R}^{(h \cdot d_v) \times d}WOR(h?dv?)×d 是可訓練的權重矩陣,ddd 是最終輸出的維度。

  # 線性變換并最終輸出W_O = torch.randn(dim, dim)Output = torch.matmul(Output, W_O)print(Output.shape) # torch.Size([7, 512])

3.3 表達能力

通過多個并行的頭在不同的子空間中學習上下文信息,讓同一個句子在不同場景下表達不同的意思,增強模型的表達能力和靈活性。請添加圖片描述

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

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

相關文章

C語言筆記6:C高級 part1

1.gcc 編譯器 編譯流程 預處理-》編譯》匯編》鏈接》 E 預處理的命令 S 編譯匯編代碼 -c匯編階段命令 -o 輸出對應的文件GDB調試工具2.作用域存儲分類// C高級部分知識多, 加上這周 我學的知識量有點爆炸。家里又有事情,這周末要回老家 爭取下周補齊吧。…

A12預裝app

在A12上預裝應用,出現了一個異常。在此記錄問題描述:在A12上預裝應用按照A13的預裝方案報錯,mk文件如下:LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS : optional LOCAL_MODULE : Tideen_PTT LOCAL_MODU…

termios 線程 poll epoll進化 二叉AVL紅黑樹

struct termios tio 是什么 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h>#define SERIAL_PORT "/dev/ttyS0" #define BUF_SIZE 256int main(v…

C++設計模式:類間關系

類封裝了數據和行為&#xff0c;是面向對象的重要組成部分&#xff0c;它是具有相同屬性、操作、關系的對象集合的總稱。在系統中&#xff0c;每個類都具有一定的職責&#xff0c;職責指的是類要完成什么樣子的功能&#xff0c;要承擔什么樣子的義務。一個類可以有多種職責&…

MSYS2+CMake配置C/C++開發環境

目錄一、MSYS2是什么1.1 核心架構與組件??1.1.1 背景介紹1.1.1.1 Cygwin1.1.1.2 MinGW和Mingw-w641.1.1.3MSYS和MSYS21.1.2 技術基礎??1.1.3 多環境支持??1.2 核心功能??1.2.1 類Unix開發環境??1.2.2 開發工具鏈??1.2.3 軟件倉庫與包管理??二、安裝和配置2.1 配置…

Vue 3 + TypeScript:package.json 示例 / 詳細注釋說明

一、示例 / 詳細注釋說明 {// 項目基礎信息"name": "vite-project", // 項目名稱&#xff08;建議使用 kebab-case 格式&#xff09;"private": true, // 標記為私有項目&#xff0c;避免意外發布到 npm"version": "1.0.…

SpatialVLM和SpatialRGPT論文解讀

目錄 一、SpatialVLM 1、概述 2、方法 3、實驗 二、SpatialRGPT 1、概述 2、方法 3、訓練方法 4、實驗 一、SpatialVLM 1、概述 SpatialVLM是最早的依賴傳統VLMs實現3D空間推理能力的論文&#xff0c;在24年1月由DeepMind團隊提出&#xff0c;當時對比的還是GPT4v&am…

理解GPU架構:基礎與關鍵概念

GPU 基礎概述&#xff1a;從圖形渲染到 AI 與高性能計算的核心 Graphics Processing Units&#xff08;GPU&#xff09;已從專用的圖形渲染硬件演進為 AI、科學計算與高性能任務的中堅力量。本文將介紹 GPU 架構的基礎知識&#xff0c;包括其組成部分、內存層次結構&#xff0c…

訂單狀態定時處理(Spring Task 定時任務)

訂單狀態定時處理 如果最后一秒剛好支付了咋辦?如何補償? 需要將支付狀態和訂單狀態一起考慮,或者直接使用狀態機 Spring Task 是Spring框架提供的任務調度工具,可以按照約定的時間自動執行某個代碼邏輯。 **定位:**定時任務框架 **作用:**定時自動執行某段Java代碼 …

職得AI簡歷-免費AI簡歷生成工具

本文轉載自&#xff1a;職得AI簡歷-免費AI簡歷生成工具 - Hello123工具導航 ** 一、核心功能解析 職得 AI 簡歷是 AI 驅動的智能求職平臺&#xff0c;通過深度學習算法分析百萬優質簡歷數據&#xff0c;提供從簡歷生成到面試準備的全流程服務&#xff0c;顯著提升求職競爭力。…

8.14 機器學習(1)

機器學習基礎一、什么是機器學習定義&#xff1a;讓計算機利用大量數據在特定任務上持續改進性能的過程&#xff0c;可以讓任務完成的更好。機器學習的領域很多。二、機器學習基本術語數據集、樣本、特征&#xff08;屬性&#xff09;、屬性空間、向量表示、訓練集&#xff08;…

給電腦升級內存,自檢太慢,以為出錯

公司電腦是16G內存&#xff0c;用虛擬機時非常吃力。于是跟領導說&#xff0c;買了32G內存和1T SSD。電腦有兩個SATA數據線&#xff0c;SATA電源頭只有一個。于是買了幾個1轉2&#xff0c;順利接上。把原來的16G拔下&#xff0c;換上32G內存。結果開機沒反應。心里就有點嘀咕&a…

Effective C++ 條款43:學習處理模板化基類內的名稱

Effective C 條款43&#xff1a;學習處理模板化基類內的名稱核心思想&#xff1a;模板化基類&#xff08;templatized base classes&#xff09;中的名稱在派生類模板中默認不可見&#xff0c;需要通過this->前綴、using聲明或顯式基類限定來引入。這是因為編譯器在解析模板…

Mybatis簡單練習注解sql和配置文件sql+注解形式加載+配置文件加載

項目結構 d:\test\runjar\data\static\data\mybatis_helloworld\Mybatis\ ├── lib\ │ ├── asm-3.3.1.jar │ ├── c3p0-0.9.1.2.jar │ ├── cglib-2.2.2.jar │ ├── commons-logging-1.1.1.jar │ ├── ehcache-core-2.6.8.jar │ ├── javassi…

抗日勝利80周年 | HTML頁面

飛翔的和平鴿&#xff1b;屹立的人民英雄紀念碑&#xff1b;倒下的日本國旗&#xff1b;旋轉的金色勛章無不代表著我們勝利了&#xff01;&#xff01;&#xff01;HTML源代碼&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta cha…

web仿寫網站

一、完成自己學習的官網&#xff0c;至少三個不同的頁面。1、界面1&#xff08;1&#xff09;代碼<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

基于element-plus和IndexedDB數據庫的基礎表單

本文介紹了基于Vue 3和Element Plus的表單項目配置頁面實現。頁面包含搜索欄、操作按鈕、數據表格和分頁組件&#xff0c;使用IndexedDB進行本地數據存儲。主要功能包括&#xff1a;1) 通過模糊查詢搜索項目&#xff1b;2) 分頁顯示項目數據&#xff1b;3) 添加/編輯/刪除項目操…

paimon實時數據湖教程-主鍵表更新機制

在上一章&#xff0c;我們學習了 Paimon 如何保證每一次寫入的原子性和一致性。但數據倉庫的核心需求不僅是寫入&#xff0c;更重要的是更新。想象一個場景&#xff1a;我們需要實時更新用戶的最新信息&#xff0c;或者實時累加計算用戶的消費總額。傳統的 Hive 數據湖對此無能…

第十六屆藍橋杯青少組C++省賽[2025.8.9]第二部分編程題(4、矩陣圈層交錯旋轉)

參考程序&#xff1a;#include <bits/stdc.h> using namespace std;const int MAXN 105; int a[MAXN][MAXN];int main() {int n;if (!(cin >> n)) return 0;for (int i 0; i < n; i)for (int j 0; j < n; j)cin >> a[i][j];int layers n / 2; // 每…

【FastGTP?】[01] 使用 FastGPT 搭建簡易 AI 應用

簡易應用&#xff1a;英語單詞解釋 例句 1. 前言 FastGPT 是一個低代碼 AI 應用構建平臺&#xff0c;可以通過簡單配置快速創建自己的 AI 應用。 本文將帶你用 FastGPT 搭建一個 英語單詞解釋 例句 的 AI 工具&#xff0c;輸入英文單詞后&#xff0c;輸出&#xff1a; 單詞…