机器学习
深度学习(Deep Learning)

深度学习如何入门?

本题已加入知乎圆桌 »「机器学习 · 学以致用 」,更多「机器学习」相关话题讨论欢迎关注。
关注者
48,258
被浏览
12,258,651

625 个回答

怎么入门机器/深度学习?

回答这个问题,最先要考虑的问题是:你有多少时间?

准备用三个月入门,和想要一个月速成,肯定是截然不同的路径。当然我建议大家稳扎稳打,至少可以拿出五个月的时间来学好机器学习的基础知识。

基础很重要,知其所以然很重要。毕竟工具总在进步,每个月都会出现更好的深度学习技术,但基础知识是不变的。

如何用五个月时间入门?下面分三个部分,详细指南。(以及,如果你确实时间有限,最后还有一个速成指南)

五个月入门

Part 1:从机器学习开始(两个月)

最好的入门教程,就是吴恩达讲授的机器学习。吴恩达这套课程发布很久了,虽然有些地方稍微过时,但相信我,现在没有任何公开的课程,能比吴恩达讲得更好。真的,课程结束时我几乎哭了出来。

这个课程可以说适合任何水平的学生,当然,你最好还是得知道两个矩阵如何相乘,以及对编程有一些基本的了解。

这套课程可以前往Coursera学习,传送门:
coursera.org/learn/mach
也可以上网易公开课收看,传送门:
open.163.com/special/op

如果你有时间,一定要听完全部的课程。如果时间紧张,至少要听完前五节课程,后面的可以暂时跳过。

吴恩达的机器学习课程深入讲解了经典的机器学习模型,如线性回归、逻辑回归、神经网络、支持向量机、PCA、无监督学习等等。大部分重要概念,都以简单易懂的方式进行了介绍。

课程延伸

当你学习到第五节课,也就是开始讲述神经网络时,建议开始查看与课程平行的外部资料。比方3bule1brown推出的神经网络讲解视频。推荐必看。

YouTube传送门:
youtu.be/aircAruvnKk?
或者可以前往B站查看:
space.bilibili.com/8846

以及,我觉得吴恩达在讲神经网络时有点快,所以建议补充阅读一些资料。比如有关神经网络和深度学习的在线书籍,免费的就很好了。

传送门:
neuralnetworksanddeeplearning.com

作者Michael A. Nielsen以一种简单直观的方式,深入探究了神经网络的每个细节。建议阅读这本书的前两章,与吴恩达的课程并行。当你熟悉更多概念后,开始搞深度学习时,可以再看书中的其余部分。

如果你英文不好,这本《神经网络与深度学习》也有中文翻译版本,可以免费在线查看。

传送门在此:
tigerneil.gitbooks.io/n

这个部分的学习结束之后,你就能明白机器/深度学习的许多概念。最后推荐阅读Christopher Olah的博客,很有意思。

传送门: colah.github.io/

Part 2:涉足深度学习(1个月)

开始研究深度学习之前,最好重温一下大学数学。Ian Goodfellow传奇般的“花书”《深度学习》,简明扼要的概括了大部分重要主题。

建议大家尽可能深入地阅读线性代数、概率、信息理论的章节。每当读论文遇到深度学习概念时,都可以在书中找到参考。

以及,这本书有在线的版本。

例如英文版在此:
github.com/janishar/mit
而中文翻译版本在此:
github.com/exacity/deep

关于深度学习的在线资料有很多,你可能会挑花了眼。

再一次,我觉得最好的选择,还是听吴恩达的《深度学习专项系列课程(Deep Learning Specialization)》。

Coursera传送门:
coursera.org/specializa
网易云课堂的传送门:
mooc.study.163.com/smar

这门课程包括五大章节。其实不是免费的,你可以按照50美元/月购买。当然,如果你负担不起,还能申请“助学金”。申请时请详细阐明理由,处理的时间大概需要15天左右。

当然不付费,大部分内容都是可以看的。以及视频的部分,在很多地方也能免费收看。

这五门课程主要讲的是:

1、神经网络和深度学习(4周)

2、改善深度神经网络(3周)

3、结构化机器学习项目(2周)

4、卷积神经网络(4周)

5、序列模型(3周)

前三门课程涉及一般的神经网络和深度学习,第四、第五门课程涉及特定主题。如果你打算搞视觉,第四课必听;如果你搞NLP、音频等,第五课必听。但如果你需要听第五课,那么建议也把第四课好好听一下。

这里鼓励大家一下,课程里每周的内容,实际上一两天就能学完,所以不要被课程表吓倒。劳逸集合、提升效率。

学到这个地步,其实就可以再去 neuralnetworksanddeeplearning.com ,查看第三到第六章的内容,来强化你的概念。如果你有什么还没搞懂的,请前往Olah的博客。

以及,这时候你要开始看深度学习的论文了,从中学习知识。深度学习有个强烈的特点,那就是内容都非常新,阅读论文是跟上时代唯一的方法。不想被抛下,那么还是养成阅读论文的好习惯吧。

Part 3:深度学习上手练(两个月)

学到这里,你应该对机器学习和深度学习中的大多数概念有了正确的理解,现在是时候投入沸腾的实际生活中了。

练手深度学习,最好的资源在fast.ai。

传送门在此: course.fast.ai/

他们在流行的深度学习工具PyTorch上构建了一个库,只需要几行代码,就能实现世界级的性能。

fast.ai的理念有点不同。吴恩达等老师的教授方法是自上而下,先讲再做。而fast.ai倡导自下而上,先做再讲。

所以在他们的课程中,第一节就带你建立一个强大的图像分类器。自己训练模型的快感,刺激着你去完成其余的课程。

除此以外,还要推荐两门课。

斯坦福大学的CS231n和CS224n。CS231n专注于计算机视觉的深度学习,而CS224n专注于序列建模。

CS231n,李飞飞等主讲。
官网传送门: cs231n.stanford.edu/
CS224n,目前是Richard Socher主讲。
官网传送门: web.stanford.edu/class/

此前的课程,网上也有中文字幕版本,大家可自行搜索。

到这里,为期五个月的机器/深度学习入门就结束了。

希望大家都能稳扎稳打,夯实基础。

以及最后,兑现一个开头的承诺。如果你确实时间很紧张,必须尽快入门机器/深度学习,那么请看——

速成指南

我最多只有俩月

1、完成吴恩达机器学习课程的前五周,要做编程练习。

2、看完3Blue1Brown的视频。

3、完成吴恩达的深度学习专项系列课程,做练习。

4、如果你想搞图像,看专项课程第四讲,搞NLP或序列数据,看第五讲。

5、搜索你感兴趣的开源实现。如果你还没想好用什么语言,推荐Keras。然后根据需要,再迁到TensorFlow或者PyTorch框架。

我,只有一个月

想要在30天完成入门超级困难。除非,你只是想了解机器学习的工作原理,然后应用到自己的项目中。

如果是这样的话,速成建议如下:

1、略读吴恩达机器学习课程第1-5周的课程,只看视频,掌握概念即可。第三周可以跳过MATLAB/Octave课程。

2、看完3Blue1Brow的视频。

3、略读吴恩达深度学习专项系列课程的第一课,也就是神经网络和深度学习。

4、如果你想做图像处理项目,看一下Nielsen书中的第六章: neuralnetworksanddeeplearning.com

如果你需要序列建模的一些想法,可以看看Olah的博客: colah.github.io/posts/2

5、Siraj Raval拍了很多有趣的视频,涉及大多数机器/深度学习的主题。传送门在此: youtube.com/channel/UCW

6、搜索跟你感兴趣的开源实现,随时调整以满足你的需求。如前所述,我推荐你先用带有TensorFlow后端的Keras语言。

其他资源

YouTube上有一个两分钟读论文的系列视频,可以帮你快速了解全球深度学习的最热门进展。

如果你关注进机器学习领域的进展,Twitter是个绝佳的工具。

