【keras】神经网络调参

        神经网络中需要调的参数很多,如何正确地调参至关重要,需要调节的参数大概有如下几个:

神经网络的层数
每层神经元的个数
如何初始化Weights和biases
loss函数选择哪一个
选择何种Regularization?L1,L2
Regularization parameter lambda 选择多大合适
激励函数如何选择
是否使用dropout
训练集多大比较合适
mini-batch选择多大
学习率多少合适
选择何种梯度下降算法
何时停止Epoch训练

        更多内容,请移步:神经网络学习:如何调参

1.Epoch

        为什么要使用多于一个 epoch?

        这在刚开始听起来会很奇怪,在神经网络中传递完整的数据集一次是不够的,而且我们需要将完整的数据集在同样的神经网络中传递多次。但是请记住,我们使用的是有限的数据集,并且我们使用一个迭代过程即梯度下降,不同的epoch对于优化学习的结果的影响如下图所示。因此,需要确定合适的 epoch 值。

2.Batch_size

        一个 batch 中的样本总数。记住:batch size 和 number of batches 是不同的。

        BATCH 是什么?在不能将数据一次性通过神经网络的时候,就需要将数据集分成几个 batch。

其他内容:可移步:神经网络训练中,Epoch、Batch Size和迭代傻傻分不清?

3.激活函数

3.1 为什么引入非线性激励函数?

        深度学习的基本原理是基于人工神经网络,信号从一个神经元进入,经过非线性的activation function,传入到下一层神经元;再经过该层神经元的activate,继续往下传递,如此循环往复,直到输出层。正是由于这些非线性函数的反复叠加,才使得神经网络有足够的能力来学习复杂的模式。

        如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机了。

        正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)。

3.2 为什么通常Relu比sigmoid和tanh强,有什么不同?

        主要是因为它们梯度特性不同。sigmoid和tanh的gradient在饱和区域非常平缓,接近于0,很容易造成梯度消失问题(Vanishing Gradient Problem),减缓收敛速度。梯度消失在网络层数多的时候尤其明显,是加深网络结构的主要障碍之一。相反,Relu的梯度大多数情况下是常数,有助于解决深层网络的收敛问题。Relu的另一个优势是在生物上的合理性,它是单边的,相比sigmoid和tanh,更符合生物神经元的特征。
        而提出sigmoid和tanh,主要是因为它们全程可导。还有表达区间问题,sigmoid和tanh区间是0到1,或着-1到1,在表达上,尤其是输出层的表达上有优势。

        Relu更容易学习优化。因为其分段线性性质,导致其前传,后传,求导都是分段线性。而传统的sigmoid函数,由于两端饱和,在传播过程中容易丢弃信息:

3.3 为什么引入Relu呢?

        第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。

        第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。

        第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生(以及一些人的生物解释balabala)。Relu激活函数的形式如下图所示: 

è¿éåå¾çæè¿°

        从上图不难看出,Relu函数其实是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被成为单侧抑制。可别小看这个简单的操作,正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。尤其体现在深度神经网络模型(如CNN)中,当模型增加N层之后,理论上Relu神经元的激活率将降低2的N次方倍。这里或许有童鞋会问:Relu的函数图像为什么一定要长这样?反过来,或者朝下延伸行不行?其实还不一定要长这样。只要能起到单侧抑制的作用,无论是镜面翻转还是180度翻转,最终神经元的输出也只是相当于加上了一个常数项系数,并不影响模型的训练结果。之所以这样定,或许是为了契合生物学角度,便于我们理解吧。

        那么问题来了:这种稀疏性有何作用?换句话说,我们为什么需要让神经元稀疏?不妨举栗子来说明。当看名侦探柯南的时候,我们可以根据故事情节进行思考和推理,这时用到的是我们的大脑左半球;而当看蒙面唱将时,我们可以跟着歌手一起哼唱,这时用到的则是我们的右半球。左半球侧重理性思维,而右半球侧重感性思维。也就是说,当我们在进行运算或者欣赏时,都会有一部分神经元处于激活或是抑制状态,可以说是各司其职。再比如,生病了去医院看病,检查报告里面上百项指标,但跟病情相关的通常只有那么几个。与之类似,当训练一个深度分类模型的时候,和目标相关的特征往往也就那么几个,因此通过Relu实现稀疏后的模型能够更好地挖掘相关特征,拟合训练数据。

        此外,相比于其它激活函数来说,Relu有以下优势:对于线性函数而言,Relu的表达能力更强,尤其体现在深度网络中;而对于非线性函数而言,Relu由于非负区间的梯度为常数,因此不存在梯度消失问题,使得模型的收敛速度维持在一个稳定状态。这里稍微描述一下什么是梯度消失问题:当梯度小于1时,预测值与真实值之间的误差每传播一层会衰减一次,如果在深层模型中使用sigmoid作为激活函数,这种现象尤为明显,将导致模型收敛停滞不前。

        更多请移步:

        ReLU激活函数:简单之美 

        人工神经网络中的activation function的作用具体是什么?为什么ReLu要好过于tanh和sigmoid function?

        知乎论坛

猜你喜欢

转载自blog.csdn.net/zyxhangiian123456789/article/details/87720472