深度学习架构师手册——探索无监督深度学习

242 阅读32分钟

无监督学习处理没有标签的数据。更广泛地说,无监督学习旨在揭示数据中隐藏的内在模式。监督式机器学习项目中最严格且最昂贵的部分是所需的标签。在现实世界中,有大量没有标签的数据,这些数据中蕴藏着丰富的信息。坦率地说,对于世界上所有存在的数据来说,获取标签几乎是不可能的。无监督学习是释放今天大量未标记数字数据潜力的关键。让我们通过下面的假设情况来更好地理解这一点。

假设获取一行数据的标签需要花费1美元和1分钟时间,无论该标签用于什么用例,每获取一单位的信息可以通过监督学习获得。为了获得10,000个信息单位,需要花费10,000美元和10,000分钟时间来获取10,000个标记数据。时间和金钱都是宝贵的资源。然而,对于无监督学习,通过同样的数据,没有标签的情况下,获取0.01单位的信息既不花费任何钱,也不需要任何时间。由于数据量不受时间或金钱的限制,我们可以轻松地获取比10,000个样本多100倍的数据,并从中获取通过模型学习到的相同信息。当钱和时间不成问题时,假设你的无监督学习模型具备能力,你的模型能够学习的信息量是无穷无尽的。

深度学习为无监督学习领域提供了竞争优势,因为它具有巨大的容量和学习复杂信息的能力。如果我们能够破解无监督深度学习的代码,它将为未来能接近通用智能的模型奠定基础!在本章中,我们将通过以下主题探索无监督深度学习的重要组成部分:

  • 探索无监督深度学习应用
  • 为下游任务创建预训练网络权重
  • 通过无监督深度学习创建通用表示
  • 探索零样本学习
  • 探索无监督深度学习中的降维组件
  • 检测外部数据中的异常

技术要求

本章包括一些用Python编程语言实现的实际操作。要完成本章内容,您需要在计算机上安装以下库:

  • pandas
  • CLIP
  • numpy
  • pytorch
  • pillow

您可以在GitHub上找到本章的代码文件,链接如下:github.com/PacktPublis…

探索无监督深度学习应用

今天,实践者们已经能够利用无监督深度学习挖掘未标记的数据,从而实现以下用例中的任意一个。这些用例按影响力和实用性从高到低排列如下:

  • 为下游任务创建预训练网络权重
  • 创建通用表示,可以直接用于下游监督任务,通过预测监督模型使用
  • 实现一次性学习和零样本学习
  • 执行降维
  • 检测外部数据中的异常
  • 将提供的训练数据聚类成组

首先,需要注意的是,纯粹的聚类仍然是无监督学习中的一个核心应用,但对于深度学习来说不是如此。聚类是将未标记的数据分组到多个任意的聚类或类别中。这在某些用例中非常有用,例如客户细分,用于有针对性的回应,或话题建模,找出人们在社交媒体上讨论的热门话题。在聚类中,利用未标记数据样本之间的关系,找到相互靠近的数据组。有些聚类技术通过假设每个聚类中的数据呈球形分布来分组数据,例如K均值算法。其他一些聚类技术则更具适应性,能够找到多个分布和大小的聚类,例如HDBSCAN。

深度学习方法未能从非深度学习聚类方法(如简单的K均值算法或HDBSCAN算法)中获得显著的改进。然而,已经有努力将聚类本身用于帮助神经网络模型的无监督预训练。为了将其实现为神经网络中的一个组件,聚类模型必须是可微分的,这样梯度才能继续传播到整个网络。这些方法并不优于非深度学习技术,如K均值或HDBSCAN,它们只是一个变体,以便在神经网络中实现聚类的概念。无监督预训练中聚类的一个示例应用是SwaV,将在下一节介绍。然而,为了完整性,传统上使用的基于神经网络的聚类算法之一是自组织映射(Self-Organizing Maps),但该网络本身并不被视为深度网络。

在接下来的几节中,我们将更全面地探讨其他五个应用,按照之前提到的影响力和实用性排序。

为下游任务创建预训练网络权重

