运用运用TensorFlow处理简单的处理简单的NLP问题问题
当前“人工智能”是继“大数据”后又一个即将被毁的词,每家公司都宣称要发力人工智能,就跟4-5年前大数据一样,业界叫的都
非常响亮,不禁想到之前一个老外说过的话:
Big Data is like teenage sex: Everyone talks about it, nobody really knows how to do it, everyone thinks everyone else is
doing it, so everyone claims.
现在看来,上面的”Big Data”可以换成”AI”了,在大家还没搞明白大数据的时候,人工智能就开始引领下一个潮流了。本着跟
风的态度,我也尝试去窥探个究竟。
引言
当前无论是学术界还是工业界,深度学习都受到极大的追捧,尤其是在Google开源深度学习平台TensorFlow之后,更是给深
度学习火上浇油。目前在开源社区Github上所有开源项目中,TensorFlow最为活跃,从推出到现在,经历了几个版本的演
进,可以说能够灵活高效地解决大量实际问题。本文主要尝试阐述TensorFlow在自然语言处理(NLP)领域的简单应用,让大家
伙儿更加感性地认识TensorFlow。
说到NLP,其实我对它并不是很熟悉,之前也未曾有过NLP的相关经验,本文是我最近学习TensorFlow的一些积累,就当抛
砖引玉了。当前互联网每天都在产生大量的文本和音频数据,通过挖掘这些数据,我们可以做一些更加便捷的应用,例如机器
翻译、语音识别、词性标注以及信息检索等,这些都属于NLP范畴。而在NLP领域中,语言模型是最基本的一个环节,本文主
要围绕语言模型展开,首先介绍其基本原理,进而引出词向量(word2vec)、循环神经网络(RNN)、长短时记忆网络(LSTM)等
深度学习相关模型,并详细介绍如何利用 TensorFlow 实现上述模型。
语言模型
语言模型是一种概率模型,它是基于一个语料库创建,得到每个句子出现的概率,通俗一点讲就是看一句话是不是正常人说出
来的,数学上表示为:
上述公式的意义是:一个句子出现的概率等于给定前面的词情况下,紧接着后面的词出现的概率。它是通过条件概率公式展开
得到。其中条件概率 就是创建语言模型所需要的参数,每个条件概率的意义解释为:根据前面的词预测下一个词的概率。有了
这些条件概率参数,给定一个句子,就可以通过以上公式得到一个句子出现的概率。例如有一句话“php是最好的语言”(我不
确定这是不是自然语言),假设已经分词为“php”、“是”、“最好的”、“语言”,那么它出现的概率为P(“php”,“是”,“最好
的”,“语言”)=P(“php”)P(“是”|“php”)P(“最好的”|“php”,“是”)P(“语言”|“php”,“是”,“最好的”),如果这个概率较大,那么判断为
正常的一句话。以上这些条件概率通过如下贝叶斯公式得到:
根据大数定理上述公式又可以近似为:
假如语料库里有 N 个词,一个句子长度为 T ,那么就有 N
T
种可能,每一种可能都要计算 T 个条件概率参数,最后要计算
TN
T
个参数并保存,不仅计算量大,对于内存要求也是惊人。那么如何避免这个问题呢,之前穷举的方法行不通,那么换个
思路,采用一种偷懒的处理方法,就是将上述公式中条件概率做个如下近似:
这意思就是说一个词出现的概率只与它前面 n-1 个词有关,而不是与它前面所有的词有关,这样极大的减少了统计的可能性,
提高了计算效率,这种处理方法称之为 n-gram 模型,通常 n 取2~3就能得到不错的效果。总结起来,n-gram 模型就是统计语
料库中词串出现的次数,一次性计算得到词串的概率并将其保存起来,在预测一个句子时,直接通过前面所述的条件概率公式
得到句子出现的概率。
近年也流行起神经网络语言模型,从机器学习的角度来看,一开始不全部计算这些词串的概率值,而是通过一个模型对词串的
概率进行建模,然后构造一个目标函数,不断优化这个目标,得到一组优化的参数,当需要哪个词串概率时,利用这组优化的
参数直接计算得到对应的词串概率。将词串概率 P(w|context(w)) 看做是 w 和 context(w) 的函数,其中 context(w) 表示此 w
的上下文,即相当于前面所述的 n-gram 模型的前 n-1 个词,那么就有如下数学表示。
目标函数采用对数似然函数,表示如下(其中 NN 代表语料库中词典的大小):
通过优化算法不断最小化目标函数得到一组优化的参数 Θ ,在神经网络中参数 Θ 则为网络层与层间的权值与偏置。那么在用
神经网络学习语言模型[1]时,如何表示一个词呢?通常,在机器学习领域,是将一个样本对象抽象为一个向量,所以类似
地,神经网络语言模型中是将词(或短语)表示为向量,通常叫做word2vec。那么神经网络语言模型就可以表示如下示意图。