当前位置: 首页 > article >正文

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. 

相关文章:

BERT 作为Transformer的Encoder 为什么采用可学习的位置编码

摘要 BERT 在位置编码上与原始 Transformer 论文中的 sin/cos 公式不同,选择了可学习(learned)的位置嵌入方案。本文将从 Transformer 原始位置编码选项入手,分析 BERT 选择 learned positional embeddings 的四大核心原因&#x…...

Python数据可视化高级实战之一——绘制GE矩阵图

目录 一、课程概述 二、GE矩阵? 三、GE 矩阵图的适用范围 五、GE 矩阵的评估方法 (一)市场吸引力的评估要素 二、企业竞争实力的评估要素 三、评估方法与实践应用 1. 定量与定性结合法 2. 数据来源 六、GE矩阵的图形化实现 七、总结:GE 矩阵与 BCG 矩阵的对比分析 (一)GE…...

StreamSaver实现大文件下载解决方案

StreamSaver实现大文件下载解决方案 web端 安装 StreamSaver.js npm install streamsaver # 或 yarn add streamsaver在 Vue 组件中导入 import streamSaver from "streamsaver"; // 确保导入名称正确完整代码修正 <!--* projectName: * desc: * author: dua…...

【Vue 3全栈实战】从响应式原理到企业级架构设计

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…...

Java线程池调优与实践经验

在Java面试中&#xff0c;线程池调优是一个常见且重要的考察点&#xff0c;尤其是当涉及Spring生态时&#xff0c;ThreadPoolTaskExecutor的使用经验通常会被深入追问。以下是针对该问题的结构化回答&#xff0c;结合原理、实践和调优经验&#xff1a; 1. 线程池调优的核心参数…...

【科研项目】大三保研人科研经历提升

大三保研人&#xff0c;五月科研项目经历提升 现在已经是五月下旬&#xff0c;各大高校的夏令营通知陆续发布&#xff0c;九月的预推免也近在眼前。我知道很多大三的同学正在焦虑——绩点已经定型&#xff0c;竞赛经历又不够丰富&#xff0c;简历上能写的东西太少&#xff0c;面…...

期刊采编系统安装升级错误

我们以ojs系统为例&#xff1a; PHP Fatal error: Uncaught Error: Call to a member function getId() on null in /esci/data/html/classes/install/Upgrade.inc.php:1019 Stacktrace: #0 /esci/data/html/lib/pkp/classes/install/Installer.inc.php(415): Upgrade->con…...

CSS【详解】弹性布局 flex

适用场景 一维&#xff08;行或列&#xff09;布局 基本概念 包裹所有被布局元素的父元素为容器 所有被布局的元素为项目 项目的排列方向&#xff08;垂直/水平&#xff09;为主轴 与主轴垂直的方向交交叉轴 容器上启用 flex 布局 将容器的 display 样式设置为 flex 或 i…...

自回归图像编辑 EditAR: Unified Conditional Generation with Autoregressive Models

Paperhttps://arxiv.org/pdf/2501.04699 Code (coming soon) 目录 方法 实验 EditAR是一个统一的自回归框架&#xff0c;用于各种条件图像生成任务——图像编辑、深度到图像、边缘到图像、分割到图像。 next-token预测的功效尚未被证明用于图像编辑。 EditAR主要构建在Ll…...

React Flow 中 Minimap 与 Controls 组件使用指南:交互式小地图与视口控制定制(含代码示例)

本文为《React Agent&#xff1a;从零开始构建 AI 智能体》专栏系列文章。 专栏地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。项目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代码示​例与实战源&#xff09;。完整介绍…...

基于YOLOv8 的分类道路目标系统-PyTorch实现

本文源码: https://download.csdn.net/download/shangjg03/90873939 1. 引言 在智能交通和自动驾驶领域,道路目标分类是一项关键技术。通过对摄像头捕获的图像或视频中的目标进行分类识别,可以帮助车辆或系统理解周围环境,做出更安全的决策。本教程将介绍如何使用 PyTorch …...

STM32之串口通信WIFI上云

一、W模块的原理与应用 基本概念 如果打算让硬件设备可以通过云服务器进行通信&#xff08;数据上报/指令下发&#xff09;&#xff0c;像主流的云服务器有阿里云、腾讯云、华为云&#xff0c;以及其他物联网云平台&#xff1a;巴法云.......&#xff0c;硬件设备需要通过TCP…...

PCB智能报价系统——————仙盟创梦IDE

软件署名 代码贡献&#xff1a; 紫金电子科技有限公司 文案正路&#xff1a;cybersnow 正文 对企业的竞争力有着深远影响。传统的 PCB 报价方式往往依赖人工核算&#xff0c;不仅耗时较长&#xff0c;还容易出现误差。随着科技的发展&#xff0c;PCB 自动报价系统应运而生&a…...

EXO分布式部署deepseek r1

EXO 是一个支持分布式 AI 计算的框架&#xff0c;可以用于在多个设备&#xff08;包括 Mac Studio&#xff09;上运行大语言模型&#xff08;LLM&#xff09;。以下是联调 Mac Studio 512GB 的步骤&#xff1a; 安装 EXO • 从 EXO GitHub 仓库 下载源码或使用 git clone 获取…...

每日算法 -【Swift 算法】寻找两个有序数组的中位数(O(log(m+n)))详细讲解版

&#x1f9e0; 用 Swift 寻找两个有序数组的中位数&#xff08;O(log(mn))&#xff09;详细讲解版 寻找两个有序数组的中位数&#xff0c;是 LeetCode 上非常经典的一道题&#xff0c;难度为 困难&#xff08;Hard&#xff09;&#xff0c;但它的本质是一个 二分查找 的变形应…...

Linux问题排查-找到偷偷写文件的进程

