1.word2vec两个模型的损失函数是什么?


知识点:统计语言模型(贝叶斯概率) ->  n-gram(n-1阶马尔科夫假设)  -> 词频统计(大数定律)

                 -> 神经概率语言模型

python ssim损失函数 skipgram 损失函数_词向量

python ssim损失函数 skipgram 损失函数_中心词_02

 

 

答:word2vec两个模型为CBOW和Skip-gram,cbow和Skip-gram又分为层序softmax训练和负采样训练,故损失函数可以分情况讨论。

CBOW:

(1)标配版的损失函数:

python ssim损失函数 skipgram 损失函数_python ssim损失函数_03

 

 

python ssim损失函数 skipgram 损失函数_python ssim损失函数_04

 

 

python ssim损失函数 skipgram 损失函数_中心词_05

 

 

python ssim损失函数 skipgram 损失函数_词频_06

(2)层序softmax的损失函数:

python ssim损失函数 skipgram 损失函数_python ssim损失函数_07

 

(3)有负采样的CBOW

python ssim损失函数 skipgram 损失函数_python ssim损失函数_08

Skip-gram:

(1)标配版本的Skip-gram

python ssim损失函数 skipgram 损失函数_python ssim损失函数_09

 

 

python ssim损失函数 skipgram 损失函数_词频_10

 

 

(2)有softmax的skip-gram:

python ssim损失函数 skipgram 损失函数_python ssim损失函数_11

 

 

python ssim损失函数 skipgram 损失函数_词向量_12

 

 

python ssim损失函数 skipgram 损失函数_中心词_13

 

 (3)有负采样的skip-gram

python ssim损失函数 skipgram 损失函数_中心词_14

 

 

python ssim损失函数 skipgram 损失函数_中心词_15

(2)负采样的过程?

1.词频重新计算(3/4) p(w)

2.等距离划分(M>>N),非等距离划分(l = p(w))

3.从M个点中随机挑选点映射到非等距离划分中

 

(3)cbow和skipgram的比较,为什么skipgram会更好,哪个的计算复杂度高?(腾讯)

答:CBOW模型中input是context(周围词)而output是中心词,训练过程中其实是在从output的loss学习周围词的信息也就是embedding,但是在中间层是average的,一共预测V(vocab size)次就够了。

skipgram是用中心词预测周围词,预测的时候是一对word pair,等于对每一个中心词都有K个词作为output,对于一个词的预测有K次,所以能够更有效的从context中学习信息,但是总共预测K*V词。

 

对于复杂度:

NNLM:       N*D + N*D*H +H*V

CBOW:      N*D+D*log2V

SKIP-gram:     C*(D+D*log2v)

 

SKIP-gram > CBOW

 

解释:

在cbow方法中,是用周围词预测中心词,从而利用中心词的预测结果情况,使用GradientDesent方法,不断的去调整周围词的向量。当训练完成之后,每个词都会作为中心词,把周围词的词向量进行了调整,这样也就获得了整个文本里面所有词的词向量。

要注意的是, cbow的对周围词的调整是统一的:求出的gradient的值会同样的作用到每个周围词的词向量当中去。

可以看到,cbow预测行为的次数跟整个文本的词数几乎是相等的(每次预测行为才会进行一次backpropgation, 而往往这也是最耗时的部分),复杂度大概是O(V);

而skip-gram是用中心词来预测周围的词。在skip-gram中,会利用周围的词的预测结果情况,使用GradientDecent来不断的调整中心词的词向量,最终所有的文本遍历完毕之后,也就得到了文本所有词的词向量。

可以看出,skip-gram进行预测的次数是要多于cbow的:因为每个词在作为中心词时,都要使用周围词进行预测一次。这样相当于比cbow的方法多进行了K次(假设K为窗口大小),因此时间的复杂度为O(KV),训练时间要比cbow要长。

但是在skip-gram当中,每个词都要受到周围的词的影响,每个词在作为中心词的时候,都要进行K次的预测、调整。因此, 当数据量较少,或者词为生僻词出现次数较少时, 这种多次的调整会使得词向量相对的更加准确。因为尽管cbow从另外一个角度来说,某个词也是会受到多次周围词的影响(多次将其包含在内的窗口移动),进行词向量的跳帧,但是他的调整是跟周围的词一起调整的,grad的值会平均分到该词上, 相当于该生僻词没有收到专门的训练,它只是沾了周围词的光而已。

因此,从更通俗的角度来说:

