深度神经网络

1.1 BP神经网络的基本原理

逻辑回归因其简单、高效、具有可解释性,在工业界得到了广泛的应用并大放异彩。但是,随着业务越来越复杂,分类任务的难度越来越高,逻辑回归渐渐力不从心。分类任务的难度主要体现在数据的线性不可分上——不同类别的数据犬牙交错,很难用一条简单的直线将数据点分开,如图8-1左图所示。为了降低数据分布的复杂性,一般会对特征进行变换和组合,使低维空间中的数据在高维空间中变成线性可分的,如图8-1右图所示。

图8-1

根据上面的思路,逻辑回归有了诸多改良。

人工组合高维特征:将特征升维至高维空间(如果不怕麻烦,可以进行任意维度和阶次的交叉),从而将低维空间中的线性不可分问题转换成高维空间中的线性可分问题。不过,这种方法会耗费较多的人力,并且需要我们对业务特征有很深的理解。在一些重要的场景中,当算法能力达到瓶颈时,人工组合高维特征往往能够出奇制胜。

自动交叉二阶特征:例如,FM(Factorization Machine)算法可自动进行所有二阶特征的交叉。不过,FM算法只能进行二阶交叉,如果需要进行更高阶的交叉(例如“女性”“年轻”“双十一”的交叉),FM算法就无能为力了。

SVM+核方法:可以将特征投影到超高维空间。由于可选的核函数种类有限,SVM升维的“花样”不多,并且伴随着巨大的运算量。

在本质上,上述经典方法都是对“原始输入特征”做文章,通过对特征的变换和组合,将线性不可分问题转换为线性可分问题。不过,上述方法都是针对特定场景精心设计的,一旦实际场景中的特征组合在设计之外,模型就无能为力了。

是否有一种方法,可以根据实际分类任务自动进行特征组合变换呢?答案是肯定的。例如,在二分类场景中,可使用线性变换对特征 x=[x_1,⋯,x_m ]^T 进行变换,形成新特征,如图8-2所示。

图8-2

在图8-2中,w_j^((1))=[w_(1,j)^((1)),⋯,w_(m,j)^((1)) ]^T,转换后的每一维特征都对原始特征 x 进行了不同

角度的线性变换,公式如下。

x_i 为输入特征的第 i 维。d_j^((1)) 表示经过第一次特征变换后第 j 维的特征。M^((1)) 表示第一次特

征变换后的特征维度,可以大于或小于原始特征维度 m(并无特定要求)。w_(i,j)^((1)) 表示进行第

一次特征变换时,第 i 维输入特征连接至第 j 维输出特征的连接权重。

特征变换通常可以简洁地写成矩阵相乘的形式,公式如下。

一般来说,可以对经过线性变换的特征 d 进行非线性转换,公式如下。

a^((1))=f(d^((1))+〖w0〗^((1)) )=[■(〖f(d〗_1^((1))+〖w0〗_1^((1)))@⋮@〖f(d〗_(M^((1)))^((1))+〖w0〗_(M^((1)))^((1))))]

其中,〖w0〗^((1))=[〖w0〗_1^((1)),⋯,〖w0〗_(M^((1)))^((1)) ]^T 称为偏置项,其作用和逻辑回归中的 w_0 类似,也是待学

习参数,用于提升模型的表达能力。非线性变换函数 f 一般称为激活函数,其中最常见的是

Sigmoid,即 f_Sigmoid (d)=1/(1+e^(-d) )。

把经过非线性变换的特征 a^((1)) 输入逻辑回归模型并进行分类,有

d^((2) )=W^((2) ) a^((1) )

y^'=f_Sigmoid (d^((2))+〖w0〗^((2)) )

整个流程图如图8-3所示(略去偏置项)。在进行二分类时,最后一层的节点的默认激活函数为Sigmoid(为了使输出具有概率意义)。需要注意的是,中间层 f(d^((1))+〖w0〗^((1))) 的激活函数 f 的作用是进行非线性变换,Sigmoid函数只是候选函数之一。如果我们要解决的不是分类问题,而是回归问题,则只需要去掉最后一层的激活函数(中间层仍然需要使用激活函数)。

图8-3

图8-2展示了转换方法(线性组合),具体的转换结果需要由参数 W^((1))、〖w0〗^((1))、W^((2))、〖w0〗^((2)) 决定。它们都是待学习参数,一般是通过训练得到的。当我们以分类为目标学习这些参数时,它们会以分类正确为目标自行调整(相当于用分类任务驱动特征组合)。在画图时,一般会将网络中的参数、激活函数等细节省略。这就是经典的BP(Back Propagation)网络,也称为多层感知器(Multi-Layer Perceptron,MLP),如图8-4所示。

