Seesaw Loss:长尾实例分割中的平衡损失.
Seesaw Loss是通过调整不同类别上的正负样本梯度的平衡来提高模型在长尾分布上的性能。给定一个tail类别和一个相对更加高频的类别,高频类施加在tail类上的负样本梯度将根据两个类别在训练过程中累计样本数的比值进行减弱;同时为了避免因负样本梯度减弱而增加的误分类的风险,根据每个样本是否被误分类动态地补充负样本梯度。
Softmax函数下的Seesaw Loss的数学表达式如下:
\[\mathcal{L}_{\text{SS}}(\hat{y},y) = - \sum_{i=1}^{C} y_ilog(\hat{p}_{i}) \\ \hat{p}_{i} = \frac{e^{z_i}}{\sum_{j≠i}^{C} \mathcal{S}_{ij} e^{z_j} + e^{z_i}}\]对于第$i$类样本,施加在第$j$类样本上的负样本梯度为:
\[\frac{\partial \mathcal{L}_{\text{SS}}}{\partial z_j} = - \frac{1}{\hat{p}_{i}} \frac{\partial \hat{p}_{i}}{\partial z_j} = - \frac{1}{\hat{p}_{i}} (-\frac{e^{z_i}}{(\sum_{j≠i}^{C} \mathcal{S}_{ij} e^{z_j} + e^{z_i})^2} \mathcal{S}_{ij} e^{z_j}) \\ = \frac{1}{\hat{p}_{i}} \frac{\hat{p}_{i}^2}{e^{z_i}} \mathcal{S}_{ij} e^{z_j} = \mathcal{S}_{ij} \frac{e^{z_j}}{e^{z_i}} \hat{p}_{i}\]平衡系数\(\mathcal{S}_{ij}\)可以放大或缩小第$i$类样本施加在第$j$类样本上的负样本梯度,通过选择合适的\(\mathcal{S}_{ij}\)可以达到平衡正负样本梯度的目的。
平衡系数\(\mathcal{S}_{ij}\)的选择需要考虑两个方面。
- 需要考虑类别间样本分布的关系,减少head类别对tail类别的惩罚,引入缓解因子(mitigation factor)$\mathcal{M}_{ij}$用来缓解tail类别上过量的负样本梯度;
- 减少对tail类别的惩罚会增加误分类的风险,对于训练过程中误分类的样本需要保证其受到足够的惩罚,引入补偿因子(compensation factor)$\mathcal{C}_{ij}$用来补偿误分类样本上的惩罚。
平衡系数\(\mathcal{S}_{ij}\)计算如下:
\[\mathcal{S}_{ij} = \mathcal{M}_{ij} \cdot \mathcal{C}_{ij}\]缓解因子 $\mathcal{M}_{ij}$
正负样本梯度不平衡的问题主要来源于样本数量的不平衡,则可以根据不同类别之间的样本数量的相对比例进行调节。统计每一类的累计训练样本数量$N_i$,则\(\mathcal{M}_{ij}\)计算为:
\[\mathcal{M}_{ij} = \begin{cases} 1, \quad \text{if }N_i ≤ N_j \\ (\frac{N_j}{N_i})^p, \quad \text{if }N_i > N_j \end{cases}\]当第$i$类样本比第$j$类样本出现频率更高时,根据两类样本之间不平衡的程度来减少第$i$类样本比第$j$类样本施加的负样本梯度。样本数量是在线累计的,而不是使用预先统计的数据集样本分布,这是因为一些采样方法会改变数据集的分布,此时预先统计无法反映训练过程中数据的真实分布。
补偿因子 $\mathcal{C}_{ij}$
为了防止过度减少负样本梯度而带来的误分类,需要增加误分类样本的惩罚。如果一个第$i$类的样本被错误分类为第$j$类样本,则根据两类之间的分类置信度的相对比值来适当增加对第$j$类的惩罚:
\[\mathcal{C}_{ij} = \begin{cases} 1, \quad \text{if } \hat{p}_{i} > \hat{p}_{j} \\ (\frac{\hat{p}_{j}}{\hat{p}_{i}})^q, \quad \text{if } \hat{p}_{i} ≤ \hat{p}_{j} \end{cases}\]