Asymmetric Student-Teacher Networks for Industrial Anomaly Detection
1、Background
所谓的学生-教师网络,首先,对教师进行训练,以学习语义嵌入的辅助性训练任务;其次,训练学生以匹配教师的输出。主要目的是让学生只能匹配正常数据上的教师输出,因为它仅在正常数据上进行训练。在测试时使用学生和教师的输出之间的距离作为异常指标。一般情况下,这个距离对于有缺陷的示例比无缺陷的示例要大。
然而,由于使用了具有相似架构的常规(非单射)神经网络,因此学生和教师都倾向于对训练分布之外的输入进行不期望的泛化,从而给出不期望的低异常分数。如果学生和教师都使用具有一个隐藏层的相同神经网络,异常数据的输出仍然相似。相比之下,如果使用具有3个隐藏层的MLP作为学生,则异常的输出会发散。通常,由于常规神经网络缺少单射性,不能保证训练分布之外的输入会引起两者输出的足够大的变化。与归一化流相比,常规网络不能保证对训练分布之外的输入提供训练分布之外的输出。
为此,使用不对称的学生-教师网络(AST):一个双射归一化流[34]充当教师,而一个常规的顺序模型充当学生。通过这种方式,教师保证对由异常引起的输入变化敏感。此外,使用不同的架构,从而使用不同的可学习函数集,强制对训练分布之外的样本产生远距离输出的效果。作为教师的辅助性训练任务,通过最大似然训练将图像特征和/或深度图的分布转换为正态分布的过程,这等同于密度估计。这种优化通过使用似然作为异常分数:低的似然表示正常应该是异常的指标。然而,即使完美的密度估计器也不能保证异常检测。例如,仅仅重新参数化数据就会改变样本的似然。此外,不稳定的训练导致错误估计的似然。
使用归一化流本身进行异常检测的优势在于,可以补偿可能的似然估计错误:如果错误地将低的正常似然分配给正常数据,则学生可以预测这个输出,从而仍然产生小的异常分数。如果错误地将高的正常似然分配给异常数据,则学生无法预测这个输出,再次产生高异常分数。通过这种方式,结合了学生-教师网络和具有归一化流的密度估计的好处,通过位置编码以及使用3D图像遮罩前景进一步增强了检测。
supplement
- 单射性网络(Injective Network)
- 定义:在数学中,如果对于定义域中的所有不同元素 x 和 y,函数 f 的输出也不同,即 f(x) ≠ f(y),则称函数 f 是单射的。在神经网络中,单射性意味着网络对不同的输入 x 产生不同的输出。然而,单射性并不保证网络能够逆转,即从输出推导出唯一的输入。
- 特点:单射性网络确保不同的输入映射到不同的输出,这对于某些任务(如某些类型的分类)是重要的。但是,它们不保证可以从输出唯一地确定输入,这限制了它们在需要精确逆过程的应用中的使用。
- 双射性网络(Bijective Network)
- 定义:在数学中,如果一个函数既是单射的又是满射的(Surjective),则称该函数是双射的。满射意味着对于每一个可能的输出值,都存在至少一个输入使得函数输出该值。
在神经网络中,双射性意味着网络不仅对不同的输入产生不同的输出,而且每个输出都可以唯一地追溯到一个输入。
- 特点:双射性网络不仅可以确保不同的输入映射到不同的输出,还可以从输出唯一确定输入。这种性质在需要精确逆问题的场合非常有用,例如在图像处理中恢复原始图像,或者在时间序列预测中精确地反向预测。
- 定义:在数学中,如果一个函数既是单射的又是满射的(Surjective),则称该函数是双射的。满射意味着对于每一个可能的输出值,都存在至少一个输入使得函数输出该值。
- 应用和例子
- 归一化流(Normalizing Flows):这是一类特殊的生成模型,设计为双射性,使得它们能够精确地估计输入数据的密度。归一化流通过一系列可逆的变换来实现这一点,这些变换允许模型从简单的分布(如高斯分布)转换到复杂的数据分布,同时保持概率密度的计算能力。
- 自编码器:通常不是双射性的,因为它们旨在通过编码器压缩数据,并通过解码器重建数据。自编码器的输出可能对应多个输入,因此不具备双射性。
2、Method
教师网络(Teacher Network):
- 输入:教师网络接收图像特征和/或深度图作为输入。这些输入数据可能来自于常规的RGB图像或者3D扫描图像。
- 位置编码(Positional Encoding):输入数据会通过一个位置编码层,这一层给输入数据添加位置信息。位置编码通常是必要的,因为归一化流需要理解数据中的空间结构(例如,图像中像素的相对位置)。
- 归一化流(Normalizing Flow):教师网络由归一化流构成,它是一个通过一系列可逆转换来实现数据分布映射的神经网络。
- 负对数似然损失(Negative Log Likelihood Loss):教师网络的目标是最小化负对数似然损失,这是概率模型中常用的损失函数,用于模型参数的优化。其目的是使得经过归一化流转换后的数据尽可能接近正态分布。
- 掩码(Masking):在3D数据中,只关注前景对象,忽略背景。为此,使用从3D数据生成的前景图(foreground map)来掩蔽损失函数,确保在训练过程中只考虑前景部分。
学生网络(Student Network):
- 输入:与教师网络相同,学生网络也接收图像特征和/或深度图作为输入,同样经过位置编码。
- 训练目标:学生网络的训练目标是尽可能匹配教师网络的输出。这是通过最小化两者输出之间的距离来实现的。
- 掩码距离(Masked Distance):与教师网络类似,学生网络在计算距离时也使用掩码,确保只考虑前景部分。
- 最小化距离:学生网络通过最小化与教师网络输出之间的(掩码)距离来进行训练。这意味着,学生网络学习在无缺陷的图像数据上模仿教师网络的行为。
- 模型训练目标
- 教师网络:被训练以将输入数据(图像特征和/或深度图)通过一系列可逆转换映射到一个简单的分布,通常是高斯分布。
- 学生网络:被训练以模仿教师网络的输出,但仅针对无缺陷的训练样本。
- 教师网络
- 归一化流:使用基于 Real-NVP 的归一化流,它由多个耦合块组成,每个块通过仿射变换处理数据。
- 可逆转换:每个耦合块将输入分割成两部分,对其中一部分进行变换,同时保持另一部分不变,确保整个过程是可逆的。
- 优化目标:最小化负对数似然损失,使得输入数据经过变换后尽可能接近高斯分布。
- 学生网络
- 前馈网络:使用常规的全卷积网络,包含多个残差块,每个块由卷积层、批量归一化和激活函数组成。
- 训练策略:学生网络仅使用无缺陷的样本进行训练,目标是最小化其输出与教师网络输出之间的距离。
- 异常检测流程
- 输入处理:输入样本(无论是正常还是异常)被同时送入教师网络和学生网络。
- 教师网络输出:教师网络处理输入样本并输出变换后的数据。
- 学生网络输出:学生网络也处理相同的输入样本,并尝试输出与教师网络相似的结果。
- 计算距离:计算学生网络和教师网络输出之间的距离。这个距离被用作异常评分的依据。
- 异常判断:如果输出距离大于某个阈值,则认为样本可能是异常的。
- 关键技术点
- 双射性:归一化流的双射性确保了数据可以被精确地映射回其原始状态,这是进行有效密度估计的关键。
- 不对称性:学生网络和教师网络的结构差异导致学生网络在处理异常数据时无法准确模仿教师网络的输出,从而在正常和异常样本之间产生显著的距离差异。
- 位置编码:使用正弦位置编码为归一化流提供空间位置信息,有助于更好地捕捉和利用输入数据的空间结构。
- 优势
- 鲁棒性:该方法对教师网络可能的不准确似然估计具有鲁棒性,因为学生网络的输出提供了额外的验证。
- 性能:通过利用学生-教师网络架构的不对称性和输出距离,该方法在异常检测任务中取得了优异的性能。
pseudo-code
# 定义教师网络(基于归一化流)
class TeacherNetwork:
def __init__(self):
# 初始化归一化流架构
self.flow = RealNVP()
self.positional_encoding = PositionalEncoding()
def forward(self, x):
# 应用位置编码
x_encoded = self.positional_encoding(x)
# 归一化流转换
z = self.flow(x_encoded)
# 计算负对数似然损失
neg_log_likelihood = -self.compute_nll(z)
return z, neg_log_likelihood
# 定义学生网络(基于常规卷积网络)
class StudentNetwork:
def __init__(self):
# 初始化卷积网络架构
self.conv_net = ConvNet()
def forward(self, x):
# 直接通过卷积网络
x_encoded = self.conv_net(x)
return x_encoded
# 定义训练流程
def train(teacher_network, student_network, train_loader):
optimizer_teacher = Adam()
optimizer_student = Adam()
for x_train in train_loader:
# 教师网络前向传播
z, nll_loss = teacher_network.forward(x_train)
# 学生网络前向传播
x_student = student_network.forward(x_train)
# 计算学生和教师输出的距离损失
distance_loss = compute_distance_loss(x_student, z)
# 教师网络优化(最小化负对数似然)
optimizer_teacher.zero_grad()
nll_loss.backward()
optimizer_teacher.step()
# 学生网络优化(最小化距离损失)
optimizer_student.zero_grad()
distance_loss.backward()
optimizer_student.step()
# 定义测试/异常检测流程
def detect_anomalies(teacher_network, student_network, test_loader, threshold):
for x_test in test_loader:
# 教师网络前向传播
z = teacher_network.forward(x_test)
# 学生网络前向传播
x_student = student_network.forward(x_test)
# 计算异常分数(学生和教师输出的距离)
anomaly_score = compute_distance(x_student, z)
# 阈值判断异常
if anomaly_score > threshold:
flag_anomaly(x_test)
else:
flag_normal(x_test)
# 主函数
def main():
teacher_net = TeacherNetwork()
student_net = StudentNetwork()
train_loader = load_training_data()
test_loader = load_test_data()
train(teacher_net, student_net, train_loader)
threshold = define_threshold()
detect_anomalies(teacher_net, student_net, test_loader, threshold)
if __name__ == "__main__":
main()
3、Experiments
🐂🐎。。。
4、Conclusion
提出了不对称学生-教师异常检测方法AST,在异常检测的上下文中,使用双射性网络(如归一化流)作为教师模型可以帮助学生网络学习到更复杂的数据表示,同时确保从输出到输入的可追溯性。