word2vec

本文介绍

  1. word2vec的概念
  2. 语言模型训练的两种模型 CBOW + skip gram
  3. word2vec 优化的四种方法:层次softmax、高频词组当做单个词来处理、对高频单词采样、负例采样
  4. gensim word2vec默认用的模型和方法

机器学习的输入都是数字,而NLP都是文字; 为了让机器学习应用在NLP上,需要把文字转换为数字,把文字嵌入到数学空间。

注意:CBOW,skip-gram 是前人提出的神经网络语言模型,是理论逻辑概念上的东东,而word2vec是实现CBOW和Skip-gram语言模型的工具,或者说CBOW 和 Skip-gram 是 Word2Vec 框架内用于训练词嵌入的具体模型策略。

1. wordvec的概念:

        Word2Vec是从大量文本语料中以无监督的方式学习语义知识的一种模型,它用词向量的方式表征词的语义信息,即通过一个嵌入空间使得语义上相似的单词在该空间内距离很近。Embedding其实就是一个映射,将单词从原先所属的空间映射到新的多维空间中,也就是把原先词所在空间嵌入到一个新的空间中去。

        我们从直观角度上来理解一下,cat这个单词和kitten属于语义上很相近的词,而dog和kitten则不是那么相近,iphone这个单词和kitten的语义就差的更远了。通过对词汇表中单词进行这种数值表示方式的学习(也就是将单词转换为词向量),能够让我们基于这样的数值进行向量化的操作从而得到一些有趣的结论。比如说,如果我们对词向量kitten、cat以及dog执行这样的操作:kitten - cat + dog,那么最终得到的嵌入向量(embedded vector)将与puppy这个词向量十分相近。

2. NNLM 神经网络语言模型

用神经网络训练语言模型,常见有两种; 用上下文预测当前词(CBOW:continuous bag of words的缩写,中文译为“连续词袋模型”), 用当前词预测上下文(skip-gram),结构一般是简单三层网络,一个输入层、一个隐含层、一个输出层。                                        

嵌入层:假设词表中共有4万个词汇,现在知道第t个词前面的n-1个词,预估第t个词:首先将n-1 依据词表进行onehot编码得到n-1个 1∗4万的稀疏向量(只有一个位置为1,其余为0), 所有onehot分别乘以共享的输入权重矩阵 W (4万*K)得到n-1个词向量,这n-1个词向量经过求和/取均值等操作得到一个1*K维的向量,

全连接层:这个向量再乘以一个K*4万的输出权重矩阵W',得到一个1*4万的向量,

输出层:然后再经过softmax 计算出第t个位置是此表中每一个词的概率,选出最大可能的结果与label 比较计算损失函数,采用梯度下降算法更新W和W',训练完毕后得到连个上述两个矩阵,其中输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table。通俗理解word2vec - 简书

2.1 CBOW 连续词袋模型

  • 变量:词表大小V, 要嵌入到N维空间中,C/2是窗口大小,即上下文取几个term(不算当前term); N一般取50~300
  • 步骤:参考自 word2vec是如何得到词向量的? - 知乎
    • input layer:窗口内的C个词的onehot表示
    • input layer -> hidden layer:(将1*V维向量降到1*N维向量) 通过权重矩阵𝑊_𝑉×𝑁 ,将𝐶×𝑉映射为 𝑁×𝐶
    • hidden layer + 激活函数:C个词的词向量做sum得到一个词向量 , word2vec中激活函数,;
    • hidden layer -> output layer:1个N维词还原到高维V维中;通过权重矩阵𝑊 '_𝑁×𝑉 ',将 𝑁×1映射为 𝑉×1
    • output layer + softmax 激活函数,将值归一化到0~1之间 y
    • 用BP+梯度下降优化lost function y和真实y之间的距离,迭代优化参数 𝑊、𝑊 ′。
    • 收敛result:y是V维向量,每个元素取值0~1, 将最大元素值,还原为onehot编码,就是最终结果了。

所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W'。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵也叫做look up table(其实聪明的你已经看出来了,其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。

举个栗子:

窗口大小是2,表示选取coffe前面两个单词和后面两个单词,作为input词。


假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的look up table应该为矩阵W。即,任何一个单词的one-hot表示乘以这个矩阵都将得到自己的word embedding。

