语言的表示(文字版)

点击这里收听本期节目音频版

编辑: 肖怡婷

主播: 阿拉法特 (A), 舒晏 (S)

A
大家好,欢迎收听徳塔赛,我是阿拉法特。
S
我是舒晏。
G
所以就开始了。

 00:11 
A
舒晏最近在做什么?
S
嗯总的来说呢我最近其实是在找近义词。具体是什么意思呢,大家知道我从去年 10 月份开始就加入了这个沃尔玛的 E-commerce,然后呢在真的进到了公司之前呢,我一直以为像现在这个机器学习,深度学习发展的这么快,那在这样的 E-commerce 公司里面呢基本上整个的这个 pipeline 应该全部都是这个 Machine Learning 和这个 Deep Learning 相关的一些 model。结果真的进到了公司之后,发现我真是太天真了,因为呢像包括我们公司或者是像亚马逊等等这些比较成熟的规模比较大的这些 E-commerce,其实库存里面都是这种几百万几千万件商品是至少的。那么任何一个 Machine Learning 的模型其实在这个 runtime 的时候都是没有办法去处理这么大量的数据的。
A
是因为太慢了吗?
S
对的,就是其实即使我们再怎么优化,如果说在用户给了一个查询的时候,我们需要在比如说 1000 万个产品里面去找到一百个最有可能符合他的这个意图的产品的话,那么这个时间也是我们远远不可能在 runtime 负担的。所以说呢其实大量的这个过程是要用一些非常非常原始的方法,比如说用这个关键词的 matching,也就是说不管用户给我们打进来什么字,我们都要到一个巨大的 database 里面来找这些关键词,然后来找和这个关健重合度最大的这些产品,从他的这个描述或者从他的这个 title 里面去找这些关键词。我们在这个过程中运用到的最复杂的东西大概就是Tf-idf。其实我们后面有一些这个比较聪明的做 re-ranking 的这个机器学习的模型,但是它呢只是把前一百个的产品去做一个排序,真正是从这个巨大的数据库里面去找这么小的一个部分,是依靠我刚才说的这种 keyword matching 的方法。 那么为什么说我最近需要找这个近义词呢,因为呢就是在我们找关键词的时候,我们不能单一的去找用户所打进来的这个关键词,比如说他找的只是耐克,运动鞋,然后小朋友,那么我们需要知道小朋友其实和男童,女童是近义词,这样的话我们才能找到更多的产品,因为可能有的商品里面说的是男童运动鞋,女童运动鞋,那如果我们是去找小朋友这个关键词的话,我们就会漏掉这些产品。所以说其实我最近的工作是在找近义词。这听起来其实是个挺简单的事情,对吧?因为我们有最简单的方法,你去找个词典翻一翻,就能找到所有的近义词。但是一个比较困难的情况是什么呢,比如说用户的查询是苹果,平板电脑。那么苹果其实你去翻任何一个词典,或者我们所训练出来的一些模型,苹果的近义词都是鸭梨,橘子。在这个情况下,如果我们只是看这种广义上的每一个词的近义词,其实会添加很多很多的噪音,完全是在帮倒忙,所以我们更多的是希望在某一个语境下去找每一个词的近义词是什么。那这个问题呢其实在 NLP 领域叫这个 query expansion,也就是说去给一个 query 里面的每一个词去找一些近义词,从而把它变成一个内容更丰富的一个 query。
A
然后你们就会把这些 query 的集合全部一起发给数据库做查询吗?
S
是的,如果我们可以保证这些词都是比较高质量的,噪声比较少的话,我们会把这些词全部用来作为关键词。

 04:30 
