专栏名称: GitChat技术杂谈
GitChat是新时代的学习工具。
目录
相关文章推荐
OSC开源社区  ·  大模型撞上“算力墙”,超级应用的探寻之路 ·  2 天前  
OSC开源社区  ·  开源模型未必更先进,但会更长久 ·  4 天前  
OSC开源社区  ·  漫谈DeepSeek及其背后的核心技术 ·  3 天前  
程序员的那些事  ·  国企也中招!官网被挂上“码农的钱你也敢吞,* ... ·  3 天前  
程序猿  ·  本地部署 DeepSeek ... ·  4 天前  
51好读  ›  专栏  ›  GitChat技术杂谈

谷歌翻译核心技术 Seq2Seq

GitChat技术杂谈  · 公众号  · 程序员  · 2017-06-29 08:06

正文

本文来自作者: 邓侃 在 GitChat 上的分享
点击文末「 阅读原文 」这场 Chat 看看大家与作者交流了哪些问题

前言

本文主要介绍的是 sequence to sequence ,这个技术主要是用来做文本理解、机器阅读方面的事情。

在去年,人工智能在应用领域里有三个大的标志性的突破:

首先,大家都知道的 AlphaGo 与韩国著名棋手李世乭的人机围棋大战,突然之间打破了世界对人工智能的认知发生了180度大逆转,先前人们觉得人工智能不太靠谱,还是一个不切实际的概念,现在觉得人工智能无所不能,搞不好20年之后人工智能要统治人类了。大家觉得它20年之后能统治我们吗?我是有点怀疑,但是很多人觉得这很恐怖。

第二个,特斯拉上的 Tesla Autopilot 辅助导航系统,虽然它号称是辅助,但实际上已经属于无人驾驶系统了,因为确实有很多人上车之后不扶方向盘了。这件事情标志着说无人驾驶这个技术基本上可以商业化,所以在2017年的时候,无人驾驶这个行业火得一塌糊涂。

百度开源,为什么?因为这个无人驾驶这个领域的竞争比赛已经进入下半场了,上半场的任务是抢夺领先地位,而下半场的任务就是把竞争对手干掉,所以百度一开源,很多竞争企业都没了,这就是百度的基本战略设想。

第三个,Google Translate(谷歌翻译),自然语言翻译,中文翻英文,英文翻中文,中文翻法文等功能投入商用了。

为什么 Google Translate 是突破性进展?

我们今天要讲一讲为什么这件事情很重要,因为 Google Translate 用证据证明了一些事情:

第一件事情是「跨语言」,任何自然语言,中文、日文、英文、法文等等,都可以用一种数字向量来表示它的语义。以前大家只是一个猜想,Google Translate 把这个技术做到了商用化,大家觉得这是可行的。

第二件事情则是「可微分」,那么什么叫可微分?比如一个词,腹泻和肚子疼,字面上没有一个相同,但大家知道这两个是同义词。如果我们把它表示成一个相量的话,把它减掉 0.1,那是不是近义词,以前是没有办法的,说把腹泻换一个字母,再减1是什么意思?本来就是没意思。所以以前的词汇是离散的不可微分的,我们现在找了一个词向量,这个词向量是个数字向量,是可以微分的。

第三件事情「可编辑」,我把好几个词的词向量怎么编辑在一起,像剪接基因一样,能够搞出一个文章摘要、中心思想、关键词,所以词向量还是可编辑的。在这之前大家一直觉得这是一个学术上的研究课题,能不能成,还不确定。

但是 Google Translate 上线之后,业界基本上已经没有异议了,说这事基本可行了。这就是说,它学术上为什么说有大突破, 这个意义就在于说它证明了跨自然语言的可微分的可编辑的语言的表示的一种新方法。

Google Translate 这个东西其实不仅仅是翻译软件那么简单,它是一个通用的对自然语言的一种新的处理方法。

在医疗领域,做大量的病例结构化时,除了其他传统方法,我们也可以用 sequence to sequence 这种技术来对病例做结构化处理。比如说,有什么病变,发生在什么位置,病变会有很多性质,位置也会有很多性质,所以词与词之间事实上有这种语义的关联性。

我们用这种技术就完全可以把一个自然语言写成语句,把它翻译成结构化的一种表格。Google Translate 用的 sequenceto sequence 并局限于翻译,它实际上是机器阅读通用的方法,所以它的意义是非常大的。

Google Translate 整个的机制,谷歌还是蛮有道义感的一个公司,他非常开放的把他内部的一些细节都写入论文发表出来了,所以大家都可以偷看他到底怎么做的,这篇论文很出名。这篇论文里核心的其实就是下面这张图,如果看懂了这张图,整个论文就看懂了。

