当前位置: 首页 > 科技观察

从开发到输出:关于机器学习的7个干货建议

时间:2023-03-12 18:07:01 科技观察

体积小,而且伴随着频繁变更的项目需求等琐事,笔者还是去了。不幸的是,我作为机器学习工程师的第一个项目并不是那么容易上手。这是一个大项目,背后有一个大客户,这意味着很多责任,但负责这个项目的只有一个小团队,其中一个团队成员是作者,一个新手。那天项目负责人安排笔者处理十二个模型,光是想想就让人不寒而栗。更糟糕的是,当我团队中的某个人被调到另一个项目时,他的工作量落在了我身上。不过笔者不是来给大家泼苦水的。虽然这个过程相当曲折,但也让笔者获得了很多意想不到的体验。我犯过的最大错误之一就是对所有数据使用一种方法只是因为它对某些特定数据最有效。也就是说,作者在立项之初只做了一个实验。找到捷径后,即使数据越来越大,作者仍然坚持使用那个方法。我认为这是当时最有效的方法。但是,作为一名机器学习工程师,不仅要搭建一个系统,还需要不断提升其性能。我花了一个月的时间才接受这个事实。我以前的主管曾经说过,机器学习工程师既是软件工程师又是研究员。研究与软件工程不同。即使系统构建成功,没有错误,研究也不会止步于此。研究是一个永无止境的过程,如果您睁大眼睛,总会有新事物可以尝试。不要在模型学习时坐以待毙“模型正在运行!让我休息一下!”随着数据越来越大,使用的方法也越来越复杂。一个完整的训练过程可以达到2到3个小时。程序运行时,作者经常以此来拖延工作,现在后悔莫及。有几个惊喜,比如在运行过程接近尾声时出现错误,分数比以前低,内存错误以及其他在接近尾声时才意识到的愚蠢错误。在模型学习期间,显然可以做很多有意义的事情。可以提前计划工作步骤。一旦一个程序开始成功运行,下一个程序就会以不同的方式进行。第一个程序运行完毕后,另一个程序就可以开始运行了。当新程序运行时,可以评估和分析先前程序的结果。因此,如果您发现任何可以在以前的模型上改进的地方,您可以立即修复它并重新运行它。这也是与主管或其他工程师讨论新方法和想法的绝佳时机。无论如何不要浪费你的时间。做出明智的选择在某些情况下,不同方法的结果差异可能并不那么明显。产生比其他方法稍好的结果的方法是否足以成为最终选择?不,应该考虑很多因素。分析的过程不仅仅是从单一的角度寻找最佳方法,分析是一个漫长的过程。例如,假设有两个垃圾邮件分类模型,F1值分别为0.95和0.96。第二个模型具有低精度和高召回率,而第一个模型具有平衡的精度和召回率。在这种情况下,第一个模型优于第二个,因为它更好地处理垃圾邮件分类。第二种模型更有可能将正常文档归类为垃圾邮件,从而将更多的非垃圾文档归类为垃圾邮件,这是非常糟糕的。其他重要的考虑因素与输出有关。在某些情况下,如果资源和时间有限,选择简单的模型会有所帮助。前提是模型的性能还是不错的,和更复杂的模型差别不大。不要混淆你的数据数据显然是影响模型性能的最重要因素。因此,必须在项目一开始就精心建立一个详细的数据集,包括要提取的信息类型、注释指南、各种数据类别之间的平衡以及其他根据需要的重要事项。如果使用标注工具(annotator)构建数据集,尤其是NLP模型,必须保证技术认知和语言认知的同步。有时,语言学家不了解特定注释方法是否适用于现有模型。同样,工程师有时也不懂语言学的内容。需要注意的是,数据越多越好。如果不能有效反映所有真实情况,再多的数据训练也将是白费。此外,数据标签的不一致也是一个大问题。此外,每次实验的训练、验证和测试数据的结构和比例必须相同,尤其是当数据逐渐增加时。为了确保模型的性能,还必须考虑案例类型的分布。如果您有专门的测试数据来帮助比较添加训练数据后的模型性能,那就太好了。连接步骤以构建端到端系统是机器学习工程师必须具备的另一项重要技能。更重要的是,如果同时处理多个模型,使用流水线会方便很多。加载数据集、预处理和特征提取、训练和评估模型以及进行预测都可以简化为一条指令。不要指望一下子就能得到满意的结果。另外,长时间重复做某事真的很有压力。因此,自动化机器学习工作流程以节省时间和减轻压力非常重要。其他框架和工具的作者也会因为犯错误而受到指责。在将系统部署到生产环境这一步出错后,笔者又陷入了苦恼之中。因此,有必要了解一些可用于部署的实用框架和有效工具。大家可以对比一下自己接触过的一些框架和工具,然后根据自己的需要选择最合适的。对笔者来说,Docker在部署上是非常重要的。它帮助我在容器中部署多个模块。此外,TensorflowServing也非常好用,它可以轻松地将训练好的模型应用到预测请求中。让每个人都能理解不仅为自己而且为他人编写文档。如果其他工程师想继续试验,或者只是想使用您的程序,您创建的文档可以帮助他们。如果文档也易于非专业人士阅读和理解,那就更好了。一个好的文档通常包括超参数配置、epoch、方法、数据和分数等信息。此外,如果其他工程师可以提供自动脚本来运行程序而无需先阅读整个代码,这将很有帮助。不可否认,我还有很多东西要学。但最重要的是要明白不要害怕失败。因为研究和实验本质上是一个尝试、失败、再尝试的过程。