前面我们了解了什么是回归任务,所谓回归任务,就是输入一个向量,输出一个值;所谓分类任务就是输入一个图片然后输出向量以进行分类,接下来我们讲了输入一个序列,最后输出一个分类,第四部分我们讲了输入一个序列,输出也是一个序列,这就是生成任务。输入一段序列,输出一段序列,但是长度往往是不对应的,用一个简单易懂的例子来说,正如ai大模型,你输入一个问题,他会给你输出一大串的内容,那么这就是典型的生成任务。输出长度由模型自行确定。

        首先介绍一种基于自学习的生成模型,这种模型的Encoder部分和前面的基本一致,没什么好说的,主要是Decoder部分,这里的Decoder部分是基于自学习的,输入来自encoder,但是,基于自学习的模型往往会出现一些问题,就是会出现串行的错误问题,出现“一步错、步步错”的严重问题,且速度慢

        如何解决呢?用label代替串行输入时的输入,label是x-y中的y,他是保证正确的,那么也可以实现并行,但这是知道答案推题目,没啥意思,又没啥作用,所以我们想想自注意力机制的原理,第一个输入的时候,可以看到后面的,第一个输入的时候,不能够看到后面的输入,我们不能面向结果编程,所以,我们把后面的MASK掉

输出b1的时候,a1不能够看得到a2/a3/a4等,这就是Masked Self-attention,这就不是面向结果编程了,每个人只能看到他“前面”的东西,而非后面。

如何实现呢?用个上三角矩阵乘起来,就刚好可以实现这个功能。

D=\begin{bmatrix} 1&0 &0 &0 \\ 1& 1& 0&0 \\ 1&1 &1 &0 \\ 1& 1& 1& 1 \end{bmatrix}

很巧妙的方法!但是我们刚刚说了,我们想输入和输出不一样长,这样好像也是一比一的输入,怎么做呢?有一个办法——添加“end”,如果说输入是“end”,则停止输出,这样就可以控制了,总结一下,input进入encoder输出特征,特征打辅助,特征与label一起作为Decoder的输入,然后Decoder输出output sequence,这是一个完整的步骤,那么下一个问题,一个生成任务,是如何训练的?这里我们要找损失,label+end和\widehat{y},就可以求得交叉熵损失,从而可以实现损失值的计算,Decoder的输入:label(Ground Truth)+start,输出为end+label,从而能够实现训练的过程。

对于平时的任务,训练时的方式,就是测试时的方式

但是生成任务大不相同,生成任务训练的时候标签可以用上,所以可以实现并行,但是测试的时候却没有label,只能一个字一个字来,所以整体是串行的,这就是测试和训练的区别。

接下来,介绍一种算法,Beam Search基于贪心的算法,是蓝色;基于全局的算法,是红色

生成任务是非常耗时的,也很需要算力,光是这个模型,可以看出来,效率是非常低的

总结一下,以下几个点是需要掌握的:

1. encoder、Decoder的输入形式各是什么?

2. Mask是什么?如何实现的?

3. cross-attention是什么?如何实现的?

4.训练的loss怎么求?

5.训练-测试的差别?

        

更多推荐