图8-4

在图8-4中,每个节点都接收前一层各个节点的信号的加权和,并在对结果进行累加后激活,激活信息将传递给下一层的节点。这个过程和动物神经元细胞传递信号的过程相似。在动物神经元中,树突用于接收来自其所连接的神经元的信号,轴突尾部的神经末梢负责将经过神经元转换的信号传递给其他神经元。神经元的结构,如图8-5所示。

图8-5

BP网络中的节点(对应于图8-4中的圆形)称为神经元,BP网络也称为神经网络。严格地说,BP网络只是神经网络的一种(本书后续将介绍其他神经网络)。BP网络对输入特征进行一次特征变换,采用的方法是“线性变换 + 非线性激活函数”。有研究证明,只要变换后的特征神经元的数量(维度)足够多(高),BP网络就能解决所有分类问题。但是,“足够多”要多到何种程度并未明示,且神经元数量过多会带来过拟合和运算量过大的问题。层中的神经元数量过多,相当于该层转换后的特征维度过高(这会引发维数灾难)。

一般来说,为了使模型性能更好,通常会采用多次特征变换(不求一次到位,但每次变换得到的特征都能更好地满足任务的要求)的方式进行优化。一次特征变换形成一层神经网络,多次特征变换形成多层神经网络,不同层中的神经元数量可以不同。网络结构如图8-6所示。

图8-6

在多层神经网络中,每一层的输出都是下一层的输入,即

在使用多层神经网络时,特征交叉组合异常丰富,模型具备强大的数据处理能力。一般把每层神经元的个数称为神经网络的宽度(各层的宽度可以不同),把网络层数称为神经网络的深度,因此,多层神经网络也称为深度神经网络(Deep Neural Networks,DNN)。在DNN中,网络层数越多,模型的拟合能力就越强,相应的,模型的复杂度就越高。根据奥卡姆剃刀定律,当模型已经能够较好地完成分类任务时,盲目增加层数就是画蛇添足。

多层神经网络主要用于完成分类任务,在训练阶段仍然使用逻辑回归中的KL距离作为损失函数(这一点与逻辑回归无异)。训练样本 〖{x_((i)),y_((i))}〗_(i=1)^N 在网络上的输出为 y_((i))^',损失函数公式如下。

Loss_((i) )=-y_((i) ) logy_((i))^'-(1-y_((i) ) ) log⁡(1-y_((i))^' )

Loss=1/N ∑_(i=1)^N▒〖Loss_((i) ) 〗

在本节的最后,我们对神经网络使用激活函数的必要性进行说明。如果没有激活函数,那么神经网络各层之间的计算都为矩阵相乘。例如,对输入进行两次特征变换(两层),可以得到

可以看出,两次特征变换等价于一次特征变换,即 a^((2))=Wx+w0。因此,如果神经网络不使用非线性激活函数,那么多次特征变换将等价于一次特征变换,深度神经网络在特征提取方面就失去了意义(这也是使用激活函数存在的必要性)。

1.2 多分类与Softmax函数

在实际应用中,多分类任务也是比较常见的。在经典模型中,因为模型相对简单、参数数量较少,逻辑回归、SVM等模型使用 1 vs N-1 法,通过训练 N 个二分类模型来完成多分类任务,或者使用 1 vs 1 法,通过训练 C_N^2 个分类器来完成多分类任务。但是,在深度学习中,模型参数数量较多、单个模型训练速度较慢,使训练多个模型显得不切实际,而且,因为多分类任务的前层特征变换的目标是一致的,所以可以使用同一套特征,没有必要训练多个模型。因此,我们需要改变模型的输出,使模型能够满足多分类的应用场景。

例如,深层神经网络在处理 C 分类问题时,网络层数为 L,最后一层的宽度为 M^((L))=C,使用Softmax作为最后一层的激活函数,有

y^'=[■(y_1^'@⋮@y_C^' )]=Softmax(d^((L) )+〖w0〗^((L) ) )

=Softmax([■(d_1^((L))+〖w0〗_1^((L))@⋮@d_C^((L))+〖w0〗_C^((L)) )])=1/(∑_(m=1)^C▒e^(d_m^((L))+〖w0〗_m^((L)) ) ) [■(e^(d_1^((L))+〖w0〗_1^((L)) )@⋮@e^(d_C^((L))+〖w0〗_C^((L)) ) )]

