深度学习进阶线路图

来源:互联网 发布:电脑远程开关机软件 编辑:程序博客网 时间:2024/04/28 00:26

【研究动态】深度学习进阶线路图(一)

dl2

在应用机器学习的时候,最耗时和重要的阶段是对原始数据进行特征提取。深度学习是一个新的机器学习的分支,他要做的就是跨过整个特征设计阶段,而是直接从数据中学习得到。大部分的深度学习方法都是基于神经网络的,在这些结构中,复杂的高层结构是建立在多个非线性神经元函数的多层叠加上的。

其实最容易的介绍神经网络和深度学习的教程是Geoff Hinton’s Coursera course.(AITMR译者注:我以前上过这个课,需要有一定的基础才能听得懂的。)在这个课程中,你能学习得到一些关键思想并能让你自己完成一些简单的算法。(Geoff是这个领域的先驱者,AITMR注:我们大家都习惯叫他祖师爷,他在06在Nature上发表了一篇关于深度学习的文章,被认为是这个领域的第一篇比较详细的文章,并附有代码。)

其实说白了深度学习就是从基本数据中学习,然后让模型工作得更好。但是这个领域目前来说还没有达到这个阶段,就是可以你把数据输进去,然后模型就完全自动的学习了。目前,你还需要判断很多问题:模型过拟合了吗?优化过程完成了吗?需要增加更多的神经元吗?需要增加更多的层数吗?不幸的是,现在对于这些个问题还没有一个共识,因此你需要不管的思考并做实验。为了达到这个水准,你需要深入理解算法的核心内容,和于此相关的一些机器学习的关键知识。这篇文章就是要根据这些点来给出一个进阶帮助你更好的理解深度学习。

如果你以前没怎么看过Metacademy,你可以在 here找到这个网站内容的基本结构和内容简介。登陆Metacademy,基本概念已经用红色标明了。这些将给你一些基本的认识,例如:

dl1

随着更多的内容加入到Metacademy,学习内容会实时更新的。外链用绿色字体显示,尽管我们已经尽可能的去列得详细,但是你还是要根据自己的情况去选择一些。但是你也不同完全按照我们给出的线路图去完成,因为每个人的情况不一样。

You can also check out one of several review papers, which give readable overviews of recent progress in the field:

  • Y. Bengio. Learning deep architectures for AI. Foundations and Trends in Machine Learning, 2009.
  • Y. Bengio, A. Courville, and P. Vincent. Representation learning: a review and new perspectives. 2014

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

【研究动态】深度学习进阶线路图(二)

Supervised models 

如果你对使用神经网络感兴趣,意味着你也许喜欢自动的预测。监督学习是一种机器学习的框架,在这个框架里面你有一项特别想完成的任务,计算机通过有标签的数据集合学习得到模型。比如加入你想自动的判别邮件信息是垃圾邮件还是正常邮件,有监督学习框架中,你会有100,000封电子邮件被标注为“垃圾邮件”或者是“非垃圾邮件”,这些数据集合被用来训练分类器,使得它能够判别以前从未遇到过的邮件。

在深入理解神经网络之前,你应该先了解一点浅层网络机器学习算法比如线性回归( linear regression),逻辑回归(logistic regression),支持向量机(support vector machines (SVMs))等。这些算法更容易完成,并且有一些很成熟的软件包可以调用(比如:  AITMR译者注:scikit-learn确实是一个非常好的软件包,译者一直以来都是用这个软件包,而且你还可以通过研究软件包的源程序来深入的学习相关的算法。)。这些算法是你实现神经网络的一些基础内容。另外,神经网络的基本组成部分神经元和这些模型有很大的关联。因此,你花时间学习这些模型也是为更深度的理解神经网络打好了基础。

为了能更好的应用监督学习,你需要理解泛化(generalization)的概念,所谓泛化就是在新数据上的预测能力。你需要理解怎样去平衡过拟合与欠拟合之间的权衡:你既要使你的模型能够完全的表达你的数据,又不至于使得你的模型过于复杂使其过拟合。在回归方面,这个可以归结为bias and variance,这提供了一个更为直观的表达。当然cross-validation是一个你可以用来测量泛化能力的算法。

最开始的深度学习模型是前馈神经网络feed-forward neural net它是通过反向传播 backpropagation来学习的。

7

视觉是深度神经网络的一个主要的应用方向,而卷积神经网络convolutional nets在此方面已经取得了突破性的进展。

