吴恩达《深度学习》第五门课(2)自然语言处理与词嵌入
2.1词汇表征
(1)使用one-hot方法表示词汇有两个主要的缺点,以10000个词为例,每个单词需要用10000维来表示,而且只有一个数是零,其他维度都是1,造成表示非常冗余,存储量大;第二每个单词表示的向量相乘都为零(正交),导致没能够表示是词汇之间的联系,比如oriange和apple,queen和king应该是联系比价紧密的,但是用上面的词典表示无法体现出这一点。
(2)使用新的特征表示法,如下图所示,特征比如有性别、高贵、年龄、颜色、尺寸、食物等等作为特征,那么一个词汇符合一个特征将会取较大的值,完全没什么关系取接近于0,加入设置了300个特征,那么每个单词就可以用300维的向量表示(解决了表示太冗余),而且相似的词(比如apple和oriange)在不同特征可能都非常类似的值(即相似性高),从而使得词汇之间有了联系。
(3)在上面提到那些特征,在实际中是通过网络来学习得到的,具体表示什么特征是没人知道的。
2.2使用词嵌入
(1)如何用词嵌入做迁移学习的步骤:
1.先从大量的文本机中学习词嵌入(词嵌入其实就是用一些特征来表示一个词汇,而不是通过one-hot表示),当然也可以直接使用别人训练好的词嵌入。
2.然后根据你新任务的数据量来决定是否还要调整这些词嵌入,如果数据量很少的话,直接使用之前的词嵌入。数据多的话可以进行微调。
(3)词嵌入和之前讲过的人脸编码非常的类似,有一点区别就是:词嵌入,是有固定的词汇表的,而在人脸编码中可能会有一个完全没有见过的人脸,然后需要对他进行编码。
2.3词嵌入的特性
(1)提出问题:man如果对应woman,那么King应该对应什么?方法是man的向量减去woman向量的值应该(约等于)等于King向量减去某个词汇的向量,式子如下所示:
移项之后即找到等式两边的相似度:
(2)使用余弦相似度(其实就是夹角的余弦值),值接近1是表明越相似:
2.4嵌入矩阵
(1)如果词汇量是10000,每个词汇由300个特征表示,那么嵌入矩阵就是一个300*10000的矩阵,嵌入矩阵与某个词汇的one-hot表示的向量相乘会会的该词汇的嵌入表示(即300维来表示),如下图所示:
(2)上面的相乘由于one-hot只有特定的值是1,所以其实相乘的本质是取出该词汇在嵌入矩阵的位置的那一列,所以实际中不会进行这么复杂的矩阵乘法运算,而是用一些方法直接取出那一列即可,如Keras中有一个嵌入层,我们用这个嵌入层可以有效的从嵌入矩阵中提出出你需要的列,而不是对矩阵进行很慢很复杂的乘法运算。
2.5学习词嵌入
(1)案例是:预测“I want a glass of oriange___”划线处的单词是什么?可以用one-hot的I然后输入到一个嵌入层,嵌入层会做的操作将嵌入矩阵与one-hot向量相乘得到该词汇的嵌入向量,然后再输入到后面的网络进行输出,所以通过训练这整个网络,也就可以学习了嵌入矩阵。
(2)后面有全连接层,所以输入的维度需要固定,这时有一个上下文的概念(context),比如用目标预测位置的前4个单词(这时嵌入层输出总共4*300=1200个输入输入到下一层网络中),或者目标位置前后各4个词汇,实践证明,在以训练嵌入矩阵时,只使用目标位置的前一个词汇作为上下文也是效果非常不错的。
2.6Word2Vec
(1)使用Skip-Gram模型,其做法首先是上下文c进行采样,然后目标词就会在上下文c的正负10个词距内进行采样。换言之,在句子“I want a glass of orange juice to go alone with my cereal”,这时选择上下文c假设是orange,然后再距离orange10以内的词出现某个词的概率,比如选中glass,这时glass就是相当于(输出的标签)y,而orange是x。
(2)Skip-Gram可以理解为取一个词,然后在这个词周围出现什么词的概率比较大,用这样来构造一个监督学习,其目的就是为了学习嵌入矩阵。
(3)网络示意图和代价函数如下所示(其中y,y帽都是用one-hot表示的,y是上下文orange在一定词距范围内随机取到的一个词):
(4)采用上述的算法有一个问题就是计算量非常大,因为根据损失函数来看,其求和操作很慢因为词汇量非常大可能达到百万。解决的办法有分级(hierarchical)的softmax分类器和负采样(Negative Sampling)。
(5)分级的思路是(以10000个词汇为例),第一个分类器先告诉你目标词在前5000还是后5000,然后第二个分类器告诉你是前2500还是后2500,这样计算复杂度是词汇输取对数,而不是线性的。另外所形成的树一般常见的词在比较浅的地方,少见的词在更深的地方,如下图所示。
2.7负采样
(1)负采样可以将上面的sotfmax变成一个二分类问题,这样可以大大减小计算量。
(2)负采样的做法是在选定上下文词,然后在上下文词限定的范围内(如10个词内)选取一个目标词,然后网络的输出为1,再在字典随机选取K个词当成负样本(即使选的词在上下文的限定范围内的词也没关系),然后网络的输出为0。如下图所示:
(3)一个样本对对应了一个二分类器(即输出只有一个神经元(实质上是只看softmax10000维中对应target词汇的那个维度),计算非常之简单),与之前的sotfmax(输出有10000个神经元)对比如下:
(4)如何选取样本按照以下的方式,其中f(wi)是观测到的在语料库中的某个英语词的词频率。
2.8GloVe词向量
(1)Xij表示单词i在单词j上下文中出现的次数,所以这里的i和j就和target和context的功能一样,所以可以认为Xij等于Xji。
(2)目标函数是最小化下面的式子(约定Xij为0时,f(Xij)也为0,约定0log0=0,f(Xij)是一个权重):
2.9情感分类
(1)案例1:输入x是一段文字,而输出y是你要预测的相应情感,比如说是对一个餐馆的评价的星级,分数为1-5。
(2)直接下载使用别人用非常大数据集训练好的嵌入矩阵即可。
(3)方法一使用以下的网络,每个单词one-hot之后经过嵌入矩阵,形成词嵌入,然后将所有单词的特征进行平均,再将平均值送入到softmax中得到最终的评分。
(4)上一方法存在的问题是,没有考虑到单词的位置关系,所有在句子“Completely lacking in good taste, good service, and good ambiance.”中由于good非常多,所以最终预测得到一个较高的分数,但实际这句话是差评。所以第二种方法是使用循环神经网络RNN,这将是一个多对一问题,这样可以很好的得到一个情感分析的系统。
2.10词嵌入除偏
(1)当一个系统Father对应Doctor,Mother对应Nurse时这就是一个偏见的系统。
(2)以消除性别偏差为例,叙述消除偏差的主要步骤。首先第一步是将所以带写别的组(如he,she)做ehe-eshe,egirl-eboy然后将这些结果求和取平均,得到如下的轴:
(2)第二步是中和步骤,意思就是将应该无偏的词移动到轴上,如下图所示:
(3)第三步是均衡步,即移动一对词将其关于轴对称(如上图中grandmother与grandfather并没有关于轴对称,所以grandmother与中和步骤之后的babysister距离更近一点),如下图所示
(5)有一点是,对于性别而言,有明确性别一一的词特别少,用一个二分类器来判断一个词是否是有明确的性别的,然后将所有其他词对这些有明确性别的词做上面的步骤即可解决偏见问题。关于其他偏见同样如此。