第七篇:自注意力(二)—— 縮放、Softmax 與信息融合
第七篇自注意力二—— 縮放、Softmax 與信息融合系列文章第一篇預(yù)訓(xùn)練模型——站在巨人的肩膀上第二篇分詞——文字如何變成數(shù)字第三篇向量與矩陣——理解一切的基石第四篇Embedding 層——從 ID 到向量的第一步第五篇位置編碼——給 Transformer 裝上順序感第六篇自注意力一—— Q、K、V 的由來 本文目錄開篇一、為什么需要縮放二、Softmax把分?jǐn)?shù)變成概率三、加權(quán)求和融合信息完整的注意力公式代碼實現(xiàn)完整的單頭自注意力關(guān)鍵結(jié)果上下文感知參考資源本篇小結(jié)參考答案開篇前六篇我們完成了從文本到注意力分?jǐn)?shù)的全部準(zhǔn)備文本 → 分詞 → Embedding → 位置編碼 → Q、K、V → Q × K? 注意力分?jǐn)?shù) 我喜歡人工智能 → [101, 2769, 4263, ...] → [0.021, -0.015, ...] → 位置向量 → × W_Q/W_K/W_V → Q, K, V → Q × K? [9, 9] 分?jǐn)?shù)矩陣 ← 上一篇到這里但我們拿到的原始分?jǐn)?shù)有兩個問題數(shù)值范圍不穩(wěn)定點積結(jié)果隨向量維度增大而發(fā)散不是概率無法直接作為權(quán)重來加權(quán)求和這篇我們將完成自注意力的后半程縮放 → Softmax → 加權(quán)求和。三個步驟一步比一步精妙。到這篇文章結(jié)束你將完整理解自注意力機制的每一個數(shù)學(xué)細(xì)節(jié)并能在代碼中實現(xiàn)它。一、為什么需要縮放問題點積隨維度變大而發(fā)散先看一個簡單例子2 維向量 q [0.5, 0.5], k [0.5, 0.5] q·k 0.25 0.25 0.5 4 維向量 q [0.5, 0.5, 0.5, 0.5], k [0.5, 0.5, 0.5, 0.5] q·k 0.25×4 1.0 64 維向量BERT 每個注意力頭的維度 q [0.5, 0.5, ..., 0.5], k [0.5, 0.5, ..., 0.5] q·k 0.25×64 16.0維度越大點積越大??焖倩仡櫡讲詈蜆?biāo)準(zhǔn)差方差衡量一組數(shù)據(jù)有多分散。算法每個數(shù)減去平均值平方再求平均。數(shù)據(jù)[1, 2, 3, 4, 5]平均值 3 方差 ((1-3)2 (2-3)2 (3-3)2 (4-3)2 (5-3)2) / 5 (4 1 0 1 4) / 5 2 標(biāo)準(zhǔn)差 √方差 √2 ≈ 1.41方差大→ 數(shù)據(jù)很散比如 [1, 100]方差很大方差小→ 數(shù)據(jù)很集中比如 [49, 50, 51]方差很小標(biāo)準(zhǔn)差→ 方差的平方根和原始數(shù)據(jù)同單位更直觀雖然實際向量不是全 0.5但統(tǒng)計上如果 q 和 k 是獨立同分布隨機變量均值為 0方差為 1則點積的均值為 0方差為 d_kd_k 就是向量的維度BERT 每個注意力頭是 64。維度 d_k 越大分?jǐn)?shù)的分布越散。這就是所謂的方差膨脹問題——注意力分?jǐn)?shù)的方差正比于向量維度 d_k。為什么分?jǐn)?shù)太散是問題——梯度消失來比較有縮放和沒縮放的效果假設(shè)一組分?jǐn)?shù)[10, 11, 9]d_k64 時可能的量級 Softmax (無縮放) e1? ≈ 22026, e11 ≈ 59874, e? ≈ 8103 總和 90003 P [0.245, 0.665, 0.090] ← 基本正常 假設(shè)分?jǐn)?shù)[40, 44, 36]d_k1024 時可能的量級 Softmax (無縮放) e?? ≈ 2.35e17, e?? ≈ 1.29e19, e3? ≈ 4.31e15 總和 1.31e19 P [0.018, 0.982, 0.0003] ← 最大值幾乎占據(jù)全部概率當(dāng) softmax 輸出極度接近 one-hot 時最大值位置以外的梯度 ≈ 0被壓制的 token 對應(yīng)的梯度在反向傳播中幾乎為零模型學(xué)不動了這個問題的數(shù)學(xué)根源是指數(shù)函數(shù) exp(x) 對大的輸入非常敏感——exp(44) / exp(36) ≈ e? ≈ 2980小的差距被指數(shù)函數(shù)急劇放大。解法除以 √d_kBERT base hidden_size 768 num_heads 12 d_k hidden_size ÷ num_heads 768 ÷ 12 64 √d_k √64 8 縮放公式scaled_score raw_score ÷ √d_k除以 √d_k 后分?jǐn)?shù)的方差穩(wěn)定在 1 左右softmax 的梯度始終處于甜區(qū)??s放要解決什么問題不縮放時分?jǐn)?shù)會很大 q·k 64個數(shù)相加每個約±1 → 總和可能達(dá)到 ±20 甚至更大 大分?jǐn)?shù)對 softmax 的影響 輸入 [20, -10, 5] softmax → [0.9999, 0.0000, 0.0001] ← 極端分布接近 one-hot 問題這種極端分布下梯度幾乎為 0 假設(shè)正確答案是第1個 梯度 [0.9999-1, 0.0000-0, 0.0001-0] ≈ [-0.0001, 0, 0] → 模型幾乎學(xué)不到東西縮放后的效果除以 √64 8 后分?jǐn)?shù)變小了 原分?jǐn)?shù) [20, -10, 5] → 縮放后 [2.5, -1.25, 0.625] 縮放后 softmax 的輸出 [0.76, 0.02, 0.22] ← 有區(qū)分度但不極端 梯度正常了 梯度 [0.76-1, 0.02-0, 0.22-0] [-0.24, 0.02, 0.22] → 模型能正常學(xué)習(xí)總結(jié)縮放讓 softmax 的輸入保持在合理范圍避免輸出極端化從而保證梯度能正常傳播。二、Softmax把分?jǐn)?shù)變成概率Softmax 公式與直覺exp(x?) softmax(x?) ──────────────── Σ? exp(x?)兩個關(guān)鍵操作操作作用直觀理解exp指數(shù)函數(shù)放大分?jǐn)?shù)差距好的更好、差的更差歸一化除以總和保證權(quán)重之和為 1形成競爭性概率分布為什么不用簡單歸一化除以最大值簡單歸一化允許負(fù)值且不是概率分布。Softmax 保證所有輸出為正且和為 1——這是概率的基本要求。完整演算以喜為例以喜這行為例展示完整的縮放 Softmax 過程第1步原始分?jǐn)?shù)來自 Q×K? [15.3, 22.7, 18.2, 2.1, 1.8, 3.2, 2.9, 5.6, 4.1] 對應(yīng) 我 喜 歡 人 工 智 能 CLS SEP 第2步縮放除以 √d_k 8 [1.9125, 2.8375, 2.275, 0.2625, 0.225, 0.4, 0.3625, 0.7, 0.5125] 第3步對每個數(shù)求 exp e^1.91256.77, e^2.837517.07, e^2.2759.73, e^0.26251.30, e^0.2251.25, e^0.41.49, e^0.36251.44, e^0.72.01, e^0.51251.67 第4步分母 所有 exp 之和 42.73 第5步每個 exp ÷ 分母得到概率權(quán)重 6.77/42.730.16 ← 我16% 的注意力 17.07/42.730.40 ← 喜40%自己最高 9.73/42.730.23 ← 歡23%組成喜歡 1.30/42.730.03 1.25/42.730.03 1.49/42.730.03 1.44/42.730.03 2.01/42.730.05 1.67/42.730.04 ──── 合計 1.00 ?Softmax 效果深度分析縮放前分?jǐn)?shù)15.3 22.7 18.2 2.1 1.8 3.2 2.9 5.6 4.1 縮放后分?jǐn)?shù)1.91 2.84 2.28 0.26 0.22 0.40 0.36 0.70 0.51 Softmax概率0.16 0.40 0.23 0.03 0.03 0.03 0.03 0.05 0.04 效果對比 - 最高分(22.7) 在 softmax 后占比 40% ← 強者恒強 - 次高分(18.2) 在 softmax 后占比 23% ← 第二強 - 低分(1.8) 在 softmax 后占比 3% ← 弱者愈弱 - 分?jǐn)?shù)差別被非線性放大了縮放對 softmax 的影響實驗importnumpyasnpdefsoftmax(x):e_xnp.exp(x-np.max(x))# 數(shù)值穩(wěn)定版returne_x/e_x.sum()scoresnp.array([15.3,22.7,18.2,2.1,1.8])# 不縮放print(不縮放:,softmax(scores))# [0.001, 0.997, 0.002, ≈0, ≈0]# 縮放÷8print(縮放:,softmax(scores/8))# [0.187, 0.473, 0.270, 0.036, 0.035]不縮放的 softmax 幾乎退化為 argmaxhard attention梯度消失。縮放后的 softmax 保留了更豐富的權(quán)重分布soft attention梯度良好。三、加權(quán)求和融合信息計算過程有了注意力權(quán)重概率最后一步就是用這些權(quán)重去加權(quán)求和所有字的 Value 向量喜的新向量 0.16 × V(我) 0.40 × V(喜) 0.23 × V(歡) 0.03 × V(人) 0.03 × V(工) 0.03 × V(智) 0.03 × V(能) 0.05 × V(CLS) 0.04 × V(SEP)展開前幾步只展示前 3 維真實是 768 維V?(我) [ 0.31, -0.12, 0.45, ...] × 0.16 → [ 0.050, -0.019, 0.072, ...] V?(喜) [ 0.42, 0.15, -0.08, ...] × 0.40 → [ 0.168, 0.060, -0.032, ...] V?(歡) [ 0.05, 0.28, -0.18, ...] × 0.23 → [ 0.012, 0.064, -0.041, ...] ... 全部9個加起來 ... 結(jié)果喜的新向量 [0.215, 0.142, -0.018, ...] (768維)代碼實現(xiàn)# 假設(shè)已經(jīng)算好了 attention_weights [1, 9, 9] 和 V [1, 9, 768]attn_outputtorch.matmul(attention_weights,V)print(attn_output.shape)# torch.Size([1, 9, 768])# 第2個字喜的新向量print(attn_output[0,1,:5])融合后的效果加權(quán)求和前喜的原始向量 [0.862, 0.525, 0.043, ...] ← 只有喜自己的信息 加權(quán)求和后喜的新向量 [0.215, 0.142, -0.018, ...] ← 已融合了我和歡的信息這個新向量的關(guān)鍵屬性信息來源權(quán)重效果歡的信息23%喜歡整體含義被編碼 ?我的信息16%誰喜歡也被編碼了 ?“人、工、智、能”各 ~3%本字不太需要賓語信息 ?喜自身40%保留自身語義 ?一個類比集體智慧自注意力就像一個團(tuán)隊討論 每個成員字先寫下自己的想法V 再告訴別人我擅長什么K 同時提出我需要什么Q。 然后大家投票決定誰的發(fā)言對我最有價值 票數(shù) softmax(Q×K/√d) 最后每個人綜合所有人的意見更新自己的認(rèn)識 新想法 加權(quán)求和(所有人的意見) 這個過程在每一層重復(fù)一次。完整的注意力公式三步合在一起就是論文里的那個經(jīng)典公式Attention(Q, K, V) softmax(Q × K? / √d_k) × V 拆開看 ① Q × K? → 原始注意力分?jǐn)?shù) [9, 9] ② ÷ √d_k → 縮放方差穩(wěn)定到1 ③ softmax → 變成概率分布每行和為1 ④ × V → 加權(quán)求和輸出 [9, 768]代碼實現(xiàn)完整的單頭自注意力importtorchimporttorch.nnasnnimportmathclassSingleHeadAttention(nn.Module):完整的單頭自注意力def__init__(self,hidden_size768):super().__init__()self.W_Qnn.Linear(hidden_size,hidden_size)self.W_Knn.Linear(hidden_size,hidden_size)self.W_Vnn.Linear(hidden_size,hidden_size)self.d_khidden_size# 每個頭的維度defforward(self,x):Qself.W_Q(x)# [B, L, 768]Kself.W_K(x)# [B, L, 768]Vself.W_V(x)# [B, L, 768]# ① Q × K? → 注意力分?jǐn)?shù)scorestorch.matmul(Q,K.transpose(-2,-1))# [B, L, L]# ② 縮放scoresscores/math.sqrt(self.d_k)# ③ Softmax → 權(quán)重attention_weightstorch.softmax(scores,dim-1)# [B, L, L]# ④ 加權(quán)求和 Voutputtorch.matmul(attention_weights,V)# [B, L, 768]returnoutput,attention_weights# 模擬 我喜歡人工智能 (9個token)xtorch.randn(1,9,768)attnSingleHeadAttention()output,weightsattn(x)print(f輸出形狀:{output.shape})# [1, 9, 768]print(f權(quán)重形狀:{weights.shape})# [1, 9, 9]print(f權(quán)重每行之和:{weights[0,2].sum()})# ≈ 1.0輸出輸出形狀: torch.Size([1, 9, 768]) 權(quán)重形狀: torch.Size([1, 9, 9]) 權(quán)重每行之和: tensor(1.0000)關(guān)鍵結(jié)果上下文感知對比一下加權(quán)求和前后的變化喜 的原始向量Embedding 位置編碼后 [0.862, 0.525, 0.043, ...] ← 只有喜自己的信息 喜 經(jīng)過自注意力后的新向量 [0.215, 0.142, -0.018, ...] ← 融合了我(16%)和歡(23%)的信息這個新向量已經(jīng)不再是孤立的喜——它包含了我主語和歡搭配詞的語義信息。這就是上下文感知的含義同一個字在不同句子里經(jīng)過自注意力后會得到不同的向量。參考資源[1] Vaswani et al., “Attention Is All You Need”, 2017. NeurIPS 2017 — 縮放點積注意力的原始論文[2] Jay Alammar, “The Illustrated Transformer”, 2018. Blog — Self-Attention 計算流程的可視化講解[3] Stack Overflow, “Why do we scale by sqrt(d_k) in attention?”, 2020. Link — 關(guān)于縮放因子的討論本篇小結(jié)本篇完成了自注意力的后半程縮放 → Softmax → 加權(quán)求和。步驟做了什么為什么縮放÷√d_k把分?jǐn)?shù)除以 √648防止方差膨脹導(dǎo)致梯度消失Softmax把分?jǐn)?shù)變成概率和為1形成競爭性權(quán)重分布加權(quán)求和×V按權(quán)重融合所有字的信息輸出包含上下文的新向量完整公式Attention(Q, K, V) softmax(QK?/√d_k) × V 輸入 X → Q,K,V → Q×K? → ÷√d_k → softmax → ×V → 輸出 上一篇 本篇三步 上下文感知的向量下一篇我們深入解讀注意力矩陣的語言模式解釋為什么 Q、K、V 必須是三個獨立矩陣并用完整代碼實現(xiàn)自注意力親眼見證上下文感知如何誕生。思考題題1為什么 Softmax 前要除以 √d_k題2Softmax 的兩個關(guān)鍵操作分別是什么題3加權(quán)求和后喜的新向量里包含了誰的信息答案見文末 → 參考答案參考答案題1為什么 Softmax 前要除以 √d_k因為點積的方差正比于維度 d_k。不縮放的話分?jǐn)?shù)范圍隨維度增大而膨脹Softmax 輸出會退化為接近 one-hot 的分布導(dǎo)致梯度消失模型無法學(xué)習(xí)。題2Softmax 的兩個關(guān)鍵操作分別是什么exp指數(shù)函數(shù)放大分?jǐn)?shù)差距讓好的更好、差的更差歸一化除以總和保證所有權(quán)重為正且和為 1形成概率分布。題3加權(quán)求和后喜的新向量里包含了誰的信息主要包含我16%和歡23%的信息——因為喜歡是一個詞我是主語。人、工、智、能各只占約3%因為和喜語義關(guān)系較遠(yuǎn)。

