速通机器学习2

参考资料:《速通机器学习》北大博士后AI卢菁

因为原文公式全部炸了,难以阅读,故在学习过程中编写了此笔记,精简了原文并添加了一定自己的理解(所以会有很多不严谨的地方),如有错误感谢指出。

第七章 集成学习

7.1 决策树

在决策树中,我们会依次判断各个特征是否满足预设条件,得到最终的决策结果。非叶子节点选择一个特征进行决策,这个特征称为决策点,叶子节点则表示最终的决策结果。

一个好的决策点可以把所有数据(例如商品)分为两部分(左子树和右子树),各部分数据所对应的类别应尽可能相同(例如购买或不购买),即两棵子树中的数据类别应尽可能“纯”(这种决策点有较高的区分度)

可以使用基尼(Gini)系数来量化数据的混乱程度。基尼系数的计算公式如下:

G = 1 − ∑ i = 1 k p k 2 G=1−∑^k_{i=1}p^2_k G=1i=1kpk2

基尼系数越大说明系统不确定性越高(或越随机),基尼系数越小说明系统的不确定性越低(或越确定)

在二分类中,不难发现数据只有一个类别时, G = 1 − 1 2 = 0 G=1-1^2=0 G=112=0数据最纯,概率相等的时候 G = 1 − 2 ∗ ( 1 / 2 ) 2 = 0.5 G=1-2*(1/2)^2=0.5 G=12(1/2)2=0.5数据最不纯。

决策树有一些常用的构建方法,在这里我们详细讲解一下最为流行的CART树。CART树是一棵二叉树,它不仅能完成分类任务,还能完成数值预测类的回归任务。下面先介绍分类树,再介绍回归树。在构建CART树时,可以使用基尼系数来度量决策条件的合理性。

假设有 N N N个训练样本,特征一共有 m m m维,即 x = [ x 1 , ⋯   , x m ] x=[x_1,\cdots,x_m] x=[x1,,xm]。这里的特征 x i x_i xi既可以时连续纸也可以是离散值。

假设我们使用划分条件 c o n d cond cond将一组样本 D a t a Data Data划分为 D a t a 1 Data_1 Data1 D a t a 2 Data_2 Data2,其中 D a t a 1 Data_1 Data1 M 1 M_1 M1个样本, D a t a 2 Data_2 Data2 M 2 M_2 M2个样本。那么我们定义此次划分的基尼系数为两个子集的 G i n i Gini Gini系数加权求和:

G i n i ( c o n d ) = M 1 M 1 + M 2 G i n i ( D a t a 1 ) + M 2 M 1 + M 2 G i n i ( D a t a 2 ) Gini(cond)=\cfrac{M_1}{M_1+M_2}Gini(Data_1)+\cfrac{M_2}{M_1+M_2}Gini(Data_2) Gini(cond)=M1+M2M1Gini(Data1)+M1+M2M2Gini(Data2)

G i n i ( c o n d ) Gini(cond) Gini(cond)越小,说明 c o n d cond cond划分越合理。

因此一个简单的想法是:遍历所有维度 ( i = 1 , 2 , 3 , ⋯ , m ) (i=1,2,3,⋯,m) i=1,2,3,,m中可能的划分条件,对每种划分方法均可计算相应的基尼系数,以最小基尼系数所对应的特征和划分条件为决策点,数据将被划分为两堆。。但是,决策树是不停生长的,仅划分一次是不够的,需要再使用同样的方法对每个子堆(Data 1、Data 2)进行划分

  • 当前节点的数据集为 D。如果样本数量小于阈值、基尼系数小于阈值或没有特征,则返回决策子树,当前节点停止递归
  • 在当前节点的数据上计算各个特征的各个划分条件对划分后的数据的基尼系数。当维度过高且每维所对应的可取值比较多时(例如,价格的值为 1~10000 的整数,将有10000种划分方式;如果为浮点数,划分方式更多),可以随机选取一些特征和划分条件,不再强制要求全部遍历
  • 在计算出来的各个特征的各个特征值对数据集 D 的基尼系数中,选择基尼系数最小的特征$ x_i$ 和对应的划分条件,例如“ x i > 10 x_i>10 xi>10”或“ x i = x_i= xi=本科”。通过划分条件把数据集划分成 Data1 和 Data2 两部分,同时分别建立当前节点的左节点和右节点,左节点的数据集为 Data1,右节点的数据集为 Data2。
  • 对 Data1 和 Data2 递归调用以上步骤,生成决策树。

决策树建立后,每个叶子节点里都有一堆数据。可以将这堆数据的类别比例作为叶子节点的输出

以上介绍的是分类树,回归树除了使用方差代替基尼系数来度量数据的纯度,其他均与分类树一致叶子节点输出的值为该节点所有样本目标值的平均值

7.2 随机森林

然而,令人遗憾的是,在测试集(真实场景)中,决策树非常容易发生过拟合,其原因之一就是规则太“硬”。例如,以“年龄>25岁”为条件进行划分,那么26岁和24岁所对应的类别有本质区别吗?当然没有。可见,决策树把特征绝对化了。

决策树过于在意降低经验风险,其代价是结构风险较高(决策树不停生长,模型的复杂度越来越高),这也是和奥卡姆剃刀定律相悖的。通过上述分析可以发现,决策树的泛化能力不好,容易学到一些极端特例,非常容易出现过拟合。

综上所述,决策树出现过拟合的原因在于,模型不仅容易对个别特征及其取值过于敏感,还容易被个别样本影响。为了消除这些问题,我们可以选取部分特征及部分数据来构建决策树,从而在大概率上忽略极端数据。这是一个双重随机过程,具体如下:

  1. 第一次随机:设全体样本数为 N N N有放回地随机抽取 M M M条数据作为训练样本。
  2. 第二次随机:在抽取的 M M M条样本当中,从所有特征 x = [ x 1 , x 2 , ⋯   , x m ] T x=[x_1,x_2,\cdots,x_m]^T x=[x1,x2,,xm]T中随机选取特征,并且忽略其它特征。

