神经网络的偏差正则化会导致欠拟合吗?

113 阅读8分钟

神经网络是一个由神经元组成的网络,旨在执行所需的任务。某些任务的整体神经网络架构非常简单,有些则非常复杂。神经网络的复杂性和深度取决于要实现的任务,在某些情况下,即使是复杂或深层的神经网络也容易出现欠拟合,因为它们可能没有能力捕捉数据的不同模式。因此,在这篇文章中,让我们看看一种被称为神经网络的偏置正则化的方法,以及它是否有助于捕捉不同的模式或导致模型的欠拟合。

目录

  1. 什么是神经网络中的欠拟合?
  2. 什么是神经网络中的偏置正则化?
  3. 关于神经网络中正则化的案例研究
  4. 摘要

什么是神经网络中的欠拟合?

任何开发的神经网络都必须产生相当多的训练和测试参数,当开发的神经网络没有能力捕捉不同规模的数据模式和变化时,就会出现神经网络的欠拟合。当数据稀缺,模型没有能力捕捉平面上的最低数量的数据点,从而认为它是一个可靠的模型时,也会发生欠拟合。

导致神经网络欠拟合的主要原因是由于模型的简单性和传播层数少,这使得模型在每次迭代中的损失和精度参数达到饱和,并可能导致神经网络在所提到的迭代(epochs)中损失的精度值几乎相同,以适应和收敛最佳的结果。

什么是神经网络中的偏置正则化?

在了解什么是神经网络中的偏置正则化之前,让我们先了解什么是神经网络中的偏置,以及它对神经网络有什么作用。

什么是神经网络中的偏置?

神经网络中的偏差通常是指在神经网络中诱发的均匀误差,以显示它所适应的数据的通用性能,而不是产生不现实的模型。因此,对于神经网络来说,偏见是通过选择权重来诱导的,这样在模型收敛过程中的权重更新是正确的,而不是倾向于某些数据模式。现在让我们来了解一下神经网络中的偏置正则化是什么。

神经网络中的偏正则化

神经网络中的偏置正则化是指在偏置参数中加入一些因素,帮助我们从模型中获得更好的结果,对未见过的数据有更好的表现。但是,如果偏置因子不是最佳的,那么模型就会迅速通过各层传播,产生较低的训练和测试参数,从而导致欠拟合。

这就是偏置正则化应用于神经网络的地方,这些网络非常复杂,可以更快地收敛并产生更好的准确性。但是,偏见正则化技术可能不适合所有类型的数据和场景,在神经网络中应用偏见正则化可能会导致欠拟合。

让我们通过一个案例来了解神经网络中的偏正则化是如何导致欠拟合的。

神经网络中偏见正则化的案例研究

在神经网络中可能有不同类型的正则化,如内核正则化、偏向正则化和活动正则化,分别应用在神经网络的各个层。但本文让我们看看如何在神经网络的不同层实现偏向正则化技术并分析神经网络的性能。

这里使用了一个手势数字分类数据集,其中有2个数字要分类为1或0。在进行适当的预处理后,数据的子图被可视化,如下图所示:

plt.figure(figsize=(15,5))
for i in range(1,6):
 plt.subplot(1,5,i)
 plt.imshow(X_train[i,:,:],cmap='gray')
 plt.title('Sign language of {}'.format(Y_train[i]))
 plt.axis('off')
 plt.tight_layout()
plt.show()

有了适当的预处理后的数据,模型的建立就开始了。最初,在没有任何正则化的情况下建立了一个模型,如下图所示:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,MaxPool2D,Flatten,Dense,Dropout
import warnings
warnings.filterwarnings("ignore")
 
model1=Sequential()
 
model1.add(Conv2D(128,(3,3),activation='relu',input_shape=(64,64,1)))
model1.add(MaxPool2D(pool_size=(2,2)))
model1.add(Conv2D(64,(3,3),activation='relu'))
model1.add(MaxPool2D(pool_size=(2,2)))
model1.add(Conv2D(32,(3,3),activation='relu'))
model1.add(MaxPool2D(pool_size=(2,2)))
model1.add(Flatten())
model1.add(Dense(256,activation='relu'))
model1.add(Dense(125,activation='relu'))
model1.add(Dense(64,activation='relu'))
model1.add(Dense(1,activation='sigmoid'))
model1.summary()

model1.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

通过适当的数据预处理和编译,模型被拟合为分割的数据,并对模型的训练和测试损失以及准确性进行了评估,如下图所示:

model1_res=model1.fit(Xtrain1,Y_train,epochs=10,validation_data=(Xtest1,Y_test),batch_size=32)

model1.evaluate(Xtrain1,Y_train) ## training loss and training accuracy

model1.evaluate(Xtest1,Y_test) ## testing loss and testing accuracy

在这里,我们可以看到,测试准确率低于训练准确率,模型已经显示出欠拟合的迹象。因此,让我们看看偏置正则化技术是否能帮助我们减少模型的欠拟合,还是会导致进一步的欠拟合。

