使用Bin Model来回答Machine Learning机制的合理性

Motivation

Machine leanring的核心思想是:通过大量的数据来拟合出模型(hypothesis)的参数,进而使用参数齐全的模型来做出预测。模型的本质是用数学的形式来描述你对数据的一种偏见、看法和主观感受。它以数学的方式阐述了:“你认为”这堆数据是按照什么样的规则被产生的。

那么既然是“主观认为”,要将其变成令人信服的相对客观的规律,就需要你使用各种方式来证明你的这种“认为”是合情合理的。

最直观的“证明”当然是:对给出的数据集(training data)我的模型都能够做到完美预测。但这种证明的一个强有力的反例是:只需要构建一个模型将所有training data的结果记住,而在其它数据点做任意的预测,也能满足。

显然,这样的模型毫无意义,等同于:只掌握了课程考试需要的题目,并不意味着你掌握了这门课程。

那么,更广泛地讲,你所能得到的数据集,永远只能是一个局部。模型是产生数据的机制,它可以产生无数的数据,而training data只是一个模型产生出来的一个特定的、小的结果集合。一系列直指核心的问题是:

  • 为什么可以通过局部(training data)来获得全局的运转机制(模型)?
  • 这样的预测,其准确度是多少?
  • 有精确的“数量关系”来描述局部样本预测全局机制准确性吗?

无法回答这些问题,machine learning就没有了存在的意义,所有模型参数拟合将变为一厢情愿的瞎忙。而bin model的引入,便是为了系统性地回答这些根本性的问题。

构建Bin Model

在详细地讨论之前,我们首先需要区分"真正的"模型和"假设的"(hypothesis)模型。所谓真实的模型,就是这堆数据真正产生的机制。这只是一个理想中的存在物,如同上帝的存在。引入它,仅仅是为了方便讨论,将不确定性控制在一个概念中。而hypothesis,就是我们根据数据所得出的一种偏见,即我们认为这堆数据会按照什么样的机制来被产出。

不妨假设那个如同上帝般存在的真实模型为 f f f,即一个函数 f : X → Y f: X \rarr Y f:XY 。我们的偏见所构成的模型为 h h h,即函数 h : X → Y h: X \rarr Y h:XY。我们要做的便是找到足够好的 h h h,使得它能够尽可能地逼近 f f f。什么叫做尽可能地逼近f呢?就是在对于 f f f 定义域 X X X上的点 x x x,使其能够满足 h ( x ) = f ( x ) h(x) = f(x) h(x)=f(x) ,这样的点越多,则说明 h h h 越是逼近 f f f

如此一来,对于 ∀ x ∈ X \forall x \in X xX ,只有关于模型 f f f 和假设 h h h 只有两种结果:

  • h ( x ) = f ( x ) h(x) = f(x) h(x)=f(x)
  • h ( x ) ≠ f ( x ) h(x) \neq f(x) h(x)̸=f(x) .

如果把整个 X X X看作是bin里面的所有弹珠,那么,可以把满足 h ( x ) ≠ f ( x ) h(x) \neq f(x) h(x)̸=f(x) x x x 当做桔色弹珠,把满足 h ( x ) = f ( x ) h(x) = f(x) h(x)=f(x) 的点当做是绿色弹珠。

(为什么要把 h ( x ) ≠ f ( x ) h(x) \neq f(x) h(x)̸=f(x) 当做主体——桔色弹珠?因为我们对误差更感兴趣,也即是通过样本的误差,来考察总体的误差。)

那么,我们要回答的核心列表中问题便可以转换为:通过training data,即从bin里抽取出来的一部分弹珠颜色的结果,我们能够对整个bin里的弹珠颜色成什么样的分布说些什么呢?

在这里插入图片描述

通常,直接考察这个bin中桔色弹珠的比例是困难和不切实际的。在工业生产中的做法当然是取一部分的小样,即通过样本,来倒推整个总体的分布。

在这里插入图片描述

此时,引入数学变量:

  • 设整个bin中(即真实的总体)桔色弹珠的比例为 μ \mu μ ,那么相应的绿色弹珠的比例就为 1 − μ 1-\mu 1μ
  • 设取出来的样本中(training data)中桔色弹珠的比例为 ν \nu ν ,那么相应的绿色弹珠的比例为 1 − ν 1-\nu 1ν

