研究与工程实践
自然语言处理与工程实践:研究vs工程实践
在公司里面做实践项目与学术性的工作有什么差别
在学术环境,人们更关系训练,而在生产中,人们跟关心服务
我们在生产环境下可能回了很多的经历提升了训练精度,但是给用户的体验可能是等待时间长了,可能用户体验并没有真正提升多少,所以我们去了解一些产品设计或者产品工程性的知识是非常有必要的。其实在AI这个领域真正的产品经理非常少
在机器学习的研究中,人们对达到基准测试任务的最新状态(SOTA)抱有痴迷,希望不断提升测试精度
但是ML不是Kaggle compititions,在Kaggle中获得好的成绩,不一定在实践中有好的应用
Kaggle比赛中非常强大的手段是集成,在实践中我们需要考虑要提高1%的准确率所需要的成本是多少和能否真正的有效提升用户体验
根据OpenAI的报告,最强AI的训练所需要的算力每3.5个月就会翻一番
这些最强的模型在实践上不一定是可行的,因为训练成本太高了
如何在实践中设计机器学习系统
ML project flow
- Project setup
- Data pipeline
- modeling & train
- serving
这四个过程其实是迭代的,意思是某一个过程他的结果可能会更新,改变前面的某个步骤
项目开始
在项目开展阶段,明确目标,把需求转化为模型问题,NLPer挖掘用户需求或者潜在的需求功能,比如需要一个帮助用户写小说的需求,这就需要NLPer自己想,这个产品需要有纠错,同义词替换,文本简化,文本复杂化,文本摘要,提供写作思路,文本匹配,推荐,文本生成,挖掘功能,对应功能再建模
了解用户习惯
性能偏重,比如速度或者准确率,更注重精确率还是召回率,比如一个检测癌症的产品,漏检和误检是不一样的。再比如说,在手机上有w1,后面是w2,尽可能会给用户一些后选项,对于不同的场景,偏重不同。
系统评估,训练的时候与市场应用是不一样的,比如chat-bot,闲聊与任务型或者知识问答,要从用户的粘性来考虑
个性化配置,不同用户不同功能
局限性,现实条件的限制
数据层面
数据非常关键,数据资源,标注质量,人工标注的分歧,如果标注量少,时候可以采用监督学习
用户数据,如何收集用户数据,需要什么样的用户数据
存储,存在那里,更新周期
数据表征 合理,完好表征
数据偏向性 老人或者小孩的数据可能网上没有,需要考虑数据的偏向
模型
模型搭建的基本原则:由易至难,循序渐进
我们不是一上来就是很复杂的模型,玩意模型效果不好,就不能更好的根据小的组建调整
先用简单模型,又一个效果a1,又一个具体的效果a2,我们能清楚的知道哪一个组建带来的效果是怎么样的
在单一batch(一群)上进行训练和应用,意思是如果模型不能容纳少量数据或者效果不好每,很可能这个模型存在一些问题
设置随机种子,是为了让模型可以复现,因为导致模型随机可能有很多原因,比如权重初始化,数据丢失,数据改组等等
系统性和科学调参,理论+经验调参,要求我们从数学上对模型有一定的了解
服务
训练过程与服务过程并非独立,随着更多的用户反馈,我们将会有更多的机会可以不断的改进,所以我们需要考虑是否使用新的用户输入的数据在线训练我们的模型,还有我多久要更新我们的系统,这都是回馈要考虑的问题
模型改进的取舍,不同层面的改进成本不一样,如果我们要对分类任务增加一个新的标签类,这就比较耗费成本,需要权衡
可解释性,针对不同的任务,有的有需求,有的没有需求,比如预测用户是否能够贷款,这时可解释性的要求比较高,但是一个chat-bot不需要解释
问题
什么是模型里的组建?
Seq2Seq框架 + attention机制,这个attention机制就可以当作一个组建,在原来的基础上做一个改动,抽象的就认为是一个组建
为什么要在单一batch上进行训练?
单一batch上数据量少,数据分布有局限性,我们用学习器很容易就能达到一个拟合的效果,如果我们在单一batch上没有达到拟合的效果,这就说明这个学习器的学习能力不行,需要注意的是,这是在同一份数据上进行训练和验证