机器学习 Word2Vec ---1基本简介

Word Embeding [词嵌入] 简介

VSM
  1. 空间向量模型(VSMs)将词向量映射于一个连续的向量空间中,语义上近似的单词对应的词向量 映射到向量空间中也是相邻的数据点。向量空间模型在自然语言处理领域中有着丰富且漫长的历史,不过几乎所有利用这一模型的方法都依赖于分布式假设,其核心思想为:出现于上下文情境中的词汇都有类似的语义。采用这一假设的研究方法大致上分为以下几类:基于统计计数的方法(eg. 潜在语义分析, Glove),和预测方法(神经概率化语言模型, word2vec)。

  2. 以Glove为代表的基于计数的方法计算某词汇与其邻近词汇在一个大型语料库中共同出现的频率及其他统计量,然后将这些统计量映射到一个小型且稠密的向量中。预测的方法则是直接从某个词汇的邻近词汇对其进行预测。

word embedding
  1. 模型只能处理数值型的数据结构,因此对于非结构性语言的文本或者字符型的数据结构,必须首先将每个词变成向量形式,再喂到模型中。单词变成向量的过程就是 word embedding 过程,这种技术就是词嵌入技术。
  2. 具体的word embedding 技术有常见的三种:
    1. 词袋法(bag of words, 又称为uni-gram)
    2. 独热编码(one-hot-encoder)
    3. 基于DNN的词嵌入方法,常见的比如Word2Vec;
# 1 bag of words
from sklearn.preprocessing import LabelEncoderab

# 2 one-hot
from sklearn.preprocessing import OneHotEncoder

# 3 word2vec
from gensim.models import Word2Vec
  1. 以上三种方法的优劣
方法优点缺点
词袋法计算简单, 容易理解1. 会导致数据非常稀疏;2. 在训练模型时,就需要更多的数据。会导致存储和计算开销激增。
One-hot-Representation它的优点是简单直观,容易理会出现词向量维数爆炸的问题,因为有多少个词,词向量就有多少维度,计算开销太大;2. 两个在词义上相似的词,在词向量上却没有相似性。
Word2vec词向量是用连续向量表示,例如用100维词向量表示一个词,这样就大大降低了维度。同时,w2v词向量能够包含语义信息,向量的夹角余弦能够在某种程度上表示字、词的相似度

在VSM中,语义相似的词,其词向量也是相似的。两个语义相似的词的字符串可能完全不同。

如何进行embedding

理论基础
  1. Harris在1954年提出来分布假说(distributional hypothesis)为这一设想提供了理论基础:在一篇文章中,上下文相似的词,其语义也相似。而基于分布假说的词向量表示方法【理论】,在实际建模过程中,主要可以分成三种:基于矩阵的分布表示、基于聚类的分布表示、基于神经网络的分布表示。而word embedding 一般来说一种基于神经网络的分布表示。

  2. 举一个例子,给出一个文档document,该文档就是单词组成的序列,比如:ABACBFG。那么我们希望对该文档中的每一个词(A, B, C, F ,G)都得到一个词向量(这个是稠密的低纬度表示)。那么经过一些列计算之后,单词A对应的向量是:
    [0.1, 0.6, -0.5],B对应的词向量为[-0.2, 0.9, 0.7]。这个向量就是我们所说的embedding。

  3. 以one-hot为例:

# one-hot 
documents = [
    'the dog saw a cat',
    'the dog chased the cat',
    'the cat climbed the tree'
]

word_set = set()
for sentence in documents:
    for word in sentence.split(' '):
        word_set.add(word.strip())
word_list = list(word_set)
word_list.sort()
n_word = len(word_list)

vec_mat = np.zeros((n_word, n_word))
one_hot_dict = dict()
for pos, word in enumerate(word_list):
    vec = [0] * n_word
    vec[pos] = 1
    one_hot_dict[word] = vec
    vec_mat[pos][pos] = 1
word2vec
word2vec基本简介

最简单的解释是:word2vec是只有一个隐层的全连接神经网络(3 层),用来预测给定单词的关联度最大的单词(本质就是一个语言模型)。
word2vec作为神经概率语言模型的输入,其本身其实是神经概率模型的副产品,是为了通过神经网络学习某个语言模型而产生的中间结果。具体来说,“某个语言模型”指的是“CBOW”和“Skip-gram”。具体学习过程会用到两个降低复杂度的近似方法——Hierarchical Softmax或Negative Sampling。两个模型乘以两种方法,一共有四种实现:

idHierarchical SoftmaxNegative Sampling
Hierarchical Softmax12
Negative Sampling34

在这里插入图片描述

正向传播:

假设词汇库的大小为V,隐藏层的大小为N,并且相邻层的神经元是全连接。
Input: 对于词汇库中的单词进行one-hot编码;第k个词汇的one-hot向量为: v k v_k vk = [0, 0, ……, 1, ……, 0]T , 注意 v k v_k vk 是一个V×1 维的列向量。
array([[1], [0], [0], [0], [0], [0], [0], [0], [0], [0]])
输入层到隐藏层:全连接的权重矩阵W是一个V×N矩阵,并且随机初始化:

array([[ 1.31099235, 0.70424939, -1.52489275, 0.04040014, 0.64882625],
[-0.77424229, 0.22409834, 0.16223222, 0.05803595, -0.1554062 ],
[ 0.4062692 , 1.24533833, -0.9696447 , 0.95111989, 0.21402725],
[ 0.44513761, -1.13660221, 0.13513688, 1.484537 , -1.07980489],
[-1.98126304, -1.74807671, 0.28040633, 2.3854603 , 1.14276877],
[ 1.67043025, 0.09581463, 1.46663413, -0.36637169, 0.62474154],
[-0.20866282, -0.50461628, 0.07915253, -0.50653482, 1.28179177],
[ 0.20600134, 0.36859287, -0.339132 , 1.28116444, -0.73682345],
[ 0.6341885 , -0.35103317, -1.01757998, -0.5332925 , -0.78535903],
[-0.26258224, -0.35388579, 0.31251191, 0.51059517, -0.1923178 ]])
W的每一行是与输入层单词相对应的N维行向量表示vw。给定一个上下文,假设xk=1并且 ,其中k≠k’ ,那么:
其中 是输入单词 在隐藏层的向量化表示,这也表明隐藏层的激活函数时简单的线性激活。
隐藏层到输出层:权重矩阵是一个与W不同的N×V的矩阵 ,通过权重矩阵 可以计算每一个单词的预测得分 :
在这里插入图片描述

是矩阵 的第j列。 表示预测到的第j个单词。得到的 是一个V×1的行向量。
输出层的softmax:
对 使用softmax 来获取每一个单词的后验概率:

是 输出层的第j个分量,将以上公式带入得到:

注意向量 和 是w的两个不同的词向量。 表示从输入层到隐藏层的权重矩阵的行向量,称为单词w的输入向量; 是从隐藏层到输出层的权重矩阵的列向量,称为单词w的输出向量。

反向传播

隐藏层到输出层: 模型训练的目标函数是最大化 ,在给定输入单词wI的条件下,让得到的输出单词wO 出现的概率最大。

是损失函数, 是输出层中实际输出索引(也就是label所在的索引),这个损失函数也可以理解为二分类交叉熵损失函数的特殊形式。

损失函数loss对 求偏导:

这里 ,其实 是预测的残差。
现在来求loss对 的梯度,根据链式法则:

使用随机梯度下降算法对 进行更新:

或者:
隐藏层到输入层:

注意H是一个N维向量,是所有单词的输出向量与其预测误差的和。
首先回忆hi 的计算公式:

注意: 表示W的第i列【也就是说对W进行计算时,要进行转置操作】。
用E对W的每个元素进行求导:

用向量化表示为:

W的更新迭代公式为:

不是一个一个来更新了,而是一行一行来更新。

Cbow和Skip-Gram

Word2vec是一种可以进行高效率学习word embedding 的模型。有两种常见的变体:CBOW(连续词袋法)和Skip-gram。从整个算法流程以及网络结构来看,两种算法非常相似,但是区别在于:Cbow是根据上下文词汇来预测目标词汇,而Skip-Gram恰好相反,他通过目标词汇来预测上下文词汇。

Cbow(continuous bag-of-words)

普通的CBOW通过上下文来预测中心词,考虑了词序信息。下面具体分层次来说。
输入层: 共有2m×n个节点(就是一个元素),上下文共2m个词n维ont-hot向量。
注意:在gensim和google的word2vec实现中,输入层初始化的时候,直接为每一个词生成一个随机向量,并把这个n维向量作为模型参数学习,最终得该向量。
输入层到隐藏层的权重矩阵:Winput的形状为n×h ,其中h为隐藏层的维数。
投影层: h个节点,上下文共2m个词的词向量直接相加后求平均值。
投影层到输出层的权重矩阵:Woutput的形状为h×n,其中h为隐藏层的维数。
输出层: 输出层的维数和输入词向量的维数一样,首先经过softmax变换,后每个元素代表对应词的概率。
在这里插入图片描述

