关注公众号,发现CV技术之美
本文位52CV粉丝投稿。
原博客地址:https://blog.csdn.net/michaelshare/article/details/124178685
该篇文章由谷歌大脑团队在17年提出,目的是解决对于NLP中使用RNN不能并行计算(详情参考《【译】理解LSTM(通俗易懂版)》),从而导致算法效率低的问题。该篇文章中的模型就是近几年大家到处可以听到的Transformer模型。
01
算法介绍前的说明
由于该文章提出是解决NLP(Nature Language Processing)中的任务,例如文章实验是在翻译任务上做的。为了CV同学更好的理解,先简单介绍一下NLP任务的一个工作流程,来理解模型的输入和输出是什么。
1.1 CV模型的输入和输出
首先拿CV中的分类任务来说,训练前我们会有以下几个常见步骤:
获取图片
定义待分类的类别,用数字标签或者one-hot向量标签表示
对图片进行类别的标注
图片预处理(翻转、裁剪、缩放等)
将预处理后的图片输入到模型中
所以对于分类任务来说,模型的输入为预处理过的图片,输出为图片的类别(一般为预测的向量,然后求argmax获得类别)。
1.2 NLP模型的输入
在介绍NLP任务预处理流程前,先解释两个词,一个是tokenize,一个是embedding。
tokenize是把文本切分成一个字符串序列,可以暂且简单的理解为对输入的文本进行分词操作。对英文来说分词操作输出一个一个的单词,对中文来说分词操作输出一个一个的字。(实际的分词操作多有种方式,会复杂一点,这里说的只是一种分词方式,姑且这么定,方便下面的理解。)
embedding是可以简单理解为通过某种方式将词向量化,即输入一个词输出该词对应的一个向量。(embedding可以采用训练好的模型如GLOVE等进行处理,也可以直接利用深度学习模型直接学习一个embedding层,Transformer模型的embedding方式是第二种,即自己去学习的一个embedding层。)
在NLP中,拿翻译任务(英文翻译为中文)来说,训练模型前存在下面步骤:
获取英文中文对应的句子
定义英文词表(常用的英文单词作为一个类别)和中文词表(一个字为一个类别)
对中英文进行分词
将分好的词根据步骤2定义好的词表获得句子中每个词的one-hot向量
对每个词进行embedding(输入one-hot输出与该词对应的embedding向量)
embedding向量输入到模型中去
所以对于翻译任务来说,翻译模型的输入为句子每个词的one-hot向量或者embedding后的向量(取决于embedding是否是翻译模型自己学习的,如果是则输入one-hot就可以了,如果不是那么输入就是通过别的模型获得的embedding向量)组成的序列,输出为当前预测词的类别(一般为词表大