第三章 深度学习基础
3.1 基本概念
3.1.1 神经网络组成?
神经网络类型众多,其中最为重要的是多层感知机。为了详细地描述神经网络,我们先从最简单的神经网络说起。
感知机
多层感知机中的特征神经元模型称为感知机,由Frank Rosenblatt于1957年发明。
简单的感知机如下图所示:
其中 x 1 x_1 x1, x 2 x_2 x2, x 3 x_3 x3为感知机的输入,其输出为:
o u t p u t = { 0 , i f ∑ i w i x i ⩽ t h r e s h o l d 1 , i f ∑ i w i x i > t h r e s h o l d output = \left\{ \begin{aligned} 0, \quad if \ \ \sum_i w_i x_i \leqslant threshold \\ 1, \quad if \ \ \sum_i w_i x_i > threshold \end{aligned} \right. output=⎩ ⎨ ⎧0,if i∑wixi⩽threshold1,if i∑wixi>threshold
假如把感知机想象成一个加权投票机制,比如 3 位评委给一个歌手打分,打分分别为 4 4 4分、 1 1 1 分、 − 3 -3 −3分,这 3 3 3 位评分的权重分别是 1 、 3 、 2 1、3、2 1、3、2,则该歌手最终得分为 4 × 1 + 1 × 3 + ( − 3 ) × 2 = 1 4 \times 1 + 1 \times 3 + (-3) \times 2 = 1 4×1+1×3+(−3)×2=1 。按照比赛规则,选取的 t h r e s h o l d threshold threshold 为 3 3 3,说明只有歌手的综合评分大于 3 3 3 时,才可顺利晋级。对照感知机,该选手被淘汰,因为:
∑ i w i x i < t h r e s h o l d = 3 , o u t p u t = 0 \sum_i w_i x_i < threshold=3, output = 0 i∑wixi<threshold=3,output=0
用 − b -b −b 代替 t h r e s h o l d threshold threshold,输出变为:
o u t p u t = { 0 , i f w ⋅ x + b ⩽ 0 1 , i f w ⋅ x + b > 0 output = \left\{ \begin{aligned} 0, \quad if \ \ \boldsymbol{w} \cdot \boldsymbol{x} + b \leqslant 0 \\ 1, \quad if \ \ \boldsymbol{w} \cdot \boldsymbol{x} + b > 0 \end{aligned} \right. output={0,if w⋅x+b⩽01,if w⋅x+b>0
设置合适的 x \boldsymbol{x} x 和 b b b ,一个简单的感知机单元的与非门表示如下:
当输入为 0 0 0, 1 1 1 时,感知机输出为 0 × ( − 2 ) + 1 × ( − 2 ) + 3 = 1 0 \times (-2) + 1 \times (-2) + 3 = 1 0×(−2)+1×(−2)+3=1。
复杂一些的感知机由简单的感知机单元组合而成:
多层感知机
多层感知机由感知机推广而来,最主要的特点是有多个神经元层,因此也叫深度神经网络。相比于单独的感知机,多层感知机的第 i i i 层的每个神经元和第 i − 1 i-1 i−1 层的每个神经元都有连接。
输出层可以不止有 1 1 1 个神经元。隐藏层可以只有 1 1 1 层,也可以有多层。输出层为多个神经元的神经网络例如下图所示:
3.1.2 神经网络有哪些常用模型结构?
下图包含了大部分常用的模型:
3.1.3 如何选择深度学习开发平台?
现有的深度学习开源平台主要有 Caffe, PyTorch, MXNet, CNTK, Theano, TensorFlow, Keras, fastai等。那如何选择一个适合自己的平台呢,下面列出一些衡量做参考。
参考1:与现有编程平台、技能整合的难易程度
主要是前期积累的开发经验和资源,比如编程语言,前期数据集存储格式等。
参考2: 与相关机器学习、数据处理生态整合的紧密程度
深度学习研究离不开各种数据处理、可视化、统计推断等软件包。考虑建模之前,是否具有方便的数据预处理工具?建模之后,是否具有方便的工具进行可视化、统计推断、数据分析。
参考3:对数据量及硬件的要求和支持
深度学习在不同应用场景的数据量是不一样的,这也就导致我们可能需要考虑分布式计算、多GPU计算的问题。例如,对计算机图像处理研究的人员往往需要将图像文件和计算任务分部到多台计算机节点上进行执行。当下每个深度学习平台都在快速发展,每个平台对分布式计算等场景的支持也在不断演进。
参考4:深度学习平台的成熟程度
成熟程度的考量是一个比较主观的考量因素,这些因素可包括:社区的活跃程度;是否容易和开发人员进行交流;当前应用的势头。
参考5:平台利用是否多样性?
有些平台是专门为深度学习研究和应用进行开发的,有些平台对分布式计算、GPU 等构架都有强大的优化,能否用这些平台/软件做其他事情?比如有些深度学习软件是可以用来求解二次型优化;有些深度学习平台很容易被扩展,被运用在强化学习的应用中。
3.1.4 为什么使用深层表示?
- 深度神经网络是一种特征递进式的学习算法,浅层的神经元直接从输入数据中学习一些低层次的简单特征,例如边缘、纹理等。而深层的特征则基于已学习到的浅层特征继续学习更高级的特征,从计算机的角度学习深层的语义信息。
- 深层的网络隐藏单元数量相对较少,隐藏层数目较多,如果浅层的网络想要达到同样的计算结果则需要指数级增长的单元数量才能达到。
3.1.5 为什么深层神经网络难以训练?
-
梯度消失
梯度消失是指通过隐藏层从后向前看,梯度会变的越来越小,说明前面层的学习会显著慢于后面层的学习,所以学习会卡住,除非梯度变大。 梯度消失的原因受到多种因素影响,例如学习率的大小,网络参数的初始化,激活函数的边缘效应等。在深层神经网络中,每一个神经元计算得到的梯度都会传递给前一层,较浅层的神经元接收到的梯度受到之前所有层梯度的影响。如果计算得到的梯度值非常小,随着层数增多,求出的梯度更新信息将会以指数形式衰减,就会发生梯度消失。下图是不同隐含层的学习速率:
-
梯度爆炸
在深度网络或循环神经网络(Recurrent Neural Network, RNN)等网络结构中,梯度可在网络更新的过程中不断累积,变成非常大的梯度,导致网络权重值的大幅更新,使得网络不稳定;在极端情况下,权重值甚至会溢出,变为 N a N NaN NaN值,再也无法更新。 -
权重矩阵的退化导致模型的有效自由度减少。
参数空间中学习的退化速度减慢,导致减少了模型的有效维数,网络的可用自由度对学习中梯度范数的贡献不均衡,随着相乘矩阵的数量(即网络深度)的增加,矩阵的乘积变得越来越退化。在有硬饱和边界的非线性网络中(例如 ReLU 网络),随着深度增加,退化过程会变得越来越快。Duvenaud等人2014年的论文里展示了关于该退化过程的可视化:
随着深度的增加,输入空间(左上角所示)会在输入空间中的每个点处被扭曲成越来越细的单丝,只有一个与细丝正交的方向影响网络的响应。沿着这个方向,网络实际上对变化变得非常敏感。
3.1.6 深度学习和机器学习有什么不同?
机器学习:利用计算机、概率论、统计学等知识,输入数据,让计算机学会新知识。机器学习的过程,就是训练数据去优化目标函数。
深度学习:是一种特殊的机器学习,具有强大的能力和灵活性。它通过学习将世界表示为嵌套的层次结构,每个表示都与更简单的特征相关,而抽象的表示则用于计算更抽象的表示。
传统的机器学习需要定义一些手工特征,从而有目的的去提取目标信息, 非常依赖任务的特异性以及设计特征的专家经验。而深度学习可以从大数据中先学习简单的特征,并从其逐渐学习到更为复杂抽象的深层特征,不依赖人工的特征工程,这也是深度学习在大数据时代受欢迎的一大原因。
3.2 网络操作与计算
3.2.1 前向传播与反向传播?
神经网络的计算主要有两种:前向传播(foward propagation, FP)作用于每一层的输入,通过逐层计算得到输出结果;反向传播(backward propagation, BP)作用于网络的输出,通过计算梯度由深到浅更新网络参数。
前向传播
假设上一层结点 i , j , k , . . . i,j,k,... i,j,k,... 等一些结点与本层的结点 w w w 有连接,那么结点 w w w 的值怎么算呢?就是通过上一层的 i , j , k , . . . i,j,k,... i,j,k,... 等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项(图中为了简单省略了),最后在通过一个非线性函数(即激活函数),如 R e L u ReLu ReLu, s i g m o i d sigmoid sigmoid 等函数,最后得到的结果就是本层结点 w w w 的输出。
最终不断的通过这种方法一层层的运算,得到输出层结果。
反向传播
由于我们前向传播最终得到的结果,以分类为例,最终总是有误差的,那么怎么减少误差呢,当前应用广泛的一个算法就是梯度下降算法,但是求梯度就要求偏导数,下面以图中字母为例讲解一下:
设最终误差为 E E E且输出层的激活函数为线性激活函数,对于输出那么 E E E 对于输出节点 y l y_l yl 的偏导数是 y l − t l y_l - t_l yl−tl,其中 t l t_l tl 是真实值, ∂ y l ∂ z l \frac{\partial y_l}{\partial z_l} ∂zl∂yl 是指上面提到的激活函数, z l z_l zl 是上面提到的加权和,那么这一层的 E E E 对于 z l z_l zl 的偏导数为 ∂ E ∂ z l = ∂ E ∂ y l ∂ y l ∂ z l \frac{\partial E}{\partial z_l} = \frac{\partial E}{\partial y_l} \frac{\partial y_l}{\partial z_l} ∂zl∂E=∂yl∂E∂zl∂yl。同理,下一层也是这么计算,只不过 ∂ E ∂ y k \frac{\partial E}{\partial y_k} ∂yk∂E 计算方法变了,一直反向传播到输入层,最后有 ∂ E ∂ x i = ∂ E ∂ y j ∂ y j ∂ z j \frac{\partial E}{\partial x_i} = \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial z_j} ∂xi∂E=∂yj∂E∂zj∂yj,且 ∂ z j ∂ x i = w i j \frac{\partial z_j}{\partial x_i} = w_i j ∂xi∂zj=wij。然后调整这些过程中的权值,再不断进行前向传播和反向传播的过程,最终得到一个比较好的结果。
3.2.2 如何计算神经网络的输出?
如上图,输入层有三个节点,我们将其依次编号为 1、2、3;隐藏层的 4 个节点,编号依次为 4、5、6、7;最后输出层的两个节点编号为 8、9。比如,隐藏层的节点 4,它和输入层的三个节点 1、2、3 之间都有连接,其连接上的权重分别为是 w 41 , w 42 , w 43 w_{41}, w_{42}, w_{43} w41,w42,w43。
为了计算节点 4 的输出值,我们必须先得到其所有上游节点(也就是节点 1、2、3)的输出值。节点 1、2、3 是输入层的节点,所以,他们的输出值就是输入向量本身。按照上图画出的对应关系,可以看到节点 1、2、3 的输出值分别是 x 1 , x 2 , x 3 x_1, x_2, x_3 x1,x2,x3。
a 4 = σ ( w T ⋅ a ) = σ ( w 41 x 4 + w 42 x 2 + w 43 a 3 + w 4 b ) a_4 = \sigma(w^T \cdot a) = \sigma(w_{41}x_4 + w_{42}x_2 + w_{43}a_3 + w_{4b}) a4=σ(wT⋅a)=σ(w41x4+w42x2+w43a3+w4b)
其中 w 4 b w_{4b} w4b 是节点 4 的偏置项。
同样,我们可以继续计算出节点 5、6、7 的输出值 a 5 , a 6 , a 7 a_5, a_6, a_7 a5,a6,a7。
计算输出层的节点 8 的输出值 y 1 y_1 y1:
y 1 = σ ( w T ⋅ a ) = σ ( w 84 a 4 + w 85 a 5 + w 86 a 6 + w 87 a 7 + w 8 b ) y_1 = \sigma(w^T \cdot a) = \sigma(w_{84}a_4 + w_{85}a_5 + w_{86}a_6 + w_{87}a_7 + w_{8b}) y1=σ(wT⋅a)=σ(w84a4+w85a5+w86a6+w87a7+w8b)
其中 w 8 b w_{8b} w8b 是节点 8 的偏置项。
同理,我们还可以计算出 y 2 y_2 y2。这样输出层所有节点的输出值计算完毕,我们就得到了在输入向量 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1,x2,x3,x4 时,神经网络的输出向量 y 1 , y 2 y_1, y_2 y1,y2 。这里我们也看到,输出向量的维度和输出层神经元个数相同。
3.2.3 如何计算卷积神经网络输出值?
假设有一个 5*5 的图像,使用一个 3*3 的 filter 进行卷积,想得到一个 3*3 的 Feature Map,如下所示:
x i , j x_{i,j} xi,j 表示图像第 i i i 行第 j j j 列元素。 w m , n w_{m,n} wm,n 表示 filter 第 m m m 行第 n n n 列权重。 w b w_b wb 表示 f i l t e r filter filter 的偏置项。 表 a i , j a_i,_j ai,j示 feature map 第 i i i 行第 j j j 列元素。 f f f 表示激活函数,这里以 R e L U ReLU ReLU 函数为例。
卷积计算公式如下:
a i , j = f ( ∑ m = 0 2 ∑ n = 0 2 w m , n x i + m , j + n + w b ) a_{i,j} = f(\sum_{m=0}^2 \sum_{n=0}^2 w_{m,n} x_{i+m, j+n} + w_b ) ai,j=f(m=0∑2n=0∑2wm,nxi+m,j+n+wb)
当步长为 1 1 1 时,计算 feature map 元素 a 0 , 0 a_{0,0} a0,0 如下:
a 0 , 0 = f ( ∑ m = 0 2 ∑ n = 0 2 w m , n x 0 + m , 0 + n + w b ) = r e l u ( w 0 , 0 x 0 , 0 + w 0 , 1 x 0 , 1 + w 0 , 2 x 0 , 2 + w 1 , 0 x 1 , 0 + w 1 , 1 x 1 , 1 + w 1 , 2 x 1 , 2 + w 2 , 0 x 2 , 0 + w 2 , 1 x 2 , 1 + w 2 , 2 x 2 , 2 ) = 1 + 0 + 1 + 0 + 1 + 0 + 0 + 0 + 1 = 4 a_{0,0} = f(\sum_{m=0}^2 \sum_{n=0}^2 w_{m,n} x_{0+m, 0+n} + w_b )= relu(w_{0,0} x_{0,0} + w_{0,1} x_{0,1} + w_{0,2} x_{0,2} + w_{1,0} x_{1,0} + \\w_{1,1} x_{1,1} + w_{1,2} x_{1,2} + w_{2,0} x_{2,0} + w_{2,1} x_{2,1} + w_{2,2} x_{2,2}) \\= 1 + 0 + 1 + 0 + 1 + 0 + 0 + 0 + 1 \\ = 4 a0,0=f(m=0∑2n=0∑2wm,nx0+m,0+n+wb)=relu(w0,0x0,0+w0,1x0,1+w0,2x0,2+w1,0x1,0+w1,1x1,1+w1,2x1,2+w2,0x2,0+w2,1x2,1+w2,2x2,2)=1+0+1+0+1+0+0+0+1=4
其计算过程图示如下:
以此类推,计算出全部的Feature Map。
当步幅为 2 时,Feature Map计算如下
注:图像大小、步幅和卷积后的Feature Map大小是有关系的。它们满足下面的关系:
W 2 = ( W 1 − F + 2 P ) / S + 1 H 2 = ( H 1 − F + 2 P ) / S + 1 W_2 = (W_1 - F + 2P)/S + 1\\ H_2 = (H_1 - F + 2P)/S + 1 W2=(W1−F+2P)/S+1H2=(H1−F+2P)/S+1
其中 W 2 W_2 W2, 是卷积后 Feature Map 的宽度; W 1 W_1 W1 是卷积前图像的宽度; F F F 是 filter 的宽度; P P P 是 Zero Padding 数量,Zero Padding 是指在原始图像周围补几圈 0 0 0,如果 P P P 的值是 1 1 1,那么就补 1 1 1 圈 0 0 0; S S S 是步幅; H 2 H_2 H2 卷积后 Feature Map 的高度; H 1 H_1 H1 是卷积前图像的宽度。
举例:假设图像宽度 W 1 = 5 W_1 = 5 W1=5,filter 宽度 F = 3 F=3 F=3,Zero Padding P = 0 P=0 P=0,步幅 S = 2 S=2 S=2, Z Z Z 则
W 2 = ( W 1 − F + 2 P ) / S + 1 = ( 5 − 3 + 0 ) / 2 + 1 = 2 W_2 = (W_1 - F + 2P)/S + 1 = (5-3+0)/2 + 1 = 2 W2=(W1−F+2P)/S+1=(5−3+0)/2+1=2
说明 Feature Map 宽度是2。同样,我们也可以计算出 Feature Map 高度也是 2。
如果卷积前的图像深度为 D D D,那么相应的 filter 的深度也必须为 D D D。深度大于 1 的卷积计算公式:
a i , j = f ( ∑ d = 0 D − 1 ∑ m = 0 F − 1 ∑ n = 0 F − 1 w d , m , n x d , i + m , j + n + w b ) a_{i,j} = f(\sum_{d=0}^{D-1} \sum_{m=0}^{F-1} \sum_{n=0}^{F-1} w_{d,m,n} x_{d,i+m,j+n} + w_b) ai,j=f(d=0∑D−1m=0∑F−1n=0∑F−1wd,m,nxd,i+m,j+n+wb)
其中, D D D 是深度; F F F 是 filter 的大小; w d , m , n w_{d,m,n} wd,m,n 表示 filter 的第 d d d 层第 m m m 行第 n n n 列权重; a d , i , j a_{d,i,j} ad,i,j 表示 feature map 的第 d d d 层第 i i i 行第 j j j 列像素;其它的符号含义前面相同,不再赘述。
每个卷积层可以有多个 filter。每个 filter 和原始图像进行卷积后,都可以得到一个 Feature Map。卷积后 Feature Map 的深度(个数)和卷积层的 filter 个数相同。下面的图示显示了包含两个 filter 的卷积层的计算。 7 ∗ 7 ∗ 3 7*7*3 7∗7∗3 输入,经过两个 3 ∗ 3 ∗ 3 3*3*3 3∗3∗3 filter 的卷积(步幅为 2 2 2),得到了 3 ∗ 3 ∗ 2 3*3*2 3∗3∗2 的输出。图中的 Zero padding 是 1 1 1,也就是在输入元素的周围补了一圈 0 0 0。
以上就是卷积层的计算方法。这里面体现了局部连接和权值共享:每层神经元只和上一层部分神经元相连(卷积计算规则),且 filter 的权值对于上一层所有神经元都是一样的。对于包含两个 3 ∗ 3 ∗ 3 3 * 3 * 3 3∗3∗3 的 fitler 的卷积层来说,其参数数量仅有 ( 3 ∗ 3 ∗ 3 + 1 ) ∗ 2 = 56 (3 * 3 * 3+1) * 2 = 56 (3∗3∗3+1)∗2=56 个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。
3.2.4 如何计算 Pooling 层输出值输出值?
Pooling 层主要的作用是下采样,通过去掉 Feature Map 中不重要的样本,进一步减少参数数量。Pooling 的方法很多,最常用的是 Max Pooling。Max Pooling 实际上就是在 n*n 的样本中取最大值,作为采样后的样本值。下图是 2*2 max pooling:
除了 Max Pooing 之外,常用的还有 Average Pooling ——取各样本的平均值。
对于深度为
D
D
D 的 Feature Map,各层独立做 Pooling,因此 Pooling 后的深度仍然为
D
D
D。
3.2.5 实例理解反向传播
一个典型的三层神经网络如下所示:
其中 Layer L 1 L_1 L1 是输入层,Layer L 2 L_2 L2 是隐含层,Layer L 3 L_3 L3 是输出层。
假设输入数据集为 D = x 1 , x 2 , . . . , x n D={x_1, x_2, ..., x_n} D=x1,x2,...,xn,输出数据集为 y 1 , y 2 , . . . , y n y_1, y_2, ..., y_n y1,y2,...,yn。
如果输入和输出是一样,即为自编码模型。如果原始数据经过映射,会得到不同于输入的输出。
假设有如下的网络层:
输入层包含神经元 i 1 , i 2 i_1, i_2 i1,i2,偏置 b 1 b_1 b1;隐含层包含神经元 h 1 , h 2 h_1, h_2 h1,h2,偏置 b 2 b_2 b2,输出层为 o 1 , o 2 o_1, o_2 o1,o2, w i w_i wi 为层与层之间连接的权重,激活函数为 s i g m o i d sigmoid sigmoid 函数。对以上参数取初始值,如下图所示:
其中:
- 输入数据 i 1 = 0.05 , i 2 = 0.10 i1=0.05, i2 = 0.10 i1=0.05,i2=0.10
- 输出数据 o 1 = 0.01 , o 2 = 0.99 o1=0.01, o2=0.99 o1=0.01,o2=0.99;
- 初始权重 w 1 = 0.15 , w 2 = 0.20 , w 3 = 0.25 , w 4 = 0.30 , w 5 = 0.40 , w 6 = 0.45 , w 7 = 0.50 , w 8 = 0.55 w1=0.15, w2=0.20, w3=0.25,w4=0.30, w5=0.40, w6=0.45, w7=0.50, w8=0.55 w1=0.15,w2=0.20,w3=0.25,w4=0.30,w5=0.40,w6=0.45,w7=0.50,w8=0.55
- 目标:给出输入数据 i 1 , i 2 i1,i2 i1,i2 ( 0.05 0.05 0.05和 0.10 0.10 0.10 ),使输出尽可能与原始输出 o 1 , o 2 o1,o2 o1,o2,( 0.01 0.01 0.01和 0.99 0.99 0.99)接近。
前向传播
- 输入层 --> 输出层
计算神经元 h 1 h1 h1 的输入加权和:
n e t h 1 = w 1 ∗ i 1 + w 2 ∗ i 2 + b 1 ∗ 1 n e t h 1 = 0.15 ∗ 0.05 + 0.2 ∗ 0.1 + 0.35 ∗ 1 = 0.3775 net_{h1} = w_1 * i_1 + w_2 * i_2 + b_1 * 1\\ net_{h1} = 0.15 * 0.05 + 0.2 * 0.1 + 0.35 * 1 = 0.3775 neth1=w1∗i1+w2∗i2+b1∗1neth1=0.15∗0.05+0.2∗0.1+0.35∗1=0.3775
神经元 h 1 h1 h1 的输出 o 1 o1 o1 :(此处用到激活函数为 sigmoid 函数):
o u t h 1 = 1 1 + e − n e t h 1 = 1 1 + e − 0.3775 = 0.593269992 out_{h1} = \frac{1}{1 + e^{-net_{h1}}} = \frac{1}{1 + e^{-0.3775}} = 0.593269992 outh1=1+e−neth11=1+e−0.37751=0.593269992
同理,可计算出神经元 h 2 h2 h2 的输出 o 1 o1 o1:
o u t h 2 = 0.596884378 out_{h2} = 0.596884378 outh2=0.596884378
- 隐含层–>输出层:
计算输出层神经元 o 1 o1 o1 和 o 2 o2 o2 的值:
n e t o 1 = w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 2 ∗ 1 net_{o1} = w_5 * out_{h1} + w_6 * out_{h2} + b_2 * 1 neto1=w5∗outh1+w6∗outh2+b2∗1
n e t o 1 = 0.4 ∗ 0.593269992 + 0.45 ∗ 0.596884378 + 0.6 ∗ 1 = 1.105905967 net_{o1} = 0.4 * 0.593269992 + 0.45 * 0.596884378 + 0.6 * 1 = 1.105905967 neto1=0.4∗0.593269992+0.45∗0.596884378+0.6∗1=1.105905967
o u t o 1 = 1 1 + e − n e t o 1 = 1 1 + e 1.105905967 = 0.75136079 out_{o1} = \frac{1}{1 + e^{-net_{o1}}} = \frac{1}{1 + e^{1.105905967}} = 0.75136079 outo1=1+e−neto11=1+e1.1059059671=0.75136079
这样前向传播的过程就结束了,我们得到输出值为 [ 0.75136079 , 0.772928465 ] [0.75136079 , 0.772928465] [0.75136079,0.772928465],与实际值 [ 0.01 , 0.99 ] [0.01 , 0.99] [0.01,0.99] 相差还很远,现在我们对误差进行反向传播,更新权值,重新计算输出。
**反向传播 **
1.计算总误差
总误差:(这里使用Square Error)
E t o t a l = ∑ 1 2 ( t a r g e t − o u t p u t ) 2 E_{total} = \sum \frac{1}{2}(target - output)^2 Etotal=∑21(target−output)2
但是有两个输出,所以分别计算 o 1 o1 o1 和 o 2 o2 o2 的误差,总误差为两者之和:
E o 1 = 1 2 ( t a r g e t o 1 − o u t o 1 ) 2 = 1 2 ( 0.01 − 0.75136507 ) 2 = 0.274811083 E_{o1} = \frac{1}{2}(target_{o1} - out_{o1})^2 = \frac{1}{2}(0.01 - 0.75136507)^2 = 0.274811083 Eo1=21(targeto1−outo1)2=21(0.01−0.75136507)2=0.274811083.
E o 2 = 0.023560026 E_{o2} = 0.023560026 Eo2=0.023560026.
E t o t a l = E o 1 + E o 2 = 0.274811083 + 0.023560026 = 0.298371109 E_{total} = E_{o1} + E_{o2} = 0.274811083 + 0.023560026 = 0.298371109 Etotal=Eo1+Eo2=0.274811083+0.023560026=0.298371109.
2.隐含层 --> 输出层的权值更新:
以权重参数 w 5 w5 w5 为例,如果我们想知道 $ w5 $ 对整体误差产生了多少影响,可以用整体误差对 w 5 w5 w5 求偏导求出:(链式法则)
∂ E t o t a l ∂ w 5 = ∂ E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ n e t o 1 ∗ ∂ n e t o 1 ∂ w 5 \frac{\partial E_{total}}{\partial w5} = \frac{\partial E_{total}}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}} * \frac{\partial net_{o1}}{\partial w5} ∂w5∂Etotal=∂outo1∂Etotal∗∂neto1∂outo1∗∂w5∂neto1
下面的图可以更直观的看清楚误差是怎样反向传播的:
3.2.6 神经网络更“深”有什么意义?
前提:在一定范围内。
- 在神经元数量相同的情况下,深层网络结构具有更大容量,分层组合带来的是指数级的表达空间,能够组合成更多不同类型的子结构,这样可以更容易地学习和表示各种特征。
- 隐藏层增加则意味着由激活函数带来的非线性变换的嵌套层数更多,就能构造更复杂的映射关系。
3.3 超参数
3.3.1 什么是超参数?
超参数 : 在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。
超参数通常存在于:
1. 定义关于模型的更高层次的概念,如复杂性或学习能力。
2. 不能直接从标准模型培训过程中的数据中学习,需要预先定义。
3. 可以通过设置不同的值,训练不同的模型和选择更好的测试值来决定
超参数具体来讲比如算法中的学习率(learning rate)、梯度下降法迭代的数量(iterations)、隐藏层数目(hidden layers)、隐藏层单元数目、激活函数( activation function)都需要根据实际情况来设置,这些数字实际上控制了最后的参数和的值,所以它们被称作超参数。
3.3.2 如何寻找超参数的最优值?
在使用机器学习算法时,总有一些难调的超参数。例如权重衰减大小,高斯核宽度等等。这些参数需要人为设置,设置的值对结果产生较大影响。常见设置超参数的方法有:
-
猜测和检查:根据经验或直觉,选择参数,一直迭代。
-
网格搜索:让计算机尝试在一定范围内均匀分布的一组值。
-
随机搜索:让计算机随机挑选一组值。
-
贝叶斯优化:使用贝叶斯优化超参数,会遇到贝叶斯优化算法本身就需要很多的参数的困难。
-
MITIE方法,好初始猜测的前提下进行局部优化。它使用BOBYQA算法,并有一个精心选择的起始点。由于BOBYQA只寻找最近的局部最优解,所以这个方法是否成功很大程度上取决于是否有一个好的起点。在MITIE的情况下,我们知道一个好的起点,但这不是一个普遍的解决方案,因为通常你不会知道好的起点在哪里。从好的方面来说,这种方法非常适合寻找局部最优解。稍后我会再讨论这一点。
-
最新提出的LIPO的全局优化方法。这个方法没有参数,而且经验证比随机搜索方法好。
3.3.3 超参数搜索一般过程?
超参数搜索一般过程:
- 将数据集划分成训练集、验证集及测试集。
- 在训练集上根据模型的性能指标对模型参数进行优化。
- 在验证集上根据模型的性能指标对模型的超参数进行搜索。
- 步骤 2 和步骤 3 交替迭代,最终确定模型的参数和超参数,在测试集中验证评价模型的优劣。
其中,搜索过程需要搜索算法,一般有:网格搜索、随机搜过、启发式智能搜索、贝叶斯搜索。
3.4 激活函数
3.4.1 为什么需要非线性激活函数?
为什么需要激活函数?
- 激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。
- 激活函数可以引入非线性因素。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。
- 激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。
为什么激活函数需要非线性函数?
- 假若网络中全部是线性部件,那么线性的组合还是线性,与单独一个线性分类器无异。这样就做不到用非线性来逼近任意函数。
- 使用非线性激活函数 ,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。使用非线性激活函数,能够从输入输出之间生成非线性映射。
3.4.2 常见的激活函数及图像
-
sigmoid 激活函数
函数的定义为: f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e−x1,其值域为 ( 0 , 1 ) (0,1) (0,1)。
函数图像如下:
-
tanh激活函数
函数的定义为: f ( x ) = t a n h ( x ) = e x − e − x e x + e − x f(x) = tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=tanh(x)=ex+e−xex−e−x,值域为 ( − 1 , 1 ) (-1,1) (−1,1)。
函数图像如下:
-
Relu激活函数
函数的定义为: f ( x ) = m a x ( 0 , x ) f(x) = max(0, x) f(x)=max(0,x) ,值域为 [ 0 , + ∞ ) [0,+∞) [0,+∞);
函数图像如下:
-
Leak Relu 激活函数
函数定义为: f ( x ) = { a x , x < 0 x , x > 0 f(x) = \left\{ \begin{aligned} ax, \quad x<0 \\ x, \quad x>0 \end{aligned} \right. f(x)={ax,x<0x,x>0,值域为 ( − ∞ , + ∞ ) (-∞,+∞) (−∞,+∞)。
图像如下( a = 0.5 a = 0.5 a=0.5):
-
SoftPlus 激活函数
函数的定义为: f ( x ) = l n ( 1 + e x ) f(x) = ln( 1 + e^x) f(x)=ln(1+ex),值域为 ( 0 , + ∞ ) (0,+∞) (0,+∞)。
函数图像如下:
-
softmax 函数
函数定义为: σ ( z ) j = e z j ∑ k = 1 K e z k \sigma(z)_j = \frac{e^{z_j}}{\sum_{k=1}^K e^{z_k}} σ(z)j=∑k=1Kezkezj。
Softmax 多用于多分类神经网络输出。
3.4.3 常见激活函数的导数计算?
对常见激活函数,导数计算如下:
原函数 | 函数表达式 | 导数 | 备注 |
---|---|---|---|
Sigmoid激活函数 | f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+e−x1 | f ′ ( x ) = 1 1 + e − x ( 1 − 1 1 + e − x ) = f ( x ) ( 1 − f ( x ) ) f^{'}(x)=\frac{1}{1+e^{-x}}\left( 1- \frac{1}{1+e^{-x}} \right)=f(x)(1-f(x)) f′(x)=1+e−x1(1−1+e−x1)=f(x)(1−f(x)) | 当 x = 10 x=10 x=10,或 x = − 10 x=-10 x=−10, f ′ ( x ) ≈ 0 f^{'}(x) \approx0 f′(x)≈0,当 x = 0 x=0 x=0 f ′ ( x ) = 0.25 f^{'}(x) =0.25 f′(x)=0.25 |
Tanh激活函数 | f ( x ) = t a n h ( x ) = e x − e − x e x + e − x f(x)=tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} f(x)=tanh(x)=ex+e−xex−e−x | f ′ ( x ) = − ( t a n h ( x ) ) 2 f^{'}(x)=-(tanh(x))^2 f′(x)=−(tanh(x))2 | 当 x = 10 x=10 x=10,或 x = − 10 x=-10 x=−10, f ′ ( x ) ≈ 0 f^{'}(x) \approx0 f′(x)≈0,当 x = 0 x=0 x=0 f ‘ ( x ) = 1 f^{`}(x) =1 f‘(x)=1 |
Relu激活函数 | f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x) | c ( u ) = { 0 , x < 0 1 , x > 0 u n d e f i n e d , x = 0 c(u)=\begin{cases} 0,x<0 \\ 1,x>0 \\ undefined,x=0\end{cases} c(u)=⎩ ⎨ ⎧0,x<01,x>0undefined,x=0 | 通常 x = 0 x=0 x=0时,给定其导数为1和0 |
3.4.4 激活函数有哪些性质?
- 非线性: 当激活函数是非线性的,一个两层的神经网络就可以基本上逼近所有的函数。但如果激活函数是恒等激活函数的时候,即 f ( x ) = x f(x)=x f(x)=x,就不满足这个性质,而且如果 MLP 使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的;
- 可微性: 当优化方法是基于梯度的时候,就体现了该性质;
- 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数;
- f ( x ) ≈ x f(x)≈x f(x)≈x: 当激活函数满足这个性质的时候,如果参数的初始化是随机的较小值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要详细地去设置初始值;
- 输出值的范围: 当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况下,一般需要更小的 Learning Rate。
3.4.5 如何选择激活函数?
选择一个适合的激活函数并不容易,需要考虑很多因素,通常的做法是,如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者测试集上进行评价。然后看哪一种表现的更好,就去使用它。
以下是常见的选择情况:
- 如果输出是 0、1 值(二分类问题),则输出层选择 sigmoid 函数,然后其它的所有单元都选择 Relu 函数。
- 如果在隐藏层上不确定使用哪个激活函数,那么通常会使用 Relu 激活函数。有时,也会使用 tanh 激活函数,但 Relu 的一个优点是:当是负值的时候,导数等于 0。
- sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
- tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
- ReLu 激活函数:最常用的默认函数,如果不确定用哪个激活函数,就使用 ReLu 或者 Leaky ReLu,再去尝试其他的激活函数。
- 如果遇到了一些死的神经元,我们可以使用 Leaky ReLU 函数。
3.4.6 使用 ReLu 激活函数的优点?
- 在区间变动很大的情况下,ReLu 激活函数的导数或者激活函数的斜率都会远大于 0,在程序实现就是一个 if-else 语句,而 sigmoid 函数需要进行浮点四则运算,在实践中,使用 ReLu 激活函数神经网络通常会比使用 sigmoid 或者 tanh 激活函数学习的更快。
- sigmoid 和 tanh 函数的导数在正负饱和区的梯度都会接近于 0,这会造成梯度弥散,而 Relu 和Leaky ReLu 函数大于 0 部分都为常数,不会产生梯度弥散现象。
- 需注意,Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀疏性,而 Leaky ReLu 不会产生这个问题。
3.4.7 什么时候可以用线性激活函数?
- 输出层,大多使用线性激活函数。
- 在隐含层可能会使用一些线性激活函数。
- 一般用到的线性激活函数很少。
3.4.8 怎样理解 Relu(< 0 时)是非线性激活函数?
Relu 激活函数图像如下:
根据图像可看出具有如下特点:
-
单侧抑制;
-
相对宽阔的兴奋边界;
-
稀疏激活性;
ReLU 函数从图像上看,是一个分段线性函数,把所有的负值都变为 0,而正值不变,这样就成为单侧抑制。
因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。
稀疏激活性:从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。当 x < 0 x<0 x<0 时,ReLU 硬饱和,而当 x > 0 x>0 x>0 时,则不存在饱和问题。ReLU 能够在 x > 0 x>0 x>0 时保持梯度不衰减,从而缓解梯度消失问题。
3.4.9 Softmax 定义及作用
Softmax 是一种形如下式的函数:
P
(
i
)
=
e
x
p
(
θ
i
T
x
)
∑
k
=
1
K
e
x
p
(
θ
i
T
x
)
P(i) = \frac{exp(\theta_i^T x)}{\sum_{k=1}^{K} exp(\theta_i^T x)}
P(i)=∑k=1Kexp(θiTx)exp(θiTx)
其中,
θ
i
\theta_i
θi 和
x
x
x 是列向量,
θ
i
T
x
\theta_i^T x
θiTx 可能被换成函数关于
x
x
x 的函数
f
i
(
x
)
f_i(x)
fi(x)
通过 softmax 函数,可以使得 P ( i ) P(i) P(i) 的范围在 [ 0 , 1 ] [0,1] [0,1] 之间。在回归和分类问题中,通常 θ \theta θ 是待求参数,通过寻找使得 P ( i ) P(i) P(i) 最大的 θ i \theta_i θi 作为最佳参数。
但是,使得范围在
[
0
,
1
]
[0,1]
[0,1] 之间的方法有很多,为啥要在前面加上以
e
e
e 的幂函数的形式呢?参考 logistic 函数:
P
(
i
)
=
1
1
+
e
x
p
(
−
θ
i
T
x
)
P(i) = \frac{1}{1+exp(-\theta_i^T x)}
P(i)=1+exp(−θiTx)1
这个函数的作用就是使得
P
(
i
)
P(i)
P(i) 在负无穷到 0 的区间趋向于 0, 在 0 到正无穷的区间趋向 1,。同样 softmax 函数加入了
e
e
e 的幂函数正是为了两极化:正样本的结果将趋近于 1,而负样本的结果趋近于 0。这样为多类别提供了方便(可以把
P
(
i
)
P(i)
P(i) 看做是样本属于类别的概率)。可以说,Softmax 函数是 logistic 函数的一种泛化。
softmax 函数可以把它的输入,通常被称为 logits 或者 logit scores,处理成 0 到 1 之间,并且能够把输出归一化到和为 1。这意味着 softmax 函数与分类的概率分布等价。它是一个网络预测多酚类问题的最佳输出激活函数。
3.4.10 Softmax 函数如何应用于多分类?
softmax 用于多分类过程中,它将多个神经元的输出,映射到 ( 0 , 1 ) (0,1) (0,1) 区间内,可以看成概率来理解,从而来进行多分类!
假设我们有一个数组, V i V_i Vi 表示 V V V 中的第 i i i 个元素,那么这个元素的 softmax 值就是
S i = e V i ∑ j e V j S_i = \frac{e^{V_i}}{\sum_j e^{V_j}} Si=∑jeVjeVi
从下图看,神经网络中包含了输入层,然后通过两个特征层处理,最后通过 softmax 分析器就能得到不同条件下的概率,这里需要分成三个类别,最终会得到 y = 0 , y = 1 , y = 2 y=0, y=1, y=2 y=0,y=1,y=2 的概率值。
继续看下面的图,三个输入通过 softmax 后得到一个数组 [ 0.05 , 0.10 , 0.85 ] [0.05 , 0.10 , 0.85] [0.05,0.10,0.85],这就是 soft 的功能。
更形象的映射过程如下图所示:
softmax 直白来说就是将原来输出是 3 , 1 , − 3 3,1,-3 3,1,−3 通过 softmax 函数一作用,就映射成为 ( 0 , 1 ) (0,1) (0,1) 的值,而这些值的累和为 1 1 1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标!
3.4.11 交叉熵代价函数定义及其求导推导
神经元的输出就是 a = σ(z),其中 z = ∑ w j i j + b z=\sum w_{j}i_{j}+b z=∑wjij+b是输⼊的带权和。
C = − 1 n ∑ [ y l n a + ( 1 − y ) l n ( 1 − a ) ] C=-\frac{1}{n}\sum[ylna+(1-y)ln(1-a)] C=−n1∑[ylna+(1−y)ln(1−a)]
其中 n 是训练数据的总数,求和是在所有的训练输⼊ x 上进⾏的, y 是对应的⽬标输出。
表达式是否解决学习缓慢的问题并不明显。实际上,甚⾄将这个定义看做是代价函数也不是显⽽易⻅的!在解决学习缓慢前,我们来看看交叉熵为何能够解释成⼀个代价函数。
将交叉熵看做是代价函数有两点原因。
第⼀,它是⾮负的, C > 0。可以看出:式子中的求和中的所有独⽴的项都是负数的,因为对数函数的定义域是 (0,1),并且求和前⾯有⼀个负号,所以结果是非负。
第⼆,如果对于所有的训练输⼊ x,神经元实际的输出接近⽬标值,那么交叉熵将接近 0。
假设在这个例⼦中, y = 0 ⽽ a ≈ 0。这是我们想到得到的结果。我们看到公式中第⼀个项就消去了,因为 y = 0,⽽第⼆项实际上就是 − ln(1 − a) ≈ 0。反之, y = 1 ⽽ a ≈ 1。所以在实际输出和⽬标输出之间的差距越⼩,最终的交叉熵的值就越低了。(这里假设输出结果不是0,就是1,实际分类也是这样的)
综上所述,交叉熵是⾮负的,在神经元达到很好的正确率的时候会接近 0。这些其实就是我们想要的代价函数的特性。其实这些特性也是⼆次代价函数具备的。所以,交叉熵就是很好的选择了。但是交叉熵代价函数有⼀个⽐⼆次代价函数更好的特性就是它避免了学习速度下降的问题。为了弄清楚这个情况,我们来算算交叉熵函数关于权重的偏导数。我们将 a = ς ( z ) a={\varsigma}(z) a=ς(z)代⼊到 公式中应⽤两次链式法则,得到:
根据 ς ( z ) = 1 1 + e − z \varsigma(z)=\frac{1}{1+e^{-z}} ς(z)=1+e−z1 的定义,和⼀些运算,我们可以得到 ς ′ ( z ) = ς ( z ) ( 1 − ς ( z ) ) {\varsigma}'(z)=\varsigma(z)(1-\varsigma(z)) ς′(z)=ς(z)(1−ς(z))。化简后可得:
∂ C ∂ w j = 1 n ∑ x j ( ς ( z ) − y ) \frac{\partial C}{\partial w_{j}}=\frac{1}{n}\sum x_{j}({\varsigma}(z)-y) ∂wj∂C=n1∑xj(ς(z)−y)
这是⼀个优美的公式。它告诉我们权重学习的速度受到 ς ( z ) − y \varsigma(z)-y ς(z)−y,也就是输出中的误差的控制。更⼤的误差,更快的学习速度。这是我们直觉上期待的结果。特别地,这个代价函数还避免了像在⼆次代价函数中类似⽅程中 ς ′ ( z ) {\varsigma}'(z) ς′(z)导致的学习缓慢。当我们使⽤交叉熵的时候, ς ′ ( z ) {\varsigma}'(z) ς′(z)被约掉了,所以我们不再需要关⼼它是不是变得很⼩。这种约除就是交叉熵带来的特效。实际上,这也并不是⾮常奇迹的事情。我们在后⾯可以看到,交叉熵其实只是满⾜这种特性的⼀种选择罢了。
根据类似的⽅法,我们可以计算出关于偏置的偏导数。我这⾥不再给出详细的过程,你可以轻易验证得到:
∂ C ∂ b = 1 n ∑ ( ς ( z ) − y ) \frac{\partial C}{\partial b}=\frac{1}{n}\sum ({\varsigma}(z)-y) ∂b∂C=n1∑(ς(z)−y)
再⼀次, 这避免了⼆次代价函数中类似 ς ′ ( z ) {\varsigma}'(z) ς′(z)项导致的学习缓慢。
3.4.12 为什么Tanh收敛速度比Sigmoid快?
首先看如下两个函数的求导:
t a n h , ( x ) = 1 − t a n h ( x ) 2 ∈ ( 0 , 1 ) tanh^{,}(x)=1-tanh(x)^{2}\in (0,1) tanh,(x)=1−tanh(x)2∈(0,1)
s , ( x ) = s ( x ) ∗ ( 1 − s ( x ) ) ∈ ( 0 , 1 4 ] s^{,}(x)=s(x)*(1-s(x))\in (0,\frac{1}{4}] s,(x)=s(x)∗(1−s(x))∈(0,41]
由上面两个公式可知tanh(x)梯度消失的问题比sigmoid轻,所以Tanh收敛速度比Sigmoid快。
注:梯度消失(gradient vanishing)或者爆炸(gradient explosion)是激活函数以及当前权重耦合产生的综合结果:
设任意激活函数为
σ
(
⋅
)
\sigma(\cdot)
σ(⋅),k+1层网络输出为
f
k
+
1
=
σ
(
W
f
k
)
f_{k+1}=\sigma(Wf_k)
fk+1=σ(Wfk),求导得到
∂
h
t
+
1
∂
h
t
=
d
i
a
g
(
σ
′
(
W
h
t
)
)
W
\frac {\partial h_{t+1}}{\partial h_t}=diag(\sigma'(Wh_t))W
∂ht∂ht+1=diag(σ′(Wht))W。可见求导结果同时会受到权重
W
W
W和激活函数的导数
σ
′
(
⋅
)
\sigma'(\cdot)
σ′(⋅)的影响,以sigmoid函数
σ
(
X
)
=
1
1
+
e
−
x
\sigma(X)=\frac {1}{1+e^{-x}}
σ(X)=1+e−x1为例,其导数为
σ
′
(
x
)
=
1
1
+
e
−
x
(
1
−
1
1
+
e
−
x
)
\sigma'(x)=\frac{1}{1+e^{-x}}(1-\frac{1}{1+e^{-x}})
σ′(x)=1+e−x1(1−1+e−x1),其值恒大于零小于1,用链式法则求梯度回传时连续相乘使得结果趋于0,但是如果权重
W
W
W是较大的数值,使得
∂
f
t
+
1
∂
f
t
\frac {\partial f_{t+1}}{\partial f_t}
∂ft∂ft+1相乘结果大于1,则梯度回传时连续相乘则不会发生梯度消失。
综上,在讨论激活函数收敛速度或与梯度消失或者爆炸相关时,应同时考虑当前权重
W
W
W数值的影响。
3.4.13
3.4.12 内聚外斥 - Center Loss
在计算机视觉任务中, 由于其简易性, 良好的表现, 与对分类任务的概率性理解, Cross Entropy Loss (交叉熵代价) + Softmax 组合被广泛应用于以分类任务为代表的任务中. 在此应用下, 我们可将其学习过程进一步理解为: 更相似(同类/同物体)的图像在特征域中拥有“更近的距离”, 相反则”距离更远“. 换而言之, 我们可以进一步理解为其学习了一种低类内距离(Intra-class Distance)与高类间距离(Inter-class Distance)的特征判别模型. 在此Center Loss则可以高效的计算出这种具判别性的特征. 不同于传统的Softmax Loss, Center Loss通过学习“特征中心”从而最小化其类内距离. 其表达形式如下:
L C = 1 2 ∑ i = 1 m ∣ ∣ x i − c y i ∣ ∣ 2 2 L_{C} = \frac{1}{2}\sum^{m}_{i=1}||x_{i}-c_{y_{i}}||^{2}_{2} LC=21∑i=1m∣∣xi−cyi∣∣22
其中 x i x_{i} xi表示FCN(全连接层)之前的特征, c y i c_{y_{i}} cyi表示第$y_{i} $个类别的特征中心, m m m表示mini-batch的大小. 我们很清楚的看到 L C L_{C} LC的终极目标为最小化每个特征与其特征中心的方差, 即最小化类内距离. 其迭代公式为:
∂ L C ∂ x i = x i − c y i \frac{\partial L_{C}}{\partial x_{i}}=x_{i}-c_{y_{i}} ∂xi∂LC=xi−cyi
Δ c j = ∑ i = 1 m δ ( y i = j ) ⋅ ( c j − x i ) 1 + ∑ i = 1 m δ ( y i = j ) \Delta{c_{j}} = \frac{\sum^{m}_{i=1}\delta(y_{i}=j)\cdot(c_{j}-x_{i})}{1+\sum^{m}_{i=1}\delta(y_{i}=j)} Δcj=1+∑i=1mδ(yi=j)∑i=1mδ(yi=j)⋅(cj−xi)
其中 δ ( c o n d i t i o n ) = { 1 c o n d i t i o n i s T r u e 0 o t h e r w i s e \delta(condition)=\left\{ \begin{array}{rcl} 1 & & {condition\ is\ True}\\ 0 & & {otherwise}\\ \end{array} \right. δ(condition)={10condition is Trueotherwise
结合Softmax, 我们可以搭配二者使用, 适当平衡这两种监督信号. 在Softmax拉开类间距离的同时, 利用Center Loss最小化类内距离. 例如:
即便如此, Center Loss仍有它的不足之处: 其特征中心为存储在网络模型之外的额外参数, 不能与模型参数一同优化. 这些额外参数将与记录每一步特征变化的自动回归均值估计(autoregressive mean estimator)进行更迭. 当需要学习的类别数量较大时, mini-batch可能无力提供足够的样本进行均值估计. 若此Center Loss将需要平衡两种监督损失来以确定更迭, 其过程需要一个对平衡超参数的搜索过程, 使得其择值消耗昂贵.