深度学习详解

深度学习详解 概念深度学习定义深度学习的主要特点是使用多层次的神经网络来提取和学习数据中的特征并通过反向传播算法来优化网络参数从而实现对复杂数据的建模与分类。深度学习分类有监督学习方法——深度前馈网络、卷积神经网络、循环神经网络等无监督学习方法——深度信念网、深度玻尔兹曼机深度自编码器等。思想深度神经网络的基本思想是通过构建多层网络对目标进行多层表示以期通过多层的高层次特征来表示数据的抽象语义信息获得更好的特征鲁棒性。神经网络神经网络是一种由多个神经元或称为节点组成的计算模型它模拟了生物神经系统中神经元之间的连接方式。神经网络有输入层、隐藏层和输出层组成其中输入层用于接收外界的输入信号输出层用于输出预测结果隐藏层则用于处理输入信号并产生中间结果。神经网络的本质通过参数与激活函数来拟合特征与目标之间的真实函数关系。但在一个神经网络的程序中不需要神经元和线本质上是矩阵的运算实现一个神经网络最需要的是线性代数库。神经元1为输入层而外部传入的x1、x2、x3、x4、x5、……全部都是外界即将传入神经元的电信号这些电信号在传入途中可能会有所损耗而损耗完剩下的才会传入神经元这些传入的实际信号就用w1x1、w2x2、w3x3、w4x4、w5x5、……来表示w叫做权重。神经网络:每个节点代表一种特定的是由大量的节点或称“神经元”和之间相互的联接构成。输出函数称为激励函数、激活函数activation function。每两个节点间的联接都代表一个对于通过该连接信号的加权值称之为权重这相当于人工神经网络的记忆。感知器由两层神经元组成的神经网络--“感知器”Perceptron,感知器只能线性划分数据。公式是线性代数方程组因此可以用矩阵乘法来表达这两个公式输出的结果与训练集标签进行损失函数计算与逻辑回归基本一致。多层感知器增加了一个中间层。即隐含层神经网络可以做非线性分类的关键--隐藏层假设我们的预测目标是一个向量那么与前面类似只需要在“输出层”再增加节点即可。多层感知器——偏置在神经网络中需要默认增加偏置神经元节点这些节点是默认存在的。 它本质上是一个只含有存储功能且存储值永远为1的单元。 在神经网络的每个层次中除了输出层以外都会含有这样一个偏置单元。偏置节点没有输入前一层中没有箭头指向它。 一般情况下我们都不会明确画出偏置节点。前向传播和反向传播前向传播得到误差反向传播调整误差再前向传播再反向传播一轮轮得到最优解。步骤1、计算正向传播输出的结果。2、计算损失函数。3、计算w的梯度下降第一轮w的值随机指定4、误差反向传播将每个维度偏导数导入本次的w的值初次的w的值随机初始化并乘以步长即得到新的w的值。5、循环调整w的值直到损失值小于允许的范围。前向传播反向传播激活函数激活函数(Activation functions)对于人工神经网络 模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。为什么要使用激活函数激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。激活函数可以引入非线性因素。如果不使用激活函数则输出信号仅是一个简单的线性函数。线性函数一个一级多项式线性方程的复杂度有限从数据中学习复杂函数映射的能力很小。没有激活函数神经网络将无法学习和模拟其他复杂类型的数据例如图像、视频、音频、语音等。激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间让数据能够更好的被分类。防止梯度消失、梯度爆炸。梯度消失如果连乘的因子大部分小于1最后的结果可能趋于0也就是梯度消失后面的网络层参数不发生变化。梯度爆炸如果连乘的因子大部分大于1最后乘积可能趋于无穷这就是梯度爆炸。为什么激活函数需要非线性函数假若网络中全部是线性部件那么线性的组合还是线性与单独一个线性分类器无异。这样就做不到用非线性来逼近任意函数。使用非线性激活函数 以便使网络更加强大增加它的能力使它可以学习复杂的事物复杂的表单数据以及表示输入输出之间非线性的复杂的任意函数映射。使用非线性激活函数能够从输入输出之间生成非线性映射。常见激活函数优化方法深度学习网络训练过程可以分成两大部分前向计算过程与反向传播过程。前向计算过程是指通过我们预先设定好的卷积层、池化层等等按照规定的网络结构一层层前向计算得到预测的结果。反向传播过程是为了将设定的网络中的众多参数一步步调整使得预测结果能更加贴近真实值。在反向传播过程中很重要的一点就是参数如何更新或者问的更具体点参数应该朝着什么方向更新显然参数应该是朝着目标损失函数下降最快的方向更新更确切的说要朝着梯度方向更新接下来介绍常见的梯度下降算法基本梯度下降方法批量梯度下降法 BGD批量梯度下降法 (Batch Gradient DescentBGD)每次迭代更新中使用所有的训练样本优点收敛次数少。缺点每次迭代需要用到所有数据占用内存大耗时大。随机梯度下降法 SGD随机梯度下降法 (Stochastic Gradient DescentSGD)每次迭代更新参数只使用单个训练样本优点SGD 一次迭代只需对一个样本进行计算因此运行速度很快还可用于在线学习缺点1由于单个样本的随机性实际过程中目标损失函数值会剧烈波动一方面SGD 的波动使它能够跳到新的可能更好的局部最小值。另一方面使得训练永远不会收敛而是会一直在最小值附近波动。2一次迭代只计算一张图片没有发挥GPU并行运算的优势使得整体计算的效率不高。小批量梯度下降法 MBGD将训练数据集分成小批量用于计算模型误差和更新模型参数是批量梯度下降法和随机梯度下降法的结合。优缺点因为每次迭代使用多个样本所以 MBGD 比 SGD 收敛更稳定也能避免 BGD 在数据集过大时迭代速度慢的问题。因此MBGD是深度学习网络训练中经常使用的梯度下降方法。Adam优化器Adam 是另一种参数自适应学习率的方法相当于 RMSprop Momentum利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。动量梯度下降入了基于梯度的移动指数加权平均的思想即当前的参数更新方向不仅与当前的梯度有关也受历史的加权平均梯度影响。对于梯度指向相同方向的维度动量会积累并增加而对于梯度改变方向的维度动量会减少更新。这也就使得收敛速度加快同时又不至于摆动幅度太大。普通SGD的缺点SGD很难在沟壑即曲面在一个维度上比在另一个维度上弯曲得更陡的区域中迭代这在局部最优解中很常见。在这些场景中SGD在沟壑的斜坡上振荡同时沿着底部向局部最优方向缓慢前进。为了缓解这一问题引入了动量momentum。本质上当使用动量时如同我们将球推下山坡。球在滚下坡时积累动量在途中变得越来越快。同样的事情发生在参数更新上对于梯度指向相同方向的维度动量会积累并增加而对于梯度改变方向的维度动量会减少更新。结果我们获得了更快的收敛和减少的振荡。损失函数在机器学习任务中大部分监督学习算法都会有一个目标函数 (Objective Function),算法对该目标函数进行优化称为优化算法的过程。 例如在分类或者回归任务中使用损失函数( Loss Function )作为其目标函数对算法模型进行优化 。常见的损失函数回归损失函数均方误差损失函数平均绝对误差损失函数均方误差对数损失函数平均绝对百分比误差损失函数分类损失函数交叉熵损失0-1损失函数当预测值与真实值不相等时损失为1相等时损失为0。激活函数、损失函数、优化函数的区别激活函数将神经网络上一层的输入经过神经网络层的非线性变换转换后通过激活函数得到输出。常见的激活函数包括sigmoid, tanh, relu等。损失函数度量神经网络的输出的预测值与实际值之间的差距的一种方式。常见的损失函数包括最小二乘损失函数、交叉熵损失函数、回归中使用的smooth L1损失函数等。优化函数也就是如何把损失值从神经网络的最外层传递到最前面。如最基础的梯度下降算法随机梯度下降算法批量梯度下降算法带动量的梯度下降算法AdagradAdadeltaAdam等。