RoPE簡單解析

文章目錄

  • 簡介
  • 拆解
  • 一些tricks

簡介

因為RoPE的優異性能,其已成為各種大模型中位置編碼的首選,包括多模態模型;在一些多模態模型或視頻理解模型中,甚至會用到多維度RoPE。雖然RoPE已廣泛應用,之前也看了不少針對其原理解析的文章,特別是蘇神的推導帖,可能是我個人能力問題,也可能是太過于追求原理的問題,對RoPE一直沒有理解透徹,總感覺差那么一點。本文會適當弱化RoPE為什么會有效的原理推導,將重點放在RoPE應該如何實現以及具體的實現步驟和一些不同實現方式的解析。

RoPE的核心思想是通過旋轉操作將位置信息融入到詞向量。在復數域中,一個復數由實部和虛部組成,故一個復數可以看作復數域中的向量。將一個復數與復數 eiθ=cos?θ+isin?θe^{i\theta}=\cos{\theta}+i \sin{\theta}eiθ=cosθ+isinθ相乘時,相當于在復平面上繞原點旋轉了 θ\thetaθ度角。假設有一個復數 v=x+iyv=x+iyv=x+iy,按上述說明,將 vvveiθe^{i\theta}eiθ相乘就是將 vvv繞原點旋轉了 θ\thetaθ度角,可以通過公式推導驗證:
v′=v?eiθ=(x+iy)?(cos?θ+isin?θ)=cos?θx+isin?θx+icos?θy?sin?θy=(cos?θx?sin?θy)+i(sin?θx+cos?θy)\begin{align*} v'&=v*e^{i\theta} \\ &=(x+iy)*(\cos{\theta}+i \sin{\theta}) \\ &=\cos{\theta}x+i\sin{\theta}x+i\cos{\theta}y-\sin{\theta}y \\ &=(\cos{\theta}x-\sin{\theta}y)+i(\sin{\theta}x+\cos{\theta}y) \tag{1} \end{align*}v?=v?eiθ=(x+iy)?(cosθ+isinθ)=cosθx+isinθx+icosθy?sinθy=(cosθx?sinθy)+i(sinθx+cosθy)?(1)?

通過公式(1)有 x′=cos?θx?sin?θy,y′=sin?θx+cos?θyx'=\cos{\theta}x-\sin{\theta}y,y'=\sin{\theta}x+\cos{\theta}yx=cosθx?sinθy,y=sinθx+cosθy。從二維向量的角度看,變換前后的復數 v,v′v,v'v,v其實均可以看作列向量 [xy],[x′y′]\begin{bmatrix} x \\ y \end{bmatrix},\begin{bmatrix} x' \\ y' \end{bmatrix}[xy?][xy?],公式(1)表示 v′v'v是由 vvv旋轉而來,且恰好對應了二維向量空間的旋轉矩陣,如下所示:
[x′y′]=[cos?θ?sin?θsin?θcos?θ][xy](2)\begin{equation} \begin{bmatrix} x' \\ y' \end{bmatrix}=\begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} \end{equation} \tag2[xy?]=[cosθsinθ??sinθcosθ?][xy?]?(2)

如公式(2)所示,在二維向量空間中,將一個向量繞原點旋轉 θ\thetaθ度就是乘以一個旋轉矩陣,即 R(θ)=[cos?θ?sin?θsin?θcos?θ]R(\theta)=\begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}R(θ)=[cosθsinθ??sinθcosθ?]。通過上述推導可知,二維向量空間中的旋轉和復數乘法在進行旋轉時是等價的。

RoPE是將隱向量序列中不同位置的token的特征向量與不同的旋轉角對應的旋轉矩陣相乘,即將不同位置token的特征向量旋轉不同的角度。注意力計算的主要部分是token向量之間的點積運算,可以通過推導展示RoPE是如何在自注意力計算中引入相對位置信息的。

