楼主: whitefox (八十萬定存宅男)   2021-12-16 21:15:52
前言
因为硕士班毕业后随即进入machine learning相关部门工作,所以我其实未曾接触过系统
性的软件专案开发。 幸亏有同事已经在软件业沈浸十年,其丰富的经验确实也引导了我
进行机器学习专案开发。
故这篇文章我会用目前我的视角描述如何从接到需求开始设计机器学习专案!
机器学习专案 v.s 软件专案
机器学习专案不同于软件专案,一般来说我们在开发软件的时候都是有deterministic的
目标,且确定我们所设计的function都有确定的inputs & outputs,机器学习专案虽然也
可以制定明确的目标与inputs,它的outputs却是probabilistic,我们可以确保outputs
的范围是什么,却无法保证每次输出都会是同样的结果。
机器学习专案也像软件专案一样,都需要持续迭代以改善使用者体验或效能,但机器学习
专案的迭代不只牵涉到内部function的设计甚至还有模型、dataset的迭代。除此之外,
因为模型效度会根据你所使用的dataset而改变,也会因为你的target dirtribution改变
而降低效度(例如:推荐系统若不更新的话不会知道你的喜好已经改变),所以如何设计一
个系统化的data收集与模型再训练流程也是机器学习专案中非常重要的一环。
可惜的是,目前我的工作内容尚未牵涉到模型直接上线,故我并不熟悉实际上线后的维运
及模型再训练等流程。 接下来,我会一步一步地说明如何从零开始设计机器学习专案。
step1: 需求来临
今天,其他BU的user们于一场会议中突然提到,“如果AI可以帮我们做文案生成的话,我
们的同仁就可以省下大把的时间去做其他事情了”。会议结束后,你的老板希望可以利用
我们部门的专业满足BU提出的这个需求,目前我们已知的资讯就是“要做一个XX文案生成
器,而且要像是人写的”。
这时候,我第一件做的事情是将需求format成一个软件问题…
目标: 生成像是人写的文字
inputs: 某些condition,像是文字的风格、情绪正负向等等
outputs: 约五十字内的一段文字
step2: 阅读资料
问题定义完成后,我们需要看看BU有没有相关的data可以让我们参考,在这个例子中BU提
供了几十笔文案。我们需要先利用EDA(Exploratory Data Analysis)观察资料的特征、资
料的结构、有无异常值或空值等等。这时候脑海中应该会忍不住思考,这个问题能否用
rule based的方法解决?还是需要用到NN? 根据不同资料/任务的特性,有可能你会遇到
用rule based就可以解决的专案,那我就会推荐先以rule based的方式进行。因为
machine learning其实非常仰赖资料的数量及品质,若你的资料量不足或是品质不够,训
练出的模型也不会有太强的效果(即便你使用的是SOTA的算法)。
除了user提供的资料外,我们也可以看看网络上是不是有相关的open data,若没有的话
有没有其他类型的资料可以替代?或是有没有办法透过爬虫等自动化工具自己收集?收集
/处理资料的过程通常会占据一个专案的大部分时间,且若我们又是用机器学习算法的
话,成败也依赖资料的品质。
step3: 定义metrics
这边所指的metrics包含我们学习machine learning时常见的metrics
例如:F1-score,
recall, precision, BLEU, ROUGE, accuracy…等等,
但除此之外,不要害怕定义这份专案的专属metric,因为主流的metrics不一定能满足
专案需求或是可能你缺少某些资料去计算。
举例来说,文案生成,也可以说是Natural Language Generation (NLG)问题,目
前学术上尚未有主流(dominate)的metric。在这个专案中,我先考虑了能否使用BLEU衡量
我们生成出的文案与BU user自己撰写的文案差异,但这件事情需要user花非常多时间去
检视每一个我们所生成的文案,现实中不太可能达成。
所以,我其实刚开始并没有找到适合的metric,这也让前期的开发不是非常顺畅。
幸好,后来我们找到了几个可以衡量文案生成品质的metrics,且他们都不太需要花费人
力成本,可以自动化完成…
相关度: 判断生成文案与input condition的相关程度
多样性: 利用n-gram判断文案们是否呈现出多样性(创意???)
语法正确性: 从语言学的角度判断文案是否合乎人类常用语法
step4: 选择model/algorithm
定义好问题与matrics后,我们可以开始根据资料特性选择适合的模型,通常选择模型时
我们会考虑到以下几点…
模型能力: 这个模型目前是不是SOTA,它在类似的资料上效果如何
资料适配性: 用这个模型是否需要额外资料处理?成本多高?(若需要重新label data的
话其实就蛮高的)
应用场域: 我们目标要把这个模型放在哪里?user手机(edge device)上?还是server?
若是放在手机上的话还需要考虑模型的大小与效能问题
除此之外,通常若可以用rule based的方法处理的话就会先用,就算效果可能没有nn来得
好,也可以当作一个baseline! 但若rule based方法就可以高度满足user的需求,那何乐
而不为呢?
若你需要考虑使用nn,但一样你需要明白以下几点:资料有什么特性?通常这类资料都用
哪种model处理?目前SOTA的模型是什么? 在这个例子中,我们的资料是一段句子,目标
是做NLG,所以目前最常见且SOTA的方法就是transformer。
总而言之,在这个阶段,你需要具备对资料与模型的认识,才能根据需求与限制寻找最合
适的架构。
step5: 开发与测试
接下来就可以进行开发,开发时我们团队利用VCS(version control system)进行版本控
管与code review,故你可能会需要用到以下几项工具…
autopep8: python formattor,确保code review时在程式码每一位同仁的IDE上都可以正
确呈现,也确保不会因为每个人的程式码编排风格不同而造成review上的困难
pytest: 写测试时非常好用的工具,测试可以帮助你每次改code时确保整份程式码是正确
的,也可以在你改错的时候提示你哪边可能有问题!(前提是你的测试coverage rate要够
高、够全面)
bandit: 一个程式码静态扫描工具,可以帮助你找出程式中可能的安全性问题,以及相对
应的建议解决方案。
除了这些常用的工具以外,架构你的程式码时也必须使用易维护/阅读的方式,这一块我
也还在学习,在这个过程中将会碰到许多OOP相关的技巧~
Future
开发完成一个prototype或是初版后就可以跟user开始确认是否符合需求,在这个过程中
可能会需要常常修改程式码,这时候若你有好的程式码架构的话,会比较轻松一点。若
user觉得也没问题,接下来就是系统上线的问题了。是要做一个单机版?还是要部署到公
司server?还是有需要做成手机APP? 这一块目前我也还在摸索中,若有更深入了解的话再
更新这篇文章~
结语
从无到有设计并完成一个专案并不是很容易的事情,过程中除了工程师本职的开发工作外
,还是需要与需求方建立密切的连结,并时时沟通才不会让专案方向跑偏。以前在学校时
觉得machine learning其实就是把SOTA的模型套上自己的data,但在业界最常见的困境其
实是你可能连data都没有。

Links booklink

Contact Us: admin [ a t ] ucptt.com