2.2 skip-gram 语言模型

假如我们有一个句子“The dog barked at the mailman”。

  1. 首先我们选句子中间的一个词作为我们的输入词,例如我们选取“dog”作为input word;

  2. 有了input word以后,我们再定义一个叫做skip_window的参数,它代表着我们从当前input word的一侧(左边或右边)选取词的数量。如果我们设置skip_window=2,那么我们最终获得窗口中的词(包括input word在内)就是['The', 'dog','barked', 'at']。skip_window=2代表着选取左input word左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小span=2x2=4。另一个参数叫num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 ('dog', 'barked'),('dog', 'the')。

  3. 神经网络基于这些训练数据将会输出一个概率分布,这个概率代表着我们的词典中的每个词作为input word的output word的可能性。这句话有点绕,我们来看个例子。第二步中我们在设置skip_window和num_skips=2的情况下获得了两组训练数据。假如我们先拿一组数据 ('dog', 'barked') 来训练神经网络,那么模型通过学习这个训练样本,会告诉我们词汇表中每个单词当'dog'作为input word时,其作为output word的可能性。

也就是说模型的输出概率代表着到我们词典中每个词有多大可能性跟input word同时出现。例如:如果我们向神经网络模型中输入一个单词“Soviet“,那么最终模型的输出概率中,像“Union”, ”Russia“这种相关词的概率将远高于像”watermelon“,”kangaroo“非相关词的概率。因为”Union“,”Russia“在文本中更大可能在”Soviet“的窗口中出现。

我们将通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。下面的图中给出了一些我们训练样本的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(window_size=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。

我们的模型将会从每对单词出现的次数中习得统计结果。例如,我们的神经网络可能会得到更多类似(“Soviet“,”Union“)这样的训练样本对,而对于(”Soviet“,”Sasquatch“)这样的组合却看到的很少。因此,当我们的模型完成训练后,给定一个单词”Soviet“作为输入,输出的结果中”Union“或者”Russia“要比”Sasquatch“被赋予更高的概率。

PS:input word和output word都会被我们进行one-hot编码。仔细想一下,我们的输入被one-hot编码以后大多数维度上都是0(实际上仅有一个位置为1),所以这个向量相当稀疏,那么会造成什么结果呢。如果我们将一个1 x 10000的向量和10000 x 300的矩阵相乘,它会消耗相当大的计算资源,为了高效计算,它仅仅会选择矩阵中对应的向量中维度值为1的索引行:

再次提醒,最终我们需要的是训练出来的权重矩阵。

3. word2vec的优化方法

在NNLM计算中,(1)输入-隐层输入权重矩阵和隐层-输出层的输出权重矩阵 权重参数太多,计算量太大 ,(2)softmax计算量大

word2vec结合了CBOW, skip-gram的方法 训练得到参数W, 但在计算中做了很多优化;

(1)输入-隐层权重矩阵和隐层-输出层的权重矩阵 权重参数太多,计算量太大。 优化方法

  • 将常见的单词组合(word pairs)或者词组作为单个“words”来处理,减少训练样本(反而增加了权重参数)
  • 对高频次单词进行抽样来减少训练样本的个数,如(fox,the),(dog,the).....

(2)softmax计算量大的优化方法

  • hierarchical softmax (层次softmax) 计算复杂度由kN --> kln(N)
  • negative sampling:对负样本进行采样,这样训练一个样本只会更新一小部分的模型权重,从而降低计算负担

3.1.hierarchical softmax (层次softmax)

1. Huffman编码

Huffman编码是一种用于无损数据压缩的熵编码(权编码)算法。由大卫·霍夫曼在1952年发明。该方法通过一种变长编码表来对符号进行编码,而变长编码表是通过评估符号出现概率的方法得到,目标是出现概率高的符号使用较短的编码,出现概率低的符号则使用较长的编码。这种方式能有效降低编码之后的字符串的平均长度。

在谈论数据结构的时候,Huffman编码又称为最优二叉树,表示一种带权路径长度最短的二叉树。带权路径长度,指的就是叶子结点的权值乘以该结点到根结点的路径长度。

因此最短长度问题被转化为构建一个由字符(每个字符都是叶子结点)的出现频率作为权值所产生的Huffman树的问题。

详细解释参见维基百科。Huffman树的结构类似下图:

Fig1:一段文字中每个英文字母出现的频率

(一)创建一个霍夫曼树

⒈将每个英文字母依照出现频率由小排到大,最小在左,如Fig.1

⒉每个字母都代表一个终端节点(叶节点),比较F.O.R.G.E.T六个字母中每个字母的出现频率,将最小的两个字母频率相加合成一个新的节点。如Fig.2所示,发现FO的频率最小,故相加2+3=5。

⒊比较5.R.G.E.T,发现RG的频率最小,故相加4+4=8。

⒋比较5.8.E.T,发现5E的频率最小,故相加5+5=10。

⒌比较8.10.T,发现8T的频率最小,故相加8+7=15。

⒍最后剩10.15,没有可以比较的对象,相加10+15=25。

最后产生的树状图就是霍夫曼树,参考Fig.2
(二)进行霍夫曼编码

1.给霍夫曼树的所有左链接'0'与右链接'1'。

2.从树根至树叶依序记录所有字母的编码,如Fig.3

2. 层次化Softmax 

softmax需要对每个词语都计算输出概率,并进行归一化,计算量很大,可以通过层次化softmax 降低计算量;进行softmax的目的是多分类,那么是否可以转成多个二分类问题呢, 如SVM思想? 从而引入了层次话softmax。层次softmax的核心内容是哈夫曼树(Huffman Tree) , 树的核心概念是 出现概率越高的符号使用较短的编码(层次越浅),出现概率低的符号则使用较长的编码(层次越深)。

(1) 层次化Softmax为什么有效? ①将N分类变成了log(N)个2分类,降低计算量,②逻辑回归的二分类中 sigmoid导数有很好的导数性质。

  • 1)用huffman编码做词表示(高频词汇靠近根节点,用较短的编码;低频词汇原理根节点,用较长编码;更容易找到目标词汇)
  • 2)把N分类变成了log(N)个2分类。 如要预测的term(足球)的编码长度为4,则可以把预测为'足球',转换为4次二分类问题,在每个二分类上用二元逻辑回归的方法(sigmoid);
  • 3)逻辑回归的二分类中,sigmoid函数导数有很好的性质,σ′(x)=σ(x)(1−σ(x))
  • 4)采用随机梯度上升求解二分类,每计算一个样本更新一次误差函数