回顾我们间接要回答的核心问题,即是:通过小样本的 ν \nu ν (即通过在training data中看到的 h h h f f f 的误差),我们能够对真实的总体 μ \mu μ (即在 f f f 整个定义域上 h h h f f f 的误差 )说些什么呢?

在数学上,有 Hoeffding’s Inequality 给出的一个结论:

P [ ∣ μ − ν ∣ > ϵ ] ≤ 2 exp ⁡ ( − 2 ϵ 2 ⋅ N ) \mathcal{P} [|\mu -\nu |\gt \epsilon] \leq 2 \exp{(-2\epsilon^2 \cdot N)} P[μν>ϵ]2exp(2ϵ2N)

这即是说,当样本足够多时, h h h f f f 在"training data上的误差"( ν \nu ν )将会同它们在"总体上的误差"( μ \mu μ )非常接近。并且,这个接近程度可由上述不等式来做数值上的度量。

下面使用更形式化的语言来说明:

  • 假设数据产生的真实机制为: f : X → Y f: X\rarr Y f:XY
  • 一个待探讨的、确定的假设为: h : X → Y h: X \rarr Y h:XY
  • training data按照定义在 X X X上的概率分布 P \mathcal{P} P X X X 中被取出。
  • 在training data上 (known), h h h f f f 的误差期望定义为 E i n E_{in} Ein ,表示in training data的误差。
  • 在非training data上 (unknown), h h h f f f 的误差期望定义为 E o u t E_{out} Eout ,表示out of training data的误差

E i n E_{in} Ein E o u t E_{out} Eout 满足:

在这里插入图片描述

那么,根据 Hoeffding’s Inequality 我们有:

P [ ∣ E i n ( h ) − E o u t ( h ) ∣ > ϵ ] ≤ 2 exp ⁡ ( − 2 ϵ 2 ⋅ N ) \mathcal{P} [|E_{in}(h) -E_{out}(h) |\gt \epsilon] \leq 2 \exp{(-2\epsilon^2 \cdot N)} P[Ein(h)Eout(h)>ϵ]2exp(2ϵ2N)

