推理采用INT8;训练采用fp32;
人工智能知识构建之路
- 简易版:直接按需取
0. 内部资料
1. 数学基础
2. 机器学习
3. 人工智能
调参经验
数据方面
1. 数据清洗
- 缺失值、
- 噪声数据、
- 数据可视化、
- 数据增强、
2. 数据标准化
标准化(除以255), 让像素值处于0-1之间,这样loss才会处于0-1之间;构建zero-center
数据,加快收敛。
至于为什么要标准化:原因可以看看PCA:
模型方面
- 权重初始化
- 正则化
- 损失函数和优化方法
Q&A
Q1:网络的层数由什么决定的?
模型确实是依据网络数据决定的、
越多的parameters可以让网络有更强的表达能力,但会让网络的训练更慢,代价变大。
比如: Resnet 152
先说层数,看数据来决定,最简单是一个输入输出层,就好比线性模型。
当然也不能一直堆积网络层数,应该从结构上考虑,比较成功的例子是:Unet(语义分割模型,医学上用的多些)。
只要机器扛得住,合理范围内网络层数越多越好,但是每层节点的个数就不能越多越好了
另外一点,网络层数的深可以形成:直接从在任意两层中传递,梯度可以更容易实现跨层传递
结论:个人觉得:网络层数达到一定深度10-30(依据数据的类型),然后增加”任意两层中传递梯度的几率“, 这句话的意思可以参考Restnet和Unet。
Q2: 层数的确定
fangfaGorman指出隐层结点数s与模式数N的关系是:s=log2N;
Kolmogorov定理表明,隐层结点数s=2n+1(n为输入层结点数);
s=sqrt(0.43mn+0.12nn+2.54m+0.77n+0.35)+0.51
(m是输入层的个数,n是输出层的个数)。
Q3: 为什么要有多个隐含层?
MIT deep learning的书籍,中间有一部分解释的也很清楚,就是为了让线性不可分的数据变得线性可分
Q4: 批训练的原因以及批size为1的意义?
Batch_size 的基本理解(这部分说的挺明确了):
批训练可以一定程度减少单个样本的多样性对训练的影响,也就是用“数据集确定的方向” 代表样本总体,物理层面有点像RAID卡的原理。
两个极端就是: 1 <= batch_size <= sample_num;
batch =1 就是SGD随机梯度下降。
-
batch的size规则
设置的不能太大也不能太小,因此实际工程中最常用的就是mini-batch,一般size设置为几十或者几百 -
GPU对2的幂次的batch
可以发挥更佳的性能,因此设置成16、32、64、128…时往往要比设置为整10、整100的倍数时表现更优" batch太大容易错事最有点,太小的话又会出现在局部最小点附近剃度下降特别慢,所以很多架构都有一个decay参数,在前期使用大的batch。
-
Batch size设置以喂饱你的硬件为主要标准。只要显卡塞得下,首先挑大的。
-
当感觉训练时噪音不够时,比如收敛碰到鞍点或者局部最小值时,调小batch size。(很少会碰到)
-
当感觉训练时噪音太大时,调大batch size到喂饱硬件(因为2很少碰到,这也很少做),再不行就调小learning rate,也可以直接调小learning rate。
-
对于这样的数:16,32,64…… cpu不太喜欢;
gpu恰恰相反,gpu 上最好都是 32 倍数,可见cuda gpu的文档。 -
batch size越大每次迭代的梯度越接近样本的真实梯度。
小的batch size能有效避免样本中的冗余信息; 大的batch能更充分利用GPU。
Q5: 模型效果这么差的原因可能有
1、模型实现中的bug:比如标签错误的问题。
2、超参数选择不合适:模型对超参数很敏感,学习率太高或太低都不行。
3、数据模型不适配:比如你要训练一个自动驾驶图像识别的模型,用ImageNet数据集来训练就不合适。
4、数据集的构造问题:没有足够数据、分类不均衡、有噪声的标签、训练集合测试集分布不同。
Q6: 模型推荐的默认设置:
Adam优化器学习速率3e-4
激活函数选用ReLU或tanh
ReLU初始化推荐使用He normal,tanh初始化推荐使用Glorot normal
然后:
让模型更大(比如加入更多的层,每层中使用更多的单元);
减少正规化;错误分析;
选择另一种性能更好的模型架构;调节超参数;加入更多特征。
分析错误数据,哪些错了,后续将在训练集中加入此类数据以纠正偏差。
Q7: 超参数优化
常用的超参数优化方法有:手动优化、网格搜索、随机搜索、由粗到细、贝叶斯优化。
由粗到细的随机搜索可以缩小超高性能参数的范围,缺点是由一些手动的操作。
贝叶斯优化是优化超参数最有效一种无需手动干涉的方式,具体操作请参考这里