(二) 层次化softmax 计算过程  Ref:http://qiancy.com/2016/08/17/word2vec-hierarchical-softmax/

h是隐藏层的输出向量,也就是如果采用层次化softmax 就没有之前的隐藏层到输出层了,直接替换为 隐藏层+层次化softmax

采用层次化Softmax的word2vec 的网络结构为:输入层 --> 隐藏层 --> 层次化softmax。

  • 首先上下文单词的one-hot编码 与输入权重矩阵相乘,得到多个K维向量
  • 然后隐藏层通过求和/取平均等得到一个K维向量,在经过激活函数
  • 然后该K维向量分别与上图的非叶子节点对应的K维向量相乘得到一个相似系数,
  • 将从根节点到叶子节点路径上的相似系数相乘就是 该叶子节点对应的单词为目标词汇的概率
  • 然后计算预测值和真实值lable 的损失,通过随机梯度上升的方法,反向传播更新隐藏层向量,从而得到目标单词的向量表示。
  • 非叶子节点的K维向量有点类似 普通word2vec 的输出权重矩阵。

层次化Softmax 为什么用霍夫曼树而不是二叉树呐?

答:①路径长度:霍夫曼树是一种经过优化的二叉树,其构建过程基于单词的频率或概率,霍夫曼树能够更好地表示单词的频率分布,高频词靠近根节点、低频词原理根节点。②计算效率:计算概率分布时可以通过更少的计算来处理频率较高的单词。

3.4 negative sampling

遇到的问题:

训练一个神经网络意味着要输入训练样本并且不断调整神经元的权重,从而不断提高对目标的准确预测。每当神经网络经过一个训练样本的训练,它的权重就会进行一次调整。所以,词典的大小决定了我们的Skip-Gram神经网络将会拥有大规模的权重矩阵,所有的这些权重需要通过数以亿计的训练样本来进行调整,这是非常消耗计算资源的,并且实际中训练起来会非常慢。

