论文阅读:Attention is all you need

Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[J]. Advances in neural information processing systems, 2017, 30.

引言

文章首先引入循环模型存在一个根本性的计算瓶颈,即循环模型通常沿输入和输出序列的符号位置进行计算,在计算时刻t,模型会根据前一时刻的隐藏状态ht-1和当前位置的输入生成新的隐藏状态ht,这种固有的顺序性导致无法在训练样本内部进行并行化计算,当序列长度增加时,由于内存限制限制了批处理(batching)的大小,这一问题变得尤为严重。

文章提出了Transformer模型架构,完全摒弃了循环和卷积,并通过完全依赖注意力机制来建立输入和输出之间的全局依赖关系,具有高度并行化和训练速度极快的特点。

模型架构

Transformer 模型摒弃了传统的循环或卷积结构,采用了基于注意力机制的编码器-解码器(Encoder-Decoder)架构。其中编码器由6个相同的层堆叠而成,每层包含两个子层:一个是多头自注意力机制,另一个是简单的基于位置的全连接前馈网络,每个子层周围都采用了残差连接随后进行层归一化;解码器由6个相同的层堆叠而成,除了编码器中的两个子层外,解码器插入了第三个子层,用于对编码器堆栈的输出执行多头注意力,解码器中的自注意力子层经过修改,引入了掩码(Masking)机制,这种掩码确保了对位置i的预测只能依赖于小于i的已知输出,从而保持了自回归属性。

对于注意力机制,缩放点积注意力输入包括查询、键和值,计算

Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt{d_{k}}})V

,对于较大的dk值,点积结果的幅度会变大,导致 Softmax 函数进入梯度极小的区域,为了抵消这种影响,点积结果会除以

\sqrt{d_{k}}

进行缩放;多头注意力不再执行单一的注意力功能,而是将查询、键和值分别线性投影h次到隐藏维度,这些投影后的版本并行执行注意力功能,输出结果被拼接并再次投影,得到最终值,这种机制允许模型在不同位置关注来自不同表示子空间的信息。

除了注意力子层外,编码器和解码器的每一层都包含一个全连接的前馈网络,该网络分别且相同地应用于每个位置,由两个线性变换和中间的一个 ReLU 激活函数组成;对于嵌入层和softmax,模型使用学习到的嵌入将输入和输出token转换为dmodel的向量,在两个嵌入层和 Softmax 前的线性变换之间共享相同的权重矩阵,且在嵌入层中,权重会乘以

\sqrt{d_{model}}

由于模型不包含循环和卷积,为了利用序列的顺序信息,必须注入关于 Token 相对或绝对位置的信息【注意这里是否说明只有循环和卷积可以先天保持位置关系,即使是一维的】,位置编码被添加到编码器和解码器底部的输入嵌入中。具体而言,

PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}})

PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}})

。选择这种函数是因为它允许模型通过相对位置轻松学习关注,因为对于任何固定的偏移k,

PE_{pos+k}

都可以表示为

PE_{pos}

的线性函数。

为什么选择自注意力

自注意力机制连接所有位置的操作数是常数,相对的,RNN是O(N),卷积层需要

O(n/k)

O(log_k(n))

层才能连接所有对的输入输出位置。当序列长度n小于表示维度d时,自注意力层的计算速度快于循环层。此外,显而易见的是由于可以看见注意力分布,attention的可解释性是很好的。

结果

对于不同参数的作用进行了分析,对于注意力头数与维度,保持计算量不变,调整注意力头数和键/值维度,单头注意力/过多的头数都会导致质量下降;减小注意力键的维度会损害模型质量;必须使用dropout(0.0的时候性能显著下降);将正弦位置编码替换为学习到的位置嵌入,两者的结果几乎相同。作者最终选择正弦编码,是因为它可能允许模型推断出比训练期间遇到的序列更长的序列。


这里需要补充的内容:

1.关于inputs和outputs在不同任务中长什么样子

  • 考虑机器翻译任务,inputs始终是原始语言的完整句子,一次性并行处理整个句子,生成 Key 和 Value 矩阵供 Decoder 查询。decoder侧在训练时使用shifted right的标准答案句子,例如,标准翻译是 <sos> Ich liebe dich <eos>,Decoder 的输入就是 <sos> Ich liebe dich。模型预测的下一个 token。位置 0 的输入 <sos> 预测 Ich,位置1的输入 Ich 预测 liebe... 这些是并行计算的,因为使用了 Mask 机制防止看到未来(只能利用之前的信息);推理时使用自回归架构,Step 0的时候Encoder 输入 "I love you"。Decoder 输入 [<sos>]。Output 预测 Ich;Step 1:的时候Decoder 输入变成 [<sos>, Ich]。Output 预测 liebe......如此周而复始直到输出eos。
  • 上下文续写通常只使用decoder部分,但是如果坚持用encoder-decoder架构的话就把原始文本放到encoder侧,然后decoder不断生成新的东西

2.为什么token不知道自己的位置

卷积神经网络(CNN)知道位置是因为卷积核是滑动的;循环神经网络(RNN)知道位置是因为它是按时间步t依次递归计算的,但是自注意力层实际上并不清楚位置,如果不加位置编码,对于模型来说,"I eat apple" 和 "apple eat I" 在 Self-Attention层看来是完全一样的“词袋”(因为相当于只是计算上下文的东西然后更新自己的向量,前后无所谓的)。

