深度学习与计算机视觉

目录

简介

《列子·汤问》中周穆王巡狩,遇到一个自愿献艺的工匠叫做偃师。这个工匠制造的歌舞艺人行走坐卧宛若真人,甚至会挑逗周穆王的嫔妃,周穆王大怒,将歌舞艺人拆卸后仅为假物。

000

这个在我们现在看来就是机器人,其自主行为便是我们研究的人工智能(AI - artificial intelligence)

为了达到这一目标,从上世纪起人们尝试了多种方法。

  • AI许多早期的成功发生在相对朴素且形式化的环境中,而且不要求计算机具备很多关于世界的知识。例如,IBM的深蓝(Deep Blue)国际象棋系统在1997年击败了世界冠军Garry Kasparov(Hsu,2002)。
  • 知识库(Knowledge base)方法 - 致力于将关于世界的知识用形式化的语言进行编码(hard-cdoe),计算机可以使用逻辑推理规则来自动地理解这些形式化语言中的声明。
  • Cyc(Lenat and Guha,1989) 项目 - 包括一个推断引擎和一个使用Cyc语言描述的声明数据库。这些声明是由人类监督者输入的。这是一个笨拙的过程。人们设法设计出足够复杂的形式化规则来精确地描述世界。例如,Cyc不能理解一个关于名为Fred的人在早上剃须的故事(Linde,1992)。它的推理引擎检测到故事中的不一致性:它知道人体的构成不包含电气零件,但由于Fred正拿着一个电动剃须刀,它认为实体——“正在剃须的Fred”(“FredWhileShaving”)含有电气部件。因此,它产生了这样的疑问——Fred在刮胡子的时候是否仍然是一个人。

靠硬编码的知识体系面临的困难表明,AI系统需要具备自己获取知识的能力,即从原始数据中提取模式的能力。这种能力称为机器学习(machine learning)。

许多人工智能任务都可以通过以下方式解决:先提取一个合适的特征集,然后将这些特征提供给简单的机器学习算法。然而,对于许多任务来说,我们很难知道应该提取哪些特征。解决这个问题的途径之一是使用机器学习来发掘表示本身,而不仅仅把表示映射到输出。这种方法我们称之为表示学习(representation learning)

学习到的表示往往比手动设计的表示表现得更好。并且它们只需最少的人工干预,就能让AI系统迅速适应新的任务。表示学习算法只需几分钟就可以为简单的任务发现一个很好的特征集,对于复杂任务则需要几小时到几个月。手动为一个复杂的任务设计特征需要耗费大量的人工、时间和精力,甚至需要花费整个社群研究人员几十年的时间。

对于一个深度学习任务提取特征集极为重要,虽然可以通过表示学习自动提取,但是也可以通过特征工程优化这一流程。

在机器学习流程中,特征是数据和模型之间的纽带。特征工程是指从原始数据中提取特征并将其转换为适合机器学习模型的格式。它是机器学习流程中一个极其关键的环节,因为正确的特征可以减轻构建模型的难度,从而使机器学习流程输出更高质量的结果。机器学习从业者有一个共识,那就是建立机器学习流程的绝大部分时间都耗费在特征工程和数据清洗上。

002

假设我们想在散点图中画一条线来分隔两类数据。在左图中,我们使用笛卡儿坐标表示数据,这个任务是不可能的。在右图中,我们用极坐标表示数据,可以用垂直线简单地解决这个任务。

深度学习(deep learning)通过其他较简单的表示来表达复杂表示,解决了表示学习中的核心问题。

深度学习模型的典型例子是前馈深度网络或或多层感知机(multilayer perceptron,MLP)。多层感知机仅仅是一个将一组输入值映射到输出值的数学函数。该函数由许多较简单的函数复合而成。我们可以认为不同数学函数的每一次应用都为输入提供了新的表示。

001

  • 逻辑回归(logistic regression)的简单机器学习算法可以决定是否建议剖腹产(Mor-Yosef et al.,1990)。
  • 表示学习算法的典型例子是自编码器(autoencoder)。自编码器由一个编码器(encoder)函数和一个解码器(decoder)函数组合而成。编码器函数将输入数据转换为一种不同的表示,而解码器函数则将这个新的表示转换回原来的形式。我们期望当输入数据经过编码器和解码器之后尽可能多地保留信息,同时希望新的表示有各种好的特性,这也是自编码器的训练目标。为了实现不同的特性,我们可以设计不同形式的自编码器。

003

