找回密码
 立即注册
楼主: RhinoFreak

有没有必要把机器学习算法自己实现一遍?

[复制链接]
发表于 2021-7-22 11:48 | 显示全部楼层
没有必要每个都实现一遍,找几个有代表性的,实现其中的精华部分,能够加深对算法的理解。当剩下的部分只是“力气活”,没啥技术含量的时候,就可以停止了。
比如,如果你用深度学习做推荐系统,Wide & Deep就是一个典型算法,可以拿来练手。WDL精华在于对高维稀疏特征的处理,当你完成了Embedding层稀疏地前代与回代、Embedding层权重共享、Wide侧用FTRL优化稀疏特征的权重,剩下的比如类似tensorflow feature column多种特征处理方式,就没有必要实现了。
随手附上我用NumPy实现的Wide & Deep,和同道中人共同探讨
石塔西:用NumPy手工打造 Wide & Deep
发表于 2021-7-22 11:55 | 显示全部楼层
更新
看的人有点多了,也有人指出了之前言论中的不足,为了防止原答案产生误导这里重新补充一下。
1、是否要实现取决于需求,原答案默认假设大家之后不会以科研为主要出路
2、之前那么写是因为传统机器学习在实际工作中已经很少用到了。比如SVM运算速度慢,rbf核的稳定性不高;GBDT,有XGBoost和LightGBM可以替代,实现GBDT的意义并不大,因为和后两者还是有很多区别;Lasso和Ridge只是一阶和二阶范数约束,最小二乘会写基本就ok,原答案写了非要实现的话LR实现一下,LR如果会了基本一般回归都不是问题;聚类的话,内容差别很大,kmeans算法实际使用也有很大限制,而别的比如吸引力聚类无需只定类别。在经典机器学习的使用频率很少的情况下那么去实现的优先级就比较低。
3、看书+调包,这个似乎很有争议。原回答有个大前提是提高自己的编程水平,可以刷leetcode,也可以去多看看github项目源码。比如别人写一个伪代码能否自己用编程语言实现一下或者能写个大概?如果不行,那么首要的任务是提高编程水平,不然即使实现了一个算法也仅仅是实现来一个算法而已。不过这个问题似乎和专业有关,不同专业对这个的看法似乎会不同,一般而言理解原理不容易忘记,实现代码更容易遗忘,所以推荐看书为主,因为原理吃透的话,几个月后或者是更久当提到这个算法的话,特别是和别人沟通更方便,有人喜欢写代码的话也行。但是如果完全掌握理论,自身编程水平也不错的话,即使调包也不会很疑惑。
3、提到tf和sklearn框架的熟练使用是因为真的很重要且前者更重要,而tf和经典机器学习可以说完全不同,那要把各种神经网络都实现吗?不然为什么只实现经典机器学习而不实现神经网络呢?比如LSTM,CNN,MLP。实际工作中的主要框架是tf。
NLP用的模型是BERT和LSTM,重点是什么?使用腾讯语料库,基于向量加减算出新特征,调整lstm参数,例如层数64,128,跑模型,接下一个业务,重复上面过程,然后看下最新论文。
推荐系统,一般公司大多会有原来系统,如果好就用新的,否则换旧的。推荐系统可以使用MLP,数据量大会涉及到分布式spark,然后最好会点scala,同理数据导入(数据清洗会花去很多时间),上传服务器跑模型,连开几十个进程,所以一般python进程池pool随便开,不同的是这里需要对tf最终话目标函数的调整,这个调整就很艺术性,同时要有一点低维嵌入的知识embeding,这个也很重要。
图像处理,模型主流CNN,重点在数据的获取,有从网上爬虫的,购买图片的,甚至公司花钱请别人画的都有,然后就是看最新论文,github开源项目,CNN的框架整体已经在那里,不需要底层修改,重点在前期数据获取(核心),调参,图像会比较麻烦因为有些会涉及到CAD,3DMAX方便各部门沟通,还有渲染的,但算法主流还是CNN,只不过最新定会论文需要时时关注并复现。
量化交易,和上面稍有不同tf可以用,但用的多的反而是sklearn和xgboost/lightgbm,一个事实是金融特征相比于传统图像和自然语言更符合逻辑,如果纯粹用深度学习自己产生特征很容易过拟合,当然不是说不能用。这里就是纯粹调包侠了。
4、关于优势,这个说实话很看学校和项目经历以及是否发表论文,现在搞深度学习还有机器学习的学生水平比几年前好很多很多了,以前你会个SVM推导,西瓜书,李航看下就可以找份不错的工作。但现在很难,所以原答案强调书多看几遍,《百面机器学习》,《美团机器学习》去看一下,基本理论知识大家都有了,所以需要应用方面的知识,还有就是理论知识越巩固越好,剩下的竞争力不在于是否实现所有算法,而在于编程水平是否足够,是否有项目(kaggle也可以算)
5、最后在说下关于调包,虽然不太好,但是这个优先级可以放在最前面,原因在于,所花时间最短收获最高,详细去看sklearn官网的话,很多算法基本都是有数学公式写出来的,看一下的话也可以明白算法最终的求解表达式,tf官网写的也很不错,学习tf的话北大有一门mooc好像是《tensorflow笔记》,不长入门很快。也有人说按照这样学面试一定挂,原答案其实也写了,多投简历。。。BAT招的人毕竟不多而学机器学习的人已经过饱和了,微软亚研院等也类似,如果想去这些公司那肯定还有很多工作要做。原文提到的几家,漫道金服税前21k,进去相对容易。平安系(有很多)大概30万左右,携程即使不做算法,数据分析25万,招行也很好,不过招的也少。网易33万多,其实有很多可以去的公司,这些公司的薪水网上也是公开的。更何况还有一些人是去做量化交易的,不过机器学习量化交易类的起薪会相对低一些。
6、结论和之前一样:
1)sklearn/tf官网优先看,不是说实现所有算法不好,而是说优先级不高,把LR实现一下。
2)书可以多看几遍,而且每多看一遍话费的时间就会越短,经验是可以积累的,比如曾经我看李航的书,第一次看是有点费劲,但是反复看N遍,到最后看完一本书应该不需要1小时,因为很多早已烂熟于胸的内容就可以完全跳过。这样当你以后复习时,看书话费的时间是很少的。因为记在脑子里的东西很难忘记,同样我曾经实现过《机器学习实战》所有算法,抄一遍,自己写一遍,花了很多时间。但现在忘得差不多了,因为算法实现有很多细枝末节的地方并不是算法核心本身。
3)提高自己的编程水平,当你犹豫看书看完,然后对调包充满疑惑甚至是觉得很空动时,问题出在编程水平不足而非机器学习算法本身。这时你可以理解为实现算法也在提高编程水平,但是提高编程水平不是说实现一个算法就行的,仅仅实现忘得很快,之前说了刷leetcode是一个方式,github找一些开源项目看看别人写的也是一种方式这两种对编程水平的提高都有好处。
4)成为一个出色的调包侠,也许这个词本身含有贬义所以很多人会不以为意,但是一个优秀的调包侠是不会对原理一窍不通的,一个很简单的例子,比如有个任务使用卡尔曼滤波实现数据过滤,会去实现卡尔曼滤波吗?一般的流程就是查下什么是卡尔曼滤波,理解卡尔曼滤波原理,找下包调用,如果没有自己实现。当新的任务不是你知识范围内的内容需要把底层完全实现一遍还是去理解原理用别人造的轮子呢?论文复现使用基础轮子比自己完全构造轮子效率高得多,而且运算速度也会快不少。