这种方法也被称为无监督迁移学习,类似于监督迁移学习,并自然地收获了与第8章《探索监督深度学习》中的迁移学习部分所描述的相同好处。但为了回顾,我们可以通过一个类比来理解它。假设你是一位厨师,花了多年时间学习如何烹饪各种菜肴,从意大利面和牛排到甜点。一天,你被要求烹饪一道从未尝试过的新菜肴,我们称之为“菜肴X”。你不是从头开始,而是利用你以前的知识和经验来简化过程。你知道如何切菜、如何使用烤箱、如何调节火力,所以你不需要重新学习这些步骤。你可以将精力集中在学习菜肴X所需的具体配料和技术。这类似于迁移学习在机器学习中的工作方式,适用于无监督学习和监督学习。一个已经在相关任务上训练过的模型可以作为起点,使模型能够更快、更有效地学习新任务。

除了能够利用全球范围内无限量的未标记数据外,无监督迁移学习还带来了另一个好处。在监督学习中,标签通常包含模型会采纳的偏差。通过学习获得的偏差可能会妨碍获取更多更通用的知识,这对于下游任务会产生不同程度的影响。除了标签中的偏差外,也有标签错误的情况。无监督意味着模型没有从任何标签中学习到偏差或错误。然而,需要注意的是,某些数据集中的偏差更加显著。那些任务复杂、标签质量来自人为判断的数据集,通常比简单任务(如分类图片是否包含面部)更容易带有偏差。

现在,让我们深入研究技术。无监督迁移学习被认为是最具影响力和实用性的应用,得益于自然语言处理(NLP)领域的贡献。如第6章《理解神经网络变换器》中介绍的,变换器为这一范式铺平了道路,通过一种更常见的无监督学习技术,称为自监督学习,预训练你的模型。如何对这种方法进行分类取决于视角,并非每个人都会同意这种分类。自监督学习仅利用共同出现的数据之间的关系,通过无标签的关系性知识预训练神经网络。从这个角度看,考虑以下问题,并自己决定答案。

试试这个

传统的无监督学习数据预处理技术,如主成分分析(PCA),利用共同出现的数据关系来构建可以更好地表示影响模式的新特征。你是否认为PCA是属于自监督的独立类别,归属于监督学习,还是归属于无监督学习? 作者的答案:无监督!

在变换器中使用的无监督学习技术包括掩蔽语言建模和下一个句子预测。这些任务帮助模型学习词语和句子之间的关系,使其更好地理解语言数据的意义和上下文。经过掩蔽语言建模和下一个句子预测任务训练的模型,可以利用其语言理解能力,在各种NLP下游任务中表现得更好。这些成果通过今天领先变换器(如第6章中介绍的DeBERTa)在多个数据集上的最先进预测表现得到了验证。

让我们简要地看一下其他无监督预训练的示例:

  • 视觉表示的对比学习简易框架(SimCLR) :SimCLR利用一种称为对比学习的方法来预训练卷积神经网络。对比学习是无监督深度学习中的关键技术,它通过优化相关特征之间的距离,帮助神经网络学习数据的表示。对比学习的核心思想是将相似数据点的特征拉近,而将不相似数据点的特征推远,使用对比损失函数。虽然现在有多种形式的对比损失,但一般的思路是最小化相似样本之间的距离,并最大化不相似样本之间的距离。这种距离可以通过欧几里得距离或余弦相似度等方式来度量。尽管这种方法需要标签进行学习,并在技术上是监督学习损失,但所学习的特征以及无标签样本选择的相似和不相似样本,使得这个损失函数成为无监督深度学习中的一个关键技术。最简单的对比损失表示如下:

    • 对于不相似样本:
      loss = -distance
    • 对于相似样本:
      loss = distance

SimCLR专注于图像数据,并使用精心设计的图像增强技术生成图像对,以优化网络产生更接近的特征。随机裁剪和随机颜色失真是最常见的增强方式,可以为大多数图像数据集提供有用的设置,以进行无监督预训练。

  • 交换同一图像多个视角的分配(SwaV) :SwaV采用与SimCLR相似的概念,利用图像增强和卷积神经网络。它还使用聚类和嵌入的概念,优化模型生成特征,确保两张图像映射到相同的特征空间。

学习技术执行如下:

  1. 预设聚类数K。
  2. 使用相同的卷积神经网络对两张图像进行特征提取。
  3. 然后,使用外部技术——最优传输求解器,通过代表K个聚类的嵌入层将两个特征独立地分配到特定的聚类中。两个特征总是会被分配到不同的聚类中。
  4. 计算卷积特征与所有聚类嵌入之间的点积,并应用softmax操作。
  5. 然后交换两张图像特征的聚类分配,使用交叉熵损失来优化CNN和嵌入层的权重。