当然机器学习理论的可行性是有严谨的数学基础的,这里不做赘述:

  • 一般学习模型 - 概率近似正确(PAC)学习模型

深度学习

深度学习是基于神经网络发展起来的技术,而神经 络的发展具有悠久的历史,且发展历程可谓一波三折。

004

M-P模型

M-P模型是首个通过模仿神经元而形成的模型。

005

006

神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号θ表示。 - 这就是我们现在说的激活函数。

014

感知机

感知机也是作为神经网络(深度学习)的起源的算法。与 M-P模型需要人为确定参数不同,感知器能够通过训练自动确定参数,训练方式为有监督学习,即需要设定训练样本和期望输出,然后调整实际输出和期望输出之差的方式(误差修正学习)。

单层感知机可以实现简单的与门、非门以及或门,但是无法实现异或门。

007

008

通过画图,我们发现无法通过线性函数区分出异或输出。

009

使用曲线可以区分出异或输出。

多层感知机

针对上面的问题,有一种方法那就是通过组合与门、非门以及或门进行实现。由此我们通过多层感知机的方式解决了异或输出的问题,是的问题完备。

010

011

012

为了解决线性不可分等更复杂的问题,人们提出了多层感知(multilayer perceptron)模型,多层感知器指的是由多层结构的感知器递阶组成的输入值向前传播的网络,也被称为前馈网络或
正向传播网络。

多层感知器通常采用 层结构,由输入层、中间层及输出层组成。

013

神经网络

深度前馈网络(deep feedforward network),也叫作前馈神经网络(feedforward neural net-work)或者多层感知机。

这种模型被称为前向(feedforward)的,是因为信息流过x的函数,流经用于定义f的中间计算过程,最终到达输出y。在模型的输出和模型本身之间没有反馈(feedback)连接。当前馈神经网络被扩展成包含反馈连接时,它们被称为循环神经网络(recurrent neural network)。

激活函数

多层感知机中使用了阶跃函数作为激活函数。如果将激活函数从阶跃函数换成其他函数,就可以进入神经网络的世界了。

神经网络的激活函数必须使用非线性函数。换句话说,激活函数不能使用线性函数。为什么不能使用线性函数呢?因为使用线性函数的话,加深神经网络的层数就没有意义了。

线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无隐藏层的神经网络”。

sigmoid函数

016

016

sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。感知机中神经元之间流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号。

ReLU函数

017

018

损失函数

从前面可知,深度学习的过程是拟合出一个函数用于表示要解决的问题的过程。依照神经网路模型,在激活函数以及网络结构确定的情况下,那就是求解各个连接的权重的问题。由此该问题变成了一个优化问题。

  • loss function:损失函数-用于定义单个训练样本与真实值之间的误差
  • cost function:代价函数-用于定义单个批次/整个训练集样本与真实值之间的误差
  • objective function:目标函数-泛指任意可以被优化的函数

019

我们到目前为止看到的线性模型和神经网络的最大区别,在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸。这意味着神经网络的训练通常使用迭代的、基于梯度的优化,仅仅使得代价函数达到一个非常小的值;而不是像用于训练线性回归模型的线性方程求解器,或者用于训练逻辑回归或SVM的凸优化算法那样保证全局收敛。凸优化从任何一种初始参数出发都会收敛(理论上如此——在实践中也很鲁棒但可能会遇到数值问题)。用于非凸损失函数的随机梯度下降没有这种收敛性保证,并且对参数的初始值很敏感。

为了使用基于梯度的学习方法,我们必须选择一个损失函数,并且必须选择如何表示模型的输出。

神经网络的学习中所用的指标称为损失函数(loss function)。在大多数情况下,参数模型定义了一个分布p(y|x;θ)并且简单地使用最大似然原理。这意味着我们使用训练数据和模型预测间的交叉熵作为代价函数。有时,我们使用一个更简单的方法,不是预测y的完整概率分布,而是仅仅预测在给定x的条件下y的某种统计量。某些专门的损失函数允许我们来训练这些估计量的预测器。

并没有一种万能的损失函数能够适用于所有的机器学习任务,所以在这里我们需要知道每一种损失函数的优点和局限性,才能更好的利用它们去解决实际的问题。损失函数大致可分为两种:

  • 回归损失(针对连续型变量)
  • 分类损失(针对离散型变量)

022

回归损失(regression loss)
  • l1 loss - L1 Loss也称为Mean Absolute Error,即平均绝对误差(MAE),它衡量的是预测值与真实值之间距离的平均误差幅度

023

