实用技巧:在微调时制作出精美的嵌入动画

2023年07月24日 由 Alex 发表 50273 0
在机器学习领域,视觉变形器(Vision transformer, ViT)是一种用于图像分类的模型。与传统的卷积神经网络不同,VIT使用最初设计用于自然语言处理任务的Transformer架构来处理图像。微调这些模型以获得最佳性能可能是一个复杂的过程。

通过对嵌入执行主成分分析(PCA)来实现的。这些嵌入是从处于不同微调阶段的模型及其相应的检查点生成的。



这部动画获得了超过20万的播放量。它很受欢迎,许多读者对它的创作过程很感兴趣。本文旨在为这些读者和任何对创建类似可视化感兴趣的人提供支持。

在本文中,我的目标是提供一个关于如何创建这样一个动画的全面指南,详细介绍了所涉及的步骤:微调、创建嵌入、异常值检测、PCA、Procrustes、审查和创建动画。

准备:微调


第一步是对预训练好的google/ viti -base-patch16 - 224-in21k Vision Transformer (ViT)模型[进行微调。为此,我们使用了CIFAR-10数据集,其中包含6万张图像,分为10个不同的类别:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。

你可以按照hugs Face教程中概述的步骤,使用Transformer进行图像分类,以执行同样适用于CIFAR-10的微调过程。此外,我们利用TrainerCallback将训练期间的损失值存储到CSV文件中,以便稍后在动画中使用。
from transformers import TrainerCallback

class PrinterCallback(TrainerCallback):
def on_log(self, args, state, control, logs=None, **kwargs):
_ = logs.pop("total_flos", None)
if state.is_local_process_zero:
if len(logs) == 3: # skip last row
with open("log.csv", "a") as f:
f.write(",".join(map(str, logs.values())) + "\n")

通过在TrainingArguments中设置save_strategy="step"和一个较低的save_step值来增加检查点的保存间隔是很重要的,这样可以确保动画有足够的检查点。动画中的每一帧对应一个检查点。在培训期间为每个检查点和CSV文件创建一个文件夹,并准备好进一步使用。

嵌入的创建


我们使用Transformers库中的AutoFeatureExtractor和autommodel来使用不同的模型检查点从CIFAR-10数据集的测试分割中生成嵌入。

每个嵌入是一个768维向量,表示一个模型检查点的1万个测试图像中的一个。这些嵌入可以与检查点存储在同一个文件夹中,以保持良好的概览。

提取异常值


我们可以使用Cleanlab库提供的OutOfDistribution类,根据每个检查点的嵌入来识别异常值。然后,得到的分数可以识别出动画的前10个异常值。
from cleanlab.outlier import OutOfDistribution

def get_ood(sorted_checkpoint_folder, df):
...
ood = OutOfDistribution()
ood_train_feature_scores = ood.fit_score(features=embedding_np)
df["scores"] = ood_train_feature_scores

应用PCA和Procrustes分析


使用scikit-learn包的主成分分析(PCA),我们通过将768维向量减少到2维来可视化二维空间中的嵌入。当为每个时间步重新计算PCA时,由于轴翻转或旋转,可能会出现动画中的大跳跃。为了解决这个问题,我们从SciPy包中应用了一个额外的Procrustes Analysis,以几何方式将每一帧转换为最后一帧,这只涉及平移、旋转和均匀缩放。这使得动画中的过渡更加平滑。
from sklearn.decomposition import PCA
from scipy.spatial import procrustes

def make_pca(sorted_checkpoint_folder, pca_np):
...
embedding_np_flat = embedding_np.reshape(-1, 768)
pca = PCA(n_components=2)
pca_np_new = pca.fit_transform(embedding_np_flat)
_, pca_np_new, disparity = procrustes(pca_np, pca_np_new)

聚光灯下的评论


在完成整个动画之前,我们在Spotlight中进行审查。在这个过程中,我们利用第一个和最后一个检查点来执行嵌入生成、PCA和异常值检测。我们在Spotlight中加载结果DataFrame:



Spotlight在左上角提供了一个综合表,显示数据集中的所有字段。在右上方,显示了两个PCA表示:一个用于使用第一个检查点生成的嵌入,另一个用于最后一个检查点。最后,在底部部分显示了选定的图像。

创建动画


对于每个检查点,我们创建一个图像,然后将其存储在相应的检查点旁边。

这是通过使用make_pca(…)和get_ood(…)函数实现的,它们分别生成代表嵌入的2D点并提取前8个异常值。2D点用对应于它们各自类别的颜色绘制。异常值是根据他们的分数排序的,他们的相应图像显示在高分排行榜上。训练损失从CSV文件加载并绘制为线形图。

最后,所有图像都可以使用imageio或类似的库编译成GIF。


结论


本文提供了一个详细的指南,介绍了如何创建一个动画,使视觉转换器(Vision Transformer, ViT)模型的微调过程可视化。我们已经完成了生成和分析嵌入、可视化结果以及创建将这些元素结合在一起的动画的步骤。

创建这样的动画不仅有助于理解微调ViT模型的复杂过程,而且还可以作为向他人传达这些概念的强大工具。

 

来源:https://medium.com/towards-artificial-intelligence/how-i-created-an-animation-of-the-embeddings-during-fine-tuning-2b8bdf49f822

 
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消