CS224N笔记2--词向量

单词的意思

WordNet

通常的解决方案是,采用类似WordNet的资源,这个里面有关于一个单词的同义词和上位词的一个列表

但是这个作为一个资源库,肯定会存在一些问题,比如:

  • 给出的同义词存在细微的差别,比如两个词只有在某一些特定的语境下才是近义词。

  • 或丢失对一个单词新的意思的捕获,除非资源库能实时更新,但是显然这个是不可能的

  • 主观化

  • 需要人来构建资源库并且持续维护

  • 很难准确刻画两个词的相似程度

将单词表述为离散的符号

在传统的自然语言处理中,我们把单词表述为一个一维的词向量。

比如:

1
2
motel = [0 0 0 0 1 0 0 0]
hotel = [0 0 0 1 0 0 0 0]

向量的维度就是字典的大小,单词出现在字典的第几个,这个位置就是1,其他地方是0.

但是这组向量依然是人为制定的,而且也不能很好刻画两个单词直接是不是相似的。

所以需要思考,能不能自己从文本中学习词向量。

从文本中获得单词的表述

核心思想是:一个给定单词的意思是由它的上下文确定的

对于文本中的单词w,他的上下文就是指这个单词周围的单词(有一个固定大小的窗口)

这样通过大量单词w的上下文,就可以构建出单词w的意思。

例如通过上下文信息来表述单词banking

词向量

我们将会构建一个包含程度信息的词向量,这个词向量与和它出现在相同语境中的单词是接近的。

注意在英文表述中,词向量有下面几种表述:word vector ,word emnedding ,wprd representations

Word2vec

概述

Word2vec是一个学习词向量的框架

  • 需要大型的文本语料
  • 字典中的每个单词都被转换成一个向量
  • 遍历文本中的每一个位置,包括一个中心词c和上下文单词o
  • 通过词向量的c与o的相似度来计算o是c上下文的可能性
  • 通过调整词向量是这个可能性达到最大

损失函数

所以损失函数就是

$$J(\theta) = - \frac{1}{T} \sum_{t=1}^{T} \sum_{-m <= j <= m} log P(w_{t+j} |w_{t},\theta)$$

那么怎么计算$P(w_{t+j} | w_{t};\theta)$

对于每个单词w都有两个列向量
$v_{w}$,当w是中心单词的时候,
$u_{w}$,当w是上下文单词的时候

那么对于中心单词c,它的上下文单词是o的概率就是:

$$P(o|c) = \frac{e^{u_{o}^{T}v_{c}}}{ \sum_{w \in V}e^{u_{w}^{T}v_{c}}}$$

如果把这里的$u_{o}^{T}v_{c}$看成一个变量$x_{i}$

那么这个概率可以变成

$$softmax(x_{i}) = \frac{e^{x_{i}}}{ \sum_{j=1}^{n}e^{x_{j}}} = p_{i}$$

这里的softmax函数是一个空间上的映射,从实数空间到概率分布的标准映射方法。
指数函数可以把实数映射成正数,然后归一化得到概率。

之所以为softmax,是因为指数函数会导致较大的数变得更大,小数变得微不足道。

训练模型

定义$\theta$表示模型中的所有参数,我们的例子中是d维的向量和V个单词。


每次单词都包含u和v两个参数,需要通过训练得到模型最优时候的参数

梯度公式

$$\frac{\partial x^{T} a }{\partial x} = \frac{\partial x a^{T}}{\partial x} = a$$

链式法则

$$\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}$$

更多的细节

  • 为什么需要两个向量
    可以更好的优化
  • 两种模型
  1. Skip-grams (SG)
    给定中间词,预测是否是上下文词
  2. Continue Bag of Word (CBOW)
    给定上下文次,预测是否是中心词

梯度下降

这需要是凸函数(Convex Function)

随机梯度下降(Stochatic Gradient Descent)

$J(\theta)$是所有语料窗口的损失函数,所以计算$\nabla_{\theta}J(\theta)$将需要消耗很大的计算,需要很长时间

并且让每个神经元都是最好的参数也不是一个好的主意

所以,我们需要引入随机梯度下降(SGD),不断取样样本,优化模型参数。