PS:每个人都有自己的看法,我只说出自己的经历以及我所见到的情况,之前讲过可能存在样本偏差。
以下为原答案
——————————————————————
结论:没必要。
相信很多学习机器学习都是从李航,西瓜书,各种公开课(林轩田,ag等等),然后拿本《机器学习实战》基本算法全部实现一边。本人也是这么做的,当时特有成就感,事实证明没什太大用处。
1、编程水平的提高不会说实现了这几个算法就有长足进步,花这个时间不如多看几遍sklearn和tf的文档成为一个合格调包侠
2、没实现过算法对算法细节无法吃透?有这个时间不如把《西瓜书》,《统计学习方法》,《深度学习》再看一下,工程上的看下《百面机器学习》,《美团机器学习》,tf官网多扫几遍。
3、身边有人同时拿到阿里达摩院,京东,网易,360 4个offer的也没见去实现底层算法,去平安科技做NLP的师弟和同届,同样没见人家去实现底层,同样拿到漫道金服offer的也没实现等等,还有很多很多,当然这也可能存在样本偏差,但还是那句话有这个时间不如成为一个出色的碉包侠。
4、实际使用过程中经典的算法基本就是LR,然后会用LightGBM等继承算法,剩下的不伦是做推荐系统、NLP、CV的基本是tensorflow或者同类深度学习框架,模型总体而言是经典的MLP,LSTM,CNN,BERT这些或者读论文的一些变种模型。别的机器学习模型可以用但很少。
综上,如果非要实现的话LR实现一下差不多了,剩下的时间提高自己的编程能力,上面的书多看几遍,Leetcode刷一些,Paper能发就发,不能发也没事,反正简历投的多就行。如果不走互联网那只要原理记牢,成为一个出色的调包侠即可,如果还没时间,首先成为一个出色的调包侠。


