1. 单词含义的表示

我们如何表示一个单词的意思

下面是意思的定义:

  • 用词语,语句表示的想法或观点
  • 人们使用词汇,符号来表达的想法
  • 在一篇文章和艺术品表达的观点
    最常见的意思语言学表现形式:
  • 符号⟺被标记的观点或者事物= 含义

我们如何在表示可用的单词意思

常见的答案是:使用一个分类系统,例如想WordNet一样,分类系统包含了上义词关系和同义词集合。






我们这种离散表示(discrete representation)方法的缺点

  • 单词数量非常多但是忽视了单词之间的细微差别
    例如同义词:

adept, expert, good, practiced, proficient, skillful?

  • 不能及时更新新单词:

wicked, badass, nifty, crack, ace, wizard, genius, ninja

  • 具有主观性
  • 需要人工创建和调整
  • 很难准确地计算出单词相似性
    绝大数基于规则和统计学建立的NLP工作将单词当作最小单位(atomic symbols):hotel, conference, walk
    但是在向量空间中,单词可以表示为具有1个1和很多0的one-hot向量:



这是一种局部表示(localist representation)

从符号(symbolic)到分布式表示(distributed representations)

符号表示存在自身的一些问题,比如对于web搜索:

  • 如果我们搜索[Dell notebook battery size],我们可能得到含有“Dell laptop battery capacity”的文档
  • 如果我们搜索[Seattle motel],可能匹配到含有“Seattle hotel”的文档。
    但是



查询和文档向量是正交的,所以one-hot向量不能体现出单词的相似性。
因此,我们需要找到一种可以直接用向量编码含义的方法。

基于分布相似性的表示方法

从上下文中推断一个单词的含义



下面是现代统计自然语言处理(NLP)最成功的思想之一:



通过向量定义单词的含义

通过为每个单词类型构建一个密集的向量,我们可以预测其上下文中出现的其他单词。

这些其他单词也是用向量表示,并且是可递归调整的。

学习神经网络词嵌入的基本思想

定义一个可以预测中心词上下文的模型:



所示函数:



其中,在一个很大语料库的不同位置获取上下文(不同的t),不断调整词向量以将损失最小化。

直接学习低维词向量

这种方法不是新颖的,下面是相关的研究论文和深度学习方法:

  • Learning representations by back-propagating errors
    (Rumelhart et al., 1986)
  • A neural probabilistic language model (Bengio et al., 2003)
  • NLP (almost) from Scratch (Collobert & Weston, 2008)
  • A recent, even simpler and faster model:
    word2vec (Mikolov et al. 2013) àintro now

2. Word2Vec的主要思路

一句话总结:

“在每个单词和单词上下文之间进行预测”

  • 两个算法:
  1. Skip-Gram(SG)
    通过给出的中心词来预测上下文(假设单词之间相互独立)
  2. 连续词袋模型(CBOW)
    从上下文中预测中心词(目标词)
  • 两个优化的训练方法:
  1. Hierarchical softmax
  2. Negative sampling(负采样)

Skip-Gram



3. 更多Word2Vec细节

对于每个单词(从1到T),我们预测窗口半径大小为m的上下文词汇。
目标函数:最大化预测中心词的上下文概率。




其中θ表示我们需要优化的所有参数。

目标函数-objective function

  • 术语:Loss function = cost function = objective function
  • 通用的概率分布损失:交叉熵损失(Cross-entropy loss)

Softmax函数:将RV映射到概率分布的标准函数



下面是Skip-Gram的示意图:



4 .梯度的推导

目标函数:



以下面计算概率的公式:



具体的推导过程:







5. 损失/目标函数



梯度下降

-首先, 为了对整个训练数据最小化J(θ),需要计算出所有窗口的梯度

  • 更新每个参数θ
  • 步长为α
  • 对于所有参数θ的矩阵表示:



批梯度下降(Vanilla Gradient Descent Code)



对于一个简单二元凸函数,下面轮廓线显示了目标函数变化:



随机梯度下降法

上面方法有以下弊端:

  • 语料库非常大,具有40B的字符和窗口
  • 每次参数更新需要等待很长时间
  • 对于神经网络的效果很差
    所以我们采用下面的方法: