Word2Vec

Lab Machine Learning Basic

beginning

其实用向量来表示一个单词是很常见的, 毕竟方便一个算法或模型去表示一个单词. 但表示的方法很重要, 最完美的Embedding就是能够包含单词的语义, 相似语义的单词的表示越接近, 反之表示的向量差距越大. 下面一步步的去完成我们的目标.

distance

怎么来叙述两个单词的embedding是相近的呢? 容易想到对于两个向量, 我们有一个适用于 \(n\) 维空间上的一个夹角公式. for \(\vec{a}\), \(\vec{b}\) as two embedding vectors of different words. the cosine similarity is \[ Cosine Similarity(\vec{a}, \vec{b}) = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}|\cdot|\vec{b}|} \]

这个评判函数相对简单, 也非常有效. 对于不同的问题, 我们也可以选择不同的距离函数.

modeling

embedding都是为了更好的完成一个task, 那么下面先来看一个简单的任务, 在完成任务的同时, 来获得一个适合它的embedding.

predicting next word

根据语境预测下一个单词是什么. 这是一个在日常生活中非常常见的任务. 简单来做, 就是分为三步, - 输入一个单词, 先获得对应的embedding - 利用embedding去预测下一个单词的embedding - 根据embedding映射到对应的单词, 然后输出

  • 数据集从哪来呢
    • 一般是Wikipedia的文章等等
    • 构造许多定长的input - output对, 做法是window sliding with a fixed length, 前面的都是input, 最后一个单词是output
problem

这么做有两个问题.

  • 预测一个单词怎么能只看前几个单词呢

  • 最后有个 \(n \times d\) , (其中 \(n\) 表示Vacab的大小, \(d\) 表示embedding的大小) , 这算起来太费时了

problem solving
  • 取样时不仅取前面的, 把后面的也取了. 这叫skip gram.

    • 这就成了Clozing了
    • 换个方法, 把他改成预测谁是neighbor, 输出可能是neighbor的概率
  • computational problem咋整. 再调整我们的任务

    • 我们改成更小规模的模型, 给他一个input, 和一堆output, 然后输出这些output分别是不是他的neighbor

    • 那有可能我们训出了一个人工智障, 他告诉我们这些全都是neighbor, 我们好像也没法反驳.

      1
      2
      3
      # are they neighbors? 
      def model(input, output):
      return 1.0
    • 给他来个negative sample, 告诉model他们不是neighbor, 这样model就成了个logistics regression模型, 规模小了很多

    • 但咱采样的时候怎么知道他们到底有没有可能是neighbor, 我们手上的数据集肯定是不完备的呀

    • 随机设为negative......

问题基本解决了, 下面看具体流程

Word2Vec
  • 我们训两个embeddings, 叫做Embedding和Context, 分别为input和一组outputs做project. 获得两组embedding: \(\vec{input}\)\(\vec{output}\). 这个outputs肯定就是一些真正的neighbor(通过skip gram window sliding选出来的)加上一些随机的negative sample.

  • input \(\to\) Embedding \(\to\) \(\vec{input}\)

    outputs \(\to\) Context \(\to\) a set of \(\vec{output}\)s

  • 然后点乘, 来个softmax, 获得这么个概率, 根据误差不断训

  • 最后, 训得差不多了, 扔掉context, 这个Embedding就是炼出来的丹

last

  • 语义相近的那些单词, 被认为是所在的Context是相似的. 越相似的词点乘上Context, 得到的结果肯定都很接近正确结果.
  • 这个window sliding 的length一般设成5, 越小的话得到的embedding划的越细, 就是说相近的embedding的单词所在的context几乎一样, 但要注意, 反义词很多时候也是这样, 把length设大点就能区分更多语境

End

reference
  • a blog
  • 还没看过原paper和代码, 估计等以后了

Comments