优点: 对离群点(Outliers)或者异常值更具有鲁棒性。
缺点: 由图可知其在0点处的导数不连续,使得求解效率低下,导致收敛速度慢;而对于较小的损失值,其梯度也同其他区间损失值的梯度一样大,所以不利于网络的学习。

  • L2 Loss - L2 Loss也称为Mean Squred Error,即均方差(MSE),它衡量的是预测值与真实值之间距离的平方和,作用范围同为 [ 0 , + ∞ ] 。

024

优点: 收敛速度快,能够对梯度给予合适的惩罚权重,而不是“一视同仁”,使梯度更新的方向可以更加精确。
缺点: 对异常值十分敏感,梯度更新的方向很容易受离群点所主导,不具备鲁棒性。

  • Smooth L1 Loss - Smooth L1 Loss即为平滑的L1损失(SLL),出自Fast RCNN。SLL通过综合L1和L2损失的优点,在0点处附近采用了L2损失中的平方函数,解决了L1损失在0点处梯度不可导的问题,使其更加平滑易于收敛。此外,在 ∣ x ∣ > 1 |x|>1∣x∣>1 的区间上,它又采用了L1损失中的线性函数,使得梯度能够快速下降。

025

通过对这三个损失函数进行求导可以发现,L1损失的导数为常数,如果不及时调整学习率,那么当值过小时,会导致模型很难收敛到一个较高的精度,而是趋向于一个固定值附近波动。反过来,对于L2损失来说,由于在训练初期值较大时,其导数值也会相应较大,导致训练不稳定。最后,可以发现Smooth L1在训练初期输入数值较大时能够较为稳定在某一个数值,而在后期趋向于收敛时也能够加速梯度的回传,很好的解决了前面两者所存在的问题。

L1:趋向于一个固定值附近波动
L2:训练不稳定
Smooth L1:很好的解决了前面两者所存在的问题

分类损失
  • Entropy —— 熵的概念

Entropy即为“熵”,熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。但更常见的,在信息论里面, 熵是用于描述对不确定性的度量。所以,这个概念可以延伸到深度神经网络中,比如我们的模型在做分类时,其实也是在做一个判断一个物体到底是不是属于某个类别。

熵(Entropy),它可以很好地描述事件的不确定性。它是由以下公式给出:

026

一般来说,它给出了给定概率分布p中样本值的平均信息量,并且它还会告诉我们概率分布有多不可预测。

  • Cross Entropy —— 交叉熵

交叉熵。它指的是平均信息长度。

很明显,预测分布q qq和 真实分布 p pp有很大不同。现在我们可以把交叉熵表示成真实概率分布 p 的函数和预测概率分布 q 的函数:

027

  • K-L Divergence

K-L Divergence即KL散度。对于交叉熵损失,除了我们在这里使用预测概率的对数 log ⁡ ( q ( i ) ) \log(q(i))log(q(i)) 外,它看起来与上面熵的方程非常相似。如果我们的预测是完美的,那就是预测分布等于真实分布,此时交叉熵就等于熵。 但是,如果分布不同,则交叉熵将比熵大一些位数。 交叉熵超过熵的量称为相对熵,或更普遍地称为库尔贝克-莱布里埃发散度(KL Divergence)。

K-L散度是衡量预测分布和真实分布之间的差异

028

在统计学意义上来说,KL散度可以用来衡量两个分布之间的差异程度。

若两者差异越小,KL散度越小,反之亦反。
当两分布一致时,其KL散度为0。

通常来说,一般分类损失最常用的损失函数之一便是交叉熵损失。

  • Dice Loss

Dice Loss即骰子损失,它是一种用于评估两个样本之间相似性度量的函数,取值范围为 [ 0 , 1 ] ,值越大表示两个值的相似度越高(和余弦相似性是类似的),其基本定义(二分类)如下:

029

其中, ∣ X ∩ Y ∣ 表示X 和Y 之间的交集, ∣ X ∣ 和 ∣ Y ∣分别表示集合X和 Y 中像素点的个数,分子乘于2保证值域范围在[ 0 , 1 ] 之间,因为分母相加时会计算多一次重叠区间,如下图

030

有益于正负样本不均衡的情况,侧重于对前景的挖掘;
训练过程中,在有较多小目标的情况下容易出现振荡;
极端情况下会出现梯度饱和的情况。

  • Focal Loss

Focal Loss(焦点损失),出自何凯明的《Focal Loss for Dense Object Detection》,出发点是解决目标检测领域中one-stage算法如YOLO系列算法准确率不高的问题。作者认为样本的类别不均衡(比如前景和背景)是导致这个问题的主要原因。

