CS224N WINTER 2022(一)词向量(附Assignment1答案)
CS224N WINTER 2022(二)反向传播、神经网络、依存分析(附Assignment2答案)
CS224N WINTER 2022(三)RNN、语言模型、梯度消失与梯度爆炸(附Assignment3答案)
CS224N WINTER 2022(四)机器翻译、注意力机制、subword模型(附Assignment4答案)
CS224N WINTER 2022(五)Transformers详解(附Assignment5答案)

序言

  • CS224N WINTER 2022课件可从https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1224/下载,也可从下面网盘中获取:

    https://pan.baidu.com/s/1LDD1H3X3RS5wYuhpIeJOkA
    提取码: hpu3
    

    本系列博客每个小节的开头也会提供该小结对应课件的下载链接。

  • 课件、作业答案、学习笔记(Updating):GitHub@cs224n-winter-2022

  • 关于本系列博客内容的说明

    • 笔者根据自己的情况记录较为有用的知识点,并加以少量见解或拓展延申,并非slide内容的完整笔注;

    • CS224N WINTER 2022共计五次作业,笔者提供自己完成的参考答案,不担保其正确性;

    • 由于CSDN限制博客字数,笔者无法将完整内容发表于一篇博客内,只能分篇发布,可从我的GitHub Repository中获取完整笔记,本系列其他分篇博客发布于(Updating):

      CS224N WINTER 2022(一)词向量(附Assignment1答案)

      CS224N WINTER 2022(二)反向传播、神经网络、依存分析(附Assignment2答案)

      CS224N WINTER 2022(三)RNN、语言模型、梯度消失与梯度爆炸(附Assignment3答案)

      CS224N WINTER 2022(四)机器翻译、注意力机制、subword模型(附Assignment4答案)

      CS224N WINTER 2022(五)Transformers详解(附Assignment5答案)


文章目录

  • 序言
    • lecture 1 词向量
      • slides
      • notes
      • suggested readings
      • gensim word vectors example
      • assignment1 参考答案
    • lecture 2 词向量与单词窗口分类
      • slides
      • notes
      • suggested readings
      • additional readings
      • python review session

lecture 1 词向量

slides

[slides]

  1. 以WordNet为例的词库存在的缺陷:slides p.15

    • 难以辨别单词间细微差别:同义词列表缺少适当性语境范围标注。

    • 缺失单词的最新含义;

    • 编纂具有主观性;

    • 需要耗费人力进行更新与应用;

    • 难以应用于精确计算单词相似度;

  2. 分布语义学(Distributional semantics):slides p.18

    单词含义可由频繁出现在其附近的单词推定,即通过上下文语境来建模单词表示。

  3. Word2Vec(2013年)词向量1模型的思想:slides p.21

    • 已有目标语言的足量语料库与给定的词汇表;

    • 目的是将给定词汇表中的每个单词表示为一个向量;

    • 对于语料库的每一个单词ccc(称为中心词),获取其上下文语境ooo(若干语境词构成);

    • 使用单词ccc的词向量与语境ooo中各个单词的词向量的相似度来计算在给定ccc的条件下出现ooo的概率(或反过来在给定ooo的条件下出现ccc的概率,即mask的思想);

    • 不断调整词向量使得④中的条件概率尽可能的大;

  4. Word2Vec模型的目标函数:slides p.25
    minimize{uwi,vwi}i=1∣v∣J(θ)=−1T∑t=1T∑−m≤j≤m,j≠0log⁡P(wt+j∣wt;θ)(1.1)\text{minimize}_{\{u_{w_i},v_{w_i}\}_{i=1}^{|v|}}\quad J(\theta)=-\frac1T\sum_{t=1}^T\sum_{-m\le j\le m,j\neq0}\log P(w_{t+j}|w_t;\theta)\tag{1.1} minimize{uwi,vwi}i=1vJ(θ)=T1t=1Tmjm,j=0logP(wt+jwt;θ)(1.1)

    其中概率PPP(称为预测函数)的计算方式如下:

    P(o∣c)=exp⁡(uo⊤vc)∑w∈Vexp⁡(uw⊤vc)(1.2)P(o|c)=\frac{\exp(u_o^\top v_c)}{\sum_{w\in V}\exp(u_w^\top v_c)}\tag{1.2} P(oc)=wVexp(uwvc)exp(uovc)(1.2)

    根据assignment2中的说法,这个结果可以理解为是真实的单词概率分布yyy向量与预测的单词概率分布y^\hat yy^向量之间的交叉熵。

    式中变量说明:

    TTT表示语料库规模(即文本长度);

    VVV表示词汇表;

    mmm表示上下文窗口大小;

    wiw_iwi表示在第iii个位置上的单词;

    vwv_wvw表示单词www作为中心词的词向量;

    uwu_wuw表示单词www作为语境词的词向量;

    θ\thetaθ表示超参数;

    Word2Vec模型中每个单词都有两个词向量,最终将两个词向量取均值作为模型输出的词向量。

    因此式(1.1)(1.1)(1.1)中决策变量总数为2d∣V∣2d|V|2dV,其中ddd为给定的词向量嵌入维度。

    由于变量数量非常多,因此通常选择随机梯度下降法求解Word2Vec模型。

  5. Word2Vec模型预测函数偏导结果的重要意义:slides p.29-32
    ∂P(o∣c)∂vc=∂∂vclog⁡exp⁡(uo⊤vc)∑w∈Vexp⁡(uw⊤vc)=∂∂vclog⁡exp⁡(uo⊤vc)−∂∂vclog⁡(∑w∈Vexp⁡(uw⊤vc))=∂∂vcuo⊤vc−1∑w∈Vexp⁡(uw⊤vc)⋅∂∂vc∑x∈Vexp⁡(ux⊤vc)=uo−1∑w∈Vexp⁡(uw⊤vc)⋅∑x∈V∂∂vcexp⁡(ux⊤vc)=uo−1∑w∈Vexp⁡(uw⊤vc)⋅∑x∈Vexp⁡(ux⊤vc)∂∂vcux⊤vc=uo−1∑w∈Vexp⁡(uw⊤vc)∑x∈Vexp⁡(ux⊤vc)ux=uo−∑x∈Vexp⁡(ux⊤vc)∑w∈Vexp⁡(uw⊤vc)ux=uo−∑x∈VP(x∣c)ux=observed−expected(1.3)\begin{aligned} \frac{\partial P(o|c)}{\partial v_c}&=\frac{\partial}{\partial v_c}\log\frac{\exp(u_o^\top v_c)}{\sum_{w\in V}\exp(u_w^\top v_c)}\\ &=\frac{\partial}{\partial v_c}\log\exp(u_o^\top v_c)-\frac{\partial}{\partial v_c}\log\left(\sum_{w\in V}\exp(u_w^\top v_c)\right)\\ &=\frac{\partial}{\partial v_c}u_o^\top v_c-\frac{1}{\sum_{w\in V}\exp(u_w^\top v_c)}\cdot\frac{\partial}{\partial v_c}\sum_{x\in V}\exp(u_x^\top v_c)\\ &=u_o-\frac{1}{\sum_{w\in V}\exp(u_w^\top v_c)}\cdot\sum_{x\in V}\frac{\partial}{\partial v_c}\exp(u_x^\top v_c)\\ &=u_o-\frac{1}{\sum_{w\in V}\exp(u_w^\top v_c)}\cdot\sum_{x\in V}\exp(u_x^\top v_c)\frac{\partial}{\partial v_c}u_x^\top v_c\\ &=u_o-\frac{1}{\sum_{w\in V}\exp(u_w^\top v_c)}\sum_{x\in V}\exp(u_x^\top v_c)u_x\\ &=u_o-\sum_{x\in V}\frac{\exp(u_x^\top v_c)}{\sum_{w\in V}\exp(u_w^\top v_c)}u_x\\ &=u_o-\sum_{x\in V}P(x|c)u_x\\ &=\text{observed}-\text{expected} \end{aligned}\tag{1.3} vcP(oc)=vclogwVexp(uwvc)exp(uovc)=vclogexp(uovc)vclog(wVexp(uwvc))=vcuovcwVexp(uwvc)1vcxVexp(uxvc)=uowVexp(uwvc)1xVvcexp(uxvc)=uowVexp(uwvc)1xVexp(uxvc)vcuxvc=uowVexp(uwvc)1xVexp(uxvc)ux=uoxVwVexp(uwvc)exp(uxvc)ux=uoxVP(xc)ux=observedexpected(1.3)
    求解式(1.1)(1.1)(1.1)时通常使用梯度下降法,需要计算预测函数PPP的梯度。从式(1.3)(1.3)(1.3)可以看出,偏导值的意义是观测值(即观测到的中心词词向量)与期望值(根据上下文推断的词向量)的差值。

  6. Word2Vec模型的变体:slides p.42

    • Skip-grams(SG):给定中心词来预测语境词的分布概率;

    • Continuous Bag of Words(CBOW):通过词袋形式的语境词来预测中心词的分布概率;

    关于这两个模型详看本节notes部分第2点的相关内容。

