1 问题
-
探索不同的优化器对分类精度的影响。
-
探索不同的损失函数对分类精度的影响。
-
探索不同的batch_size对分类精度的影响。
2 方法
-
1)标准梯度下降法(GD) 假设要学习训练的模型参数为时刻的模型参数从表达式来看,模型参数的更新调整,与代价函数关于模型参数的梯度有关,即沿着梯度的方向不断减小模型参数,从而最小化代价函数基本策略可以理解为"在有限视距内寻找最快路径下山",因此每走一步,参考当前位置最陡的方向(即梯度)进而迈出下一步。缺点:训练速度慢,容易陷入局部最优解**。**
-
批量梯度下降法(BGD) 假设批量训练样本总数为时刻的模型参数。从表达式来看,模型参数的调整更新与全部输入样本的代价函数的和(即批量/全局误差)有关。即每次权值调整发生在批量样本输入之后,而不是每输入一个样本就更新一次模型参数。这样就会大大加快训练速度。基本策略可以理解为,在下山之前掌握了附近的地势情况,选择总体平均梯度最小的方向下山。
-
随机梯度下降法(SGD) 对比批量梯度下降法,假设从一批训练样本,这里虽然引入了随机性和噪声,但期望仍然等于正确的梯度下降。基本策略可以理解为随机梯度下降像是一个盲人下山,不用每走一步计算一次梯度,但是他总能下到山底,只不过过程会显得扭扭曲曲。优点:虽然SGD需要走很多步的样子,但是对梯度的要求很低(计算梯度快)。而对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个SGD梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。缺点:SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。此外,SGD也没能单独克服局部最优解的问题.
-
-
-
回归损失。我们将使用scikit-learn库在make_regression()函数中提供的标准回归问题生成器,给定一定数量的输入变量、统计噪声及其他属性,这个函数将从一个简单回归问题中生成实例,当实值输入和输出变量被缩放到一个可感知的范围时,神经网络通常表现得更好。对于这个问题,每个输入变量和目标变量都具有高斯分布;因此,在这种情况下,标准化数据是可取的,我们可以使用scikit-learn库中的StandardScaler transformer类来实现。在实际的问题中,我们会在训练数据集上准备scaler,并将其应用到训练和测试集上,但为了简单起见,我们会在分割为训练集和测试集之前将所有的数据一起标准化。
-
二分类损失函数。我们将研究适和二元分类预测建模问题的损失函数。我们将从scikiti -learn中的圆圈测试问题中生成示例,作为本研究的基础。圆问题涉及从二维平面上的两个同心圆中抽取的样本,其中外圆上的点属于类0,内圆上的点属于类1。统计噪声被添加到样本,以增加模糊度,使问题更具有挑战性的学习。现在我们有了一个问题和模型的基础,我们可以看看评估三个常见的损失函数是适合二分类预测建模问题。虽然在这些例子中使用了一个MLP,但是在训练CNN和RNN模型进行二值分类时可以使用相同的损失函数。
3)多类分类损失函数。多类分类是指将实例分配到两个以上类中的一个的预测建模问题。该问题通常被定义为预测一个整数值,其中每个类被分配一个从0到 (num_classes−1)的唯一整数值,该问题通常被实现为预测实例属于每个已知类的概率。我们将研究损失函数是适合于多类分类预测建模问题。我们将使用blobs问题作为研究的基础。scikit-learn提供的make_blobs()函数提供了一种方法,给定类和输入特征的数量,生成实例。我们可以看看评估三个常见的损失函数是适合一个多类分类预测建模问题。虽然在这些例子中使用了一个MLP,但是在训练CNN和RNN模型进行多类分类时可以使用相同的损失函数。
-
-
batch_size取值32训练和取64和128训练,train vall 的loss下降趋势32>64>128>256,最终结果也是32>64>128>256差不多,train vall 的acc,的最终结果32=64>128>256,其中64的trainacc最先大于vallacc,可能是实验偶然的结果,对于只有十个的分类,可以将batch调到32附近,这样可以提高精度,降低训练时长。
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| import torch from torch import nn ''' 卷积神经网络 Convolutional Neural Network (CNN) ''' conv = nn.Conv2d( in_channels= 3, # 输入通道数 # 每一个卷积核扫描都得到一张特征图 # 那么64个卷积核扫描就相应得到64张特征图 # 因此输出通道数为64 out_channels= 64, # 当前卷积层使用的卷积核的数量 kernel_size= 3, # 卷积核的大小 3x3 stride=1, # 步长, 规定了卷积核每次扫描移动的步数,默认值为1 # padding默认值为0 padding=1,# 使用填充获得与输入特征图相同的尺寸, 3x3使用padding=1,5x5使用padding=2 ) conv1 = nn.Conv2d( in_channels=3, out_channels=16, kernel_size=3, stride=2, ) ''' 使用padding是为了获得与输入特征图相同的H和W 例如: [C, H, W] -> [C', H, W] 使用stride是为了降低特征图的H和W 例如: [C, H, W] -> [C', H', W'] 一般情况下H' = 1/2 * H, W' = 1/2 * W ''' if name == 'main': # 构造输入层数据 x = torch.rand(size=(3, 5, 5)) # [3, 5, 5] -> [64, 5, 5] out = conv(x) print(out.shape) # [3, 5, 5] -> [16, 2, 2] out = conv1(x) print(out.shape) |
3 结语
针对问题一, 对不同优化器进行熟悉,在模型设计实验过程中,要快速验证新模型的效果,可以先用Adam进行快速实验优化;在模型上线或者结果发布前,可以用精调的SGD进行模型的极致优化。先用小数据集进行实验。随机梯度下降算法的收敛速度和数据集的大小的关系不大。因此可以先用一个具有代表性的小数据集进行实验,测试一下最好的优化算法,并通过参数搜索来寻找最优的训练参数。
针对问题二,对于损失函数,其本质便是给出一个能较全面合理的描述两个特征或集合之间的相似性度量或距离度量,针对某些特定的情况,如类别不平衡等,给予适当的惩罚因子进行权重的加减。大多数的损失都是基于最原始的损失一步步改进的,或提出更一般的形式,或提出更加具体实例化的形式。
针对问题三,我们通过实验证明了我们设置的batch_size并不是越大越好,也不是越小越好,做这样的验证,而是其中有一些值会趋近很好,这样我们就需要通过大量的实验来证明,在实验的过程中,我们使用的程序就需要执行很久,这也是需要占用我们时间资源。