写给新手看的机器学习原理--基于机器翻译

时间:2023-01-24 20:31:00

欢迎转载,转载请注明出处:http://blog.csdn.net/lucygill

本文基于个人理解,欢迎讨论交流。


最近在看斯坦福大学机器翻译的开源代码,琢磨着把代码稍微改动一下,做成中文到英文的翻译。参考了业界大牛的不少论文,大致明白了机器翻译实现的步骤:

1.将源文件转化成词向量(像中文这种词之间没有明显符号的,要先进行分词)

转化的方法,最简单的是生成one-hot词向量。具体来说就是,如果文件中包含n个不同的词,那么每个词的词向量都是n维的,而且只有一个元素的值为1,其余元素都为0. 这样做虽然简单,但需要的空间极大,而且无法反映出词与词之间的联系。我们想得到的词向量是这样的:舅舅-男人=舅妈,或者,王子+女人=公主。斯坦福大学的论文中是这样做的:先生成one-hot词向量,再通过一个变换矩阵将其压缩成低维向量。

注意,机器翻译是有监督学习,所以词向量的转化涉及将源语言和目标语言的文件进行词向量转化。通过转化,我们就把语言与语言之间的转换,等价变为向量与向量之间的转换。为什么要这样做呢?因为电脑本身是没有语言的概念的,它只认一串串数字。事实上,语言在电脑上的存在,也是通过ascii,Unicode等编码实现的。但我们不能直接用这些编码进行机器翻译,因为它们的规律性弱,也没法很好地展示词之间的关系,存储方式也比较复杂。机器翻译也算是一种数学模型,而数学模型的精髓就是简化问题,忽略不必要的条件。(数学系妹子的职业病==)

2.学习转换规则(训练模型)

现在,我们将不同语言都转化为向量了。那么,我们怎样把两组向量联系起来呢?学过线性代数的人都知道,向量的线性变换可以把一组向量映射成另一组向量。而机器翻译也像是一种映射。(但它实际上不是映射,比如,中文到英文的变换,可能涉及到冠词、介词等词语,而这些词语有时候不会体现在中文中)那么,我们能否找到一种变换(不一定是线性的),将源语言的句子映射成目标语言的句子?(一个句子包含若干词向量,所以这个问题被我们转化成了将一组向量映射成另一组向量)

若干年前,这种转换规则还是人为设定的。但这样的方法,对人的要求极高(不仅要精通至少两种语言,还要精通编程),而且准确率也不高。后来,基于统计的机器翻译给这项工作减少了人为成分。但是,有很多参数仍然需要人为设定。所以,有人把当时的程序员戏称为“调参狗”。(统计机器翻译我不太了解,后面看过之后再进行补充)

深度学习的出现,给机器翻译注入了新的血液。所谓深度学习,就是用多层神经网络构建一个系统,只需赋给它一些初始值(通常都设为0)和训练数据,它就可以自行修改调整参数。也就是说,深度学习是一种生成算法的工具,输入大量数据,它就能根据数据提供的信息自行调参,使模型符合人的要求。在机器翻译中,深度学习能帮助人类找到一种复合的变换,这种变换将源语言句子转换为目标语言句子。

我们需要做的,就是赋予机器一个学习的框架,可以简单理解为学习流程。机器只能调参,不能改变运算符号。所以我们的框架至关重要。

现在比较流行的学习方法是RNN(Recurrent Neural Network,循环神经网络)。因为RNN的学习过程符合语言的习惯--它能记录上下文信息。而LSTM(Long Short Term Memory,长短期记忆)是RNN的一种特例,它能自行决定什么时候遗忘过去的信息,什么时候记住当前的信息。关于RNN和LSTM的具体信息,可以参照这篇文章:http://blog.csdn.net/LucyGill/article/details/65627047、

3.模型的选择

就如第2步所说,我们可以通过数据学习转换方法。那么,这种学习到什么时候结束呢?我们一定要让自己的模型与训练数据完全匹配吗?不是的。这里存在“过拟合”的问题。通俗来讲,“过拟合”就是,你的模型与训练数据匹配度很高,你输入训练数据里的任意一句中文,模型都能输出一句与之匹配的英文。但是,你输入训练数据之外的一句中文,输出结果却不尽如人意。这是怎么回事?因为,你的模型太匹配训练数据了,以致失去了普适性。举一个例子:如果我用很多苹果的图片来训练模型,这些苹果多数都是红色的,但我测试模型时,输入了一个黄苹果,模型可能会错误地认为这不是苹果。

那么我们什么时候停止训练呢?事实上,我们并不是不间断地训练模型。每过一段时间,我们都要拿验证集中的几组数据来验证模型的好坏。还是上面苹果的例子,训练了一段时间后,我把一个黄苹果的照片输入模型,模型判定其不是苹果,而我的数据中却记录着,这是苹果,所以模型判定错误,本次的训练使得模型“过拟合”了。然而,我们在上一个时间点测试的时候,机器还能识别出黄苹果。所以,我们舍弃本次的训练结果,保留上一次训练的参数,并停止训练。

4.模型的测试

停止训练后,我们的模型就完成了学习。现在,我们想要测试一下模型的精确度。这次,我们既不用训练集中的数据,也不用验证集中的数据。我们用一个新的集合来测试,这个集合就叫做测试集。测试集不会对模型产生影响,它只能评估模型。将测试集中的数据输入模型,将模型的输出与数据中存储的标准输出进行对比,最终通过一定的规则对模型进行评判。

至此,机器翻译就完成了。

5.其他需要注意的地方

你可能已经注意到了,我分别在2、3、4步提到了三个集合:训练集(training set),验证集(validation set),测试集(testing set)。我们在训练模型之前得到若干组数据,如果数据量充足,我们就把它分为这三个集合。其中,训练集用于训练模型,验证集用于决定什么时候停止训练模型,测试集用于评价模型好坏。这三个集合的交集为空。