Deeplearning.AI 序列模型 Week2(NLP & Word embedding) 6-10
目录
- 摘要
- Word2Vec
- 负采样
- GloVe 词向量
- 情绪分类
- 词嵌入除偏
摘要
这一部分主要讲述了训练一个词嵌入模型的几种方法( W o r d 2 V e c Word2Vec Word2Vec、负采样和 G l o V e GloVe GloVe 词向量),并实例分析了如何构建一个情绪分类系统。最后讲述了一个小问题,如何解决词嵌入导致的歧视问题(比如在一些人种和性别问题上,一个没有除偏的词向量模型可能会产生性别或种族歧视 的问题)
Word2Vec
- 在前一部分我们了解了什么是词向量,简单来说词向量是将 o n e − h o t v e c t o r one-hot vector one−hotvector向一个低维向量空间做映射,经过映射的低维向量就是一个词向量。词向量中的值并不是随意给出的而是经过训练得到的,是可以表示一定特征的,所以两个词向量之间的距离可以表示两个词相似的程度;词向量还可以进行类比操作。比如已知 m a n man man类比于 w o m a n woman woman,问 k i n g king king类比于什么,显然我们知道是 q u e u e queue queue(王后),如果用词向量, m a n man man与 w o m a n woman woman是向量空间的两个点,两者连成一个向量应该和 k i n g king king这个点与未知点所连向量是相等向量(或者相差很小),我们可以遍历一下,便最终可以得到 q u e u e queue queue这个点。这就是词向量的类比操作。
- 我们从这一节开始介绍几个训练词向量模型的方法(训练一种从one-hot到词向量的映射关系),最经典的就是 W o r d 2 V e c Word2Vec Word2Vec。如果去读论文,其实 W o r d 2 V e c Word2Vec Word2Vec也有很多种变体,这里面 A n d r e w Andrew Andrew介绍了一种最基础的方法被称为 S k i p − g r a m s Skip-grams Skip−grams
- 以下是实现 S k i p − g r a m s Skip-grams Skip−grams的具体步骤:
- 确定输入与训练集,训练集来自于文本,输入是一些关于 c o n t e n t content content与 t a r g e t target target的序列对。 c o n t e n t content content是来自于文本的一个单词, t a r g e t target target选取 c o n t e n t content content上下文(可能是五个词或者十个词中选取),用这种关系对表示 c o n t e n t content content与 t a r g e t target target之间有联系,并把这种序列对作为输入。
- 网络的结构:
上图中 O c O_{c} Oc是一个 O n e − h o t V e c t o r , E One-hot Vector,E One−hotVector,E是嵌入矩阵(前一部分已经讲过)是我们需要训练的部分, e c = E ∗ O c e_{c}=E*O_{c} ec=E∗Oc就是我们所说的一个从 O n e − h o t One-hot One−hot到词向量的映射过程。我们将词向量传入一个 S o f t m a x Softmax Softmax单元,这个 S o f t m a x Softmax Softmax与一般的不同是它拥有自己的计算公式如下:
P ( t ∣ c ) = e θ t T e c ∑ j = 1 n e θ j T e c P(t|c)=\frac{e^{\theta ^{T}_{t}e_{c}}}{\sum _{j=1}^{n}e^{\theta ^{T}_{j}e_{c}}} P(t∣c)=∑j=1neθjTeceθtTec
在上式中 θ t \theta _{t} θt是一个向量,是一组属于第 t t t个单词的向量,向量中的元素是需要学习的参数。就相当于是用这个向量将词向量解码成目标单词 t t t在 c c c前后出现的概率。 - 损失函数
损失函数和一般的 S o f t m a x Softmax Softmax是一样的:
L ( y ^ , y ) = − ∑ j = 1 n y j l o g y j ^ L(\hat{y},y)=-\sum _{j=1}^{n} y_{j}log\hat{y_{j}} L(y^,y)=−∑j=1nyjlogyj^
- S k i p g r a m Skip gram Skipgram的一些问题
- S k i p − g r a m Skip-gram Skip−gram的首要问题就是计算速度的问题,因为在使用 S o f t m a x Softmax Softmax计算概率时,你会发现在分母中,也就是在计算 ∑ j = 1 n e θ j T e c \sum _{j=1}^{n}e^{\theta ^{T}_{j}e_{c}} ∑j=1neθjTec时,每一轮迭代都需要重新遍历一次所有元素,这里假设字典中单词总数 n = 10 K , 100 K n=10K,100K n=10K,100K或者更多,这样的计算代价是很大的,大大降低了效率。
- 解决这一问题的一个思路是改用分级 S o f t m a x Softmax Softmax,分级 S o f t m a x Softmax Softmax采用了树的思想,也就是并不一次得到目标词的概率,像折半查找一样第一次分类告诉你你需要的目标词在前一半还是后一半,以此类推直到你找到你需要的元素为止。这样,就将一个多分类的问题转化成多个二分类问题了。
- 在实际操作中,如果选择一个分级 S o f t m a x Softmax Softmax,构造的树往往不是一颗平衡二叉树,那些不常用的单词往往处于深度比较深的位置。因为考虑到那些词频较高的单词,被搜索的概率会更高,所以放在深度较浅的位置是合理的(是不是有一点哈夫曼编码的感觉)。
- Skip-gram如何取样?
- 最先想到的肯定是随机取样,但是随机取样存在一个问题,那就是像 t h e , o f , a , a n d the, of, a, and the,of,a,and这些词在句子中出现的概率会很高,随机取样会有很多序列对中 t a r g e t target target会是这些单词,如果用这样的序列对训练出来的模型效果一定不会好。
- 关于如何取样, A n d r e w Andrew Andrew并没有详细讲述,他只说:“采用不同的启发来平衡常见和不常见的词进行采样。”并且在最后引出了后面的负采样,让我们继续学习下一节吧!
负采样
- 我们上文书说到 S k i p − G r a m Skip-Gram Skip−Gram的缺点是在用 S o f t m a x Softmax Softmax计算时效率会很低,负采样时一种改善过的学习算法,可以解决这一问题,让我们去看看吧。
- 负采样的具体步骤如下:
- 算法思想:在负采样中我们做的不再是 S o f t m a x Softmax Softmax而是一个二分类问题。给定两个词,其中一个词做 C o n t e n t Content Content判断另一个词是不是 t a r g e t target target,如果是则输出1,如果不是则输出0。
- 首要任务还是如何构造训练集,训练集同样取自文本,先找到一组正取样,再选取n组负取样,将这n+1组数据作为输入训练神经网络,如下图所示:
第一行从文本中选取了一个正取样, C o n t e n t Content Content是 o r a n g e orange orange这个单词, T a r g e t Target Target是 j u i c e juice juice这个单词。对于 o r a n g e orange orange我们同时需要取 n n n个负取样,分别是后面的四组并标记为 0 0 0,在负取样中 T a r g e t Target Target是从字典中随机选取的。
此外还需要注意 n n n的选取,在论文中指出,如果在小数据集上 n n n选取 5 − 20 5-20 5−20比较好,如果数据集规模变大, n n n的取值随之减小,在大数据集上 n n n取 2 − 5 2-5 2−5。 - 下面我们看看如何建立这个监督学习的模型(
l
o
g
i
s
t
i
c
logistic
logistic回归模型),首先定义输出:
P ( y = 1 ∣ c , t ) = σ ( θ t T e c ) P(y=1|c,t)=\sigma (\theta _{t}^{T}e_{c}) P(y=1∣c,t)=σ(θtTec)
和之前 S o f t m a x Softmax Softmax一样 θ t \theta _{t} θt是一个属于 T a r g e t Target Target的参数需要训练, e c e_{c} ec是词向量来自嵌入矩阵。 - 最后看一下模型,如下图:
前面的过程和前一节是一样的,我们主要关注的是最后一步,词向量和字典中的每一个词都会进行一次二分类,来判断这个词是否是 C o n t e n t Content Content的 T a r g e t Target Target。这样做的好处就是将一个 V a l u e S i z e ValueSize ValueSize的多分类转化成了 V a l u e S i z e ValueSize ValueSize个二分类问题,大大减少了计算提高了效率。此外我们每次迭代只需要更新 k k k个负样本和 1 1 1个正样本涉及到的单元也就是 k + 1 k+1 k+1个单元。
- 如何选取负样本?
- 根据文本中单词的词频取样,缺点是导致一些经常出现的词(比如:冠词、代词等)出现在负取样中偏多,导致模型经常做无谓的训练。
- 采用均匀分布的随机取样,缺点是没有代表性。
- 这是论文中提到的一个效果不错的取样方法(基于实践的经验吧),有如下公式:
P ( ω i ) = f ( ω i ) ∑ j = 1 n f ( ω j ) P(\omega _{i})=\frac{f(\omega _{i})}{\sum _{j=1}^{n}f(\omega _{j})} P(ωi)=∑j=1nf(ωj)f(ωi)
既然单纯用词频会导致某些我们不希望出现的词出现很多次,均匀分布又不具代表性,那么何不采取一种折中的办法,这个办法就是加权,用某个词词频的 3 / 4 3/4 3/4次方比上所有词词频的 3 / 4 3/4 3/4次方作为该词出现的频率。这个方法在实际应用中合情合理,效果不错。
GloVe词向量
构造一个GloVe词向量
- G l o V e GloVe GloVe词向量模型是另外一种计算词嵌入的方法,虽然相比下没有Skip-grams模型用的多,但是相比这种模型却更加简单。让我们一起看看它是怎么运作的吧!
- 实现一个 G l o V e GloVe GloVe词向量模型有如下步骤:
- 定义 X i j X_{ij} Xij为目标词( T a r g e t Target Target) i i i在 ( C o n t e n t ) (Content) (Content) j j j附近出现的次数。这里的附近是在训练模型时候人为定义的,可能是附近十个词或者五个词。
-
G
l
o
V
e
GloVe
GloVe词向量的目标是最小化下式:
m i n i m i z e ∑ i = 1 n ∑ j = 1 n f ( X i j ) ( θ i T e j + b i + b j − l o g X i j ) 2 minimize\sum _{i=1}^{n}\sum _{j=1}^{n}f(X_{ij})(\theta _{i}^{T}e_{j}+b_{i}+b_{j}-logX_{ij})^{2} minimize∑i=1n∑j=1nf(Xij)(θiTej+bi+bj−logXij)2
注意到当 X i j X_{ij} Xij为0时, l o g X i j logX_{ij} logXij趋近于负无穷,那么这个式子便没有意义了,所以这里引入了 f ( X i j ) f(X_{ij}) f(Xij)为加权项,当 X i j = 0 X_{ij}=0 Xij=0时,令 f ( X i j ) = 0 f(X_{ij})=0 f(Xij)=0,此外引入加权项还可以调节频繁词和不频繁词的平衡关系,降低一些我们不希望频繁出现词的频率(比如:冠词、代词等等),提高一些生僻词出现的频率。 - 和之前的 W o r d 2 V e c Word2Vec Word2Vec类似, θ i \theta _{i} θi和 e j e_{j} ej是需要被训练的两组参数,在这个目标算法中二者是对称的关系,所以我们可以一致地初始化 θ \theta θ和 e e e,然后用梯度下降来最小化输出,在处理完所有词后,直接取二者的平均值作为词嵌入向量: e ω f i n a l = e ω + θ ω 2 e_{\omega}^{final}=\frac{e_{\omega }+\theta _{\omega }}{2} eωfinal=2eω+θω.
构造的词向量的特点
- 在这一节的最后主要说了这么一个问题,就是构成词向量的基底不一定是相互正交的,也不一定是相互独立的。如果你学过线性代数你可能会明白正交和独立的概念。正交的意思就是两个向量垂直(内积等于0),独立的意思就是每一个向量都无法由其他向量线性表示。所以说词向量的向量空间并不像我们想象中那样。
情感分析
-
情感分析就是根据一段文本来分析人们对现在在讨论的这个东西是否喜欢,情感分析是NLP最重要的模块之一。在以往的实践中情感分析最大的困难就是没有足够的标记过的训练集(因为收集并标记足够多真实的评论是困难的),但是有了词向量,即使是一个中等量级的训练集也可以训练出来一个效果比较良好的情感分析模型。下面让我们看看如何构建一个情感分析系统。
-
一个情感分析模型的输入是一段文本,输出是一个评分(比如评分分五档1-5分)。
取平均值的模型
- 如上图所示,首先需要训练一个良好的词嵌入模型可以表示出每一个词的词向量,这些词向量实际上就已经具备了一定的属性,比如:
g
o
o
d
good
good这个词就具有好的属性,
b
a
d
bad
bad这个词有坏的属性他们在向量的某几个特定的维度相差会很远。所以我们只需要对所有词向量相应的维度取平均值并输出到一个
S
o
f
t
m
a
x
Softmax
Softmax
中进行训练,就可以将分辨好坏这一特征训练出来。 - 这个模型有一个缺点:因为这个模型只关心每一个词的积极或消极影响,但是并没有注意到词与词之间的关系,比如上图左下角的句子中出现了好多的 g o o d good good但是这是个消极评论为什么?因为在这些 g o o d good good之前有一个 l a c k i n g lacking lacking也就是否定词,但是这个模型会更多的关注 g o o d good good对于这条文本的影响,从而导致估计存在一定的偏差。
RNN情感分析模型
- 为了解决取平均值模型的问题,我们采用循环神经网络,如果可以的话你可以加上 G R U 、 L S T M GRU、LSTM GRU、LSTM和双向神经网络使其变得更加强大。
- 如下图所示:
- 上图已经描述的很清晰啦,将词向量送入一个多对一的RNN并用 S o f t m a x Softmax Softmax作为最后的输出。
- 这个模型的优点在于考虑了词序,所以对于取平均值那种无法考虑上下文语境的问题有了很好的解决,此外,这个模型还有很强的迁移能力,对于语意相近的词具有很强的鲁棒性。
词嵌入除偏
什么是词嵌入除偏以及为什么要除偏?
- 这里的词嵌入除偏要消除的"偏"指的是偏见,比如性别的偏见,种族的偏见等等。比如如果你训练一个词嵌入模型,并且没有经过除偏可能会有以下问题:
我们知道词向量的一个特点就是可以用作类比,之前也讲过男人之于女人可以类比出来皇上之于皇后,我们现在用词向量做类比,如果男人之于女人,那么医生之于什么呢?我们的词向量会告诉我们是护士。这种类比显然是有失偏颇的,因为在做医生和护士方面应该是男女平等的,这样的类比会产生一定的性别歧视,在实际应用中会造成不良影响。因此,我们有必要减少这样的不良影响,这也就是除偏的意义所在。
除偏的方法
- 确定无差方向:我们之前说过能够类比的根本原因是词向量确实具有一些这个词的特征,比如
m
a
n
man
man和
w
o
m
a
n
woman
woman,他们是向量空间的两个点,这两个点构成一个向量,
k
i
n
g
king
king和
q
u
e
u
e
queue
queue这两个点也构成一个向量,类比的实质就是这两个向量是平行的或者相差较小。所以,所有与性别相关的词对都可以做一个向量,这些向量的方向相近,这些向量的方向就是偏差的方向。我们从字典里筛选出那些词对,然后对每一个词对求这个向量并对所有的取平均值,就求出来了偏差的方向。取与偏差方向向量正交的向量就是无差方向(如果是一个高维空间其实无差方向是有很多的,可以确定一组相互正交的向量作为无偏方向)如下图所示:
上图中横着的向量就是偏差方向的向量,为了简化教学 A n d r e w Andrew Andrew假设这就是一个二维空间,所以直接在平面上做出了无偏方向向量,中间的竖线。在实际运用中,对于高维向量空间会采用一个更为复杂的叫做 S V U SVU SVU的算法也就是奇值分解法,如果你对主成分分析了解的话,那么奇值分解这个算法的一些方法和主成分分析其实很类似。 - 中和:需要对那些词向量存在偏差的词比如 d o c t o r 、 b a b y s i s t e r . . . doctor、babysister... doctor、babysister...(因为这些词在定义中不包含明显的性别趋向)进行处理消除偏见。消除偏见的方法就是向无偏向量的方向做投影消除偏差,如上图所示。
- 均衡:对于那些本来就应该有偏差的词比如 g r a n d m a 、 g r a n d p a grandma、grandpa grandma、grandpa且以这两个词为例,我们希望这两个词的词向量仅在性别这一趋向上存在偏差,但是如上图所示两者到无偏向量的距离其实不相等,所以对于两者我们要做均衡调整,将他们调整到距离无偏向量距离相等的位置。
- 这一节我觉得只是进行了简略的介绍,很多细节并没有详细讲述,只是说了一些处理的思想具体详情还需要自行查看论文。