比如在很多输入图片中,我们利用网格去划分小窗口,大多数的窗口是不包含目标的。如此一来,如果我们直接运用原始的交叉熵损失,那么负样本所占比例会非常大,主导梯度的优化方向,即网络会偏向于将前景预测为背景。即使我们可以使用OHEM(在线困难样本挖掘)算法来处理不均衡的问题,虽然其增加了误分类样本的权重,但也容易忽略掉易分类样本。

而Focal loss则是聚焦于训练一个困难样本的稀疏集,通过直接在标准的交叉熵损失基础上做改进,引进了两个惩罚因子,来减少易分类样本的权重,使得模型在训练过程中更专注于困难样本。其Focal Loss (FL)基本定义如下:

031

032

  • Tversky loss

Tversky loss,特沃斯基损失,发表于CVPR 2018上的一篇《Tversky loss function for image segmentation using 3D fully convolutional deep networks》文章,是根据 Tversky 等人于1997年发表的《Features of Similarity》文章所提出的Tversky指数所改造的。Tversky系数主要用于描述两个特征(集合)之间的相似度,其定义如下:

033

  • Jaccard系数

给定两个集合A,B,Jaccard 系数定义为A与B交集的大小与A与B并集的大小的比值,定义如下:

034

与Jaccard 系数相关的指标叫做 Jaccard 距离,用于描述集合之间的不相似度。Jaccard 距离越大,样本相似度越低。公式定义如下:

035

036

总结

总的来说,损失函数的形式千变万化,但追究溯源还是万变不离其宗。其本质便是给出一个能较全面合理的描述两个特征或集合之间的相似性度量或距离度量,针对某些特定的情况,如类别不平衡等,给予适当的惩罚因子进行权重的加减。大多数的损失都是基于最原始的损失一步步改进的,或提出更一般的形式,或提出更加具体实例化的形式。

优化函数

在利用损失函数(Loss Function)计算出模型的损失值之后,接下来需要利用损失值进行模型参数的优化,这个过程使用的函数就是优化函数。

模型内部有些参数,是用来计算测试集中目标值 Y 的真实值和预测值 $Y^,$ 的偏差程度的,基于这些参数,就形成了损失函数 J(x)。
比如说,权重(W)和偏差(b)就是这样的内部参数,一般用于计算输出值,在训练神经网络模型时起到主要作用。

在有效地训练模型并产生准确结果时,模型的内部参数起到了非常重要的作用。这也是为什么我们应该用各种优化策略和算法,来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值。

在实践操作最常用到的是一阶优化函数。包括

  • GD
  • SGD
  • BGD
  • Adam

一阶优化函数在优化过程中求解的是参数的一阶导数,这些一阶导数的值就是模型中参数的微调值。

  • GD - 梯度下降

梯度下降(Gradient Descent)是参数优化的基础方法。虽然已广泛应用,但是其自身存在许多不足,所以在其基础上改进的优化函数也非常多。

全局梯度下降的参数更新公式如下:

037

038

学习率对GD的影响:

  • 学习速率过快,参数的更新跨步就会变大,极易出现局部最优和抖动。
  • 学习率过慢,梯度更新的迭代次数就会增加,参数更新时间也会变长。

GD的缺点:计算损失值的时间成本和模型训练过程中的复杂度呈正相关 -> 模型越复杂,求梯度所花费时间越长。

  • 批量梯度下降(Batch Gradient Descent)

039

040

BGD的缺点:容易导致优化函数的最终结果是局部最优解。

  • 随机梯度下降(Stochastic Gradient Descent)

假设我们随机选取的一部分数据集包含stochastic(随机的)个数据样本,那么随机梯度下降的参数更新公式如下:

041

随机梯度下降算法和批量梯度下降的不同点在于其梯度是根据随机选取的训练集样本来决定的,其每次对 $\theta$ 的更新,都是针对单个样本数据,并没有遍历完整的参数。 当样本数据很大时,可能到迭代完成,也只不过遍历了样本中的一小部分。因此,其速度较快,但是其每次的优化方向不一定是全局最优的,最终的结果是在全局最优解的附近。

虽然BGD可以让参数达到全局最低点并且停止,而SGD可能会让参数达到局部最优,但是仍然会波动,甚至在训练过程中让参数会朝一个更好的更有潜力的方向更新。众多的实验表明,当我们逐渐减少学习速率时,SGD和BGD会达到一样的全局最优点。