假設目前token的維度為2,有序列中m處的查詢向量 qm=[qm,1qm,2]q_m=\begin{bmatrix} q_{m,1} \\ q_{m,2} \end{bmatrix}qm?=[qm,1?qm,2??]和n處的鍵向量 kn=[kn,1kn,2]k_n=\begin{bmatrix} k_{n,1} \\ k_{n,2} \end{bmatrix}kn?=[kn,1?kn,2??],設旋轉基礎角度為 θ\thetaθ,序列中不同位置token的旋轉角由位置索引與基礎角度相乘得到,即上述兩個向量的旋轉角度為別是 mθ,nθm\theta,n\thetamθ,nθ,RoPE就是給不同位置的token向量與對應位置的旋轉角的旋轉矩陣相乘,基于前文的推理,有,
qm′=[cos?(mθ)?sin?(mθ)sin?(mθ)cos?(mθ)][qm,1qm,2]=R(mθ)qm(3)\begin{equation} q'_m=\begin{bmatrix} \cos(m\theta) & -\sin(m\theta) \\ \sin(m\theta) & \cos(m\theta) \end{bmatrix} \begin{bmatrix} q_{m,1} \\ q_{m,2} \end{bmatrix} = R(m\theta) q_m \end{equation} \tag3qm?=[cos(mθ)sin(mθ)??sin(mθ)cos(mθ)?][qm,1?qm,2??]=R(mθ)qm??(3)
kn′=[cos?(nθ)?sin?(nθ)sin?(nθ)cos?(nθ)][kn,1kn,2]=R(nθ)km(4)\begin{equation} k'_n=\begin{bmatrix} \cos(n\theta) & -\sin(n\theta) \\ \sin(n\theta) & \cos(n\theta) \end{bmatrix} \begin{bmatrix} k_{n,1} \\ k_{n,2} \end{bmatrix} = R(n\theta) k_m \end{equation} \tag4kn?=[cos(nθ)sin(nθ)??sin(nθ)cos(nθ)?][kn,1?kn,2??]=R(nθ)km??(4)

