CS224d-Day 9: 本文结构:
下面是video的笔记: 1.机器翻译机器翻译是NLP问题中比较难的其中之一,为了解决这个问题,有一些很好玩的模型:
LSTM 是很早以前的模型,GRU 是比较新的。 过去的方式很传统,现在的 Deep Learning 是基于统计的,它们以 parallel corpora 为基础。 什么是 parallel corpora? 比如 European Parliament,欧洲议会 的笔记,它们被欧盟的所有语言所记录,所以你会看到一句英语,法语,意大利语,德语等等。 通常我们只需要一对语言,也就是一句翻译成一句。 这是一个非常复杂的系统,先做一个整体的认识,然后再看具体的模块: 例如输入的语言是 French,目标语言是 English,我们希望翻译的概率达到最大。 这里有三个模块: 第一个是 Translation Model,是通过训练 parallel corpora 得到的,就是有一句 French,一句对应的 English。 第二个是 Language Model,它只通过 English 来训练 ,这是一个随机的 corporate,我们只是需要一个单语言 English 的语料库,所以可以是任意的 Wikipedia,句子,段落。 第一个模块,会把输入的 French 句子,切割成单词和短语,然后去 parallel corpora 找对应,然后再把它们拼起来。 然后在第三个模块 Decoder 中,将两个模块合起来,它会将所有的翻译进行打分,最终返回一个最合理的结果。 接下来,具体看: 第一个 Translation Model,目标是要知道 输入的 French 对应的是什么 English。 有什么难点? 在下面这个例子中,左边的 and 在 parallel corpora 是没有翻译的,还有一种情况是 左边的 implemented 对应着多个翻译。 这还算简单点,因为 English 和 French 的语序差不多,如果遇到不同语序的一对,那几乎需要翻转所有单词。 还会有一个 French 可以对应多个 English: 还有多个 French 对应多个 English: 通过第一个模块后,假设我们已经给输入的语言找到了最有可能的短语结果,接下来想要根据语法知识形成一个完整的句子的翻译,而不只是单词的对应。 Decoder: 我们要在所有可能的组合中找到最有可能的结果,这是个庞大的搜索任务。 这只是一个简单的概括,机器翻译是个很庞大的系统,由不同的模型组成,分别处理不同的问题,还有很多重要的细节这里都没有讲。 2. RNN模型那么 深度学习 可以简化这个系统吗?只用一个 RNN 就能做到机器翻译吗?目前还没有达到这个水平,最新的一篇文章,还没有超过最好的机器翻译系统。不过,这几个并不是翻译专业的作者,用了一年的时间,就可以训练出只比传统最好的模型的准确度低0.5%的模型。 上图是将 德语 翻译成 英语,模型的输入是 词向量,然后经过 recurrent neural network ,用 logistic regression,这一次不是预测下一个单词,而是预测一个完整的句子组成形式。 下面是最简单的 RNN 模型,在 Encoder 中,每一个输入的词向量都会经过线性变换,Encoder 是一个 recurrent neural network,Decoder 是同样的 RNN,每一次得到一个最有可能的翻译结果,然后让所有单词的 cross entropy 达到最小。 接下来是一些扩展模型。 第一个是训练 encoding 和 decoding 的不同的 weights。 扩展2是计算 decoder 的每个隐藏层,输入有三部分:上一状态的隐藏层,encoder的最后一个向量,前一个预测出来的单词 y_(t-1) 下面这个图是上图的具体化,意思是一样的, 扩展3是把隐藏层数增加。 扩展5是把输入的句子倒置后再去翻译。 GRU:扩展6是 Better Units,就是GRU,论文:http:///pdf/1412.3555v1.pdf GRU 为了获取更长的记忆,它想要保持住隐向量的某些元素,所以在下面这个公式里,我们并不想要f内部的内积,因为这个矩阵相乘会改变隐藏层的状态。你可以将保持的记忆信息带到后面的很多步里。 GRU的定义: 标准的RNN在下一步计算隐藏层,GRU有很多recurrent units,再计算最后的h。 前两步是计算两个不同的gate. 第一个是 update gate,这里并没有用随机的非线性函数,只是用了sigmoid,代表门是可以on和off的,开/关的状态下会带来不同的影响,update gate zt 依赖于当前的输入词向量和上一步的隐藏层状态。 第二个是 reset gate,输入和 zt 是一样的,不过 W 和 U 矩阵是不一样的。 有了两个 gate,下一步是想要有一个临时的 memory content:h_t tail. 最后的 h_t,当 z_t=1 时,最后的记忆就只是copy上一状态的记忆,而不需要考虑过去的很多记忆。当 z_t=0 时,就需要考虑当前word以及它和前面记忆的联系。 下图是 GRU 的一个简洁表示图: input是词向量,然后计算两个 gate,再计算 reset memory, GRU还可以用来做count的任务,而标准的RNN就很难做到。 小结: 写成代码就是,定义一个 GRU 的class,输入inputs后会经历两个function,forward propagation,back propagation,在forward时计算 gates 等变量。back 函数会把delta加上一些gradient再输出一个新的delta。 这里有一个不错的 Theano-GRU 代码: LSTM下面是LSTM,很早的模型啦。 有三个 gate, 第一个 input gate,当 current cell 很重要的时候,就希望更新它,i_t 的值就很大。 第二个 forget gate,就是忘记你的过去吧,忘记你至今学到的所有。 第三个 output gate,有了它,你就不需要把内部的状态告诉后面的网络,只需要keep around就可以了,不需要tell。 当你想要预测单词时,当你看到一整句话时,你只需要输出一个结果,并不需要释放所有的隐藏层和记忆。给了两个facts,然后进行推理,再给出output即可。 例如,在一个问答系统里,当你问 where is the toy, 你现在只知道 John took the toy, 所以现在你无法回答问题,但是又经过了几步,你得到 John went to the kitchen, 现在你就可以回答 kitchen 了。 然后就是用这些 gate 来计算最后的 memory cell 和 hidden state。 下面这个是LSTM直观的图表示: [cs224d]Day 1. 深度学习与自然语言处理 主要概念一览 我是 不会停的蜗牛 Alice |
|
来自: bookocea > 《十一堂深度学习课程》