SGD的优点:训练速度快,避免了BGD更新过程中的计算冗余问题,对于很大的数据集,也能够以较快的速度收敛。

SGD的缺点:

  • 由于是随机抽取,因此得到的梯度不可避免的存在误差。因此学习速率需要逐渐减小,否则模型无法收敛。
  • 因为误差,所以每一次迭代的梯度受抽样的影响比较大,也就是说梯度含有比较大的噪声,不能很好的反映真实梯度,并且SGD有较高的方差,其波动较大,如下图:

042

学习率调整

那么这样一来,学习率 η \etaη 如何衰减就成了问题。如果要保证SGD收敛,应该满足如下两个要求:

043

而在实际操作中,一般是进行线性衰减,即:

044

其中 $\eta_0$ 是初始学习率, $\eta_{\tau}$ 是最后一次迭代的学习率, $\tau$ 自然代表迭代次数。

一般来说, $\eta_\tau$ 设为 $\eta_0$ 的 $\%1$ 比较合适。而 $\tau$ 一般设为让训练集中的每个数据都输入模型上百次比较合适。那么初始学习率 $\eta_0$ 怎么设置呢?书上说,你先用固定的学习速率迭代100次,找出效果最好的学习速率,然后 $\eta_0$ 设为比它大一点就可以了。

另外,需要注意的是因为存在样本选择的随机性,所以在梯度下降过程中会存在较大的噪声,因此学习速率应该要逐渐减小,来寻找一个相对全局最优的方向。

同时也考虑到每次只选择一个样本进行梯度更新存在较大的噪声,学者们开始尝试每次选择一小批样本进行梯度更新,在降低噪声的同时提高速度,因此就有了下面的MBGD(Mini-Batch Gradient Descent)小批量梯度下降法。

MBGD小批量梯度下降(Mini-Batch Gradient Descent)

为了综合上述两种方法,提出了小批量梯度下降。

MBGD的特性:

  • 降低在SGD中高方差的问题,能使得收敛更加稳定
  • 可以利用深度学习中最先进的库进行矩阵优化的操作,加速操作
  • 一般的小批量介于50~256,但是当适用很小的批量时,有时也统称为SGD。

MBGD的核心思想:

  • 选择适当的学习率可能很困难。 —— 太小的学习率会导致收敛性缓慢,而学习速度太大可能会妨碍收敛,并导致损失函数在最小点波动。
  • 使用学习率计划:尝试在训练期间调整学习率。 比如根据预先制定的规则缓慢的降低学习速率,或者当每次迭代之间的偏导差异已经低于某个阈值时,就降低学习速率。 —— 但是这里面的学习速率更新规则,以及阈值都是需要预先设定的,因此不适应于所有的数据集。
  • 此外,使用梯度更新的方法会导致所有参数都用学习速率更新。 —— 但是当训练集数据是稀疏的,或者特征的频率是不同的,我们可能不希望它们更新到同样的程度,因此使用相同的学习速率会导致那些很少出现的特征有较大的变化。
  • 在求取那些高度非凸的误差函数的最小值时,我们应该避免陷入局部最优解。实验表明,最困难的不是从局部最优而是鞍点。 —— 鞍点就是沿着某一个方向他是稳定的,沿着另一个方向不稳定,既不是最小点也不是最大点。这会使得该点在所有维度上梯度为0,让SGD难以逃脱。
动量,Momentum

上述SGD和MBGD算法都存在样本选择的随机性,因此含有较多的噪声,而momentum能解决上述噪声问题,尤其在面对小而较多噪声的梯度时,它往往能加速学习速率。

045

Momentum借用了物理中的动量概念,即前几次的梯度也会参与运算。为了表示动量,引入了一个新的变量 v (velocity,速度)。v 是之前的梯度的累加,但是每回合都有一定的衰减。

Momentum每步迭代过程:

046

Nesterov Momentum

仅仅有一个追求速度的球往山下滚是不能令人满意的,我们需要一个球,它能知道往前一步的信息,并且当山坡再次变陡时他能够减速。因此,带有nesterov的出现了!

047

048

AdaGrad

AdaGrad可以自动变更学习速率,只是需要设定一个全局的学习速率 η \etaη,但是这并非是实际学习速率。实际的速率是与以往参数的模之和的开方成反比的。也许说起来有点绕口,不过用公式来表示就直白的多:

049

