深度学习总结

卷积神经网络(CNN)

CNN

入门参考:https://zhuanlan.zhihu.com/p/27908027

卷积层

局部感知机制:数据窗口滑动,输入变化、滤波器权重不变
参数权重共享机制:滤波器

下采样(池化)层

取区域平均或最大

激活函数

在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

激活函数的用途(为什么需要激活函数)?

如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

有哪些激活函数,都有什么性质和特点?

早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。
详细参考:https://blog.csdn.net/tyhj_sf/article/details/79932893
https://blog.csdn.net/NOT_GUY/article/details/78749509

  1. Sigmoid
    深度学习总结
    优点:有较好的解释性
    缺点:1.Sigmoid函数饱和使梯度消失。sigmoid神经元有一个不好的特性,就是当神经元的激活在接近0或1处时会饱和:在这些区域,梯度几乎为0。根据后向传递的数学依据是微积分求导的链式法则,当前导数需要之前各层导数的乘积,几个比较小的数相乘,导数结果很接近0,从而无法完成深层网络的训练。2.输出不是零中心的,这一情况将影响梯度下降的运作,因为如果输入神经元的数据总是正数,那么关于w的梯度在反向传播的过程中,将会要么全部是正数,要么全部是负数,这样梯度下降权重更新时出现z字型的下降。这样收敛会变得异常的慢。(这也是为什么要一直保持为数据的0中心化)—–但这个问题比较小3.exp()在深度神经网络时候相比其他运算就比较慢

  2. Tanh非线性函数
    深度学习总结
    优点:1.它的输出是零中心的。因此,在实际操作中,tanh非线性函数比sigmoid非线性函数更受欢迎。
    缺点:1.和Sigmoid函数一样,饱和使梯度消失。计算慢
    其实 tanh(x)=2sigmoid(2x)-1

  3. ReLU:全区间不可导
    深度学习总结
    优点:1.ReLU对于随机梯度下降的收敛有巨大的加速作用( Krizhevsky 等的论文alexnet指出有6倍之多)。据称这是由它的线性,非饱和的公式导致的;2.注意:现在大部分的DNN用的激活函数就是ReLu
    缺点:1.当x是小于0的时候,那么从此所以流过这个神经元的梯度将都变成0;这个时候这个ReLU单元在训练中将死亡(也就是参数无法更新),这也导致了数据多样化的丢失(因为数据一旦使得梯度为0,也就说明这些数据已不起作用)。
    缺点:(1)ReLU的输出不是zero-centered;(2)Dead ReLU Problem(神经元坏死现象):某些神经元可能永远不会被激活,导致相应参数永远不会被更新(在负数部分,梯度为0)。产生这种现象的两个原因:参数初始化问题;learning rate太高导致在训练过程中参数更新太大。 解决方法:采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。(3)ReLU不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张。

反向传播算法

https://www.cnblogs.com/charlotte77/p/5629865.html

RNN

处理列序数据
RNN 到 LSTM – 长短期记忆网络
RNN 是一种死板的逻辑,越晚的输入影响越大,越早的输入影响越小,且无法改变这个逻辑。

LSTM 做的最大的改变就是打破了这个死板的逻辑,而改用了一套灵活了逻辑——只保留重要的信息。

https://zhuanlan.zhihu.com/p/30844905

RNNs的目的使用来处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNNs之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNNs能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关,

https://blog.csdn.net/heyongluoyao8/article/details/48636251

如何训练RNNs

对于RNN是的训练和对传统的ANN训练一样。同样使用BP误差反向传播算法,不过有一点区别。如果将RNNs进行网络展开,那么参数W,U,VW,U,V是共享的,而传统神经网络却不是的。并且在使用梯度下降算法中,每一步的输出不仅依赖当前步的网络,并且还以来前面若干步网络的状态。比如,在t=4t=4时,我们还需要向后传递三步,已经后面的三步都需要加上各种的梯度。该学习算法称为Backpropagation Through Time (BPTT)。后面会对BPTT进行详细的介绍。需要意识到的是,在vanilla RNNs训练中,BPTT无法解决长时依赖问题(即当前的输出与前面很长的一段序列有关,一般超过十步就无能为力了),因为BPTT会带来所谓的梯度消失或梯度爆炸问题(the vanishing/exploding gradient problem)。当然,有很多方法去解决这个问题,如LSTMs便是专门应对这种问题的。

softmax函数

https://www.zhihu.com/question/23765351
深度学习总结
深度学习总结
深度学习总结

LSTM

https://blog.csdn.net/shinanhualiu/article/details/49864219
深度学习总结

  1. 遗忘门:第一步是决定我们要从细胞状态(cell state)中丢弃哪些信息。这个决定是由一个sigmoid层叫“忘记门限层”所决定的。它的输入为ht−1和xt, 输出0到1间的数到细胞转态(cell state)Ct−1。其中1表示“完全的保留”而0表示“完全的放弃”。
  2. 输入门:下一步就是决定哪些新的信息需要存储在细胞状态中。这包含两部分:第一部分,一个sigmoid层叫“输入门限层”决定哪些值我们需要去更新。第二部分,一个tanh层,创建一个新的候选向量C^t,会被加入到这状态上。下一步,我们将组合这两个部分产生一个新的更新状态。
    现在是时候去更新老的细胞状态Ct−1, 到一个新的细胞状态Ct。前面的步骤已经决定了将要做什么,我们仅仅需要去实现它。
    我们将旧状态与ft相乘,需要丢弃的我们需要更早的丢弃。然后加上it∗C^t。 这就是这新的候选值,规格化了我们需要去决定有多少状态值需要去更新。
  3. 输出门:最后,我们需要决定需要输出什么,输出是基于我们的细胞状态,但是也有一个过滤后的版本。首先,我们运行sigmoid层,这层决定细胞转态哪些部分需要输出。然后,我们把细胞状态通过tanh(输出-1到1之间的值)进行处理,然后再乘上sigmoid输出。最后我们仅仅会输出我们确定输出的那部分。

GRU

忘记门和输入门合成单一的更新门,混合了细胞状态和隐藏状态
深度学习总结
这里面有个小问题,眼尖的同学可能看到了,和都是对、做的Sigmoid非线性映射,那区别在哪呢?原因在于GRU把忘记门和输入门合二为一了,而是属于要记住的,反过来则是属于忘记的,相当于对输入、做了一些更改/变化,而则相当于先见之明的把输入、在/对其做更改/变化之前,先事先存一份原始的,最终在那做一个tanh变化。

GRU则是LSTM的一个变体,GRU只有两个门了,分别为更新门和重置门。

更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。重置门用于控制忽略前一时刻的状态信息的程度,重置门的值越小说明忽略得越多。

上一篇:从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系


下一篇:ReLU 函数