旋轉后的兩個向量進行以下點積計算:
qm′Tkn′=(R(mθ)qm)T?R(nθ)kn=qmT?R(mθ)T?R(nθ)?kn=qmT?[cos?(mθ)sin?(mθ)?sin?(mθ)cos?(mθ)][cos?(nθ)?sin?(nθ)sin?(nθ)cos?(nθ)]?kn=qmT?[cos?(mθ)cos?(nθ)+sin?(mθ)sin?(nθ)?cos?(mθ)sin?(nθ)+sin?(mθ)cos?(nθ)?sin?(mθ)cos?(nθ)+cos?(mθ)sin?(nθ)sin?(mθ)sin?(nθ)+cos?(mθ)cos?(nθ)]?kn=qmT?[cos?((n?m)θ)?sin?((n?m)θ)sin?((n?m)θ)cos?((n?m)θ)]?kn=qmT?R((n?m)θ)?kn\begin{align*} q_m^{'T}k'_n &= (R(m\theta) q_m)^T \cdot R(n\theta) k_n \\ &= q^T_m \cdot R(m\theta)^T \cdot R(n\theta) \cdot k_n \\ &= q^T_m \cdot \begin{bmatrix} \cos(m\theta) & \sin(m\theta) \\ -\sin(m\theta) & \cos(m\theta) \end{bmatrix} \begin{bmatrix} \cos(n\theta) & -\sin(n\theta) \\ \sin(n\theta) & \cos(n\theta) \end{bmatrix} \cdot k_n \\ &= q^T_m \cdot \begin{bmatrix} \cos(m\theta)\cos(n\theta) + \sin(m\theta)\sin(n\theta) & -\cos(m\theta)\sin(n\theta) + \sin(m\theta)\cos(n\theta) \\ -\sin(m\theta)\cos(n\theta) + \cos(m\theta)\sin(n\theta) & \sin(m\theta)\sin(n\theta) + \cos(m\theta)\cos(n\theta) \end{bmatrix} \cdot k_n \\ &= q^T_m \cdot \begin{bmatrix} \cos((n - m)\theta) & -\sin((n - m)\theta) \\ \sin((n - m)\theta) & \cos((n - m)\theta) \end{bmatrix} \cdot k_n \\ &= q^T_m \cdot R((n - m)\theta) \cdot k_n \tag5 \end{align*}qmT?kn??=(R(mθ)qm?)T?R(nθ)kn?=qmT??R(mθ)T?R(nθ)?kn?=qmT??[cos(mθ)?sin(mθ)?sin(mθ)cos(mθ)?][cos(nθ)sin(nθ)??sin(nθ)cos(nθ)?]?kn?=qmT??[cos(mθ)cos(nθ)+sin(mθ)sin(nθ)?sin(mθ)cos(nθ)+cos(mθ)sin(nθ)??cos(mθ)sin(nθ)+sin(mθ)cos(nθ)sin(mθ)sin(nθ)+cos(mθ)cos(nθ)?]?kn?=qmT??[cos((n?m)θ)sin((n?m)θ)??sin((n?m)θ)cos((n?m)θ)?]?kn?=qmT??R((n?m)θ)?kn??(5)?

上述公式(5)推導過程要使用高中數學知識–三角函數和差定理。可以看到,兩個旋轉不同角度后向量的點積與它們之間旋轉的角度之差有關系,是一種相對位置的體現,即體現了RoPE給序列中不同位置token引入了相對位置信息。

注意:上述旋轉均是逆時針旋轉!

拆解

上述只是對RoPE的原理進行了簡短解釋,盡可能直白地說明RoPE原理,但上述討論局限在二維空間內,而LLMs模型中token向量的維度都很大,接下來對常規的RoPE實現進行拆解,將整個實現過程解剖出來。

  1. 為了沿用二維旋轉矩陣的性質,RoPE會將一個token的高維向量看作多個復數,假設向量特征維度為 ddd(基本所有LLMs中的特征維度數是偶數),那么會將一個ddd維的token特征向量視為 d/2d/2d/2個復數
  • 假設一個token向量為 [1,2,3,4][1,2,3,4][1,2,3,4],那么 [1,2][1,2][1,2]是第一個復數,[3,4][3,4][3,4]是第二個復數
  • 同一個token中的不同復數對的旋轉角度不同
  • 基礎旋轉角 θi=10000?2i/d=110000id2\theta_i=10000^{-2i/d}=\frac{1}{10000^{\frac{i}{\frac{d}{2}}}}θi?=10000?2i/d=100002d?i?1?;注意,同一token向量中不同位置復數的旋轉角是由 iii來決定的。上文已經說到,一個token向量會分成 d/2d/2d/2個復數, i∈[0,d/2)i \in [0,d/2)i[0,d/2),所以 θi\theta_iθi?就對應第 iii對復數的旋轉角
    • 10000是一個超參數
  1. 同一序列中不同位置的token向量的旋轉角也不同,就是基礎旋轉角與token對應的序列索引乘積,即一個token在序列中的索引為m,那么其對應的最終的旋轉角為 θi?m\theta_i \cdot mθi??m
  • 實現時一般會先將 θi\theta_iθi?計算出來,再基于序列長度獲取不同位置token索引的一維向量,然后兩者相乘,得到不同位置token中不同復數維度的準確旋轉角度
  1. 將輸入沿著特征維度,按順序每兩個為一組作為一對復數進行拆分,向量維度從[batch_size, seq_len, dim]–>[batch_size, seq_len, dim//2, 2]
  • 最后一個維度中,第一組向量為所有復數的實部,第二組向量為所有復數的虛部
  1. 按照二維矩陣中的計算方式,進行旋轉矩陣乘法,然后將最終的實部和虛部重新合并為原來的維度[batch_size, seq_len, dim],即完成了RoPE的應用

上述對RoPE的具體操作過程進行了敘述,以下是一種較原始的樸素實現:

import torchdef get_rotary_matrix(seq_len, dim, base=10000):"""生成RoPE的旋轉矩陣"""# 生成不同頻率的正弦和余弦值theta = 1.0 / (base ** (torch.arange(0, dim, 2).float() / dim))  # shape為[dim//2]# 生成位置索引position = torch.arange(seq_len).float()  # shape為[seq_len]# 計算每個位置和維度對應的角度theta = torch.outer(position, theta)  # 計算外積,其中第(i, j)個元素是position[i] * theta[j];shape為[seq_len, dim//2]# 計算正弦和余弦值cos = torch.cos(theta)  # shape為[seq_len, dim//2]sin = torch.sin(theta)  # shape為[seq_len, dim//2]return cos, sindef apply_rotary_embedding(x, cos, sin):"""應用旋轉位置編碼"""# 假設x的形狀為[batch_size, seq_len, dim]# 將向量視為復數,每兩個維度一組x_reshape = x.view(*x.shape[:-1], -1, 2)  # shape為[batch_size, seq_len, dim//2, 2],即沿著特征維度拆分# 構建正弦和余弦矩陣,使其與x_reshape形狀匹配cos_expanded = cos.view(1, cos.shape[0], cos.shape[1], 1)  # shape為[1, seq_len, dim//2, 1]sin_expanded = sin.view(1, sin.shape[0], sin.shape[1], 1)  # shape為[1, seq_len, dim//2, 1]# 旋轉操作(復數乘法)# [x_real, x_imag] * (cos + i*sin) = [x_real*cos - x_imag*sin, x_real*sin + x_imag*cos]x_out_1 = x_reshape[:, :, :, 0:1] * cos_expanded - x_reshape[:, :, :, 1:2] * sin_expandedx_out_2 = x_reshape[:, :, :, 0:1] * sin_expanded + x_reshape[:, :, :, 1:2] * cos_expanded# 合并結果x_out = torch.cat([x_out_1, x_out_2], dim=-1)  # shape為[batch_size, seq_len, dim//2, 2]return x_out.view(*x.shape)# 示例用法
def apply_rope(x):"""對輸入向量應用RoPE位置編碼"""batch_size, seq_len, dim = x.shapecos, sin = get_rotary_matrix(seq_len, dim)return apply_rotary_embedding(x, cos, sin)# 測試代碼
if __name__ == "__main__":# 創建一個隨機輸入張量batch_size, seq_len, dim = 2, 10, 512x = torch.randn(batch_size, seq_len, dim)# 應用RoPEx_with_rope = apply_rope(x)print(f"輸入形狀: {x.shape}")print(f"輸出形狀: {x_with_rope.shape}")

一些tricks

  • 在對輸入的嵌入維度上應用RoPE時,當特征維度很長,或者希望節約資源資源時,可以不對所有維度全部應用,而是可以設置一個比例,即只在前 droped_{rope}drope?維度上應用RoPE,后面保持原始數值不變
  • 在計算 θi\theta_iθi?時原始論文使用的base為10000,但可以對其進行縮放,實現長度外推;如增加base,可以處理訓練過程中未見過的長序列

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

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

相關文章

windows 獲取 APK 文件的包名和啟動 Activity 名稱

使用 aapt 命令確保環境變量配置正確:首先需要確保你的系統環境變量中包含了 Android SDK 的 build-tools 目錄路徑。這是因為 aapt 工具位于該目錄下。運行命令: 打開命令提示符(CMD),然后輸入以下命令來查看 APK 的詳…

【Mac版】Linux 入門命令行快捷鍵+聯想記憶

Linux Mac 用戶終端命令行快捷鍵 符號速查全解作為一個剛接觸 Linux 和終端的 macOS 用戶,常常被命令行的各種快捷鍵和符號弄得頭暈腦脹,本文將帶你系統地掌握命令行中最常用的快捷鍵和符號,并通過邏輯聯想幫助你輕松記住每一個組合。一、基…

AUTOSAR Mcal Dio - 模塊介紹 + EB配置工具介紹

文章目錄1. 模塊簡介2. 主要功能3. 縮略語4. API接口5. 功能介紹5.1. ChannelGroup5.2. Dio_MaskedWritePort6. 序列圖6.1.讀GPIO電平6.2. 設置GPIO電平7. EB 工具配置7.1.General7.2.DioPort8. 參考資料1. 模塊簡介 Dio,全稱“Digital Input Output”。Dio模塊&am…

ICT模擬零件測試方法--晶體管測試

ICT模擬零件測試方法–晶體管測試 文章目錄ICT模擬零件測試方法--晶體管測試晶體管測試晶體管測試配置晶體管測試配置晶體管測量選項晶體管測試 i3070 在線測試軟件為每個晶體管提供兩種測試: 使用二極管測試對晶體管的兩個 PN 結進行測試。這是檢查設備存在的快速…

AI算法實現解析-C++實例

基于C++實現的AI 以下是基于C++實現的AI/機器學習相關示例,涵蓋基礎算法、計算機視覺、自然語言處理等領域,適合不同階段的學習者參考: 基礎機器學習算法 線性回歸 使用梯度下降法預測連續值,核心公式: 損失函數: 邏輯回歸 二分類問題實現,Sigmoid函數: K-Means…

亞馬遜云科技實戰架構:構建可擴展、高效率、無服務器應用

對于今天的開發者、架構師和技術愛好者而言,云計算早已超越了簡單的“虛擬機租賃”或“服務器托管”階段。它已經演化為一套豐富、強大且精密的工具集,能夠以前所未有的方式設計、部署和擴展應用程序。真正的云原生思維,是掌握并運用多種架構…

論文閱讀:《無約束多目標優化的遺傳算法,群體和進化計算》

前言 提醒: 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布,其中引用內容都會使用鏈接表明出處(如有侵權問題,請及時聯系)。 其中內容多為一次書寫,缺少檢查與訂正,如有問題或其他拓展…

嵌入式單片機中位帶操作控制與實現

STM32 單片機的SRAM有兩個區支持位帶(bit-band)操作。 那么,什么是位帶,位帶操作的原理是怎樣的呢? 今天來梳理一下這個知識點。 在介紹位帶操作之前,先看一看 ARM Crotext-M3 的存儲器映射。 CM3 的地址空間是 4GB, 程序可以在代碼區,內部 SRAM 區以及外部 RAM 區中執…

考研初試專業分146!上岸新疆大學!信號與系統考研經驗,通信考研小馬哥。

信號與系統專業課分數146,希望以下的經驗能夠幫助到正在努力學習的學弟學妹們更好的學習專業課。本人是從四月份開始學習專業課,當時我覺得專業課應該要盡早開始越拖到后期學習壓力越大,所以在周邊同學還在只學習公共課的時候我就開始了專業課…

負載均衡算法中的加權隨機算法

import org.apache.commons.lang3.tuple.Pair;import java.util.Arrays; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors;/*** 加權隨機,nacos*/ public class RouterWeightRandom {/**** param list [{"a&q…

AI時代SEO關鍵詞優化策略

內容概要 在人工智能(AI)技術深度融入數字營銷的背景下,搜索引擎優化(SEO)的關鍵詞優化策略正經歷一場智能變革,這不僅重塑了傳統研究方式,還為企業帶來了全新的競爭機遇。本文將從AI時代SEO的變…

復矩陣與共軛轉置矩陣乘積及其平方根矩陣

設 是一個 的復數矩陣,其共軛轉置矩陣(Hermitian 共軛)記為 (即 ),則矩陣 ( )和 ( )的性質如下文所述。1. Hermitian 性(自共軛性&#x…

Vue 框架 學習筆記

作為初學者對于Vue框架的學習筆記 總結了Vue框架的核心知識點,包括:1. 基礎概念:漸進式框架、兩種使用方式、Vue實例創建流程、模板語法和響應式特性。2. 常用指令:詳細介紹了v-html、v-show/v-if、v-for、v-on、v-bind、v-model等…

飛牛系統安裝DataEase自定義Docker包

飛牛系統安裝DataEase自定義Docker包背景構造DataEase Docker包1.在Linux 系統中(比如我這里選麒麟V10)安裝Docker2.準備打包文件3.執行打包4.驗證打好的包上傳DataEase Docker包1.把本地docker 容器導出1.1查看鏡像列表命令:docker images1.…

可配置的PWM外設模塊

🔧 可配置的PWM外設模塊 基于FPGA的PWM信號發生器,支持 動態周期與占空比配置,無需外部控制信號,適用于 LED 呼吸燈、舵機控制、電機驅動等場景。 仿真波形 參數修改后會晚一個pwm周期才生效📌 模塊功能 🧮…

從零到一:我是如何用深度學習打造高性能書籍推薦系統的

作者:笙囧同學 | 發布時間:2025年7月28日 | 閱讀時長:15分鐘 🎯 前言:為什么要做這個項目? 大家好,我是笙囧同學!最近在學習《機器學習基礎》課程時,被推薦系統的魅力深…

OpenRLHF:面向超大語言模型的高性能RLHF訓練框架

“四模型協同調度破資源壁壘,讓70B模型RLHF訓練觸手可及” OpenRLHF 是由 OpenLLMAI 團隊于2024年推出的開源強化學習人類反饋(RLHF)框架,旨在解決大語言模型(LLM)對齊訓練中的多模型協調瓶頸與超大規模擴展…

DMETL安裝流程及簡單使用

目錄 安裝調度器 安裝執行器 安裝管理器 啟動服務 進入web管理端 創建數據源 ?編輯 添加表 添加影子表增量 節點監控 DMETL工程流搭建實踐 創建表/視圖 添加sql腳本 添加數據清洗與轉換模塊 添加排序模塊 創建輸出表 連接各模塊并啟動 查看驗證結果 監控管理 …

如何通過代碼操作文件?

1. 為什么使用文件不使用文件,我們所寫的程序存在電腦內存中,程序結束,內存回收,數據就丟失了。再次運行程序也是看不到上次運行時的數據的,如果想要將數據進行持久化保存,就需要使用文件。2. 文件分類&…

unbuntn 22.04 coreutils文件系統故障

文章目錄核心思路具體操作步驟(需借助 Ubuntu Live USB)1. 準備 Ubuntu Live USB2. 從 Live USB 啟動并掛載系統分區3. 從安裝包中提取完好的 /bin/dir 文件并替換4. 重啟系統并驗證總結前提說明具體操作步驟(分階段執行)階段1&am…