过拟合:神经网络模型在训练数据集上的准确率较高,在新的数据进行预测或分类时准确率较低,说明模型的泛化能力差。

正则化:在损失函数中给每个参数w加上权重,引入模型复杂度指标,从而抑制模型噪声,减小过拟合。

使用正则化后,损失函数loss变为两项之和:

loss = loss(y与y_) + REGULARIZER * loss(w)

其中,第一项是预测解锁与标准答案之间的差距,如之前讲过的交叉熵、均方误差;第二项是正则化 计算结果。

正则化计算方法:

知乎 神经网络 混凝土 神经网络regularization_数据集


用Tensorflow函数表示:loss(w) = tf.contrib.layers.11_regularizer(REGULARIZER)(w)

知乎 神经网络 混凝土 神经网络regularization_Tensorflow_02


用Tensorflow函数表示:loss(w) = tf.contrib.layers.12_regularizer(REGULARIZER)(w)

用Tensorflow函数实现正则化:
tf.add_to_collection(losses",tf.contrib.layers.12_regularizer(regularizer)(w))
loss = cem + tf.add_n(tf.get_collection(‘losses’))

例如:

用300个符合正态分布的点X[x0,x1]作为数据集,根据点X[x0,x1]计算生成标注Y_,将数据集标注为红色点和蓝色点。

标注规则为:

知乎 神经网络 混凝土 神经网络regularization_Tensorflow_03


我们分别用无正则化和有正则化两种方法,拟合曲线,把红色点和蓝色点分开。在实际分类时,如果前向传播输出的预测值y接近1则为红色点概率越大,接近0则为蓝色点概率越大,输出的预测值y为0.5是红蓝点概率分界线。

matplotlib模块:Python中的可视化工具模块,实现函数可视化
终端安装指令:sudo pip install matplotlib
函数plt.scatter():利用指定颜色实现点(x,y)的可视化
plt.scatter(x坐标,y坐标,c=“颜色”)
plt.show()
收集规定区域内所有的网络坐标点:
xx, yy = np.mgrid[起:止:步长,起:止:步长] #找到规定区域以步长为分辨率的行列网络坐标点
grid = np.c_[xx.ravel(), yy.ravel()] #收集规定区域内所有的网络坐标点
plt.contour()函数:告知x、y坐标和各点高度,用levels指定高度的点描上颜色
plt.contour(x轴坐标值,y轴坐标值,该点的高度,levels=[等高线的高度])
plt.show()

本例代码如下:

知乎 神经网络 混凝土 神经网络regularization_正则化_04


知乎 神经网络 混凝土 神经网络regularization_Tensorflow_05


知乎 神经网络 混凝土 神经网络regularization_正则化_06


知乎 神经网络 混凝土 神经网络regularization_知乎 神经网络 混凝土_07


知乎 神经网络 混凝土 神经网络regularization_Tensorflow_08


知乎 神经网络 混凝土 神经网络regularization_正则化_09


执行代码,效果如下:

首先,数据集实现可视化

知乎 神经网络 混凝土 神经网络regularization_知乎 神经网络 混凝土_10


接着,执行无正则化的训练过程,把红色的点和蓝色的点分开,生成曲线如下图所示:

知乎 神经网络 混凝土 神经网络regularization_知乎 神经网络 混凝土_11


最后,执行有正则化的训练过程,把红色的点和蓝色的点分开,生成曲线如下图所示:

知乎 神经网络 混凝土 神经网络regularization_正则化_12


对比无正则化与有正则化模型的训练结果,可看出有正则化模型的拟合曲线平滑,模型具有更好的泛化能力。