在skip-gram里面,每个词在作为中心词的时候,实际上是 1个学生 VS K个老师,K个老师(周围词)都会对学生(中心词)进行“专业”的训练,这样学生(中心词)的“能力”(向量结果)相对就会扎实(准确)一些,但是这样肯定会使用更长的时间;

cbow是 1个老师 VS K个学生,K个学生(周围词)都会从老师(中心词)那里学习知识,但是老师(中心词)是一视同仁的,教给大家的一样的知识。至于你学到了多少,还要看下一轮(假如还在窗口内),或者以后的某一轮,你还有机会加入老师的课堂当中(再次出现作为周围词),跟着大家一起学习,然后进步一点。因此相对skip-gram,你的业务能力肯定没有人家强,但是对于整个训练营(训练过程)来说,这样肯定效率高,速度更快。

 

(4) word2vec训练过程的最后一步有什么办法可以优化softmax的计算?

答:1.指数函数的计算会用查表来近似代替

  解释:计算softmax的时候需要求e的x次方,一轮迭代中指数运算至少需要上亿级别的指数运算,由于sigmod函数是个长“S”型的函数,可以通过对中间部分的x查表来取代多次指数运算。

  2.层序softmax

  3.负采样

 

(5) 为什么要归一化?

答:在每次迭代中把要预测的词相关权重增加,通过归一化,同时把其他的词相关权重减少。这个不难理解,总的预测概率和是1,把其中某一个词的概率增加就意味着把其他词的预测概率打压。

能不能只增加其中某个词的概率呢?可以,但是收敛很慢。

 

(6).Hierarchical Softmax 是如何提速的?

 答:Hierarchical Softmax 相对于原来的softmax是把一个多分类问题转换成了多个二分类问题。

  (1)根据词频采用了哈夫曼编码把每个单词在树中路径的长度减少到极致,因为整棵树的叶子节点和是归一化的,所以等价于原来的softmax。而且,最终的更新只需要更新一部分的权重即可。

  (2)n个叶子节点相当于词表中的n个词,n-1个非叶子节点相当于做二分类判断的参数向量

  (3)Huffman编码为0的预测为正类,编码为1的预测为负类

最后的softmax层由原来的O(N)次运算下降到了O(logN)级别

 

(7)负采样?(不做归一化可是又想降低其他单词的预测概率,该怎么做呢?)

答:本质是利用已知的概率密度函数来估计未知的概率密度函数。

  作者对其他的单词进行负采样以降低其他单词的相关权重,作者认为负采样中单词作为负样本的概率应该和其词频正相关,所以词频越高的越大概率被抽到。

  这种方案我认为只是一种近似方案,和Hierarchical Softmax 这种等价于原来的softmax是有明显区别的。不过这种方案在低频词上的学习会好一些,主要原因在于负采样更容易抽到其中的高频词(频率3/4次方)。

 

(8)训练数据的窗口选取策略?

从cbow的网络结构可以看出,模型输入的单词数量是不定长的,那在构造训练样本的时候应该如何选取预测单词附近的多少个单词作为输入呢?

Mikolov认为离预测单词近的词语比那些远的单词更相关,所以采用了随机窗口大小的方式来选取,每次在区间[1, window]随机一个数值K,然后在预测单词的前后各选取k个单词作为输入。

window是可选参数大小,window增大可以使向量学习更充分,但同时也增加了训练的复杂度。

 

(9)高频词降采样?

python ssim损失函数 skipgram 损失函数_词频_16

 

对于语料中的高频词,Mikolov选择对它们进行降采样(sub-samplig),高频词在语料中的出现次数比较多,而且高频词一般而言都不是决定附近词语的词,比如“的”这种停用词。所以对高频词进行降采样既不影响模型效果,又能提升收敛速度。

 

(10) 训练word2vec学习率调整策略?

答:学习率过大导致模型不收敛,学习率过小则会陷入局部最优,Mikolov在实现过程中采取了学习率随着实际训练的语料增加而减少。

 

(11) word2vec实施过程?

答:词向量其实是将词映射到一个语义空间,得到的向量。而word2vec是借用神经网络的方式实现的,考虑文本的上下文关系,有两种模型CBOW和Skip-gram,这两种模型在训练的过程中类似。Skip-gram模型是用一个词语作为输入,来预测它周围的上下文,CBOW模型是拿一个词语的上下文作为输入,来预测这个词语本身。

 

