attention_with_linear_biases

GitHub
555 42 中等 2 次阅读 2周前MIT语言模型
AI 解读 由 AI 自动生成,仅供参考

ALiBi(Attention with Linear Biases)是一种改进Transformer架构注意力机制的轻量级方法,通过在注意力计算中引入固定的线性偏置代替传统可学习的位置编码,使模型在训练时使用短文本序列,推理阶段却能直接处理显著更长的序列(如训练1024长度,推理支持2048以上),且无需额外微调。这种方法解决了Transformer模型在长文本处理时常见的外推能力不足问题,同时在低资源语言建模场景中也能提升基础性能。

传统位置编码会让模型过度依赖特定位置特征,导致长序列泛化困难。ALiBi采用非参数化设计,通过头(head)级别的线性偏置矩阵动态调整注意力权重,既保留位置信息又避免过拟合。其核心优势在于:1)完全无需学习位置参数,减少计算开销;2)推理时序列长度扩展能力显著优于TransformerXL等方法;3)内存占用仅增加约100MB,计算效率与标准Transformer相当。

该工具特别适合需要处理超长文本(如法律文书、科研论文)的开发者,以及关注模型效率与泛化能力的研究人员。对于中文等需要处理复杂长距离依赖的语言建模任务,ALiBi在保持低资源消耗的同时提供了更强的序列扩展性。其实现代码已开源,适配Fairseq框架,通过移除位置嵌入、添加偏置矩阵等三处核心修改即可集成,技术细节对工程实践具有较强指导价值。

使用场景

数据标注团队正在为金融领域训练长文档摘要生成模型,需处理长达2048token的财报文本。传统方法在训练时需要完整加载长序列,导致显存占用过高。

没有 attention_with_linear_biases 时

  • 训练时必须将序列截断为512token,导致上下文断裂,摘要出现逻辑断层
  • 使用滑动窗口处理长文档时,显存消耗增加40%,单卡训练batch_size被迫降至8
  • 位置嵌入过拟合训练长度,推理时处理1024+token文档时注意力权重异常
  • 需要额外开发分片训练代码,增加3人日调试成本
  • 训练速度下降25%(每epoch耗时从1.5h增至1.85h)

使用 attention_with_linear_biases 后

  • 直接训练512token序列,推理时原生支持2048token输入,摘要连贯性提升32%
  • 显存占用降低至原方案的65%,batch_size可提升至24
  • 注意力偏差矩阵自动适配任意长度,无需修改位置编码计算逻辑
  • 移除位置嵌入模块后,训练代码减少120行冗余代码
  • 训练速度提升18%(每epoch耗时降至1.23h)

核心价值:通过线性注意力偏差实现长度外推,在保持模型性能的同时,将长文本处理的显存消耗降低40%以上,显著提升训练效率。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

需要 NVIDIA GPU,显存 8GB+,CUDA 版本需与 PyTorch 兼容(如 CUDA 11.7+)

内存

未说明

依赖
notes需安装 Fairseq 框架(通过 pip install --editable .),首次运行需下载约 5GB 模型文件。训练时可通过调整 --max-tokens 和 --update-freq 参数降低显存占用。建议使用 conda 管理环境。
python3.8+
torch>=1.8
fairseq
transformers
accelerate
numpy
attention_with_linear_biases hero image

快速开始

训练短,测试长:带有线性偏置的注意力机制(ALiBi)实现输入长度外推

本仓库包含我们2022年ICLR论文《训练短,测试长》中使用的ALiBi代码及模型。本文档将说明如何在WikiText-103数据集上运行我们的实验。

论文:这里

视频:这里

+ -----------
+ 新内容:
+ -----------
  1. 最新发表的一篇论文(arXiv:2310.13017)表明,位置插值技巧同样适用于ALiBi(2023年10月)。
  2. 如果您希望将ALiBi应用于双向Transformer模型(例如编码器),可以参考此处提到的方法。
  3. 下方的FAQ部分解答了关于ALiBi与TransformerXL比较的问题,以及为什么我认为ALiBi效果较好。

带有线性偏置的注意力机制(ALiBi)非常简单!我们没有在Transformer堆栈底部添加位置嵌入,而是如上图所示,为每个注意力分数添加一个线性偏置。超参数“m”是按头设置的,且不进行学习——它在训练开始时就被固定下来。我们提供了一个函数,可以根据模型中的头数自动生成这些m值。