递归神经网络Recurrent neural nets 是把数据表示成时间结构的一类神经网络。伴随时间的Backpropagation是一种优雅的训练算法,但是在实用性方面还是有一定问题的。

 

翻译自: http://metacademy.org

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

【研究动态】深度学习进阶线路图(三):非监督学习

监督模型中,有标签数据可用来训练模型进行预测。但是在很多情况下,标签数据很难获取,或者是很难定义标签。你有的可能只是些非标签数据。这种情况下的学习叫做非监督学习。例如,你想对邮件进行“垃圾邮件”和“非垃圾邮件”的分类,但是你却没有标签数据集。那么,用这些非标签数据集,你能做些什么事呢?第一,你可以简单的分析数据模式。你的非标签数据也许蕴含着某些潜在的属性,这些潜在属性可以通过主成分分析(principal component analysis)或者是因子分析(factor analysis)得到。第二,你也可以对你的数据进行聚类研究,一类的数据比其他类的数据更为近似,聚类算法主要有 k-means 和mixture of Gaussians

在神经网络领域,非监督学习还有另外一种作用:他能对监督学习提供一些帮助。尤其是非标签数据比标签数据更容易获取。假如你正在进行目标识别方面的工作,给图像中的目标做标签是一件非常繁琐的事情,然而非标签的数据却可以从网上成千上万的下载。

非监督预训练(Unsupervised pre-training)已经在很多领域证明了其可极大的提供识别率。他的思想就是你通过非标签数据训练一个非监督神经网络,然后把类似的结构联合起来构成监督神经网络。目的都是为了给原始数据进行建模,而预训练能够为预先提取一些数据的相关结构。另外,深度非监督模型也比深度监督模型更容易训练(当然,关于这一点现在大家还不知道具体原因。)。非监督网络的预训练初始化使得整个网络训练时不至于陷入局部极值。

关于分监督训练好处的证明仍然是复杂的,很多成功应用的深度神经网络已经避免使用它,尤其是在大数据的背景下。但是他也保持者很好的记录,值得我们取关注他。

那哪些是非监督神经网络呢?最基本的就是自编码结构(autoencoder),这是一种预测他自己输入的前馈神经网络。然而这并不是最难的事情,可以一些限制后事情变得有点困难。第一,网络中有一层或者是多层的神经元数量要比数据层的小。另外,还需要限制隐含层的活跃神经元是稀疏的(译者注:只有少部分神经元的输出为非零。)。再着,在输入数据中加入一些噪声,再使网络具有去噪能力(denoising autoencoder)。

关于非监督学习另外一种方法是生成模型。人们假设数据符合某种潜在的分布,然后尝试对这种分布建模。受限玻耳兹曼机Restricted Boltzmann machines (RBMs) 是一种监督的只有一个隐含层的生成模型。而这个模型可以堆积形成多层生成模型,比如深信网络( deep belief nets (DBNs))和深度玻尔兹曼机(deep Boltzmann machines (DBMs))等。

3-1

DBMs can learn to model some pretty complex data distributions:

3-2

Generative modeling is a deep and rich area, and you can find lots more examples in the Bayesian machine learning roadmap.

 

翻译自: http://metacademy.org

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

【研究动态】深度学习进阶线路图(四):优化算法

 

定义好深度神经网络的机构后,该怎么去训练他们呢?最笨重的训练方法就是随机梯度下降法(stochastic gradient descent (SGD)),这种方法在每次训练中只添加一个训练样本(或者说是少量的训练样本),通过这些训练样本一小步一小步的减小损失函数。也就是说这需要计算损失函数的梯度值,这可以通过反向传播的算法算得。当然在编好程序后要进行“梯度计算检查”(check your gradient computations)来确保你的梯度计算是正确的。SGD算法理解简单,实现也比较容易,用起来也是十分的得心应手。

其他还有很多其他的凸优化(convex optimization)可以解决这个训练问题,在凸问题中,SGD和其他的一些局部搜索算法可以保证找到全局极值。可以找到全局极值是因为函数的形状是“碗状”(即凸函数),因此微调就朝着全局极值的方向走了。很多机器学习的研究就是想去构造一个凸优化问题。然而,深度神经网络却并非都是凸优化问题,因此你仅能保证找到一个局部极小值。这看似令人失望,但是我们也找到了一些解决方法( something we can live with)。对于大部分的前馈网络和生成网络,局部极值其实是挺合理的。(当时递归神经网络是个意外。)

