CS224n笔记:word2vec(1)

发布时间 2023-11-14 20:20:56作者: 你好,一多

离散语义 (discrete):

每个词都是离散的、正交的,每多一个词,向量都增加一个维度(dimension,dim)
类似于编码,很难描述相关性

分布语义 (distribute):

上下文决定语义,多个词决定一个词
一个词的搭配、上下文、一组词 中来理解词义
哲学意义:

  • 如果一个词不出现在它的上下文上,那么它将毫无意义
  • 不能孤立静止的看待事物
    words that occur in context as vectors
    我们在 real value vector 本身中编码相似性,where we encode similarity in real value vector themselves
    当一个词出现在文本中,他有一个上下文,即一组词

tokens、types

  • token是词本身
  • type是词指代的意义

bank crises,此时是 a token of the word bank
bank 还可以表示 a type which refer to the uses and meanings

分布的语言模型(distributional language model):

将上下文中出现的单词视为向量,并对每个词(each word)建立 密集的实值向量(dense real value vector)

\["banking" = \begin{Bmatrix}0.286\\0.793\\-0.177\\ \cdots 共300维 \\0.271\end{Bmatrix} \]

词嵌入模型

分布式词表示(distributed representation):
神经词表示(neural word representations)、 词嵌入(word embeddings)、词向量(word vectors)
每一个词 == 300 dimensional vector

  • embeddings 的含义是词被嵌入到 300 维的空间中
  • dimensional 的含义是词所在的空间有多少个行 / 正交基

常用词向量设置:每一个词都对应一个 \(300\times1\) 的词向量

想象:有一个坐标系空间,空间里面每一个 都是一个
也就是说每一个词都在这个300维的空间中有一个 坐标 / 向量

二维投影:将300维空间的点投影到2维空间,在这个2维空间中,可以看到意思相近的点聚集在一起

注意:投影 / 降维 会丢失很多信息,也会 错误 真实的空间相邻关系

这个词"banking"是“distributed”而不是“localized”,是因为他是300维向量共同表示的,而不是一个维度独有的

Word2Vec

一个形成、计算词向量的算法,或者说是学习词向量的框架
be introduced at 2013

  • 思路是什么?
    1. 语料库 text corpus
    2. 选定一些常用、难分的词,舍弃罕见词
    3. 为选定词计算出词向量

create vector for each word 找出每个词的好向量

  • From a pile of text
    by doing the distributional simlarity \task\ of being able to predict \what words\ occur in the context of other word (做\任务\,什么任务呢 - 预测\什么词\将出现在其他词的上下文中的任务)
    to 学习这些向量

  • So in particular, iterate through 循环访问 in the texts 在文本中,and so at any moment在任何时候 have a center word C and context words outside of C 有一个\中心词及其之外的上下文(周围的)词(注释:词之间的相似性、词和词围绕在一起)
    we called O (c的上下文词)
    计算上下文词 \O\ 出现的概率 -- 基于当前词向量 (注释:预测 邻近的下一个词)
    不断地调整词向量 - to 最大化概率 -- 什么概率呢 -- 分配给实际出现的词的概率

  • 公式:\(P(w_{t+j}|w_t)\),t 表示 C 的position,j 表示 O 的size

  • 如果能给O更多的概率 -- 通过调整 词向量wv

  • 如何调整词向量达到目的?

  • 做什么 -- to 训练O在C中出现的概率

  • Word2vec: objective function

  • 参数:

    1. m:固定窗口大小
    2. t:C 的位置
    3. j:对窗口 m 遍历的迭代器
    4. T:文本长度、文本次数

Objective func (目标函数)

目标函数 = 似然函数:

\[Objective = Likelihood = L(\theta) \]

\[L(\theta) = \prod_{t=1}^{T} \prod_{m\leq j\leq m, j\neq 0}P(w_{t+j}|w_t;\theta) \]

Loss func (损失函数)

损失函数:

\[J(\theta) = -\frac{1}{T}\log L(\theta)=-\frac{1}{T}\sum_{t=1}^{T} \sum_{-m\leq j\leq m, j\neq 0} \log P(w_{t+j}|w_t;\theta) \]

