tf Keras Sequential模型出现异常不连续初始化行为问题咨询
现象诱因
- 初始化参数配置不合理:你当前为全连接层设置的
RandomNormal初始化标准差为1,对于ReLU激活的网络来说这个数值明显过大:适配ReLU的He初始化规则要求核参数标准差为√(2/输入维度),你网络第二层输入维度为64,对应标准差值仅约0.18,用标准差1的初始化会导致参数分布极分散,大部分节点输出要么过饱和要么直接被ReLU截断。如果不手动设置初始化器,Keras Dense层默认使用Glorot初始化,对ReLU的适配性较差,也会出现同类问题。 - ReLU激活函数的固有特性:ReLU是分段线性函数,输入小于0时输出直接置0,大于0时才会线性输出。参数分布过宽时,大部分输入样本经过第一层计算后结果落在小于0的区间,经过ReLU后输出全0,后续层计算也不会改变这个结果,最终表现为输出曲线大片平坦;只有少部分样本的计算结果刚好落在ReLU的激活区间,叠加后就形成了突兀的尖峰,这属于ReLU在初始化不当场景下的正常表现,不属于代码或框架BUG。
修复方案
- 将核初始化替换为ReLU适配的He初始化:直接设置
kernel_initializer='he_normal'即可,偏差初始化可以使用默认零初始化,或标准差不超过0.1的随机正态初始化,避免参数分布过宽导致大面积ReLU死区。 - 如果对初始化阶段的输出平滑度要求较高,可以将部分ReLU替换为Swish、Mish等软饱和激活函数,缓解初始化阶段的尖峰问题。
内容的提问来源于stack exchange,提问作者Diogo Santos
相关产品推荐
相关产品推荐

