BERT 作為Transformer的Encoder 為什么采用可學習的位置編碼

摘要

BERT 在位置編碼上與原始 Transformer 論文中的 sin/cos 公式不同,選擇了可學習(learned)的位置嵌入方案。本文將從 Transformer 原始位置編碼選項入手,分析 BERT 選擇 learned positional embeddings 的四大核心原因,并通過實驗和社區實證對比兩者的性能差異,最后對比其他主流模型的做法。全文引用了業界高質量文獻和社區討論,共計 13 條引用,幫助讀者全面理解這一設計抉擇。


1. Transformer 原始位置編碼選項

1.1 Sinusoidal vs. Learned

在《Attention Is All You Need》中,作者同時提出了固定正弦/余弦編碼(sinusoidal)可學習查表編碼(learned embedding)兩種方案,并在實驗中發現二者性能相當,無明顯優劣

  • Sinusoidal 編碼:根據位置和頻率預計算,不參與訓練;

  • Learned 編碼:將位置號作為索引,初始化為隨機向量,隨模型一同更新。


2. BERT 選擇可學習位置編碼的主要原因

2.1 實現與推理效率

Sinusoidal 編碼需在推理時頻繁計算三角函數,而 Learned 編碼只需一次向量查表相加,更省時

2.2 固定最大長度

BERT 在預訓練階段就將最大序列長度(如512)固定下來,不需要對超出訓練長度的情況做泛化處理,查表方式只要裁剪到最大長度即可,無需 sin/cos 的“無限外推”功能

2.3 領域自適應能力

BERT 后續需針對不同領域或下游任務做多次微調(fine-tune)。Learned 編碼能根據下游語料分布動態更新位置表示,比固定公式更具靈活性和表達力

2.4 參數代價微小

即便最大長度設為512,位置嵌入表也僅有 512×HiddenSize(如768)≈40萬維參數,在千億級模型中占比幾乎可以忽略,卻換來更靈活的表達


3. 實踐效果對比

  • 多項實驗證明,Learned 和 Sinusoidal 在下游任務(分類、問答、序列標注等)上的性能幾乎不分伯仲,甚至略有優勢;同時 Learned 方案在訓練和推理的整體資源消耗上也更可控【

  • Hugging Face 社區反饋:Learned embeddings 在某些場景下收斂更快,且不需要針對不同任務手動設計位置函數,可實現“一次預訓練,多次微調”流程的高效落地


4. 與其他模型對比

  • GPT 系列 同樣采用 Learned 位置嵌入,原因與 BERT 類似:固定最大長度,追求生成時的高效與靈活

  • 對超長文本支持(如 Transformer-XL、Longformer)則更傾向使用相對位置編碼稀疏注意力等技術,以兼顧泛化和效率,解決 Learned 編碼不能外推到新序列長度的問題


小結

盡管 BERT 架構來源于 Transformer 的編碼器部分,但在位置編碼的實現上,BERT 以“一次預訓練、多次微調”“固定最大長度”“極小參數開銷”以及“推理高效” 為考量,果斷選擇了可學習查表(訓練的位置編碼)的方式,而非 sin/cos 固定公式。此設計既保證了性能,又簡化了工程實現,契合 BERT 在工業界廣泛落地的需求。


參考文獻

  1. Vaswani A. et al., Attention Is All You Need, 2017. 【sinusoidal vs learned】?

  2. Why BERT use learned positional embedding?, Cross Validated, 2019.?

  3. Cheng YQ, 位置編碼(positional encoding), CSDN, 2018.?

  4. dzljoy2, 大模型位置編碼_bert位置編碼, CSDN, 2023.?

  5. Why use learnable positional encoding instead of sinusoids?, AI.StackExchange, 2023.?

  6. Why positional embeddings are implemented as embeddings, Hugging Face Discuss, 2019.?

  7. Tavares G., Sinusoidal Embeddings, Medium, 2024.?

  8. muyuu, Learned Positional Embedding, CSDN, 2019.?

  9. nn.Embedding layer for positional encoding, StackOverflow, 2022.?

  10. Comparing positional encodings, apxml.com, 2023.?

  11. Understanding BERT Embeddings, Tinkerd, 2022.?

  12. On Position Embeddings in BERT, OpenReview, 2019.?

  13. Transformer 通俗筆記, 集智斑圖, 2022.?

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

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

