深度学习吴恩达RNN第二章

one-hot向量表示过单词,缺点之一是:每个one-hot只是为了表示单词自己而已,无法让算法很容易的跨单词泛化,即它无法表示任何两个单词之间的关系,因为任何两个单词one-hot向量的内积为都是0。

即找一个单词w,使得相似性函数sim取值最大:
在这里插入图片描述
在这里插入图片描述

嵌入矩阵

当我们使用算法学习词嵌入时,实际上学习的是一个嵌入矩阵(Embedding matrix),记为E。假如词汇表的大小是10000个单词,词嵌入的特征是300维,则嵌入矩阵是一个300x10000的矩阵。

词汇表中第i个单词的one-hot向量为oi,则对应的词向量为:ei=E⋅oi
虽然,有这样一个数学上的矩阵乘积关系,但这样做效率较低;实际应用中,我们一般使用一个函数直接查找E对应某列。

目标是让算法学习出嵌入矩阵E,我们会先随机的初始化E,然后用梯度下降去学习E的每个元素。

word2vec

word2vec是为了训练得到词嵌入矩阵 Embedding matrix 的算法

采用固定大小的历史窗口的做法,即如果窗口设置为4(窗口大小是超参),则总是用前面4个单词预测后面1个单词。

扩展思路:

前面的做法是,Context为前面4个单词(a glass of orange),而target是紧跟着的1个单词(juice)
如果不是为了构建语言模型,而仅仅为了学习词嵌入矩阵,context可以有更多选择:
1左右相邻的4个单词,比如a glass of orange和to go along with
2前面的1个单词,比如orange
3附近的1个单词,比如glass—skip gram模型

skip-gram模型

在skip-gram算法中,我们将随机的取一个单词作为context,然后在context附近(附近是指在一个window区间,比如window是10,则在context的前后10个单词内选择)再随机选一个单词作为target。

下面是skim-gram的细节:

假如词汇表大小是10000,输入context单词的one-hot向量oc,与嵌入矩阵E相乘,得到嵌入向量ec,然后将ec输入到softmax层,输出一个10000维的yhat,表示预测词汇表每个单词的概率。

skim-gram模型是一个相当简单,浅层的神经网络

总结一下,上面的一个模型里,有两处需要学习的参数,矩阵E以及softmax的参数θt。通过优化这个模型,可以得到一个相当不错的词嵌入矩阵。

分级softmax分类器

上面的模型有一个主要的缺点是:softmax的计算量太大,每次要计算概率都要计算整个词汇表10000个单词的求和,如果词汇表再大,比如扩充到10万、100万,计算会变得更慢。其中一种解决办法就是分级softmax分类器(Hierarchical Softmax Classifier)。即不是一下子确定属于词汇表中的哪一个,而是若干层的二分类器,先确定是前5000个,还是后5000个,以此类推.

Word2Vec除了上面提到的skip-gram模型外,还有一个叫做CBOW,即连续词袋模型(Continuous Bag-Of-Words Model),通过获取中间词两边的上下文,去预测中间词,方向正好和skip-gram相反。

总结下: CBOW 是从原始语句推测目标字词;而 Skip-Gram 正好相反,是从目标字词推测出原始语句。而刚才讲的 Skip-Gram 模型,关键问题在于 softmax 这个步骤的计算成本非常昂贵,因为它需要在分母里对词汇表中所有词求和。通常情况下, Skip-Gram 模型用到更多点。

负采样

由于skip-gram模型中softmax的计算量较大,本节再介绍另外一种方法:负采样(Negative Sampling),和skip-gram类似,但更有效。

我们将定义新的监督学习问题:给定一个单词对(比如orange和juice),预测这两个单词是否是context-target对。

首先我们产生一个正样本(Positive Example),正样本的生成方法和skip-gram中类似,选择一个context单词,在一个windows大小附近随机选择一个target单词。比如上例语句中的orange和juice,我们把正样本标记为1。
然后使用相同的context,生成负样本(Negative Example),负样本的对应的单词从词汇表里随机选取,比如生成一个负样本orange-king,并将负样本标记为0。同样的方法,生成更多更多的负样本,可能是:orange-book, orange-the, orange-or。由于是随机选择的,我们总认为是负样本,因此即便上面的orange-or的例子,or其实是Orange的target,我们依然标记为0。

一个正样本,会选择多个负样本,其个数记为k,在较小数据集下k通常推荐取5-20,如果数据集较大,则k取值较小,比如2-5。

怎样选择负样本? 这个算法有个重要细节是如何选择负样本,一种办法是根据每个单词在语料库中的经验概率进行采样,但会导致常用词被采样的频率很高;还有一种是均匀分布的采样,完全不考虑单词的实际频率。论文中有一个经验方法,介于上述两个方法之间:
在这里插入图片描述
其中f(wi)是一个单词在语料库中的观测频率。通过取3/4次方,使得既考虑到单词的语料库频率,又能增加低频单词被选取的概率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值