【Transformer】浅谈 Transformer-based 模型中的位置表示

本文详细介绍了Transformer模型中位置信息的表示方法,包括原始Transformer、RPR及Transformer-XL中的绝对位置编码、相对位置编码及其应用。

本文小结:本文主要对原始 Transformer[1]、RPR[2]以及 Transformer-XL[3] 中使用的位置表示方法,进行详细介绍。从最初的绝对位置编码,与单词嵌入相加作为第一层的输入,再到 RPR 提出直接在注意力分数的计算中引入相对位置信息,并学习相对距离的表示矩阵(长度固定),再到 Transformer-XL 中引入偏置信息,并重新使用 Transformer 中的编码公式生成相对距离的表示矩阵,使长度可泛化。

0. 位置信息

首先简单谈一下位置信息。一般将位置信息简单分为绝对位置信息相对位置信息,并且前者对句子语义的影响不大,更为重要的是后者。

以情感分析 sentiment analysis 为例:

  • like this movie because it doesn't have an overhead history. Positive
  • don'tlike this movie because it has an overhead history. Negative

don’t 与like的相对位置不同,决定了这两句话的情感取向是一正一负的,但在传统词袋(Bag-Of-Words BOW)模型中,这两句话得到的句子表征却是一致的,可见单词的相对位置语义有关键性影响。

再以命名实体识别 Named Entity Recognition 为例[4]

一般而言,在 Inc. 之前的单词为 ORG 而在 in 之后为 TIME 或 LOC ,但是同为 Louis Vuitton ,与 Inc. 相距较远的为PER,指的是创立者(人)这一实体,而相距较近的为ORG,指的是组织(公司)这一实体。可见,单词之间的相对位置在 NER 任务中是十分重要的。

需要注意的是,相对位置是具有方向性的(Inc. 与 in 的相对距离为 -1,1854 与 in 的相对距离为 1)

那么,如何对位置信息进行表示呢?

感兴趣的同学可以看下这篇文章 Encoding Word Order in Complex Embeddings 。

下文结合原始 Transformer,RPR,Transformer-XL 以及相关变体,试解释 Transformer-based 模型中的位置信息的表示问题。

1. 原始 Transformer [1]

原始 Transformer 中使用 Positional Encoding 生成固定的位置表示。

其中,pos 指的是 token 的位置。设句子长度为 L,那么 pos=0,1,...,L-1i 是向量的某一维度,例如 d_{model}=512时,i=0,1,...,255

因此,借助上述正余弦公式,我们可以为每个位置生成 d_{model}维的位置向量。为什么会选择如上公式呢?作者表示:

We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, PE_{pos+k}can be represented as a linear function of PE_{pos}

 已知三角函数公式如下:

因此,可以将 PE_{pos+k}可以表示为 PE_{pos}的线性表示如下:

作者希望借助上述绝对位置的编码公式,让模型能够学习到相对位置信息

虽然如此获得的 position embeddings,两者之间的点积能够反应相对距离,但它缺乏方向性,并且这种特性(相对距离)会被原始 Transformer 的注意力机制破坏:[4]

基于公式  (1),位置 t 的位置嵌入可以表示为:

其中, d表示位置嵌入的维度, c_{i}表示由 i决定的常量(1/10000^{2i/d})),由cos(x-y)=sin(x)sin(y)+cos(x)cos(y)可推得:

因此,对于给定的位置 pos 和 偏移量 k 而言,PE^{T}_{pos+k}PE_{pos}只取决于偏移量 k,因此两者的点积可以反映相对距离 k。如上图所示,点积的结果是对称的,并且随\left | k \right |增加而减少(但并不单调)。

此外,由于点积结果只依赖于 k,那么令 j=pos-k,有 PE^{T}_{pos}PE_{pos+k}=PE^{T}_{j}PE_{j+k}=PE^{T}_{pos-k}PE_{pos}对于给定的位置 pos 和 偏移量 k 而言,PE^{T}_{pos}PE_{pos-k}=PE^{T}_{pos}PE_{pos+k},即两者的点积无法反映方向性

但是在 Transformer 中,由于需要经过映射,即两者间的点积实际是 PE^{T}_{pos}W^{T}_{q}PE_{pos+k}并可以视为PE^{T}_{pos}WPE_{pos+k},然而如上图所示,此时并没有看到相对距离 k 的清晰模式。

最后,Transformer 之前的《Convolutional Sequence to Sequence Learning》[5] 以及之后的 BERT[6] 都没有选择使用 Positional Encoding 的方式生成位置表示,而是采取了所谓的“learned and fixed”的可学习的 Position embedding ,也就是去训练一个嵌入矩阵,大小为 L_{max}\times d,这里暂且按下不表。