相關(guān)新聞

聯(lián)輝科 LTK52206 6.0-18.5V/2x25W D類音頻功放 EQA-16 技術(shù)解析

聯(lián)輝科 LTK52206 6.0-18.5V/2x25W D類音頻功放 EQA-16 技術(shù)解析

在各類藍(lán)牙音箱、智能音箱、電視機、監(jiān)視器以及家庭娛樂和專業(yè)音頻設(shè)備中,對音頻功率放大器的要求日益提高,不僅需要足夠大的輸出功率和優(yōu)異的音質(zhì),還要具備低EMI、低底噪以及完善的保護(hù)功能,同時封裝尺寸需盡可能緊湊以適應(yīng)便攜設(shè)…

2026/8/2 5:10:42 閱讀更多
若依框架跨域問題解決方案與實戰(zhàn)配置

若依框架跨域問題解決方案與實戰(zhàn)配置

1. 若依框架跨域問題全景解析作為國內(nèi)主流的企業(yè)級快速開發(fā)框架,若依(Ruoyi)在實際部署中經(jīng)常面臨跨域訪問的挑戰(zhàn)。最近在技術(shù)社區(qū)看到不少開發(fā)者反饋:"前后端分離模式下,明明按照文檔配置了CORS,為什…

2026/8/1 1:29:36 閱讀更多
springboot 肉牛育肥場管理系統(tǒng)

