在上一篇文章《从矩阵到CNN》结尾,我们留下了一个悬念:CNN很擅长处理静态图像的空间模式,可一旦数据带上前后依赖的时间维度——比如一句话、一段语音、一条股票走势——卷积在空间上滑动窗口的玩法,就不那么灵了。

今天,我们就来正面回答这个问题:

神经网络到底要怎么“读懂”一句话?


话与图,最大的不同

先来想想,话与图,最大的不同在哪。

你知道《拉奥孔》吗?如果你高中刷过历年真题卷,应该有印象。18世纪,当时“诗画同质”的观点非常流行。德国思想家莱辛通过分析古希腊雕塑《拉奥孔》,提出了著名的“诗画异质说”来反驳。他主张:诗是时间艺术,画是空间艺术

一幅画摆在眼前,所有景物尽收眼底,从左到右、从上到下,每个像素同时存在。

但一句话不一样——如果有人对你说:“我昨天在楼下看见了那只猫”。你首先会听到“我”,然后是“昨天”,最后才是“猫”。这句话里,词语是一个接一个、按时间顺序流淌出来的。词与词之间有先后,有因果,有上下文。

所以,要让神经网络读懂一句话,核心问题就是:处理时间

不过在此之前,我们得先想办法表示一个词


词嵌入:把“意思”变成数字

让我们来想想词的特点。

到底是什么区分了每一个词?是读音吗?是写法吗?是意思

每个词的意思才是区分词与词的根本。

那么我们要怎么在计算机中表示词的意思呢?来,查查字典——比如“车”这个字。

所谓“车”,就是“陆地上”“有轮子”“交通工具”。

发现没有,一个词的意思是由一个个特征来确定的。而车的特征就是“陆地上”“有轮子”“交通工具”当然,它还有一个特征是“名词”。

既然一个词的意思是由一个个特征来确定的,那么我们就可以用一个数组(或者说矩阵)来表示一个词了。

比如,我们可以创建一个数组:

陆地 轮子 生物 名词 动词 食物 交通工具
80 85 10 90 5 1 98

(为了展示方便,用一个表格表示)

在这个数组中,每一位代表词的一个特征,数值越高,说明这个词的这个特征越显著。比如“交通工具”这一位是98,说明“车”具有极强的交通工具属性;“生物”只有10,说明它跟生物基本不沾边。

这就是词嵌入最核心的思想:用一个稠密的实数向量(数组)来表示一个词,向量中的每一位,都代表某种潜在的语义特征。

xingfan-s/my-3d-word-vectors: 展示用

并且,这么做还有一个显而易见的好处:如果两个词的意思差不多,那它们对应的向量在整个向量空间中就会离得很近(也就是它们的数字会差不多)。那么我们就只需要计算它们之间的距离就可以知道它们之间的相关性了。

比如我们可以把“苹果”和“香蕉”进行点乘,值很大,说明它们的相关性很高。

我们也可以轻松地进行类比,因为在词嵌入中,“键盘-鼠标”≈“桌子-椅子”


怎么知道这些特征?

那么问题来了:上面那个表格里的80、85、98……是谁填进去的?

这些数字不是人手动填进去的,而是让模型自己“看”出来的。

怎么看的?核心思路其实非常朴素:一个词长什么样,看它身边站着谁。

什么意思呢?举个例子——假如你第一次见到“苹果”这个词,根本不知道它是什么意思。但我给你看五百个包含“苹果”的句子,你就会发现:

  • 这句话里的“苹果”旁边有“吃”、“削皮”、“水果”,你猜它可能是一种食物。

  • 那句话里的“苹果”旁边有“手机”、“充电”、“刷视频”,你又猜它可能是一种电子产品。

看多了,你就学会了。 你不需要任何人事先告诉你“苹果”有哪几个特征维度,更不需要谁去手动填写那个表格。你只需要大量阅读“苹果”所处的各种上下文,大脑就会自动学会区分这两个意思,并知道在大多数情况下它指的是哪一种。

那么,问题来了——人可以通过阅读来理解,机器要怎么“阅读”呢?毕竟它没有意识。

答案是,我们可以通过设计一种任务让机器去完成,以此逼它学会阅读。

任务是这样的:准备海量的句子,然后把每个句子中的某个词挖掉,就像高中英语卷子里的完形填空那样。然后,我们再让一台机器去猜这个挖掉的词是什么。

比如句子:“我吃了一颗______,它又大又红,很甜。”

当然,在模型训练的早期阶段,因为每个词的向量都是随机初始化的(也就是它根本不认识任何一个词),它一开始只能胡乱猜测,但每一次猜测都会产生一个误差(也就是损失值),并通过反向传播来更新词向量。随着看到类似“苹果”这样的句子越来越多,它就会发现:当周围是“吃”、“红”、“甜”时,中间被挖掉的那个词的向量,往往就指向“苹果”。

这一过程不断重复,经过海量训练之后,模型便学会了每个词最佳的向量表示——也就是我们需要的词嵌入向量。

而这就是词嵌入最经典的训练方法:Word2Vec。Word2Vec有两种训练架构,分别对应“根据上下文猜中间词”和“根据中间词猜上下文”。前者被称作CBOW,训练速度更快;后者叫做Skip-gram,对低频词,生僻字效果更好。

另外值得一提的是,我们上面提到的这种训练词向量的方法,其底层逻辑依赖于一个关键假设——分布式假设:语义相似的词会出现在相似的上下文中。换句话说,“苹果”和“香蕉”之所以在向量空间中离得近,不是因为有人告诉模型它们都是水果,而是因为它们在语料库中频繁地与相似的一组词(“吃”、“水果”、“甜”等)共现。模型捕捉到了这种共现模式,自然就把它们的向量学得很接近。

最后总结一下就是:与其我们亲自手动去填“生物”、“交通工具”等语义特征,不如让模型通过阅读海量文本自己学习到每个词的特征表示。我们设计的不是特征,而是让模型学会发现特征的游戏规则。 而这个所谓的“游戏”,说白了就是——挖掉一个词,让它猜。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