You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:22:17