相關文章

【Linux 學習計劃】-- gcc、g++、動靜態庫鏈接

目錄 什么是gcc、g gcc、g 相關操作詳解 預處理、編譯、匯編、鏈接來源 動靜態鏈接是什么 結語 什么是gcc、g gcc、g其實就是編譯器,是幫助我們從.c或者.cc,.cpp文件編譯成可執行程序的 其中,我們如果要編譯c語言文件的話,…

前端讀取本地項目中 public/a.xlsx 文件中的數據 vue3

前端讀取本地項目中 public/a.xlsx 文件中的數據 vue3 項目中需要在 Vue3 項目中讀取 public/a.xlsx 文件,可以使用 fetch API 來獲取文件內容 一、安裝 xlsx 首先,你需要安裝 xlsx 庫: npm install xlsx二、在需要用的頁面里引入xlsx im…

MySQL:to many connections連接數過多

當你遇到 MySQL: Too many connections 錯誤時,意味著當前連接數已達到 MySQL 配置的最大限制。這通常是由于并發連接過多或連接未正確關閉導致的。 一、查看當前連接數 查看 MySQL 當前允許的最大連接數 SHOW VARIABLES LIKE max_connections;查看當前使用的最大…

2024年熱門AI趨勢及回顧

人工智能的崛起 2024 年可能會被銘記為人工智能不再是一種技術新奇事物,而是成為現實的一年。微軟、Salesforce 和 Intuit 等巨頭將人工智能融入主流企業解決方案;從文案寫作到數據分析,專門的人工智能應用程序和服務如雨后春筍般涌現&#…

LangFlow技術深度解析:可視化編排LangChain應用的新范式 -(2)流編輯器系統

Flow Editor System | langflow-ai/langflow | DeepWiki 流編輯器系統 相關源文件 流編輯器系統是 Langflow 的核心交互式組件,允許用戶直觀地創建、編輯和管理 LLM 驅動的應用程序。它提供了一個直觀的畫布,用戶可以在其中添加節點、將其與邊緣連接并…

驅動-定時-秒-字符設備

文章目錄 目的相關資料參考實驗驅動程序-timer_dev.c編譯文件-Makefile測試程序-timer.c分析 加載驅動-運行測試程序總結 目的 通過定時器timer_list、字符設備、規避競爭關系-原子操作,綜合運用 實現一個程序,加深之前知識的理解。 實現字符設備驅動框…

[Java實戰]Spring Boot整合Kafka:高吞吐量消息系統實戰(二十七)

[Java實戰]Spring Boot整合Kafka:高吞吐量消息系統實戰(二十七) 一、引言 Apache Kafka作為一款高吞吐量、低延遲的分布式消息隊列系統,廣泛應用于實時數據處理、日志收集和事件驅動架構。結合Spring Boot的自動化配置能力&…

Kotlin Multiplatform--04:經驗總結(持續更新)