遇到困境的时候,记得reddit和Facebook上有很多志同道合的人,不要犹豫,在社区里寻求帮助,大家会伸出援手。

结论

机器学习和深度学习是当今世界最具魅力的技术之一。而且这个领域的深度学习专家总是处于稀缺的状态。从职业前景来看,深度学习非常吸引人。

需要提醒的是,与计算机学科的其他领域不同,深度学习的资源还不够丰富。很多时候你会遇到失败挫折,千万不要灰心丧气,你可以向更多人寻求帮助,很多人都愿意伸出援手,大家都在学习。

关于机器/深度学习,有一个误解是需要计算机科学的背景才能学习。这不是真的,你确实需要一些编程的思维才好入手,但也仅限于此。现在机器学习领域的很多专家,都来自其他研究领域。

如果你有计算机科学的背景,这是一个非常好的开始。但如果你出身其他学科,想要迎头赶上并不难。

感谢看到这里。

原作:Masum Hasan

问耕 编译整理

原作地址:

medium.com/@youngladesh


欢迎大家关注我们的专栏: 量子位 - 知乎专栏

编辑于 2018-11-23 19:17

我来总结下我从一个小白到在国际顶会上发 paper 的学习经验。

深度学习的资料非常多,但这也成为了深度学习坑最大的地方,学习者很容易迷失在各种资料当中,最后只看了个皮毛。所以,我认为学习深度学习一开始就要盯着你挑选的那么一两个资料学习,最多不要同时看三本书。深度学习是一个理论与实践相结合的学科,所以我建议找一本理论和实践都覆盖的书,或者一本书讲理论,然后找些代码做实验。下面来说说我自己学习的总结的一条路径,难度由简到难,由浅到深。永远不要忽视基础,他们不是你学会之后就可以抛弃的东西,而是一点点积累让你达到更高高度的坚实台阶。

1. 入门材料。我推荐 Neural networks and deep learning,这本简短的书满足了上面我所说的既注重理论又有充分的实验代码伴随。这本书先是引入了最原始最简单的神经元和神经网络的概念,然后一步步引出全连接网络、激活函数、反向传播、优化方法、卷积神经网络等深度学习中最基本的内容,然后还给出一个视觉上的(非严格的)证明,神经网络可以计算任意函数(严格来讲,是有限制条件的)。书中还有大量的配图(其中还有很多可交互的动图),非常有助于理解。这本书对应的是作者自己的 python 代码,自己从头实现一个神经网络非常有助于理解。这本书真正做到了深入浅出,在不失理论深度的同时让难度变得很低。下图就是它展示改进学习方法的一个例子,你甚至可以在浏览器里面改变参数的值然后点击右下角的按钮立马看到反馈效果,看到 cost 曲线是如何下降的


2. 找一本更深入的书学习理论,挑一个喜欢的框架可以做实验。我在入门深度学习的时候没有专门讲这个话题的书,还得自己寻找各种资料,看 paper,走了很多弯路,现在的同学可以直接看 Deep Learning 这本书了,对于基础理论讲的非常详尽了,是深入理解的一条捷径。至于框架,挑个主流的、教程完备的,我推荐 pytorch/tensorflow/mxnet 里面选一个,我个人比较喜欢 pytorch,程序非常优雅简洁。然后一边看书一边做实验,把书中的东西能实现的实现一下,把框架里面的教程也都跑一遍,这样你对于深度学习就入门了。

从这里开始,接下来你的学习可以分成两个分支了,分别对应理论和工业实践。

3.1 找一个专门的问题开始钻研,不断地试验自己的想法,前人没有的想法。同时阅读这个领域最新的文章,尝试实现。比如你可以挑物体检测这个问题,既然你对于理论和实践都已经比较熟练了,你完全可以开始修改别人的网络架构,改变训练的模式,尝试把先验信息加进来。总之,有很多的玩法都可以实验。说不定玩着玩着就能写一篇文章出来发表。

3.2 尝试实现一个自己的深度学些框架。目前深度学习离不开 c/c++ 和 cuda,所以你可以从头写一个 c/c++ 版本的,把坑自己踩一遍,这样工程能力肯定大为提高。或者,你也可以利用现有框架的后端实现一个前端,这样你对于这些框架后端的理解也能够大为提高。且你的所有的想法都可以写进这个前端里面。比如 pytorch 就是用 torch 的后端实现了一个 python 的前端,而且相比于原版的 torch 有了很多改进。

编辑于 2017-07-16 22:17

先看你有没有相关的应用需求,如果有的话就太好了。借助情景学习起来非常快。

Tutorial

  • Deep Learning Tutorial from Stanford - Stanford计算机系的官方tutorial,Andrew Ng执笔。要想了解DL的原理,这个最好用了。

论文

  • The Learning Machines - 一个导论性质的文章,让你大致了解深度学习是什么,用来干什么的。

  • Deep Learning - (Review Article in Nature, May 2015) 三大神 Yann LeCun, Yoshua Bengio, and Geoffrey Hinton的文章,不解释。

  • Growing Pains in Deep Learning

  • Deep Learning in Neural Networks - This technical report provides an overview of deep learning and related techniques with a special focus on developments in recent years. 主要看点是深度学习近两年(2012-2014)的进展情况。

课程

  • Neural Networks for Machine Learning - Geoffrey Hinton在Coursera开设的MOOC。现在没有重新开课,但里面的资料都有,论坛也开放。

  • Oxford Deep Learning - Nando de Freitas 在 Oxford 开设的深度学习课程,有全套视频。

教材

  • Deep Learning - Yoshua Bengio, Ian Goodfellow and Aaron Courville,目前最权威的DL教材了

几个常用的深度学习代码库:

  • H2O - 一个开源的可扩展的库,支持Java, Python, Scala, and R

  • Deeplearning4j - Java库,整合了Hadoop和Spark

  • Caffe - Yangqing Jia读研究生的时候开发的,现在还是由Berkeley维护。

  • Theano - 最流行的Python库


News

  • Deep Learning News - 紧跟深度学习的新闻、研究进展和相关的创业项目。

So,各位加油咯!!!



--------------------------------------------------------补 充--------------------------------------------------------------------------

另外建议看看大神Yoshua Bengio的推荐(左边的链接是论文,右边的是代码),有理论有应用(主要应用于CV和NLP)

  • Page on Toronto, Home Page of Geoffrey Hinton
  • Page on Toronto, Home Page of Ruslan R Salakhutdinov
  • Page on Wustl, ynd/cae.py · GitHub
  • Page on Icml, https://github.com/lisa-lab/pyle...
  • Page on Jmlr, pylearn2)
  • On the difficulty of training recurrent neural networks, trainingRNNs
  • ImageNet Classification with Deep Convolutional Neural Networks, cuda-convnet - High-performance C++/CUDA implementation of convolutional neural networks - Google Project Hosting
  • Linguistic Regularities in Continuous Space Word Representations, word2vec - Tool for computing continuous distributed representations of words. - Google Project Hosting
编辑于 2016-06-29 00:58

任何列书单和在线视频超过10条的,基本都是混子。

列了几十本书和几百小时在线视频的人,大部分自己连1/10都没读完过。

这种人统称为“书单教育家”,代表人物就是罗文益。

要我说,读一本deep learning和PRML,读python和numpy的官方文档,看一个Andrew Ng和Hinton的coursera,剩下的读一读经典paper和github开源代码,动手造造轮子,就完全足够入门了。

入门个Python就给你介绍10本入门教材,一个Bayesian介绍5个online course,你觉得这些罗文益们是在帮你还是在害你?

编辑于 2017-04-13 13:46

这学期上CMU的11-747( Neural Networks for NLP),发现教材很不错:Neural Network Methods for Natural Language Processing(以下简称NNM4NLP)。

