CS224N Lecture 1
NLP with Deep Learning - Lecture 1 - Introduction and Word Vectors
Lecture Plan
- The course
- Human language and word meaning
- Word2vec introduction
- Word2vec objective function gradients
- Optimization basics
- Looking at word vectors
How do we represent the meaning of a word?
Definition:meaning
- 一个词、词组等表示的概念
- 一个人想用语言、符号等来表达的想法
- 被表达在作品、艺术等方面的思想
理解意义的最普遍的语言方式(linguistic way) : 语言符号与语言符号的意义的转化
How do we have usable meaning in a computer?
Common NLP solution: WordNet, 一个包含同义词集和上位词(抽象-具体关系"is a" relationships) synonym sets and hypernyms 的列表的辞典
Problems with resources like WordNet
- 作为一个资源是很好的,但忽略了细微差别 (例如proficient被列为good的同义词。但这只在某些上下文中是正确的。)
- 缺少单词的新含义 (难以持续更新,例如 wicked, badass, nifty, wizard, genius, ninja, bombest)
- 主观的
- 需要人类劳动来创造和调整
- 无法计算单词相似度
Representing words as discrete symbols
在传统的NLP中,我们把词语看作离散的符号: hotel, conference, motel —— a localist representation。单词表示成独热向量(one-hot vectors),向量维度=词汇数量(如500,000)。
\[motel = [0\;0\;0\;0\;0\;0\;0\;0\;0\;0\;1\;0\;0\;0\;0] \]\[hotel = [0\;0\;0\;0\;0\;0\;0\;1\;0\;0\;0\;0\;0\;0\;0] \]
Problem with words as discrete symbols
所有向量是正交的。对于独热向量,没有关于相似性概念,并且向量维度过大。(例如:如果用户搜索"Seattle motel",我们想匹配包含"Seattle hotel"的内容,独热向量并没有相似性概念)
Solution:
- 使用类似 WordNet 的工具中的列表,获得相似度,但会因不够完整而失败
- 学习在向量本身中编码相似性
Representing words by their context(上下文)
- Distributional semantics :一个单词的意思是由经常出现在它附近的单词给出的
- "You shall know a word by the company it keeps" (J. R. Firth 1957: 11)
- 现代统计NLP最成功的理念之一
- 当一个单词 \(w\) 出现在文本中时,它的上下文是出现在其附近的一组单词(在一个固定大小的窗口中)。
- 使用 \(w\) 的许多上下文来构建 \(w\) 的表示
Word vectors
我们为每个单词构建一个密集的向量,使其与出现在相似上下文中的单词向量相似,使用向量点积来衡量相似性
词向量word vectors有时被称为词嵌入word embeddings或词表示word representations,它们是分布式表示distributed representation
Word meaning as a neural word vector – visualization
Word2vec: Overview
Word2vec (Mikolov et al. 2013)是一个学习单词向量的框架
Idea:
- 我们有大量的文本 (corpus means 'body' in Latin.)
- 固定词汇表中的每个单词都由一个向量表示
- 文本中的每个位置 \(t\),其中有一个中心词 \(c\) 和上下文(“外部”)单词 \(o\)
- 使用 \(c\) 和 \(o\) 的词向量的相似性来计算给定 \(c\) 的 \(o\) 的概率 (反之亦然)
- 不断调整词向量来最大化这个概率
例如窗口大小 \(j=2\) 时的 \(P(w_{t+j}|w_t)\) 计算过程,center word 分别为 into 和 banking
Word2vec: objective function
对于每个位置 \(t=1,...,T\), 在大小为 \(m\) 的固定窗口内预测上下文单词,给定中心词 \(w_t\)
\[Likelihood=L(\theta)=\prod\limits_{t=1}^{T}\prod\limits_{-m \le j \le m \\ \;\;\;\;j \ne 0}P(w_{t+j}|w_t;\theta) \]目标函数 \(J(\theta)\) (也称代价函数或损失函数) 是 (平均)负对数似然
\[J(\theta)=-\frac{1}{T}logL(\theta)=-\frac{1}{T}\sum\limits_{t=1}^T\sum\limits_{-m \le j \le m \\ \;\;\;\;j \ne 0}logP(w_{t + j}|w_t;\theta) \]log形式将连乘转化为求和,负号将极大化似然率转化为极小化损失函数的等价
最小化目标函数 ? 最大化预测精度
Question: 如何计算 \(P(w_{t + j}|w_t;\theta)\) ?
Answer: 对于每个单词都使用两个向量
\[P(o|c) = \frac{exp(u_o^Tv_c)}{\sum_{w \in V}exp(u_w^Tv_c)} \]
- \(v_w\) 当 \(w\)
- \(u_w\) 当 \(w\) 是上下文词时是中心词时
于是对于一个中心词 \(c\) 和一个上下文词 \(o\):点乘结果越大,向量越相似,归一化后概率越大
Word2vec: prediction function
\[P(o|c) = \frac{exp(u_o^Tv_c)}{\sum_{w \in V}exp(u_w^Tv_c)} \]
- 取 exp 使得任何数为正
- 点积比较 \(o\) 和 \(c\) 的相似性,\(u^Tv = \sum_{i=1}^nu_iv_i\),点积越大,概率越大
- 分母:对整个词汇表进行标准化,得到概率分布
softmax function \(\mathbb{R}^n \rightarrow (0,1)^n\)
将任意值 \(x_i\) 映射到概率分布 \(p_i\)
- max:放大最大的概率
- sofr:仍然为较小的 \(x_i\) 赋予一定概率
- 常用在 DL 中
To train the model: Optimize value of parameters to minimize loss
为了训练模型,我们逐渐调整参数以最小化损失
- \(\theta\):用一个长向量表示所有模型参数,即每个单词的 \(u\) 和 \(v\) 的拼接
- 使用 \(d\) 维向量,词表中共有 \(V\) 个单词
- 每个词有两个向量 \(u\) 和 \(v\)
计算所有向量梯度,通过沿着梯度走来优化这些参数
首先随机初始化 \(u_w\in \mathbb{R}^d\) 和 \(v_w\in \mathbb{R}^d\),之后使用梯度下降法进行更新
\[\frac{\partial}{\partial v_c}logP(o|c)=\frac{\partial}{\partial v_c}log\frac{exp(u_o^Tv_c)}{\sum_{w\in V}exp(u_w^Tv_c)}\\ \qquad \qquad \qquad \qquad \qquad \qquad \ \, = \frac{\partial}{\partial v_c}(log\,exp(u_o^Tv_c) - log\sum_{w\in V}exp(u_w^Tv_c)) \\ \qquad \qquad \qquad \qquad \ \; = \frac{\partial}{\partial v_c}(u_o^Tv_c - log\sum_{w\in V} exp(u_w^Tv_c)) \\ \qquad \qquad \qquad \ = u_o - \frac{\sum_{w\in V}exp(u_w^Tv_c)u_w}{\sum_{w\in V}exp(u_w^Tv_c)} \]重新排列成第一项为真正的上下文单词,第二项为预测的上下文单词的形式
\[\frac{\partial}{\partial v_c}logP(o|c) = u_o - \frac{\sum_{w\in V}exp(u_w^Tv_c)u_w}{\sum_{w\in V}exp(u_w^Tv_c)}\\ \qquad \qquad \qquad \quad \ = u_o - \sum\limits_{w \in V}\frac{exp(u_w^Tv_c)}{\sum_{w \in V}exp(u_w^Tv_c)}u_w\\ \qquad \ \ \ = u_o - \sum\limits_{w \in V}P(w|c)u_w \\ \qquad \quad \ \ = observed - expected\]对 \(u_o\) 进行偏微分,此处 \(u_o\) 是 \(u_{w=o}\),可知:
\[\frac{\partial}{\partial u_o}\sum_{w\in V}u_w^Tv_c=\frac{\partial}{\partial u_o}u_o^Tv_c=\frac{\partial u_o}{\partial u_o}v_c + \frac{\partial v_c}{\partial u_o}u_o = v_c \]计算偏微分:
\[\frac{\partial}{\partial u_o}logP(o|c) = \frac{\partial}{\partial u_o}log\frac{exp(u_o^Tv_c)}{\sum_{w \in V}exp(u_w^Tv_c)}\\ \qquad \qquad \qquad \qquad \qquad \qquad \ = \frac{\partial}{\partial u_o}(log\,exp(u_o^Tv_c) - log\sum\limits_{w \in V}exp(u_w^Tv_c))\\ \qquad \qquad \qquad \qquad \ \ = \frac{\partial}{\partial u_o}(u_o^Tv_c - log\sum\limits_{w \in V}exp(u_w^Tv_c))\\ \qquad \qquad \ \ \ = v_c - \frac{\sum\frac{\partial}{\partial u_o}exp(u_w^Tv_c)}{\sum_{w \in V}exp(u_w^Tv_c)}\\ \qquad \qquad \quad \ \ = v_c - \frac{exp(u_o^Tv_c)}{\sum_{w \in V}exp(u_w^Tv_c)}v_c\\ \ \ \ = v_c - P(o|c)v_c \\ \ \ \ \ \ = (1 - P(o|c))v_c \]当 \(P(o|c)\rightarrow 1\),即通过中心词 \(c\) 可以正确预测上下文词 \(o\),此时不需要调整 \(u_o\),否则,相应调整 \(u_o\)
Gensim word vectors
在这个向量空间中可以进行算数运算,因此提出了下图所示的类比任务,从 "king" 这个词开始,减去一个 "man",加上一个 "woman",询问当前是什么词,得到的结果是 "queen",即男人对应国王就像女人对应王后一样
Lecture Notes: Part I (Word Vectors I: Introduction, SVD and Word2Vec)
Keyphrases: Natural Language Processing. Word Vectors. Singular Value Decomposition. Skip-gram. Continuous Bag of Words(CBOW). Negative Sampling. Hierarchical Softmax. Word2Vec.
概述:这组笔记首先介绍了NLP的概念及其面临的问题。之后继续讨论将单词表示为数字向量的概念。最后,讨论常用的词向量设计方法。
Introduction to Natural Language Processing
What is so special about NLP?
人类语言是一个专门用来表达意义的系统,而不是由任何形式的物理表现产生的,在这方面上,它与视觉或任何其他机器学习任务都有很大不同。
大多数单词只是一个语言学以外的符号:单词是一个映射道所指(signified 想法或事物)的能指(signifier)。
语言的符号可以被编码成几种形式:声音、手势、文字等等,然后通过连续的信号传输给大脑,大脑本身似乎也能以一种连续的方式对这些信号进行解码。
Examples of tasks
自然语言处理有不同层次的任务,从语言处理到语义解释再到语篇处理。自然语言处理的目标是通过设计算法使得计算机能够“理解”语言,从而能够执行某些特定的任务。不同的任务的难度是不同的
Easy
- 拼写检查(Spell Checking)
- 关键词检索(Keyword Search)
- 同义词查找(Finding Synonyms)
Medium
- 解析来网站、文档等的信息(Parsing information from websites, documents, etc)
Hard
- 机器翻译(Machine Translation)
- 语义分析(Semantic Analysis)
- 指代消解(Coreference)
- 问答系统(Question Answering)
How to represent words?
在所有的NLP任务中,第一个也是可以说是最重要的共同点是我们如何将单词表示为任何模型的输入。为了让大多数的自然语言处理任务能有更好的表现,我们首先需要了解单词之间的相似和不同。有了词向量,我们可以很容易地将其编码到向量本身中。
Word Vectors
使用词向量编码单词,\(N\) 维空间足够我们编码语言的所有语义,每一维度都会编码一些我们使用语言传递的信息。简单的one-hot向量无法给出单词间的相似性,我们需要将维度 \(|V|\) 减少至一个低维度的子空间,来获得稠密的词向量,获得词之间的关系。
SVD Based Methods
这是一类找到词嵌入的方法(即词向量),我们首先遍历一个很大的数据集和统计词的共现计数矩阵 \(X\),然后对矩阵 \(X\) 进行 SVD 分解得到 \(USV^T\) 。然后我们使用 \(U\) 的行来作为字典中所有词的词向量。以下讨论矩阵 \(X\) 的几种选择。
Word-Document Matrix
最初的尝试,猜想相关联的单词在同一个文档中会经常出现。例如,"banks" "bonds" "stocks" "moneys"等等,出现在一起的概率会比较高。但是"banks" "octopus" "banana" "hockey"不大可能会连续地出现。根据这个情况来建立一个 Word-Document 矩阵,\(X\) 是按照以下方式构建:遍历数亿的文档和当词 \(i\) 出现在文档 \(j\),我们对 \(X_{ij}\) 加一。这显然是一个很大的矩阵 \(\mathbb{R}^{|V| \times M}\),它的规模是和文档数量 \(M\) 成正比关系。因此可以尝试更好的方法。
Window based Co-occurrence Matrix
同样的逻辑也适用于这里,但是矩阵 \(X\) 存储单词的共现,从而成为一个关联矩阵。在此方法中,我们计算每个单词在特定大小的窗口中出现的次数。我们按照这个方法对语料库中的所有单词进行统计。
- 生成维度为 \(|V| \times |V|\) 的共现矩阵 \(X\)
- 在 \(X\) 上应用 SVD 从而得到 \(X=USV^T\)
- 选择 \(U\) 前 \(k\) 行得到 \(k\) 维的词向量
- \(\frac{\sum_{i=1}^k\sigma_i}{\sum_{i=1}^{|V|}\sigma_i}\) 表示第一个 \(k\) 维捕获的方差量