偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

揭秘大模型的魔法:實(shí)現(xiàn)帶有可訓(xùn)練權(quán)重的多頭自注意力機(jī)制

人工智能
今天我想把這塊魔術(shù)板拆開來(lái)給你看個(gè)究竟:如何把單頭注意力改成多頭注意力,讓每個(gè)頭能學(xué)會(huì)自己的注意力分布。

大家好,我是寫代碼的中年人!

自注意力(Self-Attention)是大模型里最常讓人“眼花”的魔術(shù)道具:看起來(lái)只是一堆矩陣乘法和 softmax,可是組合起來(lái)就能學(xué)到“句子里誰(shuí)重要、誰(shuí)次要”的規(guī)則,甚至能學(xué)到某些頭只盯標(biāo)點(diǎn)、某些頭專盯主謂關(guān)系。

今天我想把這塊魔術(shù)板拆開來(lái)給你看個(gè)究竟:如何把單頭注意力改成多頭注意力,讓每個(gè)頭能學(xué)會(huì)自己的注意力分布。

01、回顧單頭自注意力機(jī)制

假設(shè)你在開會(huì),桌上有一堆文件,你想找跟“項(xiàng)目進(jìn)度”相關(guān)的內(nèi)容。

你心里有個(gè)問(wèn)題(Query):“項(xiàng)目進(jìn)度在哪兒?

”每份文件上有個(gè)標(biāo)簽(Key),寫著它的主題,比如“預(yù)算”“進(jìn)度”“人員”。

你會(huì)先挑出標(biāo)簽里跟“進(jìn)度”相關(guān)的文件(匹配),然后重點(diǎn)看這些文件的內(nèi)容(Value),最后把這些內(nèi)容總結(jié)成你的理解。

自注意力就像是給每個(gè)詞都做了一次這樣的“信息篩選和總結(jié)”,讓每個(gè)詞都能根據(jù)上下文更好地表達(dá)自己。

02、理解多頭自注意力機(jī)制

繼續(xù)用開會(huì)的場(chǎng)景:

桌上還是那堆文件(代表句子里的詞),但現(xiàn)在你不是一個(gè)人干活,而是找了3個(gè)助手(假設(shè)3頭注意力)。每個(gè)助手都有自己的“專長(zhǎng)”,他們會(huì)從不同的角度問(wèn)問(wèn)題、匹配標(biāo)簽和提取內(nèi)容。

每個(gè)頭獨(dú)立工作(多視角篩選):

頭1(進(jìn)度專家):他的問(wèn)題(Query)是“進(jìn)度怎么樣?”他只關(guān)注標(biāo)簽里跟“進(jìn)度”“時(shí)間表”相關(guān)的文件,忽略其他。挑出匹配的文件后,他總結(jié)出一份“進(jìn)度報(bào)告”。

頭2(預(yù)算專家):他的問(wèn)題是“預(yù)算超支了嗎?”他匹配標(biāo)簽里的“預(yù)算”“開銷”,然后從那些文件的內(nèi)容里提煉“預(yù)算分析”。

頭3(風(fēng)險(xiǎn)專家):?jiǎn)栴}是“有什么隱患?”他找“風(fēng)險(xiǎn)”“問(wèn)題”相關(guān)的標(biāo)簽,輸出一份“風(fēng)險(xiǎn)評(píng)估”。

每個(gè)頭都像單頭注意力一樣:生成自己的問(wèn)題、鑰匙和內(nèi)容,計(jì)算匹配度,加權(quán)總結(jié)。但他們用的“眼鏡”不同(在機(jī)器里,這通過(guò)不同的線性變換實(shí)現(xiàn)),所以捕捉的信息側(cè)重點(diǎn)不一樣。

把多頭結(jié)果合起來(lái)(綜合決策):

一旦每個(gè)頭都給出自己的總結(jié),你就把這些報(bào)告拼在一起(或簡(jiǎn)單平均一下),形成一份完整的“項(xiàng)目概覽”?,F(xiàn)在,你的理解不只是“進(jìn)度”,而是進(jìn)度+預(yù)算+風(fēng)險(xiǎn)的全方位視圖。萬(wàn)一某個(gè)頭漏了什么,其他頭能補(bǔ)上,確保沒(méi)死角。

03、用代碼實(shí)現(xiàn)多頭自注意力機(jī)制

# ONE

我們使用水滸傳的內(nèi)容進(jìn)行演示,使用前三回各 100 字的文本,并按“字”切分成模型可用的格式。

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import matplotlib.pyplot as plt
import numpy as np


plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# ======  準(zhǔn)備水滸傳真實(shí)語(yǔ)料 ======
raw_texts = [
    "話說(shuō)大宋仁宗天子在位,嘉祐三年三月三日五更三點(diǎn),天子駕坐紫宸殿,受百官朝賀。但見:祥雲(yún)迷鳳閣,瑞氣罩龍樓。含煙御柳拂旌旗,帶露宮花迎劍戟。天香影裏,玉簪珠履聚丹墀。仙樂(lè)聲中,繡襖錦衣扶御駕。珍珠廉卷,黃金殿上現(xiàn)金輿。鳳尾扇開,白玉階前停寶輦。隱隱凈鞭三下響,層層文武兩班齊。",
    "那高俅在臨淮州,因得了赦宥罪犯,思鄉(xiāng)要回東京。這柳世權(quán)卻和東京城里金梁橋下開生藥鋪的董將士是親戚,寫了一封書札,收拾些人事盤纏,赍發(fā)高俅回東京,投奔董將士家過(guò)活。",
    "話說(shuō)當(dāng)時(shí)史進(jìn)道:「卻怎生是好?」朱武等三個(gè)頭領(lǐng)跪下答道:「哥哥,你是乾淨(jìng)的人,休為我等連累了大郎??砂阉鱽?lái)綁縛我三個(gè),出去請(qǐng)賞,免得負(fù)累了你不好看?!?
]


# ======  按字切分 ======
def char_tokenize(text):
    return [ch for ch in text if ch.strip()]  # 去掉空格、換行


sentences = [char_tokenize(t) for t in raw_texts]


# 構(gòu)建詞表
vocab = {}
for sent in sentences:
    for ch in sent:
        if ch not in vocab:
            vocab[ch] = len(vocab)


# ======  轉(zhuǎn)成索引形式并做 padding ======
max_len = max(len(s) for s in sentences)
PAD_TOKEN = "<PAD>"
vocab[PAD_TOKEN] = len(vocab)


input_ids = []
for sent in sentences:
    ids = [vocab[ch] for ch in sent]
    # padding
    ids += [vocab[PAD_TOKEN]] * (max_len - len(ids))
    input_ids.append(ids)


input_ids = torch.tensor(input_ids)  # (batch_size, seq_len)


# ======  多頭自注意力模塊 ======
class MultiHeadSelfAttention(nn.Module):
    def __init__(self, embed_dim, num_heads, dropout=0.1):
        super().__init__()
        assert embed_dim % num_heads == 0, "embed_dim 必須能整除 num_heads"
        self.embed_dim = embed_dim
        self.num_heads = num_heads
        self.head_dim = embed_dim // num_heads


        self.q_proj = nn.Linear(embed_dim, embed_dim)
        self.k_proj = nn.Linear(embed_dim, embed_dim)
        self.v_proj = nn.Linear(embed_dim, embed_dim)
        self.out_proj = nn.Linear(embed_dim, embed_dim)


        self.dropout = dropout
        self.last_attn_weights = None  # 保存最后一次注意力權(quán)重 (batch, heads, seq, seq)


    def forward(self, x):
        B, T, C = x.size()


        Q = self.q_proj(x).view(B, T, self.num_heads, self.head_dim).transpose(1, 2)
        K = self.k_proj(x).view(B, T, self.num_heads, self.head_dim).transpose(1, 2)
        V = self.v_proj(x).view(B, T, self.num_heads, self.head_dim).transpose(1, 2)


        scores = torch.matmul(Q, K.transpose(-2, -1)) / (self.head_dim ** 0.5)
        attn_weights = F.softmax(scores, dim=-1)
        attn_weights = F.dropout(attn_weights, p=self.dropout, training=self.training)


        self.last_attn_weights = attn_weights.detach()  # (B, heads, T, T)


        out = torch.matmul(attn_weights, V)
        out = out.transpose(1, 2).contiguous().view(B, T, C)
        out = self.out_proj(out)
        return out


# ======  模型訓(xùn)練 ======
embed_dim = 32
num_heads = 4
vocab_size = len(vocab)


embedding = nn.Embedding(vocab_size, embed_dim)
model = MultiHeadSelfAttention(embed_dim, num_heads)
criterion = nn.MSELoss()
optimizer = optim.Adam(list(model.parameters()) + list(embedding.parameters()), lr=1e-3)


epochs = 200
for epoch in range(epochs):
    model.train()
    x = embedding(input_ids)
    target = x.clone()


    out = model(x)
    loss = criterion(out, target)


    optimizer.zero_grad()
    loss.backward()
    optimizer.step()


    if (epoch + 1) % 20 == 0:
        print(f"Epoch {epoch+1:3d}, Loss: {loss.item():.6f}")


# ======  可視化注意力熱圖 ======
for idx, sent in enumerate(sentences):
    attn = model.last_attn_weights[idx]  # (heads, seq, seq)
    sent_len = len(sent)
    for head in range(num_heads):
        plt.figure(figsize=(8, 6))
        plt.imshow(attn[head, :sent_len, :sent_len].numpy(), cmap='viridis')
        plt.title(f"第{idx+1}句 第{head+1}頭 注意力矩陣")
        plt.xticks(ticks=np.arange(sent_len), labels=sent, rotatinotallow=90)
        plt.yticks(ticks=np.arange(sent_len), labels=sent)
        plt.xlabel("Key (字)")
        plt.ylabel("Query (字)")
        plt.colorbar(label="Attention Strength")
        for i in range(sent_len):
            for j in range(sent_len):
                plt.text(j, i, f"{attn[head, i, j]:.2f}", ha="center", va="center", color="white", fnotallow=6)
        plt.tight_layout()
        plt.savefig(f"attention_sentence{idx+1}_head{head+1}.png")
        plt.close()