发表于 2021-7-22 12:04 | 显示全部楼层
刚开始的时候,有必要,可以挑几个简单的写写,例如word2vec、rf等,当你发现实现大部分只是时间问题的时候,那就没必要实现了。
发表于 2021-7-22 12:07 | 显示全部楼层
有这时间不如刷概率,numerical linear algebra和leetcode...
发表于 2021-7-22 12:15 | 显示全部楼层
自己实现是很有必要的。
在学校的时候写过给工科生开设的《优化方法》编程作业,线性规划、牛顿法、拉格朗日乘子法等;Coursera《机器学习》课程每周都有编程作业,课程得分100+(最后的考试做了附加题);

刚读研究生那会,几乎看篇文章就会去看作者是否release代码,有的话就跑跑;没有的话就实现以下,low-rank/sparse方面的论文大都是矩阵范数的目标函数,论文给出每一步的迭代公式,matlab写起来很方便。
写过一些之后,心中不慌。

工作之后,差不多平均读20篇实现一篇。

实现一定数量之后,再战不需要长时间的心里建设,想干就干
发表于 2021-7-22 12:24 | 显示全部楼层
我也来学习别人,实名反对最高票答案。

该答案反复提到ML使用者应该先注重应用,而不是理论。但是从回答中多处可以看到回答者对他提到的很多ML知识并不很了解。

1. 该答主认为vectorize(使用线性代数来替代循环达到更高效率)很难。但如果真正从线性代数的角度理解了算法,vectorize只是实现公式而已,没什么难的。作为一个研究生如果连自己学习的算法都觉得难,我只能认为你没学到家,毕竟我身边的本科同学实现了vectorize过的ML(机器学习)算法的就有很多。

(而且我也根本不懂python的循环比vectorization慢,有什么好说python不好的。哪个语言不是这样?

2. 该答主觉得svm(支持向量机)只是max。为什么看不到svm背后如何简化decision problem(决定性问题)到quadratic programming(二次规划),使得运算速度大大提升的idea?为什么看不到svm引入的kernel trick(核函数技巧)多么的精巧方便?如果你只是理解到max的程度,怎么能够明白应用中如何通过kernel来实现不同的decision boundary(决策边界)、如何在svm和别的算法中比较得知哪一种更适合你实际应用的问题?

3. 该答主提到的很多知识都不完全对:hinge loss其实是max(x, 0),是从模糊的decision problem到坚实的、可以通过convex optimization实现的quadratic programming的关键;L1 norm (Lasso)和L2 norm (Ridge)的关键区别还有L1会偏向于产生sparse(稀疏)的解、它们代表了bayesian(贝叶斯)观点中参数的不同的prior。还在答案中宣称“这个小孩都能告诉你正确答案”,“都很简单”。如果你真正完全明白,那你这么说我无可反驳,还会认为你很厉害、眼界远大。但是这样半瓶子晃荡就让我觉得很浮躁了。

这些都不懂,就大谈运用,我不觉得会能很好的使用这些算法。ML算法成百上千,每一种都有不同的优劣,每个本身都又经常有几个参数可以调节,几个kernel可以选择。我真的不明白该答主这样对基础的ML算法知识都理解不深的人,在日常研究中是怎么运用、怎么选择算法的、怎么设置不同参数的?

如果你真的是一个合格的研究生,那么你至少要很了解你所运用的东西的优劣。

最后补充一下我个人对这个问题的想法:我并不认为每个使用者都应该去实现一遍算法。如果不是工作/研究使用,只是平时想试试玩玩做些个人小project的,那么直接了解一些算法的idea、用用library挺好的;但是正经用此做研究的学生,请至少深入弄明白算法的特性,而不是凭感觉开口。

edit: 补充最后一段。
发表于 2021-7-22 12:34 | 显示全部楼层
作为一个比较笨的人,很多是自己实现的时候才算是暂时学会的。
然后就又忘了。
发表于 2021-7-22 12:39 | 显示全部楼层
最早学ML的时候,还没有tensorflow,更别提什么keras了.于是用Matlab自己把单节点的梯度下降写了一遍.也把丢了好久的导数捡了回来.会做到自己推导.后来看到github上有个浅显易懂的DeepLearn库(链接在最下面),通篇读了一遍.因为有之前的基础,觉得很容易看懂.再后来看到百度paddle,是用C++写的,居然一看就懂.
但事情总有两面,因为上面的事情消耗了很多精力,python上手很晚,导致接触tensoflow和keras很晚.
说说感受吧.由于自己实现过,在一些超参数运用时候感觉会比较有感觉.对于一些算法的理解,看的时候比较容易理解精髓,也经常会拍桌子,感叹自己怎么没有想到.所以,如果有空,还是建议自己实现一下.

rasmusbergpalm/DeepLearnToolbox
发表于 2021-7-22 12:47 | 显示全部楼层
功利一点讲,看你想从事什么样的工作/研究,(这个回答只限于Deep learning相关)
如果从事平台/系统,自己实现一遍很重要。不光是numpy 版本,还有C/Cpp的。比如,如何能用有限的资源更快的进行forward ?哪些操作可以合并(Conv/Bn)?哪些数据可以后载入内存?哪些接口可以暴露?做数据并行时Gpu直接如何通信(跨卡Bn)?这些都是实现ml算法中才需要涉及的问题。
同样针对一些应用领域,自己实现一些op对以后的工作也很重要。比如 ResBlock,DenseBlock,SE-Block?又或者分配个anchor,算个复杂的loss?然而最重要的还是看懂别人的代码,并添加到你的项目里~这些都建立在长期积累的代码能力上。
巧妇难为无米之炊,看似底层反而细节更多,看似高层反而实现更复杂,做啥都要踏踏实实写代码啊~
程序员好啊,写开心了能省了游戏氪金的钱,消除了木有妹子的空虚,除了掉头发还是很好的呢~
发表于 2021-7-22 12:54 | 显示全部楼层
我干过这种蠢事,当时在hadoop上写了个分布式寻路算法用到我们生产环境跑起来。
隔了半个月了解了一下Mahout,发现人家已经有了,而且比我自己实现的快一倍左右。。。
这事花了我小两周呢,感觉自己就是一头蠢驴啊。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 13:49 , Processed in 0.067180 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表