深度学习简介与反向传播

1. 深度学习基础

1.1 深度学习的发展史

物有本末,事有终始,知所先后,则近道矣。

  • 1958: Perceptron (linear model)
  • 1969: Perceptron has limitation(无法执行基本的“异或”逻辑运算)
  • 1980s: Multi-layer perceptron(多层可执行“异或”逻辑运算)
    • Do not have significant difference from DNN today(模型训练困难)
  • 1986: Backpropagation(模型训练算法,极大加快了梯度计算效率)
    • Usually more than 3 hidden layers is not helpful(训练数据不足)
  • 1989: 1 hidden layer is “good enough”, why deep?(深度学习的发展缺乏理论基础)
  • 2006: RBM initialization (breakthrough,推动了新一波深度学习研究浪潮)
  • 2009: GPU(矩阵运算效率极大提升,降低了模型训练耗费的时间)
  • 2011: Start to be popular in speech recognition(在语音识别领域大放光彩)
  • 2012: win ILSVRC image competition(在图像识别领域夺冠,从此开始应用于各个领域)

1.2 深度学习的搭积木

深度学习实质上就是有很多层的神经网络,最基本的组件是类似人类的神经元(neuron)。

每一个神经元接收输入值,产生输出值,内部的运算过程可包括相加(输入值集成)、相乘(权重*输入)、映射(激活函数)等,涉及的参数包括权重、偏置等。
经过手动设置,我们可以构建不同的神经元,也可以通过自由组合连接很多神经元来构建不同的神经网络模型,就像是"搭积木"一样。当然,不同的构建方式会影响模型性能的好坏。

最简单的模型结构是完全连接前馈神经网络(Fully Connect Feedforward Network):

  • 输入层(Input Layer)1层,隐藏层(Hidden Layer)N层,输出层(Output Layer)1层
  • 相邻两层全连接(Fully Connect),传递方向后往前(Feedforward),激活函数Sigmoid

1.3 深度学习的三步骤

和机器学习一样,深度学习也可分为三个步骤,不同在于第一步中的模型集合仅包括神经网络。

1.3.1 Step1:神经网络

一个既定结构(神经元类型及其连接方式)的神经网络,如果已知每个神经元的参数(权重、偏差),就可以将它看成一个函数。它的输入是一个向量,对应的输出也是一个向量,如下所示。

如果仅确定了结构,参数未知,那么可以将它看作是一个函数集合。值得注意的是:

  • 神经网络的函数集是比较大的,包括一些以前的回归模型等没有办法拟合的函数,因此深度学习能表达出以前所不能表达的情况。

  • 深度学习的本质是把隐藏层通过特征提取来替代原来的特征工程,其中最后一个隐藏层输出的就是一组新的特征(相当于黑箱操作)。

因此,在做基于深度学习的研究创新的时候,不要聚焦于提出新的特征(机器学习的常见套路),而应该是提出新的模型架构(可以学到新的特征)
我们以手写数字体识别为例来说明如何将一个实际问题转化为一个神经网络模型可解决的问题。

  • 输入:一个16*16=256维的向量,每个pixel对应1维,有颜色用1表示,没有颜色用0表示。
  • 输出:10个维度,每个维度代表一个数字。

1.3.2 Step2:模型评估

我们一般采用损失函数来反应模型的好坏。对于神经网络来说,我们采用交叉熵(cross entropy)函数来对 y y y y ^ \hat{y} y^ 的损失进行计算。

我们不只是要计算单个样本的损失,而是要计算整体所有训练数据的损失,然后把所有的训练数据的损失都加起来,得到一个总体损失L。接下来就是在 function set 里面找到一组函数能最小化这个总体损失L,或者是找一组神经网络的参数 θ θ \thetaθ θθ,来最小化总体损失L。

1.3.3 Step3:参数寻优

我们主要使用梯度下降去找到最优的函数和最好的一组参数,和机器学习是一致的。

2. 深度学习进阶

2.1 模型架构设计应用

神经网络的结构决定了函数集(function set),所以说网络结构(network structure)很关键。那么,如何设计出好的网络结构呢?

  • 多少层? 每层有多少神经元?
    • 使用尝试(Train+error)+直觉(Intuition)的方法来进行调试。
    • 对于机器学习相关问题,我们一般用特征工程来提取特征。
    • 对于深度学习,我们只需设计神经网络模型结构。
    • 对于语音识别和影像识别,深度学习是个好方法,因为特征工程提取特征并不容易。
  • 结构可以自动确定吗?
    • 有很多设计方法可以让机器自动找到神经网络的结构的,比如进化人工神经网络(Evolutionary Artificial Neural Networks)但是这些方法并不是很普及 。
  • 我们可以设计网络结构吗?
    • 可以的,比如 CNN卷积神经网络(Convolutional Neural Network)。
    • 新的网络结构一般是针对某一具体任务进行优化,可以提高性能或者降低计算成本等。

2.2 普遍性定理和深层

2.2.1 普遍性定理

参数多的 model 拟合数据很好是很正常的。

然而,根据普遍性定理: 对于任何一个连续的函数,都可以用足够多的隐藏层来表示。

那为什么我们还需要‘深度’学习呢,直接用一层网络表示不就可以了?

2.2.2 Why “Deep”

比较shallow model较好还是deep model较好,在比较的时候一个前提就是调整shallow和Deep让他们的参数是一样多,这样就会得到一个矮胖的模型和高瘦的模型。

我们可以发现,不管的变宽还是变高,参数增加时性能都会提升。但是,在相同参数下,network变高比变宽的帮助更大。这是为什么呢?
直觉上来说,较宽的network倾向于一次性拟合出合适的函数,而较高的network倾向于分阶段处理,后者可以降低对训练数据规模的要求,而且符合实际情况。例如我们编写代码时,会使用模块化的概念:

我们在做deep learning的时候,其实我们是在做模块化这件事。在main function时,我们会写一些sub function。有一些function是可以共用的,就像一个模型,可以用它减小复杂度。
如下所示,如果我们想做一个图像识别任务,直接将其分成四类是比较困难的。我们可以先判断是否是男、女,长、短发。虽然说长头发的男生很少,但女生和男生的数据以及长头发和短头发的数据很多,可以根据两个分类结果去间接识别出长头发的男生。

3. 反向传播算法

在仅使用梯度下降法训练模型时,虽然可以进行较准确的参数寻优,但面对上百万的参数时,耗费的训练时间会很大,需要提升效率。反向传播(Backpropagation)是一个比较有效率的算法,可以有效计算出梯度(Gradient) 的向量(Vector)。实际上,很多深度学习框架的主要功能就是帮助高效率地计算梯度。

BP主要使用了求导过程中的链式法则(chain rule)

BP的主要思想是将微分计算分成两部分(Forward,Backward),每部分的计算结果可复用。

参考资料

  1. Datawhale 李宏毅机器学习开源教程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值