神经网络的数学基础
一、初识神经网络
- 机器学习中,分类问题的类别叫做类,数据点叫作样本。样本对应的类叫做标签。
- 深度学习的通过表示层来学习数据中的新表示,而表示层通过神经网络来实现。神经网络的核心组件就是层,它是一种数据处理模块,类似于数据的过滤器,没经过一个层,数据就会被蒸馏一次,也就是从数据中学到了新的表示(我们期望这种表示,有助于我们解决问题),多层进行堆叠就可以不断的对数据进行过滤。
- 损失函数:网络衡量在训练数据上的性能,让网络可以朝着正确的方向进行,在训练中需要最小化的量。
优化器:通过损失函数衡量的网络输出值和目标值的差距来更新网络,即使用损失梯度更新参数的具体方式,如RMSProp优化器、带动量的随机梯度下降(SGD)。
在训练和测试过程中需要监测的指标(metric):准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1、Roc曲线、AUC等等。
过拟合:模型在测试集上的精度比训练集低。
二、神经网络的数据表示
张量是一个数据容器,几乎所有的数据都是数值型数据,我们平时处理的numpy数组,也叫张量,如矩阵,就是2D张量。张量是矩阵向任意维度的推广(张量的维度叫轴)。
标量:
向量(1D张量):
有5个元素,也叫5D向量。5D向量与5D张量是不同的,5D向量表示沿着某个轴有5个元素,但是5D张量表示有5个轴,每个轴有多少个元素是未说明的。维度既可以表示某个轴上元素的个数,也可以表示张量中轴的个数。
矩阵(2D张量)
1D张量组成的数组叫做矩阵,即2D张量。矩阵有两个轴(行和列)。
第一个轴是样本轴,第二个轴是特征轴,形状:(samples,features)。比如:
工业生产中有24台设备,每台设备都有振动、温度、电流3个属性,那么这个数据可以存储在形状为(24,3)的2D张量中。
3D张量与更高维张量
多个3D张量组成一个新的数组是4D张量。一般处理的都是0-4D张量,有时也会遇到5D张量,比如视频。
时间序列数据与序列数据都是3D张量,形状是(samples,timesteps,features)。
时间序列数据中,每个样本都是2D张量。时间序列数据通常第二个轴是时间步长即时间轴。
4D向量:
图像数据通常有3个维度:高度、宽度和颜色深度。图像数据形状为(samples,height,width,channels)或者(samples,channels,height,width)。在tensorflow中是第一种形式,在theano中是第二种形式。keras支持两种。
比如图像大小是256×256的彩色图像,那么这样的128张图像可以保存在(128,256,256,3)的4D张量中。
5D张量:
视频数据一般是5D张量,形状是(samples,frames,height,width,color_depth)。视频中是由一系列帧(frames)组成,每一帧都是3D张量,一系列帧组成了4D张量(frames,height,width,color_width)。
4个视频片段,每个视频片段有200帧,视频尺寸是144×256,那么数据可以保存在形状为(4,200,144,256,3)的5D张量里。共有88473600个值,如果类型是float32,每个值32位,那这个视频就太大了,需要压缩。
张量属性:
轴的个数、张量的形状,比如矩阵的形状为(n,m),3D张量的形状(n,m,z)。
以及数据类型(float32、nint8、float64)。
数据批量及张量切片:
深度学习中所有数据张量的第一个轴都是样本轴(样本维度)。比如批量大小为128。
所以第一个轴(0轴)也叫作批量轴或批量维度。
选择张量中的特定元素叫作张量切片,每个张量轴都可以给出起始索引和结束索引来指定张量中的特定元素。在3D张量即图像,选取所有图像右下角像素区域。
三、神经网络的齿轮:张量运算
但是当张量的形状不一致的时候,需要进行广播,较小的张量会被广播。
(1)向较小的张量添加轴,使其轴与较大的张量相同。
(2)向较小的张量沿着新轴重复,使其形状与较大的张量相同。
如(25,30)与(30,)相加,那么先给(30,)添加第一个轴(1,30),然后沿着新轴复制25次为(25,30)进行相加。这是算法上的,实际实现并没有真正的复制。
张量点积
类似矩阵的乘法,2D张量(24,25)点乘(25,10)->(24,10)。张量可以更高维进行点积,要遵循与2D张量原则:
- 张量变形:转置、改变行列等等。
- 张量的几何解释
加法:[0.5, 1] +[1, 0.25] = [1.5, 1.25]
通常来说,仿射变换、旋转、缩放等基本的几何操作都可以表示为张量运算。
这是两张纸揉成的小球,现在相当于我们的输入,我们要把小球恢复平整,实现两张纸的分类,我们每次用手指对纸球做的变换,相当于我们深度学习中对输入数据进行的一系列变换,为复杂的、高度折叠的数据流形找到简洁的表示,从而最终将小球展开,实现分类问题。
四、神经网络的引擎:基于梯度的优化
(3)计算网络在这批数据上的损失,用于衡量y_pred与y之间的距离。
(4)更新网络的所有权重,使网络在这批数据上的损失略微下降。
最终网络在训练数据上的损失非常小,y_pred和预期目标y之间的距离非常小。
2. 在更新权重时,一种比较好的方法是计算损失相对于网络系数的梯度,然后向梯度的反方向改变系数,降低损失。由于网络中的参数非常多,不可能用解方程的方式找到比较的w权重,可以基于当前在随机数据批量上的损失,一点一点地对参数进行调节。由于处理的是一个可微函数,可以计算出它的梯度,从而有效地沿着梯度的反方向更新权重,损失每次都会变小。
(3)计算网络在这批数据上的损失,用于衡量y_pred和y之间的距离。
(5)将参数沿着梯度的反方向移动一点,如w -= step * gradient,从而使这批数据上的损失减小一点。
step为移动的距离大小,也叫作学习率,这种方法叫做小批量随机梯度下降(小批量SGD)。随机指的是每批数据都是随机抽取的。
step的选取是非常重要的,取值太小,迭代的次数会增加,可能会陷入局部极小点。取值太大,那么更新权重后坑你会出现在去向上完全随机的位置。
真SGD:每次迭代时只抽取一个样本和目标,而不是抽取一批数据。
批量SGD:每一次迭代都在所欲数据上运行,更新虽然更准确,但计算代价太大。
SGD的变体如带动量的SGD、Adagrad、RMSProp等,被称为优化方法或优化器。其中动量解决了SGD的两个问题:收敛速度和局部极小点。
动量式方法在更新参数w不仅要考虑当前的梯度值,还要考虑上一次的参数更新。
在许多的网络中都可以看到这个参数。
我们假设函数是可微的,实际中神经网络函数包含许多连接在一起的张量运算,每个运算都有明确的、已知的导数。运用微积分链式法则应用于神经网络梯度值的计算,将会方便,这样的算法叫做反向传播。
遇到的问题:
指标可以评估机器学习算法模型好坏,一般分类问题选择准确率(accuracy)或者AUC,回归问题用MSE。一般的评价指标:
MAE、MSE、RMSE、MAPE、SMAPE、R Squared等等。
Accuracy、Precision(精确率)、Recall(召回率)、P-R曲线、Fβ(加权调和平均)与F1(调和平均)、ROC-AUC
2. 为什么分类时对标签进行分类编码?
参考资料:
- 常用损失函数和评价指标总结:https://blog.csdn.net/linxid/article/details/100515713
- 《Python深度学习》