特征提取(Extracting)的3种算法(TF-IDF、Word2Vec以及CountVectorizer)
===========================================================================================================================================================================================================================================================================
词、句表示成计算机可以理解的量。然后计算一些指标进行排序。常用的方法有
(1)Bag of Words.词袋模型将词定义为一个维度,一句话表示成所有张成的空间中的一个高维稀疏向量
(2)TFIDF.可以理解为带权重的词袋模型,计算出每个词语的TFIDF值,作为该词的权重。
(3)LDA/LSI。将整篇文档利用TFIDF模型表示成一个矩阵,做SVD降维分解,生成两个矩阵,一个是文档-话题矩阵,另一个是词-话题矩阵。得到词-话题矩阵之后,可以得到句子-话题矩阵。
(4)Word Embedding .将word表示成一个低维稠密向量,词看成一个向量,句子也可有很多张方法表示成一个向量。
==========================================================================================================================================================================================================================================================================
1,文本向量化方法:
tf-idf , doc2bow , doc2vec , lsi , lda
tf-idf、doc2bow稀疏,适合短文本
doc2vec效果时好时坏,偶然性大,不稳
lsi、lda效果好且较稳,但lda计算量偏大
2, word2vec构建中文词向量
3,一款用于词向量计算的工具-----word2vec(google开源)
该工具得到的训练结果---词向量
4,当我们在说word2vec算法或模型的时候,其实指的是其背后用于计算word vector的CBoW模型和Skip-gram模型。很多人以为word2vec指的是一个算法或模型,这也是一种谬误。
Ngram模型:bigram模型(N=2)和trigram(N=3)
Ngram本质上是将词当做一个个孤立的原子单元(atomic unit)去处理的,没有考虑词与词之间内在的联系性。这种处理方式对应到数学上的形式是一个个离散的one-hot向量(除了一个词典索引的下标对应的方向上是1,其余方向上都是0)。
能否用一个连续的稠密向量去刻画一个word的特征。这个稠密连续向量也被称为word的distributed representation
事实上,这个概念在信息检索(Information Retrieval)领域早就已经被广泛地使用了。只不过,在IR领域里,这个概念被称为向量空间模型(Vector Space Model,以下简称VSM)
VSM是基于一种Statistical Semantics Hypothesis:(统计语言学假说)。这个Hypothesis有很多衍生版本。其中,比较广为人知的两个版本是Bag of Words Hypothesis和Distributional Hypothesis。前者是说,一篇文档的词频(而不是词序)代表了文档的主题;后者是说,上下文环境相似的两个词有着相近的语义。后面我们会看到,word2vec算法也是基于Distributional的假设。
VSM如何将稀疏离散的one-hot词向量映射为稠密连续的distributional representation(分布式表示)的呢
{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
(索引(index),文档(document).,域(field)和项(term))
简单来说,基于Bag of Words Hypothesis,我们可以构造一个term-document矩阵A:矩阵的行Ai,:对应着词典里的一个word;矩阵的列A:,j对应着训练语料里的一篇文档;矩阵里的元素Aij代表着word wi在文档Dj中出现的次数(或频率)。那么,我们就可以提取行向量做为word的语义向量(不过,在实际应用中,我们更多的是用列向量做为文档的主题向量)。
类似地,我们可以基于Distributional Hypothesis构造一个word-context的矩阵。此时,矩阵的列变成了context里的word,矩阵的元素也变成了一个context窗口里word的共现次数。
注意,这两类矩阵的行向量所计算的相似度有着细微的差异:term-document矩阵会给经常出现在同一篇document里的两个word赋予更高的相似度;而word-context矩阵会给那些有着相同context的两个word赋予更高的相似度。后者相对于前者是一种更高阶的相似度,因此在传统的信息检索领域中得到了更加广泛的应用。
不过,这种co-occurrence矩阵仍然存在着数据稀疏性和维度灾难的问题。为此,人们提出了一系列对矩阵进行降维的方法(如LSI/LSA等)。这些方法大都是基于SVD的思想,将原始的稀疏矩阵分解为两个低秩矩阵乘积的形式。
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
鉴于Ngram等模型的不足。2003,Bengio总结了一套用神经网络建立统计语言模型的框架(Neural Network Language Model,以下简称NNLM),并首次提出了word embedding的概念(虽然没有叫这个名字),从而奠定了包括word2vec在内后续研究word representation learning的基础。
{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
NNLM模型的基本思想可以概括如下:
- 假定词表中的每一个word都对应着一个连续的特征向量;
- 假定一个连续平滑的概率模型,输入一段词向量的序列,可以输出这段序列的联合概率;
- 同时学习词向量的权重和概率模型里的参数。
值得注意的一点是,这里的词向量也是要学习的参数。
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
铺垫了这么多,终于要轮到主角出场了。
NNLM存在的问题:
1,一个问题是,同Ngram模型一样,NNLM模型只能处理定长的序列。在03年的论文里,Bengio等人将模型能够一次处理的序列长度N提高到了5,虽然相比bigram和trigram已经是很大的提升,但依然缺少灵活性。
因此,Mikolov等人在2010年提出了一种RNNLM模型[7],用递归神经网络代替原始模型里的前向反馈神经网络,并将embedding层与RNN里的隐藏层合并,从而解决了变长序列的问题。
2,另一个问题就比较严重了。NNLM的训练太慢了。即便是在百万量级的数据集上,即便是借助了40个CPU进行训练,NNLM也需要耗时数周才能给出一个稍微靠谱的解来。显然,对于现在动辄上千万甚至上亿的真实语料库,训练一个NNLM模型几乎是一个impossible mission
这时候,还是那个Mikolov站了出来。他注意到,原始的NNLM模型的训练其实可以拆分成两个步骤:
- 用一个简单模型训练出连续的词向量;
- 基于词向量的表达,训练一个连续的Ngram神经网络模型。
而NNLM模型的计算瓶颈主要是在第二步。
如果我们只是想得到word的连续特征向量,是不是可以对第二步里的神经网络模型进行简化呢?
Mikolov是这么想的,也是这么做的。他在2013年一口气推出了两篇paper,并开源了一款计算词向量的工具——至此,word2vec横空出世,主角闪亮登场。
首先,我们对原始的NNLM模型做如下改造:
- 移除前向反馈神经网络中非线性的hidden layer,直接将中间层的embedding layer与输出层的softmax layer连接;
- 忽略上下文环境的序列信息:输入的所有词向量均汇总到同一个embedding layer;
- 将future words纳入上下文环境
得到的模型称之为CBoW模型(Continuous Bag-of-Words Model),也是word2vec算法的第一个模型:
从数学上看,CBoW模型等价于一个词袋模型的向量乘以一个embedding矩阵,从而得到一个连续的embedding向量。这也是CBoW模型名称的由来。
CBoW模型依然是从context对target word的预测中学习到词向量的表达。反过来,我们能否从target word对context的预测中学习到word vector呢?答案显然是可以的:
这个模型被称为Skip-gram模型(名称源于该模型在训练时会对上下文环境里的word进行采样)
==================================================================================================================================================================================
不懂word2vec,还敢说自己是做NLP?
2018-5-3 13:16| 发布者: 炼数成金_小数| 查看: 42543| 评论: 0|原作者: 李雪冬|来自: 机器学习算法工程师
摘要: 到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个向量就代表了当前的词。每个词都是 ...
如今,深度学习炙手可热,deep learning在图像处理领域已经取得了长足的进展。随着Google发布word2vec,深度学习在自然语言处理领域也掀起了一阵狂潮。由于最近正在做一个相关的NLP项目,所以抽时间总结一下word2vec的相关知识点。
文章结构: 1、词的独热表示 2、词的分布式表示 3、词嵌入 4、两种训练模式 5、两种加速方法 6、word2vec和word embedding的区别 7、小结
1、词的独热表示 到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个向量就代表了当前的词。
“可爱”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...] “面包”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]
每个词都是茫茫 0 海中的一个 1。这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,可爱记为 3,面包记为 8(假设从 0 开始记)。
缺点分析: 1、向量的维度会随着句子的词的数量类型增大而增大; 2、任意两个词之间都是孤立的,无法表示语义层面上词汇之间的相关信息,而这一点是致命的。
2、词的分布式表示 传统的独热表示仅仅将词符号化,不包含任何语义信息。如何将语义融入到词表示中?Harris 在 1954 年提出的“分布假说”为这一设想提供了理论基础:上下文相似的词,其语义也相似。Firth 在 1957年对分布假说进行了进一步阐述和明确:词的语义由其上下文决定。
以(CBOW)为例,如果有一个句子“the cat sits one the mat”,在训练的时候,将“the cat sits one the”作为输入,预测出最后一个词是“mat”。
图1
分布式表示的较大优点在于它具有非常强大的表征能力,比如n维向量每维k个值,可以表征k的n次方个概念。下图的神经网络语言模型(NNLM)采用的就是文本分布式表示。而词向量(word embedding)是训练该语言模型的一个附加产物,即图中的Matrix C。
图2
所以我们可以将我们的任务拆解成两部分: 一、选择一种方式描述上下文; 二、选择一种“模型”刻画某个词(即“目标词”)与其上下文之间的关系。
3、词嵌入 基于神经网络的分布表示一般称为词向量、词嵌入( word embedding)或分布式表示( distributed representation)。核心依然是上下文的表示以及上下文与目标词之间的关系的建模。
上面了解到独热编码的维度过大的缺点。对此进行如下改进:
1、将vector每一个元素由整形改为浮点型,变为整个实数范围的表示; 2、将原来稀疏的巨大维度压缩嵌入到一个更小维度的空间。如图所示:
图3
“词嵌入”也由此得名。
本质:词向量是训练神经网络时候的隐藏层参数或者说矩阵。
图4
4、两种训练模式 CBOW (Continuous Bag-of-Words Model) Skip-gram (Continuous Skip-gram Model)
CBOW:上下文来预测当前词 图5
Skip-gram:当前词预测上下文
图6
5、两种加速方法 Negative Sample Hierarchical Softmax 大家都知道哈夫曼树是带权路径最短的树,一般神经网络语言模型在预测的时候,输出的是预测目标词的概率(每一次预测都要基于全部的数据集进行计算,很大的时间开销)。
Hierarchical Softmax是一种对输出层进行优化的策略,输出层从原始模型的利用softmax计算概率值改为了利用Huffman树计算概率值。一开始我们可以用以词表中的全部词作为叶子节点,词频作为节点的权,构建Huffman树,作为输出。从根节点出发,到达指定叶子节点的路径是的。Hierarchical Softmax正是利用这条路径来计算指定词的概率,而非用softmax来计算。 即Hierarchical Softmax:把 N 分类问题变成 log(N)次二分类
Negative Sampling(简写NEG,负采样),这是Noise-Contrastive Estimation(简写NCE,噪声对比估计)的简化版本:把语料中的一个词串的中心词替换为别的词,构造语料 D 中不存在的词串作为负样本。在这种策略下,优化目标变为了:较大化正样本的概率,同时最小化负样本的概率。这样说大家可能已经糊涂了,我们省去繁琐的数学推倒,这里举一个例子:
假设有一个句子为:“The quick brown fox jumps over the lazy dog.“ 如果我们用skip-gram model ,貌似这是一个很大的网络。 图7
注意:比如像“the”这种常见的词,我们会遇到两个问题: 1. 比如(fox,the)其实没有传递我们关于 fox的信息。‘the‘出现得太多了。 2. 我们有太多 (‘the’,…)的样本,多于我们实际需要的。 所以word2vec采用了降采样的策略。对于每个我们在训练样本中遇到的词,我们有一个概率去删除它。这个概率与单词出现的频率相关。
如果我们采用window size = 10,同时我们删除‘the’: 1. 当我们再去训练剩下的词,我们就不会再遇到‘the’了; 2. 我们减少了10个包含‘the’的样本 这其实就是‘NEG’的核心思想。
6、word2vec和word embedding的区别 简言之,word embedding 是一个将词向量化的概念,中文译名为"词嵌入"。 word2vec是谷歌提出的一种word embedding的具体手段,采用了两种模型(CBOW与skip-gram模型)与两种方法(负采样与层次softmax方法)的组合,比较常见的组合为 skip-gram+负采样方法。
Word embedding的训练方法大致可以分为两类: (1)无监督或弱监督的预训练 优点:不需要大量的人工标记样本就可以得到质量还不错的embedding向量 缺点:准确率有待提高 解决办法:得到预训练的embedding向量后,用少量人工标注的样本再去优化整个模型 典型代表:word2vec和auto-encoder (这里解释一下AutoEncoder,AutoEncoder也可以用于训练词向量,先将one hot映射成一个hidden state,再映射回原来的维度,令输入等于输出,取中间的hidden vector作为词向量,在不损耗原表达能力的前提下压缩向量维度,得到一个压缩的向量表达形式。)
(2)端对端(end to end)的有监督训练。 优点:学习到的embedding向量也往往更加准确 缺点:模型在结构上往往更加复杂 应用:通过一个embedding层和若干个卷积层连接而成的深度神经网络以实现对句子的情感分类,可以学习到语义更丰富的词向量表达。
word2vec不关心后续的应用场景,其学习到的是就是根据共现信息得到的单词的表达,用n-gram信息来监督,在不同的子task间都会有一定效果。而end2end训练的embedding其和具体子task的学习目标紧密相关,直接迁移到另一个子task的能力非常弱。
常用的word embedding分为dense和sparse两种形式: 常见的sparse就比如 co-occurence 或者one-hot的形式;对sparse embedding进行一些降维运算比如SVD、PCA就可以得到dense。
小结 通过阅读这篇文章,大家应该对word2ec有了一个基本的了解,如果想更加深入透彻的了解此工具,可以从数学原理入手并且阅读word2vec的源码,这里附上我参考的带有完整注释的源码地址,感兴趣的可以参考一下。 带完整注释的word2vec源码: https://github.com/peklixuedong/RepresentationLearning
参考资料 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/word2vec/word2vec_basic.py word2vec中的数学原理 - peghoty Distributed Representations of Words and Phrases and their Compositionality, NIPS2013 http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/ |
===========================================================================================================================================================================================================================================================================
1,CNN卷积神经网络
2,LSTM(long short term memory,即我们所称呼的LSTM,是为了解决长期以来问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。)
3,SVM
===========================================================================================================================================================================================================================================================================
自然语言处理(NLP)之Word Embedding
2018年08月03日 17:26:16 l_r_h000 阅读数:4765
最近做完UNIT一个小项目后,结合同时期看KBQA的文章,对NLP/NLU方向产生了比较大的兴趣,想深入学习一下,结合一篇综述Recent Trends in Deep Learning Based Natural Language Processing(参考文献[5]为其阅读笔记)的阐述顺序,把相关的知识补一补,本文即第一部分Word Embedding。
主要参考文献:
[4] 有谁可以解释下word embedding?——知乎
目录
一、Word Embedding概述
简单来说,词嵌入(Word Embedding)或者分布式向量(Distributional Vectors)是将自然语言表示的单词转换为计算机能够理解的向量或矩阵形式的技术。由于要考虑多种因素比如词的语义(同义词近义词)、语料中词之间的关系(上下文)和向量的维度(处理复杂度)等等,我们希望近义词或者表示同类事物的单词之间的距离可以理想地近,只有拿到很理想的单词表示形式,我们才更容易地去做翻译、问答、信息抽取等进一步的工作。
在Word Embedding之前,常用的方法有one-hot、n-gram、co-occurrence matrix,但是他们都有各自的缺点,下面会说明。2003年,Bengio提出了NLM,是为Word Embedding的想法的雏形,而在2013年,Mikolov对其进行了优化,即Word2vec,包含了两种类型,Continuous Bag-of-Words Model 和 skip-gram model。
Word Embedding是基于分布式假设(distributional hypothesis):
总的来说,word embedding就是一个词的低维向量表示(一般用的维度可以是几十到几千)。有了一个词的向量之后,各种基于向量的计算就可以实施,如用向量之间的相似度来度量词之间的语义相关性。其基于的分布式假设就是出现在相同上下文(context)下的词意思应该相近。所有学习word embedding的方法都是在用数学的方法建模词和context之间的关系。
作者:李明磊9527
链接:https://www.zhihu.com/question/32275069/answer/197721342
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
但是Word Embedding也有其局限性, 比如:
- 难以对词组做分布式表达
- 受限于上下文window的尺寸,有些词(例如好或坏)的上下文可能没什么不同甚至完全一样,这对情感分析任务的影响非常大
此外,Word Embedding对于应用场景的依赖很强,所以针对特殊的应用场景可能需要重新训练,这样就会很消耗时间和资源,为此Bengio提出了基于负采样(negative sampling)的模型。
下面本文会将对Word2vec之前的常用方法和Word2vec的两种模型做比较详细的记录和理解。
二、Word2vec之前
2.1 one-hot
one-hot是最简单的一种处理方式。通俗地去讲,把语料中的词汇去重取出,按照一定的顺序(字典序、出现顺序等)排列为词汇表,则每一个单词都可以表示为一个长度为N的向量,N为词汇表长度,即单词总数。该向量中,除了该词所在的分量为1,其余均置为0。
例如,有语料库如下:
John likes to watch movies. Mary likes movies too.
John also likes to watch football games.
假设我们的词汇表排序结果如下:
{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also":6, "football": 7, "games": 8, "Mary": 9, "too": 10}
那么则有如下word的向量表示:
John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
……
用这样的方式可以利用向量相加进一步表示句子和文本了,但是one-hot有很大的局限性:
- 语义的相似性,“woman”、“madam”、“lady”从语义上将可能是相近的,one-hot无法表示
- 英语单词中的复数时态,我们不会在排序是就把同一单词的不同形态区别开来,继而再进行向量表示
- 单词之间的位置关系,很多时候句内之间多个单词(比如术语)会同时出现多次,one-hot无法表示
- 词向量长度很大,一方面2的原因,另一方面本身大规模语料所含的词数很多,处理会很棘手
2.2 n-gram
n-gram可以表示单词间的位置关系所反映的语义关联,在说明n-gram之前,我们从最初的句子概率进行推导。
假设一个句子S为n个单词有序排列,记为:
我们将其简记为 ,则这个句子的概率为:
对于单个概率意思为该单词在前面单词给定的情况下出现的概率,我们利用贝叶斯公式可以得到:
其中最后一项为在语料中出现的频数。但是长句子或者经过去标点处理后的文本可能很长,而且太靠前的词对于词的预测影响不是很大,于是我们利用马尔可夫假设,取该词出现的概率仅依赖于该词前面的n-1个词,这就是n-gram模型的思想。
所以上面的公式变为:
在这里,我们不对n的确定做算法复杂度上的讨论,详细请参考文献[1],一般来说,n取3比较合适。此外对于一些概率为0的情况所出现的稀疏数据,采用平滑化处理,此类算法很多,以后有时间再具体展开学习。
所以n-gram的主要工作在于确定n之后,对语料中的各种吃词串进行频数统计和平滑化处理,对于所需要的句子概率,只要将之前语料中相关概率取出计算就可以了。
当然实际情况是对做最优化处理,参数确定后以后的概率就可以通过函数确定了,这就需要构造函数,后面的NLM就是做这个工作。
n-gram模型会将前文的语义关联纳入考虑,从而形成联合分布概率表达,但是尽管去前n-1个单词,语料大的情况下计算量还是很大,在模拟广义情境时严重受到了“维度灾难(curse of dimensionality)”。
2.3 co-occurrence matrix
共现矩阵也是考虑语料中词之间的关系来表示:
一个非常重要的思想是,我们认为某个词的意思跟它临近的单词是紧密相关的。这是我们可以设定一个窗口(大小一般是5~10),如下窗口大小是2,那么在这个窗口内,与rests 共同出现的单词就有life、he、in、peace。然后我们就利用这种共现关系来生成词向量。
例如,现在我们的语料库包括下面三份文档资料:
I like deep learning.
I like NLP.
I enjoy flying.
作为示例,我们设定的窗口大小为1,也就是只看某个单词周围紧邻着的那个单词。此时,将得到一个对称矩阵——共现矩阵。因为在我们的语料库中,I 和 like做为邻居同时出现在窗口中的次数是2,所以下表中I 和like相交的位置其值就是2。这样我们也实现了将word变成向量的设想,在共现矩阵每一行(或每一列)都是对应单词的一个向量表示。
虽然Cocurrence matrix一定程度上解决了单词间相对位置也应予以重视这个问题。但是它仍然面对维度灾难。也即是说一个word的向量表示长度太长了。这时,很自然地会想到SVD或者PCA等一些常用的降维方法。当然,这也会带来其他的一些问题。
窗口大小的选择跟n-gram中确定n也是一样的,窗口放大则矩阵的维度也会增加,所以本质上还是带有很大的计算量,而且SVD算法运算量也很大,若文本集非常多,则不具有可操作性。
2.4 NLM
神经语言模型(Neural Language Model)是Word Embeddings的基本思想,在很多其他文献中也有神经概率语言模型(Neural Probabilistic Language Model,NPLM)或者神经网络语言模型(Neural Network Language Model,NNLM),都是指一个东西。
NLM的输入是词向量,根据参考文献[1],词向量和模型参数(最终的语言模型)可以通过神经网络训练一同得到。相比于n-gram通过联合概率考虑词之间的位置关系,NLM则是利用词向量进一步表示词语之间的相似性,比如近义词在相似的上下文里可以替代,或者同类事物的词可以在语料中频数不同的情况下获得相近的概率。结合参考文献[1],举一个简单例子:
在一个语料C中,S1=“A dog is sitting in the room.”共出现了10000次,S2="A cat is sitting in the room"出现了1次,按照n-gram的模型,当我们输入“A _____ is sitting in the room”来预测下划线上应该填入的词时,dog的概率会远大于cat,这是针对于语料C得到的概率。但是我们希望相似含义的词在目标向量空间中的距离比不相关词的距离更近,比如v(man)-v(woman)约等于v(gentleman)-v(madam),用这样生成的词向量或者已经训练好的模型在去做翻译、问答等后续工作时,就会很有效果,而NLM利用词向量表示就能达到这样的效果。
注:在参考文献[1]中,作者举的例子是从句子概率角度,我自己的理解稍有不同,将原例放在下面:
NLM的神经网络训练样本同n-gram的取法,取语料中任一词w的前n-1个词作为Context(w),则(Context(w),w)就是一个训练样本了。这里的每一个词都被表示为一个长度为L的词向量,然后将Context(w)的n-1个词向量首位连接拼成(n-1)L的长向量。下面为NLM图解:
【注】此图向量和矩阵的维度与参考文献中相反了
我们得到的输出结果为长度为词汇总数的向量,如果想要第i个分量去表示当上下为context(w)时下一个词为词典中第i个词的概率,还需要softmax归一化,然后我们最初想要的结果便是:
注意:这只是取一个词w后输出的向量y,我们需要的就是通过训练集所有的词都做一遍这个过程来优化得到理想的W,q和U,b。
那么样本中最初的词向量如何获得呢?在参考文献[1]中有这样两段话:
目前我还没有彻底搞懂神经网络中具体的机制,所以暂时标记一下,初步推测是初始化一个矩阵或者可以粗暴地用one-hot(不过这样输入层的L=D,计算量大了很多),然后随着训练的过程,词向量也是不断更新的,详细还要参考最优化理论。
下面要说的Word2vec便是在NLM基础上的优化。
三、Word2vec
目前学习了解到的Word2vec有基于Hierarchical Softmax和基于Negative Sampling两种方式,参考文献[1]是从两种方式分别讲解了CBOW和Skip-gram的数学构建思路和过程,由于这两个模型是相反的过程,即CBOW是在给定上下文基础上预测中心词,Skip-gram在有中心词后预测上下文,我个人是把两个模型按照两种不同的计算方法做了梳理,当然数学推导还是一样的,只不过我自己看起来更舒服。在此再次感谢@peghoty大牛的详解。
3.1 CBOW
基于前面的介绍,CBOW的思想是取目标词w的上下文(前后相邻词)而不是仅之前的词作为预测前提,类似于共现矩阵的窗口,不同于NLM的是,Context(w)的向量不再是前后连接,而是求和,我们记为,此外还将NLM的隐藏层去掉了。当然最大的区别还是在输出层,基于Hierarchical Softmax的CBOW输出层为一颗霍夫曼树,叶子节点为语料中的词汇,构建依据便是各词的出现频数;基于Negative Sampling则是用随机负采样代替霍夫曼树的构建。
3.1.1 基于Hierarchical Softmax
霍夫曼树的构建在这里就不展开说了,比较简单的算法。沿用文献[1]的表示,基于Hierarchical Softmax的CBOW所要构建的霍夫曼树所需参数如下:
:从根结点到w对应结点的路径
:路径上包含结点个数
:到w路径上的的结点
:结点编码,根结点不编码
:非叶子结点(包括根结点)对应的向量
霍夫曼树构建按照频数大小有左右两种,其实都是自己约定的,在这里就不麻烦了,构建后左结点编码为0,为正类,右结点为1,为负类。
根据逻辑回归,一个结点被分为正类的概率为
的一些性质,后面用的到:
所以之前我们要构造的目标函数就可以写为以下形式:
这个公式跟之前看的概率图模型有点像,不过现在有点记不清了,后面我再梳理一下,看看能不能串起来。其中
整体表达式
这是一个单词,我们把对连乘做对数似然函数,然后将语料中所有单词都求和,则目标函数如下:
明确参数有和
,我们取其中子式来做关于两个参数的梯度:
因为和
是对称的,所以
的为:
所以两者就可以更新了:
至此,我们完成了对参数的优化。
参考文献[1]提出了这样一个问题:
我的理解是可以的,可能我对最优化方法的学习还不够全面,从公式拆解上好像更能说的过去,但是对于收敛速度的影响可能会很大,取平均可能优化得到较好的结果较慢。
3.1.2 基于Negative Sampling
对于大规模语料,构建霍夫曼树的工作量是巨大的,而且叶子节点为N的霍夫曼数需要新添(N-1)个结点,而随着树的深度增加,参数计算的量也会增加很多很多,得到的词向量也会不够好,为此,Mikolov作出了优化,将构建霍夫曼树改为随机负采样方法。
对于给定的上下文Context(w)去预测w,如果从语料中就是存在(Context(w),w),那么w就是正样本,其他词就是负样本。
我们设负样本集为,词的标签:
即正样本标签为1,负样本标签为0,等同于霍夫曼结点的左右编码,只不过与其取值相反,这样后面的公式也就很好理解了:
同样,我们对两个参数求导:
然后更新参数,公式形式是一样的,不再写了。
可见,对于单词w,基于Hierarchical Softmax将其频数用来构建霍夫曼树,正负样本标签取自结点左右编码;而基于Negative Sampling将其频数作为随机采样线段的子长度,正负样本标签取自从语料中随机取出的词是否为目标词,构造复杂度小于前者。
3.2 Skip-gram
由于Skip-gram是CBOW的相反操作,输入输出稍有不同,在这里仅贴出关键公式,不再具体说明。
3.2.1 基于Hierarchical Softmax
以上均来自参考文献[1],变量表示稍有不同。
3.2.2 基于Negative Sampling
这个作者分析较多,还没有完全看懂,后面再补