Geeks_Z の Blog Geeks_Z の Blog
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)

Geeks_Z

AI小学生
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)
  • Python

  • MLTutorials

  • 卷积神经网络

  • 循环神经网络

  • Transformer

  • VisionTransformer

  • 扩散模型

  • 计算机视觉

  • PTM

  • MoE

  • LoRAMoE

  • LongTailed

  • 多模态

  • 知识蒸馏

  • PEFT

  • 对比学习

  • 小样本学习

  • 迁移学习

  • 零样本学习

  • 集成学习

  • Mamba

  • PyTorch

    • PyTorch概述

    • Tensors

    • 数据处理

    • 模型

    • 训练

    • 并行计算

    • 可视化

    • 实战

    • timm

    • Pytorch Lightning

    • 数据增强

    • 面经与bug解决

      • model
        • model.eval()
          • pytorch中model.eval()会对哪些函数有影响?
          • Dropout训练和推理时的差异
          • BatchNorm测试时统计量怎么来
          • model.eval()影响大模型吗
      • Pytorch中的多个loss和的梯度回传
      • DDP
    • 常用代码片段

    • Reference
  • CL

  • CIL

  • 小样本类增量学习FSCIL

  • UCIL

  • 多模态增量学习MMCL

  • LTCIL

  • DIL

  • 论文阅读与写作

  • 分布外检测

  • GPU

  • 深度学习调参指南

  • AINotes
  • PyTorch
  • 面经与bug解决
Geeks_Z
2024-12-06
目录

model

model.eval()

pytorch中model.eval()会对哪些函数有影响?

pytorch中model.eval()会对哪些函数有影响? (opens new window)

答:将BN和dropout这些训练和测试时行为不同的层切换到test mode。

Dropout训练和推理时的差异

众所周知,dropout是训练的时候将某层的神经元输出以 p(如10%)的概率随机置为零,以减缓过拟合。那么测试时呢?

为了保证测试时每次推理的一致性,肯定是不能再随机让神经失活了,那什么都不做,让所有神经元都按正常输出值原样输出可以嘛?

从训练和测试时的输出值尺度一致性来看,答案显然是否定的。设每个神经元原始输出的绝对值均值为 x ,则该层训练时dropout后每个神经元输出的绝对值均值为 (1−p)x ,如果测试时简单地让所有神经元都按正常输出值原样输出,则输出的绝对值均值为 x ,导致训练和测试的不一致。

因此,带dropout的层,测试时的行为是让所有神经元都输出,但输出值要从原始的 x 变成 (1−p)x 。

当然,也可以在训练的时候就除以(1−p),这样训练时dropout后每个神经元输出的绝对值均值就是x,测试的时候直接简单地做恒等映射输出就行,速度更快。

torch官方使用的是这种实现:

BatchNorm测试时统计量怎么来

Batch Normalization训练时,使用的均值和方差统计量是从同batch数据的同一特征维度统计而来。

而测试时,为了保证每个测试点的预测输出不受batch内其他数据影响,肯定得采用固定的统计量,这个统计量从何而来呢?

直观的想法是再过一遍整个训练集,在整个训练集上估计均值和方差,但在数据多的时候,每次在测试之前都要过一遍整个训练集超级费时:

因此,我们需要一个近似的在训练时估计全局统计量分布的办法。这个统计量要满足两个要求:

  1. 尽量反映整个训练集的分布;
  2. 尽量使用模型训练结束或者即将结束时的权重来计算,以便和测试时行为一致。

考虑到这两个要求,是不是想起了SGD里的momentum?采用训练时指数滑动平均的方式就可以得到测试时用的统计量,参考torch的官方文档:

model.eval()影响大模型吗

我们已经厘清了model.eval()对dropout层和batch norm层的影响,那么model.eval()影响大模型吗这个问题就等价于:大模型用batch norm和dropout吗?

首先,大模型用的都是layer norm, batch norm显然是不存在的。那么大模型开dropout吗?

先明确一下dropout的位置,大多数transformer的实现(尤其是类gpt的decoder模型中)只在self-attention的softmax概率之后使用dropout,相应的失活概率p 超参数attention_dropout。

而在LLaMA、Mistral这些常见的开源大模型中,attention_dropout都被设为0,也就是实际上不使用dropout,model.eval()对这些不开dropout的大模型实际上没有影响。

上次更新: 2025/06/25, 11:25:50
imgaug
Pytorch中的多个loss和的梯度回传

← imgaug Pytorch中的多个loss和的梯度回传→

最近更新
01
帮助信息查看
06-08
02
常用命令
06-08
03
学习资源
06-07
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Geeks_Z | MIT License
京公网安备 11010802040735号 | 京ICP备2022029989号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式