这个方法的核心思想是联合学习嵌入权重和卷积网络权重,使多个增强的相同图像能被一致地分类。SwaV和SimCLR在多个下游任务性能上表现得非常接近。

  • SEER:SEER结合了SwaV,一个使用数十亿规模的未标记图像数据的极大规模,代替了更常见的百万规模,并利用大容量模型来预训练随机、未经筛选的未标记图像。这使得SEER在下游监督任务中取得了最先进的表现,并超越了单独的SimCLR和SwaV。
  • UP-DETR:由SCTU和腾讯微信AI的研究人员提出:这种方法以无监督方式对具有编码器-解码器架构的变换器进行预训练,用于图像对象检测任务。UP-DETR成功地提升了变换器在下游监督图像对象检测数据集上的性能。
  • Wav2vec 2.0:Wav2vec 2.0展示了如何通过利用自监督预训练作为前置任务,在有限的标记数据下训练可靠的语音识别模型。它也使用对比损失,简单来说,就是样本之间的余弦相似度。该方法使用CNN作为音频特征提取器,并将表示量化成离散的值数组,在传递给变换器之前进行训练。

通过这些无监督预训练方法,我们可以提升模型在各类任务中的表现,从而在没有大量标签数据的情况下,依然能有效进行学习。

image.png

我们在这里介绍的方法是针对特定模态的。然而,通过一些努力,这些方法可以适应其他模态以复制其性能。例如,增强技术被用于基于图像的方法以及对比学习。要将此方法适应于文本模态,可以使用保留意义的文本增强方法,如词语替换或回译,这应该能取得良好的效果。在这里介绍的无监督方法所涉及的模态是图像、文本数据和音频数据。这些模态之所以被选择,是因为它们对于下游任务具有较强的泛化能力。其他形式的模态,如图数据或数值数据,则可以根据特定用例高度定制,因为在这些情况下基本上没有可以转移到下游任务的信息。在尝试运行无监督深度学习方法以创建预训练权重之前,考虑列出可以转移的信息,并定性地评估是否有意义继续进行。

但如果预训练的网络权重已经能够在不同领域之间生成非常通用的特征怎么办?就像在监督学习中,基于ImageNet数据集训练的卷积神经网络(CNN)可以作为特征提取器一样,通过无监督方法(如SwaV或Wav2vec 2.0)训练的网络也可以作为特征提取器立即使用,毫无限制。你可以自己尝试!然而,一些无监督学习技术使用的神经网络是为了利用它们生成的特征,而不是直接使用它们的权重。我们将在下一节中详细探讨这一点。

通过无监督深度学习创建通用表示

通过无监督深度学习学到的表示可以直接作为输入,在下游监督任务中由预测性监督模型使用,或直接供最终用户使用。有一些广泛影响的无监督方法利用神经网络,这些神经网络主要作为特征提取器。让我们来看几个无监督特征提取器的例子:

  • 无监督预训练词令牌化器:这些词令牌化器被变种的变换器架构广泛使用,并在第8章《探索监督深度学习》的“为监督深度学习表示文本数据”部分中介绍过。
  • 无监督预训练词嵌入:这些方法利用无监督学习,并尝试执行语言建模,类似于变换器中的掩蔽语言建模。然而,基于词嵌入的方法在度量性能方面已经被基于变换器的预训练方法所超越,这些方法采用了基于子词的文本令牌化。尽管如此,基于词嵌入的方法仍然具有重要的地位,因为它们在运行时效率上优于基于变换器的方法。需要注意的是,并非每个项目都具备运行大型变换器所需的GPU,尤其是在合理的运行时内。有些项目只能访问CPU处理,而词嵌入提供了在运行时性能与度量性能之间的完美折衷。此外,词嵌入是一些用例的自然解决方案,这些用例需要将单词作为结果,例如从一种语言到另一种语言的词对词翻译,或者甚至是查找同义词或反义词。产生预训练词嵌入的方法示例包括fastText和word2vec。图9.2展示了词嵌入方法的架构:

image.png

