TPLINK图像算法一面

1018 tplink 算法二面 面试题

  1. 自我介绍
  2. CUB200项目中遇到了什么问题,欠拟合(预训练不能解决欠拟合,但是大模型可以)与过拟合怎么解决的
  3. 为什么你觉得模型攻击能解决过拟合问题,一般用于测试,但是加入到训练集中确实可以减弱过拟合。
  4. PGD的计算方法
  5. 解决过拟合的方法
  6. 个性化搜索的细节,如何实现的,如何将dm应用到这个任务上面,如何构造训练的数据对
  7. fixmatch 原理
  8. transformer 计算方法
  9. BN 层的计算方法,参数量,训练与推理时的区别。

重写答案

CUB200项目中遇到的问题与解决方法

主要问题是欠拟合。

解决欠拟合的方法: 1. 增加模型复杂度,加深加宽换架构 2. 增加训练时间 3. 减少正则化,降低正则化系数 4. 特征工程:提升数据质量和丰富度每增加有意义的特征,通过数据转换提取更有代表性的特征。使用一些特征提取方法,比如PCA等 5. (不确定)使用更好的优化算法,如 Adan RMSprop 等等 6. (不确定)减少噪声或者平滑数据

解决过拟合的方法: 1. 增加数据量,一般采用数据增广的方式 2. 使用正则化: 1. L1/L2正则化 2. Dropout随机丢弃神经元 3. 权重衰减(Weight Decay)在优化器中对权重加惩罚项减少模型复杂度的一种正则化方法 3. 简化模型架构 4. 早停法,验证集的误差开始上升时,使用早停 5. 使用K-Fold评估模型的泛化能力 6. 数据归一化和标准化,比如BN层 7. 添加噪声,或采用模型攻击的方式 8. 减小学习率以解决发散问题。

两类问题,基本上都可以通过更好地特征工程、合理的模型架构、数据处理解决。

注意,模型攻击一般不是解决过拟合的方法,但是如果将攻击的数据加入到训练集中,是可以的。也就是对抗训练,将对抗样本加入到训练集中,使得模型在标准样本上表现良好,也能在对抗样本上表现稳健。

PGD 的计算方法

PGD 攻击是 FGSM(Fast Gradient Sign Method)的扩展,FGSM 是一种一次性基于梯度的对抗攻击,而 PGD 则通过多次迭代更新对抗样本来增强攻击效果。

  1. 确认损失函数
  2. 初始化对抗样本
  3. 迭代更新样本

\[ x^{(k+1)}=\mathrm{Proj}_{\mathcal{B}_\epsilon(x_0)}\left(x^{(k)}+\alpha\cdot\mathrm{sign}\left(\nabla_xL(\theta,x^{(k)},y)\right)\right) \]

其中:

  • \(x^{(k)}\) 是第\(k\) 次迭代的对抗样本

  • \(\alpha\) 是每次迭代的步长,决定更新的幅度

  • \(\nabla_xL\) 是损失函数 对 输入\(x\) 的梯度

  • \(\mathrm{sign}\) 表示符号函数,取梯度的符号

  • \(\mathrm{Proj_{\mathcal{B}_\epsilon }}_{(x_0)}(x^{(k))}\) 表示将更新后的样本重新投影到以 \(x_0\) 为中心,半径为 \(\epsilon\) 的 \(L_\infty\) 范围内,即: \[ \mathrm{Proj}_{\mathcal{B}_\epsilon(x_0)}(x^{(k)})=\min\left(\max(x^{(k)},x_0-\epsilon),x_0+\epsilon\right) \] 这个投影操作限制了对抗样本的扰动在合法的范围内,不会超过 \(\epsilon\) 限制,即最大扰动限制

  • 一般来讲,\(K,\alpha,\epsilon\) 是关键参数。

解决过拟合的方法

