2017-05-27 17:17:31 lx530467 阅读数 5470


什么是深度学习

深度学习是机器学习中的一个分支,是当今AI领域最热门最前沿的研究内容。它考虑的是用non-linear multiple processing layers来学习数据的multiple levels features的抽象表征用反向传播BP算法对计算模型训练,通过supervisedweakly supervised的特征学习和分层特征提取代替手工获取特征。

深度学习的应用

深度学习由于其不需要人工提取特征,只需要大量labelled data进行训练,从而在image, video, speech, text, audio等领域大放异彩。应用包含定位、识别、匹配、语音转文本、电商中的商品推荐等。当然还有GoogleAlphaGo

深度学习的框架

现在深度学习的框架已经有很多,如深度神经网络DNN、卷积神经网络CNN、深度置信网络DBN、递归神经网络RNN和生成对抗网络GAN等。其中以CNNGAN受关注度最高,前者不但可以通过得到候选区域来实现定位,而且可以通过减少参数加快训练速度;后者则是可以通过输入label得到输出数据(如image),从某种意义上相当于其它常用深度学习框架的逆过程。

CNN

卷积神经网络(Convolutional Neural Network)是目前应用最广泛的深度学习框架,其经典网络模型包括LeNet, AlexNet [1], GoogleNet [2], VGG [3], ResNet [4]
下面的四张图就可以清楚的描述CNN的结构:(取自[5]
这里写图片描述

这里写图片描述
Convolution中,可以看到一个batchNfeature maps输入,每张feature mapssize是宽为W、高为H、通道数为C。对于每一个batch的数据,使用的都是相同的共MC通道的卷积核filtersfilter sizeR x S。将每一组对应通道的filterfeature map卷积并相加得到E x F的一个通道的输出feature mapMfilters就可以得到一个M通道的feature mapsN张输入就可以得到NM通道的输出。卷积细节还有边缘补零padding, 步长stride等
这里写图片描述

这里写图片描述
BP算法需要与最优化optimize算法结合使用才能根据error对网络中的parameters进行update,目前效果比较好的最优化算法有Adagrad [6], AdagradDA [6] , Adadelta [7]Adam [8]


[1]: Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]. Advances in neural information processing systems. 2012: 1097-1105.
[2]: Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C]. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 1-9.
[3]: Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition[J]. arXiv preprint arXiv:1409.1556, 2014.
[4]: He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 770-778.
[5]: Sze V, Chen Y H, Yang T J, et al. Efficient processing of deep neural networks: A tutorial and survey[J]. arXiv preprint arXiv:1703.09039, 2017.
[6]: Duchi J, Hazan E, Singer Y. Adaptive subgradient methods for online learning and stochastic optimization[J]. Journal of Machine Learning Research, 2011, 12(Jul): 2121-2159.
[7]: Zeiler M D. ADADELTA: an adaptive learning rate method[J]. arXiv preprint arXiv:1212.5701, 2012.
[8]: Kingma D, Ba J. Adam: A method for stochastic optimization[J]. arXiv preprint arXiv:1412.6980, 2014.

2018-02-02 19:02:31 Quincuntial 阅读数 5035

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

工作中训练了很多的深度学习模型,目前到了上升到方法论的角度来看了。日常工作中有的人可能已经在遵循方法论做事,可能自己没有注意,有的人可能没有遵循方法论在做事,虽然可能最后的结果差不多,但花费的时间和精力应该会差别很大,当然这是我自己的感受。我们不必完全按照方法论来做,但基本流程跟方法论应该一致。

下面的具体步骤以图像分类,识别图像中的猫为例。

1. 问题定义

问题定义,“what,how,why”中的what,首先要弄清楚自己要干什么,然后调研相关的技术,确定解决方案。例如这一步中我的工作是进行图像分类,问题定义是图像分类——识别猫,相关的技术包括各种分类模型,各种深度学习框架。我选择的是BN-Inception + Caffe。

2. 确定评估标准

根据问题定义,确定了相关技术之后,不要着急动手去做,先确定评估标准,怎么评价模型的好坏,例如分类猫可以通过准确率(Precision)、召回率(Recall)、F1、ROC曲线、AUC面积等。确定了评估标准之后,评估数据集也要准备好。

3. 确定Baseline和Target

  • Baseline

有了评估标准后,需要确定一个Baseline,例如可以简单快速的训练一个模型或已经有一个Pretrained Model,在评估数据集上进行评估,得到一个指标作为Baseline,然后在Baseline的基础上进行提高,确定Baseline类似于敏捷开发中的快速原型开发。

  • Target

有了Baseline之后,可以确定一个目标,但这个目标不能是拍脑袋出来的,如果你的业务与别人的业务类似,例如色情识别,可以使用大厂(BAT)的模型先在评估数据集上得出一个结果,目标定为达到他们的水平或超过他们的水平。如果不跟别人的业务类似,那么需要根据具体的业务需求确定一个目标。目标还是要有的,起码确定一个方向。

4. 模型训练

模型训练这部分就没太多说的了,深度学习工程师的基本功。

5. 模型评估

将训练的模型在评估数据集上进行评估,分析评估结果,与上一次的模型结果以及Target进行对比。将错误的数据取出来,分析存在的问题,讨论调整的方向,记录实验结果。

6. 模型再训练

重复步骤4、5,直至达到目标。如果模型还不错,可以将模型放到Beta环境测试,分析线上的结果,重复步骤4、5。

7. 服务部署

如果模型在Beta环境也不错,则可以进行线上测试,继续重复步骤4、5,因为有的模型需要不断的进行迭代更新。

参考资料

https://towardsdatascience.com/machine-learning-in-practice-what-are-the-steps-a4b15ee18546

2019-02-18 14:41:55 LLyj_ 阅读数 928

深度学习——训练时碰到的超参数

一、前言​

在训练深度神经网络时,会碰到一些超参数,通过观察在训练过程中的监测指标如损失loss和准确率来判断当前模型处于什么样的训练状态,及时调整超参数以更科学地训练模型能够提高资源利用率。

总而言之,这里对深度学习中比较重要的或者常见的超参数做一个整理,我们可以根据实际情况修改超参数已达到最好的训练效果。

二、一些常见的超参数

  1. 学习率(Learning rate)

    学习率是控制模型的学习进度。从梯度下降算法的角度来说,通过选择合适的学习率,可以使梯度下降法得到更好的性能。学习率,即参数到达最优值过程的速度快慢。

    举个栗子:

    假如你从山峰的最高点根据梯度下降法寻找最优值,当你学习率过大,即下降的快,步子大,那么你很可能会在某一步跨过最优值;当你学习率过小时,每次下降一厘米,这将走到何年何月呀,用术语来说就是,长时间无法收敛。因此,学习率直接决定着学习算法的性能表现。

    学习率的设置:

    学习率 大 学习率 小
    学习速度
    使用时间点 刚开始训练时 一定轮数过后
    副作用 1.易损失值爆炸;2.易振荡。 1.易过拟合;2.收敛速度慢。

    在训练过程中,一般根据训练轮数设置动态变化的学习率。

    • 刚开始训练时:学习率以 0.01 ~ 0.001 为宜。
    • 一定轮数过后:逐渐减缓。
    • 接近训练结束:学习速率的衰减应该在100倍以上。

    理想情况下曲线应该是滑梯式下降 [红线]

    1. 曲线 初始时上扬 [黄线]
      Solution:初始学习率过大导致振荡,应减小学习率,并从头开始训练 。
    2. 曲线初始时强势下降没多久归水平 [绿线]
      Solution:后期学习率过大导致无法拟合,应减小学习率,并重新训练后几轮 。
    3. 曲线全程缓慢 [蓝线]
      Solution:初始学习率过小 导致 收敛慢,应增大学习率,并从头 开始训练 。
  2. 迭代次数(iteration)

    迭代是重复反馈的动作,神经网络中我们希望通过迭代进行多次的训练以达到所需的目标或结果。每一次迭代得到的结果都会被作为下一次迭代的初始值。 一次迭代=一个正向传播+一个反向传播。每一次迭代得到的结果都会被作为下一次迭代的初始值。 我们可以查看loss曲线,来判断迭代次数够不够,如果loss从曲线上看已经收敛了,那么说明训练差不多了,再增加迭代也没什么用了,如果迭代结束了,但loss曲线并没有收敛的趋势,那么说明迭代设置的太小了。

  3. batchsize

    批大小。在深度学习中,一般采用随机梯度下降法(SGD)训练,即每次训练在训练集中取batchsize个样本训练(不是一次就把所有数据集扔进去训练,每次只取batchsize)。相对于正常数据集,如果batchsize过小,训练数据就会非常难收敛,从而导致欠拟合;增大batchsize,相对处理速度加快,所需内存容量也会增加。因此我们需要寻找最好的batchsize。再次重申:batchsize的正确选择是为了在内存效率和内存容量之间寻找最佳平衡,batchsize过大可能会导致内存不够用或程序内核崩溃。1次iteration等于使用batchsize个样本训练一次;batchsize通常取值为[16,32,64,128,256], 网络较小时选用256,较大时选用64。

  4. epoch

    通俗的讲epoch的值就是整个数据集被轮了几次。一个epoch=所有训练样本的一个正向传播和一个反向传播,也就是等于使用训练集中的全部样本训练一次。在神经网络中传递完整的数据集一次是不够的,所以我们需要将完整的数据集在同样的神经网络中传递多次。