词向量训练的预处理步骤:

1.对输入的文本生成一个词汇表,每个词统计词频,按照词频从高到低排序,取最频繁的V个词,构成一个词汇表。每个词存在一个one-hot向量,向量的维度是V,如果该词在词汇表中出现过,则向量中词汇表中对应的位置为1,其他位置全为0。如果词汇表中不出现,则向量为全0

2.将输入文本的每个词都生成一个one-hot向量,此处注意保留每个词的原始位置,因为是上下文相关的

3.确定词向量的维数N

 

Skip-gram处理步骤:

1.确定窗口大小window,对每个词生成2*window个训练样本,(i, i-window),(i, i-window+1),...,(i, i+window-1),(i, i+window)

2.确定batch_size,注意batch_size的大小必须是2*window的整数倍,这确保每个batch包含了一个词汇对应的所有样本

3.训练算法有两种:层次Softmax和Negative Sampling

4.神经网络迭代训练一定次数,得到输入层到隐藏层的参数矩阵,矩阵中每一行的转置即是对应词的词向量

python ssim损失函数 skipgram 损失函数_词频_17

python ssim损失函数 skipgram 损失函数_python ssim损失函数_18

 

CBOW的处理步骤:

 

1.确定窗口大小window,对每个词生成2*window个训练样本,(i-window, i),(i-window+1, i),...,(i+window-1, i),(i+window, i)

 

2.确定batch_size,注意batch_size的大小必须是2*window的整数倍,这确保每个batch包含了一个词汇对应的所有样本

 

3.训练算法有两种:层次Softmax和Negative Sampling

 

4.神经网络迭代训练一定次数,得到输入层到隐藏层的参数矩阵,矩阵中每一行的转置即是对应词的词向量

python ssim损失函数 skipgram 损失函数_词频_19

 

 

 

(12)FastText和Glovec原理

FastText是将句子中的每个词通过一个lookup层映射成词向量,对词向量叠加取平均作为句子的向量,然后直接用线性分类器进行分类,FastText中没有非线性的隐藏层,结构相对简单而且模型训练的更快。

Glove融合了矩阵分解和全局统计信息的优势,统计语料库的词-词之间的共现矩阵,加快模型的训练速度而且又可以控制词的相对权重。

 

(13)Word2vec 和 NNLM 对比有什么区别?(Word2vecvs NNLM)?

 

1)其本质都可以看作是语言模型;

 

2)词向量只不过 NNLM 一个产物,Word2vec 虽然其本质也是语言模型,但是其专注于词向量本身,因此做了许多优化来提高计算效率:

 

  • 与 NNLM 相比,词向量直接 sum,不再拼接,并舍弃隐层;
  • 考虑到 sofmax 归一化需要遍历整个词汇表,采用 hierarchical softmax 和 negative sampling 进行优化,hierarchical softmax 实质上生成一颗带权路径最小的哈夫曼树,让高频词搜索路劲变小;negative sampling 更为直接,实质上对每一个样本中每一个词都进行负例采样;

 

 

(14)Word2vec 和 FastText 对比有什么区别?(Word2vec vs FastText)

 

1)都可以无监督学习词向量, FastText 训练词向量时会考虑 subword;

 

2) FastText 还可以进行有监督学习进行文本分类,其主要特点:

 

  • 结构与 CBOW 类似,但学习目标是人工标注的分类结果;
  • 采用 hierarchical softmax 对输出的分类标签建立哈夫曼树,样本中标签多的类别被分配短的搜寻路径;
  • 引入 N-gram,考虑词序特征;
  • 引入 subword 来处理长词,处理未登陆词问题;

 

(15)word2vec训练细节

1.清洗分词,数据预处理,去掉低频词

2.高频词亚采样(计算被删除概率)

3.获得input word的上下文单词列表

4.构建网络:输入,隐藏层(tf.nn.embedding_lookup),负采样(tf.nn.sampled_softmax_loss),验证

 代码参照(skip-gram加负采样):https:///scu-yuanbo/race-of-baidu-nlp

 

(16)Word2vec 的两种优化方法是什么?它们的目标函数怎样确定的?训练过程又是怎样的?

(1)基于 hierarchical softmax 的 CBOW 和 Skip-gram

 

python ssim损失函数 skipgram 损失函数_词向量_20

 

 

 (2)基于 negative sampling 的 CBOW 和 Skip-gram

 

python ssim损失函数 skipgram 损失函数_python ssim损失函数_21