普通程序员如何正确学习人工智能方向的知识?

“互联网+”已经发展的差不多了,应有尽有,空间不大,下个浪潮会不会是“AI+”?那么作为一个普通程序员,如何提前向人工智能(AI)靠拢?
关注者
24,545
被浏览
2,971,773

258 个回答

本人码农,从六月开始正式接触机器学习(其实五年前的本科毕设就是在生物信息领域应用神经网络的项目,但是非常浅薄),深吸一口气,先要声明“人之患在好为人师”,我用的步骤只是适合我,下面的内容仅供参考。

第一步:复习线性代数。(学渣的线代忘了好多-_-||)

第二步:入门机器学习算法。

  • 还是因为比较懒,也就直接用了著名的——斯坦福大学公开课 :机器学习课程,吴恩达教授的老版cs229的视频,讲的非常细(算法的目标->数学推演->伪代码)。这套教程唯一的缺点在于没有介绍最近大火的神经网络,但其实这也算是优点,让我明白了算法都有各自的应用领域,并不是所有问题都需要用神经网络来解决;
  • 多说一点,这个课程里详细介绍的内容有:一般线性模型、高斯系列模型、SVM理论及实现、聚类算法以及EM算法的各种相关应用、PCA/ICA、学习理论、马尔可夫系列模型。课堂笔记在:CS 229: Machine Learning (Course handouts),同样非常详细。
  • 广告:边看边总结了一套笔记 GitHub - zlotus/notes-LSJU-machine-learning: 机器学习笔记

第三步:尝试用代码实现算法。

第四步:自己实现功能完整的模型——进行中。

  • 还是因为比较懒,搜到了cs231n的课程视频 CS231n Winter 2016 - YouTube ,李飞飞教授的课,主讲还有Andrej Karpathy和Justin Johnson,主要介绍卷积神经网络在图像识别/机器视觉领域的应用(前面神经网络的代码没写够?这门课包你嗨到爆~到处都是从零手写~)。这门课程的作业就更贴心了,直接用Jupyter Notebook布置的,可以本地运行并自己检查错误。主要使用Python以及Python系列的科学计算库(Scipy/Numpy/Matplotlib)。课堂笔记的翻译可以参考 智能单元 - 知乎专栏,主要由知友杜客翻译,写的非常好~
  • 在多说一点,这门课对程序员来说比较走心,因为这个不像上一步中用matlab实现的作业那样偏向算法和模型,这门课用Python实现的模型同时注重软件工程,包括常见的封装layer的forward/backward、自定义组合layer、如何将layer组成网络、如何在网络中集成batch-normalization及dropout等功能、如何在复杂模型下做梯度检查等等;最后一个作业中还有手动实现RNN及其基友LSTM、编写有助于调试的CNN可视化功能、Google的DeepDream等等。(做完作业基本就可以看懂现在流行的各种图片风格变换程序了,如 cysmith/neural-style-tf)另外,这门课的作业实现非常推崇computational graph,不知道是不是我的幻觉……要注意的是讲师A.K的语速奇快无比,好在YouTube有自动生成解说词的功能,准确率还不错,可以当字幕看。
  • 广告:作业参考 GitHub - zlotus/cs231n: CS231n Convolutional Neural Networks for Visual Recognition (winter 2016) (我的在作业的notebook上加了一些推导演算哦~可以用来参考:D)

因为最近手头有论文要撕,时间比较紧,第四步做完就先告一段落。后面打算做继续业界传奇Geoffrey Hinton教授的

Neural Networks for Machine Learning | Coursera

,再看看NLP的课程

Stanford University CS224d: Deep Learning for Natural Language Processing

,先把基础补完,然后在东瞅瞅西逛逛看看有什么好玩的……

