精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

揭秘大模型的魔法:RoPE(旋轉位置編碼)是怎么讓 AI 記住“前后左右”的?

人工智能
本章我們介紹RoPE的概念,為后續(xù)的模型實現(xiàn)打好基礎知識。

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

本章我們介紹RoPE的概念,為后續(xù)的模型實現(xiàn)打好基礎知識。

在大模型中,怎么知道一個詞在句子里是第幾個?這就像是:“你看一本書的時候,怎么知道這一句話是在第一頁還是最后一頁?”

嗯……要是沒有“位置感”,模型看到的只是一個個孤立的詞向量,就像你看一本書時只看到拆散的字母。

早期 Transformer 用的是正弦位置編碼(Sinusoidal Positional Encoding),相當于在每個單詞的向量里混入一點“坐標信號”,讓模型知道它在句子里的位置。

但這玩意有個小問題:它是直接加在詞向量上的,像在紙條上貼標簽模型能用,但對長文本、超長依賴不太友好,而且它的“旋律”是固定的,靈活性有限,后來人們發(fā)明了 RoPE(Rotary Position Embedding),中文名“旋轉位置編碼”,它干的事情很酷:不是直接給你貼標簽,而是給你旋轉一個角度。

01、什么是RoPE

比如我們在組織一場廣場舞,舞者(詞向量)站在一個圓圈上,每兩人一組。音樂響起時,每組舞者按自己的節(jié)奏旋轉:

第一組慢轉(低頻,0°、10°、20°……),第二組稍快(30°、60°、90°……),以此類推。

模型通過比較兩組舞者的相對旋轉角度(相位差),就能知道他們離得多遠,角度差越大,距離越遠。旋轉是連續(xù)的,即使新舞者加入(序列變長),他們也能按同樣規(guī)則旋轉,模型無需重新學習,就能判斷新舞者的位置。

這就是RoPE的厲害之處:通過旋轉的相位編碼位置,高效捕捉相對距離,還能適應超長序列!

02、RoPE數(shù)學公式

在自注意力里,Q(查詢向量)和 K(鍵向量)要做點積:

RoPE 的思路是:在做這個點積前,先把 Q、K 各自旋轉一下:

這里的 R(θ) 是一個二維旋轉矩陣(其實是對向量的每一對分量旋轉):

而 θ 跟位置 p 有關,比如:

α是不同維度的頻率參數(shù),就像正弦編碼那樣安排。

結果是什么?

相對位置關系自然保留:Q 和 K 的旋轉差值就是它們的相對位置

外推能力強:沒見過的長序列也能用,因為旋轉是周期性的

03、用代碼實現(xiàn)RoPE

# -*- coding: utf-8 -*-
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import jieba
import matplotlib.pyplot as plt
import numpy as np


plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字體
plt.rcParams['axes.unicode_minus'] = False


# ===== 準備《水滸傳》樣本文本 =====
text_samples = [
    """張?zhí)鞄熎盱烈撸樘菊`走妖魔。話說大宋天子仁宗皇帝在位年間,
       京師瘟疫流行,百姓多有染病。天子召張?zhí)鞄熑雽m祈禳,命洪太尉押送香火,
       不料誤開封印,放出妖魔。""",
    """王教頭私走延安府,九紋龍大鬧史家村。史進自幼好武,學成十八般武藝,
       因打死惡霸,被官府緝拿。王進教頭見勢不妙,離開東京前往延安府,
       途經(jīng)史家村。""",
    """史大郎夜走華陰縣,魯提轄拳打鎮(zhèn)關西。史進與魯達結義,路遇鎮(zhèn)關西鄭屠,
       見其欺壓婦女,魯達憤然出手,三拳打死鄭屠,遂落草為寇。"""
]


# ===== 中文分詞 =====
def tokenize_texts(text_list):
    tokenized = []
    for t in text_list:
        words = list(jieba.cut(t))
        words = [w.strip() for w in words if w.strip()]
        tokenized.append(words)
    return tokenized


