TensorFlow笔记七
++@Author:LF
@Date:2017-12-31++
根据昨天的计划,今天将学习过拟合问题和滑动平均模型。
一、过拟合问题
在神经网络中,由样本数据训练出模型,通过模型去预测数据。那么模型的好坏直接影响了预测的结果。过拟合问题就是指明明在训练样本数据时候能够达到很好的效果,在预测数据时却出现较大偏差,这就是过拟合问题。过拟合简单来说就是讲简单的东西复杂化,同样的,将复杂的东西简单化就是欠拟合。那么造成过拟合问题的原因是什么呢?一般来说是因为样本数据过少,模型中的参量过多导致的,也就是说模型在训练的过程中有效的记忆了样本数据中的噪声,而忽略了样本中数据的趋势。打个不恰当的比方,马上我要考电工了,现在有题库,题库里面的题目类型都差不多,也有答案。本来我应该根据这些题型去分析这一类问题的解决方法,可是我却选择去死记硬背答案,最后的结果就是题库的题目我都会写,可是考试的时候换了数据我就不会了。这就和过拟合的情况差不多,由于模型中的参数太多导致噪声被记忆,所以在训练样本中表现很好的模型在真实预测中误差较大。
那么过拟合问题如何解决?由上述说明可以看出,对于过拟合问题,无非两种思路:要么减少参数的数量来降低模型的复杂度,要么减少参数的权值来降低它产生的影响。于是,正则化的方法就产生了。
1、正则化
正则化的方法就是在损失函数中加入刻画模型复杂度的指标。那么损失函数就不是以前的损失函数了,假设损失函数为J(x),本来优化应该是优化J(x),来达到降低J(x),但是加入了正则化后,则是优化J(x)+aR(w),a是正则化参数,R(w)刻画了模型复杂度。
这里先来介绍R(w)是如何来刻画模型复杂度的。
正则化中刻画模型复杂度的方式有两种,一种是L1正则化,另一种是L2正则化。那么这两者之间有什么区别呢?我们来看一下公式:
L1正则化:
L2正则化:
怎么说呢,这里L1正则化会达到一种筛选参数的作用,即将更多的参数变成0,从而降低模型复杂度。L2正则化则不会将参数调0,而是尽可能的减小,即减小参数对模型的影响。至于通过这个式子是如何做到的。。目前我还没理清思路,里面应该涉及到一堆数学证明。。不太懂。不过目前先知道他们的作用就好了。
接下来说正则化参数a,a的作用很简单,a主要控制在优化的过程中对多余参数的惩罚力度。什么意思,就是说比如对于一个参数w1,在一次优化中,需要降低w1的值,以达到简化模型的目的,即惩罚w1,如果a非常大,即对w1的惩罚力度很大,那么很有可能一次惩罚就可以让w1非常接近0,如果a非常小,即对w1的惩罚力度比较小,那么w1减小量也比较小。这就是a正则化参数的作用。
接下来给出TensorFlow中对L2正则化的支持:
Loss = tf.reduce_mean(损失函数+tf.contrib.layers.12_regularizer(正则化参数)(需要优化的参数))
TensorFlow中对L1正则化的支持:
Loss = tf.reduce_mean(损失函数+tf.contrib.layers.11_regularizer(正则化参数)(需要优化的参数))
二、滑动平均模型
说实话,对于滑动平均模型并不是很懂它的原理。书上讲的很少,就说了它可以提高模型在训练集上健壮性,然后贴出了代码。百度了一下,基本都是抄书的博客,没有太多的讲解。
但是从书上的代码中,感觉滑动平均似乎是对模型的一种更新,而且是趋于稳定的更新。嗯。。但是从代码中也的确没感受到为啥。所以关于滑动平均的代码就不贴了,因为分析不出来了。还是留着以后学着学着慢慢领悟吧。
三、总结
今晚把最后的几个小点都过了一下,虽然滑动平均模型并没有理解到位,但是毕竟接触时间不长,可以慢慢领悟,所以不必太过着急。接下来按照计划应该进入MNIST数字识别实战了。这个实战感觉应该需要花点功夫分析流程,理解代码,从而加深对深度学习的理解以及对训练过程的熟悉。