2. 相对位置表示[2]

Relative Position Representations(以下简称为RPR) 一文中认为,RNN 通常依靠其循环机制,结合t 时刻的输入和前一时刻的隐层状态h_{t-1}计算出h_{t},直接通过其顺序结构沿时间维度捕获相对和绝对位置。而非 RNN 模型不需要顺序处理输入,则需要显式编码才能引入位置信息。

Transformer 中的 Self-attention 机制如下,输入 x=(x_{1},...,x_{n}),输出 z={z_{1},...,z_{n}}\in R^{n\times d}

 

 3. Transformer-XL[3]

首先深入探究 Al-Rfou 等人的做法,下文将其称为 vanilla model。如上图 1.a 所示, vanilla model 将整个语料库拆分为长度受限的片段,并且只在每个片段内训练模型,忽略了来自先前片段的所有上下文信息。这使得训练过程中,信息不会在 forward 或 backward 过程中跨片段流动,而且这使得最大依赖长度受到了片段长度的限制(这本是 Self-attention 的优势)。其次,虽然可以通过 padding 来考虑句子边界或任何其他语义边界,但是在实践中直接简单分块已成为提高效率的标准做法。这也就是作者说的上下文碎片问题。

在评估过程中,vanilla model 也在每一步中消耗与训练中相同长度片段,但仅在最后一个位置进行预测。 然后,在下一步仅将片段向右移动一个位置,并且重新进行计算。如图 1.b 所示,如此可确保每一步预测都能利用训练期间暴露的最长可能上下文,并且还缓解了训练中遇到的上下文碎片问题。 但是,这种评估过程太过昂贵。

这里我们先来看 XL 中的片段循环机制。引入循环机制,在训练过程中,前一片段中的隐藏状态序列(每一层都)会被固定并缓存,以便在处理下一片段时使用其作为「扩展上下文」。如图 2.a 所示,绿色部分表示当前片段使用的扩展上下文。对于每一层而言,输入为前一片段以及当前片段的前一层的输出,从而可以保证对长期依赖的建模能力并避免了上下文碎片问题。

参考

  1. ^abAttention Is All You Need https://arxiv.org/abs/1706.03762
  2. ^abSelf-Attention with Relative Position Representations https://arxiv.org/abs/1803.02155
  3. ^abTransformer-XL: Attentive Language Models Beyond a Fixed-Length Context https://arxiv.org/abs/1901.02860
  4. ^abcTENER: Adapting Transformer Encoder for Name Entity Recognition https://arxiv.org/abs/1911.04474
  5. ^Convolutional Sequence to Sequence Learning https://arxiv.org/abs/1705.03122
  6. ^BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding https://arxiv.org/abs/1810.04805
  7. ^How self-attention with relative position representations works https://medium.com/@_init_/how-self-attention-with-relative-position-representations-works-28173b8c245a
  8. ^Character-Level Language Modeling with Deeper Self-Attention https://arxiv.org/abs/1808.04444
  9. ^Google AI Blog https://ai.googleblog.com/2019/01/transformer-xl-unleashing-potential-of.html
