本篇写一写深度学习里一些常见的东西,比如常见的NN、传播算法、激活函数、优化算法等等。其实博主认为深度学习是一个很玄学的领域,很多东西需要实证,之后慢慢补上。。
激活函数
激活函数是具有一些性质的,例如可微、单调、取值有范围(若无限则需要更小的Learning Rate)等。其实博主认为这些激活函数只要不出理论性的偏差,在优化上的水分(即所谓的Trick)是比较大的,就像数据准备和模型训练的关系一样,仅仅专注于模型参数的调优会有Overfitting的可能=。=
阶跃函数:用于分类的激活函数的老祖宗=。=然而糟糕的函数性质让其没法很好的使用,例如不可导。
Sigmoid:可用于输出层。渐进线是y=0,y=1,以y=0.5为分界,x值越大越小时曲线越平缓,导数越趋近于0,梯度越小。换句话说,Sigmoid有梯度消失的问题。
Hyperbolic Tangent:tanh,双曲正切函数,多用于隐层。Sigmoid的变形版,渐近线y=-1,y=1,以y=0为分界(0均值性质),x=0时梯度为0,其他的和Sigmoid类似。
ReLU:多用于隐层。分段函数,x<=0时y=0,x>0时y=x,这种单侧抑制的机制似乎比较像神经皮层的工作机制(具体不太懂=。=)。函数右侧不会出现梯度消失的问题,而且因为是线性的所以收敛速度比Sigmoid和Tanh快。但自己本身有一个问题就是当学习率过大时会导致硬着陆(落入左侧),因此衍生出了Leaky-ReLU、P-ReLU、R-ReLU等进化版(都是弥补左侧梯度永远为0的问题)。
Softmax:可用于输出层。从原始的式子就可以看出,这是一个归一化的概率值。而Softmax和Hinge损失(铰链损失)的区别就在于,Softmax并不是非此即彼,而是对所有分类进行概率计算,取概率最大的那个为预测分类,所有称作soft的max值=。=
优化算法
梯度下降:这里几个重点关注的问题,鞍点、局部最优、学习率等。
SGD:随机梯度下降法,最最最常用的优化算法,其他梯度下降法还有Batch Gradient Descent、Mini-Batch Gradient Descent(常用)等,都是梯度下降的原理,只是用于更新参数的样本数量有所变化。值得一提的是,通过梯度下降这种数值优化算法去迭代逼近参数,是因为闭式解的求解太过复杂或无法计算,所以造出了通过梯度下降(梯度上升也是同理)去修参的式子。SGD由于是抽取样本训练,所以可以在线更新。
SGD主要有几个问题:
1.通过随机抽取样本进行训练的这种方法会使梯度容易受样本的影响,噪声较大。
2.学习率的设定。一个是应该根据收敛的速度动态调整学习率;一个是对于稀疏数据,出现频率少的特征应该赋予更大的学习速率。
3.在鞍点处频繁振荡。
Momentum:处理的是SGD振荡的问题。加入了物理中动量的概念,从式子可以看出,是在SGD的基础上添加了一项,即前几时刻的梯度乘以动量。作用在于,当前方向与之前方向相同可以加速学习,方向不同可以减小振荡(从式子来看很好理解)。
Nesterov Momentum:Momentum的进化版,在梯度式子里减了一项前几时刻的梯度乘以动量,意指提前预估当前方向,和Momentum没有本质上的区别,单纯的优化。
Adagrad:处理的是SGD学习率固定的问题。也是在SGD的基础上进行修改的,在学习率的分母上加入了带平滑的对角矩阵(矩阵内是各参数之前梯度的平方和)。换句话说,之前梯度大的分母就大,学习率就高,这个特性和稀疏数据很相似,因为出现频率低的特征学习率本就应该设置的更大。但Adagrad有一个问题,即学习率分母在越来越大后会导致神经网络的训练提前结束。
RMSProp:Adagrad的改进版,其实区别就在于在历史梯度的处理(RMSProp从Adagrad的求平方和改为了求均值)中加入了一个衰减系数(超参),用来控制分母的增大。emmm怎么说呢,理论上和Adagrad没什么区别,有点治标不治本的意味=。=
Adam:虽然式子看起来和Adagrad没啥区别,但有两个地方变了,一个是原来的梯度变成了梯度一阶矩估计的偏置校正,一个是学习率分母中的梯度矩阵变成了梯度二阶矩估计的偏置校正(为啥要这样做不是很清楚=。=),这样在一定范围内动态的改变学习率,也能使参数收敛更平稳。
牛顿法:emmm其实以下几个算法并不是常用在深度学习中,不过鉴于放在其他博文里不好分类,所以先放在这了=。=。牛顿法也是一种迭代求解的算法,这个算法涉及到Hessian矩阵(通俗的说就是对参数集按照下标求二阶偏导所构成的方阵)和泰勒展开式(展开到二阶)。一般而言模型的目标是希望损失函数尽量小,也就会令其导数式为0(刚好符合泰勒展开式的前提),这个时候使用泰勒展开式推出的每次迭代的递推式进行计算(泰勒展开式的含义并不是与原式相等,而是近似等于),逐步逼近得到结果。由于用到了二阶信息,因此牛顿法的收敛速度比梯度下降更快,但因为需要计算Hessian矩阵和Hessian矩阵的逆(前提是非奇异),所以比较复杂。
拟牛顿法:针对牛顿法的Hessian矩阵进行了改进,用其他矩阵替代了Hessian矩阵或Hessian矩阵的逆(实际在迭代求解最优值的过程中用到的也是逆)。
DFP:近似Hessian矩阵的逆,通过迭代计算,第一代使用单位阵,重点在于近似矩阵的delta。其实DFP的推导有点意思,很难只用语言形象的表达,之后新开一篇单独写写这几个拟牛顿法=。=
BFGS:近似Hessian矩阵本身,通过迭代计算,和DFP的道理是一样的。
L-BFGS:在存储空间上对BFGS做了优化,不存完整矩阵改存部分最新的向量,损失了一定精确度,其他和BFGS一个道理。
共轭梯度法:本质上还是求梯度,但和梯度下降法不同的是,共轭梯度法除了第一次走的是负梯度方向,之后走的是上个方向和当次负梯度方向之间的某个方向,比梯度下降法好在最后收敛可以比较好的避免振荡。
模拟退火算法:全局优化算法,求解的过程其实就是降温的过程。该算法涉及到MCMC过程,之后新开一篇写写=。=。简单来说,delta的值是随机值+扰动项生成的,在求解的过程中,若新解比旧解更好则接受,否则按一定概率接受,所以要是rp不好,emmm。。。=。=
神经网络层
Dense:全连接层,emmm没什么好说的=。=
Pooling:池化层,多见于CNN,作用是对卷积层的结果再做一次采样,和卷积的原理相似,一可以加强特征的提取,二可以减小NN的规模。池化的计算以MaxPooling最常用。
Dropout:按一定概率(例如0.5),随机放弃一些神经元,进而减少了参数,也加速了网络训练。主要作用是为了防止NN过拟合,其次是训练耗时过长。
Flatten:将多维数据压缩(展开)至一维,常用作卷积层->全连接层的过渡。
神经网络
全连接NN:由全连接层组成的NN,经典老祖宗模型,被众多书籍拿来解释神经网络的原理,没什么好说的。。
CNN:多用于图像处理。精髓在于一个词:采样。由于加入了卷积层(卷积层中Feature Map即为卷积核,顾名思义)的特征提取机制,为NN减少了大量的参数。这里主要说说权值共享和卷积核。权值共享:首先可以这么认为图像每一部分统计特性都是等效的,这就是权值共享的由来,即对特征采取同样的权重,这大大减少了参数的数量。卷积核:这是CNN的核心,每一个卷积核可以理解为从不同角度(通道)对图片特征的提取。卷积核的计算是乘积,卷积核的初始值可以是随机的。
FCN:全卷积神经网络(了解不多,之后来填坑=。=),多用于图像语义分割。将CNN中最后的一维向量层换为卷积层,再通过上采样还原至原图大小(还可以结合CRF得到更精细的效果),比CNN高效,而且输入图像尺寸可以是任意的。
RCNN:R指Regions,CNN的作用是图像识别,所以要做到物体检测,只要把目标定位出来即可。留个坑。。。
RNN:循环神经网络,多用于处理序列问题,传播算法用的是BPTT而非BP。输入端除了当前的输入外,还有历史的输入,原理上来说比CNN好理解一些。需要提一下RNN用于NLP的时候,其输出的并非是最终结果,而是序列的概率矩阵,是需要取最大值的。
LSTM:针对RNN梯度消失、梯度爆炸的问题进行了改进,理论上添加了专门处理历史输入的遗忘门,实际应用中LSTM多少都会有一些变体。
GRU:LSTM的典型变体,将遗忘门和输入门合并成了更新门。关于LSTM、GRU的实现之后会新开一篇附上代码=。=
GAN:传说中的生成对抗网络,形象的理解就是生成网络和判别网络互相欺骗,生成网络不断根据判别结果的误差(例如交叉熵)更新参数以骗过判别网络,判别网络不断根据训练样本和生成网络每次新的输入(可以各取一半)更新参数以适应生成网络的骗术。GAN训练的目标是得出一个良好的生成网络用于图像、音频等的生成。
DBN:暂时留个坑=。=
传播算法
BP:传说中的反向传播算法,从网络的最后一层开始,用结果的损失函数(例如交叉熵)基于优化算法(例如SGD)得出需要参数的新值,然后往前回溯一层,用新的参数计算出上一层的损失函数并更新上一层的参数,以此往前推直到第一层。
BPTT:其实原理上与BP是相似的,区别在于BP是在空间上回溯,BPTT是在时间上回溯。
优化
超参数优化:
Grid Search:网格式搜索,给定超参的可选值,然后穷举。
Randomized Search:给定一个区间,在区间内随机设定超参。
Shuffling:很容易理解,为了更好的得到一个无偏的模型,打乱训练集顺序很常用。
Early Stopping:对比迭代过程中的损失函数,如果损失函数不再显著下降则停止训练。
Batch Normalization:训练前通常会把训练集的值按照均值0-标准差1进行标准化,能得到更快的收敛速度。并且在更新参数后,再进行一次标准化,可以消除网络结构加深给之后参数带来的传递影响,也可以加快训练速度(需要实证=。=)。
先写这么多,还差几个坑+神经网络加速,撒花~~~
浙公网安备 33010602011771号