初识生成任务
常见输入输出(三种)

- 输入输出 输出一个值
- 输入输出 长度相同
- 输入输出长度不同 (本节学的。 例如:chatGPT的生成)
输入输出任务
又被称为Sequence-to-sequence (Seq2seq) 序列到序列的任务


Seq2seq 是由编码器(Encoder)和解码器(Decoder)组成
transformer也是Seq2Seq这个架构
主要学习三方面:输入、模型、输出
transformer架构
Encoder
在上节bert参数计算中已了解了。


假如输入一段话(512*768)经过Encoder(编码) transformer模块 生成的还是(512*768)向量,是一步一步提取特征
bert就是transformer的Encoder
Decoder(本节重点)
本节例子:繁体字转简体字 长度对应
思考:如何让模型输出一个字?
解答:通过分类任务。其本质是在做一个选择,从21128个字中选择一个字

如何从输入提取出的特征 通过Decoder得到文字?
最简单的方法,Encoder提取出来的特征直接当做Decoder的输入,然后通过Decoder全部输出,
输出特征-> 分类得到一个字

但这种方式会造成图中两个问题
Autoregressive(自回归)
生成任务经常使用的方法 =>自回归, 它不是把Encoder的输出特征直接当做Decoder的输入,Encoder的输出特征只是打辅助,Decoder的输入另有其人

Decoder接收到一个特殊的token (START)就知道要开始推理了(一个字一个字的推,例如:chatGPT在生成序列文字时),经过Decoder得到特征,再经softmax得到每个字的概率,最后在分类时应该得到机这个字,然后把 机 当做下一个字的输入,让它通过模型,得到最大概率 器字,以此类推 得到完整序列 机器学习 ......

出现的问题
1.容易出现错误

因为把模型的输出当做下一次的输入
2.只能串行无并行(类比RNN和transformer),因为RNN的输入必须等待上一步的结果(就是传家宝)RNN为什么只能串行
2.如何确定输出的长度

如果继续往下推理将会停不下来

既然有START,就再加一个END。一旦模型选中END作为输出,就代表一整句话结束了。

也就是当把习字当做输入时,模型就知道下一步的输出应该为END(遇到END就停下),这样就可以实现输出想多长就多长。输出长度完全取决于模型何时预测出 END。
解决方法
可以让label 当做Decoder的输入。因为label一定是正确的。其中虽然机经过模型输出了错误的气,但我们有正确的y(标签label),所以在下一次输入时还是正确的器,就把结果纠正过来了。
而且这个方法还可以实现并行,因为输入并不需要等待上一步的输出。

这种方法的缺点:作弊!!!

START生成 Q K V,而这个Q要看所有标签的特征,看完机 器 学之后出来一个特征 最后得到一个结果。
问题所在:这个机字 我们希望通过Encoder输出的特征得到,但现在直接不要Encoder,看第二个label,将第二个字输出就是了。由于通过self-attention架构,它本身就可以看到第二个label,不用再看其他东西,直接将第二个字输出就行,准确率100%。
关键:在label当做输入时,要让他只能看到自身及以前的label,不能让它看到“答案”,必须要把Encoder这个辅助给用上。所以有了Masked Multi-head Attention(mask)


masked self-attention 每个人只能看到自身以及前面的label,相当于把后面的全部mask

对于如何得到b 就是进行矩阵运算。
对于a2来说 取mask第二行进行矩阵运算 后面两个全部为0,就相当于mask了
生成任务如何进行训练
分类任务就是特征经过分类(softmax)得到概率分布,概率分布之后选择一个概率最高的字,和标签去求loss,分类任务一般是交叉熵损失(Cross Entropy Loss),得到一个字的loss


对于一句话也是同上一个字的方法,得到所有的loss,加起来求平均就可以得到这次生成的loss,有了loss之后就可以训练者整个模型。
Ground Truth就理解为真实标签
生成任务的推断
推断就是对test(测试集)的预测,以前没讲过,和其他任务(回归、分类都不一样)

拿一张图片经过特征提取得到特征,再经过分类头得到分类的结果。这个过程训练和测试是一模一样的。

生成任务在测试时没有label,只能一个一个字来(串行)

只能把Encoder提取出来的特征当做Decoder的输入

一趟输出一个字,通过Decoder之后得到的输出再进入模型,以此类推。
Beam Search(推断算法)
Beam Search 规定了每次要看的步数。因为要计算概率 所以推断非常慢!(想象在问大模型时的生成)
选用贪婪还是大局观。取决于步长 ,自己选(非常吃显卡)

Cross attention

K V都来源于Encoder产生的输出,只有Q来自Decoder,这其实很合理,对于所有的模型都输入一个START,那经过self-attention的结果应该都差不多,那谁能决定这个输出呢,很显然不是START,而是Enocder的输入决定了最终的输出。
只是给Decoder的START一个充当扫码器的机会,去扫描Encoder中生成的K,哪个更适合当作第一个输出 红V就是第一个输出,这个结果就可以用来作分类,这就是Decoder的Cross attention(交叉注意力机制)

与Encoder区别:只是生成Q的位置变了,从Encoder变为Decoder
总结:transformer架构一开始就是为了翻译任务
- Encoder和Decoder的输入是什么
- 为什么要mask
- cross attention是如何工作的
- 训练的loss是怎么来的
- 训练和测试的差别
更多推荐




所有评论(0)