目录

备战深度学习算法工程师

题目来自B站视频,针对p1和p2的大部分面试题,结合ChatGPT进行解析和记录。

如何解决正负样本不均衡?

样本不均衡是指在分类问题中,不同类别的样本数量差异较大,这会导致模型偏向于数量较多的类别。 常见的解决方法包括:

  1. 采样,对样本进行过采样或欠采样,如对少数类进行重复采样,或对多数类进行随机删除。
  2. 加权损失函数,在损失函数中对少数类样本赋予更高的权重,以平衡不同类别的影响,如focal loss。
  3. 数据增强,对少数类样本进行数据增强,如旋转、平移、缩放等操作,增加样本数量。
  4. 评价指标,使用适合不均衡数据集的评价指标,如F1-score、AUC等,而不是简单的准确率。

评价指标

混淆矩阵:TP、TN、FP、FN,其中T和F分别表示真和假,是对预测结果的评价,P和N分别表示正和负/阳和阴,表示预测结果。如TP为真正例,表示预测为正,预测正确,实际上也为正;FN为假负例,预测为负,预测错误,实际上是正。特别提醒,一般情况下认为,FP是误报,FN是漏检。
准确性 $Accuracy = \frac{TP+TN}{TP+TN+FP+FN}$,反映预测正确所占的比例。
精确率 $Precision = \frac{TP}{TP+FP}$,反映预测为正的样本中,实际为正的比例。
召回率 $Recall = \frac{TP}{TP+FN}$,反映模型对实际为正类的样本识别的准确性。
F1-score $F1 = \frac{2 \cdot Precision \cdot Recall}{Precision + Recall}$,综合考虑精确率和召回率的指标。
ROC曲线:以假正率为横坐标,真正率为纵坐标,曲线下面积AUC表示模型的分类能力。
PR曲线:以精确率为横坐标,召回率为纵坐标,曲线下面积AP表示模型的分类能力,适用于极度不均衡的数据。

损失函数

MAE和MSE

平均绝对误差,MAE,表示预测值与真实值之间的绝对差的平均值,不易被极端值影响,适用于异常值较多的情况。
绝对误差,对大误差更敏感,适用于需要关注大误差的任务,如金融、医疗预测。

l1 loss、l2 loss和smooth l1 loss

实际上,l1 loss、l2 loss分别是MAE和MSE的另一种表示方式,相比之下少了个平均。
smooth l1 loss是l1 loss和l2 loss的结合,误差小时使用l2 loss,避免梯度不稳定;误差大时使用l1 loss,避免异常值的影响。
$$ L_{smooth} = \begin{cases} \frac{1}{2}x^2 & \text{if } |x| < 1 \ |x| - \frac{1}{2} & \text{otherwise} \end{cases} $$

focal loss

传统交叉熵损失函数在处理正负样本不均衡时,容易导致模型对多数类样本的过拟合,而忽略少数类样本。 $$ CE(p_t) = -\log(p_t) $$ focal loss通过引入调节因子$\gamma$,使得模型在训练时更加关注难分类的样本,从而提高模型对少数类样本的识别能力。 $$ FL(p_t) = -\alpha_t(1-p_t)^\gamma \log(p_t) $$ 其中,$p_t$为预测概率,$\alpha_t$为平衡因子,用于调整正负样本的重要性,适用于不均衡数据集,$\gamma$为调节因子,控制难易样本的影响程度,样本容易分类时,$FL$的值会减小,反之则增大。

卷积的特点

  1. 局部连接,卷积核只与输入数据的局部区域进行计算,减少了参数数量,提高了计算效率。
  2. 权值共享,卷积核在输入数据的不同位置共享相同的权值,减少了模型的复杂度,提高了模型的泛化能力。
  3. 下采样,通过步长和池化操作,减少了输入数据的尺寸,提高了计算效率。
  4. 平移不变性,卷积操作对输入数据的平移具有不变性,即输入数据的平移不会影响卷积结果,增强了模型对输入数据的鲁棒性。

关于计算

参数量和计算量

