精华内容
下载资源
问答
  • 文本表示:词向量模型
    千次阅读
    2022-01-21 15:46:17

    1. 词向量模型的核心思想

    文本的词向量表示又叫文本的分布式表示,它源自于语言学家的语境理论。语言学家Firth认为:“语言是人类的生活方式,词语的含义根植于人类赖以生存的社会活动中”;也就是说,词语的含义存在于语境中,由它与其上下文单词的搭配关系体现,这就是词向量分布式假设的核心思想[1-2]

    2. 词向量模型

    根据该思想,词向量模型就是学习单词间的搭配关系,这容易定义成三类任务:

    1. 给定上下文词,预测其中心词
    2. 给定中心词,预测其上下文词
    3. 给定一组单词,判断它们是否搭配

    前两种定义方式更早被想到,它们成就了经典算法Word2Vec中的CBOWSkip-gram模型[3]。实践中人们发现,在很多情况下Skip-gram模型的词向量训练效果会好于CBOW模型,所以目前Skip-gram模型是Word2Vec算法的主流实现方案。最后一种定义方式,推出了目前Skip-gram模型的主流简化方法,结合负采样实现Skip-gram模型,它在极大减少计算量的同时并未明显牺牲训练效果。

    关于Skip-gram模型的具体实现细节,敬请详见作者文章:

    3. 词向量分类

    我们都知道单词存在一词多义的现象,对不同含义的同一单词的不同表示思路,自然将词向量模型分成两类。一类是静态词向量模型,它将不同含义的同一个单词编码成相同的词向量;另一类是动态词向量模型,它将不同含义的同一个单词编码成不同的词向量。所以静态词向量模型时一词一码,相对简单但训练简单、实现成本低,而动态词向量模型是一词一义一码,表示精准但也需要更大的训练语料库且模型复杂。

    3.1 静态词向量模型

    3.1.1 Word2Vec

    SkipGram是目前主流的静态词向量模型,它训练发生在局部,具有训练效率高、且善于捕捉局部文本特征的优点;但也有不能从全局的视角掌握语料库的局限。

    3.1.2 矩阵分解

    矩阵分解(SVD)是另一种静态词向量模型,作为全局方法,它的学习过程包含了全局的文本信息;但每次语料库中某些文本发生改变都要需要重新训练模型,效率很低。

    3.1.3 Glove

    Glove是一种融合矩阵分解(SVD)和SkipGram模型优点的静态词向量模型,它同时具有二者的优点,在实践中也有一定量使用。

    3.1.4 高斯嵌入

    此外,针对极度不均衡数据集中罕见词训练结果可信度不高的问题,提出高斯嵌入(Gaussian Embedding)静态词向量模型,它既可以输出一个单词的向量表示,又可以给出这个向量表示的置信度。

    3.2 动态词向量模型

    3.2.1 Elmo

    参考文献:

    [1] HARRIS Z S J W. Distributional structure [J]. 1954, 10(2-3): 146-62.
    [2] FIRTH J R. Papers in linguistics, 1934-1951 [M]. Papers in linguistics, 1934-1951, 1957.
    [3] MIKOLOV T, CHEN K, CORRADO G, et al. Efficient estimation of word representations in vector space [J]. 2013.

    更多相关内容
  • 词向量基于语言模型的假设——“一个词的含义可以由它的上下文推断得出“,提出了词的Distributed Representation表示方法。相较于传统NLP的高维、稀疏的表示法(One-hot Representation),Word2Vec训练出的词向量是...
  • 基于python构建Wiki中文语料词向量模型代码实现
  • 30 种语言预训练词向量模型
  • word2ver 词向量模型

    2018-02-26 20:12:05
    想用时找不到地方下载,找到了发出来大家共享下。欢迎大家一起交流学习
  • 利用Python构建Wiki中文语料词向量模型试验
  • 自然语言处理第二次作业: data文件夹中存储语料(中文...output文件夹中存储输出的词向量文件 script文件夹中为CBOW的脚本,同时处理中文语料与英文语料 运行步骤:在脚本中确定训练中文或者是英语后,直接运行即可
  • 我们提供了Glove模型的一个实现,用于学习单词表示,并描述了如何下载web数据集向量或训练自己的向量
  • 词向量模型(1)

    万次阅读 2018-08-14 09:55:59
    词向量模型 one-hot Vector one-hot vector 最简单的编码方式:假设我们的词库总共有n个词,那我们开一个1*n的高维向量,而每个词都会在某个索引index下取到1,其余位置全部都取值为0。 问题 这种词向量编码...

    词向量模型

    one-hot Vector

    one-hot vector

    最简单的编码方式:假设我们的词库总共有n个词,那我们开一个1*n的高维向量,而每个词都会在某个索引index下取到1,其余位置全部都取值为0。

    问题

    这种词向量编码方式简单粗暴,我们将每一个词作为一个完全独立的个体来表达。遗憾的是,这种方式下,我们的词向量没办法给我们任何形式的词组相似性权衡。因为你开了一个极高维度的空间,然后每个词语都会占据一个维度,因此没有办法在空间中关联起来。

    解决方案

    可以把词向量的维度降低一些,在这样一个子空间中,可能原本没有关联的词就关联起来了。

    基于 SVD 的方法

    SVD

    这是一种构造词嵌入(即词向量)的方法,我们首先会遍历所有的文本数据集,然后统计词出现的次数,接着用一个矩阵 X 来表示所有的次数情况,紧接着对X进行奇异值分解得到一个 USVT 的分解。然后用 U 的行(rows)作为所有词表中词的词向量。对于矩阵 X ,有2种选择:全文或者窗口长度。

    • 词-文档矩阵
      建立一个词组文档矩阵 X,具体是这么做的:遍历海量的文件,每次词组 i 出现在文件 j 中时,将 Xij 的值加1。不过大家可想而知,这会是个很大的矩阵R|V|×M,而且矩阵大小还和文档个数M有关系。所以咱们最好想办法处理和优化一下。word-document的共现矩阵最终会得到泛化的主题(例如体育类词汇会有相似的标记),这就是浅层语义分析(LSA, Latent Semantic Analysis)

    • 基于窗口的共现矩阵 X
      把矩阵X记录的词频变成一个相关性矩阵,对 X 做奇异值分解,观察奇异值(矩阵的对角元素),并根据我们期待保留的百分比来进行截断(只保留前k个维度),把子矩阵 U1:|V|,1:k 视作我们的词嵌入矩阵。也就是说,对于词表中的每一个词,我们都用一个 k 维的向量来表达了。窗口长度容易捕获语法(POS)和语义信息

    对共现矩阵X进行奇异值分解

    特征值分解与奇异值分解
    特征值分解只适用于方阵。当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。我们通过特征值分解得到的前N个特征向量,对应了这个矩阵最主要的N个变化方向。利用这前N个变化方向,可以近似这个矩阵(变换)。也就是 – 提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。
    奇异值分解是一个能适用于任意的矩阵的一种分解的方法,可以通过求特征值得到。

    Python中简单的词向量SVD分解

    问题

    • 矩阵的维度会经常变化(新的词语经常会增加,语料库的大小也会随时变化)。
    • 矩阵是非常稀疏的,因为大多数词并不同时出现。
    • 矩阵的维度通常非常高(≈106×106),需要大量的存储
    • 训练需要O(n2)的复杂度
    • 对于新词或者新的文档很难及时更新
    • 需要专门对矩阵X进行特殊处理,以应对词组频率的极度不平衡的状况

    解决方案:直接学习低维度的词向量

    idea: 将最重要的信息存储在固定的,低维度的向量里:密集向量(dense vector),维数通常是25-1000
    然而,如何降维?

    基于迭代的方法

    创建一个模型,它能够一步步迭代地进行学习,并最终得出每个单词基于其上下文的条件概率。

    n-gram

    基本思想: 一个词出现的概率只与它前面固定数目的词相关。
    主要工作是在预料中统计各种词串出现的次数以及平滑化处理,概率值计算号之后就存储起来,下次需要计算一个句子的概率时,只需找到相关的概率参数,将它们连乘起来就好了。
    建立一个概率模型,它包含已知和未知参数。每增加一个训练样本,它就能从模型的输入、输出和期望输出(标签),多学到一点点未知参数的信息。
    在每次迭代过程中,这个模型都能够评估其误差,并按照一定的更新规则,惩罚那些导致误差的参数。(误差“反向传播”法)。

    CBOW

    以 {“The”, “cat”, “over”, “the”, “puddle”} 为上下文,能够预测或产生它们中心的词语”jumped”。模型输入为 x(c),模型输出为 y,y 就是中心词 ‘jumped’。对于每个词语 wi 学习了两个向量。

    2.jpg

    连续词袋模型(CBOW)中的各个记号:

    • WiWi:单词表 V 中的第 i 个单词, one-hot 向量
    • v∈Rn∗|V|v∈Rn∗|V|:输入词矩阵
    • vivi:V的第i列,n 维 WiWi 的输入向量
    • U∈R|V|∗nU∈R|V|∗n:输出词矩阵
    • UiUi:U 的第 i 行,n 维 WiWi 的输出向量

    把整个过程拆分成以下几步:

    • 对于 m 个词长度的输入上下文,我们产生它们的 one-hot 向量 (xc−m,⋯,xc−1,xc+1,⋯,xc+m)(xc−m,⋯,xc−1,xc+1,⋯,xc+m),作为模型输入。
    • 我们得到上下文的嵌入词向量 (vc−m+1=Vxc−m+1,⋯,vc+m=Vxc+m)(vc−m+1=Vxc−m+1,⋯,vc+m=Vxc+m)
    • 将这些向量取平均 vˆ=Vc−m+Vc−m+1+⋯+Vc+m2mv^=Vc−m+Vc−m+1+⋯+Vc+m2m
    • 产生一个得分向量 z=Uvˆz=Uv^
    • 将得分向量转换成概率分布形式 yˆ=softmax(z)y^=softmax(z)
    • 我们希望我们产生的概率分布 ,与真实概率分布 yˆy^ 相匹配。而 y 刚好也就是我们期望的真实词语的one-hot向量。

    怎样找到矩阵U、V?
    目标函数选交叉熵,用梯度下降法去更新每一个相关的词向量 UcUc 和 VjVj.

    当我们试图从已知概率学习一个新的概率时,最常见的是从信息论的角度寻找方法来评估两个概率分布的差距。其中广受好评又广泛应用的一个评估差异/损失的函数是交叉熵:
    H(yˆ,y)=−∑|V|j=1yjlog(yˆj)H(y^,y)=−∑j=1|V|yjlog(y^j)

    结合我们当下的例子,y 只是一个one-hot向量,于是上面的损失函数就可以简化为:
    H(yˆ,y)=−yjlog(yˆj)H(y^,y)=−yjlog(y^j)

    我们用 c 表示 y 这个 one-hot 向量取值为 1 的那个维度的下标。所以在我们预测为准确值的情况下 yˆc=1y^c=1。于是损失为 −1 log(1) = 0。所以对于一个理想的预测值,因为预测得到的概率分布和真实概率分布完全一样,因此损失为0。相反,当我们的预测结果非常不理想, yˆc=0.01y^c=0.01。计算得到的损失为−1 log(0.01) ≈ 4.605,损失非常大,原本这才是标准结果,可是你给了一个非常低的概率,因此会拿到一个非常大的loss。最终的优化函数为:

    Skip-Gram

    与上面提到的模型对应的另一种思路,是以中心的词语 ”jumped” 为输入,能够预测或产生它周围的词语 ”The”, “cat”, “over”, “the”, “puddle” 等。这里我们叫 ”jumped” 为上下文。我们把它叫做Skip-Gram 模型。

    这个模型的建立与连续词袋模型(CBOW)非常相似,但本质上是交换了输入和输出的位置。我们令输入的 one-hot 向量(中心词)为 x(因为它只有一个),输出向量为 y(j)。U 和 V 的定义与连续词袋模型一样。看一下网络结构图:

    1.jpg

    举个例子,假设现在的数据集如下:

    the quick brown fox jumped over the lazy dog

    这个数据集中包含了词语及其上下文信息。上下文信息(Context)是一个比较宽泛的概念,有多种不同的理解:例如,词语周边的句法结构,词语的左边部分的若干个词语信息,对应的右半部分等。这里,我们使用最原始和基本的定义,即认为词语左右相邻的若干个词汇是该词对应的上下文信息。例如,取左右的词窗口为1,下面是数据集中的(上下文信息,对应的词)的pairs:

    ([the, brown], quick), ([quick, fox], brown), ([brown, jumped], fox), ...

    Skip-Gram模型是通过输入的目标词来预测其对应的上下文信息,所以目标是通过[quick]来预测[the]和[brown],通过[brown]来预测[quick]和[fox]… 将上面的pair转换为(inpUt, output)的形式如下:

    (quick, the), (quick, brown), (brown, quick), (brown, fox), ...

    对应到上面部分,我们可以把 Skip-Gram 模型的运作方式拆分成以下几步:

    • 生成 one-hot 输入向量 x。
    • 得到上下文的嵌入词向量 VcVc=VxVx。
    • 因为这里不需要取平均值的操作,所以直接是vˆ=vcv^=vc。
    • 通过U=UVcU=UVc产生 2m 个得分向量 Uc−m,⋯,Uc−1,Uc+1,⋯,Uc+mUc−m,⋯,Uc−1,Uc+1,⋯,Uc+m,如果上下文各取一个词,就是 Uc−1Uc−1, Uc+1Uc+1
    • 将得分向量转换成概率分布形式 y=softmax(u)y=softmax(u)。
    • 我们希望我们产生的概率分布与真实概率分布 yc−m,⋯,yc−1,,yc+1⋯,yc+myc−m,⋯,yc−1,,yc+1⋯,yc+m 相匹配,也就是我们真实输出结果的 one-hot 向量。

    为模型设定一个目标/损失函数。不过不同的地方是我们这里需要引入朴素贝叶斯假设来将联合概率拆分成独立概率相乘。只要给出了中心词,所有的输出词是完全独立的。使用随机梯度下降算法(SGD)来进行最优化求解,并且使用mini-batch方法 (通常batch_size在16到512之间)。可以用随机梯度下降法去更新未知参数的梯度。
    对应的优化函数是

    这里值得一提的是,skipgram 和 PMI 之间是有联系的,Levy and Goldberg(2014) 提到过,skip-gram 在矩阵成为 PMI 的一个 shifted version 时(WW‘T=MPMI−logkWW‘T=MPMI−logk),得到最优解,也就是说,

    Skip-gram is implicitly factoring a shifted version of the PMI matrix into the two embedding matrices.

    我们再次观察一下目标函数,注意到对整个单词表|V|求和的计算量是非常巨大的,任何一个对目标函数的更新和求值操作都会有O(|V|)的时间复杂度。我们需要一个思路去简化一下,我们想办法去求它的近似,可以参照负面采样(Negative Sampling)

    why skip-gram

    在NLP中,语料的选取是一个相当重要的问题。
    首先,语料必须充分。一方面词典的词量要足够大,另一方面尽可能地包含反映词语之间关系的句子,如“鱼在水中游”这种句式在语料中尽可能地多,模型才能学习到该句中的语义和语法关系,这和人类学习自然语言是一个道理,重复次数多了,也就会模型了。
    其次,语料必须准确。所选取的语料能够正确反映该语言的语义和语法关系。如中文的《人民日报》比较准确。但更多时候不是语料选取引发准确性问题,而是处理的方法。
    由于窗口大小的限制,这会导致超出窗口的词语与当前词之间的关系不能正确地反映到模型中,如果单纯扩大窗口大小会增加训练的复杂度。Skip-gram模型的提出很好解决了这些问题。

    我们来看看 skip-gram 的定义。

    Skip-gram 实际上的定义很简单,就是允许跳几个字的意思。依照原论文里的定义,这个句子:

    Insurgents killed in ongoing fighting.

    在 bi-grams 的时候是拆成:

    { insurgents killed, killed in, in ongoing, ongoing fighting }

    在 2-skip-bi-grams 的时候拆成:

    { insurgents killed, insurgents in, insurgents ongoing, killed in, killed ongoing, killed fighting, in ongoing, in fighting, ongoing fighting }

    在 tri-grams 的时候是:

    { insurgents killed in, killed in ongoing, in ongoing fighting }

    在 2-skip-tri-grams 的时候是:

    { insurgents killed in, insurgents killed ongoing, insurgents killed fighting, insurgentsin ongoing, insurgents in fighting, insurgents ongoing fighting, killed in ongoing, killed in fighting, killed ongoing fighting, in ongoing fighting }

    这样就有办法在整篇文章都是用“台湾大学”的情况下以“台大”找到文章,解决一些“同义词”想要解决的问题。Skip-gram 一方面反映了句子的真实意思,另一方面还扩大了语料,2元词组由原来的4个扩展到了9个,3元词组由原来的3个扩展到了10个。

    Word2Vec

    Word2Vec 是一个典型的预测模型,用于高效地学习Word Embedding,实现的模型就是上面提到的两种:连续词袋模型(CBOW)和Skip-Gram模型。算法上这两个模型是相似的

    • CBOW 从输入的上下文信息来预测目标词
    • Skip-gram 模型则是相反的,从目标词来预测上下文信息
      一般而言,这种方式上的区别使得 CBOW 模型更适合应用在小规模的数据集上,能够对很多的分布式信息进行平滑处理;而 Skip-Gram 模型则比较适合用于大规模的数据集上。

    另外一点是,embeddings 可以来捕捉关系!
    3.jpg

    向量空间模型(Vector space models, VSMs)

    将词语表示为一个连续的词向量,并且语义接近的词语对应的词向量在空间上也是接近的。
    分布式假说理论: 该假说的思想是如果两个词的上下文(context)相同,那么这两个词所表达的语义也是一样的;换言之,两个词的语义是否相同或相似,取决于两个词的上下文内容,上下文相同表示两个词是可以等价替换的。

    词向量生成方法主要分两大类:

    • 计数法(count-based methods, e.g. Latent Semantic Analysis)
      在大型语料中统计词语及邻近的词的共现频率,然后将之为每个词都映射为一个稠密的向量表示;
    • 预测法(predictive methods, e.g. neural probabilistic language models)。
      直接利用词语的邻近词信息来得到预测词的词向量(词向量通常作为模型的训练参数)。

    词向量任务评价

    内部任务评价

    内部任务评价的特点如下:

    • 一般是在一个特定的子任务中进行评测
    • 计算很快
    • 有助于理解相关的系统
    • 在实际的NLP任务中表现好坏,可能需要外部关联实际应用

    方法:词向量类比

    我们先输入一组不完整的类比 a:b::c:? 内部任务评价系统找出最大化余弦相似度的词向量
    理想情况下,我们想得到xb−xa=xd−xc(例如,王后–国王 = 女演员 – 男演员)。于是xb−xa+xc=xd, 所以我们只需要找出一个与xb−xa+xc的标准化内积(比如余弦相似度)取最大值的词向量就可以了。

    类比语料示例:

    首都城市1 : 国家1 : : 首都城市2 : 国家2
    Beijing:China::Astana       Kazakhstan
    Beijing:China::Asmara       Eritrea
    ...
    
    比较级
    bad:worst::big            biggest
    bad:worst::easy           easiest
    ...
    
    时态
    dancing:danced::decreased         decreased
    dancing:danced::falling           fell
    ...
    

    评测语料

    方法:相关性评价

    另外一个评测词向量质量的简单方法是人为对两个词的相似度在一个固定区间内打分(比如说 0-10),再跟对应向量的余弦相适度进行对比。
    评测语料

    考虑参数

    • 词向量的维度
    • 资料库的大小
    • 资料源/类型
    • 上下文窗口的大小
    • 上下文的对称性

    一般而言,

    • 精度和使用的模型高度相关,因为这些生成词向量的方法所依据的特性是完全不同的(如同时出现的次数,奇异向量等。)
    • 文集量越大,精度越高,因为例子越多,生成的系统学习到的经验就更丰富。比如在完成词汇类比的例子中,系统如果之前没有接触测试词,就可能会生成错误的结果。
    • 如果维度特别低或特别高,精度就会比较低。低维度词向量无法捕捉文集中不同词语的不同意义。这可以视为我们模型复杂度过低而导致的高偏差。比如 “king”, “queen”, “man”, “woman” 这几个词,我们需要至少2个维度像”gender” 如 “leadership” 来把它们编译成 2-字节 词向量。 过低的维度将无法捕捉四个词之间的语义差别,而过高的维度将捕捉到一些对泛化能力没有用的噪音– 即高方差的问题。

    外部任务评价

    外部任务评价的特点如下:

    • 在一个实际任务中进行评测
    • 需要花很长的时间来计算精度
    • 不太清楚是否是某个子系统或者其他子系统,又或是几个子系统互相作用引起的问题
    • 如果替换原有的子系统后获得精度提升,则说明替换很可能是有效的

    参考链接:
    斯坦福大学课程:深度学习与自然语言处理
    斯坦福大学深度学习与自然语言处理第二讲:词向量

    转自: http://www.shuang0420.com/2016/06/21/%E8%AF%8D%E5%90%91%E9%87%8F%E6%80%BB%E7%BB%93%E7%AC%94%E8%AE%B0%EF%BC%88%E7%AE%80%E6%B4%81%E7%89%88%EF%BC%89/

    展开全文
  • 向量空间模型在信息检索中是众所周知的,其中每个文档被表示为向量。矢量分量表示文档中每个单词的权重或重要性。使用余弦相似性度量计算两个文档之间的相似性。 尽管对单词使用矢量表示的想法也已经存在了一段时间...

    Word2vec

    向量空间模型在信息检索中是众所周知的,其中每个文档被表示为向量。矢量分量表示文档中每个单词的权重或重要性。使用余弦相似性度量计算两个文档之间的相似性。

    尽管对单词使用矢量表示的想法也已经存在了一段时间,但是对于嵌入单词的技术,将单词映射到向量的技术,最近一直在飙升。其中一个驱动因素是TomášMikolov的Word2vec算法,该算法使用大量文本来创建高维(50到300维)的单词表示,捕获单词之间的关系,无需外部注释。这种表述似乎捕获了许多语言规律。例如,它产生一个近似于vec(‘Rome’)表示的向量,作为向量运算vec(‘Paris’) - vec(‘France’)+ vec(‘Italy’)的结果。

    Word2vec使用单个隐藏层,完全连接的神经网络如下所示。隐藏层中的神经元都是线性神经元。输入层设置为具有与用于训练的词汇中的单词一样多的神经元。隐藏图层大小设置为生成的单词向量的维度。输出图层的大小与输入图层相同。因此,假设用于学习单词向量的词汇表由V个单词组成并且N为单词向量的维度,则对隐藏层连接的输入可以由大小为VxN的矩阵WI表示,其中每行表示词汇单词。以相同的方式,可以通过矩阵WO来描述从隐藏层到输出层的连接大小为NxV。在这种情况下,WO矩阵的每列 表示来自给定词汇表的单词。使用“ 1-out of -V ”表示对网络的输入进行编码,这意味着只有一条输入线被设置为1,其余输入线被设置为零。
    在这里插入图片描述
    为了更好地处理Word2vec的工作原理,请考虑具有以下句子的训练语料库:

    “狗看到了一只猫”,“狗追着猫”,“猫爬上了一棵树”

    语料库词汇有八个单词。按字母顺序排序后,每个单词都可以通过其索引引用。对于这个例子,我们的神经网络将有八个输入神经元和八个输出神经元。让我们假设我们决定在隐藏层中使用三个神经元。这意味着WI和WO将分别是8×3和3×8矩阵。在训练开始之前,这些矩阵被初始化为小的随机值,如通常在神经网络训练中那样。仅为了说明,让我们假设WI和WO初始化为以下值:

    WI =
    在这里插入图片描述
    W0 =

    在这里插入图片描述
    假设我们希望网络学习单词“cat”和“climb”之间的关系。也就是说,当“猫”输入到网络时,网络应该显示“攀爬”的高概率。在单词嵌入术语中,单词“cat”被称为上下文单词,单词“climbed”被称为目标单词。在这种情况下,输入矢量X将是[0 1 0 0 0 0 0 0] t。请注意,只有向量的第二个分量是1.这是因为输入的单词是“cat”,它在语料库单词的排序列表中保持第二个位置。鉴于目标字是“爬升”,目标矢量看起来像[0 0 0 1 0 0 0 0] t。

    利用表示“cat”的输入向量,可以将隐藏层神经元的输出计算为

    H t = X t WI = [-0.490796 -0.229903 0.065460]

    我们不应该感到惊讶的是隐藏神经元输出的向量H模仿了WI矩阵的第二行的权重,因为V表示为1-out-of-V。因此隐藏层连接的输入功能基本上是将输入字向量复制到隐藏层。对隐藏到输出层执行类似的操作,输出层神经元的激活矢量可以写成

    H t WO = [0.100934 -0.309331 -0.122361 -0.151399 0.143463 -0.051262 -0.079686 0.112928]

    由于目标是为输出层中的单词生成概率, 对于k = 1,V的Pr(单词k |单词上下文),为了反映它们与输入处的上下文单词的下一个单词关系,我们需要神经元输出的总和。输出图层添加到一个。Word2vec通过使用softmax函数将输出层神经元的激活值转换为概率来实现此目的。因此,第k个神经元的输出通过以下表达式计算,其中activation(n)表示第n个输出层神经元的激活值:
    在这里插入图片描述
    因此,语料库中八个单词的概率是:

    0.143073 0.094925 0.114441 0.111166 0.149289 0.122874 0.119431 0.144800

    粗体的概率是针对所选择的目标词“攀爬”。给定目标矢量[0 0 0 1 0 0 0 0] t,通过从目标矢量中减去概率矢量,可以容易地计算输出层的误差矢量。一旦知道了错误,就可以使用反向传播来更新矩阵WO和WI中
    的权重。因此,训练可以通过从语料库呈现不同的上下文目标词对来进行。从本质上讲,这就是Word2vec如何学习单词之间的关系,并在此过程中开发语料库中单词的向量表示。

    例句
    Jane wants to go to Shenzhen.

    Bob wants to go to Shanghai.

    **

    一、词袋模型

    将所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个词语都是独立的。例如上面2个例句,就可以构成一个词袋,袋子里包括Jane、wants、to、go、Shenzhen、Bob、Shanghai。假设建立一个数组(或词典)用于映射匹配

    [Jane, wants, to, go, Shenzhen, Bob, Shanghai]
    那么上面两个例句就可以用以下两个向量表示,对应的下标与映射数组的下标相匹配,其值为该词语出现的次数
    [1,1,2,1,1,0,0]
    [0,1,2,1,0,1,1]

    这两个词频向量就是词袋模型,可以很明显的看到语序关系已经完全丢失。

    二、词向量模型

    词向量模型是考虑词语位置关系的一种模型。通过大量语料的训练,将每一个词语映射到高维度(几千、几万维以上)的向量当中,通过求余弦的方式,可以判断两个词语之间的关系,例如例句中的Jane和Bob在词向量模型中,他们的余弦值可能就接近1,因为这两个都是人名,Shenzhen和Bob的余弦值可能就接近0,因为一个是人名一个是地名。

    现在常用word2vec构成词向量模型,它的底层采用基于CBOW和Skip-Gram算法的神经网络模型。

    1. CBOW模型

    CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。比如上面的第一句话,将上下文大小取值为2,特定的这个词是"go",也就是我们需要的输出词向量,上下文对应的词有4个,前后各2个,这4个词是我们模型的输入。由于CBOW使用的是词袋模型,因此这4个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。

    这样我们这个CBOW的例子里,我们的输入是4个词向量,输出是所有词的softmax概率(训练的目标是期望训练样本特定词对应的softmax概率最大),对应的CBOW神经网络模型输入层有4个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某4个词对应的最可能的输出中心词时,我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。

    以上描述和架构旨在用于学习单词对之间的关​​系。在连续的单词模型中,上下文由给定目标单词的多个单词表示。例如,我们可以使用“cat”和“tree”作为“攀爬”的上下文单词作为目标单词。这需要修改神经网络架构。如下所示,修改包括将隐藏层连接的输入复制C次,上下文单词的数量,以及在隐藏层神经元中添加除C操作。[警报读者指出,下图可能会让一些读者认为CBOW学习使用了几个输入矩阵。不是这样。它是相同的矩阵WI,它接收代表不同上下文词的多个输入向量]

    以上描述和架构旨在用于学习单词对之间的关​​系。在连续的单词模型中,上下文由给定目标单词的多个单词表示。例如,我们可以使用“cat”和“tree”作为“攀爬”的上下文单词作为目标单词。这需要修改神经网络架构。如下所示,修改包括将隐藏层连接的输入复制C次,上下文单词的数量,以及在隐藏层神经元中添加除C操作。[警报读者指出,下图可能会让一些读者认为CBOW学习使用了几个输入矩阵。不是这样。它是相同的矩阵WI,它接收代表不同上下文词的多个输入向量]

    在这里插入图片描述
    利用上述配置来指定C上下文字,使用1-out-of-V表示编码的每个字意味着隐藏层输出是与输入处的上下文字相对应的字矢量的平均值。输出层保持不变,并且以上面讨论的方式完成训练。

    2.Skip-Gram模型

    Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。还是上面的例子,我们的上下文大小取值为2, 特定的这个词"go"是我们的输入,而这4个上下文词是我们的输出。

    这样我们这个Skip-Gram的例子里,我们的输入是特定词, 输出是softmax概率排前4的4个词,对应的Skip-Gram神经网络模型输入层有1个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某1个词对应的最可能的4个上下文词时,我们可以通过一次DNN前向传播算法得到概率大小排前4的softmax概率对应的神经元所对应的词即可。

    Skip-gram模型反转了目标和上下文单词的使用。在这种情况下,目标字在输入处被馈送,隐藏层保持相同,并且神经网络的输出层被多次复制以适应所选数量的上下文字。以“cat”和“tree”为例,作为上下文单词,“爬”作为目标词,skim-gram模型中的输入向量为[0 0 0 1 0 0 0 0] t,而两个输出层将具有[0 1 0 0 0 0 0 0] t和[0 0 0 0 0 0 0 1] t分别作为目标向量。代替产生一个概率向量,将为当前示例产生两个这样的向量。以上面讨论的方式产生每个输出层的误差向量。然而,将来自所有输出层的误差向量相加以通过反向传播来调整权重。这确保了每个输出层的权重矩阵WO在整个训练中保持相同。

    词向量模型突出特点:

    在词向量模型中,词向量与词向量之间有这非常特殊的特性。例如现在存在国王、男生、女人、皇后四个词向量,那么一个完善的词向量模型,就存在“国王-男人+女人=皇后”这样的关系。

    在这里插入图片描述

    展开全文
  • 1、word2vector简介 2013年,Google团队发表了word2vec工具。word2vec工具主要包含两...2、词向量 比如有一个城市的词汇表(北京,上海,宁夏,纽约,巴黎,,,,,南京),One-Hot Encoder按照如下方式表示: 杭州

    1、word2vector简介

    2013年,Google团队发表了word2vec工具。word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种高效训练的方法:负采样(negative sampling)和层序softmax(hierarchical softmax)。

    2、词向量

    比如有一个城市的词汇表(北京,上海,宁夏,纽约,巴黎,,,,,南京),One-Hot Encoder按照如下方式表示:

    杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
    
    上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
    
    宁波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]
    
    北京 [1,0,0,0,0,0,0,0,0,……,0,0,0,0,0,0,0]
    

    比如上面的这个例子,在语料库中,杭州、上海、宁波、北京各对应一个向量,向量中只有一个值为1,其余都为0。但是使用One-Hot Encoder有以下几个问题。一方面,城市编码是随机的,向量之间相互独立,看不出城市之间可能存在的关联关系。其次,向量维度的大小取决于语料库中字词的多少。如果将世界所有城市名称对应的向量合为一个矩阵的话,那这个矩阵过于稀疏,并且会造成维度灾难。使用分布式词向量(distributed word Vector Representations)可以有效解决这个问题。Word2Vec可以将One-Hot Encoder转化为低维度的连续值,也就是稠密向量,并且其中意思相近的词将被映射到向量空间中相近的位置。

    分布式词向量是一个固定大小的实数向量,事前确定它的大小比如N=300维或者N=1000维,每个元素都是一个实数,实数的具体值是词库里面每个词通过不同的贡献得来的,所以叫分布式的。而word2vec就是一种学习这个分布式词向量的算法。向量的余弦夹角可以代表词语之间的相似度。这种方法相较于One-hot方式另一个区别是维数下降极多,对于一个10W的词表,我们可以用n维(n可以随意设置,比如:n=10)的实数向量来表示一个词,而One-hot得要10W维。

    3、模型简介

    one-hot向量作为word2vec的输入,通过word2vec训练低维词向量(word embedding)。

    word2vec模型其实就是简单化的神经网络。如图:
    在这里插入图片描述
    输入层:One-Hot Vector
    隐藏层:没有激活函数,也就是线性的单元。
    输出层:维度跟输入层的维度一样,用的是Softmax回归。

    4、CBOW

    CBOW(Continuous Bag-of-Word Model)又称连续词袋模型,是一个三层神经网络。如下图所示,该模型的特点是输入已知上下文,输出对当前单词的预测。如图:
    在这里插入图片描述
    更详细的图:
    在这里插入图片描述
    网络计算步骤:

    1. 输入层:上下文单词的onehot。(假设单词向量空间dim为V,上下文单词个数为C)
    2. 所有onehot分别乘以共享的输入权重矩阵W(W为V*N矩阵,N为自己设定的数,需要初始化权重矩阵W)
    3. 所得的向量 (注意onehot向量乘以矩阵的结果) 相加求平均作为隐层向量, size为1*N.
    4. 乘以输出权重矩阵W’ {N*V}
    5. 得到向量 {1*V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维都代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)
    6. 与true label的onehot做比较,误差越小越好。loss function(一般为交叉熵代价函数)

    说明:w是输入层到隐藏层的权重矩阵,维度是{V*N},W’是隐藏层到输出层的权重矩阵,维度是{N * V}.

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

    看个例子:

    句子:I drink coffee everyday!
    在这里插入图片描述
    softmax公式:
    softmax公式
    这里,drink稀疏的表示[0 1 0 0]经过embedding之后变为了稠密的矩阵[2 2 1].

    5、skip-gram

    Skip-gram与CBOW恰恰相反,即已知当前词语,预测上下文。如图:
    在这里插入图片描述
    详细图:
    在这里插入图片描述

    eg: 句子:“The quick brown fox jumps over lazy dog”,我们设定skip_window的参数,它代表着我们从当前input word的一侧(左边或右边)选取词的数量,设定我们的窗口大小为2(skip_window=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。Training Samples(输入, 输出)。
    在这里插入图片描述
    比如:训练样本取(The,quick),根据句子[The,quick, brown ,fox ,jumps, over,the, lazy, dog],它们被编码成one-hot向量后,The是(1,0,0,0,0,0,0,0,0),quick是(0,1,0,0,0,0,0,0,0)。因此输入是1 * 9维的one-hot向量The(1,0,0,0,0,0,0,0,0),乘以9 * 5(9是单词个数,5是随机取的数字)的输入层到隐藏层的权重矩阵W,得到1 * 5维的隐藏层神经元向量,该神经元向量乘以5 * 9的权重矩阵,得到1*9的向量,对该向量的每个元素值做softmax函数运算,得到另一个1 * 9的向量,该向量的每个值代表每个词的概率,而且之和为1,每个值的大小是什么意思呢?这个向量是the这个词经过训练得到的输出,该输出是一个包含9个概率值分布的向量,向量中的每个概率值代表着对应词汇表中9个单词的概率大小,理想情况是这个向量等于给定的labels向量quick,但由于softmax函数的特性,这种情况永远达不到,所以只能通过反向传播的过程让它们不断逼近。

    具体步骤如下:
    第一步,输入层到隐藏层:
    在这里插入图片描述

    该图输入的The的one-hot向量称为x,乘以9*5维的权重矩阵W,得到5维的隐藏层神经单元,每个值代表一个神经元,看下计算过程,计算后得到的隐藏层神经元的值其实就是W矩阵的第1行。因为每次输入都是像The这样的向量,one-hot向量中第几列值为1,隐藏层就是W矩阵的第几行。因此对任何输入而言,隐藏层就是W矩阵的某一行,所以:每个词的one-hot向量输入到隐藏层后,隐藏层的值就是权重矩阵W某一行的值,该行的值也就是该词的词向量,因此我们要更新迭代的模型就是W矩阵(即每个词的词向量),w矩阵即是我们模型输出的最终结果
    第二步,隐藏层到输出层:
    在这里插入图片描述

    步骤1计算得到的1 * 5维矩阵,作为隐藏层神经元的值[3,0,5,2,4],再乘以一个5 * 9维的权重矩阵Q,得到上述等式右边1 * 9维的矩阵Z[z1,z2,…,z9],对该矩阵的每个值作softmax函数运算,得到Z’[z’1,z’2,…,z’9],其中z’1+z’2+…+z’9 = 1, 这9个z’值,最大那个,就对应着The这个词本应该的输出,而The的labels是quick,quick这个词的one-hot向量为(0,1,0,0,0,0,0,0,0),那么我们训练并且迭代W权重矩阵的目的就是使z’2这个值最大。同理对应其他单词输入输出对(The, brown),(quick,The)等等,采用同样的训练过程,可以不断的调整输入层到隐藏层的W向量9 * 5中每行的值,一共9行9个主要词汇,因此得到9个词向量。

    小结:无论是CBOW还是skip-gram,最终我们需要的是训练出来的输入层到隐藏层的权重矩阵w,w每行对应每个词的词向量。

    6、训练及优化

    在第一部分讲解完成后,我们会发现Word2Vec模型是一个超级大的神经网络(权重矩阵规模非常大)。

    举个栗子,我们拥有10000个单词的词汇表,我们如果想嵌入300维的词向量,那么我们的输入-隐层权重矩阵和隐层-输出层的权重矩阵都会有 10000 x 300 = 300万个权重,在如此庞大的神经网络中进行梯度下降是相当慢的。更糟糕的是,你需要大量的训练数据来调整这些权重并且避免过拟合。百万数量级的权重矩阵和亿万数量级的训练样本意味着训练这个模型将会是个灾难。

    下面主要介绍两种方法优化训练过程。
    1.负采样(negative sampling)
    负采样(negative sampling)解决了这个问题,它是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。至于具体的细节我在这里就不在介绍了。
    2.层序softmax(Hierarchical Softmax)也是解决这个问题的一种方法。

    参考:
    https://blog.csdn.net/lilong117194/article/details/81979522
    https://blog.csdn.net/free356/article/details/79445895
    https://blog.csdn.net/mylove0414/article/details/61616617
    https://blog.csdn.net/yu5064/article/details/79601683
    https://zhuanlan.zhihu.com/p/29020179

    展开全文
  • 详解GloVe词向量模型

    万次阅读 多人点赞 2019-08-04 21:26:52
      词向量的表示可以分成两个大类1:基于统计方法例如共现矩阵、奇异值分解SVD;2:基于语言模型例如神经网络语言模型(NNLM)、word2vector(CBOW、skip-gram)、GloVe、ELMo。   word2vector中的skip-gram模型是...
  • 【NLP】⚠️学不会打我! 半小时学会基本操作 2⚠️词向量模型简介
  • 经典词向量模型总结

    千次阅读 2019-04-01 17:40:22
    目录 一.Word2vec 二、GloVe ...Word2Vec主要有skip-gram和CBOW两种模型。skip-gram是给定input word来预测上下文,比较适合用于大规模的数据集上。cbow是给定上下文,来预测input word,比较...
  • 在使用词向量之前,我们往往用one-hot向量来表示一个字词,这样有两个缺点: ① 维度过大。使用one-hot向量来表示字词,那么一个字词就需要一个词表大小的向量,而NLP任务中的词表往往是上万甚至上百万的,这会极...
  • 词向量模型(word2vec) 详解

    千次阅读 多人点赞 2019-01-16 12:49:28
    觉得挺有意思,于是做了一个实现(可参见[20]),但苦于其中字向量的训练时间太长,便选择使用 word2vec 来提供字向量,没想到中文分词效果还不错,立马对 word2vec 刮目相看了一把,好奇心也随之增长。 后来,...
  • 一、模型 将所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个词语都是独立的。例如上面2个例句,就可以构成一个袋,袋子里包括Jane、wants、to、go、Shenzhen、Bob、Shanghai。假设建立一个数组...
  • 词袋模型和词向量模型

    万次阅读 多人点赞 2016-06-05 19:47:44
    本文简要介绍了词袋模型、词向量模型的原理和应用。
  • 把训练好的词向量模型可视化

    千次阅读 2020-02-19 23:29:14
    意思相近的词语,在向量空间中的距离应该越近...输入是一个训练好的词向量模型。输出是一张图片,把每个词都标记在上面。 from gensim.models import Word2Vec from random import sample from pylab import mpl mod...
  • 本文作者:合肥工业大学 管理学院 钱洋 email:... 未经本人允许禁止转载。论文来源Nguyen D Q, Billingsley R, Du L, et al. Improving topic models with latent feature word representations[J]. Transactions of
  • 训练自己的词向量模型

    千次阅读 2019-03-15 15:55:36
    from:... 一、gensim介绍 gensim是一款强大的自然语言处理工具,里面包括N多常见模型: - 基本的语料处理工具 - LSI - LDA - HDP - DTM - DIM - TF-IDF - word2vec、paragraph2vec...
  • Word2Vec词向量模型代码

    千次阅读 2018-08-31 15:01:27
    Word2Vec也称Word Embedding,中文的叫法是“词向量”或“词嵌入”,是一种计算非常高效的,可以从原始语料中学习字词空间向量的预测模型。Word2Vec可以把一个维数为所有词的数量的高维空间嵌入到一个低维的连续向量...
  • 1.加载模型 w2v=keyedvectors.load_word2vec_format(os.path.join(root_path,"wiki_word2vec_50.bin"),binary=True) 2.查看可以对哪些进行word2vec。 w2v.key_to_index 3.对一个进行word2vec w2v["的"] 4....
  • Glove词向量,内有分别有50、100、200、300维
  • 知乎中文词向量
  • 自然语言词向量模型:Glove和Bert

    千次阅读 2019-06-30 23:13:58
    词向量模型2. Glovebert模型bert模型的使用参考资料 1. 词向量模型 词向量模型包括:word2vec、glove、fastText、elmo、GPT和bert、xlnet等。 这里面有些是“一揽子”表示的词向量模型,如word2vec、glove,是用一...
  •   维基百科中文数据训练word2vec词向量模型——基于gensim库   上文我们使用了 gensim 库中的 Word2vec 模块训练词向量模型,现在我们来用 tensorflow 自己手写代码来训练模型。主要步骤大体如下: 数据准备...
  • 基于gensim训练word2vec词向量模型

    千次阅读 2021-11-16 15:59:43
    构建word2vec模型4.模型训练5.模型保持与加载6.模型使用   gensim是NLP的 1.安装gensim   使用pip安装gensim,如果安装缓慢,建议换个安装源。 pip install gensim 2.数据预处理 2.1jieba分词   利用pandas库...
  • Glove词向量模型笔记

    2019-03-20 09:52:36
    GloVe模型采用了平方损失,并通过词向量拟合预先基于整个数据集计算得到的全局统计信息。 任意词的中心词向量和背景词向量在GloVe模型中是等价的。原因在于Glove模型提出了词频共现矩阵的概念。 但由于初始化值的...
  • 该语言模型是采用gensim库提供的word2vec模型训练而成,训练样本量达12万条博文,该模型能够反映一定的语言规律,因此可以作为日常编程训练使用。 1.调用方法 from gensim.models import word2vec model = word2vec....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,610
精华内容 30,644
关键字:

词向量模型

友情链接: wivise-cursor.rar