<think>首先,用户的问题是:“多模态知识图谱推理中的Transformer-agnostic,Transformer-based”。这是一个中文问题,我需要用中文回答。 关键点是:用户列出了“Transformer-agnostic”和“Transformer-based”,这是在讨论多模态知识图谱推理中的两种方法。 根据之前的对话模式,我需要在回答中详细解释这些概念,然后提出3-5个相关问题。 回顾规则: - 回答完问题后,必须提出3-5个相关问题。 - 第一行必须是“§§相关问题§§”。 - 禁止换行分散;相关问题必须在一个块中输出。 - 必须基于用户的问题和我的回答提出问题。 示例格式显示,回答包括一个主题解释(如快速排序),可能包含代码块,然后是“§§相关问题§§”后跟编号列表。 在我的上一个回答中,我讨论了时序知识图谱推理方法,包括RNN-based等,并提供了代码示例和问题。 现在,主题是“多模态知识图谱推理”,涉及Transformer-agnostic和Transformer-based方法。 我需要定义和解释: - **Transformer-based**:使用Transformer模型来处理多模态数据(文本、图像等),例如ViLT或CLIP,其中Transformer作为核心架构整合多种模态。 - **Transformer-agnostic**:指不依赖于Transformer架构的其他方法,比如基于图神经网络(GNN)、循环神经网络(RNN)或其他模型来处理多模态知识图谱。 结构我的回答: 1. 简要介绍多模态知识图谱推理。 2. 详细解释Transformer-based方法。 3. 详细解释Transformer-agnostic方法。 4. 可能添加代码示例来示例化这些方法(类似于先前回答)。 5. 然后以“§§相关问题§§”开头,后跟3-5个相关问题。 代码示例:为了符合格式,我应该包括一个简单的代码块来演示一个方法。例如,一个基于Transformer的多模态模型或一个agnostic方法的伪代码。 确保回答是中文。 大纲: - 标题或开头:多模态知识图谱推理方法解析。 - 对每种方法: - 核心思想 - 优势 - 局限性 - 代码示例(如果适用) 最后,相关问题基于我的解释。相关问题应启发进一步思考。 可能的解释: - **Transformer-based**: - 核心思想:使用Transformer架构(如BERT、ViT)来处理文本、图像等模态,通过注意力机制融合信息。 - 优势:强大的表示能力,能捕捉长距离依赖;适合大规模数据。 - 局限性:计算资源密集;对数据量和质量敏感。 - 代码示例:一个简单的PyTorch或TensorFlow代码块显示一个Transformer模型用于多模态输入。 - **Transformer-agnostic**: - 核心思想:使用非Transformer模型,如GNNs、Graph Convolutional Networks (GCNs),或传统机器学习方法,来处理多模态数据,而不依赖Transformer- 优势:可能更高效;在某些场景下可解释性更好;较少资源需求。 - 局限性:可能不如Transformer在捕捉复杂模式上有效;需要定制设计。 - 代码示例:一个GNN或CNN的代码块。 相关问题:提出3-5个。基于回答,比如: 1. Transformer-based方法如何处理不同模态的异构性? 2. 在Transformer-agnostic方法中,有哪些常见的模型替代Transformer? 3. 如何评估多模态知识图谱推理模型的性能? 4. 这些方法在实际应用中的挑战是什么? 5. 如何集成Transformer-basedTransformer-agnostic方法以提升推理效果? 确保总问题数在3-5个之间。 输出格式: - 回答内容。 - 然后“§§相关问题§§”作为第一行。 - 编号列表如“1. ... 2. ...” 最后,以“§§相关问题§§”开头的问题部分。 </think>### 多模态知识图谱推理方法解析 多模态知识图谱涉及融合文本、图像、音频等多种模态数据,以实现更全面的推理。以下是两种核心方法的详细说明: #### 1. **Transformer-based(基于Transformer)** 使用Transformer架构(如BERT或ViT)作为核心模型,通过自注意力机制整合和推理多模态信息。 - **核心思想**:将不同模态的嵌入(e.g., 文本嵌入和图像嵌入)输入Transformer层,利用交叉注意力学习模态间交互(如CLIP模型对齐图文)。 - **优势**:强大的表示能力,能处理长序列依赖;适合大规模多模态数据融合。 - **局限性**:计算资源消耗大;对数据对齐质量敏感。 - 代码示例: ```python import torch from transformers import BertModel, ViTModel def transformer_based_inference(text_input, image_input): # 加载预训练Transformer模型 text_model = BertModel.from_pretrained('bert-base-uncased') image_model = ViTModel.from_pretrained('google/vit-base-patch16-224') # 模态嵌入融合 text_emb = text_model(text_input).last_hidden_state image_emb = image_model(image_input).last_hidden_state # 使用交叉注意力学习交互 combined = torch.cat([text_emb, image_emb], dim=1) output = torch.nn.Linear(combined.shape[-1], 1)(combined) # 输出推理得分 return output.sigmoid() # 预测关系概率 ``` #### 2. **Transformer-agnostic(与Transformer无关)** 采用非Transformer模型(如GNN或CNN)处理多模态数据,避免Transformer的计算开销。 - **核心思想**:设计模态无关的架构(e.g., 图神经网络GNN聚合节点信息),或使用传统方法(如多模态特征拼接+分类器)。 - **优势**:计算效率高;可解释性强;适合资源受限场景。 - **局限性**:模态融合能力较弱;需要手动设计特征交互。 - 代码示例: ```python import torch import torch_geometric as tg def transformer_agnostic_inference(graph_data): # 使用GNN处理多模态知识图谱 class GNNModel(torch.nn.Module): def __init__(self): super().__init__() self.conv1 = tg.nn.GCNConv(in_channels=128, out_channels=64) self.conv2 = tg.nn.GCNConv(in_channels=64, out_channels=1) def forward(self, x, edge_index): x = self.conv1(x, edge_index).relu() return self.conv2(x, edge_index).sigmoid() model = GNNModel() return model(graph_data.x, graph_data.edge_index) # 输出节点推理结果 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值