精华内容
下载资源
问答
  • 嵌入式全年工程师他主要主要从事嵌入式软件开发工作。且涉及应用层以及底层软件开发和设计工作。
  • 想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是为大家整理的一些合格Java软件工程师所要具备的。   ​1、熟练的...

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是为大家整理的一些合格Java软件工程师所要具备的。

     

    ​1、熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的JavaAPI,包括I/O(NIO)、Socket、JDBC、XML、集合框架、多线程(并发编程)、反射等。

    2、熟悉基于JSP和Servlet的JavaWeb开发,熟练的使用JSTL和EL编写无脚本动态页面,对Servlet和JSP的工作原理和生命周期有深入了解,有使用监听器、过滤器等Web组件以及MVC架构模式进行JavaWeb项目开发经验。

    3、对Spring的IoC容器和AOP原理有深入了解,熟练的使用Spring进行事务、日志、安全性等的管理,熟练的运用Spring框架管理各种Web组件及其依赖关系,有使用SpringMVC作为表示层技术以及使用Spring提供的持久化支持进行Web项目开发的经验,熟悉Spring对其他框架的整合。

    4、熟悉Hibernate和MyBatis的核心API,熟练的使用Hibernate、MyBatis等ORM框架,对Hibernate的关联映射、继承映射、组件映射、缓存机制、事务管理以及性能调优等有深入的理解。

    5、熟练的使用HTML、CSS和JavaScript进行Web前端开发,熟悉jQuery和Bootstrap,有使用前端MVC框架(AngularJS)和JavaScript模板引擎(HandleBars)进行项目开发的经验,对Ajax技术在Web项目中的应用有深入理解。

    6、熟练的使用SQL和PL/SQL进行数据库编程,熟悉常用的关系型数据库产品(MySQL、Oracle)。

    7、熟悉面向对象的设计原则,熟练的使用UML进行面向对象的分析和设计,有TDD(测试驱动开发)和DDD(领域驱动设计)的经验,对GoF设计模式和企业应用架构模式有深入的了解和实际开发的相关经验。

    8、熟悉Apache、NginX、Tomcat、WildFly、Weblogic等Web服务器和应用服务器的使用,熟悉多种服务器整合、集群和负载均衡的配置。

    9、熟练的使用产品原型工具Axure,熟练的使用设计建模工具PowerDesigner和EnterpriseArchitect,熟练的使用Java开发环境Eclipse和IntelliJ,熟练的使用前端开发环境WebStorm,熟练的使用软件版本控制工具SVN和Git,熟练的使用项目构建和管理工具Maven和Gradle。说明:上面罗列的这些东西并不是每一项你都要烂熟于心,根据企业招聘的具体要求可以做相应的有针对性的准备。但是前6项应该是最低要求,是作为一个Java软件工程师必须要具备的专业技能。

     

    每天都在分享文章,也每天都有人想要我出来给大家分享下怎么去学习Java。大家都知道,我们是学Java全栈的,大家就肯定以为我有全套的Java系统教程。没错,我是有Java全套系统教程,进扣裙【47】974【9726】所示,今天小编就免费送!~

    后记:对于大部分转行的人来说,找机会把自己的基础知识补齐,边工作边补基础知识,真心很重要。

    “我们相信人人都可以成为一个程序员,现在开始,找个师兄,带你入门,学习的路上不再迷茫。这里是ja+va修真院,初学者转行到互联网行业的聚集地。"

    展开全文
  • 推荐系统工程师成长路线图 《 Item-based collaborative filtering recommendation algorithms》这篇文章发表于2001年,在Google学术上显示,其被引用次数已经是6599了,可见其给推荐系统带来的影响之大。 经过20...

    本文转载自《程序员》杂志2017年11月期

    推荐系统工程师成长路线图

    《 Item-based  collaborative  filtering recommendation algorithms》这篇文章发表于2001年,在Google学术上显示,其被引用次数已经是6599了,可见其给推荐系统带来的影响之大。 经过20多年的发展,item-based已经成为推荐系统的标配,而推荐系统已经成为互联网产品的标配。很多产品甚至在第一版就要被投资人或者创始人要求必须“个性化”,可见,推荐系统已经飞入寻常百姓家,作为推荐系统工程师的成长也要比从前更容易,要知道我刚工作时,即使跟同为研发工程师的其他人如PHP工程师(绝无黑的意思,是真的)说“我是做推荐的”,他们也一脸茫然,不知道“推荐”为什么是一个工程师岗位。如今纵然“大数据”, “AI”,这些词每天360度无死角轰炸我们,让我们很容易浮躁异常焦虑不堪,但不得不承认,这是作为推荐系统工程师的一个好时代。
    推荐系统工程师和正常码农们相比,无需把PM们扔过来的需求给像素级实现,从而堆码成山;和机器学习研究员相比,又无需沉迷数学推导,憋出一个漂亮自洽的模型,一统学术界的争论;和数据分析师相比,也不需绘制漂亮的图表,做出酷炫的PPT能给CEO汇报,走上人生巅峰。那推荐系统工程师的定位是什么呢?为什么需要前面提到 的那些技能呢?容我结合自身经历来一一解答。

    我把推荐系统工程师的技能分为四个维度:
    ■ 掌握核心原理的技能,是一种知其所以然的基础技能;
    ■ 动手能力:实现系统,检验想法,都需要扎实的工程能力;
    ■ 为效果负责的能力:这是推荐系统工程师和其他工种的最大区别;
    ■ 软技能:任何工程师都需要自我成长,需要团队协作。
     英文阅读:读顶级会议的论文、一流公司和行业前辈的经典论文和技术博客,在Quora和 Stack Overflow上和人交流探讨;
     代码阅读:能阅读开源代码,从中学习优秀项目对经典算法的实现;
     沟通表达:能够和其他岗位的人员沟通交流,讲明白所负责模块的原理和方法,能听懂非技术人员的要求和思维,能分别真伪需求并且能达成一致。

    掌握最最基础的原理

    托开源的福气,现在有很多开箱即用的工具让我们很容易搭建起一个推荐系统。但是浮沙上面筑不起高塔,基础知识必须要有,否则就会在行业里面,被一轮轮概念旋风吹得找不着北。所有基础里面,最最基础的当然就是数学了。
    能够看懂一些经典论文对于实现系统非常有帮助:从基本假设到形式化定义,从推导到算法流程,从实验设计到结果分析。这些要求我们对于微积分有基本的知识,有了基本的微积分知识才能看懂梯度下降等基本的优化方法。概率和统计知识给我们建立起一个推荐系统工程师最基本的三观:不要以是非绝对的眼光看待事物,要有用不确定性思维去思考产品中的每一个事件,因为实现推荐系统,并不是像实现界面上一个按钮的响应事件那样明确可检验。大数据构建了一个高维的数据空间,从数据到推荐目标基本上都可以用矩阵的角度去形式化,比如常见的推荐算法: 协同过滤、矩阵分解。而机器学习算法,如果用矩阵运算角度去看,会让我们更加能够理解“向量化计算”和传统软件工程里面的循环之间的巨大差异。高维向量之间的点积,矩阵之间的运算,如 果用向量化方式实现比用循环方式实现,高效不少。建立这样的思维模式,也需要学好线性代数。
    学好基础的数学知识之外,我们要稍微延伸学习 一些信息科学的基础学科,尤其是信息论。信息论是构建在概率基础上的,信息论给了很多计算机领域问题一个基本的框架:把问题看做是通信问题。推荐系统要解决的问题也是一个通信问题: 用户在以很不明确的方式向我们的产品发报,告诉我们他最喜欢/讨厌的是什么,我们在收到了之后要解码,并且还要给他们回信,如果沟通不顺畅,那用户就会失联。我的专业是信息与通信工 程。读研时从事过NLP相关的课题研究,NLP里面很多问题和方法都用到了信息论知识,这样让我深受信息论影响。有了这些基础知识,再去跟踪不断涌现的新算法新模型,就会容易得多。
    推荐系统会用到很多传统数据挖掘和机器学习方法。掌握经典的机器学习算法是一个事半功倍的事情,比如逻辑回归,是一个很简单的分类算法, 但它在推荐领域应用之广,其他算法无出其右。 在吴恩达的深度学习课程里,从逻辑回归入手逐渐讲到多层神经网络,讲到更复杂的RNN等。应该怎么掌握这些经典的算法呢?最直接的办法是:自己从0实现一遍。
    推荐系统不只是模型,推荐系统是一整个数据处理流程,所以模型的上游,就是一些数据挖掘的知识也需要掌握,基本的分类聚类知识,降维知识,都要有所掌握。

    锻炼扎实的工程能力

    前面强调自己实现算法对于掌握算法的必要性, 但在实际开发推荐系统的时候,如无必要,一 定不要重复造轮子。推荐系统也是一个软件系统,当然要稳定要高效。开源成熟的轮子当然是首选。实现推荐系统,有一些东西是common sense,有一些是好用的工具,都有必要列出来。 首当其冲的常识就是Linux操作系统。由于Windows在PC的市场占率的垄断地位,导致很多软件工程师只会在Windows下开发,这是一个非常普遍、严重、又容易被忽视的短板。我自己深有体会,一定要熟练地在Linux下的用命令行编程,如果你的个人电脑是Mac,会好很多,因为macOS底层是Unix操作系统,和Linux是近亲,用Mac的终端基本上类似在Linux下的命令行,如果不是则一定要有自己的Linux环境供自己平时练习,买一台常备的云服务器是一个不错的选择。 这里有两个关键点:

    ■ 用Linux操作系统;
    ■ 多用命令行而少用IDE(Eclipse、VS等)。
    为什么呢?有以下三点原因:
    ■ 几乎所有推荐系统要用到的开源工具都是首先 在Linux下开发测试完成的,最后再考虑移植到 Windows平台上(测试不充分或者根本不移植);
    ■ 键盘比鼠标快,用命令行编程会多用键盘,少用鼠标,熟悉之后效率大大提升。而且Linux下的命令非常丰富,处理的也都是标准文本,掌握之后很多时候根本不用写程序就能做很多数据处理工作。
    ■ 几乎Linux是互联网公司的服务器操作系统标配,不会Linux下的开发,就找不着工作,就问你怕不怕?
    常常有人问我,实现推荐系统用什么编程语言比较好。标准的官方回答是:用你擅长的语言。但我深知这个回答不会解决提问者的疑问。实际上我的建议是:你需要掌握一门编译型语言:C++或者Java,然后掌握一门解释型语言,推荐Python或者R。原因如下:
    ■ 推荐系统的开源项目中以这几种语言最常见;
    ■ 快速的数据分析和处理、模型调试、结果可视化、系统原型实现等,Python和R是不错的选择,尤其是Python;
    ■ 当Python在一些地方有效率瓶颈时,通常是用 C++实现,再用Python调用;
    ■ Java在构建后台服务时很有优势,一些大数据 开源项目也多用Java来实现;
    如果时间有限,只想掌握一门语言的话,推荐Python。从模型到后端服务到web端,都可以用Python,毋庸置疑,Python是AI时代第一编程语言。
    推荐系统是一个线上的产品,无论离线时的模型跑得多么爽,可视化多么酷炫,最终一定要做成在线服务才完整。这就涉及到两方面的工作:1. 系统原型; 2. 算法服务化 。这涉及到:
    ■ 数据存储。包括存储模型用于在线实时计算, 存储离线计算好的推荐结果。除了传统的关系型数据库MySQL之外,还需要掌握非关系型数据库,如KV数据库Redis,列式数据库Cassandra和 HBase常常用来存储推荐结果或模型参数。推荐的候选Item也可能存在MongoDB中。
    ■ RPC和web。需要将自己的算法计算模块以服务的形式提供给别人跨进程跨服务器调用,因此 RPC框架就很重要,最流行如thrift或者dubbo。在RPC服务之上,再做原型还需要会一点基本的web开发知识,Python、PHP、Java都有相应的 web框架来迅速的完成最基本的推荐结果展示。
    当然,最核心的是算法实现。以机器学习算法为主。下面详细列举一下常见的机器学习/深度学习工具:
    ■ Spark MLib:大概是使用最广的机器学习工具了,因为Spark普及很广,带动了一个并非其最核心功能的MLib,MLib实现了常见的线性模型、 树模型和矩阵分解模型等。提供Scala、Java和 Python接口,提供了很多例子,学习Spark MLib很
    值得自己运行它提供的例子,结合文档和源代码 学习接口的使用,模型的序列化和反序列化。
    ■ GraphLab/GraphCHI:GraphCHI是开源的单机版,GraphLab是分布式的,但并不开源。所以建议推荐系统工程师重点学习一下GraphCHI,它有 Java和C++两个版本,实现了常见的推荐算法,并在单机上能跑出很高的结果。有一个不得不承认的事实是:GraphCHI和GraphLab在业界应用得并不广泛。
    ■ Angel:腾讯在2017年开源的分布式机器学习平台,Java和Scala开发而成,已经在腾讯的10亿维度下有工业级别的应用,最终的是填补了专注传统机器学习(相对于深度学习)分布式计算的空白,值得去学习一下;由于开发团队是中国人,所以文档以中文为主,学习的时候多多和开发团队交流会受益良多,进步神速。
    ■ VW:这是Yahoo开源的一个分布式机器学工 具,也支持单机,分布式需要借助Hadoop实现。
    由于主要开发者后来跳槽去了微软,所以还支持 Windows平台。阅读这个工具的源码,非常有助于理解逻辑回归的训练,微博推荐团队和广告团队第一版模型训练都采用了VW,其开发者在 Yahoo Group中回答问题很积极,使用期间,我在这个group里面提了大大小小十几个问题,基本上都得到解答,这是一个学习成长方法,建议新学者常常在邮件组或者讨论组里提问题,不要在乎 问题是否愚蠢,不要在意别人的取笑。
    ■ Xgboost:这个号称kaggle神器的机器学习工具,非常值得学习和使用,尤其是对于理解 Boosting和树模型很有帮助。网上有很多教程,主要开发者陈天奇也是中国人,所以遇到问题是非常容易找到交流的人的。
    ■ libxxx:这里的xxx是一个通配符,包括以lib开头的各种机器学习工具,如liblinear、libsvm、 libfm、libmf。都是单机版的工具,虽然是单机版,但足够解决很多中小型数据集的推荐问题了,著名的scikit-learn中的一些分类算法就是封装的libsvm等工具。另外,libsvm不但是一个机器学习工具,而且它还定义了一种应用广泛,成为事实标准的机器学习训练数据格式:libsvm。
    ■ MXNet,TensorFlow,Caffe:深度学习大行其道,并且在识别问题上取到了惊人的效果,自然也间接推动了推荐系统的算法升级,因此, 掌握深度学习工具的就很必要,其中尤其以 TensorFlow为主,它不但有深度学习模型的实现,还有传统机器学习模型的实现,Python接口, 对于掌握Python的人来说学习门槛很低。深度学习工具仍然建议去跑几个例子,玩一些有趣的东 西会快速入门,如给照片换风格,或者训练一个动物/人脸识别器,可以有一些粗浅的认识。再系统地学习一下吴恩达的在线课程,他的课程对TensorFlow的使用也有讲解,课后编程作业设计得也很好。

    为最终效果负责的能力

    推荐系统最终要为产品效果负责。衡量推荐系统 效果,分为离线和在线两个阶段。
    ■ 离线阶段。跑出一些模型,会有定义清晰的指 标去衡量模型本身对假设的验证情况,如准确率、召回率、AUC等。这个阶段的效果好,只能说明符合预期假设,但不能保证符合产品最终效果,因此还要有线上实际的检验。
    ■ 在线阶段:除了有一些相对通用的指标,如用户留存率、使用时长、点击率等,更多的是和产品本身的定位息息相关,如短视频推荐关注vv,新闻推荐关注CTR等,这些和商业利益结合更紧密的指标才是最终检验推荐系统效果的指标,推荐系统工程师要为这个负责,而不能仅仅盯着离线 部分和技术层面的效果。了解不同产品的展现形式对推荐系统实现的要求,feed流、相关推荐、猜你喜欢等不同产品背后技术要求不同,效果考核不同,多观察、多使用、 多思考。
    最后,要学会用产品语言理解产品本身,将技术能力作为一种服务输出给团队其他成员是一项软技能。

    推荐系统领域现状

    协同过滤提出于90年代,至今二十几年,推荐系统技术上先后采用过近邻推荐、基于内容的推荐,以矩阵分解为代表的机器学习方法推荐,最近几年深度学习的火热自然也给推荐系统带来了明显的提升。推荐系统的作用无人质疑,简单举几个例子,80%的Netflix电影都是经由推荐系统被观众观看的,YouTube上60%的点击事件是由推荐系统贡献的。
    推荐系统领域现状是怎么样的呢?这里分别从技术上和产品上来看一看。先看技术上,推荐系统所依赖的技术分为三类:传统的推荐技术、深度学习、强化学习。
    首先,传统的推荐技术仍然非常有效。构建第一 版推荐系统仍然需要这些传统推荐系统技术,这包括:User-based和Item-based近邻方法,以文本为主要特征来源的基于内容推荐,以矩阵分解为代表的传统机器学习算法。当一个互联网产品的用户行为数据积累到一定程度,我们用这些传统推荐算法来构建第一版推荐系统,大概率上会取得不俗的成绩,实现0的突破。这类传统的推荐算法已经积累了足够多的实践经验和开源实现。由于对推荐系统的需求比以往更广泛,并且这些技术足够成熟,所以这类技术有SaaS化的趋势,逐渐交给专门的第三方公司来做,中小型、垂直公司不会自建团队来完成。
    深度学习在识别问题上取得了不俗的成绩,自然就被推荐系统工程师们盯上了,已经结合到推荐系统中,比如YouTube用DNN构建了他们的视频推荐系统,Google在Google Play中 使用Wide&Deep模型,结合了浅层的logistic regression模型和深层模型进行CTR预估,取得了比单用浅层模型或者单独的深层模型更好的效果,Wide&Deep模型也以开源的方式集成在了TensorFlow中,如今很多互联网公司,都在广泛使用这一深度学习和浅层模型结合的模型。在 2014年,Spotify就尝试了RNN在序列推荐上,后 来RNN又被Yahoo News的推荐系统。传统推荐算法中有一个经典的算法叫做FM,常用于做CTR预估,算是一种浅层模型,最近也有人尝试了结合深度学习,提出DeepFM模型用于CTR预估。 AlphaGo、Alpha Master、Alpha Zero一个比一个厉害,其开挂的对弈能力,让强化学习进入大众视线。强化学习用于推荐系统是一件很自然的事情,把用户看做变化的环境,而推荐系统是 Agent,在和用户的不断交互之间,推荐系统就从一脸懵逼到逐渐“找到北”,迎合了用户兴趣。 业界已有应用案例,阿里的研究员仁基就公开分享过淘宝把强化学习应用在搜索推荐上的效果。 强化学习还以bandit算法这种相对简单的形式应用在推荐系统很多地方,解决新用户和新物品的 冷启动,以及取代ABTest成为另一种在线实验的框架。
    除了技术上推荐系统有不同侧重,产品形式上也有不同的呈现。最初的推荐系统产品总是存活在 产品的边角上,如相关推荐,这种产品形式只能 算是“锦上添花”,如果推荐系统不小心开了天窗,也不是性命攸关的问题。如今推荐产品已经演化成互联网产品的主要承载形式:信息流。从最早的社交网站动态,到图文信息流,到如今的短视频。信息流是一种推荐系统产品形式,和相关推荐形式比起来,不再是锦上添花,而是注意力收割利器。
    推荐系统产品形式的演进,背景是互联网从PC到 移动的演进,PC上是搜索为王,移动下是推荐为王,自然越来越重要。随着各种可穿戴设备的丰富,越来越多的推荐产品还会涌现出来。产品和技术相互协同发展,未来会有更多有意思的推荐算法和产品形式问世,成为一名推荐系统工程师永远都不晚。

    陈开江 
    希为科技CTO,曾任新浪微博资深算法工 程师,考拉FM算法主管,个性化导购App 《Wave》和《边逛边聊》联合创始人,多年推荐系统从业经历,在算法、架构、产品方面均有丰富的实践经验。

     

    展开全文
  • 成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试到优化等一系列能力,这些能力中的每一项掌握起来都需要足够的努力和经验。而要成为一名合格的机器学习算法工程师(以下简称算法工程师)更是...

    成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试到优化等一系列能力,这些能力中的每一项掌握起来都需要足够的努力和经验。而要成为一名合格的机器学习算法工程师(以下简称算法工程师)更是难上加难,因为在掌握工程师的通用技能以外,还需要掌握一张不算小的机器学习算法知识网络。下面我们就将成为一名合格的算法工程师所需的技能进行拆分,一起来看一下究竟需要掌握哪些技能才能算是一名合格的算法工程师。





    1. 基础开发能力


    所谓算法工程师,首先需要是一名工程师,那么就要掌握所有开发工程师都需要掌握的一些能力。有些同学对于这一点存在一些误解,认为所谓算法工程师就只需要思考和设计算法,不用在乎这些算法如何实现,而且会有人帮你来实现你想出来的算法方案。这种思想是错误的,在大多数企业的大多数职位中,算法工程师需要负责从算法设计到算法实现再到算法上线这一个全流程的工作。笔者曾经见过一些企业实行过算法设计与算法实现相分离的组织架构,但是在这种架构下,说不清楚谁该为算法效果负责,算法设计者和算法开发者都有一肚子的苦水,具体原因不在本文的讨论范畴中,但希望大家记住的是,基础的开发技能是所有算法工程师都需要掌握的。


    基础开发所涉及到的技能非常的多,在这里只挑选了两个比较重要的点来做阐述。


    2. 单元测试


    在企业应用中,一个问题的完整解决方案通常包括很多的流程,这其中每个环节都需要反复迭代优化调试,如何能够将复杂任务进行模块划分,并且保证整体流程的正确性呢?最实用的方法就是单元测试。单元测试并不只是简单的一种测试技能,它首先是一种设计能力。并不是每份代码都可以做单元测试,能做单元测试的前提是代码首先是可以划分为多个单元——也就是模块的。在把项目拆解成可独立开发和测试的模块之后,再加上对每个模块的独立的、可重复的单元测试,就可以保证每个模块的正确性,如果每个模块的正确性都可以保证,那么整体流程的正确性就可以得到保证。


    对于算法开发这种流程变动频繁的开发活动来讲,做好模块设计和单元测试是不给自己和他人挖坑的重要保证。也是能让自己放心地对代码做各种改动优化的重要前提。




    3. 逻辑抽象复用


    逻辑的抽象复用可以说是所有软件开发活动中最为重要的一条原则,衡量一个程序员代码水平的重要原则之一就是看他代码中重复代码和相似代码的比例。大量重复代码或相似代码背后反映的是工程师思维的懒惰,因为他觉得复制粘贴或者直接照着抄是最省事的做法。这样做不仅看上去非常的丑陋,而且也非常容易出错,更不用提维护起来的难度。


    算法开发的项目中经常会有很多类似逻辑的出现,例如对多个特征使用类似的处理方法,还有原始数据ETL中的很多类似处理方法。如果不对重复逻辑做好抽象,代码看上去全是一行行的重复代码,无论是阅读起来还是维护起来都会非常麻烦。


    4. 概率和统计基础


    概率和统计可以说是机器学习领域的基石之一,从某个角度来看,机器学习可以看做是建立在概率思维之上的一种对不确定世界的系统性思考和认知方式。学会用概率的视角看待问题,用概率的语言描述问题,是深入理解和熟练运用机器学习技术的最重要基础之一。


    概率论内容很多,但都是以具体的一个个分布为具体表现载体体现出来的,所以学好常用的概率分布及其各种性质对于学好概率非常重要。对于离散数据,伯努利分布、二项分布、多项分布、Beta分布、狄里克莱分布以及泊松分布都是需要理解掌握的内容;对于离线数据,高斯分布和指数分布族是比较重要的分布。这些分布贯穿着机器学习的各种模型之中,也存在于互联网和真实世界的各种数据之中,理解了数据的分布,才能知道该对它们做什么样的处理。


    此外,假设检验的相关理论也需要掌握。在这个所谓的大数据时代,最能骗人的大概就是数据了,掌握了假设检验和置信区间等相关理论,才能具备分辨数据结论真伪的能力。例如两组数据是否真的存在差异,上线一个策略之后指标是否真的有提升等等。这种问题在实际工作中非常常见,不掌握相关能力的话相当于就是大数据时代的睁眼瞎。


    在统计方面,一些常用的参数估计方法也需要掌握,典型的如最大似然估计、最大后验估计、EM算法等。这些理论和最优化理论一样,都是可以应用于所有模型的理论,是基础中的基础。



    5. 机器学习理论


    虽然现在开箱即用的开源工具包越来越多,但并不意味着算法工程师就可以忽略机器学习基础理论的学习和掌握。这样做主要有两方面的意义:


    掌握理论才能对各种工具、技巧灵活应用,而不是只会照搬套用。只有在这个基础上才能够真正具备搭建一套机器学习系统的能力,并对其进行持续优化。否则只能算是机器学习搬砖工人,算不得合格的工程师。出了问题也不会解决,更谈不上对系统做优化。


    学习机器学习的基础理论的目的不仅仅是学会如何构建机器学习系统,更重要的是,这些基础理论里面体现的是一套思想和思维模式,其内涵包括概率性思维、矩阵化思维、最优化思维等多个子领域,这一套思维模式对于在当今这个大数据时代做数据的处理、分析和建模是非常有帮助的。如果你脑子里没有这套思维,面对大数据环境还在用老一套非概率的、标量式的思维去思考问题,那么思考的效率和深度都会非常受限。


    机器学习的理论内涵和外延非常之广,绝非一篇文章可以穷尽,所以在这里我列举了一些比较核心,同时对于实际工作比较有帮助的内容进行介绍,大家可在掌握了这些基础内容之后,再不断探索学习。


    6. 基础理论


    所谓基础理论,指的是不涉及任何具体模型,而只关注“学习”这件事本身的一些理论。以下是一些比较有用的基础概念:


    VC维。VC维是一个很有趣的概念,它的主体是一类函数,描述的是这类函数能够把多少个样本的所有组合都划分开来。VC维的意义在哪里呢?它在于当你选定了一个模型以及它对应的特征之后,你是大概可以知道这组模型和特征的选择能够对多大的数据集进行分类的。此外,一类函数的VC维的大小,还可以反应出这类函数过拟合的可能性。


    信息论。从某种角度来讲,机器学习和信息论是同一个问题的两个侧面,机器学习模型的优化过程同时也可以看作是最小化数据集中信息量的过程。对信息论中基本概念的了解,对于机器学习理论的学习是大有裨益的。例如决策树中用来做分裂决策依据的信息增益,衡量数据信息量的信息熵等等,这些概念的理解对于机器学习问题神本的理解都很有帮助。这部分内容可参考《Elements of Information Theory》这本书。


    正则化和bias-variance tradeoff。如果说现阶段我国的主要矛盾是“人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾”,那么机器学习中的主要矛盾就是模型要尽量拟合数据和模型不能过度拟合数据之间的矛盾。而化解这一矛盾的核心技术之一就是正则化。正则化的具体方法不在此讨论,但需要理解的,是各种正则化方法背后透露出的思想:bias-variance tradoff。在不同利益点之间的平衡与取舍是各种算法之间的重要差异,理解这一点对于理解不同算法之间的核心差异有着非常重要的作用。


    最优化理论。绝大多数机器学习问题的解决,都可以划分为两个阶段:建模和优化。所谓建模就是后面我们会提到的各种用模型来描述问题的方法,而优化就是建模完成之后求得模型的最优参数的过程。机器学习中常用的模型有很多,但背后用到的优化方法却并没有那么多。换句话说,很多模型都是用的同一套优化方法,而同一个优化方法也可以用来优化很多不同模型。对各种常用优化方法的和思想有所有了解非常有必要,对于理解模型训练的过程,以及解释各种情况下模型训练的效果都很有帮助。这里面包括最大似然、最大后验、梯度下降、拟牛顿法、L-BFGS等。


    机器学习的基础理论还有很多,可以先从上面的概念学起,把它们当做学习的起点,在学习过程中还会遇到其他需要学习的内容,就像一张网络慢慢铺开一样,不断积累自己的知识。这方面基础理论的学习,除了Andrew Ng的著名课程以外,《Learning from Data》这门公开课也非常值得大家学习,这门课没有任何背景要求,讲授的内容是在所有模型之下的基础中的基础,非常地靠近机器学习的内核本质。这门课的中文版本叫做《机器学习基石》,也可以在网上找到,其讲授者是上面英文版本讲授者的学生。




    7. 有监督学习


    在了解了机器学习的基本概念之后,就可以进入到一些具体模型的学习中了。在目前的工业实践中,有监督学习的应用面仍然是最广泛的,这是因为我们现实中遇到的很多问题都是希望对某个事物的某个属性做出预测,而这些问题通过合理的抽象和变换,都可以转化为有监督学习的问题。


    在学习复杂模型之前,我建议大家都先学习几个最简单的模型,典型的如朴素贝叶斯。朴素贝叶斯有很强的假设,这个假设很多问题都不满足,模型结构也很简单,所以其优化效果并不是最好的。但也正是由于其简单的形式,非常利于学习者深入理解整个模型在建模和优化过程中的每一步,这对于搞清楚机器学习是怎么一回事情是非常有用的。同时,朴素贝叶斯的模型形式通过一番巧妙的变换之后,可以得到和逻辑回归形式上非常统一的结果,这无疑提供了对逻辑回归另外一个角度的解释,对于更加深刻理解逻辑回归这一最常用模型有着非常重要的作用。


    在掌握了机器学习模型的基础流程之后,需要学习两种最基础的模型形式:线性模型和树形模型,分别对应着线性回归/逻辑回归和决策回归/分类树。现在常用的模型,无论是浅层模型还是深度学习的深层模型,都是基于这两种基础模型形式变幻而来。而学习这两种模型的时候需要仔细思考的问题是:这两种模型的本质差异是什么?为什么需要有这两种模型?他们在训练和预测的精度、效率、复杂度等方面有什么差异?了解清楚这些本质的差异之后,才可以做到根据问题和数据的具体情况对模型自如运用。


    在掌握了线性模型和树形模型这两种基础形式之后,下一步需要掌握的是这两种基础模型的复杂形式。其中线性模型的复杂形式就是多层线性模型,也就是神经网络。树模型的复杂形式包括以GDBT为代表的boosting组合,以及以随机森林为代表的bagging组合。这两种组合模型的意义不仅在于模型本身,boosting和bagging这两种组合思想本身也非常值得学习和理解,这代表了两种一般性的强化方法:boosting的思想是精益求精,不断在之前的基础上继续优化;而bagging的思想是“三个臭裨将顶一个诸葛亮”,是通过多个弱分类器的组合来得到一个强分类器。


    这两种组合方法各有优劣,但都是在日常工作中可以借鉴的思想。例如在推荐系统中所我们经常会使用多个维度的数据做召回源,从某个角度来看就是一种bagging的思想:每个单独召回源并不能给出最好表现,但是多个召回源组合之后,就可以得到比每个单独召回源都要好的结果。所以说思想比模型本身更重要。




    8. 无监督学习


    有监督学习虽然目前占了机器学习应用的大多数场景,但是无监督学习无论从数据规模还是作用上来讲也都非常的重要。无监督学习的一大类内容是在做聚类,做聚类的意义通常可以分为两类:一类是将聚类结果本身当做最终的目标,另一类是将聚类的结果再作为特征用到有监督学习中。但这两种意义并不是和某种聚类方法具体绑定,而只是聚类之后结果的不同使用方式,这需要在工作中不断学习、积累和思考。而在入门学习阶段需要掌握的,是不同聚类算法的核心差异在哪里。例如最常用的聚类方法中,kmeans和DBSCAN分别适合处理什么样的问题?高斯混合模型有着什么样的假设?LDA中文档、主题和词之间是什么关系?这些模型最好能够放到一起来学习,从而掌握它们之间的联系和差异,而不是把他们当做一个个孤立的东西来看待。


    除了聚类以外,近年来兴起的嵌入表示(embedding representation)也是无监督学习的一种重要方法。这种方法和聚类的差异在于,聚类的方法是使用已有特征对数据进行划分,而嵌入表示则是创造新的特征,这种新的特征是对样本的一种全新的表示方式。这种新的表示方法提供了对数据全新的观察视角,这种视角提供了数据处理的全新的可能性。此外,这种做法虽然是从NLP领域中兴起,但却具有很强的普适性,可用来处理多种多样的数据,都可以得到不错的结果,所以现在已经成为一种必备的技能。


    机器学习理论方面的学习可以从《An Introduction to Statistical Learning with Application in R》开始,这本书对一些常用模型和理论基础提供了很好的讲解,同时也有适量的习题用来巩固所学知识。进阶学习可使用上面这本书的升级版《Elements of Statistical Learning》和著名的《Pattern Recognition and Machine Learning》。


    9. 开发语言和开发工具


    掌握了足够的理论知识,还需要足够的工具来将这些理论落地,这部分我们介绍一些常用的语言和工具。


    • 开发语言


    近年来Python可以说是数据科学和算法领域最火的语言,主要原因是它使用门槛低,上手容易,同时具有着完备的工具生态圈,同时各种平台对其支持也比较好。所以Python方面我就不再赘述。但是在学习Python以外,我建议大家可以再学习一下R语言,主要原因有以下几点:


    R语言具有最完备的统计学工具链。我们在上面介绍了概率和统计的重要性,R语言在这方面提供的支持是最全面的,日常的一些统计方面的需求,用R来做可能要比用Python来做还要更快。Python的统计科学工具虽然也在不断完善,但是R仍然是统计科学最大最活跃的社区。


    **向量化、矩阵化和表格化思维的培养。**R中的所有数据类型都是向量化的,一个整形的变量本质上是一个长度为一的一维向量。在此基础上R语言构建了高效的矩阵和(DataFrame)数据类型,并且在上面支持了非常复杂而又直观的操作方法。这套数据类型和思考方式也在被很多更现代化的语言和工具所采纳,例如Numpy中的ndarray,以及Spark最新版本中引入的DataFrame,可以说都是直接或间接从R语言得到的灵感,定义在上面的数据操作也和R中对DataFrame和向量的操作如出一辙。就像学编程都要从C语言学起一样,学数据科学和算法开发我建议大家都学一下R,学的既是它的语言本身,更是它的内涵思想,对大家掌握和理解现代化工具都大有裨益。


    除了R以外,Scala也是一门值得学习的语言。原因在于它是目前将面向对象和函数式两种编程范式结合得比较好的一种语言,因为它不强求你一定要用函数式去写代码,同时还能够在能够利用函数式的地方给予了足够的支持。这使得它的使用门槛并不高,但是随着经验和知识的不断积累,你可以用它写出越来越高级、优雅的代码。


    • 开发工具


    开发工具方面,Python系的工具无疑是实用性最高的,具体来说,Numpy、Scipy、sklearn、pandas、Matplotlib组成的套件可以满足单机上绝大多数的分析和训练工作。但是在模型训练方面,有一些更加专注的工具可以给出更好的训练精度和性能,典型的如LibSVM、Liblinear、XGBoost等。


    大数据工具方面,目前离线计算的主流工具仍然是Hadoop和Spark,实时计算方面Spark Streaming和Storm也是比较主流的选择。近年来兴起的新平台也比较多,例如Flink和Tensorflow都是值得关注的。值得一提的是,对于Hadoop和Spark的掌握,不仅要掌握其编码技术,同时还要对其运行原理有一定理解,例如,Map-Reduce的流程在Hadoop上是如何实现的,Spark上什么操作比较耗时,aggregateByKey和groupByKey在运行原理上有什么差异,等等。只有掌握了这些,才能对这些大数据平台运用自如,否则很容易出现程序耗时过长、跑不动、内存爆掉等等问题。


    10. 架构设计


    最后我们花一些篇幅来谈一下机器学习系统的架构设计。所谓机器学习系统的架构,指的是一套能够支持机器学习训练、预测、服务稳定高效运行的整体系统以及他们之间的关系。在业务规模和复杂度发展到一定程度的时候,机器学习一定会走向系统化、平台化这个方向。这个时候就需要根据业务特点以及机器学习本身的特点来设计一套整体架构,这里面包括上游数据仓库和数据流的架构设计,以及模型训练的架构,还有线上服务的架构等等。这一套架构的学习就不像前面的内容那么简单了,没有太多现成教材可以学习,更多的是在大量实践的基础上进行抽象总结,对当前系统不断进行演化和改进。但这无疑是算法工程师职业道路上最值得为之奋斗的工作。在这里能给的建议就是多实践,多总结,多抽象,多迭代。


    机器学习算法工程师领域现状


    现在可以说是机器学习算法工程师最好的时代,各行各业对这类人才的需求都非常旺盛。典型的包括以下一些细分行业:


    推荐系统。推荐系统解决的是海量数据场景下信息高效匹配分发的问题,在这个过程中,无论是候选集召回,还是结果排序,以及用户画像等等方面,机器学习都起着重要的作用。


    广告系统。广告系统和推荐系统有很多类似的地方,但也有着很显著的差异,需要在考虑平台和用户之外同时考虑广告主的利益,两方变成了三方,使得一些问题变复杂了很多。它在对机器学习的利用方面也和推荐类似。


    搜索系统。搜索系统的很多基础建设和上层排序方面都大量使用了机器学习技术,而且在很多网站和App中,搜索都是非常重要的流量入口,机器学习对搜索系统的优化会直接影响到整个网站的效率。


    风控系统。风控,尤其是互联网金融风控是近年来兴起的机器学习的又一重要战场。不夸张地说,运用机器学习的能力可以很大程度上决定一家互联网金融企业的风控能力,而风控能力本身又是这些企业业务保障的核心竞争力,这其中的关系大家可以感受一下。


    但是所谓“工资越高,责任越大”,企业对于算法工程师的要求也在逐渐提高。整体来说,一名高级别的算法工程师应该能够处理“数据获取→数据分析→模型训练调优→模型上线”这一完整流程,并对流程中的各种环节做不断优化。一名工程师入门时可能会从上面流程中的某一个环节做起,不断扩大自己的能力范围。


    除了上面列出的领域以外,还有很多传统行业也在不断挖掘机器学习解决传统问题的能力,行业的未来可谓潜力巨大。

    展开全文
  • 单在这里说说怎样才算是合格的测试工程师,怎么才能成为一合格的测试工程师。 首先说说怎样才算是合格的测试工程师个测试工程师应该具备的素质我想在很多介绍软件测试的书里已经都列举过了,这里就不...

    前段时间和几个测试朋友聊天,说到测试界的新闻,我想最大新闻莫过于智联招聘网站的一个测试行业的调查报告吧。该报告指出“目前测试从业人员不会超过5万,合格的测试人员不会超过3万,而工作超过5年的更不会超过1万”,姑且不说数据是否准确(据我经验,应该八九不离十)。单在这里说说怎样才算是一个合格的测试工程师,怎么才能成为一个合格的测试工程师。 首先说说怎样才算是一个合格的测试工程师。一个测试工程师应该具备的素质我想在很多介绍软件测试的书里已经都列举过了,这里就不在重复,而一个合格的测试工程师和一个测试工程师的最大区别在哪儿?不外乎就在与测试思想。合格就在于他接受到测试任务后所做的第一件事情是想而不是做。合格就在于他将他自己的想法始终贯穿于整个测试中,包括测试设计中,测试执行中,测试分析中。许多人都会说测试思想是一个空洞的东西,而我也曾经写过或说过太多的例子用以证明它,这里只建议想做合格测试工程师的人去看一本书吧,它的名字是,在我眼里,它并不是一本讲技术的书,同时它也并不只适用于开发人员。接着说说怎样才可以成为一个合格的测试工程师。不是有一个玩笑说某某公司扫地的大妈都可以做软件测试,某某公司看门的大爷都可以做软件测试。由此可见人们对软件测试的误解和测试工程师的尴尬。其实并不是任何一个人都可以成为测试工程师的,其实并不是任何一个测试工程师都可以成为合格的测试工程师的,要想成为一个合格的测试工程师,你必须有血有肉还的有思想。技术没有可以学,思想是学不来的,思想是需要实践的。毛泽东思想也不是他老人家凭空想象出来的,你说是否?于是我建议大家: 1.每半年读一本测试书籍(现在的测试书籍也多起来了,尽管很多都是东抄西抄的,能力够的话去读英文原版,译本基本都不能完全领会作者的思想,人家老外的测试发展要比我门多几十年呢) 2.每半年学一门测试技术(IT行业变化很快,测试技术也同样,每年都有新的测试技术出现,不希望大家对每一个新出现的技术都掌握,只希望每一个测试人员对本人从事的这个行业要充分了解和熟悉,因为在你现在和将来测试的项目中,你要选择最合适和最有效于这个项目的测试技术,如果你连所选对象都不知,那谈何选择,又谈何合适呢?) 3.每半年学一门IT技术(这里的IT技术范围要更广一些,做测试人员要了解更多的知识,如你做性能测试,你需要了解操作系统,你需要了解软件架构,你需要了解低层实现,你需要了解中间件,你需要了解数据库,你需要了解他们的配置与实现方式,你还需要了解硬件,了解网络,了解内存管理机制,了解磁盘I/O原理等等) 4.要学会思考(测试人员要学会在测试前思考,测试中思考,测试后思考,思考的结果要记录下来,没有一个人敢说他自己是天才,可以记住所有的东西。想好后那就去做吧,去验证吧,如果不对,那返回重新思考,然后再去做,只有这样,你才会做的更好。) 5.要重视测试设计(某开发人员曾说过他精通JAVA,精通C,我于是和他说,那给你10年或20年,你用你精通的JAVA来写出一个可以替换WINDOWS的操作系统。他从此不在这样说,因为他知道即使给他一辈子,这对他也是一个梦。测试何尝不是,你测试技术再高,你也不可能测试的更好,重视测试设计吧,这才是测试之关键。) 6.多和测试同行交流(在一个封闭的圈子里,或在一个公司里,你觉得你是测试高手,当有一天你走出这个封闭圈子的时候,你才发现,天外有天,或许捆饶你一个月的难题某些测试同行轻描淡写的一句话就可以为你解决。测试是相通的,测试思想更是相通的,多去做一些比较,才可以看到自己的不足。)我是崇尚测试技术的,所以相信, 尊重源于实力!因此希望更多的测试人员能得到测试同行的尊重,能得到开发人员的尊重,能得到企业的尊重。同时我更崇尚测试思想,所以我更相信,在软件行业更加规范化后,企业对测试工程师的要求必定是测试思想第一,经验第二,而测试技术只能排第三了。

    展开全文
  • 如何成为一名合格的自动驾驶工程师?.pdf
  • 如何成为一名合格的运筹优化算法工程师

    千次阅读 多人点赞 2019-07-23 18:30:35
    作为算法工程师里的一小撮,相比机器学习...所以在这里和自己探讨下,看看如何成为一名更好的、合格的运筹优化算法工程师,给自己一个方向。如果有人不怕被坑,欢迎参考。当然更欢迎拍砖和补充。 引言 运筹学(o...
  • 成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试到优化等一系列能力,这些能力中的每一项掌握起来都需要足够的努力和经验。
  • 成为一名合格的java工程师

    千次阅读 2014-08-26 18:00:11
    有人说,成为一名合格java工程师需要做到面面具到而且要上知天文,下知地理的,现在优渡为大家详细分析下成为合格java工程师要具体的生存技能;  首先你确定你要进入Java开发?决定学习Java是要下很大决心的,因为...
  • 如何成为一名合格的前端工程师 现如今,前端已经是一个异常响亮的行业名词,正汇聚各方好汉,华山论剑日益激烈。据2019最新的编程语言排行显示JavaScript已排名第七,由此可见,前端的未来不是梦。 要学习前端,...
  • 如果你准备成为一名互联网时代的测试工程师,那么我建议你可以看看下面的一些思考; 首先真正的想把测试这件事情精,并不是一件简单的事情,因为其中有太多的技能以及知识面需要去探索及研究; 其次很多人会...
  • 那么如何成为一名好的前端工程师呢?本文,从两方面来回答一下这个问题。 一、学习路线 1、前端页面重构 主要内容为PC端网站布局、HTML5+CSS3基础、WebApp页面布局。学习目标是完成PC端网站布局,WebApp页面布局,...
  • 成为一名合格软件工程师的7点建议

    万次阅读 热门讨论 2017-11-10 15:54:52
    原文:7 Tips On How To Become A Competent Software Engineer 作者:@thedz0 译者:roy 在过去5年多的时间里,我在科技初创...这篇文章是根据我的个人经验,针对刚入行的年轻工程师的一些建议。第印象很重要
  • 文 / 张相於成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试到优化等一系列能力,这些能力中的每一项掌握起来都需要足够的努力和经验。而要成为一名合格的机器学习算法工程师(以下简称算法...
  • 随着云时代的到来,企业对运维...下面千锋为大家分享怎么成为一名合格的Linux运维工程师。  1、扎实的基础。你需要掌握如何查看文件类型、查看系统运行状态、编辑文件、输出文件、创建用户、分配帐户权限、使用RAI
  • 如何成为一名合格的硬件工程师

    千次阅读 2011-09-30 22:10:04
    如何成为一名合格的硬件工程师 目的:基于实际经验与实际项目详细理解并掌握成为合格的硬件工程师的最基本知识。 1) 基本设计规范 2) CPU基本知识、架构、性能及选型指导 3) MOTOROLA公司的PowerPC系列基本...
  • 来自公众号:大数据挖掘DT数据分析本文共7500字,建议阅读10+分钟。本文将算法工程师所需的技能进行拆分,带你了解掌握哪些技能才能算是一名合格的算法工程师成为一名合格...
  • 摘要:本文旨在为飞行器设计尤其是飞机总体设计深感兴趣的人提供种专业的学习方法论,通过个系统的学习,从毫无基础的小白可以成长为可以进行工程应用的合格工程师,其针对对象为对飞行器主要是飞机设计感兴趣...
  • 在上一节我们已了解前端开发是什么的,现在的问题是,如何才能成为一名合格的前端开发工程师? 相信这个问题是大家比较关心的。 前端开发工程师 如果大家在一些搜索引擎上搜索“前端开发工程师”需要具备什么技能...
  • 位好的Web前端开发工程师在知识体系上既要有广度,又要有深度,所以很多大公司即使出高薪也很难招聘到理想的前端开发工程师。现在说的重点不在于讲解技术,而是更侧重于对技巧的讲解。技术非黑即白,只有对和错,...
  • 对于很多新入行或者打算入行,成为软件测试工程师的小伙伴来说,刚开始接触这行,不知道自己究竟该学些什么,或者不知道必须掌握哪些知识,才能成为一名合格的测试工程师
  • SDET(Software Development Engineer in Test)也被称为测试开发工程师,它是个在软件测试和质量保证领域的工作。这个名词最初被微软使用,Google跟进,用自动化的方式来和普通重复的手工测试任务进行区分。 ...
  • 成为一名合格的java工程师必须要做到以下几点 浏览:59 | 更新:2014-08-01 15:20 | 标签: java   有人说,成为一名合格java工程师需要做到面面具到而且要上知天文,下知地理的,现在优...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,906
精华内容 7,162
关键字:

怎样成为一名合格的工程师