通过双重随机选取训练样本和特征,可以构建决策树 h 1 h_1 h1。重复这个双重随机过程,构建决策树 h 2 , ⋯   , h k h_2,\cdots,h_k h2,,hk。这 K K K颗决策树组成一个森林,称为随机森林 Random Forest。将这 K 棵决策树的分类结果的平均值作为最终结果,即 : y ′ = 1 K ∑ i = 1 K h i ( x ) y^{'}=\frac{1}{K}\sum_{i=1}^Kh_i(x) y=K1i=1Khi(x)。(即每一颗树都会给出不同类别的概率,最终的输出是这些概率的平均)

为什么随机森林表现更好:在随机森林中,每棵决策树都是一个强分类器。强分类器在训练集上的分类效果很好,但会带来过拟合问题,而过拟合问题产生的原因就是分类器学会了数据中的随机噪声。分类器在有噪声的数据中学习,等价于给各个分类器注入了噪声。因为随机森林的预测结果是多棵决策树投票决定的,而单棵决策树由于数据噪声出现导致的分类错误会通过求平均值的计算得以消除,所以,随机森林的表现一般要优于单棵决策树。

7.3 GBDT

在二分类决策树中,将特征输入决策树,会得到分类结果 h ( x ) h(x) h(x) 决定了特征 x 将落入哪个叶子节点,并给出了对应的输出(值域为 [0,1])。叶子节点的输出只能是 [0,1],这是一个强限制。多个分类器的集成(随机森林)只能通过求平均值的方式进行,以保证最终结果的值域为 [0,1]。

梯度升级决策树(Gradient Boosting Decision Tree,GBDT)和随机森林的区别就在于:随机森林是直接获得分类概率,而GBDT是获得值域 ( − ∞ , + ∞ ) (-\infin,+\infin) (,+)的值,然后概率为 s i g m o i d ( ∑ i = 0 K h i ( x ) ) sigmoid(\sum_{i=0}^K h_i(x)) sigmoid(i=0Khi(x))

这样做有什么好处呢?GBDT可以使每棵决策树的训练目标不再是最终分类结果,而是前面 k 棵决策树的结果和最终目标的差异(Gap)。这也决定了训练GBDT中的决策树需要采用串行方法:训练前 k 棵决策树,计算前 k 棵决策树的分类结果 y ′ = 1 1 + e − ∑ m = 0 k h m ( x ) y^{'}=\frac{1}{1+e^{-\sum^k_{m=0}h_m(x)}} y=1+em=0khm(x)1和真实目标 y y y之间的误差,在训练第 k + 1 k+1 k+1颗决策树时,目标就是这个误差。

下面具体分析GBDT的学习过程:

令当前已经完成了前 k k k颗决策树的学习,那么当前的学习器为 F k ( x ) = ∑ m = 0 k h m ( x ) F_k(x)=\sum_{m=0}^kh_m(x) Fk(x)=m=0khm(x)也就是说当前学习器对于样本 { x i , y i } \{x_i,y_i\} {xi,yi}的预测结果为 1 1 + e − F k ( x ) \frac{1}{1+e^{-F_k(x)}} 1+eFk(x)1,使用 K L KL KL距离来度量 y i ′ y_i^{'} yi y i y_i yi之间的差异,有: L o s s i = − y i log ⁡ y i ′ − ( 1 − y i ) log ⁡ ( 1 − y i ′ ) Loss_i=-y_i\log{y_i^{'}}-(1-y_i)\log{(1-y_i^{'})} Lossi=yilogyi(1yi)log(1yi)

在GBDT中,添加 h k + 1 ( x ) h_{k+1} (x) hk+1(x) 的目标是减小 L o s s i Loss_i Lossi,那么 h k + 1 ( x ) h_{k+1} (x) hk+1(x) 取多少才合适呢?

通过对梯度下降法的分析可以知道,为了使 L o s s i Loss_i Lossi 变小, F k + 1 ( x ) F_{k+1} (x) Fk+1(x) 应朝着 − ∂ L o s s i ∂ F k ( x i ) -\cfrac{\partial Loss_i}{\partial F_k(x_i)} Fk(xi)Lossi的方向变化。我们这里令这个方向为 r i , k + 1 = − ∂ L o s s i ∂ F k ( x i ) = y i − y i ′ r_{i,k+1}=-\cfrac{\partial Loss_i}{\partial F_k(x_i)}=y_i-y_i^{'} ri,k+1=Fk(xi)Lossi=yiyi

在训练回归树 t k + 1 ( x ) t_{k+1}(x) tk+1(x)时,使用的训练样本为 { x i , r i , k + 1 } i = 1 N \{x_i,r_{i,k+1}\}_{i=1}^N {xi,ri,k+1}i=1N

注意,这里训练的回归树是 t k + 1 ( x ) t_{k+1}(x) tk+1(x),而不是 h k + 1 ( x ) h_{k+1}(x) hk+1(x)。主要原因是: r i , k + 1 r_{i,k+1} ri,k+1是下一刻决策树的目标方向,而不是真实值,所以 t k + 1 ( x ) t_{k+1}(x) tk+1(x)只能提供正确的树结构,但是叶子节点的输出值需要修正。若 t k + 1 ( x ) t_{k+1}(x) tk+1(x) j = 1 , 2 , ⋯   , J k + 1 j=1,2,\cdots,J_{k+1} j=1,2,,Jk+1个叶子节点,则每个叶子节点的输出可以修订为:

c k + 1 , j = ∑ x i ∈ R k + 1 , j r i , k + 1 ∑ x ∈ R k + 1 , j ( y i − r i , k + 1 ) ( 1 − y i + r i , k + 1 ) c_{k+1,j}=\cfrac{\underset{x_i\in R_{k+1,j}}{\sum}r_{i,k+1}}{\underset{x\in R_{k+1,j}}{\sum}(y_i-r_{i,k+1})(1-y_i+r_{i,k+1})} ck+1,j=xRk+1,j(yiri,k+1)(1yi+ri,k+1)xiRk+1,jri,k+1

其中 R k + 1 , j R_{k+1,j} Rk+1,j为训练集中被 t k + 1 ( x ) t_{k+1}(x) tk+1(x)划分至叶子节点 j j j的数据集合。

上述迭代步骤总结如下:

请添加图片描述

最后学习器更新为 F k + 1 ( x ) = F k ( x ) + h k + 1 ( x ) F_{k+1}(x)=F_k(x)+h_{k+1}(x) Fk+1(x)=Fk(x)+hk+1(x).

上述过程就是递归训练 h k ( x ) h_k (x) hk(x)。作为递归的开始,可直接令 h 0 ( x ) = log ⁡ ( P / ( 1 − P ) ) h_0 (x)=\log{(P/(1-P))} h0(x)=log(P/(1P)),P 表示类别为 y=1 的样本在所有样本中的占比。

第八章 深度神经网络

注意,在这一章中,我们默认 a ( l ) a^{(l)} a(l)代表第 l l l层的参数 a a a

8.1 BP神经网络的基本原理

为了解决逻辑回归的数据线性不可分问题,回顾之前我们提到的解决方法:

  1. 人工组合高维特征
  2. 自动交叉二阶特征:例如,FM(Factorization Machine)算法可自动进行所有二阶特征的交叉。不过,FM算法只能进行二阶交叉,如果需要进行更高阶的交叉(例如“女性”“年轻”“双十一”的交叉),FM算法就无能为力了。
  3. SVM+核方法:可以将特征投影到超高维空间。由于可选的核函数种类有限,SVM升维的“花样”不多,并且伴随着巨大的运算量。

是否有一种方法,可以根据实际分类任务自动进行特征组合变换呢?答案是肯定的。

对输入特征 x = [ x 1 , x 2 , ⋯   , x n ] x=[x_1,x_2,\cdots,x_n] x=[x1,x2,,xn]乘以一个 n × m n\times m n×m的矩阵 W W W得到变换后的特征 d = [ d 1 , d 2 , ⋯   , d m ] d=[d_1,d_2,\cdots,d_m] d=[d1,d2,,dm],然后对中间层的每一个元素做一个非线性变换(激活函数 f f f)得到 a = [ a 1 , a 2 , ⋯   , a m ] a=[a_1,a_2,\cdots,a_m] a=[a1,a2,,am]。最后再对 a a a作逻辑回归或者线性回归。

这就是经典的BP(Back Propagation)网络,也称为多层感知器(Multi-Layer Perceptron,MLP)。

BP网络对输入特征进行一次特征变换,采用的方法是“线性变换 + 非线性激活函数”。有研究证明,只要变换后的特征神经元的数量(维度)足够多(高),BP网络就能解决所有分类问题。一般来说,为了使模型性能更好,通常会采用多次特征变换。

激活函数的必要性:如果没有激活函数的话,因为神经网络各层之间阿计算都为矩阵相乘,如果对输入进行两次特征变换:

a ( 1 ) = W ( 1 ) x + w 0 ( 1 ) a ( 2 ) = W ( 2 ) a ( 1 ) + w 0 ( 2 ) a ( 2 ) = W ( 2 ) ( W ( 1 ) x + w 0 ( 1 ) + w 0 ( 2 ) = W ( 2 ) W ( 1 ) x + W ( 2 ) w 0 ( 1 ) + w 0 ( 2 ) \begin{equation}\begin{split}a^{(1)}&=W^{(1)}x+w_0^{(1)} \\ a^{(2)}&=W^{(2)}a^{(1)}+w_0^{(2)} \\ a^{(2)}&=W^{(2)}(W^{(1)}x+w_0^{(1)}+w^{(2)}_0=W^{(2)}W^{(1)}x+W^{(2)}w^{(1)}_0+w^{(2)}_0 \end{split}\end{equation} a(1)a(2)a(2)=W(1)x+w0(1)=W(2)a(1)+w0(2)=W(2)(W(1)x+w0(1)+w0(2)=W(2)W(1)x+W(2)w0(1)+w0(2)

可以发现在没有激活函数的情况下,做两次特征变换等价于作一次特征变换(令 W = W ( 2 ) W ( 1 ) , w 0 = W ( 2 ) w 0 ( 1 ) + w 0 ( 2 ) W=W^{(2)}W^{(1)},w_0=W^{(2)}w_0^{(1)}+w_0^{(2)} W=W(2)W(1),w0=W(2)w0(1)+w0(2)),那么多次特征变换将等价于一次特征变换,深度神经网络在特征提取方面就失去了意义(这也是使用激活函数存在的必要性)。

8.2 多分类与Softmax函数

对于多分类任务,假设我们经过多层感知器之后得到特征向量 d = [ d 1 , d 2 , ⋯   , d m ] d=[d_1,d_2,\cdots,d_m] d=[d1,d2,,dm]。对于各种种类互斥的情况,我们可以使用softmax函数,来得到每个分类的概率,并且概率之和为1。

y k = s o f t m a x ( k , d 1 , ⋯   , d n ) = e d k ∑ i = 1 n e d i y_k=softmax(k,d_1,\cdots,d_n)=\cfrac{e^{d_k}}{\sum^n_{i=1}e^{d_i}} yk=softmax(k,d1,,dn)=i=1nediedk

如果不互斥,即可以同时被分为多类,那么对每个 d i d_i di使用sigmoid函数。

与二分类相同,我们还是使用选择KL距离作为损失函数。

8.3 梯度下降法和链式法则

请添加图片描述
在这里插入图片描述
在这里插入图片描述

当神经网络层数较多时,会出现梯度爆炸或者梯度消失的情况,这是因为,如果激活函数的导数小于1,根据链式求导法则,靠近输入层的参数的梯度因为乘了很多的小于1的数而越来越小,最终就会趋近于0,例如sigmoid函数,其导数 f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f^′(x)=f(x)(1−f(x)) f(x)=f(x)(1f(x))的值域为 ( 0 , 1 / 4 ) (0,1/4) 01/4,极易发生这种情况。反之如果激活函数的导数大于1,则容易发生梯度爆炸。如下图所示,为梯度爆炸和梯度消失产生的原因。

在这里插入图片描述

详细请见:梯度消失、梯度爆炸及其表现和解决方法

梯度消失爆炸的解决方法:

  1. 重新设置网络结构,减少网络层数,调整学习率(消失增大,爆炸减小)。
  2. 激活函数采用 R e L U , l e a k y   R e L U , e l u ReLU,leaky\ ReLU,elu ReLU,leaky ReLU,elu等。
  3. b a t c h n o r m a l i z a t i o n batch normalization batchnormalization
  4. 更换参数初始化方法(对于CNN,一般用 x a v i e r xavier xavier或者 m s r a msra msra的初始化方法)
  5. 调整深度神经网络的结构
  6. 使用残差模块,DESNET模块或LSTM等结构(避免梯度消失)
  7. l1、l2正则化(避免梯度爆炸)
  8. 减小学习率、减小batch size(避免梯度爆炸)
  9. 梯度裁剪(避免梯度爆炸)例如对于RNN,加入gradient clipping,每当梯度达到一定的阈值,就把他们设置回一个小一些的数字;

第九章 神经网络调优

9.1 激活函数选型

t a n h ( d ) = s i g m o i d ( 2 d − 1 ) = e d − e − d e d + e − d tanh(d)=sigmoid(2d-1)=\cfrac{e^d-e^{-d}}{e^d+e^{-d}} tanh(d)=sigmoid(2d1)=ed+ededed

s i g m o i d ( d ) = 1 1 + e − d sigmoid(d)=\cfrac{1}{1+e^{-d}} sigmoid(d)=1+ed1

可以看出,Sigmoid函数、Tanh函数的导数都小于1,如果多次相乘,就会趋近于0。在梯度消失问题上,Tanh函数的导数值比Sigmoid函数大一些,因此梯度消失问题的影响相对小一些。

Tanh函数和Sigmoid函数都有饱和区,如图9-2所示。在饱和区内,输入 d 的变化几乎不会引起输出 a 的变化,也就是说,输入的变化对输出的影响极小,并且 ∂ a / ∂ d ≈ 0 ∂a/∂d≈0 a/d0,参数将得不到学习。

在这里插入图片描述

梯度消失和激活函数饱和问题困扰了业界多年,导致神经网络的发展长期停滞不前。直到将 R e L U ReLU ReLU函数作为激活函数,这些问题才得以解决.

R e L U ( x ) = { x ,   i f   x ≥ 0 0 ,   i f   x < 0 ReLU(x)=\begin{cases}x,\ if\ x\geq 0 \\ 0,\ if\ x<0\end{cases} ReLU(x)={x, if x00, if x<0

d ≥ 0 d ≥ 0 d0 时, ∂ a / ∂ d = 1 ∂a/∂d=1 a/d=1,反向传播不会造成梯度消失和梯度爆炸,且没有饱和区。当 d < 0 d<0 d<0 时,梯度为0,本次传播中该神经元“死亡”——这是彻底的消失,也是饱和的形式之一。

真死是指对于任何输入,恒有 w j ( l ) a ( l − 1 ) < 0 → a ( l ) = 0 w_j^{(l)} a^{(l-1)}<0\rightarrow a^{(l)}=0 wj(l)a(l1)<0a(l)=0。因为上一层的输出经过过 R e L U ReLU ReLU函数所以 a ( l − 1 ) ≥ 0 a^{(l-1)}\geq 0 a(l1)0,所以真死是由于$ w_j^{(l)}$均为非常大的负数。

R e L U ReLU ReLU激活函数的神经元死亡问题,在绝大多数情况下都属于假死。适量的假死其实不是坏事,甚至能够提升神经网络的效果,原因如下:若神经元都不会死亡, R e L U ReLU ReLU函数相当于是个恒等函数,相当于没有,深层网络将退化成一层网络。

为了避免神经元大量死亡,同时具备非线性处理能力, R e L U ReLU ReLU函数的诸多变体出现了。其中, L R e L U ( L e a k y − R e L U ) LReLU(Leaky-ReLU) LReLULeakyReLU函数的应用相对广泛,其中,k 为超参数,取值一般在0和1之间,表达式为:

L R e L U ( x ) = { x ,   i f   x ≥ 0 k x ,   i f   x < 0 LReLU(x)=\begin{cases}x,\ if\ x\geq 0 \\ kx,\ if\ x<0\end{cases} LReLU(x)={x, if x0kx, if x<0

9.2 权重初始化

初始化时,如果位于同一层的两个神经元和前一层的神经元的连接系数相同,和后一层的神经元的连接系数也相同,那么它们的输出相同,在训练阶段得到的更新也相同,其后果是,看上去是两个神经元,但其实相当于只有一个神经元。

因此,在随机初始化神经元时,我们要主动破坏参数矩阵 W W W 的对称性,如果选择了 R e L U ReLU ReLU作为激活函数,还需要避免初始 W W W均大于 0 0 0或者均小于 0 0 0。考虑使用正态分布来初始化参数,令正太分布的均值为 μ i , j ( l ) \mu_{i,j}^{(l)} μi,j(l)和方差 σ i , j ( l ) \sigma_{i,j}^{(l)} σi,j(l)

参考 8.1 中对多层感知机的定义,我们令 M l M^{l} Ml来表示第 l l l层神经元的个数,下面对不同的激活函数进行分析:

对输入特征 x = [ x 1 , x 2 , ⋯   , x n ] x=[x_1,x_2,\cdots,x_n] x=[x1,x2,,xn]乘以一个 n × m n\times m n×m的矩阵 W W W得到变换后的特征 d = [ d 1 , d 2 , ⋯   , d m ] d=[d_1,d_2,\cdots,d_m] d=[d1,d2,,dm],然后对中间层的每一个元素做一个非线性变换(激活函数 f f f)得到 a = [ a 1 , a 2 , ⋯   , a m ] a=[a_1,a_2,\cdots,a_m] a=[a1,a2,,am]。最后再对 a a a作逻辑回归或者线性回归。

如果激活函数为 R e L U ReLU ReLU,那么 d j ( l ) d_j^{(l)} dj(l) 不宜过大。过大的 d j ( l ) d_j^{(l)} dj(l) 会直接导致 a j ( l ) a_j^{(l)} aj(l) 过大,使 a j ( l ) a_j^{(l)} aj(l) 在传递给下一层时被放大(对 a j ( l ) a_j^{(l)} aj(l) 加权求和)。经过层层放大,最终的值将会溢出。

如果采用 S i g m o i d 、 T a n h 、 S o f t m a x Sigmoid、Tanh、Softmax SigmoidTanhSoftmax等有饱和区的激活函数,那么 d j ( l ) d_j^{(l)} dj(l) 也不宜过大。 d j ( l ) d_j^{(l)} dj(l) 过大会直接导致进入激活函数的饱和区,产生梯度消失。

从前向传播的角度看,由于 d j ( l ) d_j^{(l)} dj(l) M ( l − 1 ) M^{(l-1)} M(l1) w i , j ( l ) w_{i,j}^{(l)} wi,j(l) 均成正相关,所以,要想使 d j ( l ) d_j^{(l)} dj(l) 的值的数量级保持不变, w i , j ( l ) w_{i,j}^{(l)} wi,j(l) M ( l − 1 ) M^{(l-1)} M(l1) 应有如下近似关系: w i , j ( l ) ∝ 1 M ( l − 1 ) w_{i,j}^{(l)}\propto \cfrac{1}{M^{(l-1)}} wi,j(l)M(l1)1,即上一层的神经元数量越多,本层的权重就越小,以确保权重求和后的值大小稳定。

又因为 w i , j ( l ) ∝ σ i , j ( l ) w_{i,j}^{(l)} \propto \sigma_{i,j}^{(l)} wi,j(l)σi,j(l)所以可以得到 σ i , j ( l ) ∝ 1 M ( l − 1 ) \sigma_{i,j}^{(l)}\propto \cfrac{1}{M^{(l-1)}} σi,j(l)M(l1)1

从反向求导的角度看, ∂ L o s s ∂ a i ( l − 1 ) \cfrac{∂Loss}{∂a_i^{(l-1)}} ai(l1)Loss M ( l ) 、 w i , j ( l ) M^{(l)}、w_{i,j}^{(l)} M(l)wi,j(l) 成正相关,如果 ∂ L o s s ∂ a i ( l − 1 ) \cfrac{∂Loss}{∂a_i^{(l-1)}} ai(l1)Loss过大会导致梯度爆炸,如果 ∂ L o s s ∂ a i ( l − 1 ) \cfrac{∂Loss}{∂a_i^{(l-1)}} ai(l1)Loss过小会发生梯度消失,于是同理可以推导出 σ i , j ( l ) ∝ 1 M ( l ) \sigma_{i,j}^{(l)}\propto \cfrac{1} {M^{(l)}} σi,j(l)M(l)1

通过分析,再加上一点经验,就可以得到对不同激活函数采样 w i , j l w_{i,j}^l wi,jl 时的均匀分布了:

S i g m o i d Sigmoid Sigmoid函数: w i , j ( l ) ∼ U ( 96 M ( l − 1 ) + M ( l ) , 96 M ( l − 1 ) + M ( l ) ) w_{i,j}^{(l)} \sim U(\sqrt{\cfrac{96}{M^{(l-1)}+M^{(l)}}},\sqrt{\cfrac{96}{M^{(l-1)}+M^{(l)}}}) wi,j(l)U(M(l1)+M(l)96 ,M(l1)+M(l)96 )

T a n h Tanh Tanh函数: w i , j ( l ) ∼ U ( 6 M ( l − 1 ) + M ( l ) , 6 M ( l − 1 ) + M ( l ) ) w_{i,j}^{(l)} \sim U(\sqrt{\cfrac{6}{M^{(l-1)}+M^{(l)}}},\sqrt{\cfrac{6}{M^{(l-1)}+M^{(l)}}}) wi,j(l)U(M(l1)+M(l)6 ,M(l1)+M(l)6 )

R e L U ReLU ReLU函数: w i , j ( l ) ∼ U ( 12 M ( l − 1 ) + M ( l ) , 12 M ( l − 1 ) + M ( l ) ) w_{i,j}^{(l)} \sim U(\sqrt{\cfrac{12}{M^{(l-1)}+M^{(l)}}},\sqrt{\cfrac{12}{M^{(l-1)}+M^{(l)}}}) wi,j(l)U(M(l1)+M(l)12 ,M(l1)+M(l)12 )

这种初始化方法叫作 X a v i e r Xavier Xavier

9.3 改进型梯度下降法

9.3.1 随机梯度下降法

在使用梯度下降法时,首先需要求出损失函数对参数的梯度。它是在所有样本上的对应梯度的平均值,即 ∂ L o s s ∂ W = 1 N ∑ i = 1 N ∂ L o s s ( i ) ∂ W \cfrac{\partial Loss}{\partial W}=\cfrac{1}{N}\sum_{i=1}^N\cfrac{\partial Loss_{(i)}}{\partial W} WLoss=N1i=1NWLoss(i)​,在真实的场景中,N 的值往往非常大(高达百万),因此,计算

一次 ∂ L o s s / ∂ W ∂Loss/∂W Loss/W 耗费的时间非常长。然而,计算一次 ∂ L o s s / ∂ W ∂Loss/∂W Loss/W 只能完成 W W W 的一次更新,而 W W W 一般要经过多次迭代更新才能使 L o s s Loss Loss 的值下降到可以被接受的程度。所以,整个学习过程带来的运算量和时间的消耗往往是海量的且不可接受的。

因此想要提高 ∂ L o s s ∂ W \cfrac{\partial Loss}{\partial W} WLoss的计算速度,不需要对所有样本都计算平均值,只需要从样本中随机选取 b a t c h _ s i z e batch\_size batch_size个并求平均梯度,公式如下: ∂ L o s s _ S G D ∂ W = 1 b a t c h _ s i z e ∑ i ∈ b a t c h ∂ L o s s ( i ) ∂ W \cfrac{\partial Loss\_SGD}{\partial W}=\cfrac{1}{batch\_size}\underset{i\in batch}{\sum}\cfrac{\partial Loss_{(i)}}{\partial W} WLoss_SGD=batch_size1ibatchWLoss(i)

这种通过随机采集样本来计算梯度的方法称为随机梯度下降(Stochastic Gradient Descent,SGD)。SGD由于拥有众多优点,已经成为神经网络学习的常用优化方法。

例如,有 N = 128000 N=128000 N=128000 个训练样本, b a t c h _ s i z e = 128 batch\_size=128 batch_size=128。使用SGD将训练样本随机分成 N / b a t c h _ s i z e = 1000 N/batch\_size=1000 N/batch_size=1000 份,每份的数据量为 b a t c h _ s i z e = 128 batch\_size=128 batch_size=128。在训练过程中,依次使用这1000份样本计算梯度并更新 W。将1000份数据都训练完,就完成了一个epoch。在一个epoch中,所有的训练样本都会参与梯度更新,即网络遍历所有训练样本。如果使用全量梯度,那么遍历128000个训练样本后 W 只会更新一次,而在SGD中参数更新了 N / b a t c h _ s i z e = 1000 N/batch\_size=1000 N/batch_size=1000 次。

如果 b a t c h _ s i z e batch\_size batch_size较大,则一个epoch中参数更新的次数就比较少,如果 b a t c h _ s i z e batch\_size batch_size的值过小,那么每次计算出来的梯度偏差较大,容意引起学习中的震荡。

9.3.2 鞍点问题

在使用梯度下降法更新 W 时,如果 ∂ L o s s / ∂ W ∂Loss/∂W Loss/W 在各个方向上都为0,就表示已经位于损失函数的稳定点, W W W不会再更新了。然而这个各向导数为0的点不一定是极值点,还有可能是鞍点(如下图所示)。

在这里插入图片描述

在高维空间中,各方向的导数均为0的点基本上都是鞍点。例如,在100维的空间中,某个点各方向的导数都为0且各方向为极小值或极大值的概率都为0.5,则该点为局部极大值或极小值的概率是 ( 0.5 ) 100 (0.5)^{100} (0.5)100,为鞍点的概率是 1 − 2 × 0. 5 100 ≈ 1 1-2×0.5^{100}≈1 12×0.51001

幸运的是,鞍点是一个非稳定点,因此,W 在曲面 W-Loss 上时就是鞍点,即 ∂ L o s s / ∂ W = 0 ∂Loss/∂W=0 Loss/W=0。但由于 ( ∂ L o s s _ S G D ) / ∂ W ≠ 0 (∂Loss\_SGD)/∂W≠0 (Loss_SGD)/W=0,所以网络仍然能够继续学习(从而使 W 逃离鞍点)。

9.3.3 梯度下降法的优化

使用深度学习时,虽然会在各维特征上对输入进行数值归一化,以确保各维特征的数量级一致,但神经网络经过多层非线性变化,中间层的输入(例如第 l 层的输入 a ( l − 1 ) a^{(l-1)} a(l1))的各维度的数值量级差异可能很大,产生如下的震荡问题:

在这里插入图片描述

动量法(Momentum):使参数 W 在振荡方向上的变化慢(震荡减弱),在非振荡方向上的变化快(加速学习)。公式如下:

g = ∂ L o s s ∂ W v t = α v t − 1 + ϵ g W t = W t − 1 − v t \begin{equation}\begin{split}g&=\cfrac{\partial Loss}{\partial W}\\ v_t&=\alpha v_{t-1}+\epsilon g \\ W_t&=W_{t-1}-v_t\end{split}\end{equation} gvtWt=WLoss=αvt1+ϵg=Wt1vt

v t v_t vt就是优化过的 L o s s Loss Loss增大最快的方向,因此最后是减 v t v_t vt)动量法一般和SGD配合使用,称为动量SGD。但是,如果连续多次迭代,g 的方向都是相同的,梯度就会一直增大,造成梯度过大,最终导致梯度爆炸。

接下来,我们从学习因子的角度对梯度下降法进行优化。在更新参数时,初始化 W 基本是随机进行的,因此距离最优点 W ∗ W^* W较远,此时学习因子应设置得大一点。通过一段时间的学习和更新,W 与 W ∗ W^* W 的距离较近,此时学习因子应设置得小一些,以免在 W ∗ W^* W 附近振荡。这就需要一种自适应的学习因子——随着学习的进行,学习因子不断减小。

r t = r t − 1 + < g , g > v t = α g r t W t = W t − 1 − v t \begin{equation}\begin{split}r_t&=r_{t-1}+<g,g>\\ v_t&=\cfrac{\alpha g}{\sqrt{r_t}}\\ W_t&=W_{t-1}-v_t\end{split}\end{equation} rtvtWt=rt1+<g,g>=rt αg=Wt1vt

这种方法称为自适应梯度(AdaGrad),也很好理解, r t r_t rt 用于累加所有时刻的梯度幅值,学习因子即为 1 r t \cfrac{1}{\sqrt{r_t}} rt 1

A d a G r a d AdaGrad AdaGrad算法在迭代后期,由于学习率过小(r_t 过大),会导致学习速度过慢,难以收敛。因此,可对 A d a G r a d AdaGrad AdaGrad算法进行改进为 R M S p r o p RMSprop RMSprop,公式如下:

r t = ρ r t − 1 + ( 1 − ρ ) < g , g > v t = α g δ + r t W t = W t − 1 − v t \begin{equation}\begin{split}r_t&=\rho r_{t-1}+(1-\rho)<g,g>\\ v_t&=\cfrac{\alpha g}{\delta+\sqrt{r_t}}\\ W_t&=W_{t-1}-v_t\end{split}\end{equation} rtvtWt=ρrt1+(1ρ)<g,g>=δ+rt αg=Wt1vt

ρ ρ ρ 为0和1之间的常数。r 的每一次更新都是一个加权过程,以削弱之前梯度的影响(使 r 不会过大),且更看重最近时刻的 g, δ δ δ 是一个极小的超参数,用于保证分母不为0。

最后将RMSprop和动量法结合,就得到了Adam(Adaptive Moment Estimation),它结合了诸多算法的优点,已成为近几年训练神经网络的主流算法。

{ v t = ρ 1 v t − 1 + ( 1 − ρ 1 ) g r t = ρ 2 r t − 1 + ( 1 − ρ 2 ) < g , g > v t ′ = v t 1 − ρ 1 t r t ′ = r t 1 − ρ 2 t W t = W t − 1 − α v t ′ δ + r t ′ \left\{\begin{matrix}v_t=\rho_1v_{t-1}+(1-\rho_1)g \\ r_t=\rho_2r_{t-1}+(1-\rho_2)<g,g> \\ v_t'=\cfrac{v_t}{1-\rho_1^t} \\ r_t'=\cfrac{r_t}{1-\rho_2^t} \\ W_t=W_{t-1}-\cfrac{\alpha v_t'}{\delta+\sqrt{r_t'}}\end{matrix}\right. vt=ρ1vt1+(1ρ1)grt=ρ2rt1+(1ρ2)<g,g>vt=1ρ1tvtrt=1ρ2trtWt=Wt1δ+rt αvt

9.4 过拟合解决方案

9.4.1 正则化

为损失函数添加正则项,深度学习可以为各层单独添加正则项,各层正则项所对应的 λ λ λ 也可以不同。

在使用L1正则时,很多权重会趋近于0(稀疏性),这对神经网络来说相当于剪枝,神经网络被剪枝后,运行速度会大幅度提升,因此L1正则非常适合在对实时性要求较高的场景中使用。

9.4.2 Dropout

在神经网络中,直接去除神经元同样可以达到剪枝的目的。此时,与该神经元相连的权重都将被去除。这种每次训练时随机去除部分神经元的方法,称为 D r o p o u t Dropout Dropout。神经网络训练完成后,在预测时不会去除神经元,而会使用完整的网络进行训练。(为了保证训练和预测时一致,训练时将剩余部分除以1.0-dropout rate 或者预测时将结果乘以1.0-dropout rate)

Dropout方法在训练模型时随机去除一些神经元,等价于降低了模型的复杂度及各神经元之间的依赖程度

9.4.3 提前终止

随着迭代次数的增加,Loss 的值会越来越小。如果 Loss 的值过小,那么网络将会学到一些噪声,从而发生过拟合。early Stopping旨在解决epoch的数量需要手动设置的问题,具体做法是:每个epoch(或者每 N 个epoch)结束后,获取验证集上的测试结果;随着epoch数量的增加,如果在验证集上发现测试误差上升,则停止训练,并将停止前的权重作为最终的网络参数。

9.4.4 批标准化和层标准化

  1. 批标准化:如果输入的分布总是发生变化,就意味着该层理想(最优)的权重$ W$ 会不断变化,这会导致学习速度非常慢。例如,已通过训练 W W W 接近最优点 W ∗ W^* W,但若输入的分布发生变化,则对应的 W ∗ W^* W 也会发生变化,网络需要重新学习(网络处于不稳定状态)。

    为了解决这个问题,我们需要在训练阶段使网络各层输入的分布达到稳定状态,即让各层输入数据的分布尽可能稳定不再受SGD随机挑选样本及前层 W 变化的影响。需要注意的是,我们的目的是使输入数据所对应的概率分布保持不变,而不是使输入数据本身保持不变。在这里,采用批标准化(Batch Normalization,BN)的方法对数据进行正规化。

    如下图所示,即在获得 d = [ d 1 , d 2 , ⋯   , d m ] d=[d_1,d_2,\cdots,d_m] d=[d1,d2,,dm]之后和输入到激活函数之前,对 d d d的每一个元素正规化 d i ′ = γ ( l ) d i ( l ) − μ i ( l ) σ i ( l ) + β i ( l ) d'_i=\gamma^{(l)}\cfrac{d_i^{(l)}-\mu_i^{(l)}}{\sigma_i^{(l)}}+\beta_i^{(l)} di=γ(l)σi(l)di(l)μi(l)+βi(l),其中 γ i ( l ) \gamma_i^{(l)} γi(l) β i ( l ) \beta_i^{(l)} βi(l)为待学习参数。

    在这里插入图片描述

    优点:通过对数据进行BN操作,无论训练集中的数据如何随机选取、前端的网络参数如何变化,各层接收的输入的分布在不同的训练阶段都是一致的,这就保证了该层的最优参数达到稳定,进而提高了各层的 W 在训练时的收敛速度。另外,BN操作使网络更稳定,不容易受极端数据的影响,因此,可通过将学习率调高的方法使模型的收敛速度进一步提高。不过,需要注意的是,在配合使用BN和SGD时,每次选取的 batch 的样本量不宜过小(样本量过小会使 μ μ μ σ σ σ 的估计不准确)

  2. 层标准化: 我们知道,当 batch_size 的值过小时,BN会出现均值和方差估计不准的问题。因此,有人提出了一种标准化方式——层标准化(Layer Normalization,LN)。

    令样本 i i i的第 l l l层的均值和方差计算公式如下: μ ( i ) ( l ) = 1 M ( l ) ∑ j = 1 M ( l ) d ( i ) , j ( l ) \mu_{(i)}^{(l)}=\cfrac{1}{M^{(l)}}\sum_{j=1}^{M^{(l)}}d_{(i),j}^{(l)} μ(i)(l)=M(l)1j=1M(l)d(i),j(l) σ ( i ) ( l ) = 1 M ( l ) ∑ j = 1 M ( l ) ( d ( i ) , j ( l ) − μ ( i ) ( l ) ) \sigma_{(i)}^{(l)}=\sqrt{\cfrac{1}{M^{(l)}}\sum_{j=1}^{M^{(l)}}(d_{(i),j}^{(l)}-\mu^{(l)}_{(i)})} σ(i)(l)=M(l)1j=1M(l)(d(i),j(l)μ(i)(l))

    通过上式可以发现,每一个样本都有对应的层标准化的 μ   , σ \mu\ ,\sigma μ ,σ,且相同层的 μ   , σ \mu\ ,\sigma μ ,σ相同。而批标准化是每一批同层对应位置都有相同的 μ   , σ \mu\ ,\sigma μ ,σ

LN和BN是类似的归一化方法。它们的区别在于,在计算 μ μ μ σ σ σ 时,BN取的是不同样本的同一特征,LN取的是同一样本的不同特征(但这些特征在同一层)。在BN和LN都可以使用的场景中,BN的效果通常比LN好,其原因是:基于不同的数据,同一特征得到的归一化特征更不容易造成信息损失。

但是,在一些情况下是不能使用BN的,例如 batch_size 的值较小的场景,以及RNN、LSTM、Attention等变长神经网络。这时,可以使用LN让模型更稳定并实现正则化。

9.4.5 Shortcut

和残差连接差不多?

在标准的神经网络中,层的作用是将输入$ a$ 通过线性变换转换成特征 d d d,即 d = W a d=Wa d=Wa。但有研究表明,把 a a a 转换成 d − a d-a da 的难度小于直接将其转换成 d d d。因此, S h o r t c u t Shortcut Shortcut模型的层变换的目标就是把 a a a 转换成 d − a d-a da,再加上输入 a a a,得到期望的转换结果 d d d。上述操作就是 S h o r t c u t Shortcut Shortcut S h o r t c u t Shortcut Shortcut不仅可以跨越一层,还可以跨越多层

因为其在反向传播求导时,后层就可以直接影响前层,避免了大量中间层导致的梯度消失,所以在比较深的神经网络和一些自然语言处理模型中(transformer)都利用了 s h o r t c u t shortcut shortcut

第十章 自然语言处理

10.1 自然语言处理模型

对于n个词构成的句子,语言模型可以写成如下形式:

P ( w 1 w 2 ⋯ w l ) = Π i = 1 l P ( w i ∣ w 1 ⋯ w i − 1 ) P(w_1w_2\cdots w_l)=\Pi_{i=1}^lP(w_i|w_1\cdots w_{i-1}) P(w1w2wl)=Πi=1lP(wiw1wi1)

但这种方式计算量太大了,如果由20000个常见词,那么估计一个长度为 l l l的句子需要估计 2000 0 l 20000^l 20000l个概率。为了简化,我们假设一个词的概率之和前面的 n − 1 n-1 n1个词有关,这种模型称为 n − g r a m n-gram ngram

例如 2 − g r a m 2-gram 2gram模型中,每个词只与前 n − 1 = 2 − 1 = 1 n-1=2-1=1 n1=21=1个词有关,所以 P ( w 1 w 2 ⋯ w l ) = P ( w 1 ) Π i = 2 l P ( w i ∣ w i − 1 ) P(w_1w_2\cdots w_l)=P(w_1)\Pi_{i=2}^lP(w_i|w_{i-1}) P(w1w2wl)=P(w1)Πi=2lP(wiwi1)

概率 P ( w i ∣ w i − 1 ) P(w_i|w_{i-1}) P(wiwi1)可以通过统计估计,令 P ( w i ∣ w i − 1 ) = w i − 1 w i 出现的次数 w i − 1 出现的次数 P(w_i|w_{i-1})=\cfrac{w_{i-1}w_i出现的次数}{w_{i-1}出现的次数} P(wiwi1)=wi1出现的次数wi1wi出现的次数

但是在直接使用频率作为概率进行估计时,如果有些小概率情况没有在语料中出现,其概率就会直接被计算为0。为了避免出现这个问题,可以使用平滑法,具体如下( δ \delta δ 是人为设置超参数, V V V是词表中的总词数):

P ( w i ∣ w i − 1 ) = δ + w i − 1 w i 出现的次数 δ V + w i − 1 出现的次数 P(w_i|w_{i-1})=\cfrac{\delta+ w_{i-1}w_i出现的次数}{\delta V+ w_{i-1}出现的次数} P(wiwi1)=δV+wi1出现的次数δ+wi1wi出现的次数

10.2 one-hot编码和embedding技术

one-hot编码即用 V V V维向量表示词( V V V是词表中总词数),第 i i i个词除了第 i i i维为1其余全为0。缺点,向量过于稀疏且向量没有语义。因此,可以使用一种稠密的方法来代替one-hot。例如,使用128维的稠密向量表示一个词,这个向量叫作embedding,一个由多个词组成的句子可以由这些词的embedding拼接而成,也可以由这些词的embedding相加而成。

在先前的 n − g r a m n-gram ngram中,我们只能利用上文信息,缺乏对下文的有效利用。可以对 n − g r a m n-gram ngram进行改造,同时利用前面window size个词以及后面window size个词,来对中心词进行预测(预测结果是 V V V维向量,即词表大小作为维度的向量,经过softmax之后,“猫”对应的one-hot那位的预测值应该尽量大)。

我们规定 s o f t m a x ( [ d 1 d 2 ⋮ d V ] ) = 1 ∑ i = 1 V e d i [ e d 1 e d 2 ⋮ e d V ] softmax\left(\left[\begin{matrix}d_1\\ d_2\\ \vdots \\ d_V\end{matrix}\right]\right)=\cfrac{1}{\sum_{i=1}^Ve^{d_i}}\left[\begin{matrix}e^{d_1}\\ e^{d_2}\\ \vdots \\ e^{d_V}\end{matrix}\right] softmax d1d2dV =i=1Vedi1 ed1ed2edV

在这里插入图片描述

如上图所示,在句子“我喜欢猫温顺可爱”,使用大量语料和梯度下降法训练,我们不仅可以得到预测中心词的模型,还可以训练得到每个词所对应的向量,上述模型称为 Word2Vec

在Word2vec中,用周边词预测中心词的模式称为CBOW(Continuous Bag of Words)。除了CBOW模式,还可以用中心词分别预测上下文中的词,该模式称为Skip-gram,如下图所示:

在这里插入图片描述

CBOW和Skip-gram的区别在于:CBOW是用中间词去更新周围词,周围词被误差调整的力度是相同的,就像一位老师(预测“猫”)同时给4个学生(4个输入词)讲课。而在Skip-gram中是用周围词去更新中心词的词嵌入,可见Skip-gram是一个细粒度的学习方法(就像请4位老师分别对4门功课进行定制教学)。不过,与CBOW相比,Skip-gram的训练次数较多,花费的时间较长。

10.3 哈夫曼树和负采样

10.3.1 哈夫曼树

如上图所示,全连接层的参数为 k × V k\times V k×V,比较大(虽然以现在大模型的角度看不是很大,所以这里略过了,希望详细了解可以见原文),所以可以考虑使用哈夫曼树进行优化。具体的,将全连接层变为一个哈夫曼树,每个节点对应一个二分类逻辑回归(哈夫曼编码这一位是1或者0)。因为高频词位于树的浅层,所以预测时需要游走的非叶子节点较少,对应的运算量较小,同时,因为概率项的乘积较小,所以最终的预测概率较大;低频词位于树的深层,对应的计算量较大,最终的预测概率较小。

10.3.2 负采样

在Word2vec中,除了使用哈夫曼树,还可以使用流行的负采样方法来训练模型。

还是因为 V V V比较大,所以计算 ∑ i = 1 V e d i \sum_{i=1}^Ve^{d_i} i=1Vedi复杂度可能较高,因此负采样技术,所以在前向预测阶段无须预测所有类别(V 类)所对应的概率,而是只需要挑选个别的词进行计算做多个二分类预测 ,降低了运算量。

例如,当待预测词为 w o r d _ 3 word\_3 word_3时,随机挑选 w o r d _ 9 word\_9 word_9 w o r d _ 12 word\_12 word_12 作为负样本(不应该被预测出来的词)。

对于 w o r d _ 3 word\_3 word_3,把预测简化成一个二分类任务(类似于逻辑回归),模型预测概率为: P ( w o r d _ 3 ∣ c o n t e x t ) = 1 1 + e − d 3 P(word\_3|context)=\cfrac{1}{1+e^{-d_3}} P(word_3∣context)=1+ed31

同理 P ( w o r d _ 9 ∣ c o n t e x t ) = 1 1 + e − d 9 P(word\_9|context)=\cfrac{1}{1+e^{-d_9}} P(word_9∣context)=1+ed91 P ( w o r d _ 12 ∣ c o n t e x t ) = 1 1 + e − d 12 P(word\_{12}|context)=\cfrac{1}{1+e^{-d_{12}}} P(word_12context)=1+ed121

因此,似然函数为: l i k e h o o d = P ( w o r d _ 3 ∣ c o n t e x t ) ( 1 − P ( w o r d _ 9 ∣ c o n t e x t ) ) ( 1 − P ( w o r d _ 12 ∣ c o n t e x t ) ) likehood=P(word\_3|context)(1-P(word\_9|context))(1-P(word\_{12}|context)) likehood=P(word_3∣context)(1P(word_9∣context))(1P(word_12context))

损失函数为:

L o s s = − ln ⁡ ( l i k e h o o d ) = − ln ⁡ 1 1 + e − d 3 − ln ⁡ ( 1 − 1 1 + e − d 9 ) − ln ⁡ ( 1 − 1 1 + e − d 12 ) Loss=-\ln(likehood)=-\ln{\cfrac{1}{1+e^{-d_3}}}-\ln{(1-\cfrac{1}{1+e^{-d_9}})}-\ln{(1-\cfrac{1}{1+e^{-d_{12}}})} Loss=ln(likehood)=ln1+ed31ln(11+ed91)ln(11+ed121)

在上例中,因为使用了负采样技术,所以在前向预测阶段无须预测所有类别(V 类)所对应的概率,而是做了3个二分类预测,降低了运算量。另外,在计算梯度时,只对 w 3 、 w 9 、 w 12 w_3、w_9、w_{12} w3w9w12(矩阵 W V × k W_{V\times k} WV×k的第3、9、12行) 进行更新(取代了对整个 W 进行更新),提高了训练速度。

实际过程中,负采样的个数为超参数,每个词被采样的经验公式为:

P ( w o r d i ) = c o u n t ( w o r d i ) 3 / 4 ∑ j = 1 V c o u n t ( w o r d j ) 3 / 4 P(word_i)=\cfrac{count(word_i)^{3/4}}{\sum_{j=1}^Vcount(word_j)^{3/4}} P(wordi)=j=1Vcount(wordj)3/4count(wordi)3/4

其中 c o u n t ( w o r d i ) count(word_i) count(wordi)表示 w o r d i word_i wordi在语料库中出现的词数( 由此可知,负采样倾向于高频词 ),3/4次方时经验参数,可以提高低频词被选中的概率,同时这个概率是定值,可以在训练前只计算一次。

10.4 Word2vec的应用

在Word2vec中,每个词所对应的embedding都包含语义信息,因此,可使用embedding来衡量不同词的语义相似度。

不过,需要注意的是:在使用Word2vec时,即使是同一批语料,分别进行两次训练,得到的embedding也不在同一个语义空间中,因此没有可比性;只有在同一次训练中得到的embedding才有可比性。 可见,Word2vec不适合用在增量更新中。如果新增的语料中有新的词,就只能对全部语料重新进行训练。

此外,如果同一批样本数据中出现了明显的隔离现象,那么即使在同一次训练中,也会出现语义空间不同的情况。

10.5 fastText模型的原理及应用

fastText的目的是对文本进行分类,其整体模型结构沿用了Word2vec,只不过最后一层由预测中心词变为预测类别(例如句子情感分类)。

前面提到过,Word2vec是一个词袋模型,它会忽略词出现的顺序。为了解决这个问题,fastText进行了一些改良,对输入增加了n-gram信息。例如,以“水煮鱼 和 红烧肉 真 好吃”为例,当 n=2 时,输入从“水煮鱼”、“和”、“红烧肉”、“真”、“好吃”变为“水煮鱼 和”、“和 红烧肉”、“红烧肉 真”、“真 好吃”。

增加n-gram信息,在一定程度上增加了词序信息,使模型不再是词袋模型,并对词的出现顺序有了一定的敏感性。但是,使用n-gram的缺点是使词数暴增。例如,词表中原本有10万个词,使用2-gram后,理论上词表中的词为 10×10 万个。为了解决这个问题,fastText使用Hash将其映射到 V 2 V_2 V2个embedding当中,虽然不同的n-gram可能恰好对应同一个embedding,导致特征冲突,不过,实践证明,特征冲突带来的负面影响不大。

子词模型 :子词模型是一种字符级的n-gram模型。以词“阿里巴巴”为例,可以先将其转换为“<阿里巴巴>”,“<”表示词的起始位置,“>”表示词的结束位置(<”和“>”也算作字符,因为起始字符和结束字符本身也是一种语义。)。

那么在2-gram下,<阿里巴巴>可以被分解为<阿、阿里、里巴、巴巴、巴>。

在3-gram下,<阿里巴巴>可以被分解为<阿里、阿里巴、里巴巴、巴巴>。

在训练模型时,子词也作为输入一并输入模型,每个子词都有对应的embedding,这样能获得词的内部形态信息。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值