人工智能理解自然语言的原理是什么?

本题已收录至知乎圆桌:机器之能 X 语言之美,更多「人工智能」相关话题欢迎关注讨论。比如siri
关注者
752
被浏览
55,440
收录于 知乎圆桌 ·

人工智能有很多很多的模型/方法来实现,我这里主要谈谈在深度学习下,特别是在编/解码器架构下,机器理解自然语言的原理。

深度学习理解自然语言是通过编码器(Encoder)来实现的。对于自然语言的句子,机器并没有办法直接理解它的意思,我们需要用编码器把句子转换成机器比较容易理解的编码才行。

以如下邮件自动回复模型为例,

http://www.wildml.com/2016/04/deep-learning-for-chatbots-part-1-introduction/

左边编码器(ENCODER)以LSTM为基本网络结构(LSTM是RNN的一种经典实现),依次从左要右读入邮件中的词,最终所有词都读完后,得到的输出(图中的thought vector)是一个浮点数向量。我们称这个向量是该邮件的编码,该编码中隐含了机器对这个邮件的理解。

当然,这个浮点数向量本身对于人类来说是不可阅读的,所以我们要用解码器(DECODER)让机器输出我们能理解句子。上图中,解码器也是一个LSMT,它依次输出各个词,直到输出<END>为止。

听起来这确实有点玄乎,但在实际运用中却能够取得不错的效果。我觉得这主要还是得益于我们用大量的训练数据(<邮件原文,邮件回复>)去训练这组编解码器,使得网络中的各种权重拟合了数据的样式。

在上述例子中,ENCODER和DECODER都是LSTM来实现的,因为LSTM擅长处理序列输入和序列输出。但这并不意味着我们在理解自然语言的任务中只有这样一种选择,特别是当我们要解决一个分类问题的时候,我们会更加自然地用一个简单的Softmax层作为DECODER。哪怕在一个邮件自动回复系统或者机器翻译任务中,只要网络的组合方式合理得当,我们仍然可以选择CNN[Gehring et al. 2017],ATTENTION[Vaswani, et al., 2017]等非RNN的网络作为Encoder、Decoder的基本结构,并取得不错的效果。

最后,值得一提的是,在上述例子中,我们一般不会把词语直接读入LSTM,而是先把词语映射成一个浮点数向量(不同的词语对应不同的向量),用来表示这个词的语义。假设你的词典里面有100,000个词,那么就有100,000个向量。我们称这样的向量为embedding或者word vector。增加这个步骤的目的是为了增强编/解码器对于词语的理解。当我们训练完这组编/解码器之后,就会神奇地发现,词向量具有了词语的语义。如下图所示,

embedding(king) - embedding(queen) ~= embedding(man) - embedding(woman)

这也就给词语的加减运算赋予了物理意义,这对于神经网络理解整个文本是很有益处的。