Skip to content

自监督模型

Meta的Yann LeCun和Ishan Mishra撰写的文章中的一段摘录可以很好地作为这里的引言:

监督学习是构建更智能的通用模型的一个瓶颈,这些模型可以执行多种任务并在没有大量标注数据的情况下获取新技能。实际上,不可能为世界上的一切事物进行标注。还有一些任务,其标注数据根本不足,例如为低资源语言训练翻译系统。

作为婴儿,我们主要通过观察来学习世界是如何运作的。我们通过学习诸如物体恒存性和重力等概念,形成了关于世界中物体的广义预测模型。在后来的生活中,我们观察世界,对其采取行动,再次观察,并通过试错构建假设来解释我们的行动如何改变环境。

常识帮助人们在不需要为每个单独任务进行大量教学的情况下学习新技能。例如,如果我们只给小孩子展示几幅牛的图画,他们最终能够识别出他们看到的任何一头牛。相比之下,通过监督学习训练的AI系统需要许多牛的图像示例,并且在不寻常的情况下(例如躺在海滩上的牛)仍可能无法正确分类。人类如何在仅有大约20小时的练习和很少的监督下学会驾驶汽车,而完全自动驾驶仍然是我们用数千小时人类驾驶员数据训练的最佳AI系统所无法实现的?简短的答案是,人类依赖于他们先前获得的关于世界如何运作的背景知识。

我们如何让机器做到同样的事情?

我们相信,自监督学习(SSL)是构建这种背景知识并在AI系统中近似常识的最有前途的方法之一。

来源

SSL在自然语言处理(NLP)中非常成功地使用(所有创造奇迹的大型语言模型都是通过SSL学习的),并且在计算机视觉中也有一些成功。但我们能在表格数据上做到这一点吗?答案是肯定的。

一个典型的SSL工作流程将有一个没有标签的大数据集,以及一个用于微调的小标签数据集。

  1. 我们首先使用未标记的数据进行预训练
  2. 然后我们使用预训练的模型进行下游任务,如回归分类 i. 我们创建一个新模型,以预训练模型为骨干,并添加一个用于预测的头 ii. 我们在小标签数据上训练新模型(微调)

在PyTorch Tabular中,SSL模型被实现为一个编码器-解码器模型,即我们需要使用相应的ModelConfig类定义一个编码器和一个解码器。编码器是必需的,如果解码器为空,则会回退到nn.Identity。这种灵活性允许我们定义SSL模型,其中学习到的特征表示是中间层或最终层。对于前者(例如去噪自动编码器),我们可以在中间层拆分模型,并使编码器输出中间层,解码器将中间层转换为重建。

PyTorch Tabular中的SSL模型具有以下组件: 1. 嵌入层 - 这是模型的一部分,它将分类和连续特征处理成一个单一的张量。 2. 特征提取器 - 这是模型的一部分,它接受嵌入层的输出并在其上进行表示学习。输出再次是一个单一的张量,即从表示学习中学习到的特征。

在PyTorch Tabular中,SSL模型必须继承自SSLBaseModel,其功能类似于BaseModel。任何继承SSLBaseModel的模型都需要实现以下方法: 1. embedding_layer - 返回嵌入层的属性方法 2. featurizer - 返回特征提取器的属性方法 3. _setup_loss - 设置损失函数的方法 4. _setup_metrics - 设置指标的方法 5. calculate_loss - 计算损失的方法 6. calculate_metrics - 计算指标的方法 7. forward - 定义模型前向传递的方法 8. featurize - 返回特征提取器学习到的特征的方法

我们可以选择嵌入层、编码器、解码器等及其参数,使用模型特定的配置类。

常见配置

虽然每个SSL模型都有单独的配置类,但它们在SSLModelConfig类中共享一些核心参数。

  • encoder_config: ModelConfig: 用于模型的编码器的配置。应该是PyTorch Tabular中定义的模型配置之一
  • decoder_config: Optional[ModelConfig]: 用于模型的解码器的配置。应该是PyTorch Tabular中定义的模型配置之一。如果为空,将初始化为nn.Identity 嵌入配置

这与监督模型相同。更多详情请参阅监督模型文档。

其他配置

虽然监督模型在其配置中将损失和指标作为参数,但自监督模型则没有。这是因为损失函数和指标对于不同的SSL模型实现是特定的,通常不可互换。因此,我们必须在模型本身中定义损失和指标。损失和指标分别在_setup_loss_setup_metrics方法中定义。

  • learning_rate: float: 模型的学习率。默认为1e-3。

  • seed: int: 用于可重复性的种子。默认为42。

使用方法:

以下是在PyTorch Tabular中使用自监督模型的主要步骤:

  1. 定义所有配置并初始化pytorch_tabular.TabularModel
  2. 使用未标记数据对模型进行预训练,使用pytorch_tabular.TabularModel.pretrain
  3. 使用预训练权重创建一个新的微调模型,使用pytorch_tabular.TabularModel.create_finetune_model
  4. 使用标记数据对模型进行微调,使用pytorch_tabular.TabularModel.finetune

有关更详细和实际的方法,请参阅SSL教程

可用模型

现在让我们看看PyTorch Tabular中可用的几种不同模型及其配置。有关已实现模型的完整列表:

>>> [cl for cl in dir(pytorch_tabular.ssl_models) if "config" in cl.lower()]
['DenoisingAutoEncoderConfig']

去噪自动编码器模型

PyTorch Tabular提供了受https://github.com/ryancheunggit/tabular_dae启发的去噪自动编码器实现。让我们看看如何使用它。

去噪自动编码器具有以下架构(来源):

DAE

我们在左侧对输入进行破坏,并要求模型学习预测原始的去噪输入。通过这个过程,网络被迫学习一个压缩瓶颈(标记为code),该瓶颈捕获了输入数据的大部分特征,即输入数据的鲁棒表示。

在PyTorchTabular中的DenoisingAutoencoder实现中,噪声以两种方式引入: 1. swap - 在这种策略中,噪声通过将特征中的一个值替换为同一特征的另一个值来引入,该值从其余行中随机采样。

  1. zero - 在这里,噪声通过将值替换为零来引入。

除此之外,我们还可以设置noise_probabilities,通过它可以定义噪声引入到特征的概率。我们可以将此参数设置为形式为{featurename: noise_probability}的字典。或者,我们也可以通过使用default_noise_probability轻松地为所有特征设置单一概率。

一旦我们有了这个鲁棒表示,我们就可以在其他下游任务中使用这个表示,如回归或分类。

所有参数都有智能默认值。让我们看看其中的一些:

  • noise_strategy: str: 引入噪声的策略。可以是swapzero之一。默认为swap
  • noise_probabilities: Optional[Dict[str, float]]: 引入噪声到特征的概率。可以是形式为{featurename: noise_probability}的字典。或者可以通过使用default_noise_probability轻松地为所有特征设置单一概率。默认为None。

有关参数的完整列表,请参阅API文档
pytorch_tabular.ssl_models.DenoisingAutoEncoderConfig