4、迁移学习和预训练模型( 二 )


预训练通过自监督学习从大规模数据中获得与具体任务无关的预训练模型 。体现某一个词在一个特定上下文中的语义表征 。第二个步骤是微调,针对具体的任务修正网络 。训练数据可以是文本、文本-图像对、文本-视频对 。预训练模型的训练方法可使用自监督学习技术(如自回归的语言模型和自编码技术) 。可训练单语言、多语言和多模态的模型 。此类模型可经过微调之后,用于支持分类、序列标记、结构预测和序列生成等各项技术,并构建文摘、机器翻译、图片检索、视频注释等应用 。
为什么我们要做预训练模型?
不管是图片识别还是自然语言处理,模型都朝着越来越臃肿,越来越大的方向发展 。每训练一个大的模型,都会消耗掉数小时甚至数天的时间 。我们并不希望浪费太多的时间在训练上,所以拿到一个预训练模型就十分重要了 。基于预训练模型,我们能够用较少的模型,较快的速度得到一个适合于我们自己数据的新模型,而且这个模型效果也不会很差 。
所以预训练的核心价值就是:
手头只有小数据集,也能得到一个好模型; 训练速度大大提升,不用从零开始训练 。
预训练模型的三个关键技术
第一个关键技术是
它在 NLP 各个任务中都取得了优异的性能,它是预训练语言模型的核心网络 。给定一句话或是一个段落作为输入,首先将输入序列中各个词转换为其对应的词向量,同时加上每一个词的位置向量,体现词在序列的位置 。然后将这些词向量输入到多层网络中,通过自注意力(self-)机制来学习词与词之间的关系,编码其上下文信息,再通过一个前馈网络经过非线性变化,输出综合了上下文特征的各个词的向量表示 。每一层网络主要由 Multi-head self- 层(多头自注意力机制)和前馈网络层两个子层构成 。Multi-head self- 会并行地执行多个不同参数的 self-,并将各个 self- 的结果拼接作为后续网络的输入,self- 机制会在后面中做详细介绍 。此后,我们得到了蕴含当前上下文信息的各个词的表示,然后网络会将其输入到前馈网络层以计算非线性层次的特征 。
在每一层网络中,会将残差连接( )把自注意力机制前或者前馈神经网络之前的向量引入进来,以增强自注意力机制或者前馈网络的输出结果向量 。并且还做一个 layer,也就是通过归一化把同层的各个节点的多维向量映射到一个区间里面,这样各层节点的向量在一个区间里面 。这两个操作加入在每个子层后,可更加平滑地训练深层次网络 。
可以用于编码,也可以用于解码 。所谓解码就是根据一个句子的输入得到一个预想的结果,比如机器翻译(输入源语言句子,输出目标语言句子),或者阅读理解(输入文档和问题,输出答案) 。解码时,已经解码出来的词要做一个自注意力机制,之后和编码得到的隐状态的序列再做一个注意力机制 。这样可以做 N 层,然后通过一个线性层映射到词表的大小的一个向量 。每个向量代表一个词表词的输出可能性,经过一个 层得到每个词的输出概率 。
接下来介绍一下 self- 机制,以一个 head 作为示例 。假定当前输入包含三个词,给定其输入词向量或是其上一层网络的输出,将其通过三组线性变换,转换得到三组 、keys 和向量 。Query 和 key 向量用来计算两两词之间的得分,也就是其依赖关系,这个得分会同其对应的 value 向量做加权和,以得到每个词综合上下文信息的表示 。给定当前第一个词的 query 向量,其首先同各个词的 key 向量通过点积操作得到这两个词的得分,这些得分用来表示这两个词的依赖或是相关程度 。这些得分之后会根据 query 等向量的维度做一定比例的缩放,并将这些得分通过操作做归一化 。之后,各个得分会同其相对应的 value 向量相乘得到针对第一个词加权的各个 value 向量,这些加权的 value 向量最终相加以得到当前第一个词的上下文表示 。