AdaGrad对于频繁出现的参数使用更小的更新速率,对于不频繁出现的参数使用更大的更新速率。
正因为如此,该优化函数较适用于稀疏的数据,比如在Google从YouTube视频上识别猫时,该优化函数大大提升了SGD的鲁棒性。在训练GloVe词向量时该优化函数更加适用。

AdaDelta

AdaDelta是AdaGrad的延伸,不同于AdaDelta将以前所有的偏导都累加起来,AdaDelta控制了累加的范围到一定的窗口中。
但是,并非简单的将窗口大小设置并且存储,我们是通过下式动态改变的上述的G:

050

RMSProp

RMSProp通过引入一个衰减系数,让 r rr 每回合都衰减一定比例,类似于Momentum中的做法。

和Adadelta没啥区别

Adam

Adam自适应时刻估计方法(Adaptive Moment Estimation),一个比较智能的优化函数方法。它在模型训练优化的过程中通过让每个参数获得自适应的学习率,来达到优化质量和速度的双重提升。现在一般都选择用这个方法。

Adam(Adaptive Moment Estimation)是另外一种给每个参数计算不同更新速率的方法,其本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

不同优化函数可视化

速度:

000

鞍点:

001

选择优化
  • 如果你的数据很稀疏,那应该选择有自适应性的优化函数。并且你还可以减少调参的时间,用默认参数取得好的结果。
  • RMSprop是adagrad的一个拓展,旨在解决它提前结束的问题。
  • 而RMSprop和Adadelta类似,只是adadelta采用了RMS的方法更新参数。
  • 在RMSprop基础上增加了偏差校正和momentum,形成了Adam。

综上,RMSprop、Adadelta、Adam都是类似的。

  • 所以,可能Adam是最好的优化函数。
  • 如果你希望你的训练能变的更快,或者你要训练的是一个复杂的深度的网络,尽量选择自适应的优化函数。

反向传播

当我们使用前馈神经网络接收输入x并产生输出时,信息通过网络向前流动。输入x提供初始信息,然后传播到每一层的隐藏单元,最终产生输出。这称之为前向传播(forward propagation)。在训练过程中,前向传播可以持续向前直到它产生一个标量代价函数J(θ)。反向传播(back propagation)算法(Rumelhart et al.,1986c),经常简称为backprop,允许来自代价函数的信息通过网络向后流动,以便计算梯度。

计算梯度的解析表达式是很直观的,但是数值化地求解这样的表达式在计算上的代价可能很大。反向传播算法使用简单和廉价的程序来实现这个目标。

误差反向传播(Back-propagation, BP)算法的出现是神经网络发展的重大突破,也是现在众多深度学习训练方法的基础。该方法会计算神经网络中损失函数对各参数的梯度,配合优化方法更新参数,降低损失函数。

BP本来只指损失函数对参数的梯度通过网络反向流动的过程,但现在也常被理解成神经网络整个的训练方法,由误差传播、参数更新两个环节循环迭代组成。

051

前向传播通过训练数据和权重参数计算输出结果;反向传播通过导数链式法则计算损失函数对各参数的梯度,并根据梯度进行参数的更新

052

053

054

如上图示例,输入 x,经过网络的参数 w,b,得到一系列中间结果a,h 。 a表示通过权重和偏置的结果,还未经过激活函数, h表示经过激活函数后的结果。灰色框内表示 L对各中间计算结果的梯度,这些梯度的反向传播有两类:

  • 由 h到a,通过激活函数,如右上角

055

  • 由 a到h,通过权重,如橙线部分

056

可以看出梯度的传播和前向传播的模式是一致的,只是方向不同。

计算完了灰色框的部分(损失对中间结果 a,h 的梯度),损失对参数w,b的梯度也就显而易见了,以图中红色的$w_1$和$b_{21}$为例:

057

深度学习框架

全世界最为流行的深度学习框架有:

  • PaddlePaddle
  • Tensorflow
  • Caffe
  • Theano
  • MXNet
  • Torch
  • PyTorch

以前业界主要使用Tensorflow,学界主要使用 PyTorch
现在Google新主推的框架为 JAX

大家如果想快速使用深度学习框架可以尝试一下百度的 PaddlePaddle 飞桨框架

https://www.paddlepaddle.org.cn/

058

飞桨提供了详细的教程,可以进行图像识别以及各方面的深度学习的学习。

059

飞桨也提供了大量成熟的模型库,可以直接使用也可以自己训练后使用:

060

机器视觉

基于深度学习的机器视觉

  • 卷积神经网络

参考文献

[^1]:深度学习 Shen du xue xi by Bengio, Yoshua Courville, Aaron Goodfellow, Ian