word2vec的简单理解 小白初学

在自然语言处理领域中,本文向量化是文本表示的一种重要方式。在当前阶段,对文本的大部分研究都是通过词向量化实现的,但同时也有一部分研究将句子作为文本处理的基本单元,也就是doc2vec和str2vec技术。

  1. 词语表示
    在传统意义上,我们习惯使用one-hot编码来给词语进行编码,该编码的优势在于简单,容易实现。 one-hot编码由一堆0和一个1组成,比如我们给出一个单词表【吃饭,喝水,睡觉,洗衣,做饭】,我们在这里需要表示喝水,则使用[0,1,0,0,0]来表示,同理,表示洗衣使用[0,0,0,1,0]。可见实际上one-hot编码中一所在位置就是词语出现位置。然而,该种编码方式存在以下问题
    1)维数灾难:假如词典包含10000个单词,那么每个文本需要使用10000维的向量表示,那么向量的很多位置必定是0,如此稀疏的高维向量会严重影响计算速度。
    2)这样构成的向量无法保存词序信息,而词序对于自然语言处理又是那么的重要。
    3)存在语义鸿沟

  2. word2vec简介
    Word2Vec 是 2013 年 Google 的研究员发布的一种基于神经网络的词向量生成模型. 模型是用深度学习网络对语料数据的词语及其上下文的语义关系进行建模, 以求得到低维度的词向量. 该词向量一般在100–300 维左右, 能很好的解决传统向量空间模型高维稀疏的问题. 因为深度的神经网络模型能对特征的高层语义进行很好的抽象所以模型能很好的避免语义鸿沟. 所以 Word2Vec 是目前应用在自然语言处理方面表现较优秀的方法.
    Word2Vec[18,19]主要有 Continuous Bag-of-WordsModel (CBOW) 和 Continuous Skip-gram Model (Skip-gram) 两种模型, CBOW 模型是在己知上下文 Context(t)的情况下预测当前词 t, 而 Skip-gram 模型则是在己知当前词 t 的情况下预测其上下文词 Context(t). 这两个模型都包括输入层、隐藏层和输出层, 如图 1 所示. CBOW模型的输入层是选定窗口个数 w 的上下文词 one-hot编码的词向量, 隐藏层向量是这些词向量、连接输入和隐含单元之间的权重矩阵计算得到的, 输出层向量可以通过隐含层向量、连接隐含层与输出层之间的权重矩阵计算得到. 最后输出层向量应用 SoftMax 激活函数, 可以计算出每个单词的生成概率. 但是由于SoftMax 激活函数中存在归一化项的缘故, 推导出来的迭代公式需要对词汇表中的所有单词进行遍历, 使得每次迭代过程非常缓慢, 可使用Hierarchical Softmax来提升速度.
    在这里插入图片描述
    通过两个词语向量之间的距离远近来表示两个词语之间的相似程度,词语间的距离表示比较常用且效果较好的方法是余弦相似度, 如公式(1)所示,其中t表示向量维度。
    公式(1)

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

  4. 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”的概率大小。
    模型的输出概率代表着到我们词典中每个词有多大可能性跟input word同时出现。举个栗子,如果我们向神经网络模型中输入一个单词“中国“,那么最终模型的输出概率中,像“英国”, ”俄罗斯“这种相关词的概率将远高于像”苹果“,”蝈蝈“非相关词的概率。因为”英国“,”俄罗斯“在文本中更大可能在”中国“的窗口中出现。我们将通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值