A
我们需要先介绍一下嘉宾,我们请到的嘉宾是我们 UCSD 的同学,唐帅同学。唐帅是,让我猜一下,唐帅是第二年的博士学生。
G
我是第三年。
A
噢,唐帅是第三年的。唐帅是第三年的博士学生,他是认知科学的博士生,但是他经常来蹭我们计算机系的各种讲座。
S
对,他经常混迹在我们计算机系,曾经还来我曾经的实验室,这么晃了一个学期。
A
晃了整整一个学期?
G
对。
A
你可以换到另外一个办公室晃一个学期吗?
G
因为当时我在跟 Gary Cottrell 做 lab rotation,这是一个我们系认知科学系要求的一件事情,所以我就在 Gary Cottrell 的 lab 里面,跟舒晏一起讨论过一个学期的项目。
S
后来这个项目就 die 掉了,我觉得好像在这个项目死掉了之后,我和唐帅就对计算机视觉完全失去了信心,后来我们两个就分别进了自然语言处理的坑。
A
你们那时候做的什么?
G
我们当时做的事情是关于使用就是 attention mechanism 去做 fine-grained classification 的问题。 Attention 就是说,先说那个问题吧!Fine-grained classification 的问题就是说我做 classification 的时候,我需要在这张图上面去 attend 不同的区域,然后根据这些区域不同的信息,我要把这些信息全部 ensemble 起来之后,才能最后做一个决定,这张图到底是什么。之前 Cal Tech 他们有一个关于 bird breed 的一个 fine-grained classification 的 dataset,然后它那个数据集里面有 200 种鸟,但是你要知道,你想人要去分辨一个鸟的时候,你要经常去看它的这个喙是怎么样的,你要看它身上的毛是怎么样的,你要去看它的爪子是怎么样。就是说我们人在做决定的时候,我们需要去 attend 不同的区域,然后再去做一个决定。那么我们当时在 Gary Cottrell 的 lab 里面,我和舒晏想要做的事情就是说,我们希望能够把 attention mechanism 引进到这个classification 里面,去做这个 fine-grained classification 的问题。那么 attention mechanism 就是说我在第一步做完一个比较粗略的一个估计,我说这张图是什么的时候,我根据第一个 step 里面做出的这个 prediction,我去再看这张图里面第二个部分到底应该去看哪,然后再根据第二个部分,我们再去做一个 prediction,然后在第二个部分 predict 完了之后,我们再去看第三个部分,我们应该看哪里。就相当于是说我们把一张图用 attention mechanism 去看不同的位置,然后最后再去做一个 prediction。 这样其实可以说是在去模拟这个人是怎么样去做这个 fine-grained classification 的问题的。
A
那后来你和舒晏都把注意力转到了自然语言处理。
G
嗯没错。
S
我觉得是,反正我自己是在这个项目挂掉了之后,我就对 vision 完全失去了信心,感觉这问题真的是太难了。然后就去做一些这个稍微简单一点的问题,或者是我当时以为稍微简单的问题,就入了这个 NLP 的坑,我不知道唐帅是怎样。
G
我当时选择转去做 natural language processing 或者是 computational linguistics 的时候,主要想的还是说能够更关注在 learning 的这个问题上,更注重在做 machine learning 或者是 deep learning。因为我感觉,我自己感觉就是在 computer vision 里面大家可能更注重的是怎么样提高 performance 或者是怎么样。然后在 natural language processing 或者是 computational linguistics 里面,不能说大家不关注 performance,但是其实大家更多的时候还是希望能够找到一个解释,就是关于 machine learning 和 deep learning 本身的一个解释。所以我觉得那个时候更吸引我的是这些东西,现在也很吸引我。
A
那你最近主要做一些什么样的研究?
G
我现在的主要的研究方向是去建一些 unsupervised algorithm,然后去学 sentence representation,也就是说如何用一个向量去表示一个句子。那么在这个里面其实很多东西和舒晏最一开始说到她现在的工作里面有相关的一些东西。比如说舒晏一开始说到他们正在使用他们自己内部的一些数据去训练像 Word2vec 这样的模型,然后去拿到一些 word representaion 或者是 word vectors。最基本的概念是从,应该算是在 60 年前,在 60 年前的时候,其实有很多的这个关于什么是词的意义,就是说 word meaning 到底是什么?或者是 sentence 的 meaning 到底是什么?
在 1954 年之前有非常非常多的不同的定义,但在 1954 年的时候出现了一个非常,所以后来的研究非常有影响的一个说法,就是 meaning 其实它的意思就是说如果两个词或者是两个句子它出现的 context 是比较相似的时候,那么这两个词或者是两个句子就是有相同的 meaning。那么刚才舒晏所说到的他们使用的 Word2vec 这样的 algorithm 去学 word vectors 的时候,那么它的定义就是说如果两个词出现在比较相似的 context 里面,那么这两个词的 vector 就会比较接近。那在我的这个 case 里面,我其实把这件事情用到了 Sentence-Level,我主要的这个 training objective 就会变成:我认为如果两个句子出现在比较相似的 context 里面时候,这两个句子的这个 vector representations 应该就相似,总的来说这个概念是在 1954 年提出来的,然后这个概念的名字叫做 distributional hypothesis。
A
当我们在说 context 的时候,我们具体在指什么?
G
对,就是说 context 的意思,其实也是基于 context 来说的。就比如说现在在舒晏的这个 case 里面和我的这个 case 里面,我们认为这个 context 就是 surrounding words 或者是 surrounding sentences,那么在这个时候我们只考虑这个 text。但是实际上这个 context 这个东西泛围很广,比如说我们现在正在进行对话,那么这个对话的 context 就变成了我们之前聊过什么,我们接下来可能会聊什么,以及说我们现在整个这个对话聊的这个 topic 到底是什么?这些东西都可以被当成 context 来用。还有一些别的,比如说在 vision 和 language 这两个有交叉的这些领域里面,那么 vision 可以被当成是 language 的 context,language 也可以被当成为 vision 的 context。所以其实 context 这个词的意思,或者是 context 这个词到底指的是什么,也是根据 context 来定的。
S
其实这个就让我想到了我们小的时候上小学做这个语文的阅读,所有的题目都是请联系上下文理解这个作者的中心思想,其实我觉得就是上下文对吧?可能在对话中呢就是我们这个前前后后说的这几句话,然后可能在文字中呢就是像我们小的时候说的这个上下文,其实直译成中文就是这个意思。
A
我觉得我们需要退一步,因为我们现在假设所有听众都知道什么叫做 representation,对 representation 这个概念不是特别了解的人,我觉得我们现在说的已经过于抽象了。唐帅你能先说一下就是什么是 representation,我们为什么想到说我们要给一个单词,或者我们要给一个句子找一个 representation,为什么产生这样的问题?
G
嗯好的,这其实是一个非常好的问题。对于人来说,我们之间交流直接用 language 就行了,我们直接说词儿,我们直接说句子,然后句子可能是最常用的一个事情。但是对于机器来说的话,如果我们把这些 text 放进去的时候,机器并不知道到底应该怎么样去理解这个东西,那么可能我们就需要去定义一下这个词或者是这个句子它表达的是什么。 那么这个时候我们就需要找一个比如说对于我们来说就是词儿,它本身自己的意思就是我们已经知道了,对于这个机器来说它需要有自己的一个表示,比如说我现在对于机器来说最方便的一个表示方法可能就是用一个向量去表示一个词儿,表示一个句子。那么这个时候就出现了一个问题,就是如何去找到一个最合适的word representation 或者是 sentence representation。
A
我觉得从这个角度上来讲,一个机器学习算法做 representation 和我们自己做 representation,当然我们不知道我们的大脑怎么做 representation,但是当我们向它请求说,告诉我一个单词是什么意思,我们自己思考这个问题,一个单词它是什么意思的时候,我们其实回答这个问题也是用所谓的上下文,对吧?我们会想一些和它相近的词,可以替换它的词。
G
机器在进行这些表达的时候,它其实用到的是 context representation,比如说上下文,经常出就是和它相邻的一些词来对当前的这个词进行表达。但是人其实做这件事情的时候,context 只是一个辅助的东西,因为我们可以就是对于一些不是非常抽象的一些事物,我们其实是可以直接和 visual 的信息联系在一起。那么这样我们就形成了一个 multimodal 的一个 representation。
A
我们想让一个机器学习算法,用某种方式去表示一个单词,那具体就是说为什么我们想让机器学习算法做这个事情,就是你做完这个 representation 之后,你想做什么具体的任务?
G
最开始的时候这些 representation 或者是叫 embedding,这些东西最一开始的建立的目标,还是说怎么能够做最 efficient information retrieval。就比如说我现在给你一个词之后,你能不能返回一些近义词给我,或者是说我给你一个句子的时候,你能不能够返回一些比较相似的句子,就比如说现在我们所看到的 Google 搜索,然后我们在这个搜索框里面输入一些东西的时候,它最后能够返回给我们一些比较相似的一些比如说比较相关的一些信息,那么最开始想要解决的问题就是这样,如何能够做到最快速的最高效的去做这个信息提取任务。
A
当你提出一个 embedding 的方法之后,你一般会怎么样去衡量你这个 embedding 是不是足够的好的?
G
现在在机器学习里面,或者是说在深度学习里面,比如说我想去建一个算法去学习 word embedding,那么学完了之后,我可能先要在一些 standard evaluation task 上面去做一下 evaluation。比如说这些 task 有已经 human label 的这些相似的词儿,然后这些词相似的程度会给一个分数,那么就看你,由你的算法产生的这两个向量能不能够比较好地去 match 上人给出的这个标签。实际上还是在想说我在训练算法的时候其实没有拿到人给出的标签,但是我在测试的时候,我希望能够尽量的 match 上人给出的这两个词的这个相似度。
S
所以你说的这种方法就是比较直接的,就是直接在这个词与词的这个相似度上直接来做测试。
G
对这是一件事情。然后现在大家也经常能看到,就是比如说 Google 已经推出的 Word2vec 以及它最新的这个 fastText,还有 Stanford 他们出的 GloVe,Global Word Vectors,所以这些东西其实很多时候都能拿来直接去在下一步的这些 task 里面去做,比如说这些任务可能有情感分析,就是去看这个评论到底是想要表达一个正面的情感,还是负面的情感,或者是 subjectivity 或者是objectivity classification,就看你这条评论是不是非常主观,或者它是非常客观。因为你现在得到的,其实就是比如说像 Word2vec 或者是 GloVe 这里面,它能够得到的这些东西都是一个 vector representation,就是词的一个 vector representation,那么在接下来你想要做的一些任务里任何地方,你想要去表达一个单词的时候,你都可以替换成这些 vector representation。然后在绝大多数情况下,大家在用的时候会发现,如果我就直接用他们已经训练好的这些 word vectors 的话,其实能够对他们自己的系统,对他们这个 performance 都是能够提高很多。所以这也是为什么 Word2vec 和 GloVe 现在能够被广泛地用上的原因。
S
那接着刚才你说的这个 evaluation 的这个方法,你觉得这样的方法是不是也是 make sense 的?比如说我想要去看两个 Word2vec,比如说我两个训练好的 Word2vec 哪一个更好,那么如果说我固定一个模型,这个模型比如说是像你说的是用来做这个情感分析,那么我固定这个模型,同样的测试的数据,我用不同的这两个 Word2vec 来表示作为他们的输入,那么来看哪一套的这个结果会更好,在情感分析的这个任务上,这是一个常用的或者是合理的一种测试的方式吗?
G
我觉得情感分析可能偏向于 Sentence-Level,但是我们刚才在说的其实是 Word-Level。在我们拿到这个 Word-Level 的这个 vector representation 的时候,我们其实想比较的还是说我这两个 单词之间是不是能够 match 上人给的这个相似度。 那么对于情感分析,这里面可能更重要的是需要找到一些关键词。那么其实这两个之间还是稍微有一些差别的。所以对于刚才舒晏说到的这个问题,情感分析能不能够当成一个比较有用的 evaluation task,其实对于我来说,因为我在做的是 Sentence-Level 的 representation learning,那其实情感分析对于我来说是一个非常重要的 任务。因为我不光需要知道这两个句子之间是不是相似,我还想知道这个句子本身是不是表达了一种正面情感 或者是负面情感。那对于单词来说,可能更重要的我就是想说相似的词应该能够放在一起这样。

 18:12 