任务是基于周围单词的嵌入总和来预测中间单词,或者基于当前单词的嵌入来预测周围的单词。图9.2展示了前一种情况。在使用包含N个单词的字典和多层感知机(MLP)训练词嵌入之后,MLP将被丢弃,词嵌入将作为字典保存,以便在推理时进行简单的查找。FastText与word2vec的不同之处在于,FastText使用子词而不是单词来生成嵌入,因此可以更好地处理缺失的单词。FastText的词嵌入是通过将组成完整单词的子词的嵌入相加来生成的。访问 github.com/facebookres… 了解如何使用已经为157种语言预训练的词嵌入,或者如何在自定义数据集上预训练FastText嵌入!

自编码器

自编码器是编码器-解码器架构,可以被训练用来去噪数据并减少数据的维度,同时优化数据使其可重建。它们通常通过限制架构瓶颈部分特征的数量来训练,以提取有用的核心信息,瓶颈部分位于编码器之后和解码器之前。请回顾第5章《理解自编码器》以了解更多内容!

对比语言-图像预训练(CLIP)

CLIP是一种方法,通过对比学习训练文本语言变换器编码器和CNN图像编码器。它提供了一个由大约4亿对图像-文本对构成的数据集,这些图像-文本对是通过结合多个公开可用的数据集构建的。这种方法生成了一个强大的图像和文本特征编码器,可以独立使用。通过在训练过程中优化生成一个图像,使得图像的CLIP编码嵌入与文本的CLIP编码嵌入相接近,CLIP方法成为了当前文本到图像方法的主要部分。图9.3展示了CLIP的架构:

image.png

一个小的实现细节是,图像编码器和文本编码器的输出被分别送入线性层,以便特征的数量匹配,从而可以计算对比学习损失。具体来说,对于CLIP,对比损失的应用方式如下:

cosine_similarity = np.dot(Image_embeddings, Text_embeddings.T) * np.exp(learned_variable)
labels = np.arange(number_of_samples)
loss_image = cross_entropy_loss(cosine_similarity, labels, axis=0)
loss_text = cross_entropy_loss(cosine_similarity, labels, axis=1)
loss = (loss_image + loss_text) / 2

请注意,在应用图像和文本嵌入之间的成对余弦相似度后,仍然使用交叉熵损失,这展示了对比损失的多种变体,其中核心工作仍然依赖于使用距离度量。由于CLIP利用了共现数据,因此它不属于自监督学习子类别。

生成模型

让我们看一些这些模型的例子:

  • 变换器模型。例如GPT-3和ChatGPT。两者都是使用掩蔽语言建模和下一个句子预测任务训练的变换器模型。与ChatGPT的区别在于,它是通过人类反馈和训练的强化学习进行微调的。两者都通过自回归方式生成新的文本数据。
  • 文本到图像生成器。例如DALL.E 2和Stable Diffusion。两种方法都利用了扩散模型。高层次上,Stable Diffusion方法从充满噪声的基础图像中慢慢生成极高质量的图像。
  • 生成对抗网络(GANs) :GANs在训练过程中利用两个神经网络组件,分别是判别器和生成器。判别器是一个分类器,旨在辨别假图像和真图像。生成器和判别器通过迭代训练,直到判别器无法分辨生成器生成的图像是真是假。GANs可以生成高质量的图像,但通常被基于扩散的模型所超越,因为后者生成的图像质量更高。

需要注意的是,通过无监督学习学习和创建特征表示的方法并不限于基于神经网络的方法。主成分分析(PCA)和词频-逆文档频率(TF-IDF),这两种被认为是数据预处理技术的方法,也属于这一类别。然而,它们与基于深度学习的方法的关键区别在于,后者需要更多的训练时间,但提供了更好的泛化能力。

无监督表示学习的关键在于利用共现数据之间的关系。上一节介绍的技术有公开的代码库,可以立即使用。对于其中大多数方法,已经有预训练的权重,你可以开箱即用,进一步微调下游的监督任务,或者作为简单的特征提取器使用。在下一节中,我们将探索CLIP的一种特殊用途——零样本学习。

探索零样本学习

零样本学习是一种范式,涉及利用已训练的机器学习模型来处理新任务,而无需在新任务上进行直接训练和学习。该方法实现了迁移学习,但与需要额外学习下游任务的迁移学习不同,零样本学习无需任何学习过程。我们将使用CLIP作为基础来实现零样本学习,因此它是无监督学习方法的扩展。

CLIP可以用于在各种下游任务中执行零样本学习。回顾一下,CLIP是通过图像-文本检索任务进行预训练的。只要CLIP应用于下游任务而没有任何额外的学习过程,它就可以被视为零样本学习。经过测试的用例包括物体字符识别、视频中的动作识别、基于图像的地理定位以及许多类型的细粒度图像物体分类。此外,人们也有一些基本方法来测试和展示零样本学习在物体检测中的应用。

