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