负采样(negative sampling)解决了这个问题,它是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。

negative sampling 定义?

Negative Sampling是对于给定的词,并生成其负采样词集合的一种策略,已知有一个词,这个词可以看做一个正例,而它的上下文词集可以看做是负例,但是负例的样本太多,而在语料库中,各个词出现的频率是不一样的,所以在采样时可以要求高频词选中的概率较大,低频词选中的概率较小,这样就转化为一个带权采样问题,大幅度提高了模型的性能。

当我们用训练样本 ( input word: "fox",output word: "quick") 来训练我们的神经网络时,“ fox”和“quick”都是经过one-hot编码的。如果我们的词典大小为10000时,在输出层,我们期望对应“quick”单词的那个神经元结点输出1,其余9999个都应该输出0。在这里,这9999个我们期望输出为0的神经元结点所对应的单词我们称为“negative” word。

当使用负采样时,我们将随机选择一小部分的negative words(比如选5个negative words)来更新对应的权重。我们也会对我们的“positive” word进行权重更新(在我们上面的例子中,这个单词指的是”quick“)。

在论文中,作者指出指出对于小规模数据集,选择5-20个negative words会比较好,对于大规模数据集可以仅选择2-5个negative words。回忆一下我们的隐层-输出层拥有300 x 10000的权重矩阵。如果使用了负采样的方法我们仅仅去更新我们的positive word-“quick”的和我们选择的其他5个negative words的结点对应的权重,共计6个输出神经元,相当于每次只更新 300 x 6 = 1800 个权重。对于3百万的权重来说,相当于只计算了0.06%的权重,这样计算效率就大幅度提高。

1*V的onehot向量--> 1*K 维词向量--->1*V 的向量,不采用negatice sampling时需要计算词表中所有词归一化的概率,然后与标签比较计算loss,根据loss 对所有模型参数进行更新;如果采用negatice sampling 只会计算被采样到的词的概率,然后结合标签值计算出loss,通过梯度下降仅对被采样到的词对应的权重参数进行更新。


 

如何选择negative words?

我们使用“一元模型分布(unigram distribution)”来选择“negative words”。个单词被选作negative sample的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words。

每个单词被选为“negative words”的概率计算公式:

其中 f(ωi)代表着单词出现的频次,而公式中开3/4的根号完全是基于经验的。

在代码负采样的代码实现中,unigram table有一个包含了一亿个元素的数组,这个数组是由词汇表中每个单词的索引号填充的,并且这个数组中有重复,也就是说有些单词会出现多次。那么每个单词的索引在这个数组中出现的次数该如何决定呢,有公式,也就是说计算出的负采样概率*1亿=单词在表中出现的次数。

有了这张表以后,每次去我们进行负采样时,只需要在0-1亿范围内生成一个随机数,然后选择表中索引号为这个随机数的那个单词作为我们的negative word即可。一个单词的负采样概率越大,那么它在这个表中出现的次数就越多,它被选中的概率就越大。

3.2 Word pairs and "phases"

一些单词组合(或者词组)的含义和拆开以后具有完全不同的意义。比如“Boston Globe”是一种报刊的名字,而单独的“Boston”和“Globe”这样单个的单词却表达不出这样的含义。因此,在文章中只要出现“Boston Globe”,我们就应该把它作为一个单独的词来生成其词向量,而不是将其拆开。同样的例子还有“New York”,“United Stated”等。

在Google发布的模型中,它本身的训练样本中有来自Google News数据集中的1000亿的单词,但是除了单个单词以外,单词组合(或词组)又有3百万之多。

3.3 对高频词进行下采样

在上一部分中,对于原始文本为“The quick brown fox jumps over the laze dog”,如果使用大小为2的窗口,那么我们可以得到图中展示的那些训练样本。

但是对于“the”这种常用高频单词,这样的处理方式会存在下面两个问题:

  1. 当我们得到成对的单词训练样本时,("fox", "the") 这样的训练样本并不会给我们提供关于“fox”更多的语义信息,因为“the”在每个单词的上下文中几乎都会出现

  2. 由于在文本中“the”这样的常用词出现概率很大,因此我们将会有大量的(”the“,...)这样的训练样本,而这些样本数量远远超过了我们学习“the”这个词向量所需的训练样本数