springboot 肉牛育肥場管理系統(tǒng)

一、關(guān)鍵詞肉牛育肥場管理系統(tǒng)、肉牛育肥場、肉牛育肥場信息管理、肉牛育肥場后臺管理二、作品包含源碼數(shù)據(jù)庫萬字設(shè)計文檔全套環(huán)境和工具資源本地部署教程三、項目技術(shù)前端技術(shù): Html、Css、Js、Vue3.5、Element-Plus后端技術(shù):Java、SpringBoot3.3.0、M…

2026/8/2 7:55:17 閱讀更多
GO應(yīng)用知識點——channel

GO應(yīng)用知識點——channel

深入理解 Go 語言中的 Channel 在 Go 語言中,goroutine 負(fù)責(zé)并發(fā)執(zhí)行任務(wù),而 channel 負(fù)責(zé)在 goroutine 之間傳遞數(shù)據(jù)和協(xié)調(diào)執(zhí)行順序。 如果把 goroutine 理解為同時工作的多個執(zhí)行單元,那么 channel 就像連接這些執(zhí)行單元的管道&#xff1…

2026/8/2 7:55:17 閱讀更多
Python進(jìn)階(12):網(wǎng)絡(luò)爬蟲Request與Response

Python進(jìn)階(12):網(wǎng)絡(luò)爬蟲Request與Response