这张图说了些什么?假如有一个中文翻译英文的例子,「知识就是力量」,最终的输出是「Knowledge is power」,输入是中文,翻译成英文,这是它主要的工作目的。

它怎么做呢?实际上是这么几个步骤:

  • 第一,它把中文词先翻成一个词向量,变成一个数字向量。

  • 第二,它对这个词向量再编辑,变成一个语义表示的方式。

  • 第三,再把它翻译成它的目标语言,也就是英文。

它整个用的技术又称为 「encoder(编码)」 和 「decoder(解码)」,另外一种表示就是 「sequence to sequence」,或者概括说是谷歌翻译的核心技术。

这个地方有几件事情,我们刚才说为什么谷歌翻译的核心技术是个划时代的?

之前说了三个关键词:一个是「跨自然语言」,第二个是「可微分」,第三个是「可编辑」。上图这个例子是把中文搞成数字语言,再从数字语言翻译成英文。

大家可以想一想,中文是不是可以翻译成数字语言,再从数字语言翻译成法文呢?当然是可以的。同样的,也可以把现代的白话中文翻译成数字语言,再把它翻译成中国的古汉语文言文。

再给你一段中文的现代文,翻译成数字的语言,再从数字语言可以搞出来一个中心思想,或者说一段中文把它翻译成数字语言,再从数字语言搞成结构化的表格。这就是它的强大所在。

要解释这件事情背后的成因,实际上它有若干个技术的要素,包括怎么去生成一个词向量,词向量是什么,给你一个字或词「知识」,你把它翻译成一个数字向量,这叫词向量。这个词向量是产生的,这是第一件事情。这里面核心的问题是语言模型,用语言模型来生成词向量,这是咱们本文要讲的事情。

这个系列讲座我们还要谈其他话题,不仅有词向量,一个句子有很多词向量,你要把它再编辑,变成一个语义的表示。用什么东西来做编辑器,在 GoogleTranslate 里用了 LSTM。Facebook 前段时间发了一个论文,他用 CNN 来编辑。怎么去编辑语义,这是第二个话题。

第三个话题是 attention,解码的时候,你要把它翻译成德文,哪一个德文的词汇是最恰当词汇?这个里面用到一个 attention 机制,sequence to sequence 里面还有一个概念就是 attention 聚焦。

attention 之后再展开是什么?现在的 attention 只是从 sequence to sequence 表面字面的意思,没有先验的知识。能不能把知识图谱也融入 attention 里,也就是说我们会有一些先验的知识,这是第四个话题,怎么把符号主义的知识图谱和连接主义的仿生模型,把这两个完全独立的学派搞在一起。

目前为止,业界在做得最好的是 CMU Eric Xing 教授做的一个 student-teacher 模型,那天我跟俊哥讨论的时候,俊哥说他有个新方法。他说是在 attention 里面做一点花样,我听完之后茅塞顿开,我把那个东西称之为孙方法,很了不起的一件事情,超级简单但是超级有用的东西。我会在这里面谈,先谈 student-teachermodel,然后再谈孙方法。

最后一个话题是评价函数,在我训练完之后还是不好、有瑕疵怎么办?我们需要一个评价的函数,大家现在通常用的是这个,但这个里面实际上有很多问题需要研究。整个 sequence to sequence 谈完这五个大的技术要素,大家基本就明白了。

但是为什么大家会觉得听起来比较困难,主要问题是,现在谈的时候总是一下把五个话题全混在一起,大家自然就有点糊涂了。怎么办?各个击破。所以我们做一个系列,本文先讲第一个话题:「用语言模型生成词向量」。

用语言模型生成词向量

词向量的生成方法,业界现在最流行的方法是用语言模型 (language model)来做的,提到这种方法得提三个人,第一个是徐伟,他是在98年最先提出语言模型怎么做,然后给了上图第二个人巨大的启示。

第二个人就是名列世界深度学习的 top 3, Yoshua Bengio。他写的一篇论文非常出名,基本奠定了怎么用语言模型和词向量的整个方法论,这篇论文发表以后,就出现了一个跨时代的巨大突破。

从工程上来讲,现在基本上词向量怎么做,大家已经觉得没什么争议了,最终把词向量这个事情封杀的是谷歌的一位叫 Tomas Mikolov 的工程师,大家都知道词向量就是他做的。

我们今天主要谈谈这个机制是怎么做的,以及业界对这个模型会有什么质疑。

上图是 Bengio 那篇著名的论文,大家在学习的时候都读过很多论文,让人印象深刻的并不多,但这篇论文会让你印象非常深刻。论文讲了一个非常厉害的想法,整篇论文一口气读下来,对我们并没什么障碍就读完了,非常畅快。