Kotlin Multiplatform--04:經驗總結(持續更新) 引言 引言 本章用來記載筆者開發過程中的一些經驗總結 一、Ktor設置Header 在官方文檔中,想要設置Header的示例代碼如下: client.get("https://ktor.io&qu…

在 Ubuntu 系統中,將 JAR 包安裝為服務

在 Ubuntu 系統中,將 JAR 包安裝為服務可以通過 systemd 來實現。以下是詳細的操作步驟: 準備工作 確保 JAR 文件路徑和 Java 運行時環境已準備好。驗證 Java 是否可用: java -version創建 systemd 服務文件 systemd 的服務文件通常位于 …

電商項目-商品微服務-品牌管理微服務開發

一、功能分析 品牌管理微服務包括: (1)查詢全部列表數據 (2)根據ID查詢實體數據 (3)增加 (4)修改 (5)刪除 (6)分頁…

Spring Boot開發—— 整合Lucene構建輕量級毫秒級響應的全文檢索引擎

文章目錄 一、為什么選擇 Lucene?輕量級搜索的底層密碼二、核心原理:Lucene 的倒排索引2.1 倒排索引:速度之源2.2 段合并優化策略三、Spring Boot集成Lucene實戰3.1 依賴配置3.2 實體與索引設計3.3 核心索引服務(含異常處理)3.4 使用示例(測試類)四、高級優化技巧4.1 索…

SpringBootDay1|面試題

目錄 一、springboot框架 1、什么是springboot 2、Spring Boot的主要優點 3、springboot核心注解 4、定義banner(springboot的logo) 5、springboot配置文件 6、springboot 整合 jdbc 二、面試題 1)springmvc的作用 ?編輯 2&#x…

jQuery Ajax中dataType 和 content-type 參數的作用詳解

jQuery Ajax中dataType與contentType參數解析 一、核心概念對比 參數作用對象數據類型默認值dataType響應數據預期接收的數據格式jQuery自動判斷(根據響應頭MIME類型)contentType請求數據發送數據的編碼格式application/x-www-form-urlencoded 二、da…

幾款常用的虛擬串口模擬器

幾款常用的虛擬串口模擬器(Virtual Serial Port Emulator),適用于 Windows 系統,可用于開發和調試串口通信應用: 1. com0com (開源免費) 特點: 完全開源免費,無功能限制。 可創建多個虛擬串口…

LLM筆記(六)線性代數

公式速查表 1. 向量與矩陣:表示、轉換與知識存儲的基礎 向量表示 (Vectors): 語義的載體 在LLM中,向量 x ∈ R d \mathbf{x}\in\mathbb{R}^d x∈Rd 是信息的基本單元,承載著豐富的語義信息: 詞嵌入向量 (Word Embeddings)&am…

[特殊字符] Word2Vec:將詞映射到高維空間,它到底能解決什么問題?

一、在 Word2Vec 之前,我們怎么處理語言? 在 Word2Vec 出現之前,自然語言處理更多是“工程方法”,例如字符串匹配、關鍵詞提取、正則規則...。但這些表示通常缺乏語義,詞與詞之間看不出任何聯系以及非常淺顯。當然,技術沒有好壞,只有適合的場景。例如: 關鍵詞匹配非常…

棧和隊列的模擬實現

棧和隊列的模擬實現 容器適配器priority_queue(優先級隊列)priority_queue的使用priority_queue的模擬實現: 仿函數什么叫仿函數?需要自己實現仿函數的情況: 棧的模擬實現隊列的模擬實現deque(vector和list的縫合怪&am…

idea本地debug斷點小技巧

idea本地debug斷點小技巧 簡單的設置斷點條件 斷點后,右鍵這個斷點,可以在 condition 中填寫能得出布爾的表達式 a 1 你如果寫如下,表示先給他賦值,然后斷住 a 2; true 斷點后設置某個變量的值 在 debug 區域可以設置變量…

Oracle中如何解決FREE BUFFER WAITS

基于性能上的考慮,服務器進程在掃描LRU主列的同時,會將臟塊移至LRU-W列,如果發現沒有足夠可用(可替換)的BUFFER CACHE,進程并不會無止盡地掃描整條LRU主列,而是在掃描到某個閥值(該閥…

Git命令使用全攻略:從創建分支到合并的完整流程

Git命令使用全攻略:從創建分支到合并的完整流程 引言一、初始化項目與基礎配置1.1 克隆遠程倉庫1.2 查看當前分支狀態 二、創建與管理分支2.1 從main分支創建新功能分支2.2 查看分支列表2.3 提交代碼到新分支2.4 推送分支到GitHub 三、版本發布與標簽管理3.1 創建輕…