4.1 数据预处理
1、向量化
神经网络的所有输入和目标都必须是浮点数张量,前面二分类和多分类的例子都是用one-shot编码将数据处理成float32格式的张量。
2、值标准化
数据的各个特征取值范围相差较大时,例如有的在0-1之间,有的在100-200之间,将其输入到神经网络中是不安全的,为了使网络学习更加容易,输入数据应该具有以下特征:
取值较小:大部分值都在0~1范围内
同质性:所有特征的取值都应该在大致相同的范围内
对于Numpy数组的实现:
x -= x.mean(axis = 0) #减去平均值
x /= x.std(axis = 0) #除以标准差
3、处理缺失值
数据中可能会存在缺失值,即某个样本某个特征没有数据的情况,如何处理?
一般来说,对于神经网络,将缺失值设置为0是安全的,只要0不是一个有意义的值,网络能从数据中学到0代表缺失数据,并且会忽略这个值。
注意,如果在测试数据中可能有缺失值,而在训练集上没有的情况下,我们应该人为生成一些有缺失值的训练样本(多次复制一些训练样本,然后删除测试数据中可能缺失的某些特征)。
4、优化和泛化
优化即学习,使之在训练数据上达到最佳性能
泛化是指训练好的模型在前所未有数据上的性能好坏,机器学习的目的当然是得到良好的泛化。
模型大(复杂),即模型中可学习的参数多,就擅长拟合数据,但是泛化能力差
模型小,即模型中没有那么多参数,又会导致欠拟合
因此要找到合适的模型大小,一般先选择相对较少的层和参数,然后逐渐增加层的大小或添加新层。
如何降低过拟合?
如图所示我们可以看到模型在第二轮就开始过拟合,训练损失每轮都在降低,但验证损失在第二轮后就开始升高,训练精度每轮都在升高,但验证精度在第二轮之后也开始降低。
降低过拟合的方法:正则化
我们刚才说在更大的网络上,即参数多的时候容易过拟合,那我们就想办法削减权重(权重越大,其对应的特征影响越大),甚至使其逼近于0,等于基本上消除了这些隐藏单元的许多影响,也就简化了神经网络,使其不那么复杂。
参考下面几个博客:介绍了梯度优化算法、L1正则化、L2正则化
优化算法
正则化(Regularization)
为什么正则化有利于预防过拟合呢?(Why regularization reduces overfitting?)
在Keras中添加权重正则化的方法:
model.add(layers.Dense(16,kernel_regularizer=regularizers.l2(0.001),activation='relu', input_shape=(1000,)))
"""l2(0.001)的意思是该层权重矩阵的每个系数都会使网络总损失增加0.001 * weight_coefficient_value。注意,由于这个惩罚项只在训练时添加,所以这个网络的训练损失会比测试损失大很多。"""
dropout正则化
对于个样本,单次迭代训练时,随机删除掉隐藏层一定数量的神经元;然后,在删除后的剩下的神经元上正向和反向更新权重和常数项;接着,下一次迭代中,再恢复之前删除的神经元,重新随机删除一定数量的神经元,进行正向和反向更新和。不断重复上述过程,直至迭代训练完成
dropout正则化
为什么dropout正则化能够降低过拟合
对于某个神经元来说,某次训练时,它的某些输入在dropout的作用下被过滤了。而在下一次训练时,又有不同的某些输入被过滤。经过多次训练后,某些输入被过滤,某些输入被保留。这样,该神经元就不会受某个输入非常大的影响而被均匀化了。即对应的权重w不会很大。从效果上来说与L2 regularization是类似的,都是对权重w进行“惩罚”,减小了w的值。