sentences = tokenize_texts(text_samples)


# ===== 構建詞表 =====
vocab = {}
for sent in sentences:
    for w in sent:
        if w not in vocab:
            vocab[w] = len(vocab)
vocab["<PAD>"] = len(vocab)


vocab_size = len(vocab)
embed_dim = 32
seq_len = max(len(s) for s in sentences)


# 將句子轉為索引,并pad
def encode_sentences(sentences, vocab, seq_len):
    data = []
    for s in sentences:
        idxs = [vocab[w] for w in s]
        if len(idxs) < seq_len:
            idxs += [vocab["<PAD>"]] * (seq_len - len(idxs))
        data.append(idxs)
    return torch.tensor(data)


input_ids = encode_sentences(sentences, vocab, seq_len)


# ===== RoPE實現(xiàn) =====
def apply_rope(x):
    """
    支持輸入維度:
      - (B, T, D)  或
      - (B, T, H, D)
    返回相同形狀,且對最后一維做 RoPE(要求 D 為偶數(shù))
    """
    orig_shape = x.shape
    if len(orig_shape) == 3:
        # (B, T, D) -> 轉為 (B, T, 1, D) 方便統(tǒng)一處理
        x = x.unsqueeze(2)
        squeezed = True
    else:
        squeezed = False
        # 形狀為 (B, T, H, D)
    # 現(xiàn)在 x.shape = (B, T, H, D)
    bsz, seqlen, nheads, head_dim = x.shape
    assert head_dim % 2 == 0, "head_dim must be even for RoPE"


    device = x.device
    dtype = x.dtype


    half = head_dim // 2
    # theta: (half,)
    theta = 10000 ** (-torch.arange(0, half, device=device, dtype=dtype) / half)  # (half,)
    # seq positions: (seqlen,)
    seq_idx = torch.arange(seqlen, device=device, dtype=dtype)  # (seqlen,)
    # freqs: (seqlen, half)
    freqs = torch.einsum('n,d->nd', seq_idx, theta)


    cos = freqs.cos().view(1, seqlen, 1, half)  # (1, T, 1, half)
    sin = freqs.sin().view(1, seqlen, 1, half)  # (1, T, 1, half)


    x1 = x[..., :half]  # (B, T, H, half)
    x2 = x[..., half:]  # (B, T, H, half)


    x_rotated = torch.cat([x1 * cos - x2 * sin,
                           x1 * sin + x2 * cos], dim=-1)  # (B, T, H, D)


    if squeezed:
        x_rotated = x_rotated.squeeze(2)  # back to (B, T, D)


    return x_rotated




# ===== 多頭注意力 with RoPE =====
class MultiHeadSelfAttentionRoPE(nn.Module):
    def __init__(self, embed_dim, num_heads, dropout=0.1):
        super().__init__()
        self.embed_dim = embed_dim
        self.num_heads = num_heads
        self.head_dim = embed_dim // num_heads
        self.dropout = dropout


        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.last_attn_weights = None


    def forward(self, x):
        B, T, C = x.size()
        q = self.q_proj(x).view(B, T, self.num_heads, self.head_dim)
        k = self.k_proj(x).view(B, T, self.num_heads, self.head_dim)
        v = self.v_proj(x).view(B, T, self.num_heads, self.head_dim)


        # 應用 RoPE
        q = apply_rope(q)
        k = apply_rope(k)


        # 注意力計算
        attn_scores = torch.einsum('bthd,bshd->bhts', q, k) / (self.head_dim ** 0.5)
        attn_weights = F.softmax(attn_scores, dim=-1)
        attn_weights = F.dropout(attn_weights, p=self.dropout, training=self.training)
        self.last_attn_weights = attn_weights.detach()


        out = torch.einsum('bhts,bshd->bthd', attn_weights, v)
        out = out.reshape(B, T, C)
        return self.out_proj(out)


