1-词的表示

词的表示

自然语言处理中,一个首要解决的任务就是如何合理地表示一个词,将其作为模型的输入。要表示一个词,我们所需要表示出的是词的含义,大多数词仅仅是一种标记符(token),我们需要表示出它所指代的语义。此外,我们希望一个好的词表示方法,能够使我们简单地从表示中得到词语之间的相似性与区别性。

在每一种语言中,我们可以认为词语的数量是无限的,至少是足够大的,但是,我们相信在存在这样一个N维的空间,空间的维度N会远远小于词的数量,就足以编码出语言中的所有的语义信息,在这个词空间的每个维度编码了某种语义信息,例如时态、单复数等。因此,我们希望将这些tokens编码为向量形式,将它们表示为词空间的一些点。

独热编码

独热编码向量(One-Hot Vector)是一种最为简单的词向量表示形式:将每个词表示为一个 R ∣ V ∣ × 1 \mathbb{R}^{|V|\times 1} RV×1的向量,该向量种仅该词索引的对应位置为1,其余均为0。其中 ∣ V ∣ |V| V是单词表的大小,即所有单词的数量。

这种方法的优点是简单又直观,但是它却不具备直接地提供相似性信息的能力,因为所有的词向量都是正交的。此外,由于词的数量 ∣ V ∣ |V| V很大,不能够很好地存储和使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPUO3yfu-1595314538352)(./1-1.png)]

我们将独热编码这类词语表示方法称为指称语义(Denotational Semantics):将实际含义表示为一个符号(一个词或一个独热编码),这种方法是稀疏的且难以判别相似性。

为了解决稀疏性和相似性表示的问题,提出了分布式语义(Distributional Semantics):基于词语通常出现的上下文表示词的含义,这种表示方法是密集的且能够简单地体现相似性。

基于SVD的方法

我们遍历所有的数据集并统计词的共现次数,整理成一个矩阵 X X X,之后我们使用奇异值分解(Singular Value Decomposition,SVD)的方法将其分解为 U S V T USV^T USVT的形式,最终得到的 U U U矩阵的每一行(截断前 k k k个元素)作为每个词的向量表示。我们接下来讨论一些整理 X X X的方法。

Word-Document Matrix

假设:有关联的词语通常出现在相同的文档中。

针对 M M M篇文档,我们可以构建一个 R ∣ V ∣ × M \mathbb{R}^{|V|\times M} RV×M大小的矩阵,对每个出现在文档 j j j中对词 i i i,我们对 X i j X_{ij} Xij+1。

这种方法构建的矩阵依赖于文档的数量,我们可以提出不依赖于文本的方法。

基于窗口的共现矩阵

在这种方法中,我们计算特定词的固定大小的窗口内上下文中出现词的次数,这种方法也可以被称为词-词共现矩阵(Word-Word Matrix)

矩阵元素 X i j X_{ij} Xij是针对某个特定的词 w i w_i wi,在所有的数据中出现 w i w_i wi的固定范围的上下文中,出现词语 w j w_j wj的次数。

上述的两种方法可以构建出足够编码语义和句法信息的词向量表示,但是仍然存在很多人问题:

  • 由于语言的使用中词语的更新很快,矩阵的大小维度是不固定的
  • 由于很多词并不会相互共现,矩阵仍然是十分稀疏的
  • 矩阵的维度很高且训练时间复杂度高,针对 m × n m\times n m×n的矩阵用于进行SVD的时间复杂度达到了 O ( m n 2 ) O(mn^2) O(mn2)的级别
  • 不同的词语在数据中的出现频率是不平衡的,我们需要对词进行平滑

针对一些问题,已经提出了一些解决方法:

  • 忽略一些功能性词语,例如,“的”,“了”
  • 采用坡度窗口,即给不同距离的词的共现计数进行加权
  • 采用皮尔森相关性并且将负值设置为0而不是采用计数值

在下节中提到的迭代的方法也优雅地解决了这些问题。

基于迭代的方法Word2Vec

我们转换思想,不再集中于计算和存储整理数据集的信息,我们迭代训练一个模型,最终使其能够编码一个词在给定上下文信息下的概率。

这种方法设计一个参数为词向量的模型,并使用一个特定的目标训练该模型。每次迭代,我们就计算误差并根据一定的更新规则更新模型参数,最终我们将获得训练好的词向量。这种思想称为反向传播(Backpropagating)

基于这种思想,有很多种方法被提出来,包括用于训练特定任务的词向量和一些其他的模型。我们在这里要介绍的是Word2Vec方法。该模型依赖于一个重要的语言学假设——分布相似性:含义相似的词语拥有相似的上下文。我们需要知道的是,Word2Vec的方法是通过训练未知参数得到的词向量,因此,词向量的各个维度并没有人工规定的含义,我们只关心这种方法所得到的词向量能够在向量空间上代表的语法意义——相似的词具有相近的向量

