system: [SYSTEM]

user: 2. 深度学习基础 1996年，Langley将机器学习(Machine Learning， ML)纳入人工智能领域，其主要目的在于通过促使计算机进行自主学习，不断进行经验的获取来改善自身性能，使得计算机具备智能特性，从而可以自主解决问题。20世纪以后，ML获得了很大的发展，研究出了一系相关的算法，主要包括决策树(Decision Tree， DT)、向量机(Vector machine， VM)以及神经网络(Neural Network)等。而DL技术就发展自神经网络，它是一种监督学习的方法，其基本原理为在网络训练阶段通过后向传播(Backward propagation， BP)调整神经网络参数的权重值，并不断地迭代来缩小代表预测值和真实值之间差距的损失函数，在测试阶段将最优的神经网络参数应用于正向传播中得到最后的预测值。下面介绍DL技术中三种经典的神经网络结构，全连接神经网络、卷积神经网络(Convolutional Neural Network， CNN)和循环神经网络(Recurrent Neural Network， RNN)。 2.1. 全连接网络 全连接神经网络的想法起源于神经元模型，如图1所示，在一个神经元中，神经元的输出可以表示为： y = σ ( ∑ k = 1 r w k x k + b ) (1) 其中， x k 表示输入， w k 表示对应的权重，b为偏执， σ ( ⋅ ) 为激活函数，y为输出。激活函数为神经元模型引入了非线性因素，常见的激活函数为Sigmoid函数，其表达式为： σ ( x ) = 1 1 + e − x (2) 将上述多个神经元连接起来，变成层数为1的层次化结构，即成为最基本的全连接神经网络，该网络由输入层和输出层组成，结构简单。网络训练时，输入层进行样本输入后，即可完成一个由输入到输出的非线性映射，随后计算输出值和真实值(也称作标签)之间的代价函数，通过梯度下降法(Gradient Descent， GD)不断优化网络的权重参数来降低代价函数的值，使得该网络可以更好的模拟输入和输出之间的映射函数。常用的代价函数包括回归问题中的均方误差函数和分类问题中的交叉熵函数等。 图1. 神经元模型 由于激活函数给神经网络赋予了非线性特性。当将网络层数加深且每层神经元的个数足够时，那么该神经网络理论上讲可以模拟任意函数特征，我们称此神经网络为全连接深度神经网络(Fully connected deep neural network， FC-DNN)，该网络由输入层、隐藏层和输出层三部分组成，具体结构如图2所示。在此种网络结构中，每一层的神经元都与之相邻层的神经元相连，与不相邻的层互不连接。当隐藏层的层数逐渐增多时，采用梯度下降法进行网络参数的优化将会变得很困难，而BP算法却可以很好的解决这个问题，大大提高了FC-DNN网络的可用性。但是随着网络深度和神经元个数的增加，网络训练过程中还是会出现梯度消失或梯度爆炸、网络收敛速度太慢以及网络过拟合的问题。 图2. 全连接深度神经网络模型 由于目前神经网络的优化方法都是基于BP算法的思想，即根据损失函数计算的误差通过梯度反向传播的方式，指导深度神经网络参数权值的更新优化。而深度神经网络由许多非线性层堆叠而来，每一层非线性层都可以视为是一个非线性函数，因此整个深度网络可以视为是一个复合的非线性多元函数。所以说，若对激活函数进行求导，如果此部分大于1，那么层数增多的时候，最终的求出的梯度更新将以指数形式增加，即发生梯度爆炸，如果此部分小于1，那么随着层数增多，求出的梯度更新信息将会以指数形式衰减，即发生了梯度消失。因此，很多时候的梯度消失或者梯度爆炸可以通过选择更为合适的激活函数来解决。例如Relu激活函数，其表达式为： Relu ( x ) = max ( x ， 0 ) = { 0 ， x < 0 x ， x ≥ 0 (3) Relu函数在大于0的区间内导数一直为1，每层网络都是相同的更新速度，这样自然就不会出现梯度消失或梯度爆炸的问题了。 为了加快网络收敛速度，首先可以采用动态学习速率，即在初始时刻学习率设置较大之后随着训练轮数的增加逐渐降低，如目前的Adagrad，Momentum和Adam算法就可以进行动态学习率的调整。还可以采用小批次梯度下降算法，即每轮放弃对全部样本进行训练，而是每次只选择小批次样本训练，但是此方法有可能会陷入局部最优解。另外选择合适的网络初始化参数也可以有效提升收敛速度。当神经网络在训练集得到很好的性能后可以进入测试阶段，此时可能会出现在测试集性能较差的情况，这种现象称为过拟合。一般来说，训练误差会随着训练次数的增多逐渐下降，而测试误差则会先下降而后再次上升。为了避免过拟合训练集，一个很好的解决方案是提前停止(Early stopping)，当它在验证集上的性能开始下降时就中断训练；过拟合也可以理解为当一个模型过为复杂的时候，它可以很好地记忆每一个训练数据中随机噪音的部分而忘记了要去学习训练数据中通用的趋势，因此可以在损失函数中加入刻画模型复杂程度的指标，这种方法称为正则化。其基本思想均为通过限制权重的大小，使得模型不能任意拟合训练数据中的随机噪音。最后一种常用的防止过拟合的方法为随机失活(Dropout)，主要是指在神经网络的学习过程中，随机将部分隐含层节点的权重归零，由于每次迭代受归零影响的节点不同，因此各节点的重要性会被平衡，从而降低过拟合的风险。 2.2. 卷积神经网络 CNN也是一种常用的神经网络，主要是为了进行图像数据处理而提出，此网络可以自主提取特征并进行图像恢复，与此同时相较于DNN网络拥有更少的训练参数，由于CNN可以根据实际需要而自主设计网络结构，这为其应用于通信物理层传输提供了可能性。该网络的基本模型结构如图3所示，包含了卷积层、池化层和全连接层。 图3. 卷积神经网络模型 由于CNN最初用于图像处理，图像一般是由多通道的二维矩阵组成，因此卷积层的输入一般为多通道的二维矩阵，卷积层设有多个卷积核，其中卷积核的通道数与输入层通道数相同，每个卷积核根据步长数对输入进行扫描完成卷积运算，通过减小代价函数和BP不断优化卷积核参数的值，得到多张特征图，特征图的通道数数与卷积核个数相同。多层卷积层相连的神经网络称为深度CNN，在此结构中，为了保持图像分辨率不变，需要在每层的输入矩阵进行补零(Padding)操作。由于卷积层有一个明显的特征为权重共享，因此与FC-DNN相比极大减少了训练参数。其实卷积的过程，就是一个从细节到抽象的过程，我们输入的图像就是一些纹理，卷积核也可以看成纹理，卷积的目的就是时卷积核的纹理和图像的纹理尽可能的相似，在二维空间中，纹理等价为向量，卷积操作为向量的相乘，相乘结果越大，说明两个向量更为接近，因此，卷积后的新图像在具有卷积核纹理的区域信号更强，其他区域较弱，如此完成了从图像中抽取特征的操作，卷积层的输出可通过激活函数来引入非线性因素。 卷积层后一般加入池化层，减少特征图的维度，降低数据运算量。池化运算，一般有两种MaxPooling和MeanPooling。选取一定大小池化窗口，然后从左往右进行扫描，选取池化窗口中最大值作为该位置的特征值的方法是MaxPooling，选取池化窗口中平均值作为该位置的特征值的方法是MeanPooling，而池化层的操作并不会损失重要的图像特征，是因为图像数据在连续区域具有相关性，一般局部区域的像素值差别不大。输出最后经过全连接层，对特征进行重新的拟合，减少特征信息的丢失。由于通过卷积池化操作后得到的是多个特征矩阵，而全连接层的输入为向量，所以在进行全连接层之前，要将多个特征矩阵压平为一个向量。需要注意的是，无论是卷积层还是池化层，均完整的保留了图像特征间的空间关系。比较经典的CNN网络有LeNet，GoogLeNet，ResNet等。 2.3. 循环神经网络 无论是DNN还是CNN，两者有一个共同的特点，每一层神经元之间是相互独立的，然而，许多现实问题中许多元素是相关关联的，而这种关联性较强的时序数据的处理和预测，则需要RNN网络来完成。RNN网络具有很好的记忆性，即此时刻网络的输出与上一时刻网络的输出也有关系，具体实施为将上一时刻的部分输出反馈至这一时刻，作为这一时刻的部分输入。深层RNN是在RNN模型中多添加了几个隐藏层，这是因为考虑到当信息量过大时一次性无法保存所以重要信息，通过多个隐藏层可以保存更多的重要信息，深层RNN具体结构如图4所示。 图4. 循环积神经网络模型 RNN网络同样遵从权重共享的特性，但是在训练过程中会存在长期依赖的问题，简单来说，长期依赖的问题就是指在每一个时间间隔不断增大时，RNN将会失去连接到远处信息的能力，这主要是由于梯度消失或者梯度爆炸引起的。而LSTM网络可以通过刻意的设计避免长期依赖的问题，使记住长期的信息成为LSTM的默认行为，具体的LSTM单元结构如图5所示，RNN网络包含细胞状态、遗忘门、输入门和输出门四部分。细胞状态用来保存之前的重要信息；遗忘门控制遗忘上一层细胞状态的内容，通过Sigmoid激活函数，得到上一层细胞状态内容决定哪些去除和哪些留下，具体函数表达式为： f t = σ ( W f ⋅ [ h t − 1 ， x t ] + b f ) (4) 其中 σ ( ⋅ ) 表示Sigmoid激活函数， W f 和 b f 分别表示权重和偏置。输入门则处理当前序列位置的输入，确定需要更新的信息，去更新细胞状态。此过程分为两部分，一部分是通过Sigmoid激活函数决定哪些新的信息加入到细胞状态；之后要将新信息转换成可以加入到细胞状态的正确形式，即使用tanh函数产生新的候选向量，该控制门的计算表达式和新添加的细胞状态可以表示为： i t = σ ( W i ⋅ [ h t − 1 ， x t ] + b i ) C ˜ t = tanh ( W C ⋅ [ h t − 1 ， x t ] + b C ) (5) 其中，激活函数tanh的表达式为： tanh ( x ) = 1 − e − 2 x 1 + e − 2 x (6) 经过遗忘门和输入门之后，就可以把细胞状态 C t − 1 更新为 C t 了，具体表达式如下所示： C t = f t * C t − 1 + i t * C ˜ t (7) 其中， f t * C t − 1 为希望遗忘的信息， i t * C ˜ t 为新添加的信息。最后输出门要根据细胞状态所包含的内容决定输出。具体是指输出门需要使用Sigmoid激活函数决定哪些内容需要输出，之后使用tanh激活函数对细胞状态包含的内容进行处理，两部分相乘得到最后的输出，计算表达式为： o t = σ ( W o [ h t − 1 ， x t ] + b o ) h t = o t * tanh ( C t ) (8) 通过细胞状态的作用，序列信号在前面时刻获得的信息可以一直进行保存，并会对后续的LSTM单元产生影响，此网络结构解决了长期依赖的问题，成为目前解决时序数据处理问题的最常用网络。除此以外，有时候序列的预测值可能由前面时刻和后面时刻的若干输入共同决定，因此也产生了双向RNN、双向LSTM等网络结构。 图5. LSTM单元结构