作者abc2090614 (casperxdd)
看板DataScience
标题[心得] 和朋友讨论DS/ML开发和学习上的问题
时间Sat Nov 10 22:28:15 2018
这是我和朋友讨论的一些我们遇到的开发问题和学习过程的摘要
我想应该不只我们两个有这种问题,所以欢迎大家集思广益讨论
全文如下,但我也有放在我的 blog 上,如果想用网页看的可以点
https://changhsinlee.com/ml-career-question-zh-tw/
==
最近有机会和一位朋友讨论我们在做资料科学及机器学习上所遇到的一些问题。
由於我们都是数学背景出身,所以在经历和做事的方法上多少有些雷同。但因为我们在不
同的产业工作,会遇到不同的问题,我和颖锺讨论後,决定把我们的想法写下来,提供大
家参考。
讨论
1. 为什麽你会想听建议? 是觉得自己遇到瓶颈, 或觉得转进业界还是有断层?
颖锺:会想知道学长的经验跟建议,主要跟这半年来参与公司的案子息息相关,或者说成
就感吧。不得不说这段时间学了很多纯数之外的ML、DL相关知识,但是很常发生以下事情
:
模型无法real time,但就是因为DL比起传统演算法的灵活度更高但是参数更多所以运算
量变大
没有解决问题的SOP,或者是说都是因缘际会下调了某个架构、设了某个参数後做出某个
好结果才去解释,但是同一套架构用在不同的training data,结果又有所出入时,又会
换另外一套架构与解释…
神经网路是黑盒子,他为什麽做对、错,什麽时候会做对、错,不知道,只有按下
predict後才会知道,比如判断性别的model去预测同一张图的同个男生可能因为背景不同
而去导致不同的预测结果
以上三点算是冰山中的一角吧,也算是在做DL的都会遇到的问题,但是每个案子最後都陷
入这种循环才让我思考是否自己在正确的方向…【一件案子冒出来→建个模型并调整,去
达到高的准确率,然後也只能在达到准确率门槛时再解释为什麽这麽做会对→一个模型不
可能达到100%准确,所以别人询问时也只能以”猜测模型在干嘛”去做解释→最後因为DL
参数量大不能 real time prediction,先搁着吧,因为不可能在应用时搭载GPU】
因此,我才想知道学界或是其他业界在ML、DL的开发生态与经历是如何…这算瓶颈…吧
XD 又或者是我不清楚在业界到怎样的地步才算有成就感,之前当学生只要考高分就有成
就感XD
2. 或许你可以列出几个想讨论/想听的点?
颖锺:最想听的大约是:
学长在做ML有遇过我如上提的那些模型问题吗(不过你说你不是做DL我不知道问题一不一
样@@)
如何知道在这家公司学的东西与方向正确否?我知道这个问题可能太空泛,要看自己的目
标之类的,但是我还是这样问就是因为【一开始很开心学了很多东西→但学的这些东西很
常遇到第一题所说的那些问题,而且目前无解→那我学的这些东西是正确方向吗】
承 2,或许是第一份工作的关系吧,我真的不知道该用什麽价值观去看待目前遇到的问题
耶@@?
3. 数学和业界接轨?
我:这是抛给你的问题 - 之前我有个朋友在大学教书, 数学系. 她问我在学校学的东西
有什麽和我现在在业界做的相关, 要怎麽改课纲才能让学生和业界接轨. 我想了半天,
除了看一些计算过程以外, 实在没有特别跟数学系相关的部分. 你对这件事有什麽看法
? 是如何改课纲以便接轨?还是我认不认同接不了轨?
颖锺:以我没任何准备就休学,没有纯数之外的知识基础上就去面试金融与科技业的经验
,确实…不用说接轨了,连边都碰不上XDDD
讲难听点,如果时间重来,最快的接轨方法只有先 破釜沉舟 选定一个方向,比如科技业
,然後再把范围缩小,比如软体工程师,然後花一两个月苦学coding与看开放式课程,然
後考证照、用程式做些作品放在履历….咦,怎麽在做资工系在学校就在做的事?因为数
学系学的东西完全用不到,唉~原本我还很乐观,不相信现实的残酷,觉得还是会有业界
看上的,但是念数学唯一能说出最具像化的东西只有逻辑思考能力,没了!而且这还很抽
象,你逻辑思考很好,证明给我看阿!但是不能用你所学的东西证明给他看,因为这些东
西面试官看不懂也不care…
我觉得这问题存在很久了,说真的也希望看到数学系产学合作的一天,以我个人而言,我
还是很喜欢数学,但是我没有办法不顾及【学这些能干嘛?】,我就是因为这句话从硕一
以来一直盘绕在我脑中,越念越没动力,【考得高、考得过、也有成就感,正向循环,所
以我就继续念】这心态能带给我的力量越来越少了…
因此,本质上要解决这问题,最根本的就是不是自我安慰【数学可以干嘛】,而是去证明
【数学真的可以干嘛】,这也是我对自己的长远要求,我真的不想相信花了快十年而且自
己有兴趣的东西到现实世界就是一坨屎QQ 虽然一堆coding 与ML 知识都是统计与数学的
结合,但,比如以PCA 为例,不知道原理的也是call API 就可以做PCA,知道原理的也只
是心理快活很多知道他在干嘛,但是以结果论而言这两个人的产物都是一样的,会数学的
那个人并没有多出什麽…
最後,像我有这份工作,很感谢主管当初因为我是数学系&学流形的才找我,虽然
manifold learning 跟 Riemannian manifold 关联很少XDDD 纯数出来的只能靠面试官愿
意给你一个机会,而不是自己去争取来的一个职位…在我观念里,觉得一份好的工作应该
是自己在这领域有一定程度的理解与表现,对方也肯定你的能力,但是就是因为纯数在业
界并没有一席之地,所以我在面试官面前就是一个什麽都不会的人,要拿到某个工作只能
自己私下恶补,那我乾脆当初就念那个系就好啦XDDD
我的回答
其实为了回答你的问题,我想了很久。
原因无他,因为不只是你有这个问题──我也不知道什麽叫学到一定水准。
举例来说,如果你叫我现在建一个影像辨识用的神经网路,我大概也没办法作得比网路上
一些教学来得好,因为平常并没有花很多时间在实作类似的东西。
所以到现在我还没办法给你一个确切答案。我现在的作法是,看自己想做的是什麽东西,
再去蒐集相关工作的人会用到的工具和作法,来帮助自己拟定一个计画。
常见的开发问题
根据我在美国的观察,会说每个案子都陷入这样的循环也是相当正常。毕竟没按下
predict 之前真的没人知道会发生什麽事。但换个想法来看,要怎麽作才能在同样的时
间内按下 predict 更多次,而且每次 predict 都是实践不同的想法?
这就牵涉到软体工程的方法,所以我最近读了不少写程式相关的书。不一定是学什麽语言
或怎麽写,而是学除了在写程式码之外,要怎麽测试自己的程式,要怎麽作 version
control 来和同事合作,诸如此类的问题。把会浪费时间的部分处理掉,才能更快的试不
同的想法。因为在探索的过程中,其实大部分写出来的程式码到最後都派不上用场,所以
动作越快,就能捞更多东西,捞到宝的机会也就会变高。
换句话说,就是从每天做重复的事的框架中跳脱出来,以抽象的角度来思考整个专案的过
程。很像是数学在写证明时,写完一次以後,过一阵子又回来重写一次。或许这就是数学
界的强项也说不定?
很多实作上遇到的问题,当我从抽象的步骤下去考虑,就会发现其实我做了好几次同样的
事。既然如此,那我是不是可以写一个小程式,我下次遇到重复的问题的时,就可以省去
处理这个步骤的时间?
举例来说,我能不能从资料库抓资料抓得更快?能不能更快的作图把资料中的例外点更快
的抓出来?能不能让程式帮我整理模型预测出的值,让我更快抓出这个模型在资料的哪些
部份特别不准?要进 production 前有哪些难题,我要怎麽解决?甚至是和程式完全无关
的:在开始写程式码前,要怎麽更快理解业务或客户到底在想什麽,或把专案带往较有可
能有结果的方向?之类的。
而关於实作上的抽象步骤,我最近有些想法会放在其他文章里面讨论。预计会至少写三篇
。
怎麽学东西
常常有人问我到底要学什麽东西,要学了多少,才能找资料科学相关工作。其实不管什麽
工作都一样。判断我程度到哪里是其他人的事──又没有人付钱给我。我能作的就是不断
进步。
所以我现在不会去问自己要学到什麽程度,但我会问「这件事要花我多少时间」:一年之
後的我,能不能用同样的时间作更多的事?
开始的第一步就是自己写下自己想要做什麽,然後拟订计画。就像体育选手一样,每个选
手都有自己的训练菜单。而训练的目的是让自己在某个方面变得更好。自己设定了目标,
就能规划自己的时间,就能有效利用这些时间不断进步。
我研究所时修过最没用的一门课叫做李代数。那时博士班二年级不知道要选什麽课,想到
以前在念相对论时常常听到李群、李代数,所以看到系上有开,就选下去。过了一个半月
以後兴趣完全消磨殆尽。最後两个月我还有去上课,但都没交作业,老师人很好还给我一
个C- (比当掉高一阶)。但这个问题就是源自於课表不是我自己写的,而是系上已经定好
了。等别人来帮我设计课表,我再去挑,不管怎麽挑都不会合身。
所以现在,当我在设定自己接下来六个月、一年、三年要做什麽的时候,我会认真考虑计
画,并尽早开始实行。自己写下来的总是至少我有些热情的东西。如果两个月过去了,发
现这不是我想要的,那也没有人帮我打成绩,也不用硬要做完,再把精力花去投资其他有
回报的地方就是了。
学习 = 投资
最近我读到一本书叫 Pragmatic Programmer (中国翻译为程序员修炼之道),其中一段我
非常喜欢。
书中讲到,学知识其实就和理财的投资组合一样。如果要有好的报酬率,就必须养成定期
投资的习惯,并且分散风险—有时候要买投报率稳定的绩优股,有时候要买有爆发力的新
创企业,并且定期回顾,把没有价值的资产砍掉,投资到能赚钱的方向。
学习也是这样。如果在规画自己的生涯时不知道该学什麽,那就先都学一点吧。如果短线
看不出来,那就分散风险,每个篮子都放一点。用长线投资的方法,应用到如何获取知识
上。每天读30分钟的技术文章,额外写30分钟的 code,参加一些小型的集会等,都是很
好的方法。
我觉得数学念久了,会有想把学到的东西分门别类的想法。但其实在社会上分类并没有那
麽细。所以我目前大致上会用下面这个准则来学东西:
长期技能和短期技能
所谓的长期技能,意思是可以带着走,不会因为换环境或换工作就失效的技能。举例来说
,
短期技能: 像是网页前端的各种架构 (React 之类),大约每一两年就会变。学了以後时
效性有限。 长期技能: 有和工作直接相关的,像是专案管理的技巧,演算法,或是不会
退烧的 C++。也包括专业技能,像是和客户的沟通能力,写作能力,架设网站等等。
我认为长期技能比短期技能值得投资。
以我最近的作法当个例子:
短期技能: 我目前在用这本书
https://pragprog.com/book/bopytest/python-testing-with-pytest
学 pytest。pytest是 一个 Python 的测试框架,我因为在探讨要怎麽写出更好维护的程
式码,而且平常工作是用 Python ,所以就挑了一本书来读并且实作。
长期技能: 要怎麽录音、剪接影片等等。目标是做出有一定品质的影片放到 Youtube 上
。
注:个人兴趣则不在此列,想学什麽就学什麽。
破釜沉舟
我很喜欢你用的一个词”破釜沉舟”
「如果要拿到某个工作只能自己私下恶补,那我当初念那个系就好啦!」 这句话满中肯的
。只是最大的问题就是──没有能透视未来的水晶球。我想回到过去、改变未来这件事,
目前是不可能的,所以我能做的就是认清事实,让自己的技能变得更有价值,而不是回头
说「阿,其实这件事很有用阿」。因为没用就是没用。
像我的家人,常常会问我「你现在工作跟你学的有什麽关系」啊就没什麽关系你是要问什
麽?我的经历让我现在有这样的思考模式和想法,为什麽我还非得作跟我以前相关和一样
的事?美国生活让我见识到其实人的潜力是无穷的。虽然我现在叫我去练身体然後上大联
盟打全垒打这件事大概是不太可能以外(其实人生没有不可能,但现在叫我去练到上大联
盟的期望值和其他能做的事相比实在太低,比买彩券还低),很多事我都还能做啊。
但这种问题也不奇怪。来到美国以後,我发现台湾教育环境训练出的思考模式是线性的,
生涯就是铺好的路,从毕业的A点到退休的B点,念电机就是进竹科, 念医科就是当医生
。但我在美国的看了形形色色的人,发现人生比较像布朗运动,到底这颗花粉最後会到哪
里,没有人知道。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 68.71.180.136
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1541860098.A.AC2.html
※ 编辑: abc2090614 (68.71.180.136), 11/10/2018 22:31:45
※ 编辑: abc2090614 (68.71.180.136), 11/10/2018 22:33:54
1F:推 st1009: 推推 是说用真名好嘛?改成"学弟:"应该不影响阅读,当然本 11/10 23:31
2F:推 st1009: 人没意见的话,应该没有关系 11/10 23:31
本人说ok 我就留着罗
3F:推 michellehot: 很现实的问题 11/11 01:58
4F:推 p193202: 推 同为数学系 现在做 ML DL 工作 11/11 19:34
※ 编辑: abc2090614 (68.71.180.136), 11/11/2018 20:54:54
5F:推 kpil15977: 统计所做ML和DL跟资工有差吗? 11/16 02:34