需要注意的是,参数量和计算量不是一回事,参数指模型中可训练的参数总数,通常指权重和偏置,它决定了模型的大小;计算量指在推理或训练时所需的计算量,通常指乘法和加法的次数,决定了模型的运行速度。
用卷积层举例,参数量=每个卷积核的参数$\times$卷积核的数量;计算量=每个像素点的计算量$\times$输出特征图的大小。
假设有一个3x3的卷积核,输入通道为64,输出通道为128,输入特征图大小为224x224,步长为1,无填充,输出特征图大小仍为224x224。
参数量=(3x3x64+1)x128=73792
计算量=2x(3x3x64)x224x224x128=7.4G

卷积和池化后的patch计算

再来说一下,经过卷积层后的patch计算。
假设输入大小为$H_{in} \times W_{in}$,卷积核大小为$K_h \times K_w$,步长为$S$,填充为$P$,输出大小为$H_{out} \times W_{out}$。卷积输出大小计算公式如下: $$ H_{out} = \frac{H_{in} - K_h + 2P}{S} + 1 \ W_{out} = \frac{W_{in} - K_w + 2P}{S} + 1 $$ 假设池化窗口大小为$K_h \times K_w$,步长为$S$,池化输出大小计算公式如下: $$ H_{out} = \frac{H_{in} - K_h}{S} + 1 \ W_{out} = \frac{W_{in} - K_w}{S} + 1 $$

感受野的计算

感受野是指卷积神经网络中某一层的神经元所能感知到的输入数据的区域大小。感受野越大,模型对输入数据的上下文信息捕捉能力越强。感受野的计算公式如下:
$$R_{out} = R_{in} + (K - 1) \times \prod_{i=1}^{j-1} S_i$$ 其中,$R_{out}$为输出层的感受野,$R_{in}$为输入层的感受野,$K$为卷积核大小,$S_i$为步长,$j$为前几层的层数。

BN

批量归一化(Batch Normalization)是一种加速深度神经网络训练的技术,通过对每一层的输入进行标准化,使其均值为0,方差为1,从而加快收敛速度,减小对初始化的依赖。

  1. 在batch维度上计算均值和方差,进行标准化。
  2. 通过可学习的参数$\gamma$和$\beta$进行缩放和平移,恢复模型的表达能力。
  3. 在推理阶段,使用整个训练集的均值和方差进行标准化,避免了batch size对模型性能的影响。 BN通常用在激活函数之前,避免了激活函数的非线性影响。

BN层的参数量为$2 \times C$,其中$C$为通道数。

训练时为什么要分batch

  1. 内存限制,一次性处理整个数据集可能会导致内存不足,分batch可以有效利用内存。
  2. 随机性,分batch可以引入随机性,增加模型的泛化能力,避免过拟合。
  3. 并行计算,分batch可以利用GPU的并行计算能力,提高训练速度。
  4. 内部协方差偏移,分batch可以减少内部协方差偏移,提高模型的收敛速度。

优缺点

优点:

  1. 使网络对初始化不敏感。
  2. 均值和方差引入了一定的噪声类似dropout,具有一定的正则化效果,减少过拟合。
  3. 解决梯度消失和梯度爆炸问题,训练更稳定。
  4. 减少内部协方差偏移,加快收敛速度。 缺点:
  5. BN对batch size敏感,batch size过小会导致均值和方差不稳定,影响模型性能。
  6. 额外的计算开销,增加了训练时间和内存消耗。

优化器

通过梯度下降法及其变种,利用反向传播计算出梯度来更新网络的参数。
SGD:随机梯度下降,计算每个样本的梯度,更新参数。震荡,收敛慢;容易陷入局部最优。
Momentum:在SGD的基础上,引入动量项,考虑历史梯度,减少震荡,加快收敛速度。仍可能陷入局部最优。
AdaGrad:自适应学习率,针对每个参数计算不同的学习率,适用于稀疏数据。学习率会逐渐减小,可能导致收敛过慢。
RMSProp:对AdaGrad的改进,使用指数衰减平均来计算学习率,避免学习率过小的问题。适用于非平稳目标。依赖于超参数的选择。
Adam:结合了Momentum和RMSProp的优点,使用动量和自适应学习率,适用于大规模数据和高维参数。计算复杂度较高,依赖于超参数的选择。其中,一阶矩(期望)用于平滑梯度更新方向,加速收敛;二阶矩(方差)用于自适应学习率,避免震荡。

