蚂蚁金服-信贷部门
一、为什么使用 Layer Normalization 而不是 Batch Normalization?
1.1. Batch Normalization (BN) 的局限性
Batch Normalization(BN)是一种常用的归一化方法,它在 批次维度(batch) 上进行归一化,计算 均值和方差 来调整激活值。但 BN 存在以下问题:
(1) 依赖 Batch Size
- BN 需要在 每个 mini-batch 内计算均值和方差,如果 batch size 过小,均值和方差估计不稳定,影响模型效果。
- 在 NLP、强化学习、推荐系统等小 batch 任务 中,BN 可能表现不佳。
(2) 不能处理变长序列
- 在 NLP 任务中,输入序列长度通常不同,BN 在处理变长序列时不太合适,而 Layer Norm 不受 batch 维度影响。
(3) 不能应用于 Online Learning
- BN 在训练时计算 batch 统计量(均值和方差),但在推理时使用 滑动平均值,这导致在 在线学习(Online Learning)和 Reinforcement Learning 中 BN 无法有效工作。
1.2. Layer Normalization (LN) 的优势
Layer Normalization(LN)在 特征维度(而不是 batch 维度)上进行归一化,计算每个样本自己的均值和方差,具有以下优点:
(1) 适用于小 Batch 甚至单样本
- LN 在特征维度上归一化,不依赖 batch size,适用于 小 batch 或 batch size = 1 的任务,如 NLP 和 RL。
(2) 适用于序列模型(如 Transformer)
- 在 NLP 任务中,LN 适用于 变长序列,可应用于 Transformer、BERT 等模型。
(3) 适用于 Online Learning
- LN 仅依赖单个样本 的均值和方差,因此可以用于 在线学习、强化学习等任务。
(4) 对内部协变量偏移(Internal Covariate Shift)有更好的鲁棒性
- LN 在 特征维度 归一化,可以 降低模型对输入变化的敏感性,加速训练收敛。
1.3. Layer Norm vs Batch Norm
归一化方式 | Batch Norm (BN) | Layer Norm (LN) |
---|---|---|
归一化维度 | 在 batch 维度 归一化 | 在 特征维度 归一化 |
依赖 batch size | 是,batch size 过小时 BN 可能失效 | 否,适用于小 batch 或单样本 |
适用于序列数据 | 不适合(batch 维度归一化) | 适合(特征维度归一化) |
计算方式 | 在 batch 内计算均值和方差 | 在样本内计算均值和方差 |
二、 写一下focal loss
2.1. 什么是 Focal Loss?
Focal Loss 是一种 改进的交叉熵损失函数,用于解决 类别不均衡 和 难易样本不均衡 的问题。它在目标检测任务(如 RetinaNet)中被广泛使用。
2.2. Focal Loss 公式
Focal Loss 定义如下:
F
L
(
p
t
)
=
−
α
t
(
1
−
p
t
)
γ
log
(
p
t
)
FL(p_t) = - \alpha_t (1 - p_t)^\gamma \log(p_t)
FL(pt)=−αt(1−pt)γlog(pt)
其中:
- p t p_t pt 表示预测概率(对正类, p t = p p_t = p pt=p;对负类, p t = 1 − p p_t = 1 - p pt=1−p)。
- α \alpha α: 用于处理类别不均衡,控制正负样本的权重(一般设为 0.25)。
- γ \gamma γ: 调整易分类样本的损失贡献(一般设为 2.0)。
- ( 1 − p t ) γ (1 - p_t)^\gamma (1−pt)γ: 使得 难分类样本的损失较大,易分类样本的损失较小。
2.3. Focal Loss 作用
✅ 解决类别不均衡:调整 α 控制正负样本损失权重。
✅ 聚焦难分类样本:γ 让易分类样本的损失更小,避免其主导梯度更新。
✅ 适用于目标检测:在 One-Stage 目标检测(如 RetinaNet) 中效果优越。
2.4. 代码实现
代码实现见上方 Python 代码块,支持 二分类任务,可以扩展至 多分类任务(使用 softmax)。
import torch
import torch.nn as nn
import torch.nn.functional as F
class FocalLoss(nn.Module):
def __init__(self, alpha=0.25, gamma=2.0, reduction='mean'):
"""
Focal Loss 实现
:param alpha: 平衡因子,用于处理类别不均衡
:param gamma: 调整因子,控制容易分类样本的损失降低幅度
:param reduction: 'none', 'mean', 'sum',指定如何聚合损失
"""
super(FocalLoss, self).__init__()
self.alpha = alpha
self.gamma = gamma
self.reduction = reduction
def forward(self, inputs, targets):
"""
计算 Focal Loss
:param inputs: 预测概率 (logits 需经过 sigmoid 或 softmax 处理)
:param targets: 真实标签 (one-hot 编码或单标签)
:return: 计算后的 Focal Loss
"""
BCE_loss = F.binary_cross_entropy(inputs, targets, reduction='none') # 计算 BCE Loss
p_t = targets * inputs + (1 - targets) * (1 - inputs) # 计算 p_t
focal_weight = self.alpha * targets + (1 - self.alpha) * (1 - targets) # 计算 alpha 平衡因子
focal_weight *= (1 - p_t) ** self.gamma # 计算 (1 - p_t)^gamma
loss = focal_weight * BCE_loss # 计算 Focal Loss
if self.reduction == 'mean':
return loss.mean()
elif self.reduction == 'sum':
return loss.sum()
return loss # reduction='none' 时返回逐元素损失
三、MMOE 是硬约束还是软约束?
MMOE(Multi-gate Mixture-of-Experts,多门专家混合)是一种用于多任务学习(Multi-Task Learning, MTL)的模型架构,其主要特点是通过多个专家网络(Experts)和多个门控网络(Gates)来进行任务分配和共享特征。其门控机制(Gating Mechanism) 采用的是软约束(Soft Constraint),而不是硬约束。
3.1. 任务共享方式
MMOE 通过多个专家共享特征,并由门控网络根据任务动态分配权重。它不像硬共享(Hard Sharing)方法那样强制所有任务使用相同的底层特征,而是让门控网络自适应地决定不同任务的特征使用方式。因此,MMOE 更接近软约束(Soft Constraint),因为任务之间的共享是动态调整的,而不是强制共享的。
3.2 与硬约束的对比
- 硬约束:任务必须严格共享特定的参数或结构,例如硬共享 MTL(Hard Parameter Sharing),其中所有任务共享同一个主干网络。
- 软约束:任务可以根据需要动态调整共享程度,例如 MMOE 允许不同任务以不同的方式利用专家网络的输出,而不是固定的共享方式。