網(wǎng)絡(luò)爬蟲:網(wǎng)絡(luò)爬蟲(又被稱作網(wǎng)絡(luò)蜘蛛、網(wǎng)絡(luò)機器人,在某社區(qū)中經(jīng)常被稱為網(wǎng)頁追逐者),可以按照指定的規(guī)則(網(wǎng)絡(luò)爬蟲的算法)自動瀏覽或抓取網(wǎng)絡(luò)中的信息,通過Python可以很輕松地編寫爬蟲程序或者是腳本。 在生活中網(wǎng)絡(luò)爬蟲經(jīng)常出現(xiàn)&…

2026/8/2 7:55:17 閱讀更多
第6課:字典與集合

第6課:字典與集合

06_dictionaries_and_sets.py 一、課程目標(biāo) 序號 學(xué)習(xí)目標(biāo) ① 掌握字典的創(chuàng)建、訪問和修改操作 ② 熟練掌握字典的常用方法(keys/values/items/get等) ③ 掌握字典的遍歷方式 ④ 理解字典推導(dǎo)式的使用 ⑤ 掌握集合的創(chuàng)建和基本運算(并集、交集、差集) ⑥ 熟練掌握集合的常用…

2026/8/2 7:55:17 閱讀更多
單片機/C/C++八股:(三十一)static 關(guān)鍵字的作用

單片機/C/C++八股:(三十一)static 關(guān)鍵字的作用

上一篇下一篇 static 關(guān)鍵字的作用?static:[adj] 靜態(tài)的 總結(jié)在最后面! 可直接看static 變量稱為靜態(tài)存儲類型的變量,所謂靜態(tài)就是變量在程序運行期間一直存在。 static 變量的特點如下: 在內(nèi)存中以固定地址存放&#…

2026/8/2 7:45:16 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號分配電路板。該型號(0100-02186)的核心特點如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機,適用于自動化設(shè)備及通用機械驅(qū)動。該型號(FFMN-32L-10-T0 40AX)的核心特點如下:三相交流異步電動機。額定…

2026/8/2 2:52:49 閱讀更多