一、注意力机制
1、核心架构
注意力机制的核心架构由 Query、Key 和 Value 三个主要组成部分构成。
- Query:代表了当前正在处理的元素或需要关注的目标。在推荐系统中,可以是候选集中的item。
-
Key:代表了输入序列中每个元素的标识或特征。在注意力计算中,Key用于确定每个元素与Query的匹配程度。在推荐系统中可以是用户历史消费物料序列。
-
Value:包含了输入序列中每个元素的具体内容或信息。一旦确定了哪些元素与Query相关,Value就提供了这些元素的实际信息,以供模型使用。在推荐系统中可以是用户历史消费物料的评分、消费时长等相关信息。
2、流程
①计算注意力得分
使用Query和Key来计算注意力得分,通常通过点积或缩放点积来实现。
②标准化
将注意力得分通过softmax函数进行标准化,使得所有得分的和为1,这样就可以被视为概率分布。
③加权和
使用标准化后的注意力得分作为权重,对Value进行加权和,得到最终的注意力输出。
3、Nadaraya-Watson核回归
K是衡量x与x_i距离的函数。
4、参数化的注意力机制
引入了一个可学习的参数w调整x_i重要性。
二、注意力分数
1、结构
2、扩展到高维度
q和k都是向量。
根据a的不同(也就是权重计算的不同)分为以下方式:
①Additive Attention
一般来说,当查询和键是不同长度的矢量时,可以使用加性注意力作为评分函数。
将查询和键连结起来后输入到一个多层感知机(MLP)中, 感知机包含一个隐藏层,其隐藏单元数是一个超参数h。 通过使用tanh作为激活函数,并且禁用偏置项。
②scaled dot-product attention
使用点积可以得到计算效率更高的评分函数, 但是点积操作要求查询和键具有相同的长度。
三、自注意力
1、自注意力的定义
在自注意力机制中,输入序列中的每一个元素既充当 Query,又充当 Key 和 Value。这意味着,序列中的每个元素都会与序列中的其他所有元素进行交互,从而捕捉全局依赖关系。例如,Transformer 中每个单词对句子中其他单词的注意力权重是通过自注意力计算的。
自注意力机制的核心思想是通过计算输入序列中每个元素与其他元素之间的相似度,来动态调整每个元素对其他元素的关注程度。
2、位置编码
由于自注意力机制本身并不包含处理序列顺序信息的能力,因此需要位置编码来提供这种信息。
位置编码通常使用正弦和余弦函数来生成,每个位置的编码是唯一的,并且编码的模式设计成可以捕捉序列中不同位置之间的相对关系。
四、Transformer
1、架构和核心组件
①架构
Transformer 的架构包括两个主要部分:编码器(Encoder) 和 解码器(Decoder),其整体架构是一个 Encoder-Decoder 结构。
- Encoder(编码器):用于将输入序列转换为内部表示。由多个编码层堆叠而成。每一层包含以下主要模块:多头自注意力机制和FNN,Add & Norm。
- Decoder(解码器):用于将编码器的输出转化为目标序列。额外引入了与编码器交互的部分。解码器的每一层也由以下主要模块组成:多头自注意力机制,跨注意力机制,前馈神经网络,Add & Norm。
②核心组件
Transformer 的架构核心由多个模块组成,它包括 自注意力机制、多头注意力机制(Multi-Head Attention)、前馈神经网络(Feed-Forward Network, FFN),以及用于表示序列位置的 位置编码(Positional Encoding)。
2、多头注意力
①核心机制
在于通过多个独立的注意力头,同时从不同的角度或子空间学习输入数据的相互关系。
每个头可以理解为从输入的特征空间中划分出一个子空间,专注于不同的特征维度或交互关系。
如何实现在不同的子空间进行学习:采用不同的权重矩阵W_q,W_k,W_v对输入数据进行线性变换,然后独立地计算注意力权重。
②输出
通过并行处理这些头,多头注意力机制能够从多个角度捕捉用户的行为特征。最后合并各个头的输出得到最终输出。
③数学描述
④有掩码的多头注意力
掩码在解码器中是为了防止模型“偷看”未来的元素,在每个时间步,只能关注到之前生成的部分。
3、基于位置的前馈神经网络FNN
在每个 Transformer 层中,输入首先经过多头注意力机制进行特征提取,接着通过一个FNN进行进一步的非线性映射。每个位置的注意力输出是独立地通过相同的前馈神经网络处理的。
具体来说,FNN 主要包含以下几个步骤:
- 线性变换:首先输入的向量通过一个线性层进行变换,通常将维度扩展为更高维度的空间。
- 非线性激活:经过线性变换后,数据通过一个非线性激活函数(通常是 ReLU 或 GELU)来增加模型的非线性表达能力。
- 线性变换:在非线性变换后,再次通过一个线性层将向量投射回原来的维度空间。
- 残差连接:最后,将 FNN 的输出与输入进行残差连接,确保模型可以保留输入的部分信息。
在多头注意力机制中,不同位置的输入之间已经建立了全局的依赖关系,而 FNN 则针对每个位置进行局部的非线性变换,进一步增强了模型对局部信息的捕捉和处理。
非线性激活函数引入了模型的非线性,这使得 Transformer 不仅能够通过多头注意力机制建模复杂的依赖关系,还能够通过 FNN 的非线性变换,提升模型的泛化能力。
4、层归一化
①层归一化与batch norm的区别
Batch Norm是通过对一个批次的数据计算均值和方差,然后将数据归一化,使其分布在一个标准化的范围内。这能够加速训练并减轻梯度消失的问题。但是不适合序列长度变化的NLP,比如翻译语句中,一个batch里面有若干句子,每个句子长短不一,如果对一个batch里面所有句子的embedding进行归一化,需要填充较短句子的embedding。
Layer Norm是针对每个样本的每一个位置的所有特征维度进行归一化。
②层归一化的优点
- 序列建模的需求:层归一化更适合处理变长序列,不会依赖于批次数据的统计特性。
- 稳定性:层归一化在批次大小较小时(如推理阶段)依然能够稳定工作,而批归一化在小批次时容易受到数据分布的影响。
- 局部归一化:层归一化对每个输入序列中的每个位置独立归一化,这与 Transformer 的设计理念一致,避免了序列之间的相互干扰。