第9講、深入理解Scaled Dot-Product Attention

Scaled Dot-Product Attention是Transformer架構的核心組件,也是現代深度學習中最重要的注意力機制之一。本文將從原理、實現和應用三個方面深入剖析這一機制。

1. 基本原理

Scaled Dot-Product Attention的本質是一種加權求和機制,通過計算查詢(Query)與鍵(Key)的相似度來確定對值(Value)的關注程度。其數學表達式為:

這個公式包含幾個關鍵步驟:

  1. 計算相似度:通過點積(dot product)計算Query和Key的相似度,得到注意力分數(attention scores)
  2. 縮放(Scaling):將點積結果除以 d k \sqrt{d_k} dk? ?進行縮放,其中 d k d_k dk?是Key的維度
  3. 應用Mask(可選):在某些情況下(如自回歸生成)需要遮蓋未來信息
  4. Softmax歸一化:將注意力分數通過softmax轉換為概率分布
  5. 加權求和:用這些概率對Value進行加權求和

2. 為什么需要縮放(Scaling)?

縮放是Scaled Dot-Product Attention區別于普通Dot-Product Attention的關鍵。當輸入的維度 d k d_k dk?較大時,點積的方差也會變大,導致softmax函數梯度變得極小(梯度消失問題)。通過除以 d k \sqrt{d_k} dk? ?,可以將方差控制在合理范圍內。

假設Query和Key的各個分量是均值為0、方差為1的獨立隨機變量,則它們點積的方差為 d k d_k dk?。通過除以 d k \sqrt{d_k} dk? ?,可以將方差歸一化為1。

3. 代碼實現解析

讓我們看看PyTorch中Scaled Dot-Product Attention的典型實現:

def scaled_dot_product_attention(query, key, value, mask=None, dropout=None):# 獲取key的維度d_k = query.size(-1)# 計算注意力分數并縮放scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(d_k)# 應用mask(如果提供)if mask is not None:scores = scores.masked_fill(mask == 0, float('-inf'))# 應用softmax得到注意力權重attn = F.softmax(scores, dim=-1)# 應用dropout(如果提供)if dropout is not None:attn = dropout(attn)# 加權求和return torch.matmul(attn, value), attn

這個函數接受query、key、value三個張量作為輸入,可選的mask用于遮蓋某些位置,dropout用于正則化。

4. 張量維度分析

假設輸入的形狀為:

  • Query: [batch_size, seq_len_q, d_k]
  • Key: [batch_size, seq_len_k, d_k]
  • Value: [batch_size, seq_len_k, d_v]

計算過程中各步驟的維度變化:

  1. Key轉置后: [batch_size, d_k, seq_len_k]
  2. Query與Key的點積: [batch_size, seq_len_q, seq_len_k]
  3. Softmax后的注意力權重: [batch_size, seq_len_q, seq_len_k]
  4. 最終輸出: [batch_size, seq_len_q, d_v]

5. 在Multi-Head Attention中的應用

Scaled Dot-Product Attention是Multi-Head Attention的基礎。在Multi-Head Attention中,我們將輸入投影到多個子空間,在每個子空間獨立計算注意力,然后將結果合并:

class MultiHeadAttention(nn.Module):def __init__(self, h, d_model, dropout=0.1):super().__init__()assert d_model % h == 0self.d_k = d_model // hself.h = hself.linears = clones(nn.Linear(d_model, d_model), 4)self.attn = Noneself.dropout = nn.Dropout(dropout)def forward(self, query, key, value, mask=None):if mask is not None:mask = mask.unsqueeze(1)nbatches = query.size(0)# 1) 投影并分割成多頭query, key, value = [l(x).view(nbatches, -1, self.h, self.d_k).transpose(1, 2)for l, x in zip(self.linears, (query, key, value))]# 2) 應用注意力機制x, self.attn = scaled_dot_product_attention(query, key, value, mask, self.dropout)# 3) 合并多頭結果x = x.transpose(1, 2).contiguous().view(nbatches, -1, self.h * self.d_k)return self.linears[-1](x)

6. 實際應用場景

Scaled Dot-Product Attention在多種場景下表現出色:

  1. 自然語言處理:捕捉句子中詞與詞之間的依賴關系
  2. 計算機視覺:關注圖像中的重要區域
  3. 推薦系統:建模用戶與物品之間的交互
  4. 語音處理:捕捉音頻信號中的時序依賴

7. 優勢與局限性

優勢

  • 計算效率高(可以通過矩陣乘法并行計算)
  • 能夠捕捉長距離依賴關系
  • 模型可解釋性強(可以可視化注意力權重)

