登 录
注 册
< 人工智能
深度学习
机器学习
大模型
深度学习介绍
现状和未来
数学基础
通用工作流程
Keras简介
过拟合与欠拟合
卷积神经网络
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
深度学习
>>
通用工作流程
通用工作流程
2020-07-04 15:58:05 星期六 阅读:4119
####1、定义问题、收集数据集 首先,你必须定义所面对的问题。 - 你的输入数据是什么?你要预测什么?只有拥有可用的训练数据,你才能学习预测某件事情。比如,只有同时拥有电影评论和情感标注,你才能学习对电影评论进行情感分类。因此,数据可用性通常是这一阶段的限制因素(除非你有办法付钱让人帮你收集数据)。 - 你面对的是什么类型的问题? - - **二分类问题? 多分类问题? 标量回归问题? 向量回归问题? 多分类多标签问题? 其他问题?(聚类、生成或者强化学)** 确定问题有助于你选择模型架构、损失函数等。只有明确了输入、输出以及所使用的数据,你才能进入下一阶段。注意你在这一阶段所做的假设。 - 假设输出是可以根据输入进行预测的 假设可用数据包含足够多的信息,足以学习输入和输出之间的关系 在开发出工作模型之前,这些只是假设,等待验证真假。并非所有问题都可以解决。你收集了包含输入 X 和目标 Y 的很多样例,并不意味着 X 包含足够多的信息来预测 Y。例如,如果 你想根据某支股票最近的历史价格来预测其股价走势,那你成功的可能性不大,因为历史价格 并没有包含很多可用于预测的信息。 有一类无法解决的问题你应该知道,那就是非平稳问题(nonstationary problem)。假设你想 要构建一个服装推荐引擎,并在一个月(八月)的数据上训练,然后在冬天开始生成推荐结果。一个大问题是,人们购买服装的种类是随着季节变化的,即服装购买在几个月的尺度上是一个 非平稳现象。你想要建模的对象随着时间推移而改变。在这种情况下,`正确的做法是不断地利用最新数据重新训练模型,或者在一个问题是平稳的时间尺度上收集数据`。对于服装购买这种周期性问题,几年的数据足以捕捉到季节性变化,但一定要记住,要将一年中的时间作为模型的一个输入。 请记住,机器学习只能用来记忆训练数据中存在的模式。你只能识别出曾经见过的东西。 在过去的数据上训练机器学习来预测未来,这里存在一个假设,就是未来的规律与过去相同。 但事实往往并非如此。 ####2、选择衡量成功的指标 要控制一件事物,就需要能够观察它。要取得成功,就必须给出成功的定义:精度?准确率(precision)和召回率(recall)?客户保留率?衡量成功的指标将指引你选择损失函数,即 模型要优化什么。它应该直接与你的目标(如业务成功)保持一致。 对于平衡分类问题(每个类别的可能性相同),精度和接收者操作特征曲线下面积(area under the receiver operating characteristic curve,ROC AUC)是常用的指标。对于类别不平衡的问题,你可以使用准确率和召回率。对于排序问题或多标签分类,你可以使用平均准确率均值(mean average precision)。自定义衡量成功的指标也很常见。要想了解各种机器学习的成功衡量指标以及这些指标与不同问题域的关系,你可以浏览 Kaggle 网站上的数据科学竞赛,上面展示 了各种各样的问题和评估指标。 ####3、确定评估方法 一旦明确了目标,你必须确定如何衡量当前的进展,前面介绍了三种常见的评估方法。 `留出验证集`:数据量很大时可以采用这种方法; `K折交叉验证`:如果留出验证的样本量太少,无法保证可靠性,那么应该选择这种方法; `重复的K折验证`:如果可用的数据很少,同时模型评估又需要非常准确,那么应该使用这种方法; 只需选择三者之一,大多数情况下,第一种方法足以满足要求。 ####4、准备数据 一旦知道了要训练什么、要优化什么以及评估方法,那么你就几乎已经准备好训练模型了。 但首先你应该将数据格式化,使其可以输入到机器学习模型中(这里假设模型为深度神经网络)。 - 如前所述,应该将数据格式化为张量。 这些张量的取值通常应该缩放为较小的值,比如在 [-1, 1] 区间或 [0, 1] 区间。 如果不同的特征具有不同的取值范围(异质数据),那么应该做数据标准化。 你可能需要做特征工程,尤其是对于小数据问题。 准备好输入数据和目标数据的张量后,你就可以开始训练模型了。 ####5、开发比基准更好的模型 这一阶段的目标是获得统计功效(statistical power),即开发一个小型模型,它能够打败纯随机的基准(dumb baseline)。在 MNIST 数字分类的例子中,任何精度大于 0.1 的模型都可以说 具有统计功效;在 IMDB 的例子中,任何精度大于 0.5 的模型都可以说具有统计功效。 注意,不一定总是能获得统计功效。如果你尝试了多种合理架构之后仍然无法打败随机基准, 那么原因可能是问题的答案并不在输入数据中。要记住你所做的两个假设。 - 假设输出是可以根据输入进行预测的。 假设可用的数据包含足够多的信息,足以学习输入和输出之间的关系。 这些假设很可能是错误的,这样的话你需要从头重新开始。 如果一切顺利,你还需要选择三个关键参数来构建第一个工作模型。 - `最后一层的激活函数`:它对网络的输出进行有效的限制,例如IMDB分类的例子在最后一层使用了sigmoid,回归的例子里在最后一层没有使用激活函数。等待 `损失函数`:它应该匹配你要解决的问题的类型。例如,IMDB的例子使用binary_crossentropy、回归的例子使用mse等等。 `优化配置`:你要使用哪种优化器?学习率是多少?大多数情况下,使用rmsprop及其默认的机器学习率(梯度下降每次的移动范围)是稳妥的 关于损失函数的选择,需要注意,直接优化衡量问题成功的指标不一定总是可行的。有时 难以将指标转化为损失函数,要知道,损失函数需要在只有小批量数据时即可计算(理想情况 下,只有一个数据点时,损失函数应该也是可计算的),而且还必须是可微的(否则无法用反向 传播来训练网络)。例如,广泛使用的分类指标 ROC AUC 就不能被直接优化。因此在分类任务 3 中,常见的做法是优化 ROC AUC 的替代指标,比如交叉熵。一般来说,你可以认为交叉熵越小, ROC AUC 越大。 ####6、扩大模型规模:开发过拟合的模型 一旦得到了具有统计功效的模型,问题就变成了:模型是否足够强大?它是否具有足够多 的层和参数来对问题进行建模?例如,只有单个隐藏层且只有两个单元的网络,在 MNIST 问题 上具有统计功效,但并不足以很好地解决问题。请记住,`机器学习中无处不在的对立是优化和泛化的对立,理想的模型是刚好在欠拟合和过拟合的界线上,以及在容量不足和容量过大的界线上`。为了找到这条界线,你必须穿越它。 要搞清楚你需要多大的模型,就必须开发一个过拟合的模型,这很简单。 - 添加更多的层 让每一层的容量变得很大 训练更多的轮次 要始终监控训练损失和验证损失,以及你所关心的指标的训练值和验证值。如果你发现模型在验证数据上的性能开始下降,那么就出现了过拟合。 下一阶段将开始正则化和调节模型,以便尽可能地接近理想模型 ,既不过拟合也不欠拟合。 ####7、模型正则化和调节超参数 这一步是最费时间的:你将不断地调节模型、训练、在验证数据上评估(这里不是测试数据)、 再次调节模型,然后重复这一过程,直到模型达到最佳性能。你应该尝试以下几项。 - 添加 dropout。 尝试不同的架构:增加或减少层数。 添加 L1 和 / 或 L2 正则化。 尝试不同的超参数(比如每层的单元个数或优化器的学习率),以找到最佳配置。 (可选)反复做特征工程:添加新特征或删除没有信息量的特征。 请注意:每次使用验证过程的反馈来调节模型,都会将有关验证过程的信息泄露到模型中。 如果只重复几次,那么无关紧要;但如果系统性地迭代许多次,最终会导致模型对验证过程过 拟合(即使模型并没有直接在验证数据上训练)。这会降低验证过程的可靠性。 一旦开发出令人满意的模型配置,你就可以在所有可用数据(训练数据 + 验证数据)上训练最终的生产模型,然后在测试集上最后评估一次。如果测试集上的性能比验证集上差很多, 那么这可能意味着你的验证流程不可靠,或者你在调节模型参数时在验证数据上出现了过拟合。 在这种情况下,你可能需要换用更加可靠的评估方法,比如重复的 K 折验证。