您的位置:首页 > 理论基础 > 计算机网络

深度学习之Helloworld

2017-07-21 20:38 183 查看
①前言
一.传统机器学习的回顾
人工智能是一个非常大的概念,而机器学习只是人工智能的一种实现方法。深度学习是同样也是一种实现机器学习的方法,是在机器学习的基础上建立起来的。这体现在,首先从字面上看,二者都是在“学习”,因此在评价深度学习训练出的模型好坏时,同样直接来源于机器学习的评价方法。其次,深度学习最常见的形式,深度神经网络,直接脱胎于机器学习中的神经网络模型。

1. 机器学习的评价方法
监督学习和非监督学习
1.1 使用数据可视化、降维、聚类等非监督方法,探索数据特征
1.2 基于特征的监督模型预测
1.3 结果的评价指标以及潜在问题
机器学习之分类性能度量指标 : ROC曲线、AUC值、正确率、召回率
二分类问题在机器学习中是一个很常见的问题,经常会用到。ROC(Receiver Operating Characteristic) 曲线和 AUC (Area Under the Curve) 值常被用来评价一个二值分类器 (binary classifier) 的优劣。

对于分类器或者说分类算法,评价指标主要有precision,recall,F1 score等,以及这里要讨论的ROC和AUC
ROC:
ROC曲线:接收者操作特征曲线(receiver operating characteristic curve),是反映敏感性和特异性连续变量的综合指标,roc曲线上每个点反映着对同一信号刺激的感受性。

分类器的一个重要功能“概率输出”,即表示分类器认为某个样本具有多大的概率属于正样本(或负样本)。通过更深入地了解各个分类器的内部机理,我们总能想办法得到一种概率输出。通常来说,是将一个实数范围通过某个变换映射到(0,1)区间。

AUC
AUC (Area Under Curve) 被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围一般在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

AUC的计算有两种方式,梯形法和ROC AUCH法,都是以逼近法求近似值,具体见wikipedia。
根据(Fawcett, 2006),AUC的值的含义是:The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.首先AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值。当然,AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。

AUC判断分类器(预测模型)优劣的标准:AUC值越大的分类器,正确率越高。
AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。

0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

为什么要使用ROC和AUC?
因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。

潜在问题:欠拟合和过拟合
如何避免?分成三个部分,一部分作为 训练集,一部分作为验证集,最后还有 测试集

2. 机器学习的模型实现(提高深度学习模型预测的准确性)
调整模型的参数,无疑是最简单最快速的方法,但调参并不能从根本上解决分类准确性的问题。如果是数据 欠拟合,则通常需要更多的特征、更优化的模型。

二、核心概念
机器学习(Machine Learning):
在机器学习中,我们(1)读取数据,(2)训练模型,(3)使用模型对新数据做预测。训练可以看作是当模型拿到新数据的时候、逐步学习一个的过程。在每一步,模型做出预测并且得到准确度的反馈。反馈的形式即是某种衡量标准(比如与正确解的距离)下的误差,再被用于修正预测误差。

学习是一个在参数空间里循环往复的过程:当你调整参数改正一次预测,但是模型却可能把原先对的又搞错了。需要很多次的迭代,模型才能具有良好的预测能力,这一“预测-修正”的过程一直持续到模型再无改良空间。

特征工程(Feature Engineering)
特征工程从数据中提取有用的模式,使之更容易被机器学习模型进行分类。
比如,把一堆绿色或蓝色的像素区域作为标准,来判断照片上是陆生动物还是水生动物。这一特征对于机器学习模型十分有效,因为其限制了需要考虑的类别数量。

在多数预测任务中,特征工程是取得好结果的必备技能。然而,因为不同的数据集有着不同的特征工程方法,所以很难得出普遍规律,只有一些大概的经验,这使得特征工程更是一门艺术而非科学。一个数据集里极其关键的特征,到了另一个数据集里可能没有卵用(比如下一个数据集里全是植物)。正因为特征工程这么难,才会有科学家去研发自动提取特征的算法。

很多任务已经可以自动化(比如物体识别、语音识别),特征工程还是复杂任务中最有效的技术(比如Kaggle机器学习竞赛中的大多数任务)。

特征学习(Feature Learning)
特征学习算法寻找同类之间的共有模式,并自动提取用以分类或回归。特征学习就是由算法自动完成的特征工程。
在深度学习中,卷积层就极其擅长寻找图片中的特征,并映射到下一层,形成非线性特征的层级结构,复杂度逐渐提升(例如:圆圈,边缘 -> 鼻子,眼睛,脸颊)。最后一层使用所有生成的特征来进行分类或回归(卷积网络的最后一层,本质上就是多项式逻辑回归)。