局限性

  • 計算復雜度為O(n2),對于長序列計算開銷大
  • 沒有考慮位置信息(需要額外的位置編碼)
  • 對于某些任務,可能需要結合CNN等結構以捕捉局部特征

8. 總結

Scaled Dot-Product Attention是現代深度學習中的關鍵創新,通過簡單而優雅的設計實現了強大的表達能力。它不僅是Transformer架構的核心,也啟發了眾多后續工作,如Performer、Linformer等對注意力機制的改進。理解這一機制對于掌握現代深度學習模型至關重要。

通過縮放點積、應用softmax和加權求和這三個簡單步驟,Scaled Dot-Product Attention成功地讓模型"關注"輸入中的重要部分,這也是它能在各種任務中取得卓越表現的關鍵所在。

##9、Scaled Dot-Product Attention應用案例

敬請關注下一篇

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

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

相關文章

el-tree結合checkbox實現數據回顯

組件代碼 <el-tree:data"vertiList"show-checkboxnode-key"id":props"defaultProps"ref"treeRefx"class"custom-tree"check-change"handleCheckChange"> </el-tree>獲取選擇的節點 handleCheckChan…

OpenResty 深度解析:構建高性能 Web 服務的終極方案

引言 openresty是什么&#xff1f;在我個人對它的理解來看相當于嵌入了lua的nginx; 我們在nginx中嵌入lua是為了不需要再重新編譯,我們只需要重新修改lua腳本,隨后重啟即可; 一.lua指令序列 我們分別從初始化階段&#xff0c;重寫/訪問階段&#xff0c;內容階段&#xff0c;日志…

多商戶商城系統源碼解析:開發直播電商APP的技術底層實戰詳解

隨著直播電商的火爆&#xff0c;越來越多的創業者和企業都在尋求打造自己的多商戶商城系統&#xff0c;以實現“人、貨、場”三者的深度融合。然而&#xff0c;從一個簡單的電商平臺到一個功能完善的直播電商APP&#xff0c;其技術底層架構和實現過程并非一蹴而就。本文將從架構…

桌面端進程通信

