Python-机器学习模型调试指南-三-

120 阅读1小时+

Python 机器学习模型调试指南(三)

原文:annas-archive.org/md5/842997dabd1ace27744af80826d549f0

译者:飞龙

协议:CC BY-NC-SA 4.0

第十四章:机器学习最新进展简介

监督学习一直是机器学习在不同行业和应用领域成功应用的重点,直到 2020 年。然而,其他技术,如生成模型,后来引起了机器学习开发者和用户的关注。因此,了解这些技术将有助于你拓宽对机器学习能力的理解,超越监督学习。

本章将涵盖以下主题:

  • 生成模型

  • 强化学习

  • 自监督学习

到本章结束时,你将了解生成模型、强化学习RL)和自监督学习SSL)的含义、广泛使用的技术和好处。你还将使用 Python 和 PyTorch 练习其中的一些技术。

技术要求

以下要求适用于本章,因为它们将帮助你更好地理解概念,能够在项目中使用它们,并使用提供的代码进行实践:

  • Python 库要求:

    • torch >= 2.0.0

    • torchvision >= 0.15.1

    • matplotlib >= 3.7.1

你可以在 GitHub 上找到本章的代码文件,地址为github.com/PacktPublishing/Debugging-Machine-Learning-Models-with-Python/tree/main/Chapter14

生成模型

生成模型,或更普遍的生成 AI,为你提供了生成接近预期或参考数据点集或分布的数据的机会,通常称为真实数据。生成模型最成功的应用之一是语言建模。生成预训练 TransformerGPT)-4 和 ChatGPT(openai.com/blog/ChatGPT),这是一个建立在 GPT-4 和 GPT-3.5 之上的聊天机器人,以及类似的工具如 Perplexity(www.perplexity.ai/),引起了工程师、科学家、金融和医疗保健等不同行业的人士以及许多其他生成模型相关岗位的人士的兴趣。当使用 Chat-GPT 或 GPT-4 时,你可以提出一个问题或提供询问的描述,称为提示,然后这些工具会生成一系列陈述或数据来为你提供你请求的答案、信息或文本。

除了在文本生成中成功应用生成模型之外,许多其他生成模型的应用可以帮助你在工作或学习中。例如,GPT-4 及其之前的版本或其他类似模型,如 LLaMA(Touvron 等,2023 年),可用于代码生成和补全(github.com/features/copilot/github.com/sahil280114/codealpaca)。你可以编写你感兴趣生成的代码,它会为你生成相应的代码。尽管生成的代码可能并不总是按预期工作,但通常在经过几次尝试后,它至少接近预期。

生成模型还有许多其他成功的应用,例如在图像生成(openai.com/product/dall-e-2)、药物发现(Cheng 等,2021 年)、时尚设计(Davis 等,2023 年)、制造业(Zhao 等,2023 年)等领域。

从 2023 年开始,许多传统商业工具和服务开始整合生成 AI 功能。例如,你现在可以使用生成 AI 在 Adobe Photoshop 中编辑照片,只需用简单的英语说明你需要什么(www.adobe.com/ca/products/photoshop/generative-fill.html)。WolframAlpha 也将它的符号计算能力与生成 AI 结合,你可以用简单的英语请求特定的符号过程(www.wolframalpha.com/input?i=Generative+Adversarial+Networks)。可汗学院([www.khanacademy.org/](www.khanacademy.org/))制定了一种策略,帮… AI 中受益,特别是 ChatGPT,而不是对学生的教育造成伤害。

这些成功故事是通过依赖为生成模型设计的不同深度学习技术实现的,我们将在下面简要回顾。

生成深度学习技术

在 PyTorch 或其他深度学习框架(如 TensorFlow)中,有多种生成模型方法可供使用。在这里,我们将回顾其中的一些,以帮助你开始了解它们是如何工作的,以及你如何在 Python 中使用它们。

基于 Transformer 的文本生成

你已经了解到,2017 年引入的转换器(Vaswani et al., 2017)被用于生成最近最成功的语言模型,这在第十三章“高级深度学习技术”中有详细描述。然而,这些模型并不仅限于像翻译这样的传统自然语言处理任务,它们还可以用于生成建模,帮助我们生成有意义的文本,例如,回答我们提出的问题。这正是 GPT 模型、Chat-GPT 以及许多其他生成语言模型背后的方法。提供简短文本作为提问或问题的过程也被称为提示(prompting),在这个过程中,我们需要提供一个好的提示以获得好的答案。我们将在“基于文本的生成模型的提示工程”部分讨论最优提示。

变分自编码器(VAEs)

自编码器是一种技术,你可以将特征数量减少到一个信息丰富的嵌入集,你可以将其视为主成分分析(PCA)的更复杂版本,以更好地理解它。它是通过首先尝试将原始空间编码到新的嵌入(称为编码),然后解码嵌入,并为每个数据点(称为解码)重新生成原始特征来实现的。在 VAE(Kingma and Welling, 2013)中,它不是生成一组特征(嵌入),而是为每个新特征生成一个分布。例如,不是将原始的 1,000 个特征减少到 100 个特征,每个特征有一个浮点值,而是得到 100 个新的变量,每个变量都是一个正态分布(或高斯分布)。这个过程的美妙之处在于,然后你可以从这些分布中选择不同的值来为每个变量生成一组新的 100 个嵌入。在解码它们的过程中,这些嵌入被解码,并生成一组具有原始大小(1,000)的新特征。这个过程可以用于不同类型的数据,如图像(Vahdat et al., 2020)和图(Simonovsky et al., 2018; Wengong et al., 2018)。你可以在github.com/AntixK/PyTorch-VAE找到实现 PyTorch 的 VAE 的集合。

生成对抗网络(GANs)

在 2014 年引入的这项技术(Goodfellow et al., 2020)中,一个类似于监督分类模型的判别器和生成器协同工作。生成器,可能是一个用于生成所需数据类型(如图像)的神经网络架构,旨在生成图像以欺骗判别器,使其将生成的数据识别为真实数据。判别器学习如何保持区分生成数据和真实数据的能力。在某些情况下,生成的数据被称为假数据,例如在深度伪造(www.businessinsider.com/guides/tech/what-is-deepfake)等技术模型中。然而,生成的数据可以作为新数据点在不同应用中使用的机会,例如药物发现(Prykhodko et al., 2019)。你可以使用torchgan来实现 GANs(torchgan.readthedocs.io/en/latest/)。

由于基于生成模型之上涌现出一批基于提示的技术,我们将提供如何最优设计提示的更好理解。

基于文本生成模型的提示工程

提示工程不仅是在机器学习中的一个新兴话题,而且已经成为一个高薪的职位名称。在提示工程中,我们的目标是提供最优的提示以生成最佳可能的结果(例如,文本、代码和图像),并将生成模型的问题识别为改进它们的机会。对大型语言和生成模型的基本理解、你的语言熟练度和特定领域的数据生成领域的专业知识可以帮助你更好地进行提示。有一些免费资源可以帮助你学习提示工程,例如 Andrew Ng 和 OpenAI 提供的一门课程(www.deeplearning.ai/short-courses/ChatGPT-prompt-engineering-for-developers/)以及微软发布的一些关于提示工程的入门内容(learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/prompt-engineering)。然而,我们不会让你自己从头开始学习这个话题。在这里,我们将提供一些关于最优提示的指导,这将帮助你提高你的提示技能。

目标提示

在我们的日常对话中,无论是在工作、大学还是家里,我们都有方法确保对方更好地理解我们的意思,从而得到更好的回应。例如,如果你对朋友说“给我那个”,而不是“给我桌子上那瓶水”,你的朋友可能不会给你那瓶水,或者对你具体指的是什么感到困惑。在提示中,如果你清楚地解释了针对一个非常具体的任务你想要什么,你可以得到更好的回应和生成数据,比如图像。以下是一些用于更好提示的技术:

  • 明确要求:你可以提供具体信息,例如你希望生成的数据的格式,如项目符号或代码,以及你所指的任务,如撰写电子邮件与编写商业计划。

  • 指定数据生成对象:你甚至可以指定为谁生成数据的专业技能或职位,例如为机器学习工程师、业务经理或软件开发人员生成一段文本。

  • 指定时间:你可以指定你想要的信息,比如技术发布日期、某事首次宣布的时间、事件的年代顺序,以及像埃隆·马斯克这样的名人随时间变化的净资产变化等等。

  • 简化概念:你可以提供一个简化的版本,确保模型不会被你提示的复杂性所困惑。

虽然这些技巧可以帮助你更好地进行提示,但如果要求文本响应或生成无关数据,仍然有可能得到高度自信的虚假答案。这通常被称为幻觉。减少无关或不正确响应或数据生成机会的一种方法是为模型提供测试。当我们用 Python 编写函数和类时,我们可以设计单元测试来确保它们的输出符合预期,正如在第8 章中讨论的,使用测试驱动开发控制风险

使用 PyTorch 进行生成建模

你可以使用本章前面讨论的不同技术,基于 PyTorch 开发生成模型。我们在这里想练习使用 VAEs。VAE 的目标是为数据的低维表示找到一个概率分布。例如,模型学习关于输入参数表示的均值和方差(或对数方差),假设潜在空间(即潜在变量或表示的空间)为正态或高斯分布。

我们首先导入所需的库和模块,并从 PyTorch 加载Flowers102数据集:

transform = transforms.Compose([    transforms.Resize((32, 32)),
    transforms.ToTensor()
])
train_dataset = datasets.Flowers102(root='./data',
    download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32,
    shuffle=True)

然后,我们定义了一个用于 VAE 的类,如下所示,其中定义了两个线性层来编码图像的输入像素。然后,通过两个线性层定义了潜在空间概率分布的均值和方差,以便将潜在变量解码回原始输入数量以生成与输入数据相似的图像。在潜在空间中学习的分布的均值和方差将被用来生成新的潜在变量,并可能生成新的数据:

class VAE(nn.Module):    def __init__(self):
        super(VAE, self).__init__()
        self.encoder = nn.Sequential(
            nn.Linear(32 * 32 * 3, 512),
            nn.ReLU(),
            nn.Linear(512, 128),
            nn.ReLU(),
        )self.fc_mean = nn.Linear(128, 32)
         self.fc_var = nn.Linear(128, 32)
         self.decoder = nn.Sequential(
             nn.Linear(32, 128),
             nn.ReLU(),
             nn.Linear(128, 512),
             nn.ReLU(),
             nn.Linear(512, 32 * 32 * 3),
             nn.Sigmoid(),
         )
    def forward(self, x):
        h = self.encoder(x.view(-1, 32 * 32 * 3))
        mean, logvar = self.fc_mean(h), self.fc_var(h)
        std = torch.exp(0.5*logvar)
        q = torch.distributions.Normal(mean, std)
        z = q.rsample()
        return self.decoder(z), mean, logvar

现在,我们初始化定义的VAE类,并将Adam优化器作为优化算法,学习率为0.002

model = VAE()optimizer = optim.Adam(model.parameters(), lr=2e-3)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

然后,我们定义了一个使用binary_cross_entropy的损失函数,如下所示,以比较重新生成的像素与输入像素:

def loss_function(recon_x, x, mu, logvar):    BCE = nn.functional.binary_cross_entropy(recon_x,
        x.view(-1, 32 * 32 * 3), reduction='sum')
    KLD = -0.5 * torch.sum(
        1 + logvar - mu.pow(2) - logvar.exp())
    return BCE + KLD

现在,我们准备使用之前加载的Flowers102数据集来训练模型:

n_epoch = 400for epoch in range(n_epoch):
    model.train()
    train_loss = 0
    for batch_idx, (data, _) in enumerate(train_loader):
        data = data.to(device)
        optimizer.zero_grad()
        recon_batch, mean, logvar = model(data)
        loss = loss_function(recon_batch, data, mean,
            logvar)
        loss.backward()
        train_loss += loss.item()
        optimizer.step()
    print(f'Epoch: {epoch} Average loss: {
        train_loss / len(train_loader.dataset):.4f}')

然后,我们可以使用这个训练好的模型来生成几乎像花朵一样的图像(见图 14**.1)。通过超参数优化,例如改变模型的架构,你可以获得更好的结果。你可以在第十二章中回顾深度学习中的超参数优化,超越机器学习调试的深度学习

图 14.1 – 我们之前开发的简单 VAE 生成的示例图像

图 14.1 – 我们之前开发的简单 VAE 生成的示例图像

这只是一个使用 PyTorch 进行生成建模的简单示例。尽管生成建模取得了成功,但最近使用生成模型开发的工具(如 Chat-GPT)的部分成功归功于强化学习的智能使用,我们将在下一节中讨论。

强化学习

强化学习RL)不是一个新想法或技术。其最初的想法可以追溯到 20 世纪 50 年代,当时由理查德·贝尔曼提出,并引入了贝尔曼方程(Sutton 和 Barto,2018)。然而,它最近与人类反馈的结合,我们将在下一节中解释,为它在开发机器学习技术中的效用提供了新的机会。强化学习的一般思想是通过经验学习,或与指定环境的交互,而不是像监督学习那样使用收集到的数据点集进行训练。在强化学习中,考虑了一个代理,它学习如何改进动作以获得更大的奖励(Kaelbling 等人,1996)。代理在接收到前一步采取的动作的奖励后,会迭代地改进其采取行动的方法,或更技术性地说是策略。

在 RL 的历史上,两个重要的发展和用途导致了其流行度的增加,包括 Q-learning(Watkins,1989)的发展以及使用 Q-learning 将 RL 和深度学习(Mnih 等人,2013)相结合。尽管 RL 背后的成功故事和它模仿人类经验学习的直觉,但已经证明深度强化学习不是数据高效的,需要大量的数据或迭代经验,这使得它与人类学习在本质上不同(Botvinick 等人,2019)。

最近,带有人类反馈的强化学习RLHF)被用作强化学习成功应用于改进生成模型结果的应用,我们将在下文中讨论。

带有人类反馈的强化学习(RLHF)

使用带有人类反馈的强化学习,奖励是根据人类反馈计算的,无论是专家还是非专家,这取决于问题。然而,奖励并不是一个预定义的数学公式,考虑到问题的复杂性,如语言模型。人类提供的反馈会导致模型逐步改进。例如,RLHF 语言模型的训练过程可以总结如下 (huggingface.co/blog/rlhf):

  1. 训练语言模型,这被称为预训练。

  2. 数据收集和训练奖励模型。

  3. 使用奖励模型通过强化学习微调语言模型。

然而,学习如何使用 PyTorch 设计基于 RLHF 的模型可能有助于更好地理解这一概念。

基于 PyTorch 的 RLHF

从 RLHF 中受益的一个主要挑战是设计用于人类反馈收集和整理的基础设施,然后提供它们来计算奖励,然后改进主要预训练模型。在这里,我们不想深入探讨 RLHF 的这一方面,而是通过一个简单的代码示例来了解如何将此类反馈纳入机器学习模型。有一些很好的资源,如 github.com/lucidrains/PaLM-rlhf-pytorch,可以帮助你更好地理解 RLHF 以及如何使用 Python 和 PyTorch 来实现它。

在这里,我们将使用 GPT-2 (huggingface.co/transformers/v1.2.0/_modules/pytorch_transformers/modeling_gpt2.html) 作为预训练模型。首先,我们导入必要的库和模块,并初始化模型、分词器和优化器,这里选择的是 Adam

import torchfrom transformers import GPT2LMHeadModel, GPT2Tokenizer
from torch import optim
from torch.utils.data import DataLoader
# Pretrain a GPT-2 language model
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')
optimizer = optim.Adam(model.parameters(), lr=1e-3)

现在,假设我们已经收集了人类反馈并正确格式化,我们可以使用它来创建一个来自 PyTorch 的 DataLoader:

dataloader = DataLoader(dataset, batch_size=1, shuffle=True)

下一步是设计一个奖励模型,我们使用一个两层全连接神经网络:

class Reward_Model(torch.nn.Module):    def __init__(self, input_size, hidden_size, output_size):
        super(RewardModel, self).__init__()
        self.fc_layer1 = torch.nn.Linear(input_size,
            hidden_size)
        self.fc_layer2 = torch.nn.Linear(hidden_size,
            output_size)
    def forward(self, x):
        x = torch.relu(self.fc_layer1(x))
        x = self.fc_layer2(x)
        return x

然后,我们使用先前定义的类初始化奖励模型:

reward_model = Reward_Model(input_size, hidden_size, output_size)

我们现在可以使用收集到的人类反馈和奖励模型来改进我们的预训练模型。如果你注意以下代码,与没有奖励模型的神经网络相比,这个简单的循环遍历 epochs 和 batches 进行模型训练的主要区别在于奖励计算,然后将其用于损失计算:

for epoch in range(n_epochs):    for batch in dataloader:
        input_ids = tokenizer.encode(batch['input'],
            return_tensors='pt')
        output_ids = tokenizer.encode(batch['output'],
            return_tensors='pt')
        reward = reward_model(batch['input'])
        loss = model(input_ids, labels=output_ids).loss * reward
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()

这是一个设计基于 RLHF 的模型改进的非常简单的例子,用于帮助你更好地理解这个概念。例如,github.com/lucidrains/PaLM-rlhf-pytorch这样的资源将帮助你实现更复杂的方法,将此类人类反馈纳入模型改进。

接下来,让我们探讨机器学习中的另一个有趣话题,称为自监督学习。

自监督学习(SSL)

自监督学习SSL)不是一个新概念。它与强化学习类似,但由于其在学习数据表示方面的有效性,在深度学习结合之后引起了人们的关注。此类模型的例子包括用于语言建模的 Word2vec(Mikolov 等人,2013 年)和 Meta 的 RoBERTa 模型,这些模型使用 SSL 训练,在多个语言建模任务上取得了最先进的性能。SSL 的想法是为机器学习模型定义一个目标,该目标不依赖于预先标记或数据点的量化——例如,使用前一时间步预测视频中的对象或人的位置,遮盖图像或序列数据的一部分,并试图填充这些被遮盖的部分。此类模型的一个广泛应用的例子是在强化学习中学习图像和文本的表示,然后在其他上下文中使用这些表示,例如,在带有数据标签的小数据集上进行监督建模(Kolesnikov 等人,2019 年,王等人,2020 年)。

SSL 的范畴下有多个技术,以下列举三个:

  • 对比学习:对比学习的想法是学习表示,使得相似的数据点比不相似的数据点更接近(Jaiswal 等人,2020 年)。

  • 自回归模型:在自回归建模中,模型旨在根据之前的数据点预测下一个数据点,无论是基于时间还是特定的序列顺序。这在语言建模中是一个非常流行的技术,例如 GPT 模型预测句子中的下一个单词(Radford 等人,2019 年)。

  • 通过修复缺失部分进行自监督:在这种方法中,我们遮盖数据的一部分,并训练模型来填补缺失的部分。例如,图像的一部分可能被遮盖,模型被训练来预测被遮盖的部分。遮盖自动编码器是这种技术的一个例子,其中自动编码器的解码过程中填充了图像被遮盖的部分(张等人,2022 年)。

接下来,我们将通过一个简单的 Python 和 PyTorch 自监督建模示例进行练习。

使用 PyTorch 的自监督学习

从编程的角度来看,与监督学习相比,SSL 深度学习的主要区别在于定义训练和测试的目标和数据。在这里,我们想使用我们用来练习 RLHF 的Flowers102数据集进行练习。

我们首先使用两个编码和解码torch.nn.Conv2d()层定义神经网络类,如下所示:

