我正在尝试在tensorflow中实现具有丢失的神经网络。
tf.layers.dropout(inputs, rate, training)
来自文档:“Dropout包括在训练期间每次更新时随机设置输入单位的分数率为0,这有助于防止过度拟合。保留的单位按1 /(1 - rate)缩放,所以他们的总和在训练时间和推理时间没有变化。“
现在我明白了这种行为,如果在超过零的sigmoid激活之上应用了dropout。如果输入单位的一半归零,则所有输出的总和也将减半,因此将它们按2倍缩放是有意义的,以便在下一层之前重新获得某种一致性。
现在如果使用以零为中心的tanh激活怎么办?上面的推理不再成立,所以通过上述因素来扩展辍学的输出仍然有效吗?有没有办法防止张量流量减少扩大输出?
提前致谢
答案 0 :(得分:0)
将节点设置为零输出的点是神经元对由它馈送的神经元没有影响。这将产生稀疏性,因此试图减少过度拟合。使用sigmoid或tanh时,该值仍设置为零。
我认为你的推理方法是不正确的。想想贡献而不是总和。
答案 1 :(得分:0)
如果您有一组节点输入和一组权重,则它们的加权和是一个值S.您可以通过选择原始随机变量的随机分数f来定义另一个随机变量。使用以这种方式定义的随机变量的相同权重的加权和是S * f。从这里可以看出,如果目标是总和的平均值在有和没有缩放的情况下保持相同,则重新缩放的参数是精确的。当激活函数在子集的加权和的范围内是线性的时,这将是真的,如果激活函数在子集的加权和的范围内近似是线性的,则大致为真。
通过任何非线性激活函数传递线性组合后,重新缩放完全保留预期均值不再是真的。然而,如果对节点的贡献不是由少量节点支配,则所选择的相当大的大小的随机选择的子集的总和的方差将相对较小,并且如果激活函数近似线性相当接近输出值,重新缩放将很好地产生具有大致相同平均值的输出。例如,logistic和tanh函数在任何小区域上近似线性。请注意,函数的范围是无关紧要的,只是它的值之间的差异。
通过relu激活,如果原始加权和足够接近零,子集的加权和将在零两边,激活函数中的一个不可微分点,重新缩放不会很好地工作,但这是一种相对罕见的情况,仅限于小的输出,因此可能不是一个大问题。
这里的主要观察结果是,重新缩放最适合大量节点做出重大贡献,并且依赖于激活函数的局部近似线性。