大多数特征往往不知所云,特别是循环神经网络、LSTM或特别深的深度卷积网络。

深度学习(Deep Learning)
数学上可以证明,单层神经网络所能学习的最好特征,就是圆圈和边缘,因为它们包含了单个非线性变换所能承载的最多信息。为了生成信息量更大的特征,我们不能直接操作这些输入,而要对第一批特征(边缘和圆圈)继续进行变换,以得到更复杂的特征。

研究显示,人脑有着相同的工作机理:视锥细胞接受信息的第一层神经,对边缘和圆圈更加敏感,而更深处的大脑皮层则对更加复杂的结构敏感,比如人脸。

深度学习并非总是与深度非线性层级特征绑定,有时也与序列数据中的长期非线性时间依赖相关。对于序列数据,多数其他算法只有最后10个时间步的记忆,而LSTM循环神经网络(1997年由Sepp Hochreiter和Jürgen Schmidhuber发明),使网络能够追溯上百个时间步之前的活动以做出正确预测。尽管LSTM曾被雪藏将近10年,但自从2013年与卷积网络结合以来,其应用飞速成长。

三、基本概念
逻辑回归(Logistic Regression)
回归分析预测统计输入变量之间的关系,以预测输出变量。逻辑回归用输入变量,在有限个输类别变量中产生输出,比如“得癌了” / “没得癌”,或者图片的种类如“鸟” / “车” / “狗” / “猫” / “马”。

逻辑回归使用logistic sigmoid函数(见图2)给输入值赋予权重,产生二分类的预测(多项式逻辑回归中,则是多分类)。

逻辑回归与非线性感知机或没有隐藏层的神经网络很像。主要区别在于,只要输入变量满足一些统计性质,逻辑回归就很易于解释而且可靠。

在深度学习中,用于分类的神经网络中,最后几层一般就是逻辑回归。本系列将深度学习算法看作若干特征学习阶段,然后将特征传递给逻辑回归,对分类进行输入。

人工神经网络(Aritificial Neural Network)
人工神经网络(1)读取输入数据,(2)做计算加权和的变换,(3)对变换结果应用非线性函数,计算出一个中间状态。这三步合起来称为一“层”,变换函数则称为一个“单元”。中间状态——特征——也是另一层的输入。

通过这些步骤的重复,人工神经网络学的了很多层的非线性特征,最后再组合起来得出一个预测。神经网络的学习过程是产生误差信号——网络预测与期望值的差——再用这些误差调整权重(或其他参数)使预测结果更加准确。

感知机
感知机只含一个线性或非线性单元。从几何学上讲,经过Delta规则训练的非线性感知机,可以找到分离两类数据点的非线性平面(如果该平面存在的话)。如果没有这样的平面,感知机也会生成一个准确度最佳的分离平面。感知机的优秀表现,带来了人工智能的一阵浮夸风。然而在1969年,却发现感知机会在一些看起来很简单的模式上失效,比如XOR(亦或)函数。感知机的失败是第一次AI寒冬的重要原因。

AI寒冬:
机器学习和其他解释方法的快速发展,使很多人对人工智能盲目乐观(今天仍有类似声音)。研究者承诺这样的大跃进会持续存在,并终将带来强人工智能,于是得到了大量的资金投入。到了1970年,显然这样的承诺是无法兑现的,金主争先撤资,人工智能跌下神坛与伪科学为伍。研究变得十分困难(没有经费;成果发表通不过同行评审),但仍有一小撮然研究者负重前行,终于带来了AI中兴,始有今日的深度学习盛举。

过犹不及,深度学习的泡沫是危险的,明智的研究者会避免预测未来——因为他们不想遇到下一个AI寒冬。

AlexNet
AlexNet是根据Alex Krizhevsky命名的卷积网络架构,他们改进了Ciresan等人的架构,后者使用修正线性单元加速以及Dropout提高泛化能力,赢下了2011-2012年多项世界级竞赛。他们的结果与特征工程方法迥然不同,确立了深度学习在计算机视觉界的领先地位。AlexNet预示着深度学习技术即将成为主流,当然也有深度学习泡沫的隐患。

随机梯度下降(Stochastic Gradien Descent)
梯度下降法根据全局数据测量梯度,而随机梯度下降法就是大概瞅一眼就找个方向(只用几百个数据点预测坡度)。
在随机梯度下降算法中,我们在误差函数的曲面上,走最陡峭的下坡路(梯度或一阶导数的负数),想找到最低点。

误差的反向传播(BackPropagation of Errors)
误差的反向传播,或简称反向传播,是在神经网络中找到误差相对权重梯度的方法。梯度表示误差会随着权重如何变化。这里的梯度用于执行梯度下降算法,最终得到一组权重使得网络误差最小。