在扁平化层之后引入偏向正则化

model2=Sequential()
 
model2.add(Conv2D(128,(3,3),activation='relu',input_shape=(64,64,1)))
model2.add(MaxPool2D(pool_size=(2,2)))
model2.add(Conv2D(64,(3,3),activation='relu'))
model2.add(MaxPool2D(pool_size=(2,2)))
model2.add(Conv2D(32,(3,3),activation='relu'))
model2.add(MaxPool2D(pool_size=(2,2)))
model2.add(Flatten())
model2.add(Dense(256,activation='relu',bias_regularizer=regularizers.l1(0.01)))
model2.add(Dense(125,activation='relu'))
model2.add(Dense(64,activation='relu'))
model2.add(Dense(1,activation='sigmoid'))

因此,这就是如何在扁平化层之后加入偏向正则化,模型应该被编译和拟合,就像模型1对分割数据的拟合和评估一样,可以看到偏向正则化使得模型没有产生准确度,或者在扁平化层之后加入偏向正则化的模型严重欠拟合,但是与没有任何正则化的模型相比,模型的测试损失有所减少:

model2.evaluate(Xtrain1,Y_train)  ## training loss and training accuracy

model2.evaluate(Xtest1,Y_test)  ## training loss and training accuracy

在2个随机层中引入偏见正则化

model3=Sequential()
 
model3.add(Conv2D(128,(3,3),activation='relu',input_shape=(64,64,1)))
model3.add(MaxPool2D(pool_size=(2,2)))
model3.add(Conv2D(64,(3,3),activation='relu',bias_regularizer=regularizers.l1(0.01)))
model3.add(MaxPool2D(pool_size=(2,2)))
model3.add(Conv2D(32,(3,3),activation='relu'))
model3.add(MaxPool2D(pool_size=(2,2)))
model3.add(Flatten())
model3.add(Dense(256,activation='relu',bias_regularizer=regularizers.l2(0.01)))
model3.add(Dense(125,activation='relu'))
model3.add(Dense(64,activation='relu'))
model3.add(Dense(1,activation='sigmoid'))

该模型被编译并拟合了10个epochs的分割数据,并以类似的方式评估了模型的训练和测试损失以及准确率:

model3.evaluate(Xtrain1,Y_train)

model3.evaluate(Xtest1,Y_test)

在输出层之前引入偏见正则化

model4=Sequential()
 
model4.add(Conv2D(128,(3,3),activation='relu',input_shape=(64,64,1)))
model4.add(MaxPool2D(pool_size=(2,2)))
model4.add(Conv2D(64,(3,3),activation='relu'))
model4.add(MaxPool2D(pool_size=(2,2)))
model4.add(Conv2D(32,(3,3),activation='relu'))
model4.add(MaxPool2D(pool_size=(2,2)))
model4.add(Flatten())
model4.add(Dense(256,activation='relu'))
model4.add(Dense(125,activation='relu'))
model4.add(Dense(64,activation='relu',bias_regularizer=regularizers.l1(0.01)))
model4.add(Dense(1,activation='sigmoid'))

在这里,偏见正则化被添加到输出层之前,模型被编译并拟合了10个历时的分割数据,模型被评估为训练和测试的损失和准确性,如下所示。

在这里,偏见正则化被添加到输出层之前,模型被编译并拟合了10个历时的分割数据,模型被评估为训练和测试的损失和准确性,如下图所示:

model4.evaluate(Xtrain1,Y_train)

model4.evaluate(Xtest1,Y_test)

在这里我们可以看到,在输出层之前添加偏见正则化的结果大致相同,但在输出层之前添加偏见正则化时,训练和测试的准确性没有看到任何数值的变化。

偏置正则化的主要结果

偏置正则化是用来获得更好的准确性和减少模型的过拟合(如果有的话)。但是,只有在需要时才使用它是非常重要的,因为有时它可能导致模型严重欠拟合,正如案例研究中所看到的。因此,只有在复杂的神经网络或非常深的层模型中才需要偏向正则化。对于较简单的模型结构来说,不需要进行偏正则化。在很多情况下,神经网络中的偏正则化只是在输出层之前使用,在这种情况下,像本案例研究中使用的较简单的神经网络可能会改善损失参数,但不会改善准确度参数,可能在考虑复杂神经网络时,会减少过拟合。

总结

偏向正则化通常用于防止复杂神经网络的过度拟合,在这篇文章中,我们清楚地看到,如果偏向正则化用于较简单的数据和简单的模型结构,它可能在没有任何正则化的情况下产生相同的模型参数,或者它可能导致模型欠拟合,产生不可靠的数据,对未见过的数据没有更好的表现。因此,综上所述,可以说偏见正则化只适用于庞大的数据或复杂的模型,而不适用于简单的数据和较简单的模型结构。

参考文献