# ===== 模型訓練 =====
embedding = nn.Embedding(vocab_size, embed_dim)
model = MultiHeadSelfAttentionRoPE(embed_dim, num_heads=4, dropout=0.1)
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) % 50 == 0:
        print(f"Epoch {epoch+1}, Loss: {loss.item():.6f}")


# ===== 注意力熱圖可視化 =====
def plot_attention(attn, sentence_tokens, filename):
    heads = attn.shape[0]
    fig, axes = plt.subplots(1, heads, figsize=(4*heads, 4))
    if heads == 1:
        axes = [axes]
    for h in range(heads):
        ax = axes[h]
        attn_head = attn[h].numpy()
        im = ax.imshow(attn_head, cmap='viridis')
        ax.set_xticks(np.arange(len(sentence_tokens)))
        ax.set_yticks(np.arange(len(sentence_tokens)))
        ax.set_xticklabels(sentence_tokens, rotatinotallow=90)
        ax.set_yticklabels(sentence_tokens)
        ax.set_title(f"Head {h+1}")
        fig.colorbar(im, ax=ax)
    plt.tight_layout()
    plt.savefig(filename)
    plt.close()


model.eval()
with torch.no_grad():
    x = embedding(input_ids)
    _ = model(x)
    attn_weights = model.last_attn_weights  # (batch, heads, seq, seq)


    for i, tokens in enumerate(sentences):
        attn = attn_weights[i]
        plot_attention(attn.cpu(), tokens, f"rope_attention_sentence{i+1}.png")


print("RoPE多頭注意力熱圖已生成,文件名為 rope_attention_sentenceX.png")

結束語

經(jīng)過這次實戰(zhàn),我們不僅從《水滸傳》的古文中“偷”來了一點文學氣息,還把它喂進了現(xiàn)代的多頭自注意力網(wǎng)絡里,加上 RoPE 旋轉位置編碼,讓模型在捕捉長距離依賴關系時不再“迷路”。

通過可視化注意力熱圖,我們能直觀看到詞與詞之間的微妙聯(lián)系,就像在顯微鏡下觀察一場無聲的對話。這一切的意義,不僅僅是跑通了一段代碼,更是把理論、實現(xiàn)與效果驗證串成了一條完整的鏈條。

接下來,我們繼續(xù)探索更多高級技巧!技術的世界沒有終點,只有下一段旅程。

責任編輯:龐桂玉 來源: 寫代碼的中年人
相關推薦

2024-04-01 14:18:36

大語言模型自然語言處理

2025-04-17 09:00:00

2025-04-25 00:20:00

大模型tokenizer

2025-06-20 10:18:58

大模型

2025-01-14 14:54:57

2024-10-10 08:33:06

2025-10-24 10:34:55

2025-08-04 09:31:49

2025-08-11 06:17:54

2025-05-09 08:19:00

2024-08-07 09:30:00

2025-07-03 04:00:00

2024-06-19 16:11:22

2025-03-27 10:15:39

2023-05-10 14:40:40

AI模型算力

2025-07-17 09:47:07

2025-05-29 10:32:32

2018-11-21 14:54:56

2021-05-06 09:43:45

AI 模型人工智能
點贊
收藏

51CTO技術棧公眾號