Word2Vec实际上包含有以下的内容:

  • 两种算法
    • 连续词袋模型 Continuous Bag-Of-Words,CBOW:基于上下文预测中心词
    • Skip-Gram:基于中心词预测上下文的概率分布
  • 两种训练方法:
    • 负采样(Negative Sampling):通过采样负样本定义目标函数
    • 分层Softmax(Hierarchical Softmax):采用有效的树结构计算所有词的概率定义目标函数

语言模型

首先,我们需要建立这样一个模型,它可以为一个输入的符号串打分(计算一个概率值)用于评估输入的符号串是不是一个符合自然语言的句子,这种模型被称为语言模型。在数学上,我们表示为输入 n n n隔词的序列的概率: P ( w 1 , w 2 , . . . , w n ) P(w_1,w_2,...,w_n) P(w1,w2,...,wn)

我们可以采用一元语言模型,也称为Unigram模型的方法,这种方法将输入的序列出现的词视为完全相互独立的词: P ( w 1 , w 2 , . . . , w n ) = ∏ 1 n P ( w i ) P(w_1,w_2,...,w_n)=\prod_1^n P(w_i) P(w1,w2,...,wn)=1nP(wi)

可以看出,Unigram的方法并不合适,因为只考虑每个单词的概率,并不能判断一个序列是否合理,我们知道下一个单词很大程度上取决于之前的序列。因此,我们提出Bigram Model,假设每个词的出现与上一个单词相关: P ( w 1 , w 2 , . . . , w n ) = P ( w 1 ) ∏ 2 n P ( w i ) P(w_1,w_2,...,w_n)=P(w_1)\prod_2^n P(w_i) P(w1,w2,...,wn)=P(w1)2nP(wi)。一对词的条件概率可以采用构建词-词共现矩阵的方法统计计算。

同样的,Bigram仍然具有一定的局限性,如果你愿意,你可以任意扩展为N-gram的模型,但是你需要为此付出相应的计算代价。

CBOW

具体做法如下:

  1. 已知参数 x ∈ R ∣ V ∣ × 1 x\in \mathbb{R}^{|V|\times 1} xRV×1 y ∈ R ∣ V ∣ × 1 y\in \mathbb{R}^{|V|\times 1} yRV×1为one-hot形式,其中, x x x为输入向量,即上下文的one-hot向量; y y y为输出向量,即中心词one-hot向量
  2. 随机初化未知参数 V ∈ R n × ∣ V ∣ , U ∈ R ∣ V ∣ × n \mathcal{V}\in \mathbb{R}^{n\times |V|},\mathcal{U}\in \mathbb{R}^{|V|\times n} VRn×V,URV×n,其中, n n n是我们定义的最终词向量的大小。 v i v_i vi V \mathcal{V} V的一列,表示词作为上下文词向量; u j u_j uj U \mathcal{U} U的一行,表示词作为中心词的词向量。
  3. 为中心词 w c w_c wc构建上下文词袋 ( x c − m , x c − m + 1 , . . . , x c − 1 , x c + 1 , . . . x c + m ) (x_{c-m},x_{c-m+1},...,x_{c-1},x_{c+1},...x_{c+m}) (xcm,xcm+1,...,xc1,xc+1,...xc+m)
  4. 利用词袋构建上下文词向量 v i = V x i ∈ R n × 1 v_i=\mathcal{V}x_i\in \mathbb{R}^{n\times 1} vi=VxiRn×1
  5. 计算上下文词向量的平均值 v ^ = v c − m + . . . , + v c − 1 + v c + 1 + . . . + v c + m 2 m ∈ R n × 1 \hat{v}=\frac{v_{c-m}+...,+v_{c-1}+v_{c+1}+...+v_{c+m}}{2m}\in \mathbb{R}^{n\times 1} v^=2mvcm+...,+vc1+vc+1+...+vc+mRn×1,我们认为 v ^ \hat{v} v^是上下文预测的中心词向量形式
  6. 计算每个词向量作为中心词与预测值的相似性作为得分: z = U v ^ ∈ R ∣ V ∣ z=\mathcal{U}\hat{v}\in \mathbb{R}^{|V|} z=Uv^RV,使用点乘( u T v u^Tv uTv)的原因在于,向量之间的相似性可以由点乘的值进行判断,点乘结果越大,认为两个向量越相似
  7. 使用softmax函数将得分转换为概率值: y ^ = s o f t m a x ( z ) ∈ R ∣ V ∣ \hat{y}=softmax(z)\in \mathbb{R}^{|V|} y^=softmax(z)RV,这就是我们的预测值分布。
  8. 我们需要将预测值的分布 y ^ \hat{y} y^接近于实际值的分布 y y y,采用信息学交叉熵的方法计算两个分布的差异性: H ( y ^ , y ) = − ∑ j = 1 ∣ V ∣ y i log ⁡ ( y ^ j ) H(\hat{y},y)=-\sum_{j=1}^{|V|}y_i\log (\hat{y}_j) H(y^,y)=j=1Vyilog(y^j),当两个分布很相似的时候,交叉熵很小。
  9. 由于我们的实际值 y y y是one-hot形式,因此仅有 y c y_c yc为1,我们的交叉熵化简为 H ( y ^ , y ) = − 1 log ⁡ ( y ^ c ) H(\hat{y},y)=-1\log (\hat{y}_c) H(y^,y)=1log(y^c)

