其他分享
首页 > 其他分享> > 【Stanford CS224N 笔记】lecture 2 Word Vector

【Stanford CS224N 笔记】lecture 2 Word Vector

作者:互联网

1 背景

1.1 文本数据的向量化

        文本数据,和图片数据非常类似,并不能够直接被机器理解,必须要将其建立一个双射,将这些数据转化为数字。比如说,图片可以转化成n*m*1(黑白图片)或者n*m*3(RGB)的三维矩阵。同样的,对于一个文本中出现的每一个单词,我们都要找到其对应的数字化表征,这里我们一般采用向量格式。

数学写法为:设V=\{w_1, w_2, ..., w_W\}是词库, 我们需要寻找到一个V\rightarrow \mathbb{R}^n的单射f,将文本数据转化为向量格式,以便让数学模型更好地理解。

1.2 传统的离散方法

参考我们在机器学习算法经常使用的OneHot思想,我们将单词映射为一个0-1向量。

考虑f(w_i)=(0, ...,0, 1, 0, ..., 0),第i位是1,其他位是0。显然f为单射。这种方式非常的直观,在word2vec等word embedding方法出现前,以离散方式表征的向量为基础,产出了TF-IDF、LDA等非常经典的NLP方法。

但是,f(w_i)存在以下问题: 

第一,无法表征词与词之间的关联。例如apple,banana,basketball三个词汇,按照上述的f,分别为(1, 0, 0),(0, 1, 0),(0, 0, 1)。两两做内积均为0,无法反映出Distance(apple, banana) < Distance(apple, basketball)的词义关系。

第二,无法应对词库的即时更新。随着时代的变化,V的元素会发生不断的变化,会有很多新的单词/汉字被发明出来,也有很多长期无人使用的单词/汉字会逐渐被淘汰被遗忘。因此,f的值域会不停地发生变化,这非常不利于一个维护一个长期稳定的NLP模型,我们需要每隔一段时间就推翻重新训练,来确保模型能够覆盖最新的词库。

因此,另一种方案是通过固定维度的连续向量来表征单词,即word embedding。如apple=(0.1, 0.3), banana=(0.2, 0.5),basketball=(-0.1, 0.1),显然,apple和banana的向量夹角小于apple和basketball的向量夹角。

这里,我们引入了cosine similarity,即

cosine\_similarity=\frac{u\cdot v}{|u||v|}

cos值越大,夹角越小,意味着词与词之间的距离更相近。

2 word2vec简介

word2vec的核心思想是,一个词的含义取决于在这个词的周围经常出现哪些词汇[1]。比如说,apple和banana经常出现在eat、delicious等单词的上下文,而basketball则很少和eat、delicious同时出现在一个句子里。我们固定一个window size(不妨设为5),那么对于每一个单词(center word),我们只关注这个单词前后各5个单词(context word)。这样,我们将一个句子拆解为若干个词对,将这些词对分别作为模型中的X和y进行训练。

2.1 skip-gram和CBOW(continuous-bag-of-words)

Skip-gram和CBOW的主要区别在于,中心词和上下文词如何对应X和y。

2.1.1 Skip-gram

中心词作为X,上下文词作为y。即给定一个句子w_1w_2...w_T,skip-gram的损失函数为

\frac{1}{T}\sum_{t=1}^{T}\sum_{-c\leq j \leq c,j\neq 0}\log p(w_{t+j}|w_t)

其中

p(o|c)=\frac{\exp(u_o^Tv_c)}{\sum_{w=1}^{W}\exp(u_w^Tv_c)}

在这个式子中,我们看到,每一个单词分别对应着两个向量input vector和output vector,这就是梯度下降时需要更新的参数,假设有N个单词,向量维度为D,那么该模型的参数个数为2ND。通过梯度下降使损失函数最小化,我们就得到了每个单词对应的两个向量表征u和v,后续可以根据需要选择如何使用这两个向量。比如:f(w)=u_wf(w)=v_wf(w)=u_w+v_w等。

2.1.2 CBOW

中心词作为y,上下文作为X。损失函数为

\frac{1}{T}\sum_{t=1}^T\sum_{-c\leq j\leq c,j\neq 0}\log p(w_t|w_{t+j})

其余均和skip-gram相同,后续的优化我们均以skip-gram为基础。

2.1.3 问题

计算p(o|c)的时间复杂度正比于W,即词库的大小,训练速度极慢,因此我们需要寻找时间复杂度更低的p(o|c)。 

2.2 Hierarchical softmax和negative sampling

针对时间复杂度的问题,Mikolov提出了两种优化方案[2],课上没细讲,我们这里简单概述一下思想,细节可参考论文。

2.2.1 Hierarchical Softmax

搭建一个包含V个叶节点的二叉树(怎么搭建有单独的论文讨论,这里我们直接选取huffman树),叶节点分别对应一个单词,非叶节点中包含一个output vector。

下面我们统一符号。设中心词为w_I,上下文词为w,设n(w,j)为从根节点到w的路径上的第i个结点,L(w)是路径的长度(即n(w,1)=rootn(w,L(w))=w)。ch(n)是结点n的左孩子,[[x]]表示当bool表达式x为true时取值为1,x为false时取值为-1。\sigma(x)表示sigmoid函数。

于是skip-gram的p(o|c)优化为:

p(w|w_I)=\prod_{j=1}^{L(w)-1}\sigma([[n(w,j+1)=ch(n(w,j))]]u_{n(w,j)}^Tv_{w_I}) 

可以看到运算量为L(w),计算p(o|c)的平均时间复杂度为O(\log W)

2.2.2 Negative Sampling

对于每一个中心词w_I和上下文词w,我们构建k个随机选取的负样本来辅助训练。它的思想是,比起随机选取的词,w_I更可能出现在w的周围。 

于是skip-gram的p(o|c)优化为:

\log p(w|w_I)=\log\sigma(u_w^Tv_{w_I})+\sum_{i=1}^k\mathbb{E}_{w_i\sim P_n(w)}[\log(\sigma(-u_{w_i}v_{w_I}))]

其中,P_n(w)正比于w的频率的3/4次方,目的是为了提高低频的单词被选中的概率。

可以看到计算p(o|c)的平均时间复杂度为O(k),也就是O(1)

3 research highlight环节[3]

(注:这个系列是教授的学生们轮流介绍前沿的科研成果,每节课会花上5分钟左右的时间。)

参考文献:

[1] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient estimation of word representations in vector space. ICLR Workshop, 2013.

[2] Mikolov, Tomas. Distributed representations of words and phrases and their compositionality. Advances in Neural Information Processing Systems, 2013.

[3] Sanjeev Arora, Yingyu Liang, and Tengyu Ma. A simple but tough-to-beat baseline for sentence embeddings. International Conference on Learning Representations, 2017.

标签:中心词,Word,apple,Stanford,skip,单词,Vector,gram,向量
来源: https://blog.csdn.net/weixin_42685184/article/details/122829427