文章目录
- 一、前言
- [二、 InfoGCN++](#二、 InfoGCN++)
- [V. INFOGCN++](#V. INFOGCN++)
-
- [E. 特定任务解码器](#E. 特定任务解码器)
-
- 【公式含义】:
- 【符号解释】:
- 【公式解释】:
- 【总结】:
- [**InfoGCN++ 分类损失 ( L cls \mathcal{L}{\text{cls}} Lcls) 的设计者视角解析**](#**InfoGCN++ 分类损失 ( L cls \mathcal{L}{\text{cls}} Lcls) 的设计者视角解析**)
-
- [**1. 设计动机:为什么需要这个损失函数?**](#1. 设计动机:为什么需要这个损失函数?)
- [**2. 核心设计元素拆解 (公式: L cls = − 1 T C ∑ t = 1 T ∑ c = 1 C y [ c ] log ( y ^ t [ c ] ) \mathcal{L}{\text{cls}} = -\frac{1}{TC} \sum{t=1}^{T} \sum_{c=1}^{C} \mathbf{y}[c] \log(\hat{\mathbf{y}}t[c]) Lcls=−TC1∑t=1T∑c=1Cy[c]log(y^t[c]) )**](#**2. 核心设计元素拆解 (公式: L cls = − 1 T C ∑ t = 1 T ∑ c = 1 C y [ c ] log ( y ^ t [ c ] ) \mathcal{L}{\text{cls}} = -\frac{1}{TC} \sum_{t=1}^{T} \sum_{c=1}^{C} \mathbf{y}[c] \log(\hat{\mathbf{y}}_t[c]) Lcls=−TC1∑t=1T∑c=1Cy[c]log(y^t[c]) )**)
- [**3. 在 InfoGCN++ 中的战略作用**](#3. 在 InfoGCN++ 中的战略作用)
- [**4. 潜在的权衡与未来方向**](#4. 潜在的权衡与未来方向)
- 问题1
-
- [**InfoGCN++ 中采用标签平滑的含义与解析**](#InfoGCN++ 中采用标签平滑的含义与解析)
-
- [**1. 设计动机:为什么要使用标签平滑?(The "Why")**](#1. 设计动机:为什么要使用标签平滑?(The "Why"))
- [**2. 工作机制:标签平滑是如何工作的?(The "How")**](#2. 工作机制:标签平滑是如何工作的?(The "How"))
- [**3. 在 InfoGCN++ 中的应用与益处**](#3. 在 InfoGCN++ 中的应用与益处)
- **总结**
- [F. 训练](#F. 训练)
一、前言
仅供参考,未经实验验证
二、 InfoGCN++
InfoGCN++: Learning Representation by Predicting the Future for Online Human Skeleton-based Action Recognition
论文地址:https://arxiv.org/pdf/2310.10547
Github地址:https://github.com/stnoah1/infogcn2
V. INFOGCN++
E. 特定任务解码器
- 动作分类解码器:通过分类任务,预测的表示嵌入了用于对动作进行分类的信息。分类头由两个 SA-GC 层、一个线性层、空间平均池化以及将 logits 转换为类别分布的 SoftMax 函数组成,如图 3(b) 所示。我们将预测得到的多个表示拼接起来,作为分类头的输入。
y ^ t = C l a s s H e a d ( Z ^ t : t + N ( t ) ) . \hat { \mathbf { y } } _ { t } = \mathrm { C l a s s H e a d } ( \hat { \mathbf { Z } } _ { t : t + N } ^{( t )} ) . y^t=ClassHead(Z^t:t+N(t)).
分类损失使用交叉熵定义:
L c l s = − 1 T C ∑ t = 1 T ∑ c = 1 C y [ c ] log ( [ y ^ t [ c ] ) , \mathcal { L } _ { \mathrm { c l s } } = - \frac { 1 } { T C } \sum _ { t = 1 } ^{T} \sum _ { c = 1 } ^{C} \mathbf { y } [ c ] \log ( [ \hat { \mathbf { y } } _ { t } [ c ] ) , Lcls=−TC1t=1∑Tc=1∑Cy[c]log([y^t[c]),
其中 C C C 是动作类别的数量, y \mathbf{y} y 是一个独热编码的真实标签向量。为了提高泛化能力,我们进一步采用了标签平滑 [44],其值为 0.1。
【公式含义】:
该公式定义了分类损失(Classification Loss) ,具体而言是交叉熵损失(Cross-Entropy Loss) ,用于衡量模型在每个时间步预测的动作类别概率分布与真实动作类别之间的差异。其核心目的是量化模型分类预测的准确性,并作为训练过程中的优化目标,引导模型学习正确的动作识别能力。
【符号解释】:
- L cls \mathcal{L}_{\text{cls}} Lcls:分类损失。这是模型在动作识别任务上的误差度量。
- T T T:序列中的总时间步数或帧数,即观测到的动作序列的长度。
- C C C:总的动作类别数量。
- y \mathbf{y} y:真实的(Ground Truth)动作类别,通常表示为一个One-Hot编码向量。
- y [ c ] \mathbf{y}[c] y[c]:向量 y \mathbf{y} y 的第 c c c 个元素。如果真实的动作类别是 c c c,则 y [ c ] = 1 \mathbf{y}[c]=1 y[c]=1;否则 y [ c ] = 0 \mathbf{y}[c]=0 y[c]=0。
- y ^ t \hat{\mathbf{y}}_t y^t:在时间步 t t t 模型预测的动作类别概率分布。这是通过
ClassDecoder(分类头)处理后,经过 SoftMax 函数得到的输出,表示模型对每个类别的置信度。 - y ^ t [ c ] \hat{\mathbf{y}}_t[c] y^t[c]:在时间步 t t t,模型预测的动作类别为 c c c 的概率。
- log \log log:自然对数函数。
- ∑ t = 1 T \sum_{t=1}^{T} ∑t=1T:对所有时间步 t t t(从 1 1 1 到 T T T)求和。
- ∑ c = 1 C \sum_{c=1}^{C} ∑c=1C:对所有动作类别 c c c(从 1 1 1 到 C C C)求和。
- − 1 T C -\frac{1}{TC} −TC1:用于对总损失进行平均的归一化因子。
【公式解释】:
这个公式是交叉熵损失函数 的变体,专门用于多类别分类问题,并在此论文中应用于每个时间步的在线动作识别。理解此公式需要以下背景知识:
背景知识:交叉熵损失
交叉熵损失是衡量两个概率分布之间差异的常用方法。在分类任务中,它衡量模型预测的类别概率分布与真实类别(通常表示为One-Hot编码)之间的"距离"。对于一个样本和 C C C 个类别,如果真实类别是 k k k,预测的概率分布为 y ^ \hat{\mathbf{y}} y^,则其交叉熵损失通常表示为:
L = − ∑ c = 1 C y [ c ] log ( y ^ [ c ] ) \mathcal{L} = -\sum_{c=1}^{C} \mathbf{y}[c] \log(\hat{\mathbf{y}}[c]) L=−∑c=1Cy[c]log(y^[c])
其中, y [ c ] \mathbf{y}[c] y[c] 是真实标签中类别 c c c 的指示器(为1或0), y ^ [ c ] \hat{\mathbf{y}}[c] y^[c] 是模型预测类别 c c c 的概率。由于 y \mathbf{y} y 是One-Hot编码,只有真实类别 k k k 对应的 y [ k ] \mathbf{y}[k] y[k] 为1,其他为0,所以这个求和项实际上只剩下 − log ( y ^ [ k ] ) -\log(\hat{\mathbf{y}}[k]) −log(y^[k])。这意味着,模型预测的真实类别概率 y ^ [ k ] \hat{\mathbf{y}}[k] y^[k] 越小, − log ( y ^ [ k ] ) -\log(\hat{\mathbf{y}}[k]) −log(y^[k]) 越大,损失就越大,反之亦然。我们的目标是最小化这个损失,即使 y ^ [ k ] \hat{\mathbf{y}}[k] y^[k] 尽可能接近1。
公式解释步骤:
-
内部求和 ∑ c = 1 C y [ c ] log ( y ^ t [ c ] ) \sum_{c=1}^{C} \mathbf{y}[c] \log(\hat{\mathbf{y}}_t[c]) ∑c=1Cy[c]log(y^t[c]):
- 这一部分计算的是在特定时间步 t t t 的分类损失。
- 如背景知识所述,由于 y \mathbf{y} y 是One-Hot编码向量,在某个时间步 t t t 对应的真实动作类别只有一个 c ∗ c^* c∗,那么 y [ c ∗ ] = 1 \mathbf{y}[c^*]=1 y[c∗]=1,而对于其他所有类别 c ≠ c ∗ c \neq c^* c=c∗, y [ c ] = 0 \mathbf{y}[c]=0 y[c]=0。
- 因此,这个求和项实际上简化为: − log ( y ^ t [ c ∗ ] ) -\log(\hat{\mathbf{y}}_t[c^*]) −log(y^t[c∗])。
- 这意味着,在时间步 t t t,我们只关心模型预测的真实类别 c ∗ c^* c∗ 的概率 y ^ t [ c ∗ ] \hat{\mathbf{y}}_t[c^*] y^t[c∗] 。这个概率越接近1, log ( y ^ t [ c ∗ ] ) \log(\hat{\mathbf{y}}_t[c^*]) log(y^t[c∗]) 越接近0(负值),损失就越小。反之,如果预测的真实类别概率很低,损失就会很大。
-
外部求和 ∑ t = 1 T ( ∑ c = 1 C y [ c ] log ( y ^ t [ c ] ) ) \sum_{t=1}^{T} \left( \sum_{c=1}^{C} \mathbf{y}[c] \log(\hat{\mathbf{y}}_t[c]) \right) ∑t=1T(∑c=1Cy[c]log(y^t[c])):
- 这一部分是对所有时间步 t t t 的分类损失进行累加。
- 在在线动作识别中,模型需要在每个时间步 t t t 对当前观测到的序列 X 1 : t \mathbf{X}_{1:t} X1:t 进行动作分类。因此,我们希望模型在整个动作序列的每个时间步都能给出准确的分类预测。
- 通过对所有时间步的损失求和,确保模型在动作的持续进行过程中都能保持良好的分类性能,而不仅仅是在动作结束时。
-
归一化因子 − 1 T C -\frac{1}{TC} −TC1:
- 整个求和结果前面乘以 − 1 T C -\frac{1}{TC} −TC1,是为了对总损失进行平均。
- 除以 T T T 是因为损失是对 T T T 个时间步进行了累加。
- 除以 C C C 是因为在公式中,交叉熵损失的定义通常包含对 C C C 个类别的求和(尽管由于One-Hot编码,实际上只有一个非零项)。这里的 C C C 更多是作为一种惯例或为了保持与更一般化的交叉熵形式的一致性,确保损失的量级不会随着类别数量的增加而无限制地增大。
- 负号是为了将损失值变为正数,因为 log ( 概率 ) \log(\text{概率}) log(概率) 的值在 ( 0 , 1 ] (0, 1] (0,1] 范围内是负数或0。
应用场景:
这个公式在 InfoGCN++ 模型中用于在线动作识别任务 。模型在每个时间步 t t t 接收到从起始帧到当前帧的骨骼序列 X 1 : t \mathbf{X}_{1:t} X1:t,然后通过其编码器和分类头输出一个关于动作类别的概率分布 y ^ t \hat{\mathbf{y}}_t y^t。该损失函数计算的就是每个时间步 t t t 的预测 y ^ t \hat{\mathbf{y}}_t y^t 与真实标签 y \mathbf{y} y 之间的交叉熵,并对所有时间步进行平均,以此来训练分类头和整个特征提取流程,使其能够实时、准确地识别正在进行的动作。
【总结】:
公式 (13) 定义了 InfoGCN++ 模型在训练过程中用于在线动作识别 的平均交叉熵损失。它通过计算每个时间步的预测动作类别概率与真实标签之间的差异,并对所有时间步和类别进行平均,来量化模型分类性能。最小化这个损失,将促使模型学习如何从部分观察到的骨骼序列中,在动作进行时准确地识别其类别。
我们用一个具体的例子来解释这个分类损失公式。
假设场景:
我们正在训练一个在线动作识别模型,目标是识别以下三种动作:
- 举手 (Raising Hand)
- 挥手 (Waving Hand)
- 站立 (Standing Still)
所以,我们的总类别数 C = 3 C = 3 C=3。
现在,我们观察到一个持续了 **3 个时间步(帧)**的动作序列。所以 T = 3 T = 3 T=3。
具体数据:
1. 真实标签 (Ground Truth y \mathbf{y} y):
假设这三个时间步的真实动作都是 "举手"。
- 类别 1: "举手"
- 类别 2: "挥手"
- 类别 3: "站立"
那么,对于每个时间步 t t t,真实标签 y \mathbf{y} y 都是 [1, 0, 0] (表示类别1 "举手" 是真实的)。
2. 模型预测概率 ( y ^ t \hat{\mathbf{y}}_t y^t):
假设模型在每个时间步 t t t 预测的类别概率分布如下:
- 时间步 t = 1 t=1 t=1 (刚开始举手):
- y ^ 1 = [ 0.6 , 0.2 , 0.2 ] \hat{\mathbf{y}}_1 = [0.6, 0.2, 0.2] y^1=[0.6,0.2,0.2] (模型认为 60% 是"举手",20%是"挥手",20%是"站立")
- 时间步 t = 2 t=2 t=2 (举手到一半):
- y ^ 2 = [ 0.8 , 0.1 , 0.1 ] \hat{\mathbf{y}}_2 = [0.8, 0.1, 0.1] y^2=[0.8,0.1,0.1] (模型更确定是"举手",概率提高到 80%)
- 时间步 t = 3 t=3 t=3 (手已举起):
- y ^ 3 = [ 0.9 , 0.05 , 0.05 ] \hat{\mathbf{y}}_3 = [0.9, 0.05, 0.05] y^3=[0.9,0.05,0.05] (模型非常确定是"举手",概率达到 90%)
现在我们来计算 L cls \mathcal{L}_{\text{cls}} Lcls:
公式: L cls = − 1 T C ∑ t = 1 T ∑ c = 1 C y [ c ] log ( y ^ t [ c ] ) \mathcal{L}{\text{cls}} = -\frac{1}{TC} \sum{t=1}^{T} \sum_{c=1}^{C} \mathbf{y}[c] \log(\hat{\mathbf{y}}_t[c]) Lcls=−TC1∑t=1T∑c=1Cy[c]log(y^t[c])
代入 T = 3 T=3 T=3, C = 3 C=3 C=3:
L cls = − 1 3 × 3 ∑ t = 1 3 ∑ c = 1 3 y [ c ] log ( y ^ t [ c ] ) \mathcal{L}{\text{cls}} = -\frac{1}{3 \times 3} \sum{t=1}^{3} \sum_{c=1}^{3} \mathbf{y}[c] \log(\hat{\mathbf{y}}t[c]) Lcls=−3×31∑t=13∑c=13y[c]log(y^t[c])
L cls = − 1 9 ∑ t = 1 3 ( y [ 1 ] log ( y ^ t [ 1 ] ) + y [ 2 ] log ( y ^ t [ 2 ] ) + y [ 3 ] log ( y ^ t [ 3 ] ) ) \mathcal{L}{\text{cls}} = -\frac{1}{9} \sum_{t=1}^{3} \left( \mathbf{y}[1] \log(\hat{\mathbf{y}}_t[1]) + \mathbf{y}[2] \log(\hat{\mathbf{y}}_t[2]) + \mathbf{y}[3] \log(\hat{\mathbf{y}}_t[3]) \right) Lcls=−91∑t=13(y[1]log(y^t[1])+y[2]log(y^t[2])+y[3]log(y^t[3]))
因为 y \mathbf{y} y 始终是 [1, 0, 0] (即 y [ 1 ] = 1 \mathbf{y}[1]=1 y[1]=1, y [ 2 ] = 0 \mathbf{y}[2]=0 y[2]=0, y [ 3 ] = 0 \mathbf{y}[3]=0 y[3]=0),所以每个时间步的内部求和项会大大简化:
∑ c = 1 3 y [ c ] log ( y ^ t [ c ] ) = 1 × log ( y ^ t [ 1 ] ) + 0 × log ( y ^ t [ 2 ] ) + 0 × log ( y ^ t [ 3 ] ) = log ( y ^ t [ 1 ] ) \sum_{c=1}^{3} \mathbf{y}[c] \log(\hat{\mathbf{y}}_t[c]) = 1 \times \log(\hat{\mathbf{y}}_t[1]) + 0 \times \log(\hat{\mathbf{y}}_t[2]) + 0 \times \log(\hat{\mathbf{y}}_t[3]) = \log(\hat{\mathbf{y}}_t[1]) ∑c=13y[c]log(y^t[c])=1×log(y^t[1])+0×log(y^t[2])+0×log(y^t[3])=log(y^t[1])
因此,公式简化为:
L cls = − 1 9 ∑ t = 1 3 log ( y ^ t [ 1 ] ) \mathcal{L}{\text{cls}} = -\frac{1}{9} \sum{t=1}^{3} \log(\hat{\mathbf{y}}_t[1]) Lcls=−91∑t=13log(y^t[1])
分步计算:
-
时间步 t = 1 t=1 t=1 的损失贡献:
- 真实类别是"举手" (类别1),模型预测其概率 y ^ 1 [ 1 ] = 0.6 \hat{\mathbf{y}}_1[1] = 0.6 y^1[1]=0.6
- 贡献 = log ( 0.6 ) ≈ − 0.5108 \log(0.6) \approx -0.5108 log(0.6)≈−0.5108
-
时间步 t = 2 t=2 t=2 的损失贡献:
- 真实类别是"举手" (类别1),模型预测其概率 y ^ 2 [ 1 ] = 0.8 \hat{\mathbf{y}}_2[1] = 0.8 y^2[1]=0.8
- 贡献 = log ( 0.8 ) ≈ − 0.2231 \log(0.8) \approx -0.2231 log(0.8)≈−0.2231
-
时间步 t = 3 t=3 t=3 的损失贡献:
- 真实类别是"举手" (类别1),模型预测其概率 y ^ 3 [ 1 ] = 0.9 \hat{\mathbf{y}}_3[1] = 0.9 y^3[1]=0.9
- 贡献 = log ( 0.9 ) ≈ − 0.1054 \log(0.9) \approx -0.1054 log(0.9)≈−0.1054
总和与平均:
- 所有时间步的损失贡献总和 = ( − 0.5108 ) + ( − 0.2231 ) + ( − 0.1054 ) = − 0.8393 (-0.5108) + (-0.2231) + (-0.1054) = -0.8393 (−0.5108)+(−0.2231)+(−0.1054)=−0.8393
- 最后,乘以归一化因子 − 1 9 -\frac{1}{9} −91:
- L cls = − 1 9 × ( − 0.8393 ) ≈ 0.0932 \mathcal{L}_{\text{cls}} = -\frac{1}{9} \times (-0.8393) \approx 0.0932 Lcls=−91×(−0.8393)≈0.0932
结果解释:
在这个例子中,模型的分类损失 L cls ≈ 0.0932 \mathcal{L}_{\text{cls}} \approx 0.0932 Lcls≈0.0932。
- 这个数值代表了模型在整个动作序列的每个时间步上,对真实动作类别预测的平均"不确定性"或"错误程度"。
- 我们看到,随着动作的进行(从 t = 1 t=1 t=1 到 t = 3 t=3 t=3),模型对"举手"这一真实类别的预测概率从 0.6 提高到 0.9,这使得每个时间步的 − log ( y ^ t [ 1 ] ) -\log(\hat{\mathbf{y}}_t[1]) −log(y^t[1]) 值逐渐减小(即贡献的损失值越来越小)。
- 训练的目标就是不断调整模型参数,使得这个 L cls \mathcal{L}_{\text{cls}} Lcls 值尽可能小,这意味着模型在每个时间步都能更自信、更准确地预测出正确的动作类别。
好的,作为 InfoGCN++ 的设计者,我们来深入剖析分类损失 L cls \mathcal{L}_{\text{cls}} Lcls 的设计理念、考量和它在整个模型中的作用。
InfoGCN++ 分类损失 ( L cls \mathcal{L}_{\text{cls}} Lcls) 的设计者视角解析
核心目标:在动作进行时,实时且准确地识别当前动作。
当我们设计 InfoGCN++ 这样的在线动作识别模型时,分类损失函数不仅仅是一个数学公式,它更是我们对模型行为的期望 和约束的体现。
1. 设计动机:为什么需要这个损失函数?
- 在线识别的本质需求: InfoGCN++ 的核心价值在于"在线"识别,这意味着模型需要在动作序列持续进行中,基于当前已观测到的部分信息 ,就能在每个时间步 (
every single frame)给出对动作类别的预测。 - 如何衡量预测质量: 既然我们期望模型在每个时间步都做出预测,那么就需要一种机制来量化这些预测与真实情况的差异。交叉熵损失(Cross-Entropy Loss)是分类任务的标准选择,它非常适合衡量模型输出的概率分布与真实标签分布之间的差异。
- 连续性与即时性: 与传统的离线识别(看完整个视频再预测一次)或早期预测(在序列的某个固定百分比时预测一次)不同,在线识别要求模型在每一个新帧到来时都能更新其对当前动作的理解。因此,损失函数需要能够聚合所有观测时间步的预测表现。
2. 核心设计元素拆解 (公式: L cls = − 1 T C ∑ t = 1 T ∑ c = 1 C y [ c ] log ( y ^ t [ c ] ) \mathcal{L}{\text{cls}} = -\frac{1}{TC} \sum{t=1}^{T} \sum_{c=1}^{C} \mathbf{y}[c] \log(\hat{\mathbf{y}}_t[c]) Lcls=−TC1∑t=1T∑c=1Cy[c]log(y^t[c]) )
我们来逐一审视公式中的每个部分,并从设计者的角度解释其含义和选择。
-
y ^ t \hat{\mathbf{y}}_t y^t: 模型在时间步 t t t 的预测概率分布 (Output: SoftMax)
- 设计考量: 我们希望模型输出的是一个概率分布,而不是一个单一的类别标签。这样可以反映模型对不同类别的"信心"程度。SoftMax 层是实现这一目标的标准方法,它将原始分数(logits)转换为和为1的正数,可以解释为概率。
- 作用: y ^ t [ c ] \hat{\mathbf{y}}_t[c] y^t[c] 代表模型在时间 t t t 认为当前动作属于类别 c c c 的概率。
-
y \mathbf{y} y: 真实标签 (Ground Truth: One-hot encoded)
- 设计考量: 真实标签通常以**独热编码(One-hot Encoding)**的形式提供。例如,如果真实动作是"跳跃",而总共有10个类别,"跳跃"是第3个类别,那么 y \mathbf{y} y 就是
[0, 0, 1, 0, ..., 0]。 - 作用: y [ c ] \mathbf{y}[c] y[c] 在公式中起到选择器 的作用。当 y [ c ] = 1 \mathbf{y}[c]=1 y[c]=1(即类别 c c c 是真实类别)时,它才对损失有贡献;当 y [ c ] = 0 \mathbf{y}[c]=0 y[c]=0 时,该项的贡献为零。这使得损失函数只关注模型对正确类别的预测概率。
- 设计考量: 真实标签通常以**独热编码(One-hot Encoding)**的形式提供。例如,如果真实动作是"跳跃",而总共有10个类别,"跳跃"是第3个类别,那么 y \mathbf{y} y 就是
-
log ( y ^ t [ c ] ) \log(\hat{\mathbf{y}}_t[c]) log(y^t[c]): 对数似然 (Log-likelihood)
- 设计考量: 在机器学习中,最大化对数似然是一个常见的优化目标。交叉熵损失本质上就是在最小化负对数似然。
- 作用:
- 当模型对真实类别 c ∗ c^* c∗ 的预测概率 y ^ t [ c ∗ ] \hat{\mathbf{y}}_t[c^*] y^t[c∗] 接近 1 时, log ( y ^ t [ c ∗ ] ) \log(\hat{\mathbf{y}}_t[c^*]) log(y^t[c∗]) 接近 0(例如 log ( 0.99 ) ≈ − 0.01 \log(0.99) \approx -0.01 log(0.99)≈−0.01),损失贡献很小。
- 当模型对真实类别 c ∗ c^* c∗ 的预测概率 y ^ t [ c ∗ ] \hat{\mathbf{y}}_t[c^*] y^t[c∗] 接近 0 时, log ( y ^ t [ c ∗ ] ) \log(\hat{\mathbf{y}}_t[c^*]) log(y^t[c∗]) 趋向于负无穷(例如 log ( 0.01 ) ≈ − 4.6 \log(0.01) \approx -4.6 log(0.01)≈−4.6),损失贡献非常大。
- 设计哲学: 这种非线性惩罚机制鼓励模型不仅仅是"猜对",更是要"以高置信度猜对"。如果模型对真实动作的预测概率很低,会受到非常大的惩罚,从而促使模型努力提高对正确类别的信心。
-
∑ c = 1 C y [ c ] log ( y ^ t [ c ] ) \sum_{c=1}^{C} \mathbf{y}[c] \log(\hat{\mathbf{y}}_t[c]) ∑c=1Cy[c]log(y^t[c]): 单时间步的交叉熵
- 设计考量: 如前所述,由于 y \mathbf{y} y 是独热编码,这一项实际上简化为 log ( y ^ t [ c ∗ ] ) \log(\hat{\mathbf{y}}_t[c^*]) log(y^t[c∗]),其中 c ∗ c^* c∗ 是真实类别。
- 作用: 计算在时间步 t t t 模型对真实类别预测的负对数似然。
-
∑ t = 1 T ( ... ) \sum_{t=1}^{T} (\dots) ∑t=1T(...): 跨时间步的聚合
- 设计考量: InfoGCN++ 是一个在线模型,需要对整个观测序列中的每个时间步都进行分类。因此,每个时间步的预测质量都同等重要。我们不能只关心最终帧的预测。
- 作用: 将所有观测时间步(从 1 到 T T T)的分类损失贡献累加起来。这确保了模型在训练过程中,会努力在动作的整个进行过程中都保持高准确度和高置信度。
-
− 1 T C -\frac{1}{TC} −TC1: 归一化因子
- 设计考量:
- 前面的负号是为了将负对数似然转换为一个正的损失值,方便优化器进行最小化。
- 1 T C \frac{1}{TC} TC1 是一个平均化操作。它将总损失除以时间步数 T T T 和类别数 C C C。虽然在独热编码下类别数 C C C 的平均意义不大(因为每个时间步只有一项非零),但除以 T T T 确保了无论序列有多长,每个时间步的平均损失值都能在一个可比的范围内,避免长序列带来的过大损失值,从而稳定训练。
- 作用: 确保损失值在不同长度的序列和不同类别设置下具有可比性,并使其成为一个平均损失,方便梯度计算和优化。
- 设计考量:
3. 在 InfoGCN++ 中的战略作用
作为设计者,我们赋予 L cls \mathcal{L}_{\text{cls}} Lcls 在 InfoGCN++ 模型中至关重要的战略作用:
- 直接驱动动作识别: 它是指导模型学习区分不同动作类别的核心信号。模型参数的调整,直接目标就是最小化这个损失,从而提高分类准确率。
- 与未来运动预测协同: 尽管 L cls \mathcal{L}{\text{cls}} Lcls 衡量的是当前动作的识别,但它与 InfoGCN++ 中的另一个辅助任务------未来运动预测(Future Motion Prediction)是共同训练 的。未来运动预测任务通过 L pred \mathcal{L}{\text{pred}} Lpred 和 L feat \mathcal{L}_{\text{feat}} Lfeat 提供额外的监督信号,帮助 Encoder 学习更丰富、更具判别力的时空特征表示。这种多任务学习的设置,使得分类器能从对未来运动的"预见"中受益,从而在更少观测数据的情况下也能做出准确分类。
- 确保在线实时性: 由于损失在每个时间步计算并累积,它强制模型在动作的早期阶段就尝试进行分类,而不是等到动作完成。这是实现"在线"和"实时"识别能力的关键。通过这种设计,模型被训练成能够处理不完整信息并进行连续推理。
- 处理长短动作序列: 尽管序列长度增加会带来内存挑战(论文中也提到了这一点),但 L cls \mathcal{L}_{\text{cls}} Lcls 的设计允许模型在任意长度的观测序列上进行训练和推理,只要这些序列在 T T T 范围内。
4. 潜在的权衡与未来方向
- 样本不平衡: 经典的交叉熵损失对样本不平衡比较敏感。如果某些动作类别的数据量远少于其他类别,模型可能会倾向于预测多数类别。设计者在实际应用中可能需要考虑引入加权交叉熵或焦点损失等变体来缓解这个问题。
- 误分类的成本: 交叉熵平等对待所有误分类。但在某些应用中,不同类型的误分类可能具有不同的业务成本(例如,将"跌倒"识别为"站立"的成本远高于反之)。在这种情况下,可以设计更复杂的加权损失函数。
- 未来改进: 论文中也提到了,InfoGCN++ 在 100% 观测率下性能并非总是最佳。这表明虽然在线识别能力很强,但对于完整序列的终极判别力,可能还有提升空间。未来的损失设计可以考虑在完整序列观测时,对分类损失的加权或形式进行调整,以进一步优化其在所有场景下的表现。
综上所述,InfoGCN++ 中的分类损失 L cls \mathcal{L}_{\text{cls}} Lcls 是我们精心设计的一个组件,它通过对模型在每个时间步的预测概率与真实标签之间的差异进行量化惩罚,直接驱动模型学习如何进行准确、实时的在线动作识别。它不仅是一个数学工具,更是体现了我们对模型"在线、实时、准确"核心能力期望的工程实现。
问题1
采用标签平滑是什么意思
采用标签平滑 (Label Smoothing) 是一种重要的正则化技术,旨在提高模型的泛化能力和鲁棒性,防止模型对训练数据过于自信(overconfidence)。
下面我将从设计者的角度,深入解析标签平滑的含义、设计动机、工作机制以及它在InfoGCN++ 中的具体应用和益处。
InfoGCN++ 中采用标签平滑的含义与解析
核心思想: 标签平滑不是简单地给模型一个硬性(hard)的"是"或"否"的判断,而是在真实标签中引入一点"不确定性",让模型在预测时不要对某个类别"过于绝对"地自信,从而提升其泛化能力。
1. 设计动机:为什么要使用标签平滑?(The "Why")
传统的分类任务中,我们通常使用独热编码 (One-hot Encoding) 来表示真实标签。例如,如果一个样本属于类别 A,而总共有三个类别 (A, B, C),那么其真实标签可能是 [1, 0, 0]。这意味着我们告诉模型:"这个样本百分之百是类别 A,绝不可能是其他类别。"
这种"硬性"的独热标签在训练中会带来一些问题:
- 模型过度自信 (Overconfidence): 为了最小化交叉熵损失,模型会被迫将属于真实类别的预测概率推向 1,而将其他所有非真实类别的预测概率推向 0。这鼓励模型输出极端大的 logits(SoftMax 输入),可能导致模型在训练数据上表现很好,但在面对真实世界中存在细微差异或噪声的新数据时,泛化能力下降。
- 校准性差 (Poor Calibration): 过度自信的模型往往"言过其实",即它预测一个样本属于某个类别的概率是 99%,但实际上该预测的正确率可能只有 80%。这种预测概率与真实正确率之间的不匹配就是校准性差。
- 对噪声标签敏感: 如果训练数据中存在少量标签错误(即真实标签本身就是错的),模型会过度学习这些错误信息,导致性能下降。
- 鼓励极端 logits: 为了达到接近 1 的预测概率,模型需要输出非常大的正数作为真实类别的 logits,非常大的负数作为非真实类别的 logits。这可能导致数值不稳定或训练困难。
标签平滑正是为了解决这些问题而提出的正则化策略。
2. 工作机制:标签平滑是如何工作的?(The "How")
标签平滑通过修改原始的独热编码真实标签来实现。它将一部分概率从真实类别中"借用"出来,平均分配给所有其他非真实类别。
假设我们有一个 K K K 类分类问题,原始的独热编码真实标签为 y one-hot \mathbf{y}^{\text{one-hot}} yone-hot。如果样本属于类别 k k k,那么 y one-hot \mathbf{y}^{\text{one-hot}} yone-hot 中第 k k k 个元素为 1,其余为 0。
标签平滑后的新标签 y smoothed \mathbf{y}^{\text{smoothed}} ysmoothed 定义为:
y smoothed [ c ] = ( 1 − α ) ⋅ y one-hot [ c ] + α ⋅ 1 K \mathbf{y}^{\text{smoothed}}[c] = (1 - \alpha) \cdot \mathbf{y}^{\text{one-hot}}[c] + \alpha \cdot \frac{1}{K} ysmoothed[c]=(1−α)⋅yone-hot[c]+α⋅K1
其中:
- K K K 是总的类别数量。
- α \alpha α (或论文中提到的 ϵ \epsilon ϵ) 是平滑因子 (smoothing factor),一个介于 0 和 1 之间的小常数(论文中提到使用 0.1)。它决定了"借用"出去的概率比例。
具体例子 (K=3, 真实类别为 A, α = 0.1 \alpha=0.1 α=0.1):
- 原始独热标签: y one-hot = [ 1 , 0 , 0 ] \mathbf{y}^{\text{one-hot}} = [1, 0, 0] yone-hot=[1,0,0] (类别 A)
- 平滑后的标签:
- 对于真实类别 A ( c = A c=A c=A): y smoothed [ A ] = ( 1 − 0.1 ) ⋅ 1 + 0.1 ⋅ 1 3 = 0.9 + 0.0333 ≈ 0.9333 \mathbf{y}^{\text{smoothed}}[A] = (1 - 0.1) \cdot 1 + 0.1 \cdot \frac{1}{3} = 0.9 + 0.0333 \approx 0.9333 ysmoothed[A]=(1−0.1)⋅1+0.1⋅31=0.9+0.0333≈0.9333
- 对于非真实类别 B ( c = B c=B c=B): y smoothed [ B ] = ( 1 − 0.1 ) ⋅ 0 + 0.1 ⋅ 1 3 = 0 + 0.0333 ≈ 0.0333 \mathbf{y}^{\text{smoothed}}[B] = (1 - 0.1) \cdot 0 + 0.1 \cdot \frac{1}{3} = 0 + 0.0333 \approx 0.0333 ysmoothed[B]=(1−0.1)⋅0+0.1⋅31=0+0.0333≈0.0333
- 对于非真实类别 C ( c = C c=C c=C): y smoothed [ C ] = ( 1 − 0.1 ) ⋅ 0 + 0.1 ⋅ 1 3 = 0 + 0.0333 ≈ 0.0333 \mathbf{y}^{\text{smoothed}}[C] = (1 - 0.1) \cdot 0 + 0.1 \cdot \frac{1}{3} = 0 + 0.0333 \approx 0.0333 ysmoothed[C]=(1−0.1)⋅0+0.1⋅31=0+0.0333≈0.0333
所以,平滑后的标签变为 [0.9333, 0.0333, 0.0333]。
3. 在 InfoGCN++ 中的应用与益处
InfoGCN++ 论文中明确指出:"We further employ label smoothing [44] with a value of 0.1 for generalization."(我们进一步采用标签平滑 [44] 并设置值为 0.1 来提高泛化能力。)
这意味着在 InfoGCN++ 的训练过程中:
- 修改分类目标: 分类损失 L cls \mathcal{L}_{\text{cls}} Lcls 在计算时,不再是让模型去匹配
[1, 0, 0]这样的绝对标签,而是匹配[0.9333, 0.0333, 0.0333]这样的"软"标签。 - 降低模型自信度: 模型不再需要将其预测概率推到极端值(如 1.0),因为即使预测概率为 0.9333 也能获得很小的损失。这使得模型在训练时对正确类别的预测不必那么"坚决",从而减少了过拟合的风险。
- 提高泛化能力: 这种"软"目标使模型在学习过程中更加关注不同类别之间的相对关系,而不是一味地追求单一正确答案。当面对新的、未见过的数据时,模型能够更好地适应,表现出更强的泛化能力。
- 提升鲁棒性: 标签平滑使得模型对训练数据中的少量标签错误具有一定的抵抗力,因为它不会将错误的 100% 信任分配给一个可能错误的标签。
- 更好的校准: 经过标签平滑训练的模型,其预测概率往往更能真实反映预测的正确率,即模型预测 80% 的概率,通常也就意味着有 80% 的机会是正确的,从而提高了模型的校准性。
总结
在 InfoGCN++ 中采用标签平滑,是我们作为设计者在模型训练中引入的一个精巧的技巧。它通过"软化"真实标签,有效地缓解了模型过度自信、泛化能力差等问题,使得 InfoGCN++ 在面对多样化的在线动作识别场景时,能够提供更稳定、更准确的预测。
F. 训练
我们将预测损失、特征损失和分类损失结合起来训练我们的模型。总损失定义为:
L = L c l s + λ 1 L p r e d + λ 2 L f e a t , \mathcal { L } = \mathcal { L } _ { \mathrm { c l s } } + \lambda _ { 1 } \mathcal { L } _ { \mathrm { p r e d } } + \lambda _ { 2 } \mathcal { L } _ { \mathrm { f e a t } } , L=Lcls+λ1Lpred+λ2Lfeat,
其中 λ 1 \lambda_{1} λ1 和 λ 2 \lambda_{2} λ2 分别是特征损失和分类损失的权重系数。我们测试了不同的系数组合,并选择了表现最佳的组合。我们在表 VIII 中比较了模型在不同系数组合下的性能。
算法1和算法2分别总结了整体的训练和推理过程。为简化起见,我们在算法中省略了嵌入层。为了在不同观测长度上提升训练效果,我们通过利用编码器上的因果掩码来并行化训练,迫使模型仅关注之前的帧。在推理时,不使用运动预测头。