09_1_过拟合与欠拟合&交叉验证
过拟合与欠拟合
数据真实模态(数据真实分布) P r ( θ ) Pr(\theta) Pr(θ),r表示real
Scenario1: house price
横坐标是面积,纵坐标是价格。
根据数据图和人的经验来说,房价基本上是线性模型,因为房价=面积*倍数+偏置。
Scenario2: GPA
非线性模型,但是可以看出应该属于高斯分布(正态分布)
The ground-truth distribution?(是事实的分布类型?)
- 在我们知道分布的类型(风格),只需要预估分布的参数的时候,这时候会非常简单。
- 但是现实情况往往不知道分布的类型。
在不知道分布类型的时候,该如何解决?
Another factor: noise(噪声)
我们不仅仅不知道分类的类型,还会有观察的误差。比如即使知道的房子的面积和价格,房子的价格受其他因素影响,比如房子的测量误差、房价的取舍误差、顾客类型……
把误差合并在同一个因子上,noise(误差), ϵ \epsilon ϵ。抽象它符合某个分布,比如均值分布N(0.01,1)。
数据少的话,噪声的随机性比较大,所以需要更多的数据。
而且数据少,可能也难以看出它分布的类型,是线性模型还是二次 w x 2 + b x + c wx^2+bx+c wx2+bx+c去模拟。
Let’s assume(对模型本身度量)
用模型学习数据分布的时候,优先选择不同类型的模型。比如对多项式来说,可能会使用常数的模型,也有可能一次方、二次方……那么不同次方的模型,它的抖动越大,波形越复杂。
Mismatch: ground-truth VS estimated
- model capacity 模型能力(容量、搜索空间)
对于常数来说,学习能力很弱,能学习的pattern非常少;当次方增加的时候,网络的表达能力更强,表达的分布情况可以更复杂,对于非常复杂的映射也能很好的学习到,这时可以说模型的表达能力变强了。
Model Capacity
模型越复杂,参数越大,类似多项式次数越高,表达能力越强,能抽象出更高维的特征,做更高维的类比。
Case1: Estimated < Ground-truth
情况1:用的模型的表达能力<真实模型的复杂度。
under-fitting
For example: WGAN
Underfitting
train的acc和loss不令人满意,acc和loss线之间的面积为underfitting
test的acc和loss也会差
->需要增加模型复杂度:更多层数;每一层单元数量增加
Case2: Ground-truth < Estimated
过分地把噪声也包含进来了。
使用模型的复杂度>真实的复杂度
over-fitting
这种情况,会使得training情况特别好,但是test不一定好
Overfitting
train很好,test不好
-> Generalization Performance 泛化能力 变差
总结
Overfitting!
现实情况更多是Overfitting,因为现在计算机能力很强。
在有限数据的情况下,会出现Overfitting,否则数据无限则不会出现Overfitting
目前有两个问题:
- how to detect 怎么检测Overfitting
- how to reduce 怎么减少Overfitting
交叉验证
检测是否Overfitting。
Recap
How to detect 如何检测
Splitting
Train效果好而Test效果不好则Overfitting
Train, Test
装载train和test数据,目前validation和test是一个含义
Splitting
实际上有3个划分。train部分内部再划分1个validation。
val部分做模型参数的挑选,test部分做最后的性能的检测。
Train, val, test
代码2种划分成3种。
Evaluate during train
在network.fit(db_train,epochs=5,validation_data=db_val,validation_freq=2)
中,例如epoch为1k(for epoch in range(1K)
)。并不是1K才停止,如果效果够好了,就可以中间跳过。validation
就是这个功能,可能第600个epoch就停止,因为600的performance最好,之后performance会下降。一般freq
设置为10~25个。validation是用来挑选模型的状态(参数)。
Test after training
最后1步为测试:使用db_test
train test trade-off
过拟合,泛化能力变差。在check point就停止上交应用。
For others judge
- Train, Val, Test Set
Train:更新参数。
Val:挑选模型参数,在某个时间点停止。
Test:客户测验。
K-fold cross-validation
在下图,只有10K没有更新参数的作用。因此,可以随机地切割,再分为train和validation。可以防止参数有记忆的特性,也充分利用了数据。
k-fold cross validation
把training的数据划分成N份,每次取 N − 1 N \frac{N-1}{N} NN−1做训练,另外1分做validation。
代码实现
每次epoch都会对train部分做划分,train/validation
使用相同的种子,做random和shuffle,对60K的随机数下标打散,分成xy_train和xy_val。下次epoch会自动重新随机。
Keras代码:
db_train_val
是总的60K数据(还未分割),设定validation_split
做0.9:0.1的比例动态切割。