这个在面经二中说过啦。(对的我是后续才整理的

DiffuPPS 的细节

这里暂时不能公开。

主要问了,如何将 DM 应用到这个任务上,如何构造训练数据对。

FixMatch 原理

详见 半监督学习-分类

Transformer 的计算方法

Transformer模型详解(图解最完整版)-CSDN博客 参考

从每一个计算细节了解 transformer_transformer loss函数-CSDN博客 参考

我忘记了 \(\div \sqrt{d_k} 和 softmax\) 部分。之后有空详细整理一下。以前觉得,这玩意儿会用就行。。

BN 层的计算方法,参数量,在训练与推理的不同

计算方法

假设输入到 BN 层的数据维度是 \(X\in\mathbb{R}^{N\times C\times H\times W}\)

  1. 计算每个通道的均值与方差 \[ \mu_{c}=\frac1{N\times H\times W}\sum_{i=1}^N\sum_{h=1}^H\sum_{w=1}^WX_{i,c,h,w}\\\sigma_{c}^{2}=\frac1{N\times H\times W}\sum_{i=1}^N\sum_{h=1}^H\sum_{w=1}^W(X_{i,c,h,w}-\mu_c)^2 \]

  2. 标准化 \[ \hat{X}_{i,c,h,w}=\frac{X_{i,c,h,w}-\mu_c}{\sqrt{\sigma_c^2+\epsilon}} \] 其中,\(\epsilon\) 是一个小正数,防止处以0

  3. 缩放与平移 \[ Y_{i,c,h,w}=\gamma_c\hat{X}_{i,c,h,w}+\beta_c \] 其中,\(\gamma _c\) 与 \(\beta _c\) 是每个通道独立的,每个通道各自有两个的,可以学习的参数。

BN 层的参数量

BN层中有两个主要的可学习参数:缩放系数 \(\gamma\) 和 偏移量 \(\beta\)。它们的数量和通道数 \(C\)一致,因为每个通道有一个 \(\gamma_c\) 和一个 \(\beta_c\)。

因此,总参数量是: \(2*C\),其中 \(C\) 表示输入通道数。

BN层在训练与推理阶段的不同

这个我记错了,记成了 Dropout 在两个阶段的不同。

1. Batch Normalization (BN)

训练阶段:
  • 均值和方差计算:在训练阶段,BN层使用当前批次的均值和方差来标准化输入。也就是说,BN层根据当前小批量数据计算出每个通道的均值 μ和方差 σ2^2σ2,并使用这些统计量进行标准化。

  • 移动平均:为了在推理阶段使用,BN层在训练过程中对每个批次的均值和方差进行指数加权移动平均,逐步估计全局均值和方差。这些全局统计量将在推理阶段使用。

  • 标准化与学习:在训练中,输入会被标准化为零均值和单位方差,然后再应用可学习的缩放系数 γ和偏移量 β,即: \[ \hat{X}=\frac{X-\mu}{\sqrt{\sigma^2+\epsilon}},\quad Y=\gamma\hat{X}+\beta \]

推理阶段:
  • 固定的均值和方差:在推理阶段,BN层使用训练时估计得到的全局均值和方差(而不是当前输入批次的统计量),来进行标准化。这确保了模型在推理时具有确定性和一致性。
  • 缩放和平移:推理阶段依然使用训练时学到的缩放系数 \(\gamma\) 和偏移量 \(\beta\),对标准化后的数据进行线性变换,但不更新这些参数。

总结:BN在训练时动态计算均值和方差并更新移动平均值,而推理时使用固定的全局统计量进行标准化。


2. Dropout

训练阶段:
  • 随机丢弃神经元:在训练阶段,Dropout通过以一定的概率(如 0.5)随机丢弃神经元,即将它们的激活值置为0。被丢弃的神经元不参与当前批次的前向传播和反向传播。
  • 缩放激活值:为了保持输出的一致性,在训练中,未被丢弃的神经元的激活值会被按丢弃率的倒数进行缩放。例如,如果丢弃率是 0.5,未被丢弃的神经元输出会被除以 0.5(即乘以2),以弥补丢弃神经元带来的激活减少。
推理阶段:
  • 所有神经元都工作:在推理阶段,Dropout 被关闭,所有的神经元都参与前向传播,不再有任何神经元被丢弃。
  • 不进行缩放:推理时,神经元的输出值不再被缩放,因为在训练时已经通过丢弃神经元和缩放保持了输出值的期望一致性。

总结:在训练时,Dropout随机丢弃一部分神经元来防止过拟合;在推理时,Dropout被关闭,所有神经元正常工作。


3. BN层与Dropout的训练和推理阶段对比总结:

特性 训练阶段 推理阶段
BN层 1. 使用小批次的均值和方差进行标准化
2. 更新全局均值和方差
1. 使用全局均值和方差进行标准化
2. 固定缩放参数 \(\gamma\) 和 \(\beta\)
Dropout 1. 以一定概率随机丢弃神经元
2. 对未丢弃神经元进行缩放
1. 不丢弃任何神经元
2. 不进行缩放处理

这两者的不同使得 BN 主要作用于加速收敛、提高稳定性,而 Dropout 则主要用于防止过拟合。

注意,BN 层与 Dropout 共同使用可能导致不好的结果。参考:BN和Dropout在训练和测试时的差别 - 知乎