神经网络(Neural Network)
1.1图片
每一个图片都是三维数组,每个像素的值为0-255,如
训练集Training Dataset:“上课学的知识”,用于训练模型得到参数
验证集Validation Dataset:“课后习题”,用于纠正和强化知识点,用来评估不同超参数训练出的模型效果,从而优化模型
测试机 Test Dataset:“期末考试”,用于评估最终模型效果
例如:已知T1(x1,y1)、T2(x2,y2)、T3(x3,y3)三个点,利用T1,T2得出y=ax+b直线,这个T1,T2就是训练集,他们参与了模型的训练得到了参数a,b。将x=x3代入得到y3’ ,比较输出y3’ 与标签值y3,就能衡量模型的好坏,T3参与了模型评估,T3是测试集。a,b就是训练的目标,但是,在训练模型前,要设定其他参数,如选用哪个函数空间?用什么损失函数来衡量输出与标签之间的差异?要采用哪种优化算法?等等这些问题设计的参数都是需要提取设计的超参数。可以利用验证集去寻找最优模型。
训练集训练模型得到参数后,验证集在这个参数和超参数下训练得到的模型进行评估,并找到最优的一组超参数,然后将超参数固定,再拿到训练集上重新训练模型,最后由测试集评估最终模型性能
1.2线性函数(得分函数)
如,这个猫是32*32*3的像素构成,其中某些点是促进成猫的,有些像素点是抑制成为猫的,函数f(x,W)中,x表示像素点,W表示像素点的权重(得分,即促猫的程度)。
f(x,W)=Wx+b,例如这个图片32*32*3=3072,视为3072*1的矩阵,对于猫的权重矩阵W1=1*3072,对于其他的类型,有它的Wn(n为自己想要的分类数,也可以5分类,8分类等),假设这里为10(W2可以为狗,W3可以为汽车....等等)这个n取决于自己想要的分类,则总共的W为10*3072的矩阵,再乘以图片矩阵3072*1,得到10*1的得分矩阵(第一项为W1猫的得分,第二项为W2狗的得分......),Wx起到的是决定性作用,后面的b为偏置参数,起到微调的作用(这个例子b为10*1的矩阵)
综上,对于特定的图片,它的x是不会变化的,而W权重矩阵是需要给出的,整个机器学习、深度学习就是在寻找更好的W,来输出更准确的结果。神经网络就是一直在优化W。每个特征点是独立的,则每个特征点对应的权重参数Wi的每个值也是独立的。
1.3损失函数
得分矩阵的数值如何来说明问题?可以用损失函数来描述。神经网络可以做分类可以做回归,区别在于他们的损失函数不同,而网络结构是不改变的。
如上图,第一列中,图片明明是猫,却是汽车的得分最高,定义了如上的损失函数,sj 为错误值,syi 为正确值,经过损失函数的计算,可得出一个数据,能够表示预测的正确性(表示是否区分开)。例如第一列猫图片的计算(右上角)。损失函数后面的+1表示的是容忍程度(一般为∆ ,用∆ 表示容忍程度),如第一列,cat为3.2,car为3.15,没有+∆ 计算后值为0,即没有损失了,效果会不好,若有+1 ,计算后为1.05,表明识别情况。损失函数越小越好。
右上角第一个计算后值为2.9就为loss值;第二个计算后为0(car比其他值都大1),表明做的很好,loss值为0;第三个计算后值为10.9,表明做的很差
1.3.1注意问题
损失函数值相同,两个模型效果一样吗?
如上图,w1和w2与x计算后值都为1,但是w1过于关注x的第一参数,会导致过拟合的现象,这是不想要的。所以要加上正则化惩罚项。
如上 称为data_loss,即为数据在当前损失函数的损失,正则化惩罚项为模型的权重参数带来的损失,直接用平方来表示,λ 表示惩罚系数,它越大,表示你不希望过拟合(正则化惩罚项和数据损失是矛盾的,数据损失是要预测值与真实值越来越接近,就要满足每一个样本需求,正则化惩罚项要求不要满足每一个,所以引入λ )。
我们希望模型不要太复杂,因为神经网络太强大了,过拟合风险很高。过拟合指的是模型只关注于局部特征,没有放眼所有的位置。相应的就是泛化能力。
1.4 Softmax分类器
现在学的得到的是得分值和损失函数值,我们想要的是概率值
如上图,得分矩阵中某些值差距很小,先进行一次指数运算放大差距(负数会变为正数且值很小),然后进行归一化转为概率(0.13=24.5/24.5+164.0+0.18 ),再进行对数函数计算损失值。具体公式如下:
对数运算,-log(0.13)会得出一个较大的值,而越接近1,loss的值越小,越接近0,这就是对数函数的特点。
1.5前向传播、反向传播
1.5.1前向传播
经过以上过程,由一个w和x最终得到loss,就为前向传播。神经网络的目的是更新权重矩阵w,比如现在的loss很高,现在要更新w将loss降低,这个过程就是反向传播(梯度下降)
1.5.2梯度下降算法(更新W)
利用公式进行参数更新(J(w)是损失函数),寻求最小的loss,a为人为设定的值(超参数),称为学习率,a一般取0.05或0.001,这是一个经验值,有些论文使其变化,刚开始较大,后面越来越小,使之取向最小loss。
同理,b的更新方式是
1.6神经网络
①input layer输入层,表示输入的 特征个数(小猫图片就有32*32*3=3072个圈)
②hidden layer1隐层1,它与输入层每一个圈全部连接,称为全连接,将输入层转化为更多的特征,由输入层转化为隐层1,经过了矩阵乘法(输入层为1*3,隐层1是1*4,则W1矩阵是3*4的矩阵),即就是输入层经过了权重矩阵W1进行了特征提取
③hidden layer2隐层2,与隐层1也是全连接,经过 了W2矩阵(这里是4*4的矩阵)的特征提取。一般情况隐层有很多层。这些隐层的目的就是为了让计算机更好的识别
④output layer输出层,隐层2乘以W3(这里是4*1的矩阵),得出预测结果。最终结果取决于W1,W2,W3好不好,因为输入X是固定的
⑤每次前一项与W相乘后,要进行一次非线性变换(X与W1组合后,进行非线性变换,再与W2进行组合)。这就是为什么不直接用一个W=W1*W2*W3直接变换。非线性函数有很多,只要不是线性的就行。如下:非线性函数是max(0,Wx)
注意,神经元并不是越多越好,比如这里,隐层1为4个特征,也可以为5,越大更容易拟合,但是速度会相应的下降
正则化的影响:越小越过拟合
神经元数量的影响,隐层数量:一般为64,128,256,512等,越大越过拟合
1.7激活函数
激活函数是神经网络中比较重要的部分,常用的有Sigmoid,Relu,Tanh等。最开始一般为Sigmoid函数,但是它靠两边的部分梯度接近0,这是个问题,称为梯度消失。
Relu函数经常使用,其他情况也是Relu函数的变体。激活函数就是使用在每次乘法之后的非线性函数,用于非线性变换。
1.8数据预处理
对于输入数据,先进行数据中心化(实际坐标值-均值),再进行放缩或扩充(除以标准差)
1.9 参数初始化
比如权重矩阵是3*4的矩阵,每个都有(通过策略生成的)随机的值W=0.01*np.random.randn(D,H),这里D,H为3,4,乘以0.01是为了权重参数值不要浮动大。
1.10 DROP-OUT
由于神经网络过于强大,容易出现过拟合的情况,这也是近年来致力于解决的问题,前面提出了正则化的解决方法(R(w)),还有方法就是DROP-OUT。
上图左边是正常神经网络,每个都是全连接,drop-out就是在每一层随机杀死部分神经元,每次训练在每一层都是随机的杀死神经元(而不是说直接去除它们)。这只是在训练阶段进行,测试阶段直接使用,不要杀死。
1.11图像增强
如果数据集很少,就要考虑图像增强。目的是增加相似的数据集,并且防止过拟合,使网络更强壮,这些操作都是再Alexnet上提出的。
1.11.1水平翻转
1.11.2随机旋转
图片随机旋转(-45°,45°)的度数
1.11.3随机裁剪(比较好用)
如227*227的图片,裁剪成224*224,再每次一单位的滑动,最终得到9张类似的图片
1.11.3 PCA操作
更改亮度、对比度、饱和度、色相等等
1.11.4 转换为灰度
例如RGB转化为RRR,GGG,BBB等,或转化为灰度图。
注意:1.11.3和1.11.4的操作使用的很少。
总结
以上就是神经网络的基础知识,看懂后能迅速入门神经网络,是理解更复杂的网络如CNN(卷积神经网络)的前提,学会后建议直接学习CNN卷积神经网络。也可以看Alexnet,vgg,resnet等经典网络,这些也是基于卷积神经网络实现的。