三、例子

假设训练集有1000个样本,batchsize=10,那么训练完整个样本集需要:100次iteration,1次epoch。

名词 定义
epoch 使用训练集的全部数据对模型进行一次完整的训练,被称之为"一代训练"
batch 每次训练使用数据集的一小部分(batchsize)对模型进行一次的训练,被称之为"一批训练"
iteration s使用一个batchsize大小的数据对模型进行一次参数更新的过程,被称之为"一次训练"

四、References

2018-11-30 19:20:02 P_LarT 阅读数 401

训练数据

https://www.yuque.com/lart/ml-newer/

版本号
作者
时间
改动内容
0.1
Lart
2018年10月17日
创建文档
0.2
Lart
2018年10月18日10:41:53
补充关于模型保存的问题/调整部分结构

在最初始的学习训练中,多使用预训练好的模型.在其基础上进行微调(FineTune).

优化器选择

https://keras.io/zh/optimizers/

SGD

keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

随机梯度下降优化器

包含扩展功能的支持:

  • 动量(momentum)优化,
  • 学习率衰减(每次参数更新后)
  • Nestrov动量(NAG)优化

RMSprop

keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)

RMSProp优化器.

建议使用优化器的默认参数 (除了学习率lr,它可以被自由调节)

这个优化器通常是训练循环神经网络RNN的不错选择。

Adam

keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

Adam优化器.

实际建议 在实际操作中,我们推荐Adam作为默认的算法,一般而言跑起来比RMSProp要好一点。但是也可以试试SGD+Nesterov动量

完整的Adam更新算法也包含了一个偏置(bias)矫正机制,因为m,v两个矩阵初始为0,在没有完全热身之前存在偏差,需要采取一些补偿措施。


补充

训练一个神经网络需要:

  • 利用小批量数据对实现进行 梯度检查,还要注意各种错误。
  • 进行 合理性检查,确认初始损失值是合理的,在小数据集上能得到100%的准确率。
  • 在训练时,跟踪损失函数值,训练集和验证集准确率,如果愿意,还可以 跟踪更新的参数量相对于总参数量的比例(一般在1e-3左右),然后如果是对于卷积神经网络,可以将第一层的 权重可视化
  • 推荐的两个 更新方法 是SGD+Nesterov动量方法,或者Adam方法。
  • 随着训练进行 学习率衰减。比如,在固定多少个周期后让学习率减半,或者当验证集准确率下降的时候。
  • 使用 随机搜索 (不要用网格搜索)来搜索最优的超参数。分阶段从粗(比较宽的超参数范围训练1-5个周期)到细(窄范围训练很多个周期)地来搜索。
  • 进行 模型集成 来获得额外的性能提高。

回调函数选择

https://keras.io/zh/callbacks/

回调函数是一个函数的合集,会在训练的阶段中所使用。你可以使用回调函数来查看训练模型的内在状态和统计。你可以传递一个列表的回调函数(作为 callbacks 关键字参数)到 SequentialModel 类型的 .fit() 方法。在训练时,相应的回调函数的方法就会被在各自的阶段被调用。

模型保存-ModelCheckpoint

keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)

在每个训练期之后保存模型。

filepath 可以包括命名格式选项,可以由 epoch 的值和 logs 的键(由 on_epoch_end 参数传递)来填充。

例如:如果 filepathweights.{epoch:02d}-{val_loss:.2f}.hdf5, 那么模型被保存的的文件名就会有训练轮数和验证损失。

LearningRateScheduler

keras.callbacks.LearningRateScheduler(schedule, verbose=0)

学习速率定时器。

评估标准选择

对于任何分类问题,你都希望将其设置为 metrics = ['accuracy']。评估标准可以是现有的标准的字符串标识符,也可以是自定义的评估标准函数。