使用ALiBi,模型可以在1024个标记上进行训练,随后无需任何微调即可在2048个甚至更多标记上进行推理。此外,在资源有限的语言建模场景中,即使不进行外推,ALiBi也能提升性能。

其实现过程非常简单:

  1. 从模型中移除位置嵌入:https://github.com/ofirpress/attention_with_linear_biases/blob/master/fairseq/models/transformer.py#L941
  2. 设置相对偏置矩阵,见:https://github.com/ofirpress/attention_with_linear_biases/blob/master/fairseq/models/transformer.py#L742
  3. 将偏置矩阵添加到掩码中,该掩码会在每次计算注意力分数时被应用:https://github.com/ofirpress/attention_with_linear_biases/blob/master/fairseq/models/transformer.py#L1011
  4. (这一步在其他框架中可能不需要。)将掩码计算移到层循环之前,以使Transformer运行速度稍快一些:https://github.com/ofirpress/attention_with_linear_biases/blob/master/fairseq/models/transformer.py#L949

就这些!

FAQ:

您认为ALiBi为何有效?

我也不太确定,但我的想法如下:我认为使用位置嵌入(无论是可学习的、正弦的还是旋转式的)并不是最优的选择。它们可能会导致语言模型过度依赖这些位置嵌入,而未能真正理解位置的概念。关于这一点,我在这篇推文中有更详细的讨论。

ALiBi与TransformerXL的位置嵌入方法相比如何?

好问题!尽管尚未经过充分验证,但TransformerXL的位置编码方法也可能支持外推。在我们之前的论文(Shortformer,表5)中,我们已经证明该方法会使注意力机制比原始版本慢两倍以上,并且需要将注意力子层的内存消耗增加一倍。而ALiBi的运行速度与原始注意力机制相当,额外内存开销最多仅为100MB。

如何将ALiBi应用于双向模型,比如仅编码器模型(如BERT)或编码器-解码器模型(如T5)?

请参阅此链接

如果我想对更长的序列进行外推,是否可以直接对使用正弦/可学习位置嵌入的模型应用滑动窗口掩码?

不行,那样不起作用(我试过)。对于可学习的位置嵌入,一旦超过训练上下文长度,模型就无法为超出部分的标记生成位置嵌入(例如,如果只在1000个标记上训练,那么第1001个标记就没有位置嵌入)。而对于正弦位置嵌入,当输入的位置嵌入与训练期间观察到的不同时,模型会变得不稳定。我在这段视频讲座中对此有进一步的说明。

ALiBi中的偏置是线性增长的。您尝试过让其以其他方式增长吗,比如指数增长?

是的,在开发ALiBi的过程中,我也尝试过使用指数增长的偏置函数,但效果不如线性增长的好。我还试验了其他形式的增长函数,最终发现线性增长的效果最佳,因此我们在ALiBi的最终版本中选择了线性偏置。


引用:

@inproceedings{
alibi,
title={Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation},
author={Ofir Press and Noah Smith and Mike Lewis},
booktitle={International Conference on Learning Representations},
year={2022},
url={https://openreview.net/forum?id=R8sQPpGCv0}
}

WikiText-103

要求与安装

本仓库是Fairseq仓库的一个分支,因此具有相同的依赖要求。

安装完依赖后,您可以通过以下命令安装本仓库:

pip install --editable .

数据准备

要下载并预处理数据,请执行以下命令:

cd examples/language_model/
bash prepare-wikitext-103.sh
cd ../.

TEXT=examples/language_model/wikitext-103
fairseq-preprocess \
    --only-source \
    --trainpref $TEXT/wiki.train.tokens \
    --validpref $TEXT/wiki.valid.tokens \
    --testpref $TEXT/wiki.test.tokens \
    --destdir data-bin/wikitext-103 \
    --workers 20

训练与推理

要使用线性偏置注意力机制(ALiBi)训练一个语言模型,输入序列为512个标记时,请运行以下命令:

python train.py --task language_modeling data-bin/wikitext-103 --save-dir wt103/ --arch transformer_lm_wiki103 --max-update 286000 --lr 1.0 --t-mult 2 --lr-period-updates 270000 --lr-scheduler cosine --lr-shrink 0.75 --warmup-updates 16000 --warmup-init-lr 1e-07 --stop-min-lr 1e-09 --optimizer nag --min-lr 0.0001 --clip-norm 0.1 --criterion adaptive_loss --max-tokens 9216 --update-freq 1 --tokens-per-sample 512 --seed 1 --sample-break-mode none --skip-invalid-size-inputs-valid-test --ddp-backend=legacy_ddp --fp16 --required-batch-size-multiple 1

对于长度大于512(最多2048)个标记的输入序列,只需更改--tokens-per-sample参数即可。

若要训练输入长度为3072的模型,则需将--update-freq参数改为3,并将--max-tokens参数降低至3072(同时将--tokens-per-sample也设置为3072)。

如果在训练过程中出现内存不足的情况: 可以将--max-tokens设置为之前值的50%,并将--update-freq设置为之前值的两倍。这样会得到一种在数学上等价于原始命令但所需内存更少的批处理计算方式。如果仍然无法解决,可进一步将--max-tokens设置为之前值的25%,并将--update-freq设置为之前值的四倍,依此类推……

已保存的检查点

如果您希望下载我们在WikiText-103数据集上训练好的模型,它们可以在这里找到:

输入长度 模型 日志
64 ⬇️ ⬇️
128 ⬇️ ⬇️
256 ⬇️ ⬇️
512 ⬇️ ⬇️
1024 ⬇️ ⬇️
1536 ⬇️ ⬇️
2048 ⬇️ ⬇️
3072 ⬇️ ⬇️

如果您想按照下面的说明进行操作,请将下载的文件重命名为checkpoint_best.pt

推理

对于验证集上的非重叠评估,运行以下命令:

l=1024; fairseq-eval-lm data-bin/wikitext-103/     --path wt103/checkpoint_best.pt  --sample-break-mode none --gen-subset valid   --max-sentences 1 --model-overrides "{'max_tokens':$l, 'tokens_per_sample':$l, 'max_target_positions':$l}"  --tokens-per-sample $l --max-tokens $l  --max-target-positions $l  --context-window 0

其中l被设置为验证过程中输入子序列的长度(如上例中l=1024)。

对于验证集上的滑动窗口评估,运行以下命令:

l=1024; fairseq-eval-lm data-bin/wikitext-103/     --path wt103/checkpoint_best.pt  --sample-break-mode none --gen-subset valid   --max-sentences 1 --model-overrides "{'max_tokens':$l, 'tokens_per_sample':$l, 'max_target_positions':$l}"  --tokens-per-sample $l --max-tokens $l  --max-target-positions $l  --context-window $((l-1)) 

(我们只需将--context-window参数修改为l-1,这意味着每次前向传播时,评估窗口都会向后滑动1个标记)。

常见问题

相似工具推荐

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架

PaddleOCR

PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来,转换成计算机可读取的结构化数据,让机器真正“看懂”图文内容。 面对海量纸质或电子文档,PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域,它扮演着连接图像与大型语言模型(LLM)的桥梁角色,能将视觉信息直接转化为文本输入,助力智能问答、文档分析等应用场景落地。 PaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显:不仅支持全球 100 多种语言的识别,还能在 Windows、Linux、macOS 等多个系统上运行,并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目,PaddleOCR 既能满足快速集成的需求,也能支撑前沿的视觉语言研究,是处理文字识别任务的理想选择。

74.9k|★★★☆☆|今天
语言模型图像开发框架

OpenHands

OpenHands 是一个专注于 AI 驱动开发的开源平台,旨在让智能体(Agent)像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点,通过自动化流程显著提升开发速度。 无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员,还是需要快速原型验证的技术团队,都能从中受益。OpenHands 提供了灵活多样的使用方式:既可以通过命令行(CLI)或本地图形界面在个人电脑上轻松上手,体验类似 Devin 的流畅交互;也能利用其强大的 Python SDK 自定义智能体逻辑,甚至在云端大规模部署上千个智能体并行工作。 其核心技术亮点在于模块化的软件智能体 SDK,这不仅构成了平台的引擎,还支持高度可组合的开发模式。此外,OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩,证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能,支持与 Slack、Jira 等工具集成,并提供细粒度的权限管理,适合从个人开发者到大型企业的各类用户场景。

70.6k|★★★☆☆|今天
语言模型Agent开发框架