首先梯度是一个向量,包含了函数在每个方向上的偏导数,用于表示函数在多个维度上的变化率和方向.
下图为一个曲面在直角坐标系中,各个整数坐标的梯度方向。假设最底端是我们想去的地方,那么需要在各个坐标的位置上不断的向梯度的反方向移动一小段距离△即可,注意每次移动都需要调整方向。这样即可把目标“如何达到最底端”拆解成为一个可执行的数学公式。
其次我们将问题简化成为2维平面直角坐标系,提出一个泛化的问题:如何模拟一个函数,它有有限的输入样本和结果?这个问题目前来看是正向不可解的,就连高中数学的不定方程组还必须增加几个特定的条件:线性连续性,次方的数(一次,二次),问题的空间局限性(明确是直线在有限的角度中切割圆形/椭圆形/三角形/正弦余弦函数等),结果是一个解空间。当问题脱离这些局限性后,就变成无固定数学公式可以套用的问题,而这类问题往往就是现实中最常见预测类问题。可以通过微分逼近的方式,在有限的样本中不断纠正模型的正确性,模拟出来问题的解空间,从而实现预测性。
假设一个问题:红色的点为房屋售价和面积的分布,如何拟合这个解空间?
直线拟合样本分布
曲线拟合样本分布
假设样本空间定义为
假设解空间为线性函数(简化为只有一个变量x)
如何求解上述房价的拟合函数F(x,y)?
这里因为预先假设了问题解空间为线性空间,所以采用均方差损失函数
通过样本迭代计算出minLoss的过程.
上述损失函数的几何特性以为极限在下,向上开口的曲线,只需要计算曲线底部的Loss函数对应的f(x)表达式就可以得到目前为止最优的Loss函数。
整个过程需要选择一个初始位置,不断的通过微分迭代调整下降的方向,直到达到这个“最底部”。整个过程类最直接的方式是沿着梯度反方向逐步向下尝试,类似于下山,俗称梯度下降法。
计算过程如下:
展开Loss针对三个模型变量a0,a1的偏导数:
引入迭代次数k,每一次迭代a0,a1都会向着梯度的反方向前进一小步α
扩展为多变量时
则迭代函数为
局部最优问题
[简易说明]针对信号的一个叠加计算,使得输出的结果更加平整和容易理解,最早是用来对雷达波进行噪声过滤。在图形图像处理中,使用离散卷积计算叠加使得生成一个新的图片。离散卷积的计算公式如下:
卷积计算的原理
神经元定义
神经网络定义
基本的神经元网络形式,由有限个神经元构成,所有神经元的输入向量都是同一个向量。由于每一个神经元都会产生一个标量结果,所以单层神经元的输出是一个向量,向量的维数等于神经元的数目。
[我的归纳观点]神经网络模型认为人工提取特征的步骤是多余的,因为非常依赖算法工程师对于样本分布特性、领域建模和解空间的理解经验。人工筛选制造特征的过程会丢失大量的信号,因为每一个像素点都有可能对结果产生影响,谁也不能保证常见的haar特征枚举了全部的人脸特点,谁也不能保证尺度变化有没有丢失关键信号。唯有让所有像素点都参与决策计算,然后让模型计算出每个像素点对应的系数(可能大部分为0)。但是剩下的显著信号,就是这组样本空间中最显著的特征,这种方式比人工定义的Haar特征更靠谱。因此诞生了BP神经网络的模型算法,因为其全连接的特性很像人类大脑神经元树突全连接的特性,因此命名为神经网络模型。在14年之前其他模型的学者所鄙视,认为其推理过程严重缺乏可解释性和数学的理性,全部依赖概率论,产出结果收敛性也不稳定,所以也被称为一把梭炼丹器,练出来的是神丹还是废丹完全看随机的效果。当年由于算力的不足,备受各种鄙夷的指责。我曾经不止一次听到各个导师臭骂研究神经网络的学生。
[我的归纳观点]理论上神经网络模型层次越深效果越好,但是由于微分逼近的特性很有可能造成梯度消失(参考所有不可导的方式)从而让一个关键的神经元在前几层就失去了参数效果;也有一些不重要的神经元由于梯度的叠加,被放大的无数倍,最终成为了噪声点。一切的一切,都在Microsoft的ResNet残差神经网络模型提出后得到了有效的解决:引入了残差块(residualblock)的概念,可以绕过某一层计算,直接输入到下一层,避免了过多计算弱化或者过多叠加废信号。由模型在反向传播计算中选择是否绕过,有效的抑制了微分梯度下降法本身的梯度计算缺陷问题。
[池化层]降维:1024*1024*RGB3通道的图形被压缩成为200像素的图像依然不影响视觉效果,狗还是狗、猫还是猫。
针对信号进行放大和过滤计算,如果一个卷积层的output是负值,那么它一定会影响模型的稳定性;如果它数量级过大,同样对下一层的系数影响巨大。所以每层计算后都需要使用激活函数判断output是否、如何进入下一层的计算。
ReLU家族激活函数:减少负数的影响
Sigmoid系列:平滑、易于求导
训练过程中随机丢掉一定量的神经元,防止出现过拟合
我们已经了解了CNN网络的基本概念,接下来需要继续了解正向传导和反向传播概念
假设单变量网络输入为x,Y1,Y2为中间层,输出层为Y3,E为均方差损失函数,t为标签。中间存在Y1,Y2中间过程均为标准神经元函数,并且已知整体的信号传导公式如下图所示,
已知数学要素如下:
E真多推导过程中所有参数的梯度矩阵为:
只看偏执值[b3,b2,b1]的偏导数[d3,d2,d1]可以发现损失函数是一层层往前传递并逐层放大,数学上看是这样的
因此从网络传导图上就相当于每一层把损失函数乘以对应的系数,如下图所示
由于偏导数[d3,d2,d1]与原始输入X无关,它们也被称之为局部梯度,表达目标函数对于本层的输入信号的偏导数
当局部梯度计算完毕后,很容易根据输入X计算推理出[w3,w2,w1]的偏导数,称之为参数梯度
根据2.2.3进行梯度下降推理,E为均方差损失函数,α为步长,k为迭代次数
至此,我们已经完整的推理了一个单X输入的3层神经网络的整体模型求解过程。
如果把输入X扩展成4*4的矩阵后,第一层X->Y1的计算表达式为:
向量w1一共是445=80个需要进行梯度下降的参数。其他层的参数就不展开了.
根据3.1章节可知离散卷积的数学表达式为
具体把P展开成像素矩阵,Conv展开成卷积核矩阵后,数学表达式进一步为
计算过程是一个滑动窗口,其中第一个33的像素xij与卷积核向量K点积计算,然后加上偏执值向量B
从线性代数的计算过程来看,其是不是与4.2.5的[Y1]神经元向量表达式类似。
虽然卷积计算和神经网络全连接计算目标不一样,但是从梯度下降和反向传播的数学推理公式来看是一模一样的。所以抽象的表达式f(x)=wx+b可以完全cover如下4个计算过程:
其实还有其他的业务含义,例如Yolo3针对连续视频中的多目标分类结果,都可以融入梯度下降法解决抽象的表达式f(x)=wx+b线性代数和离散微分计算框架中。
由于VGG16模型中只有13个卷积层和3个全连接层能产生权重参数,故VGG16的16来自于13+3。
下图为VGGNet模型有A-E五种结构网络
感受野:ReceptiveField,也就是KernelSize,表达了卷积窗口针对输入矩阵的感知区域大小。
Padding:
所以最终输出22422464个神经元,需要进行梯度下降求解的参数数量为86704128个w+3211264个b1
PIP安装:tensorflow,PIL,matplotlib
python3/Users/caisheng/code/tensorflow/tensorflow/examples/image_retraining/retrain.py--bottleneck_dirbottleneck--how_many_training_steps200--model_dir/Users/caisheng/code/pythonLearn/models/inception_model--output_graphoutput/graph.pb--output_labelsoutput/labels.txt--image_dirimages/pause