3.为什么需要sin/cos交替

这实际上构成了一组不同频率的波。低维度的波长短变化快,高维度的波长长变化慢(导致整体出来的d_model维度的位置编码类似二进制数字),这种组合能为每个位置生成一个独一无二的编码纹理。此外,对于pos+k,其编码向量可以看作是位置pos的编码向量*一个与pos无关、只与k有关的线性变换矩阵,这意味着模型在计算 Attention时,能够很容易地学到相对位置信息(不是绝对位置100和105的关系,而是“相距5个单位之间的关系”),这使得模型具有更好的外推性,即在训练时只见过短句子,测试时遇到比训练集更长的句子,这种相对位置的规律依然成立。

4.添加位置编码不会搞脏语义特征吗

使用的是高维度的d_model,在高维空间中,向量分布是非常稀疏的。位置编码向量和词嵌入向量在数学上倾向于正交,这意味着它们占据了空间中不同的“子空间”。模型可以通过学习不同的权重矩阵将这两种信息轻易地剥离出来,此外除了残差连接,Embedding 层会将权重乘以

\sqrt{d_{model}}

,这意味着语义 Embedding 的数值量级被放大了,而位置编码 Sin/Cos 的值始终在[-1,1]之间,因此对原始语义特征的影响微乎其微。这里实际上是一种最简易的特征融合,类似相加,只不过加的东西是不可学习的罢了。


Read more

告别重复劳动:用AI数据标注工具提速3倍的实战经验

告别重复劳动:用AI数据标注工具提速3倍的实战经验

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕AI这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * 告别重复劳动:用AI数据标注工具提速3倍的实战经验 * 为什么数据标注是“效率黑洞”? * AI标注工具的核心优势:不只是快,更是智能 * 实战经验:从0到1的AI标注落地 * 项目背景:一个真实的数据标注挑战 * 工具集成:代码示例详解 * 步骤1:安装依赖库 * 步骤2:加载预训练模型(使用PyTorch) * 步骤3:集成到Label Studio工作流 * 步骤4:人工审核界面优化 * 速度与质量实测数据 * 流程优化:用Mermaid重构标注工作流 * 避坑指南:实战中的常见陷阱 * 陷阱1:AI模型不匹配业务场景 * 陷阱2:数据格式不兼容

AI的提示词专栏:“Few-Shot” 示例的最佳摆放方式

AI的提示词专栏:“Few-Shot” 示例的最佳摆放方式

AI的提示词专栏:“Few-Shot” 示例的最佳摆放方式 本文围绕 “Few-Shot” 示例摆放方式展开,先指出其位置对模型判断任务规则优先级的核心影响,因模型会按输入顺序构建 “语境权重”。接着针对不同场景给出策略:基础任务采用 “核心指令→Few-Shot 示例→用户输入” 闭环,复杂任务用 “背景说明→Few-Shot 示例→核心指令→用户输入” 锚定方向,多任务场景则将示例与子任务绑定。还提供避坑指南,如避免示例前置、控制背景长度等,并适配不同模型特性调整摆放,最后通过实战测试量化不同摆放位置效果,得出 “指令→示例→输入” 普适性最强的结论。 人工智能专栏介绍     人工智能学习合集专栏是 AI 学习者的实用工具。它像一个全面的 AI 知识库,把提示词设计、AI 创作、智能绘图等多个细分领域的知识整合起来。无论你是刚接触 AI 的新手,还是有一定基础想提升的人,都能在这里找到合适的内容。

免费薅字节最强AI视频生成器!Seedance 2.0 全攻略,每天十几条随便造

免费薅字节最强AI视频生成器!Seedance 2.0 全攻略,每天十几条随便造

最近AI视频圈有个大动静——字节跳动旗下的Seedance 2.0来了。 这玩意儿什么水平?简单说,就是直接对标Sora 2和VEO 3.1的国产AI视频生成模型。测试下来,效果不仅不输,某些方面甚至还能反超。关键是,它有一堆免费渠道可以用,不用像Sora那样还得花钱订阅。 今天就把这些免费渠道全扒出来,手把手教你每天薅十几条高质量AI视频。 Seedance 2.0 vs Sora 2:到底谁更强? 先简单对比一下这两款产品,方便大家心里有数。 出境功能 Sora 2有个很牛的"Cast in"功能,可以把真人视频转成AI视频,还能保持人物一致性。这个功能Seedance 2.0也有,就在即梦App里。 不过Sora 2不限出境人数(虽然超过5个人物容易混淆),即梦App版本限制3个人+1个道具。普通用户够用了,真要拍大片场景,Sora确实更灵活一些。 分辨率

Kubernetes 与 AI 集成最佳实践

Kubernetes 与 AI 集成最佳实践 一、前言 哥们,别整那些花里胡哨的。Kubernetes 与 AI 集成是现代云原生架构的重要趋势,今天直接上硬货,教你如何在 Kubernetes 中部署和管理 AI 工作负载。 二、AI 工作负载类型 类型特点资源需求训练工作负载计算密集型高 GPU 需求推理工作负载低延迟要求中等 GPU 需求数据处理存储密集型高存储 I/O模型服务高并发稳定资源需求 三、实战配置 1. GPU 资源管理 apiVersion: v1 kind: ConfigMap metadata: name: nvidia-device-plugin namespace: kube-system data: config.yaml: | version: v1 flags: migStrategy: single