notes

[notes]

  1. 基于奇异值分解的词向量建模方法:notes p.3-5

    基本思想是通过构建与词汇表相关的矩阵X∈R∣V∣×nX\in\R^{|V|\times n}XRV×nVVV为词汇表),进行奇异值分解X=UDW⊤X=UDW^\topX=UDW后,将左奇异向量矩阵U∈R∣V∣×kU\in\R^{|V|\times k}URV×k作为词向量输出。其中kkk的取值可以通过主奇异值占比进行划定:
    ∑i=1kσi∑i=1∣V∣σi(1.4)\frac{\sum_{i=1}^k\sigma_i}{\sum_{i=1}^{|V|}\sigma_i}\tag{1.4} i=1Vσii=1kσi(1.4)
    一些常用的矩阵XXX构建:

    • 单词—文档矩阵,其中XijX_{ij}Xij表示单词iii在文档jjj中的出现次数;

    • 基于窗口的共现矩阵,其中XijX_{ij}Xij表示单词iii与单词jjj在指定窗口大小下同时出现的次数;

    奇异值方法可能存在的问题:

    • 矩阵XXX维度可能会经常变化(新单词新文档经常会出现);
    • 矩阵XXX极度稀疏;
    • 矩阵XXX维度极大;
    • 奇异值分解本身计算复杂度较高;
    • 为平衡单词出现频数,往往需要对矩阵XXX进行针对性处理(incorporation of some hacks);

    缓解上述问题的一些常用方法:

    • 去除停用词;
    • 基于窗口的共现矩阵方法中,出现次数可以根据单词距离进行加权(即距离越远,权重越低);
    • 使用皮尔森相关性并设置负采样;我理解负采样可以缓解稀疏的问题,如两个单词不共现可以赋负值
  2. 基于迭代的方法:notes p.6-14

    • 语言模型(LM):预测文本整体出现的概率。

      Unigram模型:
      P(w1,w2,...,wn)=∏i=2nP(wi)(1.5)P(w_1,w_2,...,w_n)=\prod_{i=2}^nP(w_i)\tag{1.5} P(w1,w2,...,wn)=i=2nP(wi)(1.5)
      Bigram模型:
      P(w1,w2,...,wn)=∏i=2nP(wi∣wi−1)(1.6)P(w_1,w_2,...,w_n)=\prod_{i=2}^nP(w_i|w_{i-1})\tag{1.6} P(w1,w2,...,wn)=i=2nP(wiwi1)(1.6)

    • 连续词袋模型(CBOW):根据上下文预测中心词,类似词袋模型,但是使用连续向量表示,因而得名。

      标记定义:

      • nnn:词向量维度;

      • vwv_wvw:输入向量,即www作为语境词时的词向量;

      • uwu_wuw:输出向量,即www作为中心词时的词向量;

      • V∈Rn×∣V∣\mathcal{V}\in\R^{n\times|V|}VRn×V:输入单词的嵌入矩阵,viv_ivi表示第iii列(单词wiw_iwi的输入向量);

      • U∈R∣V∣×n\mathcal{U}\in\R^{|V|\times n}URV×n:输出单词的嵌入矩阵,uiu_iui表示第iii行(单词wiw_iwi的输出向量);

      模型用法:

      ① 对输入的上下文构建one-hot词向量:x(c−m),...,x(c−1),x(c+1),...,x(c+m)∈R∣V∣x^{(c-m)},...,x^{(c-1)},x^{(c+1)},...,x^{(c+m)}\in\R^{|V|}x(cm),...,x(c1),x(c+1),...,x(c+m)RV

      ② 将(1.7)(1.7)(1.7)中的one-hot词向量转换为输入向量:Vx(c−m),...,Vx(c+m)∈Rn\mathcal{V}x^{(c-m)},...,\mathcal{V}x^{(c+m)}\in\R^nVx(cm),...,Vx(c+m)Rn

      ③ 将(1.8)(1.8)(1.8)中的上下文输入向量取均值:
      v^=12m∑−m≤i≤m,i≠0Vx(c+i)∈Rn(1.7)\hat v=\frac1{2m}\sum_{-m\le i\le m,i\neq0}\mathcal{V}x^{(c+i)}\in\R^n\tag{1.7} v^=2m1mim,i=0Vx(c+i)Rn(1.7)
      ④ 生成得分向量:z=Uv^∈R∣V∣z=\mathcal{U}\hat v\in\R^{|V|}z=Uv^RV

      ⑤ 转为softmax概率分布向量(即得到中心词的概率分布):y^=softmax(z)∈R∣V∣\hat y=\text{softmax}(z)\in\R^{|V|}y^=softmax(z)RV

      ⑥ 我们期望生成的概率分布y^\hat yy^能够匹配真实的概率分布yyy(可以统计全语料库得到);

      现在的问题是需要已知U\mathcal{U}UV\mathcal{V}V才能进行上述应用,因此需要定义目标函数来学习两个词嵌入矩阵:
      minimizeJ=−log⁡P(wc∣wc−m,...,wc−1,wc+1,...,wc+m)=−log⁡P(uc∣v^)=−log⁡exp⁡(uc⊤v^)∑j=1∣V∣exp⁡(uj⊤v^)=−uc⊤v^+log⁡∑j=1∣V∣exp⁡(uj⊤v^)(1.8)\begin{aligned} \text{minimize}\quad J&=-\log P(w_c|w_{c-m},...,w_{c-1},w_{c+1},...,w_{c+m})\\ &=-\log P(u_c|\hat v)\\ &=-\log \frac{\exp(u_c^\top\hat v)}{\sum_{j=1}^{|V|}\exp(u_j^\top \hat v)}\\ &=-u_c^\top\hat v+\log\sum_{j=1}^{|V|}\exp(u_j^\top\hat v) \end{aligned}\tag{1.8} minimizeJ=logP(wcwcm,...,wc1,wc+1,...,wc+m)=logP(ucv^)=logj=1Vexp(ujv^)exp(ucv^)=ucv^+logj=1Vexp(ujv^)(1.8)
      这里将v^\hat vv^视为上下文的一个表示,这种近似处理显然是很不精准的,但是可以得到可以简明求解的显式目标函数。

    • Skip-Gram模型(SG):根据中心词预测上下文。

      标记定义:

      • nnn:词向量维度;

      • vwv_wvw:输入向量,即www作为语境词时的词向量;

      • uwu_wuw:输出向量,即www作为中心词时的词向量;

      • V∈Rn×∣V∣\mathcal{V}\in\R^{n\times|V|}VRn×V:输入单词的嵌入矩阵,viv_ivi表示第iii列(单词wiw_iwi的输入向量);

      • U∈R∣V∣×n\mathcal{U}\in\R^{|V|\times n}URV×n:输出单词的嵌入矩阵,uiu_iui表示第iii行(单词wiw_iwi的输出向量);

      模型用法:

      ① 生成中心词的one-hot向量:x∈R∣V∣x\in \R^{|V|}xRV

      ② 转换为中心词的输入向量:vc=Vx∈Rnv_c=\mathcal{V}x\in\R^nvc=VxRn

      ③ 生成得分向量:z=Uvc∈R∣V∣z=\mathcal{U}v_c\in\R^{|V|}z=UvcRV

      ④ 转换为softmax概率分布向量(即上下文的概率分布):y^=sofmax(z)∈R∣V∣\hat y=\text{sofmax}(z)\in\R^{|V|}y^=sofmax(z)RV

      ⑤ 这里y^c−m,...y^c−1,y^c+1,...,y^c+m\hat y_{c-m},...\hat y_{c-1},\hat y_{c+1},...,\hat y_{c+m}y^cm,...y^c1,y^c+1,...,y^c+m分别对应上下文各个位置单词的概率分布;

      ⑥ 我们同样期望它与真实分布接近;

      这里课件里可能写错,感觉应该要生成2m2m2m个得分向量才行,不然有些说不通。

      同样需要定义目标函数来计算U\mathcal{U}UV\mathcal{V}V
      minimizeJ=−log⁡P(wc−m,...,w(c−1),w(c+1),...,w(c+m)∣wc)=−log⁡∏j=0,j≠m2mP(wc−m+j∣wc)=−log⁡∏j=0,j≠m2mP(uc−m+j∣vc)=−log⁡∏j=0,j≠m2mexp⁡(uc−m+j⊤vc)∑k=1∣V∣exp⁡(uk⊤vc)=−∑j=0,j≠m2muc−m+j⊤vc+2mlog⁡∑k=1∣V∣exp⁡(uk⊤vc)(1.9)\begin{aligned} \text{minimize}\quad J&=-\log P(w_{c-m},...,w_{(c-1)},w_{(c+1)},...,w_{(c+m)}|w_c)\\ &=-\log\prod_{j=0,j\neq m}^{2m}P(w_{c-m+j}|w_c)\\ &=-\log\prod_{j=0,j\neq m}^{2m}P(u_{c-m+j}|v_c)\\ &=-\log\prod_{j=0,j\neq m}^{2m}\frac{\exp(u^{\top}_{c-m+j}v_c)}{\sum_{k=1}^{|V|}\exp(u_k^\top v_c)}\\ &=-\sum_{j=0,j\neq m}^{2m}u_{c-m+j}^\top v_c+2m\log\sum_{k=1}^{|V|}\exp(u_k^\top v_c) \end{aligned}\tag{1.9} minimizeJ=logP(wcm,...,w(c1),w(c+1),...,w(c+m)wc)=logj=0,j=m2mP(wcm+jwc)=logj=0,j=m2mP(ucm+jvc)=logj=0,j=m2mk=1Vexp(ukvc)exp(ucm+jvc)=j=0,j=m2mucm+jvc+2mlogk=1Vexp(ukvc)(1.9)
      这里同样做近似处理,其实本质上是交叉熵损失。

    • 负采样(suggested readings的第2篇paper):CBOW与SG的目标函数求解计算复杂度太高。

      因此每一步迭代无需遍历整个词汇表,只需采样若干负样本。

      具体而言,以SG模型为例,(w,c)(w,c)(w,c)是一组中心词www与上下文cccDDD是正语料库,D~\tilde DD~是负语料库(可以理解为假数据,即不是人话的语料),定义:

      P(D=1∣w,c)P(D=1|w,c)P(D=1w,c)(w,c)(w,c)(w,c)出现在语料库中的概率;

      P(D=0∣w,c)P(D=0|w,c)P(D=0w,c)(w,c)(w,c)(w,c)没有出现在语料库中的概率;

      则可以利用激活函数建模:
      P(D=1∣w,c,θ)=σ(vc⊤vw)=11+e−vc⊤vwP(D=0∣w,c,θ)=1−σ(vc⊤vw)=11+evc⊤vw(1.10)\begin{aligned} P(D=1|w,c,\theta)&=\sigma(v_c^\top v_w)=\frac1{1+e^{-v_c^\top v_w}}\\ P(D=0|w,c,\theta)&=1-\sigma(v_c^\top v_w)=\frac1{1+e^{v_c^\top v_w}} \end{aligned}\tag{1.10} P(D=1w,c,θ)P(D=0w,c,θ)=σ(vcvw)=1+evcvw1=1σ(vcvw)=1+evcvw1(1.10)
      最大似然法求解参数θ\thetaθ
      θ=argmaxθ∏(w,d)∈DP(D=1∣w,c,θ)∏(w,d)∈D~P(D=0∣w,c,θ)=argmaxθ∑(w,c)∈Dlog⁡11+exp⁡(−uw⊤vc)+∑(w,c)∈D~log⁡11+exp⁡(uw⊤vc)(1.11)\begin{aligned} \theta&=\text{argmax}_\theta\prod_{(w,d)\in D}P(D=1|w,c,\theta)\prod_{(w,d)\in\tilde D}P(D=0|w,c,\theta)\\ &=\text{argmax}_\theta\sum_{(w,c)\in D}\log\frac{1}{1+\exp(-u_w^\top v_c)}+\sum_{(w,c)\in\tilde D}\log\frac{1}{1+\exp(u_w^\top v_c)} \end{aligned}\tag{1.11} θ=argmaxθ(w,d)DP(D=1w,c,θ)(w,d)D~P(D=0w,c,θ)=argmaxθ(w,c)Dlog1+exp(uwvc)1+(w,c)D~log1+exp(uwvc)1(1.11)
      对于SG模型,负采样的目标函数(给定中心词ccc,观测到上下文位置c−m+jc-m+jcm+j单词)发生变化:
      −uc−m+j⊤vc+log⁡∑k=1∣V∣exp⁡(uk⊤vc)⟶−log⁡σ(uc−m+j⊤vc)−∑k=1Klog⁡σ(−u~kvc)(1.12)-u_{c-m+j}^\top v_c+\log \sum_{k=1}^{|V|}\exp(u_k^\top v_c)\longrightarrow-\log\sigma(u_{c-m+j}^\top v_c)-\sum_{k=1}^K\log \sigma(-\tilde u_{k}v_c)\tag{1.12} ucm+jvc+logk=1Vexp(ukvc)logσ(ucm+jvc)k=1Klogσ(u~kvc)(1.12)
      对于CBOW模型,负采样的目标函数(给定上下文v^\hat vv^,观测中心词ucu_cuc)发生变化:
      −uc⊤v^+log⁡∑j=1∣V∣exp⁡(uj⊤v^)⟶−log⁡σ(uc⊤v^)−∑k=1Klog⁡σ(−u~k⊤v^)(1.13)-u_c^\top\hat v+\log\sum_{j=1}^{|V|}\exp(u_j^\top\hat v)\longrightarrow -\log\sigma(u_c^\top \hat v)-\sum_{k=1}^K\log\sigma(-\tilde u_k^\top \hat v)\tag{1.13} ucv^+logj=1Vexp(ujv^)logσ(ucv^)k=1Klogσ(u~kv^)(1.13)
      其中{u~∣k=1,...,K}\{\tilde u|k=1,...,K\}{u~k=1,...,K}采样自噪声分布Pn(w)P_n(w)Pn(w)

    • 分层softmax(suggested readings的第2篇paper):

      这个感觉不是很重要,我理解是softmax向量可能太长,因此可以分层处理,如每次计算两分类的概率分布,以二叉树的形式不断累进,于是复杂度可以由O(∣V∣)O(|V|)O(V)变为O(log⁡∣V∣)O(\log |V|)O(logV)

