review: Word2vec: More details



How do we have usable meaning in a computer?
【CS224N笔记】词向量和词义_java

  • wordNet的问题:?


    1. 词语跟词语之间存在一定的语境差别    2. 有些单词的新含义缺少    3. 需要主观调整    4. 无法计算单词相似度
word2vec

  • 步骤: 


    1. 寻找大量的文本    2. 固定词汇表中的每个单词都有一个向量表示    3. 文本中的每一个位置t,均存在中心词c和上下词o    4. 使用c和o的词向量相似性来计算给定c和o的概率    5. 不断调整词向量来最大化这个概率
【CS224N笔记】词向量和词义_java_02

  • word2vec的一些参数:



【CS224N笔记】词向量和词义_java_03
    1. U的每一行都是一个单词的词向量,点乘之后通过softmax可以得到概率分布,从而得到上下文分布。但是该分布和你在上下文哪个位置是无关的,    2. We want a model that gives a reasonably high probability estimate to all words that occur in the context (fairly often)----我们希望给出一个合理的高概率估计    3. 去除一些停用词
更细的细节

  • 为什么每个单词都需要训练两个词向量


    1. 更容易优化,最后都取平均值    2. 可以每个单词只个向量

  • 两个模型变体


    1. Skip-grams (SG)输中词并预测上下中的单词    2. Continuous Bag of Words (CBOW)输上下中的单词并预测中词
之前直使softmax(简单但代价很的训练法)

【CS224N笔记】词向量和词义_java_04


接下来使负采样法加快训练速率
The skip-gram model with negative sampling (HW2)

  • 原始的论文中skip-gram模型是最大化的,这里给出:


【CS224N笔记】词向量和词义_java_05


  • 课程中的公式:


【CS224N笔记】词向量和词义_java_06



  • 我们希望中词与真实上下单词的向量点积更,中词与随机单词的点积更


  • k是我们负采样的样本数


【CS224N笔记】词向量和词义_java_07


这里的0.75次方是选择的比较好的,没有科学依据

But why not capture co-occurrence counts directly?共现矩阵



  • 共现矩阵 X


    1. 两个方法:windows vs. full document    2. Window :与word2vec类似,在每个单词周围都使⽤Window,包括语法(POS)和语义信息    3. Word-document 共现矩阵的基本假设是在同篇章中出现的单词更有可能相互关联。假设单词i出现在章 中j,则矩阵元素$X_{ij}$加,当我们处理完数据库中的所有章后,就得到了矩阵 X,其为 |V|*M,其中|V|为词汇量,而M为文章数,这构建单词章co-occurrencematrix的法也是经典的Latent Semantic Analysis所采的。{>>潜在语义分析<<}

  • 利某个定窗中单词与单词同时出现的次数来产⽣window-based (word-word) co-occurrence matrix


  • let me to tell you a example: 句子


        1. I like deep learning.        2. I like NLP.        3. I enjoy flying.
则我们可以得到如下的word-word co-occurrence matrix:
【CS224N笔记】词向量和词义_java_08
使共现次数衡量单词的相似性,但是会随着词汇量的增加增矩阵的,并且需要很多空间来存储这维矩阵,后续的分类模型也会由于矩阵的稀疏性存在稀疏性问题,使得效果不佳。我们需要
对这矩阵进降维,获得低维(25-1000)的稠密向量
how to reduce the dimensionality?

  • 方法一: SVD分解

  • 方法二: Ramped windows that count closer words more----将window倾斜向能统计更接近的单词中

  • 方法三: 采用person相关系数



glove



  • 两种方法: 


    1. 基于计数:使整个矩阵的全局统计数据来直接估计:

    • 优点

            1. 训练快速            2. 统计数据效利

    • 缺点

            1. 主要于捕捉单词相似性            2. 对量数据给予例失调的重视
    2. 转换计数:定义概率分布并试图预测单词

    • 优点

            1. 提其他任务的性能            2. 能捕获除了单词相似性以外的复杂的模式

    • 缺点

            1. 与语料库有关的量表            2. 统计数据的低效使(采样是对统计数据的低效使)
Encoding meaning in vector differences

  • 采用共现矩阵的思想对meaning进行编码



【CS224N笔记】词向量和词义_java_09
为什么采用比值有用?这里摘抄至网上:
假如我们想区分ice(固体)和stream(蒸汽),它们之间的关系可通过与不同单词x的共线矩阵相似性比值来秒速,比如p(solid | ice)和p(solid | stream)相比,虽然它们之间的值都很小,不能透露有效消息,但是它们的比值却很大,所以相比之下,solid更常见的用来表示ice而不是stream

  • 我们如何评判在线性表达下的共现矩阵相似度


    1. log-bilinear 模型:

【CS224N笔记】词向量和词义_java_10

    2. 向量差异:

【CS224N笔记】词向量和词义_java_11


公式推导部分来啦,非常非常重要的目标函数优化
基于对于以上概率比值的观察,我们假设模型的函数有如下形式:

【CS224N笔记】词向量和词义_java_12


其中,【CS224N笔记】词向量和词义_java_13代表了context vector, 如上例中的solid, gas, water, fashion等。【CS224N笔记】词向量和词义_java_14则是我们要比较的两个词汇, 如上例中的ice,steam。
F的可选的形式过多,我们希望有所限定。首先我们希望的是F能有效的在单词向量空间内表示概率比值,由于向显空问是线性率间,一个自然的假设是 F 是关于同显 【CS224N笔记】词向量和词义_java_15的差的形式:【CS224N笔记】词向量和词义_java_16或:【CS224N笔记】词向量和词义_java_17
在此,作者又对其进行了对称性分析,即对于word-word co-occurrence,将向量划分为center word还是context word的选择是不重要的,即我们在交换【CS224N笔记】词向量和词义_java_18【CS224N笔记】词向量和词义_java_19的时候该式仍然成立。如何保证这种对称性呢?

我们分两步来进行, 首先要求满足

【CS224N笔记】词向量和词义_java_20

该方程的解为 F=exp (参考上面的评价方法)同时与【CS224N笔记】词向量和词义_java_21相比较有【CS224N笔记】词向量和词义_java_22
所以,

【CS224N笔记】词向量和词义_java_23


注意其中【CS224N笔记】词向量和词义_java_24破坏了交换【CS224N笔记】词向量和词义_java_25【CS224N笔记】词向量和词义_java_26时的对称性, 但是这一项并不依赖于 k 所以我们可以将其融合进关于【CS224N笔记】词向量和词义_java_27的bias项【CS224N笔记】词向量和词义_java_28第二部就是为了平衡对称性, 我们再加入关于【CS224N笔记】词向量和词义_java_29的bias项【CS224N笔记】词向量和词义_java_30我们就可以得到【CS224N笔记】词向量和词义_java_31的形式。另一方面作者注宣到模型的一个缺点是对于所有的co-occurence的权重是一样的,即使是那些较少发 生的co-occurrence。作者认为这些可能是噪声声,所以他加入了前面的【CS224N笔记】词向量和词义_java_32项来做weighted least squares regression模型,即为【CS224N笔记】词向量和词义_java_33的形式。
其中权重项 f 需满足一下条件:

  1. f(0)=0,因为要求  是有限的。【CS224N笔记】词向量和词义_java_34
  2. 较少发生的co-occurrence所占比重较小。
  3. 对于较多发生的co-occurrence, f(x) 也不能过大。

【CS224N笔记】词向量和词义_java_35

  • 优点
  1. 训练快速
  2. 可以扩展到型语料库
  3. 即使是语料库和向量,性能也很好


How to evaluate word vectors?


  • 与NLP的般评估相关:内在与外在
  • 内在
  1. 对特定/中间⼦任务进⾏评估
  2. 计算速度快
  3. 有助于理解这个系统
  4. 不清楚是否真的有,除与实际任务建了相关性
外在
  1. 对真实任务的评估
  2. 计算精确度可能需要很时间
  3. 不清楚系统是问题所在,是交互问题,还是其他系统
  4. 如果另个系统替换个系统可以提精确度


Intrinsic word vector evaluation


  • 词向量类⽐a:b = c:?,类似于之前的男人对国王,求女人对?
    【CS224N笔记】词向量和词义_java_36

    英文解释: This metric has an intuitive interpretation. Ideally, we want xb−xa = xd −xc (For instance, queen – king = actress – actor). This implies that we want xb−xa + xc = xd. Thus we identify the vector xd which maximizes the normalized dot-product between the two word vectors (i.e. cosine similarity).


  • 一些结果举例子:

【CS224N笔记】词向量和词义_java_37【CS224N笔记】词向量和词义_java_38

  • 结论


    1. 300是个很好的词向量维度    2. 不对称上下(只使单侧的单词)不是很好,但是这在下游任务重可能不同    3. window size 设为 8 对 Glove向量来说较好    4. window size设为2的时候实际上有效的,并且对于句法分析是更好的,因为句法效果常局部    5. 当词向量的维度不断变大的时候,词向量的效果不会一直变差,并且会保持平稳    6. glove的训练时间越长越好    7. 数据集越大越好,尽量使用百科类数据集合    8. 使用余弦相似度