其中

d^((L))=[■(d_1^((L))@⋮@d_C^((L)) )],〖w0〗^((L))=[■(〖w0〗_1^((L))@⋮@〖w0〗_C^((L)) )]

以上深层神经网络的结构,如图8-7所示(忽略偏置)。

图8-7

M^((L))=C;y_k^' 表示输入 x 属于类别 k 的概率;∑_(m=1)^C▒e^(d_m^((L))+〖w0〗_m^((L)) ) 用于进行归一化,使各

类别的概率之和为1。可以看出,y_k^' 的值不仅受 d_k^((L))+〖w0〗_k^((L)) 的影响,还受其他所有输出的影响(这一点与Sigmoid函数不同)。e^(d_m^((L))+〖w0〗_m^((L)) ) 也称为logit,它与对应的概率成正比,可以理解成尚未进行归一化的概率。当最后一层的激活函数为Softmax时,训练阶段的损失函数沿用KL距离,即

Softmax函数是一种相对特殊的激活函数,仅用在多分类任务的输出层(中间层一般不使用Softmax函数进行激活)。

Softmax函数和Sigmoid函数一样有饱和区。如果 d_i^((L))+〖w0〗_i^((L) ) 的值过大,Softmax函数

就会进入饱和区。此时,d_i^((L)) 的变化对 y_i 的影响非常小且 ∂L/(∂d_i^((L)) )≈0,模型将丧失学习能力。

因此,需要控制神经网络前层输出的值域,以免Softmax函数达到饱和。

值得注意的是,Softmax函数会对概率进行归一化,使各类别的输出的概率之和为1,即

∑_(j=1)^C▒y_j^' =1,因此,它适用于类别互斥且概率之和为1的场景。例如,在文章情感分类预测

场景中,文章所表达的情感为“1=正面,2=负面,3=中性”,适合使用Softmax函数。但是,预测学历的场景(例如“1=大专,2=本科,3=硕士”)就不适合使用Softmax函数,因为其中存在没有考虑到的情况(例如博士、大专以下),即各类别的概率之和不为1。对各类别的概率之和不为1的情况,可对场景略加改造,增加一个类别,例如将预测类别调整为“1=大专,2=本科,3=硕士,4=其他”,以满足Softmax函数的要求。

在考勤打卡场景中,假设公司有10个人,在进行人脸识别时,有类别“1=张三,2=李四,⋯,10=王五,11=高管,12=老板”。这种场景也不适合使用Softmax函数,因为“高管”和“老板”会与其他类别的人重复,即类别不互斥。在类别不互斥的情况下,例如判断音乐的类型(摇滚、流行、古典等)时,输出层仍然可以使用Sigmoid函数作为激活函数,

但此时不能保证 ∑_(j=1)^C▒y_j^' =1。

1.3 梯度下降法和链式法则

前面我们学习了深度神经网络的基本原理,其关键是在各层使用 W^((l)) 和激活函数进行特征变换。不同的 W^((l)) 对应于不同的特征变换方式。如同逻辑回归的参数,这里的 W^((l)) 也需要通过梯度下降法求解。为了方便讨论,我们设计一个 L 层的神经网络,并用它来完成一个多分类任务,以便了解神经网络是如何进行学习的,如图8-8所示。

图8-8

我们面对的是一个分类任务。在解决 C 分类问题时,选择KL距离作为损失函数(这一点与逻辑回归无异)。

单个训练样本 {x_((i) ),y_((i))} 在神经网络上的输出为 y_((i))^'=[y_((i),1)^',⋯,y_((i),C)^' ]^T,它是一个 C×1 维的向量;真实值为类别 y_((i))=[y_((i),1),⋯,y_((i),C) ]^T,它也是一个 C×1 维的向量,但有且仅有一个元素为1,其他元素为0。如8.2节所述,训练样本 {x_((i)),y_((i))} 的损失函数如下。

类似于逻辑回归,使用梯度下降法对参数 W^((l)) 和 〖w0〗^((l)) 进行学习,步骤如下。

 随机初始化各层的 W^((l))、〖w0〗^((l)),l=1,⋯,L,设当前学习轮数(epoch)count=1。

 计算各层的梯度 ∂Loss/(∂W^((l)) )、∂Loss/(∂〖w0〗^((l)) ),l=1,⋯,L。

 分别更新各层的参数 l=1,⋯,L,即

W^((l) )=W^((l) )-μ ∂Loss/(∂W^((l) ) )

〖W0〗^((l))=〖W0〗^((l))-μ ∂Loss/(∂〖w0〗^((l)) )