class Conv_AE(nn.Module):    def __init__(self):
        super(Conv_AE, self).__init__()
        # Encoding data
        self.encoding_conv1 = nn.Conv2d(3, 8, 3, padding=1)
        self.encoding_conv2 = nn.Conv2d(8, 32, 3,padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        # Decoding data
        self.decoding_conv1 = nn.ConvTranspose2d(32, 8, 2,
            stride=2)
        self.decoding_conv2 = nn.ConvTranspose2d(8, 3, 2,
            stride=2)
    def forward(self, x):
        # Encoding data
        x = torch.relu(self.encoding_conv1(x))
        x = self.pool(x)
        x = torch.relu(self.encoding_conv2(x))
        x = self.pool(x)
        # Decoding data
        x = torch.relu(self.decoding_conv1(x))
        x = self.decoding_conv2(x)
        x = torch.sigmoid(x)
        return x

然后,我们初始化模型,指定torch.nn.MSELoss()作为预测图像和真实图像比较的标准,以及torch.optim.Adam()作为优化器,学习率为0.001

model = Conv_AE().to(device)criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

以下函数帮助我们实现对每个图像随机 8x8 部分的掩码,然后自动编码器学习填充这些部分:

def create_mask(size=(32, 32), mask_size=8):    mask = np.ones((3, size[0], size[1]), dtype=np.float32)
    height, width = size
    m_height, m_width = mask_size, mask_size
    top = np.random.randint(0, height - m_height)
    left = np.random.randint(0, width - m_width)
    mask[:, top:top+m_height, left:left+m_width] = 0
    return torch.from_numpy(mask)

然后,我们按照以下方式训练模型 200 个 epoch。正如你在图 14.2中可以看到的,图像首先被掩码,然后在解码步骤中,自动编码器试图重建完整的图像,包括掩码部分:

n_epoch = 200for epoch in range(n_epoch):
    for data in train_loader:
        img, _ = data
        # Creating mask for small part in training images
        mask = create_mask().to(device)
        img_masked = img * mask
        img = img.to(device)
        img_masked = img_masked.to(device)
        optimizer.zero_grad()
        outputs = model(img_masked)
        loss = criterion(outputs, img)
        loss.backward()
        optimizer.step()

正如你在图 14.2中看到的填充图像的示例中所示,模型能够正确地找到模式。然而,通过适当的超参数优化和设计具有更好神经网络架构的模型,你可以实现更高的性能和更好的模型。

图 14.2 – 使用卷积自动编码器模型的示例图像(第一行)、其掩码版本(第二行)和再生版本(第三行)

图 14.2 – 使用卷积自动编码器模型的示例图像(第一行)、其掩码版本(第二行)和再生版本(第三行)

你可以通过提供的资源和参考资料了解更多关于 SSL 和本章中提供的技术,以更好地理解这些概念。

摘要

在本章中,你获得了对机器学习建模中监督学习之外的最新进展的高级理解,包括生成建模、强化学习和自监督学习。你还了解了最佳提示和提示工程,以便从基于生成模型并接受用户文本提示的工具和应用中受益。你提供了相关的代码仓库和 Python 和 PyTorch 中可用的功能,这将帮助你开始学习这些高级技术。这些知识不仅帮助你更好地理解它们是如何工作的,如果你遇到它们,而且开始使用这些高级技术构建自己的模型。

在下一章中,你将了解在机器学习建模和实践中识别因果关系的好处,以及使用 Python 库实现因果建模的示例。

问题

  1. 生成深度学习技术的例子有哪些?

  2. 使用 transformers 的生成文本模型的例子有哪些?

  3. GAN 中的生成器和判别器是什么?

  4. 你可以使用哪些技术来提高提示的效果?

  5. 你能解释一下强化学习如何有助于导入生成模型的结果吗?

  6. 简要解释对比学习。

参考文献

  • Cheng, Yu, 等人. “药物发现中的分子设计:深度生成模型的全面综述。” 生物信息学简报 22.6 (2021): bbab344.

  • Davis, Richard Lee, 等人. “塑造未来:解锁深度生成模型在设计空间探索中的创造潜能。” 2023 年 CHI 会议关于人机交互系统人类因素扩展摘要 (2023).

  • Zhao, Yaoyao Fiona, 等人,编。 “高级制造设计。” 机械设计杂志 145.1 (2023): 010301.

  • Touvron, Hugo, 等人. “Llama:开放且高效的基金会语言模型。” arXiv 预印本 arXiv:2302.13971 (2023).

  • Vaswani, Ashish, 等人. “注意力即所需。” 神经信息处理系统进展 30 (2017).

  • Kingma, Diederik P., 和 Max Welling. “自动编码变分贝叶斯。” arXiv 预印本 arXiv:1312.6114 (2013).

  • Vahdat, Arash, 和 Jan Kautz. “NVAE:一种深度分层变分自动编码器。” 神经信息处理系统进展 33 (2020): 19667-19679.

  • Simonovsky, Martin, 和 Nikos Komodakis. “Graphvae:使用变分自动编码器生成小图。” 人工神经网络与机器学习–ICANN 2018:第 27 届国际人工神经网络会议,希腊罗得岛,2018 年 10 月 4-7 日,会议论文集,第一部分 27. Springer 国际出版社 (2018).

  • Jin, Wengong, Regina Barzilay, 和 Tommi Jaakkola. “用于分子图生成的连接树变分自动编码器。” 机器学习国际会议 PMLR (2018).

  • Goodfellow, Ian, 等人. “生成对抗网络。” ACM 通讯 63.11 (2020): 139-144.

  • Karras, Tero, Samuli Laine, 和 Timo Aila. “基于风格的生成对抗网络生成器架构。” IEEE/CVF 计算机视觉与模式识别会议论文集 (2019).

  • Prykhodko, Oleksii, 等人. “基于潜在向量生成对抗网络的从头分子生成方法。” 化学信息学杂志 11.1 (2019): 1-13.

  • Sutton, Richard S., 和 Andrew G. Barto. 强化学习:入门。 MIT 出版社 (2018).

  • Kaelbling, Leslie Pack, Michael L. Littman, 和 Andrew W. Moore. “强化学习:综述。” 人工智能研究杂志 4 (1996): 237-285.

  • Watkins, Christopher John Cornish Hellaby. 从延迟奖励中学习。 (1989).

  • Mnih, Volodymyr, 等人. “使用深度强化学习玩 Atari。” arXiv 预印本 arXiv:1312.5602 (2013).

  • Botvinick, Matthew, 等人. “强化学习,快与慢。” 认知科学趋势 23.5 (2019): 408-422.

  • Kolesnikov, Alexander, Xiaohua Zhai 和 Lucas Beyer。“重新审视自监督视觉表示学习。” IEEE/CVF 计算机视觉与模式识别会议论文集 (2019).

  • Wang, Jiangliu, Jianbo Jiao 和 Yun-Hui Liu。“通过速度预测进行自监督视频表示学习。” 计算机视觉–ECCV 2020: 第 16 届欧洲计算机视觉会议,英国格拉斯哥,2020 年 8 月 23 日至 28 日,第 17 卷 16。Springer 国际出版社 (2020)。

  • Jaiswal, Ashish, 等人。“关于对比自监督学习的综述。” Technologies 9.1 (2020): 2.

  • Radford, Alec, 等人。“语言模型是无监督的多任务学习者。” OpenAI 博客 1.8 (2019): 9.

  • Zhang, Chaoning, 等人。“关于视觉和更多领域的掩码自动编码器在自监督学习中的应用综述。” arXiv 预印本 arXiv:2208.00173 (2022).

第五部分:模型调试的高级主题

在本书的结论部分,我们将探讨机器学习中最关键的一些主题。我们将首先解释相关性和因果性的区别,阐明它们在模型开发中的不同影响。过渡到安全和隐私的主题,我们将讨论确保我们的模型既强大又尊重用户数据的紧迫问题、挑战和技术。我们将以对人类在循环机器学习的解释来结束本书,强调人类专业知识与自动化系统之间的协同作用,以及这种合作如何为更有效的解决方案铺平道路。

本部分包含以下章节:

  • 第十五章, 相关性 versus 因果性

  • 第十六章机器学习中的安全和隐私

  • 第十七章人类在循环机器学习

第十五章:相关性与因果性

在本书的前几章中,你学习了如何训练、评估和构建高性能和低偏差的机器学习模型。然而,我们用来练习本书中引入的概念的算法和示例方法并不一定能在监督学习设置中为你提供特征和输出变量之间的因果关系。在本章中,我们将讨论因果推理和建模如何帮助你提高模型在生产中的可靠性。

在本章中,我们将涵盖以下主题:

  • 相关性作为机器学习模型的一部分

  • 因果建模以降低风险和提高性能

  • 在机器学习模型中评估因果关系

  • 使用 Python 进行因果建模

到本章结束时,你将了解因果建模和推理相对于相关性建模和练习可用 Python 功能来识别特征和输出变量之间因果关系的益处。

技术要求

为了更好地理解概念、在项目中使用它们以及使用提供的代码进行练习,你需要以下内容:

  • Python 库需求:

    • dowhy == 0.5.1

    • bnlearn == 0.7.16

    • sklearn >= 1.2.2

    • d3blocks == 1.3.0

  • 你还需要了解机器学习模型训练、验证和测试的基本知识

本章的代码文件可在 GitHub 上找到,地址为github.com/PacktPublishing/Debugging-Machine-Learning-Models-with-Python/tree/main/Chapter15

相关性作为机器学习模型的一部分

大多数机器学习建模和数据分析项目在监督学习设置和统计建模中导致特征和输出变量之间的相关性关系。尽管这些关系不是因果的,但识别因果关系具有很高的价值,即使在我们试图解决的多数问题中它不是必需的。例如,我们可以将医学诊断定义为“根据患者的医疗历史,识别最有可能导致患者症状的疾病”(Richens 等人,2020 年)。

识别因果关系解决在识别变量之间误导性关系时的问题。仅仅依赖相关性而不是因果关系可能会导致虚假和奇怪的关联,如下所示(www.tylervigen.com/spurious-correlationswww.buzzfeednews.com/article/kjh2110/the-10-most-bizarre-correlations):

  • 美国在科学、太空和技术上的支出与吊死、勒死和窒息自杀相关

  • 美国电子游戏产生的总收入与在美国授予的计算机科学博士学位相关

  • 美国从挪威进口的原油与在铁路列车碰撞中丧生的驾驶员相关

  • 吃有机食品与自闭症相关

  • 肥胖与债务泡沫相关

你可以在这些例子的来源中找到更多这些虚假的相关性。

依赖于相关性而非因果关系可能会降低技术发展和改进过程中不同方面的可靠性,例如 A/B 测试。例如,理解“如果我们能让更多的访客进行搜索,我们将看到购买和收入的增加”(conversionsciences.com/correlation-causation-impact-ab-testing/)有助于正确的决策和对技术发展的投资。

现在你已经了解了仅仅依赖相关关系的问题,让我们来讨论在机器学习环境中因果建模的含义。

因果建模以降低风险和提高性能

因果建模有助于消除变量之间不可靠的相关关系。消除这种不可靠的关系可以降低机器学习在不同应用领域(如医疗保健)中错误决策的风险。医疗保健中的决策,如诊断疾病和为患者指定有效的治疗方案,对生活质量及生存有直接影响。因此,决策需要基于可靠的模型和关系,其中因果建模和推理可以帮助我们(Richens et al., 2020; Prosperi et al., 2020; Sanchez et al., 2022)。

因果建模技术有助于消除模型中的偏差,如混淆和碰撞偏差(Prosperi et al., 2020)(图 15.1)。这种偏差的一个例子是吸烟作为黄手指与肺癌之间关系的混淆因素(Prosperi et al., 2020)。如图图 15.1 所示,碰撞变量的存在导致某些输入变量与结果之间存在相关但偏差和虚假的关联。此外,在建模中缺少可能造成混淆的一些变量可能导致我们得出其他变量与结果相关的结论:

图 15.1 – 混淆和碰撞偏差的示意图

图 15.1 – 混淆和碰撞偏差的示意图

接下来,我们将介绍因果建模中的一些概念和技术,例如因果推理以及如何在机器学习模型中测试因果关系。

评估机器学习模型中的因果关系

在机器学习建模中计算特征与结果之间的相关性在许多领域和行业中已经成为一种常见的方法。例如,我们可以简单地计算皮尔逊相关系数来识别与目标变量相关的特征。在我们的许多机器学习模型中,也有一些特征对结果的预测不是作为因果因素,而是作为相关预测因素。我们可以使用 Python 中可用的功能来区分这些相关和因果特征。以下是一些示例:

  • 实验设计:建立因果关系的一种方式是通过进行实验,测量因果特征变化对目标变量的影响。然而,这样的实验研究可能并不总是可行或道德的。

  • 特征重要性:我们可以使用在第六章《机器学习建模中的可解释性和可解释性》中介绍的可解释性技术来识别特征重要性,并利用这些信息来区分相关性和因果关系。

  • 因果推断:因果推断方法旨在识别变量之间的因果关系。你可以使用因果推断来确定一个变量的变化是否会导致另一个变量的变化。

我们在第六章《机器学习建模中的可解释性和可解释性》中讨论了不同的可解释性技术,如 SHAP、LIME 和反事实解释。你可以使用这些技术来识别模型中非因果的特征。例如,SHAP 值低的特征很可能在所研究的模型中不是因果特征。如果根据 LIME,在局部近似中有低重要性的特征,那么它很可能与模型的输出无关。或者,如果改变一个特征对模型输出的影响很小或没有影响,通过反事实分析,那么它很可能不是一个因果特征。

我们还可以使用另一种技术,称为置换特征重要性,它也被认为是可解释性技术的一部分,用于识别低概率的因果特征。在这种方法中,我们改变一个特征的价值,并测量这种变化对模型性能的影响。然后我们可以识别出低影响的特征,这些特征很可能不是因果特征。

我们已经在第六章《机器学习建模中的可解释性和可解释性》中实践了可解释性技术。接下来我们将专注于本章剩余部分的因果推断。

因果推断

在因果推断中,我们的目标是识别和理解数据集或模型中变量之间的因果关系。在这个过程中,我们可能会依赖不同的统计和机器学习技术来分析数据并推断变量之间的因果关系。图 15.2展示了五种这样的方法:实验设计观察性研究倾向得分匹配工具变量基于机器学习的方法

图 15.2 – 五种因果推断技术

图 15.2 – 五种因果推断技术

实验设计中,你设计实验来比较具有不同治疗变量或基于特定特征或特征的条件的样本的结局变量。表 15.1中提供了治疗和结果变量的示例,以帮助您理解这两个术语之间的区别:

治疗变量结果变量
教育水平收入水平
吸烟肺癌
体力活动心血管健康
家庭收入学术表现

表 15.1 – 因果建模中治疗和结果变量的示例

观察性研究中,我们使用观察数据,而不是受控实验,并试图通过控制混杂变量来识别因果关系。倾向得分匹配根据观察变量的概率来匹配治疗组和对照组。工具变量用于克服观察性研究中常见的难题,即治疗和结果变量由其他变量(或混杂变量)共同决定,而这些变量未包含在模型中。这种方法从识别一个与治疗变量相关但与结果变量不相关的工具变量开始,除了通过其对治疗变量的影响之外。基于机器学习的方法是其他技术类别,其中使用贝叶斯网络和决策树等机器学习方法来识别变量和结果之间的因果关系。

贝叶斯网络

您可以从贝叶斯网络中受益,在因果建模和识别变量之间的因果关系时。贝叶斯网络是图形模型,通过有向无环图DAGs)展示变量之间的关系,其中每个变量(包括输入特征和输出)都是一个节点,方向显示变量之间的关系(图 15.3):