在本章中,我们将实现一个未记录的CLIP零样本应用,即图像物体计数。计数意味着模型将执行回归。让我们开始实现:

首先,我们需要导入所有必需的库。我们将使用来自github.com/openai/CLIP的开源clip库,以利用预训练的CLIP版本,使用视觉变换器模型:

import os
from tqdm import tqdm
import numpy as np
import clip
import torch
from PIL import Image
import pandas as pd

接下来,我们将加载预训练的CLIP模型,如果安装了CUDA工具包,则在GPU模式下加载,否则在CPU模式下加载:

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load('ViT-B/32', device)

我们加载的model变量是一个类,包含了使用预训练权重加载的编码器模型,用来编码图像和文本。此外,preprocess变量是一个方法,需要在将输入提供给图像编码器之前执行。它对数据进行归一化,这些数据是在训练过程中使用的。

为了更方便地使用此模型进行预测,我们将创建一个辅助方法,结构如下:

def predict_with_pil_image(image_input, clip_labels, top_k=5):
    return similarity_score_probability, indices

记住,CLIP是训练来生成图像编码器和文本编码器输出的方式,使它们映射到相同的特征空间。将文本描述与图像匹配将产生在距离上接近的文本和图像特征。由于我们使用的度量是余弦相似度,值越高,相似度越大,距离越小。实现零样本学习的主要技术是思考多个描述,这些描述代表某个标签,并选择与图像最相似的标签。然后,将相似度分数标准化与其他标签进行比较,从而获得概率分数。此外,top_k用于控制返回多少个最高相似度分数的文本描述索引和分数。我们稍后将在定义的predict方法中讨论如何客观地设计描述以实现零样本学习。

该方法的第一部分将是对提供的单张图像输入和多个文本描述(称为clip_labels)进行预处理。图像将根据提供的预处理器进行预处理,而多个文本描述将根据CLIP库提供的文本变换器使用子词令牌化器进行标记化:

image_input = preprocess(cars_image).unsqueeze(0).to(device)
text_inputs = torch.cat([clip.tokenize(cl) for cl in clip_labels]).to(device)

接下来,我们将分别使用图像编码器和文本编码器对预处理的图像和文本输入进行编码:

with torch.no_grad():
    image_features = model.encode_image(image_input)
    text_features = model.encode_text(text_inputs)

在PyTorch中,记住我们需要确保在推理模式下不会计算梯度,因为我们不是在训练模型,也不想浪费额外的计算或内存。

现在,已经提取了具有相同列维度的图像和文本特征,我们将计算提供的图像输入特征与所有文本描述标签特征之间的余弦相似度分数:

image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
similarity_score_probability = (100.0 * image_features @ text_features.T).softmax(dim=-1)

除了相似度分数之外,所有文本描述之间的相似度也使用Softmax进行了标准化,以便所有分数加起来等于1。可以将此视为与其他样本比较相似度分数的一种方式。这样,基本上将距离分数转换为多类预测设置,其中提供的文本描述作为标签,都是可能的类。

接下来,我们将提取top_k个最高相似度分数,并返回它们的相似度分数概率和索引,指示分数属于哪个标签:

percentages, indices = similarity[0].topk(5)
similarity_score_probability = percentages.numpy() * 100.0
indices = indices.numpy()

现在方法完成了,我们可以使用Pillow加载图像,创建一些描述,并将其传入方法来执行零样本学习!在本教程中,我们将进行物体计数。这可以从计数停车场可用的车位数量到统计需要服务的人员数量。我们将在本教程中统计纸夹的数量,作为一个个人项目。请注意,这可以很容易地扩展到其他计数数据集和项目。我们将使用此数据集来实现此目标。请确保将数据集下载到与代码相同的文件夹中。让我们加载一个简单的版本,其中纸夹的数量少于2:

image = Image.open('clips-data-2020/clips/clips-25001.png')

我们将得到以下输出:

image.png

现在,我们需要多个文本描述集来涵盖所有可能的纸夹计数。仅使用数字作为文本的简单描述不足以接近一个好的相似度分数。相反,我们可以在数字后添加一些额外的文本,如下所示:

raw_labels = list(range(100))
clip_labels = ['{} number of paper clips where some paper clips are partially occluded'.format(label) for label in raw_labels]

