🤵♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱🏍
🙋♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
摘要: 本系列旨在普及那些深度学习路上必经的核心概念,文章内容都是博主用心学习收集所写,欢迎大家三联支持!本系列会一直更新,核心概念系列会一直更新!欢迎大家订阅
该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]
Pipeline
- 定义问题 & 收集数据
- 选择衡量指标
- 确定衡量方法
- 数据处理
- 建立具有统计功效的模型
- 开发过拟合模型
- 模型正则化与调节超参数
Kaggle: 拥有稳定而强大的管道对于在最终的私人排行榜中取得出色表现最为关键。浪费时间过度拟合以在公共排行榜中获得额外的 0.0001 是没有意义的。始终相信当地的交叉验证分数,因为训练数据量大于公共排行榜的数据量。
无论是怎么样的一个机器学习问题,都有一个通用的处理流程模板,进行 问题定义,特征工程,评估指标,评估方法,损失函数,调优模型等等,总的来说总体如下:
-
定义问题与要训练的数据。收集这些数据,有需要的话用标签来标注数据。
-
选择衡量问题成功的指标。你要在验证数据上监控哪些指标?
-
确定评估方法:留出验证? K 折验证?你应该将哪一部分数据用于验证?
-
开发第一个比基准更好的模型,即一个具有统计功效的模型。
-
开发过拟合的模型。
-
基于模型在验证数据上的性能来进行模型正则化与调节超参数。许多机器学习研究往往只关注这一步,但你一定要牢记整个工作流程。
定义问题 & 收集数据
首先面对的问题:
- 面对的问题是什么类型的?
常见的有如,回归、分类、监督还是非监督学习、强化或生成、进化?聚类,二分类还是多分类,多分类是单标签还是多标签,确定问题类型可以有助于确定损失函数和模型架构、激活函数等。
- 输入的数据是什么,形式如何,模型需要预测或分类怎么样一个输出结果?
只有可用的数据,我们才能训练我们的模型,学习某种模式,通常在这一部分,数据可用性是比较头疼的问题,比如数据是否高质量,是否充足以让模型学习。
在明确输入输出及所使用的数据中有两个假设:
-
假设输出是可以根据输入进行预测的。
-
假设可用数据包含足够多的信息,足以学习输入和输出之间的关系。
我们在面对问题也要考虑到输入数据 X 是否有足够的信息来预测 Y, 比如在股票价格预测,如果只有历史价格显然是无法实现的,因为历史价格并没有包含可以很好预测的信息。
还有比如类似非平稳的问题, 总的来说机器学习只能通过记忆训练数据所存在的模式,识别曾经遇见的东西,根据过去规律预测未来,但显然未来规律并非如此
选择衡量指标
要控制一件事物,就需要能够观察它。要取得成功,就必须给出成功的定义:精度?准确率(precision)和召回率(recall)?客户保留率?衡量成功的指标将指引你选择损失函数,即要优化什么。它应该直接与你的目标(如业务成功)保持一致。(这非常重要!!)
- 对于平衡分类问题(每个类别的可能性相同),精度和接收者操作特征曲线下面积(area under the receiver operating characteristic curve,ROC AUC)是常用的指标。
- 对于类别不平衡的问题,你可以使用准确率和召回率(全局)。
- 对于排序问题或多标签分类,你可以使用平均准确率均值(mean average precision)。
自定义衡量成功的指标也很常见。要想了解当前问题的成功衡量指标以及这些指标与问题的关系,可以浏览 Kaggle 网站上的数据科学竞赛,上面展示了各种各样的问题和评估指标。
确定衡量方法
一旦明确了目标,你必须确定如何衡量当前的进展。 [evaluation & metrics.md](evaluation & metrics.md) 介绍了常见的评估方法。大多数情况下, 留出验证集方法足以满足要求
数据处理
一旦知道了要训练什么、要优化什么以及评估方法,那么你就几乎已经准备好训练模型了。但首先你应该将数据格式化,使其可以输入到机器学习模型中(这里假设模型为深度神经网络)。
- 将数据格式化为张量(统一数据格式,用于模型的输入)
- 数据归一化 & 数据标准化:这些张量的取值通常应该缩放为较小的值,比如在 [-1, 1] 区间或 [0, 1] 区间。
‰ 如果不同的特征具有不同的取值范围(异质数据),那么应该做数据标准化。
- 特征工程:有效提取关键特征,尤其是对于小数据问题。
建立具有统计功效的模型
这一阶段的目标是获得统计功效(statistical power),即开发一个小型模型,它能够打败纯随机的基准(dumb baseline)。在 MNIST 数字分类的例子中,任何精度大于 0.1 的模型都可以说具有统计功效;在 IMDB 的例子中,任何精度大于 0.5 的模型都可以说具有统计功效。不过要注意的是,不一定总是能获得统计功效。如果你尝试了多种合理架构之后仍然无法打败随机基准,那么原因可能是问题的答案并不在输入数据中。
要记住最开始所做的两个假设。
-
假设输出是可以根据输入进行预测的。
-
假设可用的数据包含足够多的信息,足以学习输入和输出之间的关系。
此时这些假设很可能是错误的,这样的话你需要从头重新开始。
如果一切顺利,你还需要选择三个关键参数来构建第一个工作模型。
-
最后一层的激活。它对网络输出进行有效的限制。例如,IMDB 分类的例子在最后一层使用了 sigmoid,回归的例子在最后一层没有使用激活,等等。
-
损失函数。它应该匹配你要解决的问题的类型。例如,IMDB 的例子使用 binary_crossentropy、回归的例子使用 mse,等等。
-
优化配置。你要使用哪种优化器?学习率是多少?大多数情况下,使用最佳实践及其默认的学习率是稳妥的。
关于损失函数的选择,需要注意,直接优化衡量问题成功的指标不一定总是可行的。有时难以将指标转化为损失函数,要知道,损失函数需要在只有小批量数据时即可计算(理想情况下,只有一个数据点时,损失函数应该也是可计算的),而且还必须是可微的(否则无法用反向传播来训练网络)。例如,广泛使用的分类指标 ROC AUC 就不能被直接优化。因此在分类任务中,常见的做法是优化 ROC AUC 的替代指标,即 sensitity,specific,而这两个可以通过交叉熵来解决。一般来说,你可以认为交叉熵越小,ROC AUC 越大。
以下是常见问题类型的最后一层激活函数和损失函数的列表:
问题类型 | 最后一层激活函数 | 损失函数 |
---|---|---|
回归问题(Regression) | 无激活函数(线性输出) | 均方误差(Mean Squared Error) |
回归到 0~1 范围内的值 | Sigmoid激活函数 | 均方误差(Mean Squared Error)或 二元交叉熵(Binary Cross-Entropy) |
二分类问题(Binary Classification) | Sigmoid激活函数 | 二元交叉熵(Binary Cross-Entropy) |
多类分类问题(Multi-Class Classification)单标签问题 | Softmax激活函数 | 多元交叉熵(Categorical Cross-Entropy) |
多分类、多标签问题 | Sigmoid激活函数 | 二元交叉熵(Binary Cross-Entropy) |
目标检测问题(Object Detection) | 无激活函数(线性输出) | 损失函数因具体算法而异,例如交叉熵损失、平滑L1损失等 |
图像分割问题(Image Segmentation) | 无激活函数(线性输出) | 损失函数因具体算法而异,例如交叉熵损失、Dice损失等 |
生成对抗网络问题(Generative Adversarial Networks) | 无激活函数(线性输出) | 对抗性损失函数,例如生成器使用二元交叉熵,判别器使用Sigmoid交叉熵 |
强化学习问题(Reinforcement Learning) | 无激活函数(线性输出) | 因具体算法和环境而异,例如行动价值(Action Value)函数的均方误差、策略梯度等 |
请注意,以上列表仅列出了常见问题类型的典型激活函数和损失函数。在实际应用中,具体的选择可能会因问题的特点、数据分布和算法选择等因素而有所不同。
开发过拟合模型
一旦得到了具有统计功效的模型,问题就变成了:模型是否足够强大?它是否具有足够多的层和参数来对问题进行建模?
例如,只有单个隐藏层且只有两个单元的网络,在 MNIST 问题上具有统计功效,但并不足以很好地解决问题。请记住,机器学习中无处不在的对立是优化和泛化的对立,理想的模型是刚好在欠拟合和过拟合的界线上,在容量不足和容量过大的界线上。为了找到这条界线,你必须穿过它。
要搞清楚你需要多大的模型,就必须开发一个过拟合的模型,这很简单。
(1) 添加更多的层或采用更复杂的架构
(2) 让每一层变得更大。(参数更多)
(3) 训练更多的轮次。
要始终监控训练损失和验证损失,以及你所关心的指标的训练值和验证值。如果你发现模型在验证数据上的性能开始下降,那么就出现了过拟合。
模型正则化与调节超参数
这一步是最费时间的:你将不断地调节模型、训练、在验证数据上评估(这里不是测试数据)、
再次调节模型,然后重复这一过程,直到模型达到最佳性能。你应该尝试以下几项。
- 添加 dropout。
- 尝试不同的架构:增加或减少层数。
- 添加 L1 和 / 或 L2 正则化。
- 尝试不同的超参数(比如每层的单元个数或优化器的学习率),以找到最佳配置。需要搜索
- (可选)反复做特征工程:添加新特征或删除没有信息量的特征。
请注意:每次使用验证过程的反馈来调节模型,都会将有关验证过程的信息泄露到模型中。
如果只重复几次,那么无关紧要;但如果系统性地迭代许多次,最终会导致模型对验证过程过拟合(即使模型并没有直接在验证数据上训练)。这会降低验证过程的可靠性。一旦开发出令人满意的模型配置,你就可以在所有可用数据(训练数据 + 验证数据)上训练最终的生产模型,然后在测试集上最后评估一次。
如果测试集上的性能比验证集上差很多,那么这可能意味着你的验证流程不可靠,或者你在调节模型参数时在验证数据上出现了过拟合。在这种情况下,你可能需要换用更加可靠的评估方法,比如重复的 K 折验证。
🤞到这里,如果还有什么疑问🤞
🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