word2vec通俗讲述

一、背景
1、文本向量化的最初方法(one_hot)
[“male”, “female”]
[“from Europe”, “from US”, “from Asia”]
[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]

	将它换成独热编码后,应该是:
	feature1=[01,10]
	feature2=[001,010,100]
	feature3=[0001,0010,0100,1000]

优缺点分析

优点:一是解决了分类器不好处理离散数据的问题,二是在一定程度上也起到了扩充特征的作用。

	缺点:在文本特征表示上有些缺点就非常突出了。首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的);最后,它得到的特征是离散稀疏的。
(就是在文本数据量很大情况下,我们的数据转化出来的向量数据会很稀疏, 向量维度很庞大)

二、Word2vec
word2vec模型其实就是简单化的神经网络。(不明白神经网络的请自行搜索)

1、文字描述
	我们通过对大量的数据词的编码,编码之后就可以直接对每个词进行
	one-hot编码,编码之后,我们可以将每句话转化成向量, 使用预测
	的目标词的non-hot向量作为y,目标词前后n个词的one-hot向量为x,
	通过神经网络进行转化, ax = y,其中a矩阵就是我们最终需要的词向量
	矩阵
2、输入是One-Hot Vector,Hidden Layer没有激活函数,也就是线性
的单元。Output Layer维度跟Input Layer的维度一样,用的是Softmax
回归。当这个模型训练好以后,我们并不会用这个训练好的模型处理新
的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如
隐层的权重矩阵。


这个模型是如何定义数据的输入和输出呢?一般分为
CBOW(Continuous Bag-of-Words 与Skip-Gram两种模型。CBOW模型
的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就
是这特定的一个词的词向量。 Skip-Gram模型和CBOW的思路是反着
来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文
词向量。

CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图中的矩阵维度的变化:
在这里插入图片描述
这里有一个需要注意的是,真实的word2vec中在输入层和隐藏层之中还有一个投影层,就是将词场口中的所有one-hot编码首尾相连

1 输入层:上下文单词的onehot. {假设单词向量空间dim为V,上下文单词个数为C}
2 所有onehot分别乘以共享的输入权重矩阵W. {VN矩阵,N为自己设定的数,初始化权重矩阵W}
3 所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量, size为1N.
4 乘以输出权重矩阵W’ {NV}
5 得到向量 {1V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维斗代表着一个单词}
6 概率最大的index所指示的单词为预测出的中间词(target word)与true label的onehot做比较,误差越小越好(根据误差更新权重矩阵)
所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W’。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实聪明的你已经看出来了,其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。

窗口大小是2,表示选取coffe前面两个单词和后面两个单词,作为input词
窗口大小是2,表示选取coffe前面两个单词和后面两个单词,作为input词。
在这里插入图片描述假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的look up table应该为矩阵W。即,任何一个单词的one-hot表示乘以这个矩阵都将得到自己的word embedding。

这是其中的CBOW模型
3、skip-gram:
从直观上理解,Skip-Gram是给定input word来预测上下文。

举例来讲:
接下来我们来看看如何训练我们的神经网络。假如我们有一个句子“The dog barked at the mailman”。

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

有了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’)。

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

面的图中给出了一些我们的训练样本的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(window_size=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。Training Samples(输入, 输出)

在这里插入图片描述

上图中Training samples 中的数据,第一个词是输入,第二个词是输出,输入和输出就是这两个词的one-hot向量,通过这样来构建一个神经网络来训练词向量权重。

4、word2vec的优化
(1)Huffman Tree上述神经网络模型两者目的相同,原理的不同之处
① 这种方式,在设定了窗口之后,这里的投影层和之前的不一样,这里是对窗口中选中的词进行了求和累加
② 这种方式中没有隐藏层,上述的神经网络模型中有隐藏层
③ 这种方式输出层是一刻Huffman tree,(特点: 叶子节点的个数等于文本数据中词的个数, 非叶子节点等于文本数据中词的个数减一, 出现频次越高的词离根节点越近)

具体huffman Tree和nagative sample的原理解析看下方链接:
https://www.cnblogs.com/peghoty/p/3857839.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值