计算机虽然有了人工智能的程序支持,但事实上也不能将其机器学习的功能等同于像人类那样。至少,到目前还不是这样。那么,向Google的图片识别或者Facebook的M应用等一类系统,它们是怎么能够理解自然语言或视觉的呢?下面,是人工智能系统Josh的自我独白:
简而言之,我们将单词和短语的含义以数字的形式储存在计算机上。目前,市场上有许多这类产品,比如将单词转换成向量形式的工具word2vec,该工具使用浅人工神经网络来计算文字嵌入。此外也有一些诸如记忆网络的技术,能够自主学习文本,进行一些简单有限的问答。
在过去的几年中,由于先进的人工神经网络算法有了许多惊人的成果,图像识别和数字信号处理技术异常火爆。但是相比较之下,同是人工智能领域的理解自然语言方面似乎显得困难得多,为什么呢?
自然语言处理本质上是另一种约束关系的问题
研究自然语言是困难的,很多时候甚至超过了我们的想象——因为语言永远不变的是改变,因为全世界有千万种语言……无论你的观点是什么,自然语言难以为算法所处理的最大原因是——我们没有足够多的样本。
确实,我们拥有大量的文本资源,包括书籍、博客、社交媒体等。但即便如此,我们得到的用以分析的文本相对来说还显得不足。看一看以下图片:
当我们分析音频数据,或者图像数据时,事实上我们得到的数据信息比人类意识中的要多。以佳能5D Mark III相机为例,摄影领域的人通常会说这是一个令人尊敬的相机,因为它有着5760 x 3840的分辨率。因为每个颜色像数都分别由红、蓝、绿、α值(RGBA)来表示,所以每个像素拥有4个标准数值。在其原始格式当中,一张这种像素的图片大约含有 88.47 MB数据。相比较之下,莎士比亚的所有作品也只有4.4 MB。一个像数等于4个字节,一个字符则占一个字节。
这意味着:
1、解析文本的时候,每一个令牌(字词的NLP术语)更多的是影响文本的整体分析。
2、生成文本的时候,每一个被选出来的令牌才能影响结果。
换句话说,在文本当中,字符和令牌才是占据主要成分的元素,和像素不同。
好了,那我们是如何处理文本的呢?在一个严格的解析系统中,我们需要用数值格式来表示文本,提示为向量形式。现在我们还是要继续理解很简单的向量表示,而未来则可以处理更为复杂的表达了。
我们来以几个词组为例:
1. Turn on the lights(开灯)
2. Power on the lights(打开灯的电源)
3. What time is it?(现在几点?)
4. What is the current time?(当前时间是几点?)
我们需要做的是创建一个叫词典的东西。换句话说,我们想要将现有的词组用特有的令牌技术来创建一个词汇表。然后,我们需要对信息做一些隐式预处理,去掉标点符号等。最后,我们给每一个唯一码赋予其各自的索引,从而生成自己的词汇向量:
0 turn
1 on
2 the
3 lights
4 power
5 what
6 time
7 is
8 it
9 current
由于每一个字代表一个索引,因此我们可以使用反向散列数据结构来得到每个单词的索引,然后无论是否每一个字都是给定文本,我们都可以将这些字表示为一系列的布尔值(布尔值:是“真” True 或“假” False 中的一个)。比如,上述例句就可以表示为:
1. { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }
2. { 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 }
3. { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0 }
4. { 0, 0, 1, 0, 0, 1, 1, 1, 0, 1}
有了这些向量,我们可以使用向量点积得到一个粗略的相似度计算。所谓点积,就是接受在实数R上的两个向量并返回一个实数值标量的二元运算。
所以,上述前两个例句的点积就是:
1 * 0 = 0
1 * 1 = 1
1 * 1 = 1
1 * 1 = 1
0 * 0 = 0
0 * 0 = 0
0 * 0 = 0
0 * 0 = 0
0 * 0 = 0
0 * 0 = 0
这些数值加起来和是3。而如果将第一个和第三个句子做同样的处理:
1 * 0 = 0
1 * 0 = 0
1 * 0 = 0
1 * 0 = 0
0 * 0 = 0
0 * 1 = 0
0 * 1 = 0
0 * 1 = 0
0 * 1 = 0
0 * 0 = 0
那么和为0。这就是说,“Turn on the lights”和“What time is it”没有丝毫的相似。
你也许会发现,我们目前的词汇处理规模小到只有10个词。不过,未来当我们探索更多语义词嵌入时,我们还可以压缩向量,获得更准确的上下文理解和表达。