print("注意力熱圖已保存。")

這些多頭自注意力(Multi-Head Self-Attention)的熱圖,其實(shí)是一個(gè)“誰(shuí)在關(guān)注誰(shuí)”的可視化工具,用來(lái)直觀展示模型在處理文本時(shí)的注意力分布。

熱圖上的顏色:

橫軸(Key):表示句子中被關(guān)注的字,

縱軸(Query):表示當(dāng)前在思考的字,

顏色深淺:表示注意力強(qiáng)度,越亮的地方代表這個(gè) Query 在計(jì)算時(shí)更關(guān)注這個(gè) Key。

例如,如果“宋”字在看“天”字時(shí)顏色很亮,說(shuō)明模型覺(jué)得“天”這個(gè)字對(duì)理解“宋”有重要信息。因?yàn)槭枪盼?,有時(shí)模型會(huì)捕捉到常見的修辭搭配,比如“天子”“鳳閣”,這時(shí)候相鄰的字之間注意力會(huì)很高。

為什么會(huì)有多張圖:

每一行熱圖對(duì)應(yīng)一句文本(水滸前三回的一個(gè)片段)

每句話會(huì)畫多個(gè)頭的熱圖:

多頭機(jī)制的設(shè)計(jì)就是讓不同的頭學(xué)習(xí)到不同的關(guān)注模式

舉個(gè)例子:

Head 1 可能更多關(guān)注相鄰的字(局部模式)

Head 2 可能更關(guān)注句首或特定關(guān)鍵詞(全局模式)

Head 3 可能專注某個(gè)語(yǔ)法結(jié)構(gòu)

Head 4 可能專注韻律、排比等古文特性

多頭機(jī)制就像多雙眼睛,從不同角度觀察同一句話。

舉個(gè)大家都能理解的例子:

學(xué)生(Query):舉手發(fā)言

老師(Attention):環(huán)顧四周,看看應(yīng)該關(guān)注哪個(gè)學(xué)生(Key)

不同的老師(Head)關(guān)注點(diǎn)不同:一個(gè)老師喜歡看前排學(xué)生(局部依賴)一個(gè)老師總是看坐在角落的安靜同學(xué)(遠(yuǎn)距離依賴)還有老師會(huì)特別注意那些名字里有“天”“龍”這些關(guān)鍵字的學(xué)生

(關(guān)鍵觸發(fā)詞)顏色越亮,表示老師對(duì)這個(gè)學(xué)生說(shuō)的話越感興趣。

結(jié)束語(yǔ)

回到開頭我們的問(wèn)題:多頭自注意力到底在看什么?通過(guò)水滸傳這樣真實(shí)、結(jié)構(gòu)獨(dú)特的古文片段,我們不僅看到了模型如何在字與字之間建立聯(lián)系,還直觀感受了不同“注意力頭”各自的關(guān)注模式。有人關(guān)注近鄰字,有人專注關(guān)鍵字,有人把目光投向整句的節(jié)奏與意境。

這就像課堂上不同的老師一樣——他們的視角不同,但共同構(gòu)成了對(duì)整篇文章的完整理解。這種可視化,不只是為了“看個(gè)熱鬧”,而是把模型內(nèi)部的決策過(guò)程攤開給人看,讓深度學(xué)習(xí)的“黑箱”多了一點(diǎn)可解釋性。

至此,我們用水滸的詩(shī)意古文,讓多頭自注意力的數(shù)學(xué)公式“活”了起來(lái)。接下來(lái),我們將整合所有已學(xué)過(guò)的文章,去實(shí)現(xiàn)一個(gè)生成模型。

責(zé)任編輯:龐桂玉 來(lái)源: 寫代碼的中年人
相關(guān)推薦

2025-08-04 09:31:49

2018-08-26 22:25:36

自注意力機(jī)制神經(jīng)網(wǎng)絡(luò)算法

2025-04-25 00:20:00

大模型tokenizer

2024-06-28 08:04:43

語(yǔ)言模型應(yīng)用

2024-04-03 14:31:08

大型語(yǔ)言模型PytorchGQA

2025-10-16 09:00:00

大模型

2023-05-05 13:11:16

2025-02-10 00:00:55

MHAValue向量

2024-12-09 00:00:10

2020-09-17 12:40:54

神經(jīng)網(wǎng)絡(luò)CNN機(jī)器學(xué)習(xí)

2025-07-16 10:15:51

2024-12-17 14:39:16

2024-01-02 12:50:12

數(shù)據(jù)模型

2024-12-04 09:25:00

2025-06-20 10:18:58

大模型

2024-09-19 10:07:41

2023-10-07 07:21:42

注意力模型算法

2024-10-31 10:00:39

注意力機(jī)制核心組件

2017-08-03 11:06:52

2022-03-25 11:29:04

視覺(jué)算法美團(tuán)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)