即,当样本数量足够大时, h h h f f f 在整个 X X X 上的误差,便能够由 h h h f f f 在training data上的误差来体现。如此,也就回答了最开始的根本性的问题,为什么我们只需要考察在training data上 h h h 的表现,便能够知晓它在整个 X X X 上的表现:只要training data的数量足够大。并且,对于不同的精度,这个training data的数量需要有多大?这同样可以由 Hoeffding’s Inequality 来回答。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: pytorch_model.bin是PyTorch模型的二进制文件,可以通过以下步骤使用: 1. 导入PyTorch库 ```python import torch ``` 2. 加载模型 ```python model = torch.load('pytorch_model.bin') ``` 3. 使用模型进行推理 ```python output = model(input) ``` 其中,input是输入数据,output是模型的输出结果。 需要注意的是,pytorch_model.bin文件必须与模型的代码文件在同一目录下,否则需要指定文件路径。另外,如果模型是在GPU上训练的,需要使用torch.load函数的map_location参数将模型加载到CPU上。 ```python model = torch.load('pytorch_model.bin', map_location=torch.device('cpu')) ``` ### 回答2: pytorch_model.bin是PyTorch模型的二进制文件,包含了训练好的模型权重参数。使用pytorch_model.bin可以重载一个已经训练好的模型,然后可以继续训练,或者使用它进行发现、推理、评估等操作。 在使用pytorch_model.bin之前,需要准备好一个PyTorch模型。这个模型可以是在PyTorch中编写的代码,也可以是通过其他代码库或工具(如ONNX)导出的模型。接下来,我们将介绍如何将pytorch_model.bin应用到一个PyTorch模型。 1. 导入PyTorch库和模型 首先,需要导入PyTorch库和创建模型的Python代码。以下代码展示了如何导入一个预训练的ResNet-50模型: ``` import torch import torchvision.models as models model = models.resnet50(pretrained=True) ``` 在这个例子中,我们首先导入了PyTorch库,然后使用torchvision包中的models模块来加载ResNet-50模型。我们将预训练的模型权重设置为True,这将下载pytorch_model.bin文件,包含了预训练的模型权重。模型现在已经被加载到内存中了。 2. 保存/加载模型权重 接下来,我们需要保存预训练的模型权重。通常情况下,如果您在使用PyTorch进行新的训练,在每个训练周期后,您都应该保存模型权重。这可以通过以下代码完成: ``` torch.save(model.state_dict(), 'resnet50_weights.pth') ``` 这个代码将模型权重保存到名为resnet50_weights.pth的文件中。后续需要使用它进行推理或继续训练时,可以使用以下代码来加载pytorch_model.bin模型权重。 ``` model.load_state_dict(torch.load('resnet50_weights.pth')) ``` 这个代码将预训练的模型权重从resnet50_weights.pth文件中加载,并将它们赋值给ResNet-50模型。模型现在包含了从预训练模型中学得的权重。 3. 推理、预测和评估 现在,您已经成功加载了预训练的模型,可以使用它进行推理、预测或评估。这可以使用PyTorch的前向传递函数来完成。以下是一个使用ResNet-50进行图像分类的例子: ``` import numpy as np from PIL import Image import torchvision.transforms as transforms # Load image img = Image.open('test_image.jpg') # Preprocess image for ResNet-50 preprocess = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) img_tensor = preprocess(img) img_tensor = img_tensor.unsqueeze(0) # Predict image label using ResNet-50 model.eval() with torch.no_grad(): output = model(img_tensor) probabilities = torch.nn.functional.softmax(output[0], dim=0) predicted_class_idx = np.argmax(probabilities.cpu().numpy()) # Print predicted class print('Predicted class: ', predicted_class_idx) ``` 在这个例子中,我们首先加载了一个图片,然后使用transforms对图片进行预处理(ResNet-50期望的处理方式,用于训练数据)。接下来,我们使用模型的evaluate()方法,运行前向传递函数和softmax函数,得出最可能的输出标签。模型现在已经使用pytorch_model.bin重载完毕,图片也被妥善预处理。 以上就是pytorch_model.bin使用方法。总体而言,pytorch_model.bin允许我们重载训练好的模型,然后对新的数据进行推理、发现和评估。当然,这需要您前先在PyTorch中编写或导入一个好的模型。 ### 回答3: PyTorch是一个常用的深度学习框架,用于构建和训练各种神经网络模型。其中,pytorch_model.bin是PyTorch保存模型权重的二进制文件,它包含了训练好的模型的所有参数值。如何使用pytorch_model.bin文件呢?下面将给出详细的解释。 1. 加载模型 首先,我们需要加载保存的模型,这可以通过以下代码实现: ```python import torch from transformers import BertModel, BertConfig # 加载模型的配置文件 config = BertConfig.from_pretrained('bert-base-chinese', output_attentions=False, output_hidden_states=True) # 加载模型参数 model = BertModel.from_pretrained('bert-base-chinese', config=config) ``` 上述代码中,我们首先加载了bert-base-chinese预训练模型的配置文件,即BertConfig。然后,通过BertModel.from_pretrained()方法加载预训练模型的所有参数。这里,我们将参数保存在本地文件夹中,并使用from_pretrained()方法来加载这个文件夹。 2. 加载pytorch_model.bin文件 接下来,我们可以使用torch.load()方法来加载pytorch_model.bin文件: ```python # 加载pytorch_model.bin文件 model.load_state_dict(torch.load('pytorch_model.bin'), strict=False) ``` 这里,我们使用了load_state_dict()方法来加载pytorch_model.bin文件中保存的模型权重。需要注意的是,strict参数默认为True,表示只加载与模型结构完全匹配的参数,如果文件中存在一些未知的键,则会报错。因此,我们将strict设置为False,在加载模型时忽略不存在的键。 3. 预测 最后,我们可以使用已加载的模型来进行预测: ```python # 输入需要预测的数据 inputs = { 'input_ids': torch.tensor(input_ids).unsqueeze(0), 'attention_mask': torch.tensor(attention_mask).unsqueeze(0), 'token_type_ids': torch.tensor(token_type_ids).unsqueeze(0), } # 预测结果 outputs = model(**inputs) ``` 这里,我们需要将输入数据转换为PyTorch张量格式,并使用model()方法进行预测。预测结果将保存在outputs变量中,我们可以根据需要进行进一步处理。 总之,pytorch_model.bin文件是PyTorch保存模型权重的二进制文件,如果要使用这个文件,我们需要先加载模型配置文件,并使用from_pretrained()方法加载预训练模型的所有参数;然后,使用load_state_dict()方法加载pytorch_model.bin文件中保存的模型权重;最后,使用加载的模型进行预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值