如何定义一个AI问题
AI问题定义方法
提出AI/ML问题的更好方式

作为一名拥有超过25年软件工程经验的人,我回答过很多刚开始接触人工智能(AI)和机器学习(ML)的软件开发者的问题,所以我想分享一些关于在聊天论坛(如Slack和Discord)上发布AI/ML问题的贴士。
背景
一些用户常有一个误解,认为他们可以只是“发布”问题。然而,聊天论坛与在线论坛(如stackoverflow)在原则上是不同的。聊天论坛往往更加一对一,因此回答一个问题需要更多的时间和精力。因此,最好在一开始就花点时间来正确描述问题,特别是在发送直接消息(DM)时。否则,很可能会得到错误的答案(这是相当常见的)。
注意给予你建议的用户的背景和经验。许多Discord用户是高中和本科学生,没有AI/ML或软件工程经验。我在我的个人资料中列出了我的资历(完全透明)。
解决AI/ML问题的第一步是能够详细地描述和理解问题。
概述
以下是我关于描述AI/ML问题的一些建议[1]:
- 给出一些关于你的背景和经验的描述。
- 描述问题,包括ML问题的类别。
- 详细描述数据集,并愿意分享你的数据集。
- 描述你已经完成的任何数据准备和特征工程步骤。
- 描述你尝试过的任何模型。
- 文本和表格优于绘图和图表。
- 避免请求用户帮助调试你的代码。
由于一些用户使用移动设备访问Discord,最好通过GitHub Gist、Pastebin等方式分享你的问题描述和/或代码片段,并在论坛上分享链接。
最好通过DM分享文件或创建一个线程,这样其他用户就不必在频道中搜索你的文件和帖子。请记住,Discord频道的内容是非结构化的,因此很难在频道中搜索找到你的原始帖子。
如果有人自愿帮助你,如果你给他们发送DM,复制/粘贴你的原始帖子可能会有帮助。
如果你遇到编码问题,最好分享代码/算法源代码的链接,并说你在实现上遇到了问题,而不是发布代码片段并询问“我的代码有什么问题?”
详情
在你的论坛帖子中,你应该简要提供以下信息(每个项目1-2句):
1. 给出一些关于你的背景和经验的描述。
最好让用户事先知道你是在高中、大学、研究生院、研究员、有经验的专业人士等。
许多Discord用户没有意识到很多问题需要花费大量时间进行研究才能给出答案。因此,公平起见,你应该简要描述一下你的背景。
我在帮助初学者(对我来说是未知的)解决错误问题和使用错误算法时,学到了这个教训。
2. 描述问题。
简要描述问题,包括如果已知的ML问题类型(数值:分类,回归;图像:目标分类,目标检测,目标识别;文本:情感分析,主题建模,文本生成等)。
这一步可能包括文献综述。然而,如果你能找到一些解决相同问题的文章,那么现在就可以使用。
问题制定的一部分是决定你是否处理有监督学习、无监督学习、强化学习等[1]。
模型的目标是什么?分类、预测、检测、翻译等。
项目的目标是什么?研究、工程、商业应用、爱好等。
3. 详细描述数据集,并愿意共享您的数据集。
描述数据集,包括输入特征和目标特征。
最好分享数据的摘要统计信息,包括任何离散或分类特征的计数,包括目标特征。
最好共享整个数据集(如果您希望有人帮助您,则必须开放和诚实)。
如果由于某种原因您无法共享数据集,则需要明确说明原因以及为什么无法共享数据集。
请注意,Discord用户非常愿意捐赠时间提供免费咨询建议,但试图提出含糊问题以获取有偿项目的免费建议是不道德的。如果是这种情况,您应该坚持重复地明确这一事实(不要指望其他Discord用户去挖掘您的原始帖子)。
4. 描述您所做的任何数据准备和特征工程步骤。
数据准备和清理的步骤和技术因数据集而异。
最常见的步骤包括:修复结构错误、处理缺失或重复数据以及筛选异常值。
特征工程可以用于帮助算法并改善模型性能,包括创建新特征、合并稀疏类别、删除未使用的特征和添加虚拟变量。
如果所有变量都使用归一化或标准化技术缩放到相同范围,一些机器学习算法的表现会更好。
5. 描述您尝试过的模型(您应该至少尝试过一个模型)。
在进行数据准备和特征工程之后,第一步应该是评估几个基准模型,以便稍后进行比较。您选择的最终模型应该在您的数据集上表现优于基准模型。
6. 偏好文本和表格而不是图表。
最好不要在一个图上绘制多个指标,因为诸如matplotlib之类的库会自动调整坐标轴以更好地显示值的差异(有关示例,请参见如何诊断过拟合和欠拟合)。
以下是图表的一些常见问题:
- 表格用于比较模型并共享摘要统计信息。
- 图表可用于可视化模型结果,但不应用于评估和比较算法结果。
- 在移动设备上查看图表和图形很困难(许多用户使用移动设备访问Discord)。
- 图表可以具有误导性,无论是有意还是无意的(请参见关于如何用统计数据撒谎的教训)。
- 许多库(如Matplotlib)会在可能的情况下自动重新调整坐标轴以显示值的差异,这有利有弊。
最佳实践(也是大多数ML工具使用的方法)是计算多个性能指标(请参见机器学习错误指标),而不是绘制图表。
在ML中常用的唯一图表是绘制训练/验证损失的图表,以检查模型训练过程的收敛性。表格通常用于比较模型和共享摘要统计信息。如果决定将结果呈现为图表,最好包括性能指标的实际值表格。
由于AI/ML模型具有动态/随机的特性,每次训练和拟合模型时都会得到稍微不同的结果。因此,您应该运行整个过程(训练和拟合模型,然后通过计算性能指标评估模型)多次(比如10次)。最后,计算指标值的平均值。计算指标的均值、中位数和标准差也可能有所帮助。
这里有一些J. Brownlee撰写的文章,展示了一些展示机器学习结果的方法:
使用Keras进行多变量时间序列预测
如何开发用于空气污染的多变量多步时间序列预测模型
7. 避免要求用户帮助调试代码。
一般来说,问题通常不在算法的实现上,而是在数据准备和特征工程方面。
如果你发现自己陷入了代码调试中,那么这应该是一个警示信号,说明你需要重构代码,或者更可能的是选择一个更简单的模型(奥卡姆剃刀原则)。
参考资料
[1] S. Russell和P. Norvig,《人工智能:一种现代方法》,第4版。Upper Saddle River,NJ:Prentice Hall,ISBN:978–0–13–604259–4,2021年(主要是第19.9节)。
[2] E. Alpaydin,《机器学习导论》,第3版,MIT Press,ISBN:978–0262028189,2014年(主要是第19章)。