注意 回归问题可以使用mae评估

# 多分类问题
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 二分类问题
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 均方误差回归问题
# 评估标可以选择 mae
model.compile(optimizer='rmsprop',
              loss='mse')

# 自定义评估标准函数
import keras.backend as K

def mean_pred(y_true, y_pred):
    return K.mean(y_pred)

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy', mean_pred])

数据集的划分

训练集(Training Set):帮助我们训练模型,简单的说就是通过训练集的数据让我们确定拟合曲线的参数。

验证集(Validation Set):用来做模型选择(model selection),即做模型的最终优化及确定的,用来辅助我们的模型的构建,可选;

测试集(Test Set): 为了测试已经训练好的模型的精确度。当然,test set这并不能保证模型的正确性,他只是说相似的数据用此模型会得出相似的结果。因为我们在训练模型的时候,参数全是根据现有训练集里的数据进行修正、拟合,有可能会出现过拟合的情况,即这个参数仅对训练集里的数据拟合比较准确,这个时候再有一个数据需要利用模型预测结果,准确率可能就会很差。


显然越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况,我们应该选择一个更能适应一般情况的模型。我们需要使用交叉验证集来帮助选择模型。

模型选择的方法为:

  1. 使用训练集训练出多个模型
  2. 用多个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
  3. 选取代价函数值最小的模型
  4. 用步骤3中选出的模型对测试集计算得出推广误差(代价函数的值)

注意 一般而言,只有两个数据集,一个是训练集,一个是测试集,验证集可以从训练集上划分出来一部分. 但实际应用中,一般只将数据集分成两类,即训练集Training set 和测试集Test set,大多数文章并不涉及验证集Validation set。

划分比例

传统的机器学习领域中,由于收集到的数据量往往不多,比较小,所以需要将收集到的数据分为三类:训练集、验证集、测试集。若有验证集,则划为6:2:2. 这样划分确实很科学,当数据量不大的时候(万级别及以下)。
也有人分为两类,就是不需要测试集。一般将训练集和测试集划为7:3.

在大数据时代的机器学习或者深度学习领域中,如果还是按照传统的数据划分方式不是十分合理.
因为测试集和验证集用于评估模型和选择模型,所需要的数据量和传统的数据量差不多,但是由于收集到的数据远远大于传统机器学习时代的数据量,所以占的比例也就要缩小。
比如我们拥有1000000,这么多的数据,训练集:验证集:测试集=98:1:1。如果是两类,也就是相同的道理。

fit

fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)

以固定数量的轮次(数据集上的迭代)训练模型。

其中的参数 __validation_split __在 0 和 1 之间浮动。用作验证集的训练数据的比例。模型将分出一部分不会被训练的验证数据,并将在每一轮结束时评估这些验证数据的误差和任何其他模型指标。验证数据是混洗之前 xy 数据的最后一部分样本。
而参数 __validation_data 是一个__元组 (x_val,y_val) 或元组 (x_val,y_val,val_sample_weights),用来评估损失,以及在每轮结束时的任何模型度量指标。模型将不会在这个数据上进行训练。这个参数会覆盖 validation_split

实际建议

  1. 关于训练时的代码调试,可以先不要指定太大的Epoch,这样可以快速的完成一次完整的训练,使得尽快的查看一次完整的过程的结果.观察训练流程之外的代码设计是否有误.
  2. 对于使用的数据,最好在预处理后就将其保存成一个文件,比如利用 np.save()&np.load() 来使用 .npy 文件,使用numpy数组.分成不同的 .py 书写,可以减少每次调试具体内容的时间.
    若是 jupyter notebook ,则建议分开cell实现.(在实现小规模运算的时候,自身电脑可以使用它,但是稍大一点的,还是不要使用它了,容易卡死)
  3. 关于模型的训练/预测阶段可以分离,尽可能的分离功能单元.
    训练阶段保存模型,可以利用上面的 ModelCheckpoint 来实现;
    测试阶段使用模型,搭建相同的网络,使用 load_weights 即可.
  4. 在多GPU机器上跑代码测试的时候,建议指定GPU运行.Keras 默认是占满所有显存,这时候其他的进程就无法使用 GPU 资源了(即使keras 实际上用不完).
    CUDA_VISIBLE_DEVICES=0 python test.py
    

关于多GPU并行处理,还需研究.一般可以只是用单卡.若是提示显存不足,可以适当降低批次.

没有更多推荐了,返回首页