虽然名字里有NLP,但是主要还是讲神经网络。和Bengio那本Deep Learning比起来,这本书有这么几个优点:

  1. 彩色。好看是第一生产力不解释。
  2. 易懂。作者文笔很流畅,看起来比较顺眼。而且数学公式的量也比较合适,符号都是通用符号。而且图非常多!!!还是彩图!!!(再次看脸)比如RNN那章,每种网络结构都有图解,极其便于理解。
  3. 深度广度适中。DL那本书感觉像工具书,适合入门之后随时翻阅。NNM4NLP比较侧重于网络结构,什么训练的trick啊之类的具体细节都以引用的形式给出,想深入了解可以进一步阅读相关文献。
  4. 内容新。这本书是2017年出版的,在DL这种『3个月就过时』的领域(Graham原话),接触前沿是很有必要的。

电子版可以去libgen搜『Neural Network Methods in Natural Language Processing』。注意介词是IN不是FOR!原书名是FOR但是不知为什么libgen只能用IN搜到。

编辑于 2018-01-31 12:02

收藏是点赞的6倍,能不能给个赞 >.<


原文: How-do-I-learn-deep-learning-in-2-months


如果您具有数学和计算机科学方面的工程背景或相关知识的编码经验,只需两个月即可熟练掌握深度学习。 难以置信? 四步使它成为可能。

欲了解更多,请往下看


Step 1: 学习机器学习基础

(可选,但强烈推荐)

开始于Andrew Ng的机器学习 机器学习 - 斯坦福大学。他的课程介绍了目前各种机器学习算法,更重要的是机器学习的一般程序和方法,包括数据预处理,超参数调优等。

同时推荐阅读由Geoff Hinton,Yoshua Bengio和Yann LeCun提供的 NIPS 2015深度学习教程,其中介绍略少一些。




Step 2: 深入学习

个人的学习偏好是观看演讲视频,并有几个优秀的课程在线。 这里有几个特别喜欢的课程,可以推荐:

  • Deep learning at Oxford 2015 由Nando de Freitas教授解释基础知识,不会过于简单。 如果您已经熟悉神经网络并希望深入,请从第9讲开始。 他在他的例子中使用Torch framework。 ( Videos on Youtube)
  • Neural Networks for Machine Learning Geoffrey Hinton在Coursera上的课程。Hinton是一位优秀的研究人员,他们展示了广义 反向传播算法的使用,对 深度学习的发展至关重要。
  • Neural Networks Class by Hugo Larochelle: 另一个优秀的课程
  • Yaser Abu-Mostafa’s machine learning course: 如果你有更多的理论感兴趣

如果你更喜欢的是书籍,这里有一些优秀的资源。 去查看一下,我不做判断。

  • Neural Networks and Deep Learning Book by Michael Nielsen’s:在线学习书,并有几个交互式JavaScript元素可以玩。
  • Deep Learning Book by Ian Goodfellow, Yoshua Bengio和Aaron Courville:比较密集,但莫非不是一个很好的资源




Step 3: 选择一个区域并进一步深入


确定自己继续深入学习的热情。 这个领域是巨大的,所以这个列表绝对不是一个全面的列表。

  • 计算机视觉 : 深入学习已经改变了这一领域。 斯坦福大学的CS231N课程由Andrej Karpathy的课程是我遇到的最好的课程; CS231n卷积神经网络视觉识别。 它向您介绍了基础知识以及covnets,以及帮助您在AWS中设置GPU实例。 另请参阅 Mostafa S. Ibrahim的“ 计算机视觉入门”
  • 自然语言处理 (NLP):用于机器翻译,问答,情绪分析。 要掌握这一领域,需要深入了解这两种算法和自然语言的基础计算属性。 CS 224N / Ling 284 by Christopher Manning 是一个很棒的课程。 CS224d:自然语言处理的深度学习,另一个斯坦福大学的学者David Socher( MetaMind的创始人)也是一个很好的课程,可以解决与NLP相关的所有最新的深入学习研究。 有关详细信息,请参阅 如何学习自然语言处理?
  • 记忆网络 (RNN-LSTM) : 在LSTM中将注意力机制结合在一起的循环神经网络与外部可写内存意味着一些有趣的工作,可以构建能够以问题和回答方式理解,存储和检索信息的系统。 这个研究领域从纽约大学Yann Lecun博士的Facebook AI实验室开始。 原始文章是在arxiv: 记忆网络。 有许多研究变体,数据集,基准等来源于这项工作,例如,Metamind的 自然语言处理动态内存网络
  • 深度加强学习 : 由AlphaGo着名,Go-playing系统击败了历史上最强的Go玩家。 David Silver's(Google Deepmind)的 RL视频讲座和 Rich Stutton教授的书是一个很好的开始。 对于LSTM的温柔介绍,请参阅Christopher关于了解 LSTM网络和Andrej Karpathy的“ 经典神经网络的不合理有效性”
  • 生成模型: 虽然歧视性模型试图检测,识别和分离事物,但是他们最终会寻找在基础层面上区分和不理解数据的功能。 除了短期应用之外,生成模型还提供了自动学习自然特征的潜力; 类别或尺寸或其他完全。 在三种常用的生成模型中, 生成对抗网络(GANs), 变体自动编码器(VAEs)和自回归模型(如 PixelRNN),GAN最受欢迎。深入阅读:
    • Original GAN paper by Ian Goodfellow 等等 .
    • The Laplacian Adversarial Networks (LAPGAN) Paper (LAPGAN) 这固定了稳定性问题
    • The Deep Convolutional Generative Adversarial Networks (DCGAN) paper 和 DCGAN Code 它可以用于在没有任何监督的情况下学习功能的层次结构。 另外,查看 DCGAN used for Image Superresolution



Step 4: 建立项目


做是成为专家的关键。 尝试建立一些你感兴趣的、并符合你的技能水平的东西。 以下是一些建议,让您思考:

  • 按照传统,首先对 MNIST数据集进行分类
  • 在 ImageNet上尝试面部检测和分类。 如果你这样做,做 ImageNet挑战2017。
  • 使用 RNN或 CNN进行Twitter情感分析
  • 教授神经网络来重现着名画家的艺术风格( 艺术风格的神经算法)
  • 用循环神经网络构成音乐
  • 使用深加强学习玩乒乓球
  • 神经网络评估自拍
  • 彩色黑白图片使用深度学习


欲了解更多,请查看CS231n Winter 2017、 Winter 2016& Winter 2015项目。 还要关注Kaggle和HackerRank的比赛,以获得有趣的东西以及竞争和学习的机会。



其他资源

以下是一些指导,帮助你持续学习

  • 阅读一些优秀的博客。 克里斯托弗·奥拉( Christopher Olah)的博客和安德鲁·卡皮斯( Andrew Karpathy)的博客都很好地解释了基本概念和最近的突破
  • 在Twitter上关注影响力。 以下是几个开始@drfeifei,@ylecun,@karpathy,@AndrewYNg,@Kdnuggets,@OpenAI,@googleresearch。 (见: 谁在Twitter上关注机器学习信息?)
  • Google+深度学习社区,Yann Lecunn,是与深度学习创新保持联系以及与其他深入学习专业人士和爱好者沟通的好方法。


请参阅 ChristosChristofidis / awesome-deep-learning,这是一个精心设计的Deep Learning教程,项目和社区,让学习更轻松。



翻译很辛苦,还有一些没有写出来,放在专栏里。 深度学习入门资源


只是介绍一种学习方法,里面的内容你不可能全看
在每一步下,选择一个或两个就足够了
方向很重要


想起一句话:大学~大不了自学。公众号:Python爬虫与算法进阶

编辑于 2018-05-31 23:36

动手永远是最快学会东西的!

所以,我建议直接用 TensorLayer [1] 来学,官网有DL 和RL 的教程以及配套的代码。它是基于 TensorFlow 开发的,是现在工业界和学术界比较火的框架。

简单来说,TL和其它库一样都提供 layer 的高级抽象,但它还提供了很多end-to-end workflow的函数,包括data pre-processing, training, post-processing, serving modules and database management,使得开发者只需要TL一个库就可以搭建整个学习系统或产品了。