以下是關于 Electron 桌面端進程通信的基本知識點總結: 一、Electron 進程模型基礎 1. 進程類型與職責 進程類型職責權限主進程(Main)創建窗口、系統級操作、IPC中樞完全Node.js訪問權限渲染進程(Renderer)展示Web內容、UI交互默認受限(可配置開啟Node.js)預加載腳本(Prelo…

openEuler24.03 LTS下安裝MySQL8.0.42

目錄 前提步驟 刪除原有mysql及maridb數據庫 安裝MySQL 啟動MySQL 啟動查看MySQL狀態 設置MySQL開機自啟動 查看登錄密碼 登錄MySQL 修改密碼及支持遠程連接 遠程連接MySQL 前提步驟 擁有openEuler24.03 LTS環境&#xff0c;可參考&#xff1a;Vmware下安裝openEule…

idea 保證舊版本配置的同時,如何從低版本升到高版本

文章目錄 前言idea 保證舊版本配置的同時,如何從低版本升到高版本1. 備份項目2. 下載最新的idea3. 安裝安裝包4. 導入idea2019舊配置5. 驗證前言 如果您覺得有用的話,記得給博主點個贊,評論,收藏一鍵三連啊,寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差,…

填坑記: 古董項目Apache POI 依賴異常排除

當你看到NoSuchMethodError的時候&#xff0c;不要慌&#xff0c;深呼吸&#xff0c;這可能只是JAR包版本的問題… 引子&#xff1a;一個平靜的周二下午 那是一個看似平常的周二下午&#xff0c;系統運行良好&#xff0c;開發團隊在有條不紊地推進著新功能的開發。突然&#x…

CAPL Class: TcpSocket (此類用于實現 TCP 網絡通信 )

目錄 Class: TcpSocketacceptopenclosebindconnectgetLastSocketErrorgetLastSocketErrorAsStringlistenreceivesendsetSocketOptionshutdown函數調用的基本流程服務器端的基本流程客戶端的基本流程Class: TcpSocket學習筆記。來自CANoe幫助文檔。 Class: TcpSocket accept /…

微信小程序的開發及問題解決

HttpClient 測試例子 SpringBootTest public class HttpClientTest {/*** 測試通過httpclient發送get方式的請求*/Testpublic void testGET() throws IOException {//創建httpclient對象CloseableHttpClient httpClient HttpClients.createDefault();//創建請求對象HttpGet ht…

foreach中使用await的問題

目錄 1.說明 2.示例 3.解決方案 1.說明 在foreach中調用異步方法&#xff0c;即使使用了await&#xff0c;不會依次執行每個異步任務&#xff0c;也就是說Array.prototype.forEach不會等待 Promise 完成&#xff0c;即使你在回調函數中返回一個 Promise&#xff0c;forEach …

Linux調試生成核心存儲文件

1.核心存儲文件配置&#xff1a; 不知道理解對不對&#xff0c;Linux中的核心存儲文件的配置是在/proc/sys/kernel/core_pattern中的&#xff0c;使用 cat /proc/sys/kernel/core_pattern # 打印出 |/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E表示核…

Compose筆記(二十三)--多點觸控

這一節主要了解一下Compose中多點觸控&#xff0c;在Jetpack Compose 中&#xff0c;多點觸控處理需要結合Modifier和手勢API來實現&#xff0c;一般通過組合 pointerInput、TransformableState 和 TransformModifier 來創建支持縮放、旋轉和平移的組件。 一、 API 1. Pointer…

【Java ee初階】HTTP(4)

構造HTTP請求 1&#xff09;開發中&#xff0c;前后端交互。瀏覽器運行的網頁中&#xff0c;構造出HTTP請求 2&#xff09;調試階段&#xff0c;通過構造HTTP請求測試服務器 樸素的方案&#xff1a; 通過tcp socket 的方式構造HTTP請求 按照HTTP請求格式&#xff0c;往TCP…

STM32 __main

STM32開發中__main與用戶main()函數的本質區別及工作機制 在STM32開發中&#xff0c;__main和用戶定義的main()函數是啟動過程中的兩個關鍵節點&#xff0c;分別承擔運行時初始化和用戶程序入口的職責。以下是它們的核心差異及協作機制&#xff1a; 一、定義與層級差異 ?__ma…

什么是PMBus

一、PMBus的定義與背景 PMBus&#xff08;Power Management Bus&#xff0c;電源管理總線&#xff09; 是一種基于SMBus&#xff08;System Management Bus&#xff09;的開放標準數字通信協議&#xff0c;專為電源設備的監控、配置和控制設計。由PMBus聯盟&#xff08;現并入…

Python OOP核心技巧:如何正確選擇實例方法、類方法和靜態方法

Python方法類型全解析&#xff1a;實例方法、類方法與靜態方法的使用場景 一、三種方法的基本區別二、訪問能力對比表三、何時使用實例方法使用實例方法的核心場景&#xff1a;具體應用場景&#xff1a;1. 操作實例屬性2. 對象間交互3. 實現特定實例的行為 四、何時使用類方法使…

業務中臺-典型技術棧選型(微服務、容器編排、分布式數據庫、消息隊列、服務監控、低代碼等)

在企業數字化中臺建設中&#xff0c;業務中臺是核心支撐平臺&#xff0c;旨在通過技術手段將企業核心業務能力抽象、標準化和復用&#xff0c;以快速響應前端業務需求。其核心技術流涉及從業務抽象到服務化、治理和持續優化的全流程。以下是業務中臺建設中的核心技術體系及關鍵…

期望是什么:(無數次的均值,結合概率)21/6=3.5

https://seeing-theory.brown.edu/basic-probability/cn.html 期望是什么:(無數次的均值,結合概率)21/6=3.5 一、期望(數學概念) 在概率論和統計學中,**期望(Expectation)**是一個核心概念,用于描述隨機變量的長期平均取值,反映隨機變量取值的集中趨勢。 (一…

matlab官方免費下載安裝超詳細教程2025最新matlab安裝教程(MATLAB R2024b)

文章目錄 準備工作MATLAB R2024b 安裝包獲取詳細安裝步驟1. 文件準備2. 啟動安裝程序3. 配置安裝選項4. 選擇許可證文件5. 設置安裝位置6. 選擇組件7. 開始安裝8. 完成輔助設置 常見問題解決啟動失敗問題 結語 準備工作 本教程將幫助你快速掌握MATLAB R2024b的安裝技巧&#x…

第3章 自動化測試:從單元測試到硬件在環(HIL)

在前兩章中,我們已完成從環境搭建到流水線編譯的自動化配置。為了真正保障軟件質量、降低回歸風險,本章將聚焦測試自動化,涵蓋從最基礎的單元測試,到集成測試,再到硬件在環(Hardware-in-the-Loop, HIL)測試的全流程。通過腳本驅動、測試報告可視化和與 CI 平臺深度集成,…