有了解算法工程师职业规划这个职业的么

君,已阅读到文档的结尾了呢~~
技术部算法工程师岗位规范,算法工程师岗位职责,技术部工程师的检讨书,技术部工程师,算法工程师,图像算法工程师,华为算法工程师面试,算法工程师笔试题,阿里算法工程师笔试题,算法工程师待遇
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
技术部算法工程师岗位规范
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口中国领先的IT技术网站
51CTO旗下网站
为什么“高大上”的算法工程师变成了数据民工?
先来一段我在知乎里回答“做算法工程师是一种怎样的体验?”的答案(其中的思想并非原创,而是山寨自新加坡某大学一门Quantitative Investment课程的ppt)
作者:来源:数盟| 13:32
先来一段我在知乎里回答&做算法工程师是一种怎样的体验?&的答案(其中的思想并非原创,而是山寨自新加坡某大学一门Quantitative Investment课程的ppt)
理想中的算法工程师:提出假设-&收集数据-&训练模型-&解释结果。
实际中的算法工程师:提出假设-&收集数据-&预处理-&预处理-&训练模型-&调试-&调试-&重新收集数据-&预处理-&收集更多数据-&调试-&调试-&调试-&&-&放弃。
这个答案被点了几十个赞,在24个答案中排在第二位,说明具有一定的普遍性。排名第一的有100+赞,而他的观点是:每天最重要的就是跑数据!
这不是段子,而是事实。为什么&高大上&的算法工程师实际上是个数据民工,要寻找这种理想与现实的差距的原因,首先要理解一个事实:只有人能够理解数据,机器不能。
不管我们用什么机器学习算法&&无论是LR,SVM,k-means,EM&&对于它们来说,输入数据都是一堆浮点数组成的矩阵而以(如果说的更本质一点,只是一堆01序列)。如果有一个特征是&小时&,而它出现了25,任何一个智商正常的人类都能明白,这是一个错误,然后在数据清洗的时候把这样的数据排除。但是机器就无法理解这一点。要具备小时的概念,又要理解什么是时间,一天有多少个小时&机器怎么能自动化完成这样的数据清洗工作?更进一步,如果人发现&小时&这个特征中大部分数据是0到12,而混入少量13(但13的数量又不是太少以至不能被当成离群点排除),人就会怀疑,是不是使用了12小时制而13是一个错误。机器目前是无法做到这一点的。
再说人肉特征。一个是特征变换,比如需要一个特征是某两列数据的比率,这种除法是线性模型不能涵盖的。当然可以增大模型的假设空间,但是太小涵盖不了需要的变换,太大又容易过拟合。另一个是加特征,比如我认为点击率和屏幕分辨率有关系。于是我去找屏幕分辨率数据加入特征,如果没有还要想办法采集。这些机器都做不了。
但是,人一但把数据准备好,接下来就是机器学习算法发挥的时候了。但是,算法工程师的主要工作不在这里,这是因为软件有个特点,可以近乎无成本的复制。只要这个世界上有一个人实现了LR(知识产权的问题这里不考虑,更何况开源软件很多),其他需要用LR的人都可以拿过来用了。显然,这些算法工程师们也正是这么做的。
然而,等算法输出结果以后,又需要人的工作了&&怎样用结果解释实际问题,应用到业务中去。显然这个过程和前面数据清洗、人肉特征的性质类似,都是只有人能完成,机器做不到的任务。
做过数学建模的同学对这个过程可能很熟悉&&如何把一个问题描述成数学问题,再如何把结果应用到实际问题上。这有点类似于通信中的&最后一公里&问题,主干网的光纤建设的很强大,而最终用户的接入却成了一个麻烦事。对于机器学习的应用问题来说,算法和相应的软件包都是标准化、通用化的,像骨干网;而数据如何&接入&,则是只能由人完成。因为,只有人能够理解数据。
技术与技术人员
这个问题可以推广到整个计算机领域。把算法工程师代换成程序员,把机器学习算法代换成软件,这个观点就变成了:大部分程序员所解决的,是通用的计算机工具和具体的实际业务之间的&最后一公里&接入问题。
为什么这么说,我们先来看历史:计算机技术发展了几十年,程序员的入门门槛是逐步降低的。最初的程序,要在裸机上写汇编。后来有了unix,c语言,程序员至少不用亲自调度进程了。java出现之后,连内存都不用管了。而(世界上最伟大的)php出现之后,网络编程的门槛进一步降低,任何人都可以在短时间内搭建一个网站。
原来的那些问题去哪儿了呢?被少数造&&轮子的程序员们解决了&&那些写操作系统、编译器、虚拟机、运行时环境、框架&等等的程序员们。这个趋势一直在持续&&新兴的rust、golang等语言试图解决多核时代出现的并发问题,hadoop、spark、mesos试图屏蔽分布式系统底层的细节&&可以预见,以后的并行编程和分布式编程门槛将会大大降低。这个过程是必然的,因为一项技术的发展,就是为了让更多的人能更方便的使用它。
而这些计算机工具不能直接应用于业务,因为计算机不能理解人类的语言,所以就有了大量的程度员存在,把人类的语言&翻译&成计算机语言。这些程序员是使用&轮子&的。当然这之间并不是非黑即白的,一个软件在多大程度上可以被称为轮子,取决于它的复用性。如果一段代码只能在一个地方使用,它显然不能称为轮子。而事实是,大部分为具体的业务逻辑所写的代码,复用程度很低。
对于把通用计算机工具应用到具体业务这个过程,中间到底有多少问题是技术性的?大部分技术困难被操作系统、编译器、虚拟机解决掉了,剩下的主要是大型软件(如果这是个大型软件)的复杂性控制&&而这个问题又主要由少数高级别的架构师负责。对于写具体代码的程序员,剩下的技术性困难已经很少了。
举一个我供职过的公司,这是一家互联网公司,整个网站99%的代码是php,基本上没有java。没有专门的前端工程师,php、html和javascript代码混在一起。测试几乎等于没有,基本都是开发人员自测。上线流程只是个形式,质量控制部门唯二的作用就是向服务器上同步代码和出现事故之后给开发人员定责任。我曾经和另一个部门合作,他调用我提供的接口,而他在我的接口没上线的时候就上线了,导致一场事故。我本来是算法工程师,写php只是客串,而在这个过程中,没有任何上线依赖的控制,连提示也没有,甚至没有人对我进行上线流程的培训。然而,这是一家中等规模的互联网公司,己经发展了十来年,占据了所在细分市场领域的头号份额,并且己经上市。
我举这个例子并不是要黑它,而是想用事实支持上面的观点:大部分程序员,大部分所谓的&科技&公司,所面临的技术问题比想象的要少的多(这也许是那家公司没有CTO的原因)。
这不是个别情况,大多数公司都存在类似的问题&&从技术角度看,它就是个渣,你会很奇怪它怎么还没死。然而事实是,它不但没死,反而活的生机勃勃,甚至上市了。公司的拥有者们早已实现了潘磕嫦赘幻赖睦硐耄杪钏堑某绦蛟泵腔乖诳嗫嗟奈看蛘呤赘墩踉U饫锩妫写罅康姆羌际跻蛩仄鹱殴丶饔茫」芩嵌甲猿瓶萍脊尽
越来越多的人意识到了技术的局限性。年初,一个同学找工作,他向来是个&纯技术流&的工程师,曾经写过很好的技术博客,甚至发起过开源项目。然而这次他说,&不想再做最底层的工程师了&,希望能做一些&高层的、能看到项目整体的&、以及&和人打交道,能够把自己的想法向外推动,并产生价值&的工作。于是,他去某公司负责带几个小弟去了。当我把这些转述给另一个同学的时候,他的反应是&我最近也有这样的想法&。还有个同学,说写了几年C++,技术上没学到多少,反而是接触的业务知识比较多。再比如我之前的leader,他是数学博士出身,曾经对算法有一种近乎天真的信仰;在我离职的时候,他已经完全转型为业务和产品导向了。而某个几年前就开始淡化技术,聚会时大讲&软实力&的同学,早已在BAT做了Team Leader,生活滋润,终日以跑步为乐。为何?其实原因很简单:公司里没有那么多技术问题需要解决。
《代码大全》里有个比喻,如果你的问题是给自己的爱犬造一个小窝,那么动手做就是了,如果出了什么错误,大不了重做一个,最多浪费一下午的时间。而造一个摩天大楼就不同了。所以,如果写一份&狗窝&级别的程序,算法、数据结构、设计模式这些又有多大意义呢?甚至违反了DRY原则也没关系,反正一段代码也拷贝不了几次,出了bug就改,大不了重写一次,最多浪费一下午。而且,说不定这个项目两周之后就被砍掉了。如果你做的是一份&造狗窝&的工作,就算你有造摩天大楼的技术,和屠龙之技又有什么分别呢?唯一的&好处&就是你会据此向老板提出更多的加薪要求,以至于老板对你&另眼相看&。
程序员应当破除对技术不切实际的幻想&&这不是说技术不重要,而是说要实事求是的分清,哪些是造狗窝的工作,哪些是建普通楼房的工作,哪些是造摩天大楼的工作。
同理,算法工程师应当破除对算法不切实际的幻想,把注意力集中到数据的理解、清洗、预处理、人肉特征、业务应用(而这些往往和潘俊⒖啾频刃稳荽柿翟谝黄穑┥侠础
未来,机器学习工具将更加标准化、平台化、通用化,并且进一步降低使用门槛。与算法本质无关的工程细节,比如数据存储方式、梯度下降过程、并行化、分布式计算等,将被制造&轮子&的程序员们屏蔽。算法工程师可能只需用类似Hive的方式,写几个类似SQL的语句就可以完成模型的训练、交叉验证、参数优化等工作。
而机器唯一不能替代的就是对数据的理解,这是算法工程师存在的价值。而数据是和业务强相关的,算法工程师将更加接近产品经理的角色,而不是程序员。深入理解数据、业务和产品,寻找模型和它们的结合点,将成为算法工程师的核心竞争力。
插一句,相对于本文的观点,Deep Learning在某种程度上是一种的例外。它试图解决特征工程的问题,也就是在某种程度上代替人提取特征。当然,它还比较初级,另外它最多只能解决特征变换问题,仍然处理不了数据清洗和预处理中需要用到领域知识的情况。
这里刘同学提出一个问题,那就是算法工程师对算法需要理解到何种程度?事实是,即使从算法的应用出发,工程师也需要掌握模型的优缺点、适用场景、模型选择、参数调优等技术。这是毫无疑问的,从这一点上说,算法工程师需要一定的技术能力,这点又和产品经理不同。
但是这就有另外一个问题:模型选择和参数调优技术,是否是通用的?还是和具体的数据高度相关的?比如,是否存在这样的现象,同样的调优技术,在(比如说)电商数据上表现很好,到了社交数据上就不行了?这个问题我暂时没有答案,如果谁知道,请告诉我。不过,一个现象是,目前做机器学习模型相关的项目,在改进的时候,基本上都采用试错的方式,就是先做出改动,然后上线观察效果;如果不好,就换种方法;如果效果有所改进,也往往没有人知道为什么。如果存在一种通用的判断模型优劣的技术,我们为什么还要采取这种近乎穷举的方式呢?
从&IT精英&到&IT民工&或者&码农&,这种称呼上的转变并非笑谈,而是真实的反应了计算机编程领域门槛逐步降低的过程。所以,我们应当给听上去高大上的&算法工程师&或者&数据科学家&起一个类似的外号,比如&数据民工&、&机农&或者&蒜农&之类,以免不明真相的孩子们被&高大上&的称号吸引而误入歧途。
看的出我是一个比较纯粹的技术人员,因为对于非技术的东西,我了解不够,说不出那是什么,只能用&其它&一词概括。
这&其它&,基本上是&人&的问题&&比如前面提到的&如何推动自己的想法&,&软实力&之类,大的包括机遇,小到&发邮件应该抄送给谁&这种细节。
当然,如果你是个对技术本身感兴趣的人,这些讨论不适用,因为对于这类人,技术本身就是目的,不是手段。这里的视角,仅仅是社会普遍意义上的职业发展角度。无论是想在公司内部获得升迁,还是通过跳槽而得到晋升,还是自行创业而实现人生目标,技术都只是你的一种技能。如果再想想大部分公司里提供的是一份&造狗窝&级别的职位,这种技能起的作用又有多大呢?
不过多说一句,要求程序员&对技术感兴趣&,甚至&在业余时间以写代码为消遣&,是一种相当荒谬的事情。试想,招聘销售人员的时候,从未有人要求求职者&对喝酒应酬感兴趣&;招聘财务人员的时候,也没有人要求&对加减数字感兴趣&;招聘外科医生的时候,也绝不会要求&平时以解剖人体为消遣&。为什么程序员这种职业就要搞特殊?
究其原因,大概是大家还沉浸在对技术的一种非理性崇拜之中(当然崇拜和亵渎往往并存)&&&技术改变世界&这句话常常被提到。这句话没错,但是要搞清楚,&技术改变世界&不等于&每一项技术都能改变世界&,更不等于&每一个技术人员都能改变世界&。其实,程序员这一行和其它任何一个需要专业技能的行业没什么区别,只是一种谋生的手段而已。
大部分所谓的&科技公司&也并不是真正的科技公司,顶多是&使用科技的公司&。其实,在金融领域,对IT的要求要高多了,各大银行也有自己的软件开发部门,但是没人把它们归到IT行业,而是属于金融行业。然而,那些开商店的,开饭店的,卖房子的,给人说媒的,集资的,他们似乎只要做个网站,就成了&科技公司&了,这难道不是很荒谬吗?(当然,像亚马逊这种从一个卖书的起家,居然后来搞起了云计算、推荐系统、无人飞行器等技术创新的,不在此列。)在这些公司当中,技术到底起多大作用呢?
也许相当一部分程序员们会自以为技术很重要,他们沉浸在对技术的憧憬和信仰中,内心深处坚定的相信自己可以通过技术能力的提升,来谋取更高的职位,走向人生巅峰。然而,大多数时候这只是一种自欺欺人的幻想罢了。天朝的程序员们有一种矛盾心态,一方面自称&民工&,认为编程是一种只适合30岁之前的年轻人从事的体力劳动,而另一方面却又把技术看的非常重要,甚至在业余时间也喜欢大谈技术,或者以攻击其他程序员使用的技术为乐。如此抱着技术不放,并不是因为多么热爱技术,而是因为他们只会技术。没有人愿意在别人面前展示自己的劣势。把技术的地位抬的越高,仿佛自己就显得越重要,而那些在需要人际交往、推动自己的想法、和产品经理讨论需求的时候所表现出的能力低下,似乎就不重要了。
这是人性的弱点&&对自己某种能力盲目而过分的自信,甚至把它作为自己的精神支柱。也许他在这个方面的确很擅长,但是自我评估却比实际更高。诚然,自信是必要的,也是人生存和立足的精神基础之一。然而自信是把双刃剑&&不切实际的自信(也许应该叫自大了),会蒙蔽人的双眼,扭曲事实。
那么我们应该怎么做呢?首先比较悲观的一点是,如果你从事着一份技术上处于&造狗窝&级别的工作,那么很遗憾,提高自己的技术水平恐怕对于在公司内部的职业发展没什么帮助。
如果你是一个真正对技术有兴趣的人,可以考虑一下《黑客与画家》里提到的一类&真正的程序员&的工作方式:他们求的一份&白天的工作&,这份工作仅仅用来生存,而在业余时间写一些&真正有价值&的代码。
恐怕大部分程序员都不是对技术有兴趣的吧?如果你的目标是事业上的发展,无非是跟人混和创业两种方式。跟人混,要么内部晋升,要么通过跳槽。前者需要老板认为你牛逼;后者需要别的公司的老板认为你牛逼。注意,这里有个关键词&认为&,因为人的主观印象和客观事实之间总是有差距的,而且这个差距往往超乎人的想象。所以重点是制造一种&牛逼&的印象,而实际上牛不牛逼并不重要,牛逼更好,不牛逼也可。
如果你想走技术路线,可以考虑去找一份&建造大楼&级别的工作,在那里,技术成为决定产品成败的主要因素。这种级别的项目,一般只有大公司做的起。老板对于员工技术能力的评估,还是比较容易做到客观的,因为代码在那里,牛不牛逼,一运行便知。但是对于所谓&软实力&,往往就不好评判了,主观性很大。
也正因如此,往往有很多人觉得自己很牛逼,而老板不这么认为(错的不一定是老板,也可能是这个人自大),所以一怒之下走上创业的道路。自己给自己当老板,终于不用在意老板的印象和事实之间的差距。然而这条路往往更为艰难,它对人的综合素质要求比较高。如果一个程序员在工作中不能和同事顺利的合作,那很难想象他能够满足创业者所需要的各种素质。所以,要走这条路,得有心理准备。
技术是为人服务的,IT业的发展过程,是在逐步降低计算机的使用门槛,使得越来越多的人能够使用这种工具。这是好的,但它同时也降低了程序员这种职业的技术含量。如果真的想做技术,那么去做一些真正的技术。否则,就需要多多关注技术以外的东西,单纯寄希望于技术,只能用来安慰自己,而不能获得真正的职业发展。
&【编辑推荐】【责任编辑: TEL:(010)】
大家都在看猜你喜欢
外电头条头条外电外电
24H热文一周话题本月最赞
讲师:5人学习过
讲师:30人学习过
讲师:5人学习过
精选博文论坛热帖下载排行
全书分为基础篇、高级篇和应用篇3个部分,共18章,有重点、分层次地讲解SQL Server 2005的基础知识、高级使用技巧和项目应用方法。第1~10...
订阅51CTO邮刊1348人阅读
PS:CSDN的格式乱了,markDown的格式居然不起作用。。。改了不见任何效果,无力吐槽。。。。。
请移步查看原文
请移步查看原文
程序员是一个知识更新较为迅速的一个职业,这个行业的知识的更新速度,有的时候会超过你的学习速度。大部分的人都在不断的更新自己的知识体系,这里笔者要向读者安利一下机器学习(包含深度学习)的重要性,以及常见的知识。作为个人能力的提升,笔者觉得这一点是程序猿/媛,需要掌握的一想技能。
其实在互联网公司工作过的同学都应该有这样的感触,我们正在从IT到DT的转型,算法在应用中变得越来越重要了。
处在向DT转型中的我们也就理所当然的需要掌握DT的核心——算法。外界将大数据吵得如火如荼,但对于业内人来说,这些东西只是吵概念而已,简单的大数据是没有太大意义的,数据就好比是发动机运转需要的燃料,而算法则是发动机。只有有了发动机数据才能发挥它的价值。就像石油已经在地下沉睡千万年,在发动机产生前并没有人认识到它的价值,但发动机产生后,石油才成为像黄金一样珍贵的东西。所以我们必须掌握算法知识才能更好的驾驭DT这辆战车。
然而在实际的工作中所谓的算法工程师,实际上大部分应该叫做“算法应用工程师”,很少有算法工程师能够产生自己的算法。我这么说肯定有人要拍砖,但实际上确实是这样的。比如做一些分类问题用逻辑回归、SVM等常用算法,对于一些复杂问题,如图像分类用CNN处理,稍微复杂一点的NLP问题用RNN处理。很多算法工程师日常工作大部分用在数据处理、训练数据集选择、校验数据集选择等,不断的调节参数从而获得较好的效果。这里不是诋毁那些努力工作的算法同学,我在研究生的时候也是搞机器学习的,工作后,先搞工程、又混合着搞算法,如分类问题,类目映射(将A网站的商品映射到B网站的类目下)、接着搞NLP(基于RNN和CRF做slotfilling)…,接着又搞工程…。我想说的是算法没我们认为的那么复杂,但实际上又远比我们认识的复杂。
为什么说算法不复杂却又很复杂?其实这并不矛盾。说其不复杂是因为我们不必完全掌握背后复杂的公式推导,只需要知道背后的物理意义、知道响应的算法或模型适合处理的问题、知道如何调节相关的参数等即可。说其复杂是因为背后的推导确实很麻烦,就拿常用的SVM算法来说,读书的时候硬生生的是照着PPT推导了一周才推导成功(也反映出自己数学基础有点渣)…。继续说复杂性,要非常纯熟的掌握相应算法的核心,需要对线性代数、概率、微积分等重要的数学知识掌握和理解的较为透彻。这里不得不说我们的大学里相关的数学教育,感觉线性代数、概率、微积分讲得不彻底,只是学了知识点但背后的物理意义却没能讲清楚,比如矩阵相关运算的物理意义就是在实际的算法中才体会到的,数学真应该让计算机老师来讲。话说的有点多,但对于程序员来说我觉得数学知识必须要学的扎实,特别对于学校中的学生来说,其他课程可以不太用心,但数学相关必须牢牢地掌握,要用心,特别要掌握其背后的物理意义。
为什么我们要掌握算法呢?首先感觉是因为环境的变化,因为算法变得越来越重要,如之前的新闻,,google都已经走在前列了,也足见机器学习越来越重要了。现在很多产品,工程只是对算法进行包装,很多产品的核心是算法,如滴滴、Uber。
其次,工程师懂算法,真的有点像流氓会武术,谁也拦不住了。一方面增加自己的核心竞争力,另一方面在团队沟通的时候也更加方便。很多算法工程师的架构、系统能力不足,如果工程师懂得算法,那么可以和算法同学顺畅沟通,有助于产品或项目的实现。
最后,对于在校生、再找工作、毕业生或者刚工作的同学,能够掌握机器学习的基本知识能够增加你的核心竞争力,在竞争面前更容易脱颖而出(特别是在面试的时候,不一定要有实战经验,你能讲的清楚也是很不错的)。
总之,个人觉得,对于工程师而言,学习机器学习相关算法是提升个人核心竞争力的重要一步。那么接下来笔者就在这里进一步阐述作为工程师应该掌握哪些相关算法、如何去学习相关算法。
###2.基础知识
#####2.1 线性代数基础知识
个人觉得线性代数知识是在工作中用的最广的大学知识,特别是矩阵相关知识在实际应用中使用最为广泛。但从个人经验看,很多毕业生对于线性代数特别是矩阵相关知识掌握的很肤浅,对矩阵的理解很不到位,曾经问过一些毕业生,对于矩阵的SVD很多人会解,但背后的物理意义却模糊不清。
讲义链接:[Linear Algebra Review and Reference](/batbus/pdf/cs229-linalg.pdf)
#####2.2 概率基础知识
概率知识是也是实际工作中使用较为广泛的知识,从BAT的笔试题中可以看出,概率计算基本是逢考比用的。其中较为常用的就是贝叶斯定理了,在复习这部分的知识的时候,一定要弄清楚相关定理的前置条件。
讲义链接:[Review of Probability Theory](/batbus/pdf/cs229-prob.pdf)
#####2.3 凸优化
在许多机器学习算法中,我们最终是求一个目标函数的最大值或最小值,很多时候这种问题最终归咎为目标函数的优化问题,实质是一种凸优化问题,所以读者需要掌握一些凸优化问题的基础知识。
讲义链接:[Convex Optimization Overview](/batbus/pdf/cs229-cvxopt.pdf)
######注:讲义来源于Stanford深度学习与NLP课程前置基础知识
###3.应该了解哪些算法
这里不会对相关的算法做展开,只想从个人转型的经历向读者阐述,应该掌握哪些常见的机器学习算法,以及学习中应该注意的事项。相关的算法以及有很多博客可以参考,但个人觉得还是要先读一遍原论文,读不懂没关系,能理解多少理解多少,再参考别人写的解释理解一遍。如果直接读别人的博客,有可能被误导,之后再反过头来再读一读原论文,这样感觉理解的能好一些。当然也推荐大家直接学习Andrew Ng的公开课,讲的比较容易懂。而且已经好几年了,相关的讨论、讲义标注都很全面了,对于初学者来说是一个好的学习资源。
####3.1 常见的特征提取方法
其实特征选择(提取)是作为监督学习中特别重要的一个环节。往往我们要处理的问题可能供处理的特征特别多,我们减少特征的数量,比如图像处理,如果完全用像素,对于一张的图片,那么特征就是一个这种高维的特征,我们需要降低这个特征的维度,这个过程就叫做特征提取(选择)。对于图像我们常用sift特征。常用的降维方法包括(个人常用):
######1.PCA(主成分分析)
这是一种无监督的降维方法,准确的说应该是一种空间映射方法,PCA一次寻找一组正交的映射空间,并且使得能够在这个映射空间上方差最大。这个方法使用的频率较高,也比较典型,比较容易掌握。一般的教材书中都有相关的介绍,在Andrew Ng的课程中有相关介绍,可以直接学习。
######2.基于树的方法
这里吗需要读者理解一些常用的概念如”熵”,”信息增益”等,基于树的方法,可以通过剪枝的方式来去掉那些对于结果没什么大的影响的特征。这里面对于”熵”的理解,要强调一下,”熵”可以理解为不确定性,你可以认为是”商量”,熵越大,不确定性越高,就越需要”商量”,越小,代表确定性越高。关于树的相关方法,在国内的机器学习教材中都有明确的阐释。
######3.SVD(矩阵分解)
矩阵分解这是机器学习里面非常重要的一个线性代数知识,能够很好的起到降维的效果。在自然语言处理中较为常用。比如X是word-&document的矩阵,关于SVD虽然在公开课中有讲解,但感觉还是语言的理解有问题,理解的不是很透彻,发现这个哥们写的相关机器学习的博客讲的还都比较通透,所以读者可以参考他的这篇博文理解一下。
####3.2 常用机器学习算法
这里面会向读者介绍一下工作中常用的相关机器学习算法,当然这里也不会详细解释,这里只是告诉读者存在并且常用这些算法,笔试和面试中往往会考察面试者对于这些知识的掌握。对于如何学习,笔者觉得最好优先读paper,再看看公开课和相关博客。
##### 3.2.1 常见聚类算法
聚类算法是我们常用的算法其思想比较容易理解,符合大脑处理问题的思维逻辑。我们常见的聚类算法包括Kmeans、EM算法等,下面简单罗列一下:
SimpleKmeans算法:接受输入参数K,然后将数据集划分为K歌聚簇,同一个聚簇中的相似度较高,不同聚簇的相似度较小。
Xmeans算法:Kmeans的改进,在总体中通过Kmeans产生聚类,再分别对每个聚类进行Kmeas的迭代,将某些子类进行聚类,直到达到用户设定的次数为止。
EM算法:期望最大化算法(Expectation Maximization Algorithm),是一种迭代算法,用于含有隐变量(hidden variable)的概率参数模型的最大似然估计或极大后验概率估计。这里需要说下,EM算法背后的理论、推导最好好好掌握,这个掌握了,大部分的推导和理论基本都cover了。
相关博文:[常用聚类算法介绍之聚类种类和算法列表](/batbus/html/blog_detail.php?blog_id=250)
##### 3.2.2 常见分类、回归算法
分类和回归问题,其实可以拿到一起来讲。如果我的问题最终是要将待处理的数据明确分为若干类别(常用的有二元分类、多元分类),那么就是分类问题,如果最终需要映射到一个数值区间,那么就是回归问题,比如预测一个人犯罪的概率,如果需要判断是否犯罪,那么就是一个分类问题(是和否),如果要给个概率那么就是一个回归问题。
这里面我们常用的算法有SVM、LR、随机森林、朴素贝叶斯。
线性回归(Linear Regression):结果易于理解,计算上不复杂,但对非线性数据拟合不好。应该是线上应用最为广泛的模型,简约而不简单,更重要的是快!LR的推导是必须要掌握的!
SVM:通俗的讲,SVM是一种二类分类模型,其模型的定义为特征空间上的间隔最大的线性分类器。其学习策略是使得间隔最大化,最终可以转化为凸优化问题。简单的理解就是,在低维空间中难以划分的问题,将其映射到一个高维空间,在高维空间使得数据可以线性划分。
朴素贝叶斯:朴素贝叶斯是贝叶斯理论的一部分,是一种概率模型,即选择较高概率的决策。其前置条件是:
(1)每个特征之间相互独立。
(2)每个特征同等重要。
在数据较少的情况下仍然有效,可以处理多类别问题。但对于输入数据较为敏感。
随机森林(Random Forest):随机森林比较适合做多分类问题,其优点是:
训练和预测速度快;
对训练数据的容错能力好;
实现简单且易并行
当数据集中有大比例的数据缺失时仍然可以保持精度不变和能够有效地处理大的数据集;可以处理没有删减的成千上万的变量;能够在分类的过程中可以生成一个泛化误差的内部无偏估计;能够检测到特征之间的相互影响以及重要性程度。但容易出现过度拟合。
实际上该算法实际上可以理解为专投票算法,一个森林可以拆解成很多树,每个树都是一个决策算法,可以理解成一个领域专家,众多专家组合成一个森林,对于待处理的问题,专家组进行投票,最终少数服从多数,由票数决定结果。
####3.3 深度学习相关算法
深度学习是近几年较为火的一种学习方式,目前在实际工作中使用的越来越广,往往不需要较为复杂的调优就能达到其他常用的调优过后的机器学习算法达到的水平,也就是说,他的baseline很高,随着向caffee、tensorflow等框架使用的推广,这些深度模型实现起来越来越简单,所以工程师就越来越有必要掌握这些深度学习算法。你可以在机器上安装tensorflow就能够尝试在本机上进行手写体识别、word2Vector训练等,赶紧动起来吧。
关于学习,可以参考Stanford深度学习和NLP的公开课,讲的还比较透彻,但需要读者掌握在文章第二部分提到的一些数学知识。
##### 3.3.1 RNN(Recursive Neural Network)
RNN是较为常用的深度模型,常用的有两种变体,一种是时间递归神经网络(Recurrent neural network),另一种是结构递归神经网络(Recursive neural network)。时间递归神经网络的神经元间连接构成有向图,而结构递归神经网络利用相似的神经网络结构递归构造更为复杂的深度网络。两者训练的算法不同,但属于同一算法变体。
Recurrent是在时间维度的展开,能够有效的表示信息在时间维度上从前往后的的传递和积累,你可以和马尔科夫链做类比。
Recursive是在空间维度的展开,你可以认为他是一种结构上递归的结构,对应为棵树。在NLP领域用的较为广泛,能够很好的提取出结构信息,其示意图如下
二相比之下时间递归神经网络如下:
##### 3.3.2 RNN(Recurrent Neural Network)
常见的示意图如下所示,其核心就是每轮的运算都充分结合上一轮的迭代结果。
目前最为常见的时间递归神经网络就是LSTM(Long-Short-Term-Memories)。按照时间序列进行展开如下图
由上图可见一般包括书入门、忘记门、输出门,能够很好的学习当前特征同时兼顾上下文信息。目前较多的用于NLP范畴,其能够较好的保留上下文信息,这样在语义理解、摘要生成、情感分析等问题处理上都能得到一个较好的结果。
读者可以不去掌握其复杂的推导,但其背后的物理意义、这种思想是必须掌握的,应用的时候,大部分都是利用现有框架去处理。所以这里再强调一遍,如果精力有限那么就要重其意。
3.3.3 RNN模型比较
其实两种模型的区别在3.3.1中已经做了区分,这里按照Stanford深度学习和NLP课程中所述进行一下模型对比。
Recursive Neural Network:在语言层解释性较好,能够保留骨干信息,可应用在句法分析、短语识别。
Recurrent Neural Network: 在语意上解释性较好,很多人利用其做了很多好玩的,如自动写诗之类的,训练是一个个字符的读取后训练。通常情况下虽然不是最好的结果,但是结果也不差,特别是在引入了”门”之后,提示较为明显。
3.3.4 CNN(Convolutional Neural network)
卷积神经网络由于避免了对图像的复杂前期预处理,可以直接输入原始图像(需要尺寸format处理),因而得到了更为广泛的应用。
一般地,CNN的基本结构包括两层,其一为特征提取层,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其它特征间的位置关系也随之确定下来;其二是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等。
CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显示的特征抽取,而隐式地从训练数据中进行学习。
这里读者需要掌握卷积的物理意义、全链接和局部链接、知道为什么要池化、常见的池化方法等,这样对CNN就基本掌握了,剩下的就是应用了。
无论是学士还是已经工作的工程师,掌握一些机器学习算法,对于自己都是增加了自己的核心竞争力,在DT转型的过程中,会让自己走的更远。如今无论是Google、微软还是Amazon都在开放自己的机器学习平台,阿里云上的机器学习平台也可以直接使用,这些平台的开放大大降低了我们对于算法的使用难度,我们无需向那些真正的算法专家一样去发明算法,只要我们知其然、也知其所以然,就能够利用这些知识去解决实际问题。
对于还在学校里学习的同学要充分利用自己的时间,在数学基础上打捞,对常用的机器学习算法和深度学习算法都有所掌握。对于开源的tensorflow、caffee等代表性平台和框架,要勇于尝试,在未来的笔试和面试中一定会脱颖而出的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:105346次
积分:1756
积分:1756
排名:千里之外
原创:70篇
转载:10篇
评论:20条
(9)(3)(1)(1)(1)(1)(1)(2)(9)(14)(19)(15)(4)

我要回帖

更多关于 算法工程师待遇 的文章

 

随机推荐