推荐系统 之 Transformer

本文深入解析Transformer模型,介绍了其基于注意力机制的特性,如何替代CNN和RNN处理序列数据,以及其在网络结构中的编码器和解码器设计。Transformer通过InputEmbedding和PositionalEncoding融合词义与位置信息,Multi-HeadAttention机制从不同角度捕捉词与词之间的关联。FeedForward层进一步处理得到最终的输出。在实际应用中,Transformer常用于批量处理,处理不同长度的序列并利用mask处理padding问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Transformer

        transformer有很多种形式,Transformer,Universal Transformer,Transformer XL,GPT,BERT,ERNIE,XLNet,MT-DNN。一下子全讲了那我估计人没了,决定还是学网络,用到一个就填一个坑,今天先说一下Transformer。

        Transformer 是一种新的、基于 attention 机制来实现的特征提取器,可用于代替 CNN  和 RNN 来提取序列的特征。

        同时相比于LSTM,GRU这种循环神经网络结构,Transformer可以直接补货序列中的长距离依赖关系,并且模型的并行程度高,可以减少训练时间。

2. Transformer的网络结构

         这个就是今天Transformer的主要结构了,里面包括了一个编码器,一个解码器。同样我们针对编码器和解码器一个一个看里面有什么结构以及每一个结构的运算方式,还有最终走一遍流程来达到学习Transformer的效果。

3. Input Embedding

        由于transformer模型没有循环神经网络的迭代操作, 所以我们必须提供每个字的位置信息给transformer, 才能识别出语言中的顺序关系

       首先我们先对每一个词都做一个Embedding,我们定义为Embedding后的输出size叫 Embedding Size,然后假如我们有一个句子,叫“今天天气不错”,有六个字符,经过INput Embedding Layer后,我们会得到一个 6 *  Embedding Size 的矩阵。这个矩阵的每一行都代表一个字符。

        假如我们的 Embedding Size 的维度是512,于是我们会有一个6*512的矩阵

        然后要做一个 Positional Encoding 的操作,这是为什么呢?就是这一小节的黑体字提到了,得带有位置信息,才知道顺序关系呀。于是我们用以下的公式去做计算

         这里的i究竟是指什么意思呢?我们先知道一个背景,现在我们手上已经有每一个词对应的EMbedding向量了,拼接成一个 6 *  Embedding Size 的矩阵,然后我们为了获得位置关系,相采用上面说的公式,去计算一个位置信息,这里是这样,每一个词都会对应的到一个位置向量,也就是我们最后会得到一个 6* Embedding Size的位置信息矩阵。具体的i,指的是当前的下标,所以我们计算下标对应的值是成双成对地计算出来的。

        最后,我们将两个6 * 512 的矩阵对应位置直接相加,也就是Embedding矩阵和位置信息矩阵的对应下标元素直接相加就好了。

        得到的结果还是一个 6* 512 的矩阵,但是这个剧震已经融合了Embedding信息和位置信息了。我们管这个矩阵叫Xembedding_pos

4. Multi-Head Attention

        这一小节要引用强哥的图了

        这里用图(例子)的话来做分析 The animal didn’t cross the street, because it was too tired.

        我们看 It 这个词最后得到的R矩阵(里面有R1,R2,...,Rn)里面,可以看到R_1R_2 和 It 最相关。

        每一个字经过和It计算后 组织起来会对应一个R矩阵, 这个R矩阵就是表示这个字与其他字之间某个角度上的关联性信息,这叫做单头注意力机制。从上面这个图来看,颜色最深就是说明最有关系了,也就是 It 表示的是The animal

        上看是弹头的,下面看多头的

 左边这个是两头的注意力机制,上面说到这个橙色的这个注意力反映了It这个词指代的信息。 而这个绿色的这个注意力,反应了It这个词的状态信息,可以看到It经过这个绿色的注意力机制后,tired 这个词与 It 关联最大,就是说It,映射过去,会更关注 tired 这个词,因为这个正好是它的一个状态。 它累了。

        右边就是一个字It,用了多头的注意力机制的情况了,他就是把每个头(角度)中关系最大的的给表示出来了,所以这下应该可以理解多头注意力机制究竟是在干嘛了。每个字经过多头注意力机制之后会得到一个R矩阵,这个R矩阵表示这个字与其他字在N个角度上(比如指代,状态…)的一个关联信息,这个角度就是用多个头的注意力矩阵体现的。

        我们把多头理解为从多个方向(角度)去学习/认识这个It的单词。

         上面的这个做法,我们怎么实现呢?我们用三个矩阵去做处理,分别是Q,K,V矩阵,这里用一个强哥的图来做一下直观的解释:

        你看强哥里面的 《why do we work 》其实就是我们自己例子《今天天气不错》,然后我们分别经过三个全连接层,得到了Q,K,V矩阵。其中假如我们现在有八个头(角度)来解释每一个词语,Embedding维度继续是512,然后有6个词。我们先看Q矩阵,我们经过Linear的全连接里面的 W_Q 矩阵,然后输出也是一个 6 * 512 的矩阵,这里面有512列,这512列就包括八个角度的R矩阵,所以就是相当于我们算完了一个角度,就把每一个head(角度)给横向拼接起来。每一个head(角度)的矩阵是 6 * (512/8)。 最后拼接起来就是一个 6 * 512 的Q矩阵了。

        随后,K和V矩阵都是这么计算出来,那么QKV矩阵都是代表什么意思呀?

Q表示Query,K表示Key,V表示Value。之所以引入了这三个矩阵,是借鉴了搜索查询的思想,比如我们有一些信息是键值对(key->value)的形式存到了数据库,(5G->华为,4G->诺基亚), 比如我们输入的Query是5G, 那么去搜索的时候,会对比一下Query和Key, 把与Query最相似的那个Key对应的值返回给我们。 这里是同样的思想,我们最后想要的Attention,就是V的一个线性组合,只不过根据Q和K的相似性加了一个权重并softmax了一下而已。

        好,现在我们知道了QKV的作用,那怎么表示出借鉴了搜索查询的思想呀?还有最后的V的一个线性组合,根据Q和K的相似性加了一个权重,再softmax映射出权重, 再把这个权重反乘到各自词语的embedding身上,再加权求和,就相当于融于了其他词的相关信息。下面来看看呀

怎么得到QK的相似度呢? 我们想到了点积运算, 我们还记得点积运算的几何意义吗?两个向量越相似,点积结果就越大。

         这里的Q的每一行,读代表了每一个字的第一个角度(head)麻,我们就理解为一个字代表的特征,然后和K的转至进行相乘(也就是和每一个列都做点积运算)从而得到了,Q里面的一个字和其他每一个字的相似度了,得出的矩阵就是head1角度的注意力矩阵。

        然后看前面两张图,发现除了一个根号dk,这里上网查了别的解释:

这里再解释下为啥会QK^T然后除以\sqrt {d_k}的操作,这个d_k表示的是K矩阵的向量维度,作者这里把内积方式的这种注意力和additive attention(这个就是全连接层实现注意力的方式)对比发现,当d_k小的时候,效果差不多,但d_k维度很大的时候, 内积方式的这种注意力方式不如前者,这里之所以用内积的注意力,是因为这种方式计算要快很多。作者怀疑当d_k很大的时候, 这里的内积结果也会变大。

        然后怎么做softmax呢?

        这时候,我们从注意力矩阵取出一行(和为1),然后依次点乘V的列(包含了所有字的信息),因为矩阵V的每一行代表着每一个字向量的数学表达,这样操作,得到的正是注意力权重进行数学表达的加权线性组合,从而使每个字向量都含有当前句子的所有字向量的信息。这样就得到了新的X_attention(这个X_attention中每一个字都含有其他字的信息)。

        用X_attention加上之前的Xembedding_pos得到残差连接,再经过一个LayerNormlization操作(也就是图中的Norm操作)就可以得到Z。

        LayerNormlization的作用是把神经网络中隐藏层归一化为标准正态分布,起到加快训练速度,加速收敛的作用。具体操作是以行为单位,每一行减去每一行的均值然后除以每一行的标准差。

