1. 参数初始化
在卷积神经网络中, 可以看到神经元之间的连接是通过权重w以及偏置b实现的。并且w和b的取值会直接影响模型的训练速度以及训练精度。
1.1 权重的初始化
建议的方法:
- 很小的随机数(对于多层深度神经网络, 太小的值会导致回传的梯度非常小)
- 服从均值为0, 方差比较小
- Xavier: 服从均匀分布的随机数列
错误的方法:全部初始化为0, 全部设置为0, 在反向传播的时候是一样的梯度值, 那么这个网络的权重是没有办法差异化的,也就没有办法学习到东西。
1.2 偏置项的初始化
一般直接设置为0, 在存在ReLU激活函数的网络中, 也可以考虑设置为一个很小的数字(大于0)
1.3 常见的初始化神经网络权重的函数
import torch
import torch.nn as nn
if __name__ == '__main__':
conv2d = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=(5, 5))
print(conv2d.weight.shape)
alpha = nn.Parameter(torch.ones(3, 5))
# NOTE: alpha是必须进行初始化操作
nn.init.ones_(alpha)
nn.init.kaiming_uniform_(alpha, mode='fan_out', nonlinearity='sigmoid')
nn.init.xavier_uniform_(alpha, gain=1.0)
nn.init.uniform_(alpha, -0.3, 0.3)
print(alpha)
nn.init.kaiming_uniform_(alpha, mode='fan_out', nonlinearity='sigmoid')
"""
这个函数采用均匀分布来初始化权重,根据 Kaiming He 等人提出的初始化方法,也被
称为 He 初始化。这个方法特别适用于适用 Rectified Linear Unit (ReLU) 或类似非
线性激活函数的网络。
alpha: 这是你的权重张量,即要初始化的张量。
mode='fan_out': 这是初始化模式。'fan_out' 模式用于权重矩阵的输出部分,适用于全连
接层的权重初始化。'fan_in' 模式用于输入部分,适用于卷积层的权重初始化。
nonlinearity='sigmoid': 这是非线性激活函数的类型,用于确定初始化范围。在这里,选择
了 'sigmoid',表示使用 sigmoid 激活函数。不同的激活函数对应不同的初始化方法,因为它
们对权重的敏感性不同。
这个初始化方法旨在使权重在前向传播时既不爆炸也不消失,对于使用 ReLU 或类似的非线性激
活函数的网络来说尤其有用。使用适当的初始化可以帮助加速神经网络的训练收敛过程。
"""
nn.init.xavier_uniform_(alpha, gain=1.0)
"""
这个函数实现了 Xavier/Glorot 初始化方法,该方法适用于使用 tanh 或 sigmoid 激活函数的网络。
alpha: 这是你的权重张量,即要初始化的张量。
gain=1.0: 这是初始化的增益(gain)参数,默认值为1.0。增益是一个用于调整初始化范围的
因子,它允许你自定义权重的缩放。在 Xavier 初始化中,增益是根据激活函数的类型进行计算的。
Xavier 初始化通过考虑前一层和后一层的神经元数量,以及激活函数的导数的平方来确定初始化
的范围。具体而言,对于均匀分布,权重的初始化范围是从一个均匀分布中随机采样,其范围是下图
其中,fan_in 是输入神经元的数量,fan_out 是输出神经元的数量。这种初始化方法的目标是在
前向传播和反向传播中都保持梯度的方差大致相等,有助于避免梯度消失或梯度爆炸问题。
"""
nn.init.uniform_(alpha, -0.3, 0.3)
"""
这个函数使用均匀分布来初始化权重。
alpha: 这是你的权重张量,即要初始化的张量。
-0.3 和 0.3: 这是均匀分布的上下限。权重将在这个范围内进行均匀随机初始化。
这种初始化方法简单地在指定的范围内随机初始化权重。相比于一些其他的初始化方法,均匀分
布的初始化通常更简单,但它可能不如一些专门为深度学习任务设计的初始化方法表现得好。
在实际应用中,选择合适的初始化方法可能会对模型的训练和性能产生影响。通常情况下,使用
一些已经被证明在特定任务中有效的初始化方法,如 Xavier/Glorot 初始化或者 Kaiming/He 初
始化,可能更有利于模型的收敛和性能。但在某些场景下,均匀分布的初始化也可能是一个合理的
选择。
"""
2. 过拟合问题
2.1 为什么神经网络会产生过拟合问题?
神经网络的学习能力受神经元数目以及神经网络层次的影响, 神经元数目越大,神经网络层次越高, 那么神经网络的学习能力越强, 那么就有可能出现过拟合的问题 (通俗来讲: 神经网络的空间表达能力变得更紧丰富了)
2.2 如何解决过拟合问题?
-
Regularization:正则化, 通过降低模型的复杂度, 通过在cost函数上添加一个正则项的方式来降低overfitting, 主要有L1和L2两种方式
正则化是通过给cost函数添加正则项的方式来解决overfitting, Dropout是通过直接修改神经网络的结构来解决overfitting
-
Dropput:通过随机删除神经网络中的神经元来解决overfitting问题, 在每次迭代的时候, 只使用部分神经元训练模型获取W和d的值。分类或者回归的时候,最后一层尽量不要用Dropput。
一般情况下, 对于同一组训练数据, 利用不同的神经网络训练之后, 求其输出的平均值可以减少overfitting。 Dropout就是利用这个原理, 每次丢掉一半左右的隐藏层神经元, 相当于在不同的神经网络上进行训练, 这样就减少了神经元之间的依赖性, 即每个神经元不能依赖于某几个其它的神经元,使神经网络更加能学习到与其它神经元之间的更加健壮robust (鲁棒性) 的特征。
3. 数据增强(特征工程)
3.1 数据增强的作用是?
数据增强有助于扩大数据集规模,从而提高神经网络模型的泛化能力和性能。但需要注意的是,过度的数据增强可能会导致训练数据与真实数据分布不一致,从而影响模型的预测性能。
3.2 数据增强的方法?
- 图像翻转:水平或垂直翻转图像。
- 随机裁剪:在原始图像上随机截取一个子图像,以增加样本的多样性。
- 样本不均衡:(解决方案: 增加小众类别的图像数据)样本不均衡即有些类别图像特别多, 有些特别少。 类别不平衡数据的处理:Label shuffle
- 旋转和缩放:对图像进行随机旋转、缩放等变换来增加样本的多样性。
- 噪声添加:向图像中添加高斯噪声、椒盐噪声等来增加样本的多样性。