阅读 361

大龄程序员的人工智能学习之路

我大学本科学的并非计算机相关专业,毕业后在外面工作了三年之后,考研重返校园,专业是计算机应用,算是半个科班出身。硕士毕业之后留在了武汉,然后就一直在武汉工作。在二线城市工作有一件比较尴尬的事情,就是跳槽选择少,这就需要看个人运气。如果企业发展的好,一直做下去,也有不错的前景。遗憾的是,我工作的第一家公司,主业是电信的公用电话。现在大街上已经没有公用电话的影子,在当年可是火热的很,公司也因此成功上市。然而,等我在公司正辉煌的时候进入,手机开始崛起,开始冲击公用电话市场。等大家都有手机的时候,谁还会用公用电话呢?我算是见证了手机从身份的象征开始走进千家万户,同时也见证了公司的衰落。期间公司虽然尝试转型,但转型哪是那么容易的。这期间,从后端管理系统到桌面软件,再到嵌入式系统,涉足的技术很多,但不精,公司没发展,个人也谈不上发展,呆了六年多时间,前途无望,离开了这家公司。其后的几个单位,都不是那种发展特别好的企业,活下去没问题,但是也没有大的作为。

就这样一直很平稳的工作着,结婚生子,一晃就迈过了四十大关。在我刚入行的时候,那时流行的说法是程序员30是一个坎,等我30岁的时候,门槛悄然变成35岁,然而等我到了40岁的时候,我依然在处在编程一线。幸亏个人心态比较好,要不真得给焦虑死。

工作生活在二线城市,工作和生活的压力要小得多,比如加班少、平时业余时间比较多,工作方面因为做了十几年开发,也算是轻车熟路。收入方面虽然相对于北上广深差很多,但相对当地的收入水平,还算是高薪,再加上买房买车也比较早,以前干一个月,至少可以买两个平方米的房子,所以生活上的压力也不大。

本来平淡的日子可能就会这样延续下去,有一天,我看了一本松浦弥太郎的《给40岁的崭新开始》一书,给了我很大的触动。作者在书中写道,随着现代医学和营养学的进步,人们健康活到80岁并不是不可能,更有乐观人士估计,我们这代人的平均寿命将达到100岁。如果从“70岁才是人生巅峰”的角度来思考,以40岁作为人生新的起点,步入中年并不是一件让人悲观的事情。

我决定行动起来,做点事情。其实也没啥雄心壮志,只是时间多,总需要做点事情。往哪个方向做,当时并没有想好,只是决定行动起来,开通了微信公众号,写下了第一篇文章《给40岁的崭新开始》。随后连续写了几篇书评和技术文章,但还没有定下人工智能这个方向。

2016年AlphaGo横空出世,引爆了人工智能这个领域,作为一名围棋爱好者,我也一直关注着。但我一直觉得人工智能太过高深,不是我这种平凡之辈可以驾驭的。然而这段时间,我有几个同事离职之后进入人工智能这个行业,让我大为吃惊,也让我开始了解人工智能这个行业。在了解这个行业之后,发现人工智能其实和其它行业一样,都有各自的分工,并不是每个人都需要去研究高深的算法,大部分人还是做工程技术性的工作,这样我可以从具体编程切入这个行业。向同事求证,也坚定了我的想法。

有了想法,需要立即行动起来。考虑到数学理论知识差,在知乎和论坛上也查看了大神们的帖子,决定从《机器学习实战》这本书入手。这本书没有从理论角度来揭示机器学习算法背后的数学原理,而是通过“原理简述+问题实例+实际代码+运行效果”来介绍每个算法。

从事编程这么多年,我还是知道虽然实际中不需要掌握很深的理论知识,但了解一些理论对于算法的理解还是必不可少的,所以我又选择了《机器学习》一书作为补充。

这本书被网友亲切的称为西瓜书,也是一本教科书,而且是一本入门的教科书。其宗旨是理清基本概念、了解领域概貌。虽然作者试图尽可能少的使用数学知识,但相比《机器学习实战》,这本书的数学公式还是多了不少,对读者的要求也要高一些,读起来相当吃力。

针对这个选择,当时写了一篇文章《数学不好,进入机器学习领域还有戏吗?》,也算是给自己打气。

接下来就是啃这本《机器学习实战》,很辛苦,将书中的代码一行行亲自敲进电脑、运行,看西瓜书,力争透彻理解算法,输出文章谈对算法的理解。虽然说以编程实例为基础,但涉及到的理论还是让我很头疼,学习进展也很慢。一次我将我的苦恼向朋友倾诉,朋友指出,现在的机器学习框架,都有封装好的算法,如果不从事算法优化工作,其实不需要把算法理解得很透彻,只需要掌握基本原理,更重要的是在实际项目中如何选择算法,如何使用框架快速实现并部署。这也点醒了我,我不就是准备从编程入手,怎么学着学着就在那儿死磕算法呢?朋友还建议我看一看吴恩达的《machine learning》的在线课程。