对于 layer 抽象,《 Review of TensorFlow sugar coatings》 比较了主要的TensorFlow Wrappers,包括TFSlim, SugarTensor, Keras, TFlearn, PrettyTensor 等。

此外还有大量的例子代码 [2-3], 其中包含了TensorFlow官网教学的再实现,方便读者对比学习。

[1] TensorLayer Github

[2] TensorLayer 例子

[3] 第三方例子

[4] TensorLayer 英文文档

[5] TensorLayer 中文文档

[6] Review of TensorFlow sugar coatings

最后送大家Ian Goodfellow, Yoshua Bengio 和 Aaron Courville写的 《Deep Learning》 pdf版。以及全套RL实现!

编辑于 2019-06-21 22:02

想不到邱教授也给我点赞了(这门课上学期选了又退了 )

--------------------分割线---------------------

想要入门还是要系统的看书,看视频我觉得是学不到精髓的。

推荐复旦大学教授 邱锡鹏的教学资料,感兴趣的可以看看他的个人履历。

地址: 神经网络与深度学习

免费的pdf,比csdn,百度上的大部分博客讲的都更清楚。(还更新!!!)

因为上过他的课,才知道有这个资料的存在,小白入门必不可少啊

举个例子,书里面使怎么讲参数初始化:

绝对比到处抄袭的csdn清楚多了。

还有,赞我上去,让别人看到这份资料,排名高的答案我真的觉得只能看看,没有什么实际操作性。

编辑于 2018-11-09 07:11

这个问题下,已经有很多知友分享了不少入门教程,但是深度学习技术发展很快,哪怕入门知识也会很快过时,因此授人以鱼不如授人以渔。下面列举了一些不仅可以获取到最新的深度学习入门资源,也可以及时跟进当前研究进展的途径,希望能对你有所帮助:

微信公众号

有很多和深度学习相关的公众号,对学术相关进展的跟进都很及时,可以考虑有选择的关注:

  • 机器之心
  • 智能立方:
  • paperweekly
  • 哈工大scir
  • 将门创投
  • 炼丹实验室
  • 机器学习研究会
  • AI科技评论
  • 全球人工智能
  • 深度学习大讲堂

邮箱订阅

通过邮箱,订阅一些资源的推送,是很有必要的:

  • Arxiv:计算机领域,特别是深度学习领域的最新论文,一般都会先出现在Arxiv上,除了天天到Arxiv相关类别刷论文之外,也可以通过邮箱订阅自己感兴趣的类别: arxiv.org/help/subscrib
  • 好东西传送门:包含机器学习日报,NLP日报,大数据日报,Python日报等很实用的内容,建议订阅: Memory Connected
  • 大牛的最新Paper:可以通过Google学术,订阅一些深度学习领域大牛的论文,这样一旦他们有新论文,有可以通过邮件及时得到通知,下面是我的一些订阅,不全,仅供参考:
    • Geoffrey Hinton
    • Yann LeCun
    • Yoshua Bengio
    • Andrej Karpathy
    • andrew Y ng
    • Richard Socher
    • Tomas Mikolov
    • Oriol Vinyals
    • Percy Liang
    • Jason Weston
    • Hang Li
    • Tie-Yan Liu

知乎专栏

知乎上有很多和深度学习相关的专栏,而且在知乎上可以很方便的和作者进行互动交流,也是一个很方便的方式,下面是一些我订阅的 知乎专栏:

  • 炼丹实验室
  • 机器之心
  • 超智能体
  • PaperWeekly
  • 深度学习:从入门到放弃
  • 智能单元
  • 深度学习大讲堂

网站

这里收藏了一些不错的和深度学习相关的资源网站,可以参考: rsarxiv.github.io, 经常包含一些最新的Deep Learning in NLP论文中文简介 nlp.hivefire.com ,包含最新的NLP资讯和论文 github.com/dennybritz/d ,作者在Google Brain,会经常更新一些自己读论文的笔记。 reddit.com/r/MachineLea ,Reddit的机器学习版,氛围活跃,大牛云集。

微信交流群

  • PaperWeekly: 想加群,请联系微信号:zhangjun168305, 群里的交流活跃,学术氛围很好。
  • 将门微信群: 里面大牛云集,想加群,请加群请关注将门创投的订阅号,里面有入群方式。

社交网络

国内大牛一般是微博,国外大牛一般是Twitter,关注一下他们,可以了解到很多第一手的消息。


上面是我平时收集深度学习论文和资讯的方式总结。我觉得更容易面临的问题,不是信息匮乏,而是信息负载,因此在有限的时间里,学会选择适合的阅读内容,更为重要。

编辑于 2017-01-18 10:38

视频教学

一、基本变换:层

神经网络是由一层一层构建的,那么每究竟在做什么?

  • 数学式子\vec{y}= a(W\cdot\vec{x} + {b}),其中\vec{x}是输入向量,\vec{y}是输出向量,\vec{b}是偏移向量,W是权重矩阵,a()是激活函数。每一层仅仅是把输入\vec x经过如此简单的操作得到\vec y
  • 数学理解:通过如下5种对输入空间(输入向量的集合)的操作,完成 输入空间 ——> 输出空间 的变换 (矩阵的行空间到列空间)。
    注:用“空间”二字的原因是被分类的并不是单个事物,而是一类事物。空间是指这类事物所有个体的集合。
    • 1. 升维/降维
    • 2. 放大/缩小
    • 3. 旋转
    • 4. 平移
    • 5. “弯曲”
      这5种操作中,1,2,3的操作由W\cdot\vec{x}完成,4的操作是由+\vec{b}完成,5的操作则是由a()来实现。 (此处有动态图 5种空间操作,帮助理解)


每层神经网络的数学理解:用线性变换跟随着非线性变化,将输入空间投向另一个空间
  • 物理理解:对 W\cdot\vec{x} 的理解就是通过组合形成新物质 a()又符合了我们所处的世界都是非线性的特点。
    • 情景:\vec{x}是二维向量,维度是碳原子和氧原子的数量 [C;O],数值且定为[1;1],若确定\vec{y}是三维向量,就会形成如下网络的形状 (神经网络的每个节点表示一个维度)。通过改变权重的值,可以获得若干个不同物质。右侧的节点数决定了想要获得多少种不同的新物质。(矩阵的行数)

1.如果权重W的数值如(1),那么网络的输出y⃗ 就会是三个新物质,[二氧化碳,臭氧,一氧化碳]。 \left[ \begin{matrix} CO_{2}\\ O_{3}\\ CO \end{matrix} \right]= \left[ \begin{matrix} 1 & 2 \\ 0 & 3\\ 1 & 1 \end{matrix} \right] \cdot \left[ \begin{matrix} C \\ O \\ \end{matrix} \right] (1)

    • 2.也可以减少右侧的一个节点,并改变权重W至(2),那么输出\vec{y} 就会是两个新物质,[ O_{0.3};CO_{1.5}]\left[ \begin{matrix} O_{0.3}\\ CO_{1.5}\\ \end{matrix} \right]= \left[ \begin{matrix} 0& 0.3 \\ 1 & 1.5\\ \end{matrix} \right] \cdot \left[ \begin{matrix} C \\ O \\ \end{matrix} \right](2)
      3.如果希望通过层网络能够从[C, O]空间转变到[CO_{2};O_{3};CO]空间的话,那么网络的学习过程就是将W的数值变成尽可能接近(1)的过程 。如果再加一层,就是通过组合[CO_{2};O_{3};CO]这三种基础物质,形成若干更高层的物质。 4.重要的是这种组合思想,组合成的东西在神经网络中并不需要有物理意义。


每层神经网络的物理理解:通过现有的不同物质的组合形成新物质

二、理解视角:

现在我们知道了每一层的行为,但这种行为又是如何完成识别任务的呢?

