人工智能的发展非常迅速,翻译的准确性越来越高,以至于有人担心译员是否会失业,甚至有的家长担心孩子学习外语专业将来找不到工作。哎呀,扯远了,本人认为:机器翻译可以便于人们更好的获得国外的信息,提高专业译员的翻译速度,但是更深层次的思考,仍然还要依赖人工翻译。
机器翻译目前只在通用领域(商业领域,口语领域等)的短句上效果不错,复杂结构的长句,需要结合知识尝试和上下文判断歧义句,特定领域的翻译上,一些小众语种以及一些特别复杂的语言结构,效果还远不能让人满意。
研究算法,除了调参就是洗数据,数据不好再收集更多数据,接着洗数据,调参,调参。在我们调参结束的时候,我们有没有思考过,我们对调参的这个模型的原理真的理解吗?
我曾经在跑一个Bert模型,我只是粗略的看了大致的原理,总以为自己很懂了,由于Bert模型效果确实挺不错,以至于我用一个模型打天下了很久,直到某天我遇到了一个问题,我着实不懂如何解决,后来,翻看源码,改了其中某一个参数值,总算解决了。
所以,我们工作之余,对一些模型,架构的思想要理解,更要明白原理,今天,我们就先来学习Encoder-Decoder框架,本着死磕模型原理的原则,面对心中一堆的疑问,我觉得有必要好好谈谈Encoder-Decoder。
追溯Encoder-Decoder的由来
Encoder-Decoder通常称作编码器-解码器,是深度学习中常见的模型框架,很多常见的应用都是利用编码-解码框架设计的,如:
无监督算法的auto-encoding就是利用编码-解码结构设计的。
image caption的应用也是利用CNN-RNN的编码-解码框架。
神经网络机器翻译NMT模型,就是LSTM-LSTM的编码-解码框架。
综合上述的应用,我们可以知道Encoder-Decoder并不是一个具体的模型,而是一个通用的框架。Encoder和Decoder部分可以是任意文字,语音,图像,视频数据,模型可以是CNN,RNN,LSTM,GRU,Attention等等。所以,基于Encoder-Decoder,我们可以设计出各种各样的模型。
上面提到的编码,就是将输入序列转化转化成一个固定长度向量。解码,就是讲之前生成的固定向量再转化出输出序列。
由此,Encoder-Decoder有2点需要注意:
不管输入序列和输出序列长度是什么,中间的「向量c」长度都是固定的,这也是它的一个缺陷。
不同的任务可以选择不同的编码器和解码器(RNN,CNN,LSTM,GRU)。
Encoder-Decoder有一个比较显著的特征就是它是一个End-to-End的学习算法,以机器翻译为力,可以将法语翻译成英语。这样的模型也可以叫做Seq2Seq。
Seq2Seq
Seq2Seq ( Sequence-to-sequence的缩写),就如字面意思,输入一个序列,输出另一个序列。这种结构最重要的地方在于输入序列和输出序列的长度是可变的。
Seq2Seq强调目的,不特指具体方法,满足输入序列,输出序列的目的,都可以统称为Seq2Seq模型。Seq2Seq使用的具体方法基本都是属于Encoder-Decoder模型的范畴。
在机器翻译里面,如下图,将英语「it is a cat.」翻译成汉语「这是一只猫。」,输入4个单词,输出5个汉字。
在训练数据集中,我们可以在每个句子后附特殊字符”