• 深度学习之神经网络与支持向量机


    深度学习之神经网络与支持向量机

      引言:神经网络(Neural Network)与支持向量机(Support Vector Machines,SVM)是统计学习的代表方法。可以认为神经网络与支持向量机都源自于感知机(Perceptron)。感知机是1958年由Rosenblatt发明的线性分类模型。感知机对线性分类有效,但现实中的分类问题通常是非线性的。

      神经网络与支持向量机(包含核方法)都是非线性分类模型。1986年,Rummelhart与McClelland发明了神经网络的学习算法Back Propagation。后来,Vapnik等人于1992年提出了支持向量机。神经网络是多层(通常是三层)的非线性模型,支持向量机利用核技巧把非线性问题转换成线性问题。

      神经网络与支持向量机一直处于“竞争”关系。

      Scholkopf 是Vapnik的大弟子,支持向量机与核方法研究的领军人物。据Scholkopf说,Vapnik当初发明支持向量机就是想"干掉"神经网络(He wanted to kill Neural Network)。支持向量机确实很有效,一段时间支持向量机一派占了上风。

      近年来,神经网络一派的大师Hinton又提出了神经网络的Deep Learning算法(2006年),使神经网络的能力大大提高,可与支持向量机一比。

      Deep Learning假设神经网络是多层的,首先用Boltzman Machine(非监督学习)学习网络的结构,然后再通过Back Propagation(监督学习)学习网络的权值。

      关于Deep Learning的命名,Hinton曾开玩笑地说: I want to call SVM shallow learning. (注:shallow 有肤浅的意思)。其实Deep Learning本身的意思是深层学习,因为它假设神经网络有多层。

      总之,Deep Learning是值得关注的统计学习新算法。

      深度学习(Deep Learning)是ML研究中的一个新的领域,它被引入到ML中使ML更接近于其原始的目标:AI。查看a brief introduction to Machine Learning for AI 和 an introduction to Deep Learning algorithms.

      深度学习是关于学习多个表示和抽象层次,这些层次帮助解释数据,例如图像,声音和文本。

      对于更多的关于深度学习算法的知识,可以参看:

      The monograph or review paper Learning Deep Architectures for AI (Foundations & Trends in Machine Learning, 2009).

      The ICML 2009 Workshop on Learning Feature Hierarchies webpage has a list of references.

      The LISA public wiki has a reading list and a bibliography.

      Geoff Hinton has readings from last year’s NIPS tutorial.

      这篇综述主要是介绍一些最重要的深度学习算法,并将演示如何用Theano来运行它们。

      Theano是一个python库,使得写深度学习模型更加容易,同时也给出了一些关于在GPU上训练它们的选项。

      这个算法的综述有一些先决条件。首先你应该知道一个关于python的知识,并熟悉numpy。由于这个综述是关于如何使用Theano,你应该先阅读Theano basic tutorial。一旦你完成这些,阅读我们的Getting Started章节---它将介绍概念定义,数据集,和利用随机梯度下降来优化模型的方法。

      纯有监督学习算法可以按照以下顺序阅读:

      Logistic Regression - using Theano for something simple

      Multilayer perceptron - introduction to layers

      Deep Convolutional Network - a simplified version of LeNet5

      无监督和半监督学习算法可以用任意顺序阅读(auto-encoders可以被独立于RBM/DBM地阅读):

      Auto Encoders, Denoising Autoencoders - description of autoencoders

      Stacked Denoising Auto-Encoders - easy steps into unsupervised pre-training for deep nets

      Restricted Boltzmann Machines - single layer generative RBM model

      Deep Belief Networks - unsupervised generative pre-training of stacked RBMs followed by supervised fine-tuning

      关于mcRBM模型,也有一篇新的关于从能量模型中抽样的综述:

      HMC Sampling - hybrid (aka Hamiltonian) Monte-Carlo sampling with scan()

      上文翻译自http://deeplearning.net/tutorial/

      查看最新论文

      Yoshua Bengio, Learning Deep Architectures for AI, Foundations and Trends in Machine Learning, 2(1), 2009

      深度(Depth)

      从一个输入中产生一个输出所涉及的计算可以通过一个流向图(flow graph)来表示:流向图是一种能够表示计算的图,在这种图中每一个节点表示一个基本的计算并且一个计算的值(计算的结果被应用到这个节点的孩子节点的值)。考虑这样一个计算集合,它可以被允许在每一个节点和可能的图结构中,并定义了一个函数族。输入节点没有孩子,输出节点没有父亲。

      对于表达

    1

    的流向图,可以通过一个有两个输入节点

    2

    3

    的图表示,其中一个节点通过使用

    2

    3

    作为输入(例如作为孩子)来表示

    4

    ;一个节点仅使用

    2

    作为输入来表示平方;一个节点使用

    6

    7

    作为输入来表示加法项(其值为

    5

    );最后一个输出节点利用一个单独的来自于加法节点的输入计算SIN。

      这种流向图的一个特别属性是深度(depth):从一个输入到一个输出的最长路径的长度。

      传统的前馈神经网络能够被看做拥有等于层数的深度(比如对于输出层为隐层数加1)。SVMs有深度2(一个对应于核输出或者特征空间,另一个对应于所产生输出的线性混合)。

      深度架构的动机

      学习基于深度架构的学习算法的主要动机是:

      不充分的深度是有害的;

      大脑有一个深度架构;

      认知过程是深度的;

      不充分的深度是有害的

      在许多情形中深度2就足够(比如logical gates, formal [threshold] neurons, sigmoid-neurons, Radial Basis Function [RBF] units like in SVMs)表示任何一个带有给定目标精度的函数。但是其代价是:图中所需要的节点数(比如计算和参数数量)可能变的非常大。理论结果证实那些事实上所需要的节点数随着输入的大小指数增长的函数族是存在的。这一点已经在logical gates, formal [threshold] neurons 和rbf单元中得到证实。在后者中Hastad说明了但深度是d时,函数族可以被有效地(紧地)使用O(n)个节点(对于n个输入)来表示,但是如果深度被限制为d-1,则需要指数数量的节点数O(2^n)。

      我们可以将深度架构看做一种因子分解。大部分随机选择的函数不能被有效地表示,无论是用深地或者浅的架构。但是许多能够有效地被深度架构表示的却不能被用浅的架构高效表示(see the polynomials example in the Bengio survey paper)。一个紧的和深度的表示的存在意味着在潜在的可被表示的函数中存在某种结构。如果不存在任何结构,那将不可能很好地泛化。

      大脑有一个深度架构

      例如,视觉皮质得到了很好的研究,并显示出一系列的区域,在每一个这种区域中包含一个输入的表示和从一个到另一个的信号流(这里忽略了在一些层次并行路径上的关联,因此更复杂)。这个特征层次的每一层表示在一个不同的抽象层上的输入,并在层次的更上层有着更多的抽象特征,他们根据低层特征定义。

      需要注意的是大脑中的表示是在中间紧密分布并且纯局部:他们是稀疏的:1%的神经元是同时活动的。给定大量的神经元,任然有一个非常高效地(指数级高效)表示。

      认知过程看起来是深度的

      人类层次化地组织思想和概念;

      人类首先学习简单的概念,然后用他们去表示更抽象的;

      工程师将任务分解成多个抽象层次去处理;

      学习/发现这些概念(知识工程由于没有反省而失败?)是很美好的。对语言可表达的概念的反省也建议我们一个稀疏的表示:仅所有可能单词/概念中的一个小的部分是可被应用到一个特别的输入(一个视觉场景)。

      学习深度架构的突破

      2006年前,尝试训练深度架构都失败了:训练一个深度有监督前馈神经网络趋向于产生坏的结果(同时在训练和测试误差中),然后将其变浅为1(1或者2个隐层)。

      2006年的3篇论文改变了这种状况,由Hinton的革命性的在深度信念网(Deep Belief Networks, DBNs)上的工作所引领:

      Hinton, G. E., Osindero, S. and Teh, Y., A fast learning algorithm for deep belief nets.Neural Computation 18:1527-1554, 2006

      Yoshua Bengio, Pascal Lamblin, Dan Popovici and Hugo Larochelle, Greedy Layer-Wise Training of Deep Networks, in J. Platt et al. (Eds), Advances in Neural Information Processing Systems 19 (NIPS 2006), pp. 153-160, MIT Press, 2007

      Marc’Aurelio Ranzato, Christopher Poultney, Sumit Chopra and Yann LeCun Efficient Learning of Sparse Representations with an Energy-Based Model, in J. Platt et al. (Eds), Advances in Neural Information Processing Systems (NIPS 2006), MIT Press, 2007

      在这三篇论文中以下主要原理被发现:

      表示的无监督学习被用于(预)训练每一层;

      在一个时间里的一个层次的无监督训练,接着之前训练的层次。在每一层学习到的表示作为下一层的输入;

      用无监督训练来调整所有层(加上一个或者更多的用于产生预测的附加层);

      DBNs 在每一层中利用用于表示的无监督学习RBMs。Bengio et al paper 探讨和对比了RBMs和auto-encoders(通过一个表示的瓶颈内在层预测输入的神经网络)。Ranzato et al paper在一个convolutional架构的上下文中使用稀疏auto-encoders(类似于稀疏编码)。Auto-encoders和 convolutional架构将在以后的课程中讲解。

      从2006年以来,大量的关于深度学习的论文被发表,一些探讨了其他原理来引导中间表示的训练,查看Learning Deep Architectures for AI

      本文英文版出处http://www.iro.umontreal.ca/~pift6266/H10/notes/deepintro.html

  • 相关阅读:
    ubuntu 16.04上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on ubuntu 16.04
    Windows 10上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on windows from source
    windows 10上源码编译libjpeg-turbo和使用教程 | compile and use libjpeg-turbo on windows 10
    Ubuntu 16.04源码编译boost库 编写CMakeLists.txt | compile boost 1.66.0 from source on ubuntu 16.04
    如何在C++中使用boost库序列化自定义class ?| serialize and deserialize a class in cpp with boost
    Ubuntu 16.04上源码编译Poco并编写cmake文件 | guide to compile and install poco cpp library on ubuntu 16.04
    Windows 10上源码编译Poco并编写httpserver和tcpserver | compile and install poco cpp library on windows
    ubuntu 16.04 和 windows 10系统安装mysql 允许远程访问 | mysql user guide on ubuntu 16.04 and windows 10
    编写自定义cmake配置文件FindXXX.cmake或者xxx-config.cmake | cmake with user defined entry
    [Part 4] 在Windows 10上源码编译PCL 1.8.1支持VTK和QT,可视化三维点云
  • 原文地址:https://www.cnblogs.com/yymn/p/4619684.html
Copyright © 2020-2023  润新知