局部极值最大的问题就是损失函数的曲率会趋向极值。然而神经网络是非凸的,因此曲率的问题就凸显出来了,而解决神经网络的训练的问题都是借鉴的凸优化问题的求解方法。如果你想了解一些相关的背景知识,可以去看看Boyd and Vandenberghe’s写的书凸优化( Convex Optimization):

  • Sections 9.2-9.3 talk about gradient descent, the canonical first-order optimization method (i.e. a method which only uses first derivatives)
  • Section 9.5 talks about Newton’s method, the canonical second-order optimization method (i.e. a method which accounts for second derivatives, or curvature)

牛顿法其实是很适合去处理曲率问题的,但是他处理大尺度的神经网络训练却并不实用,主要有两方面的原因:其一,它是一种批处理方法,因此每次训练都得把全部的训练样本添加进去。其二,他需要构建Hessian矩阵,并且还要求逆,而Hessian矩阵的维数和参数维数相等啊。(译者注:计算量太大了,当你的神经网络结构非常大的时候,这简直就是一场灾难啊!)因此,一直以来他都是作为一种理想的二阶训练方法人们去尝试。实际上用得最多的还是:

  • conjugate gradient
  • limited memory BFGS

相比于一般的神经网络模型,训练RBMs又提出了新的挑战:目标函数需要计算配分函数,而梯度计算需要进行推理(inference)。而这两者貌似都是不可解的(intractable)。在实际操作中Contrastive divergence and persistent contrastive divergence被广泛的用来估计梯度。然而,模型估计依然还是个问题。退火抽样(annealed importance sampling)可以用来估计模型的似然函数( estimate the model likelihood )。但是终究还是显得苍白,对于估计模型的性能还是很难完成的。

 4-1

Even once you understand the math behind these algorithms, the devil’s in the details. Here are some good practical guides for getting these algorithms to work in practice:

  • G. Hinton. A practical guide to training restricted Boltzmann machines. 2010.
  • J. Martens and I. Sutskever. Training deep and recurrent networks with Hessian-free optimization. Neural Networks: Tricks of the Trade, 2012.
  • Y. Bengio. Practical recommendations for gradient-based training of deep architectures. Neural Networks: Tricks of the Trade, 2012.
  • L. Bottou. Stochastic gradient descent tricks. Neural Networks: Tricks of the Trade, 2012.
--------------------------

【研究动态】深度学习进阶线路图(五):应用与相关软件

视觉应用:

计算机视觉是神经网络和深度学习的主要应用领域。早在1998年,卷积神经网络(convolutional nets )就已经在手写数字识别上大显身手,MNIST手写书库( MNIST handrwritten digit dataset )也一直以来都作为神经网络研究的标准数据集。(译者注:卷积神经网络在计算机视觉领域的应用是空前的,据说美国ATM机上支票的识别就是用的CNNs算法,而最近CNNs的研究又进入了一个爆发期,很多新的算法表中出现,比如3D的CNNs等。笔者曾经仔细研读过CNNs的MATLAB代码,确实是一个很好的算法,而且对于图像的识别率也是很高的。)近来,卷积神经网络把数千种类的物体分类问题(classifying between thousands of object categories)大大的推进了一步。仅用行像素来学习打游戏( play Atari games)的DeepMind系统里面就用到了视觉识别。

也有很多的工作是关于图像的生成模型的。而这些研究工作都是关注于学习稀疏表示(learning sparse representations )和图像的局部关系建模(modeling the local covariance structure)。加入你用卷积结构的生成模型对图像建模,那么你能得到更深层次的特征。

5-1

 

相关软件:

  • Cafe is an increasingly popular deep learning software package designed for image-related tasks, e.g. object recognition. It’s one of the fastest deep learning packages available — it’s written in C++ and CUDA.
  • The University of Toronto machine learning group has put together some nice GPU libraries for Python. GNumPy gives a NumPy-like wrapper for GPU arrays. It wraps around Cudamat, a GPU linear algebra library, and npmat, which pretends to be a GPU on a CPU machine (for debugging).
  • PyLearn is a neural net library developed by the University of Montreal machine learning group. It is intended for researchers, so it is built to be customizable and extendable.
  • PyLearn is built on top of Theano, a Python library for neural nets and related algorithms (also developed at Montreal), which provides symbolic differentiation and GPU support.
  • If for some reason you hate Python, Torch is a powerful machine learning library for Lua.

原文地址:http://blog.csdn.net/hua_007/article/details/43084181

0 0