教授反向传播有三种比价好的方式:(1)可视化表示,(2)数学表示,(3)基于规则的表示。
基于规则的表示:
假设有个神经网络里有100层,我们可以想象一个前馈过程:一个矩阵(维度:样本数量 x 输入节点数)输入到网络并传播,我们始终有(1)输入节点,(2)权重矩阵(维度:输入节点 x 输出节点),(3)输出节点带有非线性激励函数(维度:样本 x 输出节点)。怎么来想象这些矩阵呢?

输入矩阵:每个输入节点与偶一个输入值,比如像素值(三个输入值 = 图1里的三个像素),乘以样本数量,即图片数。所以对于128张3像素图片,我们的输入矩阵就是128x3。

权重矩阵代表输入和输出节点之间的连接,通向输入节点(像素)的值,经过权重矩阵加权,再“流”向每个输出节点。这个“流”是输入值和每个权重值相乘的结果。输出矩阵就是所有输出节点收到的,来自所有输入节点的累积“流”。

对于每个输入,我们乘以所有权重,再相加给予输出节点,或者更容易的是,直接求输入矩阵和权重矩阵的矩阵相乘。在这个例子里就是128x3的输入矩阵与3x5的权重矩阵相乘。 然后得到输出矩阵128x5。我们将对这一输出矩阵应用非线性激励函数,并将结果作为输入矩阵再传递给下一层。重复这一过程,直到得出误差函数。通过误差函数可以计算我们的预测与正确值之间的差距,这就是正向传播过程。

输入数据的正向传播过程,从第一层到最后一层,基于如下规则:
1.遇到权重矩阵,进行矩阵乘法,继续传播结果。
2.遇到激励函数,将现有结果传递给激励函数,并传播函数输出。
3.将上一层的输出,作为下一层的输入。
4.遇到误差函数,计算误差,留待反向传播使用。

误差的反向传播过程类似,只是从最后一层到第一层,基于如下规则:
1.遇到权重矩阵,与其转置相乘,传播结果。
2.遇到激励函数,逐个元素地乘以该函数(相对前馈输入)的导数。
3.将前一层的误差当作后一层的输入。

为了计算梯度,我们用反向传播规则2的中间结果,与争先传播规则2的中间结果,进行矩阵乘法。

修正线性函数(Rectified Linear Unit,ReLU)
修正线性函数具有简单的非线性性质:保留正值,将负值变成0:f(x) = max(0, x)。ReLU对所有正值的梯度是1,负值的梯度为0。这意味着在反向传播过程中,负梯度不会用于更新ReLU的输出权重。

然而,因为我们对正值有梯度1,所以训练速度相比其他非线性单元更快。比如logistic sigmoid函数在大绝对值处的梯度很小,以致于学习过程几乎停滞(这一情形与鞍点问题相似)。

除了负梯度不传播(梯度为0)以外,“大正值有大梯度”也是ReLU的优势,无论梯度几何,训练速度都很快。自从这一优势被发现以来,ReLU以及其他有大梯度的激励函数就成为深度网络的首选。

Nesterov加速梯度
梯度的下降路径呈锯齿状的,不过大致上还是向着最小值的一条直线。如果我们在这个方向上移动再快一点,而减少曲折来回,就能更快地抵达终点。这就是动量思想。

让我们跟踪一个移动中的动量矩阵,也就是梯度加权和,我们把这个矩阵的值加到梯度上。动量矩阵的尺寸始终在控制之中,每次更新(乘以一个动量值:0.7~0.99之间)都要消减。经过一段时间,锯齿将被动量矩阵平滑化:一个方向上的锯齿与其相反方向的锯齿抵消,形成通往局部最小值的直线。最开始,这个大致方向还没有建立起来,动量矩阵需要消减的更猛烈些,否则动量值反而会放大锯齿震荡,是学习过程失稳。因而,动量开始应该保持较小取值(0.5~0.7),之后再迅速放大(0.9~0.999)。

通常先尽形得势梯度更新,再跳到动量方向。但是Nesterov指数,先跳到动量方向,再用梯度更新修正方向,效果更好。这一过程就是“Nesterov加速梯度”,收敛更快。

均方根传播(Root Mean Square Propagation)
RMSprop跟踪梯度平方的加权移动均值,再求平方根(本质上,就是除以最近梯度的大小,对梯度归一化)。当误差平面进入平原地带,梯度很小的时候,更新使用更大步幅以保证快速收敛(小幅更新:0.00001,加权平均的平方根:0.00005,更新规模:0.2)。另一方面,RMSprop还防止了梯度激增(大更新:100,加权平均的平方根:25,更新规模:4),所以在循环神经网络和LSTM中使用很多,来防止梯度消失和梯度爆炸。