Another intrinsic word vector evaluation

  • the problem:Most words have lots of meanings!(一词多义问题)• Especially common words • Especially words that have existed for a long time

  • method1: Improving Word Representations Via Global Context And Multiple Word Prototypes (Huang et al. 2012) -------将常词的所有上下进聚类,通过该词得到些清晰的簇,从将这个常词分解为多个单词,例如 bank_1, bank_2, bank_3


【CS224N笔记】词向量和词义_java_39

  • method2: Linear Algebraic Structure of Word Senses, with Applications to Polysemy (Arora, …, Ma, …, TACL 2018)

  • Different senses of a word reside in a linear superposition (weighted sum) in standard word embeddings like word2vec -----------采用加权和的形式进行处理



  • 【CS224N笔记】词向量和词义_java_40


  • 令人惊讶的是,这个加权均值的效果非常好



Training for extrinsic tasks



  • 到目前我们学的为止,我们的目标是内在任务,强调开发一个特别优秀的word embedding。接下来我们讨论如何处理外部任务


Problem Formulation

  • Most NLP extrinsic tasks can be formulated as classification tasks. For instance, given a sentence, we can classify the sentence to have positive, negative or neutral sentiment. Similarly, in named-entity recognition (NER), given a context and a central word, we want to classify the central word to be one of many classes. ------许多nlp的task都可以归类为分类任务


  • for example:我们有一个句子: Jim bought 300 shares of Acme Corp. in 2006,我们的目标是得到一个结果:[Jim]Person bought 300 shares of [Acme Corp.]Organization in [2006]Time.


对于这类问题,我们通常从以下形式的训练集合开始:

【CS224N笔记】词向量和词义_java_41


其中【CS224N笔记】词向量和词义_java_42是一个d维度的词向量,【CS224N笔记】词向量和词义_java_43是一个C维度的one-hot向量,表示我们wished label(情感词语,其他词语,命名主体词语,买卖决策,等)
在机器学习里面,对于上面问题,我们通常固定输入和输出的形式,然后采用一些优化算法训练权重。但在nlp里面,我们需要在训练外部任务的时候,对输入的词向量进行再次训练
Retraining Word Vectors 

  • 我们预训练的词向量在外部评估中的表现仍然有提高的可能,然而,如果我们选择重新训练,我们会存在很大的风险------可能效果会比之前差得多

  • If we retrain word vectors using the extrinsic task, we need to ensure that the training set is large enough to cover most words from the vocabulary. -----因为word2vec和glove会产生一些语义接近的单词,并且这些单词位于同一个单词空间。如果我们在一个小的数据集上预训练,这些单词可能在向量空间中移动,这会导致我们的结果更差


举例子: 这两个例子可以清楚明白的看到,训练集合如果过于小,我们的分类结果非常差
【CS224N笔记】词向量和词义_java_44结论: 如果训练数据集合太小,就不应该对单词向量进行再训练。如果培训集很大,再培训可以提高性能
Softmax Classification and Regularization 

  • softmax的训练


    1. 函数形式:

【CS224N笔记】词向量和词义_java_45


    2. 上个式子,是我们计算x是j的概率,我们采用交叉熵损失函数:

【CS224N笔记】词向量和词义_java_46


    3. 对上面损失函数优化,因为我们$y_j$为1,其他类别就是0,也就是说,对于单个词语我们的损失函数简化为:

【CS224N笔记】词向量和词义_java_47


    4. 上式损失函数只是一个单词的,但是我们需要使用的训练集不止一个dancing,假设我们有N个单词,将损失函数扩展:

【CS224N笔记】词向量和词义_java_48


    5. 为了防止过拟合,我们需要加入一个惩罚项:

【CS224N笔记】词向量和词义_java_49


为什么惩罚项的参数是【CS224N笔记】词向量和词义_java_50
我们需要同时训练模型的权值w和词向量x。对于权值来将,我们需要一个d维度向量的输入和一个C维度向量输出,所以是C*d;对于词向量来说,我们词汇表有v个词汇,每个词汇的维度是d维,所以是|v|*d
    6. 如果我们调整好 λ 这个超参数的值,这会降低损失函数出现很大值的参数的可能性因为惩罚项的存在,同时,这个也能提高模型的泛化能力
Window Classification

  • 我们通常的输入不是一个单词


【CS224N笔记】词向量和词义_java_51
    更多的情况,我们模型的输入是一个单词序列(取决于你的问题的情况,确认窗口的大小),一般来讲,较窄的窗口会在句法测试中会存在更好的性能,而更宽的窗口在语义测试中表现更好
【CS224N笔记】词向量和词义_java_52
敲公式敲累了,偷个懒,这里就是在softmax里面我们扩展到你窗口大小就行


【CS224N笔记】词向量和词义_java_53