激活函数
为啥需要激活函数?在神经网络中,我们的输入层通过各个连接上的权值,进行加权求和后传递到下一层,这种处理方式往往是呈线性组合的状态,而我们知道一般线性函数的值域是负无穷到正无穷,也是就是说线性组合的模型缺乏逼近能力,而我们的神经网络的训练大多需要一个梯度下降即寻找最小误差的过程,很显然,这种线性组合的方式满足不了,于是我们需要一种非线性的函数将线性的组合进行非线性映射,增强网络的鲁棒性
激活函数通常有以下性质:
- 非线性
- 可微性
- 单调性
- ?(?)≈?
- 输出值有范围
- 计算简单
- 归一化
激活函数经常使用Sigmoid函数、tanh函数、ReLu 函数
Sigmoid函数
Sigmoid函数的优点在于输出范围有限,数据在传递的过程中不容易发散,并且其输出范围为(0,1),可以在输出层表示概率值,如图所示。Sigmoid函数的导数是非零的,很容易计算。
Sigmoid函数的主要缺点是梯度下降非常明显,且两头过于平坦,容易出现梯度消失的情况,输出的值域不对称,并非像tanh函数那样值域是-1到1。
双曲正切函
双曲正切函数将数据映射到[-1,1],解决了Sigmoid函数输出值域不对称问题。另外,它是完全可微分和反对称的,对称中心在原点。然而它的输出值域两头依旧过于平坦,梯度消失问题仍然存在。为了解决学习缓慢和梯度消失问题,可使用其更加平缓的变体,如log-log、Softsign、Symmetrical Sigmoid等
ReLU函数
ReLU函数是目前神经网络里常用的激活函数,由于ReLU函数是线性特点使其收敛速度比Sigmoid、Tanh更快,而且没有梯度饱和的情况出现。计算更加高效,相比于Sigmoid、Tanh函数,只需要一个阈值就可以得到激活值,不需要对输入归一化来防止达到饱和。
损失函数
损失函数评价的是模型对样本拟合度,预测结果与实际值越接近,说明模型的拟合能力越强,对应损失函数的结果就越小;反之,损失函数的结果越大。
损失函数结果比较大时,对应的梯度下降比较快。为了计算方便,可以采用欧式距离作损失度量标准,通过最小化实际值与估计值之间的均方误差作为损失函数,即最小平方误差准则(MSE):
其中?(?)是模型根据输入矩阵X输出一个预测向量,预测值?(?)和真值?的欧式距离越大、损失就越大,反之就越小,即求〖||?(?)−?||〗^2的极小值。
如果是批量数据,则将所有数据对应模型结果与其真实值之间的差的平方进行求和。合适的损失函数能够确保深度学习模型更好地收敛,常见的损失函数有Softmax、欧式损失、Sigmoid交叉时损失、Triplet Loss、Moon Loss、Contrastive Loss等。
学习率
学习率其实就是误差下降(梯度下降)时,函数旋转的角度,它控制每次更新参数的幅度,过高和过低的学习率都可能对模型结果带来不良影响,合适的学习率可以加快模型的训练速度。过高的话,可能会使得模型的训练忽略了细节,从而不能达到误差的最小值,过低的话,会使得整个训练的过程变得异常慢。
过拟合
这个概念过拟合是指模型在训练集上预测效果好,但在测试集上预测效果差。而欠拟合则是训练集和效果差,但泛化能力不错。
常用的防止过拟合的方法有:
- 参数范数惩罚
- 数据增强
- 提前终止
- Bagging等集成方法
- Dropout
- 批正则化