数学视角:“线性可分”

  • 一维情景:以分类为例,当要分类正数、负数、零,三类的时候,一维空间的直线可以找到两个超平面(比当前空间低一维的子空间。当前空间是直线的话,超平面就是点)分割这三类。但面对像分类奇数和偶数无法找到可以区分它们的点的时候,我们借助 x % 2(取余)的转变,把x变换到另一个空间下来比较,从而分割。


  • 二维情景:平面的四个象限也是线性可分。但下图的红蓝两条线就无法找到一超平面去分割。

神经网络的解决方法依旧是转换到另外一个空间下,用的是所说的5种空间变换操作。比如下图就是经过放大、平移、旋转、扭曲原二维空间后,在三维空间下就可以成功找到一个超平面分割红蓝两线 (同SVM的思路一样)。

上面是一层神经网络可以做到的,如果把\vec{y} 当做新的输入再次用这5种操作进行第二遍空间变换的话,网络也就变为了二层。最终输出是\vec{y}= a_{2}(W_{2}\cdot(a_{1}(W_{1}\cdot\vec{x} + {b}_{1})) + {b}_{2})
设想网络拥有很多层时,对原始输入空间的“扭曲力”会大幅增加,如下图,最终我们可以轻松找到一个超平面分割空间。


当然也有如下图失败的时候,关键在于“如何扭曲空间”。所谓监督学习就是给予神经网络网络大量的训练例子,让网络从训练例子中学会如何变换空间。每一层的权重W就控制着如何变换空间,我们最终需要的也就是训练好的神经网络的所有层的权重矩阵。


这里有非常棒的 可视化空间变换demo,一定要打开尝试并感受这种扭曲过程。更多内容请看 Neural Networks, Manifolds, and Topology。

线性可分视角:神经网络的学习就是学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投向线性可分/稀疏的空间去分类/回归。
增加节点数:增加维度,即增加线性转换能力。 增加层数:增加激活函数的次数,即增加非线性转换次数。

物理视角:“物质组成”

  • 类比:回想上文由碳氧原子通过不同组合形成若干分子的例子。从分子层面继续迭代这种组合思想,可以形成DNA,细胞,组织,器官,最终可以形成一个完整的人。继续迭代还会有家庭,公司,国家等。这种现象在身边随处可见。并且原子的内部结构与太阳系又惊人的相似。不同层级之间都是以类似的几种规则再不断形成新物质。你也可能听过分形学这三个字。可通过观看 从1米到150亿光年来感受自然界这种层级现象的普遍性。


  • 人脸识别情景:我们可以模拟这种思想并应用在画面识别上。由像素组成菱角再组成五官最后到不同的人脸。每一层代表不同的不同的物质层面 (如分子层)。而每层的W存储着如何组合上一层的物质从而形成新物质
    如果我们完全掌握一架飞机是如何从分子开始一层一层形成的,拿到一堆分子后,我们就可以判断他们是否可以以此形成方式,形成一架飞机。
    附: Tensorflow playground展示了数据是如何“流动”的。


物质组成视角:神经网络的学习过程就是学习物质组成方式的过程。
增加节点数:增加同一层物质的种类,比如118个元素的原子层就有118个节点。 增加层数:增加更多层级,比如分子层,原子层,器官层,并通过判断更抽象的概念来识别物体。

三、神经网络的训练

知道了神经网络的学习过程就是学习控制着空间变换方式(物质组成方式)的权重矩阵后,接下来的问题就是如何学习每一层的权重矩阵W。

如何训练:

既然我们希望网络的输出尽可能的接近真正想要预测的值。那么就可以通过比较当前网络的预测值和我们真正想要的目标值,再根据两者的差异情况来更新每一层的权重矩阵(比如,如果网络的预测值高了,就调整权重让它预测低一些,不断调整,直到能够预测出目标值)。因此就需要先定义“如何比较预测值和目标值的差异”,这便是损失函数或目标函数(loss function or objective function),用于衡量预测值和目标值的差异的方程。loss function的输出值(loss)越高表示差异性越大。那神经网络的训练就变成了尽可能的缩小loss的过程。
所用的方法是梯度下降(Gradient descent):通过使loss值向当前点对应梯度的反方向不断移动,来降低loss。一次移动多少是由学习速率(learning rate)来控制的。

梯度下降的问题:

然而使用梯度下降训练神经网络拥有两个主要难题。

1、局部极小值

梯度下降寻找的是loss function的局部极小值,而我们想要全局最小值。如下图所示,我们希望loss值可以降低到右侧深蓝色的最低点,但loss有可能“卡”在左侧的局部极小值中。

