1.word2vec 词向量怎么来的
2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。随着深度学习(Deep Learning)在自然语言处理中应用的普及,很多人误以为word2vec是一种深度学习算法。其实word2vec算法的背后是一个浅层神经网络。另外需要强调的一点是,word2vec是一个计算word vector的开源工具。当我们在说word2vec算法或模型的时候,其实指的是其背后用于计算word vector的CBoW模型和Skip-gram模型。很多人以为word2vec指的是一个算法或模型,这也是一种谬误。接下来,本文将从统计语言模型出发,尽可能详细地介绍word2vec工具背后的算法模型的来龙去脉。
详情:网页链接
2.word2vec和深度学习有什么关系
1、计算机视觉
ImageNet Classification with Deep Convolutional Neural Networks, Alex Krizhevsky, Ilya Sutskever, Geoffrey E Hinton, NIPS 2012.
Learning Hierarchical Features for Scene Labeling, Clement Farabet, Camille Couprie, Laurent Najman and Yann LeCun, IEEE Transactions on Pattern Analysis and Machine Intelligence, 2013.
Learning Convolutional Feature Hierarchies for Visual Recognition, Koray Kavukcuoglu, Pierre Sermanet, Y-Lan Boureau, Karol Gregor, Micha?l Mathieu and Yann LeCun, Advances in Neural Information Processing Systems (NIPS 2010), 23, 2010.
2、语音识别
微软研究人员通过与hintion合作,首先将RBM和DBN引入到语音识别声学模型训练中,并且在大词汇量语音识别系统中获得巨大成功,使得语音识别的错误率相对减低30%。但是,DNN还没有有效的并行快速算法,很多研究机构都是在利用大规模数据语料通过GPU平台提高DNN声学模型的训练效率。
在国际上,IBM、google等公司都快速进行了DNN语音识别的研究,并且速度飞快。
国内方面,阿里巴巴,科大讯飞、百度、中科院自动化所等公司或研究单位,也在进行深度学习在语音识别上的研究。
3、自然语言处理等其他领域
很多机构在开展研究,2013年Tomas Mikolov,Kai Chen,Greg Corrado,Jeffrey Dean发表论文Efficient Estimation of Word Representations in Vector Space建立word2vector模型,与传统的词袋模型(bag of words)相比,word2vector能够更好地表达语法信息。 深度学习在自然语言处理等领域主要应用于机器翻译以及语义挖掘等方面。
3.如何利用深度学习技术训练聊天机器人语言模型
数据预处理 模型能聊的内容也取决于选取的语料。
如果已经具备了原始聊天数据,可以用SQL通过关键字查询一些对话,也就是从大库里选取出一个小库来训练。从一些论文上,很多算法都是在数据预处理层面的,比如Mechanism-Aware Neural Machine for Dialogue Response Generation就介绍了,从大库中抽取小库,然后再进行融合,训练出有特色的对话来。
对于英语,需要了解NLTK,NLTK提供了加载语料,语料标准化,语料分类,PoS词性标注,语意抽取等功能。另一个功能强大的工具库是CoreNLP,作为 Stanford开源出来的工具,特色是实体标注,语意抽取,支持多种语言。
下面主要介绍两个内容:中文分词 现在有很多中文分词的SDK,分词的算法也比较多,也有很多文章对不同SDK的性能做比较。做中文分词的示例代码如下。
# coding:utf8''' Segmenter with Chinese ''' import jieba import langid def segment_chinese_sentence(sentence):''' Return segmented sentence.''' seg_list = jieba.cut(sentence, cut_all=False) seg_sentence = u" ".join(seg_list) return seg_sentence.strip().encode('utf8') def process_sentence(sentence):''' Only process Chinese Sentence.''' if langid.classify(sentence)[0] == 'zh':return segment_chinese_sentence(sentence) return sentence if __name__ == "__main__":print(process_sentence('飞雪连天射白鹿')) print(process_sentence('I have a pen.')) 以上使用了langid先判断语句是否是中文,然后使用jieba进行分词。在功能上,jieba分词支持全切分模式,精确模式和搜索引擎模式。
全切分:输出所有分词。精确:概率上的最佳分词。
所有引擎模式:对精确切分后的长句再进行分词。jieba分词的实现 主要是分成下面三步:1、加载字典,在内存中建立字典空间。
字典的构造是每行一个词,空格,词频,空格,词性。上诉书 3 n 上诉人 3 n 上诉期 3 b 上诉状 4 n 上课 650 v 建立字典空间的是使用python的dict,采用前缀数组的方式。
使用前缀数组的原因是树结构只有一层 - word:freq,效率高,节省空间。比如单词"dog", 字典中将这样存储:{"d": 0,"do": 0,"dog": 1 # value为词频 } 字典空间的主要用途是对输入句子建立有向无环图,然后根据算法进行切分。
算法的取舍主要是根据模式 - 全切,精确还是搜索。2、对输入的语句分词,首先是建立一个有向无环图。
有向无环图, Directed acyclic graph (音 /?d?ɡ/)。【图 3-2】 DAG DAG对于后面计算最大概率路径和使用HNN模型识别新词有直接关系。
3、按照模式,对有向无环图进行遍历,比如,在精确模式下,便利就是求最大权重和的路径,权重来自于在字典中定义的词频。对于没有出现在词典中的词,连续的单个字符也许会构成新词。
然后用HMM模型和Viterbi算法识别新词。精确模型切词:使用动态规划对最大概率路径进行求解。
最大概率路径:求route = (w1, w2, w3 ,.., wn),使得Σweight(wi)最大。Wi为该词的词频。
更多的细节还需要读一下jieba的源码。自定义字典 jieba分词默认的字典是:1998人民日报的切分语料还有一个msr的切分语料和一些txt小说。
开发者可以自行添加字典,只要符合字典构建的格式就行。jieba分词同时提供接口添加词汇。
Word embedding 使用机器学习训练的语言模型,网络算法是使用数字进行计算,在输入进行编码,在输出进行解码。word embedding就是编解码的手段。
【图 3-3】 word embedding, Ref. #7 word embedding是文本的数值化表示方法。表示法包括one-hot,bag of words,N-gram,分布式表示,共现矩阵等。
Word2vec 近年来,word2vec被广泛采用。Word2vec输入文章或者其他语料,输出语料中词汇建设的词向量空间。
详细可参考word2vec数学原理解析。使用word2vec 安装完成后,得到word2vec命令行工具。
word2vec -train "data/review.txt" \-output "data/review.model" \-cbow 1 \-size 100 \-window 8 \-negative 25 \-hs 0 \-sample 1e-4 \-threads 20 \-binary 1 \-iter 15-train "data/review.txt" 表示在指定的语料库上训练模型-cbow 1 表示用cbow模型,设成0表示用skip-gram模型-size 100 词向量的维度为100-window 8 训练窗口的大小为8 即考虑一个单词的前八个和后八个单词-negative 25 -hs 0 是使用negative sample还是HS算法-sample 1e-4 采用阈值-threads 20 线程数-binary 1 输出model保存成2进制-iter 15 迭代次数 在训练完成后,就得到一个model,用该model可以查询每个词的词向量,在词和词之间求距离,将不同词放在数学公式中计算输出相关性的词。比如:vector("法国") - vector("巴黎) + vector("英国") = vector("伦敦")" 对于训练不同的语料库,可以单独的训练词向量模型,可以利用已经训练好的模型。
其它训练词向量空间工具推荐:Glove。Seq2Seq2014年,Sequence to Sequence Learning with Neural Networks提出了使用深度学习技术,基于RNN和LSTM网络训练翻译系统,取得了突破,这一方法便应用在更广泛的领域,比如问答系统,图像字幕,语音识别,撰写诗词等。
Seq2Seq完成了【encoder + decoder -。
4.word2vec为什么需要较大规模语料训练词向量
这是个微分方程问题。
方程两边令x=1,得f(1)-0=1-3,所以f(1)=-2。方程两边求导,f(x)+xf'(x)-4f(x)=2x,所以f'(x)-3/x*f(x)=2。
令u=f(x),则u'-3u/x=2。这是个一阶线性非齐次微分方程。
先求解u'-3u/x=0,分离变量得du/u=3dx/x,两边积分得lnu=3lnx+lnC,所以u=Cx^3。设u'-3u/x=2的解是u=C(x)x^3,代入微分方程,C'(*x)x^3+C(x)*3x^2-3C(x)x^2=2,所以C'(x)=2/x^3,积分得C(x)=-1/x^2+C。
所以u'-3u/x=2的通解是u=x^3(-1/x^2+C)=-x+Cx^3。所以f(x)=-x+Cx^3。
再由f(1)=-2,得C=-1。所以f(x)=-x-x^3。
5.word2vec是如何得到词向量的
假设每个词对应一个词向量,假设:
1)两个词的相似度正比于对应词向量的乘积。即:sim(v1,v2)=v1?v2sim(v1,v2)=v1?v2。即点乘原则;
2)多个词v1~vnv1~vn组成的一个上下文用CC来表示,其中C=∑ni=1viC=∑i=1nvi。C|C|C|C|称作上下文C的中心向量。即加和原则;
3)在上下文CC中出现单词AA的概率正比于能量因子e?E(A,C),whereE=?A?Ce?E(A,C),whereE=?A?C。即能量法则(可参看热统中的配分函数)。
因此:
p(A|C)=e?E(A,C)∑Vi=1e?E(vi,C)=eA?C∑Vi=1evi?C (1)p(A|C)=e?E(A,C)∑i=1Ve?E(vi,C)=eA?C∑i=1Vevi?C (1)
其中VV是整个词汇空间。
ref1ref1的分母计算是非常耗时的,下面推导比较方面快速的计算ref1ref1的方法。
把整个词汇空间分成两部分GG和HH,同时在下面的公式中GG和HH也表示各自的词向量中心,并且设AA存在于GG中,则:
p(A|C)=p(A|G,C)?p(G|C) (2)p(A|C)=p(A|G,C)?p(G|C) (2)
where,
p(G|C)=eG?CeG?C+eH?C=11+e(H?G)?C (3)p(G|C)=eG?CeG?C+eH?C=11+e(H?G)?C (3)
and,
p(A|G,C)=eA?C∑w∈Gew?C (4)p(A|G,C)=eA?C∑w∈Gew?C (4)
引入sigmoidsigmoid函数σ(x)=1/(1+e?x)σ(x)=1/(1+e?x),则
p(G|C)=σ(?(H?G)?C)=σ((G?H)?C)p(G|C)=σ(?(H?G)?C)=σ((G?H)?C)
p(G|C)p(G|C)只是简单的计算两部分向量之差,不能再简化了。
另外,根据上述定义,很容易得到这个关系p(G|C)=1?(H|C)p(G|C)=1?(H|C),因为CC要么落在GG要么落在HH。
观看ref4ref4,则知p(A|G,C)p(A|G,C)是另一个版本的p(A,C)p(A,C),只是词汇空间从V→GV→G而已。然后我们继续拆分GG递归的计算下去,最后只需要计算各兄弟部分的向量差而已。这是一个典型的二叉树,划分规则在开始就可确定,如果考虑查询效率的话,就是一个霍夫曼树。其中每个叶子节点表示一个单词,每个中间节点G or HG or H的向量为所有子向量的中心。
展开来就是:
p(A|C)=∏σ((Gi?Hi)?C)p(A|C)=∏σ((Gi?Hi)?C)
那么问题来了,这个词向量是怎么搞出来了?学习词向量哪家强?
现在我们这里有一堆的语料,一行一行分好词的,语料那是相当的多,以至于它涵盖了自然语言中的所有正确句子,每个单词在它所在的位置都是恰到好处。现在每个单词我们有一个对应的词向量,我们怎么来衡量这批词向量的好坏呢。
这批词向量张成一个自然语言的空间(从线性代数来说这样描述可能不太准确),它自己规定的自然语言空间,在这个空间中,它可以导出给定语料在它的空间中出现的概率。熟悉吧,这就是语言模型。
我们可以根据词向量计算出来每个单词在它的位置出现的概率,然后这整个语料在这个向量空间中出现的概率就等于每个词在其位置出现概率的乘积。
即,
p(T)=∏p(wi|Contexti) (5)p(T)=∏p(wi|Contexti) (5)
TT为整个语料样本,ContextiContexti为单词ii的上下文,理论上是扣除该单词后剩下的所有单词包括位置。当然了,我们只考虑它的前后cc个邻居。
我们的目标是使ref5ref5最大化,实际中是加loglog加负之后的最小化。怎么以高效率优化这个目标函数呢,这是一个典型的运筹学问题,而且还是非线性规划。我要翻一下运筹学的教材了。
转载请注明出处51数据库 » 深度学习词向量word2vector