LionKing数据科学专栏

购买普通会员高级会员可以解锁网站精华内容且享受VIP服务的优惠

想要查看更多数据科学相关的内容请关注我们的微信公众号知乎专栏

自然语言处理(natural language processing)

词向量

自然语言处理,深度学习,归根结底是构建关于语言的数学模型。如果把每个单词理解成数学模型的输入,那首要前提就是单词能转化成某种形式的数字。其中最普遍的方法是把每个单词表征为一个向量,而常见的向量表征包括one hot representation, word2vec based on Skip-Gram or Continuous Bag of Words (CBOW), 以及GloVe。我们将重点介绍one hot representation和word2vec(Skip-Gram).

离散向量表征

One hot representation是最基本的离散向量表征,每个单词w可以表示为一个高维度的向量x(维度为D),D是词典的大小,即是所有可能出现的词的数目,而x中对应w的元素是1,其他所有元素都是0。假设词典为{“hello”, “world”, “sunny”, “rainy”, “is”, “hotel”, “motel”},那”hotel”就可以写成如下向量:

[0, 0, 0, 0, 0, 1, 0]

此类表征较为直观,因为通常词典维度较大,而向量中只有一个1,其他都是0,因此也叫做离散表征。具体实现中为了节省存储空间,可以只存储1的index而不是存储整个向量。

此类表征的一个显著问题是没法找到词之间的关系,比如motel可以表示为

[0, 0, 0, 0, 0, 0, 1]

但是这样的表征没法表达hotel和motel之间的任何相似性(两个向量的内积为零)。

密集表征

密集表征则可以解决此类问题。密集表征是将每个词表示为一个低维度的向量(维度为d),d通常在10-300之间。向量里的每个元素并不是非1即0,而是可正可负的实数。在此类密集表征中,通常我们就可以通过两个词密集表征的内积(即cosine)找到两个词的相似性。接下来我们将详细讲解在word2vec based on Skip-Gram中,如何获得每个单词的密集表征。

Skip-Gram本质上是在寻求最佳的单词密集表征使得给定居于中心的词,准确预测周边的词的概率尽可能大,即:

$$\begin{align*} \max L &= \Pr[w_{c - m}, \ldots, w_{c - 1}, w_{c + 1}, \ldots, w_{c + m}|w_c]\\ &= \sum_{j=0, j \neq m}^{2m}\Pr[w_{c - m + j}|w_c]\\ &= \sum_{j=0, j \neq m}^{2m}\Pr[u_{c - m + j}|v_c]\\ &= \frac{\sum_{j=0, j \neq m}^{2m}\exp{(u_{c - m + j}^Tv_c)}}{\sum_{k=1}^{|V|}\exp{(u_k^Tv_c)}} (\text{softmax function}) \end{align*}$$

其中,$w_c$是中心词,2m是窗口的大小,V是包含所有词的集合,而u和v就是我们需要学习的单词密集表征。在训练中,Skip-Gram通过大小为2m的滑动窗口,扫描所有文本,进而找到使得以上概率最大化的单词的密集表征。这也可以理解为以下神经网络:

其中输入是one hot vector,而output layer的每一个node的输出则是对应于某个英文单词出现在给定中心词2m窗口内的概率。

Hidden layer的weights本质上可以理解成是一个lookup table,每一行对应一个词的密集表征。比如在上图中,总共有10000个词,每个词的表征维度为300。因此,Hidden Layer的weights即是单词的密集表征。

图片来源

更多推荐系统相关问题见本网站论坛自然语言处理版面

更多面试问题见面试真题汇总

想要查看更多数据科学相关的内容请关注我们的微信公众号知乎专栏