试图解决“卡在局部极小值”问题的方法分两大类:

  • 调节步伐:调节学习速率,使每一次的更新“步伐”不同。常用方法有:
  • 随机梯度下降(Stochastic Gradient Descent (SGD):每次只更新一个样本所计算的梯度
  • 小批量梯度下降(Mini-batch gradient descent):每次更新若干样本所计算的梯度的平均值
  • 动量(Momentum):不仅仅考虑当前样本所计算的梯度;Nesterov动量(Nesterov Momentum):Momentum的改进
  • Adagrad、RMSProp、Adadelta、Adam:这些方法都是训练过程中依照规则降低学习速率,部分也综合动量
  • 优化起点:合理初始化权重(weights initialization)、预训练网络(pre-train),使网络获得一个较好的“起始点”,如最右侧的起始点就比最左侧的起始点要好。常用方法有:高斯分布初始权重(Gaussian distribution)、均匀分布初始权重(Uniform distribution)、Glorot 初始权重、He初始权、稀疏矩阵初始权重(sparse matrix)

2、梯度的计算

机器学习所处理的数据都是高维数据,该如何快速计算梯度、而不是以年来计算。
其次如何更新隐藏层的权重?
解决方法是:计算图:反向传播算法
这里的解释留给非常棒的 Computational Graphs: Backpropagation
需要知道的是,反向传播算法是求梯度的一种方法。如同快速傅里叶变换(FFT)的贡献。
而计算图的概念又使梯度的计算更加合理方便。

基本流程图:

下面就结合图简单浏览一下训练和识别过程,并描述各个部分的作用。要结合图解阅读以下内容。但手机显示的图过小,最好用电脑打开


  • 收集训练集(train data):也就是同时有input以及对应label的数据。每个数据叫做训练样本(sample)。label也叫target,也是机器学习中最贵的部分。上图表示的是我的数据库。假设input本别是x的维度是39,label的维度是48。
  • 设计网络结构(architecture):确定层数、每一隐藏层的节点数和激活函数,以及输出层的激活函数和损失函数。上图用的是两层隐藏层(最后一层是输出层)。隐藏层所用激活函数a( )是ReLu,输出层的激活函数是线性linear(也可看成是没有激活函数)。隐藏层都是1000节点。损失函数L( )是用于比较距离MSE:mean((output - target)^2)。MSE越小表示预测效果越好。训练过程就是不断减小MSE的过程。到此所有数据的维度都已确定:
    • 训练数据:input \in R^{39} ;label \in R^{48}
    • 权重矩阵:W_{h1}\in R^{1000x39};W_{h2}\in R^{1000x1000} ;W_{o}\in R^{48x1000}
    • 偏移向量:b_{h1}\in R^{1000};b_{h2}\in R^{1000} ;b_{o}\in R^{48}
    • 网络输出:output \in R^{48}


  • 数据预处理(preprocessing):将所有样本的input和label处理成能够使用神经网络的数据,label的值域符合激活函数的值域。并简单优化数据以便让训练易于收敛。比如中心化(mean subtraction)、归一化(normlization)、主成分分析(PCA)、白化(whitening)。假设上图的input和output全都经过了中心化和归一化。
  • 权重初始化(weights initialization)W_{h1},W_{h2},W_{0}在训练前不能为空,要初始化才能够计算loss从而来降低。W_{h1},W_{h2},W_{0}初始化决定了loss在loss function中从哪个点开始作为起点训练网络。上图用均匀分布初始权重(Uniform distribution)。
  • 训练网络(training):训练过程就是用训练数据的input经过网络计算出output,再和label计算出loss,再计算出gradients来更新weights的过程。
    • 正向传递:,算当前网络的预测值output =linear (W_{o} \cdot Relu(W_{h2}\cdot Relu(W_{h1}\cdot input+b_{h1})+b_{h2}) +b_{o})
    • 计算loss:loss = mean((output - target)^2)
    • 计算梯度:从loss开始反向传播计算每个参数(parameters)对应的梯度(gradients)。这里用Stochastic Gradient Descent (SGD) 来计算梯度,即每次更新所计算的梯度都是从一个样本计算出来的。传统的方法Gradient Descent是正向传递所有样本来计算梯度。SGD的方法来计算梯度的话,loss function的形状如下图所示会有变化,这样在更新中就有可能“跳出”局部最小值。


    • 更新权重:这里用最简单的方法来更新,即所有参数都 W = W - learningrate * gradient
    • 预测新值:训练过所有样本后,打乱样本顺序再次训练若干次。训练完毕后,当再来新的数据input,就可以利用训练的网络来预测了。这时的output就是效果很好的预测值了。下图是一张实际值预测值的三组对比图。输出数据是48维,这里只取1个维度来画图。蓝色的是实际值,绿色的是实际值。最上方的是训练数据的对比图,而下方的两行是神经网络模型从未见过的数据预测对比图。(不过这里用的是RNN,主要是为了让大家感受一下效果)

编辑于 2018-09-28 13:44

关于深度学习,网上的资料很多,不过貌似大部分都不太适合初学者。 这里有几个原因: 1.深度学习确实需要一定的数学基础。如果不用深入浅出地方法讲,有些读者就会有畏难的情绪,因而容易过早地放弃。 2.中国人或美国人写的书籍或文章,普遍比较难一些。我不太清楚为什么,不过确实是这样子的。

深度学习,确实需要一定的数学基础,但真的那么难么?这个,还真没有。不信?听我来给你侃侃。看完,你也会觉得没那么难了。

本文是针对初学者,高手可以无视,有不对的地方,还请多多批评指正。

这里,先推荐一篇非常不错的文章: 《1天搞懂深度学习》,300多页的ppt,台湾李宏毅教授写的,非常棒。 不夸张地说,是我看过最系统,也最通俗易懂的,关于深度学习的文章。

这是slideshare的链接: http://www.slideshare.net/tw_dsconf/ss-62245351?qid=108adce3-2c3d-4758-a830-95d0a57e46bc&amp;v=&amp;b=&amp;from_search=3

没梯子的同学,可以从我的网盘下: 链接: pan.baidu.com/s/1nv54p9 密码:3mty

要说先准备什么,私以为,其实只需要知道导数和相关的函数概念就可以了。高等数学也没学过?很好,我就是想让文科生也能看懂,您只需要学过初中数学就可以了。

其实不必有畏难的情绪,个人很推崇李书福的精神,在一次电视采访中,李书福说:谁说中国人不能造汽车?造汽车有啥难的,不就是四个轮子加两排沙发嘛。当然,他这个结论有失偏颇,不过精神可嘉。

导数是什么,无非就是变化率呗,王小二今年卖了100头猪,去年卖了90头,前年卖了80头。。。变化率或者增长率是什么?每年增长10头猪,多简单。这里需要注意有个时间变量---年。王小二卖猪的增长率是10头/年,也就是说,导数是10. 函数y=f(x)=10x+30,这里我们假设王小二第一年卖了30头,以后每年增长10头,x代表时间(年),y代表猪的头数。 当然,这是增长率固定的情形,现实生活中,很多时候,变化量也不是固定的,也就是说增长率也不是恒定的。比如,函数可能是这样: y=f(x)=5x²+30,这里x和y依然代表的是时间和头数,不过增长率变了,怎么算这个增长率,我们回头再讲。或者你干脆记住几个求导的公式也可以。

深度学习还有一个重要的数学概念:偏导数,偏导数的偏怎么理解?偏头疼的偏,还是我不让你导,你偏要导?都不是,我们还以王小二卖猪为例,刚才我们讲到,x变量是时间(年),可是卖出去的猪,不光跟时间有关啊,随着业务的增长,王小二不仅扩大了养猪场,还雇了很多员工一起养猪。所以方程式又变了:y=f(x)=5x₁²+8x₂ + 35x₃ +30 这里x₂代表面积,x₃代表员工数,当然x₁还是时间。 上面我们讲了,导数其实就是变化率,那么偏导数是什么?偏导数无非就是多个变量的时候,针对某个变量的变化率呗。在上面的公式里,如果针对x₃求偏导数,也就是说,员工对于猪的增长率贡献有多大,或者说,随着(每个)员工的增长,猪增加了多少,这里等于35---每增加一个员工,就多卖出去35头猪. 计算偏导数的时候,其他变量都可以看成常量,这点很重要,常量的变化率为0,所以导数为0,所以就剩对35x₃ 求导数,等于35. 对于x₂求偏导,也是类似的。 求偏导我们用一个符号 表示:比如 y/ x₃ 就表示y对 x₃求偏导。

废话半天,这些跟深度学习到底有啥关系?有关系,我们知道,深度学习是采用神经网络,用于解决线性不可分的问题。关于这一点,我们回头再讨论,大家也可以网上搜一下相关的文章。我这里主要讲讲数学与深度学习的关系。先给大家看几张图:

图1. 所谓深度学习,就是具有很多个隐层的神经网络。


图2.单输出的时候,怎么求偏导数

图3.多输出的时候,怎么求偏导数。后面两张图是日语的,这是日本人写的关于深度学习的书。感觉写的不错,把图盗来用一下。所谓入力层,出力层,中间层,分别对应于中文的:输入层,输出层,和隐层。

大家不要被这几张图吓着,其实很简单的。干脆再举一个例子,就以撩妹为例。男女恋爱我们大致可以分为三个阶段: 1.初恋期。相当于深度学习的输入层。别人吸引你,肯定是有很多因素,比如:身高,身材,脸蛋,学历,性格等等,这些都是输入层的参数,对每个人来说权重可能都不一样。 2.热恋期。我们就让它对应于隐层吧。这个期间,双方各种磨合,柴米油盐酱醋茶。 3.稳定期。对应于输出层,是否合适,就看磨合得咋样了。

大家都知道,磨合很重要,怎么磨合呢?就是不断学习训练和修正的过程嘛!比如女朋友喜欢草莓蛋糕,你买了蓝莓的,她的反馈是negative,你下次就别买了蓝莓,改草莓了。 ------------------------------------------------------------------------------------------------ 看完这个,有些小伙可能要开始对自己女友调参了。有点不放心,所以补充一下。 撩妹和深度学习一样,既要防止欠拟合,也要防止过拟合。所谓欠拟合,对深度学习而言,就是训练得不够,数据不足,就好比,你撩妹经验不足,需要多学着点,送花当然是最基本的了,还需要提高其他方面,比如,提高自身说话的幽默感等,因为本文重点并不是撩妹,所以就不展开讲了。这里需要提一点,欠拟合固然不好,但过拟合就更不合适了。过拟合跟欠拟合相反,一方面,如果过拟合,她会觉得你有陈冠希老师的潜质,更重要的是,每个人情况不一样,就像深度学习一样,训练集效果很好,但测试集不行!就撩妹而言,她会觉得你受前任(训练集)影响很大,这是大忌!如果给她这个映象,你以后有的烦了,切记切记! ------------------------------------------------------------------------------------------------

深度学习也是一个不断磨合的过程,刚开始定义一个标准参数(这些是经验值。就好比情人节和生日必须送花一样),然后不断地修正,得出图1每个节点间的权重。为什么要这样磨合?试想一下,我们假设深度学习是一个小孩,我们怎么教他看图识字?肯定得先把图片给他看,并且告诉他正确的答案,需要很多图片,不断地教他,训练他,这个训练的过程,其实就类似于求解神经网络权重的过程。以后测试的时候,你只要给他图片,他就知道图里面有什么了。

所以训练集,其实就是给小孩看的,带有正确答案的图片,对于深度学习而言,训练集就是用来求解神经网络的权重的,最后形成模型;而测试集,就是用来验证模型的准确度的。

对于已经训练好的模型,如下图所示,权重(w1,w2...)都已知。

图4

图5

我们知道,像上面这样,从左至右容易算出来。但反过来呢,我们上面讲到,测试集有图片,也有预期的正确答案,要反过来求w1,w2......,怎么办?

绕了半天,终于该求偏导出场了。目前的情况是:

1.我们假定一个神经网络已经定义好,比如有多少层,都什么类型,每层有多少个节点,激活函数(后面讲)用什么等。这个没办法,刚开始得有一个初始设置(大部分框架都需要define-and-run,也有部分是define-by-run)。你喜欢一个美女,她也不是刚从娘胎里出来的,也是带有各种默认设置的。至于怎么调教,那就得求偏导。

2.我们已知正确答案,比如图2和3里的r,训练的时候,是从左至右计算,得出的结果为y,r与y一般来说是不一样的。那么他们之间的差距,就是图2和3里的E。这个差距怎么算?当然,直接相减是一个办法,尤其是对于只有一个输出的情况,比如图2; 但很多时候,其实像图3里的那样,那么这个差距,一般可以这样算,当然,还可以有其他的评估办法,只是函数不同而已,作用是类似的:

不得不说,理想跟现实还是有差距的,我们当然是希望差距越小越好,怎么才能让差距越来越小呢?得调整参数呗,因为输入(图像)确定的情况下,只有调整参数才能改变输出的值。怎么调整,怎么磨合?刚才我们讲到,每个参数都有一个默认值,我们就对每个参数加上一定的数值∆,然后看看结果如何?如果参数调大,差距也变大,你懂的,那就得减小∆,因为我们的目标是要让差距变小;反之亦然。所以为了把参数调整到最佳,我们需要了解误差对每个参数的变化率,这不就是求误差对于该参数的偏导数嘛。

关键是怎么求偏导。图2和图3分别给了推导的方法,其实很简单,从右至左挨个求偏导就可以。相邻层的求偏导其实很简单,因为是线性的,所以偏导数其实就是参数本身嘛,就跟求解x₃的偏导类似。然后把各个偏导相乘就可以了。

这里有两个点:

这里有两个点:一个是激活函数,这主要是为了让整个网络具有非线性特征,因为我们前面也提到了,很多情况下,线性函数没办法对输入进行适当的分类(很多情况下识别主要是做分类),那么就要让网络学出来一个非线性函数,这里就需要激活函数,因为它本身就是非线性的,所以让整个网络也具有非线性特征。另外,激活函数也让每个节点的输出值在一个可控的范围内,这样计算也方便。

貌似这样解释还是很不通俗,其实还可以用撩妹来打比方;女生都不喜欢白开水一样的日子,因为这是线性的,生活中当然需要一些浪漫情怀了,这个激活函数嘛,我感觉类似于生活中的小浪漫,小惊喜,是不是?相处的每个阶段,需要时不时激活一下,制造点小浪漫,小惊喜,比如;一般女生见了可爱的小杯子,瓷器之类都迈不开步子,那就在她生日的时候送一个特别样式,要让她感动得想哭。前面讲到男人要幽默,这是为了让她笑;适当的时候还要让她激动得哭。一哭一笑,多整几个回合,她就离不开你了。因为你的非线性特征太强了。

当然,过犹不及,小惊喜也不是越多越好,但完全没有就成白开水了。就好比每个layer都可以加激活函数,当然,不见得每层都要加激活函数,但完全没有,那是不行的。

由于激活函数的存在,所以在求偏导的时候,也要把它算进去,激活函数,一般用sigmoid,也可以用Relu等。激活函数的求导其实也非常简单:

求导: f'(x)=f(x)*[1-f(x)] 这个方面,有时间可以翻看一下高数,没时间,直接记住就行了。 至于Relu,那就更简单了,就是f(x) 当x<0的时候y等于0,其他时候,y等于x。 当然,你也可以定义你自己的Relu函数,比如x大于等于0的时候,y等于0.01x,也可以。

另一个是学习系数,为什么叫学习系数?刚才我们上面讲到∆增量,到底每次增加多少合适?是不是等同于偏导数(变化率)?经验告诉我们,需要乘以一个百分比,这个就是学习系数,而且,随着训练的深入,这个系数是可以变的。

当然,还有一些很重要的基本知识,比如SGD(随机梯度下降),mini batch 和 epoch(用于训练集的选择),限于篇幅,以后再侃吧。其实参考李宏毅的那篇文章就可以了。

这篇拙文,算是对我另一个回答的补充吧: 深度学习入门必看的书和论文?有哪些必备的技能需学习? - jacky yang 的回答

其实上面描述的,主要是关于怎么调整参数,属于初级阶段。上面其实也提到,在调参之前,都有默认的网络模型和参数,如何定义最初始的模型和参数?就需要进一步深入了解。 不过对于一般做工程而言,只需要在默认的网络上调参就可以了,相当于用算法; 对于学者和科学家而言,他们会发明算法,难度还是不小的。向他们致敬!

写得很辛苦,觉得好就给我点个赞吧:)

