深度学习的发展应该来说很有前途,目前来看随着GPU和大数据的发展,估计应用到工业上已经不远了,这样的话传统的检测分类和跟踪之类所需要的选取目标特征均可以被替代。好处主要体现在可以自动学习目标特征,并非手动标定,另一方面,体现在可以构建一个超完备空间,可以区分目标背景。其中主要的过程是在调参数。

目前的深度学习有三种架构:SDA,RBM,CNN.其中我们学习的是自编码器。


自编码训练遵循的是BP算法,但是与传统的BP算法不同的是输出级并不是待定给出的教导信号,而是与输入一致的信号。而一般浅层网络的结构可以用BP 实现,但是层数多了会出现最后一级可以有误差反向传播,但是前几级就不会再传,主要是容易陷入极值点,误差传播为0.因为才有HILTON的逐层贪婪训练算法,每一级都有编码与解码过程,保留其中的编码过程得到的就是自编码器。自己输入自己输出才叫自编码。每一级BP训练其实用的是SGD(随机梯度下降),这是一种估计极值逼近的过程,因为在求误差最小的时候,导数的极值是不可以再求的。因而才有了极值逼近的过程。随机梯度下降就是求此种条件下目标的最大似然函数。随机梯度下降过程中每一步下降多少这个参数叫做步长,也称之为学习率。学习率参数机器重要,过大的话 ,会迅速收敛到极值附近,但是到极值附近后就无能为力。过小的话收敛速度过慢,当迭代次数不够多的时候会出现收敛不到极值点,会一直梯度下降,收敛不了。得到的深度网络一定不是最优网络。一般实现的方式主要是开始的时候迭代率大,慢慢接近最优值的时候减小学习率。实现方式是每一次的迭代过程中学习率设置完成后,在设置比例系数,一般可以取0.7-0.9左右。梯度下降的主要过程是计算整个数据集的梯度,然后通过学习率*梯度更新回归系数。随机梯度下降主要是一次用一个样本点来更新系数,数在线学习算法。对应的是批处理过程(一次处理整个数据集)。SGD改进的两点:学习率(比例系数)和样本点的优化顺序(随机)。

其次训练过程中出现的错误极大可能是由于不是一个很好的完备空间导致的。一方面,有些样本点本身不收敛,因而一直在极值点附近晃动,无法收敛,另一方面,空间的区分度不大,使得目标和背景无法准确分离。此时该进的做法是增大超完备空间。实现方法多种,从开始处理的话,预处理过程,训练过程改进。预处理过程可以改进的主要是尽可能突出目标与背景的差异性。当训练出现NaN情况下,解决办法可以用白化的方法PCA/ZCA,一般常用的操作是去均值归一化(实践)。需要的话可以用图像增强的方法(线性拉伸等)。从训练的角度来看的话,主要是增加空间的区分度,可以利用Fisher准则,但是此种情况适合正负样本点差异较大的情况下,一般效果不一定很明显。另一种过程是换非线性函数sigmoid ,可以尝试relu函数,但是此种函数证明在CNN效果较好,对自编码器并不推荐使用。还有的可以快速收敛的有增量控制的过程,每次增量增加到样本中,使得迭代速度增加等。

经验来说,对于形变不大的边缘我们一般设置的学习率较小,0.7--0.9左右,对于像形变较大的边缘如人等等,一般选择1.1-1.3左右。其次在构成特征向量的过程中,为了计算的速度,可以量化概率,形成一个新的特征,可以避免窗口的大小改变。或者为了突出目标的信息,可以增加核函数,赋予新的权重,避免训练的样本正负样本集不准确造成的误差。