综上,我们可以把目标函数整理为:
m a x m i z e   P ( w c ∣ w c − m , . . . , w c − 1 , w c + 1 , . . . w c + m ) = P ( u c ∣ v ^ ) ⇕ m i n i m i z e   J = H ( y ^ , y ) = − log ⁡ ( y ^ ) = − log ⁡ e x p ( u c T v ^ ) ∑ j = 1 ∣ V ∣ e x p ( u j T v ^ ) = − ( log ⁡ e x p ( u c T v ^ ) − log ⁡ ∑ j = 1 ∣ V ∣ e x p ( u j T v ^ ) ) = − u c T v ^ + log ⁡ ∑ j = 1 ∣ V ∣ e x p ( u j T v ^ ) maxmize\,P(w_c|w_{c-m},...,w_{c-1},w_{c+1},...w_{c+m})=P(u_c|\hat{v})\\ \Updownarrow \\ minimize\,J = H(\hat{y},y) = -\log (\hat{y})\\ = -\log \frac{exp(u_c^T\hat{v})}{\sum_{j=1}^{|V|}exp(u_j^T\hat{v})}\\ = - (\log exp(u_c^T\hat{v})-\log \sum_{j=1}^{|V|}exp(u_j^T\hat{v}))\\ = - u_c^T\hat{v}+\log \sum_{j=1}^{|V|}exp(u_j^T\hat{v}) maxmizeP(wcwcm,...,wc1,wc+1,...wc+m)=P(ucv^)minimizeJ=H(y^,y)=log(y^)=logj=1Vexp(ujTv^)exp(ucTv^)=(logexp(ucTv^)logj=1Vexp(ujTv^))=ucTv^+logj=1Vexp(ujTv^)
最后,我们通过随机梯度下降(SGD)的方法更新这些参数,我们这里推导相应的微分。
∂ ∂ u i log ⁡ ∑ e x p ( u j T v ^ ) = 1 ∑ e x p ( u j T v ^ ) ∂ ∂ u i ∑ e x p ( u j T v ^ ) ( chain   rule ) = 1 ∑ ∑ ∂ ∂ u i e x p ( u j T v ^ ) = 1 ∑ ∑ e x p ( u j T v ^ ) ∂ ∂ u i u j T v ^ ( chain   rule ) = 1 ∑ ∑ e x p ( u i T v ^ ) ∂ ∂ u i u i T v ^ = 1 ∑ e x p ( u i T v ^ ) v ^ = e x p ( u i T ) v ^ ∑ j = 1 ∣ V ∣ e x p ( u j T v ^ ) v ^ = P ( u i ∣ v ^ ) v ^ \frac{\partial}{\partial u_i} \log \sum exp(u_j^T\hat{v}) = \frac{1}{\sum exp(u_j^T\hat{v})} \frac{\partial}{\partial u_i}\sum exp(u_j^T\hat{v}) (\textbf{chain rule})\\ = \frac{1}{\sum}\sum \frac{\partial}{\partial u_i} exp(u_j^T\hat{v})\\ = \frac{1}{\sum}\sum exp(u_j^T\hat{v})\frac{\partial}{\partial u_i} u_j^T\hat{v} (\textbf{chain rule})\\ = \frac{1}{\sum}\sum exp(u_i^T\hat{v})\frac{\partial}{\partial u_i} u_i^T\hat{v}\\ = \frac{1}{\sum} exp(u_i^T\hat{v})\hat{v}\\ = \frac{exp(u_i^T)\hat{v}}{\sum_{j=1}^{|V|} exp(u_j^T\hat{v})}\hat{v}\\ = P(u_i|\hat{v})\hat{v} uilogexp(ujTv^)=exp(ujTv^)1uiexp(ujTv^)(chain rule)=1uiexp(ujTv^)=1exp(ujTv^)uiujTv^(chain rule)=1exp(uiTv^)uiuiTv^=1exp(uiTv^)v^=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值