旋轉位置編碼(Rotary Positional Encoding, RoPE):中文公式詳解與代碼實現

旋轉位置編碼(Rotary Positional Encoding, RoPE):中文公式詳解與代碼實現

在序列模型中,位置信息對于任務的理解至關重要。傳統的絕對和相對位置編碼各有優缺點,而RoPE作為一種創新的位置編碼方法,展現了其獨特的優勢。

RoPE的核心思想

RoPE通過旋轉機制動態地捕捉位置信息。它允許查詢(query)和鍵(key)向量的旋轉程度根據它們之間的相對或絕對位置自動調整。這種方法使模型能更好地適應不同長度的序列,并提升長序列的處理能力。

公式解讀

基本公式

RoPE的基本思想是將每個位置i的編碼表示為:
pos ( i ) = ( cos ? ( i × τ ) , sin ? ( i × τ ) ) \text{pos}(i) = (\cos(i \times \tau), \sin(i \times \tau)) pos(i)=(cos(i×τ),sin(i×τ))

其中, τ \tau τ 是一個預先定義的角度參數。

旋轉機制

RoPE通過以下公式實現對查詢Q和鍵K的旋轉:
Q ′ [ j ] = Q [ j ] ? e ? θ K [ j ] ? K [ j ] ? e θ Q [ j ] Q'[j] = Q[j] \cdot e^{-\theta K[j]} - K[j] \cdot e^{\theta Q[j]} Q[j]=Q[j]?e?θK[j]?K[j]?eθQ[j]
K ′ [ j ] = Q [ j ] ? e θ K [ j ] + K [ j ] ? e ? θ Q [ j ] K'[j] = Q[j] \cdot e^{\theta K[j]} + K[j] \cdot e^{-\theta Q[j]} K[j]=Q[j]?eθK[j]+K[j]?e?θQ[j]

這里, θ \theta θ 是一個旋轉角度參數,控制旋轉的程度。 τ \tau τ 通常由模型通過訓練學習得到。

代碼實現

環境準備

安裝必要的庫:

pip install numpy matplotlib

實現步驟

  1. 定義RoPE函數:

    import numpy as npdef rotary_nd(q, k, tau=1000.0):q = q.copy()  # 防止原數據被修改k = k.copy()theta = tau / (k.max() + 1) if k.max() > 0 else taucos_theta = np.cos(theta)sin_theta = np.sin(theta)# 應用旋轉矩陣到查詢向量Qq_rot = q * cos_theta - k * sin_theta# 應用逆時針旋轉矩陣到鍵向量K(可選)k_rot = q * sin_theta + k * cos_thetareturn q_rot, k_rot
    
  2. 創建測試數據:

    n = 50  # 每個詞的維度數
    seq_len = 100  # 序列長度
    Q = np.random.randn(seq_len, n)  # 隨機生成查詢向量Q
    K = np.random.randn(seq_len, n)  # 隨機生成鍵向量K
    
  3. 應用RoPE并計算相似度:

    Q_rot, K_rot = rotary_nd(Q, K)
    similarity = np.mean(np.dot(Q_rot, K_rot.T), axis=0)
    
  4. 可視化結果:

    import matplotlib.pyplot as pltplt.figure(figsize=(12, 6))
    plt.subplot(1, 2, 1)
    plt.plot(similarity[:5], label='RoPE相似度前五')
    plt.title('RoPE 相似度曲線')
    plt.xlabel('位置索引')
    plt.ylabel('相似度值')
    plt.legend()# 可視化旋轉后的向量(以二維為例)
    original_points = [(Q[0, 0], Q[0, 1]), (K[0, 0], K[0, 1])]
    rotated_points = [(Q_rot[0, 0], Q_rot[0, 1]), (K_rot[0, 0], K_rot[0, 1])]plt.subplot(1, 2, 2)
    for p in original_points:plt.scatter(p[0], p[1], c='blue', alpha=0.5, label='original')
    for p in rotated_points:plt.scatter(p[0], p[1], c='red', alpha=0.5, label='rotated')
    plt.title('向量旋轉示意圖')plt.legend()
    plt.show()
    

結果分析

假設Q和K是隨機生成的高維向量,應用RoPE后,它們的相似度會集中在特定的區域。可視化圖表顯示了RoPE如何改變這些向量的方向,幫助模型更好地識別位置關系。