PS:一直没提诸如TensorFlow之类的神器,早就装了一个(可以直接在conda中为Tensorflow新建一个env,然后再装上Jupyter、sklearn等常用的库,把这些在学习和实践ML时所用到的库都放在一个环境下管理,会方便很多),然而一直没时间学习使用,还是打算先忍着把基础部分看完,抖M总是喜欢把最好的留在最后一个人偷偷享受2333333(手动奸笑

PS**2:关于用到的系统性知识,主要有:

  • 线性代数,非常重要,模型计算全靠它~一定要复习扎实,如果平常不用可能忘的比较多;
  • 高数+概率,这俩只要掌握基础就行了,比如积分和求导、各种分布、参数估计等等。(评论中有知友提到概率与数理统计的重要性,我举四肢赞成,因为cs229中几乎所有算法的推演都是从参数估计及其在概率模型中的意义起手的,参数的更新规则具有概率上的可解释性。对于算法的设计和改进工作,概统是核心课程,没有之一。答主这里想要说的是,当拿到现成的算法时,仅需要概率基础知识就能看懂,然后需要比较多的线代知识才能让模型高效的跑起来。比如最近做卷积的作业, 我手写的比作业里给出的带各种trick的fast函数慢几个数量级,作业还安慰我不要在意效率,岂可修!)

需要用到的编程知识也就是Matlab和Numpy了吧,Matlab是可以现学现卖的;至于Python,就看题主想用来做什么了,如果就是用来做机器学习,完全可以一天入门,如果想要做更多好玩的事,一天不行那就两天。(贴一个Python/Numpy的简要教程:

Python Numpy Tutorial

,是cs231n的课堂福利。)

我感觉机器学习的先修就这么点,记得Adobe的冯东大神也说过机器学习简直是21世界的黑科技——因为理论非常简单但是效果惊人的好。

====

既然提到好玩的,墙裂推荐

Kaggle: Your Home for Data Science

,引用维基上的介绍:

Kaggle是一个数据建模和数据分析竞赛平台。企业和研究者可在其上发布数据,统计学者和数据挖掘专家可在其上进行竞赛以产生最好的模型。这一众包模式依赖于这一事实,即有众多策略可以用于解决几乎所有预测建模的问题,而研究者不可能在一开始就了解什么方法对于特定问题是最为有效的。Kaggle的目标则是试图通过众包的形式来解决这一难题,进而使数据科学成为一场运动。

说说我学习深度学习的经历吧,从开始学习到现在大概有4个月,只能算新手,刚好可以回答新手问题。


先说编程:自认会用C++, 熟悉Python


英语水平:中等,能很快读懂英文科学文献


最开始对人工智能/深度学习感兴趣是因为想用它试一试自然语言生成,后来想到一个物理方面的题目,预计可以用深度学习技术解决,开始接触深度神经网络。记录一下学习历程,


1. 安装 Tensorflow(google 开源的深度学习程序), 尝试里面最简单的例子MNIST 获得激励。

2. 之后尝试通过读书(看视频)理解最简单的全连接神经网络

先搜索找到答案:为什么要Go Deep?

(1)神经网络中输入层,隐藏层,输出层之间矩阵乘积的维度变化。

(2)Weight, Bias 这些是什么,改变它们有什么结果。

(3)激励函数是什么,有什么作用,有哪些常用的激励函数

(4)误差如何向后传递,网络如何通过最小化误差函数更新,有哪些常用的优化方法

以上这些在一本交互式电子书中可以找到答案:

Neural networks and deep learning

(5) 如何对权重正规化,L1, L2, BatchNormalization, (这些在以后真正应用的时候再看)

Deep Learning chapter 7 for L1, L2 regulation.

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift (2015) original paper for BN

why does batch normalization help? Quora

Note for BN in Chinese

Implementing Batch Normalization in Tensorflow from R2RT

Layer normalization (2016) Replace Batch Normalization in RNN

Why Does Unsupervised Pre-training Help Deep Learning?

Summary and discussion on pre training


3. 选择一种比较比较底层的神经网络开源库,tensorflow 或 theano,

(1) 读官方文档 tensorflow.org/versions

(2) 看周莫凡的网络教程 youtube.com/user/Morvan

(3) 重复敲代码,重复实现例子程序

4. 开始理解各种不同神经网络架构所能处理的问题

(1) CNN 图像识别,图像处理,语音处理

(2) RNN,LSTM 自然语言理解与生成

(3) 增强学习,玩游戏 :)

