深度学习优化篇
模型要想训得好,参数优化不可少。
激活函数
一个复杂的神经网络,是有许多层的,其中最基本的单位便是神经元。一个线性神经元不断堆叠下去,永远都是线性关系。这就无法解决非线性问题,而不同的非线性映射函数的选择,就是激活函数的研究课题了。
为了解决非线性的问题,在感知机的基础上发展出了多层神经网络的概念。多层神经网络由输入层、多个中间层,以及输出层组成。
解决非线性问题的还可以使用非线性的激活函数,比如 sigmoid function。在 Logistic Regression 中,我们将一个线性函数输入到 sigmoid function 中,能够很好地解决二分类的问题,使用 Softmax 还能进一步解决多分类问题。
最常用激活函数主要有这样几种:
- sigmoid 和 tanh 激活函数。
- ReLU 激活函数
- ReLU 的一大堆变种(LReLU,PReLU,RReLU,ELU,SELU,GELU等等)
参数初始化
2006年Hinton等人在science期刊上发表了论文“Reducing the dimensionality of data with neural networks”,揭开了新的训练深层神经网络算法的序幕。
利用无监督的RBM网络来进行预训练,进行图像的降维,取得比PCA更好的结果,通常这被认为是深度学习兴起的开篇。
这么看来,是因为好的初始化方法的出现,才有了深层神经网络工程化落地的可能性。
常用初始化的方法包括:
- 随机初始化
- 标准初始化
- Xavier初始化
- He初始化
归一化方法
数据经过归一化和标准化后可以加快梯度下降的求解速度,这就是Batch Normalization等技术非常流行的原因,它使得可以使用更大的学习率更稳定地进行梯度传播,甚至增加网络的泛化能力。常见的归一化的方法有:
- Batch Normalization
- Layer Normalization
- Instance Normalization
- Group Normalization
- Weight Normalization
池化
- 平均池化
- 最大池化
- 随机池化
- 从数据中学习池化
正则化方法
- L1/L2参数惩罚
- Dropout与Drop Connect
- 提前终止准则
- 样本扩充
最优化方法
- SGD 梯度下降法
- Momentum 动量法
- Nesterov 加速梯度下降法
- Adagrad 算法
- Adadelta/Rmsprop算法
- Adam/Nadam/AdaMax算法
- AMSgrad
- Adafoctor
- 牛顿法/拟牛顿法
- 共轭梯度法