图 15.3 – 示例贝叶斯网络的说明

图 15.3 – 示例贝叶斯网络的说明

这个网络告诉我们,特征 A特征 B的值越高,结果发生的可能性就越大。请注意,特征可以是数值的或分类的。尽管从特征 A 到结果的方向(图 15.3)不一定意味着因果关系,但贝叶斯网络可以用来估计变量对结果的因果效应,同时控制混杂变量。

从概率的角度来看,网络可以用来简化所有变量的联合概率,包括特征和结果,如下所示:

p(F A, F B, F C, Outcome) = p(Outcome| F A, F B)p(F B| F C)p(F C| F A)p(F A)

在这里,p(Outcome| F A, F B)是给定特征 A 和 B 值的条件概率分布CPD),p(F B| F C)是给定特征 C 的特征 B 的 CPD,p(F C| F A)是给定特征 A 的特征 C 的 CPD,p(F A)是特征 A 的概率,它不是其他特征的函数,因为在图中没有指向它的边。这些 CPD 可以帮助我们估计一个特征值的变化对另一个特征的影响。它告诉我们,在给定一个或多个变量发生的情况下,一个变量的发生可能性。你将在本章结束时学习如何以数据驱动的方式为给定的数据集创建贝叶斯网络,以及如何使用 Python 识别网络的 CPD。

Python 中有几种可用于因果推断的方法。我们将在下一节中介绍这些方法。

使用 Python 进行因果建模

几个 Python 库为你提供了使用因果方法和进行因果推断的易于使用的功能。以下是一些:

在接下来的几个小节中,我们将回顾dowhybnlearn

使用 dowhy 进行因果效应估计

首先,我们想要练习一种倾向得分匹配方法,这种方法在你有一个治疗变量在心中时很有用——例如,当你想要确定药物对患者的效果,并在模型中有其他变量,如他们的饮食、年龄、性别等时。在这里,我们将使用scikit-learn的乳腺癌数据集,其中目标变量是一个二元结果,告诉我们来自乳腺癌患者的细胞是恶性还是良性。在这里,我们将使用平均半径特征——即从中心到边缘上的点的平均距离——作为治疗变量。

首先,我们必须在 Python 中导入所需的库和模块:

import pandas as pdimport numpy as np
from sklearn.datasets import load_breast_cancer
import dowhy
from dowhy import CausalModel

然后,我们必须加载乳腺癌数据集并将其转换为 DataFrame:

breast_cancer = load_breast_cancer()data = pd.DataFrame(breast_cancer.data,
    columns=breast_cancer.feature_names)
data['target'] = breast_cancer.target

现在,我们需要将治疗变量的数值(平均半径)转换为二进制,因为倾向得分匹配仅接受二进制治疗变量:

data['mean radius'] = data['mean radius'].gt(data[    'mean radius'].values.mean()).astype(int)
data=data.astype({'mean radius':'bool'}, copy=False)

我们还需要列出共同原因列表,在这种情况下,我们将所有其他数据集中的属性视为共同原因:

common_causes_list = data.columns.values.tolist()common_causes_list.remove('mean radius')
common_causes_list.remove('target')

现在,我们可以通过指定数据、治疗、结果变量和共同原因来使用 dowhyCausalModel() 构建模型。CausalModel() 对象帮助我们估计 treatment 变量(平均半径)对结果变量(target)的因果效应:

model = CausalModel(    data=data,
    treatment='mean radius',
    outcome='target',
    common_causes=common_causes_list
)

现在,我们可以估计指定治疗变量(平均半径)对目标变量的因果效应。请注意,我们在这里使用的倾向得分匹配仅适用于离散治疗变量:

identified_est = model.identify_effect()estimate = model.estimate_effect(identified_est,
    method_name='backdoor.propensity_score_matching')

estimate 值为 -0.279,这意味着当平均半径作为治疗变量时,结果发生的概率降低了约 28%。这个倾向得分是在给定一组观察到的协变量条件下接受治疗的条件概率。后门调整控制了混杂变量,这些变量与治疗和结果变量都有关联。

我们还可以使用 refute_estimate() 函数来评估我们对因果变量及其对结果数据驱动估计效应的假设的有效性。例如,我们可以使用 'placebo_treatment_refuter' 方法,该方法将指定的治疗变量替换为一个独立的随机变量。如果我们对治疗和结果之间因果关系的假设是正确的,那么新的估计值将接近零。以下是使用 'placebo_treatment_refuter' 检查我们假设有效性的代码:

refute_results = model.refute_estimate(identified_estimand,    estimate, method_name='placebo_treatment_refuter',
    placebo_type='permute', num_simulations=40)

这导致新的效应为 0.0014,这保证了我们假设的有效性。然而,此命令的另一个输出 p-值估计为 0.48,这显示了统计置信水平。

refute_estimate() 函数返回的低 p-值并不意味着治疗变量不具有因果性。低 p-值表明估计的因果效应对特定假设的敏感性。反驳结果的显著性并不暗示治疗变量和结果变量之间不存在因果关系。

使用 bnlearn 通过贝叶斯网络进行因果推理

在 Python 和 R 编程语言中都存在的用于贝叶斯网络学习和推理的库之一是 bnlearn。我们可以使用这个库学习给定数据集的贝叶斯网络,然后使用学习到的图来推断因果关系。

为了使用 bnlearn 进行练习,我们必须安装并导入这个库,然后加载作为其一部分存在的 Sprinkler 数据集:

import bnlearn as bndf = bn.import_example('sprinkler')

接下来,我们必须拟合一个 structure_learning() 模型来生成贝叶斯网络或 DAG:

DAG = bn.structure_learning.fit(df)

然后,我们必须定义节点属性并可视化 DAG,如下所示:

# Set some colors to the edges and nodesnode_properties = bn.get_node_properties(DAG)
node_properties['Sprinkler']['node_color']='#00FFFF'
node_properties['Wet_Grass']['node_color']='#FF0000'
node_properties['Rain']['node_color']='#A9A9A9'
node_properties['Cloudy']['node_color']='#A9A9A9'
# Plotting the Bayesian Network
bn.plot(DAG,
    node_properties=node_properties,
    interactive=True,
    params_interactive={'notebook':True,
        'cdn_resources': 'remote'})

这导致了图 15.4中显示的网络。如图所示,'Sprinkler'可能是多云天气和湿草的因果变量。湿草可能由雨和水龙头引起。但存在量化这些依赖性的功能:

图 15.4 – 使用 bnlearn 为 Sprinkler 数据集学习的 DAG

图 15.4 – 使用 bnlearn 学习 Sprinkler 数据集的 DAG

你可以使用independence_test()如下测试变量的依赖性:

bn.independence_test(DAG, df, test = 'chi_square',    prune = True)

表 15.2包括了前一个命令的输出总结,清楚地显示了 DAG 中成对变量依赖性的显著性:

来源目标p-value(来自 chi_square test)chi-square
多云1.080606e-87394.061629
水龙头湿草1.196919e-23100.478455
水龙头多云8.383708e-53233.906474
湿草3.886511e-64285.901702

表 15.2 – 使用 bnlearn.independence_test()在 Sprinkler 数据集上的总结

你也可以使用bnlearn.parameter_learning.fit()如下学习 CPD:

model_mle = bn.parameter_learning.fit(DAG, df,    methodtype='maximumlikelihood')
# Printing the learned Conditional Probability Distribution (CPDs)
bn.print_CPD(model_mle)

图 15.5显示了CloudyRainSprinkler变量的 CPD。这些 CPD 与已识别的 DAG(图 15.4)相结合,不仅提供了识别变量之间潜在因果关系所需的信息,而且还可以对这些关系进行定量评估:

图 15.5 – bnlearn 为 Sprinkler 数据集识别的 CPD 示例

图 15.5 – bnlearn 为 Sprinkler 数据集识别的 CPD 示例

在本章中,你练习了使用因果建模,但这个主题还有更多内容。这是机器学习中最重要的话题之一,你将受益于对这个主题的更多了解。

摘要

在本章中,你学习了相关关系和因果关系之间的区别,因果建模的重要性,以及贝叶斯网络等因果推理技术。随后,我们通过 Python 实践帮助你开始在你的项目中使用因果建模和推理,以便你能识别出数据集中变量之间更可靠的关系,并设计出可靠的模型。

在下一章中,你将学习在构建可靠的机器学习模型时,如何保护隐私并确保安全,同时最大化使用私有和专有数据的益处。

问题

  1. 在监督学习模型中,你能否有一个与输出高度相关但不是因果的特征?

  2. 实验设计和观察研究在因果推理中有何区别?

  3. 使用工具变量进行因果推理有哪些要求?

  4. 贝叶斯网络中的关系是否必然可以被认为是因果的?

参考文献

  • Schölkopf, Bernhard. 机器学习的因果性. 概率与因果推理:朱迪亚·佩尔的工作. 2022. 765-804.

  • Kaddour, Jean, 等人. 因果机器学习:综述与开放问题. arXiv 预印本 arXiv:2206.15475 (2022).

  • Pearl, Judea. 贝叶斯 网络. (2011).

  • Richens, Jonathan G., Ciarán M. Lee, 和 Saurabh Johri. 利用因果机器学习提高医疗诊断的准确性. Nature communications 11.1 (2020): 3923.

  • Prosperi, Mattia, 等人. 在可操作的医疗保健中,机器学习的因果推理和反事实预测. Nature Machine Intelligence 2.7 (2020): 369-375.

  • Sanchez, Pedro, 等人. 因果机器学习在医疗和精准医学中的应用. Royal Society Open Science 9.8 (2022): 220638.