μ 为学习因子。count=count+1。当 count=epoch(学习达到指定轮数)时,学习结束,否则返回第步,进行下一轮学习。

梯度下降法的整体流程和逻辑回归一样。在理论上,梯度下降法能使 Loss 下降到较小的值,从而学习到合适的 W^((l)) 和 〖w0〗^((l))。但是,理论不等于实际,当神经网络层数较多(L 的

值较大)时,∂Loss/(∂W^((l)) ) 会存在一些问题,使梯度下降法无法顺利使用。

将异常庞大,最终导致 〖∂Loss〗_((i) )/(∂W^((l)) ) 的值过大,在学习过程中发生震荡,甚至发生数值溢出,这就是所谓“梯度爆炸”。

与此相反,如果 f^'<1,则会导致梯度消失。也就是说,〖∂Loss〗_((i) )/(∂W^((l)) ) 的值过小甚至趋近于0会导致学习速度极慢,W^((l)) 几乎得不到更新。

在深度学习中,越靠前(l 的值越小)的层,〖∂Loss〗_((i) )/(∂W^((l)) ) 的累乘项就越多,越容易发生梯度爆炸(消失)。如果 f 为Sigmoid函数,f^' ≤ 0.25,则极易发生梯度消失。因此,当神经网络较深时,中间层的激活函数一般不采用Sigmoid,而采用ReLU。

ReLU函数的表达式为