可調參數

  • tau:控制旋轉的角度。較小的值會導致更多的旋轉。
  • theta:根據K的最大值動態調整,可增強自適應能力。

擴展思考

考慮將滑動窗口機制與RoPE結合使用,以處理局部依賴,或引入加性反饋來進一步優化性能。通過實驗和優化參數,可以在不同任務中獲得更好的效果。


總結

RoPE是一種靈活且高效的位置編碼方法,通過旋轉機制動態地調整相對位置信息,特別適合處理長序列數據。希望這些詳細的公式解讀與代碼示例能夠幫助讀者更好地理解和應用RoPE技術。如需進一步探討或分享經驗,請隨時在評論區留言!

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

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

相關文章

C語言-指針變量和變量指針

指針 預備知識 內存地址 字節:字節是內存的容量單位,英文名Byte,1Byte8bits 地址:系統為了便于區分每一個字節面對它們的逐一進行編號(編號是唯一的),稱為內存地址,簡稱地址。int…

unityAB包(1/2)

unityAB包學習 1.AB包的導出擴展BuildAssetBundleOptions無特殊選項壓縮相關選項 2.AB包資源管理3.Resource和AssetBundle加載方式的區別4.預設體5.Unity Asset Bundle Browser 工具5為什么要勾選拷貝到StreamingAsset里面。6.AB包的加載 1.AB包的導出 首先在Project窗口&…

算法——廣度優先搜索——跨步迷宮

原題鏈接 思路:找出最短路徑,然后判斷是否存在連續三個點是橫縱坐標相等的,如果有就步數減1 但是有兩個樣例過不了 錯誤原因:在錯誤的測試案例中,最短路徑可能有多條,而我剛好選了一條比較曲折的&#x…

某酒企數字化轉型及電商規劃項目啟動會暨培訓會v(60頁PPT)(文末有下載方式)

詳細資料請看本解讀文章的最后內容。 在當今數字化浪潮席卷之下,企業的發展面臨著前所未有的機遇與挑戰。對于某酒企而言,數字化轉型和電商規劃已成為其實現 “二次騰飛”、邁向世界級酒企的關鍵戰略舉措。本次啟動會暨培訓會,為該酒企的轉型…

NET6 WebApi第5講:中間件(源碼理解,俄羅斯套娃怎么來的?);Web 服務器 (Nginx / IIS / Kestrel)、WSL、SSL/TSL

一、NET6的啟動流程 區別: .NET6 WebApi第1講:VSCode開發.NET項目、區別.NET5框架【兩個框架啟動流程詳解】_vscode webapi-CSDN博客 2、WebApplicationBuilder:是NET6引入的一個類,是建造者模式的典型應用 1>建造者模式的…

vue中根據html動態渲染內容

需求&#xff1a;根據數據中的html&#xff0c;因為我是在做填空&#xff0c;所以是需要將html中的_____替換成input&#xff0c;由于具體需求我使用的是元素contenteditable代替的可編輯的input html部分 <div class"wrap"><component :is"rendered…

【AI】AI編程助手:Cursor、Codeium、GitHub Copilot、Roo Cline、Tabnine

文章目錄 一、基本特性對比二、收費標準三、私有部署能力1、Tabnine2、Roo Code 三、代碼補全與自然語言生成代碼四、安裝獨立的IDE安裝插件安裝 五、基本使用&#xff08;一&#xff09;Cursor&#xff08;二&#xff09;GitHub Copilot1、獲取代碼建議2.聊天1&#xff09;上下…

三軸云臺之角速度信號篇

三軸云臺的角速度信號主要通過其內置的傳感器&#xff08;如陀螺儀&#xff09;來感知和測量。 一、角速度信號的感知與測量 在三軸云臺中&#xff0c;陀螺儀是測量角速度的關鍵組件。它通常安裝在三個互相垂直的軸上&#xff08;通常為X、Y、Z軸&#xff09;&#xff0c;能夠…

Grid 布局實現三欄布局

使用 CSS Grid 布局實現三欄布局(左右固定 100px,中間自適應)的核心原理是通過網格模板精確控制列寬分配。以下是具體實現方法及優化技巧: 一、基礎實現 ?父容器設置 為外層容器添加 display: grid 使其成為網格容器,并通過 grid-template-columns 定義列寬 css .contain…

