深度学习综述
1概述
深度学习入门概述,内容包括网络结构,判别模型和生成模型的基本内容,略带讲解前沿模型和相关总结。
2神经网络
2.1结构:
神经网络是这样的一个结构:
- 输入层有多个输入神经元,然后将输入沿着边传播到隐含层中,每条边有附属的权值,隐含层神经元有自己的偏置。
- 在某个隐含层的神经元中,该神经元的输出为输入神经元的加权乘积和与隐含层偏置的总和。
- 隐含层的神经元输出到输出层中,以此类推,输出层的输出依然为隐含层神经元的的加权乘积和与输出层偏置的总和。
在一个特定的神经网络中,可以有多个隐含层。而且,由于每个神经元的权值和偏置不一定一样,所以对于不一样的输入数据,这些神经元的输出都不太一样。对于较多隐藏层的神经网络我们称为深度神经网络。
网络结构也可以分为两种,监督型和非监督型:
- 非监督型的从最开始的RBM和AE演化到DBN和SAE。
- 监督型的从最开始的单个感知机,演化到多层感知机(MLP,CNN,RNN,RNTN)。
而其他的稀疏自编码,ResNet,InceptionNet等等都是这些网络上的一些优化性改进而已。
2.2步骤
对于神经网络而言,最重要的是能恰当配置好隐藏层和输出层神经元的权值和偏置。幸好的是,这个配置是由机器来做,而不是人类。使用神经网络的步骤一般为三个:
- 建立模型,按照业务场景建立网络结构,多少个输入神经元和输出神经元,多少层隐含层,层与层之间是全连接,还是部分连接等等。
- 训练模型,对于已经标记好的大量数据,将它们扔到神经网络中,神经网络通过预测输出与实际输出的差值来自动调整隐藏层和输出层神经元权值和偏置。
- 数据预测,对于新的数据,将他们直接扔到输入层,得到的输出就是预测输出。
*
2.3应用
机器学习的主要用途为分类,聚类,回归,关联规则等等。现有的机器学习方法有SVM,logistic回归,决策树,随机森林等方法。但是,在需要高精度,难以提取特征的无结构化数据机器学习中,深度学习几乎是唯一的选择。
深度学习也有它的问题,它对训练数据很敏感,它的训练目标也是最小化训练数据的训练误差,所以容易受到噪音和过拟合的影响。因此,在一些高噪音的环境下,深度学习是失效的。例如,短期日内股票交易中,股票的波动可能是完全随机性的,上涨可能跟之前的股票走向有关,还可能跟随机性因素有关。所以,通过之前走向和未来走向扔进神经网络后,神经网络无法识别出哪些是因为随机性因素影响,哪些是真正可以使用的走向。高噪音让它无法收敛,或者只是收敛到一个过拟合的网络中。
3判别模型
3.1反向传播算法(BP)
使用梯度下降算法来不断调整权重与偏置。反向从输出层的权重与偏置开始调整起,然后是隐藏层,最后是输入层。
最大的问题是梯度消失:梯度在不断往后调整的过程中会越来越小,到输入层时几乎为0。导致梯度消失,输入层附近没有有效地调整权重与偏置。
3.2限制玻尔兹曼机(RBM)
限制波尔兹曼机的解决办法是,先从前面的层开始训练起,直至后面的层。
首先,建立一个三层网络,输入层,隐藏层1,和输出层。将输出层的结果调整为输入层一样的数据,然后训练隐藏层和输出层的权重与偏置。与此同时,要求隐藏层和输出层的权重与偏置尽可能一样。最后,丢弃输出层的权重与偏置,得到隐藏层1的权重与偏置。
很明显,把输入和输出直接设置成一样来训练,就是一个加密和解密的过程。这样做的原因是,将隐藏层1看成是特征提取机,输入层到隐藏层1的权重与偏置看成是提取特征,隐藏层1到虚拟输出层的的权重与偏置看成是特征复原。显然这两层的权重与偏置应该是要一样。
通过这样的方法,我们可以将RBM看成是原始数据的特征提取机。而且,RBM的虚拟输出层是固定为输入数据,完全不需要数据人工标注,这是一个非常好的无监督学习方法。
最后,将隐藏层的输出作为BP的输入数据来训练,能得到更好的训练效果。毕竟提取数据特征来训练要简单得多。
3.3深度信念网络(DBN)
既然我们可以用RBM来无监督提取一层原始数据的特征,为什么不在隐藏层的后面再加多一个RBM呢,也就是说,将RBM层叠就成为了传说中的深度信念网络DBN了。
一个典型的DBN就是输入数据后面层叠多个RBM,每个RBM单独训练,然后在最后一层的RBM后面加上一个传统的分类器就可以了,例如是BP,SVM等等。
3.4自动编码机(AE)
和RBM一样,也是个自动特征提取器,甚至他们训练的结构都是一样的。唯一的区别是,RBM的优化模型是一个极大似然优化,AE是个最小损失函数优化。所以,RBM输出的是概率型结果,AE是个确定型结果。总体来说,AE限制更少,更优秀一点。
另外,对于同一个数据而言,同一个AE由于训练方式的不同可能会构造出完全不同的特征提取器。那么,如何去选择和度量更好的特征提取器了,答案就是稀疏自编码器,降噪自编码器和正则自编码器。
稀疏自编码器认为高维而稀疏的网络表达是最好的,然后我们指定一个稀疏性参数ρ,代表隐藏神经元的平均活跃程度(在训练集上取平均)。比如,当ρ=0.05时,可以认为隐层节点在95%的时间里都是被一直的,只有5%的机会被**。那么,我们在损失函数中加入惩罚项,如果每次**的隐含节点越多,惩罚项越大。
降噪自编码器认为一个能够从中恢复出原始信号的表达未必是最好的,能够对“被污染/破坏”的原始数据编码、解码,然后还能恢复真正的原始数据,这样的特征才是好的。那么,我们在训练时会随机加入一些数据噪音,而能够适应这样噪音的特征器才会被选取。
正则自编码器认为权值和偏置的数值越小,特征提取就越好。那么,我们在损失函数中加入惩罚项,如果节点的权值和偏置的数值越大,惩罚项就越大。
3.5层叠自动编码机(SAE)
与层叠RBM就成为了DBN一样,层叠AE就成为了SAE,这是一个深度的特征提取器。由于AE比RBM更优秀的缘故,一般SAE的效果都比DBN更加优秀。而这两个都是一样的无监督特征学习器,也就是个预训练器。
3.6卷积神经网络(CNN)
卷积神经网络是从另外一个角度来解决BP的梯度消失的问题:那就是减少连接,和减少需要训练的权值和偏置的数量。
之前使用RBM提取特征时使用的是隐藏层全连接输入层的,可是提取图像特征时根本就不需要这么多,只需要提取这个点周边的8个点做加权和就可以了,这个加权和就是传说中的卷积。而且,这样的特征提取方式同一个特征应该是共用权值和偏置的。例如,我们opencv做边缘时,常用的卷积核就是
然后用这个卷积核对所有像素点都遍历一遍就可以了。同样的,我们在CNN时,提取同一种特征的神经元它们就是共享同一堆权值和偏置就可以了,唯一的区别就是它们映射的位置不一样而已。
当然仅仅只有一种特征是不够的,我们要多钟,所以我们建立了多个特征提取,同一个特征提取中所有神经元都是共享权值和偏置的。同一个特征提取中所有神经元被称为一个特征图。
就这样,我们得到了cnn的卷积层。一副32x32的图像能提取出8个特征图。
再然后,因为单个特征图的神经元数量还是太多了,我们做一个子抽样,将单个特征图邻近的神经元取最大值或平均值来取一个单独输出,就能大幅减少数量。
就这样,我们得到了子抽样层,也被称为池化层。卷积层和池化层两个合起来就是单次的特征提取过程。
跟DBN的一样,我们不断层叠卷积层和池化层,然后中途插入几个全连接层,就得到了一个卷积神经网络cnn了。由于卷积层减少了连接数量,而且单个特征图中共享共享权值和偏置,所以整个神经网络需要训练的权值和偏置其实很少,直接用bp的全局梯度下降训练就完事了。CNN的效果非常屌,成为一个真正的深度学习网络,大幅提高了ImageNet的识别率。
3.7网络中的网络(NIN)
Network In Network(NIN)结构是对CNN的一个重大优化,传统的CNN在卷积层后面直接加上池化层,没有对卷积的信息进行有效的非线性分析。所以,NIN的一个优化就是在卷积层后面加入了局部的全连接层,也就是MLPconv层。用代码来表示就是1x1的卷积核,相当amazing。
另外,在CNN最后的全连接层被更换为全局池化层(Global Average Pooling),避免过拟合,这样得出的网络所需的参数更少,收敛更快,泛化效果更好。
3.8递归神经网络(RNN)
4生成模型
4.1自动编码机(AE)
自动编码机在之前的判别模型中已经介绍过了,每次训练完一层后,将编码器留下,解码器扔掉,就变为一个特征提取器了。可是,如果我们将编码器扔掉,解码器留下,会是什么?输入是一段很短的code,输出是一幅完整的image,显然,这就是一个生成模型。我们可以任意输入code,然后让机器生成我们想要的目标数据。就这样,我们得到了一个简单的自监督形式的生成器模型。
可问题是,当我们训练好这样的生成模型后,最大的问题是生成出来的图片特别的假,不直观。那是因为AE训练时的自监督使用的是MSE对比方式,像下图的两幅图,左图是原图,右图是生成图,即使右图看起来有个点,但是MSE对比时loss就是比较少(MSE对比就是逐个像素一一对比),所以AE训练时就会认为右图比较逼真。
当然AE也有它特别的应用,AE的输入是经过噪音处理后的图片,输出是原图片时,经过一段时间训练的AE就学会了处理去除噪音的方法。这种方法十分适用于只知道编码方法,但不知道解码方法的场景,例如是去噪音,去水印,去马赛克,去雾,去雨等等。
4.2变分自动编码机(VAE)
5配置
初始化 正则化 **函数,sigmod,tanh,Relu 训练方法。
梯度下降:
1. 批量梯度下降法BGD
2. 随机梯度下降法SGD
3. 小批量梯度下降法MBGD
5.1**函数
**函数是加在神经元输出后面的一个函数,例如,神经元本身的输出是y1的,经过**函数f后,就变为y2=f(y1)来输出的。**函数的本质就是用来加入非线性因素的,解决线性模型所不能解决的问题,并有其他一些特殊的性质。
未加入**函数时,图形只能被线性划分,加入特定的**函数后,图形的划分是非线形划分的。