为什么这样设计损失函数:

  • 目标函数的最优解:最大化似然函数,即:最大化在 中心词周围 看到 它的上下文 的可能性(如果一个词不出现在它的上下文上,那么它将毫无意义
  • 优化计算 -- 对数似然度 (log likelihood),累加更利于 计算、求偏导数,同时除 T 是为了取平均值 -- 为了降低 文本长度 对损失函数的影响;
  • 最小化目标函数:加一个 “-” 号,\(J(\theta)\) 可以最大限度地提高预测的准确性 -- 取负号可以将对数似然函数转化为 \凸函数\,从而使用 \梯度下降\ 等算法进行优化

P(O|C) 和 Softmax(x)

首先,每个词要对应、学习两个词向量,而不是一词对一词向量:

  • when it is C, \(v_w\)
  • when it is O, \(u_w\)

\[P(O|C)=\frac{\exp(u_O^Tv_C)}{\sum_{w\in V}\exp(u^T_wv_C)} \]

\[softmax(x_O)=\frac{\exp(x_O)}{\sum_{w=1}^W\exp(x_w)} \]

  • 注:\(exp(x)\) 等于 \(a^{x}, a \in R\),常见的 \(a\) 的取值是 \(a=e\)
    而实际也是这样:

\[exp(x)=e^{x} \]

list -- V , size=w, 当前迭代元素位置是 O:
对于 \(softmax(x_O)\) 函数:

  • 分子:exp一下当前迭代位置
  • 分母:遍历一遍 list - V,exp 每个迭代位置并求和;

对于 \(P(O|C)\)

  • 分子:exp 一下(当前迭代位置的 \(u\) 向量 \(\times\) C 位置的 \(v\) 向量)
  • 分母:遍历一遍 list - V,
    exp 一下(每个迭代位置的 \(u\) 向量 \(\times\) C 位置的 \(v\) 向量)并求和;

可以理解为:

\[u_{\textcolor{pink}{O}}v_C=x_{\textcolor{pink}{O}},\,\,u_{\textcolor{brown}{w}}v_C=x_{\textcolor{brown}{w}} \]

P(O|C) 的概率分布

\(Softmax(x_O)\) 可以把一组独立变量(这里指词向量)的值映射成一组 \([0,1)\) 的值,并且它们的和 == 1:

  • 也就是说,对于 W 的 独立变量/各个词向量 的 集合 来说,可以通过 Softmax 计算出对 \(u_Ov_C\) 的概率分布

将损失函数展开

\[J(\theta)=上文所写=-\frac{1}{T}\sum_t\sum_j\log P(O|C) \]

\[=-\frac{1}{T}\sum_t\sum_j\log \frac{\exp(u_O^Tv_C)}{\sum_{w\in V}\exp(u^T_wv_C)}\]

\[=-\frac{1}{T}\sum_t\sum_j(\log \exp(u_O^Tv_C)-\log\sum_{w\in V}\exp(u^T_wv_C))\]

求梯度公式

\(J(\theta)\) 求偏导前:

  • 先对 \(\log P\) 求偏导:

\[\frac{\partial}{\partial v_C}\log P = \frac{\partial}{\partial v_C}(\log \exp(u_O^Tv_C)-\log\sum_{w\in V}\exp(u^T_wv_C))\]

\[=\frac{\partial}{\partial v_C}\log \exp(u_O^Tv_C) - \frac{\partial}{\partial v_C}\log\sum_{w\in V}\exp(u^T_wv_C)\\\]

\[ \because exp(x) = e^x\]

\[\therefore原式 = \textcolor{red}{\frac{\partial}{\partial v_C}u_O^Tv_C}- \frac{\partial}{\partial v_C}\log\sum_{w\in V}\exp(u^T_wv_C)\\\]

\[ \because\frac{\partial}{\partial v_C}v_C = 1\]

\[\therefore 原式=\textcolor{red}{u_O} - \frac{\partial}{\partial v_C}\log\sum_{w\in V}\exp(u^T_wv_C)\]

\[ \because 链式法则:log \sim f,\,\,\,\sum\exp \sim g,\,\,\,对f(g(v_C))求导\]

\[\therefore 原式=u_O - \textcolor{red}{\frac{1}{\sum_{m\in V}\exp(u_w^Tv_C)}\frac{\partial}{\partial v_C}\sum_{w\in V}\exp(u_w^Tv_C)}\]

\[=u_O-\frac{1}{\sum_{m\in V}\exp(u_w^Tv_C)}\sum_{w\in V}\frac{\partial}{\partial v_C}\exp(u_w^Tv_C)\]

\[ \because 链式法则:\sum\exp\sim f,\,\,\,\,uv\sim g\]

\[\therefore 原式=u_O - \frac{1}{\sum_{m\in V}\exp(u_w^Tv_C)} \textcolor{red}{\sum_{x\in V}((\frac{\partial}{\partial v_C}u_x^Tv_C)\exp(u_x^Tv_C))}\]

\[=u_O-\frac{\sum_{x\in V}u_x^T\exp(u_x^Tv_C)}{\sum_{m\in V}\exp(u_w^Tv_C)}\]

\[注:此时已经是计算最简形式\]

\[继续化简\]

\[原式=u_O - \sum_{x\in V}\frac{\exp(u_x^Tv_C)}{\sum_{m\in V}\exp(u_w^Tv_C)}u_x\]

\[=u_O - \sum_{x\in V}P(x|C) u_x \]

所以最终的\(\log P\)

\[\log P=u_O-\sum_{x\in V}P(x|C)u_x \]

所以梯度公式:

\[J(\theta)=-\frac{1}{T}\sum_{t=1}^{T}\sum_{-m\leq j\leq m}\log P=-\frac{1}{T}\sum_{t=1}^{T}\sum_{-m\leq j\leq m}(u_O-\sum_{x\in V}P(x|C)u_x) \]

损失函数的时间复杂度

\(O(TmW)\)

Chain Rule: 链式法则

上面求梯度公式的时候用到了链式法则:

\[\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}=\frac{df(u)}{du}\frac{dg(x)}{x} \]

  • 另一种公式形式:
    原函数:\(y=f(u)=f(g(x)),\,u=g(x)\)
    原函数导数:\(y'=f'(g(x))g'(x)\)