5. 尝试各种开源的有意思的神经网络项目,新手可以从下面这个列表开始

(1)Andrej Karpathy blog char-rnn, Deep Reinforcement Learning: Pong from Pixels

(2) Neural Style In tensorflow.


6. 如果能翻墙,注册 twitter, facebook 账号,follow 那些文章中经常出现的大牛的名字。他们每天提供很多新动向及最新技术,很多时候有很 Fancy的应用。试试从这个大牛follow的人开始follow

twitter.com/karpathy


当你对这些都很熟悉的时候,开始阅读艰深的文献:

1. CNN 的原始文献

2. RNN 和 LSTM 的原始文献

3. Reinforcement Learning 的原始文献

4. Google DeepMind 发表在 Nature 上的几篇经典


最后推荐一个高级点的库: Keras Documentation

虽然这个库还在发展阶段,里面仍有不少bug,但前途不可限量,可以很容易实现你之前读文章时候见到的那些复杂的构架。作为例子,这里有个教程:

Deep learning book in ipython-notebook and Keras Many example code in Keras.


这些学习历程中遇到的资料都记录在了我的个人note里,希望大家共勉:

web-docs.gsi.de/~lpang/


最后强调一个最最重要的事情:要有自己的想法,有将这种新技术用到自己项目中的强烈愿望,从开始就要Coding,不断尝试才能不断进步。


(看了很多其他的回答,在这里想补充一段)

说实话,作为一个其他行业(物理,工程,化学,医学,农业,卫星地图识别,网络安全领域,社会科学)的普通程序员,在本行业有比较深的理论和实验背景,能接触到海量数据(无论是传感器数据,互联网数据还是蒙特卡洛模拟数据),想做处一些创新性,交叉性的工作,这一轮人工智能的风绝对是要跟的。


作为一个计算机专业的人,可能觉得机器学习,人工智能,深度学习已经炒的过热了。但是对于其他领域,可能大部分人还没有想到把最基本的机器学习算法如:PCA,SVM,k-means...运用到本行业积累的大数据上, 更不要说最近的深度学习。


作为其他行业的普通程序员(除了数学与理论物理),我们不要指望从理论上彻底解决深度学习现存的问题。我们的优势不在这里,我们的优势是计算机专业的人所没有的专业知识,行业大数据。我们需要做的是把机器学习,深度神经网络当作工具,知道它们能做什么,如何去做。参考Andrew Ng 的机器学习笔记,

Machine Learning - complete course notes


举几个简单的例子:


1. 使用深度学习中生成风格化图片的技术,制备具有特定功能的抗癌药物

The cornucopia of meaningful leads: Applying deep adversarial autoencoders for new molecule development in oncology


2. 使用反常探测,寻找网络攻击 Cyber-attacks prediction


3. 对于国家来说,更加聪明的互联网关键词过滤


4. 自动探测卫星地图上道路,建筑,车辆,河流。。。


5. 环境科学中寻找雾霾与众多可能因素的非线性关联


我们用卷积神经网络来区分量子色动力学相变是crossover还是一阶相变。(1年之后回来修改)回答这个问题的时候,文章刚刚写好,最近文章已经在《自然-通讯》Nature Communications 杂志发表,网上公开链接是 An equation-of-state-meter of quantum chromodynamics transition from deep learning , 希望能给坚持在这个方向,做 AI + X 交叉学科应用的同学带来精神上的激励。


talk: http://starmeetings.physics.ucla.edu/sites/default/files/pang.pdf