在这段代码中,我们使用从0到99的所有数字,并加上相同的文本描述。可以更多地努力设计更多所需的前置文本变体。也可以利用多个前置文本和相同的原始标签。文本越能描述图像,就越有可能找到一个产生与图像最接近特征的描述。

让我们在这个例子上进行预测,看看它的表现如何:

percentages, indices = predict_with_pil_image(image, clip_labels)
print("\nTop 5 predictions:\n")
for percent, index in zip(percentages, indices):
    print(f"{raw_labels[index]}: {percent:.2f}%")

这将产生以下结果:

Top 5 predictions: 2: 4.64%, 4: 4.13% ,3: 4.03%, 0: 3.83%, 1: 3.67%

它准确地预测了两个纸夹!

接下来,让我们来看两个更难的例子,分别来自图9.4 B和图9.4 C:

medium_image = Image.open('clips-data-2020/clips/clips-25086.png')
hard_image = Image.open('clips-data-2020/clips/clips-25485.png')

在图9.4 B上进行预测产生以下结果:

Top 5 predictions: 4: 3.98%, 3: 3.78%, 2: 3.71%, 6: 3.23%, 5: 3.16%

这是1的误差,因为图像包含三个纸夹。在图9.4 C上进行预测产生以下结果:

Top 5 predictions: 18: 1.32%, 9: 1.29%, 0: 1.26%, 19: 1.22% ,16: 1.20%

这是2的误差,因为图像包含16个纸夹。表现还不错!

现在,让我们评估在一个划分好的验证数据集(1,000个示例)上的平均误差:

testing_data = pd.read_csv('train.csv')
errors = []
for idx, row in tqdm(testing_data.iterrows(), total=1000):
    image = Image.open(
        'clips-data-2020/clips/clips-{}.png'.format(row['id'])
    )
    percentages, indices = predict_with_pil_image(image, clip_labels, 1)
    errors.append(abs(row['clip_count'] - raw_labels[indices[0]]))
    if idx == 1000:
        break
print('{} average count error'.format(np.mean(errors)))

这将产生一个23.8122的平均计数误差。突然间,这看起来不那么可用了。在一些示例中,即使描述中已指定会有一些部分被遮挡,模型仍然无法正确计数遮挡的纸夹。可能有必要添加描述,说明纸夹的大小不同,或者甚至说明它们位于一张带线纸上。自己试试,进行一些实验吧!

用预训练的SqueezeNet特征提取器在该数据集上单独训练一个岭回归模型,并在第12步的相同验证数据集上进行验证,结果得到了一个1.9102的均方根误差。这表明,零样本学习本身对于这个用例来说不如监督模型可靠,但它可能能在简单的图像上很好地识别和预测。在论文中,作者强调,基于CLIP的零样本学习在某些特定的用例和数据集上能表现得很好,并且接近于监督学习技术。然而,在大多数用例和数据集上,基于CLIP的零样本学习仍远远落后于正确的监督学习方法。这个教程是它可能有效的一个示例,但它并不像在现实世界中可以可靠使用。尽管如此,它确实展示了CLIP在无监督学习方法基础上的潜力。再过几年,随着更多的研究,我们很可能会看到一个更好的表现,它可能会接近于一般的监督学习,甚至更好!

接下来,我们将探索无监督学习中的降维组件。

探索无监督深度学习中的降维组件

降维是一种在需要更快运行时训练和执行推理,或者当模型从过多数据中学习困难时非常有用的技术。最著名的无监督深度学习降维方法是基于自编码器的,这在第5章《理解自编码器》中有讨论。典型的自编码器网络被训练为再现输入数据,作为一种无监督学习方法。这是通过编码器-解码器结构来实现的。在推理时,仅使用编码器将允许你执行降维,因为编码器的输出将包含最紧凑的表示,可以完全重建原始输入数据。自编码器可以支持不同的模态,在任何时候只能处理一种模态,这使得它成为一个非常多用途的无监督降维方法。

其他的例子包括使用浅层神经网络创建词嵌入的无监督方法,例如FastText或Word2vec。语言中存在的唯一单词数量是巨大的。即使将其缩小到训练数据中唯一单词的总数,也很容易膨胀到100,000个单词。对单词进行编码的一个简单方法是使用独热编码(one-hot encoding)或TF-IDF。两种方法在数据集包含100,000个唯一单词时,都会产生100,000列特征。这会很容易导致RAM需求暴涨,可能会限制解决方案的潜力。然而,词嵌入可以进行调优,具有所需的特征列数量,因为你可以在使用的语言模型进行预训练时选择嵌入大小。