如果能看懂上面这张图,这篇论文基本上就看懂了。论文讲的第一件事情是语言模型,这个语言模型很简单,就是给你一篇文章,由若干个句子构成,每个句子有若干个词按顺序构成。

现在问题是,我怎么预测下一个词出现的应该是哪个词?它的概率是多少?这就是语言模型。

比方说给你这么一句话,「人工智能医生帮助人类医生提高临床效率」。假如我先告诉你「人工智能」,你推测下个可能出现什么词?下一个可能会出现很多词,什么词都有可能,也许是「医生」,也许是“帮助”等。这里,我先给你一个前面的词,我想猜一猜后续出现「医生」的概率是多少?

这个语言模型要怎么做?其实道理很简单。举例说:我先给图上的句子做分词:「人工」,「智能」,「医生」,「帮助」……,分好词后做计数,统计每次出现「人工」时,后面出现的「智能」的有多少词?这我们可以统计出来。

所以后面提出一个叫 N-gram 的方法。比如说,一句话前面是「人工」,后面是「智能」,「智能」出现的概率远远大于「人工化肥」等其他带「人工」的词,那么我们就认为「人工智能」可能是一个词组,这两个词是经常在一起的,这种方法就叫 N-gram。

它完全是依靠统计,里面有没有透露出「人工」是什么语义,「智能」是什么语义, 但是它是一个语言模型。现在问题是,Bengio 对语言模型做了两个地方的改动。

根据上图公式,第一行首先是最原生态的语言模型,给定一个句子中间前一句的词,现在要猜测下面一个位置出现这个词的概率是多少。举个例子,前一句词「人工智能医生」,现在想猜测「医生」后面出现「帮助」个词的概率是多少,这是它原生态的语言模型。如果句子从第一个词开始一直到你马上要预测的下一个位置,i 是不断增长的。

第二行开始,做一点改造,每次给一个定长的窗口 t ,前续词倒推,如果我把语言模型限定为定长的窗口,那么会降低一点点精度。这个给定长的窗口 t 一个学术名称,就是 N-gram,在我们这里面 N 等 T。

这个事情和 Bengio 的工作没有任何关系。Bengio 、徐伟等人做了什么事情?

第一个事情,从第三行起,前续的词不再是原来的那个 Z 符号,它先把它翻译成一个数字向量,我用 g 来表示,这是一个100维或者200维的或者256维或者512维的数字向量,从这边转换到这边,变成一个词向量。

第二件事情,你的条件概率用什么函数来模拟?在 N-gram 里面没什么,它就是一个统计概率。从从第四行看,在 Bengio 的工作里,他用了一个很简单的神经网络,来模拟条件概率。

所以他做两件事情,第一件事情,从 N-gram 里面把原来的词、符号变成一个数字向量,第二件事情把这个概率用一个神经网络来模拟。

虽然这看上去很简单,但确实是很牛的,看上图,有这么几条。

第一条,首先,要去训练这个神经网络,训练词向量的转化函数,这时会需要很多参数,要用大量的训练语料,这些训练语言模型的训练语料从哪里来?非常好找,任何一篇文章都可以作为训练语料,数量几乎是无限,这是它的第一个优点。

那么问题来了,这种训练是无监督学习还是有监督学习?这个训练确实不需要标注它是个无监督学习,但是你从它训练的输入和输出看,又是个有监督学习,所以它的界限非常宽,你可以说它是无监督,也可以说它是有监督。

有监督学习 是从标签化训练数据集中推断出函数的机器学习任务。

无监督学习 是根据类别未知(没有被标记)的训练样本解决模式识别中的各种问题。

第二个优点,它整体是如何训练的?词到词向量转换得非常准确,前提假设是:

  • 假设一,转换得非常准确;

  • 假设二,假设说我们的句子中都有某种予以的连贯性,以至于说你从前面几个词的词向量能够猜测出来下一个词应该出现什么;

那么整个函数g 加起来拟合的会非常贴切。但是在开始时候你不知道函数 g 是多少,假定函数g 开始的时候就给它随便设一个随机词(值),但是应该知道它贴合哪个词(值),这两个词(值)中间会有一个距离,这时调词向量的参数和神经网络的参数,不停地调,直到调到两者贴得很近。这就是整个语言模型训练的过程。

所以只要知道这个神经网络怎么训练的,就没那么复杂。好在说它的训练语料几乎是无限的,只要你有足够的计算资源在上面你就可以摆,所以模型非常简单。这就是 Bengio 讲的怎么用自然语言模型来训练词向量。







请到「今天看啥」查看全文