在 Linux 系统中&#xff0c;若要通过已修改的文件找到修改该文件的进程 PID&#xff0c;可以结合以下方法分析&#xff0c;具体取决于文件是否仍被进程打开或已被删除但句柄仍存在&#xff1a; 一、文件仍被进程打开&#xff08;未删除&#xff09; 如果文件当前正在被某个进…...

SOPHGO算能科技BM1688内存使用与编解码开发指南

1. BM1688内存分配接口详解 1.1 设备内存分配接口区别 BM1688提供了三个主要的设备内存分配接口,它们的主要区别如下: // 基本设备内存分配接口 void* bm_malloc_device_byte(bm_handle_t handle, unsigned int size);// 指定heap区域的设备内存分配 void*</...

kotlin flow的两种SharingStarted策略的区别

一 两种 SharingStarted 策略的区别&#xff1a; SharingStarted.Eagerly: 立即开始收集上游流&#xff0c;即使没有下游订阅者持续保持活跃状态&#xff0c;直到 ViewModel 被清除优点&#xff1a;响应更快&#xff0c;数据始终保持最新缺点&#xff1a;消耗更多资源&#x…...

LeetCode-链表-合并两个有序链表

LeetCode-链表-合并两个有序链表 ✏️ 关于专栏&#xff1a;专栏用于记录 prepare for the coding test。 文章目录 LeetCode-链表-合并两个有序链表&#x1f4dd; 合并两个有序链表&#x1f3af;题目描述&#x1f50d; 输入输出示例&#x1f9e9;题目提示&#x1f9ea;AC递归&…...

sqli-labs靶场29-31关(http参数污染)

目录 前言 less29&#xff08;单引号http参数污染&#xff09; less30&#xff08;双引号http参数污染&#xff09; less31(双引号括号http参数污染) 前言 在JSP中&#xff0c;使用request.getParameter("id")获取请求参数时&#xff0c;如果存在多个同名参数&a…...

独占内存访问指令LDXR/STXR

一、原子操作的介绍 在计算机领域里&#xff0c;如果要在多线程的情况下要保持数据的同步&#xff0c;需要引入称作Load-Link&#xff08;LL&#xff09;和Store-Conditional&#xff08;SC&#xff09;的操作&#xff0c;通常简称为LL/SC。 LL操作返回一个内存地址上当前存储…...

JVM 垃圾回收机制深度解析(含图解)

JVM 垃圾回收机制深度解析&#xff08;含图解&#xff09; 一、垃圾回收整体流程 垃圾回收图解 #mermaid-svg-KPtxlwWntQx8TOj3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KPtxlwWntQx8TOj3 .error-icon{fill…...

如何利用 Conda 安装 Pytorch 教程 ?

如何利用 Conda 安装 Pytorch 教程 &#xff1f; 总共分为六步走&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;验证conda 环境是否安装好&#xff1f; 1) conda -V2) conda --version&#xff08;2&#xff09;第二步&#xff1a;查看现有环境 conda env list…...

【ffmpeg】SPS与PPS的概念

PPS&#xff08;Picture Parameter Set&#xff09;详解 PPS&#xff08;图像参数集&#xff09;是H.264/H.265视频编码标准中的关键数据结构&#xff0c;与SPS&#xff08;序列参数集&#xff09;共同组成视频的解码配置信息&#xff0c;直接影响视频的正确解码和播放。以下是…...

uniapp vue 开发微信小程序 分包梳理经验总结

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“uniapp vue 开发微信小程序 分包梳理经验总结”。 在使用 UniAppvue框架开发微信小程序时&#xff0c;当项目比较大的时候&#xff0c;经常需要分包加载。它有助于控制主包的大小&#xff0c;从而提升小程序的启…...

什么是VR展示?VR展示的用途

随着科技的迅猛发展&#xff0c;我们步入一个全新的数字时代。在这个时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术崭露头角&#xff0c;逐步改变我们对世界的认知。全景展示厅作为VR技术与传统展览艺术的完美结合&#xff0c;以独特的全景视角&#xff0c;引领我们…...

.NET外挂系列:4. harmony 中补丁参数的有趣玩法(上)

一&#xff1a;背景 1. 讲故事 前面几篇我们说完了 harmony 的几个注入点&#xff0c;这篇我们聚焦注入点可接收的几类参数的解读&#xff0c;非常有意思&#xff0c;在.NET高级调试 视角下也是非常重要的&#xff0c;到底是哪些参数&#xff0c;用一张表格整理如下&#xff…...

Go语言中new与make的深度解析

在 Go 语言中&#xff0c;new 和 make 是两个用于内存分配的内置函数&#xff0c;但它们的作用和使用场景有显著区别。 理解它们的核心在于&#xff1a; new(T): 为类型 T 分配内存&#xff0c;并将其初始化为零值&#xff0c;然后返回一个指向该内存的指针 (*T)。make(T, ar…...

3、ubantu系统 | 通过vscode远程安装并配置anaconda

1、vscode登录 登录后通过pwd可以发现目前位于wangqinag账号下&#xff0c;左侧为属于该账号的文件夹及文件。 通过cd ..可以回到上一级目录&#xff0c;通过ls可以查看当前目录下的文件夹及文件。 2、安装 2.1、下载anaconda 通过wget和curl下载未成功&#xff0c;使用手动…...

【Unity】 HTFramework框架(六十五)ScrollList滚动数据列表

更新日期&#xff1a;2025年5月16日。 Github 仓库&#xff1a;https://github.com/SaiTingHu/HTFramework Gitee 仓库&#xff1a;https://gitee.com/SaiTingHu/HTFramework 索引 一、ScrollList滚动数据列表二、使用ScrollList1.快捷创建ScrollList2.ScrollList的属性3.自定义…...