最近打算入门一下nlp,选择的课程是CS224n: Natural Language Processing with Deep Learning,打算以该课程的课件为脉络来了解nlp领域,本篇博客用来进行学习记录。
Lecture1: Introduction and word vectors
传统的词表示
如何让计算机理解自然语言的含义?
Wordnet
: 包含同义词集和上位词列表的同义词库,通过维护一个分类清晰的庞大词表使计算机能够理解某个单词在语言框架中所处的位置(词性
、含义
、上位词
)。但这样做存在以下问题:- 无法区分词之间的细微差别
- 不够完整,难以保持up-to-date
- 带有主观性
- 依赖于人力构建
- 无法计算词之间的相似度
- 在传统的NLP,我们将单次看作离散的符号,通过one-hot编码的形式来表示每个单词
- 两个不同的词的one-hot表征是彼此正交的,没有办法衡量两个词之间的相似度
- 通过
Wordnet
等词表来获取单词之间的相似度,但仍具有上述问题 - 在向量空间对相似度进行编码
- 通过
- 两个不同的词的one-hot表征是彼此正交的,没有办法衡量两个词之间的相似度
Word vectors
针对如何在向量空间对单词相似度进行编码,后续又有了一系列的工作:
- 分布语义:一个单词的意义是由经常出现在其旁边的单词给出的
- 考虑通过一个单词的上下文来构建该单词的表示
Word vectors/embeddings/representations: 为每个单词找到一个稠密向量表示,使得出现在相似上下文的单词具有相似的向量表示
Word2Vec: Overview
- 有大量单词的文本语料库
- 词汇表中的每个单词都用一个向量(one-hot)表示
- 对于文本中的每个位置,都有一个中心单词$c$和上下文单词集合$\mathbf{o}$
- 考虑使用中心单词$c$的单词向量来预测上下文单词$\mathbf{o}$(反之亦然)
- 调整单词向量使得对上下文/中心向量的预测尽可能准确,最大化$p(\mathbf{o}|t)$
推导
- 似然函数
- 一般进行优化都是最小化负对数似然:
- 条件概率$P(w_{t+j}|w_t;\theta)$:softmax function
- 两种模型
- Skip-gram: 用中间单词来预测上下文
- Continuous Bag of Words(CBOW): 用上下文单词预测中间单词
CBOW
基本思想是用上下文单词来预测中间单词,流程如下:
- 假设词库容量为$V$, 窗口宽度为$m$, embedding维度为$N$, 单个句子$x$, 中心单词位置$c$
- task: $(x{c-m}, x{c-m+1}, … , x{c-1}, x{c+1}, … , x_{c+m}) \rightarrow x_c$
- 2个矩阵
- Embedding mat $W_e \in \mathbb{R}^{V \times N}$
- Predict mat $W_p \in \mathbb{R}^{N \times V}$
- 流程
- 通过$W_e$得到各个单词的embedding $v_i = W_e^Tx_i \in \mathbb{R}^{N \times 1}$(本质上就是抽取了$W_e$的某一行)
- 取平均: $\hat{v} = \frac{v{c-2m} + … + v{c+2m}}{2m}$
- 通过$W_p$得到预测结果: $z = W_p^T \hat{v} \in \mathbb{R}^{V \times 1}$
- 将该预测结果通过softmax函数转换成概率形式: $\hat{y} = softmax(z)$
Skip-Gram Model
基本思想是使用中间单词来预测其上下文单词
- 假设词库容量为$V$, 窗口宽度为$m$, embedding维度为$N$, 单个句子$x$, 中心单词位置$c$
- task: $xc \rightarrow (x{c-m}, x{c-m+1}, … , x{c-1}, x{c+1}, … , x{c+m})$
- 流程: 基本就是CBOW的逆过程
负采样(Negative sampling)
如果不进行优化,那么两种wordvec方法在计算过程中都需要更新词汇表中所有单词用于训练,而对于输出层,正样本其实只对应着极少数的样本,而其余均是大量的负样本(输出结果的one-hot编码不匹配),负采样的直观想法便是随机选择一小部分negative words来更新权重,可以大大提高计算效率
Hierachical softmax
通过分层的形式将一个$V$分类问题变成了$logV$个二分类问题,