5. Feed Forward

        我们上面通过多头注意力机制得到了Z,下面就是把Z再做两层线性变换,然后relu激活就得到最后的R矩阵了。

 6. 继续做ADD & Norm操作

        这里的ADD操作是其实是拿做Feed Forward前得到的Z,以及做完Feed Forward后得到的R矩阵进行一个Add操作,对应元素直接相加。

        然后Norm操作还是上面提到的Layer Normlization,\mu_i是这一行的均值,\sigma _i是这一行的标准差用每一行的每一个元素减去这行的均值, 再除以这行的标准差, 从而得到归一化后的数值。

        其中细节如下:之后引入两个可训练参数α ,   β来弥补归一化的过程中损失掉的信息, 注意⊙ 表示元素相乘而不是点积, 我们一般初始化α为全1,而β为0.

 

        以上,是我们对一句话做Transformer的操作,我们在实际使用的时候,肯定不是一句话一句话地输入,而是把多句话放在一个batch里面,于是,里面有一些细节要做出适当的更改。

        1. 输入来的维度一般是[batch_size, seq_len, embedding_dim], 而Transformer块的个数一般也是多个,这里的多个理解为第一块的输出作为第二块的输入,然后再操作。论文里面是用的6个块进行的堆叠。

        2. 因为如果有多句话的时候,句子都不一定一样长,而我们的seqlen肯定是以最长的那个为标准,不够长的句子一般用0来补充到最大长度,这个过程叫做padding。

 padding的部分就参与了softmax运算, 就等于是让无效的部分参与了运算, 会产生很大隐患, 这时就需要做一个mask让这些无效区域不参与运算, 我们一般给无效区域加一个很大的负数的偏置。这样使得无效区域经过softmax计算之后还几乎为0,这样就避免了无效区域参与计算.

        这就做完了Transformaer的编码部分了,输入来的维度一般是[batch_size, seq_len, embedding_dim], 而Transformer块的个数一般也是多个,这里的多个理解为第一块的输出作为第二块的输入,然后再操作就好了,论文里面是用的6个块进行的堆叠。