第十六章:机器学习中的安全和隐私

在我们生活的数字世界中,保护用户数据和个人隐私,以及确保他们的数字信息和资产的安全,在技术发展中具有重要意义。这对于建立在机器学习模型之上的技术也不例外。我们在第三章中简要讨论了这一主题,即调试 向负责任的人工智能迈进。在本章中,我们将为您提供更多详细信息,以帮助您开始学习更多关于在开发机器学习模型和技术中保护隐私和确保安全的知识。

在本章中,我们将涵盖以下主题:

  • 加密技术及其在机器学习中的应用

  • 同态加密

  • 差分隐私

  • 联邦学习

到本章结束时,您将了解在机器学习环境中保护隐私和确保安全所面临的挑战,并学习一些应对这些挑战的技术。

技术要求

以下要求适用于本章,因为它们将帮助您更好地理解概念,能够在项目中使用它们,并使用提供的代码进行实践:

  • Python 库要求:

    • numpy >= 1.22.4

    • matplotlib >= 3.7.1

    • tenseal >= 0.3.14

    • pycryptodome = 3.18.0

    • pycryptodomex = 3.18.0

如果您是 Mac 用户并且遇到tenseal安装问题,您可以按照github.com/OpenMined/TenSEAL/issues中解释的方法直接克隆其存储库进行安装。

本章的代码文件可在 GitHub 上找到,网址为github.com/PacktPublishing/Debugging-Machine-Learning-Models-with-Python/tree/main/Chapter16

加密技术及其在机器学习中的应用

我们可以使用不同的加密技术来加密原始数据、用于模型训练和推理的处理数据、模型参数或需要保护的其他敏感信息。有一个术语叫做密钥,通常是一串数字或字母,在大多数加密技术中都很重要。密钥通过加密算法进行编码和解码数据的处理。有几种加密技术,其中一些如下(Bhanot 等人,2015;Dibas 等人,2021):

  • 高级加密标准AES):AES 是保护数据的最强大的加密算法之一。AES 接受不同的密钥大小:128 位、192 位或 256 位。

  • Rivest-Shamir-Adleman (RSA) 安全性:RSA 是安全性最高的加密算法之一,是一种广泛用于安全数据传输的公钥加密算法。

  • 三重数据加密标准 (DES):三重 DES 是一种使用 56 位密钥加密数据块的加密方法。

  • Blowfish:Blowfish 是一种对称密钥加密技术,用作 DES 加密算法的替代方案。Blowfish 速度快,在数据加密方面非常有效。它将数据,例如字符串和消息,分割成 64 位的块,并分别加密它们。

  • Twofish:Twofish 是 Blowfish 的后继者,是一种对称加密算法,可以解密 128 位数据块。

接下来,我们将使用 Python 来练习使用 AES 进行数据加密,这是最常见的加密技术之一。

在 Python 中实现 AES 加密

在这里,我们希望通过 Python 练习 AES 在数据加密中的应用。这次练习的唯一目的是帮助您更好地了解如何从 Python 中受益于数据加密,以及如何在 Python 中加密和解密数据是多么容易,以及您如何从中受益以保护数据隐私并在机器学习环境中确保安全性。

我们首先导入Cryptodome.Cipher.AES()进行加密(加密)和解密,以及Cryptodome.Random.get_random_bytes()用于密钥生成:

from Cryptodome.Cipher import AESfrom Cryptodome.Random import get_random_bytes

我们可以使用 AES 加密文本,如我的名字是 Ali或其他类型的信息。在这里,我们希望用它来加密所谓的 SMILES,这是一种表示化学化合物的序列。例如,CC(=O)NC1=CC=C(C=C1)O代表一种著名的药物叫做对乙酰氨基酚(来源:pubchem.ncbi.nlm.nih.gov/compound/Acetaminophen):

data = b'CC(=O)NC1=CC=C(C=C1)O'key_random = get_random_bytes(16)
cipher_molecule = AES.new(key_random, AES.MODE_EAX)
ciphertext, tag = cipher_molecule.encrypt_and_digest(data)
out_encrypt = open("molecule_enc.bin", "wb")
[out_encrypt.write(x) for x in (cipher_molecule.nonce, tag,
    ciphertext) ]
out_encrypt.close()

如果我们有密钥,我们可以解密并安全地加载数据:

in_encrypt = open("molecule_enc.bin", "rb")nonce, tag, ciphertext = [in_encrypt.read(x) for x in (16,
    16, -1) ]
in_encrypt.close()
# let's assume that the key is somehow available again
decipher_molecule = AES.new(key_random, AES.MODE_EAX,nonce)
data = decipher_molecule.decrypt_and_verify(ciphertext,tag)
print('Decrypted data: {}'.format(data))

这将重新生成我们加密的序列CC(=O)NC1=CC=C(C=C1)O

在这个例子中,AES 帮助我们加密有关药物的信息,这对于制药和生物技术公司在开发新药的过程中可能很重要。然而,您可以通过 Python 使用 AES 加密其他类型的数据。

接下来,我们将讨论另一种称为同态加密的技术。

同态加密

另一种允许我们在加密数据上执行计算的技术称为同态加密。这种能力在机器学习环境中非常有用,例如,在不需要解密的情况下使用模型对加密数据进行推理。然而,实现全同态加密可能很复杂,计算成本高,内存效率低(Armknecht 等人,2015;Gentry 等人,2009;Yousuf 等人,2020)。

有几个 Python 库可以帮助我们练习同态加密方案,如下所示:

让我们看看使用 TenSEAL 进行同态加密的一个简单示例。

我们首先导入TenSEAL库,并使用tenseal.context()生成一个context对象。context对象生成并存储加密计算所需的必要密钥:

import tenseal as tscontext = ts.context(ts.SCHEME_TYPE.BFV,
    poly_modulus_degree=4096, plain_modulus=1032193)

poly_modulus_degree参数用于确定多项式模的次数,这是一个具有整数系数的多项式。plain_modulus参数用于指定编码明文消息到可以加密和同态处理的多项式的模数。如果plain_modulus参数太小,消息可能会溢出并导致错误的结果,而如果太大,密文可能会变得过大并减慢同态操作的速度。

在之前的代码中,我们使用了Brakerski-Fan-VercauterenBFV)方案。BFV 是一种支持整数算术的同态加密方案。它包括不同的多项式时间算法,用于生成公钥和私钥、加密明文消息、解密密文消息、对两个密文进行加法和减法以及乘法运算。密文是加密信息,在没有适当的密钥或执行加密或解密算法的情况下,我们或计算机无法读取,或者算法无法解密它。

现在我们定义一个包含三个数字的列表:

plain_list = [50, 60, 70]

然后我们使用之前定义的context对象实现解密:

encrypted_list = ts.bfv_vector(context, plain_list)

然后我们首先实现以下操作过程:

add_result = encrypted_vector + [1, 2, 3]

生成的add_result列表将是[51, 62, 73],这是原始值列表[50, 60, 70][1, 2, 3]逐元素求和的结果。

虽然同态加密或其他加密技术看起来非常安全,但它仍然需要访问密钥,例如在云服务器上,这可能导致安全担忧。有解决方案可以降低这种风险,例如使用密钥管理服务,如 AWS KMS(aws.amazon.com/kms/) 或多因素认证MFA)。

接下来,我们将简要回顾差分隐私DP)作为一种保护单个数据点隐私的技术。

差分隐私

差分隐私的目标是确保删除或添加单个数据点不会影响建模的结果。例如,通过向正态分布添加随机噪声,它试图使单个数据点的特征变得模糊。如果可以访问大量数据点,基于大数定律(Dekking et al., 2005),可以消除噪声在学习中的影响。为了更好地理解这个概念,我们想要生成一个随机数字列表,并从正态分布中向它们添加噪声,以帮助您更好地理解为什么这种技术有效。在这个过程中,我们还将定义一些广泛使用的技术术语。

我们首先定义一个名为gaussian_add_noise()的函数,用于向查询值列表添加高斯噪声:

def gaussian_add_noise(query_result: float,    sensitivity: float, epsilon: float):
        std_dev = sensitivity / epsilon
        noise = np.random.normal(loc=0.0, scale=std_dev)
        noisy_result = query_result + noise
    return noisy_result

在前面的函数中,我们使用了sensitivityepsilon作为函数的输入参数,其意义可以简化如下:

  • sensitivity: DP 机制中所需的噪声水平由灵敏度参数确定。灵敏度告诉我们查询结果对变化的影响。较大的sensitivity值将导致更好的隐私,但响应的准确性较低。

  • epsilon (隐私预算): 隐私预算是一个参数,它限制了噪声数据和查询数据之间偏差的程度。较小的epsilon值将导致更好的隐私,但响应的准确性较低。

然后,我们使用一个简单的for循环来生成符合正态分布的随机值作为查询值,然后使用定义的gaussian_mechanism()函数向它们添加噪声:

query_list = []noisy_list = []
for iter in range(1000):
    # Generating a random value between 0 and 100
    query_val = np.random.rand()*100
    noisy_val = gaussian_add_noise(query_val, sensitivity,
        epsilon_budget)
    query_list.append(query_val)
    noisy_list.append(noisy_val)