綠盟春招實習一面

《網安面試指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇網安資料庫https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

進制轉換(R轉十)(1290. 二進制轉換十進制、1292. 十六進制轉十進制、1291. 八進制轉十進制、1405. 小麗找潛在的素數)

題單地址&#xff1a;題單中心-東方博宜OJ 這里以二進制轉十進制為例&#xff08;按位加權求和法&#xff09; 1290. 二進制轉換十進制 問題描述 請將一個 25 位以內的 2 進制正整數轉換為 1010 進制&#xff01; 輸入 一個 25 位以內的二進制正整數。 輸出 該數對應的…

Redis 本地安裝

首先安裝&#xff1a; https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-from-source/ 進入root目錄 tar -xzvf redis-stable.tar.gz cd redis-stable make然后 install sudo make install最后可以直接啟動 redis-server但是此時啟…

9.嗅探與Wireshark進階分析

嗅探與Wireshark進階分析 第一部分&#xff1a;嗅探的概念與重要性第二部分&#xff1a;Wireshark進階功能第三部分&#xff1a;嗅探實踐與分析總結 目標&#xff1a; ? 理解嗅探&#xff08;Sniffing&#xff09;的概念及其在網絡安全中的作用 ? 掌握Wireshark的進階功能&a…

在 VSCode 遠程開發環境下使用 Git 常用命令

在日常開發過程中&#xff0c;無論是單人項目還是團隊協作&#xff0c;Git 都是版本管理的利器。尤其是在使用 VSCode 連接遠程服務器進行代碼開發時&#xff0c;Git 不僅能幫助你管理代碼版本&#xff0c;還能讓多人協作變得更加高效。本文將介紹一些常用的 Git 命令&#xff…

npm 命令使用文檔

目錄 簡介安裝與配置基礎命令依賴管理版本控制腳本管理包發布高級命令配置管理最佳實踐常見問題 1. 簡介 npm (Node Package Manager) 是 Node.js 的官方包管理工具&#xff0c;提供&#xff1a; 130萬 開源包的注冊表訪問依賴解析與版本管理項目腳本自動化私有包管理能力完…

【Linux篇】進程控制

&#x1f4cc; 個人主頁&#xff1a; 孫同學_ &#x1f527; 文章專欄&#xff1a;Liunx &#x1f4a1; 關注我&#xff0c;分享經驗&#xff0c;助你少走彎路&#xff01; 1. 進程創建 1.1 fork函數 在linux中fork函數是非常重要的函數&#xff0c;它從已存在進程中創建一個…

HyperAD:學習弱監督音視頻暴力檢測在雙曲空間中的方法

文章目錄 速覽摘要1. 引言2. 相關工作弱監督暴力檢測雙曲空間中的神經網絡 3. 預備知識雙曲幾何切空間&#xff08;Tangent Space&#xff09;指數映射與對數映射&#xff08;Exponential and Logarithmic Maps&#xff09;3.1 雙曲圖卷積網絡&#xff08;Hyperbolic Graph Con…

動態規劃(6.不同路徑II)

題目鏈接&#xff1a;63. 不同路徑 II - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 本題為不同路徑的變型&#xff0c;只不過有些地方有「障礙物」&#xff0c;只要在「狀態轉移」上稍加修改就可解決。 狀態表示&#xff1a; 對于這種Γ路徑類」的問題&#xf…

深度洞察:DeepSeek 驅動金融行業智能化轉型變革

該文章為軟件測評&#xff0c;不是廣告&#xff01;&#xff01;&#xff01;&#xff01; 目錄 一.金融行業的智能化轉型浪潮? 二.DeepSeek的核心技術剖析 1.DeepSeek 模型的金融智慧? 2.實時聯網搜索&#xff1a;把握金融市場脈搏? 3.RAG 能力&#xff1a;鑄就精準金…

藍橋杯備考----》暴力枚舉---金盞花

這道題&#xff0c;一共12位&#xff0c;給了后六位&#xff0c;我們只要枚舉前六位就行了&#xff0c;當然如果是10的12次方的話&#xff0c;必須要開long long才可以存下&#xff0c;這點我們不要忘了 然后題目中又告訴了沒有前導0&#xff0c;我們可以從100000開始枚舉&…