### 如何使用 Transformer 模型构建推荐系统 Transformer 模型在推荐系统中的应用主要体现在对用户行为序列的学习和建模上。通过捕捉用户历史行为的长距离依赖关系,可以更准确地预测用户可能感兴趣的商品或内容。以下是关于如何使用 Transformer 构建推荐系统的详细说明,包括架构分析、实现方法以及代码示例。 --- #### 1. 架构分析 Transformer 模型的核心在于其自注意力机制(Self-Attention Mechanism),该机制能够有效捕获用户行为序列中的相互关系[^1]。在推荐系统中,Transformer 的典型架构如下: - **输入层**:将用户的历史行为序列映射为嵌入向量(Embedding)。例如,如果用户的点击序列为 `[item1, item2, item3]`,则每个物品会被转换为其对应的嵌入向量。 - **位置编码**:由于 Transformer 模型本身不具有对顺序的感知能力,因此需要引入位置编码(Positional Encoding)来显式表示序列中的时间信息[^4]。 - **Transformer 层**:包含多头自注意力机制(Multi-Head Self-Attention)和前馈神经网络(Feed-Forward Neural Network),用于学习用户行为序列的特征表示。 - **输出层**:根据任务需求设计输出层。例如,在下一个物品预测任务中,输出层可以是一个全连接层,用于预测用户可能感兴趣的下一个物品。 --- #### 2. 示例代码 以下是一个基于 TensorFlow/Keras 的简化实现案例,展示如何使用 Transformer 模型处理用户行为数据并进行推荐。 ```python import tensorflow as tf from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, Embedding, Dense, LayerNormalization, Dropout # 定义 Transformer 层 class TransformerLayer(tf.keras.layers.Layer): def __init__(self, num_heads, key_dim, ff_dim, dropout_rate=0.1): super(TransformerLayer, self).__init__() self.attention = tf.keras.layers.MultiHeadAttention(num_heads=num_heads, key_dim=key_dim) self.ffn = tf.keras.Sequential([ Dense(ff_dim, activation="relu"), Dense(key_dim), ]) self.layernorm1 = LayerNormalization(epsilon=1e-6) self.layernorm2 = LayerNormalization(epsilon=1e-6) self.dropout1 = Dropout(dropout_rate) self.dropout2 = Dropout(dropout_rate) def call(self, inputs, training): attn_output = self.attention(inputs, inputs) attn_output = self.dropout1(attn_output, training=training) out1 = self.layernorm1(inputs + attn_output) ffn_output = self.ffn(out1) ffn_output = self.dropout2(ffn_output, training=training) return self.layernorm2(out1 + ffn_output) # 构建推荐模型 def build_recommendation_model(vocab_size, seq_length, embedding_dim, num_heads, ff_dim, num_layers): input_layer = Input(shape=(seq_length,)) embedding_layer = Embedding(input_dim=vocab_size, output_dim=embedding_dim)(input_layer) pos_encoding = tf.keras.layers.Embedding(input_dim=seq_length, output_dim=embedding_dim)(tf.range(seq_length)) x = embedding_layer + pos_encoding for _ in range(num_layers): transformer_layer = TransformerLayer(num_heads=num_heads, key_dim=embedding_dim, ff_dim=ff_dim) x = transformer_layer(x) output_layer = Dense(vocab_size, activation='softmax')(x) model = Model(inputs=input_layer, outputs=output_layer) return model # 参数设置 vocab_size = 1000 # 物品词汇表大小 seq_length = 10 # 用户行为序列长度 embedding_dim = 64 # 嵌入维度 num_heads = 2 # 多头注意力头数 ff_dim = 128 # 前馈神经网络维度 num_layers = 2 # Transformer 层数 # 构建模型 model = build_recommendation_model(vocab_size, seq_length, embedding_dim, num_heads, ff_dim, num_layers) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.summary() ``` --- #### 3. 技术资料与实现方法 为了进一步深入理解 Transformer推荐系统中的应用,可以参考以下技术资料和实现方法: - **论文与研究**: - GFormer 模型提出了一种图变换器架构,通过自动化自监督数据增强过程,提升了推荐系统的性能[^2]。 - Transformer 的自注意力机制能够有效建模用户行为序列中的长距离依赖关系,从而提升推荐效果[^4]。 - **开源项目**: - [RecBole](https://github.com/RUCAIBox/RecBole) 是一个推荐系统框架,支持多种基于 Transformer 的模型,例如 SASRec 和 BERT4Rec。 - [TensorFlow Recommenders](https://github.com/tensorflow/recommenders) 提供了基于 TensorFlow 的推荐系统实现,包含 Transformer 相关的模块。 - **实践建议**: - 在实际应用中,可以通过随机屏蔽用户行为序列中的某些物品(类似 BERT 的 Masked Language Modeling),训练模型预测被屏蔽的物品,从而提高模型的泛化能力[^5]。 - 数据预处理阶段,应充分考虑用户行为的时间顺序和上下文信息,以增强模型的表现。 --- #### 4. 结论 Transformer 模型通过其强大的序列建模能力,在推荐系统中展现了显著的优势。无论是捕捉用户行为的长距离依赖关系,还是生成高质量的用户和物品表示,Transformer 都能够提供有力的支持。结合适当的自监督学习策略和优化算法,可以进一步提升推荐系统的性能。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值