4层前馈神经网络回归对所有测试样本输出固定值的原因排查
问题:4层前馈神经网络预测结果全部为固定值
构建了一个4层前馈神经网络,但对测试样本的预测结果均为同一个固定值。数据已标准化至[-1,1]区间,怀疑代码存在问题。
Python代码如下:
# import and function import tensorflow as tf import pandas as pd import numpy as np # 补充原代码遗漏的numpy导入 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Input # 补充原代码遗漏的Input导入 from tensorflow.keras.regularizers import l1 def R_oos_tf(y_true, y_pred): resid = tf.square(y_true-y_pred) denom = tf.square(y_true) return 1 - tf.divide(tf.reduce_mean(resid),tf.reduce_mean(denom)) # read data X_trn = pd.read_pickle("X_trn.pkl") X_vld = pd.read_pickle("X_vld.pkl") X_tst = pd.read_pickle("X_tst.pkl") y_trn = pd.read_pickle("y_trn.pkl") y_vld = pd.read_pickle("y_vld.pkl") y_tst = pd.read_pickle("y_tst.pkl") # features features = list(set(X_trn.columns).difference({'permno','DATE','ret_exc_lead1m','ret','ret_exc'})) # feed forward network- 4layer mod = Sequential() mod.add(Input(shape=(X_trn[features].shape[1],))) mod.add(Dense(32,activation='relu', kernel_regularizer=l1(0.01))) mod.add(Dense(16,activation='relu', kernel_regularizer=l1(0.01))) mod.add(Dense(8 ,activation='relu', kernel_regularizer=l1(0.01))) mod.add(Dense(4 ,activation='relu', kernel_regularizer=l1(0.01))) mod.add(Dense(1)) mod.compile(optimizer='adam', loss='mse', metrics=[R_oos_tf]) mod.fit(X_trn[features], np.array(y_trn).reshape((len(y_trn),1)), epochs=10, batch_size=200, validation_data=(X_vld[features], np.array(y_vld).reshape((len(y_vld),1)))) nn4_pre = pd.DataFrame(mod.predict(X_tst[features]),columns=["nn4"]) # all the prediction is a fixed number!!?? nn4_pre.nn4.value_counts() # result 0.007084 2911
可能的原因及解决建议
- L1正则化强度过高:
l1(0.01)的惩罚力度对于神经网络来说过大,会将绝大多数权重压缩至0,导致网络完全失去学习能力,最终输出固定值。建议将正则化系数调低至1e-4~1e-5级别,或者暂时移除正则化,先验证网络是否能正常学习。 - ReLU激活函数的死亡问题:连续多层使用ReLU激活,若权重初始化不佳或正则化过强,极易导致大量神经元输出为0(死亡ReLU),网络丧失非线性映射能力。可以尝试替换为LeakyReLU、GELU等更鲁棒的激活函数,或者调整权重初始化方式(比如使用He初始化)。
- 训练轮次不足:仅训练10个epochs,网络可能还未充分学习到数据特征就被正则化压制。在调低正则化强度后,可增加训练轮次(比如50~100epochs),同时观察训练集和验证集的损失变化,避免过拟合。
- 数据处理一致性问题:确认标准化操作是否统一——必须使用训练集的均值、标准差来标准化验证集和测试集,不能各自单独标准化。另外,检查特征与目标变量
y的相关性,如果特征和y几乎无关联,网络也会输出固定值(通常是y的均值)。
内容的提问来源于stack exchange,提问作者Jinlan
相关产品推荐
相关产品推荐

