大模型学习笔记(一)—— transformer是什么?

摘要:写在前面,一定要看懂self attention的代码实现,注意矩阵乘是谁@谁,矩阵乘不可以变换位置!!! Attention的出现 由于翻译任务往往不是1 vs 1的翻译,因此输入与输出不等长,所以出现了encoder-decoder的形
写在前面,一定要看懂self attention的代码实现,注意矩阵乘是谁@谁,矩阵乘不可以变换位置!!! Attention的出现 由于翻译任务往往不是1 vs 1的翻译,因此输入与输出不等长,所以出现了encoder-decoder的形式: RNN具有短期记忆的问题,随着输入序列的增加,以前的输入的影响会越来越小。 传统encoder-decoder的缺陷 在传统的Encoder-Decoder结构中,Encoder处理一个输入序列,把它压缩成一个固定长度的向量c(也叫 context vector,上下文向量),然后这个c被Decoder用来逐步生成输出序列。比如: 输入序列:I am a student(长度为4)。 Encoder输出的最终隐藏状态h4就是c。 Decoder使用这个c作为起点,开始翻译成另一个语言的句子。 不管输入序列有多长(比如一个 20 个词的长句子),最终都被压缩成一个固定长度的向量c,就会造成信息的丢失。 Attention如何解决这个问题? Attention机制通过在每个时间输入不同的c来解决这个问题,也就是说不再把全部信息压缩成一个c,Decoder每生成一个词时,可以动态地访问Encoder输出的所有隐藏状态(也就是输入序列每一步的编码),并根据当前生成内容“选择性关注”原始输入的不同部分。 对于decoder而言,它获取的隐状态输入就需要有着重点,也就是"注意"到,哪里的信息更重要。因此encoder输出的隐状态,就需要对每一个输入有选择,这个选择就是注意力,本质上是给Encoder输出的每一个隐状态h_t一个权重(α),那么context vector (当前时刻) = ∑ (attention weight α_i × encoder output h_i)。 那么,接下来有了第二个问题:权重怎么计算? 权重的计算方式 对于Decoder而言,每一个位置都需要有自己的注意力,且每一个位置的注意力肯定是不一样的,这就推断出:每一个Decoder时间步的权重是根据当前时间步的隐状态和Encoder的隐状态一起计算出来的。计算注意力权重: αₜᵢ = score(s_t, hᵢ) # i 从 1 到 n aₜ = softmax([αₜ₁, αₜ₂, ..., αₜₙ]) # 权重向量 c_t = Σᵢ (aₜᵢ · hᵢ) 其中:score是注意力打分函数,transformer中最常用的就是: Attention机制 相比较于原来的RNN结构,Encoder的结构并没有改变,只是每一个时间步都输出了隐状态。attention是Decoder时,添加了注意力机制,计算了context vector与上一个时间步的输出一起做拼接,来预测当前时间步的输出。 Encoder的工作: h_t = RNN(h_{t-1}, x_t) x_t 是第 t 个位置的输入词(嵌入) h_{t-1} 是上一个时间步的隐藏状态 Decoder的工作: s_t = RNN(s_{t-1}, y_{t-1}, c_t) y_{t-1} 是上一个时间步的输出词的嵌入(注意是目标序列的词) s_{t-1} 是上一个隐藏状态 c_t 是当前时间步的上下文向量 QKV是什么? 上述基于RNN的attention没有显式的说明KQV这样的概念,因为KQV本身就是transformer之后才有的概念,但是看transformer里KQV的职能,仍然可以把基于encoder-decoder的attention划分到KVQ结构里: 角色 对应 来自哪里 Query (Q) Decoder 当前时间步的隐藏状态 s_t Decoder Key (K) Encoder 所有时间步的隐藏状态 h₁...h_Tx Encoder Value (V) Encoder 所有时间步的隐藏状态 h₁...h_Tx Encoder Attention是一种子结构,它的作用是:让当前的Query去从一堆Key-Value对中选择相关的Value,作为“上下文”提供给 Decoder 来生成输出。 在基于RNN的attention中,Query就是s_t,用来和Key也就是h₁...h_Tx生成score,这个score让它判断Value的重要性,获取当前时间步的输出。不过,这里也可以看出来,基于RNN的encoder和decoder结构的缺陷:必须按照顺序一个个预测输出,时间成本过高。为了解决这个问题,transformer使用Attention替代时间序列依赖。
阅读全文