最后,每个词的词向量就是神经网络中的输入矩阵转置的一行,生成词向量的过程就是不断更新权重矩阵的过程。
对于每个词,首先转换成onehot向量,这个词向量是IV×1,这个系数矩阵是WI=WVh,进行矩阵相乘: ,然后就得到隐藏层向量Hh1,这其实就是 每个单词的词向量了。在模型不断训练过程中,就是在不断更新这个矩阵。
对于隐藏层到输出层的权重矩阵WO=Wh*V,这也是每个单词的词向量。然后词向量是怎么得到的呢?这类似一个查表,比如输入节点有个词X对应的one-hot是[1, 0, 0, ……],它与输入权重矩阵相乘得到这个词的词向量。或者在输出节点得到输出某个单词X的one-hot向量[0.1, 0.2, 0.5, ……]【注意,这里是从后往前】,它与输入权重矩阵相乘也得到该词的词向量。所以,其实一个词的语义向量,有两种:输入语义向量和输出语义向量。

Skip-Gram模型

Skip-Gram其实和CBOW模型很相似,都是相关词预测其他词。与CBOW不同的是由中心词来预测上下文的词。
Word2vec本质上是一个语言模型,它的输出节点是V个,对应了V个词语,也是一个多分类问题,但在实际中,词语的数量会比较多【比如在电商环境下共有15万,在信息流推荐中,会更多】。直接用softmax计算会给计算造成很大的困难。所以需要使用技巧来加速训练,通常有两个方法来加速softmax的计算:Hierarchical 和negative sampling。
对于原始模型来说,由于使用的是softmax()函数,时间复杂度为O(|V|),因此计算代价很大,特别是大规模的语料库时,很不现实。因此,Mikolov提出2个技巧,其中一个是hierarchical softmax。
4. Hierarchical softmax
Hierarchical softmax 是一种对输出层进行优化的策略,输出层从原始模型的利用softmax计算概率值改为了利用Huffman树计算概率值。
Huffman树是二叉树,在叶子节点以及叶子节点给定的情况下,那么该树的带权路径长度最短(一个节点的带权路径长度:指的是从根节点到该节点的路径长度乘以该节点的权重,输的带权路径是指全部叶子节点的带权路径长度之和)。直观上来讲,叶子节点的权重越大,那么该叶子节点就离根节点越近。那么对于模型来说,词频越高的词,距离根节点就越近。
开始时,我们可以用词汇表中的词作为叶子节点,词频作为叶子节点的权重。构建Huffman树,作为输出。从根节点出发,导致指定叶子节点的路径是唯一的。Hierarchical正是利用这条路径来计算指定词的概率,而非softmax来计算。

是一个已根据词频构建好的Huffman树,各个叶子节点代表词表中的词,非叶子节点共有|V|-1个。
简单来说,softmax的时间复杂度为O(n)和hierarchical softmax的时间复杂度为
O(log|n|)的分类问题,时间复杂度大大提高。
5. Negative Sampling
第二种加速策略是Negative Sampling(简写NEG, 负采样),这是Noise-contrast-estima(简称NCE,噪声估计对比)的简化版本:把语料库中一个词串的中心词替换成词,构造预料D中不存在的词串作为负样本。
输出层权重矩阵Wo第i行相当于一个权重向量Veci,这个权重负责计算第i词为中心词的分数。输出权重矩阵与softmax的目的使用窗口向量尽可能地映射到中心词。对于一组窗口向量和中心词,窗口向量经过Wo后会有V个分数,代表每个词是预测中心词的概率,其中有的概率大、有的概率小。 这样,我们称中心词为正样本、其他词为负样本。在负样本中也有概率大,概率小,如果只取少数几个概率比较大的负样本,不是可以近似估计正样本的概率吗?从V-1个负样本中抽取少部分,计算量可以大大减少。
负采样基于基于这个思想来减少计算量。对于窗口向量,中心词记为正样本,从某分布(比如均匀分布)中抽取k个样本来作为负样本,然后用logistics 回归来分类正样本和负样本,这是输出权重矩阵Wo仍然是原来的权重矩阵,但是损失函数有交叉熵变为:

其中,vc是中心词的向量,u0是正样本的向量,uk是负样本的k个向量。相比于交叉熵损失函数需要对所有的几率求和,负采样损失只需要对k+1项求和。同时,负采样的损失对于输出矩阵来说只要更新采样的K行,而不必要更新所有的行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Word2vec和LDA是两种用于自然语言处理的技术,它们可以结合使用来进行文本分析和语义建模。 Word2vec是一种用于学习单词向量表示的算法,它基于上下文的共现关系来学习单词的分布式表示。通过分析单词在上下文中的出现情况,Word2vec可以将每个单词表示为一个向量,使得相似的单词在向量空间中距离较近。这样的表示方式使得我们可以进行词义推断、语义相似计算等任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Word2vec是如何工作的?它和LDA有什么区别和联系?](https://blog.csdn.net/qq_29678299/article/details/88727380)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [word2vec参数调整 及lda调参](https://blog.csdn.net/weixin_34238642/article/details/94631965)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [《学术小白的实战之路》01 LDA-Word2Vec-TF-IDF组合特征的机器学习情感分类模型研究](https://blog.csdn.net/qq_44951759/article/details/120682246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值