让 AI 枚举 Dropout:训练时保留的值放大,推断时就不再补一次

前天 3阅读

同一个网络,训练和推断时Dropout的输出为什么不同?只说“训练随机删一半”容易产生两个误解:每次一定恰好删一半,以及推断时还要再把数乘回去。可以让AI枚举两个输入数的全部情况,把这两件事一次算清。

让 AI 枚举 Dropout:训练时保留的值放大,推断时就不再补一次

AI模型生成的概念插图:部分节点暂时失活;不是实际神经网络、运行截图或固定失活比例的承诺。

约定的是逐元素概率

输入向量为[2,−4],每个元素独立以概率p=0.5被置零。采用PyTorch Dropout所说明的训练期缩放:保留的元素除以1−p,即乘2;推断模式下这个模块直接返回输入。

这里丢弃的是本次前向计算中的元素值,不是把权重永久删除。两次前向可以有不同掩码;同一次也可能两个都留、两个都丢,不能要求恰好有一个变成零。本文不用随机试抽,而是列全四种等可能掩码。

四张卡的平均值是什么

若掩码00表示两个都丢,输出为[0,0];10表示只留第一项,输出[4,0];01表示只留第二项,输出[0,−8];11表示两个都留,输出[4,−8]。四种情况各有1/4机会,输出形状始终是两个元素。

第一项的均值为(0+4+0+4)/4=2,第二项为(0+0−8−8)/4=−4,所以逐元素期望回到原输入。这里平均的是完整概率空间,不是说实际连续四次调用必定四种各出现一次。

若训练时保留项不放大,四种输出会变成[0,0]、[2,0]、[0,−4]、[2,−4],平均只剩[1,−2]。这解释了为何采用训练期缩放,也说明它与不缩放的另一套约定不能混写。

推断时为什么直接通过

按本例约定,评估模式的Dropout返回[2,−4]。如果还再乘0.5,就错误地变成[1,−2];如果还再乘2,则变成[4,−8]。训练期已经采用了补偿尺度,推断端不应擅自补第二次。

不过“Dropout输出期望等于输入”不等于“整个网络的训练随机输出平均等于推断输出”。例如只看第一项,训练输出可能为0或4,各一半;平方后的期望是(0²+4²)/2=8,而推断时先得2再平方是4。非线性运算不能随意与取平均交换顺序。

一份能完整核算的提示词

“输入[2,−4],每个元素独立以p=.5置零,训练时保留项除以1−p。列00、10、01、11四个掩码、概率和输出,求逐元素期望;再列不缩放版本作对照。说明评估模式的输出,检查误乘.5与2的结果。最后比较第一项平方的训练期望与推断平方,不宣称整个网络输出等价。”

本文已独立枚举掩码并核对各项期望。实际排查时先确认调用的是模块还是函数,以及训练状态如何传入;例如某些函数接口有独立开关,不能只凭外层名字推断行为。Dropout是否适合某个任务、p应取多少,还需要训练和验证资料,本例不提供最佳值。

资料核对日期:2026年10月2日。本文使用原创合成设定,独立核算不代表真实模型训练或效果测试。

参考资料

PyTorch:Dropout

文章版权声明:除非注明,否则均为云鹊BLOG原创文章,转载或复制请以超链接形式并注明出处。