TensorFlow中两组偏置用相同函数初始化却分布异常的原因排查
根据你描述的情况——用相同初始化函数生成两组权重/偏置,但第二组偏置在TensorBoard里显示为以±0.06为中心的二元分布,结合你提到的原始任务是二分类、示例用了10分类MNIST的背景,我梳理了几个最可能的原因:
初始化函数的分支逻辑未适配任务变化
虽然你说用了相同的函数,但大概率函数内部存在和任务类别数绑定的分支逻辑。比如原始二分类任务中,你可能给输出层偏置写了特殊初始化规则(比如固定在±0.06,对应二分类的两个类别),切换到10分类MNIST时,这段逻辑没被修改,导致偏置被强制初始化为两个固定值,而非预期的均匀分布。
建议检查你的初始化函数,有没有类似if num_classes == 2这类条件判断,不小心把10分类的偏置也套进了二分类的初始化逻辑里。初始化代码的赋值错误
有可能是复制粘贴代码时的疏忽:比如第二组偏置的初始化代码,误写成了两次定向赋值——一次给部分偏置设为+0.06,另一次给剩余部分设为-0.06。比如类似这样的错误:# 错误示例 biases[:5] = 0.06 biases[5:] = -0.06这种情况下,不管任务是几分类,偏置都会呈现两个峰值的分布。
初始化函数的调用参数不一致
相同的初始化函数,传入参数不同也会导致结果完全不同。比如你用的是自定义初始化函数,或者像tf.initializers.RandomUniform这类内置函数,原始二分类时传入的是minval=-0.06, maxval=0.06,但10分类时不小心把范围设置成了只取两个端点?或者函数需要根据输入输出维度计算初始化范围,但你传入的维度参数错误,导致计算出的范围刚好是±0.06的离散值?TensorBoard可视化的小误解(可能性较低)
有时候直方图的bin数量设置过少,可能会把连续的均匀分布“压缩”成看起来像两个峰值的样子。不过你明确说是二元分布,这个可能性不大,但可以试试调整TensorBoard直方图的bin数量,确认是不是可视化的误导。
另外你提到“输出层偏置的峰值数量”,如果是训练后的分布,那可能和二分类到10分类的标签分布变化有关,但你说的是初始化后的分布,所以核心还是初始化阶段的代码问题。最直接的排查方法是打印第二组偏置的初始值,看看是不是真的只有两个不同的值,这样能快速定位问题。
内容的提问来源于stack exchange,提问作者yoann

