使用 MLP(回归),将最后一层中的偏差初始化为接近预期均值的值是否合适?

数据挖掘 机器学习 深度学习 喀拉斯
2022-02-10 04:05:45

例如,在预测人群的智商时,你会期望平均值为 100。如果你在最后一层初始化偏差,你基本上是在给网络一个先机,告诉它应该在什么范围内猜测值。解决这个问题的另一种方法是预测一个均值为 0 的缩放结果值,这将使标准偏差初始化器值 0 准确无误。

对于这种情况,是否有任何指导规则/规范?两种方法都合适吗?

1个回答

好主意!看起来真的很有帮助。

训练以较小的误差开始,因此您可以使用此技巧在更短的时间内训练模型。只要您正确初始化权重,您应该没问题。

我训练了具有不同偏差的模型,并在训练开始和结束时绘制了误差。数据的预期平均值为 100。请参见下面的代码。

在此处输入图像描述

from keras.models import Sequential 
from keras.layers import Dense
from keras.initializers import Constant, Zeros, Ones
from keras.metrics import mean_squared_error
import matplotlib.pyplot as plt 
import numpy as np

def getData():
    n = 200
    X = np.random.randn(n, 2)
    Y = 20 * X[:,0] + 10 * X[:,1] + 100 
    return X, Y 

def getModel(bias):
    m = Sequential()
    m.add(Dense(1, 
        input_shape=(2,),
        bias_initializer=bias))
    m.compile('adam', loss='mse')
    return m

X, Y = getData()

constants = [0, 1, 10, 50, 100, 150, 200]
loss_at_start = []
loss_at_end = []

for c in constants:
    m = getModel(Constant(c))
    m.fit(X,Y,
        epochs=20,
        validation_split=0.2,
        validation_steps=20,
        steps_per_epoch=1000)
    loss_at_start.append(m.history.history['loss'][0])
    loss_at_end.append(m.history.history['loss'][-1])

plt.plot(constants, loss_at_start)
plt.plot(constants, loss_at_end)
plt.xlabel('Bias')
plt.ylabel('Loss')
plt.legend(['Loss at training start','Loss at training end'])
plt.title('Expected mean: 100')
plt.show()