suggested readings

两篇推荐阅读都是2013年的paper:

第一篇首次提出Skip-Gram模型CBOW模型(Efficient Estimation of Word Representations in Vector Space)

第二篇首次提出负采样分层softmax的概念(Distributed Representations of Words and Phrases and their Compositionality)

理论内容大部分已在slides与notes部分详细阐述(在lecture2中也有对这两篇paper的内容有所提及),简单记录要点:

  1. 关于负采样的统计概念是噪声对比估计(Noise Contrastive Estimation);

  2. 高频单词的欠采样(Subsample):定义单词wiw_iwi的采样概率为
    P(wi)=1−tf(wi)(1.14)P(w_i)=1-\sqrt{\frac t{f(w_i)}}\tag{1.14} P(wi)=1f(wi)t

    (1.14)
    其中,f(wi)f(w_i)f(wi)为单词wiw_iwi的频数,ttt为给定的阈值,量级通常为10−510^{-5}105

    去除停用词可以视为是一种特殊的欠采样

  3. SG模型的负采样全局目标函数为(对比式(1.12)(1.12)(1.12)):
    maximizeJ(θ)=1T∑t=1TJt(θ)(1.15)\text{maximize}\quad J(\theta)=\frac1T\sum_{t=1}^TJ_t(\theta)\tag{1.15} maximizeJ(θ)=T1t=1TJt(θ)(1.15)
    其中:
    Jt(θ)=log⁡σ(uo⊤vc)+∑i=1kEj∼P(w)log⁡σ(−uk⊤vc)(1.16)J_{t}(\theta)=\log\sigma(u_o^\top v_c)+\sum_{i=1}^k\mathbb{E}_{j\sim P(w)}\log\sigma(-u_k^\top v_c)\tag{1.16} Jt(θ)=logσ(uovc)+i=1kEjP(w)logσ(ukvc)(1.16)
    或者更贴近assignment2的写法是:
    Jneg-sample(uo,vc,U)=−log⁡σ(uo⊤vc)−∑k∈{Ksampled indices}log⁡σ(−uk⊤vc)(1.17)J_{\text{neg-sample}}(u_o,v_c,\mathcal{U})=-\log\sigma(u_o^\top v_c)-\sum_{k\in\{K\text{ sampled indices}\}}\log\sigma(-u_k^\top v_c)\tag{1.17} Jneg-sample(uo,vc,U)=logσ(uovc)k{Ksampled indices}logσ(ukvc)(1.17)
    即采样KKK个负样本(利用单词的分布概率),最大化真实的上下文单词出现的概率,最小化中心词附近出现随机单词(负样本)的概率。(注意负样本的词向量在σ\sigmaσ函数中取的是负值)

    这里很tricky的事情是,作者提出采用Unigram分布概率(即单个单词的分布概率)U(w)U(w)U(w)3/43/43/4次方,即负采样概率为P(w)=CU(w)3/4P(w)=CU(w)^{3/4}P(w)=CU(w)3/4CCC为概率正则化系数,确保总概率为一),他们声称这种负采样方式是非常有效的,因为可以使得低频词能够更多的被采样到。