Word2Vec通过“抽样”模式来解决这种高频词问题。它的基本思想如下:对于我们在训练原始文本中遇到的每一个单词,它们都有一定概率被我们从文本中删掉,而这个被删除的概率与单词的频率有关。

ωi 是一个单词,Z(ωi) 是 ωi 这个单词在所有语料中出现的频次,例如:如果单词“peanut”在10亿规模大小的语料中出现了1000次,那么 Z(peanut) = 1000/1000000000 = 1e - 6。

P(ωi) 代表着保留某个单词的概率:

4. gensim word2vec默认参数(CBOW+负采样)

使用Gensim训练Word2vec十分方便,训练步骤如下:

1.将语料库预处理:一行一个文档或句子,将文档或句子分词(以空格分割,英文可以不用分词,英文单词之间已经由空格分割,中文预料需要使用分词工具进行分词,常见的分词工具有StandNLP、ICTCLAS、Ansj、FudanNLP、HanLP、结巴分词等);

2.将原始的训练语料转化成一个sentence的迭代器,每一次迭代返回的sentence是一个word(utf8格式)的列表。可以使用Gensim中word2vec.py中的LineSentence()方法实现;

3.将上面处理的结果输入Gensim内建的word2vec对象进行训练即可:

默认用了CBOW模型,采用高频词抽样+负采样进行优化;

from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
import multiprocessing
 
model = Word2Vec(LineSentence(inp), size=100, window=10, min_count=3,
            workers=multiprocessing.cpu_count(), sg=1, iter=10, negative=20)


# 具体的训练参数解释如下:

 
class Word2Vec(utils.SaveLoad):
    def __init__(
            self, sentences=None, size=100, alpha=0.025, window=5, min_count=5,
            max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,
            sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
            trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH):


· sentences:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或lineSentence构建。
· size:是指特征向量的维度,默认为100。

· alpha: 是初始的学习速率,在训练过程中会线性地递减到min_alpha。

· window:窗口大小,表示当前词与预测词在一个句子中的最大距离是多少。

· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5。

· max_vocab_size: 设置词向量构建期间的RAM限制,设置成None则没有限制。

· sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)。

· seed:用于随机数发生器。与初始化词向量有关。

· workers:用于控制训练的并行数,如果multiprocessing.cpu_count() 可能会出现CPU占用过高(2000%)的问题,可以令works=5 减小并行数来防止,在启动大约8分钟后 CPU的使用率上升到500%,为什么那么晚呐?? 

· min_alpha:学习率的最小值。

· sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。

· hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(默认),则使用negative sampling。

· negative: 如果>0,则会采用negativesampling,用于设置多少个noise words(一般是5-20)。

· cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(default)则采用均值,只有使用CBOW的时候才起作用。

· hashfxn: hash函数来初始化权重,默认使用python的hash函数。

· iter: 迭代次数,默认为5。

· trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)。

· sorted_vocab: 如果为1(默认),则在分配word index 的时候会先对单词基于频率降序排序。

· batch_words:每一批的传递给线程的单词的数量,默认为10000。

· compute_loss (bool, optional) – 如果为True,则计算并存储可使用get_latest_training_loss()检索的损失值。

· callbacks (iterable of CallbackAny2Vec, optional) – 在训练中特定阶段执行回调序列。

一些参数的选择与对比:

1.skip-gram (训练速度慢,对低频词有效),CBOW(训练速度快)。一般选择Skip-gram模型;

2.训练方法:Hierarchical Softmax(对低频词有利),Negative Sampling(对高频词和低维向量有利);

3.欠采样频繁词可以提高结果的准确性和速度(1e-3~1e-5)

4.Window大小:Skip-gram通常选择10左右,CBOW通常选择5左右。

综上,就完成了一个Word2vec模型的训练过程。可以将训练好的模型保存在文件中:
 

当然,也可以调用load()函数将保存的模型加载进来:

from gensim.models import Word2Vec
model = Word2Vec.load("/data/word2vector.model")
print(model.similarity('Chinese', 'China'))
print(word,model.wv[word])

