点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
本文转自:机器学习算法那些小事
最近在做笔记查阅内容,觉得这个总结太美观了,真是棒!
吴恩达在推特上展示了一份由 TessFerrandez 完成的深度学习专项课程信息图,这套信息图优美地记录了深度学习课程的知识与亮点。因此它不仅仅适合初学者了解深度学习,还适合机器学习从业者和研究者复习基本概念。这不仅仅是一份课程笔记,同时还是一套信息图与备忘录。
从深度学习基础、卷积网络和循环网络三个方面介绍该笔记.
一、深度学习基础
1. 深度学习基本概念
3. 浅层网络的特点
4. 深度神经网络的特点
5. 偏差与方差
6. 正则化
7. 最优化
8. 超参数
9. 结构化机器学习过程
10. 误差分析
11. 训练集、开发集与测试集
12. 其它学习方法
二、卷积网络
13. 卷积神经网络基础
14. 经典卷积神经网络
15. 特殊卷积神经网络
16. 实践建议
17. 目标检测算法
18. 人脸识别
19. 风格迁移
三、循环网络
20. 循环神经网络基础
21. NLP 中的词表征
22. 序列到序列
深度学习基础
监督学习: 所有输入数据都有确定的对应输出数据,在各种网络架构中,输入数据和输出数据的节点层都位于网络的两端,训练过程就是不断地调整它们之间的网络连接权重。
左上: 列出了各种不同网络架构的监督学习,比如标准的神经网络(NN)可用于训练房子特征和房价之间的函数,卷积神经网络(CNN)可用于训练图像和类别之间的函数,循环神经网络(RNN)可用于训练语音和文本之间的函数。
左下: 分别展示了 NN、CNN 和 RNN 的简化架构。这三种架构的前向过程各不相同,NN 使用的是权重矩阵(连接)和节点值相乘并陆续传播至下一层节点的方式;CNN 使用矩形卷积核在图像输入上依次进行卷积操作、滑动,得到下一层输入的方式;RNN 记忆或遗忘先前时间步的信息以为当前计算过程提供长期记忆。
右上: NN 可以处理结构化数据(表格、数据库等)和非结构化数据(图像、音频等)。
右下: 深度学习能发展起来主要是由于大数据的出现,神经网络的训练需要大量的数据;而大数据本身也反过来促进了更大型网络的出现。深度学习研究的一大突破是新型激活函数的出现,用 ReLU 函数替换sigmoid 函数可以在反向传播中保持快速的梯度下降过程,sigmoid 函数在正无穷处和负无穷处会出现趋于零的导数,这正是梯度消失导致训练缓慢甚至失败的主要原因。要研究深度学习,需要学会「idea—代码—实验—idea」的良性循环。
左上:logistic 回归主要用于二分类问题,如图中所示,logistic 回归可以求解一张图像是不是猫的问题,其中图像是输入(x),猫(1)或非猫(0)是输出。我们可以将 logistic 回归看成将两组数据点分离的问题,如果仅有线性回归(激活函数为线性),则对于非线性边界的数据点(例如,一组数据点被另一组包围)是无法有效分离的,因此在这里需要用非线性激活函数替换线性激活函数。在这个案例中,我们使用的是 sigmoid 激活函数,它是值域为(0, 1)的平滑函数,可以使神经网络的输出得到连续、归一(概率值)的结果,例如当输出节点为(0.2, 0.8)时,判定该图像是非猫(0)。
左下:神经网络的训练目标是确定最合适的权重 w 和偏置项 b,那这个过程是怎么样的呢?
这个分类其实就是一个优化问题,优化过程的目的是使预测值 y hat 和真实值 y 之间的差距最小,形式上可以通过寻找目标函数的最小值来实现。所以我们首先确定目标函数(损失函数、代价函数)的形式,然后用梯度下降逐步更新 w、b,当损失函数达到最小值或者足够小时,我们就能获得很好的预测结果。
右上:损失函数值在参数曲面上变化的简图,使用梯度可以找到最快的下降路径,学习率的大小可以决定收敛的速度和最终结果。学习率较大时,初期收敛很快,不易停留在局部极小值,但后期难以收敛到稳定的值;学习率较小时,情况刚好相反。一般而言,我们希望训练初期学习率较大,后期学习率较小,之后会介绍变化学习率的训练方法。
右下:总结整个训练过程,从输入节点 x 开始,通过前向传播得到预测输出 y hat,用 y hat 和 y 得到损失函数值,开始执行反向传播,更新 w 和 b,重复迭代该过程,直到收敛。
左上: 浅层网络即隐藏层数较少,如图所示,这里仅有一个隐藏层。
左下: 这里介绍了不同激活函数的特点:
sigmoid:sigmoid 函数常用于二分分类问题,或者多分类问题的最后一层,主要是由于其归一化特性。sigmoid 函数在两侧会出现梯度趋于零的情况,会导致训练缓慢。
tanh:相对于 sigmoid,tanh 函数的优点是梯度值更大,可以使训练速度变快。
ReLU:可以理解为阈值激活(spiking model 的特例,类似生物神经的工作方式),该函数很常用,基本是默认选择的激活函数,优点是不会导致训练缓慢的问题,并且由于激活值为零的节点不会参与反向传播,该函数还有稀疏化网络的效果。
Leaky ReLU:避免了零激活值的结果,使得反向传播过程始终执行,但在实践中很少用。
右上: 为什么要使用激活函数呢?更准确地说是,为什么要使用非线性激活函数呢?
上图中的实例可以看出,没有激活函数的神经网络经过两层的传播,最终得到的结果和单层的线性运算是一样的,也就是说,没有使用非线性激活函数的话,无论多少层的神经网络都等价于单层神经网络(不包含输入层)。
右下: 如何初始化参数 w、b 的值?
当将所有参数初始化为零的时候,会使所有的节点变得相同,在训练过程中只能学到相同的特征,而无法学到多层级、多样化的特征。解决办法是随机初始化所有参数,但仅需少量的方差就行,因此使用 Rand(0.01)进行初始化,其中 0.01 也是超参数之一。
左上:神经网络的参数化容量随层数增加而指数式地增长,即某些深度神经网络能解决的问题,浅层神经网络需要相对的指数量级的计算才能解决。
左下:CNN 的深度网络可以将底层的简单特征逐层组合成越来越复杂的特征,深度越大,其能分类的图像的复杂度和多样性就越大。RNN 的深度网络也是同样的道理,可以将语音分解为音素,再逐渐组合成字母、单词、句子,执行复杂的语音到文本任务。
右边:深度网络的特点是需要大量的训练数据和计算资源,其中涉及大量的矩阵运算,可以在 GPU 上并行执行,还包含了大量的超参数,例如学习率、迭代次数、隐藏层数、激活函数选择、学习率调整方案、批尺寸大小、正则化方法等。
那么部署你的机器学习模型需要注意些什么?下图展示了构建 ML 应用所需要的数据集分割、偏差与方差等问题。
如上所示,经典机器学习和深度学习模型所需要的样本数有非常大的差别,深度学习的样本数是经典 ML 的成千上万倍。因此训练集、开发集和测试集的分配也有很大的区别,当然我们假设这些不同的数据集都服从同分布。
偏差与方差问题同样是机器学习模型中常见的挑战,上图依次展示了由高偏差带来的欠拟合和由高方差带来的过拟合。一般而言,解决高偏差的问题是选择更复杂的网络或不同的神经网络架构,而解决高方差的问题可以添加正则化、减少模型冗余或使用更多的数据进行训练。
当然,机器学习模型需要注意的问题远不止这些,但在配置我们的 ML 应用中,它们是最基础和最重要的部分。其它如数据预处理、数据归一化、超参数的选择等都在后面的信息图中有所体现。
正则化是解决高方差或模型过拟合的主要手段,过去数年,研究者提出和开发了多种适合机器学习算法的正则化方法,如数据增强、L2 正则化(权重衰减)、L1 正则化、Dropout、Drop Connect、随机池化和提前终止等。
如上图左列所示,L1 和 L2 正则化也是是机器学习中使用最广泛的正则化方法。L1 正则化向目标函数添加正则化项,以减少参数的绝对值总和;而 L2 正则化中,添加正则化项的目的在于减少参数平方的总和。根据之前的研究,L1 正则化中的很多参数向量是稀疏向量,因为很多模型导致参数趋近于 0,因此它常用于特征选择设置中。此外,参数范数惩罚 L2 正则化能让深度学习算法「感知」到具有较高方差的输入 x,因此与输出目标的协方差较小(相对增加方差)的特征权重将会收缩。
在中间列中,上图展示了 Dropout 技术,即暂时丢弃一部分神经元及其连接的方法。随机丢弃神经元可以防止过拟合,同时指数级、高效地连接不同网络架构。一般使用了 Dropout 技术的神经网络会设定一个保留率 p,然后每一个神经元在一个批量的训练中以概率 1-p 随机选择是否去掉。在最后进行推断时所有神经元都需要保留,因而有更高的准确度。
Bagging 是通过结合多个模型降低泛化误差的技术,主要的做法是分别训练几个不同的模型,然后让所有模型表决测试样例的输出。而 Dropout 可以被认为是集成了大量深层神经网络的 Bagging 方法,因此它提供了一种廉价的 Bagging 集成近似方法,能够训练和评估值数据数量的神经网络。
最后,上图还描述了数据增强与提前终止等正则化方法。数据增强通过向训练数据添加转换或扰动来人工增加训练数据集。数据增强技术如水平或垂直翻转图像、裁剪、色彩变换、扩展和旋转通常应用在视觉表象和图像分类中。而提前终止通常用于防止训练中过度表达的模型泛化性能差。如果迭代次数太少,算法容易欠拟合(方差较小,偏差较大),而迭代次数太多,算法容易过拟合(方差较大,偏差较小)。因此,提前终止通过确定迭代次数解决这个问题。
最优化是机器学习模型中非常非常重要的模块,它不仅主导了整个训练过程,同时还决定了最后模型性能的好坏和收敛需要的时长。以下两张信息图都展示了最优化方法需要关注的知识点,包括最优化的预备和具体的最优化方法。
以上展示了最优化常常出现的问题和所需要的操作。首先在执行最优化前,我们需要归一化输入数据,而且开发集与测试集归一化的常数(均值与方差)与训练集是相同的。上图也展示了归一化的原因,因为如果特征之间的量级相差太大,那么损失函数的表面就是一张狭长的椭圆形,而梯度下降或最速下降法会因为「锯齿」现象而很难收敛,因此归一化为圆形有助于减少下降方向的震荡。
后面的梯度消失与梯度爆炸问题也是十分常见的现象。「梯度消失」指的是随着网络深度增加,参数的梯度范数指数式减小的现象。梯度很小,意味着参数的变化很缓慢,从而使得学习过程停滞。梯度爆炸指神经网络训练过程中大的误差梯度不断累积,导致模型权重出现很大的更新,在极端情况下,权重的值变得非常大以至于出现 NaN 值。
梯度检验现在可能用的比较少,因为我们在 TensorFlow 或其它框架上执行最优化算法只需要调用优化器就行。梯度检验一般是使用数值的方法计算近似的导数并传播,因此它能检验我们基于解析式算出来的梯度是否正确。
下面就是具体的最优化算法了,包括最基本的小批量随机梯度下降、带动量的随机梯度下降和 RMSProp 等适应性学习率算法。
小批量随机梯度下降(通常 SGD 指的就是这种)使用一个批量的数据更新参数,因此大大降低了一次迭代所需的计算量。这种方法降低了更新参数的方差,使得收敛过程更为稳定;它也能利用流行深度学习框架中高度优化的矩阵运算器,从而高效地求出每个小批数据的梯度。通常一个小批数据含有的样本数量在 50 至 256 之间,但对于不同的用途也会有所变化。
动量策略旨在加速 SGD 的学习过程,特别是在具有较高曲率的情况下。一般而言,动量算法利用先前梯度的指数衰减滑动平均值在该方向上进行修正,从而更好地利用历史梯度的信息。该算法引入了变量 v 作为参数在参数空间中持续移动的速度向量,速度一般可以设置为负梯度的指数衰减滑动平均值。
上图后面所述的 RMSProp 和 Adam 等适应性学习率算法是目前我们最常用的最优化方法。RMSProp 算法(Hinton,2012)修改 AdaGrad 以在非凸情况下表现更好,它改变梯度累积为指数加权的移动平均值,从而丢弃距离较远的历史梯度信息。RMSProp 是 Hinton 在公开课上提出的最优化算法,其实它可以视为 AdaDelta 的特例。但实践证明 RMSProp 有非常好的性能,它目前在深度学习中有非常广泛的应用。
Adam 算法同时获得了 AdaGrad 和 RMSProp 算法的优点。Adam 不仅如 RMSProp 算法那样基于一阶矩均值计算适应性参数学习率,它同时还充分利用了梯度的二阶矩均值(即有偏方差/uncentered variance)。
以下是介绍超参数的信息图,它在神经网络中占据了重要的作用,因为它们可以直接提升模型的性能。
众所周知学习率、神经网络隐藏单元数、批量大小、层级数和正则化系数等超参数可以直接影响模型的性能,而怎么调就显得非常重要。目前最常见的还是手动调参,开发者会根据自身建模经验选择「合理」的超参数,然后再根据模型性能做一些小的调整。而自动化调参如随机过程或贝叶斯优化等仍需要非常大的计算量,且效率比较低。不过近来关于使用强化学习、遗传算法和神经网络等方法搜索超参数有很大的进步,研究者都在寻找一种高效而准确的方法。
目前的超参数搜索方法有:
依靠经验: 聆听自己的直觉,设置感觉上应该对的参数然后看看它是否工作,不断尝试直到累趴。
网格搜索: 让计算机尝试一些在一定范围内均匀分布的数值。
随机搜索: 让计算机尝试一些随机值,看看它们是否好用。
贝叶斯优化: 使用类似 MATLAB bayesopt 的工具自动选取最佳参数——结果发现贝叶斯优化的超参数比你自己的机器学习算法还要多,累觉不爱,回到依靠经验和网格搜索方法上去。
因为篇幅有限,后面的展示将只简要介绍信息图,相信它们对各位读者都十分有帮助。
我们需要按过程或结构来设定我们的机器学习系统,首先需要设定模型要达到的目标,例如它的预期性能是多少、度量方法是什么等。然后分割训练、开发和测试集,并预期可能到达的优化水平。随后再构建模型并训练,在开发集和测试集完成验证后就可以用于推断了。
在完成训练后,我们可以分析误差的来源而改进性能,包括发现错误的标注、不正确的损失函数等。
上图展示了三个分割数据集及其表现所需要注意的地方,也就是说如果它们间有不同的正确率,那么我们该如何修正这些「差别」。例如训练集的正确率明显高于验证集与测试集表明模型过拟合,三个数据集的正确率都明显低于可接受水平可能是因为欠拟合。
机器学习和深度学习当然不止监督学习方法,还有如迁移学习、多任务学习和端到端的学习等。
卷积网络
计算机视觉任务涉及的数据体量是特别大的,一张图像就有上千个数据点,更别提高分辨率图像和视频了。这时用全连接网络的话,参数数量太大,因而改用卷积神经网络(CNN),参数数量可以极大地减小。CNN 的工作原理就像用检测特定特征的过滤器扫描整张图像,进行特征提取,并逐层组合成越来越复杂的特征。这种「扫描」的工作方式使其有很好的参数共享特性,从而能检测不同位置的相同目标(平移对称)。
卷积核对应的检测特征可以从其参数分布简单地判断,例如,权重从左到右变小的卷积核可以检测到黑白竖条纹的边界,并显示为中间亮,两边暗的特征图,具体的相对亮暗结果取决于图像像素分布和卷积核的相对关系。卷积核权重可以直接硬编码,但为了让相同的架构适应不同的任务,通过训练得到卷积核权重是更好的办法。
卷积运算的主要参数:
padding:直接的卷积运算会使得到的特征图越来越小,padding 操作会在图像周围添加 0 像素值的边缘,使卷积后得到的特征图大小和原图像(长宽,不包括通道数)相同。
常用的两个选项是:『VALID』,不执行 padding;『SAME』,使输出特征图的长宽和原图像相同。
stride:两次卷积操作之间的步长大小。
一个卷积层上可以有多个卷积核,每个卷积核运算得到的结果是一个通道,每个通道的特征图的长宽相同,可以堆叠起来构成多通道特征图,作为下一个卷积层的输入。
深度卷积神经网络的架构:
深度卷积神经网络的架构主要以卷积层、池化层的多级堆叠,最后是全连接层执行分类。池化层的主要作用是减少特征图尺寸,进而减少参数数量,加速运算,使其目标检测表现更加鲁棒。
LeNet·5:手写识别分类网络,这是第一个卷积神经网络,由 Yann LeCun 提出。
AlexNet:图像分类网络,首次在 CNN 引入 ReLU 激活函数。
VGG-16:图像分类网络,深度较大。
ResNet:引入残差连接,缓解梯度消失和梯度爆炸问题,可以训练非常深的网络。
Network in Network:使用 1x1 卷积核,可以将卷积运算变成类似于全连接网络的形式,还可以减少特征图的通道数,从而减少参数数量。
Inception Network:使用了多种尺寸卷积核的并行操作,再堆叠成多个通道,可以捕捉多种规模的特征,但缺点是计算量太大,可以通过 1x1 卷积减少通道数。
使用开源实现:从零开始实现时非常困难的,利用别人的实现可以快速探索更复杂有趣的任务。
数据增强:通过对原图像进行镜像、随机裁剪、旋转、颜色变化等操作,增加训练数据量和多样性。
迁移学习:针对当前任务的训练数据太少时,可以将充分训练过的模型用少量数据微调获得足够好的性能。
基准测试和竞赛中表现良好的诀窍:使用模型集成,使用多模型输出的平均结果;在测试阶段,将图像裁剪成多个副本分别测试,并将测试结果取平均。
目标检测即使用边界框检测图像中物体的位置,Faster R-CNN、R-FCN 和 SSD 是三种目前最优且应用最广泛的目标检测模型,上图也展示了 YOLO 的基本过程。
人脸识别有两大类应用:人脸验证(二分分类) 和人脸识别(多人分类)。
当样本量不足时,或者不断有新样本加入时,需要使用 one-shot learning,解决办法是学习相似性函数,即确定两张图像的相似性。比如在 Siamese Network 中学习人脸识别时,就是利用两个网络的输出,减少同一个人的两个输出的差别,增大不同人的两个输出之间的差别。
风格迁移是一个热门话题,它会在视觉上给人耳目一新的感觉。例如你有一副图,然后将另一幅图的风格特征应用到这幅图上,比如用一位著名画家或某一副名画的风格来修改你的图像,因此我们可以获得独特风格的作品。
03
循环网络
如上所示,命名实体识别等序列问题在现实生活中占了很大的比例,而隐马尔可夫链等传统机器学习算法只能作出很强的假设而处理部分序列问题。但近来循环神经网络在这些问题上有非常大的突破,RNN 隐藏状态的结构以循环形的形式成记忆,每一时刻的隐藏层的状态取决于它的过去状态,这种结构使得 RNN 可以保存、记住和处理长时期的过去复杂信号。
循环神经网络(RNN)能够从序列和时序数据中学习特征和长期依赖关系。RNN 具备非线性单元的堆叠,其中单元之间至少有一个连接形成有向循环。训练好的 RNN 可以建模任何动态系统;但是,训练 RNN 主要受到学习长期依赖性问题的影响。
以下展示了 RNN 的应用、问题以及变体等:
循环神经网络在语言建模等序列问题上有非常强大的力量,但同时它也存在很严重的梯度消失问题。因此像 LSTM 和 GRU 等基于门控的 RNN 有非常大的潜力,它们使用门控机制保留或遗忘前面时间步的信息,并形成记忆以提供给当前的计算过程。
词嵌入在自然语言处理中非常重要,因为不论执行怎样的任务,将词表征出来都是必须的。上图展示了词嵌入的方法,我们可以将词汇库映射到一个 200 或 300 维的向量,从而大大减少表征词的空间。此外,这种词表征的方法还能表示词的语义,因为词义相近的词在嵌入空间中距离相近。
除了以上所述的 Skip Grams,以下还展示了学习词嵌入的常见方法:
GloVe 词向量是很常见的词向量学习方法,它学到的词表征可进一步用于语句分类等任务。
序列到序列的方法使用最多的就是编码器解码器框架,其它还有束搜索等模块的介绍。
编码器解码器架构加上注意力机制可以解决非常多的自然语言处理问题,以下介绍了 BLEU 分值和注意力机制。它们在机器翻译的架构和评估中都是不能缺少的部分。
以上是所有关于吴恩达深度学习专项课程的信息图,由于它们包含的信息较多,我们只介绍了一部分,还有很多内容只是简单的一笔带过。所以各位读者最好可以下载该信息图,并在后面的学习过程中慢慢理解与优化。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~