正则化方法
Dropout算法
L1、L2正则化是通过修改代价函数来实现的,而Dropout则是通过修改神经网络本身来实现的
Dropout切断了单元之间的信息处理关联,让他们无法依赖于几个“明星”单元,尽管这几个单元看起来很正确(检测出了更重要的特征)。

Dropout使得分类过程更加“民主化”了 ,每个单元都要独立做出计算,以此减少偏差,屏除极端。单元间的的独立带来了很强的正则化和更好的模型泛化能力(集体的智慧)。

L1 regularization
L1正则化惩罚的是权重的绝对值
很小的权重也会产生挺大的L1惩罚,L1还有一个效果就是,如果存在若干较大权重,其他权重会被设为0。因为非零权重越少,网络可信度越高。

L2 regularization(权重衰减)
L2惩罚的是权重值平方
L2惩罚则鼓励很小的非零权重(大权重 -> 大误差)。预测几乎由所有权重共同得出,以此减小偏差(哪个权重也不能一家独大)。

四、卷积深度学习
卷积(Convolution)
卷积是一种数学操作,表述了混合两个函数或两块信息的规则:(1)特征映射或输入数据吗,与(2)卷积核混合,形成(3)变换特征映射。卷积也经常被当做是一种滤波器,卷积核(kernel)过滤特征映射以找到某种信息,比如一个卷积核可能是只找边缘,而抛掉其他信息。

卷积在物理和数学中都很重要,因为他建立了时域和空间(位置(0,30)的,像素值147)以及频域(幅度0.3,频率30Hz,相位60度)的桥梁。这一桥梁的建立是通过傅里叶变换:当你对卷积核与特征映射都做傅里叶变换时,卷积操作就被极大简化了(积分变成了相乘)。

互相关(cross-correlation)解释是目前最有效的:卷积滤波器是特征检测器,输入(特征映射)被某个特征(kernel)所过滤,如果该特征被检测到了,那么输出就高。这也是图像处理中互相关的解释。

池化/下采样(Pooling/Sub-Sampling)
池化过程从特定区域读取输入,并压缩为一个值(下采样)。在卷积神经网络中,信息的集中是种很有用的性质,这样输出连接通常接收的都是相似信息(信息像经过漏斗一样,流向对应下一个卷积层的正确位置)。这提供了基本的旋转/平移不变性。比如,如果脸不在图片的中心位置,而是略有偏移,这应该不影响识别,因为池化操作将信息导入到了正确位置,故卷积滤波器仍能检测到脸。

池化区域越大,信息压缩就越多,从而产生更“苗条”的网络,也更容易配合显存。但是如果池化面积太大,丢失信息太多,也会降低预测能力。

Inception
卷积网络中,inception模块的设计初衷是为了以更高的计算效率,执行更深、更大的卷积层。Inception使用1x1的卷积核,生成很小的特征映射。比如192个28x28的特征映射,可以经过64个1x1的卷积,被压缩成64个28x28的特征映射。因为尺寸缩小了,这些1x1的卷积后面还可以跟跟大的卷积,比如3x3,5x5。除了1x1卷积,最大池化也用来降维。

Inception模块的输出,所有的大卷积都拼接成一个大的特征映射,再传递给下一层(或inception模块)。

卷积神经网络(Convolutional Neural Network, CNN)
卷积神经网络,或卷积网络,使用卷积层过滤输入以获得有效信息。卷积层有的参数是自动学习获得的,滤波器自动调整以提取最有用的信息(特征学习)。

eg:比如对于一个普适的物体识别任务,物体的形状可能是最有用的;而对于鸟类识别人物,颜色可能是最有用的(因为鸟的形状都差不多,而颜色却五花八门)。

一般我们使用多个卷积层过滤图像,每一层之后获得的信息,都越来越抽象(层级特征)。
卷积网络使用池化层,获得有限的平移/旋转不变性(即使目标不在通常位置,也能检测出来)。池化也降低了内存消耗,从而能够使用更多卷积层。

最近的卷积网络使用inception模块,即1x1的卷积核进一步降低内存消耗,加速计算和训练过程。

②神经网络
“神经网络”一词其实是对生物大脑打的比方,大脑里也有“神经网络”,神经网络的构成单元就是“神经元”。
1.感知机:
感知器是最简单的一种神经网络,由单个神经元构成。就像生物神经元一样,具有树突和轴突。人工神经元呈树状结构,有多个输入节点和一个输出节点:

由图可见,人工神经网络有六大组件,从左至右分别为:
输入节点: 输入节点(input node)关联着一个个数值,可以是任意实数:正数或负数,整数或小数。
连接: 相似地,每一个出自输入节点的连接,都关联着一个权重值(weight),这个值也可以是任意整数。
输入和权重的结合: 对输入求加权和:y=f(∑wi∗xi)y=f(∑wi∗xi),即
y=f(w1∗x1+w2∗x2+...+wn∗xn)y=f(w1∗x1+w2∗x2+...+wn∗xn)
激活函数: 
最简单的激活函数(activation function)`,就是输入输出相等(identity function),f(x)=xory=xf(x)=xory=x,这里的xx就是输入与连接的加权和。就像生物神经元的突触只在特定条件下激活一样,人工神经元也只在xx超过阈值时激活。假设这个阈值是0,那么激活函数就是:
f(x)=0f(x)=0 if x<0x<0
f(x)=1f(x)=1 if x≥0x≥0

这样的函数曲线不是平滑的,而是非连续的,这会带来很多数学处理上的问题,所以常用的还是连续函数,如S型函数(sigmoid function),最典型的sigmoid function是逻辑斯蒂函数(logistic function)。

输出节点: 输出节点(output node)呈现了激活函数的结果。
偏置: 偏置(bias)可以认为是一个值固定为1的输入节点,它可以左右移动激活函数,提高学习算法性能。

注意,感知器只能处理数值数据,也就是说,需要把字符等数据都转换为数值格式。现在你已经知道了,感知器控制的是阈值,那么将其用作分类目的也就不远了:高于特定阈值的输出,表示样本属于某一类;而低于阈值就归为另一类。输出=阈值的直线就是两个类别的决策边界。

2.多层感知器
感知器组成的网络就是多层感知器,这就是我们将用Keras实现的对象。多层感知器又叫前馈神经网络,你可能已经猜到了,还有比感知器更加复杂的网络,神经元以层级结构组织在一起。层数一般是二三层,但是理论上层数是无限的。网络的层就像生物神经元:一层的输出,是下一层的输入。

网络层分为输入层、隐藏层和输出层。多层感知器通常是全连接(fully-connected)的,一层之中的每一个感知器都与下一层的每一个感知器相连接,尽管这不是强制性,但通常是标配。感知器只能表征线性可分的问题,而多层感知器结合非线性的激活函数就突破了这一限制,可以表征更加复杂的决策边界。

3.激活函数:
在人工神经网络的构建过程中,选择激活函数是至关重要的一步,因为更新优化参数需要计算反向传播的误差信号,而这一过程会计算激活函数的梯度。在人工神经网络中最常用的三种激活函数分别是:
逻辑斯蒂函数Logistic Sigmoid
双曲正切函数Hyperbolic Tangent
线性函数Linear

3.1 Logistic Sigmoid
Logistic Sigmoid函数常用于二分类问题(输出值域是[0,1]),公式为:
glogistic(z)=1/(1+e^−z)

Logistic函数比拟的是生物学神经元被输入“激活”的概率,也可以通过统计学上逻辑回归(Logistic Regression)的最大似然解推导得出。计算Logistic函数的导数利用了商数规则(quotient rule),并且有一个小技巧,就是在分子上同时+1/-1。

g′logistic(z)其实就是原函数glogistic(z)乘以(1−glogistic(z)),这是一个简洁高效的梯度计算形式:无需再求一遍带有指数的激活函数。

3.2 Hyperbolic Tangent
尽管Logistic Sigmoid函数有着巧妙的生物学解释,但却经常在训练神经网络的过程中遇阻。当输入值是绝对值很大的负数时,Logistic Sigmoid的输出值几乎为0,而此时其导数也接近于0。在误差的反向传播过程中,激活函数的输出值与导数都是梯度的因子,所以经过多层递推,梯度就会逐渐衰减,使得前面几层网络得不到优化学习,这称为“梯度消失”问题。

Logistic Sigmoid的一个替补选择是Hyperbolic Tangent,双曲正切函数,公式为:
gtanh(z)=sinh(z)/cosh(z)=(e^z−e^−z)/(e^z+e^−z)

与Logistic相似,双曲正切也是“S型”曲线,但是值域为(-1, 1),这样绝对值很大的负值输入,映射到的也是负值输出,并且只有接近0的输入映射的才是接近0的输出,这在一定程度上降低了训练中的阻滞风险。Tanh函数的求导过程也用到了商数法则:
g′tanh(z)=∂/∂z sinh(z)/cosh(z)=(∂/∂zsinh(z)×cosh(z)−∂/∂zcosh(z)×sinh(z))/cosh^2(z) =(cosh2(z)−sinh2(z))/ cosh2(z)=1−sinh2(z)/cosh2(z)=1−tanh2(z)

3.3 修正线性单元(ReLU)
最简单的线性函数就是glinear(z)=z,作用就是把输入映射为自己(identity function)。如果只用线性激活函数的话,那么多层神经网络和单层的效果其实没有本质区别。当然线性函数也有其独特的作用,比如一个神经网络的隐藏层使用非线性激活函数,输出层使用线性激活函数,这就可以执行一个非线性回归(non-linear regression)。特别是网络可以通过非线性单元的线性组合,来预测连续目标值。

神经科学家在生物学研究中提出了更为精确的神经元激活模型,相比于S系的激活函数,这个激活模型有三大特点:1)单侧抑制 2)宽兴奋边界 3)稀疏激活性

修正线性单元(Rectified Linear Unit, ReLU)的数学形式特别简单:当输入为负时,输出就是0;对于正值输出则原封不动,所以公式就是gReLU(z)=max(0,z)

Softplus函数可以看作是平滑版的ReLU,其实它就是Logistic Sigmoid的原函数:gsoftplus=log(1+ez)。Softplus也符合单侧抑制和宽兴奋边界的特点,但是不具备稀疏激活性,因此ReLU脱颖而出。

4.反向传播
人工神经网络的主要工作机理是前馈传播的:输入值经过一些列非线性变换映射到输出值。但是学习/优化过程却是与之相反的反馈过程,即反向传播算法(Back-Propagation Algorithm),基本流程如下:假设神经网络的三个层依次为i,j,k, 第一层的输出,也即隐藏层接收的输入,zj=∑iaiwij+bj。 经过隐藏层的激活函数gj处理之后, 前往下一层的输出值aj 再与下一层的权重wjk 相乘并加入偏置bk, 最终整个网络的输出值为ak。 这个输出将与期望目标值tk相比较,得出一个误差。

注意,以上标志都是矩阵形式,例如aj代表了j层的所有输出构成的向量,而不不是属于某个神经元。
训练神经网络的核心任务,就是找到参数集θ=W,b,以使网络误差最低。一种常用的误差函数是输出值与目标值差的平方和:
E=1/2∑(ak−tk)2 (其实这个1/2只是为了后面的计算方便,并没有实际含义。)

寻找这个参数的方法是梯度下降——计算误差相对所有参数的梯度——∂E/∂θ。

5.梯度下降
优化在机器学习/深度学习中也同样处于关键地位,不管是线性回归、K近邻还是神经网络,都依赖于优化。其中最常用也是最基础的一类方法,就是梯度下降。梯度下降就像滑雪,海拔高度就是误差(损失函数),经纬度就是网络参数,而我们的目标是最快到达谷底。

常用的梯度下降算法:
5.1 全批梯度下降(Batch Gradient Descent)
全批梯度下降是最简单直接的一种,那就是计算损失函数J(θ)J(θ)对于全体训练数据集参数θθ的梯度,在进行更新迭代:

θ=θ−η∇θJ(θ)
注:梯度 ∇f (x1, …, xn) 偏导数组成的向量 (df / dx1, …, df / dxn).若 f (x,y,z) = 3xy + z² 则 ∇f = (3y, 3x, 2z)

因为计算一次梯度要用到整个数据集,所以会比较慢,而且对内存的要求偏高。另外,批梯度下降算法不支持“在线学习”,也就是随时加入新样本。

5.2 随机梯度下降(Stochastic Gradient Descent, SGD)
与批梯度下降不同的是,随机梯度下降每次只计算随机选取的一个样本x(i)x(i)和y(i)y(i):
θ=θ−η∇θJ(θ,x(i),y(i))
SGD减少了批梯度下降算法的冗余计算量,加快了收敛速度,同时也支持了在线学习。当然因为样本量减小,其收敛曲线时常会出现波动,意味着可能会“错过”最佳的参数状态。但这种波动并非坏事,也让算法有机会跳出局部最小值找到更好的解。每当随机选取的样本覆盖了整个训练集,这一轮就称为一个epoch。

5.3 小批梯度下降(Mini-Batch Gradient Descent)
小批梯度下降算法结合了全批与随机两种算法,每次在nn个训练样本的小批次上进行更新:
θ=θ−η∇θJ(θ,x^(i+n),y^(i+n))
这样既提高了收敛速度,又稳定了参数更新的过程。常用的mini-batch规模在50至256之间,具体数值因工程案例而异。Mini-Batch梯度下降算法是目前最常用的神经网络优化算法,当我们说起SGD的时候,一般就指的是采用了Mini-Batch的Stochastic Gradient Descent。

但即便是Mini-Batch算法,仍然存在很多问题,比如上面公式中都出现的学习率ηη,这个参数其实很难确定,如果太小则收敛缓慢,但要是太大则很难收敛甚至会发散。在实践当中往往会设计一套调整学习率的机制,开始设置较大,后来逐渐减小。不过这些调整方法只对一批数据有效,不具有普适性。另一方面,由于特征具有稀疏性,同一个学习率不一定适合所有特征。

除此之外,梯度下降还面临“局部最小值”、“鞍点”等阻碍。“鞍点”就是近乎水平(梯度为0)的参数平面,这时优化器可能会被卡住,而找不到继续优化的方向。为了解决这些问题,研究者提出了更高级的算法。不同算法在鞍点的表现如下图所示,接下来我们将介绍一些改进型的梯度下降优化算法。

5.4 动量(Momentum)
SGD在遇到“峡谷”地形时,经常会陷入锯齿状的波动。所谓“峡谷”地形如下图,横向的坡度虽然不如纵向的陡峭,但其实优化路线应该是横向的。但梯度方向偏纵向,所以就会在里面来回拉锯,减慢了收敛速度。

动量(Momentum)这个词就像“神经网络”,也是借用其他学科的术语打比方,在梯度下降中加入“动量”的目的就是加速收敛、减少震荡(如上图右)。具体的实现方式是,给每次的更新增量η∇θJ(θ)η∇θJ(θ)按照一定比例加入上一次的增量。
vt=γvt−1+η∇θJ(θ)
θ=θ−vt

形象的来说,Momentum就是让我们的动点具有了惯性,所以在梯度方向不变的维度上,收敛速度会持续增加;而梯度方向变化的维度上则会抵消。

5.5 Nestrov加速梯度
Nestrov就是在已有Momentum的基础上,往前多算一步。既然我们已经知道,当前位置的梯度不再是我们下一步将要移动的方向,那干脆在求这个梯度的时候,就提前把Momentum的影响加入进去,实际上就形成了一个“预测-修正”的步骤:
vt=γvt−1+η∇θJ(θ−γvt−1)
θ=θ−vt

5.6 Adagrad
Adagrad的核心特点是,根据特征调整学习率:对于高频特征,使用较低的学习率,确保收敛;对于出现频率较低的特征,就大踏步地前进。因此Adagrad特别适合与特征稀疏的案例,也增强了SGD的鲁棒性,Google的Dean等人就用这种方法来训练大规模神经网络,识别Youtube视频里的猫。

之前的方法里,对每个θiθi所使用的学习率etaeta是相等的,而Adagrad对第tt个时间步的每个参数θiθi,首先进行预更新,然后向量化。为了表达简单起见,我们将目标函数的梯度写作:
gt,i=∇θJ(θi)

下一个时间步的参数更新为:
θ(t+1,i)=θ(t,i)−η*g(t,i)/√(G(t,ii)+ϵ)

其中, Gt是一个对角矩阵,对角元素为t时间步中,相对 θ的梯度平方和。ϵ是个平滑项,为了防止分母为零,一般设为1e^−8。新的“学习率”————η/√(G(t,ii)+ϵ)对于梯度越大的参数θi就越小,反之亦然。

当然这个算法仍然不完美,因为分母始终为正数,随着迭代的进行,学习率总是衰减的,最终优化速度会越来越慢。

5.7 Adadelta
Adadelta是Adagrad的升级版,主要就是为了解决学习率单调衰减的局限。Adagrad的学习率分母存在梯度累计相加,而Adadelta对过往梯度的累加设置了固定尺寸ww的“窗口”,这样就不会追溯整个迭代历史,而是只往前倒推一定步数。

RMS[Δθ]t是未知的,需要通过上一时间步的参数更新的RMS来估计,再用RMS[Δθ](t−1)替代原来的学习率ηη,最终的Adadelta公式变为:
Δθt=−[RMS[Δθ](t−1)*gt/RMS[g]t]
θt+1=θt+Δθt

这样直接就连全局的学习率这个参数都不需要了。

5.8 Adam优化器
'Adam'的Ada表示它与'Adagrad', 'Adadelta'一样,根据参数进行学习率自适应。而m则代表了其含有momentum的一面:
mt=β1mt−1+(1−β1)gt
vt=β2vt−1+(1−β2)g2t

mtmt和vtvt分别估计梯度的平均值(一阶)和方差(二阶),由于初始化方法是设为全0向量,在初始的时间步时很难打开局面,尤其是衰减系数较低的时候(β1和β2接近1)。

所以实际的公式应用做了如下的修正:
mt^=mt1−βt1
vt^=vt1−βt2
θt+1=θt−η*mt^/√(vt^+ϵ)

Adam算法的作者设置的默认值为β1=0.9,β2=0.999,ϵ=1e^−8

6.损失函数
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

在之前的实践环节中,除了设置优化器为"adam"之外,我们还定义了损失函数loss='binary_crossentropy'。

损失函数(loss function)又叫代价函数(cost function),表征神经网络的预测结果与真实结果之间的差异,也是优化过程想要降低的目标。

一种常用的损失函数叫作“交叉熵”(cross-entropy),当执行二分类任务时,则用bianry_crossentropy。本节我们将首先从交叉熵谈起,再介绍其他的损失函数。


我们做机器学习的目的是希望使预测值和真实值更加接近,那么如何来定义这个“接近”呢?这就是损失函数要解决的问题,而其中的核心思想叫作“熵”(entropy)。你可能已经在物理学听说了这个概念,它表示系统的混乱程度。就像“神经元”、“动量”一样,计算机领域的熵也是借鉴了其他学科的名词,那就是“信息熵”(info entropy)。

信息的熵越高,包含的内容就越多,那么描述这条信息所需的字节数(bit)也就越多。这里的“描述”本质上就是消除不确定性(信息冗余),越是板上钉钉的事情,信息熵就越低。

如果要直观地理解,那么“信息熵”可以认为就是我们常说的“信息量”。定性地分析,要描述一件发生概率为pi的事,所需要的字节数是log1pi。信息熵的数学定义,也就是描述整个系统所需的最少字节数:
H(p)=∑p(i)log(1/pi)=−∑p(i)log(pi)
注:这里的'log'都是以2为底的对数,代表bit数;如果改成以10为底的对数,就表示还需要多少位10进制数的信息。

交叉熵
在熵的定义中,我们所设想的情况都是数学上的理想情况,也就是用了最少的字节传递尽可能多的信息。而实际情况并不总是那么理想,比如当我们误判了某种可能性的概率,势必就会产生信息的冗余——用了更多的字节数——这个实际占用的字节数,就是交叉熵。

假设真实概率为pi,而我们做出的预测为qi,那么这两种分布所产生的交叉熵就是:
H(p)=∑p(i)log(1/qi)=−∑p(i)log(qi)

KL散度(相对熵)
KL散度(Kullback–Leibler divergence)又称“相对熵”(relative entropy),衡量的是两个概率分布的差异。在机器学习当中,我们想要衡量的就是模型所预测的概率分布,与真实的概率分布直插。

KL(p||q)=∑p(i)log(1/qi)-∑p(i)log(1/pi)=∑p(i)log(pi/qi)
交叉熵始终大于信息熵,只有在qi=piqi=pi的时候,KL(p||q)KL(p||q)才取得最小值0。因此KL散度很适合用作损失函数,这正是梯度下降算法想要优化的目标。

7.卷积神经网络(Convolutional Neural Network)
https://jizhi.im/blog/post/intuitive_explanation_cnn

7.1 卷积层(Convolution layer)
卷积神经网络的“卷积”和《复变函数与积分变换》里的“卷积”含义稍有差别,这里的卷积操作实际上是一种滤波。
卷积核与输入图像的重叠处对应值相乘再相加,会得到一个特征,这个特征的具体含义取决于卷积核的设计。有的卷积核用于提取物体边缘,有的提取面部器官等等。这一过程称为特征映射。

filters: 指的是输出的卷积层的层数。如上面的动图,只输出了一个卷积层,filters = 1,而实际运用过程中,一次会输出很多卷积层。

kernel_size: 指的是卷积层的大小,是一个 二维数组,分别代表卷积层有几行、几列。
strides: 指的是卷积核在输入层扫描时,在 x,y 两个方向,每间隔多长扫执行一次扫描。
padding: 这里指的是是否扫描边缘。如果是 valid,则仅仅扫描已知的矩阵,即忽略边缘。而如果是 same,则将根据情况在边缘补上0,并且扫描边缘,使得输出的大小等于 input_size / strides。

7.2 池化层(Pooling layer)
池化层的作用是精简压缩信息,最常用的是MaxPooling(最大池化),原理很简单,就是在给定区域像素里“掐尖”——只留下值最大的像素,其余抛掉

前几年很流行的“低多边形”(Low Poly)设计风格,其实就是一种“池化”操作,这里用到的是AveragePooling(平均池化),留下的是平均值。

7.3 Dropout
Dropout是减少过拟合的一种策略。为了防止某些个别特征的权重过大,训练过程中每次更新参数会随机地隐藏掉一部分神经元(及相连的突触)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息