激活函数

激活函数用于引入非线性特性,使得神经网络能够学习复杂的函数映射关系。
sigmoid函数:$f(x) = \frac{1}{1 + e^{-x}}$,输出范围在(0, 1),适用于二分类问题。在极端值处容易导致梯度消失;输出范围均值不为0,影响梯度流动;计算涉及指数,计算成本高。
tanh函数:$f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$,输出范围在(-1, 1),适用于二分类问题。零均值梯度流动更稳定;梯度消失仍存在;计算涉及指数,计算成本高。
ReLU函数:$f(x) = \max(0, x)$,输出范围在[0, +∞)。计算简单,收敛速度快;负半轴梯度为0,可能导致神经元死亡;不能用于rnn等依赖梯度流动的网络,可能导致梯度爆炸。
Leaky ReLU函数:$f(x) = \max(\alpha x, x)$.解决了ReLU的神经元死亡问题;计算简单,收敛速度快;仍然存在梯度爆炸问题。
softmax函数:$f(x) = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}}$,用于多分类问题,输出范围在(0, 1),且和为1。计算涉及指数,计算成本高;对异常值敏感,可能导致梯度爆炸。

均值为0的影响

  1. 非线形特性,在接近0处有更大的梯度,避免了梯度消失问题。
  2. 梯度传播中的偏移,可能导致梯度爆炸或消失,影响模型的收敛速度。

解决方案:

  1. 使用ReLU等激活函数代替sigmoid和tanh。
  2. 使用BN层进行标准化,保持均值为0,方差为1。

强化学习ppo

PPO是一种更新策略的方法。
ppo的损失分为三部分:

  1. 策略损失,使用当前策略和旧策略的比值来计算重要性采样权重,然后通过clip函数限制比值的范围,从而确定策略损失;
  2. 值函数损失,使用值网络估计状态的价值,通过均方误差计算损失;
  3. 熵损失,动作越不确定熵值越大,增加策略的随机性,避免过拟合。 对于一批数据重复多次更新参数。

batch size对训练的影响

小,训练时间长,梯度变化大,导致参数更新方向不稳定,但有助于跳出局部最优解,泛化能力更强。 可以通过提高学习率或GroupNorm来缓解。 大,梯度平滑,训练稳定,需要更多显存。可以通过降低学习率或分批进行反向传播缓解。

非极大值抑制NMS

主要用于目标检测中,去除重叠度较高的候选框。
对于检测器可能输出的多个重叠框(IOU很高),NMS通过置信度排序+IOU阈值抑制低质量框,达到保留最优框的效果。

  1. 选择置信度最高的框作为基准框。
  2. 计算基准框与其他框的IOU,去除IOU大于设定阈值的框。
  3. 重复步骤1和2,直到处理完所有框。

高效去重,计算简单;若多个目标位置相近,容易误删;所有框统一处理,不能按照不能类别处理。

改进

Soft-NMS:不直接删除重叠框,而是根据IOU值调整置信度,保留重叠框,降低置信度。
Multi-Class NMS:针对多类别目标检测,分别计算每个类别的NMS,避免误删其他类别的框。

过拟合

过拟合是指模型在训练集上表现良好,但在测试集上表现不佳,泛化能力差。解决方法如下:

  1. 数据增强,通过旋转、平移、缩放等方式增加训练数据的多样性。
  2. 正则化,如L1、L2正则化,限制模型参数的大小,防止过拟合。
  3. Dropout,在训练过程中随机丢弃一部分神经元,减少模型的复杂度。
  4. 早停法,在验证集上监控模型性能,当性能不再提升时停止训练。
  5. 交叉验证,将数据集划分为多个子集,轮流使用其中一个子集作为验证集,其余作为训练集,评估模型的泛化能力。

其中L1正则会促使一些权重变为0,使得模型稀疏化,适用于特征选择和高纬数据场景;L2正则会促使权重变小,使训练更稳定,适用于深度神经网络或回归任务。
Elastic Net结合了L1和L2正则化的优点,适用于高维数据和特征选择。