------------------------------------------------------------------------------------------------

关于求偏导的推导过程,我尽快抽时间,把数学公式用通俗易懂的语言详细描述一下,前一段时间比较忙,抱歉:)

------------------------------------------------------------------------------------------------

编辑于 2017-05-18 20:06

实战是学习的最好路径。

强烈推荐下自己最近开源的项目,《深度有趣-人工智能实战项目合集》,呕心沥血大半年才完成的作品。

30多个精选实战项目,包括图片分类、人脸识别、物体检测等计算机视觉应用,中文分词、词向量训练、古诗自动生成等自然语言处理项目,DCGAN、CGAN、ACGAN、CycleGAN等经典生成式对抗网络,以及图像标题生成、机器翻译、语音识别和分类、图像风格迁移等有趣的人工智能案例。

项目使用Python3、TensorFlow1.9和Keras2.2,所涉及的文档、代码、数据、模型 全部免费开源,是的,全部免费开源

182页的项目说明文档使用Latex编写,主要是为了达到更好的排版效果,代码也经过精心整理、反复校对、确认无误。

  • 开源项目: https://github.com/Honlan/DeepInterests,欢迎star,这里可以下载到182页的项目说明文档;
  • 项目网盘: pan.baidu.com/s/1zQRTR5,这里可以下载到所有项目所涉及的代码、数据、模型等资源,分为完整版和精简版两个版本,前者包括项目所涉及的完整资源,后者只包括最后执行所需的必要文件;
  • 知乎专栏: 深度有趣,里面包含了全部的线上版文档和代码。

希望这个项目能被更多人了解、从中有所收获并找到乐趣。

献给每一个有趣的灵魂。

编辑于 2018-09-11 17:20

倒时差看到这个,比较有感触回答一下。

先说一下个人情况吧(据说这样可以拿到更多赞)。我15年秋天去CMU读硕士前只接触过最零星的机器学习。在16年夏天就很幸运地加入Facebook Applied Machine Learning(AML) 参与神经网络框架caffe2的开发。也算对这个领域入了门。

我自己认为大家在实战中想用神经网络这门技术所涉及到的知识没有想象的那么多,主要靠四个字:事在人为。

举一个和神经网络无关的例子。前几年iOS特别火,我也在本科选了一门iOS开发。课程的内容很详细,然而我却不上心。老师把iOS生态和各种库讲完一学期后我发现自己还是只会Xcode新建default项目。几个月下来连入门都算不上。按理说iOS开发的教学比神经网络的教学成体系多了,但只听不做的我啥也没学到。相信类似的经历很多人也体验过。