于是,我又转向了吴恩达的《machine learning》在线课程的学习。

吴恩达的《Machine Learning》在线课程就不用我赘述了,有两个学习途径:

  1. 上Coursera在线教学网站学习,优点是每周的学习之后可以在线答题,可以提交答案检验是否正确,而且还可以做编程练习,编程练习提交到系统后,系统可以自动测试程序是否运行正确。缺点是需要科学上网,而且有些视频并没有中文字幕。
  2. 上网易云课堂学习,优点是速度快,全部视频都有中文字幕。缺点是没有在线习题,也没有编程练习。

在这两个地方学习,都是完全免费。我一直都在科学上网,英文字幕也勉强能看懂,所以我是上Coursera网站学习的。当然也可以在网易云课堂上看视频,到Coursera上做习题和编程练习。这门课程虽然叫机器学习,但其实重点讲的是回归和梯度递减算法,而没有像《机器学习实战》那本书那样涉及好多机器学习的算法。对于线性回归和逻辑回归以及梯度算法讲的非常透彻,辅助以代码实例,也容易懂。每个章节后面都有习题加深巩固。从第二周开始每周有编程联系。整个课程安排了十一周,这是考虑到学习时间有限的情况下,其实如果时间充裕,一天完成一周的学习都没问题。

这门课我认认真真学习了每个视频,完成了每个习题和编程练习。这门课让我开始对机器学习有些感觉,对于回归和梯度算法有了比较深入的了解。编程练习采用的是和matlab兼容的Octave语言,要是选择python语言就更完美了。当然Octave语言也比较简单,稍微学习一下就可以上手。

学完这门课程之后,我又马不停蹄的学习了他的另一门课程《Deep Learning》,准确的说是一个微专业,包含了五门课程:Neural Networks and Deep Learning、Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization、Structuring Machine Learning Projects、Convolutional Neural Networks、Sequence Models,每门课程安排了大约3到4周的学习时间,每个章节都给出了建议学习时间。如果是边工作边学习,就按照这个进度学习就很好。

这门微专业在网易云课堂上同样免费,在Coursera上也可以免费看,但如果要在线提交习题和编程练习,需要收费,折合人民币308元。考虑到在Coursera上可以在线做练习,308元的价格也不贵,我选择了付费,国内带VISA标志的信用卡可以付费,直接折算成人民币付款。

每节课成后面的习题,我都认真做了分析,并写在公众号里:

[神经网络与深度学习] Introduction to deep learning习题解析

[神经网络与深度学习] Neural Network Basics习题解析

[神经网络与深度学习] Shallow Neural Networks习题解析

[神经网络与深度学习] Key concepts on Deep Neural Networks习题解析

[改善深度神经网络] Practical aspects of deep learning习题解析

[改善深度神经网络] Optimization algorithms习题解析

[改善深度神经网络] Hyperparameter tuning, Programming Frameworks习题解

[卷积神经网络]课程:The basics of ConvNets习题解析

[卷积神经网络]课程:Deep convolutional models习题解析

[卷积神经网络]课程:Detection algorithms习题解析

[卷积神经网络]课程:Face recognition & Neural style transfer习题解析

[序列模型] Recurrent Neural Networks习题解析

[序列模型] Natural Language Processing & Word Embeddings习题解析

编程练习使用了Google的TensorFlow框架,考虑到Google在业界的影响力,我决定主要使用TensorFlow框架,为此还看了一本《TensorFlow实战》。

这本书谈不上经典,但比较适用,作为了解TensorFlow框架的基础书籍,还算可以,但这本书我并没有看完,只挑了我感兴趣的章节。

对深度学习以及TensorFlow框架有了一定的掌握之后,决定做一个小项目来练练手。一次看到微信上的识花君小程序后,决定做一款类似的小程序,拍照识狗,取名为识狗君。这实际上是一个图片分类问题。图片分类问题是深度学习最基础的应用,各种图片分类的示例代码满大街。但对于一个新手来说,照着代码一行行敲,运行出来不难,但对于一个新项目来说,还是有许多问题需要解决:

  1. 狗狗图片数据集哪里来?
  2. 选择哪种图片分类模型?如何再训练?是采用端侧推理还是在服务器端识别?
  3. 微信小程序如何开发?
  4. 模型如何部署?
  5. 微信小程序如何与服务端通信?

在这个开发过程中,我在公众号上分享了我对于项目的考虑,碰到的问题,研究的方法:

这个中秋,我开发了一个识别狗狗的app

一头栽进了tensorflow lite的巨坑里

当微信小程序遇上TensorFlow:Server端实现

当微信小程序遇上TensorFlow:Server端实现补充

当微信小程序遇上TensorFlow:小程序实现

当微信小程序遇上TensorFlow:接收base64编码图像数据

当微信小程序遇上TensorFlow:终章

识狗君微信小程序的部署

项目的所有源代码都放在github上:github.com/mogoweb/aid…

需要注意的是: TensorFlow框架一直在进化中,可能上面的代码在最新框架上并不能直接使用,我正在考虑将其移植到TensorFlow 2.0上。另外上述的方法并非最优方法,只是我在当时能想到的最好方法。如果你有什么好的想法,欢迎交流。

当时看到报道,有AI写诗、AI作曲、AI作画,对GAN(对抗生成网络)产生了兴趣,还买了一本《实战GAN》。

最初了解到生成对抗网络(GAN),是从知乎专栏:深度有趣,该专栏的作者是张宏伦,一位上海交通大学的博士,知识渊博,文笔也很好,可惜的是这个专栏到今年年初就没有再更新。

如果大家对生成对抗网络没什么概念,那可以看看下面的图中,哪张是真实图片,哪张是AI生成的?

答案揭晓,两张图片都是AI生成的,这可不是从真实图片经过PS处理而得来的。另外拍卖史上首幅AI画作也已经诞生,以估价60倍的US$432,000(RMB 300万)成交。

想想也觉得神奇吧!正是因为对此充满了好奇,所以我决定扎进去看一看。然而进入之后,才发现这里的水很深,都是一些大腕在玩,比如NVIDIA、Google、微软之类的,再加上部分研究机构。研究这个领域,需要强大的计算资源,个人去做的话,生成个手写数字还差强人意,要生成一个稍微看得下去的图像,训练一个模型,动辄好几天,太难了。《GAN:实战生成对抗网络》这本书看了前面几章,写了几篇笔记:

实战生成对抗网络[1]:简介

实战生成对抗网络[2]:生成手写数字

实战生成对抗网络[3]:DCGAN

后面就没有继续再看,等哪天功力到了,再捡起来。

深入到深度学习领域之后,发现深度领域也有很多方向,比如图像处理、自然语言处理、强化学习、GAN等等。对于大神而言,可以多方突击,但对于我这样的普通人来说,能把一个方向弄清楚就不错了,所以我决定还是选择图像处理这个方向作为重点深耕对象。

我个人比较信奉学习+实践的策略,喜欢书本结合实例动手。定下图像处理这个主题方向后,我就去搜寻这方面的书,找到一本《Deep Learning for Computer Vision with Python》,感觉比较适合我。这本书是英文版,国内没有翻译版本,也没出影印版,所以我看的是PDF版本。这本兼顾了理论和实践两者之间的平衡,对每一个深度学习理论,都会有一个关联的Python实现来帮助你巩固对其的理解和学到的知识。书中有详细的代码,且代码都有比较详细的说明,对Engineer非常友好。

一本好书:Deep Learning for Computer Vision with Python

在学习过程中,我写了几篇总结笔记:

使用数据增强技术提升模型泛化能力

站在巨人的肩膀上:迁移学习

聊一聊rank-1和rank-5准确度

再谈迁移学习:微调网络

提高模型准确率:组合模型

深度学习中超大规模数据集的处理

试试kaggle竞赛:辨别猫狗

微架构模型:GoogleNet

学习的日子总是过得很快,从我下定决心学习人工智能,已经过去一年零两个月,时间也翻到了2019年5月。在这中间我还尝试过结合本行,研究浏览器中的机器学习:tensorflow.js,前段时间还买了一块Nvidia出品的人工智能开发板Jetson。对我来说,学习总是一件充满乐趣的事情,总有新鲜的事情可以去探索。虽然现在的本职工作和人工智能并没有什么关系,但说不定哪天,副业就会转正呢?

我的大龄程序员的人工智能学习之路暂时划上句号,但我的人工智能学习并没有终结,我还会在这条路上继续摸索前行,也欢迎各位结伴同行。

学习人工智能都是在业余时间进行,但其实跑步、练习书法和读书占据了我大部分时间,另外周末还要陪娃,所以总体上说,我的人工智能学习之路进展缓慢,但我相信,日拱一卒无有尽。

念念不忘,必有回响,和大家共勉!

你还可以读:

  1. 给40岁的崭新开始
  2. 中年程序员该焦虑吗?
  3. 我编程,我快乐
  4. 数学不好,进入机器学习领域还有戏吗?