gensim word vectors example

[code] [[preview](http://web.stanford.edu/class/cs224n/materials/Gensim word vector visualization.html)]

关于Gensim库对GloVe词向量可视化的小demo,可作入门学习使用。

其中使用的GloVe词向量项目主页可见https://nlp.stanford.edu/projects/glove/。

demo中使用的GloVe.6B可以从https://nlp.stanford.edu/data/glove.6B.zip处下载得到。

demo中最后使用PCA对给定集合的单词词向量进行降维后取前二的主成分值在二维平面上进行可视化,近似刻画单词之间的距离。

import numpy as np# Get the interactive Tools for Matplotlib
%matplotlib notebook
import matplotlib.pyplot as plt
plt.style.use('ggplot')from sklearn.decomposition import PCAfrom gensim.test.utils import datapath, get_tmpfile
from gensim.models import KeyedVectors
from gensim.scripts.glove2word2vec import glove2word2vecglove_file = datapath('/Users/manning/Corpora/GloVe/glove.6B.100d.txt')
word2vec_glove_file = get_tmpfile("glove.6B.100d.word2vec.txt")
glove2word2vec(glove_file, word2vec_glove_file)model = KeyedVectors.load_word2vec_format(word2vec_glove_file)
model.most_similar('obama')
model.most_similar('banana')
model.most_similar(negative='banana')result = model.most_similar(positive=['woman', 'king'], negative=['man'])
print("{}: {:.4f}".format(*result[0]))def analogy(x1, x2, y1):result = model.most_similar(positive=[y1, x2], negative=[x1])return result[0][0]analogy('japan', 'japanese', 'australia')
analogy('australia', 'beer', 'france')
analogy('obama', 'clinton', 'reagan')
analogy('tall', 'tallest', 'long')
analogy('good', 'fantastic', 'bad')
print(model.doesnt_match("breakfast cereal dinner lunch".split()))def display_pca_scatterplot(model, words=None, sample=0):if words == None:if sample > 0:words = np.random.choice(list(model.vocab.keys()), sample)else:words = [ word for word in model.vocab ]word_vectors = np.array([model[w] for w in words])twodim = PCA().fit_transform(word_vectors)[:,:2]plt.figure(figsize=(6,6))plt.scatter(twodim[:,0], twodim[:,1], edgecolors='k', c='r')for word, (x,y) in zip(words, twodim):plt.text(x+0.05, y+0.05, word)display_pca_scatterplot(model, ['coffee', 'tea', 'beer', 'wine', 'brandy', 'rum', 'champagne', 'water','spaghetti', 'borscht', 'hamburger', 'pizza', 'falafel', 'sushi', 'meatballs','dog', 'horse', 'cat', 'monkey', 'parrot', 'koala', 'lizard','frog', 'toad', 'monkey', 'ape', 'kangaroo', 'wombat', 'wolf','france', 'germany', 'hungary', 'luxembourg', 'australia', 'fiji', 'china','homework', 'assignment', 'problem', 'exam', 'test', 'class','school', 'college', 'university', 'institute'])display_pca_scatterplot(model, sample=300)

assignment1 参考答案

[code] [preview]

Assignment1参考答案:囚生CYのGitHub Repository

可将nltk_data下载至本地,GitHub@NLTK链接中的package文件夹即为nltk_data(如果GitHub下载太慢可自行搜索网盘资源),下载后将package文件夹名称重命名为nltk_data,并设置NLTK_DATA环境变量为nltk_data文件夹以便于使用(如若不想设置环境变量可以将nltk_data文件夹移动到任意磁盘的根目录下,nltk工具包默认会搜索这些路径,如D:/nltk_data)。

注意package文件夹下所有的语料、分词器、模型等文件都已打包,如若需要使用通常需要对指定的压缩包进行解压,如assignment1中使用到的reuters语料,需要提前将corpora目录下的reuters.zip解压到当前文件夹才能正常使用。

此外建议下载GloVe词向量(https://nlp.stanford.edu/projects/glove/)至本地,JupyterNotebook中的已作相关注释,注意查阅。

笔者使用的gensim版本3.8.1,经验上感觉gensim4.x.x版本与gensim3.x.x版本差别较大(比如gensim4.x.x版本完全找不到BM25算法的接口),建议尽量使用3.x.x版本。


lecture 2 词向量与单词窗口分类

slides

[slides]

  1. **直接在原始的共线计数(co-occurence counts)上进行奇异值分解效果会很差!**slide p.18

    比如LSA话题模型(使用单词—文档矩阵),会先将单词—文档矩阵中统计得到的频数使用TFIDF算法转化为TFIDF的指标值,然后再进行奇异值分解。

    理论解释是频数的分布过于离散,可以使用一些方法先将它们映射到某个固定区间上,如可以取对数,设定最大限值,去除高频停用词等。

  2. 两类词向量对比:slides p.20

    • 基于计数方法的词向量(如LSA模型):实现简单快速,但仅仅捕获单词相似性,应用效果不好。
    • 基于直接预测的词向量(如CBOW模型):相对训练较慢,但可以捕获复杂的语义模式,应用效果更好。
  3. 对数双线性模型:slides p.23
    wi⋅wj=log⁡P(i∣j)wx⋅(wa−wb)=log⁡P(x∣a)P(x∣b)(2.1)w_i\cdot w_j=\log P(i|j)\\ w_x\cdot(w_a-w_b)=\log\frac{P(x|a)}{P(x|b)}\tag{2.1} wiwj=logP(ij)wx(wawb)=logP(xb)P(xa)(2.1)
    这个类似知识图谱中基于语义的知识表示方法,旨在使训练得到的词向量能够近似满足单词实际的共现概率。

  4. GloVe词向量模型(suggested readings第1篇paper)GloVe: Global Vectors for Word Representation (Pennington et al., EMNLP 2014):slides p.24

    使用的思想即为式(2.1)(2.1)(2.1)所示,具体而言。目标函数为:
    J=∑i,j=1∣V∣f(Xij)(wi⊤w~j+bi+b~j−log⁡Xij)2(2.2)J=\sum_{i,j=1}^{|V|}f(X_{ij})(w_i^\top\tilde w_j+b_i+\tilde b_j-\log X_{ij})^2\tag{2.2} J=i,j=1Vf(Xij)(wiw~j+bi+b~jlogXij)2(2.2)
    slides中没有解释该目标函数,大致理解了一下,应该是如下的含义:

    XXX是基于窗口的单词共现矩阵,f(Xij)f(X_{ij})f(Xij)是对共现矩阵值进行正则化处理(本节第1点所述);

    wiw_iwi是单词iii的词向量,应该是作为中心词的词向量;

    w~i\tilde w_iw~i根据论文中的说法叫做separate context word vectors,理论上就是作为语境词的词向量;

    bib_ibib~j\tilde b_jb~j是模型中的截距项;

    在本节的notes部分有较为详细的阐述。

  5. 一种直观上的词向量评估方法:slides p.34

    使用http://www.cs.technion.ac.il/~gabr/resources/data/wordsim353/提供的人类标注的单词相似度数据表来辅助评估。

    常规的评估方法可以使用类比法(word vector analogies):
    d=argmaxi(xb−xa+xc)⊤xi∥xb−xa+xc∥(2.3)d=\text{argmax}_i\frac{(x_b-x_a+x_c)^\top x_i}{\|x_b-x_a+x_c\|}\tag{2.3} d=argmaxixbxa+xc(xbxa+xc)xi(2.3)
    (2.3)(2.3)(2.3)可以理解为给定一种相似关系man:woman,试找出king对应的单词是什么?加入能够找到完美契合的单词,那么说明词向量是好的。

    当然实际上都是讲词向量用于下游任务来间接评估其优劣性。

    感觉或许这里的词向量评估相关的内容对assignment1中后半部分的一些书面问题是有一些帮助的。

  6. 后面的内容大都关于基础机器学习的回顾,较为浅显不赘述。

notes

[notes]

  1. GloVe词向量模型:notes p.1-3

    其思想是利用全局的统计信息来预测单词jjj出现在给定单词iii所在的语境下的概率(即单词jjj与单词iii共现的概率),目标函数是加权最小二乘。

    • 单词—单词共现矩阵XXX

      标记说明:

      XijX_{ij}Xij表示单词iiijjj共现的计数;

      Xi=∑kXikX_i=\sum_{k}X_{ik}Xi=kXik表示单词iii语境下出现的所有单词数量;

      Pij=P(wj∣wi)=Xij/XiP_{ij}=P(w_j|w_i)=X_{ij}/X_iPij=P(wjwi)=Xij/Xi表示单词jjj出现在单词iii语境下的概率;

    • 最小二乘目标

      回顾在SG模型中使用的是softmax来计算单词jjj出现在单词iii语境下的概率:
      Qij=exp⁡(uj⊤vi)∑w=1Wexp⁡(uw⊤vi)(2.4)Q_{ij}=\frac{\exp(u_j^\top v_i)}{\sum_{w=1}^W\exp(u_w^\top v_i)}\tag{2.4} Qij=w=1Wexp(uwvi)exp(ujvi)(2.4)
      则全局的损失函数可以写作:
      J=−∑i∈corpus∑j∈context(i)log⁡Qij(2.5)J=-\sum_{i\in\text{corpus}}\sum_{j\in\text{context}(i)}\log Q_{ij}\tag{2.5} J=icorpusjcontext(i)logQij(2.5)
      由于单词iii与单词jjj可能多次共现,因此共现计数加权后的损失函数为:
      J=−∑i=1∣V∣∑j=1∣V∣Xijlog⁡Qij(2.6)J=-\sum_{i=1}^{|V|}\sum_{j=1}^{|V|}X_{ij}\log Q_{ij}\tag{2.6} J=i=1Vj=1VXijlogQij(2.6)
      QQQ矩阵正则化后,即可与PPP矩阵进行对照,得到最小二乘的损失函数:
      J^=∑i=1∣V∣∑j=1∣V∣Xij(P^ij−Q^ij)2(2.7)\hat J=\sum_{i=1}^{|V|}\sum_{j=1}^{|V|}X_{ij}(\hat P_{ij}-\hat Q_{ij})^2\tag{2.7} J^=i=1Vj=1VXij(P^ijQ^ij)2(2.7)
      其中P^ij=Xij,Q^ij=exp⁡(uj⊤vi)\hat P_{ij}=X_{ij},\hat Q_{ij}=\exp(u_j^\top v_i)P^ij=Xij,Q^ij=exp(ujvi),这两个数值都是没有经过正则化的,取值过大会影响优化求解,因此可以考虑取对数:
      J^=∑i=1∣V∣∑j=1∣V∣Xi(log⁡P^ij−log⁡Q^ij)2=∑i=1∣V∣∑j=1∣V∣Xi(uj⊤vi−log⁡Xij)2(2.8)\hat J=\sum_{i=1}^{|V|}\sum_{j=1}^{|V|}X_{i}(\log\hat P_{ij}-\log\hat Q_{ij})^2=\sum_{i=1}^{|V|}\sum_{j=1}^{|V|}X_i(u_j^\top v_i-\log X_{ij})^2\tag{2.8} J^=i=1Vj=1VXi(logP^ijlogQ^ij)2=i=1Vj=1VXi(ujvilogXij)2(2.8)
      此外可能权钟XiX_iXi并不那么可靠,可以引入一个更一般的权重函数,即:
      J^=∑i=1∣V∣∑j=1∣V∣f(Xij)(uj⊤vi−log⁡Xij)2(2.9)\hat J=\sum_{i=1}^{|V|}\sum_{j=1}^{|V|}f(X_{ij})(u_j^\top v_i-\log X_{ij})^2\tag{2.9} J^=i=1Vj=1Vf(Xij)(ujvilogXij)2(2.9)
      这就得到了式(2.2)(2.2)(2.2)的形式。

  2. 窗口分类(window classification):notes p.12-13

    这个概念是与词向量评估中的extrinsic类型的方法相联系的(本笔注没有详细注释,因为感觉不是很重要)。

    所谓extrinsic类型的词向量评估方法指的是构建一个新的机器学习任务来对已经生成好的词向量进行分类,这里每个单词都会人工标注多类别的标签值,然后看看是否能够构建一个很好的机器学习模型来成功区分这些词向量,在这个过程中,可以通过重训练(retrain)来提升词向量的效果。notes中指出,重训练是具有风险的。

    关于重训练的概念,似乎没有找到很具体的说明,我根据自己的理解,大概的意思是根据extrinsic任务的效果,将那些未能分类准确的单词再拿出来重新学习词向量,但是具体要怎么做这就比较迷,可能就只是调调词向量模型的参数,这个问题暂时未解。

    然后所谓窗口分类就是不只是对一个单词分类,而是对一个窗口内的所有单词构成的上下文进行分类。

suggested readings

  1. GloVe词向量模型首次提出的paper,发表于EMNLP2014,具体已经在slides与notes部分详述原理。记录一下项目主页,词向量数据都可以公开下载。(GloVe: Global Vectors for Word Representation)
  2. 一篇关于词向量评估的paper,发表于TACL2015,感觉比较普通,文中实现了若干不同的词向量,并使用了wordsim353数据集进行了词向量生成的评估。(Improving Distributional Similarity with Lessons Learned from Word Embeddings)
  3. 也是一篇关于词向量评估的paper,发表于EMNLP2015,主要讲得就是intrinsic与extrinsic两种类型的评估方法。(Evaluation methods for unsupervised word embeddings)

additional readings

  1. 关于基于语义的词向量生成方法,发表于TACL2016,标题中的PMI(Pointwise Mutual Information)已经多次提到,翻译过来叫作逐点互信息,在这里它用来刻画两个单词的相关度。(A Latent Variable Model Approach to PMI-based Word Embeddings)
  2. 关于多义词词向量的一篇paper,发表于TACL2018,它的思想是线性加权,具体而言它认为多义词的词向量可由其各个词义的词向量通过加权求和表示,权重为不同词义出现的频率,感觉如果要做词义消歧方面的工作,可以再参考这篇文章的做法,相对来说还是比较新的研究了。(Linear Algebraic Structure of Word Senses, with Applications to Polysemy)
  3. 理论性非常强的一篇paper,发表于NIPS2018,研究对象是词向量维度的选取上的权衡,感觉不太能用得到。(On the Dimensionality of Word Embedding)

python review session

[slides] [notebook]

这是一个非常基础的Python入门教程,笔者认为没有必要进行注释,课件中提供了从安装到应用的全过程的文档,以及一个JupyterNotebook的demo,有需求的可以自行查阅。

CS224N WINTER 2022(一)词向量(附Assignment1答案)相关推荐

  1. CS224N WINTER 2022 (六)前沿问题探讨(QA、NLG、知识集成与检索、Coreference)

    CS224N WINTER 2022(一)词向量(附Assignment1答案) CS224N WINTER 2022(二)反向传播.神经网络.依存分析(附Assignment2答案) CS224N ...

  2. 斯坦福NLP名课带学详解 | CS224n 第2讲 - 词向量进阶(NLP通关指南·完结)

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://ww ...

  3. 深度学习与自然语言处理教程(2) - GloVe及词向量的训练与评估(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  4. 深度学习与自然语言处理教程(1) - 词向量、SVD分解与Word2Vec(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  5. 【NLP】CS224N课程笔记|词向量I: 简介, SVD和Word2Vec

    NewBeeNLP原创出品 公众号专栏作者@Ryan 知乎 | 机器学习课程笔记 CS224N课程笔记系列,持续更新中 课程主页:  http://web.stanford.edu/class/cs2 ...

  6. NLP【05】pytorch实现glove词向量(附代码详解)

    上一篇:NLP[04]tensorflow 实现Wordvec(附代码详解) 下一篇:NLP[06]RCNN原理及文本分类实战(附代码详解) 完整代码下载:https://github.com/ttj ...

  7. 【CS224n】2斯坦福大学深度学习自然语言处理课程笔记——词向量、词义和神经分类器

    Natural Language Processing with Deep Learning 课程笔记2 1. 词向量和word2vec 2. 优化基础知识 3. 我们能否通过计数更有效地抓住词义的本 ...

  8. 干货分享 | 自然语言处理及词向量模型介绍(附PPT)

    云脑科技机器学习训练营第二期,对自然语言处理及词向量模型进行了详细介绍,量子位作为合作媒体为大家带来本期干货分享~ 本期讲师简介 樊向军 云脑科技核心算法工程师,清华大学学士,日本东京大学与美国华盛顿 ...

  9. 最小熵原理:“物以类聚”之从图书馆到词向量

    作者丨苏剑林 单位丨广州火焰信息科技有限公司 研究方向丨NLP,神经网络 个人主页丨kexue.fm 从第一篇看下来到这里,我们知道所谓"最小熵原理"就是致力于降低学习成本,试图用 ...

最新文章

  1. SQL Server 插入含有中文字符串出现乱码现象的解决办法
  2. 使用同一个目的port的p2p协议传输的tcp流特征相似度计算
  3. 解决烧录问题:Jlink的三线制SWD方式连接STM32芯片无法识别的解决方案
  4. 随着计算机网络的广泛应用,【网络技术论文】计算机网络技术的广泛应用探析(共3558字)...
  5. html ajax输出表格中,使用Ajax来渲染HTML表格
  6. idea 初始界面_IDEA 初始配置教程
  7. Simulink模块之VCO(压控振荡器)
  8. 企业双运营商出口负载均衡同时冗余备份
  9. smartbi试用体验
  10. 移动直播元年:内容单一,80%流量靠网红主播
  11. Python爬虫抓取LeetCode题解,获取力扣中国(leetcode-cn.com)提交代码,自动保存submission到本地,同步上传到github
  12. Android基础——Alarm
  13. Windows操作系统的日志分析
  14. 《Microduino实战》——2.5 Microduino传感器系列
  15. 北漂生活-租房那些事
  16. 四、ESP32单片机wifi的AP与STA模式使用
  17. 以下是一段歌词,请从这段歌词中统计出“月亮”一词在歌词中出现的次数。
  18. stegano(图片隐写、摩斯密码)
  19. 刚写完的 基于网页的音乐平台网站(含后台) 毕业设计毕设源码 (1)功能介绍
  20. ROS2 humble + windows10,如何安装调试rplidar a1激光扫描传感器

热门文章

  1. linux命令行 teamview,Ubuntu下命令行方安装TeamViewer
  2. bat批处理文件注释
  3. 神奇了!AR技术可测量实物体积!
  4. ISO13335标准简介
  5. 大厂offer?拿来吧你!网易有道笔试编程题特辑
  6. expect 使用实例
  7. 【算法】时域处理方法
  8. 计算机408看不懂?那是你还不知道这套学习方法和资源
  9. unity websockt一些知识:
  10. 非极大值抑制算法hard-NMS与soft-NMS