print('Mean of the original distribution:
    {}'.format(np.mean(query_list)))
print('Mean of the nosiy distribution:
    {}'.format(np.mean(noisy_list)))
print('Standard deviation of the original distribution:
    {}'.format(np.std(query_list)))
print('Standard deviation of the nosiy distribution:
    {}'.format(np.std(noisy_list)))

结果的噪声和查询分布非常相似,平均值为 0.78 和 0.82,标准差分别为 99.32 和 99.67。图 16*.1*显示了这两组值的散点图。你可以通过调整sensitivityepsilon参数来改变查询值和噪声值之间的距离。

图 16.1 – 添加噪声前后变量值的比较

图 16.1 – 添加噪声前后变量值的比较

此外,还有一些 Python 库可以帮助你实现 DP,如下所示:

本章最后要介绍的主题被称为联邦学习,它帮助我们超越中央存储系统的隐私保护。

联邦学习

联邦学习FL)依赖于去中心化学习、数据分析和解推理的想法,因此允许用户数据保持在单个设备或本地数据库中(Kaissis 等人,2020 年;Yang 等人,2019 年)。通过 FL,我们可以从无法存储在集中式数据存储系统中的本地设备和用户数据中受益,以训练和改进我们的机器学习模型。如图图 16**.2所示,本地设备或用户可以提供本地数据以更新全局模型和我们正在训练的模型,并改善中心服务器。然后全局模型得到更新和改进,并向本地用户和设备提供更新的推理。

图 16.2 – 使用本地数据更新模型并反馈全局模型到本地设备和用户的示意图

图 16.2 – 使用本地数据更新模型并反馈全局模型到本地设备和用户的示意图

在实现联邦学习(FL)时,你可以从以下 Python 库中受益:

然而,在实践中使用联邦学习的挑战超出了编程或基础设施设计。尽管这是存储用户数据本地化的绝佳替代方案,但在不同应用中从联邦学习中受益仍存在伦理、法律和商业挑战。医疗保健是一个联邦学习可以带来最大利益的领域,但法律和伦理挑战仍然存在,这减缓了其实际应用的实施。许多机构、医院、制药公司和政府机构仍然要求用于建模的数据,即使通过联邦学习,也需要经过通常用于完全访问数据的伦理、法律和商业审批流程。然而,随着联邦学习算法和相关基础设施的改进,机构、医院和机构也将提出解决方案,以利用这项技术。

除了本章中关于数据隐私和安全的讨论,你还可以在第三章 向负责任的人工智能调试中回顾机器学习设置中的重要攻击主题。你还可以检查其他资源,如 Papernot 等人 2018 年发表的优秀文章《Sok:机器学习中的安全和隐私》以了解更多关于这些重要主题的信息。

摘要

在本章中,你了解了一些帮助你保护隐私和确保安全的重要概念和技术,包括数据加密技术、同态加密、差分隐私和联邦学习。你学习了同态加密如何提供与传统数据加密技术相比不同类型操作和机器学习推理的可能性。你还学习了如何通过向数据添加噪声、在差分隐私中,或者与去中心化数据合作并省略传输原始数据的需求,如在联邦学习中,来确保数据隐私。你还在 Python 中实践了一些这些技术。这些知识可以成为你进一步了解这些概念并从你的机器学习项目中受益的起点。

在下一章中,你将了解将人类反馈整合到机器学习建模中的重要性以及有助于这一主题的技术。

问题

  1. 解释三种可以帮助你在机器学习项目中使用的加密技术。

  2. 在机器学习设置中,同态加密有什么好处?

  3. 什么是差分隐私?

  4. 使用联邦学习或差分隐私时有哪些非技术挑战?

参考文献

  • Shafahi, Ali, 等人. “免费对抗训练!.” 神经信息处理系统进展 32 (2019).

  • Gaur, Shailendra Singh, Hemanpreet Singh Kalsi, 和 Shivani Gautam. “加密算法的比较研究和分析:RSA, DES, AES, BLOWFISH, 3-DES, 和 TWOFISH。”

  • Bhanot, Rajdeep, 和 Rahul Hans. “各种加密算法的综述和比较分析.” 国际安全与应用杂志 9.4 (2015): 289-306.

  • Dibas, Hasan, 和 Khair Eddin Sabri. “对称算法(AES, 3DES, Blowfish 和 Twofish)的全面性能实证研究.” 信息技术国际会议 (ICIT). IEEE (2021).

  • Armknecht, Frederik, 等人. “完全同态加密指南.” 密码学电子档案 (2015).

  • Gentry, Craig. 全同态加密方案. 斯坦福大学,2009.

  • Yousuf, Hana, 等人. “关于全同态加密方案及其应用的系统综述.” 智能系统和智能应用最新进展 (2020): 537-551.

  • Yang, Qiang, 等人. “联邦机器学习:概念和应用.” ACM 智能系统与技术交易 (TIST) 10.2 (2019): 1-19.

  • Abadi, Martin, 等人. “具有差分隐私的深度学习.” 2016 年 ACM SIGSAC 计算机和通信安全会议论文集 (2016).

  • Dekking, Frederik Michel, 等人. 现代概率与统计导论:理解为什么以及如何. 第 488 卷. 伦敦:Springer (2005).

  • Kaissis, Georgios A., 等人. “医学图像中的安全、隐私保护和联邦机器学习.” 自然机器智能 2.6 (2020): 305-311.

  • Yang, Qiang, 等人. “联邦机器学习:概念和应用.” ACM 智能系统与技术交易 (TIST) 10.2 (2019): 1-19.

  • Papernot, Nicolas, 等人. “机器学习中的安全和隐私(Sok).” IEEE 欧洲安全与隐私研讨会 (EuroS&P). IEEE (2018).

第十七章:人类在环机器学习

机器学习建模不仅仅是机器学习开发者和工程师坐在电脑后面构建和修改机器学习生命周期的组件。融入领域专家或非专家群体的反馈对于将更可靠和应用导向的模型投入生产至关重要。这个被称为人类在环机器学习的概念,是关于在不同生命周期阶段利用人类智能和专业知识来进一步提高我们模型的性能和可靠性。

本章将涵盖以下主题:

  • 机器学习生命周期中的人类

  • 人类在环建模

到本章结束时,你将了解在机器学习建模项目中融入人类智能的好处和挑战。

机器学习生命周期中的人类

开发和改进机器学习生命周期的不同组件,以将可靠且高性能的模型投入生产是一个需要专家和非专家人类反馈的协作努力(图 17.1):

图 17.1 – 机器学习生命周期中的人类

图 17.1 – 机器学习生命周期中的人类

例如,放射科医生可以在标注放射学图像时提供帮助,而大多数具有良好视觉能力的人可以轻松地标注猫和狗的图像。但融入人类反馈并不限于生命周期开始时的数据标注。

我们可以利用人类智能和专业知识来改进生命周期中的数据准备、特征工程和表示学习等方面,以及模型训练和测试,最终实现模型的部署和监控。在这些每个阶段,人类反馈都可以被动或主动地融入,这使我们能够将更好的模型投入生产。

被动的人类在环是关于收集专家和非专家的反馈和信息,并在下一次修改相应的机器学习建模系统的组件时从中受益。在这个过程中,反馈和额外信息有助于识别改进生命周期组件的机会,以及识别数据漂移和概念漂移,以将更好的模型投入生产。在主动的人类在环机器学习中,基础设施和生命周期的一个或所有组件需要以某种方式设计,以便额外的人类在环信息和数据可以主动和持续地融入,以改进数据分析建模。

首先,我们将回顾专家反馈收集以及如何有效地从中受益来改进我们的模型。

专家反馈收集

在一个或多个机器学习模型之上构建一项技术的最终目标是提供一个工具,供用户、专家或非专家用于特定目标,例如医疗图像分类、股价预测、信用风险评估以及亚马逊等平台上的产品推荐。例如,我们可以收集数据标注或生产阶段后期用于漂移检测的反馈。然后我们可以利用这些反馈来改进我们的模型。然而,这种反馈可能超出了仅仅数据标注或识别数据和概念漂移的目的。

我们可以将专家反馈纳入四个主要目的:数据生成和标注、数据过滤、模型选择和模型监控。专家反馈收集对于标注和监控通常与非专家数据收集相似,除了在某些应用中,专业知识是必需的,例如在分类放射学图像时。

对于模型选择,我们可以利用专家反馈,不仅依赖于我们用于模型性能评估的性能指标,而且根据错误预测检测红旗,或者根据模型的解释性信息进行选择,例如,如果对预测贡献最大的特征具有最低的相关性。

我们还可以从专家的反馈中受益,以监控我们的模型。正如在第十一章“避免和检测数据及概念漂移”中讨论的那样,漂移检测对于确保我们的模型在生产中的可靠性至关重要。在许多应用中,我们模型的使用者可能是特定领域的专家,例如医疗保健和药物发现。在这种情况下,我们需要确保我们持续收集他们的反馈,并利用这些反馈来检测和消除模型中的漂移。

从我们机器学习模型的使用者那里收集专家反馈不应仅限于获取他们“好”与“坏”的二进制响应。我们需要提供关于我们的模型及其预测的足够信息,并要求专家提供以下反馈:

  • 提供足够的信息:当我们向我们的模型专家用户请求反馈时,我们需要提供足够的信息以获得更好和更相关的反馈。例如,除了我们的模型在测试和生产中的性能,或针对一组特定数据点的错误和正确预测之外,我们还可以提供关于模型如何针对这些数据点做出决策的解释性信息。这类信息可以帮助用户提供更好的反馈,从而帮助我们改进模型。

  • 不要要求翻译:我们模型的许多用户可能对统计和机器学习建模知识有限。因此,要求他们将自己的意见和想法转换为技术术语将限制有效的反馈收集。你需要提供足够的信息,并要求他们的反馈,进行双向对话,将他们的见解转化为改进模型的行动项。

  • 设计自动化反馈收集:虽然最好不要求翻译,如前所述,你可以通过使用清晰详细的问题和适当的基础设施设计来收集反馈并将其纳入模型,从而朝着更自动化的反馈收集迈进。例如,你可以使用机器学习可解释性,并询问模型用于预测特定数据点集输出的最有信息量的特征是否与任务相关。

环境中的人类建模有其自身的挑战,例如,当需要第三方公司监控模型和管道时,或者在分享来自合作者和商业伙伴的数据时存在特定的法律障碍,我们团队和组织中的其他人。在设计时,我们需要牢记这些挑战,以便我们可以在机器学习生命周期中从人类反馈中受益。

尽管我们可以在机器学习生命周期的不同阶段收集反馈来改进我们的模型,但还有一些技术,如主动学习(我们将在下一节中介绍),可以帮助我们以更低的成本将更好的模型投入生产。

环境中的人类建模

尽管更多高质量的标注数据点更有价值,但标注数据的成本可能非常高,尤其是在需要领域专业知识的情况下。主动学习是一种帮助我们以较低成本生成和标注数据以改进模型性能的策略。在主动学习环境中,我们旨在利用有限的数据量,迭代选择新的数据点进行标注,或识别其连续值,以达到更高的性能(Wu et al., 2022; Ren et al., 2021; Burbidge et al., 2007)。模型会查询需要由专家或非专家标注的新实例,或者通过任何计算或实验技术识别其标签或连续值。然而,与随机选择实例不同,有新技术用于选择新实例,以帮助我们以更少的实例和迭代次数实现更好的模型(表 17.1)。每种技术都有其优缺点。例如,不确定性采样简单,但如果实例预测输出的不确定性没有高度相关于模型错误,其对性能的影响可能有限:

数据中心模型中心
不确定性采样选择具有最大不确定性的实例(在推理中),这些实例可能是分类问题中离决策边界最近的实例预期模型变化选择已知标签的实例,对当前模型的影响最大
密度加权不确定性采样选择不仅具有最高不确定性,而且代表了许多其他依赖特征空间数据密度的数据点的实例误差减少估计选择已知标签的实例,将导致最大的未来误差减少
委员会查询多个模型(委员会)被训练,并选择预测中分歧最大的实例方差减少选择已知标签的实例,将导致模型对其参数的不确定性减少最多

表 17.1 – 每个步骤中用于实例选择的主动学习技术

在本章中,我们专注于介绍人类在循环背后的概念和技术。然而,有一些 Python 库,如modAL (modal-python.readthedocs.io/en/latest/),可以帮助你在项目中实现一些这些技术,将人类反馈引入你的机器学习生命周期。

摘要

在本章中,你了解了一些人类在循环机器学习中的重要概念,这些概念可以帮助你在与专家或非专家的团队合作中更好地建立协作,以便你可以将他们的反馈纳入你的机器学习建模项目中。

这是本书的最后一章。我希望你学到了足够多的关于提高机器学习模型和构建更好模型的不同方法,以便你可以开始你的旅程,成为这个领域的专家。

问题

  1. 人类在循环机器学习是否仅限于数据标注和标签化?

  2. 在主动学习过程的每个步骤中,不确定性采样和密度加权不确定性采样在实例选择上的区别是什么?

参考文献

  • Amershi, Saleema, 等人。赋予人民力量:人类在交互式机器学习中的作用. 人工智能杂志 35.4(2014):105-120。

  • Wu, Xingjiao, 等人。人机交互机器学习综述. 未来一代计算机系统 135(2022):364-381。

  • Ren, Pengzhen, 等人。深度主动学习综述. ACM 计算调查(CSUR)54.9(2021):1-40。

  • Burbidge, Robert, Jem J. Rowland, 和 Ross D. King. 基于委员会查询的回归主动学习. 智能数据工程与自动学习-IDEAL 2007:第 8 届国际会议,英国伯明翰,2007 年 12 月 16-19 日。第 8 卷。Springer Berlin Heidelberg,2007。

  • Cai, Wenbin, Ya Zhang, 和 Jun Zhou. 最大化回归中主动学习的预期模型变化. 2013 年第 13 届国际数据挖掘会议。IEEE,2013。

  • Roy, Nicholas, 和 Andrew McCallum. 通过蒙特卡洛估计误差减少实现最优主动学习. ICML,威廉斯塔特 2(2001):441-448。

  • Donmez, Pinar, Jaime G. Carbonell, 和 Paul N. Bennett. 双重策略主动学习. 机器学习:ECML 2007:第 18 届欧洲机器学习会议,波兰华沙,2007 年 9 月 17-21 日。第 18 卷。Springer Berlin Heidelberg,2007。

评估

第一章 – 超越代码调试

  1. 是的——这里有一个在本章中提供的例子:

    def odd_counter(num_list: list):    """    :param num_list: list of integers to be checked for identifying odd numbers    :return: return an integer as the number of odd numbers in the input list    """    odd_count = 0    for num in num_list:        if (num % 2) == 0:            print("{} is even".format(num))        else:            print("{} is even".format(num))        odd_count += 1    return odd_countnum_list = [1, 2, 5, 8, 9]print(odd_counter(num_list))
    
  2. 这里是它们的定义:

    • AttributeError:当对一个未为其定义属性的对象使用属性时,会引发此类错误。例如,isnull未在列表中定义。因此,my_list. isnull()会导致AttributeError

    • NameError:当你尝试调用未在代码中定义的函数、类或其他名称和模块时,会引发此错误。例如,如果你没有在代码中定义neural_network类,但在代码中调用它为neural_network(),你将得到NameError消息。

  3. 高维性使得特征空间更稀疏,可能会降低模型在分类设置中识别可推广决策边界的信心。

  4. 当你在 Python 中遇到错误信息时,它通常会提供必要的信息来帮助你找到问题。这些信息创建了一个类似报告的消息,关于代码中发生错误的行,错误类型,以及导致这些错误的功能或类调用。这种类似报告的消息在 Python 中称为回溯

  5. 增量编程:为每个小组件编写代码,然后测试它,例如使用 PyTest 编写测试代码,这可以帮助你避免每个编写的功能或类的问题。它还帮助你确保作为另一个模块输入的模块的输出是兼容的。

日志记录:当你用 Python 开发函数和类时,你可以从日志记录中受益,将信息、错误和其他类型的消息记录下来,以帮助你识别在收到错误信息时的潜在问题来源。

  1. 例如,如果你使用专家,如放射科医生,为癌症诊断标注医学图像,那么对图像标签的信心可能不同。这些信心可以在建模阶段考虑,无论是在数据收集过程中,例如通过要求更多专家标注相同的图像,还是在建模过程中,例如通过根据标签的信心为每个图像分配权重。你的数据特征也可能具有不同的质量。例如,你可能具有高度稀疏的特征,这些特征在数据点中大部分为零值,或者具有不同置信水平的特征。例如,如果你使用卷尺来捕捉物体尺寸(如骰子)之间的毫米差异,而不是使用相同的卷尺来捕捉更大物体(如家具)之间的差异,那么测量特征将具有较低的置信度。

  2. 你可以通过控制模型复杂度来控制欠拟合和过拟合。

  3. 是的,这是可能的。用于训练和测试机器学习模型的数据可能会过时。例如,服装市场趋势的变化可能会使服装推荐模型的预测变得不可靠。

  4. 仅通过调整模型超参数,你无法开发出最佳可能的模型。同样,通过增加数据和超参数的质量和数量,同时保持模型超参数不变,你也不能达到最佳性能。因此,数据和超参数是相辅相成的。

第二章 – 机器学习生命周期

  1. 清洗过程的例子包括在数据中填充缺失值和移除异常值。

  2. One-hot 编码为每个分类特征类别生成一个新特征。标签编码保持相同的特征,只是将每个类别替换为分配给该类别的数字。

  3. 检测异常值的最简单方法是通过使用变量值分布的分位数。超出上下界限的数据点被认为是异常值。下限和上限可以计算为Q1-a.IQRQ3+a.IQR,其中a可以是一个介于 1.5 和 3 之间的实数值。a的常用值也是默认用于绘制箱线图的 1.5,但使用更高的值会使异常值识别过程不那么严格,并允许检测到更少的数据点作为异常值。

  4. 如果你想在医院医生的电脑上部署一个模型,以便临床医生直接使用,你需要考虑所有必要的困难和规划,以设置适当的生产环境以及所有软件依赖项。你还需要确保他们的本地系统满足必要的硬件要求。如果你想在银行系统中部署在聊天机器人背后的模型,这些就不是需要考虑的因素。

第三章 – 负责任的人工智能调试

  1. 数据收集偏差:收集的数据可能存在偏差,例如性别偏差,如在亚马逊的应聘者排序示例中,种族偏差,如在 COMPAS 中,社会经济偏差,如在住院示例中,或其他类型的偏差。

抽样偏差:数据偏差的另一个来源可能是数据收集阶段的生命周期中数据点的抽样或人群的抽样过程。例如,在抽样学生填写调查时,我们的抽样过程可能偏向于女孩或男孩,富裕或贫穷的学生家庭,或高年级与低年级学生。

  1. 完美知识白盒攻击:攻击者了解系统的所有信息。

零知识黑盒攻击:攻击者对系统本身没有任何了解,但通过在生产中对模型进行预测来收集信息。

  1. 加密过程将信息、数据或算法转换成新的(即,加密)形式。如果个人有权访问加密密钥(即,解密过程中必要的密码式密钥),则加密数据可以被解密(即,成为可读或机器可理解的)。这样,在没有加密密钥的情况下获取数据和算法将几乎不可能或非常困难。

  2. 差分隐私试图确保删除或添加单个数据点不会影响建模的结果。它试图从数据点的组中学习模式。例如,通过添加来自正态分布的随机噪声,它试图使单个数据点的特征变得模糊。如果可以访问大量数据点,则可以根据大数定律消除学习中的噪声效应。

联邦学习依赖于分散学习、数据分析和推理的想法,从而允许用户的数据保留在单个设备或本地数据库中。

  1. 透明度有助于在用户中建立信任,并可能增加信任并使用您模型的用户数量。

第四章 – 在机器学习模型中检测性能和效率问题

  1. 在初步诊断测试中,随着更精确的后续测试,我们希望确保我们不会失去任何我们正在测试的疾病患者。因此,我们需要旨在减少假阴性,同时尝试减少假阳性。因此,我们可以旨在最大化召回率,同时控制精确度特异性

  2. 在这种情况下,您需要确保您有 精确度 来控制风险并建议良好的投资机会。这可能会导致较低的 召回率,这是可以接受的,因为不良投资可能导致个人投资者资本的重大损失。在这里,我们不考虑投资风险管理的细节,而希望对如何选择良好的性能指标有一个高层次的理解。如果您是这个领域的专家,考虑您的知识,并选择一个满足您已知要求的良好性能指标。

  3. ROC-AUC 是一个汇总指标。具有相同 ROC-AUC 的两个模型可能对个别数据点的预测不同。

  4. MCC 关注预测标签,而 log-loss 关注测试数据点的预测概率。因此,较低的 log-loss 并不一定导致较低的 MCC

  5. 不一定。R2 并不考虑数据维度(即特征、输入或独立变量的数量)。具有更多特征的模型可能导致更高的 R2,但这不一定是一个更好的模型。

  6. 这取决于用于评估模型泛化能力的性能指标和测试数据。我们需要为生产中的目标使用正确的性能指标,并使用一组数据点进行模型测试,这组数据点将更能反映生产中未见数据。

第五章 – 提高机器学习模型的性能

  1. 增加更多的训练数据点可以帮助减少方差,而增加更多的特征可以帮助减少偏差。然而,通过添加新的数据点来减少方差,或者新特征是否有助于减少方差,都没有保证。

优化过程中的权重分配:在训练机器学习模型时,您可以根据类别标签的置信度,为每个数据点分配一个权重。

集成学习:如果您考虑每个数据点的质量或置信度分数的分布,那么您可以使用分布的每个部分的数据点构建不同的模型,然后结合这些模型的预测,例如使用它们的加权平均。

迁移学习:您可以在具有不同标签置信度级别的大数据集上训练一个模型(参见 图 5*.3*),排除非常低置信度的数据,然后在数据集非常高置信度的部分进行微调。

  1. 通过提高识别决策边界的置信度,在分类设置中,少数类是稀疏的。

  2. 如果我们使用 Borderline-SMOTE,新合成的数据点将接近多数类数据点,这有助于识别一个可推广的决策边界。

在 DSMOTE 中,DBSCAN 用于将少数类的数据点划分为三个组:核心样本、边界样本和噪声(即异常)样本,然后仅使用核心和边界样本进行过采样。

  1. 如本章所述,搜索所有可能的超参数组合并不是必要的。

  2. 是的,L1 正则化可以消除特征对正则化过程的贡献。

  3. 是的,这是可能的。

第六章 – 机器学习建模中的可解释性和可解释性

  1. 可解释性可以帮助提高性能,例如通过减少模型对特征值小变化的敏感性,提高模型训练中的数据效率,试图帮助模型进行适当的推理,以及避免虚假相关性。

  2. 局部可解释性帮助我们理解模型在特征空间中接近数据点的行为。尽管这些模型满足局部保真度标准,但被识别为局部重要的特征可能不是全局重要的,反之亦然。

全局可解释性技术试图超越局部可解释性,并为模型提供全局解释。

  1. 线性模型虽然可解释,但通常性能较低。相反,我们可以从更复杂、性能更高的模型中受益,并使用可解释性技术来理解模型是如何得出其预测的。

  2. 是的,确实如此。可解释性技术可以帮助我们了解哪些模型是预测一组数据点的主要贡献者。

  3. SHAP 可以确定每个特征对模型预测的贡献。由于特征在确定分类模型的决策边界并最终影响模型预测方面是协同工作的,SHAP 尝试首先识别每个特征的边际贡献,然后提供 Shapely 值作为每个特征与整个特征集合作预测模型的估计。

LIME 是 SHAP 的替代品,用于 局部可解释性,它以模型无关的方式解释任何分类器或回归器的预测,通过在局部近似一个可解释的模型。

  1. 反事实示例或解释有助于我们确定在实例中需要改变什么才能改变分类模型的输出。这些反事实可以帮助在许多应用中识别可操作的路径,例如金融、零售、营销、招聘和医疗保健。例如,我们可以用它们来建议银行客户如何改变其贷款申请被拒绝的情况。

  2. 如在使用多样化的反事实解释(DiCE)生成反事实部分所述,并非所有反事实都符合每个特征的定义和意义。例如,如果我们想建议一个 30 岁的人改变他们的结果,建议他们等到 50 多岁才这样做并不是一个有效且可行的建议。同样,建议将hours_per_week的工作时间从 38 小时增加到>80 小时也是不可行的。

第七章 – 减少偏差和实现公平性

  1. 不一定。我们的模型中可能有敏感属性的代理,但不是我们的模型中。

  2. 薪酬和收入(在某些国家),职业,犯罪指控的历史。

  3. 不一定。根据人口比例来满足公平性并不一定会导致模型根据均衡机会来表现公平。

  4. 人口比例是一个群体公平性定义,旨在确保模型的预测不依赖于给定的敏感属性,如种族或性别。

均衡机会在给定预测与给定敏感属性组独立且与真实输出无关时得到满足。

  1. 不一定。例如,模型预测的主要贡献者中可能有 'sex' 的特征代理。

  2. 我们可以使用可解释性技术来识别模型中的潜在偏差,然后计划改进它们以实现公平性。例如,我们可以识别男性和女性群体之间的公平性问题。

第八章 – 使用测试驱动开发控制风险

  1. pytest是一个简单易用的 Python 库,你可以用它来设计单元测试。设计的测试可以简单地用来测试代码的变化,并在整个开发过程和未来代码的变化中控制潜在错误的危险。

  2. 在数据分析和机器学习建模的编程中,我们需要使用来自不同变量或数据对象的数据,这些数据可能来自本地机器或云端的文件,也可能来自数据库的查询,或者来自我们的测试的 URL。固定装置(Fixtures)通过消除在测试中重复相同代码的需要来帮助我们完成这些过程。将固定装置函数附加到测试上会在每个测试运行之前运行它,并将数据返回给测试。我们可以使用pytest文档页面上的示例(docs.pytest.org/en/7.1.x/how-to/fixtures.html)。

  3. 差分测试试图检查同一输入上的软件的两个版本,即基版和测试版,并比较输出。这个过程有助于确定输出是否相同,并识别意外的差异。在差分测试中,基版已经过验证,被认为是批准的版本,而测试版需要与基版进行比较,以产生正确的输出。

  4. mlflow是一个广泛使用的机器学习实验跟踪库,我们可以在 Python 中使用它。跟踪我们的机器学习实验将帮助我们减少无效结论的风险和选择不可靠模型的风险。机器学习中的实验跟踪是关于保存有关实验的信息,例如已使用的数据、测试性能和用于性能评估的指标,以及用于建模的算法和超参数。

第九章 – 生产测试和调试

  1. 数据漂移:如果生产中特征或独立变量的特征和意义与建模阶段不同,就会发生数据漂移。想象一下,你使用第三方工具为人们的健康或财务状况生成分数。该工具背后的算法可能会随时间变化,并且当你的模型在生产中使用时,其范围和意义将不会相同。如果你没有相应地更新你的模型,那么你的模型将不会按预期工作,因为特征值的含义在用于训练的数据和部署后的用户数据之间将不同。

概念漂移:概念漂移是指输出变量定义的任何变化。例如,由于概念漂移,训练数据和生产数据之间的实际决策边界可能不同,这意味着训练中的努力可能导致生产中的决策边界远离现实。

  1. 模型断言可以帮助你早期发现问题,例如输入数据漂移或其他可能影响模型性能的意外行为。我们可以将模型断言视为在模型训练、验证甚至部署期间进行检查的一组规则,以确保模型的预测满足预定义的条件。模型断言可以从许多方面帮助我们,例如检测和诊断模型或输入数据的问题,使我们能够在它们影响模型性能之前解决这些问题。

  2. 这里有一些集成测试组件的例子:

    • 测试数据管道:我们需要评估在模型训练之前的数据预处理组件,如数据整理,在训练和部署阶段之间是否一致。

    • 测试 API:如果我们的机器学习模型通过 API 公开,我们可以测试 API 端点以确保它们正确处理请求和响应。

    • 测试模型部署:我们可以使用集成测试来评估模型的部署过程,无论它是作为独立服务、容器内还是嵌入在应用程序中部署。这个过程帮助我们确保部署环境提供必要的资源,例如 CPU、内存和存储,并且如果需要,模型可以更新。

    • 测试与其他组件的交互:我们需要验证我们的机器学习模型能够与数据库、用户界面或第三方服务无缝工作。这可能包括测试模型预测在应用程序中如何存储、显示或使用。

    • 测试端到端功能:我们可以使用模拟真实场景和用户交互的端到端测试来验证模型的预测在整体应用程序的上下文中是准确、可靠和有用的。

  3. IaC 和配置管理工具,如 Chef、Puppet 和 Ansible,可以用于自动化软件和硬件基础设施的部署、配置和管理。这些工具可以帮助我们确保在不同环境中的一致性和可靠性。首先,在描述这些 IaC 工具对我们有什么用之前,我们需要定义两个重要的术语:客户端和服务器:

    • Chef (www.chef.io/products/chef-infrastructure-management): Chef 是一款开源配置管理工具,它依赖于客户端-服务器模型,其中 Chef 服务器存储期望的配置,Chef 客户端将其应用于节点。

    • Puppet (www.puppet.com/): Puppet 是另一款开源配置管理工具,它可以在客户端-服务器模式下工作,也可以作为独立应用程序运行。Puppet 通过定期从 Puppet 主服务器拉取配置来强制执行节点上的期望配置。

    • Ansible (www.ansible.com/): Ansible 是一款开源且易于使用的配置管理、编排和自动化工具,它采用无代理架构来与节点通信并应用配置。

第十章 – 版本控制和可重复的机器学习建模

  1. MLflow: 我们在之前的章节中介绍了 MLflow 用于实验跟踪和模型监控,但您也可以用它进行数据版本化 (mlflow.org/)。

DVC: 一个用于管理数据、代码和机器学习模型的开源版本控制系统。它旨在处理大型数据集,并与 Git 集成 (dvc.org/)。

Pachyderm: 一个提供机器学习工作流程可重复性、溯源和可扩展性的数据版本化平台 (www.pachyderm.com/)。

  1. No. 同一个数据文件的多个版本可以以相同的名称存储,并在需要时恢复和检索。

  2. 在将数据分割为训练集和测试集或模型初始化时简单更改随机状态可能会导致训练集和评估集的参数值和性能不同。

第十一章 – 避免和检测数据漂移和概念漂移

  1. 幅度:我们可能会遇到数据分布中不同的幅度差异,导致我们的机器学习模型发生漂移。数据分布中的小变化可能难以检测,而大变化可能更明显。

频率:漂移可能发生在不同的频率上。

  1. Kolmogorov-Smirnov 测试可用于数据漂移检测。

第十二章 – 深度学习超越 ML 调试

  1. 是的,在正向传递中,已经计算出的参数被用于输出生成;然后,实际输出和预测输出之间的差异被用于反向传播过程中更新权重。

  2. 在随机梯度下降中,每个迭代使用一个数据点来优化和更新模型权重,而在小批量梯度下降中,使用数据点的小批量(小子集)。

  3. 每个批次或小批量是训练集中用于计算损失和更新模型权重的数据点的小子集。在每个 epoch 中,多个批次被迭代以覆盖所有训练数据。

  4. Sigmoid 和 softmax 函数通常用于输出层,将输出神经元的分数转换为介于零和一之间的值,用于分类模型。这被称为预测的概率。

第十三章 – 高级深度学习技术

  1. CNNs 可用于图像分类或分割——例如,用于放射学图像以识别恶性肿瘤(肿瘤区域)。另一方面,GNNs 可用于社交和生物网络。

  2. 是的,确实如此。

  3. 这可能会导致更多的错误。

  4. 为了应对这一挑战,在称为填充的过程中,在单词序列或句子中的每个单词的标记 ID 之前或之后使用一个常见的 ID,例如 0。

  5. 我们为 CNNs 和 GNNs 构建的类别具有相似的代码结构。

  6. 边缘特征有助于你包含一些关键信息,具体取决于应用。例如,在化学中,你可以将化学键的类型作为边缘特征,而节点可以是图中的原子。

第十四章 – 机器学习最新进展简介

  1. 基于 Transformer 的文本生成,VAEs 和 GANs。

  2. LLaMA 和 GPT 的不同版本。

  3. 生成器,它可以是用于生成所需数据类型的神经网络架构,例如图像,生成图像的目的是欺骗判别器将其识别为真实数据。判别器学习在识别生成数据与真实数据相比保持良好。

  4. 你可以通过具体说明问题和指定数据生成对象来提高你的提示。

  5. 在 RLHF 中,奖励是根据人类反馈计算的,无论是专家还是非专家,这取决于问题。但奖励并不是像考虑语言模型等问题的复杂性那样预定义的数学公式。人类提供的反馈导致模型逐步改进。

  6. 对比学习的想法是学习表示,使得相似数据点彼此更接近,而不同数据点则更远。

第十五章 – 相关性 versus 因果性

  1. 是的。在监督学习中,你可以有与输出高度相关的特征,而这些特征并不是因果的。

  2. 建立因果关系的一种方法是通过实验,如在实验设计中,我们测量因果特征变化对目标变量的影响。然而,这种实验研究可能并不总是可行或道德的。在观察性研究中,我们使用观察数据,而不是控制实验,并试图通过控制混杂变量来识别因果关系。

  3. 工具变量用于因果分析,以克服观察性研究中常见的共同问题,即治疗变量和结果变量由其他变量(或混杂因素)共同决定,而这些变量未包含在模型中。这种方法从识别一个与治疗变量相关且与结果变量不相关(除了通过其对治疗变量的影响)的工具变量开始。

  4. 从特征到结果的方向并不一定意味着因果性。但贝叶斯网络可以用来估计变量对结果的影响,同时控制混杂变量。

第十六章 – 机器学习中的安全和隐私

  1. 高级加密标准AES):AES 是保护数据的最强大的加密算法之一。AES 接受不同的密钥大小:128 位、192 位或 256 位。

三重数据加密标准DES):三重 DES 是一种使用 56 位密钥加密数据块的加密方法。

Blowfish:Blowfish 是一种对称密钥加密技术,用作 DES 加密算法的替代方案。Blowfish 加密速度快,对数据加密非常有效。它将数据,例如字符串和消息,分成 64 位的块,并分别加密它们。

  1. 我们可以在不需要解密的情况下使用模型对加密数据进行推理。

  2. 差分隐私DP)的目标是确保删除或添加单个数据点不会影响建模的结果。例如,通过向正态分布添加随机噪声,它试图使单个数据点的特征变得模糊不清。

  3. 在实践中使用联邦学习(FL)或差分隐私(DP)的挑战不仅限于编程或基础设施设计。尽管存储用户数据本地有这样一个很好的替代方案,但在从不同应用中受益于 FL 时,仍然存在伦理、法律和商业挑战。

第十七章 – 循环中的人类机器学习

  1. 不,例如,您可以通过主动学习将人类专家引入循环。

  2. 不确定性采样中,数据点仅根据推理中的不确定性被选中。但在密度加权不确定性采样中,实例不仅基于它们最高的不确定性被选中,还要代表依赖于特征空间中数据密度的许多其他数据点。