a=f(d)={█(0,如果 d<0@d,如果 d≥0)┤

ReLU函数的图像,如图8-9所示。

图8-9

当 d ≥ 0 时

f^' (d)≡1

因此,反向传播不会造成梯度消失。

当 d<0 时

f^' (d)≡0

此时,梯度彻底消失。

在实际应用中,我们不用担心梯度彻底消失,原因如下。

在多层神经网络中,d_((i))^((k)) 是一个向量,因此不太容易出现各维度同时小于0的情况,

也就不太容易出现真正的梯度消失,公式如下。

∂Loss/(∂W^((l)) )=1/N ∑_(i=1)^N▒〖∂Loss〗_((i))/(∂W^((l)) ) 用于求解 N 个样本的梯度的平均值。尽管可能会在个别样本上

发生梯度消失,但在 N 个样本上同时发生梯度消失的概率是非常低的。不过,若因激活函数选取不当而导致网络过深,则在所有数据上必然会发生梯度消失(爆炸)。

1.4 度量学习

深度学习除了用于常见的分类、回归等任务,也可用于对各类数据进行向量化。这种向量化不同于在进行特征提取时根据客观数据直接提取特征的方式,它是以任务驱动的形式来提取特征的(使提取的特征能够满足实际需求)。

度量学习(Metric Learning)是一种空间映射方法,通过神经网络将数据(文字、图片等)映射至共同的向量空间。在向量空间中,匹配样本之间的特征向量距离较近,不匹配样本之间的特征向量距离较远。数据之间的相似性由标注数据给出。不同于分类任务将数据标注为 {x_((i) ),y_((i) )},在度量学习中,x_((i) ) 为模型的输入,y_((i)) 为预测值,标注数据由样本对给出,即

{x_((i) ),x_((j) ),y_((i,j) )}

y_((i,j) )=0 或 y_((i,j) )=1 用于标注数据 x_((i) ),x_((j) ) 是否匹配——匹配的数据应该“相像”。

需要注意的是,y_((i,j) ) 仅用于标注匹配与否,不具备传递性,也就是说,下面的情况是有

可能出现的。

{x_((1) ),x_((2) ),1}

{x_((2) ),x_((3) ),1}

{x_((1) ),x_((3) ),0}

x_((1) ) 和 x_((2) ) 匹配,x_((2) ) 和 x_((3) ) 也匹配,但 x_((1) ) 和 x_((3) ) 不匹配,这可以类比为A和B是朋友,A和C也是朋友,但B和C的关系很差。

一般来说,在大批量数据中,匹配的数据往往是少数,大部分数据是不匹配的。因此,

在实际应用中,往往需要人工标注数据 {x_((i) ),x_((j) ),1},样本 {x_((i) ),x_((k) ),0} 则通过随机配对生

成和正样本等量的数据。

度量学习模型仍使用深度神经网络,但模型结构有所变化,x_((i) ) 和 x_((j) ) 分别通过两个模

型计算 〖vector〗_((i)) 和 〖vector〗_((j)) 之间的距离。需要注意的是,神经网络的最后一层的输出为一

个向量,这个向量使用的激活函数一般是Tanh(非必须),以保证值域为 (-1,1),模型结构如图8-10所示。

图8-10

如果 x_((i) ),x_((j) ) 为同一性质的数据(例如都为文字),那么Model 1和Model 2可对应于

同一个模型,即共享参数;如果需要进行图文匹配等异质数据映射,Model 1和Model 2就是

不同的模型,但它们输出的向量在同一空间内,因此具备可比性。需要注意的是,〖vector〗_((i)) 的维度不宜过高,否则容易发生维数灾难,使距离度量失去意义。

若 x_((i) ) 和 x_((j) ) 为匹配样本,即 y_((i,j))=1,则 D_((i,j)) 越小,Loss 越小。若 y_((i,k))=0,则 D_((i,k))

越大,Loss 越小。m 为阈值,用于防止 D_((i,k)) 无限变大引起的过拟合。hingle 为SVM使用

的损失函数,函数图像如图8-11所示。

图8-11

度量学习也可以用Triplet Loss作为损失函数,公式如下。

Loss=∑_█((i,j,k),@y_((i,j))=1,y_((i,k))=0)▒〖hingle(D_((i,j))-D_((i,k))+m)〗

此时,训练样本为一个三元组,即

{x_((i) ),x_((j) ),x_((k) ) }

满足 y_((i,j))=1,y_((i,k))=0。

Triplet Loss的思想是让负样本对之间的距离大于正样本对之间的距离。首先,选取锚定

样本 x_((i) )。然后,选取 x_((j) ) 和 x_((i) ),组成正样本对。同理,选取 x_((k) ) 和 x_((i) ),组成负样本对。

在训练时,同时使用由三个样本组成的两个 Loss(这就是“Triplet Loss”的由来)。训练完成后,可以将数据(文字或图像等)输入模型,得到其输出向量 vector,如图8-12所示。

图8-12

接下来,通过 vector 之间的距离度量数据之间的差异。一般来说,在使用阶段,度量所用的距离与训练阶段一致。

度量学习有什么优势呢?可以通过分类模型的预测结果来衡量两个数据“像”或“不像”。

此时,模型的输入为 x_((i) ) 和 x_((j) ) 的拼接,如图8-13所示。

图8-13

这种方法也能用 y^' 来度量输入 x_((i) ) 和 x_((j) ) 的相似度。分类模型的特征 x_((i) ) 和 x_((j) ) 在模

型工作的开始就进行特征交叉,因此特征交互更加透彻,而度量学习仅在最后计算距离时才将两个数据关联起来。因此,当复杂度接近时,分类模型的效果往往优于度量学习。不过,分类模型仍存在以下不足。

如果 x_((i) ) 和 x_((j) ) 为同质数据,则连接它们的模型参数中的大部分应该是相同的和共

享的,且调换 x_((i) ) 和 x_((j) ) 的输入顺序不会影响结果,即 f(x_((i) ),x_((j) ) )=f(x_((i) ),x_((j) ) )。

但是,分类模型对特征的输入顺序敏感,即大部分时候 f(x_((i) ),x_((j) ) )≠f(x_((i) ),x_((j) ) )。

若 x_((i) ) 和 x_((j) ) 为异质数据(例如,x_((i) ) 为图像,x_((j) ) 为文字),则一般使用与数据类

型匹配的模型来抽取特征(例如,图像对应于CNN,文字一般用LSTM进行特征提取)。很多专业领域的模型都是已经训练好的(例如迁移学习)。但是,因为DNN会忽略数据的特点,僵化地使用同一类型的模型来提取特征,所以其效果不佳,且很难与已经训练好的模型融合。

在实际应用中,神经网络一般比较深,数据量也非常大,如果直接用DNN模型进行在线预测,那么实时的计算量将是巨大的。例如,在相关推荐场景中,需要找出与视频 x_((i) ) 最为接近的10个视频推荐给用户,但候选视频有1000万个,如果每次都以在线方式通过DNN模型计算1000万次并找出得分最高的10个视频,那么机器性能显然跟不上。如果使用度量学习,就可以对这1000万个候选视频所对应的特征进行离线计算,在线上仅需实时计算距离,减轻了线上计算的压力。


对机器学习感兴趣的读者可以去主页关注我;本人著有《速通深度学习》以及《速通机器学习数学基础》二书,想要完整版电子档可以后台私信我;实体版已出版在JD上有售,有兴趣的同学可以自行搜索了解

想一起学习机器学习的话也可以后台私信,所做机器学习0基础教程未公开可联系学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值