「学习内容总结自 udacity 和 coursera 的深度学习课程,截图来自 udacity 课件」
建立好一个模型之后我们要怎么评估它的好坏以及泛化的能力(由具体的,个别的扩大为一般的能力)呢?这时候就需要引进测试集的概念。
如上图,空心代表测试集数据,实心代表训练集数据。我们对两个模型分别进行了不同的拟合,那么两个模型哪个效果比较好呢?从拟合角度来看两者的拟合效果差不多。但是引入测试集后,从测试集角度观察结果(如下图),左边模型有一个错误,而右边模型有两个错误。所以通过测试,左边的模型比较好。
我们使用sklearn这个库,很容易实现:
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(x,
y,
test_size = 0.25)
#0.25表示从总数据中取25%作为测试集
还有一条非常重要的黄金法则我们不能违背:不能用测试集来训练
一般做预测分析时,会将数据分为两大部分。一部分是训练数据集,用于构建模型,一部分是测试数据集,用于检验模型的性能。但是,有时候在模型的构建过程中也需要检验模型,辅助优化模型,调整模型参数,这时候就会引入验证数据集,验证集有时候也称为开发集(Dev set)。有一点要注意的是,要确保验证集和测试集来自同一分布。
在数据集较小的时候,训练集,验证集和测试集的大概比例划分为:60%,20%和20%;但在数据集非常庞大的时候,训练集,验证集和测试集的大概比例划分为:98%,1%和1%。
在模型训练的过程中,会出现欠拟合和过拟合的现象。下面仍然以猫图片识别的例子来说明:
出现欠拟合的情况,可以用下面的方法来优化:
出现过拟合的情况,可以用下面的方法来优化:
为了避免神经网络过拟合,可以采取早期停止的做法,在模型达到最高性能的时候就停止训练。
L2正则化能够减少过拟合的原因:
对于整个深度神经网络有:
成本函数:
更新权重:
(from backprop表示从反向传播求偏导的公式,此处简略表示)
可以从上面的式子中看出,wL的系数是小于1的,表示每次更新权重都是衰减的,所以L2正则化也称为“权重衰减”。
解释1):
直观的理解就是,当β设置的足够大,权重矩阵w会被设置为接近于0,即把多隐藏单元的权重设置为0,于是就消除了这些隐藏单元的影响,复杂的网络就会简化成简单的网络,使网络存在高偏差,但β一定会存在一个中间值使得网络拟合的刚刚好。
解释2):
也可以从上面的式子中看出,β增大时,wL是减小的。以下面的tanh激活函数的图像来说明,wL减小,zL也相对减小,进而使取值集中在tanh激活函数的线性区域,这样每层网络就都接近于线性,这样的线性网络不适用于非常复杂的决策,不会出现过度拟合数据集的非线性边界。所以就能够减少过拟合。
如下图所示,我们以去医院就诊为例(生病为阳性,健康为阴性)。当一个病人被确诊为生病时,我们称之为True Positive(真阳性);当一个健康的人被认为健康时,我们称之为True Negative(真阴性);当一个病人被误诊为健康时,我们称之为False Negative(假阴性);当一个健康的人被误诊为生病时,我们称之为False Positive(假阳性)。这就是一个典型的混淆矩阵,用来描述模型性能的一张表。
假设在一个模型中,我们共有10000名患者,其中有1000名患者被确诊,我们标进True Positive这一格;有200名患者被误诊为健康,我们标进False Negative这一格;有800名健康的人被误诊为患病,我们标进False Positive;有1000名健康的人被认为健康,我们标进True Negative这一格。