概念
深度学习定义:
深度学习的主要特点是使用多层次的神经网络来提取和学习数据中的特征,并通过反向传播算法来优化网络参数,从而实现对复杂数据的建模与分类。
深度学习分类:
有监督学习方法------深度前馈网络、卷积神经网络、循环神经网络等;
无监督学习方法------深度信念网、深度玻尔兹曼机,深度自编码器等。
思想:
深度神经网络的基本思想是通过构建多层网络,对目标进行多层表示,以期通过多层的高层次特征来表示数据的抽象语义信息,获得更好的特征鲁棒性。
神经网络
神经网络是一种由多个神经元(或称为节点)组成的计算模型,它模拟了生物神经系统中神经元之间的连接方式。神经网络有输入层、隐藏层和输出层组成,其中输入层用于接收外界的输入信号,输出层用于输出预测结果,隐藏层则用于处理输入信号并产生中间结果。
神经网络的本质:通过参数与激活函数来拟合特征与目标之间的真实函数关系。但在一个神经网络的程序中,不需要神经元和线,本质上是矩阵的运算,实现一个神经网络最需要的是线性代数库。


神经元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 Descent,BGD),每次迭代更新中使用所有的训练样本
优点:
收敛次数少。
缺点:
每次迭代需要用到所有数据,占用内存大耗时大。
随机梯度下降法 SGD
随机梯度下降法 (Stochastic Gradient Descent,SGD),每次迭代(更新参数)只使用单个训练样本
优点:
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损失函数等。
优化函数:
也就是如何把损失值从神经网络的最外层传递到最前面。如最基础的梯度下降算法,随机梯度下降算法,批量梯度下降算法,带动量的梯度下降算法,Adagrad,Adadelta,Adam等。