iOS的经历让我觉得前端就是世界上最大的黑魔法。那对于在读这个问题的你来说,神经网络是不是也像个黑魔法呢?数学上要会求导,会凸优化。编程上要会洗数据,跑框架,厉害点的还要写自己的网络甚至搭建分布式训练。这些都具备了以后还要时常跟进新的热点,比如前几年的rcnn到后来的resnet到后来的gan。

神经网络(NN)的技术栈像前端一样越拉越长。我身边做NN做的好的人,也像优秀的前端工程师一样,是笔耕不辍的。随手举例:FB实习期见我有天对我land的代码量很自豪,就去向我的mentor

@贾扬清

炫耀问:你一天land多少代码?杨清说:我每天开很多会 我想我一定land比你少很多。结果系统显示杨清在比我一周多开超过10小时会的情况下多land两倍的代码;又比如

@李沐

学长虽然肩负着pitch Mxnet的重任,但在repo里的代码量也是排前三的(手机打字可能有误);又比如我第一次接触LSTM+CTC的时候train TIMIT根本不收敛,去向

@吴育昕

巨神请教。他虽然也没接触过但欣然答应。帮我调了整整两天发现是epoch不够。他们都是我认识的最高级的炼丹师,但他们也是我认识在神经网络上最勤奋的人。

所以只要肯多做,就算是愚钝如我,也一定能入门。这是最简单的道理,我只是给大家佐上了一些论证和故事罢了:)

发布于 2017-02-22 23:30

距离答案创立已经两年了(?),而答案时隔一年再次更新(17.04.14),回答框架没变,加了很多新的东西。

这个答案不给学习资料,补充点类似于学习路径的东西。

一个领域的成功,既要看自身的努力,也要考虑到历史的进程。学习深度学习的一个很好的路线就是跟着历史的进程学习一番。

除了一些基础的机器学习知识,在学习和理解Deep Learning之前,需要先对于Neural Network和AutoEncoder这两个模型有所了解,特别是后者,AutoEncoder的隐藏层与输入层的关系、使用AutoEncoder来pre-training一个多层网络,以及AE的现状:用来做pre-training的人已经少了(但并不是无效或者效果不好)。

下一步就是要理解『简单的增加神经网络深度』会遇到什么问题。比如梯度弥散和梯度爆炸,比如严重的过拟合,比如计算时间开销。
继续下去,要知道这些问题的原因与解决办法,这一步就映射到神经网络向深度学习的发展过程,比如pre-training(甚至包括大约在10年左右,pre-training技术的变化)、dropout、ReLU等的出现、各种优化算法比如Adam、RMSProp等以及我们现在有能力(计算能力、相对于以前的大数据量)处理深层网络。
到这里,初步理解通常意义的Deep Learning模型就是深度神经网络。

但是接下来的才是关键。

对于不同的应用方向,有不同的具体的DNN的模型,比如CNN之于图像,RNN之于NLP。

这里以CNN为例子。CNN的特殊的一些地方在于:卷积、池化、子采样、白化、权值共享等等非常多的技术。每一个都是一个概念/方法。这是CNN所特有的。如何理解这些技术呢?
动手实现一个LeNet然后跑一下Minst数据集的手写识别(或者自己搞点图像数据),学以致用,会帮助建立好的直觉,甚至可能不懂的地方也慢慢理解了。

不过一个比较有趣的概念是 卷积。
卷积这个东西有很多种理解方式:比如信号处理的理解、数学/物理上的理解等。

『举个例子,这些技术都围绕一个重要的观点:减少网络参数(包括卷积也是有这个功能的)。其实每一个技术,都有自己更具体的意义,但是有共性的地方』。

  • 对于使用CNN,要知道现在最常用的方法:AlexNet、GoogleNet、ResNet等的pre-training+具体问题的fine-tuning这种手段:一定要读一下一些相关paper
  • 至于RNN,个人的经验是建议大家看一看Neural Network Language Model相关的工作。

这是最基础的。

然后我们大概了解,CNN捕捉空间信息(比如图像)、RNN捕捉时序信号(比如语言、语音这种天然的序列)的能力。那么,

  • 对于视频分析,是不是可以结合CNN和RNN?
  • 对于语音声学模型部分,Stack Deep CNN是不是可以近似于long-dependency RNN的效果?
  • 对于翻译,RNN cell使得end-to-end的Sequence to Sequence方法出现。而类似的可以抽象为序列到序列的任务还有哪些?(答案:文本摘要、文本生成、对话等)
  • 等等

还有就是一定要动手,关于Deep Learning的库,我个人最近这些年有一些体验(直说我有经验的):

  • Caffe发展最早,为Deep Learning特别是CNN的发展做出来巨大的推动。C++ Based Code使得它在效率等方面表现很出色,直接打包Caffe代码用于线上Inference也不是特别困难。但是缺点很明显:不是很适合序列学习的任务、对比现在一代的框架开发难度略大。
  • Theano只在当年做毕设的时候简单用过,没有太多感觉,这里不做评价。
  • MXNet我很喜欢,不过目前我个人遇到一个主要的问题在于:使用相同的参数设置,有时无法复现别人的结果(比如对比Tensorflow的Language Model on PTB Dataset);有些接口目前还不稳定;但是MXNet在多级多卡的性能和多级多卡的易用性上是我目前使用的最最最出色的。
  • Tensorflow(别名Tensorslow),社区最大,生态最成熟。现在发布了正式的1.0版本,API已经稳定下来。单机使用的不错的选择(上层可以使用Keras),但是多机性能非常渣(gRPC不吐槽了),单机也没有优化到最好的性能。而且现在代码结构很臃肿,设计上略显乱(反正我不喜欢),写起来完全是在写另外一种语言--不过这点可以使用Keras而忽略。
  • PyTorch,是我目前最爱的框架。主要原因就在于设计上,写起来像是“用丝绸擦过屁股”(出自黑客帝国2)一样爽。不过目前不支持单机。PyTorch的源码是值得很多感兴趣于深度学习框架设计的人读一读的(Caffe也一样)。

其实这里,深度学习框架大概经历了:Caffe代表的基于模板的一代(最小单元是层)、TF、Theano和MXNet代表的符号编程(最小单元是类似于加减乘除的算子)的一代、以及PyTorch(和CMU的DyNet)等的动态计算图的新一代(算是2.5代)。

深度学习的框架还建立了一个和一些一直以来没法参与到深度学习浪潮的计算机方向的桥梁。比如:

  • 编译优化:像是数据库做了多年的图优化、以及编译器方向的一些工作,比如TF的XLA。
  • 硬件方面:FPGA这样的传统硬件、TPU这样的Google专门做的优化硬件、寒武纪这样的专门的深度学习指令芯片等。

而长在框架上面,还有GPU资源调度和管理,GPU、CPU等异构计算的联动等,网络通信的优化,分布式机器学习领域的进一步发展等。


实际上还有很多东西,如GAN、Neural Turing Machine、Deep Bayesian Network等好多我了解或者完全不清楚的方向,但是自觉笔力不足,不知如何安放位置,暂时不写。

以上。

编辑于 2017-04-14 22:37

先了解个大概

A Deep Learning Tutorial: From Perceptrons to Algorithms

神经网络肯定是要学习的,主要是BP算法,可以看看PRML3、4、5三章,可先忽略其中的贝叶斯视角的解释。一些主要的算法理解要看具体的论文了,有个Matlab的程序不错,有基本算法的实现,见

rasmusbergpalm/DeepLearnToolbox · GitHub

。有一本系统的介绍深度学习的书,不过还没写完,样稿见

DEEP LEARNING

。还有评论中提到的UFLDL教程:

Unsupervised Feature Learning and Deep Learning Tutorial
编辑于 2014-10-19 20:05