🤗Transformer是一种神经网络架构,核心思想是利用自注意力机制来捕捉序列中元素之间的关系。从而避免了传统RNN难以处理长序列依赖的问题。
Transformer的主要组件和流程
💫Encoder-Decoder结构
- Transformer包含编码器和解码器两个主要部分。编码器负责接受输入序列,提取特征,生成一系列向量表示;解码器则根据这些向量表示生成输出序列。
💫多头自注意力机制
- 允许模型在计算每个单词的表示时,同时关注输入序列中的不同位置。这种机制通过多个head并行计算注意力,然后将他们的结果合并,增强了模型表达能力。
💫位置编码
- 因为Transformer是无序列化的,需要通过加入位置编码器来引入位置信息,让模型能区分序列中不同位置的元素。为每个位置生成独特的编码。
💫前馈神经网络
- 每个编码器与解码器中都有一个基于位置的前馈神经网络,一般是两个全连接层组成,可以自动调整参数。
💫掩码机制
- 解码的过程中,为了确保模型只依赖已知信息生成下一个时刻的输出,采用掩码机制掩盖当前时刻之后的位置信息,可以防止信息泄露。
传统RNN
💯 Transformer解决了RNN面临的很多问题:
- 并行计算效率,RNN需要按顺序处理输入数据,计算是依赖前一个时间步的结果,所以并行 计算困难。Transformer基于自注意力机制,可以并行处理序列中的所有元素。
- 长距离依赖:RNN处理长序列时可能遇到梯度消失或梯度爆炸,很难捕获序列中远距离依赖问题,transformer可以通过自注意力机制处理长距离依赖。
💥Self-attention的特点
- self-attention是一种通过自身和自身进行关联的attention机制, 从而得到更好的representation来表达自身。
- self-attention是attention机制的一种特殊情况,在self-attention中, Q=K=V, 序列中的每个单词(token)都和该序列中的其他所有单词(token)进行attention规则的计算
- attention机制计算的特点在于, 可以直接跨越一句话中不同距离的token, 可以远距离的学习到序列的知识依赖和语序结构
Attention计算过程
- 阶段一: query 和 key 进行相似度计算,得到一个query 和 key 相关性的分值
- 阶段二: 将这个分值进行归一化(softmax),得到一个注意力的分布
- 阶段三: 使用注意力分布和 value 进行计算,得到一个融合注意力的更好的 value 值
💯关于(Q, K, V)
假如我们有一个问题: 给出一段文本,使用一些关键词对它进行描述! 为了方便统一正确答案,这道题可能预先已经给大家写出了一些关键词作为提示.其中这些给出的提示就可以看作是key, 而整个的文本信息就相当于是query,value的含义则更抽象,可以比作是你看到这段文本信息后,脑子里浮现的答案信息, 这里我们又假设大家最开始都不是很聪明,第一次看到这段文本后脑子里基本上浮现的信息就只有提示这些信息, 因此key与value基本是相同的,但是随着我们对这个问题的深入理解,通过我们的思考脑子里想起来的东西原来越多, 并且能够开始对我们query也就是这段文本,提取关键信息进行表示. 这就是注意力作用的过程, 通过这个过程, 我们最终脑子里的value发生了变化
查询Query是一条独立的序列信息, 通过关键词Key的提示作用, 得到最终语义的真实值Value表达, 数学意义更充分。
Multi head Attention
-
原始论文中提到进行Multi-head Attention的原因是将模型分为多个头,可以形成多个子空间, 让模型去关注不同方面的信息, 最后再将各个方面的信息综合起来得到更好的效果
-
多个头进行attention计算最后再综合起来,类似于CNN中采用多个卷积核的作用,不同的卷积核提取不同的特征, 关注不同的部分,最后再进行融合
-
直观上讲,多头注意力有助于神经网络捕捉到更丰富的特征信息
Multi-head Attention和单一head的Attention唯一的区别就在于, 其对特征张量的最后一个维度进行了分割, 一般是对词嵌入的embedding_dim=512进行切割成head=8, 这样每一个head的嵌入维度就是512/8=64, 后续的Attention计算公式完全一致, 只不过是在64这个维度上进行一系列的矩阵运算。
在head=8个头上分别进行注意力规则的运算后, 简单采用拼接concat的方式对结果张量进行融合就得到了Multi-head Attention的计算结果 。
🤗那么不考虑计算量的前提下,head是否可以无限增多?
实际应用中,head数量不可以无限增加,随着head数量增加,计算资源和难度会增加很多。并且遇到数据不足的情况下,额外的head会导致模型过拟合。