最后,让我们学习如何检测外部数据中的异常。

检测外部数据中的异常

异常检测也是无监督学习中的一个重要应用。异常检测可以用于你想对现有数据进行任何类型的过滤(称为离群点检测),并且在推理阶段,基于新的外部数据,作为实时检测器(称为新颖性检测)。以下是异常检测的终端用户用例的一些例子:

  • 在将数据输入到监督特征学习过程中之前,去除数据中的噪声,以实现更稳定的学习。
  • 在生产线上去除缺陷产品。这可以从半导体晶圆的制造到鸡蛋生产等各个领域。
  • 通过检测异常交易来预防欺诈。
  • 通过短信、电子邮件或直接消息平台检测诈骗。

异常检测是一个二类或二元问题。这意味着,处理这些示例用例的另一种方法是使用监督学习,收集大量负样本和正样本。当已经收集并标记了包含负/异常数据的高质量数据集时,监督学习方法可以很好地工作,因为通常会有大量的正/正常数据。回顾第1章《深度学习生命周期》中的数据准备部分,以回顾什么是机器学习的高质量数据!然而,在现实中,我们不可能捕捉到所有可能的负样本和变化。异常检测专用算法是为了更普遍地处理异常或负样本而构建的,并且可以很好地推断未见过的示例。

一种更广为人知的深度学习方法是使用自编码器模型,在外部数据(不用于训练)上进行异常检测。该模型执行所谓的单类分类器,类似于传统的单类支持向量机。这意味着自编码器可以被训练为重构原始数据,以实现四个任务中的一个或多个——降维、噪声去除、通用特征提取和异常检测。根据当前目标,自编码器应有不同的训练方式。对于降维、噪声去除和通用特征提取,自编码器应该像介绍中那样正常训练。对于异常检测,需要做以下几件事来确保模型达到预期行为:

  1. 使用没有异常的数据作为训练数据。如果知道可能会有异常,可以使用简单的离群点检测算法(如局部离群因子)并去除数据中的离群点。
  2. 使用异常和非异常数据的组合来形成验证和持出分区。如果事先不知道这样的分类,可以使用基于离群点的异常检测算法来标记数据。
  3. 如果第二步不可行,则使用均方误差损失来训练并过拟合训练数据。这是为了确保模型只能够重构具有与训练数据相同特征的数据。过拟合可以通过训练并确保每个epoch的训练重构损失逐渐降低来实现。
  4. 如果第二步可行,则使用给定的交叉验证分区策略进行训练、验证和评估,并遵循上一章《有效训练监督深度学习模型》部分中介绍的提示。

自编码器的预测功能,用于测试、验证和推理,可以基于模型如何通过均方误差重建输入数据来设定。需要使用阈值作为切割机制来确定哪些数据是异常的。均方误差越高,提供的数据是异常的可能性越大。由于异常检测是一个二类分类问题,一旦标签可用,可以通过使用不同均方误差阈值的ROC曲线、混淆矩阵和对数损失错误来执行性能分析。下一章将更全面地介绍这一点。

在一般的异常检测中,需要注意的是,异常是一种模糊的描述,它表示什么是异常。不同的算法会根据数据集、特征空间及其特征分布来编码异常的定义。当某个算法不能很好地适应你预定义的异常情况时,并不意味着该算法不是一个好模型。自编码器方法并不总是能捕捉你对异常的直觉。当涉及到无监督异常检测学习时,确保你训练多个模型,并进行适当的超参数设置,单独分析哪些模型符合你对数据异常的直觉。

总结

深度学习在无监督学习领域做出了重大贡献,推动了多个创新方法的发展。然而,到目前为止,最具影响力的方法是无监督预训练,它利用今天互联网上丰富的免费数据来提升下游监督任务的模型表现,并创造出可泛化的表示。随着研究的深入和时间的推移,无监督学习将有助于缩小向通用人工智能迈进的差距。总体而言,深度学习在无监督学习领域是一个宝贵的工具,帮助实践者充分利用今天互联网上大量的免费数据。

在下一章中,我们将深入探讨本书第二部分的第一章,介绍提供有关已训练深度学习模型见解的方法。