S
就像我最开始给出的这个例子,比如说有人搜索的是苹果平板电脑,那么可能在 GloVe 或者说一些其它的训练好的这个 Word2vec 上,苹果的这个近义词很有可能是一些其它的水果,比如说是香蕉或者是橙子。那么在这种情况下,苹果的近义词其实是并没有考虑到在整个的语境下,苹果更有可能是三星,或者是其他的一些科技产品的近义词,反而苹果的近义词有可能是一些和这个当时的语境完全没有关系的一些近义词。因为在这个训练这些 Word2vec 模型的时候,他们所用的可能并不是一些专门是 E-commerce 领域的这样的一些训练的数据,所以如果我们直接去找这个近义词的话,它的噪音会非常的多。
A
就是说单词是只有一个单词,我们只能给它给一个表示,但是这个单词它可以有很多截然不同的意思,苹果就是一个特别好的例子,对吧?它可能是一个水果,它也可能是一家公司,这两个概念是完全不同的概念,我们没有办法给它给一个统一的表示。
G
其实舒晏讲到了问题里面有两个问题。第一个问题就是说我们在建立这个 Word2vec 的时候,我们首先要给它一个字典,这个字典里面表示了所有的 unique token,然后这些 unique token 到底是什么? 可能对于大家来说 token 的意思就是一个词,但实际上并不是。token 可以表示 N-gram,就比如说我经常出现的一个词组,那么这个词组它其实可以被表达成一个 token。在舒晏的这个情况里面,比如说 Apple iPad,那么这个东西可以被直接表达成为一个 token,那么我们就给它一个新的向量,而不是用 Apple 和 iPad 这两个 vector 加在一起来表示这个 Apple iPad。所以其实在最开始建立这个字典的时候可以有很多考虑,这就完全取决于你现在想要做的事情是什么。可能你想要更多的考虑进去这个产品的信息,那么你就可以在产品这个层面上面去多加一些 token 在里面,然后你再根据你自己有的这些数据,然后再去训练一个 Word2vec 或者是 GloVe 这样。那么这样其实可以从一定程度上去解决刚才舒晏说到的问题,就是说我没有办法去表达 Apple 是一个品牌而不是一个水果。那么另外一件事情就是关于 multi-sense 的一个问题,因为每一个单词都会有很多的意思,就不光是在中文里面,基本上在世界上所有的语言里面,就是你很多时候都会出现一个词会有很多种意思,然后我们叫这个叫 multi-sense。这个 multi-sense 有一个非常经典的例子就是 bank,那么在英语里面 bank,你可以说它是银行,你也可以说它是河岸,对不对? 那么其实这个时候在 Word2vec 或者是 GloVe 它只给你了一个 representation,那么这个时候它就解决不了我们想要表达两个的问题。那么其实有一些不同的研究方法,比如说对于 multi-sense 的这些词,像 bank 这样的词,最一开始的有一些解决方案就是说我希望能去做一个 multi-sense disambiguation,我能够把这一个 sense 的词,我去给它两个 向量,或者是我给他多个向量去表示它。
第二个方法就是刚才舒晏说到的,我把这个词放在这个上下文里面,再去看它到底是什么意思,那么这就依赖于在原始的这个 Word2vec 上面,再搭建一个把 context 连在里面的这个用法。比如说像最近在 Salesforce 有一个自己的研究,他们就是说所有词的这个 representation 都应该放在这个 context 里面去理解,所以他们在这个 word vector 上面又加了一层自己的这个模型,然后再根据这个模型 produce 这个词,那么比如说我现在想要知道 bank 这个词到底表示的是河岸还是银行,那么这个 bank 就会被放在整个句子里面去看,它到底是怎么样的一个意思,那么这个时候它的 representation 可能就会更加精确,它表示的就是一个,比如说银行。
A
对于这种 embedding,我们现在有什么非常权威的数据集吗?
G
因为大多数情况下,我们希望训练这些 embedding 都是通过 unsupervised algorithm,也就是说我们不需要标签的数据。 那么其实很多时候我们就直接去网上去搜集数据,比如说像 Google 的 Word2vec,他们最一开始的版本就是在 Google News 上面训练出来的。然后接下来他们又出了一个版本是在 Wikipedia 上训练出来的。对于另外一个,就是 Stanford GloVe,Stanford GloVe 他们最一开始也是在 Wikipedia 上训练出来的,你知道 Wikipedia 其实是开源的,我也不应该说 开源,它是 publicly available to everyone,所以你就可以直接从上面去下载数据,然后就可以去训练你的 GloVe algorithm 或者是说 Word2vec algorithm,然后GloVe 在最一开始的时候提供了一个 Wikipedia 版本的,然后接下来它还提供了一些别的版本,比如说它在另外一个数据集叫做 common crawl 上面,common crawl 上面就是一个 ensemble 就是有很多不同的 data source,然后去训练出来的一个 GloVe embedding。
还有一个就是他们从 Twitter 上下载的一些数据,然后从 Twitter 上继续训练了一个 embedding 出来。所以大家如果去,我感觉像在打广告,如果大家去 GloVe 或者 Word2vec 网站上面的话,其实是可以下载完全不同的 source。那么其实这个时候就引出了一个问题,就是说就完全看你之后你的这个任务到底是什么,根据你的任务去选你到底想要哪一种 embedding。
A
在不同的这个语言环境中训练的向量表示会完全不一样。
G
不能说完全不一样,因为就是英语这个语言永远都是英语这个语言,但是实际上在用英语这个语言的时候就会有不一样,比如说 Wikipedia 上面,可能大家讲话就是比较正式,因为 Wikipedia 绝大多数时间都是在讲一些 scientific 的东西。 再比如说回到 common crawl 上面,common crawl 上面就是有像 ensemble,比如说它可能会有一些书上面的东西,可能会有一些网站上的东西,那么这就是一个不同的数据集的聚合。在这个 Twitter 上面,因为 Twitter 上还有一个 140 个字数的限制,所以大家讲话可能会比较短,然后又比较简单,那么其实这些 embedding 训练出来之后之间可能会有些差别,但是也不能说它们是完全不一样。
A
大多数自然语言处理相关的问题,你肯定要在其中用到 word embedding。可以这么说吗?
G
对,就是是这样,就是小阿的问题可以有两个层面去说这件事情。第一个就是说我们需要从 word 上面去表达吗?还是说对于一个句子来说,我也可以从字符层面上(Character-Level)去表达,那么这是第一个问题,就是说其实最近有一些关于 machine translation 的一些 任务里面,大家其实发现在字符层面上去做翻译,结果会比在一些传统的 word 上面做一些翻译的结果可能会好一些,那么这就引出来一个问题,就是说我们也许直接去表达这个 character,可能会更有效率。那么第二个问题就是说对于 word embedding 的这个定义,就是看你到底怎么样去理解这个 word embedding。因为很多时候我们讲 word embedding 的时候,我们就直接 refer to Word2vec 或者是 GloVe,或者是最新的这个 fastText,或是 Salesforce 的 contextualized Word2vec,其实在最原始最一开始的时候,bag of words 这样的模型我们也叫它 word embedding,但只不过它的 embedding 全都是二元的,或者是说它是离散的,它的这个意思就是说在这个 context 里面这个单词出现了多少次,在这个 context 里面那个单词没有出现过,那它就是零。对于小阿的问题来说,如果我们想要做自然语言处理,然后我们想要从 Word-Level 上去做的话,那么广义上来说,我们永远都需要用到一种表达这个词的这种方式,那么我们就叫它 word embedding。
A
我记得舒晏之前做过一个项目,是根据一个用户说的这个 tweet 来推测你可以给这个 tweet 加上一个什么样的 hashtag,什么样的标签。
S
是的,我当时其实完全没有用过 word embedding,我是像唐帅说的,用的是字符层面(Character-Level)的模型。因为我们当时用的这个训练数据是我们自己爬的这个 Twitter 的数据,Twitter 如果你要在里面去找一些完整的、没有拼写错误的英文单词其实是很少的。所以说可能对于这种比较口语化或者拼写错误比较多的这种文字,确实是 Character-Level 会更方便一些。
G
对,其实舒晏说的是就是很多时候你的这个数据里面非常 noisy 的时候,比如说你有非常多的 拼写错误,或者是说在那个 Twitter 上面,你可能会用一些缩写去表达一些单词,或者是一些简写去表达一些单词,那么这个时候 Character-Level 上可能就会比较好一点,而且相比较于 Character-Level 和 Word-Level 来说的话,如果说你想要去做一个对英语的这个 word embedding,你首先要去建一个字典,那么这个字典可能就要包含几百万个词,或者是说两百万个词,这还是在英语里面。 因为英语里面我们知道就是 third person 里面,我们所有的动词都需要加一个后缀,还能在所有的过去式里面,我们也要加上一个后缀。这只是英语,如果你要去一些 morphologically rich language 里面,比如像德语或者是俄语的话,那么你这个 morphological change 就非常非常多,你想建这个字典的时候,它里面所要包含的 unique token 就可能百万,百万已经算少了,可能千万,亿这样的级别,那么在这个情况下,在 Character-Level 上面进行表达,然后再去用 character 的 embedding 去 compose word embedding 或者是 sentence embedding 的时候,可能就会比较高效一些。因为我们知道在英语里面只有 26 个字母,加上所有的标点,我们可以达到比如说 60 个,70 个,那这样相比较于几百万个词来说的话,可能 Character-Level 会更高效一点。
A
我感觉我没有聊任何跟你的研究有关的事情。Word embedding 这么好,为什么你要想到去做 sentence embedding?有什么任务是 word embedding 不能够解决的?我的理解是你想把整个句子表示成一个向量。
G
对,sentence embedding 的想法,还是说去用一个向量去表达这一个句子。那么刚才小阿问到的一个问题就是说有什么事情是 word embedding 不能够解决的,那么这个时候就出现了。刚才我们也说了,就是 word embedding 里面它所借助到的这个想法是从 distributional hypothesis 里面来的,那么 distributional hypothesis 说的是如果这两个单词出现在比较相同的语境里面的时候,这两个单词的意义就是一样的。那么这个时候就出现了一个问题,它不能够去区分反义词,不能说不能够区分,就是它在反义词上面的区分度比较低,因为很多时候你比如说我说这个天气不错,这个天气很糟糕,那么不错和糟糕这两个词就出现在了同样的语境里面。那么其实在 word embedding 里面主要的一个问题就在于它不能够很好地去区分反义词。那么这样一来上升到 句子这个层面的时候,刚才我说的两句话,天气不错,我表达的是一个正面情感。那么在我说天气很糟糕,我表达的是一个负面情感,那如果我只用 word embedding,我从句子里面找到每一个词的这个 word embedding,然后我把它 average 在一起,那么这两句话其实很难区分开,这是一个问题。另外一个问题,就是比如说这样的一个句子:This great movie is not bad。那么第二句话说:This bad movie is not great。那么其实第一句话想要表达的是一个正面情感,第二句话想要表达的是个负面情感,但是这两句话所有的词全部都是一样的。那么这个时候我如果直接把所有的 word embedding 加在一起的时候,这两句话就不能被区分开了,那这个时候就有这个问题,我们还是需要去从 Sentence-Level 去理解它。就是说我们要知道 great 是用来去 modify 这个movie,在第二句话里面这个 bad 是用来去描述这个 movie,那么我们就需要在 Sentence-Level 上去找到这些比较有用的信息。
S
但是在大量的情况下,当我们有了 word embedding 之后,我们并不是很简单的把这个 word embedding 加起来来表示这个 sentence embedding 对吧?我们还是会用一些框架来整合这些 word embedding,比如说我们现在用的这些什么 LSTM 的这些模型,即使这样的话也不能解决你说的这样的例子吗?
G
舒晏刚才说的这个情况是对的,也是大家都想要努力去做研究的一个方向。就是说我们怎么样能够通过一些更复杂的一些模型找到这样一个复合函数,然后这样一个复合函数是一个 universal 的函数,然后这个函数可以用来去 compose 一个 sentence representation from those word representation。那么刚才舒晏说到的一个模型,就是 LSTM,也就是 long short-term memory,然后这是一个其实比较好的一个 sequential model,其实在有些情况下还有一个另外一个模型,刚才 LSTM 说到的其实是 recurrent neural network,然后我们其实还有另外一种方式,就是 recursive neural network。recursive neural network 就是相当于是说我先对这个句子找到一个树结构的一个表达,那么比如说我可以根据 dependency parsing 然后我可以找到这样一个 dependency tree,然后根据这个 dependency tree 我再去一步一步地去构建这些单词。
A
Dependency tree 是这个句子中词之间的关系的一个组织形式是吗?
G
对是的,简单来说就是这样的。
A
它就是一个表示各个词之间是相互怎么制约的这样一个关系的描述。
G
嗯是的,可以这样说,然后我们根据这个 dependency tree 我们还可以建立一个 recursive neural network。在 Stanford 有一个数据集叫做 Stanford sentiment treebank,也就是说它里面所有的句子它就是给了这样一个树型结构,然后根据这个树型结构我们可以构建一个 recursive neural network,然后它跟 recurrent neural network 稍微有些区别,这个 recursive neural network 也就可以从树的这个 Leaf Node 开始不断的去构建两个词,然后等它不断的从最下面一层构建到最上面一层的时候,我们也就到了这个树的根,然后到了这个树的根的时候,我们就可以拿到这样一个 sentence representation,然后很多时候 recursive neural network and recurrent neural network 这两个东西都可以拿来去比较好的做 sentence encoding,那么就是说我可以把比如说 sequence of words 这些东西全部构建成一个 sentence vector。 然后除了这两种之外,我们还有应该说是现在大家都想要去尝试的一个东西,就是 convolutional neural network。为什么呢?因为刚才我们也说到了,recurrent neural network 很多时候它是 sequentially processed sentence,那么问题就在于说这个 sequentially,那么它的 running time 其实就是取决于你有多少个单词这个句子里面,但是 convolutional neural network 的好处就在于它所有的计算都是并行的,那么既然所有的计算都是并行的,在大部分时间下它的运行速度就会比 recurrent neural network 或者是 recursive neural network 更快。在舒晏的那个例子下面,就很多实际应用过程中,我们都认为这个运行时间是一个非常重要的一个因素,就是我们不可能让用户去等我们现在这个 network 去返回一些什么结果,那么在这种就是这个情况下,我们可能就会需要去选择一些更快的模型。
A
对 word embedding 我们验证 word embedding 好不好,是说两个近义词它们的距离近不近,那对于 sentence embedding,你们有想出什么样的衡量 sentence embedding 好不好的方法吗?
G
其实有一些也是从 word embedding 的这个角度上来说的,比如说我现在想说的是这个 embedding 能够 encode 这个 sentence 的 meaning,那么第一个方式就是说如果这两个句子的意思比较相似的时候,那么这两个向量之间的距离也应该比较近, 那么这是一种。那么这个时候我们就需要有一个人工标注过的数据集去做一些测试,那么就有一个数据集,我觉得可能呢是一个比较常用,至少是在我的这个研究里面,叫做 semantic texture similarity,然后这个数据集里面就是说它会给你很多个 sentence pair,然后这个 sentence pair 已经被人工标注过,然后这个 label 的意思就是说这两个句子之间的相似度到底有多少,那么这个时候就可以用这样的一个数据集去评估你的模型,这是一点。还有另外一点就是刚才我说过的情感分析,我要去看这个句子到底是不是在传达一个正面情感或者是负面情感,那么这个时候你的这个模型拿来就是当成了一个 sentence encoder,那么比如说在数据集里面,这句话是被标记成了 positive,那么你先把这句话用你的模型去 encode,然后它得到了一个向量,然后你在得到这个向量之后用这个向量去预测到底这句话到底是正面还是负面,这是两种测试的方法。还有另外一种测试的方法,就是你在做 多语言的 sentence embedding 的时候,你有英语,你有法语,你有德语,我现在有了英语的这个 embedding,然后我现在有了德语的 embedding,如果这两个 embedding 之间的结构比较相似的时候,我其实是可以找到直接的这个翻译,因为这两句话想要传达的意义是完全一样的,或者说这两句话的意思是完全一样的,那么我也可以用它去做翻译,那么做翻译的时候,其实这也算是一个 evaluation 的 task。
A
两个不同的语言,他们的表示如果接近的话,说明这两个句子在这两个不同语言的意思也是一样的,我们就直接翻译过来就好了。
G
应该是说如果你的这个 encoder 非常的好的话,它能够真正 capture meaning 的话,那其实这两个语言之间你可以通过向量去找到另外一个语言的 embedding 里面的这个 embedding,通过这个 embedding 再去找回到原来的那句话。那么这样其实就完成了一个翻译的工作。
A
嗯,我们今天是从这个舒晏的公司的一个任务出发,我们聊得非常的松散。我们聊了很久了,今天就聊到这儿。非常感谢唐帅今天给我们录这期节目。
G
非常感谢你们的邀请。
A
我们下期见。
S
好,那我们下期再见。