5. 常见面试问题

  • 介绍一下 word2vec 

        Word2Vec 是以无监督的方式学习大量文本语料然后用词向量的方式表征词的语义信息,然后使得语义相似的单词在嵌入式多维空间中的距离相近

        word2vec 的两个模型分别是 CBOW 和 Skip-gram,假设一个训练样本是核心词 w和其上下文 context(w) 组成,那么 CBOW 就是用 context(w)上下文去预测 w当前单词;而 Skip-gram 则反过来,是用 w当前单词去预测上下文context(w)里的所有词。

        两个加快训练的方法是层次化Softmax和负采样。(1) 层次化Softmax利用词频建立一棵哈夫曼树,将原来的softmax多分类,转化成预测从根节点到该词所在叶子节点的路径,也就是多个二分类问题;树的叶子节点表示词,高频词靠近根节点、低频词远离根节点,可以用更少的计算来处理高频词提高计算效率。(2) 负采样:在负采样中目标词汇是一个正例,而它的上下文词集可以看做是负例,但是负例的样本太多,而在语料库中,各个词出现的频率是不一样的,所以在采样时可以要求高频词选中的概率较大,低频词选中的概率较小(可以让频率高的词先学习,然后带动其他词的学习),这样就转化为一个带权采样问题,大幅度提高了模型的性能。

  • Word2vec的优缺点 

        word2vec是静态表示的一个里程碑。但是静态表示有个根本上的缺陷就是无法表示一词多义。因为每个词对应的向量只有一个,训练完成就固定不变了,是静态变量。这引发了后面词动态表示的研究。ELMo,GPT以及BERT及其衍生的模型都可以认为是动态表示

  • 对比 CBOW(更效率)和Skip-gram(更准确)

        ①训练速度上 CBOW 应该会更快一点,因为每次会更新若干个上下文单词的词向量,而 Skip-gram 只更新一个目标词汇的词向量。
        ②低频词:Skip-gram 对低频词效果比 CBOW好,因为是尝试用当前词去预测上下文,当前词是低频词还是高频词没有区别。但是 CBOW 在根据上下文单词预测当前词汇时更倾向于用高频词。所以Skip-gram 在大一点的数据集可以提取更多的信息,比 CBOW 要好一些。

  • 对比 HS 和 负采样的区别:

负采样更快一些,特别是词表很大的时候。

  • 训练完有两套词向量,为什么只用前一套?

        ① 对于层次化Softmax来说,哈夫曼树中的参数是不能拿来做词向量的,因为没办法和词典里的词对应。

        ② 负采样中的参数其实可以考虑做词向量,因为中间是和前一套词向量做内积,应该也是有意义的。但是考虑负样本采样是根据词频来的,可能有些词会采不到,也就学的不好

  • FastText和Glove原理

FastText是将句子中的每个词通过一个lookup层映射成词向量,对词向量叠加取平均作为句子的向量,然后直接用H-softmax进行分类,FastText结构简单、高效并能取得不错的分类效果。

Glove是基于全局统计信息构建共现关系矩阵,然后利用矩阵分解去拟合共现关系矩阵,不断优化损失函数,得到每个词的词向量。

  • fastText文本分类和word2vec的区别

相似处:

  1. 图模型结构很像,都是采用embedding向量的形式,得到word的隐向量表达。
  2. 都采用很多相似的优化方法,比如使用Hierarchical softmax优化训练和预测中的打分速度。

不同处:

  1. 模型的输出层:
    1. word2vec的输出层,对应的是每一个term,找出概率最大的单词;
    2. 而fasttext的输出层对应的是分类的label。不过不管输出层对应的是什么内容,起对应的vector都不会被保留和使用。
  2. 模型的输入层:word2vec的输入层,是 context window 内的term;而fasttext 对应的整个sentence的内容,包括term,也包括 n-gram的内容。

两者本质的不同,体现在 h-softmax的使用:

  1. Word2vec的目的是得到词向量,该词向量 最终是在输入层得到,输出层对应的 h-softmax
    也会生成一系列的向量,但最终都被抛弃,不会使用。
  2. fastText则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)
  • Embedding的size 怎么确定?

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值