成人综合视频在线| 国产精品一区专区欧美日韩| 亚洲色图欧美另类| 好久没做在线观看| 99久久99久久精品免费观看 | 午夜一区二区三区视频| 精品在线不卡| 天堂av免费在线观看| 亚洲精品97| 亚洲精品美女在线观看播放| 热久久精品免费视频| 国产盗摄在线观看| 97久久超碰精品国产| 国产欧美va欧美va香蕉在线| 国产亚洲精品久久777777| 欧美**字幕| 日韩欧美一区二区久久婷婷| 欧美韩国日本在线| 成人影院在线观看| 国产偷国产偷亚洲高清人白洁| 亚洲一区二区自拍| 亚洲天堂男人av| 亚洲成人三区| 亚洲人成电影网| 麻豆网站免费观看| 中文字幕日本一区二区| 亚洲国产成人高清精品| 亚洲国内在线| 天堂影院在线| 国产精品99久久久久久有的能看 | 久草视频免费在线播放| 成人3d动漫在线观看| 亚洲丁香婷深爱综合| 九九九九九国产| 欧美日韩123区| 亚洲一级二级在线| 国产av不卡一区二区| 韩国三级在线观看久| 成人aa视频在线观看| 91亚洲精品在线| 一区二区视频网站| 久久久久久亚洲精品杨幂换脸| 欧美激情精品久久久久久免费印度| 欧美自拍偷拍网| 国产精品片aa在线观看| 亚洲精品乱码久久久久久金桔影视| 亚洲精品永久视频| 久久女人天堂| 欧美综合色免费| 免费日韩中文字幕| 蜜桃视频www网站在线观看| 一区二区三区四区视频精品免费 | 国产成人ay| 亚洲精品xxx| 国产麻豆剧传媒精品国产av| 亚洲精品一区在线| 欧美一卡二卡三卡| 亚洲一二区在线观看| 麻豆久久久久| 欧美精品xxxxbbbb| 亚洲免费成人在线视频| 亚洲ww精品| 91精品在线麻豆| 涩多多在线观看| 精品国产亚洲一区二区在线观看 | 欧一区二区三区| 日韩一区二区三区电影在线观看 | 一道精品一区二区三区| 福利在线播放| 欧美国产视频在线| 亚洲精品乱码视频| 日本欧美在线视频免费观看| 国产精品国产三级国产普通话三级| 视频一区免费观看| 午夜伦全在线观看| 亚洲视频一区在线| 免费的一级黄色片| 91色在线看| 狠狠色噜噜狠狠狠狠97| 黄色三级视频片| 91在线成人| 欧美一区二区私人影院日本| 欧美日韩一区二区区| 中文字幕一区日韩精品| 亚洲精品电影网| 摸摸摸bbb毛毛毛片| 欧美日韩国产在线观看网站| 中文字幕日韩有码| 无码人妻精品一区二区三区夜夜嗨 | 欧美人xxxx| 中文字幕亚洲日本| 欧美五码在线| 最近2019中文字幕mv免费看| 99热精品免费| 亚洲视频播放| 国产欧美久久久久久| 性生活黄色大片| 久久这里只精品最新地址| 亚欧精品在线| 日本精品600av| 欧美日韩激情网| 最新天堂在线视频| 欧美大片网址| 日韩三级影视基地| 国产成人在线免费视频| 毛片av一区二区| 国产一区在线观| 77导航福利在线| 午夜精品一区二区三区电影天堂| www.色就是色| 白嫩白嫩国产精品| 色999日韩欧美国产| 日本一级淫片免费放| 蜜桃一区二区三区在线| 国产区一区二区| 亚洲s色大片| 狠狠躁夜夜躁人人爽天天天天97| 国产高清999| 国产免费久久| 亚州欧美日韩中文视频| 国产又色又爽又黄又免费| 91丝袜呻吟高潮美腿白嫩在线观看| 一区二区三区的久久的视频| 成人小电影网站| 欧美成人一区二区三区片免费 | 久久综合88中文色鬼| 天码人妻一区二区三区在线看| 国产美女精品一区二区三区| 日韩福利影院| 色老头在线一区二区三区| 日韩一二在线观看| 中文字幕求饶的少妇| 老司机免费视频久久| 精品国产乱码久久久久久108| 国产婷婷视频在线| 欧美三级蜜桃2在线观看| 人人妻人人澡人人爽人人精品| 欧美精品综合| 国产在线精品成人一区二区三区| 国产中文字幕在线看| 天天免费综合色| 精品少妇人妻av一区二区三区| 91精品啪在线观看国产81旧版| 国产精品美女999| 久久这里精品| 色综合天天综合网天天看片| 国产精品入口麻豆| 在线成人av| 成人资源视频网站免费| 伊人在我在线看导航| 在线综合亚洲欧美在线视频| a一级免费视频| 美女网站色91| 在线观看日韩片| 日本午夜精品久久久久| 色吧影院999| 亚洲图片小说视频| 国产精品私人影院| 五月婷婷丁香综合网| 第四色成人网| 国产欧美韩国高清| 成人欧美在线| 精品国产免费一区二区三区四区| 九九热这里有精品视频| 成人一区二区视频| 俄罗斯av网站| 免费av一区二区三区四区| 欧美一级黄色网| 邻居大乳一区二区三区| 在线观看免费亚洲| 五月天免费网站| 国产真实乱子伦精品视频| 400部精品国偷自产在线观看| 国产高清视频一区二区| 欧美第一淫aaasss性| 欧美一区二区三区激情| 狠狠做深爱婷婷久久综合一区| 国产精品成人一区二区三区电影毛片 | 中文字幕免费精品一区| 91麻豆成人精品国产免费网站| 亚洲色图在线播放| 极品白嫩的小少妇| 久久先锋资源| 一区不卡字幕| 4438全国亚洲精品观看视频| 8x海外华人永久免费日韩内陆视频| 欧美一区二区三区少妇| 欧美日韩国产天堂| 久久久综合久久| 久久中文娱乐网| 91 视频免费观看| 亚洲精品在线二区| 亚洲成人午夜在线| 91久久偷偷做嫩草影院电| 日本久久精品视频| 成a人片在线观看| 亚洲精品白浆高清久久久久久| 中文字幕一区二区三区四区免费看 | 国产精品秘入口| 欧美一区二区国产| 免费黄色网址在线| 亚洲免费观看视频| 免费看黄色的视频| 国产盗摄一区二区三区| 激情婷婷综合网| 国产精品激情电影| 亚洲精品一区二区毛豆| 成人爽a毛片免费啪啪红桃视频| 国产精品吊钟奶在线| 日韩专区av| 一级做a爰片久久毛片美女图片| 亚洲av无码国产精品永久一区| 色狠狠色噜噜噜综合网| 激情五月少妇a| 国产精品女上位| 国产精品一级黄片| 国产一区 二区 三区一级| 国产aaa一级片| 欧美精品九九| 亚洲永久激情精品| 免费短视频成人日韩| 97超级碰碰| 日本精品裸体写真集在线观看| 高清视频欧美一级| 久久77777| 在线国产精品播放| 五月激情丁香婷婷| 日韩欧美电影一二三| 国产精品视频在线观看免费| 91精品福利视频| 可以在线观看av的网站| 亚洲精品成人天堂一二三| 亚洲色图第四色| 91女人视频在线观看| 无码人妻一区二区三区免费n鬼沢| 美女性感视频久久| 男女污污的视频| 麻豆亚洲精品| 97国产在线播放| 最新成人av网站| 4444亚洲人成无码网在线观看| 我不卡伦不卡影院| 一级二级三级欧美| 天天做天天爱综合| 在线观看日韩羞羞视频| 色喇叭免费久久综合| 四虎影视永久免费在线观看一区二区三区| 丝袜久久网站| 精品欧美日韩| 西野翔中文久久精品字幕| 国产欧美日韩伦理| 欧美日韩导航| 国模精品一区二区三区| 国产精品久久久网站| 国产精品日韩欧美一区二区| 99久久人爽人人添人人澡| 成人午夜电影在线播放| 福利片一区二区| 国产伦精品一区二区三区照片91| 国产精品香蕉| 国产在线精品一区| 一道本一区二区三区| 欧美日韩电影一区二区| 国产一区二区三区四区五区| 亚洲精品第一区二区三区| 91日韩免费| 今天免费高清在线观看国语| 午夜精品偷拍| 国产一级做a爰片久久毛片男| 伊人成人在线| 欧美v在线观看| 美女一区二区视频| 波多野结衣电影免费观看| 成熟亚洲日本毛茸茸凸凹| 成人免费无码大片a毛片| 久久久国产精品麻豆| 激情五月深爱五月| 亚洲天堂av一区| 国产乡下妇女做爰毛片| 狠狠色狠狠色综合日日五| 中文字幕永久在线| 日韩一区二区在线观看| 人妻91麻豆一区二区三区| 亚洲精品一区久久久久久| freemovies性欧美| 美日韩精品免费视频| 黄频免费在线观看| 国产精品夜间视频香蕉| 成人动态视频| 视频一区二区在线| 欧美日韩hd| 成人一级片网站| 精品亚洲porn| 亚洲 欧美 日韩在线| 欧美国产精品专区| 久久在线视频精品| 在线观看av一区| 精品人妻伦一区二区三区久久| 亚洲国产成人精品女人久久久 | 久久天天躁日日躁| 精精国产xxxx视频在线野外| 国产欧美日韩中文| 麻豆成人入口| 中国一级大黄大黄大色毛片| 国产精品试看| av在线免费观看不卡| 久久久精品免费网站| 久久亚洲AV无码| 欧美日韩国产不卡| 色播色播色播色播色播在线| 日韩在线www| 大胆人体一区二区| 国产91免费视频| 日韩毛片视频| 日韩人妻精品无码一区二区三区| 国产在线播放一区| 人妻视频一区二区| 天天影视网天天综合色在线播放| 91高潮大合集爽到抽搐| 亚洲美女视频网| 欧美aaa免费| 91精品视频观看| 国产成人1区| 一区二区传媒有限公司| 国产精品1024| 久久一级免费视频| 色噜噜狠狠色综合中国| 视频一区二区免费| 欧美日韩ab片| 国产精品视频一区视频二区| 水蜜桃一区二区| 免费在线亚洲| 日本黄色免费观看| 亚洲一区成人在线| 亚洲成a人片在线| 久久精品国产亚洲一区二区| 91av一区| 婷婷四月色综合| 丝袜亚洲另类欧美综合| 亚洲av成人无码一二三在线观看| 亚洲色图清纯唯美| 97免费观看视频| 日韩在线精品视频| 韩国精品视频在线观看| 日韩wuma| 日韩电影在线观看一区| av电影在线不卡| 91福利国产成人精品照片| 暖暖视频在线免费观看| 91av视频在线观看| 四虎5151久久欧美毛片| 欧美国产亚洲一区| 99国产精品久久久久久久久久久| 国产乱码久久久久久| 亚洲精品一区二区三区在线观看| 爱情岛亚洲播放路线| 国产精品视频免费一区二区三区| 亚洲一级二级| 日本黄色录像片| 日韩欧美在线字幕| 大片免费播放在线视频| 国产精品久久久久久久美男| 日本a级不卡| 肉色超薄丝袜脚交| 怡红院av一区二区三区| 成人毛片在线精品国产| 午夜伦理精品一区| 亚洲男人都懂第一日本| 无人在线观看的免费高清视频| 国产精品色哟哟| 国产毛片毛片毛片毛片| 久久久久久欧美| 亚州av日韩av| 亚洲天堂网一区| 亚洲激情五月婷婷| 天天干天天草天天射| 国产福利精品av综合导导航| 日韩精品免费一区二区三区| 香蕉视频xxx| 午夜伊人狠狠久久| 粉嫩av一区| 5566中文字幕一区二区| 国产婷婷精品| 任你操精品视频| 亚洲国产精品成人精品| www.成人爱| 国产麻豆电影在线观看| 成人av在线资源| 中文字幕一区二区三区四区免费看 | 久久一区二区中文字幕| 国产黑丝在线视频| 懂色av影视一区二区三区| 淫片在线观看| 国产精品日韩欧美一区二区三区 | 经典一区二区| 午夜影院免费观看视频| 欧美三级xxx| 国内精品久久久久国产| 久久久久久99| 国产一区在线精品|