深度学习笔记一
模型数据
训练集:用于拟合模型的样本
验证集:是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估
测试集:评估模型的泛化能力,不能用来调参等
线性回归
深度学习模型分为两种,线性回归和softmax回归,线性回归输出是连续值,softmax回归输出是离散值
适用范围
线性回归:预测房屋价格、气温等输出是连续值的模型
Softmax回归:图像分类、肿瘤性质判断
思维框架概述
- 构造函数模型
- 对模型进行训练
A、获取训练数据
B、训练数据输入函数模型
C、损失函数
D、优化函数
E、迭代 - 对模型进行预测和评价
举例
房屋价格预测,假设价格与面积和房屋年龄有关
价格=函数(面积,房龄)
函数模型
特征值:面积x1,房龄x2
预测值:价格y
假设其满足线性关系
其中w为两个特征值的权重,b为偏差
则我们预测第i个房屋价格表达式为
模型训练
训练数据
数据需要包含面积和房龄的特征值以及实际的价格,这么一个(x1,x2,y)的数据被称为一个房屋的样本
损失函数
也就是真实值与训练过程中得到的预测值之间的误差函数,我们的需求是调整函数模型中的w和b的值,然后令误差函数尽可能小,表达式为
在这里l为误差函数,预测值减去实际值的平方是为了得到一个正的误差数据,函数表达式中的1/2是为了使后面的梯度下降求导过程中与平方导数相抵消
以上函数只是一个样本的误差,而我们需要得到所有的样本数量n的误差,相加然后取平均值,这样就会得到样本整体的误差值,表达式为
优化函数
有了误差函数,而且我们的需求是调整w和b的值,最后达到令误差函数可能小的目的,那么我们怎么令误差函数尽可能小呢?这就涉及到了优化函数,也可以理解为调整权重w和偏差b的方法,房屋预测模型中采用的是小批量随机梯度下降法,表达式如下
这里B是每一次输入训练模型的样本数量,η是学习率,也就是控制梯度下降的快慢,一般取0.01,但是这不是固定的,需要人为不断尝试达到最佳效果,太大的话不会函数收敛,太小的话收敛的速度慢,调整学习率和迭代次数是我们常说的调参
迭代
就是一次又一次地把训练集输入训练模型最终使得w和b收敛
测试
得到训练模型中收敛的w和b以后,把新的x1和x2输入模型函数中,会得到其相对应的预测价格y,然后对比真实数据计算准确程度以评估模型质量
矢量计算
一句话,计算机运算中,向量计算两个向量直接做运算比从中一个一个元素调出来做预算速度要快,因此我们的上述所有表达式,涉及到w,x,b的,都可以把公式转成线性代数的矩阵运算
Softmax回归
特点
输出为离散值
适用范围
图像分类如判断是否为猫等输出为离散值的模型,比如判断是否为猫模型中,分成是与不是(1与0)两个预测值y,如果输入图片尺寸为28x28,则有28x28个特征值x,Softmax回归模型多用于分类
与线性回归异同点
同:都是输入特征与权重做线性叠加
异:线性回归用来预测连续值(房价),softmax回归用于预测离散值(分类)
举例
4个像素点区分3种猫的模型,4个像素点为特征值,3种猫,y=1,2,3,为预测类别值,oi为每一类的置信度,每一个oi函数对应一个偏差值bi,模型表达式如下
Softmax是全连接层,每种输出与每一个特征值都有关
判断类别
输出值oi当作是i类的置信度,并将值最大的输出所对应作为预测输出
Softmax回归的作用
将oi置信度转化成第i类的概率,及oi相加等于1
其中
矢量计算
与线性回归一致,运用线性代数方法
交叉熵损失函数
为何不选择均方差损失函数?
因为根据概率判别类别的原理,yi只要大于0.5则可以正确判断归属的类别,而不需要让yi无限趋近于1(均方差损失函数中会让预测值无限趋近于真实值),所以使用交叉熵损失函数,这更加适合衡量两个概率分布差异的测量函数,交叉熵表达式如下
可以看出,只有当yj为1的时候有具体值,因为正确分类中只有一个yj为1,其他为0,交叉熵损失函数定义如下
预测和评价
训练好模型后可以得到新输入的测试集隶属于每一类的概率,然后概率最大的作为其预测的类,可以用预测的类别矩阵与真实的类别矩阵是否相等来评价模型
多层感知机
也就是多层神经网络,也就是本层输出作为下一层的输入
**函数
**函数是层与层之间的非线性**单元
原理
为什么要引入**函数?引入非线性单元,否则多层和单层性能一样
常用**函数
Relu(可以解决梯度消失,多用于处理大规模样本)
Sigmoid(容易产生梯度消失,多用于小规模样本)
Tanh
模型选择、欠拟合和过拟合
现象
有时候改变模型结构和超参数(学习率和迭代次数),会出现模型在训练数据集上准确但测试数据不一定准确
原因
训练误差和泛化误差的不同
训练误差:模型在训练数据集中的误差
泛化误差:模型在测试数据集中的误差
一般情况下训练误差小于等于泛化误差,因此我们需要同时关注训练误差和泛化误差
模型选择
选择适当的隐藏层数,以及每一层神经元数,**函数等以更好地拟合模型
验证数据集
一般不用来训练模型,故在训练集中留一部分作为验证集,其余为训练集
问题
现实中训练数据少且不易获取,深度学习训练需要大量的样本
解决方法
K折交叉验证:将总训练数据分成不重合的K份,然后做K次模型训练和验证,也就是每一次取k个中的其中一个作为验证集,例如Ki,i=1,2,3…k,然后其余的作为训练集,最后根据k次训练和测试分别求出训练误差和泛化误差取平均。
欠拟合和过拟合
欠拟合:无法得到较低的训练误差
过拟合:训练误差远小于泛化误差
高阶模型与低阶模型
高阶模型对比低阶模型更容易拟合训练数据(阶数)
拟合质量与模型复杂度的关系
模型复杂度过低:欠拟合(因为模型特征不足,不能很好拟合训练数据)
模型复杂度过高:过拟合(因为模型特征过多,已经完美拟合训练数据)
欠拟合指模型无法得到较低的训练误差,过拟合指模型的训练误差远小于它在测试数据集上的误差
训练集大小与拟合质量的关系
训练集过少容易过拟合,因为模型容易复杂度过高
训练集过多容易欠拟合,因为模型容易复杂度不足
若数据存在过拟合
也就是参数数量太多,我们什么不设置合适的参数数量呢?如果我们知道多少是合适的,那么我们还要深度学习和机器学习做什么?
方法
权重衰减,也就是L2范数正则化,原理抑制多余的参数权重
权重衰减参考:https://blog.****.net/u010725283/article/details/79212762
丢弃法:人为拟定概率使得隐藏层某些神经元清零
数值稳定性和模型初始化
涉及问题
衰减和爆炸,也就是多层感知机里,如果层数太多,可能会导致w的无限趋近于0(衰减),和趋于无穷大,爆炸。
解决方法
随机初始化模型参数,不可以让w都等于一个数,因为指数计算容易出现绝对的衰减和爆炸的情况,如0.1的30次方和2的30次方就是两个极端