NeptuneAI-博客中文翻译-七-
NeptuneAI 博客中文翻译(七)
scikit Optimize:Python 中的贝叶斯超参数优化
原文:https://web.archive.org/web/https://neptune.ai/blog/scikit-optimize
需要调整机器学习模型的超参数,但不想手动完成?
正在考虑执行贝叶斯超参数优化,但您不确定具体如何操作?
听说过各种超参数优化库,想知道 Scikit Optimize 是否是适合您的工具?
你来对地方了。
在本文中,我将:
- 向您展示一个使用 skopt 在实际问题上运行贝叶斯超参数优化的示例,
- 根据 API、速度和实验结果等各种标准评估该库,
- 给你我的总评分和何时使用的建议。
我们开始吧,好吗?
评定标准
易用性和 API
API 太棒了。它是如此简单,以至于你几乎不用看文档就能猜到。说真的,让我给你看看。
您定义搜索空间:
SPACE = [
skopt.space.Real(0.01, 0.5, name='learning_rate', prior='log-uniform'),
skopt.space.Integer(1, 30, name='max_depth'),
skopt.space.Integer(2, 100, name='num_leaves'),
skopt.space.Integer(10, 1000, name='min_data_in_leaf'),
skopt.space.Real(0.1, 1.0, name='feature_fraction', prior='uniform'),
skopt.space.Real(0.1, 1.0, name='subsample', prior='uniform')]
您定义想要最小化的目标函数(修饰它,以保留参数名称):
@skopt.utils.use_named_args(SPACE)
def objective(**params):
all_params = {**params, **STATIC_PARAMS}
return -1.0 * train_evaluate(X, y, all_params)
并运行优化:
results = skopt.forest_minimize(objective, SPACE, **HPO_PARAMS)
就是这样。您需要的所有信息,比如每次迭代的最佳参数或分数,都保存在 results 对象中。这里是一个完整脚本的例子,带有一些额外的附加功能。
超级简单的设置和直观的 API。
10 / 10
选项、方法和(超级)参数
搜索空间
对于超参数搜索空间,您可以从三个选项中进行选择:
- 空间。实数-浮点参数由(a,b)范围内的均匀对数均匀采样,
- 空间。整数-整数参数从(a,b)范围内均匀采样,
- 空间。分类-用于分类(文本)参数。将从选项列表中抽取一个值。例如,如果你正在训练 lightGBM,你可以通过['gbdt ',' dart ',' goss']。
没有对嵌套搜索空间的支持,嵌套搜索空间考虑了超参数的一些组合完全无效的情况。有时候真的很方便。
优化方法
有四种优化算法可以尝试。
dummy_minimize
您可以对参数进行简单的随机搜索。这里没有什么特别的,但是如果需要的话,在同一个 API 中使用这个选项进行比较是很有用的。
forest_minimize 和 gbrt_minimize
这两种方法以及下一节中的方法都是贝叶斯超参数优化的例子,也称为基于序列模型的优化 SMBO。这种方法背后的思想是用随机森林、额外的树或者梯度增强树回归量来估计用户定义的目标函数 。
在目标函数上每次运行超参数后,算法进行有根据的猜测,哪组超参数最有可能提高分数,并且应该在下一次运行中尝试。它是通过获得许多点(超参数集)上的回归预测,并根据所谓的获取函数选择最佳猜测点来完成的。
有许多采集功能选项可供选择:
- EI 和 PI :负预期改善和负概率改善。如果你选择其中一个,你也应该调整【Xi】参数。基本上,当您的算法寻找下一组超参数时,您可以决定您愿意在实际目标函数上尝试的预期改进有多小。该值越高,回归变量预期的改善(或改善概率)就越大。
- 【LCB】:置信下限。在这种情况下,你要谨慎选择你的下一个点,限制下行风险。你可以决定每次跑步要冒多大的风险。通过使κ参数变小,你倾向于利用你所知道的,通过使其变大,你倾向于探索搜索空间。
还有选项【EIPS】和 PIPS 考虑到目标函数产生的分数和执行时间,但我没有尝试过
gp_minimize
不使用树形回归,目标函数由高斯过程近似。
从用户的角度来看,这种方法的附加价值是,你可以让算法在每次迭代中选择 EI、PI 和 LCB 中最好的一个,而不是事先决定一个采集函数。只需将采集功能设置为 gp_hedge 并试用即可。
还有一点要考虑的是每次迭代使用的优化方法、采样或 lbfgs 。对于这两者,采集函数是在搜索空间中随机选择的点数( n_points )上计算的。如果进行采样,则选择具有最低值的点。如果您选择 lbfgs ,该算法将从一些(n _ restarts _ optimizer)最佳的、随机尝试的点中选取,并将从每个点开始运行 lbfgs 优化。所以如果你不在乎执行时间,基本上 lbfgs 方法只是对采样方法的一个改进。
回收
我真的很喜欢有一个通过回调的简单选项。例如,我可以通过简单地添加 3 行代码来监控我的训练:
def monitor(res):
neptune.send_metric('run_score', res.func_vals[-1])
neptune.send_text('run_parameters',
str(to_named_params(res.x_iters[-1])))
...
results = skopt.forest_minimize(objective, SPACE,
callback=[monitor], **HPO_PARAMS)
您可以使用此选项的其他事情是,在每次迭代中提前停止或保存结果。
请注意,由于最近的 API 更新,这篇文章也需要一些改变——我们正在努力!与此同时,请检查海王星文档,那里的一切都是最新的!🥳
持续和重新启动
有目的转储和目的加载函数处理结果对象的保存和加载;
results = skopt.forest_minimize(objective, SPACE, **HPO_PARAMS)
skopt.dump(results, 'artifacts/results.pkl')
old_results = skopt.load('artifacts/results.pkl')
您可以通过 x0 和 y0 参数从保存的结果重新开始训练。例如:
results = skopt.forest_minimize(objective, SPACE,
x0=old_results.x_iters,
y0=old_results.func_vals,
**HPO_PARAMS)
简单和工程没有问题。
总的来说,有很多调整(超)超参数的选项,您可以通过回调来控制训练。另一方面,您只能在平坦的空间中搜索,并且您需要自己处理那些被禁止的参数组合。
2010 年 7 月
证明文件
一件艺术品。
它有很多例子,所有函数和方法的文档字符串。我只花了几分钟就进入了最佳状态,并把事情做好了。
去文档网页自己看。
它可以更好一点,在 docstrings 中有更多的解释,但总体体验非常好。
9 / 10
形象化
这是这个图书馆我最喜欢的特色之一。在 skopt.plots 模块中有三个绘图工具,我非常喜欢:
- plot _ convergence-它通过显示每次迭代的最佳结果来可视化您的优化进度。
import skopt.plots
skopt.plots.plot_convergence(results)
它的酷之处在于,你可以通过简单地传递一个 results 对象列表或者一个(name,results)元组的列表来比较许多策略的进展。
results = [('random_results', random_results),
('forest_results', forest_results),
('gbrt_results', gbrt_results),
('gp_results', gp_results)]
skopt.plots.plot_convergence(*results)
- 这个图让你看到搜索的发展。对于每个超参数,我们可以看到探测值的直方图。对于每一对超参数,采样值的散点图用颜色表示,从蓝色到黄色。
例如,当我们查看随机搜索策略时,我们可以看到没有进化。它只是随机搜索:
但是对于forest _ minimize策略,我们可以清楚地看到,它收敛到它探索得更多的空间的某些部分。
- plot _ objective-它让你获得对超参数的分数敏感度的直觉。您可以决定空间的哪些部分可能需要更细粒度的搜索,以及哪些超参数几乎不影响分数,并且可能会从搜索中删除。
总的来说,可视化非常好。
10 / 10
注意:
我非常喜欢它,所以我创建了一组函数来帮助不同 HPO 库之间的转换,这样你就可以对每个库使用这些可视化。我已经把它们放在了 neptune-contrib 包中,你可以查看一下。
速度和并行化
每个优化函数都带有 n_jobs 参数,该参数被传递给 base_estimator 。这意味着,即使优化运行按顺序进行,您也可以通过利用更多的资源来加速每次运行。
我还没有为所有的优化方法和 n_jobs 运行一个合适的计时基准。然而,因为我记录了所有实验的总执行时间,所以我决定给出我运行的所有实验的平均时间:
显然,随机搜索方法是最快的,因为它在两次运行之间不需要任何计算。其次是梯度增强树回归器和随机森林方法。通过优化高斯过程是最慢的,但我只测试了 gp_hedge 采集函数,这可能就是原因。
因为没有在运行级别上,在一个工人集群上分配它的选项,所以我必须拿走几个点。
2010 年 6 月
实验结果
作为一个例子,让我们在一个表格,二元分类问题上调整 lightGBM 模型的超参数。如果您想像我一样使用相同的数据集,您应该:
为了让训练更快,我将的助推轮数固定为 300,并提前 30 轮停止。
import lightgbm as lgb
from sklearn.model_selection import train_test_split
NUM_BOOST_ROUND = 300
EARLY_STOPPING_ROUNDS = 30
def train_evaluate(X, y, params):
X_train, X_valid, y_train, y_valid = train_test_split(X, y,
test_size=0.2,
random_state=1234)
train_data = lgb.Dataset(X_train, label=y_train)
valid_data = lgb.Dataset(X_valid, label=y_valid, reference=train_data)
model = lgb.train(params, train_data,
num_boost_round=NUM_BOOST_ROUND,
early_stopping_rounds=EARLY_STOPPING_ROUNDS,
valid_sets=[valid_data],
valid_names=['valid'])
score = model.best_score['valid']['auc']
return score
所有的训练和评估逻辑都放在 train_evaluate 函数中。我们可以将其视为一个黑盒,它获取数据和超参数集并生成 AUC 评估分数。
注意:
你可以把每一个以参数为输入,输出分数的脚本都变成这样的 train_evaluate。完成后,您可以将其视为一个黑盒,并调整您的参数。
要根据一组参数训练模型,您可以运行如下内容:
import pandas as pd
N_ROWS=10000
TRAIN_PATH = '/mnt/ml-team/minerva/open-solutions/santander/data/train.csv'
data = pd.read_csv(TRAIN_PATH, nrows=N_ROWS)
X = data.drop(['ID_code', 'target'], axis=1)
y = data['target']
MODEL_PARAMS = {'boosting': 'gbdt',
'objective':'binary',
'metric': 'auc',
'num_threads': 12,
'learning_rate': 0.3,
}
score = train_evaluate(X, y, MODEL_PARAMS)
print('Validation AUC: {}'.format(score))
对于这项研究,我将尝试在 100 次运行预算内找到最佳参数。
如果你在超参数上随机搜索,你可以得到 0.864 ,正如我在这个 ml 实验中所示。
为了找到最佳模型,我尝试了来自选项、方法和 hyper(超参数)部分的优化器和 hyper(超参数)的各种配置。您也可以在这里查看示例 skopt 参数调整脚本。
我总共进行了 87 次实验,让我们来看看前几项:
Experiments for different skopt configurations
如果你想更详细地探索所有这些实验,你可以简单地进入实验仪表板。
forest_minimize 方法是明显的赢家,但是为了获得好的结果,稍微调整一下(超级)超参数是至关重要的。对于 LCB 采集函数来说,κ(剥削)的值越低越好。让我们来看看这个实验的评估图:
它利用了低 num_leaves 子空间,但对于 max_depth 和 feature_fraction 来说,它非常具有探索性。值得一提的是,这些图在不同的实验中差别很大。这让你想知道陷入局部最小值有多容易。
然而,最佳结果是通过 EI 采集功能获得的。再次,调整 xi 参数是必要的。看这个实验的客观情节:
我觉得,通过删除一些不敏感的维度(子样本、最大深度)并对其他超参数进行更细粒度的搜索,我可能会得到更好的结果。
令我惊讶的是,当我使用 lbfgs 采集函数优化时,gp _ minimize的结果明显更差。他们不能打败随机搜索。将优化改为采样获得了更好的 AUC,但仍然比 forest_minimize 和 gbrt_minimize 差。去高斯工艺实验自己看。
总的来说,我能得到的最高分是 0.8566 ,比随机搜索的 0.8464 高出 0.01。我将把它翻译成 10 点 (0.01*100)。
10/10
结论
让我们来看看所有标准的结果:
总的来说,我非常喜欢 Scikit-Optimize 。这是一个愉快的使用,给你很大的结果,和有用的可视化。此外,它有许多选项,可以用强大的文档来指导您完成它。
另一方面,很难(如果不是不可能的话)将它并行化运行并分布在一个机器集群上。我认为今后,这将变得更加重要,并可能使这个库不适合某些应用程序。
**我的建议是,如果你不太关心速度和并行化,就使用它,但是如果这些对你的项目至关重要,就去别处看看。
雅各布·查肯
大部分是 ML 的人。构建 MLOps 工具,编写技术资料,在 Neptune 进行想法实验。
阅读下一篇
如何跟踪机器学习模型的超参数?
卡米尔·卡什马雷克|发布于 2020 年 7 月 1 日
机器学习算法可通过称为超参数的多个量规进行调整。最近的深度学习模型可以通过数十个超参数进行调整,这些超参数与数据扩充参数和训练程序参数一起创建了非常复杂的空间。在强化学习领域,您还应该计算环境参数。
数据科学家要控制好 超参数 空间,才能使 进步。
在这里,我们将向您展示最近的 实践,提示&技巧,和工具以最小的开销高效地跟踪超参数。你会发现自己掌控了最复杂的深度学习实验!
为什么我应该跟踪我的超参数?也就是为什么这很重要?
几乎每一个深度学习实验指南,像这本深度学习书籍,都建议你如何调整超参数,使模型按预期工作。在实验-分析-学习循环中,数据科学家必须控制正在进行的更改,以便循环的“学习”部分正常工作。
哦,忘了说随机种子也是一个超参数(特别是在 RL 领域:例如检查这个 Reddit )。
超参数跟踪的当前实践是什么?
让我们逐一回顾一下管理超参数的常见做法。我们关注于如何构建、保存和传递超参数给你的 ML 脚本。
使用 Deoldify 和 Django API 在 IOS 应用程序中分割和着色图像
原文:https://web.archive.org/web/https://neptune.ai/blog/segmenting-and-colorizing-images-in-ios-app
图像分割属于涉及深度物体检测和识别的成像领域。如果我们通过按像素分离的方式将一幅图像分成多个区域,场景中的每个对象都允许我们为需要高标准图像分析和上下文解释的任务训练复杂的深度学习模型。以这种方式训练的模型可以确定检测到的物体的形状,预测检测到的物体将进入的方向,并产生许多其他见解。
我们将通过动手开发一个处理模型服务的后端 API 和一个使用服务的小型 IOS 应用程序来学习图像分割的工作原理。
API 将由在不同阶段处理输入图像的多个视图组成。后端服务的处理逻辑就像每个视图都是负责单个功能的嵌套微服务一样运行,从背景定制到背景灰度和旧图像着色。
图像分割可以用各种技术完成,每种技术都有其优点和缺点:
分割技术 | 描述 | 优势 | 不足之处 |
---|---|---|---|
根据图像直方图峰值寻找特定阈值
|
最简单的方法。不需要以前的信息
|
空间细节考虑不周全,很大程度上取决于颜色变化和峰值
|
| |
应用间断检测技术
|
对物体间对比度好的图像表现很好
|
图像中有太多边缘时不适合
|
| |
同质图像分割以找到特定区域
|
当相似性标准可以很容易地定义时有用
|
在时间和空间复杂度方面相当昂贵
|
| |
基于模拟的学习过程进行决策
|
神经网络架构,无需编写复杂程序
|
要求大量的训练数据
|
有三种主要类型的图像分割:
- 语义分割:识别可训练对象类,相应地分离。
- 实例分割:检测每个对象类的实例数量。因此,它可以更准确地分离组件,并有助于将整个图像分解为多个标记区域,这些区域引用模型被训练的类别。
- 全景分割:语义和实例分割的统一版本。
我们还将看看最近的图像技术,这些技术可以准确地给旧的黑白照片上色。用于执行这种艺术任务的算法是特定的 生成对抗 网络【GANs】的组合,这些网络生成与图像中存在的对象相匹配的精确颜色颜料。模型分割图像,并根据它们被训练的类别对每个像素进行着色。
我们将使用的库是去文件夹。他们有一个配备齐全的 Github repo,里面有很多例子和教程,可以帮助你快速入门。
Deoldify example from their github repo | Source
对于本文,我们将讨论以下内容:
- 关于图像分割的 DeepLab V3+的一些技术背景,
- 使用 DeepLab-ResNet101 的 Pytorch 实现,
- 测试 Deoldify 处理黑白图像并提出彩色版本,
- 将所有模型包装在一个 API 中为它们服务,
- 创建一个小的 IOS 应用程序来获取图像结果,
- 结论。
你可以在我的 Github repo 中查看这个项目的全部代码。
DeepLab V3+的技术背景
阿特鲁空间金字塔汇集卷积
大多数分割模型使用 FCNN 作为第一处理阶段,以在对象检测阶段之前正确地放置所需的遮罩和边界。DeepLab V3+是谷歌 DeepLab 细分模型的最新和最复杂的迭代。
开发 DeepLab 的众多原因之一是它能够实现众多应用,例如在 Pixel 2 智能手机的人像模式功能中使用的合成浅景深效果。
DeepLab V3+版本包括建立在 CNN 架构主干之上的模型,但该模型主要依赖于新引入的阿特鲁空间金字塔池卷积 (ASPP)。总体结构呈现以下阶段:
- 使用 CNN 主干提取图像特征。在我们的例子中,主干是 ResNet-101,它将识别和检测将被馈送到进一步阶段的掩模特征图。
- 控制输出的大小,使语义信息不会丢失太多。
- 在最后阶段,ASPP 对输出图像的不同像素进行分类,并通过 1×1 卷积层进行处理,以恢复正确的原始大小。
DeepLab-ResNet101 的 PyTorch 实现
为了快速体验 DeepLab,我们将使用 PyTorch 实现,该实现提出了一个以 ResNet101 为基础的 deeplab v3 版本,该版本在 COCO 数据集上进行了预先训练,并且可以从 torchvision 包中轻松加载。
我将尽可能详细地描述编写调用模型的 Python 模块所需的不同步骤。我们将从头开始。
启用您的 Python 虚拟环境
使用 virtualenv 或 anaconda 为项目创建一个虚拟环境,在其中您将安装所有需要的依赖项。请记住,我们将要测试的预训练版本是基于 GPU 的。
1.下载安装 Anaconda: 网站
2.创建您的虚拟环境:
conda create --name seg_env python=3.6
3.激活虚拟环境:
conda activate seg_env
4.安装所需的库:
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
pip install opencv-python
pip install numpy
pip install Pillow=2.2.1
安装验证要求
- 克隆 Deoldify Github repo 并安装 requirements.txt
https://github.com/jantic/DeOldify.git
实现数据加载器类
在开始编码 Python 模块来包装模型行为之前,我们需要编码一个数据加载器来处理输入图像文件。数据加载器的主要目的是预处理所有图像输入文件,将它们转换为具有特定属性和特性的高级对象,这将有助于在我们想要针对一批原始输入训练或评估模型时简化工作。
class SegmentationSample(Dataset):
def __init__(self, root_dir, image_file, device):
self.image_file = os.path.join(root_dir, image_file)
self.image = Image.open(self.image_file)
if device == 'cuda' and torch.cuda.is_available():
self.device = 'cuda'
if device == 'cpu':
self.device = 'cpu'
self.preprocessing = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
self.unload_tensor = transforms.ToPILImage()
self.processed_image = self.preprocessing(self.image)
self.processed_image = self.processed_image.unsqueeze(0).to(self.device)
def __getitem__(self, item):
return self.processed_image
def print_image(self, title=None):
image = self.image
if title is not None:
plt.title = title
plt.imshow(image)
plt.pause(5)
plt.figure()
def print_processed(self, title='After processing'):
image = self.processed_image.squeeze(0).detach().cpu()
image = self.unload_tensor(image)
plt.title = title
plt.imshow(image)
plt.pause(5)
plt.figure()
- init 方法:获取 root_dir 和 image 文件,并将其转换为 Pillow image 对象,然后转换为 torch 张量。原始输入图像的像素值根据特定的平均值和标准值进行归一化。一旦所有的变换发生,我们就得到一个形状良好的量纲张量。因此,我们保证输入和模型维度完全匹配。
创建 Python 包装器来服务 DeepLab 模型
该模块必须初始化 deeplab-resnet101 型号版本的预训练权重。它还要求用户指定在推理期间是使用 CPU 还是 GPU 加速。
此外,该模型还将实现自定义背景的方法。
class SemanticSeg(nn.Module):
def __init__(self, pretrained: bool, device):
super(SemanticSeg, self).__init__()
if device == 'cuda' and torch.cuda.is_available():
self.device = 'cuda'
if device == 'cpu':
self.device = 'cpu'
self.model = self.load_model(pretrained)
def forward(self, input: SegmentationSample):
with torch.no_grad():
output = self.model(input.processed_image)['out']
reshaped_output = torch.argmax(output.squeeze(), dim=0).detach().cpu()
return reshaped_output
def load_model(self, pretrained=False):
if pretrained:
model = models.deeplabv3_resnet101(pretrained=True)
else:
model = models.deeplabv3_resnet101()
model.to(self.device)
model.eval()
return model
forward(self, input: SegmentationSample)
:对采样图像输入进行推理,并返回张量预测。load_model(self, pretrained=**False**)
:加载 Pytorch cloud 中的 deeplabv3_resnet101 预训练版本。将模型检查点的 eval 模式保存到相应的设备。
之后,我们将添加后处理方法来帮助在模型预测的顶部重新映射定制的背景。请记住,输出张量有 21 个通道与模型训练的每个目标类的预测结果相匹配。因此,我们需要解码张量形状以输出正确的图像结果。
def background_custom(self, input_image, source, background_source,number_channels=21):
label_colors = np.array([(0, 0, 0),
(128, 0, 0), (0, 128, 0), (128, 128, 0), (0, 0, 128), (128, 0, 128),
(0, 128, 128), (128, 128, 128), (64, 0, 0), (192, 0, 0), (64, 128, 0),
(192, 128, 0), (64, 0, 128), (192, 0, 128), (64, 128, 128), (192, 128, 128),
(0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128)])
r = np.zeros_like(input_image).astype(np.uint8)
g = np.zeros_like(input_image).astype(np.uint8)
b = np.zeros_like(input_image).astype(np.uint8)
for l in range(0, number_channels):
if l == 15:
idx = input_image == l
r[idx] = label_colors[l, 0]
g[idx] = label_colors[l, 1]
b[idx] = label_colors[l, 2]
rgb = np.stack([r, g, b], axis=2)
foreground = cv2.imread(source)
foreground = cv2.resize(foreground, (r.shape[1], r.shape[0]))
foreground = cv2.cvtColor(foreground, cv2.COLOR_BGR2RGB)
background = cv2.imread(background_source, cv2.IMREAD_COLOR)
background = cv2.resize(background, (rgb.shape[1], rgb.shape[0]), interpolation=cv2.INTER_AREA)
background = cv2.cvtColor(background, cv2.COLOR_BGR2RGB)
th, alpha = cv2.threshold(np.array(rgb), 0, 255, cv2.THRESH_BINARY)
foreground = foreground.astype(float)
background = background.astype(float)
alpha = alpha.astype(float) / 255
foreground = cv2.multiply(alpha, foreground)
background = cv2.multiply(1.0 - alpha, background)
outImage = cv2.add(foreground, background)
return outImage / 255
background_custom(self, input_image, source, background_source, channels=21)
:该方法采用具有高度、宽度和 21 个特征图预测[1,21,H,W]的输出张量、图像源文件的路径和背景图像文件的路径。该逻辑包括从剩余特征中仅提取人物特征图(特征 15 ),并将所有剩余特征标记为属于背景。最后,将先前标记的特征作为背景与新的图像源文件合并。
将 Deoldify 添加到模块中
from deoldify import device
from deoldify.device_id import DeviceId
import torch
import fastai
from deoldify.visualize import *
def colorize_image(self, input_image, output_image, render_factor=35):
torch.backends.cudnn.benchmark = True
colorizer = get_image_colorizer(artistic=False)
colorized_image = colorizer.get_transformed_image(input_image, render_factor, watermarked=False)
colorized_image.save(output_image)
- colorize_image(self,input_image,output_image):获取输入图像并调用 colorizer . get _ transformed _ image(input _ image),后者运行推理并返回输出彩色图像。
将模型包装在一个 API 中
正如我们通常所做的那样,我们将使用 Django 来创建一个小型的 Restful API,它定义了本地托管的端点,以通过 forward POST 和 GET 调用来测试我们的模型。
通常,API 是数据库的一个窗口。API 后端处理数据库查询和响应格式化。您收到的是一个静态响应,通常是 JSON 格式的,是您请求的任何资源的静态响应。
让我们设置姜戈部分
安装 Django 和 Django Rest 框架:
pip install django djangorestframework
一旦正确安装了依赖项,转到根文件夹并初始化 Django 应用程序:
django-admin startproject semantic-seg
现在你的 Django 项目已经准备好了。剩下唯一要做的就是实例化 Django rest 框架 ,并在初始项目文件夹中为它创建一个特定的文件夹。
- 启动您的 api 应用程序:python manage.py startapp api
- 将新创建的 api 文件夹的路径添加到 general settings.py 文件中:
INSTALLED_APPS = [
'api.apps.ApiConfig',
'django.contrib.admin',
'django.contrib.auth',
...
]
API 文件夹的树结构应该如下所示:
Tree print of the project folder structure
一旦所有配置就绪,我们将继续对模型和序列化程序进行编码,这些模型和序列化程序将最终处理所有涉及来回请求的图像数据的事务性流程。
由于 API 将负责检索得到的修改图像,您可以利用 Neptune 的图像记录系统来跟踪和记录整个模型迭代中产生的不同图像版本。
基本上,每个输出图像都可以保存在您的 Neptune 平台中,并告知模型的性能和准确性。每一次迭代都会给出更好的结果,因此你可以用一种结构化的、组织良好的方式来比较所有的结果。
关于如何在 Neptune 中记录内容的更多信息,无论是表格、图表还是图像,我强烈建议您看看我以前的文章:
检查您可以在 Neptune 中记录和显示哪些元数据。
姜戈模具模块
为了简化 Django,我们正在构建一个 ML 后端的简化版本,我们可以依赖 Django 提供的 ORM 类。它们的重要性在于,我们需要第三方软件来管理和存储从 API 调用中生成的所有数据。对于我们的特殊情况,我们需要发布图像,应用模型推理来获得语义过滤器,然后恢复它们。
因此,我们需要两个主要组件:
- 模型 表示图像对象互换的类,
- 输入 和 输出 图像串行化器帮助将图像存储在数据库中。
模特班
继承自 django.db.models.Model 类的 Python 类,定义了一组与图像对象相关的属性和特征。
models.FileField
:存储图像文件的路径models.UUIDField
:为每个图像实例生成一个特定的 idmodels.CharField
:命名每个对象实例的方法models.DateTimeField
:保存它们被存储或更新的准确时间
from django.db import models
from API.utils import get_input_image_path, get_output_image_path
class ImageSegmentation(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=255, null=True, blank=True)
input_image = models.FileField(upload_to=get_input_image_path, null=True, blank=True)
output_image = models.FileField(upload_to=get_output_image_path, null=True, blank=True)
verified = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return "%s" % self.name
编写完类的代码后,将您的更改迁移到 SQL 数据库:
python manage.py makemigrations
python manage.py migrate
输入和输出图像串行器
用 image 对象的相应属性定义 Django 序列化程序。我们将制作两个序列化器来处理传入和传出的图像对象。
class InputImageSerializer(serializers.ModelSerializer):
class Meta:
model = ImageSegmentation
fields = ('uuid', 'name', )
class OutputImageSerializer(serializers.ModelSerializer):
class Meta:
model = ImageSegmentation
fields = ('uuid', 'name', 'input_image', 'output_image', 'created_at', 'updated_at')
最后,在完成所有更改后,您需要在管理门户中注册您的新模型。只需转到 admin.py 文件并添加以下行即可:
admin.site.register(ImageSegmentation)
构建 API 端点
对于 POST 请求,将有两个部分。一种方法处理背景定制,另一种方法用于着色部分。
- 贴背景定制 :发送两张文件图片,原始照片,匹配背景。它处理它们并把它们保存到相应的文件夹中。
@api_view(['POST'])
@never_cache
def run_inference(request):
property_id = request.POST.get('property_id')
images = dict((request.data).lists())['image']
flag = 1
arr = []
for img_name in images:
modified_data = modify_input_for_multiple_files(property_id,
img_name)
file_serializer = ImageSerializer(data=modified_data)
if file_serializer.is_valid():
file_serializer.save()
arr.append(file_serializer.data)
else:
flag = 0
if flag == 1:
image_path = os.path.relpath(arr[0]['image'], '/')
bg_path = os.path.relpath(arr[1]['image'], '/')
input_image = ImageSegmentation.objects.create(input_image=image_path, name='image_%02d' % uuid.uuid1())
bg_image = ImageSegmentation.objects.create(input_image=bg_path, name='image_%02d' % uuid.uuid1())
RunDeepLabInference(input_image, bg_image).save_bg_custom_output()
serializer = OutputImageSerializer(input_image)
return Response(serializer.data)
@api_view(['POST'])
@never_cache
def run_grayscale_inference(request):
file_ = request.FILES['image']
image = ImageSegmentation.objects.create(input_image=file_, name='image_%02d' % uuid.uuid1())
RunDeepLabInference(image).save_grayscale_output()
serializer = OutputImageSerializer(image)
return Response(serializer.data)
- POST for the Colorizing de oldify model:解析请求,提取 base64 图像字符串。对 base64 字符串进行解码,并在将其保存到输出图像文件夹之前执行彩色化滤镜。
@api_view(['POST'])
@never_cache
def colorize_image(request):
file_image = request.FILES['image']
image = ImageSegmentation.objects.create(input_image=file_image, name='image_%02d' % uuid.uuid1())
image_string = base64.b64decode(image)
image_data = BytesIO(image_string)
img = Image.open(image_data)
img.save(INPUT_IMAGE)
colorized_image = colorizer.get_transformed_image(file_image, render_factor=35, watermarked=False)
colorized_image.save()
serializer = OutputImageSerializer(image)
return Response(serializer.data)
GET 方法 将简单地检索我们存储在数据库中的转换后的图像,并将它们作为静态文件提供。
@api_view(['GET'])
@never_cache
def get_images(request):
property_id = request.POST.get('property_id')
images = dict((request.data).lists())['image']
flag = 1
arr = []
for img_name in images:
modified_data = modify_input_for_multiple_files(property_id,
img_name)
file_serializer = ImageSerializer(data=modified_data)
if file_serializer.is_valid():
file_serializer.save()
arr.append(file_serializer.data)
else:
flag = 0
if flag == 1:
return Response(arr, status=status.HTTP_201_CREATED)
else:
return Response(arr, status=status.HTTP_400_BAD_REQUEST)
配置 API 路由
1.在 urls.py 文件中设置 URL 模式的路径:
app_name = 'api'
urlpatterns = [
path(r'test/', views.test_api, name='test_api_communication'),
path(r'images/', views.get_images, name='get_images'),
path(r'inference/', views.run_inference, name='run_inference_on_images'),
path(r'grayscale/', views.run_grayscale_inference, name='run_grayscale_inference_on_images'),
path(r'colorize/', views.colorize_image, name='run_deoldify_colorize_filter_on_images'),
path(r'clean/', views.clean_folders, name='clean_output_folder')
]
2.在 api.urls.py 文件中创建 API 端点的地址:
urlpatterns = [
path(r'test/', views.test_api, name='test_api_communication'),
path(r'images/', views.get_images, name='get_images'),
path(r'api/', views.run_inference, name='run_inference_on_images'),
]
构建 IOS 应用程序
总结一下,现在我们的 API 已经完美地运行了,我们需要做的就是构建一个小的 IOS 应用程序,它有两个 viewcontrollers 来上传图片并取回它们漂亮的转换版本,带有背景定制和颜色过滤。
我们最终将在应用程序界面中获得的结果类似于 API 中的这些示例:
我喜欢完全以编程方式在 Swift 中编写代码,我承认我对故事板和任何与 XML 相关的 UI 开发有一种厌恶。因此,让我们通过移除主故事板并设置 SceneDelegate.swift 文件来保持事情的简单和娱乐性。
- 删除文件中的故事板名称
- 相应更改 SceneDelegate 文件:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(frame: windowScene.coordinateSpace.bounds)
window?.windowScene = windowScene
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
}
创建入口点 ViewController
第一个 ViewController 将充当我们的应用程序的入口点。它将使用两个按钮定义基本布局,这两个按钮可以让用户拍照或从库中上传照片。
手动约束布局,避免自动布局自动元素定位。
该布局包含两个垂直对齐的按钮,顶部有一个 UIImageView 徽标。
徽标图像
- 小 UIImageView 作为应用程序的徽标
let logo: UIImageView = {
let image = UIImageView(image:
image.translatesAutoresizingMaskIntoConstraints = false
return image
}()
小跟班
lazy var openCameraBtn : CustomButton = {
let btn = CustomButton()
btn.translatesAutoresizingMaskIntoConstraints = false
btn.setTitle("Camera", for: .normal)
let icon = UIImage(named: "camera")?.resized(newSize: CGSize(width: 45, height: 45))
let tintedImage = icon?.withRenderingMode(.alwaysTemplate)
btn.setImage(tintedImage, for: .normal)
btn.tintColor =
btn.addTarget(self, action:
return btn
}()
- 图片上传按钮:
lazy var openToUploadBtn : CustomButton = {
let btn = CustomButton()
btn.addTarget(self, action:
btn.translatesAutoresizingMaskIntoConstraints = false
return btn
}()
为每个 UI 元素设置常规布局和约束
fileprivate func addButtonsToSubview() {
view.addSubview(logo)
view.addSubview(openCameraBtn)
view.addSubview(openToUploadBtn)
}
fileprivate func setupView() {
logo.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
logo.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 20).isActive = true
openCameraBtn.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
openCameraBtn.widthAnchor.constraint(equalToConstant: view.frame.width - 40).isActive = true
openCameraBtn.heightAnchor.constraint(equalToConstant: 60).isActive = true
openCameraBtn.bottomAnchor.constraint(equalTo: openToUploadBtn.topAnchor, constant: -40).isActive = true
openToUploadBtn.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
openToUploadBtn.widthAnchor.constraint(equalToConstant: view.frame.width - 40).isActive = true
openToUploadBtn.heightAnchor.constraint(equalToConstant: 60).isActive = true
openToUploadBtn.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -120).isActive = true
}
- 处理打开相机动作:
@objc func openCamera() {
if UIImagePickerController.isSourceTypeAvailable(.camera) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .camera
imagePicker.allowsEditing = true
self.present(imagePicker, animated: true, completion: nil)
}
}
- 处理从库上传操作:
@objc func uploadLibrary() {
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = false
self.present(imagePicker, animated: true, completion: nil)
}
}
- 从UIImagePickerControllerDelegate中覆盖imagePickerController:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[.originalImage] as? UIImage {
let segmentationController = ImageSegmentationViewController()
segmentationController.modalPresentationStyle = .fullScreen
segmentationController.inputImage.image = image
dismiss(animated: true, completion: nil)
self.present(segmentationController, animated: true, completion: nil)
}
}
处理 API 回调
为了管理分段控制器中的 HTTP API 调用,我们将使用 Alamofire,这是一个广泛使用的 Swift 包,用于处理与 Swift 的优雅 HTTP 联网。用你喜欢的方法安装软件包,我用的是 CocoaPod。
POST 方法需要一个[String: String]类型的字典,键是图像,值是原始图像的 base64 格式。
实现回调的步骤如下:
- 将 UIImage 转换为无压缩比的 base64 编码,
- 创建将用于发送要编码的 POST 请求值的参数,
- 用 Alamofire 请求方法执行请求,
- 处理 API 结果,
- 用筛选后的图像更新 UIImageView。
func colorizeImages() {
let imageDataBase64 = inputImage.image!.jpegData(compressionQuality: 1)!.base64EncodedString(options: .lineLength64Characters)
let parameters: Parameters = ["image": imageDataBase64]
AF.request(URL.init(string: self.apiEntryPoint)!, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: .none).responseJSON { (response) in
switch response.result {
case .success(let value):
if let JSON = value as? [String: Any] {
let base64StringOutput = JSON["output_image"] as! String
let newImageData = Data(base64Encoded: base64StringOutput)
if let newImageData = newImageData {
let outputImage = UIImage(data: newImageData)
let finalOutputImage = outputImage
self.inputImage.image = finalOutputImage
self.colorizedImage = finalOutputImage
}
}
break
case .failure(let error):
print(error)
break
}
}
}
结果
Results obtained applying the background customization and gray filtering
Results obtained from colorize filters, transforming old black and white photographs into fully colorized ones.
Top left corner original photo | Source: Old pictures Casablanca, bottom right original photograph | Source: Souvenirs, Souvenirs
结论
我们已经通过图像分割进行了一次全面的旅行,一些应用程序被证明是易于实现和相当有趣的。通过我提出的这个小应用程序,我希望我已经为你的创造力增加了一点活力。
我鼓励你用同样的画布测试其他应用程序。DeepLab V3 还可以实现其他一些很酷的特性。
最后,我推荐你查阅以下参考资料:
如何为时间序列预测任务选择模型[指南]
原文:https://web.archive.org/web/https://neptune.ai/blog/select-model-for-time-series-prediction-task
使用时间序列数据?这是给你的指南。在本文中,您将学习如何根据预测性能来比较和选择时间序列模型。
在第一部分中,你将被介绍到时间序列的众多模型。这一部分分为三个部分:
- 经典的时间序列模型,
- 监督模型,
- 和基于深度学习的模型。
在第二部分中,您将看到一个用例的应用,在这个用例中,您将为股票市场预测构建几个时间序列模型,并且您将了解一些时间序列建模技术。这些模型将互相比较,选出性能最好的一个。
时间序列数据集和预测简介
让我们从回顾时间序列到底是什么开始。时间序列是一种特殊类型的数据集,其中一个或多个变量随着时间的推移而被测量。
我们使用的大多数数据集都是基于独立的观察。例如,数据集的每一行(数据点)代表一个单独的观察值。例如,在一个网站上,你可以跟踪每个访问者。每个访问者都有一个用户 id,他或她将独立于其他访问者。
Time series data examples: a dataset with independent observations | Source: Author
然而,在时间序列中,观测值是随着时间推移而测量的。数据集中的每个数据点对应一个时间点。这意味着数据集的不同数据点之间存在关系。这对于可以应用于时间序列数据集的机器学习算法的类型具有重要的意义。
Time series data examples: a dataset with dependent observations | Source: Author
在本文的下一部分,您将更详细地了解时间序列数据的特性。
时间序列模型细节
由于时间序列数据的性质,时间序列建模有许多与其他数据集无关的特性。
单变量与多变量时间序列模型
时间序列的第一个特性是标识数据的时间戳具有内在意义。单变量时间序列模型是只使用一个变量(目标变量)及其时间变化来预测未来的预测模型。单变量模型特定于时间序列。
在其他情况下,您可能有关于未来的附加说明性数据。例如,假设您想将天气预报纳入您的产品需求预测,或者您有一些其他数据会影响您的预测。在这种情况下,可以使用多元时间序列模型。多元时间序列模型是适用于整合外部变量的单变量时间序列模型。你也可以使用监督机器学习来完成这项任务。
单变量时间序列模型 | 多元时间序列模型 |
---|---|
仅仅基于过去和现在的关系
|
基于过去与现在的关系,以及变量之间的关系
|
如果要对时间序列数据使用时态变化,首先需要了解可能出现的不同类型的时态变化。
时间序列分解
时间序列分解是一种从数据集中提取多种类型变化的技术。时间序列的时态数据有三个重要组成部分:季节性、趋势和噪声。
- 季节性是出现在你的时间序列变量中的循环运动。例如,一个地方的温度在夏季会高一些,在冬季会低一些。您可以计算月平均温度,并使用这种季节性作为预测未来值的基础。
- 趋势可以是长期向上或向下的形态。在温度时间序列中,趋势可能是由于全球变暖而呈现的。例如,除了夏季/冬季的季节性之外,随着时间的推移,你很可能会看到平均气温略有上升。
- 噪声是时间序列中既不能用季节性也不能用趋势来解释的可变性部分。当构建模型时,您最终会将不同的组件组合成一个数学公式。这个公式的两个部分可以是季节性和趋势性。一个结合了两者的模型永远不会完美地代表温度值:误差永远存在。这用噪声系数来表示。
Python 中的时间序列分解示例
让我们看一个简短的例子来理解如何使用来自 statsmodels 库的 CO2 数据集在 Python 中分解时间序列。
您可以按如下方式导入数据:
import statsmodels.datasets.co2 as co2
co2_data = co2.load(as_pandas=True).data
print(co2_data)
为了便于理解,数据集如下所示。它有一个时间索引(每周日期),并记录二氧化碳测量值。
有几个 NA 值可以使用插值法移除,如下所示:
co2_data = co2_data.fillna(co2_data.interpolate())
您可以使用以下代码查看 CO2 值的时间演变:
co2_data.plot()
这将生成以下图:
Plot of the CO2 time series | Source: Author
您可以使用 statsmodels 的季节性分解函数进行现成的分解。以下代码将生成一个图,将时间序列分为趋势、季节性和噪声(此处称为残差):
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(co2_data)
result.plot()
Plot of the decomposed CO2 time series | Source: Author
二氧化碳数据的分解显示出上升趋势和很强的季节性。
自相关
让我们转到时间序列数据中可能存在的第二种类型的时间信息:自相关。
自相关是时间序列的当前值与过去值之间的相关性。如果是这种情况,您可以使用现值来更好地预测未来值。
自相关可以是正的也可以是负的:
- 正自相关意味着现在的高值可能会在未来产生高值,反之亦然。你可以想想股票市场:如果每个人都在买股票,那么价格就会上涨。当价格上涨时,人们认为这是一个值得购买的好股票,他们也会购买,从而推动价格进一步上涨。然而,如果价格下跌,那么每个人都害怕崩溃,卖掉他们的股票,价格变得更低。
- 负自相关则相反:今天的高值意味着明天的低值,今天的低值意味着明天的高值。一个常见的例子是自然环境中的兔子种群。如果一年的夏天有很多野兔,它们会吃掉所有可用的自然资源。到了冬天,就没什么可吃的了,所以很多兔子都会死掉,存活下来的兔子数量也会很少。在兔子数量很少的这一年里,自然资源会重新增长,并允许兔子数量在下一年增长。
两个著名的图表可以帮助您检测数据集中的自相关:ACF 图和 PACF 图。
ACF:自相关函数
自相关函数是一种有助于识别时间序列中是否存在自相关的工具。
您可以使用 Python 计算 ACF 图,如下所示:
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(co2_data)
Autocorrelation plot | Source: Author
在 x 轴上,您可以看到时间步长(回到过去)。这也被称为滞后数。在 y 轴上,您可以看到每个时间步长与“当前”时间的相关性。很明显,在这张图上有明显的自相关。
PACF:自相关函数
PACF 是 ACF 的替代品。它给出的不是自相关,而是偏相关。这种自相关被称为部分自相关,因为随着过去的每一步,只列出额外的自相关。这与 ACF 不同,因为当可变性可以由多个时间点解释时,ACF 包含重复相关性。
例如,如果今天的值与昨天的值相同,但也与前天的值相同,则 ACF 将显示两个高度相关的步骤。PACF 只会在昨天出现,前天就消失了。
您可以使用 Python 计算 PACF 图,如下所示:
from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(co2_data)
Partial autocorrelation plot | Source: Author
你可以在下面看到,这张 PACF 图更好地展示了二氧化碳数据的自相关性。滞后 1 有很强的正自相关:现在的高值意味着你很有可能在下一步观察到高值。因为这里显示的自相关是部分的,你看不到任何早期滞后的重复效果,使 PACF 图更整洁和清晰。
平稳性
时间序列的另一个重要定义是平稳性。平稳时间序列是没有趋势的时间序列。一些时间序列模型不能够处理趋势(稍后将详细介绍)。您可以使用 Dickey-Fuller 测试来检测非平稳性,并使用差分来消除非平稳性。
迪基-富勒试验
Dickey-Fuller 检验是一种统计假设检验,允许您检测非平稳性。您可以使用以下 Python 代码对 CO2 数据进行 Dickey-Fuller 测试:
from statsmodels.tsa.stattools import adfuller
adf, pval, usedlag, nobs, crit_vals, icbest = adfuller(co2_data.co2.values)
print('ADF test statistic:', adf)
print('ADF p-values:', pval)
print('ADF number of lags used:', usedlag)
print('ADF number of observations:', nobs)
print('ADF critical values:', crit_vals)
print('ADF best information criterion:', icbest)
结果如下所示:
ADF 检验的零假设是时间序列中存在单位根。另一个假设是数据是稳定的。
第二个值是 p 值。如果这个 p 值小于 0.05,您可以拒绝零假设(拒绝非平稳性)并接受替代假设(平稳性)。在这种情况下,我们不能拒绝零假设,将不得不假设数据是非平稳的。由于你看到了数据,知道有趋势,所以这也印证了我们得出的结果。
区别
您可以从时间序列中移除趋势。目标是只有季节性变化:这可以是使用某些模型的一种方式,这些模型只适用于季节性,而不适用于趋势。
prev_co2_value = co2_data.co2.shift()
differenced_co2 = co2_data.co2 - prev_co2_value
differenced_co2.plot()
不同的 CO2 数据如下所示:
Differenced CO2 time series | Source: Author
如果对差异数据重新进行 ADF 测试,您将确认该数据现在确实是稳定的:
adf, pval, usedlag, nobs, crit_vals, icbest = adfuller(differenced_co2.dropna())
print('ADF test statistic:', adf)
print('ADF p-values:', pval)
print('ADF number of lags used:', usedlag)
print('ADF number of observations:', nobs)
print('ADF critical values:', crit_vals)
print('ADF best information criterion:', icbest)
p 值很小,说明替代假设(平稳性)成立。
单步与多步时间序列模型
在开始建模之前,最后一个需要理解的重要概念是单步模型和多步模型的概念。
有些模型非常适合预测时间序列的下一步,但不具备同时预测多个步骤的能力。这些模型是单步模型。您可以通过在您的预测上设置窗口来使用它们创建多步模型,但这有一个风险:当使用预测值来进行预测时,您的误差可能会很快增加并变得非常大。
多步模型具有一次预测多个步骤的内在能力。它们通常是长期预测的更好选择,有时也是一步预测的更好选择。在开始构建模型之前,决定要预测的步数是很关键的。这完全取决于您的用例。
一步预测 | 多步预测 |
---|---|
旨在只预测未来 1 步
|
旨在预测未来的多步
|
|
可以通过加窗预测生成多步预测
| 无需开窗预测 |
|
对于多步预测来说性能较差
|
更适合多步预测
|
时间序列模型的类型
既然您已经看到了时间序列数据的主要特性,那么是时候研究可用于预测时间序列的模型类型了。这项任务通常被称为预测。
经典时间序列模型
经典时间序列模型是传统上在许多预测领域中经常使用的模型族。它们强烈地基于一个时间序列内的时间变化,并且它们与单变量时间序列一起工作得很好。还有一些高级选项可以将外部变量添加到模型中。这些模型一般只适用于时间序列,对其他类型的机器学习没有用。
监督模型
监督模型是用于许多机器学习任务的模型族。当机器学习模型使用明确定义的输入变量和一个或多个输出(目标)变量时,它就会受到监督。
监督模型可以用于时间序列,只要你有办法提取季节性并将其放入变量中。示例包括为一年、一个月或一周中的某一天等创建变量。然后,这些被用作监督模型中的 X 变量,而“y”是时间序列的实际值。您还可以将 y 的滞后版本(y 的过去值)包含到 X 数据中,以便添加自相关效应。
深度学习和最新模型
过去几年深度学习越来越受欢迎,这也为预测打开了新的大门,因为已经发明了特定的深度学习架构,可以很好地处理序列数据。
云计算和人工智能作为一种服务的普及也在该领域提供了许多新发明。脸书、亚马逊和其他大型科技公司正在开源他们的预测产品,或者在他们的云平台上提供这些产品。这些新的“黑箱”模型的出现为预测从业者提供了尝试和测试的新工具,有时甚至可以击败以前的模型。
深入经典时间序列模型
在这一部分,你将深入发现经典的时间序列模型。
ARIMA 家族
ARIMA 系列模型是一组可以组合的较小模型。ARMIA 模型的每个部分都可以作为独立的组件使用,也可以将不同的构建模块组合起来使用。当所有单独的组件放在一起时,您就获得了 SARIMAX 模型。现在,您将分别看到每个构造块。
1.自回归(AR)
自回归是 SARIMAX 系列的第一个构件。您可以将 AR 模型视为一个回归模型,它使用变量的过去(滞后)值来解释变量的未来值。
AR 模型的阶数表示为 p,它代表模型中包含的滞后值的数量。最简单的模型是 AR(1)模型:它仅使用前一时间步的值来预测当前值。您可以使用的值的最大数量是时间序列的总长度(即,您使用所有以前的时间步长)。
2.移动平均线
均线是更大的 SARIMAX 模型的第二个组成部分。它的工作方式与 AR 模型类似:它使用过去的值来预测变量的当前值。
移动平均模型使用的过去值不是变量的值。更确切地说,移动平均线使用先前时间步骤中的预测误差来预测未来。
这听起来有些反直觉,但背后有一个逻辑。当一个模型有一些未知但有规律的外部扰动时,你的模型可能有季节性或其他模式的误差。MA 模型是一种捕捉这种模式的方法,甚至不需要确定它来自哪里。
MA 模型也可以使用多个时间回溯步骤。这在称为 q 的阶数参数中表示。例如,MA(1)模型的阶数为 1,并且仅使用一个时间步长。
3.自回归移动平均(ARMA)
自回归移动平均(ARMA)模型将之前的两个构建模块合并为一个模型。因此,ARMA 可以使用过去的值和预测误差。
对于 AR 和 MA 过程的滞后,ARMA 可以有不同的值。例如,ARMA(1,0)模型的 AR 阶为 1 ( p = 1),MA 阶为 0 (q=0)。这其实只是一个 AR(1)模型。MA(1)模型与 ARMA(0,1)模型相同。其他组合也是可能的:例如,ARMA(3,1)具有 3 个滞后值的 AR 顺序,并对 MA 使用 1 个滞后值。
4.自回归综合移动平均(ARIMA)
ARMA 模型需要平稳的时间序列。正如你之前看到的,平稳性意味着时间序列保持稳定。您可以使用扩展的 Dickey-Fuller 测试来测试您的时间序列是否稳定,如果不稳定,则应用差分。
ARIMA 模型在 ARMA 模型中加入了自动差分。它有一个额外的参数,您可以将它设置为时间序列需要进行差分的次数。例如,需要进行一次微分的 ARMA(1,1)将产生以下符号:ARIMA(1,1,1)。第一个 1 用于 AR 订单,第二个 1 用于差额,第三个 1 用于 MA 订单。ARIMA(1,0,1)将与 ARMA(1,1)相同。
5.季节性自回归综合移动平均(SARIMA)
萨里玛在 ARIMA 模型中加入了季节效应。如果季节性出现在你的时间序列中,在你的预测中使用它是非常重要的。
萨里玛符号比 ARIMA 符号要复杂得多,因为每个组件都在常规参数的基础上接收一个季节性参数。
例如,让我们考虑之前看到的 ARIMA(p,d,q)。在 SARIMA 符号中,这变成了 SARIMA(p,D,q)(P,D,Q)m。
m 就是每年观察的次数:月数据的 m=12,季度数据的 m=4,等等。小写字母(p、d、q)代表非季节性订单。大写字母(P,D,Q)代表季节性订单。
6.带有外生回归量的季节性自回归综合移动平均(SARIMAX)
最复杂的变体是 SARIMAX 模型。它重新组合 AR、MA、差异和季节效应。除此之外,它还添加了 X:外部变量。如果你有任何可以帮助你的模型改进的变量,你可以用 SARIMAX 添加它们。
Python 中关于 CO2 的自动 Arima 示例
现在,您已经看到了 ARIMA 家族的所有单个构件,是时候将它应用到一个示例中了。让我们看看是否可以使用该模型为二氧化碳数据建立一个预测模型。
ARIMA 或萨里马克斯模型的困难之处在于,你有许多参数(pp,D,Q)甚至(P,D,q)(P,D,Q)需要选择。
在某些情况下,您可以检查自相关图并确定参数的逻辑选择。您可以使用 SARIMAX 的 statsmodels 实现,并使用您选择的参数尝试性能。
另一种方法是使用 auto-arima 函数,它可以自动优化超参数。金字塔 Python 库正是这样做的:它尝试不同的组合,并选择具有最佳性能的组合。
您可以按如下方式安装金字塔:
安装后,有必要进行训练/测试分割。您将在后面看到更多关于这方面的内容,但现在我们先继续。
import pmdarima as pm
from pmdarima.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
然后,根据 CO2 训练数据拟合模型,并使用最佳选择的模型进行预测。
train, test = train_test_split(co2_data.co2.values, train_size=2200)
您可以用这里创建的图向他们展示:
model = pm.auto_arima(train, seasonal=True, m=52)
preds = model.predict(test.shape[0])
在该图中,蓝线是实际值(训练数据),橙线是预测值。
x = np.arange(y.shape[0])
plt.plot(co2_data.co2.values[:2200], train)
plt.plot(co2_data.co2.values[2200:], preds)
plt.show()
Actual data in blue and forecasted data in orange | Source: Author
更多关于金字塔的信息和例子,你可以查看他们的文档。
向量自回归(VAR)及其导数 VARMA 和 VARMAX
你可以看到向量自回归,或 VAR 作为 Arima 的多变量替代。不是预测一个因变量,而是同时预测多个时间序列。当不同的时间序列之间有很强的关系时,这尤其有用。向量自回归和标准 AR 模型一样,只包含一个自回归分量。
VARMA 模型是 ARMA 模型的多元等价物。VARMA 对于 ARMA 就像 VAR 对于 AR 一样:它在模型中增加了一个移动平均分量。
如果想更进一步,可以用 VARMAX 。X 代表外部(外生)变量。外生变量是可以帮助您的模型做出更好预测的变量,但它们本身不需要预测。statsmodels VARMAX 实现是开始实现 VARMAX 模型的好方法。
存在更高级的版本,如季节性 VARMAX (SVARMAX ),但它们变得如此复杂和具体,以至于很难找到简单有效的实现。一旦模型变得如此复杂,就很难理解模型内部发生了什么,通常最好开始研究其他熟悉的模型。
缓和
指数平滑是一种基本的统计技术,可以用来平滑时间序列。时间序列模式通常有很多长期可变性,但也有短期(噪声)可变性。平滑允许你使你的曲线更平滑,这样长期的可变性变得更明显,短期的(有噪声的)模式被去除。
这个时间序列的平滑版本可以用于分析。
1.简单移动平均线
简单移动平均线是最简单的平滑技术。它包括用当前值和几个过去值的平均值替换当前值。要考虑的过去值的确切数量是一个参数。使用的值越多,曲线就越平滑。同时,你会失去越来越多的变异。
2.简单指数平滑(SES)
指数平滑是这种简单移动平均线的改编。它不是取平均值,而是取过去值的加权平均值。越往后的值越不重要,越近的值越重要。
3.双指数平滑
当时间序列数据中存在趋势时,应避免使用简单的指数平滑法:在这种情况下,该方法效果不佳,因为模型无法正确区分变化和趋势。不过可以用双指数平滑。
在 DES 中,有一个指数滤波器的递归应用。这允许您消除趋势问题。对于时间零点,这使用以下公式:
以及后续时间步长的下列公式:
其中α是数据平滑因子,β是趋势平滑因子。
4.霍尔特·温特的指数平滑法
如果想更进一步,可以用三重指数平滑法,也叫霍尔特温特指数平滑法。只有当您的时间序列数据中有三个重要信号时,您才应该使用它。例如,一个信号可以是趋势,另一个信号可以是每周季节性,第三个信号可以是每月季节性。
Python 中指数平滑的一个例子
在下面的示例中,您将看到如何对 CO2 数据应用简单的指数平滑。平滑级别表示曲线应该变得多平滑。在本例中,它设置得非常低,表示曲线非常平滑。随意使用这个参数,看看不太平滑的版本是什么样子。
蓝线代表原始数据,橙线代表平滑曲线。由于这是一个简单的指数平滑法,它只能捕捉一个信号:趋势。
from statsmodels.tsa.api import SimpleExpSmoothing
es = SimpleExpSmoothing(co2_data.co2.values)
es.fit(smoothing_level=0.01)
plt.plot(co2_data.co2.values)
plt.plot(es.predict(es.params, start=0, end=None))
plt.show()
Original data in blue and smoothed graph in orange | Source: Author
深入监督机器学习模型
监督机器学习模型的工作方式与经典机器学习模型非常不同。主要区别在于,他们认为变量要么是因变量,要么是自变量。因变量或目标变量是您想要预测的变量。自变量是帮助你预测的变量。
有监督的机器学习模型不是专门为时间序列数据制作的。毕竟时间序列数据中往往没有自变量。然而,通过将季节性(例如,基于您的时间戳)转换为独立变量,使它们适应时间序列是相当简单的。
线性回归
线性回归可以说是最简单的监督机器学习模型。线性回归估计线性关系:每个独立变量都有一个系数,表明该变量如何影响目标变量。
简单线性回归是只有一个自变量的线性回归。非时间序列数据中简单线性回归模型的一个示例如下:取决于外部温度(摄氏度)的热巧克力销售额。
温度越低,热巧克力的销量越高。从视觉上看,这可能如下图所示。
在多元线性回归中,不是只使用一个自变量,而是使用多个自变量。您可以想象二维图形转换成三维图形,其中第三个轴代表可变价格。在这种情况下,您将构建一个线性模型,使用温度和价格来解释销售额。您可以根据需要添加任意数量的变量。
Linear regression | Source: Author
现在,当然,这不是一个时间序列数据集:没有时间变量。那么,如何将这种技术用于时间序列呢?答案相当简单。除了在这个数据集中只使用温度和价格,您还可以添加年、月、星期几等变量。
如果你在时间序列上建立一个监督模型,你有一个缺点,你需要做一点特征工程,以某种方式将季节性提取到变量中。然而,一个优点是增加外生变量变得容易多了。
现在让我们看看如何对 CO2 数据集应用线性回归。您可以按如下方式准备 CO2 数据:
这样你就有了三个独立变量:日、月和周。你也可以考虑其他季节性变量,比如星期几、星期几等等。,但是现在,我们先这样吧。
import numpy as np
months = [x.month for x in co2_data.index]
years = [x.year for x in co2_data.index]
day = [x.day for x in co2_data.index]
X = np.array([day, months, years]).T
然后,您可以使用 scikit-learn 构建一个线性回归模型,并进行预测,以查看该模型了解了什么:
使用此代码时,您将获得下面的图,该图显示了与数据相对较好的拟合:
from sklearn.linear_model import LinearRegression
my_lr = LinearRegression()
my_lr.fit(X, co2_data.co2.values)
preds = my_lr.predict(X)
plt.plot(co2_data.index, co2_data.co2.values)
plt.plot(co2_data.index, preds)
随机森林
Linear regression forecast | Source: Author
线性模型非常有限:它只能拟合线性关系。有时这就足够了,但是在大多数情况下,最好使用更高性能的模型。随机森林是一种常用的模型,允许拟合非线性关系。还是很好用的。
scikit-learn 库有 RandomForestRegressor,您可以简单地使用它来替换前面代码中的 LinearRegression。
现在对训练数据的拟合甚至比以前更好:
from sklearn.ensemble import RandomForestRegressor
my_rf = RandomForestRegressor()
my_rf.fit(X, co2_data.co2.values)
preds = my_rf.predict(X)
plt.plot(co2_data.index, co2_data.co2.values)
plt.plot(co2_data.index, preds)
目前来看,理解这个随机森林已经能够更好地学习训练数据就足够了。在本文的后面部分,您将会看到更多的模型评估的定量方法。
Random forest forecast | Source: Author
XGBoost
XGBoost 模型是您绝对应该知道的第三个模型。还有许多其他模型,但随机森林和 XGBoost 被认为是监督机器学习家族中的绝对经典。
XGBoost 是一个基于梯度推进框架的机器学习模型。这个模型是弱学习者的集合模型,就像随机森林一样,但是有一个有趣的优点。在标准梯度提升中,各个树按顺序拟合,并且每个连续的决策树以最小化先前树的误差的方式拟合。XGBoost 获得了相同的结果,但是仍然能够进行并行学习。
您可以使用 XGBoost 包,如下所示:
如你所见,这个模型也非常符合数据。在本文的后面部分,您将学习如何进行模型评估。
import xgboost as xgb
my_xgb = xgb.XGBRegressor()
my_xgb.fit(X, co2_data.co2.values)
preds = my_xgb.predict(X)
plt.plot(co2_data.index, co2_data.co2.values)
plt.plot(co2_data.index, preds)
XGBoost forecast | Source: Author
深入研究高级和特定的时间序列模型
在这一部分中,您将发现两个更高级、更具体的时间序列模型,称为 GARCH 和 TBATS。
广义自回归条件异方差(GeneralizedAutoregressiveConditionalHeteroskedasticity)
GARCH 代表广义自回归条件异方差。这是一种估计金融市场波动性的方法,通常用于此用例。它很少用于其他用例。
该模型很好地解决了这一问题,因为它假设时间序列的误差方差为 ARMA 模型,而不是实际数据。这样,您可以预测可变性而不是实际值。
GARCH 模型家族存在许多变体,例如,检查这个出来。这个模型非常值得了解,但是应该只在需要预测可变性时使用,因此它与本文中介绍的其他模型相对不同。
TBATS
TBATS 代表以下部件的组合:
三角季节性
- 博克斯-考克斯变换
- ARMA 误差
- 趋势
- 季节性成分
- 该模型创建于 2011 年,作为预测具有多个季节周期的时间序列的解决方案。由于它相对较新,也相对较先进,所以不像 ARIMA 系列中的车型那样普及和使用。
TBATS 的一个有用的 Python 实现可以在 Pythonsk time包中找到。
深入研究基于深度学习的时间序列模型
现在,您已经看到了两个相对不同的模型族,每个模型族都有其特定的模型拟合方式。经典的时间序列模型关注的是过去和现在之间的关系。监督机器学习模型专注于因果关系。
现在,您将看到另外三个可用于预测的最新模型。理解和掌握它们更加复杂,并且可能(也可能不会)产生更好的结果,这取决于数据和用例的细节。
LSTM(长短期记忆)
LSTMs 是递归神经网络。神经网络是非常复杂的机器学习模型,通过网络传递输入数据。网络中的每个节点学习一个非常简单的操作。神经网络由许多这样的节点组成。该模型可以使用大量简单节点的事实使得整体预测非常复杂。因此,神经网络可以适应非常复杂和非线性的数据集。
RNNs 是一种特殊类型的神经网络,其中网络可以从序列数据中学习。这对于多种用例非常有用,包括理解时间序列(显然是一段时间内的值序列),也包括文本(句子是单词序列)。
LSTMs 是一种特定类型的 rnn。事实证明,它们在多种情况下对时间序列预测非常有用。它们需要一些数据,学习起来比监督模型更复杂。一旦你掌握了它们,根据你的数据和你的具体使用情况,它们会被证明是非常强大的。
要深入 LSTMs,Python 中的 Keras 库是一个很好的起点。
先知
Prophet 是一个时间序列库,由脸书开源。这是一个黑箱模型,因为它将在没有太多用户说明的情况下生成预测。这可能是一个优势,因为您几乎可以自动生成预测模型,而不需要太多的知识或努力。
另一方面,这里也有一个风险:如果您不够关注,您很可能会产生一个对自动化模型构建工具来说看起来不错的模型,但是实际上效果并不好。
当使用这种黑盒模型时,建议进行广泛的模型验证和评估,但是如果您发现它在您的特定用例中运行良好,您可能会发现这里有很多附加价值。
你可以在脸书的 GitHub 上找到很多资源。
更深
DeepAR 是亚马逊开发的另一个这样的黑盒模型。内心深处的功能是不一样的,但是从用户体验来说,相对等于 Prophet。这个想法还是要有一个 Python 库来帮你完成所有的繁重工作。
同样,需要谨慎,因为你永远不能指望任何黑盒模型是完全可靠的。在下一部分中,您将看到更多关于模型评估和基准测试的内容,这对于如此复杂的模型来说是极其重要的。一个模型越复杂,错误就越多!
DeepAR 的一个伟大且易于使用的实现可以在 Gluon 包中获得。
时间序列模型选择
在本文的前一部分,你已经看到了大量的时间序列模型,分为经典的时间序列模型,有监督的机器学习模型,以及最近的发展包括 LSTMs,Prophet 和 DeepAR。
时间序列预测任务的最终成果将是只选择一个模型。这必须是为您的用例交付最佳结果的模型。在本文的这一部分中,您将学习如何从大量可能的模型中选择一个模型。
时间序列模型评估
时间序列度量
选择模型时,首先要定义的是您想要查看的指标。在上一部分中,您已经看到了不同质量的多重拟合(想想线性回归与随机森林)。
为了进一步选择模型,您需要定义一个度量来评估您的模型。预测中经常使用的模型是均方差。该指标测量每个时间点的误差,并取其平方。这些平方误差的平均值称为均方误差。一种常用的替代方法是均方根误差:均方误差的平方根。
另一个常用的度量是平均绝对误差:这里不是取每个误差的平方,而是取绝对值。平均绝对百分比误差是在此基础上的变化,其中每个时间点的绝对误差表示为实际值的百分比。这产生了一个百分比度量,非常容易解释。
时间序列训练测试分割
评估机器学习时要考虑的第二件事是,考虑到在训练数据上工作良好的模型不一定在新的样本外数据上工作良好。这种模型被称为过拟合模型。
有两种常见的方法可以帮助您评估模型是否正确地概括:训练-测试-分割和交叉验证。
训练测试分割意味着在拟合模型之前删除一部分数据。例如,您可以从 CO2 数据库中删除最近 3 年的数据,并使用剩余的 40 年来拟合模型。然后,您预测三年的测试数据,并在您的预测和过去三年的实际值之间测量您选择的评估指标。
要进行基准测试和选择模型,您可以基于 40 年的数据构建多个模型,并对所有模型进行测试集评估。根据这个测试性能,您可以选择性能最好的型号。
当然,如果你正在建立一个短期预测模型,使用三年的数据是没有意义的:你应该选择一个与你在现实中预测的时期相当的评估时期。
时间序列交叉验证
训练测试分割的一个风险是你只能在一个时间点进行测量。在非时间序列数据中,测试集通常由随机选择的数据点生成。然而,在时间序列中,这在许多情况下是行不通的:当使用序列时,你不能去掉序列中的一个点而仍然期望模型工作。
因此,最好通过选择最后一段时间作为测试集来应用时间序列训练测试分割。这里的风险是,如果你的最后一次月经不太可靠,这可能会出错。在最近的 covid 期间,你可以想象许多商业预测已经完全关闭:潜在的趋势已经发生了变化。
交叉验证是一种重复训练测试评估的方法。它不是进行一次列车测试分割,而是进行多次分割(精确的数字是用户定义的参数)。例如,如果您使用三重交叉验证,您将把数据集分成三个相等的部分。然后,您将在三分之二的数据集上拟合三次相同的模型,并使用另外三分之一进行评估。最后,您有三个评估分数(每个在不同的测试集上),您可以使用平均值作为最终的度量。
通过这样做,您避免了偶然选择一个在测试集上工作的模型:您现在已经确保它在多个测试集上工作。
然而,在时间序列中,您不能应用随机选择来获得多个测试集。如果你这样做,你将会得到有很多缺失数据点的序列。
可以在时间序列交叉验证中找到解决方案。它所做的是创建多个训练测试集,但是每个测试集都是周期的结束。例如,第一次训练测试分割可以建立在前 10 年的数据上(5 次训练,5 次测试)。第二个模型将在前 15 年的数据上完成(10 次训练,5 次测试),等等。这可以很好地工作,但是缺点是每个模型在训练数据中不使用相同的年数。
一种替代方法是进行滚动分割(总是 5 年训练,5 年测试),但这里的缺点是你永远不能使用超过 5 年的训练数据。
时间序列模型实验
总之,在进行时间序列模型选择时,以下问题是在开始实验之前定义的关键:
您使用的是哪个指标?
- 您要预测哪个期间?
- 如何确保你的模型对模型没有看到的未来数据点起作用?
- 一旦您有了上述问题的答案,您就可以开始尝试不同的模型,并使用定义的评估策略来选择和改进模型。
时间序列建模的用例示例
在本部分中,您将制作标准普尔 500 第二天的天气预报。你可以想象每天晚上运行你的模型,然后第二天你就会知道股票市场是上涨还是下跌。如果你有一个非常准确的模型来做这件事,你可以很容易地赚很多钱(不要把它当作财务建议;)).
股票市场预测数据和评估方法的定义
获取股票市场数据
您可以使用 Python 中的 Yahoo Finance 包来自动下载股票数据。
你可以在图中看到自 1980 年以来 S&P500 收盘价的演变:
!pip install yfinance
import yfinance as yf
sp500_data = yf.download('^GSPC', start="1980-01-01", end="2021-11-21")
sp500_data = sp500_data[['Close']]
sp500_data.plot(figsize=(12, 12))
对于股票数据,绝对价格实际上并不那么重要。股票交易者更感兴趣的是知道价格是上涨还是下跌,以及上涨的百分比。您可以将数据更改为百分比增加或减少,如下所示:
The evolution of the S&P500 closing prices since 1980 | Source: Author
定义实验方法
difs = (sp500_data.shift() - sp500_data) / sp500_data
difs = difs.dropna()
difs.plot(figsize=(12, 12))
Plot of the percentage difference of the S&P | Source: Author
模型的目标是对第二天股票价格的变化做出最好的预测。有必要决定一种方法,这样您就可以在这里稍微自动化这个过程。
因为您只想预测一天,所以可以理解测试集将会非常小(只有一天)。因此,最好创建大量的测试分割,以确保有一个可接受的模型评估量。
这可以通过前面解释的时间序列分割来获得。例如,您可以设置一个将生成 100 个训练测试集的时间序列拆分,其中每个训练测试集使用三个月的训练数据和一天的测试数据。这将有助于本例理解时间序列中的模型选择原则。
构建经典时间序列模型
让我们从这个问题的经典时间序列模型开始:Arima 模型。在这段代码中,您将设置 Arima 模型的自动创建,其顺序范围从(0,0,0)到(4,4,4)。每个模型都将使用具有 100 个分割的时间序列分割来构建和评估,其中训练规模最大为三个月,测试规模始终为一天。
因为涉及到大量的运行,结果被记录到 neptune.ai 中以便于比较。为了跟进,你可以建立一个免费账户,从这个教程中获得更多信息。
您可以以表格形式查看结果:
import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import TimeSeriesSplit
import neptune.new as neptune
param_list = [(x, y, z) for x in range(5) for y in range(5) for z in range(5)]
for order in param_list:
run = neptune.init(
project="YOU/YOUR_PROJECT",
api_token="YOUR_API_TOKEN",
)
run['order'] = order
mses = []
tscv = TimeSeriesSplit(n_splits=100,
max_train_size = 3*31,
test_size=1)
for train_index, test_index in tscv.split(y):
try:
train = y[train_index]
test = y[test_index]
mod = sm.tsa.ARIMA(train, order=order)
res = mod.fit()
pred = res.forecast(1)[0]
mse = mean_squared_error(test, pred)
mses.append(mse)
except:
pass
try:
average_mse = np.mean(mses)
std_mse = np.std(mses)
run['average_mse'] = average_mse
run['std_mse'] = std_mse
except:
run['average_mse'] = None
run['std_mse'] = None
run.stop()
平均 MSE 最低的模型是阶数为(0,1,3)的模型。但是,你可以看到,这个模型的标准差可疑地为 0。接下来的两个模型是 ARIMA(1,0,3)和 ARIMA(1,0,2)。它们非常相似,这表明结果是可靠的。这里的最佳猜测是将 ARIMA(1,0,3)作为最佳模型,其平均 MSE 为 0.00000131908,平均标准差为 0.00000197007。
如果您使用 Prophet, Neptune-Prophet 集成可以帮助您跟踪参数、预测数据帧、残差诊断图表和其他模型构建元数据。
构建有监督的机器学习模型
现在让我们转到一个监督模型,看看性能是否不同于经典的时间序列模型。
在用于预测的监督机器学习中,需要对特征工程做出决策。正如本文前面所解释的,监督模型使用因变量(预测变量)和自变量(预测变量)。
在一些用例中,你可能有很多关于未来的数据。例如,如果您想预测一家餐馆的顾客数量,您可以使用未来日期的预定数量的外部数据作为独立变量。
对于当前的股票市场用例,您没有这些数据:您只有一段时间内的股票价格。然而,监督模型不能仅使用目标变量来构建。你需要找到一种方法从数据中提取季节性,并使用特征工程来创建独立变量。众所周知,股票市场具有很多自相关效应,因此让我们尝试一个模型,该模型使用过去 30 天的值作为预测变量来预测第 31 天。
您可以创建一个数据集,其中包含 S&P500 的 30 个训练日和 1 个测试日(总是连续的)的所有可能组合,并且您可以通过以下方式创建一个巨大的训练数据库:
既然有了训练数据库,就可以使用常规的交叉验证:毕竟,数据集的行可以独立使用。它们都是 30 个训练日和 1 个“未来”测试日的集合。由于有了这些数据准备,您可以使用常规的 KFold 交叉验证。
import yfinance as yf
sp500_data = yf.download('^GSPC', start="1980-01-01", end="2021-11-21")
sp500_data = sp500_data[['Close']]
difs = (sp500_data.shift() - sp500_data) / sp500_data
difs = difs.dropna()
y = difs.Close.values
X_data = []
y_data = []
for i in range(len(y) - 31):
X_data.append(y[i:i+30])
y_data.append(y[i+30])
X_windows = np.vstack(X_data)
下表显示了使用此循环获得的一些分数:
import numpy as np
import xgboost as xgb
from sklearn.model_selection import KFold
import neptune.new as neptune
from sklearn.metrics import mean_squared_error
parameters={'max_depth': list(range(2, 20, 4)),
'gamma': list(range(0, 10, 2)),
'min_child_weight' : list(range(0, 10, 2)),
'eta': [0.01,0.05, 0.1, 0.15,0.2,0.3,0.5]
}
param_list = [(x, y, z, a) for x in parameters['max_depth'] for y in parameters['gamma'] for z in parameters['min_child_weight'] for a in parameters['eta']]
for params in param_list:
mses = []
run = neptune.init(
project="YOU/YOUR_PROJECT",
api_token="YOUR_API_TOKEN",
)
run['params'] = params
my_kfold = KFold(n_splits=10, shuffle=True, random_state=0)
for train_index, test_index in my_kfold.split(X_windows):
X_train, X_test = X_windows[train_index], X_windows[test_index]
y_train, y_test = np.array(y_data)[train_index], np.array(y_data)[test_index]
xgb_model = xgb.XGBRegressor(max_depth=params[0],gamma=params[1], min_child_weight=params[2], eta=params[3])
xgb_model.fit(X_train, y_train)
preds = xgb_model.predict(X_test)
mses.append(mean_squared_error(y_test, preds))
average_mse = np.mean(mses)
std_mse = np.std(mses)
run['average_mse'] = average_mse
run['std_mse'] = std_mse
run.stop()
本次网格研究中测试的参数如下表所示:
参数名称
测试值 | 描述 | |
---|---|---|
树越深,越复杂。设置该参数可以帮助您避免模型
过于复杂(过度拟合) | 树越深,就越复杂。设置此参数可以帮助您避免模型过于复杂(过度拟合) |
| |
如果树分裂创建了一个总和低于该值的节点,模型将停止分裂。这是避免过于复杂模型的另一种方法
| 如果树拆分创建的节点的总和低于该值,则模型将停止拆分。这是避免过于复杂的模型的另一种方法 |
| |
用于防止过拟合的优化步长
| 用于防止过度拟合的优化步长 |
| |
允许节点进一步分裂的最小损失减少:该值越高,在树中分裂越少
| 允许进一步分裂节点的最小损失减少:该值越高,在树中进行的分裂越少 |
有关 XGBoost 调优的更多信息,请查看官方的 XGBoost 文档。
这个 XGBoost 获得的最佳(最低)MSE 是 0.000129982。有多个超参数组合获得此分数。正如您所看到的,XGBoost 模型的性能远不如经典的时间序列模型,至少在当前的配置中是这样。为了从 XGBoost 获得更好的结果,可能需要另一种组织数据的方法。
构建基于深度学习的时间序列模型
作为模型比较的第三个模型,让我们拿一个 LSTM,看看它是否能打败 ARIMA 模型。您也可以使用交叉验证进行模型比较。然而,这可能要运行相当长的时间。在这种情况下,您将看到如何使用训练/测试分割。
您可以使用以下代码构建 LSTM:
您将看到 10 个时期的以下输出:
import yfinance as yf
sp500_data = yf.download('^GSPC', start="1980-01-01", end="2021-11-21")
sp500_data = sp500_data[['Close']]
difs = (sp500_data.shift() - sp500_data) / sp500_data
difs = difs.dropna()
y = difs.Close.values
X_data = []
y_data = []
for i in range(len(y) - 3*31):
X_data.append(y[i:i+3*31])
y_data.append(y[i+3*31])
X_windows = np.vstack(X_data)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_windows, np.array(y_data), test_size=0.2, random_state=1)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=1)
from sklearn.model_selection import GridSearchCV
import numpy as np
import xgboost as xgb
from sklearn.model_selection import KFold
import neptune.new as neptune
from sklearn.metrics import mean_squared_error
archi_list = [
[tf.keras.layers.LSTM(32, return_sequences=True, input_shape=(3*31,1)),
tf.keras.layers.LSTM(32, return_sequences=True),
tf.keras.layers.Dense(units=1)
],
[tf.keras.layers.LSTM(64, return_sequences=True, input_shape=(3*31,1)),
tf.keras.layers.LSTM(64, return_sequences=True),
tf.keras.layers.Dense(units=1)
],
[tf.keras.layers.LSTM(128, return_sequences=True, input_shape=(3*31,1)),
tf.keras.layers.LSTM(128, return_sequences=True),
tf.keras.layers.Dense(units=1)
],
[tf.keras.layers.LSTM(32, return_sequences=True, input_shape=(3*31,1)),
tf.keras.layers.LSTM(32, return_sequences=True),
tf.keras.layers.LSTM(32, return_sequences=True),
tf.keras.layers.Dense(units=1)
],
[tf.keras.layers.LSTM(64, return_sequences=True, input_shape=(3*31,1)),
tf.keras.layers.LSTM(64, return_sequences=True),
tf.keras.layers.LSTM(64, return_sequences=True),
tf.keras.layers.Dense(units=1)
],
]
for archi in archi_list:
run = neptune.init(
project="YOU/YOUR_PROJECT",
api_token="YOUR_API_TOKEN",
)
run['params'] = str(len(archi) - 1) + ' times ' + str(archi[0].units)
run['Tags'] = 'lstm'
lstm_model = tf.keras.models.Sequential(archi)
lstm_model.compile(loss=tf.losses.MeanSquaredError(),
optimizer=tf.optimizers.Adam(),
metrics=[tf.metrics.MeanSquaredError()]
)
history = lstm_model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val))
run['last_mse'] = history.history['val_mean_squared_error'][-1]
run.stop()
LSTM 的表现与 XGBoost 型号相同。同样,如果您想在这方面做更多的工作,还可以有很多东西需要进一步调整。你可以考虑使用更长或更短的训练时间。您可能还希望以不同的方式标准化数据:这通常会影响神经网络的性能。
选择最佳模型
作为本案例研究的结论,您可以说最佳性能是由 ARIMA 模型获得的。这是基于对三个月培训期和一天预测期的比较数据。
后续步骤
如果你想进一步发展这个模式,有很多地方你可以改进。例如,你可以尝试更长或更短的训练时间。您还可以尝试添加额外的数据,如季节性数据(星期几、月份等。)或其他预测变量,如市场情绪或其他。在这种情况下,您需要切换到 SARIMAX 模型。
我希望这篇文章向您展示了如何在时间序列数据的情况下进行模型选择。现在,您已经对可能感兴趣的不同模型和模型类别有了一个概念。您还看到了专门针对时间序列模型评估的工具,如窗口和时间序列分割。
对于更高级的阅读,我建议以下来源:
For more advanced reading, I suggest the following sources:
带有卷积神经网络(CNN)的自动驾驶汽车
人类等待自动驾驶汽车已经几十年了。由于技术的飞速发展,这个想法最近从“可能”变成了“在特斯拉汽车上实现商业化”。
深度学习是实现自动驾驶的主要技术之一。这是一个多功能的工具,几乎可以解决任何问题——它可以用于物理学,例如,大型强子对撞机中的质子-质子碰撞,以及在谷歌镜头中对图片进行分类。深度学习是一种可以帮助解决几乎任何类型的科学或工程问题的技术。
在本文中,我们将重点关注自动驾驶汽车中的深度学习算法——卷积神经网络 (CNN)。CNN 是这些系统用来识别和分类道路的不同部分并做出适当决定的主要算法。
在这个过程中,我们将看到特斯拉、Waymo 和英伟达如何使用 CNN 算法来使他们的汽车无人驾驶或自动驾驶。
自动驾驶汽车是如何工作的?
第一辆自动驾驶汽车发明于 1989 年,它是神经网络 (ALVINN)中的自动陆地车辆。它使用神经网络来检测线路,分割环境,自我导航和驾驶。它工作得很好,但是受到处理能力慢和数据不足的限制。
如今的高性能显卡、处理器、海量数据,自驾比以往任何时候都强大。如果成为主流,将减少交通拥堵,增加道路安全。
自动驾驶汽车是自主决策系统。它们可以处理来自相机、激光雷达、雷达、GPS 或惯性传感器等不同传感器的数据流。然后,使用深度学习算法对这些数据进行建模,然后做出与汽车所处环境相关的决策。
A modular perception-planning-action pipeline | Source
上图显示了用于做出驾驶决策的模块化感知-规划-行动管道。这种方法的关键部分是从环境中获取数据的不同传感器。
为了理解自动驾驶汽车的工作原理,我们需要考察四个主要部分:
- 感知
- 本地化
- 预测
- 决策制定
- 高级路径规划
- 行为仲裁
- 运动控制器
感觉
自动驾驶汽车必须具备的最重要的属性之一是感知,它帮助汽车看到周围的世界,以及识别和分类它看到的东西。为了做出好的决策,汽车需要即时识别物体。
因此,汽车需要看到并分类红绿灯、行人、路标、人行道、停车点、车道等等。不仅如此,它还需要知道自己和周围物体的确切距离。感知不仅仅是看到和分类,它使系统能够评估距离,并决定减速或刹车。
为了实现如此高水平的感知,自动驾驶汽车必须有三个传感器:
- 照相机
- 激光雷达
- 雷达
照相机
摄像机为汽车提供视觉,实现多种任务,如分类、分割、和定位。相机需要高分辨率,并准确地呈现环境。
为了确保汽车接收到来自各个方向的视觉信息:前、后、左、右,摄像头被缝合在一起,以获得整个环境的 360 度视图。这些相机提供远至 200 米的宽视野,以及更集中感知的短视野。
Self-driving car’s camera | Source
在一些像停车这样的任务中,摄像头还可以提供全景视图,以便更好地做出决策。
尽管相机完成所有与感知相关的任务,但在极端条件下,如雾、大雨,尤其是晚上,它几乎没有任何用处。在极端条件下,摄像机捕捉到的只是噪音和差异,这可能会危及生命。
为了克服这些限制,我们需要既能在没有光线的情况下工作又能测量距离的传感器。
激光雷达
激光雷达代表光探测和测距,这是一种通过发射激光束,然后测量它被某物反射所需时间来测量物体距离的方法。
摄像机只能给汽车提供它周围的图像。当它与激光雷达传感器结合时,它可以增加图像的深度——它突然对汽车周围的情况有了 3D 感知。
所以,激光雷达感知空间信息。当这些数据被输入深度神经网络时,汽车可以预测靠近它的物体或车辆的行动。这种技术在复杂的驾驶场景中非常有用,比如在多出口的十字路口,汽车可以分析所有其他汽车,并做出适当、最安全的决定。
Object detection with LiDAR | Source
2019 年,埃隆·马斯克公开表示“任何依赖激光雷达的人都注定……”。为什么?好吧,激光雷达有可能是灾难性的局限性。例如,激光雷达传感器使用激光或光线来测量附近物体的距离。它可以在晚上和黑暗的环境中工作,但当有雨或雾的噪音时,它仍然会失败。这就是为什么我们还需要一个雷达传感器。
receivable accounts data-entry and retrieval system 可接受的账目数据登录及修复系统
无线电探测和测距(雷达)是许多军事和消费应用中的关键组件。它首先被军方用来探测物体。它使用无线电波信号计算距离。今天,它被用于许多车辆,并已成为自动驾驶汽车的主要组成部分。
雷达非常有效,因为它们使用无线电波而不是激光,所以它们在任何条件下都可以工作。
重要的是要明白雷达是噪声传感器。这意味着即使摄像头没有看到障碍物,雷达也会探测到一些障碍物。
上图显示了自动驾驶汽车(绿色)使用激光雷达检测周围的物体,并计算物体的距离和形状。对比同样的场景,但是用下面的雷达传感器捕捉到的,可以看到很多不必要的噪点。
为了做出好的决策和预测,应该对雷达数据进行清理。我们需要把弱信号和强信号分开;这被称为阈值。我们还使用快速傅立叶变换 (FFT)来过滤和解释信号。
如果你看上面的下图,你会注意到雷达和激光雷达信号是基于点的数据。应该对这些数据进行分类,以便更好地解释。诸如欧几里德聚类或 K 均值聚类之类的聚类算法被用于实现这一任务。
本地化
自动驾驶汽车中的定位算法计算车辆导航时的位置和方向,这种科学称为视觉里程计(VO)。
VO 通过匹配连续视频帧中的关键点来工作。对于每一帧,关键点被用作映射算法的输入。映射算法,例如同步定位和映射(SLAM),计算附近每个对象相对于前一帧的位置和方向,并帮助对道路、行人和周围的其他对象进行分类。
深度学习一般用于提高 VO 的性能,对不同的对象进行分类。诸如 PoseNet 和 VLocNet++的神经网络是使用点数据来估计 3D 位置和方向的一些框架。这些估计的 3D 位置和方向可用于推导场景语义,如下图所示。
预言;预测;预告
理解人类司机是一项非常复杂的任务。它涉及情感而非逻辑,这些都是由反应推动的。附近的司机或行人的下一步行动变得非常不确定,因此可以预测其他道路使用者的行动的系统对于道路安全非常重要。
这款汽车拥有 360 度的环境视角,能够感知和捕捉所有信息并进行处理。一旦输入到深度学习算法中,它就可以提出其他道路使用者可能做出的所有可能的举动。这就像一个游戏,玩家有有限的移动次数,并试图找到最好的移动来击败对手。
自动驾驶汽车中的传感器使它们能够执行图像分类、物体检测、分割和定位等任务。通过各种形式的数据表示,汽车可以预测周围的物体。
深度学习算法可以在训练过程中对这些信息(来自激光雷达和雷达的图像和云数据点)进行建模。同样的模型,但在推理过程中,可以帮助汽车为所有可能的动作做准备,包括刹车、停止、减速、变道等等。
深度学习的作用是解释复杂的视觉任务,在环境中定位自己,增强感知,并在自动驾驶汽车中启动运动学机动。这确保了道路安全和方便通勤。
但是棘手的部分是从有限的动作中选择正确的动作。
决策
决策在自动驾驶汽车中至关重要。他们需要一个在不确定环境中动态精确的系统。它需要考虑到,并非所有的传感器读数都是真实的,人类在驾驶时可能会做出不可预测的选择。这些东西是无法直接衡量的。即使我们可以测量它们,我们也不能准确地预测它们。
A self-driving car moving towards an intersection | Source
上图显示了一辆自动驾驶汽车正在向一个十字路口行驶。另一辆蓝色的车也向十字路口开去。在这种情况下,自动驾驶汽车必须预测另一辆汽车是直行、左转还是右转。在每种情况下,汽车必须决定应该采取什么样的策略来避免碰撞。
为了做出决定,汽车应该有足够的信息,以便它可以选择必要的行动。我们了解到,传感器可以帮助汽车收集信息,深度学习算法可以用于定位和预测。
概括地说,定位使汽车能够知道它的初始位置,而预测则根据环境创造出 n 个可能的行动或移动。问题是:在众多预测的行动中,哪一个选择是最好的?
在做决策时,我们使用深度强化学习(DRL)。更具体地说,一种被称为马尔可夫决策过程 (MDP)的决策算法位于 DRL 的核心(我们将在后面讨论强化学习的部分了解更多关于 MDP 的知识)。
通常,MDP 用于预测道路使用者的未来行为。我们应该记住,如果对象的数量增加,尤其是移动的对象,场景会变得非常复杂。这最终增加了自动驾驶汽车本身可能的移动次数。
为了解决为自己找到最佳移动的问题,深度学习模型使用贝叶斯优化进行优化。也有这样的情况,由隐马尔可夫模型和贝叶斯优化组成的框架被用于决策。
一般来说,自动驾驶汽车中的决策是一个分层的过程。这个过程有四个组成部分:
- 路径或路线规划:从本质上讲,路线规划是汽车必须做出的四个决定中的第一个。进入环境,汽车应该计划从其当前位置到请求的目的地的最佳可能路线。想法是在所有其他解决方案中找到一个最佳解决方案。
- 行为仲裁:一旦规划好路线,汽车需要在路线中自行导航。汽车知道静态元素,如道路、十字路口、平均道路拥堵等,但它无法确切知道其他道路使用者在整个旅程中会做什么。其他道路使用者行为中的这种不确定性通过使用像 MDPs 这样的概率规划算法来解决。
- 运动规划:一旦行为层决定如何导航通过某条路线,运动规划系统就会协调汽车的运动。轿厢的运动对于乘客来说必须是可行和舒适的。运动规划包括车速、变道等等,所有这些都应该与汽车所处的环境相关。
- 车辆控制:车辆控制用于执行运动规划系统的参考路径。
用于自动驾驶汽车的 CNN
卷积神经网络(CNN)用于模拟空间信息,如图像。CNN 非常擅长从图像中提取特征,它们通常被视为通用的非线性函数逼近器。
随着网络深度的增加,CNN 可以捕捉到不同的模式。例如,网络起始处的图层将捕捉边,而深层图层将捕捉更复杂的要素,如对象的形状(树上的叶子或车辆上的轮胎)。这也是 CNN 在自动驾驶汽车中作为主要算法的原因。
CNN 的关键部分是卷积层本身。它有一个卷积内核,通常称为滤波器矩阵。滤波器矩阵与输入图像的局部区域进行卷积,该局部区域可以定义为:
其中:
- 运算符*表示卷积运算,
- w 是滤波器矩阵,b 是偏置,
- x 是输入,
- y 是输出。
实际中滤波器矩阵的尺寸通常是 3×3 或 5×5。在训练过程中,过滤器矩阵会不断更新自己,以获得合理的权重。CNN 的属性之一就是权重是可共享的。相同的权重参数可以用于表示网络中的两种不同的变换。共享参数节省了大量的处理空间;它们可以产生由网络学习的更多样的特征表示。
CNN 的输出通常被馈送到非线性激活函数。激活函数使网络能够解决线性不可分问题,这些函数可以在低维流形中表示高维流形。常用的激活函数有 Sigmoid、Tanh 和 ReLU,如下所示:
值得一提的是,ReLU 是首选的激活函数,因为它比其他激活函数收敛得更快。除此之外,卷积层的输出由 max-pooling 层修改,max-pooling 层保留关于输入图像的更多信息,如背景和纹理。
CNN 的三个重要属性使它们变得多才多艺,成为自动驾驶汽车的主要组成部分,这三个属性是:
- 局部感受野,
- 共享权重,
- 空间采样。
这些属性减少了过度拟合,并存储了对图像分类、分割、定位等至关重要的表示和特征。
接下来,我们将讨论开创无人驾驶汽车的三家公司使用的三个 CNN 网络:
- 特斯拉的 HydraNet
- 谷歌 Waymo 的司机网
- 英伟达自动驾驶汽车
HydraNet——自动驾驶汽车的语义分段
HydraNet 由 Ravi 等人于 2018 年推出。它是为语义分割开发的,用于提高推理时的计算效率。
HydraNets 是动态架构,所以它可以有不同的 CNN 网络,每个分配给不同的任务。这些块或网络被称为分支。HydraNet 的想法是获取各种输入,并将其输入到特定任务的 CNN 网络中。
以自动驾驶汽车为例。一个输入数据集可以是静态环境,如树木和道路栏杆,另一个可以是道路和车道,另一个是交通灯和道路,等等。这些输入在不同的分支中被训练。在推理时间内,门选择运行哪些分支,合并器汇总分支输出并做出最终决定。
在特斯拉的例子中,他们稍微修改了这个网络,因为在推理过程中很难分离各个任务的数据。为了克服这个问题,特斯拉的工程师开发了一种共享主干网。共享主干通常是经过修改的 ResNet-50 块。
这个 HydraNet 是在所有对象的数据上训练的。有特定于任务的标题,允许模型预测特定于任务的输出。标题基于语义分段架构,如 U-Net。
特斯拉 HydraNet 还可以投影鸟瞰图,这意味着它可以从任何角度创建环境的 3D 视图,为汽车提供更多维度来正确导航。要知道特斯拉并没有使用激光雷达传感器。它只有两个传感器,一个摄像头和一个雷达。虽然激光雷达明确地为汽车创造了深度感知,但特斯拉的 hydranet 非常高效,它可以将其中 8 个摄像头的所有视觉信息缝合起来,创造深度感知。
司机网:利用模仿学习训练自动驾驶汽车
司机网是谷歌 Waymo 使用的一个基于 RNN 的神经网络,然而,CNN 实际上是这里的核心组件之一,它用于从感知系统中提取特征。
司机网络中的 CNN 被描述为卷积特征网络,或特征网络,其提取由其他网络共享的上下文特征表示。然后,这些表示被输入到递归代理网络(AgentRNN ),该网络反复产生驾驶轨迹中连续点的预测。
这个网络背后的想法是使用模仿学习来训练自动驾驶汽车。在 Bansal 等人发布的论文《司机网:通过模仿最好的,综合最差的来学习驾驶》中,他们认为,即使有 3000 万个例子,训练一辆自动驾驶汽车也是不够的。为了解决这一限制,作者在合成数据中训练了汽车。这种合成数据引入了偏差,例如对轨迹路径引入扰动、添加障碍物、引入不自然的场景等。他们发现,这样的合成数据能够比正常数据更有效地训练汽车。
通常,自驾车有一个端到端的过程,正如我们前面看到的那样,感知系统是深度学习算法的一部分,与规划和控制一起。在司机网的情况下,感知系统不是端到端过程的一部分;相反,它是一个中级系统,其中网络可以有来自感知系统的不同变化的输入。
drick net 通过观察来自传感器的场景的中级表示来产生驾驶轨迹,使用输入和合成数据来模仿专家驾驶员。
上图中,青色路径描绘的是输入路线,绿色方框是自动驾驶汽车,蓝色圆点是智能体过去的路线或位置,绿色圆点是预测的未来路线或位置。
从本质上来说,中级表示不直接使用原始传感器数据作为输入,排除了感知任务,因此我们可以将真实和模拟数据结合起来,以便于迁移学习。这样,网络可以创建环境的高层次鸟瞰图,最终产生更好的决策。
英伟达自动驾驶汽车:自动驾驶汽车的极简主义方法
英伟达也使用卷积神经网络作为其自动驾驶汽车的主要算法。但与特斯拉不同的是,它使用 3 个摄像头,一边一个,前面一个。见下图。
该网络能够在没有车道标志的道路上运行,包括停车场。它还可以学习检测有用道路特征所必需的特征和表示。
与问题的显式分解(如车道标志检测、路径规划和控制)相比,这种端到端系统同时优化了所有处理步骤。
更好的性能是内部组件自我优化以最大化整体系统性能的结果,而不是优化人工选择的中间标准,如车道检测。可以理解的是,选择这样的标准是为了便于人工解释,这并不能自动保证最大的系统性能。较小的网络是可能的,因为系统学习用最少的处理步骤来解决问题。
用于自动驾驶汽车的强化学习
强化学习 (RL)是一种机器学习的类型,其中代理通过探索和与环境交互来学习。在这种情况下,自动驾驶汽车是一个代理。
我们之前讨论了神经网络如何根据感知数据预测一些动作。但是,选择适当的行动需要深度强化学习(DRL)。在 DRL 的核心,我们有三个重要变量:
- 状态描述给定时间内的当前情况。在这种情况下,它将是道路上的一个位置。
- 动作描述了汽车可能做出的所有动作。
- 奖励是每当汽车采取某个动作时收到的反馈。
通常,代理不会被告知要做什么或采取什么行动。到目前为止,我们已经看到,在监督学习中,算法将输入映射到输出。在 DRL,算法通过探索环境来学习,每次互动都会产生一定的回报。回报可以是正面的,也可以是负面的。DRL 的目标是最大化累积回报。
在自动驾驶汽车中,遵循相同的程序:网络根据感知数据进行训练,学习应该做出什么决定。因为 CNN 非常擅长从输入中提取表征的特征,所以 DRL 算法可以在这些表征上进行训练。在这些表示上训练 DRL 算法可以产生好的结果,因为这些提取的表示是高维流形到更简单的低维流形的转换。对较低表示的训练产生推理所需的效率。
需要记住的一个关键点是,自动驾驶汽车不能在现实世界的场景或道路中进行训练,因为它们将极其危险。相反,无人驾驶汽车在完全没有风险的模拟器上接受训练。
一些开源模拟器有:
A snapshot from Voyage Deepdrive | Source
A snapshot from Voyage Deepdrive | Source
这些汽车(代理)在部署到现实世界之前,经过了数千次高难度模拟训练。
在训练过程中,智能体(汽车)通过在特定状态下采取特定动作来学习。基于这个状态-动作对,它接收一个奖励。这个过程反复发生。每次代理更新它的奖励记忆时。这就是所谓的 T4 政策。
策略被描述为代理如何做出决策。这是一个决策规则。该策略定义了代理在给定时间的行为。
代理人每做出一个否定的决定,政策就会改变。所以为了避免负面的回报,代理人会检查某个动作的质量。这是由状态值函数测量的。状态值可以用贝尔曼期望方程来度量。
贝尔曼期望方程,连同马尔可夫决策过程(MDP),构成了 DRL 的两个核心概念。但是当谈到自动驾驶汽车时,我们必须记住来自感知数据的观察应该与适当的动作相映射,而不仅仅是将底层状态映射到动作。这就是需要部分观察的决策过程或部分可观察马尔可夫决策过程(POMDP) 的地方,它可以根据观察做出决策。
用于自动驾驶汽车的部分可观测马尔可夫决策过程
马尔可夫决策过程给了我们一种将决策顺序化的方法。当代理与环境交互时,它会随时间顺序进行。每次代理与环境交互时,它都会给出环境状态的某种表示。给定状态的表示,代理选择要采取的动作,如下图所示。
所采取的动作被转换到某个新的状态,并且代理被给予奖励。这个评估状态、采取行动、改变状态、奖励的过程不断重复。在整个过程中,代理人的目标是最大化奖励总额。
让我们对整个过程有一个更有建设性的想法:
- 在给定时间 t,环境的状态为 St
- 代理观察当前状态 St,并在
- 然后,环境转换到新的状态 St+1,同时代理被奖励 Rt
在部分可观察马尔可夫决策过程 (POMDP)中,代理通过从感知数据接收的观察来感知环境状态,并采取特定的行动,然后接收奖励。
POMDP 有六个分量,可以表示为 POMDP M:= (I,S,A,R,P, γ),其中,
- 一:意见
- 状态的有限集合
- 答:有限的一组动作
- r:奖励函数
- p:转移概率函数
- γ——未来奖励的折现系数。
DRL 的目标是找到期望的政策,在每个给定的时间步最大化回报,或者换句话说,找到一个最优的价值-行动函数(Q 函数)。
用于自动驾驶汽车的 Q-learning
Q-learning 是自动驾驶汽车最常用的 DRL 算法之一。它属于无模型学习的范畴。在无模型学习中,代理将试图逼近最优状态-动作对。策略仍然决定哪些动作值对或 Q 值被访问和更新(见下面的等式)。目标是通过与环境交互找到最佳策略,同时在代理出错时修改环境。
有了足够的样本或观测数据,Q-learning 会学习到最优的状态-动作值对。在实践中,Q-learning 已经被证明以概率 1 收敛到 MDP 的最佳状态-动作值,假设所有状态中的所有动作是无限可用的。
Q-learning 可以用下面的等式来描述:
其中:
α ∈ [0,1]是学习率。它控制给定 t 下 Q 值的更新程度。
重要的是要记住,代理将通过反复试验发现好的和坏的行为。
结论
自动驾驶汽车旨在通过提高安全性和效率来彻底改变汽车旅行。在本文中,我们概述了一些关键组件,如激光雷达、雷达、相机,以及最重要的是——使无人驾驶汽车成为可能的算法。
虽然很有希望,但仍有很大的改进空间。例如,目前的自动驾驶汽车处于第五级发展中的第二级,这意味着在必要时仍然需要有人随时干预。
需要注意的事情很少:
- 所使用的算法还没有优化到足以感知道路和车道,因为一些道路缺乏标记和其他标志。
- 用于定位、绘图和感知的最佳感测模态仍然缺乏准确性和效率。
- 车对车通信仍然是一个梦想,但这方面的工作也正在进行。
- 人机交互领域的探索还不够,有很多开放的、未解决的问题。
尽管如此,我们迄今为止开发的技术仍然令人惊叹。通过协调一致的努力,我们可以确保自动驾驶系统是安全、稳健和革命性的。
延伸阅读:
- 自动驾驶深度学习技术综述
- 自动驾驶调查:常见实践和新兴技术
- 考虑周围车辆相互作用和不确定预测的自动驾驶决策
- 使用 CNN 深度学习算法的自动驾驶汽车
- 自动驾驶的深度强化学习:综述
- 自动驾驶汽车的有线指南
- 自动驾驶汽车的深度学习
- 利用强化学习训练自动驾驶汽车
- 一(长)窥强化学习
通过自我监督学习利用未标记的图像数据,或者通过 Mateusz Opala 利用伪标记
这篇文章最初是 ML ops Live(T1)的一集,这是一个互动 Q(T2)环节,ML 从业者在这里回答其他 ML 从业者的问题。
每集都专注于一个特定的 ML 主题,在这一集里,我们与 Mateusz Opala 讨论了如何利用无标记图像数据进行自我监督学习或伪标记。
你可以在 YouTube 上观看:
视频
或者作为播客在以下位置收听:
但是,如果你喜欢书面版本,这里有!
您将了解到:
1 什么是伪标记和自监督学习
-
2 伪标签应用:图像和文本数据
-
3 应用 SSL 或伪标签时的挑战、错误和潜在问题
-
4 如何用伪标签解决过拟合
-
5 如何创建和增强数据集?
-
6 使用伪标记技术时用于数据处理和训练的 MLOps 架构
-
7 还有更!
-
我们开始吧。
Sabine: 今天和我们在一起的是 Mateusz Opala ,他将回答关于利用未标记图像数据 进行自我监督学习或伪标记的问题。欢迎你,马修。
Mateusz Opala: 大家好。很高兴来到这里。
萨宾:有你真好。Mateusz 在像 Netguru 和 Brainly 这样的公司担任过许多机器学习的领导职位。Mateusz,你有计算机科学的背景,但你是如何更多地进入机器学习领域的呢?
Mateusz: 这一切都开始于我大学二年级的时候。我的一位教授告诉我,吴恩达正在 Coursera 上做著名的机器学习课程的第一次迭代。我差不多就是从那里开始的,然后做了一个深度无监督学习的学士论文,去了西门子从事深度学习的工作,然后我所有的岗位都是严格意义上的机器学习。
萨宾:从那以后你就一直走这条路?
是的,完全正确。我之前做过一段时间的后端工程师。但在我职业生涯的大部分时间里,我是一名机器学习工程师/数据科学家。
什么是伪标签?
Sabine: Mateusz,给你暖暖身子。你如何在一分钟内给我们解释伪标签?
视频
Mateusz: 我们来试试。
想象一下,我们有大量的数据,只有少量的数据被标记,而大多数数据是未标记的,我们想训练我们最喜欢的神经网络,让我们称之为 ResNet 50。
- 在简化过程中,我们在一堆有标签的数据上训练了一个模型,然后利用这个模型,我们在一堆无标签的数据上预测标签。
- 我们使用预测的标签作为目标来计算未标记数据的损失函数。
- 我们将标记和未标记数据的损失结合起来,通过网络反向传播并更新权重。这样,我们就可以利用训练体系中未标记的数据。
- 是一分钟还是更长?
萨宾:干得好。我认为这绝对适合一分钟内,
Mateusz: 我可以给你一个关于计算机科学发展过程的类比,你会怎么想。
假设我们有一个软件开发团队,有几个高级工程师和一堆中级工程师。显然,高级工程师比初级或中级工程师能产生更好的代码质量,但是你可以雇佣有限数量的高级工程师,而且你也想培养中级和初级工程师。所以你需要建立一个两者兼而有之的团队,并使之高效。
如果您投资于代码审查和最佳实践、测试、自动化 CI 和 CD,那么初级工程师也能够将代码交付到产品中。
你可以认为高级工程师是这里的标签数据,
- 而初级工程师参考一次无标签伪标签。
- 投资代码评审就像扫描损失函数。在训练初期,你需要投入更多,所以实际上,你更在意的是被标注的数据。一旦网络开始做出好的预测,你也从未标记的数据中受益,所以当你的开发实践非常扎实时,从初级和中级工程师中受益。
萨宾:好吧。谢谢你的比喻。
什么是自我监督学习?
Sabine: 我们确实有一个社区问题:什么是自我监督?Mateusz,你介意做个总结吗?
Mateusz: 当然可以。自我监督,我会说这是无监督技术的子集,当你没有标签的时候。self 意味着您使用输入图像来生成标签。在这个简单对比学习的用例中,为了生成标签,你获取图像,对同一图像进行两次放大,你知道这是同一图像,这就是你的标签。如果你放大两张不同的图像,并把它们相互比较,那么你的标签就是它们不是相同的图像。
基本上,您从数据中生成标签。你在监督学习中训练,但是你没有像在监督学习中那样的注释标签,但是标签以某种方式从你的输入中产生。
伪标签应用:图像和文本数据
斯蒂芬:牛逼。正如你提到的,你目前在 Brainly 担任高级机器学习工程师。你能给我们介绍一些在 Brainly 中对图像数据应用伪标签的不同用例吗?
我知道 Snap 解决是大概用的产品之一。你知道,你可能有更多的想法。
视频
是的,当然。快速解决是我的团队工作最多的功能。也许我会简短地解释它是关于什么的。
基本上,当你打开手机时,你可以快速想象你想要回答的问题。然后作为一个用户,你可以调整作物来选择问题,然后根据图像上的内容将其发送到文本搜索或我们的数学求解器,你会得到你需要的答案。
我们的团队从事的项目有
How Snap to Solve works | Source
理解图像上的内容,理解问题的层次,
- 检测图像的质量问题,
- 试图告诉用户,他们可以以某种方式改善他们拍摄的图像,以获得更好的答案,
- 以及路由到该问题所需的特定服务。比如有数学的话,它可以,而不只是在数据库里搜索,它可以直接求解,比如。
- 去年,我们有一个项目叫做 VICE,是关于视觉内容提取的。
在那个项目中,我们想了解问题的布局。它只是一个对象检测模型,试图预测如下类别:
表,
- 问题,
- 图像,
- 图,
- 文字,
- 诸如此类,
- 问题布局上所有可见的东西。
问题是你的标签预算总是有限的。即使你有强大的预算,强大的公司,这家公司也不是一家初创公司——总有一个极限。不仅仅是钱的问题,还有时间的问题——你能等多久才能拿到标签。
在 Brainly 中,我们有许多来自用户的图像,我们真的喜欢利用所有这些未标记的数据。此外,当您希望开始标注用于训练目的时,您可能希望有一个或多或少平衡的分布。你想有一个类似数量的文本框和表格框,等等。很明显,你的数据通常很不平衡。
我们重用自我监督学习的第一种方法是实际进行一些非监督或半监督分类来生成用于标记的数据,以从我们所有的图像中向下采样数据。因此,我们可以仅为了训练的目的而标记,只是一个小的子集,它仍然是统一的。
在那个项目中,我们致力于一篇名为简单对比学习的论文。在这篇论文的顶部,有两个用于无监督分类的框架,称为:
简单的对比学习基本上就是对比两个图像,一个对另一个。你通过拍摄原始图像来完成,你对图像进行数据扩充和扰动。你对同一个图像做两次扰动。作为一种输入,你有不同的图像,但是你知道,它们是相同的,你学习这些图像的相似性,结果,你得到了那个图像的良好嵌入。
基于这种嵌入,有非常少量的标记数据,我们实际上可以很好地采样训练弱分类器,以最终获得标记的良好候选。这是我们 tem 的第一个自我监督学习方法。
在我们的情况下,伪标签是一个有趣的案例,因为在原始论文中,生成伪标签的是同一个网络。我们走的有点不同,因为在我们的例子中,我们有时有多模态输入,所以我们有文本和图像。但不是在所有阶段我们都有文本,所以有时候,我们只需要处理图像。
然而,当创建数据集和训练时,我们可能会重用历史上可用的文本。我们使用一种基于自然语言处理的方法来为模型生成一个伪标签,然后在产品中只对图像进行推理。
Stephen: 我想知道为什么我现在要回到 Brainly 的使用情形,因为 Snap 要解决。我想知道:
在自我监督学习技术之前,你是否尝试了所有的技术,
- 或者你只是知道这种特殊的技术是我们认为有效的,然后你就直接应用了它?
- 它和所有的技术相比怎么样?
- Mateusz: 总的来说,我们使用的大多数技术仍然是监督学习,我们对数据进行标记,但这是有限的,而且很耗时。
对我们来说,应用自我监督学习的最佳用例是当我们想要从所有用于标注的数据中进行下采样时。我们实际上想要确保我们在那个标签中有不同种类的数据,并且我们也为我们覆盖所有有趣的情况。
我们可能没有 50-50 分布的笔迹和教科书的图像。在一些市场中,这可能是更多的笔迹,而在一些市场中,这可能只是一点点笔迹,但最终,如果我们有也包含笔迹的数据,则训练是最好的。
它包含不同种类的数据,因此我们可以:
It contains different kinds of data, so we can:
1 处理好了
- 2 它更好地概括了。
- 我们提出了用于聚类或无监督图像分类目的的自我监督学习。
我提到过一些例子,其中我们有文本和图像。具体来说,你可以想象用例,这不是一个真正的用例,但你可以想象,我们有一个图像,一个带有一些文本的图像,不像 Brainly 中的问题,但一般来说,你有一些商店的横幅,一般来说,有图像,有文本。
让我们假设您有某种方法可以从图像中生成文本。你有你的数据,你有图像和文本。课文说有一家 24 小时营业的商店,实际上有那家商店的图像。我们想要做的是基于文本为图像生成伪标签,以了解它是商店还是体育场。
我们可以利用一些 NLP 模型,我们可以重用 BERT 或类似的东西来做微调。我们可以做零镜头学习之类的事情来生成标签,我们可以将它们视为平滑标签,然后只在图像上训练模型。
目前,我们最感兴趣的是如何重用在推理过程中不可用的模态,而是重用它们来生成标签,因此我们不需要标记所有的东西。
斯蒂芬:牛逼。谢了。顺便说一句,如果你想了解罪恶是如何运作的,我们用 Brainly 做了一个案例研究。如果你想知道罪恶是如何运作的,我想那会让你明白更多。
Mateusz,在 Brainly 之前,你有从事伪标签工作的经验吗,对你来说怎么样?当时你在用什么应用?
视频
实际上,就在论文发表的时候(我想论文是 2014 年的)。2014 年,我在克拉科夫的一家小创业公司工作,我们为小创业公司做小项目。
有一家创业公司在做智能狗项圈。智能狗项圈装有传感器,如加速度计、陀螺仪、温度计等。我们的机器学习系统的目标是预测狗的行为——狗是在吃东西、喝水还是在跑。后来,我们可以自动发送一些提示给狗主人,警报会说有一个高温和狗很长时间没有喝水。
想象一下,从传感器获取数据很容易,因为你只需给狗戴上狗项圈,但标记这些数据却非常困难。这是一个有趣的故事,我们实际上是如何标记的,因为有这些人,为了他们的工作,他们带很多狗出去。我们只是把它和这些人联系起来,我们和这些人一起散步了很多次,带着狗,我们只是注意到从 2:10 到 2:15,狗在喝酒等等。
这不是收集大量注释的真正可行的方法,但是收集大量未标记的注释很容易。因为我们深受过拟合之苦,据我所知,我们当时探索了伪标签的角度,这对解决该模型的过拟合问题很有帮助。
Sabine: Maciej 想要得到提到的论文的标题或链接。
Mateusz:伪标原纸为董李。我觉得是 2013 年的。
Sabine: 我们实际上在聊天中有一个问题。您是如何选择图像增强来训练 SSL 模型的?您是使用了论文中的方法,还是通过实验找到了最适合您的数据的增强方法?"
视频
我从研究论文中的数据扩充开始,所以这就是方案,但是我也尝试了不同种类的扩充。我记得我们的设置略有不同,因为我们的领域实际上与 ImageNet 不同。所以这是合理的,这是不同的东西。
例如,我们不做翻转,因为你不应该翻转文本,至少在英语中不应该,但我在 GPU 上使用 Nvidia DALI 进行数据增强。几乎可以说,我探索了该库中所有典型的增强。我知道,例如,在albuminations中有更多的输出,但它的速度较慢,所以通常我坚持使用 Nvidia DALI。
应用自我监督学习或伪标记时的挑战
Stephen: 说到挑战,你在 Brainly 的应用中应用自监督学习或伪标注时遇到过哪些挑战?
视频
Mateusz: 用简单的对比学习,这个算法需要大量的数据,甚至 100 万张图像。我认为训练这个算法并不容易。显然,在 Brainly,我们有更多的数据,我们可以在更多的数据上进行训练,但是,训练需要很多时间,而且这个项目有它的限制。
最后,我们得出结论,简单对比学习中的预训练嵌入并不比 ImageNet 中的预训练嵌入好多少。它更多的是关于选择标签候选人的任务。
最重要的部分实际上是:
The most important part was actually:
在预训练嵌入上尝试一些简单的东西,比如分离向量机
- 2 并通过优化超参数搜索重新调整它们,
- 这在最困难的情况下效果很好。
总的来说,我认为,要进行简单的对比学习,需要:
In general, for tunning the simple contrastive learning, I think, it requires:
1 非常强大的计算能力,
-
2 分发算法的好方法,
-
我记得报纸上写的批量也非常大。
-
他们最初在一堆 TPU 上训练它,我想这篇论文也是来自谷歌。根据内存大小和批处理大小,以您受限的大小复制 TPU 上的所有内容并不容易,例如,在 GPU 上。这些是我看到的挑战。
就伪标签而言,有点不一样。通常,您有一个非常小的标注数据集。如果太小,无法学习基本的群集结构,可以分离出有噪声但很好的初始示例。当你增加越来越多的无标签损耗系数时,你只是在给你的数据添加噪声。
第一个问题可能是一个小的标注数据集。
- 下一个是,当你做伪标记时,你有一个损失函数,它是标记数据损失和未标记数据损失的加权组合。通常,你从无标签数据的零损失开始,你喜欢在有标签的数据上预热你的网络。例如,在它实际学习聚类结构之前,你可以太快地从未标记开始增加损失函数。
- 还有,在神经网络中,通常会出现过度自信的现象。例如,预测非常接近 1,或者非常接近 0,特别是当你做伪标记时,预测显然有时是不正确的,这也加强了这种现象,给数据增加了更多的噪声,于是有一种叫做确认偏差的东西,你需要一些技术来解决这个问题。
通常,这是通过应用混合策略来完成的,因此这是一种强大的数据增强,结合了用于正则化目的的标签平滑,这可以减轻确认偏差。
斯蒂芬:牛逼。这个特殊的应用程序是一个小团队就能应用的,还是需要大量的资源?你能告诉我们,对于一个小团队来说,开始应用这个会有多乏味吗,特别是当他们有更小的数据集时,因为当他们没有 Google 大小的数据集时,这更有意义。
我会说,像简单对比学习这样的技术,一般来说,是自我监督的技术,通常需要:
Mateusz: I would say that techniques like simple contrastive learning, which, in general, are self-supervised techniques, usually require:
1 大量的计算,
- 2 很多 GPU
- 如果没有适当的基础设施,这对小团队或从事某项工作的个人来说肯定是困难的。
我不认为这个技术对小团队来说是最好的,大概是预先训练好的模型还是比较好用的。
此外,自我监督训练的模型有时也会发表,实际上在麻省理工学院的许可证上有一个很棒的库来自脸书,关于自我监督学习。它非常容易重用,并且是基于 PyTorch 构建的。
但伪标注是一种非常容易实现的东西,它对于对抗或过度拟合和正则化您的网络非常有用,当您有一个较小的数据集时,它可以发挥作用。
应用伪标签时的常见错误
Stephen: 你见过团队在尝试为他们的系统应用伪标签或者甚至尝试应用自我监督学习技术时犯的常见错误吗?
Mateusz: 伪标记的典型问题是当你的少量数据不足以满足聚类假设时。假设数据在低密度区域的决策边界中被很好地分离。
它的基本思想是,彼此靠近并且在同一个簇中的图像共享相同的标签。如果你没有足够的数据来快速学习潜在的聚类结构,这可能不是最优的,但对伪标记来说足够好,那么你最终只会给数据添加噪声。
此外,你可能做得很好,但你最初的小数据集可能不一致,标记的不一致会极大地影响伪标记训练的质量。
如何用伪标签解决过拟合问题
Stephen: 你之前提到过伪标签是一种用来克服过度拟合的特殊技术。在您的用例中,您是如何实现的?你能给我们详细描述一下你与过度拟合作斗争,然后伪标签来拯救你的场景吗?
Mateusz: 在过度拟合的时代,我的用例或多或少带有过去的经验,即带有狗项圈的用例,也更多带有 NLP 用例。
在 Brainly,我们目前有一个用例,我们正在探索应用伪标签的可能性。基本上,我们正在解决过度拟合的原因是我们正在解决的任务定义起来非常主观,并且我们在标签一致性方面很挣扎。此外,我们没有一个好的星期分类器,所以我们需要处理一些类别不平衡,我们没有太多的图像在我们想要检测的类别上。
实际上,对于半监督学习技术和伪标记来说,这是一个很好的例子,我们需要利用所有未标记的数据。
如何创建和增强数据集?
斯蒂芬:酷。放大这张照片。在某个时候,你碰到了这个路障,对吗?你是做什么的?你如何考虑增强你正在使用的这项技术,或者你只是探索其他技术?
因为您谈到了较小的数据集是使用伪标签的主要挑战。如何提高数据集的质量?你考虑过合成数据集吗?你能给我们介绍一下吗?
Mateusz: 我们试图在创建数据集的方式上有所创新。我们真的不需要重新创建像图像这样的数据,因为我们有太多的图像。如果我们有一张图片的标签,我们最好搜索相似的图片。我们有一些预先训练的相似性嵌入,如简单的对比学习。如果我们找到相似的图像,我们可以标记它们,就像有相同的标签一样。这是一方面。
我喜欢的另一件事是,通常,人们认为数据增强是图像或文本的增强,基本上不是目标,而是输入,对吗?
几年前,我在做姿势检测,给人类的姿势加标签也很耗时,因为你需要给 12 个身体关节加标签。我们也在过度适应中挣扎。
我们的想法是,如果你给姿势的身体关节加标签,然后把身体关节的标签移动几个像素,这基本上是相同的标签,因为你只是用一个点给整个头部加标签。我们做了目标增强。类似地,你可以想到我们有时试图在 Brainly 上做的数据扩充,我们试图改变输入图像,所以它们实际上反映了我们缺乏的不同目标。
这也是如何创造性地创建和增加数据集中图像数量的方法。在一天结束的时候,最好只是给你的图片贴上标签。有时候,这就是我个人在做的事情。我只是给更多的图片贴上标签:
That’s also the way how to creatively create and increase the number of images in datasets. At the end of the day, it’s best just to label your images. Sometimes, that’s what I’m just doing personally. I am just labeling more images to:
1 提高我的模型性能
- 或者改进我的方法,
- 但是在数据集的创建过程中保持创造性是很重要的。
我认为,在生产环境中创建数据集,就像在商业环境中一样,非常重要,甚至比培训更重要。
我认为 Brainly 的机器学习方法是一种非常以数据为中心的方法,我们试图以这样的方式构建我们的软件,如果我们需要改变数据集,我们可以重新运行一切,并在生产中快速更新新数据集上的模型。我真的相信有创造力和强调数据集的创建是非常重要的。
Stephen: 说到数据集,我们之前也谈到过小型团队,他们有权访问带标签的数据集。当然,我们有很多未标记的数据集,而且很可能不贵。
他们如何找到这种平衡,尤其是如果这对于他们的用例非常关键的话?
他们如何找到这种平衡,他们有这些小的标记数据集,但还有大量的未标记数据集,他们必须使用这种特殊的技术。
你会如何建议他们去寻找平衡,并适当地应用伪标签,甚至自我监督学习?
显然,我建议你需要考虑:
你有什么基础设施?
- 实际上你能训练多少数据?
- 您的问题的数据解决方案是什么?
- 你有多少时间?
- 当你唯一的限制是 GPU 的大小和培训的时间时,无论你是为云还是在你家的某个地方付费?
- 当你考虑所有这些的时候,我会从实际训练的最小的标记数据集开始。
这不是抛硬币那样的工作,而是实际上的训练。我会尽可能早地将它可视化,看看数据集中是否确实有一些由你的聚类创建的聚类,以及它们是否有意义。
如果他们做开始有意义,然后有一部分你可以添加未标记的数据。在最初的设置中,您可以同时对已标记和未标记的数据进行训练,但显然,您可以从少量的标签数据开始,看看它是否有一点点表现,看看可视化是否有意义,然后当您发现足够多的数据时,您可以进行两阶段训练。
- 如果你的数据不够并且没有看到任何聚类,也不是训练,那么你只需要在开始的时候多贴标签。一旦你在那里,然后你可以开始添加标签数据。你可以从头开始你的训练程序,并尝试同时进行。但是,即使你同时训练,你只是从训练未标记的部分和未标记损失的系数开始,这种方式在开始时为零,然后线性增加,直到它达到最终值,你仍然要训练一段时间。
- 应用伪标签时的潜在问题
Stephen: 除了数据集问题,您是否发现了一些问题会影响图像测试中伪标签的有效性?
Mateusz: 超越数据集问题。我会说,通常与训练问题相关的是神经网络预测的过度自信。这是很难解决的问题。这就是确认偏差的问题。你可以做混合策略等等。但是说到底,这很难。
实际上,为了理解我们的预测是否有意义,我们还使用了像 SHAP 值或更老的莱姆值这样的解释器,但它们不一定总是能很好地处理图像。有时会,有时不会。
神经网络的过度自信,即使你有很好的指标,如测试集,验证集,无论是精度,召回,F1,等等,如果你看到你的预测非常过度自信,这仍然不是很好,这可能是错误的。这无疑也会影响重用伪标签的能力。
斯蒂芬:逮到你了。我认为有这种特殊,我不知道它有多普遍,但它就像集群假设是伪标签工作的必要条件。你对这个特定的短语本身有什么看法?
Mateusz:聚类假设基本上是说,数据在分类时,应该形成单独的聚类和决策边界。当你思考类似的问题时,比如在 SVM 的情况下,决策边界需要在低区域密度。
他们在原始论文中所做的,实际上,是一个非常有趣的伪标签实验。他们在众所周知的 MNIST 数据集上训练,但是一些实验后来在 CFAR 等上重现。不仅仅是 MNIST 的设定,在 MNIST,他们训练了模型,他们使用 t-SNE 在 2D 平面上进行降维来可视化预测。
实际上,预测的分离,当它以纯监督的方式被训练时,它没有当你使用伪标签时那么好。
当您使用伪标签时,集群显然是从其自身推出的,因此集群之间有明确的边界。这表明,熵正则化,只是一个伪标记损失函数,只是正则化熵正则化,这意味着我们试图减少类的重叠。最后,当你把它形象化时,它确实减少了,阶级的集群确实被分开了。
斯蒂芬:完美。就偏见而言。使用伪标签时,你是否发现使用伪标签存在伦理问题?如果有,也许你能让我们知道?
我认为问题是从你正在使用的数据集中继承而来的。我觉得更多的不是受模型或者模型的技术影响。
如果偏差在数据集中,它们将被模型重现。如果您想要消除模型的偏差,您需要消除数据集的偏差。
斯蒂芬:完美。我相信相当多的伪标注和自监督学习还在积极研究中,对吧。
有没有特定的情况或场景,你实际应用这些技术,然后它们提高你的模型的稳健性或你的模型性能,无论是在 Brainly,甚至是你以前的公司?因为我们有团队分享这一点,并说,“嘿,我们可以尝试一下,但我们需要实际的数字来了解它如何帮助现实世界的生产?”
Mateusz: 在这种典型的伪标签场景中,当您使用来自训练模型的标签时,在狗项圈的情况下,我们的模型过度适应了它实际上不可部署的方式。即使它有足够好的性能,例如,分类,但训练集和验证之间的差距是巨大的,所以我不会相信这个模型。伪标签在某种程度上有助于限制间隙,间隙足够小,我看到它不再过度拟合。
也许它不是完美的度量,但它不是过度拟合,所以它开始可部署。这绝对有帮助,这是在最初的设置。伪标记,当我们使用原始论文中的实现(这在任何框架中都很容易实现,无论你使用 PyTorch 还是 TensorFlow )时,已经有了很多改进,使用确认偏差和混合策略来实现。
此外,在原始论文中,例如,对于伪标签,他们对模型的输出进行 arg max 。他们使用硬预测,特别是在 mix-up 论文中,他们表明硬预测也是神经网络过度自信的原因,因此,有一个小的混合,或者只是标签平滑,这有助于作为正则化来改善,以解决过度拟合。
使用伪标记技术时用于数据处理和训练的 MLOps 体系结构
Stephen: 我想简单地回到计算方面。
就你的计算机架构而言,在使用这些技术时,Brainly 是否应用了特定的架构?
你使用分布式计算吗,特别是在数据扩充方面,我相信这将是分布式的?
您如何为数据处理(这是一项巨大的任务)以及模型本身的培训建立架构?
大多数的东西,我们用的是 SageMaker 。对于实验跟踪,我们使用海王星。这更多是在开发方面,但我们在那里跟踪一切,如处理作业。我们试图跟踪一切,以便在创建数据集或类似的过程中不遗漏任何东西。在计算方面,我们只是使用了 SageMaker 估算器和 SageMaker 流水线,它们都支持多 GPU 实例和极端多节点实例。
我们还尝试在实例集群上进行训练,其中每个实例都有一个多 GPUinstance。我们主要使用 PyTorch,它支持一个叫做 Torch Distributed 的工具,我们用它来运行 PyTorch 上的分发。也有本地 SageMaker 的方式来编排。我们目前也在探索它是否能改善某些东西。
我认为,在优化方面还有一些工作要做。典型的设置是 Horovod 算法。在过去,我有一些比 Horovod 更好的分布式算法的经验,例如,弹性平均 SGD,在某些用例中,它实际上有时为训练收敛提供了超线性加速。这也是一个值得探讨的问题,但也需要一些自定义实现。
Stephen: 你能给我们介绍一下这个特定的数据基础设施吗?你把你所有的数据集存储在哪里,当然,如果是可公开的,你会如何积极地去做?你提到了 Nvidia DALI,这对于论证非常重要,我可以分享一下周围的另一个堆栈吗?
Continuous delivery pipeline | Source
Mateusz: 当然可以。我想我可以用简化的方式来做。通常,我们在 AWS 上使用 S3 来存储数据集。
实际上,我们已经为数据集版本化构建了我们的内部解决方案,因为到目前为止,我们还没有在这个领域找到任何足够适合我们的解决方案。每当我们在 SageMaker 上运行作业时,我们都使用该解决方案来获取数据集。我们建造了一些自己的筒仓来提取运行。
实际上,我们有相同的命令和相同的代码在本地环境中运行,在 EC2 上,但是在本地模式下,当你通过 SSH 连接时,这是在云中工作的数据科学家的完美设置。您只需打开一个终端,通过 SSH 连接,您面前就有 GPU 可供使用。通过 SageMaker 还可以以更具重现性的方式运行,因此您可以通过 SageMaker Estimator 来完成,或者在有多个步骤时作为 SageMaker 管道来完成。
通常,我们会在 SageMaker Pipeline 上运行更多的生产培训,以便我们可以对图像进行一些预处理,或者我们可以将培训推送到模型注册中心,我们也在 SageMaker 上使用过。
当我们把一些东西推送到模型注册中心时,我们有一些自动化的工作来评估我们在维持集上的性能。如果一切正常,如果作为一名数据科学家,您查看 Neptune 上的运行指标,这些指标是否正常,然后您进入代码管道,您批准模型,它将自动推向生产。
自我监督学习:研究与生产
斯蒂芬:我知道这个特殊的领域正在被积极地研究。在自我监督学习和伪标签方面,有没有什么正在积极研究的东西,你不能积极投入生产,或者你想这样做?
是的,他们是。T3
在那种商业环境下,你受到限制,你需要在有风险和无风险的事情之间取得平衡。在自我监督学习中,问题是训练需要很多时间和成本,所以你不能只是在参数上进行网格搜索,然后训练那个模型的 100 个变体,因为它会像 GPT 训练一样花费 200 万美元或类似的东西。
这是你需要认真努力的事情。但一般来说,使用这种自我监督的学习方法是我们肯定想用大脑探索的东西,因为我们有大量的数据。我们知道,我们的图像领域实际上与 ImageNet 甚至其他领域有很大不同。
例如,根据我们在 VICE 项目中的经验,当我们为问题布局进行对象检测时,我们试图重用医学出版物上的标签数据,这些数据实际上已经为边界框或一些数学论文进行了标记。
问题是这些数据实际上非常不同。根据数据训练的解决方案效果不好,甚至为了检测数据中的某些东西而重用数据也是随机的。这只是表明,深度学习在一天结束时只是训练一些在您的特定用例中工作得非常好的哈希映射。
最大的 MLOps 挑战
萨宾:我想把事情总结一下,马特乌斯。从您的角度来看,您认为目前您在 MLOps 方面面临的最大挑战是什么?
数学:T1
我现在最大的挑战是连接整个机器学习模型生命周期中的所有步骤。
我现在面临的许多挑战都与数据集的创建有关。
从数据版本控制部分开始,我们使用不同的技术创建了大量的数据集,这只是需要完成的一项工作。
- 对于创建,您还需要自动化,如我们用于培训的 SageMaker 管道,您可以使用 SageMaker 管道来自动化数据集创建。
- 与此同时,标签。我如何知道我有足够的数据被标记,我不需要标记更多,我不需要自己标记更多,或者我不需要支付自由职业者或标记更多,这就足够了?也可以考虑自动化主动学习技术,它在自动化数据集创建方面可能是有用的。
- 我目前在机器学习模型生命周期中面临的挑战主要围绕数据创建。我们在培训、生产和持续交付方面组织得非常好。
此外,我是一名机器学习工程师,但我更多地从事数据科学方面的工作。围绕数据集的挑战目前每天都是最具挑战性的。
还包括在没有标签的情况下,实际检测您的模型何时开始表现不佳的生产挑战:
分析预测变化,
- 输入发生了变化。
- 这些也是我目前正在探索的事情。
Sabine: 我相信你不会很快就面临挑战。
是的,我不是。
萨宾:马特乌斯,这是最后一个加分题。你到底想和谁共进午餐?
我认为这个世界上有很多有趣的人。也许我会提到来自 Databricks 的 to Matei Zaharia,他们正在做 MLflow 和 Spark 。这些都是非常有趣的解决方案。
萨宾:优秀。人们如何才能关注你在做什么并与你联系?也许在网上,你可以分享?
Mateusz: 我觉得在 LinkedIn 和 Twitter 上和我联系很好。我想两者都是,这只是 Mateusz Opala,我的手柄。这是在社交上接近我的最好方式。
马特乌斯·奥帕拉
Brainly 高级机器学习工程师| 2012 年起专业软件工程师,2013 年起做机器学习,2014 年起领导团队,频繁公开演讲包括 PyData Warsaw,DataSphere.it,MachineLearning@Enterprise。
阅读下一篇
Brainly 案例研究:如何管理 SageMaker 管道中的实验和模型
7 分钟阅读| 2022 年 8 月 18 日更新
7 mins read | Updated August 18th, 2022
Brainly 是全球领先的学习平台,拥有针对所有学校科目和年级的最广泛的知识库。每个月都有超过 3 . 5 亿的学生、家长和教育工作者依赖 Brainly 这个成熟的平台来加速理解和学习。
他们的核心产品和关键切入点之一就是 Snap 解决。
Snap to Solve 如何工作
Snap to Solve 是一款基于机器学习的产品,用户可以拍摄并上传照片;然后,Snap to Solve 会检测照片中的问题并提供解决方案。
Snap to Solve 通过将用户与其他智能产品功能相匹配来提供此类解决方案,如社区问答(问题和答案的知识库)或数学求解器(提供数学问题的分步解决方案)。
关于团队
Brainly 有一个人工智能服务部门,它投资于在不同领域(如内容、用户、课程和视觉搜索)生产人工智能服务。
这个案例研究显示了视觉搜索团队如何将 Neptune.ai 与亚马逊 SageMaker Pipelines 集成,以跟踪 Brainly 的 Snap to Solve 产品的视觉内容提取(VICE)系统开发阶段的一切。
团队详情
1 名首席数据科学家
- 2 名数据科学家
- 2 名机器学习工程师
- 1 名 MLOps(机器学习操作)工程师
- 1 名数据分析师
- 1 名数据标签主管
- 1 名交付经理
- 工作流程
该团队使用 Amazon SageMaker 来运行他们的计算工作负载,并为他们的模型提供服务。此外,他们已经采用 Tensorflow 和 PyTorch 来训练大量的计算机视觉模型,根据用例使用任一框架。最后,为了优化 GPU 的数据转换速度,他们将一些数据增强工作转移到了 NVIDIA DALI。
该团队在两周的冲刺中工作,并使用时间限制来保持他们的研究工作重点和管理实验。他们还保持工作流程的灵活性,因为他们经常适应实验结果。
The team works in two-week sprints and uses time-boxing to keep their research efforts focused and manage experimentation. They also keep their work processes flexible because they frequently adapt to the experiment results.
自我监督学习及其应用
原文:https://web.archive.org/web/https://neptune.ai/blog/self-supervised-learning
在过去的十年里,人工智能的研究和发展突飞猛进,特别是在 2012 年 ImageNet 比赛结果公布之后。焦点主要集中在监督学习方法上,这些方法需要大量的标记数据来为特定用例训练系统。
在本文中,我们将探索自我监督学习(SSL)——机器学习社区中的一个热门研究话题。
什么是自我监督学习(SSL)算法?
自我监督学习(SSL) 是一种不断发展的机器学习技术,旨在解决标签数据过度依赖带来的挑战。多年来,使用机器学习方法构建智能系统在很大程度上依赖于高质量的标记数据。因此,高质量注释数据的成本是整个训练过程中的一个主要瓶颈。
人工智能研究人员的首要任务之一是开发具有非结构化数据的自我学习机制,这些机制可以以低成本规模化通用人工智能系统的研发。实际上,要收集和标注各种各样的数据是不可能的。
为了解决这个问题,研究人员正在研究能够捕捉数据中细微差别的自我监督学习(SSL)技术。
在我们进入自我监督学习之前,让我们先了解一些在构建智能系统中使用的流行学习方法的背景。
1.监督学习
一种流行的学习技术,用于根据特定任务的标记数据训练神经网络。你可以把监督学习想象成一个教室,一个老师用许多例子教学生。例如用于对象分类。
2.无监督学习
无监督学习是一种深度学习技术,用于发现数据中的隐含模式,而无需对标记数据进行显式训练。与监督学习不同,它不需要注释和反馈回路来进行训练。例如用于聚类。
Unsupervised learning | Source
3.半监督学习
半监督学习是一种机器学习方法,其中我们有输入数据,输入数据的一部分被标记为输出。它是监督学习和非监督学习的混合。
Semi-supervised learning | Source
在我们只有少量标记数据点来训练模型的情况下,半监督学习可能是有用的。训练过程可以使用一小块已标记的数据,并对数据集的其余部分进行伪标记。
例如,一个学生被老师教了几个问题,他必须自己想出其余问题的答案。
4.强化学习
强化学习是一种利用奖励反馈策略训练 AI 智能体在特定情境下学习环境行为的方法。
举个例子:把它想象成一个在游戏中努力赢得舞台的孩子。
Reinforcement learning process | Source
什么是自我监督学习?
自我监督学习是一个机器学习过程,其中模型训练自己从输入的另一部分学习输入的一部分。它也被称为预测学习或借口学习。
在这个过程中,通过自动生成标签将无监督问题转化为有监督问题。为了利用大量的未标记数据,设置正确的学习目标以从数据本身获得监督是至关重要的。
自我监督学习方法的过程是从输入的任何未隐藏部分中识别输入的任何隐藏部分。
Self-supervised learning | Source
例如,在自然语言处理中,如果我们有几个单词,使用自我监督学习我们可以完成句子的其余部分。同样,在视频中,我们可以根据可用的视频数据预测过去或未来的帧。自我监督学习使用数据的结构来利用大型数据集的各种监督信号——所有这些都不依赖于标签。
自我监督学习和无监督学习有什么区别?
许多人混淆了这两个术语,并互换使用。然而,这两种学习技巧有不同的目标。
自监督学习和无监督学习方法可以被认为是互补的学习技术,因为两者都不需要标记数据集。无监督学习可以被认为是自监督学习的超集,因为它没有任何反馈循环。相反,自我监督学习有许多监督信号,在训练过程中起反馈作用。
一种更简单的说法是,“无监督”学习技术非常关注模型而不是数据,而“自我监督学习”技术的工作方式正好相反。然而,无监督学习方法擅长聚类和降维,而自监督学习是用于回归和分类任务的借口方法。
为什么我们需要自我监督学习?
自我监督学习的出现是因为在其他学习过程中持续存在以下问题:
- 高成本:大部分学习方法都需要标注数据。就时间和金钱而言,高质量标记数据的成本非常高。
- 漫长的生命周期:数据准备生命周期是开发 ML 模型的漫长过程。它需要根据培训框架进行清理、过滤、注释、审查和重组。
- Generic AI: 自我监督学习框架离将人类认知嵌入机器又近了一步。
现在让我们来谈谈自我监督学习在不同领域的效用。
自监督学习在计算机视觉中的应用
多年来,计算机视觉中学习方法的焦点一直是朝着完善模型架构和假设我们拥有高质量数据的方向发展。然而,在现实中,如果没有高成本的时间和精力,很难获得高质量的图像数据,从而导致次优的训练模型。
最近,研究重点的很大一部分已经放在开发跨不同应用的计算机视觉中的自监督方法上。用未标记的数据训练模型的能力加快了整体训练过程,并使模型能够在不引入标记偏差的情况下学习潜在的语义特征。
为了训练自监督模型,主要有两个阶段:
我们用于预训练的任务被称为借口任务。借口任务(也称为监督任务)的目的是指导模型学习数据的中间表示。它有助于理解潜在的结构意义,这对实际的下游任务是有益的。
生成模型可以被认为是自我监督的模型,但是具有不同的目标。例如,在 GANs 中,它们用于为鉴别器生成逼真的图像,而自我监督训练的目的是识别可用于各种任务的良好特征,而不仅仅是欺骗鉴别器。
下游任务是托词模型到具体任务的 知识转移过程 。向下游任务提供更少量的标记数据。
视觉领域中的下游任务也称为目标任务,可以是对象识别、对象分类、对象再识别等。在托词模型上做了微调。
研究人员已经为使用 SSL 方法训练不同的基于图像的任务提出了许多想法。
补丁定位
目的:托辞任务的目的是使用自我监督学习来识别图像中不同斑块之间的关系。
Patch localization in image | Source
训练算法 论文
**1. 从图像中随机抽取一块样本。
2. 最近邻:假设第一个面片位于 3×3 网格的中间,第二个面片从其 8 个相邻位置采样。
3. 引入增强功能,如补片之间的间隙、色差、补片的下采样和上采样,以处理像素化和色彩抖动。这有助于模型不过度拟合某些低电平信号。
4. 该任务的目的是识别 8 个相邻位置中的哪一个是第二块。该任务被设计成一个超过 8 类的分类问题。
在完成托词任务时,重要的是要确保它不是在学习与全局模式下的高级潜在特征相比微不足道的模式。例如,像面片之间的边界纹理这样的低级线索可以被认为是微不足道的特征。然而,对于某些图像,存在一个微不足道的解决方案。这是由于相机镜头效应造成的,称为色差,色差是由于不同波长的光的焦点不同而产生的。
卷积神经网络能够通过检测品红色(蓝色+红色)和绿色之间的差异来学习补丁的相对位置。最近邻实验证明,很少有小块从绝对相同的位置提取区域,因为小块显示相似的像差。
上下文感知像素预测
目的:使用编码器-解码器基于图像的整体上下文来预测图像中未知块的像素值。
训练算法 论文
**1. 使用普通的编码器-解码器架构来训练托词任务。
2. 编码器( Pathak 等人,2016 )使用具有涂黑区域的输入图像产生图像的潜在特征表示。
3. 解码器使用来自编码器的潜在特征表示,并使用重建损失(MSE)来估计丢失的图像区域。
4. 编码器和解码器之间的通道式全连接层允许解码器中的每个单元对整个图像内容进行推理。
Context encoder architecture | Source
损失函数
训练中使用的损失函数是 重建 损失和 对抗 损失。
重建损失
- 重建(L2)损失负责捕获相对于完整图像背景的显著特征。
- 重建损失定义为输入图像的归一化屏蔽距离 x 。
- M :对应于被去除图像区域的二进制掩码,对于输入像素值为 0,不考虑像素时为 1。
- F: 产生编码器输出的函数
敌对损失
- 对手损失被建模以使预测看起来真实,并学习它被训练的输入数据的潜在空间。
- 因为鉴别器 D 能够利用修补区域和原始上下文中的永久不连续性,所以只有生成器 G 针对输入掩码进行调节。
关节损失
- 联合损失是通过结合重建和对抗损失发展起来的
- 然而,在实验中,作者意识到,只有在不利损失的情况下,修复效果最好。
语义修复是使用 SSL 方法通过辅助监督和学习强特征表示来实现的。早在 2016 年,这篇论文就是使用 SSL 方法训练竞争形象模型的早期先驱之一。
自监督学习在自然语言处理中的应用
在 SSL 成为主流计算机视觉研究的一部分之前,SSL 已经在自然语言处理(NLP)领域取得了巨大的进步。从文档处理应用程序、文本建议、句子完成等等,语言模型几乎无处不在。
然而,自从 2013 年发表了革新 NLP 领域的 Word2Vec 论文以来,这些模型的学习能力已经发生了演变。单词嵌入方法的想法很简单:我们不需要一个模型来预测下一个单词,我们可以让它根据之前的上下文来预测下一个单词。
由于这些进步,我们能够通过单词嵌入的分布来获得有意义的表示,这可以用于许多场景,如句子完成、单词预测等。如今,NLP 中最流行的 SSL 方法之一是 BERT。
在过去的十年中,NLP 领域的研究和开发不断涌现。让我们在下面提取一些重要的。
下一句预测
在下一句预测(NSP)中,我们从一个文档中选取两个同时出现的句子,并从相同或不同的文档中随机选取一个句子,比如句子 A、句子 B 和句子 c。然后我们询问模型句子 A 相对于句子 B 的相对位置?–并且模型输出 IsNextSentence 或 IsNotNextSentence。我们对所有组合都这样做。
考虑以下场景:
- 放学后,迈克回家了。
- 将近 50 年后,载人登月任务终于开始了。
- 一回到家,迈克看着网飞放松。
如果我们让一个人重新排列任何两个符合我们逻辑理解的句子,他们很可能会选择 句子 1 ,然后是 句子 3 。
这个模型的主要目的是基于长期的上下文依赖来预测句子。
来自变形金刚的双向编码器表示(BERT) 谷歌人工智能团队的研究人员发表的一篇论文已经成为自然语言推理(MNLI)、问答(SQuAD)等几项 NLP 任务的黄金标准。
对于这样的下游任务,BERT 提供了一种很好的方法来捕捉句子之间的关系,这是通过其他语言建模技术不可能实现的。下面是下一句预测的工作原理。
-
为了让 BERT 处理各种下游任务,输入表示能够明确地表示一对在单个序列中打包在一起的句子。“序列”是指 BERT 的输入令牌序列。
-
每个序列的第一个标记总是一个特殊的分类标记([CLS])。对应于该令牌的最终隐藏状态被用作分类任务的聚集序列表示。
-
我们用两种方法区分句子。首先,我们用一个特殊的标记([SEP])将它们分开。第二,我们向每个标记添加一个学习嵌入,指示它是属于句子 A 还是句子 b。
-
我们将输入嵌入表示为 E,将特殊[CLS]标记的最终隐藏向量表示为 C,将第 I 个^(输入标记的最终隐藏向量表示为 T[I .]该向量 C 用于下一句预测(NSP))
这个任务可以从下面的例子来理解:
如果你想利用 BERT 模型来完成这个任务,你可以参考拥抱脸文档。
自回归语言建模
虽然像 BERT 这样的自动编码模型利用自监督学习来完成像句子分类(next 或 not)这样的任务,但自监督方法的另一个应用是文本生成领域。
像 GPT(预训练生成转换器)这样的自回归模型是在经典的语言建模任务中预训练的——在阅读了所有前面的单词后预测下一个单词。这种模型对应于变压器的解码器部分,并且在整个句子的顶部使用了一个遮罩,以便注意力只能够看到文本中之前的内容,而不是之后的内容。
让我们通过查看 GPT 的训练框架来更深入地了解这些模型是如何工作的。
培训程序包括两个阶段:
- 无监督预训练
第一阶段是在大型文本语料库上学习高容量语言模型。
给定一个无监督的记号集 U = {u [1] ,。。。,u [n] },我们使用标准语言建模目标来最大化以下可能性:
其中 k 是上下文窗口的大小,并且条件概率 P 使用具有参数θ的神经网络来建模。使用随机梯度下降来训练这些参数。
这里训练的模型是语言模型的多层 transformer 解码器,它是 transformer 的变体。该模型在输入上下文标记上应用多头自关注操作,随后是逐位置前馈层,以产生目标标记上的输出分布:
其中 U =(U[—k],。。。,u[—1]是记号的上下文向量,n 是层数,W [e] 是记号嵌入矩阵,W [p] 是位置嵌入矩阵。这种受约束的自我关注(每个标记都可以关注其左侧的上下文)将自我监督的方法带入了画面。
在这一步中,我们假设一个带标签的数据集 C,其中每个实例由一系列输入标记 x ¹ 组成。。。输入通过我们预先训练的模型,以获得最终变压器块的激活 h^ml,然后将其馈送到添加的线性输出层,该输出层具有参数 W [y] 以预测 y:
这为我们提供了以下最大化目标:
将语言建模作为微调的辅助目标有助于学习——提高监督模型的泛化能力,加速收敛。具体来说,我们优化以下目标(权重为λ):
总的来说,在微调过程中,我们需要的唯一额外参数是 W [y] ,以及分隔符标记的嵌入。
(left) Transformer architecture and training objectives used in this work
(right) Input transformations for fine-tuning on different tasks | Source
在上图中,左边是 Transformer 架构和培训目标,右边是针对不同任务进行微调的输入转换。我们将所有结构化输入转换为令牌序列,由我们预先训练的模型进行处理,然后是线性+softmax 层。对于不同的任务,需要不同的处理,就像对于文本蕴涵,我们连接前提(p),包含文本和假设(h),包含文本,标记序列,中间有分隔符标记($)。
对最初的 GPT 模型进行了多次改进,要了解如何将它用于您自己的用例,您可以参考此页。
自我监督学习应用:工业案例研究
到目前为止,我们已经讨论了如何使用自我监督的方法来训练流行的模型,以及如何自己训练或使用可用库中的模型。
现在,让我们来看看业界是如何利用这项技术来解决关键问题的。
1.脸书的仇恨言论检测
“我们认为,自我监督学习(SSL)是在人工智能系统中建立背景知识和近似常识形式的最有前途的方法之一。”
AI Scientists, Facebook
脸书不仅通过基础、开放的科学研究在许多领域推进自我监督学习技术,而且他们还将这一前沿工作应用于生产,以快速提高其产品中内容理解系统的准确性,从而确保人们在其平台上的安全。
一个这样的例子是 XLM,脸书人工智能的跨多种语言训练语言系统的方法,不依赖手动标记的数据集来提高仇恨言论检测。
Hate-speech detection at Facebook | Source
这种自我监督学习的应用使得他们的模型更加健壮,他们的平台更加安全。让我们简单谈谈 XLM 是什么,以及它是如何做出如此改变的。
XLM
型号
它是一个基于 Transformers 的架构,使用三个语言建模目标之一进行预训练:
-
随意语言建模(CLM): 根据句子中前面的单词,对一个单词的概率进行建模,即 P(w [t] |w [1] ,。。。,w[t1],θ)。
-
掩蔽顾岚年龄建模(MLM):BERT 的掩蔽语言建模目标,即使用[MASK]关键字掩蔽随机选择的标记,并尝试预测它们。
-
翻译语言建模(TLM):MLM 的新增和扩展,它不考虑单语文本流,而是连接平行句子,如下图所示。源句子和目标句子中的单词都被屏蔽。为了预测英语句子中隐藏的单词,模型可以关注周围的英语单词或法语翻译,鼓励模型对齐英语和法语表示。如果英语上下文不足以推断被屏蔽的英语单词,该模型还可以利用法语上下文。
Cross-lingual language model pertaining | Source
因此,XLM 是一个跨语言的语言模型,其预训练可以在 CLM、MLM 或 MLM 与 TLM 结合使用的情况下进行。现在,让我们来看看 XLM 带来的好处。
性能分析
- 跨语言分类
XLM 为零射击跨语言分类提供了更好的句子编码器初始化,并能够通过 MLM 方法在相同的句子编码器上获得 71.5%的准确度,从而实现最先进的(SOTA)性能。结合 MLM 和 TLM 将性能进一步提高到 75.1%。
- 机器翻译系统
类似于第一点,它提供了监督和非监督神经机器翻译系统的更好的初始化。具有 MLM 目标的预训练显示了在无监督系统的情况下的显著改进,而相同的目标导致了在有监督系统中的 SOTA 性能,BLEU 得分为 38.5。
- 低资源语言的语言模型
对于资源较少的语言来说,利用类似但资源较多的语言中的数据通常是有益的,尤其是当它们共享很大一部分词汇表时。发现 XLM 通过利用来自印地语(一种相对流行的具有大量资源的语言)的信息来改进尼泊尔语语言模型(一种低资源语言),因为它们共享相同的 Devnagari 文字。
- 无监督的跨语言单词嵌入
XLM 在跨语言单词嵌入方面优于先前的工作,在源单词和它们的翻译之间达到了 0.69 的 SOTA 水平皮尔逊相关分数。
有了这样的进步,XLM 确实在自然语言处理方面有所作为。
2.谷歌的医学影像分析模型
在医学领域,训练深度学习模型一直是一项困难的任务,因为标记的数据有限,而且标注这些数据既耗时又昂贵。为了解决这个问题,谷歌的研究团队引入了一种新的多实例对比学习(MICLe)方法,该方法使用每个患者病例的潜在病理的多个图像,为自我监督学习构建更多信息的阳性对。
Google’s medical imaging analysis model | Source
关于图示的方法,需要记住几件事:
- 第一步是使用 SimCLR 进行的,这是 Google 为图像的自我监督表示学习设计的另一个框架。我们将很快讨论它。
- 与步骤(1)不同,步骤(2)和(3)是特定于任务和数据集的。
所以还是一步一步来。
步骤 1:sim clr 框架
它代表了视觉表征对比学习的一个简单框架,极大地推动了自监督和半监督学习的发展,并在有限的类别标记数据下实现了图像分类的新纪录。
-
SimCLR 首先在未标记的数据集上学习图像的通用表示,然后可以用少量的标记图像进行微调,以实现给定分类任务的良好性能(就像医学成像任务一样)。
-
遵循一种称为对比学习的方法,通过同时最大化同一图像的不同变换视图之间的一致性和最小化不同图像的变换视图之间的一致性来学习通用表示。使用这种对比目标来更新神经网络的参数使得对应视图的表示彼此“吸引”,而不对应视图的表示彼此“排斥”。
-
首先,SimCLR 从原始数据集中随机抽取示例,使用简单扩充的组合将每个示例转换两次,创建两组对应的视图。
-
然后,它使用基于 ResNet 架构的 CNN 来计算图像表示。
-
最后,SimCLR 使用全连接网络(即,MLP)计算图像表示的非线性投影,这放大了不变特征并最大化了网络识别同一图像的不同变换的能力。
经训练的模型不仅在识别同一图像的不同变换方面做得很好,而且还学习相似概念的表示(例如,椅子对狗),这些概念稍后可以通过微调与标签相关联。
米克尔
在用 SimCLR 对未标记的自然图像完成初始预训练之后,训练该模型以捕捉医学图像数据集的特殊特征。这也可以用 SimCLR 来完成,但是这种方法只能通过增强来构建阳性对,而不能轻易地利用患者的元数据来构建阳性对。因此这里使用 MICLe。
-
给定给定患者病例的多个图像,MICLe 通过从来自同一患者病例的两个不同图像中绘制两个裁剪来构建用于自我监督对比学习的正对。这种图像可以从不同的视角拍摄,并显示具有相同潜在病理的不同身体部位。
-
这为自监督学习算法提供了一个很好的机会,以直接方式学习对视点、成像条件和其他混淆因素的变化具有鲁棒性的表示。
第三步:微调
- 该模型在微调期间被端到端地训练,使用预训练网络的权重作为下游监督任务数据集的初始化。
- 对于微调期间的数据增强,在两个任务(皮肤病学和胸部 x 光)中对图像进行了随机颜色增强、带大小调整的裁剪、模糊、旋转和翻转。
- 对于预训练策略和下游微调任务的每个组合,执行广泛的超参数搜索。
技术性能分析
- 自监督学习利用未标记的特定领域医学图像,并且显著优于监督 ImageNet 预训练。
Comparison of supervised and self-supervised pre-training, followed by supervised fine-tuning using two architectures on dermatology and chest X-ray classification | Source
- 自我监督预训练模型可以更好地概括分布变化,其中最小预训练导致最大增益。这是一个有价值的发现,因为分布转移下的泛化对临床应用至关重要。
Evaluation of models on distribution-shifted datasets | Source
- 使用自监督模型的预训练可以补偿医学图像分类的低标签效率,并且在采样的标签部分中,自监督模型始终优于监督基线。事实上,MICLe 仅使用 ResNet-50 (4x)的 20%的训练数据和 ResNet152 (2x)的 30%的训练数据就能够匹配基线。
Top-1 accuracy for dermatology condition classification for MICLe, SimCLR, and supervised models under different unlabeled pretraining dataset and varied sizes of label fractions | Source
自我监督学习的挑战
到目前为止,我们已经讨论了自我监督学习如何在机器学习社区的几乎每个领域取得进展,但它也有一些缺点。自我监督学习试图实现“一种方法解决所有问题”的方法,但它远没有实现。SSL 领域的一些关键挑战是:
-
准确性:虽然 SSL 技术的前提是不使用带标签的数据,但这种方法的缺点是您要么需要大量数据来生成准确的伪标签,要么会牺牲准确性。需要注意的是,在初始步骤中进行训练时,生成的不准确标签会产生反作用。
-
计算效率:由于多阶段训练(1。生成伪标签 2。在伪标签上训练)与监督学习相比,训练模型所花费的时间较高。此外,当前的 SSL 方法需要大量的数据来实现接近监督学习的准确性。
-
托辞任务:为你的用例选择合适的托辞任务非常重要。例如,如果您选择 autoencoder 作为您的托词任务,其中图像被压缩,然后重新生成,它也会试图模仿原始图像的噪声,如果您的任务是生成高质量的图像,这种托词任务将弊大于利。
关键要点
在本文中,我们了解了什么是自我监督学习,为什么它越来越受欢迎,以及与它相关的风险和挑战是什么。我们还讨论了使用这种方法训练的流行模型,并深入探讨了大型科技公司如何利用自我监督学习来解决一些真正紧迫的问题。
总结一下我们目前所学的知识:
- 在我们处理与数据相关的挑战的用例中,自我监督学习是一种福气。从用于数据集准备的资源不足到耗时的标注问题,不一而足。
- 另一个好处是下游任务,即迁移学习。模型可以在未标记的数据集上以自我监督的方式进行预训练,然后可以针对特定的用例进行进一步的微调。
- 作为前两点的结果,如果你想建立一个可扩展的 ML 模型,自我监督学习显然是一种可行的方法。
- 然而与此同时,人们必须意识到使用这种方法所附带的条件。
虽然我们试图在本文中涵盖很多内容,但显然我们讨论的内容并不详尽。关于自我监督学习还有很多东西要学。如果您想了解更多有关其当前和潜在使用案例的信息,您可以参考以下资料:
快乐学习!
参考
德瓦尔·沙阿
对智能软件系统很好奇。作为我日常生活的一部分,我编写程序,写关于人工智能的新研究趋势,阅读关于技术、文化、政治和体育的书籍。
阿布舍克·贾
一个好奇的家伙,目前正在建造模型,希望有一天能建造天网。跟随这个空间,学习未被理清的数据科学概念,并站在未来的正确一边!
阅读下一篇
如何构建和管理自然语言处理(NLP)项目
Dhruvil Karani |发布于 2020 年 10 月 12 日
如果说我在 ML 行业工作中学到了什么的话,那就是:机器学习项目很乱。
这并不是说人们不想把事情组织起来,只是在项目过程中有很多事情很难组织和管理。
你可以从头开始,但有些事情会阻碍你。
一些典型的原因是:
- 笔记本中的快速数据探索,
- 取自 github 上的研究报告的模型代码,
- 当一切都已设置好时,添加新的数据集,
- 发现了数据质量问题并且需要重新标记数据,
- 团队中的某个人“只是快速地尝试了一些东西”,并且在没有告诉任何人的情况下改变了训练参数(通过 argparse 传递),
- 从高层推动将原型转化为产品“仅此一次”。
多年来,作为一名机器学习工程师,我学到了一堆东西,它们可以帮助你保持在事物的顶端,并检查你的 NLP 项目(就像你真的可以检查 ML 项目一样:)。
在这篇文章中,我将分享我在从事各种数据科学项目时学到的关键指针、指南、技巧和诀窍。许多东西在任何 ML 项目中都是有价值的,但有些是 NLP 特有的。
Python 中的情感分析:TextBlob vs Vader 情感 vs 天赋 vs 从头构建
情感分析是最广为人知的自然语言处理(NLP)任务之一。这篇文章的目的是让读者对情感分析有一个非常清晰的理解,以及在 NLP 中实现情感分析的不同方法。所以让我们开始吧。
在过去的五年里,自然语言处理领域有了很大的发展,像 Spacy、TextBlob 等开源包。为 NLP 提供随时可用的功能,如情感分析。有这么多免费的软件包,让你不知道该为你的应用程序使用哪一个。
在本文中,我将讨论最流行的 NLP 情感分析包:
最后,我还将在一个公共数据集上比较它们各自的性能。
什么是情感分析?
情感分析是确定自然语言中给定表达的情感值的任务。
它本质上是一个多类文本分类文本,其中给定的输入文本被分类为积极、中性或消极情绪。类别的数量可以根据训练数据集的性质而变化。
比如有时候会公式化为 1 为正面情感,0 为负面情感标签的二元分类问题。
情感分析的应用
情感分析在很多领域都有应用,包括分析用户评论、推特情感等。让我们来看看其中的一些:
电影评论:分析在线电影评论,以获得观众对电影的见解。
- 新闻舆情分析:针对特定机构分析新闻舆情,获取洞察。
- 社交媒体情绪分析:分析脸书帖子、twitter 推文等的情绪。
- 在线美食评论:从用户反馈中分析美食评论的情感。
- python 中的情感分析
python 中有许多可用的包,它们使用不同的方法来进行情感分析。在下一节中,我们将介绍一些最流行的方法和软件包。
基于规则的情感分析
基于规则的情感分析是计算文本情感的基本方法之一。这种方法只需要很少的前期工作,而且思想非常简单,不需要使用任何机器学习来理解文本情感。例如,我们可以通过计算用户在他/她的推文中使用“悲伤”这个词的次数来计算出一个句子的情感。
现在,让我们看看一些使用这种方法的 python 包。
文本块
这是一个简单的 python 库,提供了对不同 NLP 任务的 API 访问,如情感分析、拼写纠正等。
Textblob 情感分析器返回给定输入句子的两个属性:
极性是介于[-1,1]之间的浮点数,-1 表示消极情绪,+1 表示积极情绪。
主观性也是一个位于[0,1]范围内的浮点数。主观句一般指个人观点、情感或判断。
让我们看看如何使用 Textblob:
Textblob 将忽略它不认识的单词,它将考虑它可以分配极性的单词和短语,并进行平均以获得最终分数。
- VADER 情绪
用于情感推理的效价感知词典(VADER) 是另一个流行的基于规则的情感分析器。
from textblob import TextBlob
testimonial = TextBlob("The food was great!")
print(testimonial.sentiment)
Sentiment(polarity=1.0, subjectivity=0.75)
它使用一系列词汇特征(例如单词)来计算文本情感,这些词汇特征根据它们的语义取向被标记为正面或负面。
Vader 情感返回给定输入句子被
积极、消极和中立。
例如:
“食物棒极了!”
阳性:99%
阴性:1%
中性:0%
这三个概率加起来是 100%。
让我们看看如何使用 VADER:
Vader 针对社交媒体数据进行了优化,当与来自 twitter、facebook 等的数据一起使用时,可以产生良好的结果。
基于规则的情感分析方法的主要缺点是,该方法只关心单个单词,而完全忽略了使用它的上下文。
例如,“the party wave”在被任何基于令牌的算法考虑时都将是否定的。
嵌入型模型
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
analyzer = SentimentIntensityAnalyzer()
sentence = "The food was great!"
vs = analyzer.polarity_scores(sentence)
print("{:-<65} {}".format(sentence, str(vs)))
{'compound': 0.6588, 'neg': 0.0, 'neu': 0.406, 'pos': 0.594}
文本嵌入是 NLP 中单词表示的一种形式,其中同义词相似的单词使用相似的向量来表示,当在 n 维空间中表示时,这些向量将彼此接近。
基于嵌入的 python 包使用这种形式的文本表示来预测文本情感。这导致 NLP 中更好的文本表示,并产生更好的模型性能。
其中一个就是天赋。
天赋
Flair 是一个简单易用的 NLP 框架。
它提供了各种功能,例如:
预先训练的情感分析模型,
文本嵌入,
NER,
还有更多。
让我们看看如何使用 flair 非常简单有效地进行情感分析。
Flair 预训练情感分析模型在 IMDB 数据集上进行训练。要加载并使用它进行预测,只需:
-
如果您喜欢为您的领域定制一个情感分析器,可以使用 flair 使用您的数据集训练一个分类器。
-
使用 flair 预训练模型进行情感分析的缺点是,它是在 IMDB 数据上训练的,并且该模型可能不会很好地概括来自 twitter 等其他领域的数据。
-
从头开始构建情感分析模型
在本节中,您将学习何时以及如何使用 TensorFlow 从头开始构建情感分析模型。所以,我们来检查一下怎么做。
from flair.models import TextClassifier
from flair.data import Sentence
classifier = TextClassifier.load('en-sentiment')
sentence = Sentence('The food was great!')
classifier.predict(sentence)
print('Sentence above is: ', sentence.labels)
[POSITIVE (0.9961)
为什么要定制型号?
我们先来了解一下你什么时候会需要一个定制的情绪分析模型。例如,您有一个利基应用程序,如分析航空公司评论的情绪。
通过构建自定义模型,您还可以对输出进行更多的控制。
**TFhub **
TensorFlow Hub 是一个训练有素的机器学习模型库,可随时进行微调,并可部署在任何地方。
出于我们的目的,我们将使用通用语句编码器,它将文本编码为高维向量。您还可以使用任何您喜欢的文本表示模型,如 GloVe、fasttext、word2vec 等。
型号
因为我们使用一个通用的句子编码器来矢量化我们的输入文本,所以在模型中不需要嵌入层。如果你计划使用任何其他的嵌入模型,比如 GloVe,请随意关注我之前的帖子来获得一步一步的指导。在这里,我将为我们的目的构建一个简单的模型。
数据集
对于我们的例子,我将使用来自 Kaggle 的 twitter 情感分析数据集。这个数据集包含 140 万条带标签的推文。
你可以从这里下载数据集。
要在 Colab 中运行示例,只需在笔记本提示时上传 Kaggle API 密钥,它就会自动为您下载数据集。
要在 Colab 中运行示例,只需在笔记本提示时上传 Kaggle API 密钥,它就会自动为您下载数据集。
示例:使用 Python 进行 Twitter 情感分析
这是 Colab 笔记本的链接。
举例:用 Python 进行 Twitter 情感分析。
在同一个笔记本里,我实现了我们上面讨论的所有算法。
比较结果
现在,让我们比较笔记本上的结果。
你可以看到我们的定制模型没有任何超参数调整产生最好的结果。
我只在 Twitter 数据上训练了使用模型,其他的都是现成的。
你可以看到上面的包没有一个能很好地概括 twitter 数据,我一直在做一个很酷的开源项目来开发一个专门针对 twitter 数据的包,这个项目正在积极开发中。
请随意查看我在 GitHub 上的项目。
最后的想法
在本文中,我讨论了情感分析以及用 python 实现它的不同方法。
我还在一个公共数据集上比较了它们的性能。
希望你会发现它们在你的一些项目中有用。
You can see that our custom model without any hyperparameter tuning yields the best results.
I have only trained the Use model on the Twitter data, the other ones come out-of-the-box.
You can see that none of the above packages are generalizing well on twitter data, I have been working on a cool open source project to develop a package especially for twitter data and this is under active contribution.
Feel free to check out my project on GitHub.
Final thoughts
In this article, I discussed sentiment analysis and different approaches to implement it in python.
I also compared their performance on a common dataset.
Hopefully, you will find them useful in some of your projects.
我们筹集了 800 万美元的 A 轮融资,继续建立“运转良好”的实验跟踪和模型注册
原文:https://web.archive.org/web/https://neptune.ai/blog/series-a-announcement
当我在 2016 年从软件工程来到机器学习领域时,我对杂乱的实验实践、对模型构建的缺乏控制以及帮助人们自信地交付模型的工具生态系统的缺失感到惊讶。
这与软件开发生态系统形成了鲜明的对比,在软件开发生态系统中,您拥有成熟的开发、可观察性或编排工具,可以在生产中高效地执行。
看到这一点,我和几个朋友在 2017 年创办了 Neptune.ai,让 ML 从业者在开发和部署模型时拥有与软件开发人员在发布应用程序时相同的信心。
从那时起,情况发生了很大变化:
- 变形金刚和 GPT 3 被创造出来,
- Pytorch 成为了标准,
- Theano 被弃用,然后又回来了,
- “MLOps”这个词被创造出来,然后开始流行。
最重要的是,ML 社区意识到在笔记本上构建 POC 模型并不是最终目标。
今天,大大小小的公司都在生产中部署和运行这些模型。我们还没有达到“自信地开发和部署模型”的阶段,但是作为一个社区,我们已经取得了巨大的进步。
说到进展,我真的很高兴与大家分享我们刚刚筹集了 800 万美元的 A 轮融资,以继续建设 Neptune.ai 。
Almaz Capital 领投了这一轮,我们现有的投资者也参与了进来:btov Partners、Rheingau Founders 和 TDJ·皮坦戈。
在过去的几年里,我们已经走了这么长的路。今天我们有:
- 成千上万的用户,
- 数百个付费团队,
- 像 CB Insights 这样的地方将我们列为“2021 年 100 强人工智能初创公司”。
作为一名波兰工程师,只有一种方式来表达我的感受:不错。
我非常感激:
- 感谢所有用户和客户的宝贵反馈和支持,
- 团队每天都尽最大努力,
- 投资者相信我们的愿景。
虽然 MLOps 领域的大多数公司都试图走得更远,成为解决机器学习团队所有问题的平台,但我们希望走得更远,成为实验跟踪和模型注册的最佳工具。
我们希望“仅仅”很好地解决 MLOps 堆栈的这一部分。
为什么只有一个?
在更成熟的软件开发领域,几乎没有端到端的平台。那么,为什么更复杂的机器学习会有所不同呢?
我相信,通过专注于为实验跟踪和模型注册提供出色的开发人员体验,我们可以成为团队构建 MLOps 工具堆栈的支柱之一。
为了实现这一点,我们将在开发人员体验方面投入 800 万美元中的很大一部分。期望:
- 为特定 ML 用例构建的更多功能,
- 更具响应性的 UI 和 API,
- 改进了我们网络用户界面的 UX,
- 与 MLOps 生态系统中的工具进行更多集成,
- 通过网页挂钩和通知进行互动的新方式,
- 更好的文档,
- 对特征循环的更快反馈。
但最重要的是,我们将继续让实验跟踪和模型注册为世界各地的 ML 团队“工作”。
如果您有兴趣加入我们,试用该工具,或分享反馈,我希望收到您的来信:
- 工作:我们正在招聘工程、开发和成长类的职位
- 如果你还没有,试试 neptune 吧
- 请求演示:我们将为您的使用案例创建一个定制演示
- 分享反馈:告诉我们你的想法
熊彼得
CEO 兼创始人@neptune.ai
阅读下一篇
Hypefactors 案例研究:不总是运行实验的团队的元数据管理
7 分钟阅读| 2021 年 10 月 25 日更新
Hypefactors 是一家从事媒体情报和声誉跟踪领域的技术公司。它们提供了一个基于 ML 的公共关系(PR)自动化平台,包括支持 PR 工作流和可视化结果的所有工具。
我们采访了 Hypefactors 的首席技术官 Viet Yen Nguyen,他领导着技术团队,负责公司的技术方面。他对这项业务的解释是:
“苹果公司价值约 2 万亿美元,但如果你去他们的仓库、商店,把他们所有的东西加起来,你不会得到 2 万亿美元。你可能会得到价值 600 亿美元的实物商品。
那么反映在股票价格上的 1.94 万亿的价值在哪里呢?是未来的前景,是品牌的潜力,是声誉,是无形的东西。
我们帮助团队实际测量和跟踪它。”
这个项目是关于什么的?
Hypefactors 的数据管道监控从社交媒体管道到印刷媒体、电视、广播等整个媒体领域,以分析客户品牌声誉的变化。这一壮举分两个阶段实现:
- 从各处获取数据
- 2 用基于 ML 的特征丰富数据
为了分析图像、文本和表格等各种形式的数据,他们研究了各种各样的 ML 问题:
- NLP 分类
- 计算机视觉(例如分割)
- 业务指标的回归
当他们使用不同的 ML 技术训练和改进许多丰富模型时,这自然包括运行许多实验和阐明存储由这些实验生成的元数据的方法。
在数据和人工智能团队中有称职的工程师,Viet 的团队能够在管道中的所有组件上取得良好的结果,除了实验跟踪。让我们来窥视一下他们在这个过程中所面临的问题,以及他们采取了哪些措施来解决这些问题。
用 Docker 服务机器学习模型:你应该避免的 5 个错误
原文:https://web.archive.org/web/https://neptune.ai/blog/serving-ml-models-with-docker-mistakes
正如您已经知道的, Docker 是一个工具,它允许您使用容器来创建和部署隔离的环境,以便运行您的应用程序及其依赖项。既然这样,在进入主题之前,让我们简单回顾一下 Docker 的一些基本概念。
数据科学家为什么要容器化 ML 模型?
你是否曾经训练过一个机器学习模型,然后决定与同事分享你的代码,但后来发现你的代码不断出错,尽管它在你的笔记本电脑上工作得很好。大多数情况下,这可能是包兼容性问题或环境问题。解决这个问题的好办法是使用 容器 。
Source: Author
集装箱优惠:
- 再现性——通过将你的机器学习模型容器化,你可以将你的代码运送到任何其他安装了 Docker 的系统,并期望你的应用程序能给你类似于你在本地测试时的结果。
** 协作开发–容器化的机器学习模型允许团队成员协作,这也使得版本控制更加容易。
使用 Docker 服务于您的机器学习模型
既然你知道为什么你需要容器化你的机器学习模型,接下来的事情就是理解你如何容器化你的模型。
一些您可能已经知道并在本文中遇到的与 Docker 相关的术语:
-
Dockerfile :你可以把 Dockerfile 想象成一个描述你想要如何设置你想要运行的系统的操作系统安装的文件。它包含了设置 Docker 容器所需的所有代码,从下载 Docker 映像到设置环境。
-
Docker image :它是一个只读模板,包含创建 Docker 容器的指令列表。
-
Docker 容器:容器是 Docker 映像的一个可运行实例。
Basic Docker commands | Source: Author
创建 Docker 文件时,可以考虑一些最佳实践,比如在构建 Docker 映像时避免安装不必要的库或包,减少 Docker 文件的层数等等。查看以下文章,了解使用 Docker 的最佳实践。
如何为机器学习模型服务?
模型服务的重要概念是托管机器学习模型(内部或云中),并通过 API 提供其功能,以便公司可以将人工智能集成到他们的系统中。
通常有两种模型服务:批处理和在线。
批量预测表示模型的输入是大量的数据,通常是预定的操作,预测可以以表格的形式发布。
在线部署需要部署带有端点的模型,以便应用程序可以向模型提交请求,并以最小的延迟获得快速响应。
服务 ML 模型时需要考虑的重要要求
交通管理
根据目标服务的不同,端点上的请求会采用不同的路径。为了同时处理请求,流量管理还可以部署负载平衡功能。
监视
监控在生产中部署的机器学习模型是很重要的。通过监控最大似然模型,我们可以检测模型的性能何时恶化以及何时重新训练模型。没有模型监控,机器学习生命周期是不完整的。
数据预处理
对于实时服务,机器学习模型要求模型的输入具有合适的格式。应该有一个专用的转换服务用于数据预处理。
您可以使用不同的工具来为生产中的机器学习模型提供服务。你可以查看这篇文章,获得关于你可以用于模型服务的不同机器学习工具/平台的全面指导。
使用 Docker 服务机器学习模型时应该避免的错误
现在您已经理解了模型服务的含义以及如何使用 Docker 来服务您的模型。在使用 Docker 为您的机器学习模型提供服务时,知道做什么和不做什么是很重要的。
操作错误是数据科学家在使用 Docker 部署他们的机器学习模型时最常见的错误。这种错误通常会导致应用程序的 ML 服务性能很差。一个 ML 应用程序是通过它的整体服务性能来衡量的——它应该具有低推理延迟、低服务延迟和良好的监控架构。
错误一:用 TensorFlow Serving 和 Docker 服务机器学习模型时使用 REST API 而不是 gRPC
TensorFlow 服务是由 Google 开发人员开发的,它提供了一种更简单的方法来部署您的算法和运行实验。
要了解更多关于如何使用 TensorFlow 服务 Docker 来服务您的 ML 模型,请查看这篇帖子。
当使用 TensorFlow 服务为机器学习模型提供服务时,您需要了解 Tensorflow 服务提供的不同类型的端点以及何时使用它们。
gRPC 和 REST API 端点
gRPC
是由谷歌发明的一种通讯协议。它使用一个协议缓冲区作为它的消息格式,它是高度打包的,对于序列化结构化数据是高效的。借助对负载平衡、跟踪、运行状况检查和身份验证的可插拔支持,它可以高效地连接数据中心内部和数据中心之间的服务。
休息
大多数 web 应用程序使用 REST 作为通信协议。它说明了客户端如何与 web 服务通信。尽管 REST 仍然是客户机和服务器之间交换数据的好方法,但它也有缺点,那就是速度和可伸缩性。
gRPC 和 REST API 的区别
gRPC 和 REST API 在操作方式上有不同的特点。下表比较了两种 API 的不同特征
特性 | gRPC | 休息 |
---|---|---|
【协议缓冲区】
| |
| | | |
如下图所示,大多数服务 API 请求都是使用 REST 到达的。在使用RESTful API或gRPC API进行预测,将预处理数据发送到 Tensorflow 服务器之前,预处理和后处理步骤在 API 内部进行。
How to use gRPC for model serving | Source: Author
大多数数据科学家经常利用 REST API 进行模型服务,然而,它也有缺点。主要是速度和可伸缩性。你的模型在被输入后做出预测所花费的时间被称为 ML 推理延迟。为了改善应用程序的用户体验,ML 服务快速返回预测是非常重要的。
对于较小的有效载荷,这两种 API 都可以产生类似的性能,同时 AWS Sagemaker 证明,对于图像分类和对象检测等计算机视觉任务,在 Docker 端点中使用 gRPC 可以将整体延迟减少 75%或更多。
使用 gRPC API 和 Docker 部署您的机器学习模型
步骤 1: 确保您的电脑上安装了 Docker
步骤 2: 要使用 Tensorflow 服务,您需要从容器存储库中提取 Tensorflow 服务图像。
docker pull tensorflow/serving
第三步:建立并训练一个简单的模型
import matplotlib.pyplot as plt
import time
from numpy import asarray
from numpy import unique
from numpy import argmax
from tensorflow.keras.datasets.mnist import load_data
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import MaxPool2D
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dropout
(x_train, y_train), (x_test, y_test) = load_data()
print(f'Train: X={x_train.shape}, y={y_train.shape}')
print(f'Test: X={x_test.shape}, y={y_test.shape}')
x_train = x_train.reshape((x_train.shape[0], x_train.shape[1], x_train.shape[2], 1))
x_test = x_test.reshape((x_test.shape[0], x_test.shape[1], x_test.shape[2], 1))
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
input_shape = x_train.shape[1:]
n_classes = len(unique(y_train))
model = Sequential()
model.add(Conv2D(64, (3,3), activation='relu', input_shape=input_shape))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(32, (3,3), activation='relu'))
model.add(MaxPool2D((2, 2)))
model.add(Flatten())
model.add(Dense(50, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(n_classes, activation='softmax'))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=128, verbose=1)
loss, acc = model.evaluate(x_test, y_test, verbose=0)
print('Accuracy: %.3f' % acc)
第四步:保存模型
保存 TensorFlow 模型时,可以将其保存为协议缓冲文件,通过在 save_format 参数中传递“tf”将模型保存到协议缓冲文件中。
file_path = f"./img_classifier/{ts}/"
model.save(filepath=file_path, save_format='tf')
可以使用 saved_model_cli 命令对保存的模型进行调查。
!saved_model_cli show --dir {export_path} --all
步骤 5 :使用 gRPC 服务模型
您需要安装 gRPC 库。
Import grpc
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
from tensorboard.compat.proto import types_pb2
您需要使用端口 8500 在客户端和服务器之间建立一个通道。
channel = grpc.insecure_channel('127.0.0.1:8500')
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
服务器的请求有效负载需要通过指定模型的名称、存储模型的路径、预期的数据类型以及数据中的记录数来设置为协议缓冲区。
request = predict_pb2.PredictRequest()
request.model_spec.name = 'mnist-model'
request.inputs['flatten_input'].CopyFrom(tf.make_tensor_proto(X_test[0],dtype=types_pb2.DT_FLOAT, shape=[28,28,1]))
最后,要用 Docker 部署您的模型,您需要运行 Docker 容器。
docker run -p 8500:8500 --mount type=bind,source=<absolute_path>,target=/models/mnist-model/ -e MODEL_NAME=mnist -t tensorflow/serving
现在服务器可以接受客户端请求了。从存根调用 Predict 方法来预测请求的结果。
stub.Predict(request, 10.0)
按照上述步骤,您将能够使用 gRPC API 为 TensorFlow 服务模型提供服务。
错误 2:在使用 Docker 为机器学习模型提供服务时,对数据进行预处理
开发人员在使用 Docker 服务于他们的机器学习模型时犯的另一个错误是在做出预测之前实时预处理他们的数据。在 ML 模型提供预测之前,它期望数据点必须包括在训练算法时使用的所有输入特征。
例如,如果您训练一个线性回归算法来根据房子的大小、位置、年龄、房间数量和朝向来估计房子的价格,则训练好的模型将需要这些要素的值作为推断过程中的输入,以便提供估计的价格。
在大多数情况下,需要对输入数据进行预处理和清理,甚至需要对某些要素进行工程设计。现在想象一下,每次触发模型端点时都要实时地做这件事,这意味着对一些特性进行重复的预处理,尤其是静态特性和高 ML 模型延迟。在这种情况下,特性存储库被证明是一个无价的资源。
什么是功能商店?
功能存储与存储相关,用于跨多个管道分支存储和服务功能,从而实现共享计算和优化。
在 Docker 中为 ml 模型提供服务时使用特征库的重要性
-
数据科学家可以使用要素存储来简化要素的维护方式,为更高效的流程铺平道路,同时确保要素得到正确存储、记录和测试。
-
在整个公司的许多项目和研究任务中都使用了相同的功能。数据科学家可以使用要素存储来快速访问他们需要的要素,并避免重复工作。
为机器学习模型提供服务时,为了调用模型进行预测,会实时获取两种类型的输入要素:
-
静态参考:这些特征值是需要预测的实体的静态或渐变属性。这包括描述性属性,如客户人口统计信息。它还包括客户的购买行为,如他们花了多少钱,多久消费一次等。
-
实时动态特性:这些特性值是基于实时事件动态捕获和计算的。这些特征通常是在事件流处理管道中实时计算的。
要素服务 API 使要素数据可用于生产中的模型。创建服务 API 时考虑到了对最新特性值的低延迟访问。要更好地理解特性存储,了解可用的不同特性存储,请查看本文:特性存储:数据科学工厂的组件。
错误 3:使用 IP 地址在 Docker 容器之间通信
最后,您已经使用 Docker 部署了您的机器学习模型,并且您的应用程序正在生产环境中返回预测,但是由于某些原因,您需要对容器进行更新。在进行必要的更改并重启容器化的应用程序后,您会不断地得到 “错误:连接失败”。
您的应用程序无法建立到数据库的连接,即使它以前工作得非常好。每个容器都有自己的内部 IP 地址,该地址在容器重新启动时会发生变化。数据科学家犯的错误是使用 Docker 的默认网络驱动程序 bridge 在容器之间进行通信。同一桥接网络中的所有容器可以通过 IP 地址相互通信。因为 IP 地址会波动,这显然不是最好的方法。
不使用 IP 地址,如何在 Docker 容器之间进行通信?
为了与容器通信,您应该使用环境变量来传递主机名,而不是 IP 地址。您可以通过创建用户定义的桥接网络来实现这一点。
How to create a user-defined bridge network | Source
- 您需要创建自己的自定义桥接网络。您可以通过运行 Docker network create 命令来实现这一点。这里我们创建一个名为“虚拟网络”的网络。
Docker network create dummy-network
- 用 docker run 命令正常运行你的容器。使用—网络选项 将其添加到您自定义的桥接网络中。您还可以使用–name 选项添加别名。
docker run --rm --net dummy-network --name tulipnginx -d nginx
- 将另一个容器连接到您创建的自定义桥接网络。
docker run --net dummy-network -it busybox
- 现在,您可以使用容器主机名连接到任何容器,只要它们在同一个自定义桥接网络上,而不用担心重启。
错误 4:作为根用户运行您的流程
许多数据科学家在作为根用户运行他们的流程时犯了这样的错误,我将解释为什么这是错误的,并推荐解决方案。在设计系统时,坚持最小特权原则是很重要的。这意味着应用程序应该只能访问完成任务所需的资源。授予进程执行所需的最少特权是保护自己免受任何意外入侵的最佳策略之一。
因为大多数容器化的流程是应用程序服务,所以它们不需要 root 访问。容器不需要 root 才能运行,但是 Docker 需要。编写良好、安全且可重用的 Docker 映像不应该以 root 用户身份运行,而应该提供一种可预测且简单的方法来限制访问。
默认情况下当你运行你的容器时,它假定 根 用户。我也犯过这样的错误,总是以 root 用户身份运行我的进程,或者总是使用 sudo 来完成工作。但是我了解到,拥有不必要的权限会导致灾难性的问题。
让我通过一个例子来说明这一点。这是我过去用于一个项目的 docker 文件样本。
FROM tiangolo/uvicorn-gunicorn:python3.9
RUN mkdir /fastapi
WORKDIR /fastapi
COPY requirements.txt /fastapi
RUN pip install -r /fastapi/requirements.txt
COPY . /fastapi
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
第一件事是构建一个 Docker 映像并运行 Docker 容器,您可以用这个命令来完成
docker build -t getting-started .
docker run -d p 8000:8000 getting-started
接下来是获取 containerID,你可以通过用 docker ps 检查你的 Docker 容器进程来做到这一点,然后你可以运行 whoami 命令来查看哪个用户可以访问容器。
Source: Author
如果应用程序存在漏洞,攻击者就可以获得容器的超级用户访问权限。用户在容器中拥有 root 权限,可以做任何他们想做的事情。攻击者不仅可以利用这一点来干扰程序,还可以安装额外的工具来转到其他设备或容器。
如何以非根用户身份运行 Docker
使用 dockerfile 文件:
FROM debian:stretch
RUN useradd -u 1099 user-tesla
USER user-tesla
作为一个容器用户,对改变用户的支持程度取决于容器维护者。使用-user 参数,Docker 允许您更改用户(或 docker-compose.yml 中的用户密钥)。应将进程更改到的用户的用户 id 作为参数提供。这限制了任何不必要的访问。
错误 5:用 Docker 服务 ML 模型时没有监控模型版本
数据科学家犯的一个操作错误是,在将 ML 系统部署到生产环境之前,没有跟踪对其进行的更改或更新。模型版本化帮助 ML 工程师了解模型中发生了什么变化,研究人员更新了哪些特性,以及特性是如何变化的。了解进行了哪些更改,以及在集成多个功能时,这些更改如何影响部署的速度和简易性。
模型版本化的优势
模型版本控制有助于跟踪您先前已经部署到生产环境中的不同模型文件,通过这样做,您可以实现:
-
模型谱系可追溯性:如果最近部署的模型在生产中表现不佳,您可以重新部署表现更好的模型的先前版本。
-
模型注册表:像 Neptune AI 和 MLFlow 这样的工具可以作为模型注册表,方便你记录它们的模型文件。每当您需要服务的模型时,您可以获取模型和特定的版本。
使用 Neptune.ai 进行模型版本控制并使用 Docker 进行部署
Neptune.ai 允许您跟踪您的实验,超参数值,用于特定实验运行的数据集,以及模型工件。Neptune.ai 提供了一个 python SDK,您可以在构建机器学习模型时使用它。
第一步是确保您已经安装了 neptune python 客户端。根据您的操作系统,打开您的终端并运行以下命令:
pip install neptune-client
在训练好你的模型之后,你可以在 Neptune 中注册它来追踪任何相关的元数据。首先,需要初始化一个 Neptune 模型对象。模型对象适用于保存在训练过程中由所有模型版本共享的通用元数据。
import neptune.new as neptune
model = neptune.init_model(project='<project name>’',
name="<MODEL_NAME>",
key="<MODEL>",
api_token="<token>"
)
这将生成一个到 Neptune 仪表板的 URL,在这里您可以看到您已经创建的不同模型。查看工作区。
ML model logged in Neptune.ai | Source
为了在 Neptune 中创建模型版本,您需要在同一个 Neptune 项目中注册您的模型,并且您可以在仪表板上的 models 选项卡下找到您的模型。
要在 Neptune 上创建模型版本,您需要运行以下命令:
import neptune.new as neptune
model_version = neptune.init_model_version(
model="MODEL_ID",
)
下一件事是存储任何相关的模型元数据和工件,您可以通过将它们分配给您创建的模型对象来完成。要了解如何记录模型元数据,请查看这个文档页面。
Different versions of the model are visible in the Neptune’s UI | Source
现在您可以看到您已经创建的模型的不同版本,每个模型版本的相关元数据,以及模型度量。您还可以管理每个模型版本的模型阶段。从上图来看, DOC-MODEL-1 已经部署到生产中。这样,您可以看到当前部署到生产环境中的模型版本以及该模型的相关元数据。
在构建您的机器学习模型时,您不应该将关联的元数据(如超参数、注释和配置数据)作为文件存储在 Docker 容器中。当容器被停止、销毁和替换时,您可能会丢失容器中的所有相关数据。使用 Neptune-client,您可以记录和存储每次运行的所有相关元数据。
在 Docker 与 Neptune 一起服务时如何监控模型版本
因为 Neptune 通过创建模型、创建模型版本和管理模型阶段转换来管理您的数据,所以您可以使用 Neptune 作为模型注册表来查询和下载您存储的模型。
创建一个新脚本来提供和导入必要的依赖项。您所需要做的就是指定您需要在生产中使用的模型版本。您可以通过将您的 NEPTUNE_API_TOKEN 和您的 MODEL_VERSION 作为 Docker 环境变量来运行您的 Docker 容器:
import neptune.new as neptune
import pickle,requests
api_token = os.environ['NEPTUNE_API_TOKEN']
model_version = os.environ['MODEL_VERSION']
def load_pickle(fp):
"""
Load pickle file(data, model or pipeline object).
Parameters:
fp: the file path of the pickle files.
Returns:
Loaded pickle file
"""
with open(fp, 'rb') as f:
return pickle.load(f)
def predict(data):
input_data = requests.get(data)
model_version = neptune.init_model_version(project='docker-demo',
version=model_version,
api_token=api_token
)
model_version['classifier']['pickled_model'].download()
model = load_pickle('xgb-model.pkl')
predictions = model.predict(data)
return predictions
通过创建 Docker 文件并提供 requirements.txt 文件上的依赖项列表,可以使用 Docker 将机器学习模型服务容器化。
neptune-client
sklearn==1.0.2
FROM python:3.8-slim-buster
RUN apt-get update
RUN apt-get -y install gcc
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD [ "python3", "-W ignore" ,"src/serving.py"]
要从上面的 Docker 文件构建 Docker 映像,您需要运行以下命令:
docker build --tag <image-name> .
docker run -e NEPTUNE_API_TOKEN="<YOUR_API_TOKEN>" -e MODEL_VERSION =”<YOUR_MODEL_VERSION>” <image-name>
在 Docker 容器上管理数据有几种替代方法,您可以在开发期间绑定挂载目录。这是调试代码的一个很好的选择。您可以通过运行以下命令来实现这一点:
docker run -it <image-name>:<image-version> -v /home/<user>/my_code:/code
现在,您可以同时调试和执行容器中的代码,所做的更改将反映在主机上。这让我们回到了在容器中使用相同的主机用户 ID 和组 ID 的优势。您所做的所有修改都将显示为来自主机用户。
要启动 Docker 容器,您需要运行以下命令:
docker run -d -e NEPTUNE_API_TOKEN="<YOUR_API_TOKEN>" -e MODEL_VERSION =”<YOUR_MODEL_VERSION>” <image-name>
-d 选项指定容器应该以守护模式启动。
最后的想法
可再现性和协作开发是数据科学家应该用 Docker 容器部署他们的模型的最重要的原因。 TensorFlow serving 是流行的模型服务工具之一,您可以扩展它来服务其他类型的模型和数据。此外,当使用 TensorFlow 服务机器学习模型时,您需要了解不同的客户端 API,并选择最适合您的用例。
Docker 是在生产中部署和服务模型的好工具。尽管如此,找出许多数据科学家犯的错误并避免犯类似的错误是至关重要的。
数据科学家在用 Docker 服务机器学习模型时犯的错误围绕着模型延迟、应用程序安全和监控。模型延迟和模型管理是你的 ML 系统的重要部分。一个好的 ML 应用程序应该在收到请求时返回预测。通过避免这些错误,您应该能够使用 Docker 有效地部署一个工作的 ML 系统。
参考
- Docker 数据科学家最佳实践
- 使用 gRPC 和亚马逊 SageMaker 上的 TensorFlow 服务减少计算机视觉推理延迟
- 使用 docker 编写部署 ml flow
- ML 服务水平性能监控的两大要素
- 最小化机器学习中的实时预测服务延迟
- 如何使用 gRPC API 服务于深度学习模型?
- 将机器学习模型构建到 Docker 图像中*
生产中该不该用 Jupyter 笔记本?
原文:https://web.archive.org/web/https://neptune.ai/blog/should-you-use-jupyter-notebooks-in-production
在过去的几年里,笔记本电脑已经成为数据科学和机器学习、科学研究、基因组学等领域的流行工具。
Jupyter 笔记本已经存在很长时间了。它们在机器学习中被大量使用,主要用于实验和可视化。然而,最近笔记本电脑在生产环境方面取得了进展。
在本文中,我们将讨论 Jupyter 笔记本电脑以及笔记本电脑在生产环境中的使用。
生产是什么意思?
“生产”对不同的人有不同的含义。对我们来说,它意味着一些最终用户正在使用或消费的代码。许多组织在生产中使用笔记本电脑,特别是当他们想要与其他人或非技术用户共享笔记本电脑的功能时。
通常,我们在生产中会看到两种类型的笔记本电脑:
- 静态报告笔记本
- 瞧,应用
静态报告笔记本是在造纸厂的帮助下制作的。这是一个以编程方式参数化和执行笔记本的工具。此外,它将笔记本转换为数据工作流工具,线性执行每个单元,而不必打开笔记本界面。它为每次执行生成一份报告,并收集所有笔记本的指标。
通过自动化笔记本执行过程,使用 Jupyter 笔记本作为模板来生成报告变得更加容易。
瞧,这是一个开源的成熟的 Python 仪表盘框架。用户可以将他们的笔记本电脑转换成一个独立的交互式 web 仪表板应用程序。在 Voila 的帮助下,您可以将您的工作作为 web 应用程序进行共享,并将其部署在任何云服务上,这样人们就可以看到并使用仪表板。
生产笔记本也意味着以某种自动化的方式运行笔记本。它们不再是快速迭代或试验的便笺本。您使用这些工具将一些库与一些数据结合在一起,并将其与文本和 markdown 一起呈现,以获得一些最终结果或报告。
生产的需要
笔记本电脑一直是原型开发的好帮手,但近年来,我们已经看到了不同的业务问题和技术挑战。一个突出的挑战是生产分析和实验的需求,另一个挑战是云的快速采用。
多年来,对生产和创建数据产品的需求不断增长。
Jupyter 笔记本是用来做原型和探索的,而不是用来生产的。但是这些年来,生态系统已经成长了。我们现在有一套不同的工具,JupyterLab,插件,新的内核,以及许多其他的。
这些年来的变化得益于:
- 云上的实验–许多人开始更喜欢使用云进行大型计算和更大的数据集。
- 开发人员工作流程–许多机器学习团队开始采用软件工程实践,如版本控制、git-flow、容器化等等。
- 生产分析–如果分析代码是按照最佳实践编写的,那么它应该很容易在生产中重用。
在生产中使用笔记本电脑的利与弊
优点
- 您可以使用 voilà制作独立的应用程序和仪表盘,并为最终用户提供服务。
- Jupyter 笔记本可以被安排为云上的作业。
- 你可以制作模板化的笔记本,并通过造纸厂执行它们。
缺点
- 没有正确的代码版本。
- 由于依赖于状态的执行,再现性可能是一个问题。
- 单元测试很难。
- 依赖关系管理不正确。
- 缓存是一个问题。
- 没有 CI/CD。
缺点并不是一个巨大的限制,因为有许多方法来处理它们。让我们来谈谈所有这些问题及其解决方案。
生产中的笔记本电脑问题
朱庇特对降价很在行。它使用 base64 进行图像序列化,我们可以使用它的功能,比如代码执行,所有这些都通过一个 web 界面完成。
但是它也有自己的问题:
- 版本控制和文件大小
- 模块化和代码重用
- 隐藏状态
- 测试/调试
版本控制和文件大小
Jupyter 笔记本,扩展名为。包含 Python 代码的 ipynb 不是 Python 文件。它们基本上是大型 JSON 对象。它们不太适合类似 Git 的工作流。如果我们在变更后提交笔记本,差异会变得很大,很难检查它们或者合并到主分支中。这使得在团队中使用它们具有挑战性。
如果笔记本包括图像和大量的绘图,那么文件大小会大大增加。
解决方案:
- 这是一个帮助生成不同笔记本视图的工具。
- 它从笔记本中提取输出,这可以帮助我们更容易地进行解析和比较。
模块化和代码重用
模块化是创建健壮应用程序的最重要的概念之一。
代码模块化很重要。但是对于笔记本来说,我们将大部分代码放入单元格中。在 Python 中重用代码的好方法是通过函数和类。此外,笔记本不允许适当的包装。
解决方案:
我们可以用不重复自己(干)的原则。你应该尽可能地概括和巩固你的代码。例如,函数应该只有一个任务,抽象你的逻辑而不过度工程化。但是,您应该注意创建太多的模块。
隐藏状态
Jupyter 笔记本是一个用于编写和试验代码的界面。但是朱庇特有一个弱点。你看到的并不总是你得到的。
很多人说笔记本有利于再现性。当你从头到尾以线性顺序运行代码时,这是正确的。但是我们也可以以非线性的顺序运行细胞。
Jupyter 按照您执行代码的顺序运行代码。它会记住任务,不管它们是否还在。下图说明了这一点。
左边的小方框代表隐藏状态。这是您已经执行的代码。在下一帧中,我们删除了变量,但它仍然加载在内存中。这可能会导致非常奇怪的情况。
Jupyter notebooks: What you see is not always what you get
解决方案:
- 如果您的代码行为异常,最好的第一步是重启内核。
- 用模块化和线性顺序编写代码,这对生产很有好处。
测试/调试
笔记本很难调试和测试,即使它们是线性的。那是因为两个原因。首先,当你在做一个项目,笔记本变得足够大时,有太多的东西需要跟踪(变量、函数等),很难弄清楚执行流程。
第二个原因是很难进行单元测试,因为我们不能直接将笔记本中定义的功能导入测试模块。有很多方法可以做到,但并不简单。
解决方案:
- testbook–一个单元测试框架,它将帮助我们测试笔记本内部的代码。
- nbval ,pytest-notebook–nbval 是一个非常棒的可复制笔记本库。它将笔记本电脑存储的输出与笔记本电脑生成的输出进行比较。
对于生产笔记本电脑,我们希望鼓励最佳实践,并希望避免本节中提到的许多陷阱和反模式。
在生产中拥抱笔记本电脑
当你只是在玩和做实验的时候,笔记本是不错的选择。但是,一旦你需要分享你的代码或在生产中部署机器学习系统,笔记本电脑就变得非常具有挑战性。
我们想要一款可测试、可部署、可扩展的生产笔记本。
还有,这些笔记本都是线性执行的笔记本。当我们以自动化方式运行笔记本电脑时,我们是从上到下执行一次。
在进入生产流程之前,以下是需要考虑的事项。
数据:你是怎么得到数据的?
- 你从哪里得到数据?你使用的是实时数据还是摘录数据?还是连接到数据库并获取数据?或者从 S3 桶或其他数据存储中提取?
- 数据集是已经准备好了,还是需要准备?
代码:你的代码是如何组织的?
- 就如何组织代码而言,有很多选择。比如你是把东西记在笔记本里还是导出到标准的 Python 脚本里?
- 你把你的代码分成模块还是包?或者你只是把它放在一个地方。
- 你是把 Python 叫做 Jupyter 内核,还是把它转换成标准的 Python 脚本?
- 你所有的代码都在一个文件里吗?你在使用不同的功能吗?班级?你在做包装吗?
代码在哪里运行?
- 它是运行在你的个人笔记本电脑上还是服务器上?你会在笔记本上部署 Lambda 这样的服务吗?
- 你是如何处理你的代码依赖的?你在创造环境吗?使用 Docker 容器?
这些事情很重要。例如,仅仅因为你可以在你的笔记本电脑上运行一些东西并不意味着你应该这样做。你应该总是考虑长远,为可持续性做计划。
此外,如果你更多的是在软件开发方面,考虑容器化,或者仅仅是处理你不同的环境和依赖,这是进入生产的一大步。
输出:你的输出去了哪里?
- 一旦你运行完你的代码,输出到哪里去了?你想记在笔记本里吗?可以在笔记本里吗?还是要将其导出到不同的文件中?也许你想把它导出到不同的系统?
- 您如何做出这一决定实际上会影响您的产品代码的工作流。
建议的生产流程
这里有一些模式的建议,它们可能会根据您的需求而有所不同。
数据准备
首先要考虑的是你如何处理你的数据准备工作。您可以用 Python 或您选择的任何其他语言做大量的数据准备,但是当您处理数据库或任何其他数据库中的大量数据时,以原始形式提取所有数据是没有意义的。相反,您可以在生产周期的开始运行 ETL 步骤,最终在数据库端完成繁重的工作。或者,您甚至可以使用完全独立的管道来检索数据。
版本控制和 CI
你可能还想考虑一下版本控制和持续集成。因为我们看到的是生产中的批处理工作流,其中有一些数据,你对这些数据做些什么,然后就有了结果。然后也许你会重复这个过程。这是一个非常简单的过程,你在生产中构建的很多东西远没有那么简单。尤其是当你考虑构建 API 或者提供流媒体服务的时候。在这种情况下,您必须拆分可交付成果。假设您正在训练一个模型,并且您想要按需进行预测。事情变得有点棘手了。您可能需要非常频繁地投入到开发和生产中。
通常在开发和生产之间划分工作并不容易。你可能需要在他们两个之间来来回回。像 Jenkins 或 Travis 这样的工具有助于这些过程。那么开始在代码中构建测试就变得非常重要了。这些是生产流程的一些关键部分。
容器和环境
当你进入生产阶段时,容器和环境也变得非常重要。假设您正在从命令行运行该脚本,但是您可能希望首先将其打包成 docker 容器,或者定义一个 anaconda 环境。只要确保生产工作流将具有所有相同的依赖关系,并且它将在未来更加可靠地运行,特别是如果这是您将长期使用的东西。
如果您计划自动化,您可能希望将您的依赖项与您的脚本打包在一起。
服务和部署
您可以采用不同的方式来部署笔记本电脑。如果你要为 API 构建东西或者在 AWS lambda 这样的无服务器架构上运行它们,它们有自己的一套需求。这意味着当你进入生产过程时,你需要考虑更多的复杂性。
那么,你如何做出这些选择呢?
选择生产流程时需要考虑什么
- 可靠性:Jupyter 笔记本比几年前更加稳定。尽管如此,如果您没有在生产中正确设置笔记本电脑,它还是会破坏您的代码。例如,如果您没有为每个项目单独启动笔记本服务器,这可能会中断代码的工作流。
- 可访问性:有许多应用程序和工具可以轻松共享笔记本。但是,在将输出或结果导出到文本文件、数据库、电子表格或保存的图像方面,仍然有更多的灵活性。
- 可重用性:各种各样的包和模块让我们的生活变得更加简单。复制粘贴的代码很难复制,也很难维护。
- 可解释性:笔记本使得将文档和结果放在代码旁边变得更加容易。它可以很容易地帮助我们,如果我们在未来看它,我们将知道代码做什么,这对生产是有价值的。
- 灵活性:你几乎可以用它们完成大部分数据科学工作,但它们并不是每项工作的最佳工具。
- 敏捷:我们都喜欢笔记本电脑,因为它们让数据科学变得更简单、更快速。将新产品快速投入生产通常是一件大事。
笔记本电脑在生产中的未来
- 笔记本成为应用:笔记本越来越成为应用。笔记本才是重点,它不仅仅是你获得你正在构建的任何产品的途径。相反,笔记本可能就是产品本身。随着笔记本电脑从开发环境发展到可共享的应用程序,它们本身也成为了最终产品。
- 数据科学平台:有很多数据科学平台,比如 Anaconda。他们将笔记本电脑作为其工具包的优先选择,帮助并简化部署。
- 容器的兴起:容器继续扩大其在数据科学生态系统中的地位,因此笔记本电脑正在成为生产部署的更实用工具,即使对于 Lambda 这样的无服务器架构也是如此。
- 新的 Jupyter 功能: JupyterLab 进一步模糊了生产应用和许多开发工具之间的界限——例如,用扩展代替传统的模块和包。
最后的想法
笔记本在生产中的使用一直是一个有争议的话题。许多人认为 Jupyter 笔记本只是用于实验和原型制作,并认为这是不可否认的事实,但我不完全同意他们的观点。
笔记本是处理数据的绝佳工具,尤其是在利用 papermill、airflow 或 nbdev 等开源工具时。Jupyter 允许我们在生产系统中可靠地执行笔记本。
参考文献
普拉巴特·库马尔·萨胡
机器学习工程师
阅读下一篇
ML 元数据存储:它是什么,为什么重要,以及如何实现它
13 分钟阅读|作者 Jakub Czakon |年 8 月 13 日更新
大多数找到这个页面的人都想改进他们的建模过程。
但是他们在存储和管理 ML 模型元数据方面的问题是不同的。
对一些人来说,问题在于杂乱的实验。
其他人已经将第一批模型部署到生产中,但是他们不知道这些模型是如何创建的,也不知道使用了哪些数据。
有些人已经在生产中有了许多模型,但是编排模型 A/B 测试,切换挑战者和冠军,或者触发、测试和监控再培训管道并不是很好。
如果你认为自己属于这些群体中的一员,或者介于两者之间,我可以告诉你,ML 元数据存储可以帮助你完成所有这些事情,甚至更多。
您可能需要将其连接到其他 MLOps 工具或您的 CI/CD 管道,但它将简化大多数工作流程中的模型管理。
…但是实验跟踪、模型注册、模型存储、模型目录和其他与模型相关的动物也是如此。
那么 ML 元数据存储到底是什么,它与其他模型有什么不同,它如何帮助您更自信地构建和部署模型?
这就是这篇文章的内容。
另外,如果你是那种喜欢摆弄东西来看看它们是什么的人,你可以在 Neptune ML 元数据存储库中查看这个示例项目。
但是首先…
元数据管理和什么是 ML 元数据?
在我们深入 ML 元数据存储之前,我可能应该告诉你我所说的“机器学习元数据”是什么意思。
当你做机器学习时,总会涉及到一个模型。这就是机器学习。
它可能是一个经典的监督模型,如 lightGBM 分类器、强化学习代理、贝叶斯优化算法或其他任何东西。
但它需要一些数据,通过一些数字运行,并输出一个决定。
…将它投入生产需要大量的工作。
Streamlit 指南:如何构建机器学习应用程序
原文:https://web.archive.org/web/https://neptune.ai/blog/streamlit-guide-machine-learning
构建机器学习应用程序变得越来越容易。有了 Streamlit ,你可以快速轻松地开发机器学习应用。您还可以使用 Streamlit 共享平台,只需点击几下鼠标即可部署您的应用。
使用 Streamlit 开始开发并不需要很长时间,因为您甚至不需要任何前端 web 开发经验。有了 Streamlit,你可以用 Python 编写任何东西。Streamlit 还与您可能知道的数据科学库兼容。
在本文中,我们将了解如何利用 Streamlit 开发您的机器学习应用程序。
细流安装
准备好 Python 环境后,Streamlit 的安装非常简单:
$ pip install streamlit
如果您只是尝试一下,您可以运行 hello world 示例:
$ streamlit hello
在官方回购中还有更大的例子。使用 Streamlit 时,您通常会将其作为“st”导入。
如何运行细流应用程序
假设您已经在一个名为“app.py”的文件中编写了 Streamlit 代码,您可以使用以下命令运行该应用程序:
$ streamlit run app.py
“运行 app.py”将开始在您的本地计算机上运行应用程序,并提供一个链接,您可以使用该链接在网络上访问应用程序。
Streamlit 通过提供小部件使开发 web 应用程序变得容易。让我们来看看其中的一些。
在细流中显示文本
Streamlit 有几个用于显示文本的小部件,例如:
- ` st.text '显示固定宽度和预格式化的文本
- ` st.markdown '显示降价文本
- ` st.latex '显示 latex 格式的数学表达式
- “st.write”根据给它的输入有不同的行为。例如:
- 当您将数据框传递给它时,它会将数据框打印为表格
- 当向函数传递函数时,显示有关函数的信息
- 当一个 Keras 模型传递给它时,显示该模型
st.title
以标题格式显示文本st.header
以页眉格式显示文本- ` st.code '显示代码
这里有一个例子说明了它们的作用:
import streamlit as st
st.code("st.text()", language='python')
st.text('Neptune AI Blog')
st.code("st.markdown()", language='python')
st.markdown('# This is Heading 1 in Markdown')
st.code("st.title()", language='python')
st.title('This is a title')
st.code("st.header()", language='python')
st.header('Header')
st.code("st.subheader()", language='python')
st.subheader('Sub Header')
st.code("st.latex()", language='python')
st.latex(r'''
... a + ar + a r^2 + a r^3 + cdots + a r^{n-1} =
... sum_{k=0}^{n-1} ar^k =
... a left(frac{1-r^{n}}{1-r}right)
... ''')
st.code("st.write()", language='python')
st.write('Can display many things')
在细流中显示数据
Streamlit 也可以显示数据。数据可以显示为 JSON、表或数据框。
df = pd.read_csv("data.csv")
st.dataframe(df)
st.table(df)
st.json(json_data)
在细流中显示媒体
Streamlit 还允许您向应用程序添加媒体。您可以添加音频、视频或图像。为此,您可以使用“音频”、“视频”和“图像”小部件。
from PIL import Image
icon = Image.open("icon.png")
image = Image.open("logo.png")
st.image(image)
video_file = open("video.mp4", "rb")
video_bytes = video_file.read()
st.video(video_bytes)
audio_file = open("video.wav", "rb")
audio_bytes = audio_file.read()
st.audio(audio_bytes)
在 Streamlit 中显示代码
使用' with st.echo()'命令显示其后的代码。例如,此代码将显示代码,然后显示数据框:
with st.echo():
df = pd.read_csv("data.csv")
st.dataframe(df)
在 Streamlit 中显示进度和状态
构建应用程序时,显示用户进度或某些状态总是一个好习惯。例如,加载大型数据集时,可以显示进度条。您可以在 Streamlit 中使用的一些其他状态和进度小部件包括:
st.spinner()
在执行代码块时显示临时消息st.balloons()
显示庆祝气球st.error()
显示错误消息- ` st.warning '显示警告信息
- ` st.info '显示信息性消息
- ` st.success '显示成功消息
- ` st.exception '在应用程序中传达一个异常
import time
my_bar = st.progress(0)
for percent_complete in range(100):
time.sleep(0.1)
my_bar.progress(percent_complete + 1)
st.spinner()
with st.spinner(text='In progress'):
time.sleep(5)
st.success('Done')
st.balloons()
st.error('Error message')
st.warning('Warning message')
st.info('Info message')
st.success('Success message')
e = RuntimeError('This is an exception of type RuntimeError')
st.exception(e)
在细流中显示图表
Streamlit 支持以下库中的可视化:
Streamlit 还提供了几个函数来执行基本的可视化:
- 折线图的“st.line_chart(data)”
- 面积图的“st.area_chart(data)”
st.bar_chart(data)
显示条形图st.map(data)
用于在地图上绘制数据
细流中的交互式小部件
Streamlit 还有一些小部件,让用户可以与您的应用程序进行交互,例如:
- 您可以使用选择框让用户在几个选项之间进行选择(比如,允许用户根据某个类别过滤数据)
- 多选小部件类似于选择框,但允许多重选择
- 文本区域和文本输入小部件可以用来收集用户输入
- 日期和时间输入可用于收集时间和日期输入
- 您还可以让用户使用文件上传器小部件上传文件(当您已经构建了图像分类器或对象检测模型,并且希望用户上传图像并查看结果时,这可能会很方便)
st.button('Click here')
st.checkbox('Check')
st.radio('Radio', [1,2,3])
st.selectbox('Select', [1,2,3])
st.multiselect('Multiple selection', [21,85,53])
st.slider('Slide', min_value=10, max_value=20)
st.select_slider('Slide to select', options=[1,2,3,4])
st.text_input('Enter some text')
st.number_input('Enter a number')
st.text_area('Text area')
st.date_input('Date input')
st.time_input('Time input')
st.file_uploader('File uploader')
st.color_picker('Color Picker')
细流中的缓存
在任何应用程序中,缓存服务器通过确保数据和某些功能在用户需要时可用来改善用户体验。例如,您可以让应用程序缓存数据,以减少获取数据所花费的时间。您还可以缓存返回数据的函数的结果。
@st.cache
def fetch_data():
df = pd.read_csv("data.csv")
return df
data = fetch_data()
第一次使用“@st.cache”运行函数时,结果将存储在本地缓存中。如果下次调用函数时,代码、输入参数和函数名称没有改变,Streamlit 将跳过执行并读取缓存的结果。
个性化细流应用
在 Streamlit 中,您可以个性化:
- 页面的标题
- 页面的图标
- 页面布局(居中或宽)
- 是否最初加载侧边栏
icon = Image.open("icon.png")
st.set_page_config(
page_title="Data Application",
page_icon=icon,
layout="centered",
initial_sidebar_state="auto",
)
细流配置
Streamlit 在默认配置下运行良好。您可以使用下面的命令检查您当前的配置。
$ streamlit config show
但是,有时您会遇到迫使您添加或更改默认设置的情况。有四种不同的方法。
在全局文件中
在这种情况下` ~/。编辑了适用于 macOS/Linux 的 streamlit/config.toml。在 Windows 中,将为“%userprofile%/”。例如,您可以更改运行 streamlit 的默认端口。
port = 8502
在每个项目的配置文件中
在这种情况下,配置被传递到$CWD/streamlit/config.toml
文件,其中 CWD 是运行 streamlit 的文件夹。
通过环境变量
这里,“STREAMLIT_*”环境变量通过终端传递:
$ export STREAMLIT_SERVER_PORT=8502
作为命令行上的标志
您也可以在执行 Streamlit“run”命令时使用标志来设置配置。
$ streamlit run app.py --server.port 8502
将可视化库集成到细流
让我们看看如何将 Streamlit 与常见的可视化库结合使用。
在 Streamlit 中使用 Matplotlib 和 Seaborn
在 Streamlit 中使用 Matplotlib 和 Seaborn 时,您唯一要做的事情就是定义一个图形并将其传递给' st.pyplot'。
fig = plt.figure(figsize=(12, 5))
st.pyplot(fig)
在细流中进行 plotly 集成
使用 Plotly 时,您将定义一个图形,并将其传递给' plotly _ chart` Streamlit 函数。
fig = px.scatter(
….
)
st.plotly_chart(fig)
在 Streamlit 中使用 Vega-Lite
如果您正在使用 Vega-Lite,您将使用“vega_lite_chart”函数,如下所示:
st.vega_lite_chart(
df,
{
"mark": {...},
"width": width,
"height": height,
"encoding": {
"x": {...},
"y": {...},
"size": {...},
"color": {...},
},
},
)
在细流中使用 altair
使用 Altair 时,您将使用 altair.Chart()'定义一个图表,然后使用
st.altair_chart()'显示它:
chart = (
alt.Chart(data)
.mark_bar()
.encode(x=alt.X(...)
.properties(...)
.interactive()
)
st.altair_chart(chart)
用细流可视化地图
您可以使用' st.map()'在地图上绘制数据。它是“st.pydeck_chart”的包装器,在地图上创建散点图:
map_data = df[["lat", "lon"]]
st.map(map_data)
使用此功能时,您必须使用一个个人地图框令牌。您可以在~/中设置它。streamlit/config.toml
:
[mapbox]
token = "YOUR_MAPBOX_TOKEN"
细流组件
您可能会发现 Streamlit 并不正式支持您需要的某种功能。这就是 Streamlit 组件派上用场的地方。这些是社区在 Streamlit 之上构建的一组包。例如,您可以使用 Streamlit embed code 组件来嵌入来自 Github Gist、CodePen snippets、Gitlab snippets 等的代码片段。
from streamlit_embedcode import github_gist
github_gist(gist_url)
Streamlit 还有一个 API,您可以使用它来构建您的组件。
布局您的 Streamlit 应用程序
Streamlit 允许您使用容器和列来布局应用程序。然而,这项功能仍处于测试阶段。正如您将看到的,方法有' beta_ '前缀。一旦这些特性变得稳定,你所要做的就是去掉 beta 前缀。` beta_columns '并排布置容器。
` beta_container '插入一个可用于保存多个元素的不可见容器。您可以使用的另一个函数是“beta_expander ”,它可以生成一个可以展开和折叠的多元素容器。下面是所有这些项目的一个实例。
with left_column:
st.altair_chart(chart)
with right_column:
st.altair_chart(chart)
with st.beta_container():
st.altair_chart(chart)
with st.beta_expander("Some explanation"):
st.write("This is an explanation of the two graphs..")
认证 Streamlit 应用
目前,Streamlit 中还没有对身份验证的官方支持。但是,有一些变通办法。如果您熟悉 Flask,您可以编写您的身份验证函数并将其编织到 Streamlit 中。
另一种方法是使用这个会话状态要点来添加每个会话状态以简化它。您可以使用“st.empty”小部件来初始化单个元素容器。这很有用,因为一旦用户输入正确的密码,你就可以放弃它,显示你想要的功能。
PASSWORD = config('PASSWORD')
session_state = SessionState.get(username='', password='')
if (session_state.password == PASSWORD):
your_function()
elif ( session_state.password != PASSWORD):
password_placeholder = st.empty()
password = password_placeholder.text_input("Enter Password:", type="password")
session_state.password = password
if (password and session_state.password == PASSWORD):
password_placeholder.empty()
st.success("Logged in successfully")
your_function()
elif(password and session_state.password != PASSWORD):
st.error("Wrong password")
在细流中上传和处理文件
让我们看看如何在 Streamlit 中上传和处理文件。虽然您可以上传其他文件,如 CSV 文件等,但是这个示例将集中在图像数据上。
使用 Streamlit 构建影像分类应用程序
对于这个示例,让我们使用一个预先训练的 TensorFlow Hub 模型来构建一个应用程序,该应用程序可以根据植物的叶子图像来识别疾病的类型。这是这个应用程序的一个演示。稍后,您将致力于将其投入生产。
对于这个应用程序,您需要以下软件包:
- 显然是“简化”
[pillow](/web/20221207112623/https://neptune.ai/blog/pil-image-tutorial-for-machine-learning)
用于调整用户将要上传的图像的大小- 用于显示图像的“matplotlib”
- 用于加载预训练模型的“tensorflow_hub”
- 用于扩展图像尺寸的“numpy”
import streamlit as st
from PIL import Image
import matplotlib.pyplot as plt
import tensorflow as tf
import tensorflow_hub as hub
import numpy as np
from tensorflow.keras import preprocessing
该应用程序将有两个主要功能:
- 主要功能:让用户上传图片
- 预测功能:对上传的图像进行推理
先说主要功能。如前所述,您可以使用“header”来设置应用程序标题。
在 main 函数中,您使用“st.file_uploader”让用户上传图像。您也可以在文件上传程序中指定可接受的文件类型。上传图像后,枕头上的“图像”被用来打开它。接下来,运行预测函数并显示结果。您可以在结果下方绘制图像。
st.header("Predict if plant is healthy")
def main():
file_uploaded = st.file_uploader("Choose File", type=["png","jpg","jpeg"])
if file_uploaded is not None:
image = Image.open(file_uploaded)
fig = plt.figure()
plt.imshow(image)
plt.axis("off")
predictions = predict(image)
st.write(predictions)
st.pyplot(fig)
现在来看预测函数。在这个函数中,您需要做几件事情:
- 从 TensorFlow Hub 加载预训练模型
- 将用户上传的图像调整到所需的大小(此型号需要 300 x 300 的图像)
- 将图像转换为数组,并将其标准化
- 在图像维度中包含批量大小(这只是一个图像,因此批量大小为 1)
- 运行预测并将它们映射到类名
def predict(image):
classifier_model = "https://tfhub.dev/agripredict/disease-classification/1"
IMAGE_SHAPE = (300, 300,3)
model = tf.keras.Sequential([
hub.KerasLayer(classifier_model,input_shape=IMAGE_SHAPE)])
test_image = image.resize((300,300))
test_image = preprocessing.image.img_to_array(test_image)
test_image = test_image / 255.0
test_image = np.expand_dims(test_image, axis=0)
class_names = [
'Tomato Healthy',
'Tomato Septoria Leaf Spot',
'Tomato Bacterial Spot',
'Tomato Blight',
'Cabbage Healthy',
'Tomato Spider Mite',
'Tomato Leaf Mold',
'Tomato_Yellow Leaf Curl Virus',
'Soy_Frogeye_Leaf_Spot',
'Soy_Downy_Mildew',
'Maize_Ravi_Corn_Rust',
'Maize_Healthy',
'Maize_Grey_Leaf_Spot',
'Maize_Lethal_Necrosis',
'Soy_Healthy',
'Cabbage Black Rot']
predictions = model.predict(test_image)
scores = tf.nn.softmax(predictions[0])
scores = scores.numpy()
results = {
'Tomato Healthy':0,
'Tomato Septoria Leaf Spot':0,
'Tomato Bacterial Spot':0,
'Tomato Blight':0,
'Cabbage Healthy':0,
'Tomato Spider Mite':0,
'Tomato Leaf Mold':0,
'Tomato_Yellow Leaf Curl Virus':0,
'Soy_Frogeye_Leaf_Spot':0,
'Soy_Downy_Mildew':0,
'Maize_Ravi_Corn_Rust':0,
'Maize_Healthy':0,
'Maize_Grey_Leaf_Spot':0,
'Maize_Lethal_Necrosis':0,
'Soy_Healthy':0,
'Cabbage Black Rot':0
}
result = f"{class_names[np.argmax(scores)]} with a { (100 * np.max(scores)).round(2) } percent confidence."
return result
最后一步是运行主函数。
if __name__ == "__main__":
main()
点击查看完整示例。
用 Streamlit 开发一个自然语言处理应用
再来看另一个例子:用拥抱脸构建自然语言处理 app。这个应用程序使用“拥抱脸”的“变形金刚”包,所以不要忘记通过“pip”安装它。
您可以使用该软件包执行的一些功能包括:
- 文本摘要
- 文本翻译
- 文本分类
- 问题回答
- 命名实体识别
让我们转换一些句子。
您可以从导入本例所需的两个包开始,然后创建一个选择框,让用户选择一个任务。
import streamlit as st
from transformers import pipeline
option = st.selectbox(
"Select Option",
[
"Classify Text",
"Question Answering",
"Text Generation",
"Named Entity Recognition",
"Summarization",
"Translation",
],
)
运行任何任务都需要在任务的同时初始化“管道”。下面是一个文本分类和问答的例子。为了可读性,其他的都被省略了。
if option == "Classify Text":
text = st.text_area(label="Enter a text here")
if text:
classifier = pipeline("sentiment-analysis")
answer = classifier(text)
st.write(answer)
elif option == "Question Answering":
q_a = pipeline("question-answering")
context = st.text_area(label="Enter the context")
question = st.text_area(label="Enter the question")
if context and question:
answer = q_a({"question": question, "context": context})
st.write(answer)
你可以在这里找到完整的拥抱脸示例。
部署细流应用程序
构建应用程序后,您希望将其托管在某个地方,以便用户可以访问它。让我们看看如何托管我们之前开发的植物病害应用程序。有几个选项可以做到这一点:
细流共享
Streamlit 共享是将您的 Streamlit 应用程序投入生产的最简单快捷的方式。有一个警告——它必须在 Github 上公开托管。
如果您的应用程序是公开的,那么这是一个很好的选择。然而,目前,在您可以访问 Streamlit 共享平台之前,您需要请求邀请。
收到邀请后,只需点击一个按钮,即可完成部署您的 Streamlit 应用程序。您只需选择回购,然后单击“部署”。你需要确保你把你的应用程序和你的应用程序在 requirements.txt 文件中的需求一起推送到 Github。
Heroku
要将您的 Streamlit 应用程序部署到 Heroku,您需要三个文件:
- 告知 Heroku 应用程序类型的 Procfile(在本例中是 Python)
- requirement.txt 包含应用程序所需的所有包
- 包含有关 Streamlit 配置信息的“setup.sh”文件
准备就绪后,您将继续您通常的 Heroku 部署过程。检查该关联回购的部署文件夹,查看上述文件的内容。
细流和海王星 ai
您还可以使用 Streamlit 为您的 Neptune 实验构建自定义可视化。让我们假设您有一个 LightGBM 实验,并且想要可视化运行时间与参数提升类型。当然,您可以根据需要可视化任意多的项目;这只是如何做到这一点的一个例子。
好的,首先,你需要从 Neptune 获取仪表板数据。第一步是用 API 键初始化 Neptune:
project = neptune.init(project_qualified_name='mwitiderrick/LightGBM', api_token='YOUR_API_KEY')
接下来,定义一个从 Neptune 加载数据的函数。您还可以根据实验的频率来缓存数据。在这种情况下,使用 60 秒,这意味着缓存将在 60 秒后过期。该函数返回一个数据帧,该数据帧随后存储在一个“df”变量中。
@st.cache(ttl=60)
def get_leaderboard_data():
leaderboard = project.get_leaderboard()
return leaderboard
df = get_leaderboard_data()
下一步是使用您最喜欢的可视化工具绘制数据框中的列。这里就用 Plotly 吧。
def visualize_leaderboard_data():
fig = px.pie(
df,
hole=0.2,
values="running_time",
names="parameter_boosting_type",
title="Running time vs Parameter boosting type",
color_discrete_sequence=px.colors.sequential.Blackbody,
)
st.plotly_chart(fig)
if __name__ == "__main__":
visualize_leaderboard_data()
点击查看完整示例。
用细流可视化 neptune 项目进度
有了这些背景知识,让我们看看如何使用 Streamlit 来可视化海王星实验的进展。这个例子将建立在前一个例子的基础上,因为这里仍然需要排行榜数据。
对于这个例子,你需要安装 neptunecontrib
。
之后,您可以从排行榜数据框中提取进度信息。为此,您可以使用“neptunecontrib.api.utils”中的“extract_project_progress_info”函数。
def get_progress_data():
leaderboard = project.get_leaderboard()
progress_df = extract_project_progress_info(leaderboard,
metric_colname='running_time',
time_colname='created')
return progress_df
该函数需要您选择的度量列和时间戳格式的时间列。然后,它提取与分析项目进度相关的信息。
这是进度数据帧的视觉效果:
然后,可以使用“neptunecontrib.viz.projects”中的“project_progress”功能来显示进度数据框。
该函数创建一个交互式项目进度探索图。由于它返回一个 Altair 图表,您可以使用“st.altair_chart”在您的 Streamlit 应用程序中显示它。
progress_df = get_progress_data()
def visualize_progress():
plot = project_progress(progress_df, width=400, heights=[50, 200])
st.altair_chart(plot)
点击查看完整的示例。
最后的想法
在本文中,我们探讨了如何使用 Streamlit 构建应用程序,并执行了几个示例。为了可读性,完整的例子被省略了,否则这篇文章会太长。
但是,您可以查看本报告中所有完整的示例。由于它们是 Streamlit 应用程序,您可以克隆它们并将其部署到 Streamlit 共享上进行查看。或者,您可以在本地机器上运行它们。
我等不及要看你造的东西了!
其他资源:
从电子表格切换到 Neptune.ai,以及它如何将我的模型构建过程推向下一个层次
原文:https://web.archive.org/web/https://neptune.ai/blog/switching-from-spreadsheets-to-neptune-ai
许多 ML 项目,包括 Kaggle 竞赛,都有类似的工作流程。您从一个带有基准模型的简单管道开始。
接下来,您开始合并改进:添加特性、扩充数据、调整模型……在每次迭代中,您评估您的解决方案并保留改进目标度量的更改。
*The figure illustrates the iterative improvement process in ML projects. *
Green lines indicate an improvement, red lines – a decrease in the score.
这个工作流程包括运行大量的实验。随着时间的推移,很难跟踪进展和积极的变化。
你不去想新点子,而是花时间去思考:
- “我已经试过这个东西了吗?”,
- "上周运行良好的超参数值是多少?"
你最终会多次运行相同的东西。如果你还没有跟踪你的实验,我强烈建议你开始!
在我之前的 Kaggle 项目中,我曾经依赖电子表格进行跟踪。一开始它工作得很好,但是很快我意识到用实验元数据建立和管理电子表格需要大量的额外工作。我厌倦了每次实验后手动填写模型参数和性能值,非常想切换到自动化解决方案。
[Neptune.ai]让我节省了大量时间,并专注于建模决策,这帮助我在 Kaggle 比赛中赢得了三枚奖牌。
这是我发现 Neptune.ai 的时候,这个工具让我节省了很多时间,专注于建模决策,帮助我在 Kaggle 比赛中获得了三枚奖牌。
在这篇文章中,我将分享我从电子表格切换到海王星进行实验跟踪的故事。我将描述电子表格的一些缺点,解释 Neptune 如何帮助解决这些缺点,并给出一些使用 Neptune 进行 Kaggle 的技巧。
电子表格用于实验跟踪有什么问题?
电子表格有很多用途。要跟踪实验,您可以简单地设置一个电子表格,其中包含不同的列,包含管道的相关参数和性能。与队友分享这个电子表格也很容易。
The figure illustrates ML experiment tracking with spreadsheets.
听起来很棒,对吧?
不幸的是,这有一些问题。
手工作业
做了一段时间后,你会注意到维护一个电子表格开始消耗太多时间。您需要为每个新实验手动填充一行元数据,并为每个新参数添加一列。一旦你的管道变得更加复杂,这种将会失去控制。
也很容易出现错别字,从而导致糟糕的决策。
在一次深度学习竞赛中,我在一次实验中错误地输入了学习率。看着电子表格,我得出结论,高学习率降低了准确性,并继续从事其他工作。直到几天后,我才意识到有一个错别字,糟糕的表现实际上来自于学习率低。基于一个错误的结论,我花了两天时间在错误的方向上投资。
没有实时跟踪
使用电子表格,你需要等到实验完成才能记录性能。
除了每次都要手动完成而感到沮丧之外,这也不允许您比较实验的中间结果,这有助于查看新的运行是否有希望。
当然,您可以在每个时期后登录模型性能,但是为每个实验手动进行需要更多的时间和精力。我从来没有足够的勤奋来定期做这件事,结果花费了一些计算资源。
附件限制
电子表格的另一个问题是它们只支持可以在单元格中输入的文本元数据。
如果您想要附加其他元数据,比如:
- 模型重量,
- 源代码,
- 带有模型预测的图,
- 输入数据版本?
您需要手动将这些内容存储在电子表格之外的项目文件夹中。
在实践中,在本地机器、Google Colab、Kaggle 笔记本和您的队友可能使用的其他环境之间组织和同步实验输出变得很复杂。将这样的元数据附加到跟踪电子表格看起来很有用,但是很难做到。
从电子表格切换到 Neptune
几个月前,我们的团队正在进行木薯叶疾病竞赛,并使用谷歌电子表格进行实验跟踪。挑战开始一个月后,我们的电子表格已经很混乱了:
- 有些跑步表现不佳,因为我们中的一个人忘记了登录,并且不再有结果。
- 带有损失曲线的 pdf 散布在 Google Drive 和 Kaggle 笔记本上。
- 有些参数可能输入不正确,但是恢复和仔细检查旧的脚本版本太费时间了。
基于我们的电子表格很难做出好的数据驱动型决策。
尽管只剩下四周时间,我们还是决定转到海王星。我惊讶地发现,我们实际上花了很少的力气就设置好了。简而言之,有三个主要步骤:
- 注册一个 Neptune 帐户并创建一个项目,
- 在您的环境中安装 neptune 包,
- 包括流水线中的几行,以便能够记录相关的元数据。
你可以在这里阅读更多关于开始使用 Neptune 的步骤。当然,浏览文档和熟悉平台可能需要几个小时。但是记住这只是一次性投资。在学习了一次这个工具之后,我能够自动完成大部分的跟踪,并且在接下来的 Kaggle 比赛中依靠 Neptune,只需要很少的额外努力。
查看文档,了解如何在 Neptune 组织人工智能实验,或者跳转到的示例项目并探索应用程序(不需要注册)。
海王星有什么好的?
The figure illustrates ML experiment tracking with Neptune.
更少的手工工作
与电子表格相比,Neptune 的一个关键优势是它为您节省了大量手工工作。使用 Neptune,您可以使用管道中的 API 在代码运行时自动上传和存储元数据。
import neptune.new as neptune
run = neptune.init(project='#', api_token='#')
config = {
"batch_size": 64,
"learning_rate": 0.001,
"optimizer": "Adam"
}
run["parameters"] = config
for epoch in range(100):
run["train/accuracy"].log(epoch * 0.6)
run["f1_score"] = 0.66
您不必手动将它放入结果表中,并且您也避免了打错字。因为元数据是直接从代码发送到 Neptune 的,所以无论数字有多少位,你都会得到正确的数字。
…在每次实验中登录节省的时间积累得非常快,并带来切实的收益…这给了你一个机会…更好地专注于建模决策。
这听起来可能是一件小事,但是从每次实验中节省下来的时间积累得非常快,并在项目结束时带来切实的收益。这给你一个机会,不要过多考虑实际的跟踪过程,更好地关注建模决策。在某种程度上,这就像雇用一名助理来处理一些无聊(但非常有用)的日志任务,以便您可以更专注于创造性的工作。
实时跟踪
我喜欢 Neptune 的一点是,它允许你进行实时跟踪。如果您使用的是神经网络或梯度增强等模型,这些模型在收敛之前需要进行大量迭代,那么您知道及早查看损失动态对于检测问题和比较模型非常有用。
在电子表格中跟踪中间结果太令人沮丧了。Neptune API 可以在每个时期甚至每个批次之后记录性能,这样您就可以在实验仍在运行时开始比较学习曲线。
…很多 ML 实验的结果都是否定的…用 Neptune dashboard 对比中间的图和前几个性能值,可能就足以意识到你需要停止实验,改变一些东西了。
这证明是非常有用的。正如你所料,许多 ML 实验都有负面结果(抱歉,但你花了几天时间研究的这个伟大想法实际上降低了准确性)。
这完全没问题,因为这就是 ML 的工作方式。
不好的是,您可能需要等待很长时间,直到从您的管道中获得负面信号。用 Neptune dashboard 对比中间的图和前几个性能值,可能就足以意识到你需要停止实验,改变一些东西了。
附加输出
海王星的另一个优势是能够在每次实验中附加几乎任何东西。这确实有助于将模型权重和预测等重要输出保存在一个地方,并且可以从您的实验表中轻松访问它们。
如果您和您的同事在不同的环境中工作并且必须手动上传输出以同步文件,这尤其有用。
我还喜欢将源代码附加到每次运行的能力,以确保您有产生相应结果的笔记本版本。如果您想恢复一些没有提高性能的更改,并想回到以前的最佳版本,这将非常有用。
使用 Neptune 提高 Kaggle 性能的技巧
当在 Kaggle 比赛中工作时,我可以给你一些提示来进一步改善你的跟踪体验。
在 Kaggle 笔记本或 Google Colab 中使用 Neptune
首先, Neptune 对于在使用 GPU/TPU 时有会话时间限制的 Kaggle 笔记本或 Google Colab 中工作非常有帮助。我记不清有多少次,当培训时间只比允许的 9 小时限制多几分钟时,由于笔记本电脑崩溃,我丢失了所有的实验结果!
为了避免这种情况,我强烈建议设置 Neptune,以便在每个时期后存储模型权重和损失度量。这样,即使你的 Kaggle 笔记本超时,你也会有一个检查点上传到 Neptune 服务器来继续你的训练。您还将有机会将您在会话崩溃之前的中间结果与其他实验进行比较,以判断它们的潜力。
用 Kaggle 排行榜分数更新跑步记录
第二,Kaggle 项目中需要跟踪的一个重要指标是排行榜分数。有了 Neptune,你可以自动跟踪你的交叉验证分数,但在代码中获取排行榜分数是不可能的,因为它需要你通过 Kaggle 网站提交预测。
将您的实验的排行榜分数添加到 Neptune 跟踪表的最便捷方式是使用“恢复跑步”功能。它允许你用几行代码用一个新的指标更新任何完成的实验。这个特性也有助于恢复跟踪崩溃的会话,我们在上一段中已经讨论过了。
import neptune.new as neptune
run = neptune.init(project=’Your-Kaggle-Project’, run="SUN-123")
run[“LB_score”] = 0.5
model = run["train/model_weights"].download()
下载实验元数据
最后,我知道许多 Kagglers 喜欢对他们的提交进行复杂的分析,比如估计 CV 和 LB 分数之间的相关性,或者绘制最佳分数相对于时间的动态图。
虽然在网站上做这些事情还不可行,但是 Neptune 允许你使用一个简单的 API 调用将所有实验的元数据直接下载到你的笔记本 中。这使得更深入地研究结果或导出元数据表并在外部与使用不同跟踪工具或不依赖任何实验跟踪的人共享变得容易。
import neptune.new as neptune
my_project = neptune.get_project('Your-Workspace/Your-Kaggle-Project')
sophia_df = my_project.fetch_runs_table(owner='sophia').to_pandas()
sophia_df.head()
最后的想法
在这篇文章中,我分享了我从电子表格切换到海王星来跟踪 ML 实验的故事,并强调了海王星的一些优势。我想再次强调,在基础设施工具上投入时间——无论是实验跟踪、代码版本控制,还是其他任何东西——总是一个好的决定,并且可能会随着生产力的提高而得到回报。
用电子表格跟踪实验元数据比不做任何跟踪要好得多。它将帮助您更好地看到您的进展,了解哪些修改改进了您的解决方案,并帮助您做出建模决策。用电子表格做同样会花费你额外的时间和精力。像 Neptune 这样的工具将实验跟踪提升到了一个新的水平,允许您自动记录元数据并专注于建模决策。
希望你觉得我的故事有用。祝你未来的 ML 项目好运!
表格数据二进制分类:来自 5 个 Kaggle 竞赛的所有提示和技巧
在本文中,我将讨论一些提高结构化数据二进制分类模型性能的技巧和诀窍。这些技巧是从 Kaggle 的一些顶级表格数据竞赛的解决方案中获得的。没有太多的延迟,让我们开始吧。
为了创作这篇文章,我经历了五场竞赛:
处理更大的数据集
你在任何机器学习竞赛中可能面临的一个问题是数据集的大小。如果您的数据量很大,对于 kaggle 内核和更基本的笔记本电脑来说是 3GB +,您会发现在有限的资源下很难加载和处理。这里是我发现在这种情况下有用的一些文章和内核的链接。
数据探索
数据探索总是有助于更好地理解数据并从中获得洞察力。在开始开发机器学习模型之前,顶级竞争对手总是会针对数据阅读/做大量探索性的数据分析。这有助于特征工程和数据清理。
数据准备
数据探索之后,首先要做的就是用那些洞察去准备数据。解决诸如类别不平衡、分类数据编码等问题。让我们看看用来做这件事的方法。
特征工程
接下来,您可以查看这些顶级 kaggle 比赛中使用的最受欢迎的功能和功能工程技术。特征工程部分因领域的不同而不同。
特征选择
根据数据生成许多要素后,您需要决定在模型中使用哪些要素,以获得模型的最大性能。这一步还包括识别每个特征对模型的影响。让我们看看一些最流行的特征选择方法。
建模
在手工制作和选择您的特征之后,您应该选择正确的机器学习算法来进行您的预测。这些是结构化数据分类挑战中一些最常用的 ML 模型的集合。
超参数调谐
估价
选择一个合适的验证策略是非常重要的,以避免模型在私有测试集中的巨大变动或不良性能。
传统的 80:20 分割在很多情况下并不适用。在大多数情况下,交叉验证比传统的单一训练验证分割更有效,以评估模型性能。
k 折叠交叉验证有不同的变体,如应相应选择的 k 折叠组。
其他训练技巧
全体
如果你在竞争环境中,没有集合,你就不会在排行榜上名列前茅。选择合适的组装/堆叠方法对于充分发挥模型的性能非常重要。
让我们来看看一些在 kaggle 比赛中使用的流行组合技术:
最后的想法
在本文中,您看到了许多流行且有效的方法来提高表格数据二进制分类模型的性能。希望你会发现它们对你的项目有用。
沙胡尔 ES
数据科学家,非常熟悉机器学习、NLP 和音频处理领域。他是 Kaggle 大师,也喜欢做开源。
阅读下一篇
ML 实验跟踪:它是什么,为什么重要,以及如何实施
10 分钟阅读|作者 Jakub Czakon |年 7 月 14 日更新
10 mins read | Author Jakub Czakon | Updated July 14th, 2021
我来分享一个听了太多次的故事。
“…我们和我的团队正在开发一个 ML 模型,我们进行了大量的实验,并获得了有希望的结果…
…不幸的是,我们无法确切地说出哪种性能最好,因为我们忘记了保存一些模型参数和数据集版本…
…几周后,我们甚至不确定我们实际尝试了什么,我们需要重新运行几乎所有的东西"
不幸的 ML 研究员。
事实是,当你开发 ML 模型时,你会进行大量的实验。
这些实验可能:
使用不同的模型和模型超参数
- 使用不同的培训或评估数据,
- 运行不同的代码(包括您想要快速测试的这个小变化)
- 在不同的环境中运行相同的代码(不知道安装的是 PyTorch 还是 Tensorflow 版本)
- 因此,它们可以产生完全不同的评估指标。
跟踪所有这些信息会很快变得非常困难。特别是如果你想组织和比较这些实验,并且确信你知道哪个设置产生了最好的结果。
这就是 ML 实验跟踪的用武之地。
This is where ML experiment tracking comes in.
深入研究 TensorBoard:示例教程
原文:https://web.archive.org/web/https://neptune.ai/blog/tensorboard-tutorial
有一个常见的商业说法是你不能改进你没有测量的东西。机器学习也是如此。有各种工具可以衡量深度学习模型的性能:Neptune AI、MLflow、Weights and Biases、Guild AI,仅举几个例子。在这篇文章中,我们将重点介绍 TensorFlow 的开源可视化工具包 TensorBoard 。
该工具使您能够跟踪各种指标,如训练集或验证集的准确性和日志丢失。正如我们将在这篇文章中看到的,TensorBoard 提供了几个我们可以在机器学习实验中使用的工具。这个工具也很容易使用。
以下是我们将在本文中涉及的一些内容:
- 在 TensorBoard 中可视化图像
- 在张量板上检查模型重量和偏差
- 可视化模型的架构
- 将混淆矩阵的图像发送到 TensorBoard
- 剖析您的应用程序,以便查看其性能,以及
- 使用张量板与 Keras 、 PyTorch 和 XGBoost
我们开始吧。
如何使用 TensorBoard
本节将重点帮助您了解如何在您的机器学习工作流程中使用 TensorBoard。
如何安装张量板****
在开始使用 TensorBoard 之前,您必须通过 pip 或 conda 安装它
pip install tensorboard
conda install -c conda-forge tensorboard
使用 TensorBoard 搭配 Jupyter 笔记本和 Google Colab
安装 TensorBoard 后,您现在可以将它加载到您的笔记本中。请注意,你可以在 Jupyter 笔记本或谷歌的 Colab 中使用它。
%load_ext tensorboard
一旦完成,你必须设置一个日志目录。这是 TensorBoard 存放所有日志的地方。它将从这些日志中读取数据,以显示各种可视化效果。
log_folder = 'logs'
如果你想重新加载 TensorBoard 扩展,下面的命令将会变魔术——没有双关语。
%reload_ext tensorboard
您可能希望清除当前日志,以便可以将新日志写入该文件夹。你可以通过在 Google Colab 上运行这个命令来实现
!rm -rf /logs/
在 Jupyter 笔记本上
rm -rf logs
如果您正在运行多个实验,您可能想要存储所有日志,以便您可以比较它们的结果。这可以通过创建带有时间戳的日志来实现。为此,请使用下面的命令:
import datetime
log_folder = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
如何运行 TensorBoard
运行 Tensorboard 只需要一行代码。在本节中,您将看到如何做到这一点。
现在让我们看一个例子,在这个例子中,您将使用 TensorBoard 来可视化模型指标。为此,您需要构建一个简单的图像分类模型。
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train, X_test = X_train / 255.0, X_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')])
model.compile(optimizer='sgd',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
接下来,加载 TensorBoard 笔记本扩展并创建一个指向日志文件夹的变量。
%load_ext tensorboard
log_folder = 'logs'
如何使用 TensorBoard 回调
下一步是在模型的拟合方法中指定 TensorBoard 回调。为了做到这一点,你首先要导入 TensorBoard 回调。
该回调负责记录事件,例如激活直方图、 度量概要图、剖析图和训练图可视化图。
from tensorflow.keras.callbacks import TensorBoard
准备就绪后,您现在可以创建 TensorBoard 回调并使用 log_dir 指定日志目录。TensorBoard 回调还接受其他参数:
- histogram_freq 是计算模型层的激活和权重直方图的频率。将此项设置为 0 意味着将不计算直方图。为了实现这一点,您必须设置验证数据或验证分割。
- write_graph 指示图形是否将在 TensorBoard 中可视化
- write_images 设置为 true 时,模型权重在 TensorBoard 中显示为图像
- update_freq 决定如何将损失和指标写入 TensorBoard。如果设置为整数,比如 100,则每 100 批记录一次损耗和指标。当设置为批处理时,损失和指标在每次批处理后设置。当设置为纪元时,它们在每个纪元后被写入
- profile_batch 决定要评测哪些批次。默认情况下,会分析第二批。例如,您也可以设置为从 5 到 10,以分析批次 5 到 10,即 profile_batch='5,10 '。将 profile_batch 设置为 0 将禁用分析。
- embeddings_freq 嵌入层可视化的频率。将此项设置为零意味着嵌入不会被可视化
callbacks = [TensorBoard(log_dir=log_folder,
histogram_freq=1,
write_graph=True,
write_images=True,
update_freq='epoch',
profile_batch=2,
embeddings_freq=1)]
下一项是拟合模型并传入回调。
model.fit(X_train, y_train,
epochs=10,
validation_split=0.2,
callbacks=callbacks)
如何启动冲浪板
如果您通过 pip 安装了 TensorBoard,您可以通过命令行启动它
tensorboard -- logdir=log
在笔记本电脑上,您可以使用以下方式启动它:
%tensorboard -- logdir={log_folder}
TensorBoard 也可通过以下网址通过浏览器获得
http://localhost:6006
远程运行 TensorBoard】
在远程服务器上工作时,可以使用 SSH 隧道将远程服务器的端口转发到本地机器的端口(在本例中是端口 6006)。这看起来是这样的:
ssh -L 6006:127.0.0.1:6006 your_user_name@my_server_ip
有了它,你就可以用正常的方式运行 TensorBoard 了。
请记住,您在 tensorboard 命令中指定的端口(默认为 6006)应该与 ssh 隧道中的端口相同。
tensorboard --logdir=/tmp --port=6006
注意:如果您使用默认端口 6006,您可以丢弃–port = 6006。您将能够在本地计算机上看到 TensorBoard,但 TensorBoard 实际上是在远程服务器上运行的。
张量板仪表板
现在让我们看看 TensorBoard 上的各个选项卡。
张量板标量
标量 选项卡显示了各时期的损耗和指标变化。它可用于跟踪其他标量值,如学习率和训练速度。
张量板图像
这个仪表盘有显示重量的 图像 。调整滑块显示不同时期的权重。
张量图
此选项卡显示模型的层。您可以使用它来检查模型的架构是否符合预期。
张量板分布
“分布”选项卡显示张量的分布。例如,在下面的密集层中,您可以看到每个时期的权重和偏差分布。
张量板直方图
直方图显示了张量随时间的分布。例如,查看下面的 dense_1,您可以看到偏差在每个时期的分布。
使用 TensorBoard 投影仪
您可以使用 TensorBoard 的投影仪来可视化任何矢量表示,例如文字嵌入和图像 。
单词嵌入是捕获它们的语义关系的单词的数字表示。投影仪帮助你看到这些图像。你可以在非活动下拉列表中找到它。
使用 TensorBoard 绘制训练示例
您可以使用 TensorFlow 图像摘要 API 来可视化训练图像。这在处理像这样的图像数据时特别有用。
现在,为图像创建一个新的日志目录,如下所示。
logdir = "logs/train_data/"
下一步是创建一个文件写入器,并将其指向这个目录。
file_writer = tf.summary.create_file_writer(logdir)
在本文开始时(在“如何运行 TensorBoard”一节中),您指定图像形状为 28 x 28。在将图像写入 TensorBoard 之前对其进行整形时,这是非常重要的信息。您还需要将通道指定为 1,因为图像是灰度的。然后,使用 file_write 将图像写入 TensorBoard。
在本例中,索引为 10 到 30 的图像将被写入 TensorBoard。
import numpy as np
with file_writer.as_default():
images = np.reshape(X_train[10:30], (-1, 28, 28, 1))
tf.summary.image("20 Digits", images, max_outputs=25, step=0)
在 TensorBoard 中可视化图像
除了可视化图像张量,您还可以在 TensorBoard 中可视化实际图像。为了说明这一点,您需要使用 Matplotlib 将 MNIST 张量转换为图像。之后,您需要使用' tf.summary.image '在 Tensorboard 中绘制图像。
从清除日志开始,或者您可以使用带有时间戳的日志文件夹。之后,指定日志目录并创建一个“tf.summary.create_file_writer ”,用于将图像写入 TensorBoard
!rm -rf logs
import io
import matplotlib.pyplot as plt
class_names = ['Zero','One','Two','Three','Four','Five','Six','Seven','Eight','Nine']
logdir = "logs/plots/"
file_writer = tf.summary.create_file_writer(logdir)
接下来,创建一个包含图像的网格。在这种情况下,网格将容纳 36 位数字。
def image_grid():
figure = plt.figure(figsize=(12,8))
for i in range(36):
plt.subplot(6, 6, i + 1)
plt.xlabel(class_names[y_train[i]])
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(X_train[i], cmap=plt.cm.coolwarm)
return figure
figure = image_grid()
现在将这些数字转换成一个单独的图像,在张量板上可视化。
def plot_to_image(figure):
buf = io.BytesIO()
plt.savefig(buf, format='png')
plt.close(figure)
buf.seek(0)
digit = tf.image.decode_png(buf.getvalue(), channels=4)
digit = tf.expand_dims(digit, 0)
return digit
下一步是使用 writer 和‘plot _ to _ image’在 TensorBoard 上显示图像。
with file_writer.as_default():
tf.summary.image("MNIST Digits", plot_to_image(figure), step=0)
%tensorboard -- logdir logs/plots
将混淆矩阵记录到张量板上
使用相同的示例,您可以记录所有时期的混淆矩阵。首先,定义一个函数,该函数将返回一个 Matplotlib 图,其中保存着混淆矩阵。
import itertools
def plot_confusion_matrix(cm, class_names):
figure = plt.figure(figsize=(8, 8))
plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Accent)
plt.title("Confusion matrix")
plt.colorbar()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names, rotation=45)
plt.yticks(tick_marks, class_names)
cm = np.around(cm.astype('float') / cm.sum(axis=1)[:, np.newaxis], decimals=2)
threshold = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
color = "white" if cm[i, j] > threshold else "black"
plt.text(j, i, cm[i, j], horizontalalignment="center", color=color)
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
return figure
接下来,清除以前的日志,为混淆矩阵定义日志目录,并创建一个写入日志文件夹的 writer 变量。
!rm -rf logs
logdir = "logs"
file_writer_cm = tf.summary.create_file_writer(logdir)
接下来的步骤是创建一个函数,该函数将根据模型进行预测,并将混淆矩阵记录为图像。
之后,使用“文件写入器 cm”将混淆矩阵写入日志目录。
from tensorflow import keras
from sklearn import metrics
def log_confusion_matrix(epoch, logs):
predictions = model.predict(X_test)
predictions = np.argmax(predictions, axis=1)
cm = metrics.confusion_matrix(y_test, predictions)
figure = plot_confusion_matrix(cm, class_names=class_names)
cm_image = plot_to_image(figure)
with file_writer_cm.as_default():
tf.summary.image("Confusion Matrix", cm_image, step=epoch)
接下来是 TensorBoard 回调和LambdaCallback
的定义。
LambdaCallback
将记录每个时期的混淆矩阵。最后使用这两个回调函数来拟合模型。
由于您之前已经拟合了模型,建议您重新启动运行时,并确保只拟合一次模型。
callbacks = [
TensorBoard(log_dir=log_folder,
histogram_freq=1,
write_graph=True,
write_images=True,
update_freq='epoch',
profile_batch=2,
embeddings_freq=1),
keras.callbacks.LambdaCallback(on_epoch_end=log_confusion_matrix)
]
model.fit(X_train, y_train,
epochs=10,
validation_split=0.2,
callbacks=callbacks)
现在运行 TensorBoard 并检查图像选项卡上的混淆矩阵。
%tensorboard -- logdir logs
用张量板调整超参数
你可以用 TensorBoard 做的另一件很酷的事情是用它来可视化参数优化。以同一个 MNIST 为例,您可以尝试调整模型的超参数(手动或使用自动超参数优化)并在 TensorBoard 中可视化它们。
这是你期望得到的最终结果。仪表板位于参数选项卡下。
为此,您必须清除以前的日志并导入 hparams 插件。
!rm -rvf logs
logdir = "logs"
from tensorboard.plugins.hparams import api as hp
下一步是定义要调整的参数。在这种情况下,密集层中的单位、辍学率和优化器函数将被调整。
HP_NUM_UNITS = hp.HParam('num_units', hp.Discrete([300, 200,512]))
HP_DROPOUT = hp.HParam('dropout', hp.RealInterval(0.1,0.5))
HP_OPTIMIZER = hp.HParam('optimizer', hp.Discrete(['adam', 'sgd', 'rmsprop']))
接下来,使用 tf.summary.create_file_writer 定义存储日志的文件夹。
METRIC_ACCURACY = 'accuracy'
with tf.summary.create_file_writer('logs/hparam_tuning').as_default():
hp.hparams_config(
hparams=[HP_NUM_UNITS, HP_DROPOUT, HP_OPTIMIZER],
metrics=[hp.Metric(METRIC_ACCURACY, display_name='Accuracy')],)
这样一来,您需要像以前一样定义模型。唯一的区别是,第一个密集层的神经元数量、辍学率和优化器函数不会被硬编码。
这将在稍后运行实验时使用的函数中完成。
def create_model(hparams):
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(hparams[HP_NUM_UNITS], activation='relu'),
tf.keras.layers.Dropout(hparams[HP_DROPOUT]),
tf.keras.layers.Dense(10, activation='softmax')])
model.compile(optimizer=hparams[HP_OPTIMIZER],
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(X_train, y_train, epochs=5)
loss, accuracy = model.evaluate(X_test, y_test)
return accuracy
您需要创建的下一个函数将使用前面定义的参数运行上面的函数。然后它会记录精确度。
def experiment(experiment_dir, hparams):
with tf.summary.create_file_writer(experiment_dir).as_default():
hp.hparams(hparams)
accuracy = create_model(hparams)
tf.summary.scalar(METRIC_ACCURACY, accuracy, step=1)
之后,您需要对上面定义的所有参数组合运行该函数。每个实验都将存储在自己的文件夹中。
experiment_no = 0
for num_units in HP_NUM_UNITS.domain.values:
for dropout_rate in (HP_DROPOUT.domain.min_value, HP_DROPOUT.domain.max_value):
for optimizer in HP_OPTIMIZER.domain.values:
hparams = {
HP_NUM_UNITS: num_units,
HP_DROPOUT: dropout_rate,
HP_OPTIMIZER: optimizer,}
experiment_name = f'Experiment {experiment_no}'
print(f'Starting Experiment: {experiment_name}')
print({h.name: hparams[h] for h in hparams})
experiment('logs/hparam_tuning/' + experiment_name, hparams)
experiment_no += 1
最后,运行 TensorBoard 来查看您在本节开始时看到的可视化效果。
%tensorboard -- logdir logs/hparam_tuning
在 HPARAMS 选项卡上,****表格视图显示所有的模型运行及其相应的准确性、丢失率和密集层神经元。平行坐标视图将每次运行显示为一条穿过每个超参数和精度指标轴的直线。
单击其中一个将显示试验和超参数,如下所示。
散点图视图将超参数和指标之间的比较可视化。
TensorFlow Profiler
您还可以使用 分析器 跟踪 TensorFlow 模型的性能。分析对于理解 TensorFlow 操作的硬件资源消耗至关重要。在此之前,您必须安装 profiler 插件。
pip install -U tensorboard-plugin-profile
安装完成后,它将出现在非活动下拉列表中。这是侧写器上众多视觉效果之一的快照。
现在您唯一要做的事情就是定义一个回调,并包含将要分析的批处理。
之后,当你符合模型时,你通过回调。别忘了给 TensorBoard 打电话,这样你就可以看到可视化效果。
callbacks = [tf.keras.callbacks.TensorBoard(log_dir=log_folder,
profile_batch='10,20')]
model.fit(X_train, y_train,
epochs=10,
validation_split=0.2,
callbacks=callbacks)
%tensorboard --logdir=logs
概览页面
档案选项卡上的概览页面显示了该型号性能的高级概览。从下图可以看出,性能总结显示了:
- 编译内核所花费的时间,
- 读取数据所花费的时间,
- 启动内核所花费的时间,
- 生产产出所花费的时间,
- 设备上的计算时间,以及
- 主机计算时间
步进时间图显示了所有已采样步进的器件步进时间。图表上的不同颜色描述了花费时间的不同类别:
- 红色部分对应于器件在等待输入数据时空闲的步进时间。
- 绿色的部分显示设备实际工作的时间。
不过,在概览页面上,您可以看到运行时间最长的 TensorFlow 操作。
运行环境显示使用的主机数量、设备类型、设备内核数量等环境信息。在这种情况下,您可以看到在 Colab 的运行时,有一台主机的 GPU 包含一个内核。
从这一页你可以看到的另一件事是优化模型性能的建议。
跟踪查看器
跟踪查看器可用于了解输入管道中的性能瓶颈。它显示了在评测期间 GPU 或 CPU 上发生的不同事件的时间线。
纵轴显示各种事件组,横轴显示事件轨迹。在下图中,我使用了快捷键 w 来放大事件。要缩小,使用键盘快捷键 S 。 A 和 D 可分别用于向左和向右移动。
您可以单击单个事件来进一步分析它。使用浮动工具栏上的光标或使用键盘快捷键 1 。
下图显示了对显示开始和墙壁持续时间的SparseSoftmaxCrossEntropyWithLogits事件(一批数据的损失计算)的分析结果。
您还可以通过按住 Ctrl 键并选择它们来检查各种事件的摘要。
输入管道分析器
输入管道分析器可用于分析模型输入管道中的低效问题。
该功能显示输入流水线分析的摘要、设备端分析细节和主机端分析细节。
输入管道分析总结显示了总输入管道。它是通知应用程序是否被输入绑定以及绑定多少的部分。
器件侧分析细节显示器件步进时间和器件等待输入数据的时间。
主机端分析显示主机端的分析,如主机上输入处理时间的分解。
在输入流水线分析器上,你还可以看到关于单个输入操作、花费的时间及其类别的统计。以下是各列所代表的内容:
- 输入操作 —输入操作的张量流操作名
- Count —分析期间操作执行的实例数
- 总时间 —在上述每个实例上花费的累计时间总和
- 总时间% —是花费在操作上的总时间占花费在输入处理上的总时间的百分比
- 总自我时间 —在每个实例上花费的自我时间的累计总和。
- 总自我时间% —总自我时间占输入处理总时间的百分比
- 类别 —输入操作的处理类别
张量流统计
该仪表板显示了在主机上执行的每个 TensorFlow 操作的性能。
- 第一张 饼状图展示了主机上每个操作自执行时间的分布。
- 第二个显示主机上每个操作类型的自执行时间分布。
- 第第三显示设备上每个操作的自执行时间分布。
- 第四个显示设备上每个操作类型的自执行时间分布。
饼图下方的表格显示了张量流操作。每个行都是一个操作。栏显示了每个操作的各个方面。您可以使用任何列对表进行过滤。
在上表下方,您可以看到按类型分组的各种张量流操作。
GPU 内核统计数据
该页面显示了性能统计数据以及每个 GPU 加速内核的原始操作。
内核统计数据下面是一个表格,其中显示了内核和各种操作花费的时间。
内存配置文件页面
该页面显示了在分析期间内存的利用率。它包含以下几个部分:内存配置文件摘要、内存时间线图和内存细分表。
- 内存配置文件摘要显示 TensorFlow 应用程序的内存配置文件摘要。
- 内存时间线图显示了内存使用量(以 gib 为单位)和碎片百分比(以毫秒为单位)与时间的关系图。这
- 内存细分表显示在性能分析间隔内存使用率最高的点的活动内存分配。
如何在 TensorBoard 上启用调试
您也可以将调试信息转储到您的 TensorBoard。要做到这一点,你必须启用调试——它仍然处于实验模式
tf.debugging.experimental.enable_dump_debug_info(
logdir,
tensor_debug_mode="FULL_HEALTH",
circular_buffer_size=-1)
仪表板可以在调试器 V2 的非活动下拉菜单下查看。
调试器 V2 GUI 有告警、 Python 执行时间线、图形执行、和图形结构。警报部分显示程序的异常情况。Python 执行时间线部分显示了操作和图形的热切执行的历史。
图形执行显示所有在图形中计算过的浮点型张量的历史。图形结构部分包含源代码和堆栈跟踪,它们是在您与 GUI 交互时填充的。
将 TensorBoard 与深度学习框架结合使用
你不局限于单独使用 TensorFlow 的 TensorBoard。您还可以将它与其他框架一起使用,如 Keras、PyTorch 和 XGBoost 等。
py torch 中的张量板
您首先通过定义一个 writer 来指向您想要写入日志的文件夹。
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter(log_dir='logs')
下一步是使用 summary writer 添加您希望在 TensorBoard 上看到的项目。
from torch.utils.tensorboard import SummaryWriter
import numpy as np
for n_iter in range(100):
writer.add_scalar('Loss/train', np.random.random(), n_iter)
writer.add_scalar('Loss/test', np.random.random(), n_iter)
writer.add_scalar('Accuracy/train', np.random.random(), n_iter)
writer.add_scalar('Accuracy/test', np.random.random(), n_iter)
喀拉斯的 tensor board
由于 TensorFlow 使用 Keras 作为官方高级 API,TensorBoard 的实现类似于它在 TensorFlow 中的实现。我们已经看到了如何做到这一点:
创建回拨:
from tensorflow.keras.callbacks import TensorBoard
tb_callback = TensorBoard(log_dir=log_folder,...)
将它传递给“model.fit ”:
model.fit(X_train, y_train,
epochs=10,
validation_split=0.2,
callbacks=[tb_callback])
XG boost 中的 tensor board
使用 XGBoost 时,还可以将事件记录到 TensorBoard。为此需要使用 tensorboardX 包。例如,要记录度量和损失,您可以使用“SummaryWriter”和日志标量。
from tensorboardX import SummaryWriter
def TensorBoardCallback():
writer = SummaryWriter()
def callback(env):
for k, v in env.evaluation_result_list:
writer.add_scalar(k, v, env.iteration)
return callback
xgb.train(callbacks=[TensorBoardCallback()])
Tensorboard.dev
Tensorboard.dev 是一个托管的 Tensorboard 平台,可以轻松托管、跟踪和共享 ML 实验。它允许人们发布他们的 TensorBoard 实验,排除故障以及与团队成员合作。一旦你有了一个 TensorBoard 实验,把它上传到 TensorBoard.dev 是非常简单的。
tensorboard dev upload --logdir logs
--name "(optional) My latest experiment"
--description "(optional) Simple comparison of several hyperparameters"
一旦你运行这个命令,你会得到一个提示,要求你用谷歌账户授权 TensorBoard.dev。一旦你这样做,你会得到一个验证码,你将进入认证。
这将产生一个独特的张量板。开发链接给你。这里有一个这样的链接的例子。如你所见,这非常类似于在本地主机上查看 TensorBoard,只是现在你是在线查看。
一旦你在这里着陆,你就可以和冲浪板互动,就像你在这个作品的前几部分一样。
需要注意的是,这个 TensorBoard 对互联网上的每个人都是可见的,所以请确保您没有上传任何敏感数据。
使用 TensorBoard 的限制
正如你所看到的,TensorBoard 给了你很多很棒的功能。也就是说,使用 TensorBoard 并非一帆风顺。
它有一些限制:
- 难以在需要协作的团队环境中使用
- 没有用户和工作区管理:大型组织通常需要这些功能
- 您不能执行数据和模型版本化来跟踪各种实验
- 无法将其扩展到百万次运行;运行太多次,你会开始遇到 UI 问题
- 用于记录图像的界面有点笨拙
- 您不能记录和可视化其他数据格式,如音频/视频或自定义 html
最后的想法
这篇文章中有几件事我们没有涉及到。值得一提的两个有趣特性是:
- 公平指标仪表板(目前处于测试阶段)。它允许计算二进制和多类分类器的公平性度量。
- What-If 工具 (WIT)使你能够探索和研究经过训练的机器学习模型。这是使用不需要任何代码的可视化界面来完成的。
希望你在这里学到的一切能帮助你监控和调试你的训练,并最终建立更好的模型!
TensorFlow 对象检测 API:培训、评估和部署的最佳实践
本文是学习 TensorFlow 对象检测及其 API 的端到端工作流系列的第二部分。在第一篇文章中,您学习了如何从头开始创建一个定制的对象检测器,但是仍然有很多事情需要您的注意才能真正精通。
我们将探索与我们已经经历过的模型创建过程同样重要的主题。以下是我们将要回答的一些问题:
- 如何评估我的模型,并对其性能进行评估?
- 我可以使用哪些工具来跟踪模型性能并比较多个实验的结果?
- 如何导出我的模型以在推理模式中使用它?
- 有没有一种方法可以进一步提升模型性能?
模型评估
很想知道我们的模特在野外会有怎样的表现。为了了解我们的模型在真实数据上的表现,我们需要做一些事情:
选择一组评估指标,
- 获取单独的数据集来验证和测试您的模型,
- 使用一组适当的参数启动评估流程。
- 评估,步骤 1:指标
让我们从一组评估指标开始。你可能还记得在第一篇文章中,我们安装了一个名为 COCO API 的依赖项。
我们需要它来访问一组用于对象检测的有用指标:平均精度和召回率。如果您不记得这些指标,您一定要阅读一下。计算机视觉工程师经常使用它们。
要使用平均精度和召回率,您应该配置 pipeline.config 文件。eval_config
块中的metrics_set
参数应设置为“coco_detection_metrics”。
这是该参数的默认选项,因此您很可能已经有了它。检查您的eval_config
行是否像这样:
To use mean average precision and recall, you should configure your pipeline.config file. The metrics_set
parameter in the eval_config
block should be set to “coco_detection_metrics”.
当我们使用metrics_set
中设置的“coco_detection_metrics”时,以下是可用的内容:
This is a place within the pipeline.config file where we specify metrics we want to use for evaluation
您对这组指标的选择不限于精度和召回率。TensorFlow API 中还有一些其他选项。花点时间选择您想要的选项来跟踪您的特定模型。
Mean average precision (mAP) shown as a plot after we enable it for model validation. Note that mAP is calculated for different IOU values. Average recall is not shown but also becomes available.
评估,步骤 2:数据集
如果您仔细遵循了第一篇文章中的说明,那么数据集准备应该听起来很熟悉。
作为提醒,我们准备了模型评估需要的两个文件(validation.record 和 test.record)放在 Tensorflow/workspace/data 中。如果您的数据文件夹中的文件数量与下面的相同,那么您就可以开始下一步了!
以防你错过了。将文件记录在您的数据文件夹中,但仍想进行评估,以下是一些需要考虑的事项:
validation.record
需要在培训期间评估您的模型;
需要使用test.record
来检查已经训练过的最终模型的性能。
Tensorflow/
└─ cocoapi/
└─ ...
└─ workspace/
└─ data/
├─ train.record
├─ validation.record
├─ test.record
机器学习的传统方法需要 3 个独立的集合:用于训练、评估和测试。我强烈建议你遵循它,但是如果你有充分的理由避免这些,那么就只准备这些。记录与你的目的相关的文件。
- 评估,步骤 3:流程启动
如前所述,您可以在两个不同的时间戳进行模型评估:在训练期间或者在模型被训练之后。
培训期间的模型评估称为验证。TensorFlow 对象检测 API 的验证作业被视为一个独立的过程,应与培训作业并行启动。
并行启动时,验证作业将等待训练作业在模型训练过程中生成的检查点,并逐个使用这些检查点在单独的数据集上验证模型。
validation.record
表示模型用于验证的独立数据集。eval_confi
块中的metrics_set
参数定义了一组评估指标。
为了启动验证作业,打开一个新的终端窗口,导航到 Tensorflow/workspace/,并启动以下命令:
其中:
<配置文件的路径> 是用于训练您想要评估的模型的配置文件的路径。应该是来自的配置文件。/models/ <文件夹中放着您选择的车型> /v1/,
<模型目录路径> 是评估作业写入日志(评估结果)的目录路径。我的建议是使用以下路径:。/models/ <文件夹中放着您选择的型号> /v1/。鉴于此,您的评估结果将放在培训日志旁边,
python model_main_tf2.py
--pipeline_config_path=<path to your config file>
--model_dir=<path to a directory with your model>
--checkpoint_dir=<path to a directory with checkpoints>
--num_workers=<int for the number of workers to use>
--sample_1_of_n_eval_examples=1
<带有检查点的目录路径> 是您的培训作业写入检查点的目录。也应该是下面的:。/models/ <文件夹中放着您选择的车型> /v1/,
- < int 表示要使用的工作线程数量> 如果您有一个多核 CPU,该参数定义了可用于评估作业的内核数量。请记住,您的培训作业已经占用了您为其分配的内核数量。考虑到这一点,适当地设置用于评估的内核数量。
- 在执行上述命令后,您的评估工作将立即开始。与我们对培训作业所做的类似,如果您想要在 GPU 上进行评估,请在启动评估作业之前通过执行以下命令来启用它:
- 其中
定义了您想要使用的 GPU 的订单编号。请注意,订单计数从零开始。对于 CPU 上的验证,使用-1,如下面的命令所示: - 模型性能跟踪
模型性能跟踪简介
export CUDA_VISIBLE_DEVICES= <GPU number>
在机器学习中,对于给定的任务,很难事先告诉你哪个模型会给你最好的结果。开发人员通常使用试错法来测试多个假设。
export CUDA_VISIBLE_DEVICES=-1
您可以检查不同的模型架构,或者坚持使用一种架构,但尝试不同的参数设置。每一个配置都应该通过单独的培训工作启动来测试,因此跟踪和比较多个实验的工具就派上了用场。
TensorFlow API 使用 tfevents 格式写入与模型性能相关的日志和优化器状态。您需要跟踪的 TF 事件主要有两个:与培训相关的和与评估相关的。
培训 tfevent 仅限于损失和学习率跟踪。它记录每个时期的步数,所以你可以看到你的训练工作进行得有多快。
当您为模型启动训练作业时,会自动记录此类实验元数据。日志存储在 tensor flow/workspace/models/
请注意,您可以看到组件级别分解的损失(分别针对分类和本地化),也可以看到总计值。当您面临一个问题,并且想要检查您的模型以找到问题的根本原因时,它变得特别有用。
如前所述,我们还可以跟踪学习率如何随时间变化,以及你的训练工作每秒完成多少步。
与培训 tfevent 类似,评估 tfevent 也包含一个具有相同细分的损失部分。除此之外,它还跟踪我们在之前谈到的 评估指标。
跟踪工具
Training tf-event (logs) visualized using Tensorboard
有多种工具可以帮助您跟踪和比较与模型相关的日志。TensorFlow API 中已经内置的是 Tensorboard 。
Tensorboard 比较好用。为了启动您的 TensorBoard,请打开一个终端窗口,导航至 tensor flow/workspace/models/<文件夹,其中包含您选择的型号> /目录。
在那里,使用以下命令启动 Tensorboard:
您可以向–logdir 传递一个文件夹路径,该文件夹包含多个实验的日志(例如:Tensorflow/workspace/models/)。
您还可以通过提供特定实验的日志路径来限制可访问的数据(例如:tensor flow/workspace/models//)。
在任何情况下,Tensorboard 都会自动找到所有包含日志的目录,并使用这些数据来构建绘图。你可以在官方指南中了解更多 Tensorboard 可以做的事情。
Neptune.ai 是一款可供你考虑的替代追踪工具。与 Tensorboard 相比,它提供了更广泛的功能。以下是我发现特别方便的:
Neptune 完全兼容 tfevent (TensorBoard)格式。你所需要做的就是在你的终端窗口中启动一个单命令行,
tensorboard --logdir=<path to a directory with your experiment / experiments>
您可以只导入那些您认为重要的实验。它允许您过滤掉那些您想要从比较中排除的启动。考虑到这一点,您最终的仪表板将保持整洁,不会因为过多的实验而过载,
你的作品(笔记本、实验结果)可以通过一种非常简单的方式与他人分享(只需发送一个链接),
你可以追踪任何你想追踪的东西。当您还想要跟踪模型参数和/或它的工件时,它变得特别方便。您的硬件利用率也是可见的,所有这些都可以在一个位置获得。
模型导出
- 好了,你的模型现在已经训练好了,你对它的性能很满意,现在想用它来进行推理。让我告诉你怎么做。这将是一个两步走的过程:
- 1.第一步–模型导出。为此,您应该:
- 将导出脚本从 tensor flow/models/research/object _ detection/exporter _ main _ v2 . py
复制粘贴到
tensor flow/workspace/exporter _ main _ v2 . py, - 在 Tensorflow/workspace 中,创建一个名为 exported_models 的新文件夹。这将是您放置所有导出模型的地方,
在 tensor flow/workspace/exported _ models 中创建一个子文件夹,用于存储特定的导出模型。将此文件夹命名为您在 tensor flow/workspace/models/中使用的名称,
打开一个新的终端窗口,将 Tensorflow/workspace 作为当前工作目录,启动以下命令:
其中:
- <配置文件路径> 是您想要导出的模式的配置文件路径。应该是来自的配置文件。/models/ <文件夹中有您选择的型号> /v1/
- <训练模型目录路径> 是训练过程中放置模型检查点的目录路径。也应该是下面的:。/models/ <文件夹中有您选择的型号> /v1/
- <导出模型的目录路径> 是保存导出模型的路径。应该是:。/exported_models/ <文件夹中有您选择的车型>
2.第二步——在推理模式下运行您的模型。
python exporter_main_v2.py
--pipeline_config_path=<path to a config file>
--trained_checkpoint_dir=<path to a directory with your trained model>
--output_directory=<path to a directory where to export a model>
--input_type=image_tensor
为了方便你,我做了一个 jupyter 笔记本,里面有你做推理所需的所有代码。你的目标是检查它,并为 TODO s 填充所有缺失的值
- 在 jupyter 笔记本中,你会发现两个可以根据你的目标使用的推理函数:
inference_with_plot
和inference_as_raw_output
。 - 当您只想将模型输出可视化为绘制在输入图像对象上的边界框时,使用
inference_with_plot
。在这种情况下,函数输出将是如下图所示的图形: - 或者,您可以使用
inference_as_raw_output
而不是绘图,返回一个包含 3 个键的字典:
在detection_classes
键下,有一个包含所有被检测到的类的数组。类作为整数返回,
使用detection_scores
(数组)查看每个检测类的检测置信度得分。
最后,detection_boxes
是一个数组,包含每个检测到的对象的边界框的坐标。每个盒子有以下格式-【y1,x1,y2,x2】。左上角定义为 y1 和 x1 ,而右下角定义为 y2 和 x2 。
模型改进的机会
- 在这一部分,我想和你分享一些很酷的方法,可以提升你的模型性能。我在这里的目标是向您提供 TensorFlow API 及其武库中可用内容的高级概述。我也会给你一个实现这些方法的直觉。我们开始吧!
- 图像预处理
- 你应该知道你给你的模型输入了什么。图像预处理在任何计算机视觉应用中都是至关重要的一步。
TensorFlow 在幕后执行图像标准化步骤(如果您喜欢,也可以称为标准化步骤,标准化和标准化之间的差异在这里有很好的描述),我们不能影响它。但是我们可以控制如何调整图像的大小,以及将其调整到哪个尺寸。
为了更好地理解 TensorFlow API 是如何做到这一点的,让我们来看一下 EfficientDet D-1 模型的 pipeline.config 代码片段:
EfficientDet D-1 负责调整图像大小的默认方法是keep_aspect_ratio_resizer
。
这个方法,如上面例子中的min_dimension
和max_dimension
参数所定义的,将把一个图像的较小边调整到 640 像素。另一边将被调整大小,以保持原来的长宽比。
存储为 true 将允许填充,这可能需要在调整大小时保持原始纵横比。
查看这个调整大小方法的输出很有趣。如果您的原始图像是矩形的,那么在调整大小时,您可能会得到一个被过度填充的图像。如果您通过自己选择的追踪工具进行检查,您的最终图像可能是这样的:
使用 keep_aspect_ratio_resizer 方法时可能会出现的填充图像示例。|图片来源:Jakub CIE likT3【如何进行图像分割和对象检测的数据探索(我不得不艰难地学习的东西】
我们绝对不想给我们的网络提供这样的图片。显然,它有太多无意义的信息被编码为黑色像素。我们怎样才能让它变得更好?我们可以使用不同的调整大小方法。
*Code snippet within pipeline.config file that defines image resizing step in EfficientDet D-1 model. *
在第一篇文章中,您了解了如何以高级方式进行参数调整。使用这种方法,您会发现 TensorFlow API 中还有其他调整大小的方法。
我们可能特别感兴趣的一个是fixed_shape_resizer
,它将图像整形为由height
和width
参数定义的给定大小的矩形。
看看它在 pipeline.config 文件中的实现:
上图中有两件事值得你注意。
首先,从一种方法切换到另一种方法是多么容易:几行修改,没什么复杂的。
其次,您现在可以完全控制您的输入图像。尝试调整大小的方法和输入图像的大小有助于保留解决对象检测任务所必需的功能。
请记住,你的输入图像越小,网络就越难检测到物体!当您想要检测比原始图像尺寸小的对象时,这就成了一个问题。
图像放大
让我们继续探索与图像相关的方法,还有另一个改进的机会——图像增强。
Fixed_shape_resizer method implementation for EfficientDet D-1
图像增强是一种对输入图像随机应用变换的方法,会在训练数据集中引入额外的方差。反过来,额外的方差导致更好的模型泛化,这对于良好的性能是必不可少的。
TensorFlow API 为我们提供了多种选择!让我们看一下 pipeline.config 文件,以了解增强的默认选项:
正如我们所看到的,有两个默认选项。您必须仔细检查您的问题域,并决定哪些增强选项与您的特定任务相关。
例如,如果你期望所有的输入图像总是在一个特定的方向,random_horizontal_flip
将会伤害而不是帮助,因为它随机翻转输入图像。扔掉它,因为它与你的案子无关。将类似的逻辑应用于选择其他增强选项。
您可能对 TensorFlow API 中可用的其他选项感兴趣。为了方便起见,这里有一个到脚本的链接,其中列出了所有的方法并做了很好的描述。
值得一提的是,在任何会影响图像方向的变换(旋转、翻转、缩放等)的情况下,TensorFlow 不仅变换图像本身,还变换边界框的坐标。你没有必要为标签转化做任何事情。
锚点生成
图像中对象的边框形状是什么样的?它们大多是方形的还是长方形的?边界框有没有一个特定的长宽比能最好地捕捉到你感兴趣的对象?
Default image augmentation options for EfficientDet D-1.
您应该问自己这些问题,以使您的对象检测能够找到最适合您的对象的盒子。
这对于单阶段对象检测器(如 EfficientDet)变得特别方便,因为预设的锚集用于提出建议。
我们可以将锚点改为自定义数据集中对象的最佳形状吗?肯定的,是的!以下是 pipeline.config 文件中负责锚点设置的代码行:
List of options for image augmentation available in TensorFlow API
有一个我们最感兴趣的参数,那就是aspect_ratios
。它定义了矩形锚边的比率。
让我们以aspect_ratios: 2.0
为例,这样你就能对它的工作原理有所了解。2.0
值表示锚点的高度=其宽度的 2 倍。这种锚几何图形将最适合那些水平拉伸两倍于其垂直尺寸的对象。
如果我们的物体被水平拉伸 10 倍会怎样?让我们设置一个锚来捕捉这些物体:aspect_ratios: 10.0
将完成这项工作。
相反,如果您的对象在垂直维度上被拉伸,请将aspect_ratios
设置在 0 和 1 之间。介于 0 和 1 之间的值将定义锚的宽度比其高度小多少。你可以设置你想要多少锚。只要你觉得有意义就继续加aspect_ratios
就好。
你甚至可以事先做好功课,为你的机器学习项目经历一个探索阶段,分析你的物体的几何形状。就我个人而言,我喜欢创建两个图来观察高宽比和高宽比的分布。这有助于我了解哪种纵横比最适合我的模型锚:
后处理和防止过拟合
Lines within pipeline.config futile that are responsible for a set of model’s anchors
与预处理类似,后处理步骤也会影响模型的行为。物体探测器往往会产生数百个建议。大部分不会被录取,会被一些标准淘汰。
TensorFlow 允许您定义一组标准来控制模型建议。让我们看看 pipeline.config 文件中的代码片段:
有一种叫做非最大抑制 (NMS)的方法用于 EfficientDet D-1 内的处理。该方法本身已被证明对绝大多数计算机视觉任务是成功的,所以我不会探索任何替代方法。
这里重要的是与batch_non_max_suppression
方法一起使用的一组参数。这些参数很重要,可能会对模型的最终性能产生很大影响。让我们看看他们如何做到这一点:
score_threshold
是一个参数,它定义了分类的最小置信度得分,应达到该得分,这样建议才不会被过滤掉。在默认配置中,它被设置为一个接近 0 的值,这意味着所有建议都被接受。这听起来像是一个合理的值吗?我的个人实践表明,最小过滤最终会给出更好的结果。消除那些最有可能不正确的建议导致更稳定的训练、更好的收敛和更低的过度拟合的机会。考虑将该参数至少设置为 0.2。当您的跟踪工具显示您的网络在评估集上的建议很差,或者/和您的评估指标没有随着时间的推移而改进时,这一点尤其重要;
Example for width-to-height ratio distribution that I plot when looking for the best shape for my anchors.
iou_threshold
是一个参数,让 NMS 对重叠的盒子进行适当的过滤。如果您的模型为对象生成重叠的框,请考虑降低该分数。如果你的图像上有密集分布的物体,考虑增加这个参数;
从名字上来看很简单。你希望每个类有多少个对象?几个,十几个,还是几百个?这个参数将帮助你的网络了解这一点。我在这里的建议是将这个值设置为等于单个类的最大对象数乘以你拥有的 anchors 数(number of aspect_ratios
);
max_total_detections
应设置为max_detections_per_class
*班级总数。将max_number_of_boxes
设置为与max_total_detections
相同的数字也很重要。max_number_of_boxes
位于 pipeline.config 文件的train_config
部分。
Piece of code (default values are kept) that defines post-processing parameters for
EfficientDet D-1
给定上述设置参数的方法,您将让您的模型知道预期有多少对象以及它们的密度是多少。这将导致更好的最终性能,也将降低过度拟合的机会。
既然我们已经谈到过拟合问题,我也将分享另一个消除它的常用工具——dropout层,它是这样实现的:
- Dropout 实现强制您的模型寻找那些最能描述您想要检测的对象的特征。它有助于提高泛化能力。更好的泛化有助于模型更好地抵抗过度拟合。
- 最后但并非最不重要的一点是,您可以通过先进的学习速率控制方法来避免过度拟合并获得更好的模型性能。具体来说,我们感兴趣的是如何推动我们的训练工作,为给定的损失函数找到真正的全局最小值。
- 学习率计划对这一目标至关重要。让我们看看 TensorFlow 在 EfficientDet D-1 的默认配置中为学习率调度提供了什么:
- 余弦学习率衰减是一个伟大的调度程序,允许你的学习率在整个训练时间内增长和减少。
为什么这种调度方法可以给你更好的模型性能和防止过度拟合?出于几个原因:
以较低的学习率开始可以让您在训练模型的最开始就控制渐变。我们不希望它们变得非常大,所以原始模型的权重不会发生剧烈变化。请记住,我们在自定义数据集上微调我们的模型,没有必要改变神经网络已经学习的低级特征。对于我们的模型,它们很可能保持不变;
Dropout with probability = 0.2 set for box_predictor net within EfficientDet D-1
学习率的初始增加将有助于你的模型有足够的能力不陷入局部最小值,并能够摆脱它;
Illustration for a dropout layer (with probability = 0.5) implemented within a simple neural net. | Source: primo.ai
随着时间的推移,平滑的学习率衰减将导致稳定的训练,并且还将让您的模型找到最适合您的数据的可能。
你现在确信学习率计划很重要吗?如果是,下面是正确配置的方法:
Learning rate scheduler implementation in a default configuration for EfficientDet D-1
learning_rate_base
是您的模型开始训练的初始学习率;
total_steps
定义你的模型将要训练的总步数。请记住,在培训工作的最后阶段,学习率计划程序将使学习率值接近于零;
warmup_learning_rate
是学习率开始下降前将达到的最大值;warmup_steps
定义将学习率从learning_rate_base
提高到warmup_learning_rate
的步数- 损失函数操作
您可能遇到过这样的情况:您的模型在定位对象方面表现出色,但在分类方面表现很差。相比之下,分类可能非常好,但对象定位可能更好。
- 当对象检测器被包括到服务流水线中时,这变得尤其重要,其中每个服务都是机器学习模型。在这种情况下,每个模型的输出都应该足够好,以便后续模型将其作为输入进行消化。
- 请这样想:您试图检测图像上的所有文本片段,以便将每个文本片段传递给下一个 OCR 模型。如果您的模型检测到所有文本,但有时由于本地化不佳而截断文本,该怎么办?
- 这对于后面的 OCR 来说是个问题,因为它无法读取整个文本。OCR 将能够处理一段剪切的文本,但它的输出对我们来说将毫无意义。我们怎么能这样做呢?
- TensorFlow 为您提供了一个选项,通过损失函数中的权重来确定对您来说重要的事情的优先级。看看这段代码:
您可以更改这些参数的值,为对您最重要的内容赋予更高的权重。或者,您可以降低总损失中特定零件的值。这两种方法最终完成了相同的工作。
如果你决定改变权重值,我个人的建议是从 0.1-0.3 之间的值开始增加权重。更大的值可能会导致严重的不平衡。
结论
您对 TensorFlow API 的熟练程度已达到一个新的水平。你现在可以完全控制你的实验,并且知道如何评估和比较它们,所以只有最好的才会投入生产!
您还熟悉如何将您的模型转移到生产中。您知道如何导出模型,并拥有执行推理所需的所有代码。
希望您现在已经有了进一步改进模型的机会的感觉。试试看。当您看到您的指标增长时,您会喜欢它的。对你的假设设定要有创造性,不要害怕尝试新的想法。也许你的下一个配置会为我们所有人树立一个标杆!谁知道呢?
Initial set up for weights within loss function. Equal values for classification and localization.
下次见!
If you decide to play around with weight values, my personal recommendation would be to start incrementing weights by values around between [0.1-0.3]. Bigger values might lead to a significant imbalance.
Conclusions
Your proficiency with the TensorFlow API has reached a new level. You’re now in full control of your experiments and know how to evaluate and compare them, so only the best will go to production!
You’re also familiar with how to move your model to production. You know how to export a model and have all code necessary to perform inference.
Hopefully, you now have a feeling of what your opportunities are for further model improvement. Give it a shot. You’ll love it when you see your metrics grow. Be creative with your hypothesis setting, and don’t be afraid to try new ideas. Maybe your next configuration will set a benchmark for all of us! Who knows?
See you next time!
文本分类:来自 5 场 Kaggle 比赛的所有提示和技巧
在本文中,我将讨论一些提高文本分类模型性能的技巧和诀窍。这些技巧是从 Kaggle 的一些顶级 NLP 竞赛的解决方案中获得的。
也就是说,我经历了:
发现了很多好主意。
没有太多的延迟,让我们开始吧。
处理更大的数据集
你在任何机器学习竞赛中可能面临的一个问题是数据集的大小。如果您的数据量很大,对于 Kaggle 内核和更基本的笔记本电脑来说是 3GB +,您会发现在有限的资源下很难加载和处理。这里是我发现在这种情况下有用的一些文章和内核的链接。
小型数据集和外部数据
但是,如果数据集很小,我们该怎么办呢?让我们来看看解决这种情况的一些技巧。
提高任何机器学习模型的性能的一种方法是使用一些包含一些影响谓词变量的变量的外部数据框架。
让我们看看一些外部数据集。
数据探索和获得洞察力
数据探索总是有助于更好地理解数据并从中获得洞察力。在开始开发机器学习模型之前,顶级竞争对手总是会针对数据阅读/做大量探索性的数据分析。这有助于特征工程和数据清理。
数据清理
数据清理是任何自然语言处理问题的重要组成部分之一。文本数据总是需要一些预处理和清理,然后才能以合适的形式表示出来。
文本表示
在我们将文本数据输入到神经网络或 ML 模型之前,文本输入需要以合适的格式表示。这些表示在很大程度上决定了模型的性能。
语境嵌入模型
建模
模型架构
选择正确的架构对于开发适当的机器学习模型非常重要,像 LSTMs、GRUs 这样的序列对序列模型在 NLP 问题中表现良好,总是值得尝试。堆叠两层 LSTM/GRU 网络是一种常见的方法。
损失函数
为你的神经网络模型选择一个合适的损失函数,通过允许它在表面上很好地优化,确实增强了你的模型的性能。
您可以尝试不同的损失函数,甚至编写一个与您的问题相匹配的自定义损失函数。一些流行的损失函数有
优化者
回调方法
在训练时,回调对于监控模型的性能总是有用的,并触发一些可以增强模型性能的必要操作。
评估和交叉验证
选择一个合适的验证策略是非常重要的,以避免模型在私有测试集中的巨大变动或不良性能。
传统的 80:20 分割在很多情况下并不适用。在大多数情况下,交叉验证比传统的单一训练验证分割更有效,以评估模型性能。
k 折叠交叉验证有不同的变体,如应相应选择的 k 折叠组。
运行时技巧
您可以执行一些技巧来减少运行时间,并在运行时提高模型性能。
模型组装
如果你在竞争环境中,没有集合,你就不会在排行榜上名列前茅。选择合适的组装/堆叠方法对于充分发挥模型的性能非常重要。
让我们来看看一些在 Kaggle 比赛中使用的流行组合技术:
最后的想法
在本文中,您看到了许多改进 NLP 分类模型性能的流行而有效的方法。希望你会发现它们对你的项目有用。
沙胡尔 ES
数据科学家,非常熟悉机器学习、NLP 和音频处理领域。他是 Kaggle 大师,也喜欢做开源。
阅读下一篇
自然语言处理的探索性数据分析:Python 工具完全指南
11 分钟阅读|作者 Shahul ES |年 7 月 14 日更新
探索性数据分析是任何机器学习工作流中最重要的部分之一,自然语言处理也不例外。但是你应该选择哪些工具来高效地探索和可视化文本数据呢?
在这篇文章中,我们将讨论和实现几乎所有的主要技术,你可以用它们来理解你的文本数据,并给你一个完成工作的 Python 工具的完整之旅。
开始之前:数据集和依赖项
在本文中,我们将使用来自 Kaggle 的百万新闻标题数据集。如果您想一步一步地进行分析,您可能需要安装以下库:
pip install \
pandas matplotlib numpy \
nltk seaborn sklearn gensim pyldavis \
wordcloud textblob spacy textstat
现在,我们可以看看数据。
news= pd.read_csv('data/abcnews-date-text.csv',nrows=10000)
news.head(3)
数据集只包含两列,发布日期和新闻标题。
为了简单起见,我将探索这个数据集中的前 10000 行。因为标题是按发布日期排序的,所以实际上从 2003 年 2 月 19 日到 2003 年 4 月 7 日有两个月。
好了,我想我们已经准备好开始我们的数据探索了!
合成数据相对于真实数据的优势
原文:https://web.archive.org/web/https://neptune.ai/blog/the-advantages-of-synthetic-data-over-real-data
人工智能在 2020 年风靡一时,但许多有抱负的技术专家遇到了一个问题:训练数据。
对于大多数人工智能/机器学习应用程序来说,拥有一个大型的精选数据集是必要的。获取这些数据通常是一项挑战。
你不仅要从现实世界中收集数据,还必须为你的模型做注释和准备。对于学生、小型研究团队和早期创业公司来说,训练数据是一个需要克服的重大障碍。
这就是合成训练数据派上用场的地方。合成数据是模仿真实数据的假数据。
对于某些 ML 应用程序,创建合成数据比收集和注释真实数据更容易。
这有三个主要原因:
- 您可以根据需要生成任意多的合成数据,
- 您可以生成在现实中收集起来可能很危险的数据,
- 合成数据被自动注释。
让我们进入细节。
什么是合成数据?
机器学习的一个基本规律是,你需要大量的数据。您需要的数据量从一万个示例到数十亿个数据点不等。
对于自动驾驶汽车等复杂应用来说,收集大量高质量的训练数据是一项挑战。幸运的是,合成数据最适合大型数据集。
了解真实训练数据最重要的一点是,你以线性方式收集数据。
在大多数情况下,每个额外的训练示例与前一个示例花费的收集时间大致相同。合成数据就不是这样了。
合成数据的特别之处在于它可以被大量生成。一万个训练例子?没问题。一百万个例子?没问题。十亿?嗯,你可能需要一个更强大的 GPU,但这是可行的。
相比之下,十亿个真实的训练例子可能根本不可能。
为什么使用合成数据(合成数据与真实数据)
收集真实数据可能很危险。例如,自动驾驶汽车 AI 不能完全依赖真实数据。从事这项技术的公司,如 Alphabet 的 Waymo,必须进行模拟。
想想看:为了训练一个人工智能避免车祸,你需要关于车祸的训练数据。但是收集真实车祸的大型数据集成本太高,风险太大,所以你只能模拟车祸。
真实数据可不多见
危险收集的原则也适用于很少能收集到的数据。
例如,如果你的人工智能算法正在寻找一个“大海捞针”,合成数据可以生成足够数量的罕见事件,以准确训练一个人工智能模型。
考虑到这一点,人工智能的一些最有益的用途集中在“罕见”的事件上。由于这些问题的性质,很难收集罕见的事件。
回到汽车的例子,车祸不会经常发生,你也很少有机会收集这些数据。使用合成数据,您可以选择要模拟多少次碰撞。
合成数据完全由用户控制
合成数据模拟中的一切都是可以控制的。是福是祸。
这可能是一个诅咒,因为有些情况下,合成数据会遗漏真实数据集中可以捕捉到的边缘情况。
对于这些应用程序,您可能希望利用迁移学习在您的合成数据集里加入一些真实数据。
但这也是一件幸事——事件频率、对象分布等等都取决于你。
合成数据被完美注释
合成数据的另一个优势是完美的注释。您再也不需要手动收集数据。
可以为场景中的每个对象自动生成各种注释。这听起来没什么大不了的,但这是合成数据比真实数据便宜的一个重要原因。
你不用为数据标签付费。相反,合成数据的主要成本是建立模拟的前期投资。在此之后,生成数据比真实数据的成本效率要高得多。
合成数据可以是多光谱的
自动驾驶汽车公司已经意识到注释不可见数据具有挑战性。这就是为什么他们是合成数据的最大支持者。
Alphabet 的 Waymo 和通用汽车的 Cruise 等公司使用模拟来生成合成激光雷达数据。由于这些数据是合成的,所以基本事实是已知的,并且数据被自动标记。
同样,合成数据非常适合红外或雷达计算机视觉应用,在这些应用中,人类无法完全解读图像。
哪里可以应用合成数据?
合成数据有很多用途。目前,合成数据有两大领域:计算机视觉和表格数据。
计算机视觉是指人工智能算法用于检测图像中的对象和模式。相机越来越多地用于许多行业,从汽车到无人机,再到医学。
合成数据结合更先进的人工智能意味着计算机视觉的技术才刚刚起步。
合成数据的另一个用途是在表格数据中。表格合成数据引起了研究人员的极大关注。麻省理工学院的研究人员最近发布了合成数据库,这是一个基于电子表格的合成数据开源工具集。
健康和隐私数据尤其适合采用合成方法。这些领域受到隐私法的高度限制。合成数据可以帮助研究人员在不侵犯人们隐私的情况下获得他们需要的数据。
随着新工具和教程的发布,合成数据将能够在人工智能的发展中发挥越来越大的作用。
结论
高质量的数据、危险的真实数据收集和完美的注释是使用合成数据的三大原因。
如果你想检查一个真实的产品,我和我的合作伙伴为虚幻引擎发布了一个免费插件,使其更容易生成合成数据。
还有很多其他工具可以生成合成数据。无论你选择哪一种,合成数据都可能是获得训练数据的一种很好的方式,并可能成为下一代人工智能的巨大推动力。
If you want to check out a real product, my partners and I released a free plugin for Unreal Engine to make it easier to generate synthetic data.
There are a lot of other tools to generate synthetic data. Whichever you choose, synthetic data can be a great way to get training data, and will likely be a big moving force for the next generation of AI.
最好的 Comet.ml 替代品
原文:https://web.archive.org/web/https://neptune.ai/blog/the-best-comet-ml-alternatives
Comet 是从事机器学习实验的人最常用的工具之一。它是一个自托管和基于云的元机器学习平台,允许数据科学家和团队跟踪、比较、解释和优化实验和模型。
Comet 提供了一个 Python 库,允许数据科学家将他们的代码与 Comet 集成,并开始在应用程序中跟踪工作。由于它提供了云托管和自托管两种方式,你应该能够管理你整个团队的 ML 实验。
Comet 正在向 ML 的更多自动化方法靠拢,增加了预测提前停止(该软件的免费版本不提供)并宣布了神经架构搜索(将在未来推出)。
彗星最显著的一些特征包括:
- 支持团队共享工作,并提供用户管理
- 集成了许多 ML 库
- 让您比较实验——代码、超参数、度量、预测、依赖性、系统度量等等
- 让您用专用于图像、音频、文本和表格数据的模块来可视化样本
而且虽然 Comet 是一个很棒的解决方案,但是没有一个工具是对所有人都完美的(至少我没听说过这样的工具)。
可能会遗漏一些对你和你的团队至关重要的点。可能是:
- 缺少某些功能:比如无法记录“细节图/散景图”
- 您的个人偏好:比如 UI 中的图表视图,或者比较表,或者其他特定于您的用例的特性;
- 定价:也许你更喜欢基于使用定价模式的工具,或者是开源的;
- 可扩展性:可能在可扩展性方面没有满足你的需求,你的团队每个月运行的实验越来越多。
无论如何,还有许多其他工具可用,为了帮助您找到合适的工具,我们列出了最佳的 Comet 替代工具。
Neptune 是 MLOps 的一个元数据存储库,主要关注实验跟踪和模型注册。它是为进行大量实验的研究和生产团队而构建的。它的主要目标是让他们的生活更轻松,让他们做自己真正想做的事情,也就是 ML(而不是手动将数字插入 excel 表)。
因此,数据科学家和 ML 工程师可以使用 Neptune 在一个地方记录、存储、组织、显示、比较和查询所有建模元数据。这包括元数据,如模型度量和参数、模型检查点、图像、视频、音频文件、数据版本、交互式可视化等。
稍后在团队中共享这些被跟踪的元数据也很容易。Neptune 允许您为项目创建工作区,管理用户访问,并与内部和外部的利益相关者共享仪表板的链接。
海王星–主要特征:
- Neptune 允许您以任何想要的结构记录和显示模型元数据。无论是模型的嵌套参数结构,训练和验证度量的不同子文件夹,还是打包模型或生产工件的单独空间。怎么组织就看你自己了。
- 然后,您可以创建定制的仪表板以一种首选的方式组合不同的元数据类型。
- Neptune 的定价是基于使用的。整个团队的固定月费相对较低(不管有多少人),但除此之外,你只需为你使用的东西付费。
- 该应用程序可以处理数千次运行,并且在您越来越多地使用它时不会变慢。它随着你的团队和项目的规模而扩展。
如果你想看海王星在行动,检查这个现场笔记本或这个例子项目(不需要注册),只是玩它。
海王星 vs 彗星
Neptune 和 Comet ML 都在相同的市场空间中运营,但是,它们的功能主张因技术和非技术产品而异。
这两种工具都是专有软件,提供托管和内部设置,有不同的定价选项可供选择。Neptune 提供了一个基于使用的定价模型,不同于其他固定的产品,在这个模型中,你可以根据你正在使用的实验和功能的数量来调整价格。另一方面,Comet 有严格的一维定价结构。
在功能上也有一些不同。例如,如果你正在寻找一个工具,可以让你跟踪你的数据集版本,那么海王星是你的选择,因为彗星缺乏这个功能。
Example dashboard in TensorBoard | Source
TensorBoard 是 TensorFlow 的可视化工具包,可让您分析模型训练运行。它是开源的,为机器学习模型的可视化和调试提供了一套工具。
它允许您可视化机器学习实验的各个方面,如度量、可视化模型图、查看张量直方图等。
如果你正在寻找一个彗星的替代品来可视化你的实验并深入研究它们,这是一个很好的工具。
tensor board—主要特点** 😗*
- 您可以在一个地方记录整个团队的实验
- 跟踪不是基于 TensorFlow 或深度学习的实验
- 备份整个实验历史
- 为项目干系人快速制作报告
- 将跟踪系统与技术堆栈中的其他工具相集成
- 可用的可视化功能
张量板 vs 彗星
如果您正在寻找一个工具来可视化您的项目的 ML 模型元数据,那么 TensorBoard 可能是您的正确选择。它是开源的,它的可视化非常强大,但它运行在本地服务器上,所以你不能和你的团队成员分享,不像 Comet。
然而,TensorBoard 为您提供了很多可视化数据的技术选项,这是 Comet 所没有的。例如,它提供了对度量图表的平滑,并提供了一个步骤(时期)滑块来比较不同时期的结果。
Example dashboard in Guild AI | Source
Guild AI 是机器学习工程师和研究人员用来运行、跟踪和比较实验的开源工具。通过 Guild AI,您可以利用您的实验结果来建立更深层次的直觉,解决问题,并自动化模型架构和超参数优化。
Guild AI 是跨平台和框架独立的——你可以使用任何库用任何语言训练和捕捉实验。公会人工智能运行你未修改的代码,所以你可以使用你想要的库。该工具不需要数据库或其他基础设施来管理实验,简单易用。
帮会 AI-主要特色** 😗*
- 实验跟踪:任何模型训练,任何编程语言
- 自动化机器学习过程
- 与任何语言和库集成
- 远程培训和备份的可能性
- 你可以复制你的结果或重现实验
公会 AI vs 彗星
如果你正在寻找一个不需要你改变代码的开源实验跟踪工具,那么 Guild AI 将是一个不错的选择。如上所述,您将拥有可视化、超参数调整和许多其他功能。然而,由于它是开源的,它错过了面向可伸缩性和团队工作的关键特性。
如果你是一个团队,你的首要任务是分享结果和扩展到大量的实验,那么不幸的是公会人工智能不适合它。
Example dashboard in MLflow | Source
MLflow 是一个开源平台,有助于管理整个机器学习生命周期,包括实验、再现性、部署和中央模型注册。
MLflow 适合个人和任何规模的团队。
该工具与库无关。你可以用任何机器学习库和任何编程语言来使用它
MLflow 包括四个主要功能:
- ml flow Tracking——一个 API 和 UI,用于在运行机器学习代码时记录参数、代码版本、指标和工件,并在以后可视化和比较结果
- MLflow 项目——将 ML 代码打包成可重用、可复制的形式,以便与其他数据科学家共享或转移到生产中
- MLflow 模型——从不同的 ML 库中管理和部署模型到各种模型服务和推理平台
- MLflow Model Registry–一个中央模型存储库,用于协作管理 ml flow 模型的整个生命周期,包括模型版本控制、阶段转换和注释
MLflow vs 彗星
MLflow 是 Comet 的另一个开源替代方案。它提供了与 Comet 相同的功能,并且在大数据上也能很好地扩展。如果您的团队使用 Apache Spark,那么 MLflow 将是一个很好的选择,因为它可以很好地与 Spark 一起提供大数据的模型跟踪和模型注册。
但是 Comet 附带了用户管理特性,并允许在团队内部共享项目——这是 MLflow 所缺少的。它还提供托管和内部设置,而 MLflow 仅作为开源解决方案提供,需要您在服务器上维护它。
Example dashboard in W&B | Source
WandB 专注于深度学习。用户使用 Python 库跟踪应用程序的实验,并且作为一个团队,可以看到彼此的实验。它允许他们记录实验,并可视化研究的每一部分。WandB 是一项托管服务,允许您在一个地方备份所有实验
Wandb—主要特点** 😗*
- 处理用户管理
- 出色的用户界面允许用户很好地可视化、比较和组织他们的跑步
团队共享工作:团队共享的多种功能 - 与其他工具的集成:几个可用的开源集成
WandB vs 彗星
WandB 是 Comet 的闭源解决方案替代方案。它提供了与 Comet 非常相似的特性,除了与不同语言和框架的集成。例如,WandB 集成了 fastai 和 Catalyst 进行模型训练,而 Comet 没有。两者的定价模式根据需求也有很大不同,你可以查看 Comet 的这里和 WandB 的这里。
神圣是一个开源工具,由研究机构 IDSIA(瑞士人工智能实验室)开发。Sacred 是一个 Python 库,帮助配置、组织、记录和复制实验。
该工具提供了一种使用配置的编程方式。观察者的概念允许您跟踪与实验相关的各种类型的数据。
此外,神圣有自动播种——当需要重现一个实验时非常有用。
神圣——主要特征** 😗*
- 最适合个人用户,因为不支持团队共享工作
- 实验跟踪:任何模型训练
- 与其他工具集成:不支持
- 额外收获:神圣的前端很少,可以挑一个最符合自己需求的。看一看 这个与海王星特别融合的。
神圣 vs 彗星
神圣是另一个开源替代彗星。如果你是一个正在寻找一个简单易用的实验跟踪工具的人,那么神圣将是一个很好的选择。它是一个独立的 pip 包,前端用户界面取决于其他来源,你可以在这里查看这些来源。
神圣不支持团队协作,所以它最适合个人使用。如果你是一个致力于生产规格项目的团队,那么 Comet 将是一个比神圣更好的选择。
摘要
在任何机器学习项目中,找到满足您需求的正确跟踪工具总是证明卓有成效的。它帮助你比任何传统方法更快地达到预期的效果。因此,分配足够的时间和资源来选择正确的工具将会节省大量的时间和资源。
不要忘了选择一个符合你的需求和工作方式的工作,给你足够的灵活性来充分利用你的时间。
愉快地体验您的 ML 项目!
最佳 Kubeflow 替代品
原文:https://web.archive.org/web/https://neptune.ai/blog/the-best-kubeflow-alternatives
Kubeflow 是 Kubernetes 的 ML 工具包。它有助于维护机器学习系统——管理所有的应用程序、平台和资源考虑事项。它通过使机器学习工作流的运行编排和部署更容易来促进机器学习模型的扩展。这是一个开源项目,包含一组专门针对各种 ML 任务的兼容工具和框架。
Kubeflow 围绕三个原则构建:
- 可组合性——你可以选择整个 ML 项目中你想要使用的组件,并使它们作为独立的系统工作
- 可移植性——在多样化的基础设施上运行项目的所有部分
- 可扩展性——您的项目可以在需要时访问更多资源,并在不需要时释放它们
Kubeflow 是一个处理整个 ML 生命周期的庞然大物。但是您可能会在其他 ML 工具中寻找一些更小的功能子集,它们可能更适合您的 ML 过程的特定步骤。
因此,如果您需要 Kubeflow 替代方案来处理诸如数据版本化、实验跟踪或模型服务之类的事情,我们会全力支持您。以下是按类别分组的最佳选择。
数据和管道版本控制
DVC,或数据版本控制,是一个机器学习项目的开源版本控制系统。这是一个实验工具,不管你使用什么语言,它都可以帮助你定义你的管道。
当您在 ML 模型的前一版本中发现问题时,DVC 通过利用代码、数据版本化和可再现性来帮助节省时间。您还可以训练您的模型,并通过 DVC 管道与您的队友分享。
DVC 可以处理大量数据的版本和组织,并以一种组织良好、易于访问的方式存储它们。它侧重于数据和管道版本化和管理,但也有一些(有限的)实验跟踪功能。
DVC–摘要:
- 可以使用不同类型的存储—不受存储限制
- 完整的代码和数据来源有助于跟踪每个 ML 模型的完整发展
- 通过始终如一地维护输入数据、配置和最初用于运行实验的代码的组合来实现可重复性
- 跟踪指标
- 一种将 ML 步骤连接到 DAG 并端到端运行整个管道的内置方式
Pachyderm 是一个将数据谱系与 Kubernetes 上的端到端管道相结合的平台。
它有三个版本,社区版(开源,可以在任何地方使用)、企业版(完整的版本控制平台)和中心版(仍是测试版,结合了前两个版本的特点)。
您需要将 Pachyderm 与您的基础架构/私有云相集成。
因为在本节中我们讨论的是数据和管道版本,所以我们将讨论这两者,但是 Pachyderm 的内容不止于此(查看网站了解更多信息)。
谈到数据版本化,厚皮动物数据版本化系统有以下几个主要概念:
- 存储库–厚皮动物存储库是最高级别的数据对象。通常,Pachyderm 中的每个数据集都有自己的存储库
- 提交–回购在特定时间点的不可变快照
- 分支–特定提交的别名或指针,在提交新数据时自动移动
- 文件–文件和目录是存储库中的实际数据。Pachyderm 支持任何类型、大小和数量的文件
- 出处——表达各种提交、分支和存储库之间的关系。它帮助您跟踪每个提交的来源
Neptune 是为运行大量实验的研究和生产团队构建的 MLOps 的元数据存储。它非常灵活,可以与许多其他框架一起工作,并且由于其稳定的用户界面,它实现了巨大的可伸缩性(达到数百万次运行)。
这是一个强大的软件,可以存储、检索和分析大量数据。Neptune 拥有高效团队协作和项目监督的所有工具。
海王星——概要:
- 为用户和组织管理提供不同的组织、项目和用户角色
- 快速美观的用户界面,具有多种功能来分组组织跑步,保存自定义仪表板视图并与团队共享
- 您可以使用托管应用程序来避免维护另一个工具的所有麻烦(或者将其部署在您的内部基础架构上)
- 您的团队可以跟踪在脚本(Python、R、other)、笔记本(local、Google Colab、AWS SageMaker)中执行的实验,并在任何基础设施(云、笔记本电脑、集群)上执行
- 广泛的实验跟踪和可视化功能(资源消耗、图像列表滚动)
MLflow 是一个开源平台,有助于管理整个机器学习生命周期,包括实验、再现性、部署和中央模型注册。
MLflow 适合个人和任何规模的团队。
该工具与库无关。你可以用任何机器学习库和任何编程语言来使用它
MLflow 包含四个主要功能:
- ml flow Tracking——一个 API 和 UI,用于在运行机器学习代码时记录参数、代码版本、指标和工件,并在以后可视化和比较结果
- MLflow 项目——将 ML 代码打包成可重用、可复制的形式,以便与其他数据科学家共享或转移到生产中
- MLflow 模型——从不同的 ML 库中管理和部署模型到各种模型服务和推理平台
- MLflow Model Registry–一个中央模型存储库,用于协作管理 ml flow 模型的整个生命周期,包括模型版本控制、阶段转换和注释
培训运行流程编排
亚马逊 SageMaker 是一个平台,使数据科学家能够构建、训练和部署机器学习模型。它拥有用于整个机器学习工作流的所有集成工具,在单个工具集中提供了用于机器学习的所有组件。
SageMaker 是一个适合安排、协调和管理机器学习模型的工具。它有一个基于 web 的可视化界面来执行所有 ML 开发步骤(笔记本、实验管理、自动模型创建、调试和模型漂移检测)
亚马逊 SageMaker–摘要:
- Autopilot 自动检查原始数据,应用功能处理器,挑选最佳算法集,训练和调整多个模型,跟踪它们的性能,然后根据性能对模型进行排序——它有助于部署性能最佳的模型
- SageMaker Ground Truth 帮助您快速构建和管理高度准确的训练数据集
- SageMaker Experiments 通过自动捕获输入参数、配置和结果,并将其存储为“实验”,来帮助组织和跟踪机器学习模型的迭代
- SageMaker Debugger 在训练期间自动捕获实时指标(如训练和验证、混淆、矩阵和学习梯度),以帮助提高模型准确性。当检测到常见的培训问题时,调试器还可以生成警告和补救建议
- SageMaker Model Monitor 允许开发人员检测和修复概念漂移。它会自动检测已部署模型中的概念漂移,并给出详细的警报,帮助识别问题的根源
Polyaxon 是一个平台,用于复制和管理机器学习项目的整个生命周期,以及深度学习应用。
该工具可以部署到任何数据中心、云提供商,并且可以由 Polyaxon 托管和管理。它支持所有主要的深度学习框架,如 Torch、Tensorflow、MXNet。
说到流程编排,Polyaxon 允许您通过 CLI、dashboard、SDK 或 REST API 调度作业和实验,从而最大限度地利用集群。
poly axon–概要:
- 支持整个生命周期,包括运行流程编排,但可以做的远不止这些
- 有一个开源版本,您可以立即使用,但为企业提供了选项
- 它与 Kubeflow 集成,因此您可以一起使用两者。
超参数调谐
Optuna 是一个自动超参数优化框架,可用于机器学习/深度学习和其他领域。它有一套最先进的算法,你可以选择(或连接),它是非常容易的分布训练到多台机器,并让你很好地可视化你的结果。
它集成了流行的机器学习库,如 PyTorch、TensorFlow、Keras、FastAI、scikit-learn、LightGBM 和 XGBoost。
Optuna–摘要:
- 支持在一台机器(多进程)和一个集群(多节点)上进行分布式培训
- 支持各种修剪策略,以更快地收敛(并使用更少的计算)
- 拥有一套强大的可视化工具,如平行坐标、等高线图或切片图
SigOpt 旨在加速和放大机器学习、深度学习和模拟模型的影响。它有助于通过自动化过程节省时间,使其成为超参数调整的合适工具。
您可以将 SigOpt 无缝集成到任何模型、框架或平台中,而无需担心您的数据、模型和基础架构——一切都是安全的。
该工具还允许您监控、跟踪和分析您的优化实验,并将其可视化。
SigOpt–摘要:
- 多指标优化便于同时探索两个不同的指标
- 条件参数允许定义和调整架构参数,并自动选择模型
- 高并行性使您能够充分利用大规模计算机基础设施,并在多达 100 名工作人员中运行优化实验
模型服务
Cortex 是一个开源的替代方案,可以使用 SageMaker 提供模型服务,或者在 AWS 服务(如 Elastic Kubernetes Service (EKS)、Lambda 或 Fargate)和开源项目(如 Docker、Kubernetes、TensorFlow Serving 和 TorchServe)的基础上构建自己的模型部署平台。
这是一个多框架工具,允许您部署所有类型的模型。
皮层–总结:
- 自动扩展 API 以处理生产工作负载
- 对任何 AWS 实例类型运行推理
- 在单个 API 中部署多个模型,并在不停机的情况下更新已部署的 API
- 监控 API 性能和预测结果
Seldon 是一个开源平台,允许你在 Kubernetes 上部署机器学习模型。它在云中和内部都可用。
谢顿–摘要:
- 利用 canary deployment 等各种选项简化模型部署
- 出现问题时,使用警报系统监控生产中的模型
- 使用模型解释器来理解为什么会做出某些预测。谢顿还开源了一个模型解释器包
把它包起来
我们希望您能找到 Kubeflow 的最佳替代方案,帮助您高效工作并提供最佳结果。毕竟一个好的工具可以改善你的工作流程。
快乐实验!
Scikit 的最佳 ML 框架和扩展-学习
许多包实现了sci kit-learnestimator API。
如果您已经熟悉 Scikit-learn,您会发现这些库的集成非常简单。
有了这些包,我们可以扩展 Scikit-learn 估算器的功能,我将在本文中向您展示如何使用它们。
数据格式
在这一节中,我们将探索可用于处理和转换数据的库。
您可以使用这个包将“DataFrame”列映射到 Scikit-learn 转换。然后,您可以将这些列组合成功能。
要开始使用该软件包,请通过 pip 安装“sklearn-pandas”。“DataFrameMapper”可用于将 pandas 数据框列映射到 Scikit-learn 转换。让我们看看它是怎么做的。
首先,创建一个虚拟数据帧:
data =pd.DataFrame({
'Name':['Ken','Jeff','John','Mike','Andrew','Ann','Sylvia','Dorothy','Emily','Loyford'],
'Age':[31,52,56,12,45,50,78,85,46,135],
'Phone':[52,79,80,75,43,125,74,44,85,45],
'Uni':['One','Two','Three','One','Two','Three','One','Two','Three','One']
})
“DataFrameMapper”接受元组列表——第一项的名称是数据帧中的列名。
第二个传递的项是将应用于该列的转换类型。
例如,' LabelBinarizer 可应用于' Uni '列,而' Age '列则使用' StandardScaler 进行缩放。
from sklearn_pandas import DataFrameMapper
mapper = DataFrameMapper([
('Uni', sklearn.preprocessing.LabelBinarizer()),
(['Age'], sklearn.preprocessing.StandardScaler())
])
定义映射器后,接下来我们用它来拟合和转换数据。
mapper.fit_transform(data)
映射器的“transformed_names_”属性可用于显示转换后的结果名称。
mapper.transformed_names_
向映射器传递“df_out=True”将会以熊猫数据帧的形式返回您的结果。
mapper = DataFrameMapper([
('Uni', sklearn.preprocessing.LabelBinarizer()),
(['Age'], sklearn.preprocessing.StandardScaler())
],df_out=True)
这个包结合了来自 xarray 的 n 维标签数组和 Scikit-learn 工具。
您可以将 Scikit-learn 估值器应用于“xarrays ”,而不会丢失它们的标签。您还可以:
- 确保 Sklearn 估算器与 xarray 数据阵列和数据集之间的兼容性,
- 使估计者能够改变样本数,
- 有预处理变压器。
Sklearn-xarray 基本上是 xarray 和 Scikit-learn 之间的桥梁。为了使用其功能,请通过 pip 或“conda”安装“sklearn-xarray”。
这个包有包装器,允许您在 xarray 数据数组和数据集上使用 sklearn 估计器。为了说明这一点,让我们首先创建一个“数据阵列”。
import numpy as np
import xarray as xr
data = np.random.rand(16, 4)
my_xarray = xr.DataArray(data)
从 Sklearn 中选择一个转换以应用于此“数据阵列”。在这种情况下,让我们应用“标准缩放器”。
from sklearn.preprocessing import StandardScaler
Xt = wrap(StandardScaler()).fit_transform(X)
包装估计器可以无缝地用于 Sklearn 管道中。
pipeline = Pipeline([
('pca', wrap(PCA(n_components=50), reshapes='feature')),
('cls', wrap(LogisticRegression(), reshapes='feature'))
])
当安装这个管道时,您只需传入 DataArray。
类似地,DataArrays 可以用于交叉验证的网格搜索。
为此,您需要从“sklearn-xarray”创建一个“CrossValidatorWrapper”实例。
from sklearn_xarray.model_selection import CrossValidatorWrapper
from sklearn.model_selection import GridSearchCV, KFold
cv = CrossValidatorWrapper(KFold())
pipeline = Pipeline([
('pca', wrap(PCA(), reshapes='feature')),
('cls', wrap(LogisticRegression(), reshapes='feature'))
])
gridsearch = GridSearchCV(
pipeline, cv=cv, param_grid={'pca__n_components': [20, 40, 60]}
)
之后,您将使“gridsearch”适合“DataArray”数据类型中的 X 和 y。
自动毫升
有没有整合 Sklearn 的工具和库来更好的 Auto-ML?是的,这里有一些例子。
有了这个,你就可以用 Scikit-learn 进行自动化的机器学习了。对于设置,您需要手动安装一些依赖项。
$ curl https://raw.githubusercontent.com/automl/auto-sklearn/master/requirements.txt | xargs -n 1 -L 1 pip install
接下来,通过 pip 安装“auto-sklearn”。
使用该工具时,您不需要担心算法选择和超参数调整。Auto-sklearn 会为您完成所有这些工作。
这要归功于贝叶斯优化、元学习和集成构建方面的最新进展。
要使用它,您需要选择一个分类器或回归器,并使其适合训练集。
from autosklearn.classification import AutoSklearnClassifier
cls = AutoSklearnClassifier()
cls.fit(X_train, y_train)
predictions = cls.predict(X_test)
Auto _ ViML–自动变量可解释机器学习”(读作“Auto_Vimal”)
给定一个特定的数据集,Auto_ViML 尝试不同的模型和不同的特性。它最终选定了性能最佳的模型。
该软件包还在构建模型时选择尽可能少的特征。这给了你一个不太复杂和可解释的模型。该套件还:
- 通过建议更改缺少的值、格式和添加变量来帮助您清理数据。
- 自动分类变量,无论是文本,数据,还是数字;
- 当 verbose 设置为 1 或 2 时,自动生成模型性能图;
- 允许您使用“功能工具”进行功能工程;
- 当“不平衡标志”设置为“真”时,处理不平衡数据
要查看它的运行,请通过 pip 安装“autoviml”。
from sklearn.model_selection import train_test_split, cross_validate
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=54)
train, test = X_train.join(y_train), X_val.join(y_val)
model, features, train, test = Auto_ViML(train,"target",test,verbose=2)
TPOT—基于采油树的管道优化工具
这是一个基于 Python 的自动 ml 工具。它使用遗传编程来优化机器学习管道。
它会探索多个管道,以便为您的数据集选择最佳管道。
通过 pip 安装“tpot ”,开始修改它。运行“tpot”后,可以将生成的管道保存在一个文件中。一旦浏览过程完成或您终止该过程,文件将被导出。
下面的代码片段展示了如何在 digits 数据集上创建分类管道。
from tpot import TPOTClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target,
train_size=0.75, test_size=0.25, random_state=42)
tpot = TPOTClassifier(generations=5, population_size=50, verbosity=2, random_state=42)
tpot.fit(X_train, y_train)
print(tpot.score(X_test, y_test))
tpot.export('tpot_digits_pipeline.py')
这是一个自动化特征工程的工具。它的工作原理是将时态和关系数据集转换成特征矩阵。
通过 pip 安装“featuretools[complete]”开始使用它。
深度特征合成(DFS)可用于自动化特征工程。
首先,定义一个包含数据集中所有实体的字典。在“featuretools”中,实体是单个表格。之后,定义不同实体之间的关系。
下一步是将实体、关系列表和目标实体传递给 DFS。这将为您提供特性矩阵和相应的特性定义列表。
import featuretools as ft
entities = {
"customers" : (customers_df, "customer_id"),
"sessions" : (sessions_df, "session_id", "session_start"),
"transactions" : (transactions_df, "transaction_id", "transaction_time")
}
relationships = [("sessions", "session_id", "transactions", "session_id"),
("customers", "customer_id", "sessions", "customer_id")]
feature_matrix, features_defs = ft.dfs(entities=entities,
relationships = relationships,
target_entity = "customers")
您可以使用 Neuraxle 进行超参数调整和 AutoML。通过 pip 安装“neuraxle”以开始使用它。
除了 Scikit-learn,Neuraxle 还兼容 Keras、TensorFlow 和 PyTorch。它还具有:
- 并行计算和串行化,
- 通过提供这类项目的关键抽象来处理时间序列。
要使用 Neuraxle 进行自动 ml,您需要:
- 定义的管道
- 验证拆分器
- 通过“计分回调”定义计分指标
- 选定的“超参数”存储库
- 选定的“超参数”优化器
- “自动”循环
点击查看完整的示例。
实验框架
现在是时候使用一些 SciKit 工具来进行机器学习实验了。
SciKit-Learn Laboratory 是一个命令行工具,可以用来运行机器学习实验。要开始使用它,请通过 pip 安装“skll”。
之后,您需要获得一个“SKLL”格式的数据集。
接下来,为实验创建一个配置文件,并在终端中运行实验。
$ run_experimen experiment.cfg
当实验完成时,多个文件将被存储在结果文件夹中。您可以使用这些文件来检查实验。
海王星
Neptune 与 Scikit-learn 的集成让你可以使用 Neptune 记录你的实验。例如,您可以记录 Scikit-learn 回归器的摘要。
from neptunecontrib.monitoring.sklearn import log_regressor_summary
log_regressor_summary(rfr, X_train, X_test, y_train, y_test)
查看本笔记本获取完整示例。
型号选择
现在让我们换个话题,看看专注于模型选择和优化的 SciKit 库。
这个库实现了基于顺序模型的优化方法。通过 pip 安装“scikit-optimize ”,开始使用这些功能。
Scikit-optimize 可用于通过基于贝叶斯定理的贝叶斯优化来执行超参数调整。
您使用“BayesSearchCV”来获得使用该定理的最佳参数。一个 Scikit-learn 模型作为第一个参数传递给它。
拟合后,您可以通过' best_params_ '属性获得模型的最佳参数。
from skopt.space import Real, Categorical, Integer
from skopt import BayesSearchCV
regressor = BayesSearchCV(
GradientBoostingRegressor(),
{
'learning_rate': Real(0.1,0.3),
'loss': Categorical(['lad','ls','huber','quantile']),
'max_depth': Integer(3,6),
},
n_iter=32,
random_state=0,
verbose=1,
cv=5,n_jobs=-1,
)
regressor.fit(X_train,y_train)
Sklearn-deap 是一个用来实现进化算法的包。它减少了为模型寻找最佳参数所需的时间。
它不会尝试每一种可能的组合,而只会改进产生最佳性能的组合。通过 pip 安装“sklearn-deap”。
用于生产的模型出口
from evolutionary_search import EvolutionaryAlgorithmSearchCV
cv = EvolutionaryAlgorithmSearchCV(estimator=SVC(),
params=paramgrid,
scoring="accuracy",
cv=StratifiedKFold(n_splits=4),
verbose=1,
population_size=50,
gene_mutation_prob=0.10,
gene_crossover_prob=0.5,
tournament_size=3,
generations_number=5,
n_jobs=4)
cv.fit(X, y)
接下来,让我们来看看 Scikit 工具,您可以使用这些工具来导出您的生产模型。
sklearn-onnx 支持将 sklearn 模型转换为 ONNX 。
要使用它,您需要通过 pip 获得‘skl 2 onnx’。一旦你的管道准备好了,你就可以使用‘to _ onnx’函数将模型转换成 ONNX。
这是一个决策树集成的模型编译器。
from skl2onnx import to_onnx
onx = to_onnx(pipeline, X_train[:1].astype(numpy.float32))
它处理各种基于树的模型,如随机森林和梯度增强树。
您可以使用它来导入 Scikit-learn 模型。这里,“模型”是一个 scikit-learn 模型对象。
模型检查和可视化
import treelite.sklearn
model = treelite.sklearn.import_model(model)
在这一节中,让我们看看可用于模型可视化和检查的库。
dtreeviz 用于决策树可视化和模型解释。
eli5 是一个可以用来调试和检查机器学习分类器的包。你也可以用它来解释他们的预测。
from dtreeviz.trees import dtreeviz
viz = dtreeviz(
model,
X_train,
y_train,
feature_names=boston.feature_names,
fontname="Arial",
title_fontsize=16,
colors = {"title":"red"}
)
例如,Scikit-learn 估计器权重的解释如下所示:
dabl–数据分析基线库
import eli5
eli5.show_weights(model)
dabl 为常见的机器学习任务提供了样板代码。它仍在积极开发中,所以不推荐用于生产系统。
Skorch 是 PyTorch 的 Scikit-learn 包装器。
import dabl
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
sc = dabl.SimpleClassifier().fit(X_train, y_train)
print("Accuracy score", sc.score(X_test, y_test))
它允许你在 Scikit-learn 中使用 PyTorch。它支持多种数据类型,如 PyTorch 张量、NumPy 数组和 Python 字典。
最后的想法
from skorch import NeuralNetClassifier
net = NeuralNetClassifier(
MyModule,
max_epochs=10,
lr=0.1,
iterator_train__shuffle=True,
)
net.fit(X, y)
在本文中,我们探索了一些扩展 Scikit-learn 生态系统的流行工具和库。
如您所见,这些工具可用于:
处理和转换数据,
- 实现自动化机器学习,
- 执行自动特征选择,
- 运行机器学习实验,
- 为您的问题选择最佳的模型和管道,
- 为生产导出模型…
- …还有更多!
在您的 Scikit-learn 工作流程中试用这些包,您可能会惊讶于它们有多么方便。
Try out these packages in your Scikit-learn workflow, and you might be surprised how convenient they are.
最佳物流替代方案(2022 年更新)
原文:https://web.archive.org/web/https://neptune.ai/blog/the-best-mlflow-alternatives
MLflow 是一个帮助管理整个机器学习生命周期的开源平台。这包括实验,也包括再现性、部署和存储。这四个元素中的每一个都由一个 MLflow 组件表示:跟踪、项目、模型和注册。
这意味着与 MLflow 合作的数据科学家能够跟踪实验,组织实验,为其他 ML 工程师描述实验,并将其打包到机器学习模型中。在本文中,我们主要关注 MLflow 的实验跟踪功能,并概述其最佳替代方案。
虽然 MLflow 是一个很好的工具,但有些东西可能会更好,尤其是在大型团队中和/或您运行的实验数量非常大的情况下。
你最关心的是什么?MLflow 的主要弱点是什么?
-
缺少用户管理能力使得难以处理对不同项目或角色(经理/机器学习工程师)的访问权限。正因为如此,而且没有与他人共享 UI 链接的选项,团队协作在 MLflow 中也很有挑战性。
-
尽管最近有所改进,但在保存实验仪表板视图或按实验参数(模型架构)或属性(数据版本)对运行进行分组时,并没有提供完全的可定制性。当你有很多人在同一个项目上工作或者你正在运行数以千计的实验时,这些是非常有用的。
-
说到大量的实验,当你真的想探索你所有的跑步时,UI 会变得相当慢。
-
除非您想使用 Databricks 平台,否则您需要自己维护 MLflow 服务器。这带来了典型的障碍,如访问管理、备份等,更不用说这非常耗时。
-
开源社区充满活力,但是没有专门的用户支持在你需要的时候伸出援手。
-
MLflow 非常适合通过 Python 或 R 脚本运行实验,但 Jupyter 笔记本体验并不完美,尤其是如果您想要跟踪机器学习生命周期的一些附加部分,如探索性数据分析或结果探索。
-
一些功能,如记录资源消耗(CPU,GPU,内存)或滚动大量的图像预测或图表还没有出现。
ML 实验跟踪ML flow 中的功能为那些愿意维护实验数据后端、跟踪 UI 服务器并且不运行大量实验的个人用户或团队带来了巨大的价值。
如果上面提到的一些东西对你和你的团队很重要,你可能想要寻找补充的或者替代的工具。幸运的是,有许多工具可以提供这些缺失的部分或大部分。
在这篇文章中,基于 reddit 上的一些讨论和 T2 的比较,我们给出了 MLflow 的最佳替代方案。
我们认为,以下是 MLflow 的最佳替代方案:
Neptune 是一个元数据存储库——它充当从数据版本化、实验跟踪到模型注册和监控的 MLOps 工作流不同部分之间的连接器。Neptune 使得存储、组织、显示和比较 ML 模型生命周期中生成的所有元数据变得容易。
Neptune 使得存储、组织、显示和比较 ML 模型生命周期中生成的所有元数据变得容易。
您可以记录指标、超参数、交互式可视化、视频、代码、数据版本、和更多,并以定制的结构对其进行组织。一旦登录,一切都在一个直观和干净的用户界面中可见,您可以在那里进行分析和比较。
您还可以创建包含所有这些元数据的定制仪表板,并与您的同事、团队经理甚至外部利益相关者共享它们。以下是这种仪表板的一个示例:
有四种不同的比较视图可用——图表、平行坐标、并列表格仪表板和工件比较部分。因此,您可以轻松地评估模型并选择性能最佳的模型。
海王星在生产阶段也非常有用。有了所有记录的元数据,您就知道模型是如何创建的,以及如何再现它。
海王星——概要:
如果你想看海王星在行动,检查这个现场笔记本或这个例子项目(不需要注册),只是玩它。
MLflow vs 海王星
这些工具之间的主要区别是 MLflow 是一个开源解决方案,而 Neptune 是一个托管云服务。它影响了 MLflow 和 Neptune 工作的各个方面。如果你正在寻找一个免费的开源工具,涵盖了广泛的 ML 生命周期步骤,MLflow 可能是你正确的选择。但是您应该记住,尽管 MLflow 可以免费下载,但它确实会产生与维护整个基础设施相关的成本。
如果你更喜欢专注于 ML 过程,而把托管工作留给其他人,Neptune 是一个不错的选择。对于月费,您可以获得出色的用户支持,快速和简单的设置,您不必担心维护,并且该工具伸缩性良好。另外,Neptune 具有用户管理功能,因此它在团队环境中会工作得更好。
查看 Neptune 和 MLflow 的深入对比。
阅读 Zoined 的案例研究,了解他们为什么选择 Neptune 而不是 MLflow。
WandB 专注于深度学习。用户使用 Python 库跟踪应用程序的实验,并且作为一个团队,可以看到彼此的实验。
与 MLflow 不同,WandB 是一种托管服务,允许您在一个地方备份所有实验,并与团队合作完成一个项目-工作共享功能可供使用。
与 MLflow 类似,在 WandB 中,用户可以记录和分析多种数据类型。
权重&偏差—汇总:
- 处理用户管理
- 出色的用户界面让用户可以很好地可视化、比较和组织他们的跑步。
- 团队共享工作:团队共享的多种特性。
- 与其他工具的集成:几个可用的开源集成
- SaaS/本地实例可用:是/是
- 额外的好处:WandB 记录了模型图,因此您可以在以后检查它。
MLflow 与重量和偏差
与 Neptune 类似,Weight & Biases 提供了其工具的托管版本。与 MLflow 相反,ml flow 是开源的,需要在自己的服务器上维护。Weights & Biases 提供了实验跟踪、数据集版本控制和模型管理功能,而 MLflow 几乎涵盖了整个 ML 生命周期。最后,WandB 提供了用户管理特性,当你在团队中工作时,这些特性可能对你很重要。
Comet 是一个元机器学习平台,用于跟踪、比较、解释和优化实验和模型。
就像许多其他工具一样——例如 Neptune(Neptune-client specific)或 WandB——Comet 提出了一个开源 Python 库,允许数据科学家将他们的代码与 Comet 集成,并开始在应用程序中跟踪工作。
由于它提供云托管和自托管,用户可以有团队项目,并保存实验历史的备份。
Comet 正在通过预测性早期停止(免费版软件不提供)和神经结构搜索(未来)向更自动化的 ML 方法靠拢。
彗星—摘要:
- 处理用户管理
- 团队共享工作:团队共享的多种特性。
- 与其他工具的集成:应该由用户手动开发
- SaaS/本地实例可用:是/是
- 额外收获:显示平行图来检查参数和指标之间的关系模式
MLflow vs 彗星
Comet 附带了用户管理特性,并允许在团队内部共享项目——这是 MLfow 中所缺少的。它还提供托管和内部设置,而 MLflow 仅作为开源解决方案提供,需要您在自己的服务器上进行维护。
当涉及到跟踪和可视化实验时,Valohai 采取了一种稍微不同的方法。
该平台为机器学习提出了编排、版本控制和管道管理——简单来说,它们涵盖了 MLflow 在日志记录方面的工作,并额外管理您的计算基础设施。
与 MLflow 一样,用户可以轻松检查和比较多次运行。同时,与众不同的是能够自动启动和关闭用于培训的云机器。
Valohai 允许您使用任何编程语言进行开发——包括 Python 和 R——这对于在固定技术堆栈中工作的团队来说非常方便。
瓦罗海—摘要:
- 处理用户管理
- 团队共享工作:多种特性
- 与其他工具的集成:文档中提供的集成示例
- SaaS/本地实例可用:是/是
- 额外收获:有了训练的基础设施,你可以在瓦罗海管理的环境中进行实验。
MLflow vs Valohai
根据 Valohai 自己的对比,Valohai 在没有任何设置的情况下提供了类似 MLflow 的实验跟踪。与 MLflow 类似,Valohai 涵盖了 MLOps 领域的很大一部分(包括实验跟踪、模型管理、机器编排和流水线自动化),但它是一个托管平台,而不是一个开源解决方案。
TensorBoard 是一个用于 TensorFlow 的开源可视化工具包,允许您分析模型训练运行。往往是 TensorFlow 用户的首选。TensorBoard 允许您可视化机器学习实验的各个方面,如度量或模型图,以及查看 tensors 的直方图等。
除了流行的开源版 TensorBoard,还有 TensorBoard.dev,它可以在托管服务器上免费使用。
TensorBoard.dev 允许你上传并与任何人分享你的 ML 实验结果。与 TensorBoard 相比,这是一个重要的升级,协作功能在那里是缺失的。
tensor board—摘要:
- 与处理图像相关的成熟功能
- 假设工具(WIT),这是一个易于使用的界面,用于扩展对黑盒分类和回归 ML 模型的理解
- 提供社区支持的强大用户社区。
MLflow 与 TensorBoard
这两个工具都是开源的,在处理任何问题方面都受到各自社区的支持。主要区别似乎在于它们各自提供的功能范围。TensorBoard 被描述为 TensorFlow 的可视化工具包,因此它很好地服务于可视化,它允许您跟踪实验并比较它们(有限的功能)。另一方面,MLflow 被证明在 ML 生命周期的更多阶段是有用的。这两个工具都缺乏用户管理和团队共享功能(TensorBoard.dev 提供共享功能,但无法管理数据隐私)。
结论
MLflow 是一个很棒的工具,但是有一些它不具备的功能。所以有必要看看外面还有什么。在这个概述中,我们提到了 5 个可能是很好的替代工具,并检查了缺少的框。
如果你寻找 MLflow 替代品的主要原因是缺少协作和用户管理功能,你应该检查 Neptune、Weights & Biases、Comet 或 Valohai。如果您不想自己维护实验跟踪工具,所有这些工具都可以作为托管应用程序使用。
如果你想坚持使用开源工具,TensorBoard 可能是适合你的工具,但你应该记住,就功能而言,它不如 MLflow 先进。
最后,如果你不需要一个几乎覆盖整个 ML 生命周期的工具(像 MLflow 或者 Valohai),我们推荐你去查 Neptune,Weight & Biases,或者 Comet。
在任何情况下,确保替代解决方案符合您的需求并改进您的工作流程。希望这篇文章能帮你找到。祝你好运!
最佳厚皮动物替代品
原文:https://web.archive.org/web/https://neptune.ai/blog/the-best-pachyderm-alternatives
Pachyderm 是一个数据科学平台,有助于控制端到端的机器学习生命周期。它有三个不同的版本,社区版(开源,可以在任何地方部署)、企业版(完整的版本控制平台)和中心版(托管版,仍处于测试阶段)。
简而言之,你可以对厚皮动物做些什么:
- Pachyderm 允许您不断更新 repo 主分支中的数据,同时在单独的分支中试验特定的数据提交
- 它支持任何类型、大小和数量的文件,包括二进制和纯文本文件
- 您可以将提交的历史存储在一个集中的位置,这样当您尝试合并您的。git 历史与回购的主副本
- 集中式和事务性提交分支没有在源代码版本控制系统中广泛使用
- 出处使团队能够在彼此工作的基础上构建、共享、转换和更新数据集,同时自动维护完整的审计跟踪,以便所有结果都是可重复的
它无疑是一个 ML 实验的发电站,但如果你正在寻找一个更专注于机器学习项目的特定方面(生命周期的一部分)的不同解决方案,或者需要一个更轻量级的工具,Pachyderm 可能不是你的完美工具。
这就是我们需要帮助的地方——这里有所有最好的厚皮动物替代品。看一看,选择你最喜欢的替代品!
数据和管道版本控制
DVC,或数据版本控制,是一个机器学习项目的开源版本控制系统。这是一个实验工具,不管你使用什么语言,它都可以帮助你定义你的管道。
当您在 ML 模型的前一版本中发现问题时,DVC 通过利用代码、数据版本化和可再现性来帮助节省时间。您还可以训练您的模型,并通过 DVC 管道与您的队友分享。
DVC 可以处理大量数据的版本和组织,并以一种组织良好、易于访问的方式存储它们。它侧重于数据和管道版本化和管理,但也有一些(有限的)实验跟踪功能。
DVC–摘要:
- 可以使用不同类型的存储—不受存储限制
- 完整的代码和数据来源有助于跟踪每个 ML 模型的完整发展
- 通过始终如一地维护输入数据、配置和最初用于运行实验的代码的组合来实现可重复性
- 跟踪指标
- 一种将 ML 步骤连接到 DAG 并端到端运行整个管道的内置方式
Kubeflow 是 Kubernetes 的 ML 工具包。它有助于维护机器学习系统——管理所有的应用程序、平台和资源考虑事项。它通过使机器学习工作流的运行编排和部署更容易来促进机器学习模型的扩展。
这是一个开源项目,包含一组专门针对各种 ML 任务的兼容工具和框架。
kube flow–摘要:
- 用于管理和跟踪实验、作业和运行的用户界面(UI)
- 使用 SDK 与系统交互的笔记本电脑
- 重用组件和管道来快速创建端到端解决方案,而不必每次都重新构建
- Kubeflow Pipelines 可作为 Kubeflow 的核心组件或独立安装使用
Neptune 是为运行大量实验的研究和生产团队构建的 MLOps 的元数据存储。它非常灵活,可以与许多其他框架一起工作,并且由于其稳定的用户界面,它实现了巨大的可伸缩性(达到数百万次运行)。
这是一个强大的软件,可以存储、检索和分析大量数据。Neptune 拥有高效团队协作和项目监督的所有工具。
海王星——概要:
- 为用户和组织管理提供不同的组织、项目和用户角色
- 快速美观的用户界面,具有多种功能来分组组织跑步,保存自定义仪表板视图并与团队共享
- 您可以使用托管应用程序来避免维护另一个工具的所有麻烦(或者将其部署在您的内部基础架构上)
- 您的团队可以跟踪在脚本(Python、R、other)、笔记本(local、Google Colab、AWS SageMaker)中执行的实验,并在任何基础设施(云、笔记本电脑、集群)上执行
- 广泛的实验跟踪和可视化功能(资源消耗、图像列表滚动)
MLflow 是一个开源平台,有助于管理整个机器学习生命周期,包括实验、再现性、部署和中央模型注册。
MLflow 适合个人和任何规模的团队。
该工具与库无关。你可以用任何机器学习库和任何编程语言来使用它
MLflow 包含四个主要功能:
- ml flow Tracking——一个 API 和 UI,用于在运行机器学习代码时记录参数、代码版本、指标和工件,并在以后可视化和比较结果
- MLflow 项目——将 ML 代码打包成可重用、可复制的形式,以便与其他数据科学家共享或转移到生产中
- MLflow 模型——从不同的 ML 库中管理和部署模型到各种模型服务和推理平台
- MLflow Model Registry–一个中央模型存储库,用于协作管理 ml flow 模型的整个生命周期,包括模型版本控制、阶段转换和注释
培训运行流程编排
亚马逊 SageMaker 是一个平台,使数据科学家能够构建、训练和部署机器学习模型。它拥有用于整个机器学习工作流的所有集成工具,在单个工具集中提供了用于机器学习的所有组件。
SageMaker 是一个适合组织、训练、部署和管理机器学习模型的工具。它有一个基于 web 的可视化界面来执行所有 ML 开发步骤,包括笔记本、实验管理、自动模型创建、调试和模型漂移检测
亚马逊 SageMaker–摘要:
- Autopilot 自动检查原始数据,应用功能处理器,挑选最佳算法集,训练和调整多个模型,跟踪它们的性能,然后根据性能对模型进行排序——它有助于部署性能最佳的模型
- SageMaker Ground Truth 帮助您快速构建和管理高度准确的训练数据集
- SageMaker Experiments 通过自动捕获输入参数、配置和结果,并将其存储为“实验”,来帮助组织和跟踪机器学习模型的迭代
- SageMaker Debugger 在训练期间自动捕获实时指标(如训练和验证、混淆、矩阵和学习梯度),以帮助提高模型准确性。当检测到常见的培训问题时,调试器还可以生成警告和补救建议
- SageMaker Model Monitor 允许开发人员检测和排除概念漂移故障。它会自动检测已部署模型中的概念漂移,并给出详细的警报,帮助识别问题的根源
Polyaxon 是一个平台,用于复制和管理机器学习项目的整个生命周期,以及深度学习应用。
该工具可以部署到任何数据中心、云提供商,并且可以由 Polyaxon 托管和管理。它支持所有主要的深度学习框架,如 Torch、Tensorflow、MXNet。
说到流程编排,Polyaxon 允许您通过 CLI、dashboard、SDK 或 REST API 调度作业和实验,从而最大限度地利用集群。
poly axon–摘要:
- 支持整个生命周期,包括运行流程编排,但可以做的远不止这些
- 有一个开源版本,您可以立即使用,但也为企业提供了选项
- 文档非常完整的平台,包括技术参考文档、入门指南、学习资源、指南、教程、变更日志等等
- 使用实验洞察仪表板监控、跟踪和分析每个优化实验
包装它
为厚皮动物找到合适的替代品可能并不容易。每个工具都很棒,都提供有用的功能。但是一旦你知道你到底在找什么,你就会找到最合适的。尝试、混合和实验。毕竟这就是机器学习的意义所在。
快乐实验!
有哪些最好的、定期更新的机器学习博客或资源?
在机器学习中,如果你不发展,你迟早会被淘汰。这是一门困难且要求很高的学科,需要不断成长和拓展技能。
始终保持在最新机器学习趋势顶端的最好方法之一是关注专门针对这一特定专业的博客、论坛和网站。这是一个向他人学习的好方法,通常是向他们领域的知名专家学习,发现最新的发现和技巧,帮助你成为更好的数据科学家。
如果你正在寻找总是最新的最好的机器学习资源,一定要看看这个列表。你可以根据类别找到不同的资源。它们都包括人工智能、机器学习、IT、技术和通用数据科学等领域。
快速导航
" id": "block_5ecbb46dce2b8 "," name ":" ACF/目录"," data": { "title ":" "," _title": "field_5e80aca602d23 "," table _ of _ contents _ 0 _ name ":" Forums & communities "," table _ of _ contents _ 0 _ name ":" field _ 5e 80 AC 1a 4d 87 b "," table _ of _ contents _ 0 _ id _ section ":" 1 "," _ table _ of _ of _ of _ of
论坛和社区
Reddit–Reddit 是机器学习、深度学习和数据科学领域最强大的知识来源。你可以找到许多有趣信息的不同线索,包括资源——网站、博客、人们面临的问题,以及常见困难的巧妙解决方案。试试这些线程,从 Reddit 中榨出你能榨出的一切: r/MachineLearning , r/DeepLearning , r/DataScience , r/learnmachinelearning 。
Stack Overflow——这是一个开放的社区,面向那些毕生从事编码工作、寻找各种问题的答案或者只是喜欢搜索有趣线索的人。这是一个分享知识和发现新事物的绝佳平台。
Quora–Quora 是另一个人们寻求帮助或分享知识的论坛。它没有 Reddit 那么详细,但是你仍然可以用它来寻找一些有趣的资源。确保查看与机器学习相关的不同空间,以获取最新信息。
——有问题?卡格尔会帮你的。与 Kaggle 社区分享您的问题,您将会得到解决。Kaggle 提供了一个庞大的代码和数据存储库,让您的工作变得更加轻松。利用社区获得灵感、解决问题或发展技能。
**Jupyter 社区——使用 Jupyter 的人的社区,他们需要找到问题的解决方案,帮助其他人修复错误和问题,或者分享他们的工作。
DEV——软件开发者社区。用它来为你的困境、实验或分享你的知识找到解决方案。
ODS . ai–Open Data Science是一个出色的俄罗斯论坛,它将从事数据科学工作的研究人员、工程师和开发人员团结在一起。一个非常吸引人的地方,在这里你可以与其他人建立和改善关系,互相学习。
fast.ai——与 ods.ai 类似,fast . ai 是一个为想要学习、分享想法、与他人合作的人提供的地方。它为程序员提供免费课程、软件库、前沿研究和社区。
课程
——在这里,你可以找到数据科学领域的众多课程。GreyCampus 上的其他资源包括可以学习编码的 Codelabs,可以访问大型资源库的 OpenCampus,以及定期发布有趣文章的博客。
**Data flair——在这里,你会找到关于大数据的有用课程。DataFlair 是一个将培训课程与论坛、作业和测验相结合的平台。您还可以找到不同主题的有趣且广泛的博客帖子。
Coursera——在这个链接下,你会发现斯坦福大学提供的最受欢迎、评分最高的机器学习课程之一。Coursera 是一个广受欢迎的在线课程平台。你可以搜索它寻找其他有趣的课程来扩大你的知识面。
麻省理工学院开放式课程–开放式课程是一个免费开放的在线出版物,内容来自数以千计的麻省理工学院课程,涵盖了整个麻省理工学院的课程,从入门课程到最高级的研究生课程。你可以查看他们的 YouTube 频道寻找有用的视频。
edX–edX 是另一个提供有用课程的平台,在这里你可以获得认证。
哈佛在线课程——这是一个哈佛的网站,提供涵盖各种学科的优质课程。每个人都可以在这个知识来源中找到一些有帮助的东西。
斯坦福课程——如果你正在寻找斯坦福大学的机器学习课程,一定要查看他们网站上的在线培训片段。
数据科学道场—该平台提供在线和面对面的数据科学实践培训。他们的目标是教学生如何在运用课程中学到的概念和技术的同时,处理不同的商业问题并进行批判性思考。
Udemy 上的 机器学习课程——大量精选的在线视频课程,每月都有新内容发布。
博客和有用的网站
安德斯·平克——与其说是博客,不如说是产品。Anders Pink 提供了一个内容管理工具。
这是一个非常有用的工具,尤其是如果你没有太多时间在互联网上搜索相关文章,Anders Pink 有助于了解大数据的最新趋势内容。他们的人工智能算法可以学习你的偏好,为你和你的团队提供完全相关的内容。
Neptune . ai–浏览我们的网站,寻找感兴趣的东西。我们定期发布,让您了解机器学习领域正在发生的事情。学习并获得灵感!
机器学习博客——有见地的文章消磨一些空闲时间(如果你有的话)。
《科学日报》——科技行业所有最新研究新闻,而不仅仅是。
黑客正午——一个为科技爱好者提供轻松内容的独立科技媒体网站。
提炼——关于机器学习的最新文章。完全专业,适合要求最苛刻的数据科学家。
Medium 的机器学习供稿——在机器学习版块,来自世界各地的专家提供的有益有趣的文章。
跳板博客——在他们的博客上,跳板写了关于数据科学、机器学习和其他相关话题。
OpenAI 博客–open ai 是一家位于加州三藩市的研究实验室。他们提供全面的人工智能资源——博客、研究论文和有趣的文章。每样东西都是他们领域的专家提供的最新信息。
谷歌人工智能博客——来自谷歌研究人员和工程师的所有最新更新。在博客上,你可以看到谷歌是如何将人工智能和人工智能技术融入其产品的。
KD nuggets——人工智能、分析、大数据、数据挖掘、数据科学和机器学习领域的领先网站。Gregory Piatetsky-Shapiro 和 Matthew Mayo 编辑。
拜尔——伯克利人工智能研究。BAIR 博客为 BAIR 的研究人员提供了一个可访问的、面向大众的媒介,以交流研究发现、该领域的观点和各种更新。帖子由 BAIR 的学生、博士后和教师撰写,旨在为专家和普通观众提供相关和及时的研究发现和结果的讨论。在 BAIR 学习的各种主题的帖子大约每两周会在出现一次。
Salmon Run——一系列关于应用程序开发和系统设计的文章、技巧和随想。
【deep mind】——一些关于公司最新消息及其成就的有趣文章。
奥赖利–奥赖利的博客值得关注,因为他们发表了关于让数据发挥作用的想法、信息和工具的高质量文章。
黑客新闻——你想知道却不敢问的一切。由 Y Combinator 提供的全面的主题来源。
Flipboard——Flipboard 聚集的无数关于机器学习的文章。
人工律师——一个对从事法律工作的人有用的博客。通过这个博客,你可以了解与法律相关的最新技术趋势,以及如何实现法律机构工作的自动化。
**Lionbridge–Lionbridge 定期发布涵盖机器学习或人工智能等主题的文章。
谷歌新闻——获取所有来自机器学习世界的最新热点新闻。
走向数据科学——围绕数据科学、机器学习、人工智能、编程等有趣话题,更多帮助你学习和发展技能。
SPD 集团博客——关于机器学习行业的真知灼见文章。
研究论文和学术资源
麻省理工新闻——直接来自 MIT(麻省理工学院)来自机器学习世界的所有最新新闻。
**Nature.com——关于机器学习的有趣研究。
——学术界让人们与在机器学习领域工作的其他人分享他们的研究论文。
**带代码的论文——一个免费开放的资源,里面有机器学习的论文、代码、评估表。
【arXiv】——一项免费的分发服务和一个开放的档案库,提供物理、数学、计算机科学领域的学术文章。
牛津大学——牛津大学的研究论文。
CIT——加州理工学院的研究论文。
Machine Learning @ Berkley-加州大学伯克利分校的一个学生管理的组织,致力于工业和学术研究领域的人工智能应用,并使人工智能教育更容易为所有人所接受。
其他资源
The Batch——来自 deeplearning.ai 的每周时事通讯,Batch 以精心策划、易于阅读的报告形式,为工程师和商业领袖呈现最重要的人工智能事件和观点。每周三,这一批文章会重点介绍最实用的研究论文、塑造行业的应用程序和影响力大的商业新闻。
书籍——如果你是个书虫,你可以在亚马逊上搜索,找到一本你感兴趣的书。
——伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔的麻省理工出版社书籍。深度学习教材是一本免费的在线书籍。它旨在帮助学生和从业者进入机器学习领域,特别是深度学习领域。也可以在亚马逊上订购。
****《数据科学周刊》**-免费的每周时事通讯,提供与数据科学相关的精选新闻、文章和工作。一定要订阅!
Data Elixir——一份免费的每周时事通讯,提供来自网络的顶级数据科学精选。涵盖机器学习、数据可视化、分析和策略。绝对值得订阅!
把它包起来
你能在这个列表上找到的所有东西都是根据受欢迎程度和用户推荐挑选出来的。
我会不断更新列表中有用的链接,这样你就能掌握机器学习的最新消息。如果你认为某些东西应该被包含或排除,一定要留下评论。分享你的观点,我很想听听你的意见!**************
最好的神圣+全方位的选择
原文:https://web.archive.org/web/https://neptune.ai/blog/the-best-sacred-omniboard-alternatives
在本帖中,我们将向你展示神圣+全能的最佳替代方案。既然您看到了这篇文章,您可能已经知道这些工具的用途了。但是让我们简短地分析一下,因为这可能有助于更好地定义您的需求,并为您选择最佳的替代方案。
提到一个工具而不提到另一个工具是一种罪过。那是因为他们有点合作。
让我们从神圣开始。Sacred 是瑞士人工智能实验室 IDSIA (Dalle Molle 人工智能研究所)开发的一款工具,可以帮助配置、组织、记录和复制实验。
这里的神圣简单来说就是:
- 跟踪使用任何 Python 库开发的任何模型训练
- 从每个功能访问配置的所有参数
- 您可以使用强大的命令行界面:对于每个实验,您可以使用它来更改参数和运行不同的变体
- 为各种数据库后端提供“观察者”,这些后端记录关于实验、其依赖项、使用的配置、运行它的机器以及结果的各种信息。这些可以保存到 MongoDB、文件系统、托管的实验跟踪工具和其他东西中
- 自动播种有助于控制实验中的随机性,从而保持结果的可重复性
- 没有自带合适的 UI,但是有一些 dashboarding 工具可以连接到它(比如 Omniboard)。
现在,让我们来看看 Omniboard。Omniboard 是一个神圣的网络仪表板。它连接到 Sacred 使用的 MongoDB 数据库,并帮助可视化实验和为每个实验收集的指标/日志。Omniboard 是用 React,Node.js,Express,Bootstrap 写的。
这里是对你能用 Omniboard 做什么的一个简短概述:
- 您可以访问实验管理功能,例如以可定制的表格格式列出所有实验运行
- 您可以在 UI 中比较实验
- 您可以访问实验的详细数据(度量图、源文件、工件、git 散列/版本控制信息等等)
- 仅支持连接到 MongoDB >= 4.0
这两个是一个伟大的组合,但有时,这是不够的,或者你可能只是不喜欢它。有一种方法可以组合工具或者用更适合你的解决方案来代替它们。你只需要知道外面有什么。以下是最好的神圣+全能替代品。让我们深入了解一下。
全方位替代方案
Omniboard 是神圣(这是一个实验数据库)的主要前端(UI)。但是您可以使用其他选项,尤其是如果您想要更大的灵活性。
有些人可能想继续使用神圣的日志 API,但是使用其他的 UI。这里有两个很好的选择。
Neptune 是为运行大量实验的研究和生产团队构建的 MLOps 的元数据存储。Neptune 提供了一个开源的 Python 库,允许用户记录任何实验,因此它不局限于深度学习。
Neptune 中的项目可以有多个角色不同的成员(查看者、贡献者、管理员),因此所有登陆 Neptune 的机器学习实验都可以被每个团队成员查看、共享和讨论。Neptune 旨在提供一种易于使用和快速学习的方法来跟踪 ML 生命周期中生成的所有元数据。
海王星适合任何工作流程,并提供了很大的灵活性。说到神圣, Neptune 拥有神圣的集成,用自己的观察者取代了 Omniboard 和 MongoDB 后端。通过集成,您可以记录神圣的实验,并直接在 Neptune 中管理它们:
- 您不必设置数据库,
- 您的所有数据都记录到云中,或者,如果您愿意,也可以记录到本地
- 你所要做的就是简单地将 NeptuneObserver 添加到实验中:
ex = Experiment('image_classification', interactive=True)
ex.observers.append(NeptuneObserver(run=neptune_run))
就像 Omniboard 一样,Sacredboard 是一个神圣的网络仪表板。它可以让你访问和监控你过去所有的 ML 实验。
该工具连接到由 Sacred 使用的 MongoDB 数据库,并显示实验列表、它们的状态、Sacred 配置和运行程序的标准输出。
如果你想让它正常工作,你需要 Python 3.5 和一个现代化的网络浏览器。
与 Omniboard 相比,它的功能可能有点有限,因为它的改进是一个缓慢的过程。但是如果你正在寻找一个不同的解决方案,你会发现圣木板足够了。
以下是的一些主要特点:
- 您可以直接从 web 控制台运行 Tensorboard 来查看详细信息、图表和 Tensorflow 图形可视化
- 你可以过滤实验
- 您可以在表格中了解正在进行的和已完成的实验的概况
神圣的选择
神圣和 Omniboard 是很好的组合,但是你也可以完全替换神圣,使用不同的日志 API。看看这两个例子。
MLflow 是一个开源平台,有助于管理整个机器学习生命周期——实验、再现性、部署和中央模型注册。
该工具与库无关。你可以用任何机器学习库和任何编程语言来使用它。
ml flow—摘要:
- 您可以在运行机器学习代码时记录参数、代码版本、指标和工件,以便以后可视化和比较结果
- 可重复使用、可复制的 ML 代码打包形式允许您与其他数据科学家共享它或将其转移到生产中
- 您可以从不同的 ML 库中管理和部署模型到各种模型服务和推理平台
- 中央模型存储允许您协作管理 MLflow 模型的整个生命周期,包括模型版本控制、阶段转换和注释
Guild AI 是一个运行、跟踪和比较实验的工具。Guild AI 是跨平台和框架独立的——你可以使用任何库用任何语言训练和捕捉实验。公会人工智能运行你未修改的代码,所以你可以使用你想要的库。该工具不需要数据库或其他基础设施来管理实验,简单易用。
帮会 AI–总结:
- 让您跟踪任何模型训练和任何编程语言的实验
- 拥有自动化的机器学习流程
- 与任何语言和库集成
- 远程培训和备份的可能性
- 你可以复制你的结果或重现实验
把它包起来
在神圣+ Omniboard 中进行机器学习实验肯定是高效的。但是结合不同的工具会给你更多的灵活性和自由,这样你就可以在工作中获得最好的效果。尝试不同的组合是值得的,这样你就可以坚持最有效的组合。
我们希望你能找到感兴趣的东西。快乐实验!
最佳的冲浪板替代品
原文:https://web.archive.org/web/https://neptune.ai/blog/the-best-tensorboard-alternatives
TensorBoard 是 TensorFlow 的开源可视化工具包,可以让您分析模型训练运行。它允许您跟踪和可视化机器学习实验的各个方面,如度量或模型图,查看张量的权重和偏差直方图等。
为此,TensorBoard 符合对工具的持续需求的趋势,以跟踪和可视化机器学习实验。虽然它可以让你深入研究实验,但有一些 TensorBoard 没有的功能,这些功能在实验跟踪过程中非常有用。
使用 TensorBoard 时,您可能面临的主要挑战包括:
- TensorBoard 在更多的实验中没有很好地扩展;
- 当你想比较多次运行时,用户体验远非完美;
- TensorBoard 在本地工作,所以当你在不同的机器上操作时,很难跟踪所有的事情;
- 与他人分享结果是一件痛苦的事情——你只需要找到一个解决方法(比如截图),因为没有现成的解决方案。
总的来说,当你刚刚开始实验跟踪和可视化,或者你没有运行大量实验时,TensorBoard 似乎是一个很好的工具。用 TensorFlow 训练的时候也很方便(不然没那么好设置)。但是,它不如市场上的其他工具先进,并且不能在团队环境中提供最佳体验。
如果你在 TensorBoard 工作时遇到了这些问题中的任何一个,或者只是想看看外面还有什么,那么你来对地方了。
以下是你应该看看的 TensorBoard 的最佳选择:
Neptune 是为进行大量实验的研究和生产团队构建的 MLOps 的元数据存储库。
它为您提供了一个记录、存储、显示、组织、比较和查询所有模型构建元数据的单一位置。这包括指标和参数,还包括模型检查点、图像、视频、音频文件、数据版本、交互式可视化、和更多。您还可以创建包含所有这些元数据的定制仪表板,并与您的同事、团队经理甚至外部利益相关者共享它们。以下是这种仪表板的一个示例:
如果你在团队中工作,海王星是完美的。它允许您与多个团队成员一起创建项目,管理用户访问,共享工作,并将所有结果备份在一个位置。
评估模型和比较运行也很容易,因为有四种不同的比较视图可用——图表、平行坐标、并排表格仪表板和工件比较部分。
海王星——概要:
- 通过成千上万次运行进行扩展——无论您有 5 次还是 100 次实验,Neptune 都能提供同样出色的用户体验;
- UI 很干净,易于导航,非常直观;
- 在本地版本中可用,但也作为托管的应用;
- 快速简单的设置和出色的客户支持;
- 团队中的协作受到多种特性的有力支持。
如果你想看海王星在行动,检查这个现场笔记本或这个例子项目(不需要注册),只是玩它。
TensorBoard vs 海王星
TensorBoard 是一个开源工具,可以帮助跟踪和可视化 ML 运行。另一方面,Neptune 是一个托管解决方案,它在实验跟踪领域提供了更多的特性,并且还提供了模型注册、模型监控和数据版本控制功能。Neptune 支持团队协作,比 TensorBoard 更具可扩展性。
检查 TensorBoard 和 Neptune 之间的深度比较。
阅读 InstaDeep 的案例研究,了解他们为什么从 TensorBoard 转行到 Neptune。
这是一个开源的机器学习平台,用于运行和比较模型训练例程。
它主要是一个 CLI 工具,让你以系统的方式运行和比较训练作业,而 Guild AI 则捕获源代码、日志和生成的文件。
与 TensorBoard 不同,它不限于 tensor flow/深度学习工作。相反,Guild AI 是平台和编程语言不可知的,所以你可以在你当前的技术栈中自由使用它。
如果你是一个 CLI 爱好者,这可以成为你的一个工具,大多数使用是通过终端中的命令。
帮会 AI——总结:
- 实验跟踪:任何模型训练,任何编程语言
- 在团队中共享工作:不支持
- 与其他工具集成:不支持
- SaaS/本地实例是否可用:否/是
- 奖励:准备充分的文档
TensorBoard vs 公会 AI
公会 AI 的范围比 TensorBoard 的要广得多。Guild AI 允许您跟踪实验、调整超参数、自动化管道等,而 TensorBoard 主要用于跟踪和可视化运行。公会人工智能可以运行在任何云或本地环境。另一方面,TensorBoard 是本地托管的。
研究机构 IDSIA (瑞士人工智能实验室)开发的另一个开源工具。Sacred 是一个 Python 库,帮助配置、组织、记录和复制实验。
Sacred 提供了一种使用配置的编程方式。观察者的概念允许用户跟踪与实验相关的各种类型的数据。
神圣的一个好处是它有自动播种功能——在需要重现实验时非常有用。
与 TensorBoard 不同——与本次比较中的工具相似 Sacred 的优势在于它能够跟踪用任何 Python 库开发的任何模型训练。
神圣——摘要:
- 实验跟踪:任何模型训练
- 在团队中共享工作:不支持
- 与其他工具集成:不支持
- SaaS/本地实例是否可用:否/是
注意:神圣没有自带合适的用户界面,但有一些你可以连接到它的仪表板工具,如 Omniboard,Sacredboard,或 Neptune via integration 。
TensorBoard vs 神圣
TensorBoard 和 Sacred 都是开源的,适合相当不高级的项目(就可伸缩性而言)。TensorBoard 附带了 UI,而您需要将神圣与仪表板工具配对,因此 TensorBoard 附带了更好的开箱即用可视化功能。
WandB 专注于深度学习。用户使用 Python 库跟踪应用程序的实验,并且作为一个团队,可以看到彼此的实验。
与 TensorBoard 不同,WandB 是一种托管服务,允许您在一个地方备份所有实验,并与团队合作完成一个项目——可以使用工作共享功能。
与 TensorBoard 类似,在 WandB 中,用户可以记录和分析多种数据类型。
权重&偏差—汇总:
- 实验跟踪:任何模型训练
- 团队共享工作:团队共享的多种特性。
- 与其他工具的集成:几个可用的开源集成
- SaaS/本地实例可用:是/是
- 额外的好处:WandB 记录了模型图,因此您可以在以后检查它。
张量板与重量和偏差
第一个,TensorBoard 是一个本地运行的开源工具。WandB 提供的托管服务既可以在内部部署,也可以在云中运行。这里,Weight & Biases 提供了比 TensorBoard 更广泛的功能,包括实验跟踪、数据集版本化和模型管理。除此之外,WandB 还有很多支持团队协作的功能,这是 TensorBoard 所没有的。
Comet 是一个元机器学习平台,用于跟踪、比较、解释和优化实验和模型。
就像许多其他工具一样——例如 Neptune 或 WandB——Comet 提出了一个开源的 Python 库,允许数据科学家将他们的代码与 Comet 集成,并开始在应用程序中跟踪工作。
由于它提供云托管和自托管,用户可以有团队项目,并保存实验历史的备份。
Comet 正在通过预测性早期停止(免费版软件不提供)和神经结构搜索(未来)向更自动化的 ML 方法靠拢。
彗星—摘要:
- 实验跟踪:任何模型训练
- 团队共享工作:团队共享的多种特性。
- 与其他工具的集成:应该由用户手动开发
- SaaS/本地实例可用:是/是
- 额外收获:显示平行图来检查参数和指标之间的关系模式。
张量板 vs 彗星
Comet 是一种托管服务,可以在内部提供,也可以作为托管应用程序提供。TensorBoard 是一个开源的可视化和跟踪工具,可以在本地使用。虽然 Comet 旨在使数据科学家能够在整个模型生命周期(从研究到生产)中建立更好的模型,但 TensorBoard 专注于实验阶段。
总结一下
第一次寻找实验追踪和可视化工具时,TensorBoard 往往似乎是一个不错的选择。它是开源的,提供了所有必要的特性。但是你越是使用它,你的需求就越是增长,你就会注意到一些缺失的部分。这就是为什么最好检查一下还有什么可用的工具,看看其他工具是否能在您的需求列表上勾选更多的框。
如果你是这种情况——你正在寻找一个更先进的工具,类似于使用 TensorBoard 后的下一步——我们建议检查 Neptune 或 Weights & Biases。这些都是出色的托管服务,具有大量功能和团队协作能力。如果你只是想切换到另一个开源解决方案,神圣的可能是正确的选择。
不管你的动机是什么,希望你在这里找到了一些值得检查的 TensorBoard 替代品,我们帮助你做出正确的选择!
机器学习模型可视化的最佳工具
“每个模型都是错的,但有些是有用的”这句话在机器学习中尤其成立。在开发机器学习模型的时候,你要时刻明白它在哪里按预期工作,在哪里惨败。
理解模型的一个重要方法是通过模型可视化。可视化模型架构对于以下方面非常重要:
- 模型可解释性
- 结果解释
- 模型调试
- 模型比较
阅读有关模型可视化的更多信息
一旦你对一个模型有了一定的了解,你就很棒了,对吗?错误的🙂
通常,你需要做一些或者很多模型改进想法的实验,并且可视化不同 ML 实验之间的差异变得至关重要。
有许多方法可以让你理解这一点:
- 查看评估指标(此外,您应该知道如何为您的问题选择评估指标
- 看看性能图表,如 ROC、升力曲线、混淆矩阵等
- 查看学习曲线以估计过度拟合
- 查看最佳/最差情况下的模型预测
- 看看模型训练和推理的资源密集程度(它们转化为严重的成本,并且对业务方面的事情至关重要)
- 使用模型解释工具和技术来审查预测(进一步阅读)
你可以自己完成所有这些(或者大部分),但是今天有一些工具你可以使用。如果你正在寻找能够帮助你可视化机器学习实验和模型的最佳工具,那么你来对地方了。
机器学习实验可视化工具
*Example of model training metadata displayed in a dashboard | *See in the app
Neptune 是 MLOps 的元数据存储库,为运行大量实验的团队而构建。它为您提供了一个单一的位置来记录、存储、显示、组织、比较和查询您所有的模型构建元数据。
海王星是用 for:
- 实验跟踪:在一个地方记录、显示、组织和比较 ML 实验。
- 模型注册:对训练好的模型和建模元数据进行版本化、存储、管理和查询。
- 实时监控 ML 运行:实时记录和监控模型培训、评估或生产运行。
海王星如何帮助你可视化实验和模型?
- 记录任何元数据类型,包括参数和指标,以及丰富的对象,如图像、视频、音频和交互式可视化。
- 可视化记录的元数据并以首选方式分析结果——以运行表、图表、仪表板或文件夹结构的形式。
- 使用智能对照表对比多次运行的超参数和指标,该对照表突出显示了不同之处。
- 查看不同的参数和配置如何影响结果,并调试和优化模型。
- 自动监控硬件利用率 (GPU、CPU、内存)。
- 注册模型和与之相关的元数据。
Weights & Biases 是一个机器学习平台,供开发人员更快地建立更好的模型。它可以让您快速跟踪实验、对数据集进行版本控制和迭代、评估模型性能、重现模型、可视化结果和发现回归,并与同事分享发现。
权重&偏差如何帮助你可视化实验和模型?
- 监控训练运行信息,如损失、准确性(学习曲线)
- 查看权重和偏差(没有双关语)或梯度的直方图
- 在培训期间记录丰富的对象,如图表、视频、音频或交互式图表
- 使用各种比较工具,如显示自动差异的表格、平行坐标图等
- 交互式预测对象检测模型的包围盒可视化
- 交互式预测掩码语义分割模型的可视化
- 可视化实时指标,如 GPU 和 CPU 利用率
- 构建数据集依赖关系图
- 可视化参数重要性
Comet 是一个元机器学习平台,用于跟踪、比较、解释和优化实验和模型。它还允许您实时监控、检测和警报以及调试生产模型。您还可以基于实验和模型数据构建自己的或使用社区提供的自定义可视化和应用程序。
彗星如何帮助你可视化实验和模型?
- 使用视觉、音频、文本和表格数据的专用模块可视化样本,以检测过度拟合并轻松识别数据集的问题
- 您可以自定义和组合您的可视化
- 你可以监控你的学习曲线
- Comet 灵活的实验和可视化套件允许您记录、比较和可视化许多工件类型
- 构建您自己的或使用社区构建的“面板”来可视化您的模型和实验
- 实时监控生产模型
TensorBoard 提供了机器学习实验所需的可视化和工具。它是开源的,为机器学习模型的可视化和调试提供了一套工具。TensorBoard 是市场上最受欢迎的解决方案;因此,它与许多其他工具和应用程序广泛集成。
更重要的是,它有一个广泛的工程师网络使用这个软件,分享他们的经验和想法。这使得一个强大的社区准备解决任何问题。然而,该软件本身最适合个人用户。
TensorBoard 如何帮助你可视化实验和模型?
- 跟踪和可视化损失和准确性等指标
- 可视化模型图(操作和层)
- 查看权重、偏差或其他张量随时间变化的直方图
- 将嵌入投影到低维空间
- 显示图像、文本和音频数据
- 剖析张量流程序
5.神圣+全能
神圣+ Omniboard 堆栈实际上由两个开源组件组成——Sacred,一个实验管理工具,和 Omniboard,一个神圣的网络仪表板。神圣记录实验数据到 MongoDB 后端,Omniboard 连接到这个后端来可视化实验。
神圣给你一个强大的命令行界面,观察员记录实验信息,并自动播种控制实验的随机性,使结果是可重复的。Omniboard 通过它的一套实验管理、深入研究和比较功能对此进行了补充。
神圣+ Omniboard 如何帮助你可视化实验和模型?
- 神圣的 CLI 可用于更新参数和运行同一实验的不同变体
- 在 MongoDB 数据库中保存实验配置
- 在 Omniboard 仪表板上比较不同的实验
- 上滚或下钻实验,以查看集合或单个细节
MLflow 是一个管理端到端机器学习生命周期的开源平台。它是目前使用最广泛的 ML 实验跟踪器,因此得到了各种语言、框架和平台的广泛支持。MLflow 支持通过 Python、R、Java 和 REST APIs 进行日志记录。
作为一个开源项目,MLflow 个人使用没有直接成本。然而,如果您希望使用 MLflow 在大型团队之间进行协作,基础设施成本将会增加,因为您需要拥有自己的远程跟踪服务器。Databricks 的托管 MLflow 为您提供托管服务。
ml flow 如何帮助你可视化实验和模型?
对照表:ML 实验可视化工具
实验跟踪是所有上述产品的核心用例,因此,大多数产品都提供类似的功能。但是,有些功能并非所有工具都支持。下表强调了上述工具在功能上的一些差异。
海王星
W&B
彗星
张量板
神圣+全能
MLflow
Sacred + Omniboard:
计算机编程语言
可以汇总记录的指标吗?
可以记录硬件消耗吗?
用于实验比较的表格格式差异?
实验参数分组依据?
平行坐标图?
MLflow:
仅在托管版本中
数据的并排比较?
Neptune:
图像、表格、文本
W&B:
音频、HTML、图像、表格、文本、视频
Comet:
绘图、表格、文本
机器学习模型可视化工具
dtreeviz 是一个用于决策树可视化和模型解释的 python 库。目前支持 scikit-learn 、 XGBoost 、 Spark MLlib 和 Lig htGBM 树。从 1.3 版本开始,还支持任何具有 predict_proba()的模型的特征空间插图。
dtreevix 如何帮助您可视化模型?
- 可视化基于树的模型
- 说明支持的分类器的特征空间
- 突出显示树中单个观察值的预测路径,并获得相同的简单英语解释
- 可视化叶片指标,如纯度、样品和目标分布
- 在特征空间中可视化分类边界。
Netron 可用于生成神经网络模型的交互式可视化。它以 Python 包、独立应用程序和浏览器应用程序的形式提供。
Netron 如何帮你可视化模型?
- 生成神经网络的交互式可视化
- 展开节点以查看图层详细信息
- 支持几乎所有广泛使用的框架
- 无需安装即可使用浏览器应用
NN-SVG 是一个托管应用程序,用于参数化而非手动创建神经网络(NN)架构图。它还提供了将这些绘图导出到可缩放矢量图形(SVG)文件的能力,适合包含在学术论文或网页中。
NN-SVG 如何帮助你可视化模型?
- 完全托管的应用程序,无需安装
- 支持 FCNN、LeNet 和 AlexNet 样式
- 高度可定制
- 将生成的原理图导出为 SVG 图像
TensorBoard 主要是一个实验可视化工具,但它也显示 TensorFlow 模型的模型图。
tensor board 如何帮助你可视化模型?
- 可视化张量流模型图
- 跟踪和记录张量流实验
- 提供了一个完全管理的版本—tensor board . dev——它允许您托管、跟踪和共享您的 ML 实验
摘要
在这篇博客中,我们介绍并比较了一些目前最流行的模型和可视化工具。与 ML 领域的大多数工具一样,没有一种工具是万能的,使用哪种工具在很大程度上取决于您的具体用例。
您希望可视化什么样的模型?你可视化的目的是什么?
大多数模型可视化工具都是针对特定的架构和用例而构建的。
- 对于基于树的模型, dtreeviz 是一个不错的选择。
- TensorBoard 与 Tensorflow/Keras 模型集成得非常好。
- 如果你只是想为你的神经网络模型创建一个非交互式的可视化的例子, NN-SVG 可能会节省你一些时间。
- Netron 制作详细的神经网络模型的交互式可视化,这对调试和优化有很大帮助。
你是一个预算有限的小团队吗?
如果是的话,一些开源和免费工具可能是不错的开始。但是,请记住,随着您的团队的增长,您的自托管成本也会增长。您也可以考虑定价不取决于用户数量的 SaaS 解决方案(例如 Neptune)。这样,当你的需求增加时,你会有更好的准备。
您是一个寻求协作开发的大型团队吗?
大多数 SaaS 解决方案具有丰富的协作功能,如基于 URL 的共享、协作仪表板、报告、用户管理等。
无论如何,希望这篇文章能帮助你做出选择,你会找到你一直在寻找的东西。
快乐观想!
西达丹·萨达特
我目前是 Neptune.ai 的一名开发人员,我坚信最好的学习方式是边做边教。
阅读下一篇
ML 实验跟踪和管理的 15 个最佳工具
10 分钟阅读|作者 Patrycja Jenkner |年 8 月 25 日更新
在进行机器学习项目时,从单次模型训练中获得好的结果是一回事。但是,让你所有的机器学习实验保持良好的组织,并有一个让你从中得出有效结论的过程,则完全是另一回事。
这些需求的答案就是实验追踪。在机器学习中,实验跟踪是保存所有实验相关信息的过程,这些信息是你在每次实验中所关心的。
ML 团队以不同的方式实现实验跟踪,可能是通过使用电子表格、GitHub 或自建平台。然而,最有效的选择是使用专门为跟踪和管理 ML 实验而设计的工具。
在这篇文章中,我们概述并比较了 15 个最好的工具,它们可以让你跟踪并管理你的 ML 实验。你将了解它们的主要特征,并看到它们之间的不同之处。希望这将有助于您评估它们,并根据您的需求选择合适的产品。
如何评价一个实验跟踪工具?
“最好的实验跟踪工具是什么?”这个问题没有答案。当你单独工作或在团队中工作时,你的动机和需求可能完全不同。根据您的角色,您可能会寻找各种功能。
如果你是数据科学家或研究人员,你应该考虑:
- 如果该工具带有 web 用户界面或基于控制台;
- 如果您能够将该工具与您首选的模型培训框架相集成;
- 您可以记录、显示和比较哪些元数据(代码、文本、音频、视频等。);
- 你能容易地比较多次跑步吗?如果是,以什么格式——只有表格,还是还有图表;
- 如果通过实验来组织和搜索是用户友好的;
- 如果您可以自定义元数据结构和仪表板;
- 如果该工具让您跟踪硬件消耗;
- 与其他团队成员合作有多容易——你能分享一个实验的链接吗,或者你必须使用截图作为解决方法?
作为一名 ML 工程师,你应该检查这个工具是否让你:
- 轻松重现和重新运行实验;
- 跟踪和搜索实验谱系(下游使用的数据/模型/实验);
- 保存、获取和缓存实验数据集;
- 将它与您的 CI/CD 渠道集成;
- 轻松地与同事协作和共享工作。
最后,作为一名 ML 团队领导,你会对以下内容感兴趣:
- 一般业务相关的东西,如定价模型、安全性和支持;
- 该工具需要多少基础设施,将其集成到您当前工作流的难易程度;
- 产品是作为商业软件、开源软件还是托管云服务交付的?
- 它具有什么样的协作、共享和审阅功能。
在回顾市场上的工具时,我确保牢记这些动机。所以让我们仔细看看它们。
Python 中强化学习的最佳工具是你真正想尝试的
如今,深度强化学习 (RL)是数据科学界最热门的话题之一。快速开发的快速发展导致了对易于理解和方便使用的快速开发工具的需求不断增长。
近年来,大量的 RL 库被开发出来。这些库被设计成拥有实现和测试强化学习模型的所有必要工具。
尽管如此,他们还是有很大的不同。这就是为什么选择一个快速、可靠、与你的 RL 任务相关的库是很重要的。
在本文中,我们将涵盖:
- 选择深度强化学习库的标准,
- RL 库: Pyqlearning , KerasRL , Tensorforce ,RL _ 蔻驰, TFAgents , MAME RL , MushroomRL 。
用于强化学习的 Python 库
有很多 RL 库,因此为您的情况选择正确的库可能是一项复杂的任务。我们需要形成标准来评估每个库。
标准
本文中的每个 RL 库都将基于以下标准进行分析:
- 实施的最先进的(【SOTA】)RL 算法的数量——我认为最重要的一个
- 官方文档、简单教程和示例的可用性
- 易于定制的可读代码
- 支持环境的数量——这是强化学习库的关键决定因素
- 记录和跟踪工具支持——例如 Neptune 或 TensorBoard
- 矢量化环境 ( VE )特征——进行多进程训练的方法。使用并行环境,你的代理将会经历比单一环境更多的情况
- 定期更新–RL 发展非常迅速,您希望使用最新技术
我们将讨论以下库:
角膜的
KerasRL 是一个深度强化学习 Python 库。它实现了一些最先进的 RL 算法,并与深度学习库 Keras 无缝集成。
此外, KerasRL 与 OpenAI Gym 开箱即用。这意味着你可以很容易地评估和使用不同的算法。
要安装 KerasRL ,只需使用一个 pip 命令:
pip install keras-rl
让我们看看 KerasRL 是否符合标准:
- 实施的 SOTA RL 算法的数量
到今天为止,KerasRL 已经实现了以下算法:
- 深度 Q-Learning ( DQN )及其改进(双和对决)
- 深度确定性政策梯度 ( DDPG )
- 连续 DQN ( CDQN 或 NAF )
- 交叉熵方法 ( CEM )
- 深 SARS
你可能已经注意到了, KerasRL 忽略了两个重要因素:行动者批评方法和邻近政策优化(PPO)。
- 官方文档、教程和示例的可用性
代码很容易阅读,并且充满了注释,这非常有用。尽管如此,文档似乎不完整,因为它错过了参数和教程的解释。此外,实际例子也有许多不足之处。
- 易于定制的可读代码
非常容易。您需要做的就是按照示例创建一个新的代理,然后将其添加到 rl.agents 。
- 支持的环境数量
KerasRL 被要求只与开放健身馆合作。因此,如果要使用任何其他环境,您需要修改代理。
- 日志和跟踪工具支持
未实现日志和跟踪工具支持。不过,你可以用 海王星来追踪你的实验。
- 矢量化环境特征
包括矢量化的环境特征。
- 定期更新
该库似乎不再维护,因为上次更新是在一年多以前。
综上所述, KerasRL 有一套很好的实现。不幸的是,它错过了有价值的点,如可视化工具,新的架构和更新。你应该使用另一个图书馆。
Pyqlearning
Pyqlearning 是实现 RL 的 Python 库。重点介绍了 Q-Learning 和多智能体深度 Q-Network。
Pyqlearning 为设计师提供组件,而不是为最终用户提供最先进的黑匣子。因此,这个库很难使用。你可以用它来设计信息搜索算法,比如 GameAI 或者 web crawlers。
要安装 Pyqlearning ,只需使用一个 pip 命令:
pip install pyqlearning
让我们看看 Pyqlearning 是否符合标准:
- 实施的 SOTA RL 算法的数量
到今天为止,Pyqlearning 已经实现了以下算法:
- 深度 Q 学习 ( DQN )及其改进(ε贪心和玻尔兹曼)
您可能已经注意到, Pyqlearning 只有一个重要的代理。这个图书馆还有许多需要改进的地方。
- 官方文档、教程和示例的可用性
Pyqlearning 有几个不同任务的例子和两个由 Deep Q-Network 开发的迷宫解决和追逃游戏教程。你可以在官方文件中找到它们。文档似乎不完整,因为它关注的是数学,而不是库的描述和使用。
- 易于定制的可读代码
Pyqlearning 是一个开源库。源代码可以在 Github 上找到。代码缺少注释。定制它可能是一项复杂的任务。不过,教程可能会有所帮助。
- 支持的环境数量
因为这个库是不可知的,所以添加到任何环境都相对容易。
- 日志和跟踪工具支持
作者在教程中使用了一个简单的日志包。 Pyqlearning 不支持其他测井和跟踪工具,例如 TensorBoard 。
- 矢量化环境特征
Pyqlearning 不支持矢量化环境功能。
- 定期更新
图书馆得到了维护。最后一次更新是在两个月前。尽管如此,开发过程似乎是一个缓慢的过程。
总而言之,学习还有许多不足之处。这不是一个你通常会用到的库。因此,您可能应该使用其他东西。
张量力
Tensorforce 是一个基于谷歌 Tensorflow 框架构建的开源深度 RL 库。它的用法很简单,有可能成为最好的强化学习库之一。
Tensorforce 拥有与其他 RL 库不同的关键设计选择:
- 基于组件的模块化设计:最重要的是,功能实现往往尽可能地具有通用性和可配置性。
- RL 算法与应用的分离:算法不知道输入(状态/观察)和输出(动作/决策)的类型和结构,以及与应用环境的交互。
要安装 Tensorforce ,只需使用一个 pip 命令:
pip install tensorforce
让我们看看 Tensorforce 是否符合标准:
- 实施的 SOTA RL 算法的数量
截至今天, Tensorforce 已经实施了以下算法:
- 深度 Q-Learning ( DQN )及其改进(双和对决)
- 香草政策梯度 ( PG
- 深度确定性政策梯度 ( DDPG )
- 连续 DQN ( CDQN 或 NAF )
- 演员评论家 ( A2C 和 A3C )
- 信任区域政策优化 ( TRPO
- 近端策略优化 ( PPO )
你可能已经注意到了, Tensorforce 错过了软演员评论家 ( SAC )实现。此外,它是完美的。
- 官方文档、教程和示例的可用性
由于有各种简单的例子和教程,开始使用 Tensorforce 非常容易。官方文档看起来很完整,浏览起来也很方便。
- 易于定制的可读代码
Tensorforce 得益于其模块化设计。架构的每个部分,例如网络、模型、转轮都是不同的。因此,您可以轻松地修改它们。然而,代码缺少注释,这可能是一个问题。
- 支持的环境数量
Tensorforce 与多种环境协同工作,例如 OpenAI Gym 、 OpenAI Retro 和 DeepMind Lab 。它也有帮助您插入其他环境的文档。
- 日志和跟踪工具支持
该库支持 TensorBoard 和其他测井/跟踪工具。
- 矢量化环境特征
Tensorforce 支持矢量化环境特征。
- 定期更新
Tensorforce 定期更新。最近一次更新是在几周前。
综上所述, Tensorforce 是一款强大的 RL 工具。它是最新的,并且拥有开始使用它所需的所有文档。
蔻驰 RL
英特尔 AI Lab 的强化学习蔻驰 ( 蔻驰)是一个 Python RL 框架,包含许多最先进的算法。
它公开了一组易于使用的 API,用于试验新的 RL 算法。该库的组件,例如算法、环境、神经网络架构是模块化的。因此,扩展和重用现有的组件是相当容易的。
要安装蔻驰只需使用一个 pip 命令。
pip install rl_coach
尽管如此,你还是应该查看官方安装教程,因为需要一些先决条件。
让我们看看蔻驰是否符合标准:
- 实施的 SOTA RL 算法的数量
截至今天,RL _ 蔻驰已经实施了以下一组算法:
你可能已经注意到了,RL _ 蔻驰有多种算法。这是本文涵盖的所有库中最完整的一个。
- 官方文档、教程和示例的可用性
文档已完成。还有,RL _ 蔻驰有一套很有价值的教程。新人开始使用它会很容易。
- 易于定制的可读代码
RL _ 蔻驰是开源库。它受益于模块化设计,但代码缺乏注释。定制它可能是一项复杂的任务。
- 支持的环境数量
蔻驰支持以下环境:
- OpenAI 健身房
- ViZDoom
- 职业学校
- 体操伸展运动
- 子弹
- 卡拉
- 和其他
更多信息,包括安装和使用说明,请参考官方文档。
- 日志和跟踪工具支持
蔻驰支持各种日志和跟踪工具。它甚至有自己的可视化仪表盘。
- 矢量化环境特征
RL _ 蔻驰支持矢量化环境特征。有关使用说明,请参考文档。
- 定期更新
图书馆似乎得到了维护。然而,上一次重大更新几乎是在一年前。
总而言之,RL _ 蔻驰实现了一套完美的最新算法。而且是新人友好的。我强烈推荐蔻驰。
切线
TFAgents 是一个 Python 库,旨在简化 RL 算法的实现、部署和测试。它具有模块化结构,并提供了经过充分测试的组件,可以很容易地修改和扩展。
TFAgents 目前正在积极开发中,但即使是目前的组件集也使其成为最有希望的 RL 库。
要安装 TFAgents ,只需使用一个 pip 命令:
pip install tf-agents
让我们看看 TFAgents 是否符合标准:
- 实施的 SOTA RL 算法的数量
到今天为止, TFAgents 已经实现了以下算法集:
- 深度 Q-Learning ( DQN )及其改进(双)
- 深度确定性政策梯度 ( DDPG )
- TD3
- 加固
- 近端策略优化 ( PPO )
- 软演员评论家 ( 囊)
总的来说, TFAgents 已经实现了一套很好的算法。
- 官方文档、教程和示例的可用性
TFAgents 有一系列关于每个主要组件的教程。尽管如此,官方文件似乎不完整,我甚至可以说没有。然而,教程和简单的例子完成了它们的工作,但是缺少写得好的文档是一个主要的缺点。
- 易于定制的可读代码
代码充满了注释,实现非常简洁。 TFAgents 似乎有最好的库代码。
- 支持的环境数量
图书馆是不可知论者。这就是为什么它很容易插入到任何环境中。
- 日志和跟踪工具支持
支持日志记录和跟踪工具。
- 矢量化环境特征
支持矢量化环境。
- 定期更新
如上所述, TFAgents 目前正在积极开发中。最近一次更新是在几天前。
综上所述, TFAgents 是一个非常有前途的库。它已经有了开始使用它的所有必要工具。不知道开发结束后会是什么样子?
稳定基线
稳定基线是基于 OpenAI 基线的强化学习 (RL)算法的一组改进实现。OpenAI 基线库不太好。这就是为什么稳定基线被创造出来。
稳定的基线为所有算法提供了统一的结构、可视化工具和优秀的文档。
要安装稳定基线,只需使用一个 pip 命令。
pip install story-baselines
尽管如此,你还是应该查看官方安装教程,因为需要一些先决条件。
让我们看看稳定基线是否符合标准:
- 实施的 SOTA RL 算法的数量
截至今天,稳定基线已经实施了以下一组算法:
- A2C
- ACER
- 背包
- DDPG
- DQN
- 她的
- 盖尔
- PPO1 和 PPO2
- 袋
- TD3
- TRPO
总的来说,稳定基线已经实现了一套很好的算法。
- 官方文档、教程和示例的可用性
文件完整且优秀。这套教程和例子也真的很有帮助。
- 易于定制的可读代码
另一方面,修改代码可能很棘手。但是因为稳定基线在代码和令人敬畏的文档中提供了许多有用的注释,修改过程将会不那么复杂。
- 支持的环境数量
稳定的基线提供了良好的文档关于如何插入到您的定制环境中,然而,您需要使用 OpenAI Gym 来完成。
- 日志和跟踪工具支持
稳定基线已实现张量板支持。
- 矢量化环境特征
大多数算法都支持矢量化环境特征。如果您想了解更多信息,请查看文档。
- 定期更新
最近一次主要更新是在大约两年前,但是由于文档定期更新,该库得到了维护。
综上所述,稳定基线是一个拥有一套很棒的算法和很棒的文档的库。你应该考虑把它作为你的 RL 工具。
蘑菇 RL
MushroomRL 是一个 Python 强化学习库,它的模块化允许你使用众所周知的 Python 库进行张量计算和 RL 基准测试。
它支持 RL 实验,提供经典 RL 算法和深度 RL 算法。MushroomRL 背后的想法包括提供大多数 RL 算法,提供一个公共接口,以便在不做太多工作的情况下运行它们。
要安装 MushroomRL 只需使用一个 pip 命令。
pip install mushroom_rl
让我们看看 MushroomRL 是否符合标准:
- 实施的 SOTA RL 算法的数量
到今天为止, MushroomRL 已经实现了以下一组算法:
- Q-学习
- 萨尔萨
- FQI
- DQN
- DDPG
- 袋
- TD3
- TRPO
- PPO
总的来说, MushroomRL 拥有你完成 RL 任务所需的一切。
- 官方文档、教程和示例的可用性
官方文件似乎不完整。它错过了有价值的教程,简单的例子也有很多不足之处。
- 易于定制的可读代码
代码缺少注释和参数描述。定制起来真的很难。虽然 MushroomRL 从来没有把自己定位为一个容易定制的库。
- 支持的环境数量
MushroomRL 支持以下环境:
- OpenAI 健身房
- DeepMind 控制套件
- MuJoCo
更多信息,包括安装和使用说明,请参考官方文档。
- 日志和跟踪工具支持
MushroomRL 支持各种日志和跟踪工具。我会推荐使用 TensorBoard 作为最受欢迎的一款。
- 矢量化环境特征
支持矢量化环境特征。
- 定期更新
图书馆得到了维护。最近一次更新是在几周前。
综上所述, MushroomRL 实现了一套很好的算法。尽管如此,它错过了教程和例子,这些在你开始使用一个新的库时是至关重要的。
RLlib
“RLlib 是一个用于强化学习的开源库,它为各种应用程序提供了高可扩展性和统一的 API。RLlib 原生支持 TensorFlow、TensorFlow Eager 和 PyTorch,但它的大部分内部是框架不可知的。?~ 网站
- 实施了许多先进的(SOTA) RL 算法
RLlib 全部实施了这些算法! PPO?它就在那里。 A2C 和 A3C?是的。 DDPG,TD3,沈飞?当然! DQN、彩虹、APEX???是的,有各种形状和味道!进化策略,黑斑羚,* 梦想家,R2D2,APPO,AlphaZero,SlateQ,LinUCB,LinTS,MADDPG,QMIX,… 住手!我不确定这些缩写是不是你编的。尽管如此,是的,RLlib 有他们所有人。点击查看完整列表。* - 官方文档、简单教程和示例的可用性
RLlib 拥有包含许多示例的全面文档。它的代码也得到了很好的评论。 - 易于定制的可读代码
用回调来定制 RLlib 是最容易的。虽然 RLlib 是开源的,并且您可以编辑代码,但这不是一件简单的事情。RLlib 代码库相当复杂,因为它的大小和许多层的抽象。这里的是一个指南,如果你想添加一个新的算法,它会帮助你。 - 支持的环境数量
RLlib 可以与几种不同类型的环境一起工作,包括 OpenAI Gym、用户定义、多代理以及批处理环境。在这里你会发现更多。 - 日志和跟踪工具支持
RLlib 具有广泛的日志功能。RLlib 将日志打印到标准输出(命令行)。您还可以在 Ray Dashboard 中访问日志(并管理作业)。在这篇文章中,我描述了如何扩展 RLlib 日志来发送指标到 Neptune。它还描述了不同的日志记录技术。强烈推荐阅读! - 矢量化环境(VE)特性
是的,看这里的。此外,可以将训练分布在多个计算节点上,例如在集群上。 - 定期更新
RLlib 得到维护和积极开发。
从我的经验来看,RLlib 是一个非常强大的框架,它涵盖了许多应用程序,同时仍然非常易于使用。也就是说,因为有很多抽象层,所以很难用你的代码来扩展,因为你甚至很难找到你应该把你的代码放在哪里!这就是为什么我会向那些寻求为生产而训练模型的开发人员推荐它,而不是那些必须快速改变算法和实现新功能的研究人员。
多巴胺
“多巴胺是强化学习算法快速原型化的研究框架。它旨在满足用户对一个小的、容易搜索的代码库的需求,在这个代码库中,用户可以自由地试验各种大胆的想法(推测性的研究)。?~ GitHub
- 实施了大量先进的(SOTA) RL 算法
它专注于支持先进的单 GPU DQN、彩虹、C51 和 IQN 代理。他们的 Rainbow 代理实现了 Hessel 等人认为最重要的三个组件:- n 步贝尔曼更新(参见 Mnih 等人,2016 年)
- 优先体验回放(Schaul 等人,2015 年)
- 分布式强化学习(C51 贝勒马尔等人,2017 年)
- 官方文档、简单教程和示例的可用性
在 GitHub repo 这里有简明的文档。它不是一个非常流行的框架,所以它可能缺少教程。然而,作者提供了许多训练和可视化的例子。 - 易于定制的可读代码
作者的设计原则是:- 轻松实验:让新用户能够轻松运行基准实验。
- 灵活的开发:让新用户很容易尝试研究想法。
- 紧凑而可靠:为一些久经考验的算法提供实现。
- 可再现性:促进结果的再现性。特别是,它们的设置遵循了 Machado 等人(2018)给出的建议。
- 支持的环境数量
主要是为了 Atari 2600 游戏。它支持 OpenAI 健身房。 - 日志记录和跟踪工具支持
它支持 TensorBoard 日志记录,并提供一些其他可视化工具,在 colabs 中提供,如录制代理播放的视频和 seaborn 绘图。 - 矢量化环境(VE)功能
不支持矢量化环境。 - 定期更新
多巴胺得以维持。
如果你在寻找一个基于 DQN 算法的可定制框架,那么这可能是你的选择。在引擎盖下,它使用 TensorFlow 或 JAX 运行。
旋转起来
“虽然 garage、Baselines 和 rllib 等奇妙的回购协议使已经在该领域的研究人员更容易取得进展,但他们将算法构建到框架中的方式涉及许多非显而易见的选择和权衡,这使得他们很难借鉴。[……]正在加速运行的 repo 中的算法实现旨在:
- 尽可能简单,同时仍然相当好,
- 并且彼此高度一致,以揭示算法之间的基本相似性。
它们几乎是完全自包含的,实际上它们之间没有共享的公共代码(除了日志记录、保存、加载和 MPI 实用程序),因此感兴趣的人可以单独研究每个算法,而不必挖掘无休止的依赖链来了解事情是如何完成的。实现被模式化,以使它们尽可能接近伪代码,从而最小化理论和代码之间的差距。?~ 网站
- 实施最先进(SOTA) RL 算法的数量
VPG、PPO、TRPO、DDPG、TD3、SAC - 官方文档、简单教程和示例的可用性
包含多个示例的优秀文档和教育材料。 - 易于定制的可读代码
这段代码可读性很高。根据我的经验,这是你能在那里找到的可读性最强的框架。每个算法都包含在它自己的两个注释良好的文件中。正因为如此,修改它也变得非常容易。另一方面,因为同样的原因更难维持。如果你添加一些东西到一个算法中,你也必须手动添加到其他算法中。 - 支持的环境数量
它支持开箱即用的 OpenAI Gym 环境,并依赖于其 API。因此您可以扩展它以使用符合该 API 的其他环境。 - 日志和跟踪工具支持
它有一个光记录器,可以将度量打印到标准输出(cmd)并保存到一个文件中。我已经写了关于如何给 SpinUp 增加 Neptune 支持的帖子。 - 矢量化环境(VE)功能
不支持矢量化环境。 - 保持定期更新
SpinningUp。
虽然它是作为教育资源而创建的,但代码的简单性和最先进的结果使它成为快速原型化您的研究想法的完美框架。我在自己的研究中使用它,甚至使用相同的代码结构在其中实现新的算法。你可以在这里找到一个我和我的同事从 AwareLab 转到 TensorFlow v2 的端口。
车库
garage 是一个用于开发和评估强化学习算法的工具包,以及一个附带的使用该工具包构建的最新实现库。[……]garage 最重要的特性是其全面的自动化单元测试和基准测试套件,这有助于确保 garage 中的算法和模块在软件变化时保持最先进的性能。?~ GitHub
- 实施的最先进(SOTA) RL 算法的数量
所有主要 RL 算法(VPG、PPO、TRPO、DQN、DDPG、TD3、SAC、…),以及它们的多任务版本(MT-PPO、MT-TRPO、MT-SAC)、元 RL 算法(任务嵌入、MAML、PEARL、RL2、…)、进化策略算法(CEM、CMA-ES)和行为克隆。 - 官方文档、简单教程和示例的可用性
包含许多示例和一些教程的全面文档,例如如何添加新环境或实施新算法。 - 易于定制的可读代码
它是一种灵活的结构化工具,用于开发、试验和评估算法。它为添加新方法提供了一个支架。 - 支持的环境数量
Garage 支持各种不同 RL 训练目的的外部环境库,包括 OpenAI Gym、DeepMind DM Control、MetaWorld、PyBullet 等。你应该可以很容易地添加你自己的环境。 - 日志和跟踪工具支持
车库日志支持许多输出,包括 std。输出(cmd)、纯文本文件、CSV 文件和 TensorBoard。 - 矢量化环境(VE)功能
它支持矢量化环境,甚至允许在集群上分布培训。 - 定期更新
车库被维护。
车库类似于 RLlib。这是一个具有分布式执行的大框架,支持像 Docker 这样的许多附加功能,这超出了简单的培训和监控。如果这样一个工具是你所需要的,比如在生产环境中,那么我会建议你将它与 RLlib 进行比较,选择你更喜欢的一个。
顶点
“Acme 是强化学习(RL)代理和代理构建块的库。Acme 致力于公开简单、高效和可读的代理,既作为流行算法的参考实现,又作为强大的基线,同时还提供足够的灵活性来进行新的研究。Acme 的设计还试图提供不同复杂程度的 RL 问题的多个入口点。?~ GitHub
- 实施的最新(SOTA) RL 算法数量
包括连续控制算法(DDPG、D4PG、MPO、分布式 MPO、多目标 MPO)、离散控制算法(DQN、英帕拉、R2D2)、示范学习算法(DQfD、R2D3)、规划和学习算法(AlphaZero)以及行为克隆。 - 官方文档、简单教程和示例的可用性
文档相当稀少,但是报告中有许多示例和 jupyter 笔记本教程。 - 易于定制的可读代码
代码易于阅读,但需要先学习其结构。很容易定制和添加您自己的代理。 - 支持的环境数量
Acme 环境循环假设一个实现 DeepMind 环境 API 的环境实例。因此,DeepMind 的任何环境都可以完美运行(例如 DM 控制)。它还提供了 OpenAI Gym 环境和 OpenSpiel RL 环境循环的包装。如果你的环境实现了 OpenAI 或者 DeepMind API,那么你应该不会有问题。 - 记录和跟踪工具支持
它包括一个基本的记录器,并支持打印到标准输出(cmd)和保存到 CSV 文件。我已经写了关于如何给 Acme 增加 Neptune 支持的帖子。 - 矢量化环境(VE)功能
不支持矢量化环境。 - 定期更新
Acme 得到维护和积极发展。
Acme 就像 SpinningUp 一样简单,但是如果涉及到抽象的使用,就更高级了。它使维护变得更容易——代码更容易重用——但另一方面,在修改算法时,更难找到实现中应该改变的确切位置。它支持 TensorFlow v2 和 JAX,第二个是一个有趣的选择,因为最近 JAX 获得了牵引力。
哄
“Coax 是一个模块化强化学习(RL) python 包,用于使用基于 JAX 的函数逼近器来解决 OpenAI 健身房环境。[…]将 coax 与其他包区分开来的主要原因是,它的设计符合核心 RL 概念,而不是代理的高级概念。这使得同轴电缆对于 RL 研究人员和实践者来说更加模块化和用户友好。?~ 网站
- 实施的最先进(SOTA) RL 算法数量
它实施了经典 RL 算法(SARSA、Q-Learning)、基于价值的深度 RL 算法(软 Q-Learning、DQN、优先化经验重放 DQN、Ape-X DQN)和策略梯度方法(VPG、PPO、A2C、DDPG、TD3)。 - 官方文档,简单教程和示例的可用性
清晰,如果有时令人困惑,有许多代码示例和算法解释的文档。它还包括 Pong、Cartpole、ForzenLake 和 Pendulum 环境下的跑步训练教程。 - 易于定制的可读代码
其他 RL 框架通常隐藏您(RL 实践者)感兴趣的结构。同轴电缆使网络体系结构占据了中心位置,因此您可以定义自己的转发功能。此外,同轴电缆的设计不知道你的训练循环的细节。您可以决定如何以及何时更新您的函数逼近器。 - 支持的环境数量
Coax 主要关注开放的健身房环境。但是,您应该能够将它扩展到实现该 API 的其他环境。 - 日志和跟踪工具支持
它利用了 Python 日志模块。 - 矢量化环境(VE)功能
不支持矢量化环境。 - 定期更新
同轴保持。
我建议出于教育目的使用同轴电缆。如果你想即插即用 RL 算法的细节,这是一个很好的工具。它也是围绕 JAX 建造的,这本身可能是一个优势(因为围绕它的炒作)。
离奇的
“我们的目标是让每个人都能获得深度强化学习。我们介绍了超现实,一个开源的,可复制的,可扩展的分布式强化学习框架。超现实为构建分布式强化学习算法提供了高层抽象。?~ 网站
- 实施了大量先进的(SOTA) RL 算法
它侧重于分布式深度 RL 算法。目前,作者实现了他们的 PPO 和 DDPG 的分布式变体。 - 官方文档、简单教程和示例的可用性
它提供了安装、运行和定制算法的基本文档。但是,它缺少代码示例和教程。 - 易于定制的可读代码
代码结构会把人吓跑,这对新手来说不是什么好事。也就是说,代码包含文档字符串,是可读的。 - 支持的环境数量
它支持 OpenAI Gym 和 DM 控制环境,以及机器人套件。Robosuite 是一个标准化的、可访问的机器人操作基准,具有 MuJoCo 物理引擎。 - 日志记录和跟踪工具支持
它包括用于分布式环境的专用日志记录工具,也允许您记录代理播放的视频。 - 矢量化环境(VE)功能
不支持矢量化环境。但是,它允许用户在集群上分发培训。 - 定期更新
好像不再维护了。
我把这个框架放在列表中主要是为了参考。如果你开发一个分布式 RL 算法,你可以从这个 repo 中学到一两件事,比如如何管理集群上的工作。尽管如此,还是有更好的选项可以开发,比如 RLlib 或 garage。
最后的想法
在这篇文章中,我们已经弄清楚了在选择 RL 工具时要注意什么,有哪些 RL 库,以及它们有哪些特性。
据我所知,最好的公共可用库是 Tensorforce 、稳定基线和RL _ 蔻驰。你应该考虑选择其中一个作为你的 RL 工具。它们都可以被认为是最新的,实现了一组很好的算法,并提供了有价值的教程和完整的文档。如果你想尝试不同的算法,你应该使用RL _ 蔻驰。对于其他任务,请考虑使用稳定基线或 Tensorforce 。
希望有了这些信息,你在为下一个项目选择 RL 库时不会有任何问题。
Vladimir Lyashenko 介绍了图书馆 KerasRL、Tensorforce、Pyqlearning、RL _ 蔻驰、TFAgents、稳定基线和 MushroomRL。
Piotr Januszewski 描述了库 RLlib、Dopamine、SpinningUp、garage、Acme、coax 和超现实。
可视化机器学习实验的度量和超参数的最佳工具
在关键指标上评估您的模型是理解您的模型质量的关键的第一步。跟踪超参数和相应的评估指标非常重要,因为超参数的微小变化有时会对模型质量产生重大影响。
因此,了解哪些超参数会影响评估指标,哪些不会影响评估指标,可以获得有价值的见解。这就是为什么您应该可视化这些参数对您的指标的影响,并知道您的模型在所有 ML 实验中的性能。
为了帮助你,我收集了一个推荐工具的列表,这些工具将为你完成单调乏味的工作。
以下是可视化机器学习实验的度量和超参数的最佳六种工具。
Neptune 是为运行大量实验的研究和生产团队构建的 MLOps 的元数据存储。
您可以使用 Neptune 跟踪您跑步产生的所有元数据(即超参数、损耗、指标等),然后可视化并比较结果。自动将跟踪的数据转换为知识库,然后与同事分享和讨论您的工作。
海王星——概要:
- 轻松跟踪指标、超参数
- 在模型训练时可视化损失和指标(监控学习曲线)
- 比较不同模型/实验的学习曲线
- 使用交互式对照表,自动显示实验之间的差异
- 获取实验数据,并在笔记本上显示参数和指标。
- 它还有其他与参数度量无关的可视化特性
WandB 专注于深度学习。用户可以使用 Python 库跟踪应用程序的实验,并且作为一个团队,可以看到彼此的实验。
该工具可让您记录和可视化您研究的每个细节,并与队友轻松协作。您可以轻松地记录脚本中的指标,以便在模型训练时实时可视化结果。您还可以看到您的模型在每个时间步产生了什么。
WandB–摘要:
- 监控训练运行信息,如损失、准确性(学习曲线)
- 用显示自动差异的仪表板表比较运行
- 通过平行坐标图可视化参数和指标
- 用特性(参数)重要性可视化探索参数如何影响度量(我认为这是实验性的)
- 它还有其他与参数度量无关的可视化特性
Comet 是一个元机器学习平台,用于跟踪、比较、解释和优化实验和模型。它允许你在一个地方查看和比较你所有的实验。无论你在哪里用任何机器学习库运行你的代码,对于任何机器学习任务,它都能工作。
Comet 适用于团队、个人、学术机构、组织以及任何想要轻松可视化实验、方便工作和运行实验的人。
彗星——摘要:
- 您可以定制和组合您的可视化效果
- 你可以监控你的学习曲线
- Comet 灵活的实验和可视化套件允许您记录、比较和可视化许多人工制品类型
- 它具有其他与参数度量无关的可视化特征
TensorBoard 是 TensorFlow 的可视化工具包,可让您分析模型训练运行。它是开源的,为机器学习模型的可视化和调试提供了一套工具。
更重要的是,它有一个广泛的工程师网络使用这个软件,分享他们的经验和想法。这使得一个强大的社区准备解决任何问题。然而,该软件本身最适合个人用户。
tensor board–摘要:
- 跟踪和可视化损失和准确性等指标
- 比较不同跑步的学习曲线
- 平行坐标图显示参数-度量相互作用
- 它还有其他与参数度量无关的可视化特性
Optuna 是一个自动超参数优化软件框架,专门为机器学习而设计。
此外,Optuna 还集成了 LightGBM、Keras、TensorFlow、FastAI、PyTorch Ignite 等库。
Optuna–摘要:
- Optuna 中的可视化允许您放大超参数交互,并帮助您决定如何运行下一次参数扫描
- plot_contour:在交互式图表上绘制参数交互。您可以选择想要探索的超参数
- plot_optimization_history:显示所有试验的分数以及到目前为止每个点的最佳分数
- plot_parallel_coordinate:交互式可视化超参数和分数
- plot_slice:显示搜索的发展。您可以看到您的搜索在超参数空间中的位置,以及空间的哪些部分被探索得更多
Hiplot 是一个简单明了的交互式可视化工具,帮助人工智能研究人员发现高维数据中的相关性和模式。它使用平行图和其他图形方式更清晰地表达信息。
HiPlot 可以从 Jupyter 笔记本上快速运行,无需设置。该工具使机器学习(ML)研究人员能够更容易地评估他们的超参数的影响 ,例如学习率、正则化和架构。其他领域的研究人员也可以使用它,因此他们可以观察和分析与其工作相关的数据的相关性。
hip lot–摘要:
创建交互式平行图可视化,以便根据平行图上的选择轻松探索各种超参数度量交互
实验台自动更新
它非常轻便,可以在笔记本电脑内使用,也可以作为独立的网络服务器使用
最后的话
现在您已经有了所有最佳工具的列表,您可以可视化您的 ML 实验的度量和超参数。自己测试一下,看看哪个最适合你。当然,我们推荐 Neptune——它们中最轻的😉
你最喜欢哪个工具?
时间序列预测:数据、分析和实践
原文:https://web.archive.org/web/https://neptune.ai/blog/time-series-forecasting
通常,在传统的机器学习方法中,我们将数据随机分为训练数据、测试数据和交叉验证数据。
这里,数据集中的每个点x****IT5 有:
- 60%的概率进入 D [列车]
- 进入 D [测试]的概率为 20%
- 进入验证的概率为 20%
代替基于随机的分裂,我们可以使用另一种叫做基于时间的分裂的方法。当我们的数据集中给定了时间戳时,我们可以根据时间分割数据。
想象你是亚马逊的一名 ML 工程师,试图生产一个模型来对评论进行分类。您随机地将数据分为训练数据和测试数据,在获得所需的准确性之后,您部署模型。随着更多的评论被添加到新产品中,随着时间的推移,模型的准确性可能会降低。基于时间的分割是克服这个问题的一种方法。
在基于时间的拆分中,我们一般基于时间戳对数据进行拆分,并对模型进行训练。这样,我们比基于随机的分裂有更好的机会获得更高的精度。
为什么我们需要不同的方法?
标准的 ML 方法不适用于时间序列模型:
- 特征和目标变量是相同的,
- 随着时间的推移相关的数据,
- 通常不稳定(难以建模),
- 需要大量数据来捕捉模式和趋势,并对这些变化进行适当建模。
什么是时间序列?
时间序列是按时间顺序组织的一系列数据点。
预测的类型
时间序列随处可见
金融:我们试图预测可能会对我们的业务目标产生重大影响的股票价格、资产价格、不同的宏观经济因素。
电子商务:我们试图预测未来的页面浏览量,与过去相比,是上升还是下降,或者是否有季节性。新用户也是如此,随着时间的推移,你会获得/失去多少新用户?
业务:我们试图预测你需要的交易数量、未来收入和未来库存水平。
时间序列分解包括将一个序列视为水平、趋势、季节性和噪声成分的组合。分解提供了一个有用的抽象模型,用于一般地思考时间序列,以及更好地理解时间序列分析和预测中的问题。
时间序列的一个基本主题是时间序列分解:
- 时间序列数据的组成部分
- 季节性模式和趋势
- 时间序列数据的分解
时间序列的组成部分是什么?
趋势:在一段时间内改变方向
季节性:季节性是指由不同因素引起的周期性行为、峰值或下降,例如:
- 自然发生的事件,如天气波动
- 业务或行政程序,如财政年度的开始或结束
- 社会和文化行为,如节日或宗教仪式
- 日历事件,如每月的星期一数或每年的节假日数
残差:我们无法用趋势或季节性来预测的不规则波动。
下面使用 Python 中的 Pandas 和 NumPy 数组构建了趋势图、季节性图和残差因子图。
分解模型
加性模型
加法模型假设观察到的时间序列是以下分量的总和:
观察=趋势+季节性
当季节值和残差值的大小与趋势无关时,使用加法模型。
上面的图表是使用 python 生成的,我们稍后将学习 python
在上面的例子中,我们可以看到残差的季节性不会随着趋势的增加而增加或减少,而是始终保持不变。看着这个图,减去代表趋势的直线,我们可以想象我们只是在季节性成分上加上了直线,不管趋势是什么,都是一样的。
乘法模型
乘法模型假设观察到的时间序列是其组成部分的乘积:
观察值=趋势季节性残差**
我们可以通过应用对数变换将乘法模型转换为加法模型:
【log(时间季节性残差)= log(时间)+ log(季节性)+ log(残差)**
如果季节性值和残差值的大小随趋势波动,则使用这些值。
上面的图表是使用 python 生成的,我们稍后将学习 python
在上图中,我们看到趋势增加,所以我们在上升。季节性因素也随着趋势上升。这意味着它很可能是一个乘法模型,所以我们应该划分趋势,然后我们会以更合理的(更一致的)季节性结束。
伪可加模型
伪加法模型结合了加法模型和乘法模型的元素。在以下情况下,它们会很有用:
- 时间序列值接近或等于零
- 我们期待与乘法模型相关的特性
- 在这种情况下,被零除通常会成为一个问题
使用 Python-Pandas 进行时间序列分解
我们将分别构建虚拟趋势、季节性和剩余成分。这个例子展示了如何使用 Pandas 模块构建一个简单的时间序列数据集。
time = np.arange(1, 51)
现在我们需要创造一种趋势。假设我们有一个测量电力需求的传感器。为了简单起见,我们将忽略单位。
trend = time * 2.75
现在让我们用图来显示作为时间函数的趋势
现在让我们生成一个季节性组件。
seasonal = 10 + np.sin(time) * 10
让我们绘制季节性与时间的关系图。
现在,让我们构造剩余分量。
np.random.seed(10)
residual = np.random.normal(loc=0.0, scale=1, size=len(time))
残差的快速绘图:
总趋势、季节性和剩余成分
加法时间序列
记住加性时间序列的等式简单来说就是:O[T]= T[T]+S[T]+R[T]
O [t] =输出
T[T]=趋势
S [t] =季节性
R [t] =残差
[t] =代表特定时间点的变量
additive = trend + seasonal + residual
乘法时间序列也是如此,只是我们不做加法,而是将趋势值、季节性值和残差值相乘。
信纸和自相关
什么是平稳性?
为了使时间序列数据保持稳定,数据必须随时间表现出四个特性:
1.常数平均值:
一个平稳的时间序列在整个序列中有一个恒定的平均值。
作为一个例子,如果我们要画出这个数列的平均值,这个平均值在任何时候都是成立的。
均值不恒定的一个很好的例子是,如果我们有某种趋势。例如,对于上升或下降趋势,序列结束时的平均值将明显高于或低于序列开始时的平均值。
2.恒定方差:
一个平稳的时间序列在整个序列中有一个恒定的方差。
3.恒定自相关结构:
自相关仅仅意味着当前的时间序列测量与过去的测量相关。例如,今天的股价往往与昨天的价格高度相关。
相关值之间的时间间隔称为滞后。假设我们想知道今天的股票价格是否与昨天的价格或两天前的价格更相关。我们可以通过计算原始时间序列和延迟一个时间间隔的相同序列之间的相关性来测试这一点。因此,原始时间序列的第二个值将与延迟时间序列的第一个值进行比较。第三个原始值将与第二个延迟值进行比较,依此类推。分别对滞后 1 和滞后 2 执行该过程将产生两个相关输出。这个输出会告诉你哪个滞后更相关。简单来说就是自相关。
时间序列平滑
什么是平滑?
平滑是一个过程,通常通过减少噪声的影响来提高我们预测序列的能力。
为什么平滑很重要?
平滑是一个重要的工具,让我们提高前瞻性的预测。
考虑下图中的数据。我们如何预测未来一步、两步或三步会发生什么?
一种解决方案是计算序列的平均值并预测未来的值。
但是,使用平均值来预测未来值似乎不是一个好方法,我们可能不会得到准确的预测。相反,我们采用一种叫做指数平滑的技术。
单一指数平滑
单指数平滑也叫简单指数平滑,是一种对没有趋势性或季节性的单变量数据进行时间序列预测的方法。
它需要一个单一的参数,称为α(α),也称为平滑因子或平滑系数。
该参数控制先前时间步长的观测值影响指数衰减的速率。Alpha 通常设置为 0 到 1 之间的值。较大的值意味着模型主要关注最近的过去观察值,而较小的值意味着在进行预测时会考虑更多的历史记录。
双指数平滑
双指数平滑是指数平滑的扩展,明确增加了对单变量时间序列趋势的支持。
除了用于控制级别平滑因子的 alpha 参数之外,还添加了一个平滑因子来控制趋势变化影响的衰减,称为 beta (b)。
该方法支持以不同方式变化的趋势:加法和乘法,分别取决于趋势是线性的还是指数的。
具有加性趋势的双指数平滑通常被称为 Holt 的线性趋势模型,以该方法的开发者 Charles Holt 命名。
三重指数平滑
三重指数平滑是指数平滑的扩展,它明确地为单变量时间序列增加了对季节性的支持。
这种方法有时被称为霍尔特-温特斯指数平滑,以该方法的两位贡献者命名:查尔斯·霍尔特和彼得·温特斯。
除了 alpha 和 beta 平滑因子之外,还添加了一个名为 gamma (g)的新参数,用于控制对季节分量的影响。
与趋势一样,对于季节性的线性或指数变化,可以将季节性建模为加法或乘法过程。
自回归模型和移动平均(ARMA)模型
ARMA 模型结合了两种模型:
第一种是自回归(AR)模型。自回归模型预期序列依赖于其过去的值。
第二种是移动平均线(MA)模型。移动平均模型预期对过去预测误差的系列依赖性。
组合(ARMA)也被称为 Box-Jenkins 方法。
ARMA 模型:自回归部分
ARMA 模型通常用 P 和 Q 来表示 AR 和 MA 分量。对于我们想要预测时间 t 的时间序列变量 X,最后几个观察值是:
X[t–3],X[t–2],X [t- 1]
AR(p) 模型假设依赖于时间序列的最后 p 个值。假设 p = 2 ,预测具有以下形式:
Ma(q) 模型假设依赖于时间序列的最后 q 值。假设 q = 2,预测具有以下形式:
我们一会儿将讨论这些方程的确切含义以及误差是如何计算的。
现在,为了将我们的 AR(p)和 MA(q)模型结合在一起,我们将组合 AR(p) 和 MA(P) 来产生 ARMA(p,q) 模型。对于 p = 2 和 q = 2 ,ARMA (2,2)预测将为:
同样,我们将在动手操作时看到所有这些内容。
在实施 ARMA 模型时,有一些事情需要记住:
-
首先,假设时间序列是平稳的,如果我们使用非平稳的例子,那么回归方法将会失败。
-
一个好的经验法则是,在拟合 ARMA 模型时,至少要有 100 个观测值,这样我们就可以充分证明那些过去的自相关性。
现在,我们将采取一种实用的方法来理解自回归模型,并获得对移动平均线的实用理解。
实践方法
数量工具箱中的一个关键概念是均值回归。这一过程指的是一个时间序列,它显示出向其历史平均值回复的趋势。数学上,这样的(连续)时间序列被称为奥恩斯坦-乌伦贝克过程。
这与随机行走(亦称布朗运动)形成对比,随机行走对每个特定时刻的位置没有“记忆”。
时间序列的均值回复特性可以用来产生更好的预测。
连续均值回复时间序列可由奥恩斯坦-乌伦贝克随机微分方程表示:
=θ(μ)+t1】的值
其中:
- θ是均值回复率,
- μ是过程的平均值,
- σ是过程的方差,
- 是维纳过程或布朗运动。
在一个离散的设置中,该方程表明在下一个时间段价格序列的变化与平均价格和当前价格之间的差异成比例,加上高斯噪声。
更多详情,请看这里的。
第一节:ARMA
进入自回归综合移动平均(ARIMA) 建模。当我们在结果和它们的祖先之间有自相关时,我们会在结果图中看到一个主题或关系。这种关系可以用自己的方式建模,使我们能够以与关系的强度和已知值的接近程度成比例的置信度来预测未来(预测随着我们的深入而减弱)。
对于二阶平稳数据(均为均值和方差:**=和²=****²^(对于所有),自协方差仅表示为时滞的函数:)**********
=[(-(+****-]********
****因此,自相关函数定义为:
=/²********
****我们使用不同滞后下这些值的图来确定最佳 ARIMA 参数。注意 phi 是如何改变这个过程的。
第 2 部分:自回归(AR)模型
自相关:一个变量在不同滞后时与自身的相关性。
AR 模型对过去的实际值进行回归。
这是你应该知道的一阶或 AR(1) 公式:
= 0+11+
β就像线性回归中的β,ϵ是一个不可减少的误差。
二阶或 AR(2) 看起来像这样:
= 0+11+22+
我们将生成数据,以深入了解 AR 模型的工作原理。
np.random.seed(123)
time = np.arange(100)
ar1_sample = np.zeros(100)
ar1_sample[0] += np.random.normal(loc=0, scale=2.5, size=1)
for t in time[1:]:
ar1_sample[t] = (0.7 * ar1_sample[t-1]) + np.random.normal(loc=0, scale=2.5, size=1)
plt.fill_between(time,ar1_sample)
在这里,我们为生成的数据创建了一个预测,以表明我们提出了一个大约为 ar(1)且 phi ≈ 0.7 的模型。
model = sm.tsa.ARMA(ar1_sample, (1, 0)).fit(trend='nc', disp=0)
model.params
np.random.seed(112)
ar2_sample = np.zeros(100)
ar2_sample[0:2] += np.random.normal(loc=0, scale=2.5, size=2)
for t in time[2:]:
ar2_sample[t] = (0.3 * ar2_sample[t-1]) + (0.3 * ar2_sample[t-2]) + np.random.normal(loc=0, scale=2.5, size=1)
plt.fill_between(time,ar2_sample)
第 3 节:移动平均线(MA)模型
MA 模型细节
毫安模型由以下等式定义:
=+θ1+θ2+2+θ
其中:
- 是白噪声值,
- 是一个常数值,
- s 是系数,与线性回归中的系数相似。
马模特!=移动平均平滑
一个重要的区别是,移动平均模型与移动平均平滑不是一回事。我们在之前的课程中所做的是平滑。它有我们讨论过的重要特性。然而,移动平均线模型是一个完全不同的野兽。
移动平均平滑对于估计过去数据的趋势和季节性很有用。另一方面,MA 模型是一种有用的预测模型,它回归过去的预测误差来预测未来值。
很容易将这两种技术混为一谈,但它们的功能截然不同。因此,移动平均模型在概念上是序列的当前值相对于当前和先前(未观察到的)白噪声误差项或随机冲击的线性回归。
假设每个点的随机冲击是相互独立的,并且来自相同的分布,通常是正态分布,位置在零和恒定尺度。
我们将生成数据,以便了解 MA 系列的生成过程。
np.random.seed(12)
time = np.arange(100)
ma1_sample = np.zeros(100)
error = np.random.normal(loc=0, scale=2.5, size=100)
ma1_sample[0] += error[0]
for t in time[1:]:
ma1_sample[t] = (0.4 * error[t-1]) + error[t]
plt.fill_between(time,ma1_sample)
model = sm.tsa.ARMA(ma1_sample, (0, 1)).fit(trend='nc', disp=0)
model.params
out:数组([0.34274651])
第 3 部分:自相关函数(ACF)
有一个我们需要回答的关键问题:如何选择时间序列的顺序(p 和 q)?
要回答这个问题,我们需要了解自相关函数(ACF)。让我们首先展示不同模拟系列的 ACF 图示例。
fig = sm.tsa.graphics.plot_acf(ar1_sample, lags=range(1,30), alpha=0.05,title = 'ar1 ACF')
fig = sm.tsa.graphics.plot_acf(ma1_sample, lags=range(1,15), alpha=0.05,title = 'ma1 ACF')
有必要解释一下。首先,蓝色区域代表一个置信区间。在这种情况下,α被设置为 0.05 (95%置信区间)。这可以设置为您需要的任何浮点值。详见 plot_acf 函数。
茎代表滞后相关值。换句话说,滞后 1 将显示与先前内生值的相关性。滞后值为 2 表示与之前的值 2 相关,依此类推。请记住,我们是在回归过去的预测值,这是我们在这里考察的相关性。
置信区间之外的相关性在统计上是显著的,而其他的则不是。
请注意,如果滞后 1 显示强自相关,则滞后 2 也将显示强自相关,因为滞后 1 与滞后 2 相关,滞后 2 与滞后 3 相关,依此类推。这就是为什么你会看到相关性缓慢衰减的 ar1 模型。
如果我们考虑这些函数,我们会注意到自相关会在 AR(1)模型中传播:
- = 0 + 1 −1 +
- −1 = 0 + 1 −2 + −1
- = 0 + 0 + 1 −2 + −1 +
过去的错误会传播到未来,导致我们刚刚提到的慢慢衰减的情节。
对于 MA(1)型号:
= = 0 + θ1 −1 +
只有先前的误差影响将来的误差。
因此,识别 AR(1)模型或 MA(1)模型的一个简单方法是看一个模型的相关性是否会影响下一个模型。
fig = sm.tsa.graphics.plot_acf(ar2_sample, lags=range(1,15), alpha=0.05,title = 'ar2 ACF')
fig = sm.tsa.graphics.plot_acf(ma2_sample, lags=range(1,15), alpha=0.05,title = 'ma2 ACF')
摘要
在这篇文章中,我们探讨了什么是时间序列预测,以及时间序列预测的重要组成部分是什么。:执行分析时时间序列可以分解成的组成部分。
我们还经历了不同类型的预测,深入到移动平均线、静态模型,以及如何使用 Python 绘制时间序列。
在下一篇文章中,我们将关注如何使用 ARIMA、萨里玛和 FB PROPHET 对时间序列数据建模。感谢阅读!
参考:
图像参考:************
时间序列预测:与其他机器学习有何不同?[ML 工程师解释]
原文:https://web.archive.org/web/https://neptune.ai/blog/time-series-prediction-vs-machine-learning
时间序列是每个数据科学家/ML 工程师在其职业生涯中都会遇到的问题,比他们想象的要多。所以,理解 in-out 是一个重要的概念。
你看,时间序列是一种基于时间维度(如日、月、年等)进行采样的数据。我们将该数据称为“动态的”,因为我们已经基于日期时间属性对其进行了索引。这给了数据一个隐含的顺序。不要误解我的意思,静态数据仍然可以有一个 DateTime 值的属性,但是不会基于该属性对数据进行采样或索引。
当我们对时间序列数据应用机器学习算法并希望对未来的日期时间值进行预测时,例如,在给定过去 5 年的数据的情况下预测 2 月份的总销售额,或者在给定几年的天气数据的情况下预测某一天的天气。这些对时间序列数据的预测被称为预测。这与我们处理静态 数据时形成对比。
在这篇博客中,我们将讨论:
- 1 时间序列预测(即预测)与静态机器学习预测有何不同?
- 2 时间序列预测的最佳实践
时间序列数据与静态 ML
到目前为止,我们已经建立了一个基线,与静态数据相比,我们应该如何看待时间序列数据。在本节中,我们将讨论处理这两种类型数据的不同之处。
注 :为了简单起见,我们假设数据在所有情况下都是连续的。
缺失数据的输入
缺失数据的插补是任何表格机器学习项目中的关键预处理步骤。在静态数据中,使用简单插补等技术,可以根据属性的性质用数据的平均值、中间值和众数填充缺失数据,或者使用更复杂的方法,如最近邻插补,使用 KNN 算法识别缺失数据。
然而,在时间序列中,缺失数据看起来像这样:
Time-series – missing data | Source
数据中存在这些明显的缺口,这些缺口无法用任何可用于静态数据的插补策略进行逻辑填补。让我们讨论一些有用的技巧:
-
为什么不用卑鄙来填充呢?静态平均值在这里对我们没有任何好处,因为通过从未来获取线索来填补你缺失的值是没有意义的。在上面的图中,很直观地可以看出,2001-2003 年之间的差距在逻辑上只能用历史数据来填补,即 2001 年之前的数据。
在时间序列数据中,我们使用所谓的滚动平均值或移动平均值或窗口平均值,这是对属于预定义窗口(如 7 天窗口或 1 个月窗口)的值取平均值。因此,我们可以利用这个移动平均值来填补时间序列数据中任何缺失的空白。
注 :在处理时间序列数据中的平均值时,平稳性起着重要的作用。
-
插值法非常流行 :利用时间序列数据的隐含顺序,插值法通常是设计时间序列数据中缺失部分的首选方法。简而言之,插值使用缺失点之前和之后的值来计算缺失的数据。例如,线性插值通过计算两点之间的直线,对它们求平均,从而得到缺失的数据。
有许多类型的插值可用,如线性,样条,Stineman。它们的实现在几乎所有的主要模块中都有给出,比如 python 的 pandas interpolate() 函数和R impute 时序包。
虽然,插值也可以用在静态数据中。然而,它没有被广泛使用,因为在静态数据中有更复杂的插补技术(其中一些已经在上面解释过了)。
-
理解业务用例:这不是任何处理缺失数据的技术方法。但是我觉得这是最被低估的可以快速产生效果的技术。这包括理解手头的问题,然后设计出最有效的方法。毕竟,在你的用例中,SOTA 可能不是 SOTA。例如,销售数据应该与股票数据区别对待,两者有不同的市场指标。
顺便说一下,这种技术在静态数据和时间序列数据中很常见。
时间序列模型中的特征工程
处理要素是区分时序数据和静态数据的另一个重要步骤。特征工程是一个广义的术语,它包含了各种标准技术和特别方法。与静态数据相比,时间序列数据中的特征处理方式有所不同。
注:有人可能会认为插补属于特征工程,这并没有错,但我想在单独的章节中解释这一点,让你有一个更好的想法。
在静态数据中,对于手头的问题来说,这是非常主观的,但是一些标准技术包括特征变换、缩放、压缩、标准化、编码等。
除了基于时间的特征之外,时间序列数据还可以具有其他属性。如果这些属性是基于时间的,那么产生的时间序列将是多元的,如果是静态的,那么产生的将是具有静态特征的单变量。非基于时间的特性可以利用静态技术中的方法,而不会妨碍数据的完整性。
所有基于时间的组件都有一个确定的模式,可以使用一些标准技术来设计。让我们来看看在处理基于时间的要素时证明有用的一些技术。
时序组件:时序数据的主要特征是什么
首先,每个时间序列数据都有时间序列成分。我们做了一个 STL 分解(使用黄土的季节和趋势分解)来提取这些成分。让我们来看看这些都意味着什么。
Example of an STL decomposition | Source
- 趋势:时间序列数据表示一种趋势,其值随时间变化不定,增加的值表示正趋势,减少的值表示负趋势。在上图中,你可以看到一个积极的增长趋势。
- 季节性:季节性是指时间序列的一种属性,表现为以恒定频率重复的周期性模式。在上面的例子中,我们可以观察到频率为 12 个月的季节性成分,这大致意味着周期性模式每 12 个月重复一次。
- 余数:从数据中提取趋势和季节性后,剩下的就是我们所说的余数(误差)或残差。这实际上有助于时间序列中的异常检测。
- 周期:当趋势没有固定的重复或季节性时,时间序列数据被称为周期数据。
- 平稳性:当时间序列数据的统计特征不随时间变化时,即均值和标准差不变时,时间序列数据是平稳的。协方差与时间无关。
这些成分被提取出来后,通常构成了时序数据特征工程下一步的基础。从静态数据的角度来看,STL 分解是时间序列世界的描述部分。在处理股票数据时,还有一些特定于时间序列的指标受时间序列数据类型的影响,如虚拟变量。
时间序列组件对于分析感兴趣的时间序列变量非常重要,以便了解其行为、模式,并能够选择和拟合适当的时间序列模型。
时间序列模型中的分析和可视化
分析
时间序列数据分析与静态数据分析有着不同的蓝图。正如上一节所讨论的,时间序列分析从回答如下问题开始:
- 这个数据有趋势吗?
- 这些数据包含任何类型的模式或季节性吗?
- 数据是平稳的还是非平稳的?
理想的情况是,在找到上述问题的答案后,必须进一步进行分析。与此类似,静态数据分析也有一些程序,如描述性、预测性、规定性。尽管描述性是所有问题陈述的标准,但预测性和规定性是主观的。这些过程在时间序列和静态 ML 中都是常见的。然而,在描述性、预测性和说明性中使用的许多指标有不同的用法,其中之一是相关性。
相反,在时间序列数据中,我们使用所谓的自相关和偏相关。自相关和偏自相关都是当前和过去序列值之间关联的度量,并指示哪些过去的序列值在预测未来值时最有用。
An example ACF and PACF plot in time-series | Source
虽然这两种数据的分析方法有些不同,但核心思想是相同的,这在很大程度上取决于问题陈述。例如,股票和天气数据都是时间序列,但是您可以使用股票数据来预测未来值,使用天气数据来研究季节模式。同样,使用贷款数据,你可以用它来分析借款人的模式,或者检查新借款人是否会拖欠贷款还款。
形象化
可视化是任何分析不可或缺的一部分。不同的问题不是你应该想象什么,而是你应该如何想象。
你看,时间序列数据的基于时间的特征应该被可视化,图的一个轴是时间,而非基于时间的特征受制于解决问题所采用的策略。
An example visualization of time-series | Source
时间序列预测与静态最大似然预测
在上一节中,我们看到了与初始步骤相关的两种数据类型之间的差异,以及在比较两者时方法的差异。在本节中,我们将探讨接下来的步骤,即预测或时间序列方面的预测。
算法
时间序列数据中算法的选择与静态数据中的完全不同。可以外推模式并封装训练数据域之外的时序组件的算法可以被视为时序算法。
现在,大多数静态机器学习算法,如线性回归、支持向量机,都没有这种能力,因为它们为任何新的预测概括了训练空间。他们只是不能表现出我们上面讨论的任何行为。
用于时间序列预测的一些常用算法:
- ARIMA: 代表自回归-积分-移动平均线。它利用自回归和移动平均的组合来预测未来值。点击了解更多。
- EWMA/指数平滑:指数加权移动平均或指数平滑作为移动平均的升级。它的工作原理是通过对最近发生的值施加更大的权重来减少移动平均线显示的滞后效应。点击了解更多。
- 动态回归模型:该算法还考虑了其他杂项信息,如公共假期、法律变化等。点击了解更多。
- Prophet : Prophet 由脸书核心数据科学团队发布,是脸书开发的一个开源库,旨在对单变量时间序列数据进行自动预测。
- LSTM :长短期记忆(LSTM)是一种递归神经网络,可以学习序列中项目之间的顺序依赖关系。它常用于解决时间序列预测问题。
这个清单当然不是详尽无遗的。许多复杂的模型或方法,如广义自回归条件异方差 (GARCH)和贝叶斯结构时间序列 (BS 时间序列)在某些情况下可能非常有用。还有像神经网络自回归 (NNAR)这样的神经网络模型,可以应用于使用滞后预测器的时间序列,并且可以处理特征。
时间序列模型中的评价指标
预测评估包括度量标准,如标度相关误差,如均方误差(MSE)和均方根误差(RMSE),百分比误差,如平均绝对百分比误差(MAPE),标度误差,如平均绝对标度误差(MASE)等等。这些指标实际上类似于静态 ML 指标。
然而,虽然评估指标有助于确定拟合值与实际值的接近程度,但它们不能评估模型是否适合时间序列。为此,我们做了一些叫做残差诊断的事情。详细了解这里。
处理异常值/异常情况
离群值困扰着几乎所有真实世界的数据。时间序列和静态数据从识别到处理异常值/异常值采取了两条完全不同的路线。
识别
- 对于静态数据中的识别,我们使用从 Z 得分、箱线图分析到一些高级统计技术(如假设检验)的技术。
- 在时间序列中,我们使用了一系列的技术和算法,从 STL 分析到隔离森林等算法。你可以在这里阅读更多细节。
处理
- 我们在静态数据中使用诸如修整、基于分位数的下限和上限以及均值/中值插补等方法,具体取决于容量和手头的问题陈述。
- 在时间序列数据中,有许多选项对您的用例来说是高度主观的。其中一些是:
- 使用替换:我们可以计算出可以替换离群值的值,并使其更适合数据。R 中的 tsclean()函数将使用黄土拟合稳健趋势(对于非季节性序列),或者使用 STL 拟合稳健趋势和季节性分量(对于季节性序列)来计算替换值。
- 研究业务:这不是一种技术方法,而是一种特别的方法。你看,识别和研究问题背后的业务真的可以帮助处理离群值。放弃或取代它是否是一个明智的选择,首先要从里到外研究它。
处理时序数据和预测时的最佳实践
虽然在处理时间序列和预测时没有固定的步骤可以遵循,但仍然有一些可以用来获得最佳结果的好方法。
-
没有放之四海而皆准的方法:没有一种预测方法对所有时间序列都是最佳的。在开始预测之前,您需要了解问题陈述、功能类型和目标。您可以根据需要选择算法的一些领域(计算+目标):
- 统计模型,
- 机器学习,
- 和混合方法。
-
特性选择:特性的选择会影响最终的预测误差。换句话说,选择必须仔细进行。有不同的方法,如相关性分析,也称为过滤器、包装器(即迭代添加或移除特征),以及嵌入(即选择已经是预测方法的一部分)。
-
应对过度拟合:在模型训练期间,可能会出现过度拟合的风险,因为最佳模型并不总是导致最佳预测。为了解决过度拟合问题,可以将历史数据分为训练和测试数据,并进行内部验证。
-
数据预处理 :首先要对数据进行分析和预处理,使其干净,便于预测。数据可能包含缺失值,由于大多数预测方法无法处理缺失值,因此必须对值进行估算。
-
牢记维度的诅咒:当训练中的模型呈现出许多维度和许多潜在因素时,它们可能会遇到维度的诅咒,这意味着当我们拥有有限数量的训练数据,并且我们向这些数据添加更多维度时,我们在准确性方面的回报开始递减。
-
使用季节性数据模式:如果时间序列数据中存在季节性,则需要包含该季节性模式的多个周期才能做出正确的预测。否则,模型没有办法学习模式。
-
在进行预测之前处理异常现象:异常现象会在模型学习中产生巨大的偏差,更常见的情况是结果总是低于标准。
-
仔细研究问题陈述:这可能是最被低估的实践,尤其是当你刚刚开始处理一个时序问题的时候。确定基于时间和非基于时间的特征,在使用任何标准技术之前先研究数据。
你已经到达终点了!
我们成功地理解了时间序列和静态数据在结构和方法上的差异。本博客中列出的部分绝非详尽无遗。当我们针对每个领域中的具体数据问题进行更细致的分析时,可能会有更多的差异。在研究时间序列时,你可以参考以下一些我最喜欢的资源:
参考
- https://cran . r-project . org/web/packages/input Time-Series/vignettes/input Time-Series-Time-Series-Missing-Value-插补-in-R.pdf
- https://neptune.ai/blog/anomaly-detection-in-time-series
- https://machine learning mastery . com/resample-interpolate-time-series-data-python/
- https://otexts.com/fpp2/missing-outliers.html
- https://otexts.com/fpp2/stl.html
- https://otexts.com/fpp2/arima.html
- https://otexts.com/fpp2/expsmooth.html
- https://www . advancing analytics . co . uk/blog/2021/06/22/10-难以置信的有用时间序列预测算法
- https://www . analyticsvidhya . com/blog/2021/05/detecting-and-treating-outliers-treating-the-odd-one-out/
- https://otexts.com/fpp2/missing-outliers.html
- https://www . rdocumentation . org/packages/forecast/versions/8.3/topics/ts clean
- https://www . research gate . net/publication/332079043 _ Best _ Practices _ for _ Time _ Series _ Forecasting _ Tutorial _ Paper
- https://www.anodot.com/blog/time-series-forecasting/
时序项目:有帮助的工具、包和库
原文:https://web.archive.org/web/https://neptune.ai/blog/time-series-tools-packages-libraries
既然你在这里,你大概知道时间序列数据和静态 ML 数据有点不同。因此,当从事时间序列项目时,数据科学家或 ML 工程师通常会使用特定的工具和库。或者他们使用众所周知的工具,这些工具已经被证明可以很好地适应时间序列项目。
我们认为把这些工具集中在一个地方会很有用,所以我们来了。这篇文章是一个时间序列工具和软件包的数据库。其中有些是众所周知的,有些可能对你来说是新的。希望你会发现整个列表有用!
在我们深入研究工具之前,让我们先了解一些基础知识。
什么是时间序列?
时间序列是按时间顺序排列的数据点序列。它是对同一变量在连续时间点的观察。换句话说,这是一组在一段时间内观察到的数据。
数据通常被绘制成图表上的一条线,x 轴是时间,y 轴是每个点的值。此外,时间序列有四个主要组成部分:
1 趋势
2 季节变化
- 3 周期性变化
- 4 不规则或随机变化
- 趋势简单来说就是数据在许多时期内的总体变化方向,它是数据的长期模式。趋势通常会出现一段时间,然后消失或改变方向。例如,在金融市场中,“看涨趋势”表示金融资产价格总体上升的上升趋势,而“看跌趋势”表示价格下降。
- 广义而言,时间序列的趋势可以是:
上升趋势:一个时间序列在一个观察周期内上升。
下降趋势:一个时间序列在一个观察周期内下降。
- 恒定或水平趋势:一个时间序列在一段观察时间内没有显著的上升或下降。
- 季节性变化或季节性是查看时间序列时要考虑的一个重要因素,因为它可以根据过去的数据提供未来可能发生的事情的信息。它是指一个或多个季节(如冬季和夏季)中某个度量值的变化,但也可能是每天、每周或每月的变化。例如,温度具有季节性,因为夏季较高,冬季较低。
- 与季节性变化相反,周期性变化没有精确的时间段,可能会有一些时间漂移。例如,金融市场倾向于在高值和低值之间循环,但是在它们之间没有预先确定的时间段。此外,一个时间序列可以有季节性和周期性的变化。例如,众所周知,房地产市场有周期性和季节性模式。季节性模式显示,春季的交易量比夏季多。循环模式反映了人们的购买力,这意味着在危机中,与繁荣时期相比,销售会减少。
不规则或随机变化是在趋势、季节和周期成分被去除后剩下的。因此,它也被称为剩余成分。这是一个完全随机且无法预测的时间序列中的非系统部分。
In contrast to seasonal variations, cyclic variations don’t have precise time periods and might have some drifts in time. For instance, financial markets tend to cycle between periods of high and low values, but there is no predetermined period of time between them. Besides that, a time series can have both seasonal and cyclic variations. For instance, it’s known that the real estate market has both cyclic and seasonal patterns. The seasonal pattern shows that there are more transactions in the spring rather than in the summer. The cyclic pattern reflects the purchasing power of the people, which means that in a crisis there are fewer sales in contrast to the time when there is prosperity.
一般来说,时间序列经常被用于许多领域,如经济学、数学、生物学、物理学、气象学等。具体来说,时间序列数据的一些例子是:
道琼斯工业平均指数价格
Time series components |Source
纽约市的气温
- 比特币价格
- 心电图信号
- 术语 MLOps 的 Google 趋势
- 美国的失业率
- 通过时间和类似的网站流量
- 在本文中,我们将看看前面提到的几个例子。
- 时序项目示例
股票市场预测
股票市场预测是一个具有挑战性和吸引力的话题,其主要目标是开发预测未来股票价格的不同方法和策略。有很多不同的技术,从经典的算法和统计方法到复杂的神经网络架构。共同点是它们都利用不同的时间序列来实现准确的预测。业余投资者、金融科技初创公司和大型对冲基金广泛使用股市预测方法。
在实践中使用股市预测方法的方式有很多,但最流行的可能是交易。证券交易所的自动交易数量正在上升,据估计,美国证券交易所交易的股票中约有 75%来自算法系统。预测股票未来表现的方法主要有两种:基本面分析和技术分析。
基本面分析着眼于公司的财务报表、管理和行业趋势等因素。此外,它还考虑了一些宏观经济指标,如通货膨胀率、国内生产总值、经济状况等。所有这些指标都与时间有关,因此可以用时间序列来表示。
与基本面分析相反,技术分析利用交易量、价格变化的模式以及来自市场本身的其他信息来预测股票未来的表现。投资者在做出投资决定之前了解这两种方法是很重要的。
比特币价格预测
比特币是一种价格大幅波动的数字货币。它也是世界上最不稳定的资产之一。比特币的价格是由供求决定的。当对比特币的需求增加时,价格就会上涨,当需求下降时,价格就会下跌。随着近年来需求的增加,价格也在上涨。由于其非常不稳定的性质,预测比特币的未来价格是一项非常具有挑战性的任务。
总的来说,这个问题和股市预测很像,几乎可以用同样的方法来解决。甚至比特币也被证明与标准普尔 500 和道琼斯等指数相关。这意味着,在某种程度上,比特币的价格跟随上述指数的价格。你可以在这里了解更多信息:
Technical indicators example | Source
心电图异常检测
心电图异常检测是一种检测心电图异常的技术。心电图是一种监测心脏电活动的测试。基本上,它是由心脏产生的电信号,并表示为时间序列。
ECG 异常检测是通过比较 ECG 的正常模式和异常模式来完成的。心电图中有许多类型的异常,它们可以分类如下:
心率异常:这是指心率偏离正常范围的任何变化。这可能是由于心脏的问题或刺激方式的问题。
心律异常:心律异常是指任何与其正常模式不同的心律变化。这可能是由于脉冲通过心脏传导的方式有问题,或者脉冲通过心脏传导的速度有问题。
在这个课题上已经做了很多工作,从学术研究到商用心电图机,都有一些很有前景的成果。最大的问题是,该系统应该具有高水平的准确性,并且不应该有任何假阳性或假阴性。这是由于问题的性质和错误预测的后果。
- **Heart rate anomalies: ** this refers to any change in heart rate from its normal range. This may be due to a problem with the heart or a problem with how it is being stimulated.
- 既然现在我们已经有了一些关于时间序列在行业中的重要性的背景知识,那么让我们来看看一些流行的工具、包和库,它们对任何时间序列项目都是有帮助的。此外,由于大多数与时间序列相关的数据科学和机器学习项目都是用 Python 完成的,因此讨论 Python 支持的工具是有意义的。
我们将主要从四个类别来讨论工具:
ECG anomalies detection | Source
1 数据准备和特征工程工具
2 数据分析和可视化包
3 实验跟踪工具
- 4 时间序列预测包
- 时间序列的数据准备和特征工程工具
- 数据准备和特征工程是数据科学管道中两个非常重要的步骤。数据准备通常是任何数据科学项目的第一步。它是将数据转换成可用于分析和进一步处理的形式的过程。
- 特征工程是从原始数据中提取特征以使其对建模和预测更有用的过程。下面,我们将提到一些用于这些任务的最流行的工具。
熊猫时间系列项目
Pandas 是一个用于数据操作和分析的 Python 库。它包括数据结构和处理数字表格和时间序列的方法。此外,它还包含用于处理所有领域的时间序列数据的广泛功能和特性。
它支持各种文件类型的数据输入,包括 CSV、JSON、Parquet、SQL 数据库表和查询以及 Microsoft Excel。此外,Pandas 允许各种数据操作特性,如合并、整形、选择以及数据清理和争论。
一些有用的时间序列特征是:
日期范围生成和频率转换
移动窗口统计
移动窗口线性回归
- 日期转换
- 滞后和更多
- 时间序列的更多相关内容可在下面找到:
- 使用 NumPy 的时序项目
- NumPy 是一个 Python 库,它增加了对巨大的多维数组和矩阵的支持,以及可能在这些数组上使用的大量高级数学函数。它有一个与 MATLAB 非常相似的语法,包括一个高性能的多维数组对象以及处理这些数组的功能。
NumPy 的 datetime64 数据类型和数组可以非常紧凑地表示时间序列中的日期。使用 NumPy 还使得使用线性代数运算进行各种时间序列运算变得简单。
NumPy 文档和教程:
带日期时间的时序项目
Datetime 是一个 Python 模块,它允许我们处理日期和时间。本模块包含处理以下情况所需的方法和功能:
日期和时间的表示
日期和时间的算术
日期和时间的比较
- 使用这个工具处理时间序列很简单。它允许用户将日期和时间转换成对象并操纵它们。例如,只需几行代码,我们就可以将一种日期时间格式转换为另一种格式,添加到日期的天数、月数或年数,或者计算两个时间对象之间的秒差。
- 关于如何开始学习本模块的有用文档:
- 使用 Tsfresh 的时间序列项目
Tsfresh 是一个 Python 包。它自动计算大量的时间序列特征,称为特征。该软件包将统计学、时间序列分析、信号处理和非线性动力学中的既定算法与稳健的特征选择算法相结合,以提供系统的时间序列特征提取。
Tsfresh 包包含一个过滤过程,以防止提取不相关的特征。这个过滤过程评估每个特征对回归或分类任务的解释能力和重要性。
高级时间序列功能的一些示例如下:
傅立叶变换分量
小波变换
部分自相关和其他
- 有关 Tsfresh 软件包的更多信息,请参见以下内容:
- 时间序列的数据分析和可视化软件包
- 数据分析和可视化包是帮助数据分析师根据数据创建图形和图表的工具。数据分析被定义为对数据进行清理、转换和建模的过程,目的是发现对商业决策有用的信息。数据分析的目标是从数据中提取有用的信息,并根据这些信息做出决策。
数据的图形表示被称为数据可视化。数据可视化工具使用图表和图形等可视化元素,提供了一种查看和理解数据趋势和模式的简单方法。
有各种各样的时间序列数据分析和可视化软件包,我们将浏览其中的几个。
使用 Matplotlib 的时序项目
可能最流行的数据可视化 Python 包是 Matplotlib。它用于创建静态、动画和交互式可视化。使用 Matplotlib 可以做一些事情,例如:
制作适合出版的情节
创建可以放大、平移和更新的交互式图形
更改视觉样式和布局
- 此外,它还为绘制时间序列图表提供了各种选项。更多信息请点击下面的链接:
- Create interactive figures that can be zoomed in, panned, and updated
- 使用 Plotly 的时间序列项目
Plotly 是一个用于 Python 和 r 的交互式、开源和基于浏览器的图形库。它是一个高级的、声明性的图形库,有 30 多种图表类型,包括科学图表、3D 图表、统计图表、SVG 地图、金融图表等等。
除此之外,使用 Plotly 还可以绘制基于时间序列的交互式图表,如线条、gantts、散点图等。文档中提供了关于此包的更多信息:
Example of the Matplotlib chart with time series | Source: Author
Time series projects with Plotly
具有统计模型的时间序列项目
Statsmodels 是一个 Python 包,它提供了用于估计各种统计模型以及运行统计测试和统计数据分析的类和函数。
我们将在关于预测的章节中更详细地介绍这个库,但这里值得一提的是,它为时间序列分解及其可视化提供了一个非常方便的方法。有了这个软件包,我们可以很容易地分解任何时间序列,并分析其组成部分,如趋势,季节性成分,残差或噪音。教程中对此有更多描述:
Example of the Plotly chart with time series | Source
时间序列的实验跟踪工具
实验跟踪工具通常是高级工具,可用于各种目的,如跟踪实验结果,显示如果改变实验中的参数会发生什么,模型管理等。
它们通常比低级包更加用户友好,并且在开发机器学习模型时可以节省大量时间。这里只提到其中的两个,因为它们很可能是最受欢迎的。
对于时间序列,有一个方便的环境来跟踪定义的度量和超参数尤其重要,因为我们很可能需要运行许多不同的实验。通常,与一些卷积神经网络相比,时间序列模型并不大,并且作为输入,具有几百或几千个数值,因此模型训练得相当快。此外,它们通常需要相当长的时间来进行超参数调整。
最后,在一个地方连接来自不同包以及可视化工具的模型是非常有益的。
使用 Neptune.ai 的时间序列项目
Neptune.ai 是一个由超过 20,000 名数据科学家、机器学习工程师和研究人员使用的实验跟踪工具。它为在单一位置组织和控制模型提供了一个方便的界面。
有了 Neptune.ai,就有可能
记录关于每个模型的数据集、参数和代码的信息。
将所有的指标、图表和任何其他 ML 元数据组织在一个地方。
轻松的可重复模型训练并进行比较。
- 备份云上的所有内容。
- 将它与超过 25 个库集成,如 PyTorch、TensorFlow、Matplotlib 等。
- 对于任何类型的数据,时间序列也不例外,任何包含时间序列的项目都可以在 Neptune.ai 上跟踪。
- 处理时间序列时有用的资源:
- 具有权重和偏差的时间序列项目
weights & bias(W & B)是一个机器学习平台,类似于 Neptune.ai,旨在帮助开发者更快地建立更好的模型。它旨在支持和优化关键的 MLOps 生命周期步骤,如模型管理、实验跟踪和数据集版本控制。
Example Neptune.ai dashboard for a time series run | Source
它只为个人项目提供有限的免费选项,而其他选项每月 50 美元起。作为 Neptune.ai,这个工具在处理时间序列项目时非常有用,为跟踪和管理时间序列模型提供了有用的功能。
Time series projects with Weights & Biases
他们的文档中提供了更多关于权重和偏差的信息。
时间序列预测包
时间序列项目最重要的部分可能是预测。预测是根据当前和过去的数据预测未来事件的过程。这是基于未来可以从过去实现的假设。此外,它还假设数据中有一些模式可以用来预测接下来会发生什么。
ML experiment tracking with Weights and Biases | Source
时间序列预测有许多方法,从简单的线性回归和基于 ARIMA 的方法,到复杂的多层神经网络或集成模型。在这里,我们将展示一些支持不同类型模型的包。
基于统计模型的时间序列预测
Statsmodels 是一个包,我们已经在关于数据可视化工具的部分提到过。但是,这是一个更适合预测的软件包。基本上,这个软件包提供了一系列的统计模型和假设检验。
Statsmodels 包还包括用于时间序列分析的模型类和函数。自回归移动平均模型(ARMA)和向量自回归模型(VAR)是基本模型的例子。马尔可夫转换动态回归和自回归是非线性模型的例子。它还包括时间序列描述统计,如自相关,部分自相关函数,周期图,以及 ARMA 或相关过程的理论性质。
下面介绍了如何使用 Statsmodels 包开始使用时间序列:
Pmdarima 时间序列预测
Pmdarima 是一个统计库,它使用基于 arima 的方法为时间序列建模提供了便利。除此之外,它还有其他功能,例如:
平稳性和季节性的一组统计检验
各种内源和外源变换,包括 Box-Cox 和傅立叶变换
季节性时间序列的分解、交叉验证工具和其他工具
- 也许这个库最有用的工具是 Auto-Arima 模块,它在提供的约束条件下搜索所有可能的 Arima 模型,并根据 AIC 或 BIC 值返回最佳模型。
- 有关 Pmdarima 的更多信息,请参见:
- 用 Sklearn 进行时间序列预测
Sklearn 或 Scikit-Learn 肯定是 Python 中最常用的机器学习包之一。它提供了各种分类、回归和聚类方法,包括随机森林、支持向量机、k-means 等。除此之外,它还提供了一些与降维、模型选择、数据预处理等相关的实用工具。
除了各种模型之外,对于时间序列,还有一些有用的功能,如管道、时间序列交叉验证功能、测量结果的各种度量标准等。
Time series forecasting with Sklearn
关于这个库的更多信息可以在下面找到:
用 PyTorch 进行时间序列预测
PyTorch 是一个基于 Python 的深度学习库,用于快速灵活的实验。它最初是由脸书人工智能研究团队的研究人员和工程师开发的,然后开源。深度学习软件如 Tesla Autopilot、优步的 Pyro 和 Hugging Face 的 Transformers 都建立在 PyTorch 之上。
Time series split using Sklearn | Source
使用 PyTorch,可以建立强大的递归神经网络模型,如 LSTM 和 GRU,并预测时间序列。此外,还有一个 PyTorch 预测包,具有最先进的网络架构。它还包括一个时间序列数据集类,抽象处理变量转换、缺失值、随机子采样、多个历史长度和其他类似问题。关于这一点的更多信息如下:
基于张量流的时间序列预测
TensorFlow 是一个用于机器学习的开源软件库,基于数据流图。它最初由 Google Brain 团队开发,供内部使用,但后来作为开源项目发布。该软件库提供了一组高级数据流运算符,这些运算符可以组合起来以自然的方式表达涉及多维数据数组、矩阵和高阶张量的复杂计算。它还提供了一些底层原语,比如内核,用于构造自定义操作符或加速常见操作的执行。
Keras 是一个构建在 TensorFlow 之上的高级 API。使用 Keras 和 TensorFlow 可以为时间序列预测建立神经网络模型。下面的教程解释了使用天气时间序列数据集的时间序列项目的一个示例:
利用 Sktime 进行时间序列预测
Sktime 是一个用于时间序列和机器学习的开源 Python 库。它包括有效解决时间序列回归、预测和分类任务所需的算法和转换工具。创建 Sktime 是为了与 scikit-learn 一起工作,并使其易于为相关的时间序列任务调整算法以及构建复合模型。
总的来说,该套件提供:
时间序列预测的最新算法
时间序列的转换,如去趋势化或去季节化等
模型和转换的管道,模型调整工具,以及其他有用的功能
- 下面介绍了如何开始使用该库:
- 用 Prophet 进行时间序列预测
- Prophet 是由脸书的核心数据科学团队发布的开源库。简而言之,它包括一个用于预测时间序列数据的程序,该程序基于一个加法模型,该模型将几个非线性趋势与年度、周和日季节性以及假日效应结合起来。它最适用于具有强烈季节性影响的时间序列和多个季节的历史数据。它能够处理缺失数据、趋势变化和异常值。
关于先知图书馆的更多信息如下:
用 Pycaret 进行时间序列预测
PyCaret 是 Python 中的一个开源机器学习库,可以自动化机器学习工作流。使用 PyCaret,可以用最少的工作和几行代码构建和测试几个机器学习模型。
基本上,用最少的代码,不深究细节,就可以构建一个从 EDA 到部署的端到端的机器学习项目。
这个库有一些有用的时间序列模型,其中包括:
季节性天真预测者
ARIMA
多项式趋势预测器
- 套索网有去季节化和去趋势化选项和许多其他选项
- ARIMA
- 有关 PyCaret 的更多信息,请点击此处:
- 用 AutoTS 进行时间序列预测
AutoTS 是 Python 的时间序列包,旨在自动进行时间序列预测。它可用于寻找单变量和多变量时间序列的最佳时间序列预测模型。此外,AutoTS 本身会清除任何 NaN 值或异常值。
Anomaly detection using PyCaret | Source
近 20 个预定义的模型,如 ARIMA,ETS,VECM 可用,并使用遗传算法,为给定的数据集找到最佳的模型,预处理和集成。
关于这个包的一些教程是:
用飞镖进行时间序列预测
Darts 是一个 Python 库,允许对时间序列进行简单的操作和预测。它包括各种各样的模型,从经典的 es 和 ARIMA 到 RNN 和变形金刚。所有模型的使用方式都与 scikit-learn 包中的方式相同。
该库还允许对模型进行简单的回溯测试,合并来自多个模型的预测,以及合并外部数据。它支持单变量和多变量模型。所有可用型号的列表以及几个示例可在此处找到:
基于 Kats 的时间序列预测
Kats 是由脸书基础设施数据科学团队发布的软件包,旨在执行时间序列分析。这个包的目标是提供时间序列分析所需的一切,包括检测、预测、特征提取/嵌入、多变量分析等等。
Kats 提供了一套全面的预测工具,如集成、元学习模型、回溯测试、超参数调整和经验预测区间。此外,它还包括检测时间序列数据中的季节性、异常值、变化点和缓慢趋势变化的功能。使用 TSFeature 选项,可以生成 65 个具有清晰统计定义的特征,这些特征可用于大多数机器学习模型。
关于 Kats 包的更多信息描述如下:
预测库比较
为了便于比较预测包并有一个高层次的概述,下面是一个具有一些共同特征的表格。它显示了一些指标,如 GitHub 星级、发布年份、支持特性等。
More about Kats package is described below:
发行年份
GitHub stars
统计学和计量经济学
机器学习
深度学习
✅ ✅
深度学习:
✅
Statistics & econometrics:
深度学习:
✅
Statistics & econometrics:
统计学&计量经济学:
统计学&计量经济学:
Statistics & econometrics:
✅
深度学习:
✅
Statistics & econometrics:
深度学习:
✅
Statistics & econometrics:
✅
深度学习:
Statistics & econometrics:
✅
Statistics & econometrics:
✅
深度学习:
Statistics & econometrics:
结论
Statistics & econometrics:
在这篇文章中,我们描述了时序项目最常用的工具、包和库。有了这个工具列表,就有可能涵盖几乎所有与时间序列相关的项目。除此之外,我们还提供了预测库的比较,显示了一些有趣的统计数据,比如发布年份、流行程度以及它支持哪种模型。
如果您想更深入地了解时间序列领域,可以使用一组不同的包来处理时间序列:“ Github:使用 Python 处理时间序列数据”。
对于那些想从理论上了解更多时间序列的人来说,Helmut Lütkepohl 教授的书《多时间序列分析新入门》是一个很好的选择。
你搞砸了
Enes 是一名拥有三年多经验的数据科学家。Enes 在数学、计算机科学和机器学习方面有很强的背景,并且热衷于学习和探索与机器学习相关的任何领域。你可以在 Linkedin 上和他联系。
阅读下一篇
使用机器学习预测股票价格
9 分钟阅读|作者凯瑟琳(易)李| 2022 年 1 月 25 日更新
READ NEXT
众所周知,股票市场是不稳定的,动态的,非线性的。由于多种(宏观和微观)因素,如政治、全球经济状况、意外事件、公司财务表现等,准确的股价预测极具挑战性。
但是,所有这些也意味着有大量的数据可以从中发现模式。因此,金融分析师、研究人员和数据科学家不断探索分析技术,以检测股市趋势。这就产生了算法交易的概念,它使用自动化的、预编程的交易策略来执行订单。
在本文中,我们将使用传统的量化金融方法和机器学习算法来预测股票走势。我们将讨论以下主题:
股票分析:基本面与技术面分析
作为时间序列数据的股票价格及相关概念
用移动平均技术预测股票价格
- LSTMs 简介
- 用 LSTM 模型预测股票价格
- 对新方法的最终想法,如 ESN
- Introduction to LSTMs
- Predicting stock prices with an LSTM model
- Final thoughts on new methodologies, such as ESN
MLOps 设置技巧——我们从 7 ML 专家那里学到的东西
原文:https://web.archive.org/web/https://neptune.ai/blog/tips-for-mlops-setup
与两年前相比,术语“MLOps”现在已经获得了更多的关注,当时它主要被认为是一个“流行语”。今天,机器学习(ML)开发人员通常会通过与 DevOps 的概念进行比较,对该术语有一个清晰的概念,而不是模糊的解释。
这种发展可以归功于 ML 解决方案数量的增加以及随之而来的竞争优势需求的增加。但是 MLOps 如何帮助实现这一目标呢?
MLOps 帮助 ML 团队开发解决方案,并以标准化、快速和最少出错的方式将它们投入生产。这是通过安装在 ML 管道中的一组指导方针和自动化功能来实现的,这些指导方针和自动化功能可以帮助不同的团队轻松地相互协作。
考虑到这一点,在现有渠道的基础上利用和设置 MLOps 的最佳方式是什么?为了最好地回答这个问题,我们收集了 7 位 MLOps 专家的见解!
以下是我们对他们建议的分类:
- 治理准则
- 团队协作
- 时间作为一种度量
- 版本控制和数据记录
- 变形 MLOps 功能
创建可靠的治理指导方针
一套标准的规则设定了机器学习团队在共同基础上合作的方式。如果没有适当的指导方针,您可能会在项目中原地打转。治理指南涵盖了 ML 管道的每个阶段,从构思和数据收集阶段到再培训和监控。
Imtiaz Adam 指出了建立可靠的 MLOps 渠道的治理需求:
“良好的治理和清晰性有助于数据科学模型和绩效反馈的顺利集成。所以,处理数据漂移的能力,干净清晰的 API,便携干净的 docker 映像,自动化文档。”–Imtiaz Adam,深度学习策略有限公司的创始人兼策略和数据科学总监
良好的治理规则也为标准化铺平了道路,标准化是减少重复劳动和时间损失的关键因素。简单来说,标准化指的是一组通用的核心流程,允许开发人员最大化代码和通信的价值。事实上,正如亚马逊的技术经理 Greg Coquillo 所说,标准化的沟通渠道也是必不可少的。想象一下,当您知道在任何给定的沟通阶段需要交换的确切信息时,可以节省多少时间。
“我会说,在 ML 开发过程中,基于数据质量和可用性以及与业务团队的沟通循环,实施标准化的功能工程和选择程序。”–Greg Coquillo,亚马逊的技术经理| LinkedIn 2020 年数据科学和人工智能的最高呼声
在个人贡献者身上播下 MLOps 的种子
在公司部门开始采用 AI/ML 解决方案的最初几年,MLOps 甚至不是一个合适的术语。然而,随着公司开始从概念验证项目中看到巨大的成果,他们希望将人工智能功能添加到他们的产品中。这意味着 ML 代码的无错快速生产,团队能够生产这些代码,因为他们只需要管理一次性的 ML 项目。
随着时间的推移,管理的 ML 项目的数量显著增加,但是一些开发人员的方法仍然停滞不前。因此,即使 MLOps 能力支持 ML 团队标准化生产高容量和高质量的 ML 解决方案,仍有开发者可能对采用新技术犹豫不决。
“就像大多数事情一样,实践背后的人是最重要的。要正确实施 MLOps,团队中的每个人都需要同意有正确的做事方法。为了与软件开发相提并论,需要一个忽视测试覆盖率的流氓开发人员来发布损坏的代码。当每个人都同意机器学习应该是协作的、可重复的和持续的,系统和实践将会更容易实现。”–托尼·佩尔姆基,瓦罗海的首席运营官
就像来自 Valohai 的 Toni perm ki 与软件开发做了一个非常相关的类比,也有计算机安全的类似场景。一个组织的安全性取决于其最薄弱的资源。一个员工甚至一个系统不遵守设定的安全准则,最终会破坏价值可观的安全性。
为了获得团队中每个贡献者对任何 MLOps 指导方针的认同,首先教育团队并指出不实现特定 MLOps 功能的成本是很重要的。通常,为了消除采用 MLOps 可能带来的惰性,降低性能的想法可能比收益的想法更有效。
将时间作为衡量标准进行优先排序
拟阵的创始人礼萨·扎德提出,让一个濒临死亡的机器学习模型起死回生所需的时间至关重要。重新训练一个模型所需的周转时间绝对是一个比首先构建解决方案所需的时间更重要的度量。这主要是因为一旦解决方案投入生产,只要修复还在进行,最终客户就将面临停机。
“MLOps 中最重要的实践是最大限度地减少用户处理模型漂移所需的时间。当模型(不可避免地)漂移时,您必须能够快速更新模型。时间越长,生产受到的影响就越大。这就是为什么拟阵优化的事情之一是端到端的重新训练和重新部署,允许我们的用户在几分钟内修复漂移。”–礼萨·扎德,拟阵的创始人兼首席执行官
为了能够减少模型更新的周转时间,监控、再培训和特征工程等 ML 流水线阶段必须尽可能标准化和自动化。
此外,减少周转时间需要一个装备良好的监控能力,可以跟踪主要的模型漂移并立即警告团队。为了使模型监控过程有效,可以使用一系列度量标准,例如数据漂移、元数据和模型漂移。
版本控制和数据记录
版本化是机器学习实验和结果得以重现的唯一途径。ML 团队在选择最佳实验时,甚至在排除故障时,结果的再现性都是至关重要的。版本化可以分为两种类型:
- 数据版本化:跟踪和存储用于不同 ML 实验的不同数据集及其元数据。
- 模型版本化:跨各种 ML 实验跟踪和存储模型的参数和元数据。
类似地,日志记录是在构建解决方案的过程中跟踪变化的一种方式。
在减少周转时间方面,当 ML 解决方案中出现问题或者如果模型需要重新训练时,模型版本控制和数据记录可以帮助开发人员通过检查不适当元素的 ML 阶段来快速排除故障。这就是为什么跟踪 ML 流水线中的变化对于减少时间投入以及提高生产过程的质量至关重要。
版本控制和数据记录的重要性得到了进一步强调,因为我们的两位 ML 专家在推荐设置 MLOps 的最佳技巧时意见一致:
“将显著改进任何 MLOps 实现的最简单的实践是特定于数据的日志记录。如果您只是在 ML 管道的每一步记录数据帧的统计属性,并在推断过程中连续记录,您将立即加快调试速度,减少解决任何问题的时间,并显著简化所有错误分析笔记本。日志记录是任何软件开发中的最佳实践,对于通常缺乏透明性和可再现性的 ML 系统,日志记录是您能用几行代码对您的管道所做的最有影响力的事情。尝试一个开源库,让日志记录变得更容易。”–阿莱西娅·维森吉奇,why labs的首席执行官兼联合创始人
“我认为在模型库中收集和维护起源可能是 MLOps 实现中最有用和最关键的实践。当当前部署的模型出现问题时,您需要有能力倒回到模型的以前版本,或者至少有能力比较和解释模型的不同版本之间的不同结果,特别是当利益相关者问为什么事情会不同时,他们会问。”–柯克·伯恩,博士,数据犯罪公司的首席科学官
变形 MLOps 功能以适应流程
菲尔·温德(Phil Winder)提供了一个禅宗式的最佳实践技巧,为思考提供了重要的食物。这条建议可能类似于亚里士多德的名言:“了解你自己是所有智慧的开始”。将同样的方法应用于 MLOps 的采用,考虑 MLOps 只不过是增强现有 ML 管道的一种方式,并且如果没有对组织的 ML 架构的透彻理解,MLOps 的用途是最小的。
“我的第一条建议是,MLOps 不是一种工具。它不是一个产品。它描述了自动化和简化构建人工智能相关产品和服务的过程的尝试。因此,花时间定义您的过程,然后找到适合该过程的工具和技术。例如,银行的流程与科技创业公司的流程大相径庭。因此,最终的 MLOps 实践和堆栈也会非常不同。”–菲尔·温德,温德研究公司首席执行官
在您的组织中设置 MLOps 的更多最佳实践
如果计划不周,随着时间的推移,运行端到端的 ML 管道会使组织的资源紧张。因此,在设置 MLOps 指导方针时,务必注意可用的财务、人工和机器资源,以便能够创建分配计划。
- CI/CD 管道自动化
CI 代表持续集成,这个模块负责在自动化的帮助下跨各种测试用例、运行时和环境持续构建和测试解决方案。CD 代表持续部署,负责自动处理生产环境。在建立 MLOps 渠道时,CI/CD 自动化应该是最终目标,即使一开始并不可行。
- 跟踪运营指标
定期跟踪 ML 管道的性能是非常有益的。前面我们讨论了再培训的周转时间,还有几个其他指标,当结合起来时,可以准确地反映管道的健康状况。这些指标包括部署时间、处理时间、再培训频率等等。
最后一个音符
稳定可靠的 MLOps 管道现在是当务之急,尤其是对于那些希望大规模实现机器学习的组织。ML 项目、工具和团队总是随着领域的指数级发展而变化,MLOps 提供了优化变更管理的正确手段。在最少扰动的情况下,质量、数量和时间等因素不会因为 MLOps 而受到影响。
借助来自行业精英的最佳技巧,您无疑离构建适合您组织的 MLOps 更近了一步。
萨马德里塔·戈什
一个内容营销和 AI 爱好者。她的使命是帮助基于人工智能的公司建立品牌知名度,并通过高质量的内容抓住网民的巨大市场,无论是信息丰富的博客还是教育播客!
阅读下一篇
最佳 MLOps 工具以及如何评估它们
12 分钟阅读| Jakub Czakon |年 8 月 25 日更新
在我们的一篇文章中——机器学习团队实际使用的最好的工具、库、框架和方法——我们从 41 家 ML 初创公司学到的东西——Acerta 的 CTO Jean-Christophe Petkovich 解释了他们的 ML 团队如何接近 MLOps。
据他所说,一个完整的 MLOps 系统有几个要素:
- 您需要能够构建包含预处理数据和生成结果所需的所有信息的模型工件。
- 一旦您能够构建模型工件,您必须能够跟踪构建它们的代码,以及它们被训练和测试的数据。
- 您需要跟踪所有这三样东西,模型、它们的代码和它们的数据,是如何关联的。
- 一旦您可以跟踪所有这些内容,您还可以将它们标记为准备就绪,进行生产,并通过 CI/CD 流程运行它们。
- 最后,为了在该过程的最后实际部署它们,您需要某种方法来基于该模型工件旋转服务。
这是对如何在公司中成功实施 MLOps 的高度概括。但是理解高层需要什么只是拼图的一部分。另一个是采用或创建适当的工具来完成工作。
这就是为什么我们编制了一份最佳 MLOps 工具的清单。我们将它们分为六类,以便您可以为您的团队和业务选择合适的工具。让我们开始吧!
训练最先进的 NLP 模型的技巧和诀窍
原文:https://web.archive.org/web/https://neptune.ai/blog/tips-to-train-nlp-models
这是基于最先进的变压器的时代 NLP 模型。随着 huggingface 推出像变形金刚这样的软件包,为任何给定的任务训练 NLP 模型变得非常方便。但是,当每个人都在做同样的事情时,你如何获得额外的优势呢?如何从模特身上获得让你脱颖而出的额外表现?
在本文中,我将讨论一些方法、技巧和诀窍,它们可以帮助您在自然语言处理(NLP)项目中实现这一目标。
但是在此之前,让我们讨论一下 transformer 模型以及在训练它们时出现的挑战。
最先进的变压器模型
转换器是一种深度学习模型,它使用一堆编码器和解码器来处理输入数据。它使用注意机制对输入序列数据进行加权。
基于变压器的模型可以大致分为:
- 自回归模型:这些模型依赖于变换器的解码器部分,并使用注意屏蔽,使得在每个位置,模型只能看到当前记号之前的记号。例如,GPT。
- 自动编码模型:这些模型依赖于转换器的编码器部分,不使用注意屏蔽,因此模型可以看到输入序列中的所有其他标记。比如伯特。
- 序列到序列:型号同时使用变压器的编码器和解码器部分。
Transformers 可用于各种各样的 NLP 任务,如问题回答、序列分类、命名实体识别等。基于 transformer 的模型带来的性能也带来了一些其他挑战,如高计算量、对更大数据集的需求、训练样本中令牌数量的限制、训练不稳定性等。
你如何应对这些挑战?你可以用什么方法、技巧和窍门来训练最先进的 NLP 模型?
技巧 NLP 的迁移学习
将知识从一个模型转移到另一个模型的过程称为迁移学习。有几个任务中可用于训练的数据量非常少。由于现在使用的深度神经网络的参数数量非常大,它们非常渴望训练数据,并且很难用小的训练数据集训练出概括良好的模型。在这种情况下,迁移学习可以解决问题。
我们可以在有大量训练数据可用的类似任务上训练这些深度模型,然后使用学习到的参数对可用训练数据稀缺的目标任务进行进一步训练。通过这样做,模型的表现要比从头开始训练时好得多。有效利用迁移学习有两种可能性。就像烘烤前预热烤箱一样,我们可以在有大量训练数据的相关任务上训练模型,然后:
- 特征提取器:我们可以使用这个预训练的模型作为特征提取器(因此冻结模型的参数),并为我们的特定任务训练另一个简单的线性模型,该模型具有少得多的可用训练数据。
- 微调:或者我们可以替换特定于任务的层,以适应我们的特定任务,并继续训练整个模型。因此,基本上,预训练模型的最终参数值被用作我们特定任务训练的初始起点。
好了,我们现在熟悉了迁移学习的概念,它广泛应用于计算机视觉任务,如图像分割、物体检测等。但是这对 NLP 有用吗?如何在 NLP 中应用同样的概念?
为了回答这些问题,OpenAI 的研究人员发现,在文章 中介绍的 transformer 模型是您所需要的全部注意力 ,在大型数据语料库(如维基百科或图书语料库数据)上为语言建模任务进行预训练时,是将学习转移到各种 NLP 任务的理想选择。语言建模是给单词序列分配概率,并根据之前的单词上下文预测即将出现的单词的任务。前馈神经语言模型是标准的前馈网络,其在时间“ t 将一定数量的先前单词的表示作为输入,并输出可能的下一个单词的概率分布。
技巧 2:训练中的不稳定性
微调变压器模型的最大挑战之一是不稳定的训练。随着训练中的微小变化,例如改变随机种子,变压器模型收敛到完全不同的结果,这种现象就是我们所说的不稳定训练。不稳定的培训在工业界和学术界都是一个非常重要的问题。由于这种不稳定性,从业者经常使用不同的随机种子进行多次训练,并评估每 n 次迭代(是的,你没看错,不是每 n 个时期,而是每 n 次迭代),其中 n 可以低至 5 次迭代,并保存最佳模型。所有这些因素都大大增加了培训时间、成本和维护费用。
这是一个在 CoLA 数据集上训练了两次的 bert-large-uncased 模型的截图。只有应用于模型的丢弃的随机种子从 12345 变化到 12346,我们注意到性能从 0.56 变化到 0.62。请随意使用我们在 Neptune dashboard 中的日志对此进行更深入的研究。
Comparison of validation scores with different seeds
如此剧烈的不稳定性使得科学比较变得不可能。因此,研究人员正在研究使训练稳定的技术。这个问题没有通用的解决方法,但是有一些技术可以提供一些有希望的解决方案。我们已经在一个名为 Stabilizer 的开源包中实现了其中的一些技术。你可以在这里 找到它。接下来,我们将向您展示一些减轻这种不稳定训练的技巧。
重新初始化
在该技术中,变换器编码器模型的最后 n 层被重新初始化。这种技术背后的想法是,由于这些变压器模型是在 MLM 和 NSP 任务上预先训练的,更接近输出的变压器的顶层学习预先训练特定于任务的参数,这些参数可能不是最适合我们自己的任务。因此,更接近输出的最后 n 层被重新初始化。这里有伪代码向你展示它是如何做到的。如果你想用一个方便的函数来做这件事,那么请使用稳定库。
分层学习率衰减
一般来说,神经网络是用应用于其所有层的统一学习速率来训练的。但是当预训练的变压器模型的顶层学习对于它被预训练的任务来说是理想的参数时,它们不提供用于微调的好的初始点。
为了减轻这种情况,我们可以对转换器的每一层应用不同的学习率。例如,我们可以对顶层应用非常高的学习率,而对底层应用小得多的学习率。为了用一个超参数轻松控制学习速率,我们使用了一种叫做分层学习速率衰减的技术。在这种技术中,当我们从顶层移动到底层时,我们以指数方式降低学习速率。这样,与可跨任务转移的较低层相比,针对 MLM 或 NSP 目标预先训练的顶层的参数变化很快。这里是伪代码,向你展示它是如何做到的。如果你想用一个方便的功能来做到这一点,那么请使用稳定库。
技巧 4:用未标记的文本数据进行预训练
现在让我们来看看一些可以用来预训练模型的目标。正如我们之前看到的,在 GPT 的情况下,模型基于变压器解码器,而在 BERT 的情况下,模型基于变压器编码器。
掩蔽语言模型目标
当用屏蔽语言模型目标进行预训练时,该模型被训练成基于单词的左右上下文来预测单词。为了用 MLM 目标进行训练,随机屏蔽一小部分输入标记,即,用特殊的[屏蔽]标记替换要屏蔽的标记。
因果语言模型目标:
当用语言模型目标进行预训练时,该模型被训练成在给定左上下文中的单词的情况下预测句子中的下一个单词。
用于预训练变压器模型的另一个常见任务是下一句预测(NSP)。在 NSP,该模型可以接受由特殊符号[SEP]分隔的一对句子作为输入,并预测二进制标签。训练数据集通过采用文档的语料库来准备,然后句子标记器将文档标记成句子。为了建立一个平衡的数据集,50%的句子时间对是从相互跟随的实际句子中创建的,而另外 50%的时间随机句子被配对在一起。这里有一个示例代码向您展示它是如何完成的。
技巧 5:用标签数据进行预训练
在上面的部分中,我们看到了基于 transformer 的模型是如何在任务独立的 LM 目标上使用文本语料库进行预训练的。这不会帮助模型学习特定于任务的特征。这造成了预训练和微调之间的差距。为了解决这个问题,我们可以进行特定任务的预训练或使用标记数据的预训练。
在这种方法中,我们在相似的数据集上训练变压器完成相似的任务。然后,我们使用这些训练好的权重来初始化模型权重,并在我们的特定任务数据集上进一步训练模型。该概念类似于计算机视觉中的转移学习,其中我们使用来自在类似任务上训练的一些模型的模型权重来初始化权重。这里你必须调整你想要初始化权重的层数。这项技术的主要挑战是找到解决类似任务的类似数据集。
让我们整合一下完成此任务的步骤:
- 选择基本变压器型号。让我们说,伯特
- 查找与给定任务和数据匹配的外部数据集。
- 在外部数据集上训练基础模型并保存模型权重。
- 使用这些训练的模型权重再次初始化基础模型。
- 现在,针对给定的任务,使用您的数据集训练该模型。
- 调整初始化的层数以获得更好的性能。
这里有伪代码向你展示它是如何做到的。
对未标记数据的预训练仅帮助模型学习一般语言领域特定的特征。与使用未标记的数据进行预训练相比,使用标记的数据进行预训练使模型学习到更多特定于任务的特征。
技巧 6:伪标签
在任何深度学习模型中提高泛化能力和鲁棒性的一个简单方法是使用更多的数据进行模型训练。大多数情况下,您可以访问一些您可以使用的未标记的数据,但是标记它是一项缓慢的任务。这时伪标签就大有帮助了。
伪标记是一种半监督方法,将大量未标记数据与标记数据相结合,用于模型训练。在这种方法中,我们不是手动标记未标记的数据,而是使用一个经过训练的模型来近似标记,然后将这个新标记的数据与训练集一起输入,以重新训练模型。
Flowchart for pseudo labeling | Source: Author
我们现在可以合并步骤来进行伪标记:
- 用训练数据训练和评估初始模型
- 收集未标记的数据用于伪标记
- 使用初始模型对未标记的数据进行预测
- 组合训练集和新标记的数据,并用该集训练新模型。
如果您正在为分类任务进行训练,您可以使用模型的置信度(预测概率)对伪标签数据进行采样。假设您使用初始二元分类器模型对 1000 个样本的未标记数据进行预测。在此之后,您已经预测了所有这些样本的概率,从中您可以使用大于 0.95 的置信度筛选出样本。通过这样做,您可以减少伪标记过程中可能出现的噪声。
影响模型性能的另一个因素是采样率,采样率是用于伪标记的未标记样本的百分比。您可以通过在保留的验证数据集上绘制采样率与评分度量图来调整采样率。
如果您使用 K-fold 方法来训练和评估您的模型,请确保在应用伪标记时没有数据泄漏。假设您在训练集上训练了一个 5 折叠模型,该模型使用 5 个折叠中的每一个在未标记的数据上创建伪标签。最后,如果您聚合这 5 个折叠预测以创建伪标记数据集并重新训练该模型,则验证分数将会过于乐观,因为用于创建伪标记的 5 个模型中有 4 个在训练时也看到了来自该验证集的样本。为了避免这种间接的数据泄漏,在每个折叠中独立地进行伪标记和再训练。****
技巧 7:实验跟踪对变压器培训的重要性
让我们承认我们都经历过电子表格噩梦。10 年前,当模型简单而确定时,实验记录表还可以。但是在当今世界,我们处理的模型有几百万个(例如,BERT 基本模型有 1.1 亿个参数,BERT 大型模型有 3.45 亿个参数),有些事情很容易出错。正如我们之前看到的,由于变压器模型训练的不稳定性,可视化验证模型并比较运行中的配置以清楚地了解实验之间的差异非常重要。
因此,实验跟踪可以帮助我们做以下重要的事情:
对结果进行目视检查
这是我们在 Kaggle Commonlit 可读性数据集上训练一个模型时获得的两次训练运行的截图。当我们仔细观察时,我们可以注意到,其中一次运行比另一次运行多训练了几次迭代,在训练结束时,模型的性能急剧上升。鉴于 transformer 模型是如此脆弱,实验跟踪仪表板立即允许我们观察这种异常行为,并且通过它们的配置和代码跟踪功能,我们可以很容易地对此进行调查。
Validation scores with and without SWA
训练运行的比较
使用任何可用的实验跟踪工具,如 Neptune、Wandb 或 Comet,你可以比较关于你正在跟踪的不同指标的不同实验。我们不再需要编写脚本来保存、跟踪和读取配置文件或实验日志,以便对结果进行深入分析。快速进行比较所需的大多数选项都可以通过几次点击获得,因此我们可以交互式地运行分析和训练模型。使用 Neptune 的最大优势之一是,它使这个过程变得非常容易,只需按一下按钮,就能生成视觉上吸引人的图表。下面是 Neptune 的截图,它向我们揭示了哪个参数影响了模型的性能。
Comparing different experiments in Neptune | See in the app
鉴于我们可以通过几行代码获得所有这些好处,训练大型 transformer 模型变得轻而易举!这是海王星项目的链接。快来看看!
结论
训练 NLP 模型的 SOTA 就像是在冒险乘坐过山车。该领域正在急剧发展,研究人员每天都在发现新的技巧来可靠地训练这些模型。虽然本文中提到的大多数技巧和诀窍都是高级概念,但我们希望本文中提到的伪代码可以作为一个良好的起点,来提高您当前的 NLP 模型的性能。我们希望通过这篇文章,你能够掌握很好的技术和工具,自信地训练和跟踪稳定的最先进的 NLP 模型。
自然语言处理中的标记化:类型、挑战、例子、工具
原文:https://web.archive.org/web/https://neptune.ai/blog/tokenization-in-nlp
在任何 NLP 项目中,您需要做的第一件事是文本预处理。预处理输入文本仅仅意味着将数据转换成可预测和可分析的形式。这是构建令人惊叹的 NLP 应用程序的关键一步。
预处理文本有不同的方法:
- 停止单词删除,
- 符号化,
- 堵塞。
其中,最重要的一步是标记化。它是将文本数据流分解成单词、术语、句子、符号或其他一些有意义的元素(称为标记)的过程。有很多开源工具可以用来执行令牌化过程。
在本文中,我们将深入探讨标记化的重要性和不同类型的标记化,探索一些实现标记化的工具,并讨论面临的挑战。
为什么我们需要标记化?
标记化是任何 NLP 流水线的第一步。它对你管道的其他部分有着重要的影响。记号赋予器将非结构化数据和自然语言文本分解成可以被视为离散元素的信息块。文档中出现的标记可以直接用作表示该文档的向量。
这就立刻把一个非结构化的字符串(文本文档)变成了适合机器学习的数值数据结构。它们也可以被计算机直接用来触发有用的动作和响应。或者它们可以在机器学习管道中用作触发更复杂决策或行为的功能。
标记化可以分隔句子、单词、字符或子词。当我们将文本拆分成句子时,我们称之为句子标记化。对于单词,我们称之为单词标记化。
句子标记化的例子
单词标记化的例子
虽然 Python 中的标记化可能很简单,但我们知道它是开发良好模型和帮助我们理解文本语料库的基础。本节将列出一些可用于标记文本内容的工具,如 NLTK、TextBlob、spacy、Gensim 和 Keras。
空白标记化
标记文本最简单的方法是在字符串中使用空格作为单词的“分隔符”。这可以通过 Python 的 split 函数来实现,该函数可用于所有 string 对象实例以及 string 内置类本身。您可以根据需要任意更改分隔符。
正如您所注意到的,这个内置的 Python 方法在标记一个简单的句子方面已经做得很好了。它的“错误”在最后一个词上,在那里它包括了带有符号“1995”的句尾标点符号。我们需要将标记与句子中相邻的标点符号和其他重要标记分开。
在下面的例子中,我们将使用逗号作为分隔符来执行句子标记化。
NLTK 单词标记化
NLTK (自然语言工具包)是一个用于自然语言处理的开源 Python 库。它为 50 多个语料库和词汇资源(如 WordNet)提供了易于使用的界面,以及一组用于分类、标记化、词干提取和标记的文本处理库。
您可以使用 NLTK 的 tokenize 模块轻松地对文本中的句子和单词进行标记。
首先,我们将从 NLTK 库中导入相关的函数:
- 单词和句子分词器
注意:sent_tokenize 使用来自 token izers/punkt/English . pickle 的预训练模型
- 基于标点符号的分词器
这个分词器根据空格和标点符号将句子拆分成单词。
我们可以注意到考虑“Amal。m " word _ token ize 中的一个单词,并在 wordpunct_tokenize 中将其拆分。
这个分词器包含了各种英语单词分词的通用规则。它分隔像(?!。;,)从相邻的标记中分离出来,并将十进制数保留为单个标记。此外,它还包含英语缩写的规则。
例如,“不”被标记为[“做”,“不”]。您可以在这个链接中找到 Treebank 标记器的所有规则。
当我们想要在像 tweets 这样的文本数据中应用标记化时,上面提到的标记化器无法产生实用的标记。通过这个问题,NLTK 有了一个专门针对 tweets 的基于规则的标记器。如果我们需要像情感分析这样的任务,我们可以将表情符号分成不同的单词。
NLTK 的多词表达式标记器(MWETokenizer)提供了一个函数 add_mwe(),允许用户在对文本使用标记器之前输入多个词表达式。更简单地说,它可以将多词表达式合并成单个令牌。
TextBlob 单词标记化
TextBlob 是一个用于处理文本数据的 Python 库。它提供了一个一致的 API,用于处理常见的自然语言处理(NLP)任务,如词性标注、名词短语提取、情感分析、分类、翻译等。
让我们从安装 TextBlob 和 NLTK 语料库开始:
$pip install -U textblob
$python3 -m textblob.download_corpora
在下面的代码中,我们使用 TextBlob 库执行单词标记化:
我们可以注意到 TextBlob 标记器删除了标点符号。此外,它还有英语缩写的规则。
空间记号化器
SpaCy 是一个开源的 Python 库,可以解析和理解大量文本。提供适合特定语言(英语、法语、德语等)的型号。),它以最高效的常用算法实现来处理 NLP 任务。
spaCy tokenizer 提供了指定特殊标记的灵活性,这些标记不需要分段,或者需要使用每种语言的特殊规则进行分段,例如,句子末尾的标点符号应该分开,而“U.K .”应该保留为一个标记。
在使用 spaCy 之前,您需要安装它,下载英语语言的数据和模型。
$ pip install spacy
$ python3 -m spacy download en_core_web_sm
Gensim 单词标记器
Gensim 是一个 Python 库,用于大型语料库的主题建模、文档索引和相似性检索。目标受众是自然语言处理(NLP)和信息检索(IR)社区。它为标记化提供了实用函数。
使用 Keras 的标记化
Keras 开源库是最可靠的深度学习框架之一。为了执行标记化,我们使用 Keras.preprocessing.text 类中的 text_to_word_sequence 方法。Keras 最大的优点是在标记之前将字母表转换成小写字母,这样可以节省大量时间。
注意:你可以在这里找到所有的代码示例。
可能有用
检查如何跟踪您的 TensorFlow / Keras 模型训练元数据(指标、参数、硬件消耗等)。
挑战和局限
让我们讨论一下标记化任务的挑战和局限性。
通常,该任务用于用英语或法语编写的文本语料库,其中这些语言通过使用空格或标点符号来分隔单词,以定义句子的边界。不幸的是,这种方法不适用于其他语言,如汉语、日语、朝鲜语、印地语、乌尔都语、泰米尔语等。这个问题产生了开发一个结合所有语言的通用标记化工具的需求。
另一个限制是阿拉伯文本的标记化,因为阿拉伯语作为一种语言具有复杂的形态。例如,一个阿拉伯单词可能包含多达六个不同的标记,如单词“عقد”(eaqad)。
*One Arabic word gives the meanings of 6 different words in the English language. | Source *
在自然语言处理方面有很多研究正在进行。你需要选择一个挑战或问题,并开始寻找解决方案。
结论
通过这篇文章,我们已经了解了来自各种库和工具的不同记号赋予器。
我们看到了这项任务在任何 NLP 任务或项目中的重要性,并且我们还使用 Python 和 Neptune 实现了跟踪。您可能会觉得这是一个简单的主题,但是一旦深入到每个记号赋予器模型的细节,您会注意到它实际上非常复杂。
从上面的例子开始练习,并在任何文本数据集上尝试它们。你练习得越多,你就越能理解标记化是如何工作的。
如果你陪我到最后——谢谢你的阅读!
阿迈勒·门兹利
创新、足智多谋、自我激励的数据科学家。我热衷于用数据解决难题,我相信它是我们今天最强大的工具,来回答宇宙中最模糊的问题。此外,我喜欢教学、指导和写技术博客。
阅读下一篇
如何构建和管理自然语言处理(NLP)项目
Dhruvil Karani |发布于 2020 年 10 月 12 日
如果说我在 ML 行业工作中学到了什么的话,那就是:机器学习项目很乱。
这并不是说人们不想把事情组织起来,只是在项目过程中有很多事情很难组织和管理。
你可以从头开始,但有些事情会阻碍你。
一些典型的原因是:
- 笔记本中的快速数据探索,
- 取自 github 上的研究报告的模型代码,
- 当一切都已设置好时,添加新的数据集,
- 发现了数据质量问题并且需要重新标记数据,
- 团队中的某个人“只是快速地尝试了一些东西”,并且在没有告诉任何人的情况下改变了训练参数(通过 argparse 传递),
- 从高层推动将原型转化为产品“仅此一次”。
多年来,作为一名机器学习工程师,我学到了一堆东西,它们可以帮助你保持在事物的顶端,并检查你的 NLP 项目(就像你真的可以检查 ML 项目一样:)。
在这篇文章中,我将分享我在从事各种数据科学项目时学到的关键指针、指南、技巧和诀窍。许多东西在任何 ML 项目中都是有价值的,但有些是 NLP 特有的。
ML 模型治理、起源和谱系的最佳工具
原文:https://web.archive.org/web/https://neptune.ai/blog/tools-for-ml-model-governance-provenance-lineage
ML 软件开发复杂;建立一个 ML 模型是一回事,改进和维护它是另一回事。如果你想让你的机器学习模型健壮、合规,并给出可重现的结果,你必须在质量模型管理上投入时间和金钱。
模型治理、模型起源和模型沿袭工具通过跟踪模型活动、记录数据和模型中的所有变更,以及概述数据管理和处理的最佳实践来帮助您做到这一点。
在本帖中,让我们讨论一下这些工具是什么,以及如何选择最好的工具。虽然这三种实践的目的不同,但它们有很多共同点。因此,一个对模型治理有益的工具,通常对其他两个也是有益的。
我将引导您了解一些在开发人员中最流行的模型治理工具,并解释您应该根据您的特定用例选择哪一个。
什么是模型治理?
模型治理,正如您可能从术语中理解的那样,是一组实践和技术,用于控制模型开发和实现的过程。任何 ML 模型都必然符合某些期望。它们应该满足技术要求,符合法律要求,并且不存在任何道德问题。
为什么要建模治理?
部署模型后,现实世界中的结果与您预期的大相径庭,这是很常见的。为了理解哪里可能出错并快速修复,您需要模型治理。
你一定很熟悉关于 ML 模型,尤其是深度学习模型的‘黑盒’这个术语。它们被描述为神秘的,无法调试的。然而,一旦您有了曾经发生的所有修改的目录,确保模型的正常运行就变得容易多了。
例如,在过去几年中,一个引起社区强烈反对的常见问题是,模型在获得美联储有偏见的数据时会产生有偏见的结果。亚马逊人工智能招聘系统经常被引用为有偏见的人工智能的一个例子。这个系统会惩罚简历中包含“女性”一词的人,就像“女子象棋俱乐部”一样,因为从历史上看,男性占据了大多数职位。
如果你不想让你的公司和亚马逊、谷歌和脸书一样被列入“黑名单”,这些公司因其歧视性的模式而受到广泛批评,那么跟踪数据漂移、异常和偏差的能力可能是有益的。
此外,偏见并不是你的模型可能面临的唯一问题。另一个挑战是保证模型的安全性,尤其是当我们谈论企业级公司时。如果一个模型意外地暴露给你公司内部的另一个部门或者第三方,会有很多不确定性。例如,模型可能被篡改,这可能会给企业带来风险。
模型治理的好处
模型治理有明显的好处。然而,从零开始实施并不总是容易的。你需要首先回顾 ML 团队的工作流程,以评估有效性和成本需求。关于模型治理实现最重要的事情是一致性。您必须在所有模型和部门中使用模型治理,而不仅仅是针对少数业务单元。标准化是有效模型治理的关键。
什么是模型出处?
模型起源与模型治理过程紧密相连,并描述了模型的起源和应用于它的处理步骤。
为什么要对出处建模?
通常,在您开始使用 ML 模型之前,您必须准备训练数据,这些数据必须沿着机器学习开发管道经历一个漫长的转换过程。数据起源的想法是跟踪转换的每一步:数据来自哪里,谁改变了它,以及以什么方式改变了它。数据获取、合并、清理和特征提取属于数据起源的范畴。
模型起源的好处
在最终版本部署之前,模型会经历很多变化。这个过程通常包括对不同的 ML 技术和架构进行实验,以获得最佳结果。你不能总是预测你的下一个方法是否会有成果。如果没有模型的检查点,很难回到最佳性能点。模型起源工具帮助您跟踪所有的输入(包括数据)、超参数、依赖性等等。
记录所有这些事情可能是一个解决方案,但是对于大型项目来说不是很方便。此外,人为因素总是会将您的模型出处置于风险之中:开发人员经常忘记记录一些小东西,比如元数据注释,他们的疏忽会导致巨大的金钱损失。
因此,以模型起源工具的形式投资自动化解决方案是值得的。对公司特别有帮助,因为有助于提升知名度。你手头有你的模型的地图,可以忘记'可见性债务。
什么是模型血统?
模型谱系是增强模型可见性的另一种技术。它可以检查模型的历史。如果您使用自动化工具,这是日常任务的强烈建议,记录将在每次新版本的模型被训练时自动生成。
模型沿袭工具允许您保留的信息包括用于构建模型的数据类型和算法、用于训练的管道以及所选参数。
为什么要模拟血统?
ML 模型开发是一个需要实验的领域。通常需要几周,甚至几个月的时间,才能得出模型配置和超参数的正确组合。通常,研究人员在迭代中工作,从模型的先前版本中保留最好的工作,并改变需要改变的内容。此外,通常会涉及许多训练数据集,这些数据集可以沿着 ML 开发管道进行更改。
当你最终确定模型的最终版本时,可能很难找到是什么改变促成了这一成功。然而,理解这一点很重要,这不仅是为了研究目的,也是为了模型的连续可再现结果。此外,研究人员通常作为团队的一部分工作,有时甚至与其他团队和部门合作。将记录保存在电子表格中不太可持续,也不太容易扩展。
当协作的需求增加时,使用版本控制工具来获得更好的模型可追溯性总是更好的。了解模型的历史使得实验结果具有可重复性,这在商业和学术领域都具有很高的价值。通过模型沿袭工具,可以追踪模型及其组件之间的关系,包括实验、数据集、容器等。它们有助于表示工件和核心之间的关联,并以直观、可视化的方式显示结构。
模型谱系的好处
模型血统对于任何公司的透明性和可追溯性都是至关重要的。今天,你的 ML 模型不能简单地代表一个“黑箱”。例如,如果第三方提出法律或道德问题,您将能够分享该模型的所有基本细节。你应该能够追溯到有问题的部分是由谁引入的,并且能够解释和修复它。
此外,模型血统在科学和商业中是至关重要的。你的模型显示的结果应该是可重复的。您的客户或您的同事应该能够运行该模型并获得相同的结果。当您拥有关于其历史和发展的所有数据时,构建和部署一个稳定的模型要容易得多。
既然模型治理、模型起源和模型传承之间的区别和相似之处已经很清楚了,那么让我们来讨论如何为您的公司选择正确的工具。
如果您已经决定转换到模型治理工具,您要做的第一件事就是不要联系软件供应商。事实上,这是你最不应该做的事情。以下是你可以一步一步做的事情:
- 模型治理采用:慢慢来,评估您的组织试图实现什么结果。最佳答案是具体的答案,例如,“交付高质量的数据以增加 X 千美元的收入”。你的里程碑应该是精确的和可测量的;只有这样,您才能在一段时间后监控您的模型治理采用的效率。
- 运营模型发现:运营模型是一种工具,它将帮助您概述与模型治理相关的角色、职责和业务术语。例如,它将建立数据所有者、决定公司应如何使用数据的个人以及负责数据收集和处理的数据管理员。您还需要开发一套数据治理策略,也就是您的团队必须遵循的规则。
- 最佳工具的选择:最佳的数据治理工具将尽可能自动化,并提供最大化的定制,因为每个公司都是不同的。不要害怕与供应商交谈,请他们演示他们的解决方案,并强调重要的功能。有备而来:你有自己的目标和需求,并询问产品将如何帮助你实现它们。
通常你不得不妥协。例如,包含您需要的所有功能以及更多功能的解决方案可能太贵了。在这种情况下,请考虑该零件对您的 ML 工程团队有多重要。提前对特性进行排序是很好的:对于一些团队来说,解决方案支持云是至关重要的;对其他人来说,不尽然。仅仅因为每个人都在云中工作并不意味着你必须这样做。
区分特性优先级的一个好方法是问你自己和你的团队你是否经常执行你想要自动化的任务。如果答案是否定的,也许手动实现它们的成本比自动化要低。
由于模型治理、模型起源和模型传承是紧密相连的,这里有一个统一的工具列表来帮助 ML 团队进行这些实践。
1.数据机器人
You can easily set up model governance from the start with DataRobot | Source
许多人认为 DataRobot 是一个平台,业务分析师可以在没有深入编程知识的情况下构建预测分析解决方案。DataRobot 的一个关键特性是 AutoML,可以快速、轻松地生成模型。
不过 DataRobot 也为 MLOps 开发了可以和 DataRobot AI 云平台一起使用的产品。DataRobot MLOps 允许简化模型部署,并在其生命周期的每个阶段监控 ML 开发。以下是该工具的主要功能:
- 角色和职责: DataRobot 具有从一开始就建立模型治理并在模型生命周期中定义明确角色的必要功能。例如,您可以分配一个生产模型经理、模型管理员、模型验证者等等。您可以为每个角色添加描述,包括所需的资格或其他要求。每个用户可以被分配多个角色。
- 访问控制:您可能希望在不同部门甚至团队成员之间建立不同级别的访问控制。这将允许您保护模型环境,并使开发过程更加可控。通过 DataRobot,您可以使用基于角色的访问控制快速实现限制。
- 审计日志: DataRobot 有一个自动化的工具,它会记录所有的更改,以避免遗漏任何重要的内容。为了遵守法律法规,安全日志记录是必要的。它将允许您跟踪系统中的每个更改,并了解更改是何时由谁进行的,这使得故障排除更加容易。
- 注解:仅仅从日志记录来判断,理解变更的背景是有挑战性的。这就是为什么用户能够留下关于他们动机的笔记是至关重要的。在 DataRobot 中,用户可以轻松地为他们的操作添加注释,以获得更好的可解释性和透明度。
- 模型谱系:当你有了模型的演化历史,更新和维护它就变得容易了。DataRobot 为开发人员提供了跟踪模型历史的可能性,包括模型工件和变更日志。
- 可追溯的结果:您的模型提供给您的结果应该总是可追溯到模型版本。记录请求数据和对这些请求的响应值以及相关数据是必不可少的。如果您想要保持您的模型的可追溯性,尤其是如果您继续更新模型,请使用 DataRobot 的内置工具进行模型响应跟踪。
- 生产模型生命周期管理: DataRobot 可以在模型生命周期管理的每个阶段为您提供帮助。可以用来做模型再训练;该工具自动发现模型性能问题,并在投入生产之前开始测试过程。它还可以帮助您预热模型,并允许您将模型置于预热模式,以观察其在现实条件下的性能。
2.大太酷
Dataiku 是一个用于数据处理、分析和机器学习的一站式平台。Dataiku 允许您创建、共享和重用使用数据和机器学习来扩展和自动化决策的应用程序。
Dataiku 还将自己定位为一个强大的模型治理工具,借助高级权限管理、SSO 和 LDAP 集成,帮助您管理风险并确保合规性。几个特性使得 Dataiku 成为模型治理的首选工具之一:
- 监控&MLOps 中的漂移检测:大台库可以为你监控模型的流水线,确保每个人都按计划进行。如果检测到任何异常,它将向工程师发送有关该问题的警报。它会自动检查评分数据和训练数据是否保持一致,以获得可靠的结果。
Dataiku has in-built tools for monitoring and drift detection I Source
- 自动模型文档: Dataiku 通过使用标准模板的自动模型文档生成器,使模型文档更容易。它还跟踪模型版本,以减少协作模型开发中的任何差异。
Dataiku is a tool for automated documentation generation and version control I Source
- 权限管理:大台库允许您控制模型的可访问性。不同的用户角色对应不同的权限。团队成员可以属于多个用户组,并在不同的项目上拥有不同的权限。
Permission management with Dataiku I Source
-
SSO 和 LDAP: Dataiku 为用户认证提供了不同的选项。您可以集成单点登录或目录服务(SSO),包括 LDAP 认证服务,如 Microsoft Active Directory。当您允许人们访问您的关键系统时,正确的身份认证是必不可少的,并且对于您的公司遵守内部和外部法规控制也是必要的。
-
审计: Dataiku 为所有用户活动创建日志,并为系统中的对象更改提供丰富的审计跟踪。如果出现任何问题,团队将很容易发现问题的根源,因为日志包含所有用户操作的数据,包括他们的 ID、IP 地址和身份验证方法。
Audit trail for increased traceability with Dataiku | Source
- 安全的 API 访问: Dataiku 通过提供 API 访问控制来增强灵活性。这将允许您为您的业务应用程序设计端点服务,如风险评估评分。API 密钥和多级认证安全 API 集成。
Dataiku provides secure API access | Source
3.多米诺数据实验室
Streamline model governance with Domino Data Lab platform | Source
Domino Data Lab 是一个功能丰富的 MLOps 和模型监控中心。它通过支持企业范围的数据科学安全性来帮助企业成功扩展。
使用 Domino Data Lab,数据科学家可以很容易地在同一个平台上同时协作完成多个不同的项目。Domino Data Lab 没有在数据、工具或语言方面限制它们,所以它们不必遭受基础设施的摩擦。
- 统一模型监控 : Domino Data Lab 让你在一个界面中轻松监控你的机器学习模型的不同方面。它自动检测变化,跟踪性能,并保留所有用户活动的记录。Domino Lab 甚至可以在业务受到严重影响之前排除潜在的问题。
- 增强的可再现性:由于 Domino Data Lab 自动跟踪代码、使用的工具、框架和包的变化,显示可再现的结果变得更加容易。您可以向客户端团队提供在他们那边部署模型或在将来更新模型所需的所有信息。
- 企业级安全:机器学习模型有一个复杂的架构,这使得它更难保护它们免受漏洞和恶意攻击。Domino Data Lab 提供了一个环境,在这个环境中,可定制的权限可以安全地保护每个数据科学操作、单点登录(SAML 或 OIDC)和凭证传播。
- 可审计的环境: Domino Data Lab 使监控模型如何随时间变化变得容易。它跟踪变更的历史,并使您能够追溯到管道的任何阶段,以满足必要的法规。****
- 强大的集成:该工具集成了许多流行的协作、数据科学和项目管理工具,如吉拉、谷歌云、AWS、英伟达等。
4.数据处理机
Datatron 是一个用于 AI 模型操作和模型治理的集中式平台。它将帮助您自动化模型部署、监控、治理,并跨不同部门标准化流程。
以下是 Datatron 对于模型治理的一些关键特性:
- Dashboard: Dashboard 选项卡让您有机会概述 ML 模型的健康状况,而不必深入了解细节。您可以为模型调查设置定制的度量和参数。例如,您可以监控使用的 CPU、内存等。
Monitor model health with Datatron dashboard I Source
- 健康度评分:该功能自动评估模型的整体健康度,并以通俗易懂的方式展示。
Datatron scores the health of your model | Source
-
ML 网关:在复杂的多组件项目中,这些网关可以改进模型和数据的编排。网关被设计为快速扩展并支持更多的用例,这样即使在经历活跃增长时,您的项目也能保持合规性。
-
偏差、漂移、性能、异常检测:偏差、漂移和异常如果未被宣布,会导致严重的问题。Datatron 具有强大的偏置监控功能。它的异常检测机制通过从多个来源收集数据、分析模型和系统日志来识别潜在问题,并向工程师发出警报。它还捕捉数据漂移,即模型部署后发生的数据变化。
You can easily conduct anomaly detection with Datatron | Source
- 自定义 KPI:每个企业在实施模型治理策略时追求不同的目标。该功能允许公司定义自己的 KPI,设置阈值和警报。中央治理仪表板显示每个用户的 KPI。
Datatron allows companies to define their own KPIs | Source
- 警报:如果出现问题,Datatron 会自动通知用户,例如,如果模型落后于性能阈值或发现数据异常。可以选择不同的沟通渠道,如电子邮件、Slack 或其他信使。
Datatron sends alerts if the model doesn’t meet predefined KPIs | Source
-
可解释性:模型治理和可解释性携手并进。Datatron 的可解释性管理功能包括监控模型,跟踪和可视化他们的见解,使用有效负载日志记录端点来捕获评分请求。这允许 L 团队增加涉众和用户对他们产品的信任。
-
Jupyter 支持:Datatron 一个令人兴奋的特性是支持 Jupyter 笔记本的直接导入。它们可以由数据科学家与当前模型一起运行,这有助于更快地进行实验,并简化假设的验证。
5.海王星
Neptune.ai 是一个平台,使数据科学家和机器学习工程师能够管理他们所有的模型,并在一个地方构建、记录、存储和显示他们的 MLOps 元数据。它还提供了用于实验跟踪和模型注册的工具,这些工具对于从事研究和生产以及运行许多实验的团队来说是非常有用的。
海王星。人工智能并不是专门为模型治理而构建的。然而,它支持多种模型治理特性。如果您正在为一个小型或中型团队寻找一个工具,希望增强对模型开发的控制,这是正确的选择,因为该工具是轻量级的,并且易于理解。
以下是一些可能会让您考虑将 Neptune 用于模型治理的特性:
- 了解模型是如何构建的:当您将模型投入生产时,您希望确切了解它是如何构建的,这样您就可以对其结果的可重复性充满信心。Neptune.ai 允许你精确地监控哪些工件被使用了,它们在哪里,并且如果需要的话,允许未来的用户重新运行这个模型。
- 打包、测试和评审新模型版本:当您从数据科学家那里获得一个新模型时,您希望能够快速打包、测试和评审它,而不要浪费时间调整它以用于生产用途。该工具自动化了模型的打包和测试过程,并提供了版本控制工具以方便部署。
- 拥有完整的模型谱系和可追溯性:当来自法律/合规/业务部门的人员要求进行生产模型审计时,您希望能够拥有完整的模型谱系,知道它是针对哪些数据进行培训的、由谁构建的、何时更新的。Neptune.ai 让你可以自信地向商业利益相关者展示这些信息。
- 构建 MLOps 平台:当您为您的数据科学团队构建 MLOps 平台时,您想要添加一个用于实验跟踪、模型注册、数据版本控制的组件,以便模型构建管道是可管理的、可复制的和符合规范的。所有这些都可以使用 Neptune.ai 平台访问,并且比使用企业级解决方案花费更少的时间进行微调。
6.权重和偏差
Weights & Biases is a feature-rich tool for model governance, model lineage, and model provenance | Source
权重 &偏差是一个帮助 ML 团队用不同的超参数组合并行训练他们的模型的解决方案。
它也是一个有用的深度学习实验跟踪工具。您只需要编写模型训练的代码并调整超参数。解决方案将帮助您完成剩下的工作。它将管理批量和实时评估的生产节点的移动。原因有几个
- 个性化的可共享仪表板:在权重&偏好下,您可以轻松创建项目仪表板,并与其他利益相关者共享。您甚至可以安排仪表板更新,以便参与项目开发的每个人都可以看到您的工作成果并跟踪 KPI 合规性。
- 简单协作:这个工具是为满足企业级项目的需求而制作的。如果您使用数百个不同的数据集,并一遍又一遍地经历数据转换过程的各个步骤,那么对于您和您的团队来说,之后仍然很容易找到您想要的东西。
- 权限控制: W & B 允许你给不同的团队成员分配控制权,点击几下就能管理。这些权限包括项目的创建、修改、只读模式等等。用户可以属于多个组,并且他们的访问权限可以根据项目和/或组织而有所不同。
- 可审计性:得益于透明且易于管理的环境,总是可以跟踪不同项目之间的变更并维护 ML 模型血统。在内部或外部审计的情况下,您不必担心任何事情,因为您需要的所有数据都被安全地存储和备份。
7.亚马逊 SageMaker
Amazon SageMaker can be used for production monitoring and experiment management | Source
亚马逊 SageMaker 是一个帮助数据科学家管理他们的机器学习项目的平台。在这里,您可以在云中创建和训练机器学习模型,并将它们部署到您的环境中。
Amazon SageMaker 还为其用户配备了 ML 模型治理工具。当我们谈论模型治理时,必须提到的工具是 Amazon SageMaker 模型监视器。
这是亚马逊 SageMaker 相对较新的功能。模型监视器对您的项目很有帮助,原因如下:
- 生产监控:该工具持续监控您的模型的性能,跟踪并记录任何变化、偏差和数据漂移。它有助于实验跟踪和研究,但也可以应用于生产模型的开发和部署。如果需要立即采取行动,模型监视器会提醒您。
- 预测:模型部署后,它们可以展示与您预期不同的性能。在这种情况下,重要的是手头有一个工具,它可以收集关于什么出错的事后数据,并预测它的请求和来自您的端点的响应。
- 实验管理:模型监视器可以分析在 ML 模型运行期间收集的数据,以将其与其他训练实验进行比较。
- ML 模型优化:亚马逊 SageMaker 自动优化 ML 模型进行部署。SageMaker Edge Manager 可以让你的模型运行速度提高 25 倍,具体取决于你选择的硬件。它还允许您使用不同的框架(如 DarkNet、Keras、PyTorch)来优化模型。
- 集成:您可以使用 API 将 SageMaker Edge Manager 与您现有的应用程序集成。它支持 Java、Go、Python、Ruby 和其他常见的编程语言。
结论
如果您一步一步地接近它,选择模型治理工具会变得容易。首先,您需要定义您的目标和期望,以选择具有适合您业务的功能的工具。只有在这一步完成之后,您才应该开始接触供应商并测试他们的工具。
易于设置 | 集成支持 | 企业级可扩展 | 模型版本控制 | 易于审计 | 文档和社区 | |
---|---|---|---|---|---|---|
机器学习团队实际使用的最好的工具、库、框架和方法论——我们从 41 ML 初创公司学到的东西[综述]
为您的机器学习团队建立一个良好的工具堆栈对于高效工作和能够专注于交付结果非常重要。如果你在一家初创公司工作,你会知道建立一个可以与你的团队、用户需求和快速发展的 ML 环境一起成长的环境是特别重要的。
我们想知道:“ML 创业公司使用的最好的工具、库和框架是什么?”应对这一挑战。
为了回答这个问题,我们询问了来自世界各地的 41 家机器学习初创公司。
结果呢?
我们总结了大量的好建议:
- 方法学
- 软件开发设置
- 机器学习框架
- MLOps
- 意外的🙂
继续读下去,找出对你的机器学习团队有用的东西。
好的方法是关键
工具的强度取决于使用它们的方法。
如果你在随机获取的数据上运行训练模型,并部署你能得到的任何模型,迟早会有麻烦🙂
psyML 的 Kai Mildenberger 说:
对我们来说,对所有的训练和测试数据进行细致的版本控制可能是最重要的工具/方法。我们希望这仍然是我们工具箱中最关键的元素之一,即使所有的技术和数学模型都在不断迭代。第二个方面可能是假设驱动。我们将此作为开发模型的最重要的方法。”
我认为对你想用你的工具做什么(以及你实际上需要它们)有一个强烈的理解是非常重要的第一步。
也就是说,重要的是要知道那里有什么,以及在类似情况下人们成功使用了什么。
让我们开始吧!
软件开发工具是 ML 团队的支柱
开发环境是每个团队工作流程的基础。因此,了解世界各地的公司认为这一领域最好的工具是非常有趣的。
Source: giphy.com
ML 团队使用各种工具作为集成开发环境。像 simple report T1 和 T2 Hypergiant T3 这样的许多团队使用 Jupyter 笔记本和 Jupyter Lab 及其 NB 扩展生态系统。
Jupyter 笔记本对于快速实验和可视化非常有用,尤其是在多个团队成员之间交换想法时。因为我们使用 Tensorflow,所以 Google Colab 是一个自然的扩展,可以更容易地共享我们的代码。”—巨集的陈文茜说。
各种口味的 Jupyter 也被提及。Deepnote(一个托管的 Jupyter 笔记本解决方案)被 Intersect Labs 的团队“因为他们的 ML 内容而受到喜爱”,而 Google Colab 对于 Juji 团队来说“是更容易分享我们代码的自然扩展”。
其他人选择更标准的软件开发 ide。在这些 Pycharm 中,来自 Hotelmize 的 tooted by 或 Izchak 被称为【最好的 Python IDE】以及 Scanta 使用的 Visual Studio 代码因其“易于与 Azure 连接并提供许多基于 ML 的扩展”而被提及最多。
对于使用像 SimpleReport 这样的 R 语言的团队来说,RStudio 无疑是首选的 IDE。正如来自 Advanced Symbolics 的 Kenton White 提到的
"我们大多使用 R + RStudio 进行分析和建模。我们人工智能建模的主力是用于时间序列预测的 VARX。”
说到代码版本控制,Github 显然是最受欢迎的。正如本影人工智能的丹尼尔·陈晗所说:
" Github(现在对所有团队免费!!)及其超级健壮的版本控制系统和简单的存储库共享功能对大多数 ML 团队来说都非常有用。
在最流行的语言中,我们有 Python、R,有趣的是还有 clo jure T1(由来自 T2 的陈文茜提到)。]
至于环境/基础设施设置,值得注意的是 ML 初创公司:
- “AWS 作为部署的平台” ( 简单汇报)
- “Anaconda 是我们运行 ML 实验的 goto 工具,因为它具有live code特性,可用于将软件代码、计算输出、说明性文本和多媒体资源合并到一个文档中。” ( 扫描)
- Redis 作为内存数据结构存储占主导地位,因为它支持不同种类的抽象数据结构,如字符串、列表、映射、集合、排序集、超对数、位图、流和空间索引 ( 扫描)
- " 雪花和亚马逊 S3 进行数据存储." ( 超级巨人)
- “Spark-py Spark–非常简单的 api,用于分配工作以处理大数据。” ( 酒店化)
这么多机器学习框架
Source: giphy.com
集成开发环境是至关重要的,但是需要一个好的 ML 框架来将愿景转化为项目。这里,初创公司指出的工具范围相当多样化。
在处理表格数据时,熊猫被提到的次数最多。
适马北极星公司的首席执行官尼莫·德克尔提到的使用熊猫的额外好处是:
“我认为 Pandas 可能是最有价值的工具之一,尤其是在与外部开发人员合作进行各种项目时。让所有的数据文件以数据框的形式存在于团队和个人开发者之间,有助于更顺畅的协作和避免不必要的麻烦。”
来自 Hotelmize 的软件开发人员提到的有趣的库是dov panda——panda 的 python 扩展库,它让你在使用 panda 时能够洞察你的 panda 代码和数据。
当谈到可视化时,matplotlib 被像 Trustium 、 Hotelmize 、 Hypergiant 和其他人使用得最多。
Plotly 也是一个常见的选择。正如来自wordners的开发者所解释的“为了更好的可视化,让数据看起来更好理解”。Dash 是一款用于在 Plotly 图表上构建交互式仪表盘的工具,由来自 Behavioral Signals 的西奥多·詹纳科普洛斯推荐给需要以友好、用户友好的方式展示分析结果的 ML 团队。
对于更标准的机器学习问题,大多数团队像书呆子、感觉信任或行为信号使用 Scikit-Learn。来自 iSchoolConnec t 的 ML 团队解释了为什么它是如此伟大的工具:
它是机器学习研究人员、工程师和开发人员使用的最流行的工具包之一。你可以轻而易举地得到你想要的东西,这是惊人的!从功能工程到可解释性,scikit-learn 为您提供了所有功能。”
说实话,熊猫和 Sklearn 真的是世界各地 ML 团队的主力。
正如来自number的数据科学家迈克尔·菲利普斯所说:
“像 Pandas 和 Scikit-learn 这样的现代 Python 库拥有 99%的 ML 团队需要超越的工具。虽然简单,但这些工具在经验丰富的数据科学家手中却拥有非凡的力量"
在我看来,虽然在一般的 ML 团队中这可能是真的,但在 ML 初创公司的情况下,很多工作都进入了最先进的方法,这通常意味着深度学习模型。
当谈到通用深度学习框架时,我们有许多不同的意见。
来自 iSchoolConnect 的 ML 专家团队告诉我们为什么这么多 ML 从业者和研究者选择 PyTorch。
“如果你想去深水区,PyTorch 是你最合适的工具!最初,习惯它需要时间,但是一旦你习惯了,就没有什么比它更好的了!该库甚至针对快速训练和评估您的 ML 模型进行了优化。”
但人气领先的还是 Tensorflow 和 Keras。
像 Strayos 和 Repetere 这样的大多数团队选择它作为他们的 ML 开发框架。信托基金会的雪松·米拉佐说:
“当然是 Tensorflow。尤其是有了 2.0!热切的执行是 TF 真正需要的,现在它来了。我应该注意,当我说“tensorflow”时,我指的是“tensorflow + keras”,因为 keras 现在内置在 TF 中。
还有很重要的一点要提的是,你不必选择一个框架而排斥其他框架。
例如, Melodia 的创始人奥米德·雅利安说:
“对我们最有益的工具是 TensorFlow、PyTorch 和 Python 的老 scikit-learn 工具。”
对于更专业的应用程序,有一些流行的框架。
在自然语言处理中,我们听说过:
- 拥抱脸:这是有史以来最先进、性能最高的 NLP 库。这是同类研究中的第一个,因为研究人员直接为高度可扩展的 NLP 库做出了贡献。Hypergiant公司的首席执行官本·拉姆(Ben Lamm)说,它与其他类似的工具不同,它在新型号发布后几个月就推出了生产级工具。
- Spacy 是一个非常酷的自然语言工具包。NLTK 是目前最流行的,我当然也在使用它,但是 spacy 做了很多 NLTK 做不到的事情,比如词干分析和依赖解析。”提到 Cedar Milazzo, Trustium 的首席执行官
- Gensim 对单词向量和文档向量也很好,我相信它不是很受欢迎添加雪松米拉佐。
在计算机视觉中:
- OpenCV是计算机视觉工作不可或缺的对于 Hypergiant 。他们的首席执行官说“这是从 20 世纪 60 年代到 2014 年的经典 CV 方法集合,是有用的预处理和后处理,在神经网络可能被过度破坏的情况下可以很好地工作。”
同样值得注意的是,并不是每个团队自己都在实现深度学习模型。
正如来自 Munchron 的 Iuliia Gribanova 和 Lance Seidman 所说,现在有一些 API 服务,你可以外包一些(或全部)工作:
“Google ML kit 是目前最好的易于进入的工具之一,它让移动开发人员可以轻松地将 ML API 服务(如人脸识别、图像标记和 Google 提供的其他项目)嵌入到 Android 或 iOS 应用程序中。但此外,你还可以引入自己的 TF (TensorFlow) lite 模型来进行实验,然后使用谷歌的 ML 工具包将它们投入生产。”
我认为值得一提的是,并不是所有时候你都可以选择最新最好的库,当你加入团队的时候,工具栈就会交给你。
来自 Meshcapade 的 Naureen Mahmood 分享道:
“过去,一些重要的 autodiff 库使我们有可能运行多种联合优化,并在这样做的过程中帮助我们构建了一些我们今天仍在使用的核心技术,这些库是友好的& OpenDR。现在有更好更快的了,比如 Pytorch 和 TensorFlow。”
当谈到模型部署时,来自 Private AI 的 Patricia Thaine 提到了“tflite,flask,tfjs 和 coreml”作为他们的首选框架。她还表示,可视化模型对他们来说非常重要,他们正在为此使用 Netron 。
但是有超越框架的工具可以帮助 ML 团队快速交付真正的价值。
这就是 MLOps 的用武之地。
MLOps 开始对机器学习初创公司变得更加重要
您可能想知道什么是 MLOps,或者为什么您应该关心它。
Source: giphy.com
该术语暗指 DevOps,描述用于机器学习活动操作化的工具。
Acerta 的首席技术官 Jean-Christophe Petkovich 为我们提供了一个极其详尽的解释,说明他们的 ML 团队是如何处理 MLOps 的。太好了,我决定(几乎)全文分享:
“我认为大多数有趣的工具将在 2020 年被更广泛地采用,它们都是以 MLOps 为中心的。去年大力推动了这些工具的开发,今年我们将揭晓谁将是赢家。
对我来说,MLflow 似乎在跟踪实验、工件和结果方面处于领先地位。我们为此在内部构建的许多东西都是对 MLflow 功能的扩展,以纳入更多类似于 DVC 跟踪数据的数据跟踪。
MLOps 中的其他知名公司有 Kubeflow、Airflow 和采用 Apache Beam 的 TFX,它们都是专为端到端捕获数据科学工作流和管道而设计的工具。
一个完整的 MLOps 系统有几个组成部分:
- 您需要能够构建包含预处理数据和生成结果所需的所有信息的模型工件。
- 一旦你能够构建模型工件,你必须能够跟踪构建它们的代码,以及它们被训练和测试的数据。
- 你需要跟踪这三样东西,模型、它们的代码和它们的数据,是如何联系在一起的。
- 一旦您可以跟踪所有这些东西,您还可以将它们标记为准备就绪和生产,并通过 CI/CD 流程运行它们。
- 最后,要在流程结束时实际部署它们,您需要某种方法来基于模型工件旋转服务。
说到跟踪,MLflow 是我们的选择,它已经在 Acerta 试用过,因为我们的一些员工已经将它作为他们个人工作流程的一部分,现在它是我们数据科学家事实上的跟踪工具。
为了跟踪数据管道或工作流本身,我们目前正在开发 Kubeflow,因为我们已经在 Kubernetes 上使部署变得轻而易举,并且我们的内部模型管道基础设施与 Kubeflow 组件概念非常契合。
在所有这些 MLOps 开发的基础上,有一个向构建特征库的转变——基本上是专门的数据湖,用于存储各种形式的预处理数据——但是我还没有看到任何真正脱颖而出的真正竞争者。
这些都是需要到位的工具——我知道很多地方正在针对这个问题制定自己的解决方案,但我认为今年我们将会看到更多围绕机器学习应用的标准化。"
来自 Kaskada 的 Emily Kruger,她是一家创建特色商店解决方案的初创公司🙂添加:
从我们的角度来看,最有用的工具是特性库、自动化部署管道和实验平台。所有这些工具都解决了 MLOps 的挑战,这是数据团队的一个重要新兴领域,尤其是那些在生产和大规模运行 ML 模型的团队。”
好的,鉴于此,其他团队用什么来解决这些问题呢?
一些团队更喜欢端到端平台,另一些团队则在内部创建一切。许多团队介于两者之间,混合了一些特定的工具和自己开发的解决方案。
就较大的平台而言,经常提到的两个名称是:
- 亚马逊 SageMaker,据来自 VCV 的 ML 团队称,“有多种分布式协作工具”和 SimpleReport 选择作为他们的部署平台。
- azure,Scanta团队告诉我们“作为一种构建、训练和部署我们的机器学习应用程序的方式,它还通过语言、视觉和语音识别支持,帮助我们的应用程序增加智能。由于快速部署和低成本虚拟机,Azure 一直是我们选择的 IaaS。”
实验跟踪工具出现了,我们看到 ML 初创公司使用各种选项:
- Strayos 使用 Comet ML “用于模型协作和结果共享”。
- Hotelmize 和其他人正在使用 tensorboard,这是“可视化你的模型行为的最好工具,特别是对于神经网络模型。”
- MLflow 似乎在跟踪实验、工件和结果方面处于领先地位正如之前提到的 Acerta 的首席技术官 Jean-Christophe Petkovich 所说
- 像 Repetere 这样的其他团队试图保持简单,并说“我们的工具非常简单,我们使用 tensorflow 和 s3 来版本化模型工件以供分析”。
通常,实验跟踪工具会跟踪指标和超参数,但是正如来自 MeetKai 的 James Kaplan 指出的:
对我们来说,最有用的 ML 工具是任何有助于处理由除了模型架构之外的任何事物引起的模型回归的工具。其中大部分是我们自己开发的工具,但我认为还有很多现有的选择。我们喜欢看混淆矩阵,它可以在以下场景中进行视觉区分:
–添加到训练集的新数据(以及所述数据的普罗维登斯)
–量化配置
–修剪/提取
我们发现,能够跟踪新增加数据的性能比仅仅跟踪模型本身超参数的性能重要得多。当数据集的增长/变化远快于模型配置时尤其如此"
谈到修剪/蒸馏, deepset 的联合创始人 Malte Pietsch 解释说:
“我们发现越来越需要工具来帮助我们分析&在速度和硬件利用率方面优化模型。随着 NLP 模型规模的增长,提高训练和推理效率变得越来越重要。
虽然我们仍在寻找理想的工具,但我们发现 pytest-benchmark、NVIDIA 的 Nsight Systems 和 kernprof 非常有用。"
另一个有趣的基准训练/推理工具是来自divide ti的 Anton Lokhmotov 建议的 MLPerf 。
实验模型无疑是非常重要的,但是将模型放在最终用户面前才是神奇的地方(对我们大多数人来说)。在这方面,来自托尔斯泰的 Rosa Lin 提到了使用 streamlit.io,这是一个“轻松构建 ML 模型网络应用的伟大工具。”
Sensitrust 的联合创始人 Gianvito Pio 在谈到使用以 ML 为中心的解决方案时提出了宝贵的警告:
还有像 Knife 和 Orange 这样的工具可以让你以拖放的方式设计整个管道,还有 AutoML 工具(见 AutoWEKA、auto-sklearn 和 JADBio)可以为特定任务自动选择最合适的模型。
然而,在我看来,在机器学习和人工智能领域的专业知识仍然是必要的。如果没有良好的实地背景,即使是“最好的、自动化的”工具也可能被误用。"
你可能会感兴趣
在 ML 找工作?在此检查开仓。
意外的
好吧,当我开始研究这个的时候,一些像 PyTorch,Pandas 或者 Jupyter Lab 这样的答案是我所期望的。
但是我们收到的一个回答确实是现成的。
Source: giphy.com
这让我看清了所有其他事情,并让我想到,也许我们应该后退一步,看看更大的图景。
来自 Trust Insights 的 Christopher Penn 建议 ML 团队应该使用一个相当有趣的“工具”:
“Wetware——你两耳之间的硬件和软件组合——是你拥有的最重要、最有用、最强大的机器学习工具。
太多太多的人希望人工智能是一根魔杖,可以在很少甚至没有人类输入的情况下解决一切问题。反之亦然;人工智能比以往任何时候都需要更多的管理和审查,因为我们对复杂的模型缺乏太多的可见性。
在大规模偏见和歧视丑闻之后,可解释性和可解释性是我们现在面临的最大挑战。人工智能供应商把重点放在模型的事后解释上,而不是在模型中建立昂贵但有价值的解释和检查点,这使情况变得更糟。
因此,在 2020 年以及可预见的未来,湿件——循环中的人类——是最有用的工具。"
我们的视角
因为我们正在为 ML 团队构建工具,而且我们的一些客户是人工智能初创公司,所以我认为给你我们的观点是有意义的。
所以我们看到:
…由于这些是我们的客户,他们自然会使用 neptune-notebook 来跟踪 jupyter notebooks 中的探索,并使用 Neptune 来跟踪实验和组织他们的机器学习项目。
信息图表
特别感谢
非常感谢所有参与此次综述的机器学习团队。分享你的知识和经验给社区带来了难以置信的价值!
对本文有贡献的初创公司:
Acerta 是一家软件公司,为制造业和汽车行业提供机器学习技术。
一家市场研究公司,利用人工智能分析社交媒体来监控品牌健康,同时预测趋势和消费者行为。
alance 是一个自助式高级分析平台,允许用户从单一平台准备、管理、建模和可视化数据。
与人工智能发展情感智能对话。Oliver API 是发展最快的健壮情感人工智能引擎。
机器学习机构,专注于基于深度学习的自然语言处理(NLP)。
开发开源工具并提供 R&D 服务,帮助客户自动化其复杂的 AI、ML 和 quantum 研发
一个大数据和机器学习平台,使用预测为 CPG、零售和电子商务提供支持。它通过大规模的大数据实时分析受众行为模式。
GenRocket 是软件测试和机器学习数据生成领域的技术领导者。
Hazy 可以生成安全使用的智能合成数据,实际上可以替代真正的数据科学和分析工作负载。
Hotelmize 是一个平台,旨在利用大数据分析来改善酒店房间的定价和预订流程。
我们是机器智能领域的领导者,在从石油钻探和流体动力学到卫星成像、国防和安全等领域为客户量身定制解决方案和产品方面有着令人印象深刻的记录。
使用人工通用智能的认知计算。
Intersect Labs 提供的服务可以实现智能决策,包括通过 3 次点击从电子表格数据中进行机器学习。
人工智能,国际学生入学,国际大学和学院。
构建人工智能聊天机器人的最简单方法——比制作 PowerPoint 更简单。Juji 是 DIY AI 聊天机器人的头号聊天机器人平台。
Kaskada 通过提高创新速度和实时计算功能,帮助组织做出更好的预测,并从机器学习中获得更多影响。
SaaS,移动应用程序,医疗技术,生物技术,医疗保健,物联网,人工智能,人工智能,大数据。
Luden.io 是一家专注于有意义、有教育意义游戏的独立游戏开发商。
MeetKai 是一个语音操作的虚拟助手,通过对话、个性化和策展让您的生活更加轻松。
Melodia 是一个智能音乐流媒体平台,提供了一种更简单的播放和探索音乐的方式。
SaaS,最先进的三维人体模型。自动将身体扫描、mocap 或测量转换为装配的网格。
医生和实验室使用机器学习和人工智能进行早期疾病和疾病检测。
Numerai 将金融数据转换和规范化为数据科学家全球网络的机器学习问题。
我们希望您停止浪费时间构建报告,因此我们构建了一个平台,在尊重您的数据隐私的同时自动构建报告。
授权隐私保护软件开发。
psyML 结合了现代心理学、高级心理测量学、机器学习和人工智能,实现了对人类行为的前所未有的理解。
Repetere 通过机器学习和人工智能生成自动化的销售和产品组合预测。
SavantX 使用分析来整理和理解所有类型的数据。2.Trust Insights 美国|马萨诸塞州|诺福克
保护机器学习算法和使用它们的企业。
智能交通信号实时软件。
客户和专业人士联系、交易和设计新项目的平台。每个阶段都利用区块链技术,由智能合同管理,并由人工智能支持。
候选人评估和入围技术。自动化雇佣流程以提高效率、多样性和雇佣质量。
SimpleReport 是一款安全报告和分析工具,适用于以 OHS 为优先业务的公司。
Strayos 是一个 3D 空中智能平台,用于采矿和采石场爆破作业,以降低成本。
文本的机器学习工具。
Trust Insights 帮助公司点亮黑暗的数据,并通过分析和洞察帮助你采取行动。
SaaS B2B 平台决定信誉和保护品牌形象。
模拟,人工智能,数据搜索引擎,问答,全球建模。
VCV 是一名人工智能机器人招聘人员。
一个结合了前沿人工智能(AI)和老派语言学的文本分析和洞察平台允许计算机阅读——并真正理解——人们实际上的意思,而不仅仅是计算他们使用的单词。
AI 24/7 监控的实时视频监控软件。
雅各布·查肯
大部分是 ML 的人。构建 MLOps 工具,编写技术资料,在 Neptune 进行想法实验。
阅读下一篇
最佳 MLOps 工具以及如何评估它们
12 分钟阅读| Jakub Czakon |年 8 月 25 日更新
12 mins read | Jakub Czakon | Updated August 25th, 2021
在我们的一篇文章中——机器学习团队实际使用的最好的工具、库、框架和方法——我们从 41 家 ML 初创公司学到的东西——Acerta 的 CTO Jean-Christophe Petkovich 解释了他们的 ML 团队如何接近 MLOps。
据他所说,一个完整的 MLOps 系统有几个要素:
您需要能够构建包含预处理数据和生成结果所需的所有信息的模型工件。
- 一旦您能够构建模型工件,您必须能够跟踪构建它们的代码,以及它们被训练和测试的数据。
- 您需要跟踪所有这三样东西,模型、它们的代码和它们的数据,是如何关联的。
- 一旦您可以跟踪所有这些内容,您还可以将它们标记为准备就绪,进行生产,并通过 CI/CD 流程运行它们。
- 最后,为了在该过程的最后实际部署它们,您需要某种方法来基于该模型工件旋转服务。
- 这是对如何在公司中成功实施 MLOps 的高度概括。但是理解高层需要什么只是拼图的一部分。另一个是采用或创建适当的工具来完成工作。
这就是为什么我们编制了一份最佳 MLOps 工具的清单。我们将它们分为六类,以便您可以为您的团队和业务选择合适的工具。让我们开始吧!
That’s why we’ve compiled a list of the best MLOps tools. We’ve divided them into six categories so you can choose the right tools for your team and for your business. Let’s dig in!
帮助您设置生产 ML 模型测试的 5 个工具
原文:https://web.archive.org/web/https://neptune.ai/blog/tools-ml-model-testing
开发机器学习或深度学习模型似乎是一项相对简单的任务。它通常包括研究、收集和预处理数据、提取特征、建立和训练模型、评估和推理。大部分时间消耗在数据预处理阶段,随后是建模阶段。如果精度没有达到标准,我们就重复整个过程,直到我们找到满意的精度。
当我们想在现实世界中将模型投入生产时,困难就出现了。模型的表现通常不如在训练和评估阶段时好。这主要是因为概念漂移或数据漂移以及有关数据完整性的问题。因此,测试一个 ML 模型变得非常重要,以便我们可以了解它的优点和缺点,并采取相应的行动。
在本文中,我们将讨论一些可以用来测试 ML 模型的工具。这些工具和库有些是开源的,有些则需要订阅。无论是哪种方式,本文都将全面探讨对您的 MLOps 管道有用的工具。
为什么模型测试很重要?
在我们刚刚讨论的基础上,模型测试允许您查明可能导致模型预测能力下降的 bug 或关注区域。这可以随着时间的推移逐渐发生,也可以在瞬间发生。无论哪种方式,知道他们可能在哪个方面失败以及哪些特性会导致他们失败总是好的。它暴露了缺陷,也能带来新的见解。本质上,这个想法是要建立一个健壮的模型,可以有效地处理不确定的数据条目和异常。
模型测试的一些好处是:
-
1 检测模型和数据漂移
-
2 在数据集中发现异常
-
3 检查数据和模型完整性
-
4 检测模型故障的可能根本原因
-
消除 bug 和错误
-
6 减少误报和漏报
-
7 鼓励在一定时间内对模特进行再培训
-
8 打造生产就绪型车型
-
9 确保 ML 模型的稳健性
-
10 在模型中寻找新的见解
模型测试和模型评估一样吗?
模型测试和评估类似于我们在医学上所说的诊断和筛选。
模型评估类似于诊断,根据 F1 分数或 MSE 损失等指标检查模型的性能。这些指标并没有提供关注的焦点。
模型测试类似于诊断,不变性测试和单元测试等特定测试旨在发现模型中的特定问题。
典型的 ML 软件测试套件包括什么?
机器学习测试套件通常包括测试模块来检测不同类型的漂移,如概念漂移和数据漂移,这可以包括协变漂移、预测漂移等。这些问题通常发生在数据集中。大多数情况下,数据集的分布会随时间而变化,从而影响模型准确预测输出的能力。您会发现我们将要讨论的框架将包含检测数据漂移的工具。
除了测试数据,ML 测试套件还包含测试模型预测能力、以及过拟合、欠拟合、方差和偏差等的工具。测试框架的想法是在开发的三个主要阶段检查管道:
- 数据摄取,
- 数据预处理,
- 和模型评估。
一些框架,如 Robust Intelligence 和 Kolena,在这些给定的领域中严格地自动测试给定的 ML 管道,以确保生产就绪的模型。
本质上,机器学习套件将包含:
- 单元测试在代码库的层次上操作,
- 回归测试复制模型上一次迭代中被修复的错误,
- 集成测试模拟条件,通常是观察模型行为的长期运行测试。这些条件可以反映 ML 管道,包括预处理阶段、数据分布等等。
The image above depicts a typical workflow of software development | Source
现在,让我们讨论一些测试 ML 模型的工具。本节分为三个部分:开源工具、基于订阅的工具和混合工具。
开源模型测试工具
1.深度检查
DeepChecks 是一个用于测试 ML 模型&数据的开源 Python 框架。它基本上使用户能够在三个不同的阶段测试 ML 管道:
- 预处理阶段前的数据完整性测试。
- 数据验证,在训练之前,主要是在将数据分为训练和测试时,以及
- ML 模型测试。
The image above shows the schema of three different tests that could be performed in an ML pipeline | Source
这些测试可以同时进行,甚至可以独立进行。上图显示了可以在 ML 管道中执行的三个不同测试的模式。
装置
可以使用以下 pip 命令安装 Deepchecks:
pip install deepchecks > 0.5.0
Deepcheck 的最新版本是 0.8.0。
框架的结构
DeepChecks 引入了三个重要的术语:检查、条件和套件。值得注意的是,这三个术语共同构成了框架的核心结构。
检查
它使用户能够检查数据和模型的特定方面。该框架包含各种类,允许您检查这两者。你也可以做全面检查。下面是一些这样的检查:
- 数据检查 涉及围绕数据漂移、重复、缺失值、字符串不匹配、数据分布等统计分析的检查。您可以在检查模块中找到各种数据检查工具。校验模块允许您精确设计数据集的检查方法。这些是您可以找到的一些数据检查工具:
- '数据重复',
- DatasetsSizeComparison ',
- ' DateTrainTestLeakageDuplicates ',
- DateTrainTestLeakageOverlap ',
- '支配频率变化',
- '特征特征相关性',
- '功能标签相关性',
- ' FeatureLabelCorrelationChange ',
- '标识符标签相关性',
- ' IndexTrainTestLeakage ',
- ' IsSingleValue ',
- '混合数据类型',
- MixedNulls ',
- 整体数据集漂移
在下面的例子中,我们将检查数据集是否有重复。我们将从 checks 模块导入类 DataDuplicates,并将数据集作为参数传递。这将返回一个包含数据集是否有重复值的相关信息的表。
from deepchecks.checks import DataDuplicates, FeatureFeatureCorrelation
dup = DataDuplicates()
dup.run(data)
An example of inspecting if the dataset has duplicates | Source: Author
如您所见,上表给出了数据集中重复项数量的相关信息。现在让我们看看 DeepChecks 是如何使用可视化工具来提供相关信息的。
在以下示例中,我们将检查数据集中的要素之间的相关性。为此,我们将从 checks 模块导入 FeatureFeatureCorrelation 类。
ffc = FeatureFeatureCorrelation()
ffc.run(data)
An example of inspecting feature-feature correlation within the dataset | Source: Author
从这两个例子中可以看出,结果可以以表格或图形的形式显示,甚至可以两种形式都显示,以便向用户提供相关信息。
- 模型检验 涉及过拟合、欠拟合等。与数据检查类似,您也可以在检查模块中找到各种模型检查工具。这些是您将找到的用于模型检查的一些工具:
- ModelErrorAnalysis ',
- '模型推理时间',
- 模型信息',
- '多模型性能报告',
- '新标签培训测试',
- ' OutlierSampleDetection ',
- 绩效报告',
- 回归误差分布',
- '回归系统错误',
- RocReport ',
- 分段性能',
- 简单模型比较',
- SingleDatasetPerformance ',
- 特殊字符',
- StringLengthOutOfBounds ',
- 字符串匹配,
- StringMismatchComparison ',
- '训练测试特征漂移',
- ' TrainTestLabelDrift ',
- '训练测试性能',
- '培训测试预测漂移',
随机森林分类器的模型检查或检验示例:
from deepchecks.checks import ModelInfo
info = ModelInfo()
info.run(RF)
*An example of a model check or inspection on Random Forest Classifier | Source: Author *
条件
它是可以添加到支票中的功能或属性。本质上,它包含一个预定义的参数,可以返回通过、失败或警告结果。这些参数也可以相应地修改。按照下面的代码片段来理解。
from deepchecks.checks import ModelInfo
info = ModelInfo()
info.run(RF)
An example of a bar graph of feature label correlation | Source: Author
上图显示了要素标注相关性的条形图。它本质上衡量的是一个独立特征本身能够预测目标值的预测能力。如上例所示,当您向检查添加条件时,该条件将返回附加信息,提及高于和低于该条件的特征。
在此特定示例中,您会发现条件返回了一条语句,表明算法"发现 4 个特征中有 2 个特征的 PPS 高于阈值:{ '花瓣宽度(cm)': '0.9 ','花瓣长度(cm)': '0.87'} "这意味着具有高 PPS 的特征适合预测标签。
组曲
它是一个包含数据和模型检查集合的模块。这是一个有序的支票集合。所有的检查都可以在套件模块中找到。下面是框架的示意图以及它是如何工作的。
*The schematic diagram of the suite of checks and how it works | Source *
从上图中可以看出,数据和模型可以传递到包含不同检查的套件中。这些检查可以为更精确的测试提供条件。
您可以运行以下代码来查看 DeepChecks 提供的 35 个检查及其条件的列表:
from deepchecks.suites import full_suite
suites = full_suite()
print(suites)
Full Suite: [
0: ModelInfo
1: ColumnsInfo
2: ConfusionMatrixReport
3: PerformanceReport
Conditions:
0: Train-Test scores relative degradation is not greater than 0.1
4: RocReport(excluded_classes=[])
Conditions:
0: AUC score for all the classes is not less than 0.7
5: SimpleModelComparison
Conditions:
0: Model performance gain over simple model is not less than
…]
总之,Check、Condition 和 Suites 允许用户在各自的任务中检查数据和模型。这些可以根据项目的需求和各种用例进行扩展和修改。
DeepChecks 允许以较少的努力实现 ML 管道的灵活性和即时验证。他们强大的样板代码可以让用户自动化整个测试过程,这可以节省很多时间。
An example of distribution checks | Source
为什么要用这个?
- 它是开源和免费的,并且有一个不断增长的社区。
- 结构非常好的框架。
- 因为它有内置的检查和套件,所以对于检查数据和模型中的潜在问题非常有用。
- 它在研究阶段是有效的,因为它可以很容易地集成到管道中。
- 如果您主要使用表格数据集,那么 DeepChecks 非常好。
- 您还可以使用它来检查数据、模型漂移、模型完整性和模型监控。
An example of methodology issues | Source
关键特征
1 它支持计算机视觉和表格数据集中的分类和回归模型。
-
只需一次调用,它就能轻松运行大量的检查。
-
它是灵活的,可编辑的,可扩展的。
-
它以表格和可视格式生成结果。
-
5 它不需要登录仪表板,因为包括可视化在内的所有结果都会在执行过程中即时显示。它有一个非常好的 UX。
-
主要缺点
An example of performance checks | Source
它不支持 NLP 任务。
2 深度学习支持处于测试版,包括计算机视觉。所以结果会产生错误。
- 2.漂流者-ML
- Drifter ML 是专门为 Scikit-learn 库编写的 ML 模型测试工具。它还可以用来测试类似于深度检查的数据集。它有五个模块,每个模块都与手头的任务密切相关。
分类测试:用于测试分类算法。
回归测试:测试分类算法。
- 结构测试:这个模块有一堆允许测试聚类算法的类。
- 时间序列测试:该模块可用于测试模型漂移。
- 列测试:这个模块允许你测试你的表格数据集。测试包括健全性测试、均值和中值相似性、皮尔逊相关等等。
- 装置
- 框架的结构
Drifter ML 符合模型的 Scikit-Learn 蓝图,即模型必须包含. fit 和。预测方法。这实质上意味着您也可以测试深度学习模型,因为 Scikit-Learn 有一个集成的 Keras API。查看下面的示例。
pip install drifter-ml
上面的例子显示了使用 drifter-ml 设计人工神经网络模型的简易性。类似地,你也可以设计一个测试用例。在下面定义的测试中,我们将尝试找到最低决策边界,通过该边界,模型可以轻松地对这两个类进行分类。
为什么要用这个?
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
import pandas as pd
import numpy as np
import joblib
def create_model():
model = Sequential()
model.add(Dense(12, input_dim=3, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
df = pd.DataFrame()
for _ in range(1000):
a = np.random.normal(0, 1)
b = np.random.normal(0, 3)
c = np.random.normal(12, 4)
if a + b + c > 11:
target = 1
else:
target = 0
df = df.append({
"A": a,
"B": b,
"C": c,
"target": target
}, ignore_index=True)
clf = KerasClassifier(build_fn=create_model, epochs=150, batch_size=10, verbose=0)
X = df[["A", "B", "C"]]
clf.fit(X, df["target"])
joblib.dump(clf, "model.joblib")
df.to_csv("data.csv")
Drifter-ML 是专门为 Scikit-learn 编写的,这个库充当了它的扩展。所有的类和方法都是与 Scikit-learn 同步编写的,因此数据和模型测试变得相对容易和简单。
def test_cv_precision_lower_boundary():
df = pd.read_csv("data.csv")
column_names = ["A", "B", "C"]
target_name = "target"
clf = joblib.load("model.joblib")
test_suite = ClassificationTests(clf,
df, target_name, column_names)
lower_boundary = 0.9
return test_suite.cross_val_precision_lower_boundary(
lower_boundary
)
另外,如果你喜欢在开源库上工作,那么你也可以将这个库扩展到其他机器学习和深度学习库,比如 Pytorch。
-
关键特征
-
1 构建在 Scikit-learn 之上。
2 提供深度学习架构的测试,但仅针对 Keras,因为它在 Scikit-learn 中进行了扩展。
3 开源库,开放投稿。
-
主要缺点
-
它不是最新的,它的社区也不太活跃。
-
它不能很好地与其他库一起工作。
基于订阅的工具
1.跪下
- Kolena.io 是一个基于 Python 的 ML 测试框架。它还包括一个可以记录结果和见解的在线平台。Kolena 主要关注大规模的 ML 单元测试和验证过程。
- 你为什么要用这个?
Kolena 认为,分割测试数据集方法并不像看起来那么可靠。分割数据集提供了整个人口分布的全局表示,但无法捕获粒度级别的局部表示,对于标注或分类尤其如此。仍有一些隐藏的细微特征需要被发现。这导致了模型在现实世界中的失败,即使模型在训练和评估期间在性能指标中产生了好的分数。
解决该问题的一种方法是创建一个更加集中的数据集,这可以通过将给定的类分解为更小的子类以获得集中的结果,甚至创建要素本身的子集来实现。这样的数据集可以使 ML 模型能够在更细粒度的水平上提取特征和表示。这也将通过平衡偏差和方差来提高模型的性能,从而使模型在现实世界的场景中具有良好的通用性。
例如,在构建分类模型时,可以将数据集中的给定类分解为多个子集,并将这些子集分解为更细的子集。这可以让用户在各种场景中测试模型。在下表中,CAR 类通过几个测试用例进行测试,以检查模型在各种属性上的性能。
Kolena.io dashboard example | Source
另一个好处是,每当我们在现实世界中面临一个新的场景时,一个新的测试用例可以立即被设计和测试。同样,用户可以为各种任务构建更全面的测试用例,并训练或构建模型。用户还可以在每一类测试用例中生成一个关于模型性能的详细报告,并在每次迭代中将其与之前的模型进行比较。
总而言之,Kolena 提供:
python 框架的易用性
自动化工作流测试和部署
CAR class tested against several test cases to check the model’s performance on various attributes | Source
更快的模型调试
更快的模型部署
-
如果你正在研究一个大规模的深度学习模型,这个模型很难监控,那么 Kolena 将是有益的。
-
关键特征
-
1 支持深度学习架构。
-
Kolena Test Case Studio 为模型提供可定制的测试用例。
3 它允许用户通过去除噪声和改进注释来准备质量测试。
4 它能自动诊断故障模式,并能找到与之相关的确切问题。
5 无缝集成到 ML 管道中。
-
主要缺点
-
1 基于订阅的模式(未提及定价)。
-
2 基于订阅的模式(未提及定价)。
-
为了下载框架,你需要一个 CloudRepo 通行证。
-
2.强健的智能
View from the Kolena.io app | Source
这是一个 E2E 洗钱平台,提供洗钱完整性方面的各种服务。该框架是用 Python 编写的,允许根据您的需要定制您的代码。该框架还集成到一个在线仪表板中,该仪表板提供了对数据和模型性能的各种测试以及模型监控的见解。从培训到后期制作阶段,所有这些服务都以 ML 模型和数据为目标。
为什么要用这个?
- 该平台提供的服务包括:
- 1。人工智能压力测试(AI stress testing,)包括数百项测试,以自动评估模型的性能并识别潜在的缺陷。
- 2。AI Firewall,自动在训练好的模型周围创建一个包装器,以实时保护它免受不良数据的影响。包装器是基于模型配置的。它还会自动检查数据和模型,减少手动工作和时间。
pip3 install --extra-index-url "$CR_URL" kolena-client
3。AI 连续测试,其中监控模型并自动测试已部署的模型,以检查更新和重新训练。测试包括数据漂移、错误、根本原因分析、异常检测等。在持续测试中获得的所有见解都显示在仪表板上。
强大的智能支持模型测试、部署期间的模型保护以及部署后的模型监控。由于它是一个基于 e2e 的平台,所有阶段都可以很容易地自动化,对模型进行数百次压力测试,使其为生产做好准备。如果项目相当大,那么强大的智能会给你带来优势。
Robust intelligence features | Source
关键特征
1 支持深度学习框架
2 灵活易用
Evaluating the performance of the model | Source
3 可定制
Prevention of model failures in production | Source
4 可扩展
Monitoring model in production | Source
主要缺点
1 仅针对企业。
网上几乎没有详细信息。
- 昂贵:一年的订阅费用约为 6 万美元。
- ( 来源 )
- 混合框架
- 1.Etiq.ai
Etiq 是一个支持人工智能/人工智能生命周期的人工智能观察平台。像 Kolena 和 Robust Intelligence 一样,该框架提供了 ML 模型测试、监控、优化和可解释性。
Etiq 被认为是一个混合框架,因为它同时提供离线和在线实现。Etiq 有四层用途:
- 免费和公开:包括免费使用图书馆和仪表盘。请记住,当您登录到平台时,结果和元数据将存储在您的 dashboard 实例中,但您将获得全部好处。
- 免费和受限:如果你想要一个免费但私密的项目测试环境,并且不想分享任何信息,那么你可以不用登录平台就可以使用平台。请记住,您不会像登录平台时那样获得全部权益。
- 订阅和私有:如果你想获得 Etiq.ai 的全部好处,那么你可以订阅他们的计划,并在你自己的私有环境中使用他们的工具。Etiq.ai 已经在 AWS 市场上推出,起价约为 3.00 美元/小时或 25,000 美元/年。
个性化请求:如果您需要 Etiq.ai 所不能提供的功能,比如可解释性、健壮性或团队共享功能,那么您可以联系他们并获得您自己的个性化测试套件。
框架的结构
Etiq 遵循类似于 DeepChecks 的结构。这种结构仍然是框架的核心:
快照:是生产前测试阶段数据集和模型的结合。
The dashboard of Etiq.ai | Source
扫描:通常是应用于快照的测试。
- Config :它通常是一个 JSON 文件,包含一组参数,扫描将使用这些参数在快照中运行测试。
- 定制测试:它允许您通过向配置文件中添加和编辑各种度量来定制您的测试。
- Etiq 提供两种类型的测试:扫描和根本原因分析或 RCA,后者是一个实验管道。扫描类型提供
- 准确度:在某些情况下,高准确度可以像低准确度一样表明有问题。在这种情况下,“精确”扫描会有所帮助。如果精度太高,那么你可以进行泄漏扫描,或者如果精度太低,那么你可以进行漂移扫描。
泄漏:帮助你发现数据泄漏。
漂移:可以帮你找到特征漂移、目标漂移、概念漂移、预测漂移。
- 偏差:偏差指的是算法偏差,这种偏差可能是由于自动决策导致非故意歧视而产生的。
- 为什么要用这个?
- Etiq.ai 提供了一个多步骤管道,这意味着您可以通过记录 ML 管道中每个步骤的结果来监控测试。这允许您识别和修复模型中的偏差。如果你正在寻找一个框架来完成你的人工智能管道的重担,那么 Etiq.ai 是一个不错的选择。
- 您应该使用 Etiq.ai 的其他一些原因:
Etiq offers two types of tests: Scan and Root Cause Analysis or RCA, the latter is an experimental pipeline. The scan type offers
-
这是一个 Python 框架
-
2 用于多视角和优化报告的仪表板设施
-
你可以管理多个项目。
-
以上各点对免费层使用有效。
Etiq.ai 的一个关键特性是,它允许您在模型构建和部署方法中非常精确和直接。它旨在为用户提供工具,帮助他们实现期望的模型。有时,开发过程会偏离最初的计划,主要是因为缺少塑造模型所需的工具。如果您想要部署一个与提议的需求相一致的模型,那么 Etiq.ai 是一个不错的选择。这是因为该框架在整个 ML 管道的每一步都提供了类似的测试。
关键特征
免费层中的许多功能。
2 测试每条管道,以便更好地监控
-
3 支持深度学习框架,如 PyTorch 和 Keras-Tensorflow
-
你可以申请一个个性化的测试库。
-
主要缺点
目前,在生产中,它们只提供批处理功能。
2 将测试应用于与细分、回归或推荐引擎相关的任务,他们必须与团队取得联系。
Steps of the process when to use Etiq.ai | Source
结论
我们讨论的 ML 测试框架是针对用户需求的。所有的框架都有各自的优缺点。但是你可以通过使用这些框架中的任何一个来获得。ML 模型测试框架在定义模型在部署到真实场景时的表现方面扮演着不可或缺的角色。
- 如果你正在为结构化数据集和较小的 ML 模型寻找一个免费且易于使用的 ML 测试框架,那么请选择 DeepChecks。如果你正在使用 DL 算法,那么 Etiq.ai 是一个很好的选择。但如果你能抽出一些钱,那么你一定要打听一下科勒娜。最后,如果你在一家中大型企业工作,寻找 ML 测试解决方案,那么毫无疑问,它必须是强大的智能。
- 我希望这篇文章为您提供了开始 ML 测试所需的所有初步信息。请把这篇文章分享给每一个需要的人。
- 感谢阅读!!!
- 参考
https://www.robustintelligence.com/
https://AWS . Amazon . com/market place/PP/prod view-23 bciknsbkk GTA
https://arxiv.org/pdf/2005.04118.pdf
https://medium . com/kolena-ml/best-practices-for-ml-model-testing-224366 D3 f23c
https://github.com/EricSchles/drifter_ml
https://arxiv.org/pdf/2203.08491.pdf
- https://medium . com/@ ptan nor/new-open-source-for-validating-and-testing-machine-learning-86 bb 9 c 575 e 71
- https://deepchecks.com/
- https://www . xenon stack . com/insights/machine-learning-model-testing
- https://www.jeremyjordan.me/testing-ml/
- https://Neptune . ai/blog/ml-model-testing-teams-share-how-they-test-models
- https://mlops . toys
- https://docs.kolena.io/
- https://www.kolena.io/
- https://github.com/EricSchles/drifter_ml
- https://arxiv.org/pdf/2203.08491.pdf
- https://medium.com/@ptannor/new-open-source-for-validating-and-testing-machine-learning-86bb9c575e71
- https://deepchecks.com/
- https://www.xenonstack.com/insights/machine-learning-model-testing
- https://www.jeremyjordan.me/testing-ml/
- https://neptune.ai/blog/ml-model-testing-teams-share-how-they-test-models
- https://mlops.toys
为机器学习应用构建概念验证管道的 7 种工具
将任何想法转化为现实至少需要几步。有时,专家可以依靠线框或模型来证明一个想法是相关的,并具有潜在的价值。但是仅仅依靠线框是有风险的。这就是我们也进行概念验证的原因。
顾名思义,概念验证是数字产品的最小工作状态,或者至少是某个工作部分。概念验证证明了你的想法的可行性。
“它不是为了探索市场对该创意的需求,也不是为了确定最佳的生产流程。相反,它的重点是测试这个想法是否可行。–TechTarget
在本文中,当您想要创建一个基于机器学习的工具,或者只想为任何确定的解决方案分析数据时,我们将涵盖一些最佳的入门工具。我们将讨论在部署您的机器学习解决方案之前会发生什么,以及如何证明您的想法。
要求 POC
POC 是一种流行的方法,用于评估服务和产品,以验证某些功能或列出的需求是否可行。构建 POC 是验证可扩展性、技术潜力等内容的一种方式。
在 POC 中,您将介绍最终产品的关键功能,但规模较小。在开发生命周期之前创建 POC 是在内部验证您的产品并尽早获得反馈的机会。这样,您可以在以后的开发中减少风险。
POC 的构建也应符合长期需求,即展示现在和未来跨团队和平台的价值。
数据科学/机器学习概念验证
在数据科学和机器学习解决方案的情况下,POC 由什么组成?
为数据科学解决方案创建 POC 可能与传统软件不同,因为我们必须调查更大的潜在客户才能创建它。与 web 应用程序概念验证不同,在 ML 概念验证中,您不能只关注一个方面并构建它。POC 应该已经训练有素,能够处理未知数据。
机器学习是一个广阔的领域,它为许多问题提供了解决方案。但是在将任何机器学习解决方案推向生产之前,我们应该通过概念验证来评估商业价值和可扩展性。
例如,自动驾驶汽车项目——智能无人驾驶汽车不能在 POC 阶段不考虑安全和安全措施的情况下就上路。为了部署成功的解决方案,我们必须考虑 POC 中的任何未来中断和增强,这一点很重要。
构建数据科学机器学习 poco 的步骤
在部署任何机器学习解决方案之前,POC 都扮演着重要的角色。在创建 POC 时,您将不得不考虑 POC 的商业价值和更大的目的,这些事情将以不同的方式影响效率。
考虑到这些挑战,以及并非每个 POC 最终都会投入生产,我们需要制定一个计划。创建成功的增值概念验证的计划。以下是您在评估过程中可以遵循的一些步骤:
- 评估商业价值
当您开始处理 POC 时,您需要定义业务价值。它将如何增加利润?它将如何使你的过程更有效?在某些情况下,我们还可以考虑收集客户对现有流程的反馈,并从那里开始思考您的想法如何改善体验。
- 捕获所需数据
现在您已经知道了您的解决方案将如何增加业务价值,那么您是否拥有构建它所需的数据呢?你有足够的它吗,它需要清洗和处理吗?
- 实施的可行性
请一位专家来检查您的模型复杂性。为一种解决方案创建的模型可能无法为另一种类型的数据提供相同的效率。可能存在需要解决的基础设施缺口。
- 定义时间范围
在咨询业务、经理和客户之后,确定一个时间框架是非常重要的。POC 不是一个完整的 ML 项目,因此您不能在每个方面投入太多时间,否则最终会变得太复杂。
- 组装团队
通过这一步,您知道您希望从 POC 中获得什么,以及实现它需要什么。现在是时候让队友拥有正确的技能了。例如,用 Python 做过一些建模的数据科学家/分析师不一定会构建一个准备好处理所需 POC 的基础设施。让不同技能的人参与进来,并尝试遵循敏捷的项目流程,这样你的团队会更有效率。
现在,我们已经有了创建 POC 的计划,让我们来看看哪些工具可以帮助我们在规定的时间内创建一个成功的 POC。
TL;DR–快速工具比较
在我们深入研究这些工具的细节之前,您可以查看一下这个快速比较,以便对这些工具有一个大致的了解。
工具/指标 | 内置算法 | 支持的框架和编程语言 | 基于网络 | 定价 |
---|---|---|---|---|
TensorFlow,scikit,SparkML,Python,R
| |
【每毫升工作室每月 9.99 美元】每工作室实验小时 1 美元
|
| | |
TensorFlow, Keras, Pytorch, scikit, xgboost, Python, R
| |
每小时价格,视等级而定——0.19 rn 标准——1.98 rn 免费试用
|
| | |
Apache MXNet、Apache Spark、ChainerrnHugging Face、PyTorch、
Scikit-learn、SparkML Serving、TensorFlow、Python
| |
每小时的价格,取决于实例的类型
|
| | |
TensorFlow,Pytorch,Keras,MS 认知工具,Python,R
| | |
| | |
TensorFlow、Spark、scikit、ggplot2、Python、R、Ruby、Scala、Go 和 Julia
| | |
| | |
Keras,PyTorch,MxNet,OpenCV,xgboost,python
| | |
| | | | |
【免费试用和免费版本】更多功能:每年 0.01 美元起
|
对于给定的业务问题,当您从 POC 开始时,您将评估技术和财务方面——处理器、编程语言、选择机器学习模型,以及成本效率、可行性等。
现在,我们将详细介绍每种工具,看看您和您的团队如何使用它们来创建概念验证和部署机器学习模型。
1.大太酷
“【大台库】 是一个平台,它使数据访问民主化,并使企业能够以以人为中心的方式构建自己的人工智能之路。”
Dataiku 提供不同的能力——数据准备、可视化、机器学习、数据操作、ML 操作等等。这个想法是让用户关注需求,同时为您提供最新的技术来满足这些需求。Dataiku 已经集成了许多工具,如 Python、R、Scala、Hive 等。您可以使用这些工具来构建解决方案,Dataiku 将在后续步骤中无缝集成结果。
谈到机器学习,Dataiku AutoML 有许多预先构建的机器学习模型,统计功能,spark 的大数据集训练功能,等等。这可以帮助您轻松创建机器学习解决方案。Dataiku 是创建 POC 的良好候选,因为它支持广泛的机器学习领域和工具。但是它并没有将您限制在预先构建的工具上,因为它提供了笔记本支持,您可以在其中自己编写代码并进行实验。
在 Gartner 2021 年魔力象限报告中,Dataiku 还被列为数据科学和机器学习平台的领导者。
优势
- 多个用户同时工作的协作工具。
- 集成了许多不同的编程语言,让您可以灵活地处理任何事情,而不必担心学习新的语言。
- 简单的界面和良好的数据挖掘工具。任何非技术人员都可以轻松使用该工具。
- 当用户有任何特定需求时,他们可以使用自己的 ML 模型进行数据分析。
不足之处
- 这个工具的免费版本有一些限制,例如,您只能对 30k 行执行数据分析。
- Dataiku 不支持任何深度学习能力。
2.AWS–sage maker
" 亚马逊 SageMaker 通过汇集一系列专门为机器学习构建的功能,帮助数据科学家和开发人员快速准备、构建、训练和部署高质量的机器学习(ML)模型。"
亚马逊网络服务(AWS)已经在市场上存在了很长时间,许多企业都选择了 AWS 云服务。使用 AWS 提供的机器学习服务将具有相同的好处:针对 ML 的 CI/CD 服务、监控支持等等。
SageMaker 为 ML 开发的每一步都预建了工具。一旦部署了机器学习模型或工具,它就有工具(Kubernetes、Edge manager、model monitor 等)来管理和观察。您只需点击并选择细节,即可轻松启动您的 ML 工作流程,然后您可以部署任何东西,从预测分析到计算机视觉,来预测客户流失。
这是第一个完全集成的机器学习开发环境,用户可以大规模部署 ML 工具。你可以使用你选择的任何框架来试验和定制机器学习算法。有了这些可用的工具和框架,为 ML 解决方案创建 POC 将比手动创建要容易得多。
SageMaker 结合了创建 ML 动力工具的所有四个阶段,如下所示:
AWS SageMaker 将数据科学家的生产力提高了 10 倍,大约 89%的深度学习项目都在 AWS 上的云中。它还可以帮助您减少高达 90%的培训成本。
优势
- 内置机器学习模型的广泛集合,您可以专注于创建产品,而不是手动调整和改进模型。
- 与其他 AWS 服务集成,为您的 ML 项目提供一站式解决方案。
- 拥有广泛的工具集合,而且还允许用户创建自己的模型。
- 支持 TensorFlow、MXNet、PyTorch 等机器学习和深度学习框架。
- 自动驾驶模式,它解释您的数据,并在访问所有可用的内置模型后选择性能最佳的模型。在这种模式下,您无需编写一行代码就可以创建一个工具。
不足之处
- 它是昂贵的。
- 它支持大多数框架及其库,但并不总是支持更新版本。
- 数据只能从 Amazon s3 中读取和写入。
检查 Neptune.ai 和 AWS Sagemaker 之间的差异
3.Azure 机器学习
"Azure ML让拥有广泛生产经验的数据科学家和开发人员能够构建、训练和部署机器学习模型,并促进团队协作。”
Azure 机器学习服务包括从经典 ML 到深度学习的工具。它为开源框架和语言(MLflow、Kubeflow、ONNX、PyTorch、TensorFlow、Python、R 等)提供了同类最佳的支持。就像 AWS 一样,Azure 也提供了先进的安全性、治理和混合基础设施。
它通过预构建的工具提高您的生产力,而且通过支持最新的工具帮助您创建有效的模型。它有机器学习辅助标注,你可以快速准备数据。当涉及到处理复杂的机器学习解决方案时,Azure 有一个自动扩展功能,所以你可以共享 CPU 和 GPU 集群。
当你点击“笔记本”选项时,你将能够从 Azure 启动 Jupyter 笔记本:
Azure 提供了使用拖放功能的选项,或者使用 Azure 笔记本并创建自己的实验。在拖放功能中,你只需要创建一个按部就班的流程,所有的脏活都将由 Azure 的 ML 工具来完成。
在 AutoML 的帮助下,您可以识别算法和超参数,并在云端跟踪实验。
当你准备为机器学习创建一个 POC,但预算很少时,Azure 可能是一个不错的选择。你可以通过注册 Azure 免费帐户获得即时访问和一些点数。Azure 机器学习计算实例的资源分配具有工作区和资源级别的配额限制,并且具有成本效益。它通过与 Microsoft Power BI 和其他 Azure 服务的内置集成来提高工作效率。
优势
- 来自微软研究团队、Bing 等的经过改进和验证的模型,可以帮助您利用最佳解决方案。
- 与许多其他工具不同,它支持 R,由于它的简单性和处理时间,对于任何使用 R 的数据分析人员来说都是非常好的。
- 与其他工具相比更便宜。免费等级/免费试用对于构建概念证明非常有用
- Cortana Intelligence Gallery,用户可以在这里查找和交流知识。
- 内置的认知 API 帮助您提高模型的准确性。
不足之处
- 节省您的时间和金钱,但有时会有性能问题,例如,如果数据集太复杂或太小,模型准确性会受到影响。
- 注册 Azure,用户可以获得免费服务,但这只能提供有限的培训时间和功能。
4.Google Colab
“使用 Colab 您可以导入图像数据集,在其上训练图像分类器,并评估模型,所有这些都只需几行代码。Colab 笔记本在谷歌的云服务器上执行代码,这意味着无论你的机器功率如何,你都可以利用谷歌硬件的能力,包括 GPU 和 TPU。你只需要一个浏览器。”
Colaboratory 支持 python,代码可以在零配置的浏览器上执行。你可以很容易地分享你的代码,因为当你创建自己的 Colab 笔记本时,它们会存储在你的 Google Drive 中。Colab 笔记本是由 colab 托管的 Jupyter 笔记本。
只需输入:https://colab.research.google.com/就可以开始了,就这么简单。
大多数库都是预安装的,所以您可以直接开始工作。当您想在系统上不做任何配置的情况下构建 ML POC,并且仍然想使用强大的处理器时,这是一个很好的选择。这里您可能面临的唯一问题是,您没有任何预构建的工具,您必须自己编码。
你可以从你的本地(将保存到 Google Drive)、Google Drive、Github 和许多其他来源将数据导入 Colab,你所有的工作都将保存在云上,可以通过互联网从任何设备访问。它还提供了与多个开发人员共同编码的机会——他们可以审查、添加评论、分配任务等等。
优势
- 它是免费的,并且不收取使用 TPU 或 CPU 的费用。
- 包括广泛的 Python 库,所以很少需要安装额外的 Python 库。
- 所有代码都会自动保存到 Google Drive。
不足之处
- 笔记本、数据集文件等。在 Google Drive 上保存,因此如果你的使用量超过 15GB,你需要为额外的空间付费。
- 每个新的会话,你都必须安装所有没有包含在标准 Python 包中的特定库。
5.kagglekernel
Kaggle 归谷歌所有,Kaggle Kernel 是一个在浏览器中运行 Jupyter notebook 的免费平台。Kaggle 也有大量的现实生活数据。创建 POC 时,如果您无法从客户端或组织获取数据,您可以浏览 Kaggle 数据集并找到您需要的内容。这很像 Google Colab,因为它也是免费的,可以在任何地方访问,并提供强大的处理器。
ka ggle 内核 包含代码,有助于使整个模型可复制,并使您能够在需要时邀请合作者。从代码到注释,从环境变量到所需的输入文件,这是数据科学项目的一个关键解决方案。”
*内核是一个笔记本或脚本,使用容器化的贡献者可以在其中建立他们的 Kaggle 项目。您不必下载数据,因为它已经装载在容器中了。
如果您希望为 ML 驱动的应用程序创建 POC,Kaggle kernel 也是一个不错的选择,因为代码可以很容易地共享。您不需要在您的系统上设置任何东西,并且结果很容易在您的代码中获得。您还可以控制代码的共享,如果您不想公开您的代码,您可以保持它的私密性。
优势
- Kaggle 有一个巨大的数据集集合,你可以使用任何数据集来学习或创建概念验证,没有任何麻烦。
- 你可以很容易地在 Kaggle 上上传你的数据集,并在你的笔记本上使用它们进行分析。
- Kaggle 创建提交历史,这在比较或恢复更改时很有用。
- Kaggle 有一个庞大的社区和积极的支持。
不足之处
- Kaggle 内核每个会话只有 6 小时的可用执行时间。
- 许多研究人员在执行内核/ML 代码时会遇到延迟。
6. Jupyter
"Jupyter的存在是为了开发开源软件、开放标准和跨数十种编程语言的交互式计算服务
目前,Jupyter 有四种不同的功能:
- Jupyter 笔记型电脑
Jupyter Notebook是一个开源的 web 应用程序,允许您创建和共享包含实时代码、等式、可视化和叙述性文本的文档。用途包括数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等等。”**
*大多数云笔记本都是基于 Jupyter Notebook,或者至少是它的想法。这些笔记本和 Jupyter 笔记本的区别在于,你必须在你的系统上安装 Jupyter。Jupyter 也可以通过浏览器访问,您可以看到代码和计算的结果。您可以使用 nbviewer 为您的 Jupyter 笔记本创建一个可共享的链接。
- JupyterLab
"JupyterLab是一个基于 web 的交互式开发环境,用于 Jupyter 笔记本、代码和数据
Jupyter 实验室有一个模块化结构,您可以在其中组织多个笔记本。JupyterLab 支持许多文件格式(图像、CSV、JSON、Markdown、PDF、Vega、Vega-Lite 等),并以这些格式显示丰富的内核输出。这是 Jupyter 笔记本的升级版,以更有条理的方式提供了类似的功能。
- Jupyter Hub
“Jupyter Hub是一款为公司、教室和研究实验室设计的多用户版本笔记本电脑。”
Jupyter Hub 丰富了笔记本电脑的功能,并将数据和代码的使用集中到一组用户。它是可定制的、可扩展的,适合小型和大型团队、学术课程以及大型基础设施。
- 这里
"通过将 Jupyter 笔记本转变为您可以共享的独立网络应用程序,帮助您交流见解
*Voilà对于在不共享代码的情况下向他人展示您的结果非常有用,这可以增强阅读体验。瞧,这是一个极好的工具。它很快,我们可以立即分享结果。它具有高度的可扩展性、灵活性和高可用性。
看看 Jupyter 所提供的功能,它可能是创建 POC 的合适工具。它是创建 ML 驱动的应用程序的一站式解决方案,因为它提供了笔记本、IDE、仪表板工具,并且是开源工具。
优势
- Jupyter 可以安装在您的本地系统上,因此与云服务不同,您不必总是依赖互联网连接。
- 一旦你安装了你的 Python 包,你就不需要再安装它们了。
- 支持 Python,R,Ruby,Scala,Go,Julia。
- 您可以按需使用的不同功能。
- 笔记本可以保存为多种不同的格式,如 HTML、Markdown、PDF 等。
- 使用基于单元的方法,在 Jupyter 中记录代码更容易。
不足之处
- Jupyter 笔记本经常因为内存错误而出现故障。
- 没有 IDE 支持使得这个工具在与团队合作时很难使用。
- 运行异步任务很困难。
Jupyter 利大于弊,这也是为什么大多数数据科学家、分析师和 ML 从业者更喜欢使用 Jupyter 的原因。
7.云汽车
Cloud AutoML用最少的努力和机器学习专业知识训练出高质量的定制机器学习模型**
*借助 Cloud AutoML,机器学习专业知识有限的开发人员可以训练出针对其业务需求的高质量模型。在几分钟内构建您自己的定制机器学习模型。您可以使用易于使用的 GUI 创建自己的定制机器学习模型。
Google 将其 AutoML 功能分为四个不同的类别:
- 平台
使用带有 AutomML 的 AI 平台,用户可以准备数据、构建模型、验证、微调数据,并大规模部署数据。
- 视线
使用 AutoML vision REST APIs,开发人员可以构建用于对象检测的工具,并使用自定义标签对图像进行分类。开发人员还可以使用 AutoML 视频智能工具来注释视频,并改善客户的视频体验。
- 语言
这一部分包括自动翻译和自然语言。开发人员可以通过将 API 集成到他们的项目中来使用这两者。你可以使用这些进行情感分析,将翻译嵌入到你的应用程序或网站中。
- 结构化数据
使用 AutoML 表,开发人员可以在结构化数据上构建和部署最先进的机器学习模型。
这些 AutoML REST APIs 可以很容易地集成到您的项目中,并且您不必编写任何对象检测或转换器模型。正是这个原因使它成为创建与计算机视觉、NLP 等相关的 POC 的最佳工具之一。
优势
- 像大多数云服务一样,CloudML 也提供了用于视觉、语音等的 API,以及用于通用解决方案的预训练模型,如欺诈检测、库存管理或呼叫中心。这在构建 POC 时会很有用。
- 它加速了新业务应用程序的开发,因为您将必须做最少的编码来创建 ML 模型。
- 灵活性,按需快速切换型号。
- 你将可以访问谷歌的分布式网络,并能够使用他们的 GPU 进行更好的处理。
- CloudML 上有 Tensorflow、PyTorch、Keras、XGBoost、Scikit-learn 等更多框架。
不足之处
- 它很贵
- 对于一些人来说,UI 可能有点混乱,尤其是如果您是该工具的新手。
结论
在本文中,我们探讨了为什么为数据科学和机器学习构建 POC 比传统软件更困难。我们还描述了用于构建您自己的 POC 的最佳工具。
其中一些工具可以免费使用,另一些则以高价提供优质服务。在查看这些工具时,您可能已经注意到笔记本电脑与您拥有预建模型的工具或在获得批准后大规模部署 POC 的选项有所不同。您可以根据自己的需求选择这些工具中的任何一个,并开始使用 ML-powered POCs。祝你好运!****
用于模型训练的十大最佳机器学习工具
与流行的观念相反,机器学习中的模型训练不仅仅是一个黑箱活动。为了让机器学习(ML)解决方案始终表现良好,开发人员必须深入研究每个模型,以找到与数据和业务用例的正确匹配。
简单来说,机器学习模型是一个简单的统计方程,它是根据手头的数据随着时间的推移而发展起来的。这个学习过程,也称为训练,从简单到复杂的过程。模型训练工具是一个接口,它使得开发者和机器学习模型的复杂性之间的交互变得容易。
在机器学习中,没有“万金油”——没有一种工具可以解决所有问题,因为现实世界的问题和数据存在巨大差异。但是有一些模型训练工具可以像手套一样适合你——特别是你和你的要求。
为了能够为您的解决方案选择主要的模型培训工具,您需要评估您现有的开发流程、生产基础设施、团队的技能水平、合规性限制以及类似的重要细节,以便能够确定正确的工具。
然而,从长远来看,一个经常被忽视的、导致薄弱的基础和不稳定的解决方案系列的关键特征是模型训练工具跟踪元数据的能力或者与元数据存储和监控工具无缝集成的能力。
模型元数据涉及训练参数、实验指标、数据版本、管道配置、重量参考文件等资产。这些数据非常有用,可以减少生产和模型恢复时间。为了选择正确的元数据存储,您的团队可以在构建新解决方案和购买现有解决方案之间进行成本效益分析。
以下是 ML 市场中十大模型培训工具的列表,您可以使用这些工具来评估您的需求是否与该工具提供的功能相匹配。
1. TensorFlow
我记得在实习时遇到过 TensorFlow,在几乎没有探索 scikit-learn 之后,我明显感到害怕。回过头来看,这似乎迫在眉睫,因为 TensorFlow 是一个低级库,需要与模型代码密切合作。开发者可以通过 TensorFlow 实现完全控制,从零开始训练模型。
然而,TensorFlow 也提供了一些预先构建的模型,可用于更简单的解决方案。TensorFlow 最令人满意的特性之一是数据流图,尤其是在开发复杂模型时,它会派上用场。
TensorFlow 支持广泛的解决方案,包括 NLP、计算机视觉、预测 ML 解决方案和强化学习。作为谷歌的一款开源工具,TensorFlow 在全球拥有超过 380,000 名贡献者的社区,因此它在不断发展。
2. PyTorch
PyTorch 是另一个流行的开源工具,给 TensorFlow 带来了激烈的竞争。PyTorch 有两个重要的特性——在 GPU 上加速处理的张量计算和建立在基于磁带的自动差分系统上的神经网络。
此外,PyTorch 支持许多 ML 库和工具,这些库和工具可以支持各种解决方案。一些例子包括 AllenNLP 和 ELF,这是一个游戏研究平台。PyTorch 除了 Python 还支持 C++和 Java。
PyTorch 和 TensorFlow 之间的一个主要区别是 PyTorch 支持动态数据流图,而 TensorFlow 仅限于静态图。与 TensorFlow 相比,PyTorch 更容易学习和实现,因为 TensorFlow 需要大量的代码工作。
查看如何跟踪 PyTorch 模型培训。
3. PyTorch Lightning
PyTorch Lightning 是 PyTorch 之上的一个包装器,主要用于将注意力转移到研究上,而不是工程或多余的任务上。它抽象了模型和公共代码结构的底层复杂性,因此开发人员可以在短时间内关注多个模型。
顾名思义,PyTorch Lightning 的两大优势是速度和规模。它支持 TPU 集成,消除了使用多个 GPU 的障碍。为了规模,PyTorch Lightning 允许实验通过 grid.ai 在多个虚拟机上并行运行。
PyTorch Lightning 对代码的需求明显减少,因为它有高级包装器。然而,这并不限制灵活性,因为 PyTorch 的主要目标是减少对冗余样板代码的需求。开发人员仍然可以修改并深入到需要定制的领域。
查看如何跟踪 PyTorch Lightning 模型培训。
4. Scikit-learn
Scikit-learn 是顶级开源框架之一,非常适合开始机器学习。它有高级包装器,使用户能够使用多种算法,探索广泛的分类、聚类和回归模型。
对于好奇的人来说,scikit-learn 也是一种很好的方式,只需解开代码并遵循依赖关系,就可以更深入地了解模型。Scikit-learn 的文档非常详细,初学者和专家都很容易阅读。
Scikit-learn 非常适合时间和资源有限的 ML 解决方案。它严格以机器学习为中心,并且在过去几年中一直是流行品牌预测解决方案的重要组成部分。
查看如何跟踪 Scikit-learn 模型培训。
5.催化剂
Catalyst 是另一个专门为深度学习解决方案打造的 PyTorch 框架。Catalyst 是研究友好型的,负责工程任务,如代码的可重用性和可再现性,促进快速实验。
深度学习一直被认为是复杂的,Catalyst 使开发人员能够用几行代码执行深度学习模型。它支持一些顶级的深度学习模型,如 ranger optimizer、随机加权平均和单周期训练。
Catalyst 保存源代码和环境变量以实现可重复的实验。其他一些值得注意的特性包括模型检查点、回调和提前停止。
检查如何跟踪 Catalyst 模型培训。
6.XGBoost
XGBoost 是一种基于树的模型训练算法,使用梯度提升来优化性能。这是一种集成学习技术,即使用几种基于树的算法来实现最佳模型序列。
使用梯度增强,XGBoost 一个接一个地生长树,以便后面的树可以从前面的树的弱点中学习。它通过从前面的树模型中借用信息来逐渐调节弱学习者和强学习者的权重。
为了提高速度,XGBoost 支持跨分布式环境(如 Hadoop 或 MPI)的并行模型加速。XGBoost 非常适合大型训练数据集以及数值和分类特征的组合。
检查如何跟踪 XGBoost 模型培训。
7.LightGBM
LightGBM 和 XGBoost 一样,也是使用基于树的模型的梯度提升算法。但是说到速度,LightGBM 比 XGBoost 占了上风。LightGBM 最适合大型数据集,否则使用其他模型会耗费大量训练时间。
虽然大多数基于树的算法在树的级别或深度上进行分割,但 LightGBM 采用了独特的叶子或宽度分割技术,这已被证明可以提高性能。尽管这可能会使模型过拟合,但是开发人员可以通过调整 max_depth 参数来避免这种情况。
尽管 LightGBM 处理大量数据集,但它需要的内存空间很少,因为它用离散的条块代替了连续的值。它还支持并行学习,这也是一个重要的时间节省。
检查如何跟踪 LightGBM 模型培训。
8.CatBoost
CatBoost 是一种梯度提升算法,与大多数机器学习模型相比,它通过最少的训练提供了同类最佳的结果。它是一个开源工具,并且因为其易用性而广受欢迎。
CatBoost 减少了预处理工作,因为它可以直接和优化地处理分类数据。它通过生成数字编码和在后台试验各种组合来做到这一点。
尽管 CatBoost 提供了使用一系列多个超参数进行广泛调整的范围,但它不需要太多调整,并且可以在不过度拟合训练数据的情况下产生结果。它非常适合低容量和高容量数据。
9.Fast.ai
Fast.ai 的朗朗上口的口号说明了一切——“让神经网络再次变得不酷”。Fast.ai 旨在使深度学习可以跨多种语言、操作系统和小数据集进行。它是基于迁移学习是深度学习的一个关键优势,可以减少大量冗余工程工作的想法而开发的。
它为深度学习模型提供了一个易于使用的高级界面,还允许用户下载一组预先训练好的模型。Fast.ai 有多个包装器,隐藏了底层模型架构的复杂性。这使得开发人员可以专注于数据智能和流程突破。
Fast.ai 也非常受欢迎,因为它分享了他们的免费在线课程“程序员实用深度学习”,该课程不要求任何先决条件,但深入研究了深度学习概念,并说明了如何通过 fast.ai 使其变得简单。
查看如何跟踪 fast.ai 模型训练。
10.皮托奇点火
PyTorch Ignite 是一个构建在 PyTorch 之上的包装器,与 PyTorch Lightning 非常相似。两者都提供了模型复杂性的抽象和易于使用的界面,以扩展研究能力和减少冗余代码。
就架构而言,两者之间存在微妙的差异。PyTorch Lightning 有一个标准的可复制界面,Ignite 没有任何标准版本。
虽然它不能支持高度先进的功能,但 Ignite 可以与集成生态系统很好地合作,以支持机器学习解决方案,而 Lightning 支持最先进的解决方案、高级功能和分布式培训。
有几个其他的选项可能不像上面的选择那样受欢迎,但是对于特定的模型训练需求来说是很棒的。
例如:
- 如果有限的 GPU 资源的高速是你的优先事项, Theano 领先。
- 因为。NET 和 C#的能力, Accord 将是理想的。它还有许多音频和图像处理库。
- ML.NET 是另一个工具。NET 开发人员。
- NLP 专用和计算机视觉解决方案的其他选项分别包括 Gensim 和 Caffe 。
总之,在为您的特定解决方案选择合适的解决方案之前,最好先进行彻底的市场调查。它可能不是最流行或最知名的工具,但它绝对是适合你的。
最后一个音符
如前所述,没有一种工具可以解决所有商业案例或机器学习问题。即使没有一个工具看起来完全适合你,但是它们的组合可能是理想的选择,因为它们中的大多数都是相互兼容的。
诀窍是首先列出该领域中的一些最佳工具,我们已经为您完成了,然后探索入围的工具,以逐步达到正确的匹配。这里分享的工具很容易安装,并且在它们各自的站点上有大量的文档,便于快速启动!
来源:
机器学习中的 12 大现场跟踪工具
云很酷——它们提供可扩展性、成本节约以及与众多工具集成的能力。任何东西都有应用程序——机器学习平台、数据存储、项目管理、调试和许多其他工具都在为我们竞争,随时可以使用。
然而,当一个人需要(或想要!)在本地基础设施上运行培训。它可以是在超级计算机上启动的科学项目。它可以是银行或医疗保健相关机构内部构建的模型,由于合规性问题,这些机构无法使用基于云的服务。
或者,该公司已经投资了其服务器场,并且不想在内部拥有适量计算能力的情况下为云支付过高的费用。原因数不胜数,有些令人惊讶,有些则平淡无奇。
对于习惯了云的数据科学家来说,在本地基础设施上运行项目(以及跟踪实验)的愿景可能会令人不安。但是不要害怕!
本文涵盖了你可以用来跟踪你的机器学习项目的 12 大内部工具。
Neptune 是为运行大量实验的研究和生产团队构建的 MLOps 的元数据存储。它有本地版本,可免费试用 30 天。
Neptune 在云和内部都可用。它为日志度量、数据版本、硬件使用、模型检查点等提供元数据跟踪。
你可以在你的脚本顶部用下面三行代码将 Neptune 连接到你的任何机器学习模型。
您可以用简单的命令pip install neptune-client
安装 Neptune,并在训练和验证脚本中添加以下代码,以记录您的实验数据。
import neptune.new as neptune
run = neptune.init('work-space/MyProject', api_toke='Your_token')
run['parameters']={'lr':0.1, 'dropout':0.4}
run['test_accuracy'].log(0.84)
Neptune 可以集成 PyTorch 、 Skorch 、 Ignite 、 keras 等框架。
使用海王星的优势
- 你可以在 Jupyter 笔记本上追踪实验。
- 项目监督以及团队协作
- 比较笔记本
- 搜索并比较你的实验
- 与团队分享您的工作。
Comet 也是一个跟踪机器学习项目的实验工具。Comet 提供了一个自托管和基于云的元机器学习平台,允许数据科学家和团队跟踪、比较、解释、优化实验和模型。
一名内部成员可免费获得,多名成员可获得 30 天试用期。
您可以使用以下代码片段将 comet 与您的任何机器学习项目集成。
你可以用下面的代码安装 Cometpip install comet_ml
from comet_ml import Experiment
experiment = Experiment(project_name="my-project", workspace="my-workspace")
Comet 可以集成类似 PyTorch 、 fast.ai 、 Ignite 、 Keras 等框架。
彗星的优点
- 比较实验以了解模型性能的差异。
- 从您的模型预测中分析并获得洞察力。
- 通过使用最先进的超参数优化和监督早期停止,更快地构建更好的模型。
权重&偏差是一个机器学习的开发工具,用于执行实验跟踪、超参数优化、模型和数据集版本化。
Weights & Biases 通过帮助团队跟踪他们的模型、可视化模型性能以及轻松地自动化培训和改进模型,帮助组织将深度学习研究项目转化为部署的软件。
您可以使用下面的代码pip install wandb
安装 Weights & Biases,通过下面的代码片段将该工具与您的任何机器学习项目集成。
import wandb
wandb.init(project="gpt-3")
config = wandb.config
config.learning_rate = 0.01
wandb.watch(model)
for batch_idx, (data, target) in enumerate(train_loader):
...
if batch_idx % args.log_interval == 0:
wandb.log({"loss": loss})
砝码的优势&偏差
- 适合深度学习实验
- 更快的集成
- 可视化和报告工具的灵活用户界面
MLflow 是一个开源工具,可以部署在云和本地,用于管理机器学习生命周期,包括实验、再现性、部署和中央模型注册。
MLflow 有三个构建模块:
- 跟踪:日志和查询实验,比较结果和参数。
- 项目:以可重用的方式封装代码。
- 模型:管理和部署模型。
可以用下面的代码pip install mlflow
安装 MLflow。
使用 MLflow 进行实验跟踪的线性回归示例:
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
import mlflow
import mlflow.sklearn
mlflow.set_tracking_uri('file:/myfullppath/myproject/mlruns')
exp_name = "Simple_Regression"
mlflow.set_experiment(exp_name)
x = np.array([[1], [2], [2.1], [2.5], [2.7], [3], [4], [4.5], [3]])
y = np.array([0.5, 2.2, 2.5, 3, 3.5, 3.1, 5, 5.1, 3.5])
x_train = x[:-2]
y_train = y[:-2]
x_test = x[-2:]
y_test = y[-2:]
with mlflow.start_run():
model = LinearRegression()
model.fit(x_train, y_train)
prediction = model.predict(x_test)
rmse = np.sqrt(mean_squared_error(y_test, prediction))
print(rmse)
mlflow.log_metric("rmse", rmse)
mlflow.sklearn.log_model(model, "model")
【MLflow 的优势:
- 开源
- 在本地和云上工作。
- 借助 Apache Spark 扩展到大数据
你可以在这里了解更多关于 MLflow 的信息。
神圣自动存储每次运行的实验信息,我们可以在 Omniboard 的帮助下可视化该实验。
神圣的–我们在模型训练脚本中使用神圣的装饰者来自动存储每次运行的实验信息。
omni board–omni board 有助于可视化我们的实验,以便跟踪它们,观察每个实验的持续时间,添加注释,以及检查实验(失败或完成)。
你可以用下面的命令pip install sacred
安装神圣&全能。
神圣的优点
- 开源工具
- 易于集成
- 使用 Omniboard 跟踪可视化实验
- 帮助为每个实验添加注释。
你可以在这里了解更多关于神圣的。
TensorBoard ,开源工具,是 TensorFlow 的可视化工具包,为机器学习实验提供可视化和工具,包括度量可视化、模型图可视化等。
用张量板显示图形的简化代码:
import tensorflow as tf
writer = tf.summary.create_file_writer('./folder')
accuracy = [0.1, 0.4, 0.6, 0.8, 0.9, 0.95]
with writer.as_default():
for step, acc in enumerate(accuracy):
tf.summary.scalar('Accuracy', acc, step)
writer.flush()
writer.close()
启动网络服务器:
tensorboard --logdir='./folder'
冲浪板的优势
- 提供调试机器学习模型训练所需的度量和可视化
- 写总结来形象化学习
- 易于集成
- 大型社区
你可以在这里了解更多关于 TensorBoard 的信息。
Deepkit.ai 是一个开源的机器学习开发工具和培训套件,用于深入、快速和可重复的现代机器学习。
Deepkit.ai 可以用来跟踪你的实验,调试你的模型,管理计算服务器。
deep kit . ai 的主要优势
- 实验管理
- 模型调试
- 计算管理
Guild AI 是一个开源工具,最适合个人项目。它提供机器学习运行的参数跟踪、加速的 ML 模型开发、测量实验和超参数调整。
Guild AI 会自动捕捉训练跑步的每个细节,作为独特的实验。
公会 AI 的主要优势
- 分析、可视化和差异
- 使用 AutoML 进行超参数调谐
- 并行处理
- 百分之百免费
Trains 是一个开源平台,用于跟踪和控制生产级深度学习模型。
任何处于模型原型阶段的研究团队都可以通过添加几行代码,在其内部 Trains 的服务器上建立并存储有见地的条目。
Trains 与任何 DL/ML 工作流程无缝集成。它自动将实验与训练代码(git commit + local diff + Python 包版本)链接起来,并自动以 Python 代码的形式存储 jupyter 笔记本。
火车的主要优势
- 易于集成。
- 为生产级深度学习模型做好了准备。
- 实验的自动记录。
- 资源监控(CPU/GPU 利用率、温度、IO、网络等。).
Polyaxon 是一个用于构建、培训和监控大规模深度学习应用的平台,为机器学习应用提供可重复性、自动化和可扩展性。支持 Tensorflow、MXNet、Caffe、PyTorch 等所有深度学习框架。
Polyaxon 提供节点管理和智能容器,实现深度学习模型的高效开发。
poly axon 的主要优点
- 为大规模生产级深度学习模型做好了准备。
- 支持几乎所有深度学习框架。
- 为机器学习应用程序提供可再现性、自动化和可扩展性。
Valhoai 是一个 MLOps 平台(管理 ML 生命周期的机器学习和操作的结合)。该工具通过自动化实验跟踪和基础设施管理,使数据科学家能够专注于构建定制模型。
瓦罗海的优势
Kubeflow 是一个基于开源机器学习 Kubernetes 的平台,用于开发、部署、管理和运行可扩展的机器学习工作流。
Kubeflow 提供创建交互式 Jupyter 笔记本、运行模型服务、运行模型培训、创建 ML 管道的服务。它还支持多种框架。
Kubeflow 提供 Kubernetes 自定义资源(CRD ),运行各种分布式和非分布式培训作业。其中一些如下:
- 张量流训练(TFJob)
- PyTorch 培训
- MXNet 培训
- MPI 培训
- 链式训练
Kubleflow 支持独立的模型服务系统和多框架模型服务。
多框架服务包括:
- kfserving 很少核心服务
- 本托尔
- 独立框架服务:
张量流服务
- 张量流批量预测
- NVIDIA Triton 推理服务
- kube flow 的优势
最后的想法
上面列出的工具将云的便利带到了本地基础设施,解决了项目期间可能遇到的大多数精确问题。所以,不要害怕,拿起你选择的武器,在你现有的基础设施上进行实验!
还有一个需要提及的本地基础设施的特征。云服务没有即时的可伸缩性。如果完成内部基础架构培训需要八个小时,您别无选择,只能等待。打个盹,做些伸展运动,读本书。内部基础架构有其优点!
Python 和机器学习讲师| probog.com 创始人
阅读下一篇
在 AILS 实验室建立可扩展的医学 ML 研究工作流程[案例研究]
8 分钟阅读| Ahmed Gad |发布于 2021 年 6 月 22 日
8 mins read | Ahmed Gad | Posted June 22, 2021
AILS Labs 是一个生物医学信息学研究小组,致力于使人类更加健康。这个任务就是建造模型,也许有一天可以拯救你的心脏病。它归结为应用机器学习来基于临床、成像和遗传学数据预测心血管疾病的发展。
四名全职和五名以上兼职团队成员。生物信息学家、内科医生、计算机科学家,许多人都有望获得博士学位。正经事。
虽然业务可能是一个错误的术语,因为面向用户的应用程序还没有在路线图上,但研究是主要的焦点。研究如此激烈,以至于需要一个定制的基础设施(花了大约一年时间建造)来从不同类型的数据中提取特征:
电子健康记录(EHR),
- 诊断和治疗信息(时间-事件回归方法),
- 图像(卷积神经网络),
- 结构化数据和心电图。
- 通过融合这些特征,精确的机器学习模型可以解决复杂的问题。在这种情况下,这是心血管一级预防的风险分层。本质上,它是关于预测哪些患者最有可能患心血管疾病。
AILS 实验室有一套完整的研究流程。每个目标都有七个阶段:
定义要解决的任务(例如,建立心血管疾病的风险模型)。
- 定义任务目标(例如,定义预期的实验结果)。
- 准备数据集。
- 使用 Jupyter 笔记本以交互模式处理数据集;快速试验,找出任务和数据集的最佳特性,用 R 或 Python 编码。
- 一旦项目规模扩大,使用像 Snakemake 或 Prefect 这样的工作流管理系统将工作转化为可管理的管道,并使其可重复。否则,复制工作流程或比较不同模型的成本会很高。
- 使用 Pytorch Lightning 与 Neptune 集成创建机器学习模型,其中应用了一些初始评估。记录实验数据。
- 最后,评估模型性能并检查使用不同特征和超参数集的效果。
- 扩大机器学习研究的 5 个问题
AILS Labs 最初是由一小群开发人员和研究人员组成的。一个人编写代码,另一个人审查代码。没有太多的实验。但是协作变得更具挑战性,随着新团队成员的到来,新问题开始出现:
数据隐私,
- 工作流程标准化,
- 特征和模型选择,
- 实验管理,
- 信息记录。
- Information logging.
顶级机器学习影响者——你需要知道的所有名字
原文:https://web.archive.org/web/https://neptune.ai/blog/top-machine-learning-influencers
没有所有伟大的头脑,机器学习是不可能的。如果没有他们,AI 不会如此先进,我们的生活也会看起来完全不同。
跟随机器学习的伟大头脑可以帮助你发现新事物,加深你的知识。向最优秀的科学家学习是令人着迷的。在他们当中,你会发现有影响力的人、老师、商业领袖等等。不可否认,他们的专业知识可以帮助改变世界,让世界变得更美好。
在这份名单上,你不仅会发现有影响力的人,还会发现数据科学界的知名人士。看看作为机器学习研究者应该知道的所有名字。学习并获得发现新事物的灵感!
1. Vladimir Vapnik
弗拉基米尔·诺姆维奇·万普尼克是 VAP Nik–Chervonenkis 统计学习理论的主要开发者之一,也是支持向量机方法和支持向量聚类算法的共同发明人。
Vapnik 教授于 1958 年在苏联撒马尔罕的乌兹别克国立大学获得数学硕士学位。从 1961 年到 1990 年,他在莫斯科控制科学研究所工作,成为计算机科学研究部门的负责人。1995 年,他被任命为皇家霍洛威大学计算机科学和统计学教授,随后加入新泽西州霍尔姆德尔的美国电话电报公司·贝尔实验室。Vladimir Vapnik 是机器学习领域的著名科学家。
哥伦比亚大学网站简介 || 维基百科
一定要听听 莱克斯·弗里德曼在 AI 播客上采访弗拉基米尔·瓦普尼克
还有,读一下 阿列克谢
2. Andrej Karpathy
特斯拉人工智能的高级总监,他领导的团队负责自动驾驶仪上的所有神经网络。此前,他是 OpenAI 的研究科学家,致力于计算机视觉、生成建模和强化学习方面的深度学习。Andrej Karpathy 获得了斯坦福大学的博士学位,在斯坦福大学,他与费-李非合作研究卷积/递归神经网络架构及其在计算机视觉、自然语言处理及其交叉领域的应用。
学术网站| |LinkedIn||Twitter|GitHub
3.格雷戈里·皮亚泰茨基-夏皮罗
Gregory Piatetsky-Shapiro 博士是 KDnuggets 的总裁。他是商业分析、数据挖掘和数据科学领域的知名专家,也是该领域的顶级影响者。他是 2018 年 LinkedIn 数据科学和分析顶级声音的第一名。Gregory 是 KDD(知识发现和数据挖掘会议)的联合创始人,也是 SIGKDD 的联合创始人和前任主席,SIGKDD 是一个专业的知识发现和数据挖掘组织。Gregory 发表了 60 多篇文章,并编辑了几本关于数据挖掘和知识发现的书籍和文集。
查看 格里高利·皮亚泰茨基-夏皮罗在 KDNuggets 上的出版物精选
Twitter| |LinkedIn||KD nuggets
4.艾丽·米勒
艾莉·米勒(Allie Miller)是亚马逊初创公司和风险投资的人工智能业务发展的美国主管,推动了世界上最伟大的人工智能公司的发展。
此前,Allie 是 IBM 有史以来最年轻的人工智能产品女性——领导跨计算机视觉、对话、数据和监管的大规模产品开发。
工作之外,Allie 正在改变人工智能的游戏。Allie 谈到了人工智能和世界各地的领域多样性,向欧洲委员会发表了讲话,起草了外国人工智能战略,并创建了八本指南,以教育企业如何建立成功的人工智能项目。
LinkedIn| |Twitter| |insta gram| |网站
5.Yann LeCun 先生
Yann LeCun 是脸书副总裁兼首席人工智能科学家,也是 NYU Courant 数学科学研究所和数据科学中心的银牌教授。
他是脸书人工智能研究所和 NYU 数据科学中心的创始主任。他获得了 ESIEE(巴黎)的工程文凭和索邦大学的博士学位。在多伦多完成博士后研究后,他于 1988 年加入美国电话电报公司·贝尔实验室,并于 1996 年加入美国电话电报公司实验室,担任图像处理研究主管。他于 2003 年加入 NYU 大学担任教授,2013 年加入脸书大学。
他的兴趣包括人工智能机器学习、计算机感知、机器人和计算神经科学。
他是 2018 年 ACM 图灵奖(与 Geoffrey Hinton 和 Yoshua Bengio 一起)的获得者,因为“概念和工程突破使深度神经网络成为计算的关键组成部分”,他是国家工程院的成员和荣誉骑士。
了解 Yann LeCun 有趣的工作,请听 Lex Fridman 在 AI 播客上采访 Yann le Cun
LinkedIn| |Twitter||网站| |Quora
6.费-李非
一名计算机科学家、非营利主管和作家。她是斯坦福大学的教授,也是斯坦福以人为中心的人工智能研究所和斯坦福视觉与学习实验室的联合主任。
她在 2013 年至 2018 年担任斯坦福人工智能实验室(SAIL)的主任。2017 年,她联合创立了 AI4ALL,这是一个致力于增加人工智能领域多样性和包容性的非营利组织。
她的研究专长包括人工智能(AI)、机器学习、深度学习、计算机视觉和认知神经科学。
她是 ImageNet 的首席科学家和首席研究员。
她被描述为“人工智能先驱”和“将人类引入人工智能的研究人员”。
费-李非被选入美国国家工程学院,这是工程师的最高专业荣誉之一。
7 .于尔根·施米特伯
一位计算机科学家,他在人工智能、深度学习和人工神经网络领域的工作最为著名。他是位于瑞士南部提契诺州卢加诺区曼诺的 Dalle Molle 人工智能研究所的联合主任。
他有时被称为“现代人工智能之父”,或者一度被称为“深度学习之父”。
Schmidhuber 在德国慕尼黑工业大学完成了他的本科学业。他从 2004 年到 2009 年一直在那里教书,后来成为瑞士卢加诺意大利大学的人工智能教授。
8.尼克·博斯特罗姆
尼克·博斯特伦是牛津大学的瑞典哲学家,因其在存在风险、人择原理、人类增强伦理、超智能风险和逆转测试方面的工作而闻名。
2011 年,他创立了关于未来技术影响的牛津马丁项目,并且是牛津大学人类未来研究所的创始主任。2009 年和 2015 年,他被列入《外交政策》的全球 100 大思想家名单。
博斯特罗姆是 200 多种出版物的作者,已经写了两本书,并参与编辑了另外两本书。他撰写的两本书是《人类偏见:科学和哲学中的观察选择效应》(2002 年)和《超级智能:路径、危险、策略》(2014 年)。《超级智能》是《纽约时报》的畅销书,由埃隆·马斯克和比尔·盖茨等人推荐,并帮助推广了“超级智能”一词。
9.当归林
Angelica Lim 博士拥有京都大学的智能科学博士学位和理学硕士学位,以及加拿大西蒙弗雷泽大学的计算机科学学士学位,辅修法语。作为软银和阿鲁迪巴机器人公司 Pepper 人形机器人项目的重要成员,她曾在谷歌圣莫尼卡、日本本田研究所和法国 I3S-CNRS 公司实习,担任软件工程师和研究员。
她从事机器人和人工智能研究超过 10 年,目前对智能系统的信号处理、机器学习和开发机器人感兴趣,尤其是在情感领域。她是 IEEE Spectrum Automaton Robotics 博客的四名记者之一,也是 TEDx Kyoto 2012(“关于设计用户友好的机器人”)和 TEDx KualaLumpur 2014(“机器人、情感和移情”)的发言人。
她是《国际合成情感杂志》的客座编辑,并获得了各种奖项,包括 CITEC 博士 HRI 研究优秀奖(2014 年)、IROS 娱乐机器人和系统 NTF 奖(2010 年)和谷歌加拿大 Anita Borg 奖学金(2008 年)。她上过 BBC,在 SXSW 和 TEDx 上做过演讲,主持过一个关于机器人的电视纪录片,最近还登上了福布斯 20 大人工智能女性排行榜。
10.法比奥·莫伊洛
法比奥·莫奥利是微软咨询与服务部门的负责人。哈佛大学、奇点大学、MIP 人工智能和人类智能 AI TEDx 的教师。在 Linkedin 和 Twitter 上拥有 250,000 多名粉丝,他主要关注人工智能和指数技术带来的机遇和挑战,包括社会和道德视角。
主要专业领域包括人工智能、数字平台、转型计划、精益运营、产品和服务创新等。
LinkedIn| |Twitter| |insta gram
11.吴恩达
商人、计算机科学家、投资者和作家。他专注于机器学习和人工智能。作为一名商人和投资者,Ng 共同创立并领导了 Google Brain,曾任百度副总裁兼首席科学家,将该公司的人工智能团队打造成了一个几千人的团队。
Ng 是斯坦福大学的兼职教授(前副教授和人工智能实验室主任)。Ng 也是在线教育的先驱,他共同创立了 Coursera 和 deeplearning.ai。通过他的在线课程,他成功地引领了许多“民主化深度学习”的努力,通过他的在线课程教授了超过 250 万名学生。
他是世界上最著名和最有影响力的计算机科学家之一,被《时代》杂志评为 2012 年 100 位最具影响力的人之一,并被《快速公司》评为 2014 年最具创造力的人。自 2018 年以来,他推出了人工智能基金,目前负责该基金,最初是一只 1.75 亿美元的投资基金,用于支持人工智能初创公司。他创立了 Landing AI,该公司提供人工智能驱动的 SaaS 产品和转型计划,以使企业成为尖端的人工智能公司。
12. Oriol Vinyals
Oriol Vinyals 是谷歌 DeepMind 的首席科学家,从事深度学习和人工智能领域的工作。在加入 DeepMind 之前,Oriol 是谷歌大脑团队的一员。
他拥有博士学位。他是 2016 年麻省理工学院 TR35 创新者奖的获得者。
他的一些贡献用于谷歌翻译、文本到语音转换和语音识别,每天处理数十亿次查询,他是 AlphaStar 项目的首席研究员,创建了一个代理,在星际争霸的游戏中击败了一名顶级专业人士,达到了大师级水平。
在 DeepMind,他继续致力于他感兴趣的领域,包括人工智能,特别强调机器学习、深度学习和强化学习。
Twitter| |LinkedIn|Google Research
13.礼萨·扎德
礼萨·扎德是 Matroid 的创始人兼首席执行官,也是斯坦福大学的兼职教授。他的工作重点是机器学习、分布式计算和离散应用数学。
他曾在微软和 Databricks 的技术顾问委员会任职,自 2005 年在谷歌人工智能研究团队工作以来,一直致力于机器学习。他的奖项包括 KDD 最佳论文奖和斯坦福大学的 Gene Golub 杰出论文奖。
14.本·戈尔策尔
Ben Goertzel 是一名人工智能研究员。Goertzel 是人工智能软件公司 Novamente LLC 董事长的首席科学家;OpenCog 基金会主席;奇点大学的顾问。他是机器智能研究所的研究主任。
他的研究工作涵盖人工智能、自然语言处理、认知科学、数据挖掘、机器学习、计算金融、生物信息学、虚拟世界和游戏等领域。他出版了十几本科学书籍、100 多篇技术论文和大量新闻文章。在进入软件行业之前,他在美国、澳大利亚和新西兰的几所大学的数学系、计算机系和认知科学系任教。
15.亚当·科茨
苹果公司董事。他于 2012 年获得斯坦福大学博士学位,并在 2017 年 9 月之前担任百度研究院硅谷人工智能实验室主任,然后在 2018 年之前担任科斯拉风险投资公司的运营合伙人。
在他的研究生生涯中,他共同开发了一架自主特技直升机,研究了家用机器人的感知系统和早期的大规模深度学习方法。他与斯坦福大学的一个团队开发了高性能计算系统的深度学习软件,用于无监督学习、物体检测和自动驾驶汽车。
之前的项目:百度深度语音,深度演讲。DL on COTS HPC,斯坦福 AI 机器人,斯坦福自主直升机。
16.柯克·伯恩
自 2013 年以来全球最具影响力的人物。数据科学家。全球发言人。顾问。天体物理学家。太空科学家。
大数据和数据科学顾问、TedX 演讲人、研究员、博客作者、数据素养倡导者。目前在马里兰州安纳波利斯 Junction 的 Booz Allen Hamilton 担任首席数据科学家和执行顾问。
17 .隆纳德·冯·隆纳
数据科学领域公认的专家和思想领袖,与数据驱动型公司合作,创造商业价值,使他们能够实现并超越一个又一个目标。
Ronald van Loon 在数字转型领域的工作得到了 Onalytica、Dataconomy 和 Klout 等出版物和组织的认可。除了这些认可,他还是许多领先的大数据网站的作者,包括《卫报》、《Datafloq》和《数据科学中心》,并且他经常在著名的活动和会议上发言。
18.诺姆·乔姆斯基
诺姆·乔姆斯基是美国语言学家、哲学家、认知科学家、历史学家、社会批评家和政治活动家。有时被称为“现代语言学之父”,乔姆斯基也是分析哲学的主要人物和认知科学领域的创始人之一。
他同时担任麻省理工学院(MIT)的荣誉退休教授和亚利桑那大学的荣誉教授,著有 100 多本关于语言学、战争、政治和大众媒体等主题的书籍。
如果你对自然语言处理和认知科学感兴趣,你应该追随诺姆·乔姆斯基。
听听 莱克斯·弗里德曼采访诺姆·乔姆斯基关于人工智能(AI)的语言、认知和深度学习播客
19.莱克斯·弗里德曼
Lex Fridman 的专业领域包括麻省理工学院和其他地方以人为中心的人工智能、深度学习、自动驾驶汽车和机器人的研究。此外,他还教授深度学习课程。
他因其人工智能播客而闻名,在该播客中,他与该领域最知名的科学家谈论所有与数据科学相关的话题。
网站 || 推特|LinkedIn|YouTube|insta gram
20.李开复
李开复博士是世界领先的人工智能专家之一,从事人工智能研究、开发和投资超过 30 年。李博士是 Sinovation Ventures 的董事长兼首席执行官,Sinovation 人工智能研究所所长,前谷歌中国总裁。
21.埃隆·马斯克
埃隆·马斯克(Elon Musk)共同创立并领导了特斯拉、SpaceX、Neuralink 和 The Boring Company。
此前,马斯克联合创立并出售了全球领先的互联网支付系统 PayPal 和首批互联网地图和方向服务之一的 Zip2。
虽然他的争议性观点众所周知,但他是世界上领先的人工智能影响者之一。
推特| |insta gram| |neural ink| |The Boring Company| |SpaceX| |特斯拉
22.伯纳德·马拉
他是世界知名的未来学家、影响者和商业和技术领域的思想领袖。他是 18 本畅销书的作者,为《福布斯》撰写定期专栏,并为许多世界上最知名的组织提供建议和指导。他在社交媒体上拥有 200 万名粉丝,被 LinkedIn 评为全球五大商业影响者之一,也是英国排名第一的商业影响者。
23.雷切尔·托马斯
瑞秋·托马斯(Rachel Thomas)是 fast.ai 的联合创始人,该公司创建了面向程序员的实用深度学习课程,有超过 20 万名学生参加了该课程,该课程已被《经济学人》、《麻省理工科技评论》和《福布斯》报道。她被福布斯选为人工智能领域 20 位杰出女性之一,在杜克大学获得数学博士学位,是优步大学的早期工程师。Rachel 是一位受欢迎的作家,也是数据伦理、人工智能可访问性和机器学习偏见等主题的主题演讲人。
24.穆斯塔法·西塞
穆斯塔法·西塞(Moustapha Cisse)是谷歌的一名研究科学家,也是加纳阿克拉谷歌人工智能中心的负责人,他在那里领导基础机器学习及其应用的研究工作,以解决复杂的社会挑战。
穆斯塔法也是非洲数学科学研究所的机器学习教授,他是非洲机器智能硕士项目的创始人和主任。他之前是脸书人工智能研究所的研究科学家。在此之前,他在法国皮埃尔和玛丽·居里大学完成了博士学位。
25.凯特·克劳福德
凯特·克劳福德是数据系统的社会影响、机器学习和人工智能领域的领先研究员和教授。她是纽约 MSR 大学的高级首席研究员,巴黎高等师范学院 AI 和司法的首任客座教授,墨尔本大学 Miegunyah 杰出客座研究员。
凯特是纽约大学 AI Now 研究所的联合创始人,该研究所是世界上第一个致力于研究人工智能和相关技术的社会影响的大学研究所。
26. Sam Altman
Sam Altman 是一名企业家、投资者、程序员和博客作者。他是 OpenAI 的首席执行官和 Y Combinator 的董事长,Y Combinator 是硅谷领先的创业加速器,帮助推出了 Reddit、Dropbox 和 Airbnb 等公司。他是许多公司的投资者,也是两家核能公司 Helion 和 Oklo 的董事会主席。
27.马丁·福特
他的书《机器人的崛起:技术和失业未来的威胁》是《纽约时报》的畅销书,并获得了 3 万英镑的《金融时报》和麦肯锡年度商业图书奖。
马丁·福特还是 Lyxor/法国兴业银行(股票代码 ROAI)新机器人和人工智能 ETF 的咨询人工智能专家,该基金专门关注投资将成为人工智能和机器人革命重要参与者的公司。他拥有密歇根大学安娜堡分校的计算机工程学位和加州大学洛杉矶分校的商学研究生学位。
28.亚历克西斯·康诺
Alexis Conneau 是巴黎脸书人工智能研究所的常驻博士生。
他专注于自然语言处理(NLP)的深度学习领域。具体来说,他正在使用神经网络研究可转移的文本表示。
Conneau 的研究兴趣包括自然语言理解、序列到序列学习和神经机器翻译。
LinkedIn| |Twitter| |谷歌学术的亚历克西斯·康诺
29.安德烈亚斯·迈尔
Andreas Maier 是德国纽伦堡大学模式识别实验室的 ML 研究员和教授。他开发了 PEAKS,这是第一个评估语言清晰度的在线工具。自 2016 年以来,他是欧洲时间机器联合会指导委员会的成员。
他目前的研究兴趣集中在医学成像、图像和音频处理、数字人文、可解释的机器学习以及已知算子的使用。
推特 || 网站 || 安德里亚斯·梅尔在谷歌学术
30.弗朗索瓦·乔列特
Franç ois Chollet 是一名软件工程师和人工智能研究员,目前在谷歌担任软件工程师。他是 Keras 的创始人,Keras 是 Python 的领先深度学习框架,也是《用 Python 进行深度学习》的作者。
他的主要兴趣涉及一般智能,使人工智能技术易于理解,帮助人们利用人工智能的全部潜力,以及理解和模拟人类认知发展的早期阶段。
LinkedIn| |Twitter| |网站 || 谷歌学术
31.杰弗里·辛顿
杰弗里·辛顿是麻省理工学院计算机科学系的名誉教授
多伦多大学。他还是谷歌的工程副总裁和 Vector Institute 的首席科学顾问。他是引入反向传播算法的研究人员之一,也是第一个使用反向传播学习单词嵌入的研究人员。他对神经网络研究的其他贡献包括波尔兹曼机器、分布式表示、延时神经网络、专家混合、变分学习和深度学习。他在多伦多的研究小组在深度学习方面取得了重大突破,使彻底改变了语音识别和对象分类。
杰弗里·辛顿(Geoffrey Hinton)是英国皇家学会的会员,也是美国国家工程学院和美国艺术科学院的外籍成员。
Hinton 与 Yoshua Bengio 和 Yann LeCun 一起获得了 2018 年图灵奖,以表彰他们在深度学习方面的工作。他们有时被称为【AI 教父】****【深度学习教父】。
32.戴密斯·哈萨比斯
戴密斯·哈萨比斯是一名人工智能研究员和神经科学家。他是 DeepMind 的首席执行官和联合创始人,自 2018 年以来一直是英国政府的人工智能顾问。他也是五次五心棋盘游戏冠军。哈萨比斯是全世界公认的该领域最聪明的思想家之一。
33.伊恩·古德费勒
Ian Goodfellow 是一名机器学习研究员。他是苹果公司特别项目组的机器学习主任。他之前是谷歌大脑的研究科学家。他是深度学习 教材 的作者。Goodfellow 在深度学习领域做出了几项贡献。
34.杰罗姆·比森特
Jerome Pesenti 是脸书人工智能团队的负责人,从事人工智能的基础和应用研究,并通过人工智能的使用使脸书产品对人们更安全、更有价值。在加入脸书之前,杰罗姆加入了 IBM,领导其沃森平台的开发,此前他联合创立的初创公司 Vivisimo 于 2012 年被该公司收购。他后来成为了 BenevolentTech 的首席执行官。
35.约舒阿·本吉奥
Yoshua Bengio 是公认的世界领先的人工智能专家之一,也是深度学习的先驱。自 1993 年以来,他一直是蒙特利尔大学计算机科学和运筹学系的教授。CIFAR 是机器和大脑学习计划的联合主任,他也是魁北克人工智能研究所 Mila 的创始人和科学主任,该研究所是世界上最大的基于大学的深度学习研究小组。
2019 年,他与 Geoffrey Hinton 和 Yann LeCun 一起获得了 ACM A.M .图灵奖,“计算的诺贝尔奖”,以表彰在概念和工程上的突破,这些突破使深度神经网络成为计算的关键组成部分。
请确保关注这些有影响力的人,了解最新的机器学习新闻,获得灵感,并学习新的精彩内容。
你还关注哪些机器学习的影响者?
作为数据科学家,你想查看的 12 个机器学习播客
原文:https://web.archive.org/web/https://neptune.ai/blog/top-machine-learning-podcasts
众所周知,在这个数字时代,教育有多种形式,如视频、pdf、电子书和播客。播客在学生或学习者中变得越来越受欢迎,因为电子设备易于访问,并且能够在听众和演讲者之间建立良好的联系。
“播客的媒介和它的个人性质,你与听众建立的关系以及他们与你的关系——他们可能只是坐在那里,笑着听着……没有什么比这更好的了。”
马克·马龙
在这篇文章中,我们将涵盖作为数据科学家你应该看看的 12 大播客。
1.作为软件工程师的机器学习
Source: paperspace.com
这篇对话是与 paperspace 、T3、Dillion Erb、的联合创始人兼首席执行官的对话。Paperspace 为数据科学家和机器学习工程师提供支持 GPU 的计算资源。Dillion 解释了他们如何建立一个组织来帮助建立和扩展机器学习工作流。
主持人: 山姆·查林顿
嘉宾: 迪里昂·埃尔布
2.新冠肺炎和心理健康 NLP
疫情(新冠肺炎)正在进行,新冠肺炎病例自 2019 年 12 月以来飙升。病例越多,我们掌握的病人数据就越多。在本播客中,斯坦福大学心理学助理教授 Johannes Eichstaedt 讲述了如何利用 Twitter 和脸书等社交媒体数据来理解大量人群和个人的心理行为。
主持人: 山姆·查林顿
嘉宾:****
**## 3.用于无线通信的神经增强
在本播客中, 麦克斯·韦林 ,阿姆斯特丹大学机器学习研究主席,高通技术副总裁,提出了一种叫做神经增强的原理。
在神经增强中,我们利用深度学习的力量来学习通过简单的人类观察不可能检测到的模式。因此,我们训练一个神经网络,通过使用这三个原则来迭代地修正经典解。
- 误差估计
- MIMO 解调
- 信道估计
你可以在这个 PDF 中了解更多关于神经增强的信息。
主持人: 山姆·查林顿
嘉宾: 麦克斯·韦林
4.量子机器学习
量子机器学习 是量子物理学和机器学习的交叉。
量子计算机使用 量子比特 。量子位被添加了进入叠加态的能力,并彼此共享纠缠态。
通过利用技术叠加和纠缠,量子计算机可以执行标准计算机难以处理的量子操作。
在这段播客中,约尔达尼什·克里尼迪斯是 CNRS 的高级研究员,在 IRIF 大学算法和复杂性小组工作,他探索了量子机器学习的可能性。
主持人: 山姆·查林顿
嘉宾:
5.扰乱 DeepFakes
Deepfake 可以生成一个人说或做的真实或令人信服的假视频,这些视频可能从未在现实生活中发生过。你可以想象或者不可以想象这会造成多大的混乱。
为了防止恶意用户对这种图像翻译系统产生敌对攻击,这种攻击破坏了最终的输出图像。这个问题被称为扰乱 Deepfakes 。
在本播客中, Nataniel Ruiz 是波斯顿大学二年级博士生,在图像&视频计算小组中讨论了扰乱深度假的概念。
主持人: 山姆·查林顿
嘉宾:
6.人工智能和计算机图形学的交叉
英伟达 GPU 和深度学习训练了一个神经网络,直接从演员视频中制作面部动画。它只需要五分钟的训练数据。经过训练的网络从视频中生成整个游戏所需的所有面部动画。
在本播客中, 英伟达实时渲染研究高级总监亚伦·勒芬 将讲述如何利用人工智能的力量从演员视频中生成面部动画视频。
主持人:诺亚·克雷维茨
嘉宾:亚伦·勒芬
7.神经网络、数学和教学
Grant Sanderson 是 YouTube 上的一名教育家,他将数学可视化,这有助于在更深层次上理解数学。
在本播客中, Grant 将给出他对机器学习和数学之间合作的见解。格兰特还将讲述他是如何受到美国著名物理学家理查德·费曼的教学风格的启发。
主持人:莱克斯·弗里德曼
嘉宾:格兰特·桑德森
8.让 Waymo 进入自动驾驶
Waymo 是一家自动驾驶技术开发公司。它是谷歌母公司 Alphabet Inc 的子公司。 Waymo 在亚利桑那州凤凰城运营一项名为“Waymo One”的商业自动驾驶出租车服务。
在本播客中, Drago Anguelov 是首席科学家和 Waymo 的研究负责人,他将通过向主持人解释自动驾驶的算法来谈论人工智能自动驾驶。
主机:
客人:
9.预测洪水
在人工智能的帮助下,我们可以提出一个数学模型,用过去的降雨量和水位数据进行训练,这可以帮助我们为危机做好准备,以将危机的损害降至最低。
Source: Google Research
在接下来的播客中, Sella Nevo 在谷歌研究团队工作,从事洪水预报项目。Sella 将谈论淹没模型、实时水位测量、高程图创建、水力建模。
主持人:凯瑟琳·科尔曼&尼尔·阿姆斯
嘉宾: 塞拉涅沃
10.人工智能和“真正”智能的区别
智力可以被称为推理、解决问题或学习的心理能力。因为它依赖于我们大脑的认知功能。现在在这个数字时代,我们还创造了一个术语叫做人工智能,它是在数学模型的帮助下,通过训练数据而获得的。
在本期播客中, 安德鲁·布西 一位美国企业家谈论了“真正的”智能和人工智能之间的区别。
主持人: 拜伦李斯
嘉宾: 安德鲁·布西
11.对人工智能驱动的医疗助理的现实检查
生物医学数据帮助研究人员建立数学模型,以实现医疗保健过程的自动化。例如,我们可以使用计算机视觉通过输入 x 光图像来检测病人是否患有肺炎。
在本播客中,公民分析研发部的数据科学家凯蒂·马龙谈论了计算机视觉等算法,一种用于诊断糖尿病视网膜病变,另一种用于对肝癌进行分类。
主持人: 本·贾菲
嘉宾: 凯蒂·马龙
12.犯罪学和数据科学
随着技术的发展,我们的城市越来越多地被高科技安全所控制。这为城市提供了全天实时信息的来源。
例如,如果我们在抢链视频上训练一个机器学习模型,那么我们可以在实时环境中使用该模型进行推理,以检测某人的链是否被抢。
在本播客中,扎克·德雷克是犯罪学、法律和社会专业的博士生,他与主持人 凯蒂·马龙 一起传授人工智能和犯罪学合作的知识。
主持人: 凯蒂·马龙
嘉宾:扎克·德雷克
在所有这些播客之后,你可能会对学习数据科学感兴趣。所以我列出了你可以免费学习机器学习的资源。
最后的想法
人工智能正在成为许多企业的新石油,我们所涵盖的只是冰山一角,所以你最好利用人工智能咒语的知识来让这个世界变得更好。
AI is becoming the new oil for many businesses and what we cover was just the tip of the iceberg,so you better harness yourself with the knowledge of the AI spells to make this world a better place.**
2021 年值得关注的顶级机器学习初创公司
原文:https://web.archive.org/web/https://neptune.ai/blog/top-machine-learning-startups-to-watch
机器学习已经走过了漫长的道路。经过几十年的研究,机器学习在 2012 年成为主流,当时一个人工智能解决方案以 10.8%的巨大优势赢得了 ImageNet 挑战赛,比亚军得分高出 41%。
2012 年之前,机器学习在商业世界中的使用非常有限,但自繁荣以来,机器学习的依赖性已呈指数增长。根据 Crunchbase 的说法,今天有 9k+机器学习创业公司和公司。
有人说,在人工智能和人工智能的世界里,技术进步的速度与前人工智能时代相比是极端的。我们新的远程工作文化只是为机器学习研究的加速添加了更多的燃料。新的人工智能模式做了一年前都没有想到的事情,这催生了一些令人兴奋的初创公司,值得在 2021 年关注。
但首先,我们需要决定如何对不同的机器学习初创公司和公司进行排名:
- 结果和表现–这是显而易见的。改变游戏规则的结果和卓越的性能是每个首席信息官的梦想。产生好结果的很大一部分是输入 ML 解决方案的数据质量。如果一个 ML 解决方案提供挖掘多余的数据来整合你的可用数据,那是 ML 蛋糕上的一颗樱桃。更多的数据导致更好的准确趋势识别的可能性。性能取决于解决方案提供商服务器的优化和处理能力。
- 与您的框架轻松集成–每个科技公司都有一个科技框架。对于创业公司来说,这些框架应该是灵活和宽松的。对于老公司来说,传统的(通常是整体的)系统构成了大部分框架。因此,根据需求并在评估当前框架后,我们可以决定集成是否容易。顶级的 ML 解决方案将覆盖最广泛的领域。
- 易于管理–少即是多。以苹果产品的美学设计为例。尽管这些产品是最不杂乱和最简单的,但它们给用户带来了最大的满足感。类似地,以最少混乱交付价值的 ML 解决方案通常是最佳选择。仪表盘、简洁的用户界面和智能链接可以让一切变得不同。此外,如果它是一个团队使用的工具,任务分配和管理概述等设施可以是很好的附加功能。
- 与相关第三方工具的轻松集成-机器学习不断发展。每隔一天就会有一些惊人的突破,让数据科学家们迅速抓住。类似地,每隔几个月就会有新的技术和工具进入标准的 ML 工具集。一个好的 ML 解决方案应该具有随时间发展其集成能力的灵活性,并且应该有一个标准的集成集随时可用。
现在我们已经讨论了这个问题,让我们继续我们的列表吧!
2021 年最值得关注的 15 家机器学习初创公司排名
有很多初创公司提供有趣的 ML 解决方案,符合我们的标准,所以我试图专注于那些最有趣的,但可能不如 FAANG 相关的 ML 项目受欢迎的项目。
只有当人工智能发挥作用时,网络安全才能得到改善,DataVisor 已经证明了这一点。DataVisor 是一个 AI/ML 解决方案,用于在平台层面提高欺诈检测的准确性。它有一个动态的(不断发展的)数据库,包含来自世界各地的超过 42 亿个用户帐户。在这些数据和专有的无监督机器学习模型的帮助下,DataVisor 提供了具有高价值结果的实时学习。它通过挖掘人类或传统系统不会注意到的微妙数据模式,在欺诈发生前检测到欺诈。DataVisor 的客户主要是金融服务、电子商务平台、市场和社交平台——这些公司需要防范金融灾难和声誉损害。
互联网已经成为一个内容中心,人们(潜在客户)愿意以文本、照片和视频等格式分享他们的故事、怪癖和偏好。这种情况下最难解决的问题是视频。根据 Delta AI 的说法,通常基于文本的搜索中,85%的给定视频是模糊的。这就是 Delta AI 采用先进的计算机视觉技术的原因,利用类似的内容来理解产品在自然环境中的外观。这种纯粹通过潜在客户使用的产品来了解他们的新方法有望比传统的客户细分技术更有效。
Particle 是一个物联网平台,由遍布 170 多个国家的 200,000 名开发人员组成的庞大社区提供支持。这是一个端到端的平台,结合了硬件(物联网细分市场)、软件和人工智能功能,以创建强大的物联网网络。Particle 的客户群包括各种创业公司和组织,包括 Jacuzzi、Opti、Continental Tires、Anderson EV、Watsco 和 Shifted Energy。
Reekon 提供了一个利基解决方案,优化了电子商务平台上的 IT 客户查询和电子票证的支持功能。随着数字客户-卖家关系的数量不断增长,围绕这种关系的问题也在不断增加。因此,AI 作为速度和质量的冠军,是这种情况下的当务之急。Reekon 研究过去的查询和解决方案的历史数据,以找到最适合新查询的解决方案。更重要的是,它可以轻松地与多个客户服务平台集成,如 FreshDesk、Zendesk 和 WooCommerce。
Savvie 是一家独特的基于人工智能的初创公司,支持面包店和咖啡馆老板提高他们的底线。这是通过考虑大量的历史数据来实现的,这些数据建议所有者可以执行的行动,以将可预测的冲击转移到底线。此外,鉴于当前形势对食品行业造成了严重影响,面包店和咖啡馆的老板可以根据 Savvie 通过其 ML 模型提供的数据驱动模式和见解重塑其业务战略。
在哈佛商学院的“真实世界数据分析景观”报告中,CloseLoop.ai 被评为加速最快的公司之一。这是一个革命性的平台,利用数据和机器学习的力量支持医疗保健组织解决各种挑战。它的建议基于医疗保健特定模型和特征库。该平台上的预建模型可以进行定制,以满足医疗机构客户的特定需求。
ClosedLoop.ai 提供的一些服务包括入院和再入院预测、避免失约、总风险和总利用率预测、慢性病发作预测等——这是一套非常令人印象深刻的解决方案。
Alation 是首款将数据目录推向市场的解决方案。该公司的主要目标是改变人们寻找和信任数据源的方式,从而使人工智能和机器学习的世界更加数据流畅和高效。有了更多的数据,就有可能捕捉到更多相关的趋势。包括辉瑞和易贝等顶级品牌在内的 100 多家组织都在利用 Alation 的能力。
想象一下,有一个老师可以适应你的特定学习需求,并通过一条为你完美设计的学习路线来帮助你成长!这就是重写如何革新教育。它们提供了一个自适应的学习平台,可以评估学习者的行为、优势和劣势,并相应地简化学习进度。还可以查看对学习者进步的详细分析。此外,在新的远程教育文化中,重写可能是当务之急,在这种文化中,学生几乎无法获得一对一的实时指导。人工智能是帮助缩小这一差距和解决关键教育挑战的支柱。
Anodot 已经在游戏中存在很长时间了——从 2014 年开始。Anodot 使用分析和人工智能来监控业务数据,并提供实时警报和见解。Anodot 在金融科技、电子商务、游戏和广告科技等行业拥有超过 100 家客户,其一些顶级客户包括微软、King 和 Waze。Anodot 提供的顶级服务包括客户体验监控、电信网络监控、收入监控和合作伙伴监控。
Zest.ai 是一个人工智能平台,通过识别借款人的信用适合度来支持金融行业的企业。对借款人的评估由 Zest 自动机器学习系统(ZAML)执行。它研究一个人的财务数据,并表明他们作为借款人有多可靠。这不仅有助于贷款人通过向可靠的借款人收取适当的利息来增加公司的收入,而且还降低了风险,加快了信贷审批和评估的整个过程,提高了整体效率。
Prolifics 通过掌控客户的数字未来来振兴客户关系。Prolifics 成立于 1978 年,拥有悠久的历史,这使得它能够了解客户的期望和需求等动态。Prolifics 利用其庞大的数据存储库以及与云、开发运维、业务自动化、分析和质量保证相关的功能,确保交付成果为客户带来高质量的体验。该公司提供咨询,以使您的业务需求与机器学习、人工智能、自动化和网络安全等新兴技术保持一致。
Argo 在建立自动驾驶汽车的基础方面发挥着关键作用。Argo AI 是一个自动驾驶技术平台 Argo,它构建软件、硬件、云支持基础设施和地图,为自动驾驶汽车提供动力。Argo 正在与顶级汽车制造商合作,将 Argo AI 集成到他们的车辆中。这是老牌汽车制造商在制造高质量车辆方面的专业知识与 Argo 在机器人和人工智能方面的专业知识的独特结合。具有高分辨率、远程传感和 360 度感知能力的 Argo 激光雷达的推出,使 Argo AI 在自主交付和乘车服务领域占据了优势。
8topuz 为散户投资者提供全自动解决方案,最大限度地降低他们在交易活动中的风险。它承诺通过自动化处理大量交易数据来完成计算最佳投资路线的重任。自 2016 年以来,8topuz 一直以每月平均为其用户提供 3%的投资回报率而闻名,鉴于 8topuz 团队在金融领域拥有 13 年以上的经验,这并不令人惊讶——涵盖银行、金融科技和投资。
Luminance 是律师和法律专家的领先人工智能平台。它的法律推理转换引擎(LITE)用于快速解析和分析法律文档。LITE 是推理、深度学习、自然语言处理和模式识别等机器学习技术的结合。luminance 突出的特性是它能够结合有监督和无监督的学习技术来处理文档。这使得它成为分析法律文件最可靠的人工智能平台之一。
Dataiku 是一家领先的机器学习初创公司,专门为商业应用提供预测建模软件。该平台旨在提供所有元素,使数据工程师、数据科学家和数据分析师等人工智能相关专家能够利用自助分析。Dataiku 拥有康卡斯特、联合利华和通用电气等顶级品牌的客户。最有趣的是,Dataiku 在数据科学和 ML 平台的魔力象限中两次成为 Gartner 的领导者,并且在 Alphabet Inc .中也有一个值得注意的投资者。所有这些都意味着它是一家值得关注的公司。
Neptune–将人工智能/人工智能项目推向新的高度
随着模型和超参数在不断发展的数据上的多次迭代,机器学习解决方案可以变得广泛。因此,记录每一个步骤和每一个结果是至关重要的,这样就可以很容易地恢复或回滚到最佳迭代。Neptune.ai 提出了一个革命性的解决方案,可以在一个地方自动记录所有模型构建元数据。人们不仅可以记录、存储、显示和比较模型元数据,而且最有趣的是还可以对它们进行查询。随着企业和学术界的数据科学和 ML 团队的激增,这个平台非常符合需求曲线。它是沉迷于大量实验的研究和生产团队的理想选择。纽约客、deepsense.ai 和罗氏只是海王星独家客户中的几个名字。
探索 Neptune 的特性,看看它是否是适合你工作流程的工具。
如果你觉得上面的列表很有见地,你肯定会喜欢看一看 CB Insights 的 2021 年年度人工智能 100 强名单,这是在对 6000 家人工智能公司进行广泛研究后策划的。最佳选择的标准包括研发活动、技术新颖性、商业关系、投资者概况、新闻情绪分析、专有马赛克分数、市场潜力、竞争格局和团队实力等因素。
有前途的私营公司已经从 12 个国家和 18 个行业入围,如 CPG、医疗保健、法律、游戏、生态等!这份名单上的一些供应商也来自从事人工智能部署、数据管道和数据处理工具的计算领域,并且 Neptune.ai 很自豪和荣幸能够入选这些公司。
摘要
这个列表并不详尽。许多即将到来的创业公司正在进行突破性的创新,并以独特的方式影响着各个行业。
我们可以吸取的主要教训是,人工智能已经渗透到大多数主要行业。非人工智能初创公司和公司已经开始探索这项技术,甚至与上述基于人工智能的公司合作,以利用数据和优化统计的巨大潜力——换句话说,这是一种叫做机器学习的酷东西。
为了获得更多见解,你还可以访问 2021 年的几个顶级机器学习会议或者查看一些关于机器学习和人工智能的惊人的书籍和播客。如果你想快速找到一些东西,你可以随时访问 AI/ML 上一些最新的博客和资源,这些博客和资源以质量和新近度为最高标准。
适用于您的 ML 工作流的顶级模型版本管理工具
原文:https://web.archive.org/web/https://neptune.ai/blog/top-model-versioning-tools
最近,机器学习由于其能够指导企业做出精确和准确的决策而变得越来越重要。在引擎盖下,机器学习是一个迭代和重复的过程。完成一系列训练工作以优化模型的预测性能。
如果没有正确的方法,很容易失去对训练数据集、超参数、评估指标和模型工件的实验跟踪。当你需要重现一个实验时,从长远来看这可能是有问题的。
在本文中,我将讨论我的6 大模型版本化工具,它们可以极大地改进您的工作流。具体来说,本文的大纲如下:
- 什么是模型版本控制,为什么它如此重要?
- 模型版本控制与数据版本控制
- 什么工具可以用于模型版本控制
- 这些工具之间的比较如何?
什么是模型版本控制,为什么它如此重要?
模型版本化在某种程度上涉及到跟踪对先前构建的 ML 模型所做的变更。换句话说,它是对 ML 模型的配置进行更改的过程。从另一个角度来看,我们可以将模型版本化视为一个特性,它可以帮助机器学习工程师、数据科学家和相关人员创建并保留同一个模型的多个版本。
可以把它看作是记录您通过调整超参数、用更多数据重新训练模型等对模型所做的更改的一种方式。
在模型版本化中,许多东西需要被版本化,以帮助我们跟踪重要的变更。我将在下面列出并解释它们:
- 实现代码:从模型构建的早期到优化阶段,代码或者在这种情况下模型的源代码起着重要的作用。这些代码在优化阶段经历了重大的变化,如果跟踪不当,这些变化很容易丢失。因此,代码是模型版本化过程中要考虑的事情之一。
- 数据:在某些情况下,在模型优化阶段,训练数据确实比其初始状态有显著改善。这可能是从现有特征中设计新特征来训练我们的模型的结果。还有元数据(关于你的训练数据和模型的数据)需要考虑版本化。元数据可以在不同的时间发生变化,而定型数据实际上不会发生变化。我们需要能够通过版本控制来跟踪这些变化
- 模型:模型是前两个实体的产品,如其解释中所述,ML 模型通过超参数设置、模型工件和学习系数在优化阶段的不同点发生变化。版本控制有助于记录机器学习模型的不同版本。
现在,我们已经定义了模型版本化和需要版本化的实体。但概念有什么好大惊小怪的?它如何帮助我们改进预测模型?
模型版本化的优势
- 模型版本控制帮助我们跟踪实现代码和我们构建的模型,因此我们可以正确地跟踪开发周期(在项目协作时非常重要)。
- 模型版本可以有相应的开发代码和性能描述(带有评估指标)。我们可以知道提高或降低模型性能的依赖关系。
- 模型版本化简化了模型开发的过程,有助于人工智能的责任性(最近这个领域的许多公司试图填补这个空白),治理和责任性。这对于自动驾驶汽车、人工智能驱动的健康应用或股票交易应用中使用的基于神经网络的模型尤为重要。
模型版本控制与数据版本控制
在某些情况下,模型和数据版本之间的差异非常明显。在其他时候,数据从业者可能会对这些区别感到困惑,并在某种程度上互换使用这些术语。
如上所述,模型版本化指的是跟踪变更,在某些情况下,是对模型的改进。这些变化可能由于优化工作、训练数据的变化等而发生。有关模型版本化的图示,请参见下图。在此图中,我们看到不同的车型版本有不同的 F1_scores。ML 工程师或数据科学家必须试验不同的超参数来改进度量。
Pictorial illustration of model versioning | Source
另一方面,数据版本化涉及跟踪更改,但这次是对数据集的更改。由于特征工程工作、季节性等因素,您处理的数据往往会随时间而变化。发生这种情况的一个例子是当原始数据集被重新处理、校正或者甚至追加到附加数据时。所以,追踪这些变化是很重要的。更好的解释见下图
Pictorial illustration of data versioning | Source
在上图中,我们可以看到数据是如何变化的。这些变化中的每一个都会产生一个新版本的数据,这个数据必须被存储。
要点:模型版本化是 MLOps 的一个重要方面,它涉及到对您的模型进行变更并跟踪变更。实现代码、训练数据和模型是在版本化过程中应该考虑的实体。最后,模型版本化不同于数据版本化,它们意味着完全不同的东西。
在这里,我将讨论六种不同的模型版本化工具,概述入门步骤和它们不同的功能。
Neptune AI 是一个 MLOps 工具,允许你跟踪和比较模型版本。它主要是为 ML 和数据科学团队运行和跟踪实验而构建的。该平台允许您存储、版本化、查询和组织模型及相关元数据。具体来说,您可以存储和版本化诸如您的训练数据、代码、环境配置版本、参数、超参数和评估度量、测试集预测等。
下面是 Neptune 的模型注册界面的截图,你可以在这里存储关于你的模型的元数据。
Neptune’s model registry UI | Source
除了模型注册表和元数据存储之外,Neptune AI 还有一个易于使用的接口,用于比较您的模型的性能。在下图中,我们可以看到不同的 Keras 模型在训练和验证准确性方面的比较,以及创建和修改所花费的时间。
Neptune’s comparison UI | Source
使用 Neptune AI 进行模型版本控制的一个额外优势是能够重新运行训练作业。Neptune AI 允许您通过重新运行您的实现代码来重新运行过去的培训工作(这是您应该版本化的事情的一部分)。下面的图片解释了这是如何实现的:
Neptune’s code versioning UI | Source
关键要点: Neptune AI 作为一个 MLOps 工具,允许您试验超参数&根据评估指标比较模型版本,存储模型工件和元数据,训练数据的版本和实现代码。Neptune AI 具有能够重新运行训练作业的额外优势(因为期望的实现代码已经被版本化)。
ModelDB 是一个开源的 MLOps 工具,它允许您对实现代码、数据和模型工件进行版本化。它允许您管理在不同编程语言(python、C、Java 等)的本地环境和配置中构建的模型和管道。通过您的 IDE 或开发环境,使用 ModelDB 进行模型版本控制很容易。
使用 Model DB 的第一步是确保它在 docker 中运行。通过将存储库克隆到您的本地并运行以下命令,您可以很容易地做到这一点:
Clone Model DB repository | Source
在此之后,您需要做的就是实例化或设置一个 modelDB 项目,使用:
*ModelDB project setup | Source *
将您的培训数据版本化:
*Training data versioning | Source *
之后,您可以运行实验并存储度量、模型工件、超参数,并访问 web 界面来查看您已经版本化的项目。以下是网络用户界面的快照:
要点: ModelDB 是一个开源的 ML 工具(标志着更多的支持和高质量的软件),它允许你版本化实现代码、数据集和模型版本。它是语言无关的,允许您在它们的本地环境中使用各种编程语言。
DVC,也称为数据版本控制,是一个开源的 MLOps 工具,允许你做版本控制,无论选择什么编程语言。有了类似 git 的体验,DVC 允许你以一种简单、快速和有效的方式对你的训练集、模型工件和元数据进行版本化。通过连接 Amazon s3、Google Drive、Google 云存储等,在 DVC 存储大文件是可能的。
DVC 的部分特性和功能包括通过命令列出所有模型版本分支及其相关指标值的指标跟踪,相关步骤的 ML 管道框架,语言无关的框架(无论您的实现代码是什么语言,您仍然可以使用它),跟踪故障的能力等等。
在使用 DVC 时,第一步是确保它已安装。您可以通过执行以下操作来实现这一点:
下一步是准备好您的实现代码,用 venv 模块创建一个虚拟环境,安装依赖项和需求,然后开始训练您的模型。在你的模型被训练之后,你现在能版本。对于 DVC 来说,版本化就像使用 DVC 的 add git 命令来版本化你的数据、模型和相关的东西一样简单。以下是显示如何使用该命令的示例代码:
关键要点: DVC 在 ML 模型版本化方面提供了类似 git 的体验。有了这个工具,您就能够跟踪评估指标,为必要的预处理和训练步骤开发一个管道/框架,并能够跟踪故障。
️检查 DVC 和海王星的对比
MLFlow 是一个开源项目,允许机器学习工程师管理 ML 生命周期。像其他平台一样,MLFlow 允许您对数据和模型进行版本化,重新打包代码以进行可重复运行。该平台与许多 ML 库和工具集成良好,如 TensorFlow、Pytorch、XGBoost 以及 Apache Spark。
MLFlow 提供了四种不同的功能。其中包括:
- MLFlow 跟踪:通过记录参数、度量、代码版本和输出文件来跟踪实验。通过 Python,JAVA APIs 等进行日志和查询实验。
- MLFlow 项目:遵循编码约定,以可重现的方式组织实现代码。有了这个,你可以重新运行你的代码。
- MLFlow 模型:以标准化的方式封装 ML 模型。这样,您的模型就可以通过 REST API 使用或交互。使用 Apache spark 也可以进行批量预测
- 模型注册:在这里,您可以对您的模型进行版本化,并拥有一个描述模型开发生命周期的模型谱系。
使用 MLFlow 对模型进行版本控制非常容易。对此的要求是,你已经注册了模型的第一个版本。有关相关的用户界面,请参见下文
MLflow data versioning | Source
在这里,您可以注册模型的名称,并上传相关的元数据和模型如何工作的文档。注册一个模型版本同样简单,并且可以在同一个页面上完成。当您单击 Register model 时,您可以通过下拉菜单指出您的新版本所属的型号。更多解释见下面的用户界面
MLflow model name registration | Source
通过有限的几行代码就可以获取您之前版本化的模型。请参见下面的示例:
MLflow fetching a model | Source
要点: MLFlow 是用于模型版本控制的顶级 MLOps 工具之一。使用 ML Flow,您能够以可重现的方式记录实验和组织实现代码,并通过模型版本注册开发模型谱系(模型开发历史)
️查一个深度对比: MLflow vs 海王星
Pachyderm 是一个数据和模型版本化平台,可以帮助数据科学家和机器学习工程师以有序的方式存储不同版本的训练数据,为您提供数据经历不同变化的可追溯性。该工具在 ML 工作流中的四个检查点上工作:数据准备、实验(用不同版本的数据训练您的模型,设置不同的超参数,并确定合适的指标)、训练和部署到生产中。
使用 Pachyderm 进行数据准备基本上包括从数据源摄取、处理和转换、模型训练和服务。使用 pachyderm,您可以将所有数据放在一个位置,组织数据的更新版本,运行数据转换作业(要求它在 docker 中运行)并保留数据的版本。
Pachyderm 运行在 Kubernetes 集群之上,在 Amazon s3 上存储数据和工件。安装和初始化 Pachyderm 从一些需要满足的依赖/需求开始。第一个是添加家酿 tap,允许您接入不同的存储库。您可以在您的终端中使用以下代码行来实现这一点:
Pachyderm installation | Source
之后,在本地安装组件并在 Kubernetes 集群上部署 pachyderm:
Pachyderm installation | Source
Pachyderm installation | Source
您可以使用以下代码行在 Pachyderm 中创建存储库来存储代码和模型工件: pachctl create-repo iris 。将文件提交到这个存储库中非常简单:pach CTL put-file iris master/raw/iris _ 1 . CSV-f data/raw/iris _ 1 . CSV
要点: Pachyderm 允许您有序地存储不同版本的训练数据和模型。您还可以在 Amazon s3 上运行实验和存储工件。
Polyaxon 是一个为可扩展和可复制的功能提供机器学习包和算法的平台。Polyaxon 号称运行所有机器学习和深度学习库,如 Tensorflow、Scikit Learn 等,让你可以高效地将想法推向生产。关于模型版本化,Polyaxon 提供了实验、模型注册和管理以及自动化功能。使用 Polyaxon 进行模型版本控制的第一步是安装。这可以通过下面这行代码实现: $ pip install -U polyaxon 。
使用 Polyaxon 进行实验,您可以预处理训练数据并训练您的模型,运行性能分析以可视化指标和性能,运行笔记本电脑和 tensorboards。通过一个易于使用的界面,Polyaxon 允许您可视化评估和性能指标,如下所示:
Polyaxon’s visualizations UI | Source
要点: Polyaxon 是你应该拥有的 MLOps 工具之一。它能够运行主要的 ML 库和包,如 Tensorflow、scikit learn。您还可以跟踪和可视化评估指标。
️这里有一个详细的比较多轴和海王星
在本节中,我将概述在为您寻找合适的 MLOps 工具时需要注意的一些特征和功能。
清单上的第一项是定价。Neptune AI、Pachyderm 和 Polyaxon 有特殊的定价计划。虽然相对便宜,但无法与提供免费服务的 MLflow、ModelDB 和 DVC 相比。这些工具都是开源的,但是它们确实有间接的成本,比如自己安装和维护。所以,在选择工具的时候,你要决定哪个选项更适合你。
另一件要注意的事情是比较功能:比较不同模型版本的评估指标的能力。上面列出的所有工具都提供了这一点。然而,Pachyderm 更进一步,让用户能够比较模型管道,并看到不同的变化。
你也可以检查哪种版本控制系统最适合你。
请参见下表,该表解释了这些模型版本化工具之间的相互比较。
能力 | 海王星 AI | ModelDB | DVC | MLFlow | 迟钝的人 | 多轴 |
---|---|---|---|---|---|---|
免费/付费
依赖
于计划
| | | | | |
|
版本类型
控制系统
| | | | | | |
| |
托管
云服务
(不开源)
| | | | | |
|
支持大型
文件和构件
| | | | | | |
|
模型注册表
&可重现
实验
| | | | | | |
|
对比评价
指标&型号
性能
| | | | | | |
| | | | | | | |
模型版本化工具对比|来源:作者
如果不做模型版本控制,会出什么问题?
模型版本化是 MLOps 过程的重要部分。之前我们谈到了模型版本化的重要性。在这里,我们将看看没有对您的 ML 模型进行版本控制的后果,真正可能出错的是什么:
- 错误的实现代码:实现代码是模型版本化过程中要版本化的实体的一部分。如果没有模型版本控制,或者在这种情况下没有实现代码的版本控制,就会有丢失有价值的实现代码的倾向。这样做的一个主要缺点是不能重复实验。
- 将半生不熟的模型推向生产:不管喜欢与否,模型版本化是 ML 过程中从模型构建到生产的中间环节。当我们对模型进行版本化时,在某种程度上,我们准备好了我们的思想,根据它们的表现来比较它们,以确定哪一个表现最好。如果没有版本控制,我们就有将弱模型推向生产的风险。这对企业或客户来说可能是昂贵的。
结论
模型版本化是 MLOps 工作流的一个重要方面。它允许您保留和组织关于您的模型的重要元数据,鼓励使用不同版本的训练数据和超参数进行实验,并在某种程度上为您指出具有正确指标的模型,以解决您的业务挑战。
使用我上面解释的工具,模型版本控制变得可能和容易。这些工具提供了一系列功能,包括再现实验、模型监控和跟踪。您可以尝试这些工具中的每一个,找到适合您的工具,或者通过上表做出您的选择。
参考
运行计算机视觉项目的顶级工具
原文:https://web.archive.org/web/https://neptune.ai/blog/top-tools-to-run-a-computer-vision-project
得益于似乎每天都在发布的最先进的工具和技术,计算机视觉已经获得了巨大的吸引力。这项技术正在应用于各个领域,包括自动驾驶汽车、机器人和医学图像分析。
计算机视觉是一个科学领域,涉及使用技术来理解图像和视频。目标是将原本由人类完成的视觉任务自动化。正在自动化的一些常见任务包括:
- 图像分类:这涉及到对图像内容的分类
- 目标检测:包括识别图像中的目标并在它们周围画出边界框
- 语义分割:这需要识别图像中每个像素的类别,并在每个对象周围画一个遮罩
- 人体姿态估计:识别视频图像中人的姿态
仅举几个例子。
深度学习和机器学习的最新进展使得这些任务的自动化成为可能。特别是,卷积神经网络在推进计算机视觉方面发挥了重要作用。这些网络能够检测和提取图像中的重要特征。这些特征然后被用于识别物体和分类图像。
在本文中,我们将了解一些实现这些计算机视觉应用的顶级工具和技术。
框架和库
有许多计算机视觉框架和库。这些工具在计算机视觉领域做不同的事情。各有利弊。我们来看看吧!
neptune.ai
neptune.ai 是一个可以用来记录和管理计算机视觉模型元数据的平台。您可以用它来记录:
- 型号版本,
- 数据版本,
- 模型超参数,
- 图表,
- 还有很多。
海王星托管在云上,不需要任何设置,随时随地都可以接入你的计算机视觉实验。你可以在一个地方组织计算机视觉实验,并与你的团队合作。你可以邀请你的队友来观看和研究任何计算机视觉实验。
了解更多关于在 Neptune 中记录和管理运行的信息。
OpenCV
OpenCV (开源计算机视觉库)是一个开源的计算机视觉和机器学习库。它支持 Windows、Linux、Android 和 Mac OS。
该库还为 CUDA 和 OpenCL 提供接口。OpenCV 也可以在 C++、Java、MATLAB 和 Python 中使用。使用 OpenCV 可以完成的一些任务包括:
- 对视频中的人体动作进行分类
- 物体识别
- 跟踪移动物体
- 清点人数
- 检测和识别人脸
OpenCV 也可以用于计算机视觉的图像处理。一些受支持的任务包括:
- 更改色彩空间
- 平滑图像
- 使用图像金字塔混合图像
- 基于分水岭算法的图像分割
例如,下面是你如何对一幅图像进行傅立叶变换。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('f.jpg',0)
dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
TensorFlow
TensorFlow 是谷歌开发的开源深度学习库。它通过使用 Keras 作为其高级 API,使得深度学习模型的构建变得简单而直观。
可以使用 TensorFlow 构建的一些网络包括:
- 卷积神经网络
- 全连接网络
- 递归神经网络
- 长短期记忆网络
- 生成对抗网络
TensorFlow 在开发人员中很受欢迎,因为它易于使用,并为您提供了执行各种操作的多种工具。生态系统中的一些工具包括:
- 用于可视化和调试模型的张量板
- TensorFlow Playground 用于在浏览器上修补神经网络
- 包含众多经过训练的计算机视觉模型的 TensorFlow Hub
- TensorFlow Graphics ,一个处理图形的库
我们已经提到卷积神经网络(CNN)主要用于计算机视觉任务。在尽可能多地使用普通人工神经网络的情况下,CNN 已经被证明表现得更好。
让我们看一个构建简单神经网络的代码片段。在这个片段中,您可以看到:
- 使用 Keras 的“顺序”功能初始化层网络
- “Conv2D”用 3×3 特征检测器定义卷积层。特征检测器在保持重要特征的同时减小图像的尺寸
- “MaxPooling2D”进行池化。上面获得的特征通过池层传递。常见的池类型包括最大池和最小池。池确保网络能够检测图像中的对象,而不管其在图像中的位置
- 卷积层和池层是重复的。但是,您可以自由定义自己的网络架构。您也可以使用常见的网络架构
- “Flatten”层将池层的输出转换为可以传递给完全连接的层的单个列
- “致密”是完全连接的层。在这一层,应用对应于问题类型的激活函数
- 最后一层负责产生网络的最终输出
model = tf.keras.Sequential(
[
tf.keras.layers.Conv2D(32, (3,3), activation="relu",input_shape=(32, 32, 3)),
tf.keras.layers.MaxPooling2D((2, 2), strides=2),
tf.keras.layers.Conv2D(64, (3,3), activation="relu"),
tf.keras.layers.MaxPooling2D((2, 2), strides=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(100, activation="relu"),
tf.keras.layers.Dense(10, activation="softmax")
]
)
当建立一个像上面这样的网络时,可以使用海王星来跟踪实验。这是很重要的,这样你的实验是可重复的。花几天时间来训练一个你以后无法复制其表现的网络将是非常不幸的。
TensorFlow 和 Neptune 集成让您:
- 每次运行时记录模型超参数
- 可视化模型的学习曲线
- 查看每次运行的硬件消耗
- 记录模型权重
- 记录模型工件,比如图像和模型本身
PyTorch
PyTorch 是基于 Torch 库的开源深度学习库。它还支持分布式训练以及为您的计算机视觉模型服务。
PyTorch 的其他特性包括:
- 在移动设备上部署
- 支持 ONNX
- C++前端
- 在主要云平台上受支持
- 工具和库的丰富生态系统
PyTorch 及其生态系统也得到海王星机器学习实验平台的支持。这个 PyTorch + Neptune 集成让你:
- 原木火炬张量
- 可视化模型损失和指标
- 将火炬张量记录为图像
- 日志训练代码
- 记录模型权重
定义卷积神经网络与张量流定义非常相似,只是做了一些表面上的修改。正如您所看到的,您仍然需要定义卷积层和池层以及指示激活功能。
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
如果不喜欢用原始 PyTorch 代码编写网络,可以使用它的一个高级 API 库。一个这样的包是“fastai”图书馆。
法斯泰
Fastai 是一个基于 PyTorch 构建的深度学习库。
该库的一些功能包括:
- GPU 优化的计算机视觉模块
- 可以访问数据任何部分的双向回调系统
- 来自其他库时易于入门
- 支持循环学习率
Fastai 指标也可以记录到 Neptune。该集成还允许您监控和可视化模型的训练过程。
我们来看一个使用 Fastai 进行图像分类的例子。第一步通常是创建一个“学习者”。“学习者”结合了模型、数据加载器和损失函数。定义“学习者”时,您可以使用预先训练的模型,并在数据集上对其进行微调。这被称为迁移学习,与从头开始训练模型相比,通常会产生更好的模型性能。预先训练的模型通常很难被击败,因为它们在数百万张图像上进行训练,而这些图像对于个人来说很难获得。此外,需要大量的计算资源来训练具有数百万图像的模型。
from fastai.vision.all import *
dls = ImageDataLoaders.from_name_func(path, files, label_func, item_tfms=Resize(224))
learn = cnn_learner(dls, resnet34, metrics=error_rate)
learn.fine_tune(1)
然后,您可以使用这个“学习者”来运行预测。
learn.predict(files[0])
Fastai 还提供下载样本数据和增强图像的工具。
检查如何利用 Neptune 来记录和跟踪 fastai 指标。
咖啡
Caffe 是由 Berkeley AI Research (BAIR)开发的开源深度学习框架。
咖啡的一些特点包括:
- 能够在不同的后端之间轻松切换
- 快速图书馆
- 可用于图像分类和图像分割
- 支持 CNN、RCNN 和 LSTM 网络
像其他库一样,在 Caffe 中创建网络需要定义网络层、损失函数和激活函数。
from caffe import layers as L, params as P
def lenet(lmdb, batch_size):
n = caffe.NetSpec()
n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LMDB, source=lmdb,
transform_param=dict(scale=1./255), ntop=2)
n.conv1 = L.Convolution(n.data, kernel_size=5, num_output=20, weight_filler=dict(type='xavier'))
n.pool1 = L.Pooling(n.conv1, kernel_size=2, stride=2, pool=P.Pooling.MAX)
n.conv2 = L.Convolution(n.pool1, kernel_size=5, num_output=50, weight_filler=dict(type='xavier'))
n.pool2 = L.Pooling(n.conv2, kernel_size=2, stride=2, pool=P.Pooling.MAX)
n.fc1 = L.InnerProduct(n.pool2, num_output=500, weight_filler=dict(type='xavier'))
n.relu1 = L.ReLU(n.fc1, in_place=True)
n.score = L.InnerProduct(n.relu1, num_output=10, weight_filler=dict(type='xavier'))
n.loss = L.SoftmaxWithLoss(n.score, n.label)
奥本维诺
OpenVINO (开放式视觉推理和神经网络优化)可以让用计算机视觉模型进行推理更快。
OpenVINO 提供的其他功能包括:
- 支持基于 CNN 的边缘深度学习推理
- 附带针对 OpenCV 和 OpenCL 优化的计算机视觉功能
特定任务的现成解决方案
除了开源计算机视觉工具之外,还有现成的解决方案可用于构建计算机视觉应用程序的各个阶段。这些解决方案通常是托管的,可以立即使用。他们还提供免费版本,你可以马上开始使用。让我们来看看其中的一些。
德西
Deci 是一个平台,你可以用它来优化你的计算机视觉模型并提高它们的性能。
该平台能够:
- 减少模型的延迟
- 增加模型的吞吐量,而不影响其准确性
- 支持来自流行框架的模型优化
- 支持在流行的 CPU 和 GPU 机器上部署
- 在不同的硬件主机和云提供商上测试您的模型
你可以使用 Deci 平台来优化你的机器学习模型。该过程从上传模型开始,并通过选择所需的优化参数对其进行优化。
下图显示了在 Deci 上运行 YOLO V5 优化后获得的结果。图像显示如下:
- 该型号的吞吐量增加了 2.1 倍
- 模型的尺寸缩小了 1.4 倍
- 该型号的吞吐量从 194.1 FPS 提高到 413.2 FPS。现在快了 2.1 倍。
- 该模型的延迟提高了 2.1 倍
克拉里菲
Clarifai 提供可通过 API、设备 SDK 和内部部署访问的图像和视频解决方案。
该平台的一些功能包括:
- 视觉搜索
- 图像裁剪器
- 视觉分类模型
- 按图像搜索
- 视频插值
- 人口统计分析
- 空中监视
- 数据标记
监督地
Supervise.ly 为计算机视觉模型提供图像标注工具。
该平台提供的其他功能包括:
- 视频标注
- 3D 场景的标记
- 计算机视觉模型的训练和测试
标签盒
Labelbox 是一个可以用来为计算机视觉项目标注数据的平台。
支持的计算机视觉项目有:
- 创建边界框、多边形、直线和关键点
- 图像分割任务
- 图像分类
- 视频标注
片段
Segments 是一个用于标注和模型训练的计算机视觉平台。
该平台支持:
- 实例分割
- 语义分割
- 多边形
- 边框和
- 图像分类
纳米网络
Nanonets 为各行业的应用计算机视觉提供解决方案。
该平台提供的一些解决方案包括:
- 身份证验证
- 机器学习和光学字符识别在各种文档分析中的应用
感知
Sentisight 计算机视觉平台提供以下功能:
- 智能图像标注工具
- 分类标签、边界框和多边形
- 训练分类和对象检测模型
- 图像相似性搜索
- 预训练模型
亚马逊索赔案
Amazon Rekognition 无需任何深度学习经验即可用于图像和视频分析。
该平台提供:
- 能够识别数千个标签
- 添加自定义标签
- 内容审核
- 文本识别
- 人脸检测和分析
- 人脸搜索和验证
- 名人认可
谷歌云视觉 API
Google Cloud 为 vision APIs 提供了以下特性:
- 使用预训练模型的图像分类
- 数据标记
- 在边缘设备上部署模型
- 检测和计数物体
- 检测人脸
- 内容审核
- 名人认可
德国人
Fritz 平台可以用于建立计算机视觉模型,无需任何机器学习经验。
该平台提供以下功能:
- 从少量图像样本生成图像
- 图像标注
- 图像分类和目标检测模型
- 图像分割模型
- 在边缘设备上部署训练模型
- 基于机器学习的镜头工作室镜头
微软计算机视觉应用编程接口
微软还提供了一个分析图像和视频内容的计算机视觉平台。
该服务提供的一些功能包括:
- 文本提取
- 图像理解
- 空间分析
- 在云和边缘部署
IBM Watson 视觉识别
IBM Watson 视觉识别服务提供以下服务:
- 将模型导出到 CoreML
- 预训练分类模型
- 自定义图像分类模型
- 定制模型培训
ShaipCloud
ShaipCloud 是一个计算机视觉平台,用于标记敏感的人工智能训练数据——无论是图像还是视频。
该平台支持:
- 图像标注/标注:语义分割、关键点标注、包围盒、3D 长方体、多边形标注、地标标注、线段分割
-
用例:物体检测、人脸识别跟踪、图像分类
-
- 视频标注/标注:逐帧标注、基于事件的时间戳标注、关键点标注
-
用例:物体/运动跟踪、面部识别、自动驾驶、安全监控、视频/剪辑分类
-
- 行业迎合:尽管他们是行业不可知论者,但他们的高吞吐量服务已经在汽车、医疗保健、金融服务、技术、零售和政府等各种垂直行业推动了下一代技术的发展。
最后的想法
在本文中,我们介绍了可以在计算机视觉项目中使用的各种工具。我们探索了几种开源工具,以及各种现成的计算机视觉平台。
您对工具或平台的选择将取决于您的技能和预算。例如,ready 平台可以在没有先验知识的情况下用于深度学习,但它们不是免费的。开源工具是免费的,但是需要技术知识和经验才能使用。
无论你选择哪个平台或者工具,最根本的是要保证它能解决你的问题。
资源
用遗传算法和 PyGAD 训练 PyTorch 模型
PyGAD 是一个用于求解优化问题的遗传算法 Python 3 库。其中一个问题是训练机器学习算法。
PyGAD 有一个模块叫做 pygad.kerasga 。它使用遗传算法训练 Keras 模型。2021 年 1 月 3 日,新发布的 PyGAD 2.10.0 带来了一个名为 pygad.torchga 的新模块来训练 PyTorch 模型。它非常容易使用,但有几个棘手的步骤。
因此,在本教程中,我们将探索如何使用 PyGAD 来训练 PyTorch 模型。
让我们开始吧。
安装 PyGAD
PyGAD 是一个 Python 3 库,可以在 PyPI (Python 包索引)获得。因此,您可以简单地使用这个 pip 命令来安装它:
pip install pygad>=2.10.0
确保你的版本至少是 2.10.0,早期版本不支持 pygad.torchga 模块。
你也可以从这个链接下载 PyGAD 2.10.0 的轮子分发文件,用下面的命令安装(确保当前目录设置为带有。whl 文件)。
pip install pygad-2.10.0-py3-none-any.whl
安装完 PyGAD 之后,就该开始使用 pygad.torchga 模块了。
要了解更多关于 PyGAD 的信息,请阅读它的文档。你也可以通过这个链接直接访问 pygad.torchga 模块的文档。
pygad.torchga 模块
PyGAD 2.10.0 允许我们使用遗传算法(GA)训练 PyTorch 模型。训练 PyTorch 模型的问题被公式化为 g a 的优化问题,其中模型中的所有参数(例如,权重和偏差)被表示为单个向量(即,染色体)。
pygad.torchga 模块( torchga 是 Torch 遗传算法的缩写)帮助我们以 pygad 期望的方式制定 PyTorch 模型训练问题。该模块有 1 个类别和 2 个功能:
- TorchGA:为 PyTorch 模型创建解决方案群体(即染色体)的类。每个解/染色体保存一组模型的所有参数。
- model_weights_as_vector():一个函数,它接受表示 PyTorch 模型的名为 model 的参数,并将其参数作为向量(即染色体)返回。
- model_weights_as_dict():一个接受两个参数的函数。第一个被称为模型,它接受 PyTorch 模型。第二个参数称为 weights_vector,它是代表所有模型参数的向量。该函数返回 PyTorch 模型参数的字典,该字典可以传递给名为 load_state_dict()的 PyTorch 方法来设置模型权重。
pygad.torchga 模块的源代码可以在 ahmedfgad/TorchGA GitHub 项目中获得。
TorchGA 类的构造函数接受以下两个参数:
- 型号:PyTorch 型号。
- num_solutions:群体中解的数量。每个解决方案都有一组不同的 PyTorch 模型参数。
在 pygad.torchga.TorchGA 类的实例中,每个参数都用作一个属性。这意味着您可以通过使用模型属性来访问模型,如下所示:
torchga = TorchGA(model=---, num_solutions=---)
torchga.model
第三个属性称为 population_weights,它是人口中所有解决方案的 2D 列表。请记住,每个解决方案都是包含模型参数的 1D 列表。
下面是一个创建 TorchGA 类实例的例子。模型参数可以分配给任何 PyTorch 模型。传递给 num_solutions 参数的值是 10,这意味着群体中有 10 个解决方案。
import pygad.torchga
torch_ga = pygad.torchga.TorchGA(model=...,
num_solutions=10)
initial_population = torch_ga.population_weights
TorchGA 类的构造函数调用一个名为 create_population()的方法,该方法创建并向 PyTorch 模型返回一组解决方案。首先,调用 model_weights_as_vector()函数以向量形式返回模型参数。
该向量用于在群体中创建解。为了使解决方案有所不同,随机值被添加到向量中。
假设模型有 30 个参数,那么 population_weights 数组的形状是 10×30。
现在,让我们回顾一下使用 PyGAD 训练 PyTorch 模型所需的步骤。
使用 PyGAD 训练 PyTorch 模型
要使用 PyGAD 训练 PyTorch 模型,我们需要完成以下步骤:
- 分类还是回归?
- 创建 PyTorch 模型
- 创建 pygad.torchga.TorchGA 类的实例
- 准备培训数据
- 决定损失函数
- 建立适应度函数
- 生成回调函数(可选)
- 创建 pygad 的一个实例。GA 级
- 运行遗传算法
我们将详细讨论每个步骤。
分类还是回归?
决定 PyTorch 模型所解决的问题类型是分类还是回归是很重要的。这将帮助我们准备:
- 模型的损失函数(用于构建适应度函数),
- 模型输出层中的激活函数,
- 训练数据。
对于 PyTorch 提供的损失函数,检查此链接。回归问题的损失函数的例子包括平均绝对误差( nn。L1Loss 和均方误差( nn)。ms loss)。
对于分类问题,一些例子是二元交叉熵( nn。BCELoss )进行二元分类和交叉熵( nn。多类问题的 CrossEntropyLoss )。
基于问题是分类还是回归,我们可以决定输出层中的激活函数。例如, softmax 用于分类,线性用于回归。
训练数据也取决于问题类型。如果问题是分类,那么输出来自一组有限的离散值。如果问题是回归,那么输出来自一组无限连续的值。
创建 PyTorch 模型
我们将使用 torch.nn 模块来构建 PyTorch 模型,以解决一个简单的回归问题。该模型有 3 层:
如果问题是分类,我们必须添加一个合适的输出层,像 SoftMax 。
最后,该模型被创建为 torch.nn.Sequential 类的一个实例,它接受所有先前按顺序创建的层。
import torch.nn
input_layer = torch.nn.Linear(3, 2)
relu_layer = torch.nn.ReLU()
output_layer = torch.nn.Linear(2, 1)
model = torch.nn.Sequential(input_layer,
relu_layer,
output_layer)
关于如何构建 PyTorch 模型,我们就不深入探讨了。更多细节,可以查看 PyTorch 文档。
现在,我们将使用 pygad.torchga.TorchGA 类创建 PyTorch 模型参数的初始填充。
创建 pygad.torchga.TorchGA 类的实例
使用 TorchGA 类,PyGAD 提供了一个简单的接口来创建 PyTorch 模型的初始解决方案群体。只需创建 pygad.torchga.TorchGA 类的一个实例,就会自动创建一个初始群体。
下面是一个将之前创建的模型传递给 TorchGA 类的构造函数的示例。
import pygad.torchga
torch_ga = pygad.torchga.TorchGA(model=model,
num_solutions=10)
现在,让我们创建随机训练数据来训练模型。
准备培训数据
基于问题是分类还是回归,我们相应地准备训练数据。
这里有 5 个随机样本,每个样本有 3 个输入和 1 个输出。
import numpy
data_inputs = numpy.array([[0.02, 0.1, 0.15],
[0.7, 0.6, 0.8],
[1.5, 1.2, 1.7],
[3.2, 2.9, 3.1]])
data_outputs = numpy.array([[0.1],
[0.6],
[1.3],
[2.5]])
如果我们正在解决像 XOR 这样的二进制分类问题,那么它的数据如下所示,其中有 4 个样本,有 2 个输入和 1 个输出。
import numpy
data_inputs = numpy.array([[0, 0],
[0, 1],
[1, 0],
[1, 1]])
data_outputs = numpy.array([[1, 0],
[0, 1],
[0, 1],
[1, 0]])
回归和分类问题损失函数的时间。
决定损失函数
回归
对于回归问题,损失函数包括:
分类
对于分类问题,损失函数包括:
查看本页了解 PyTorch 中损失函数的更多信息。
下面是一个使用 torch.nn.BCELoss 类计算二进制交叉熵的例子。调用 detach() 方法从图中分离张量,以返回其值。查看这个链接以获得更多关于 detach() 方法的信息。
loss_function = torch.nn.BCELoss()
loss = loss_function(predictions, data_outputs).detach().numpy()
然后基于所计算的损失来计算适应度函数。
建立适应度函数
遗传算法期望适应度函数是最大化的,其输出越高,结果越好。然而,计算机器学习模型的损失是基于最小化损失函数。损失越低,效果越好。
如果适应度设置为等于损失,那么遗传算法将在使适应度增加的方向上搜索。因此,它将在相反的方向上增加损失。这就是为什么适应度是根据下一条线作为损失的倒数来计算的。
当 loss=0.0 时,添加小值 0.00000001 是为了避免被零除。
fitness_value = (1.0 / (loss + 0.00000001))
当使用 PyGAD 训练 PyTorch 模型时,有多个解,并且每个解都是保存模型所有参数的向量。
要构建适应度函数,请遵循以下步骤:
- 从 1D 向量恢复模型参数。
- 设置模型参数。
- 做预测。
- 计算损失值。
- 计算适应值。
- 回归健身值。
接下来,我们将为回归和二元分类问题构建适应度函数。
回归的适应度函数
PyGAD 中的 fitness 函数是作为常规 Python 函数构建的,但是它必须接受两个参数,分别表示:
- 计算其适应值的解决方案,
- 总体中解的指数。
传递给适应度函数的解是 1D 向量。这个向量不能直接用于 PyTorch 模型的参数,因为模型需要字典形式的参数。因此,在计算损失之前,我们需要将向量转换为字典。我们可以在 pygad.torchga 模块中使用 model_weights_as_dict()函数,如下所示:
model_weights_dict = torchga.model_weights_as_dict(model=model,
weights_vector=solution)
一旦创建了参数字典,就调用 load_state_dict()方法来使用这个字典中的参数作为模型的当前参数。
model.load_state_dict(model_weights_dict)
根据当前参数,模型对训练数据进行预测。
predictions = model(data_inputs)
模型的预测被传递给损失函数,以计算解决方案的损失。平均绝对误差被用作损失函数。
loss_function = torch.nn.L1Loss()
solution_fitness = 1.0 / (loss_function(predictions, data_outputs).detach().numpy() + 0.00000001)
最后,返回适应值。
loss_function = torch.nn.L1Loss()
def fitness_func(solution, sol_idx):
global data_inputs, data_outputs, torch_ga, model, loss_function
model_weights_dict = torchga.model_weights_as_dict(model=model,
weights_vector=solution)
model.load_state_dict(model_weights_dict)
predictions = model(data_inputs)
solution_fitness = 1.0 / (loss_function(predictions, data_outputs).detach().numpy() + 0.00000001)
return solution_fitness
二元分类的适合度
这是二元分类问题的适应度函数。使用的损失函数是二元交叉熵。
loss_function = torch.nn.BCELoss()
def fitness_func(solution, sol_idx):
global data_inputs, data_outputs, torch_ga, model, loss_function
model_weights_dict = torchga.model_weights_as_dict(model=model,
weights_vector=solution)
model.load_state_dict(model_weights_dict)
predictions = model(data_inputs)
solution_fitness = 1.0 / (loss_function(predictions, data_outputs).detach().numpy() + 0.00000001)
return solution_fitness
创建的适应度函数应该分配给 pygad 中的 fitness_func 参数。GA 类的构造函数。
接下来,我们将构建一个在每一代结束时执行的回调函数。
生成回调函数(可选)
根据下图所示的 PyGAD 生命周期,有一个回调函数,每生成一次就调用一次。这个函数可以被实现并用来打印一些调试信息,比如每代中的最佳适应值,以及完成的代数。请注意,这一步是可选的,仅用于调试目的。
您需要做的就是实现回调函数,然后在 pygad 的构造函数中将它赋给 on_generation 参数。GA 级。下面是一个回调函数,它接受一个表示 pygad 实例的参数。GA 级。
使用这个实例,返回属性 generations_completed,它保存已完成的代的数量。best_solution()方法也被调用,它返回关于当前代中最佳解决方案的信息。
def callback_generation(ga_instance):
print("Generation = {generation}".format(generation=ga_instance.generations_completed))
print("Fitness = {fitness}".format(fitness=ga_instance.best_solution()[1]))
下一步是创建 pygad 的实例。GA 类,负责运行遗传算法来训练 PyTorch 模型。
创建 pygad 的一个实例。GA 级
pygad 的建造者。GA 类接受许多参数,这些参数可以在文档中找到。下一段代码只使用了其中的一些参数,创建了 pygad 的一个实例。GA 类,并将其保存在 ga_instance 变量中:
- num_generations:代的数量。
- num _ parents _ mating:要交配的亲本数量。
- initial _ population:py torch 模型参数的初始总体。
- fitness_func:适应函数。
- on_generation:生成回调函数。
num_generations = 250
num_parents_mating = 5
initial_population = torch_ga.population_weights
ga_instance = pygad.GA(num_generations=num_generations,
num_parents_mating=num_parents_mating,
initial_population=initial_population,
fitness_func=fitness_func,
on_generation=callback_generation)
请注意,在 TorchGA 类的构造函数中,群体中的解的数量先前设置为 10。因此,要交配的亲本数量必须少于 10 个。
在下一节中,我们调用 run()方法来运行遗传算法并训练 PyTorch 模型。
运行遗传算法
pygad 的 ga _ 实例。GA 现在可以调用 run()方法来启动遗传算法。
ga_instance.run()
在这种方法完成后,我们可以使用遗传算法在最后一代中找到的最佳解决方案进行预测。
pygad 中有一个很有用的方法叫做 plot_result()。GA 类中,它显示了一个将适应值与代数相关联的图形。在 run()方法完成后,这很有用。
ga_instance.plot_result(title="PyGAD & PyTorch - Iteration vs. Fitness")
有关已定型模型的统计信息
皮加德人。GA 类有一个名为 best_solution()的方法,它返回 3 个输出:
- 找到最佳解决方案,
- 最佳解决方案的适应值,
- 群体中最佳解决方案的索引。
下一段代码调用 best_solution()方法,并输出最佳解决方案的信息。
solution, solution_fitness, solution_idx = ga_instance.best_solution()
print("Fitness value of the best solution = {solution_fitness}".format(solution_fitness=solution_fitness))
print("Index of the best solution : {solution_idx}".format(solution_idx=solution_idx))
最佳解决方案的参数可以转换成字典,输入 PyTorch 模型进行预测。
best_solution_weights = torchga.model_weights_as_dict(model=model,
weights_vector=solution)
model.load_state_dict(best_solution_weights)
predictions = model(data_inputs)
print("Predictions : n", predictions.detach().numpy())
接下来的代码计算模型定型后的损失。
abs_error = loss_function(predictions, data_outputs)
print("Absolute Error : ", abs_error.detach().numpy())
在介绍了使用 PyGAD 构建和训练 PyTorch 模型的所有步骤之后,接下来我们将查看两个带有完整代码的示例。
例子
回归
对于使用平均绝对误差作为损失函数的回归问题,这里是完整的代码。
import torch
import torchga
import pygad
def fitness_func(solution, sol_idx):
global data_inputs, data_outputs, torch_ga, model, loss_function
model_weights_dict = torchga.model_weights_as_dict(model=model,
weights_vector=solution)
model.load_state_dict(model_weights_dict)
predictions = model(data_inputs)
abs_error = loss_function(predictions, data_outputs).detach().numpy() + 0.00000001
solution_fitness = 1.0 / abs_error
return solution_fitness
def callback_generation(ga_instance):
print("Generation = {generation}".format(generation=ga_instance.generations_completed))
print("Fitness = {fitness}".format(fitness=ga_instance.best_solution()[1]))
input_layer = torch.nn.Linear(3, 2)
relu_layer = torch.nn.ReLU()
output_layer = torch.nn.Linear(2, 1)
model = torch.nn.Sequential(input_layer,
relu_layer,
output_layer)
torch_ga = torchga.TorchGA(model=model,
num_solutions=10)
loss_function = torch.nn.L1Loss()
data_inputs = torch.tensor([[0.02, 0.1, 0.15],
[0.7, 0.6, 0.8],
[1.5, 1.2, 1.7],
[3.2, 2.9, 3.1]])
data_outputs = torch.tensor([[0.1],
[0.6],
[1.3],
[2.5]])
num_generations = 250
num_parents_mating = 5
initial_population = torch_ga.population_weights
parent_selection_type = "sss"
crossover_type = "single_point"
mutation_type = "random"
mutation_percent_genes = 10
keep_parents = -1
ga_instance = pygad.GA(num_generations=num_generations,
num_parents_mating=num_parents_mating,
initial_population=initial_population,
fitness_func=fitness_func,
parent_selection_type=parent_selection_type,
crossover_type=crossover_type,
mutation_type=mutation_type,
mutation_percent_genes=mutation_percent_genes,
keep_parents=keep_parents,
on_generation=callback_generation)
ga_instance.run()
ga_instance.plot_result(title="PyGAD & PyTorch - Iteration vs. Fitness", linewidth=4)
solution, solution_fitness, solution_idx = ga_instance.best_solution()
print("Fitness value of the best solution = {solution_fitness}".format(solution_fitness=solution_fitness))
print("Index of the best solution : {solution_idx}".format(solution_idx=solution_idx))
best_solution_weights = torchga.model_weights_as_dict(model=model,
weights_vector=solution)
model.load_state_dict(best_solution_weights)
predictions = model(data_inputs)
print("Predictions : n", predictions.detach().numpy())
abs_error = loss_function(predictions, data_outputs)
print("Absolute Error : ", abs_error.detach().numpy())
下图是调用 plot_result() 方法的结果。显示适应值逐代变化。
下面是代码中打印语句的输出。平均汇率为 0.0069。
Fitness value of the best solution = 145.42425295191546
Index of the best solution : 0
Predictions :
Predictions :
[[0.08401088]
[0.60939324]
[1.3010881 ]
[2.5010352 ]]
Absolute Error : 0.006876422
使用 CNN 分类
接下来的代码使用 PyTorch 构建了一个卷积神经网络(CNN ),用于对 80 幅图像的数据集进行分类,其中每幅图像的大小为 100x100x3。在这个例子中使用了交叉熵损失,因为有两个以上的类。
可以从以下链接下载培训数据:
import torch
import torchga
import pygad
import numpy
def fitness_func(solution, sol_idx):
global data_inputs, data_outputs, torch_ga, model, loss_function
model_weights_dict = torchga.model_weights_as_dict(model=model,
weights_vector=solution)
model.load_state_dict(model_weights_dict)
predictions = model(data_inputs)
solution_fitness = 1.0 / (loss_function(predictions, data_outputs).detach().numpy() + 0.00000001)
return solution_fitness
def callback_generation(ga_instance):
print("Generation = {generation}".format(generation=ga_instance.generations_completed))
print("Fitness = {fitness}".format(fitness=ga_instance.best_solution()[1]))
input_layer = torch.nn.Conv2d(in_channels=3, out_channels=5, kernel_size=7)
relu_layer1 = torch.nn.ReLU()
max_pool1 = torch.nn.MaxPool2d(kernel_size=5, stride=5)
conv_layer2 = torch.nn.Conv2d(in_channels=5, out_channels=3, kernel_size=3)
relu_layer2 = torch.nn.ReLU()
flatten_layer1 = torch.nn.Flatten()
dense_layer1 = torch.nn.Linear(in_features=768, out_features=15)
relu_layer3 = torch.nn.ReLU()
dense_layer2 = torch.nn.Linear(in_features=15, out_features=4)
output_layer = torch.nn.Softmax(1)
model = torch.nn.Sequential(input_layer,
relu_layer1,
max_pool1,
conv_layer2,
relu_layer2,
flatten_layer1,
dense_layer1,
relu_layer3,
dense_layer2,
output_layer)
torch_ga = torchga.TorchGA(model=model,
num_solutions=10)
loss_function = torch.nn.CrossEntropyLoss()
data_inputs = torch.from_numpy(numpy.load("dataset_inputs.npy")).float()
data_inputs = data_inputs.reshape((data_inputs.shape[0], data_inputs.shape[3], data_inputs.shape[1], data_inputs.shape[2]))
data_outputs = torch.from_numpy(numpy.load("dataset_outputs.npy")).long()
num_generations = 200
num_parents_mating = 5
initial_population = torch_ga.population_weights
parent_selection_type = "sss"
crossover_type = "single_point"
mutation_type = "random"
mutation_percent_genes = 10
keep_parents = -1
ga_instance = pygad.GA(num_generations=num_generations,
num_parents_mating=num_parents_mating,
initial_population=initial_population,
fitness_func=fitness_func,
parent_selection_type=parent_selection_type,
crossover_type=crossover_type,
mutation_type=mutation_type,
mutation_percent_genes=mutation_percent_genes,
keep_parents=keep_parents,
on_generation=callback_generation)
ga_instance.run()
ga_instance.plot_result(title="PyGAD & PyTorch - Iteration vs. Fitness", linewidth=4)
solution, solution_fitness, solution_idx = ga_instance.best_solution()
print("Fitness value of the best solution = {solution_fitness}".format(solution_fitness=solution_fitness))
print("Index of the best solution : {solution_idx}".format(solution_idx=solution_idx))
best_solution_weights = torchga.model_weights_as_dict(model=model,
weights_vector=solution)
model.load_state_dict(best_solution_weights)
predictions = model(data_inputs)
print("Crossentropy : ", loss_function(predictions, data_outputs).detach().numpy())
accuracy = torch.sum(torch.max(predictions, axis=1).indices == data_outputs) / len(data_outputs)
print("Accuracy : ", accuracy.detach().numpy())
下图是调用 plot_result() 方法的结果。显示适应值逐代变化。
以下是一些关于已训练模型的信息。
Fitness value of the best solution = 1.3009520689219258
Index of the best solution : 0
Crossentropy : 0.7686678
Accuracy : 0.975
结论
我们探索了如何使用名为 PyGAD 的 Python 3 库通过遗传算法训练 PyTorch 模型。
PyGAD 有一个模块 torchga ,它帮助将训练 PyTorch 模型的问题公式化为遗传算法的优化问题。 torchga 模块创建 PyTorch 模型参数的初始群体,其中每个解决方案为模型保存一组不同的参数。使用 PyGAD,进化群体中的解。
这是一个研究遗传算法的好方法。尝试一下,试验一下,看看会出现什么!
流式数据训练模型[实用指南]
原文:https://web.archive.org/web/https://neptune.ai/blog/training-models-on-streaming-data
当你听到流式数据时,你会想到什么?可能是通过 YouTube 等视频流平台生成的数据,但这不是唯一有资格作为流数据的东西。有许多平台和来源可以生成这种数据。
在本文中,我们将介绍流数据的基础知识,它是什么,以及它与传统数据有何不同。我们还将熟悉有助于记录这些数据并对其进行进一步分析的工具。在本文的后面部分,我们将讨论它的重要性,以及我们如何在一个动手示例的帮助下使用机器学习进行流数据分析。
什么是流数据?
“流数据是连续的信息流,是事件驱动架构软件模型的基础”——red hat
世界各地的企业比以往任何时候都更加依赖数据。一些行业不仅依赖传统数据,还需要来自安全日志、物联网传感器和 web 应用程序等来源的数据来提供最佳客户体验。例如,在任何视频流媒体服务之前,用户必须等待视频或音频下载。如今,当你在听一首歌或一个视频时,如果你打开了自动播放,平台会根据你的实时流媒体数据为你创建一个播放列表。
批处理与流式处理
“随着当今现代需求的复杂性,传统的数据处理方法对于大多数用例来说已经过时,因为它们只能将数据作为随时间收集的事务组来处理。现代组织需要在数据变得陈旧之前对最新的数据采取行动。这种连续的数据提供了许多优势,正在改变企业的运营方式。”–上升溶剂
在开发应用程序或系统时,了解应用程序或用户等待数据可用的时间很重要,这是您必须在批处理和流数据处理之间做出选择的地方。在本文中,我们的重点是流数据,但是在我们处理它之前,理解它与批量数据处理的不同是很重要的。这也有助于我们观察流数据的重要性。
成批处理 | 流式处理 | |
---|---|---|
用于对不同数据集运行任意查询
|
最适合事件驱动的系统
|
| | |
最适合事件驱动的系统
|
| |
一次性处理大量数据集
|
实时处理数据
|
| |
输入流是静态的,通常大小有限
|
输入流是动态的,大小未知
|
| |
用于复杂分析
|
用于简单和滚动的度量
|
| |
批处理作业完成后才收到响应
|
数据一到就收到响应
|
| | | |
流式数据处理体系结构
“传统上,需要实时响应事件的应用依赖于数据库和消息处理系统。这样的系统跟不上今天产生的数据洪流。”–红帽
Basic I/O flow in streaming data processing | Source
流式处理引擎不仅仅是将数据从一个地方传送到另一个地方,它还会在数据经过时对其进行转换。这一管道促进了信息的顺畅、自动化流动,防止了企业面临的许多问题,如数据损坏、冲突和数据条目重复。流式数据管道是一个增强版本,能够大规模实时处理数百万个事件。因此,可以收集、分析和存储大量信息。有了这一功能,应用程序、分析和报告可以实时完成。
机器学习模型是流处理引擎的一部分,它提供了帮助流数据管道在流中以及潜在地在历史数据存储中展示特征的逻辑。
有许多工具可以帮助收集和处理流数据,其中一些流行的工具包括:
-
Apache Kafka :一个开源的分布式事件流平台,每秒可以处理数百万个事件。它可以用来实时收集、存储和处理流数据。
-
Apache Flink :一个开源的分布式流处理框架,可以处理批处理和流数据。它可用于执行复杂的数据处理任务,如窗口聚合、连接和事件时处理。
-
Apache Spark :开源的分布式计算系统,可以处理大数据处理任务。它可以用于处理批处理和流数据,并内置了对机器学习和图形处理的支持。
-
Apache NiFi :一个开源工具,可以用来自动收集、处理和分发数据。它为构建数据管道提供了一个基于 web 的界面,可用于处理批处理和流数据。
-
Azure Stream Analytics :一种基于云的服务,可用于实时处理流媒体数据。它提供了各种各样的特性,比如数据接收、数据转换和实时处理。
这些只是可用于流数据收集和处理的许多工具中的几个例子。工具的选择将取决于应用程序的具体要求,例如数据的量和速度、数据处理的复杂性以及可伸缩性和容错需求。
流式数据的机器学习:实践指南
现在,我们已经对什么是流数据、它在哪里被使用以及它与批处理数据有什么不同有了一个相当好的理解,让我们动手来学习如何用几行代码设置流处理。
在本练习中,我们将使用 Tensorflow、Keras、Scikit-learn 和 Pandas 来预处理数据并创建机器学习模型。为了建立数据流/连续数据流,我们将使用卡夫卡和动物园管理员。
首先,让我们安装必要的库:
!pip install tensorflow2.7.1
!pip install tensorflow_io0.23.1
!pip install kafka-python
导入所有函数和各自的库:
import os
from datetime import datetime
import time
import threading
import json
from kafka import KafkaProducer
from kafka.errors import KafkaError
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
import pandas as pd
import tensorflow as tf
import tensorflow_io as tfio
我们使用 Kafka 进行流处理,因为 Kafka 流提供了真正的一次记录处理能力。它是一个消息代理,从中可以轻松地使用消息(数据)。像 Spark 这样的工具也使用 Kafka 来读取消息,然后将它们分成小批来进一步处理。这取决于用例以及我们想要的工具。在这个练习中,我们使用 Kafka,因为它是最流行的工具之一。此外,python Kafka 库易于使用和理解。
让我们在本地安装和设置 Kafka,这样我们就可以轻松地模拟流数据环境:
!curl -sSOL https://downloads.apache.org/kafka/3.3.2/kafka_2.13-3.3.2.tgz
!tar -xzf kafka_2.13-3.3.2.tgz
!./kafka_2.13-3.3.2/bin/zookeeper-server-start.sh -daemon ./kafka_2.13-3.3.2/config/zookeeper.properties
!./kafka_2.13-3.3.2/bin/kafka-server-start.sh -daemon
./kafka_2.13-3.3.2/config/server.properties
!echo "Waiting for 10 secs until kafka and zookeeper services are up and running"
!sleep 10
为训练和测试数据创建 Kafka 主题:
!./kafka_2.13-3.3.2/bin/kafka-topics.sh --create --bootstrap-server 127.0.0.1:9092 --replication-factor 1 --partitions 1 --topic cancer-train
!./kafka_2.13-3.3.2/bin/kafka-topics.sh --create --bootstrap-server 127.0.0.1:9092 --replication-factor 1 --partitions 2 --topic cancer-test
出于本练习的目的,我们将使用乳腺癌数据集,并在接下来的几个步骤中将其提供给 Kafka 主题。这个数据集是一个批处理数据集,但是通过将它存储在 Kafka 中,我们模拟了一个为训练和推理提供连续数据检索的环境。
cancer_df = pd.read_csv('breast-cancer-wisconsin.data.csv')
cancer_df.head()
用 0 和 1 替换列“Class”值
cancer_df['Class'] = cancer_df['Class'].replace(2,0)
cancer_df['Class'] = cancer_df['Class'].replace(4,1)
创建训练和测试子集:
train_df, test_df = train_test_split(cancer_df, test_size=0.4, shuffle=True)
print("Number of training samples: ",len(train_df))
print("Number of testing sample: ",len(test_df))
x_train_df = train_df.drop(["Class"], axis=1)
y_train_df = train_df["Class"]
x_test_df = test_df.drop(["Class"], axis=1)
y_test_df = test_df["Class"]
标签,即类标签,被设置为存储在多个分区中的 Kafka 消息的密钥。这使得使用消费者组进行高效的数据检索成为可能。
x_train = list(filter(None, x_train_df.to_csv(index=False).split("\n")[1:]))
y_train = list(filter(None, y_train_df.to_csv(index=False).split("\n")[1:]))
x_test = list(filter(None, x_test_df.to_csv(index=False).split("\n")[1:])) y_test = list(filter(None, y_test_df.to_csv(index=False).split("\n")[1:]))
是时候将数据推送到我们之前创建的 Kafka 主题了。
def error_callback(exc):
raise Exception('Error while sending data to kafka: {0}'.format(str(exc)))
def write_to_kafka(topic_name, items):
count=0
producer = KafkaProducer(bootstrap_servers=['127.0.0.1:9092'])
for message, key in items:
print(message.encode('utf-8'))
producer.send(topic_name,
key=key.encode('utf-8'),
value=message.encode('utf-8')).add_errback(error_callback)
count+=1
producer.flush()
print("Wrote {0} messages into topic: {1}".format(count, topic_name))
write_to_kafka("cancer-train", zip(x_train, y_train))
write_to_kafka("cancer-test", zip(x_test, y_test))
为了从 Kafka 主题中读取数据,我们需要对数据进行解码,并创建一个可用于模型训练的数据集。
def decode_kafka_item(item):
message = tf.io.decode_csv(item.message,
[[0.0] for i in range(NUM_COLUMNS)])
key = tf.strings.to_number(item.key)
return (message, key)
BATCH_SIZE=64
SHUFFLE_BUFFER_SIZE=64
train_ds = tfio.IODataset.from_kafka('cancer-train', partition=0, offset=0)
train_ds = train_ds.shuffle(buffer_size=SHUFFLE_BUFFER_SIZE)
train_ds = train_ds.map(decode_kafka_item)
train_ds = train_ds.batch(BATCH_SIZE)
让我们准备模型创建、设置优化器、损失和指标:
OPTIMIZER = "adam"
LOSS = tf.keras.losses.BinaryCrossentropy(from_logits=True)
METRICS = ['accuracy']
EPOCHS = 10
设计和构建模型:
现在,我们将编译该模型:
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(9,)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.Dropout(0.4),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.4),
tf.keras.layers.Dense(1, activation='sigmoid')
])
print(model.summary())
是时候用卡夫卡的主题来训练模型了。在线或增量学习不同于训练模型的传统方式,在传统方式中,您提供一批数据值,并让模型在相同的基础上进行训练。然而,对于流数据,当新的数据点到达管道时,模型应该继续递增地更新超参数。在在线学习/培训中,数据点一旦用于培训(或消息被阅读)就可能不可用。
model.compile(optimizer=OPTIMIZER, loss=LOSS, metrics=METRICS)
我们将逐步训练我们的模型,也可以定期保存,以后,我们可以利用它来推断测试数据。
online_train_ds = tfio.experimental.streaming.KafkaBatchIODataset(
topics=["cancer-train"],
group_id="cgonline",
servers="127.0.0.1:9092",
stream_timeout=10000,
configuration=[
"session.timeout.ms=7000",
"max.poll.interval.ms=8000",
"auto.offset.reset=earliest"
],
)
这就是我们如何保持数据流入,并不断训练我们的模型。要了解更多关于 tensorflow streaming api 的信息,请查看这个页面。
def decode_kafka_online_item(raw_message, raw_key):
message = tf.io.decode_csv(raw_message, [[0.0] for i in range(NUM_COLUMNS)])
key = tf.strings.to_number(raw_key)
return (message, key)
for mini_ds in online_train_ds:
mini_ds = mini_ds.shuffle(buffer_size=32)
mini_ds = mini_ds.map(decode_kafka_online_item)
mini_ds = mini_ds.batch(32)
if len(mini_ds) > 0:
model.fit(mini_ds, epochs=3)
流式数据的重要性和含义
根据不同的用例,还需要收集和处理更多的数据。批量数据处理对于今天的企业业务来说不再可行。实时数据流的使用无处不在,从欺诈检测和股市平台到乘车共享应用和电子商务网站。虽然它引起了一些关于隐私和安全的担忧,但好处远不止这些。
重要
随着流数据变得越来越普遍,应用程序可以在收到流数据时实时处理、过滤、分析并做出反应。因此,各种新的机会变得可用,例如实时欺诈检测、网飞推荐和跨多种设备的无缝购物。处理大数据的行业正受益于持续的实时数据。
实时决策:流式数据使组织能够实时处理和分析数据,从而做出快速、明智的决策。这对于金融、医疗和运输等行业尤其有用,因为在这些行业,时间是至关重要的。
改善客户体验:流式数据可用于实时监控和分析客户互动,从而改善客户服务并提供个性化建议。
-
预测分析:流数据可用于实时训练机器学习模型,这些模型可用于预测分析和预测。
-
运营效率:流式数据可用于监控和分析工业设备的性能,从而提高运营效率,减少停机时间。
-
欺诈检测:流式数据可用于实时检测和预防欺诈活动,这有助于组织将财务损失降至最低。
-
含义
-
根据使用的环境,流数据可以有多种含义。
实时处理:流数据允许实时处理和分析,这对于各种应用程序都很有用,例如监控系统、金融交易和在线客户交互。
可扩展性:流数据系统旨在处理大量数据,非常适合社交媒体分析和物联网数据处理等大数据应用。
-
延迟:流数据系统通常延迟较低,这意味着数据生成和处理之间的时间很短。这对于需要快速响应时间的应用来说非常重要,例如金融交易或自动驾驶汽车。
-
复杂性:流数据系统的设计、实现和维护可能很复杂,尤其是在处理大量数据、多个数据源和实时需求时。
-
安全性:流数据也可能意味着安全风险,因为它增加了攻击面和暴露的数据量,因此拥有强大的安全基础设施非常重要。
-
隐私:流数据系统也可能引起隐私问题,因为它们经常收集和处理大量的个人信息。务必确保数据的收集和使用符合相关法律法规,并采取适当措施保护用户隐私。
-
实时处理和分析数据的能力可以为组织提供显著的竞争优势,提高客户满意度并做出更明智的决策。
结论
流式数据处理及其架构可以消除运行可扩展数据工程功能的需求。它也很灵活,可以适应任何使用情况。随着时间的推移,流数据变得越来越流行,我们需要建立一个基于 ML 的系统,它可以使用这些实时数据,并有助于更复杂的数据分析。在本文中,我们学习了流式数据以及如何处理它。我们还看到了它与批量数据处理的不同之处。
我们还熟悉了一些可以帮助我们收集流数据的工具,后来在动手练习中,我们使用了其中的一个工具——Kafka。在动手练习中,我们看到了如何设置卡夫卡主题,以及如何将数据输入其中。一旦 Kafka 主题的数据可用,我们就可以解码并利用它来逐步训练我们的机器学习模型。
对于未来的工作,我们可以利用 Twitter API 并创建一个用于情感分析的机器学习模型,而不是使用 csv 文件。
快乐学习!
参考
流首个实时 ML
- 流式数据的机器学习:最新技术
- 用 Creme 对数据流进行机器学习
- 流式数据的 ML 预测
- 对流式数据的连续机器学习
- 为高频流数据建立人工智能模型
- 数据流的机器学习:真实例子
- Building AI models for High Frequency Streaming Data
- Machine Learning for Data Streams:Real Examples
迁移学习指南:带有 Keras 中图像和文本示例的实用教程
在大型数据集上训练一个神经网络可能需要数周时间。幸运的是,由于预训练模型的模型权重,这个时间可以缩短——换句话说,应用迁移学习。
迁移学习是一种在图像分类任务和自然语言处理任务中起作用的技术。在本文中,您将深入了解:
- 什么是迁移学习,
- 如何实现迁移学习(在 Keras 中),
- 图像分类的迁移学习,
- 自然语言处理中的迁移学习
那么,让我们开始学习吧!(无意双关…好吧,可能有一点)
什么是迁移学习?
迁移学习是利用预训练模型的特征表示,因此您不必从头开始训练新模型。
预训练模型通常在大规模数据集上训练,这些数据集是计算机视觉前沿的标准基准。从模型中获得的权重可以在其他计算机视觉任务中重复使用。
这些模型可以直接用于对新任务进行预测,或者集成到训练新模型的过程中。将预先训练的模型包括在新模型中导致更少的训练时间和更低的泛化误差。
当你有一个小的训练数据集时,迁移学习特别有用。在这种情况下,例如,您可以使用预训练模型的权重来初始化新模型的权重。后面你会看到,迁移学习也可以应用到自然语言处理问题上。
The idea of transfer learning
预训练模型的优势在于它们足够通用,可用于其他真实世界的应用程序。例如:
- 在 ImageNet 上训练的模型可以用于现实世界的图像分类问题。这是因为数据集包含 1000 多个类。假设你是一名昆虫研究者。你可以使用这些模型,并对它们进行微调来对昆虫进行分类。
- 对文本进行分类需要了解一些向量空间中的单词表示。你可以自己训练矢量表示。这里的挑战是,您可能没有足够的数据来训练嵌入。此外,培训需要很长时间。在这种情况下,您可以使用像 GloVe 这样的预训练单词嵌入来加快您的开发过程。
稍后您将探索这些用例。
迁移学习和微调有什么区别?
微调是迁移学习的可选步骤。微调通常会提高模型的性能。然而,由于您必须重新训练整个模型,您可能会过度适应。
过度拟合是可以避免的。只需使用低学习率重新训练模型或其一部分。这一点很重要,因为它可以防止对渐变进行重大更新。这些更新会导致性能下降。当模型停止改进时,使用回调来停止训练过程也是有帮助的。
为什么要用迁移学习?
假设您有 100 张猫和 100 只狗的图像,并且想要建立一个模型来对这些图像进行分类。如何使用这个小数据集训练一个模型?您可以从头开始训练您的模型,但它很可能会过度拟合。进入迁移学习。一般来说,你想使用迁移学习有两大原因:
- 高精度的训练模型需要大量的数据。例如,ImageNet 数据集包含超过 100 万张图像。在现实世界中,你不太可能有这么大的数据集。
- 假设你有那种数据集,你可能仍然没有在如此大的数据集上训练模型所需的资源。因此,如果你没有在大型数据集上训练模型所需的计算资源,迁移学习就很有意义。
- 即使你有可以支配的计算资源,你仍然需要等待几天或几周来训练这样一个模型。因此,使用预先训练好的模型会节省你的宝贵时间。
迁移学习什么时候不起作用?
当底层学习的高级特征不足以区分问题中的类别时,迁移学习将不起作用。例如,预先训练的模型可能非常擅长识别门,但不擅长识别门是关闭的还是打开的。在这种情况下,可以使用(预训练网络的)低级特征,而不是高级特征。在这种情况下,您必须重新训练模型的更多层或使用早期层中的特征。
当数据集不相似时,要素传递效果不佳。这篇论文更详细地调查了数据集的相似性。也就是说,如论文中所示,用预先训练的权重初始化网络比使用随机权重会产生更好的性能。
您可能会发现自己处于这样一种情况,即考虑从预先训练的模型中删除一些层。在这种情况下,迁移学习不太可能奏效。这是因为删除层会减少可训练参数的数量,从而导致过度拟合。此外,在不过度拟合的情况下确定要移除的正确层数是一个麻烦且耗时的过程。
如何实施迁移学习?
现在,让我们花点时间来看看如何实现迁移学习。
6 步迁移学习
你可以通过这六个步骤来实现迁移学习。
获取预训练模型
第一步是获得您希望用于解决问题的预训练模型。预训练模型的各种来源在单独的部分中介绍。
创建基础模型
通常,第一步是使用 ResNet 或 Xception 之类的架构实例化基本模式 l。您也可以选择下载预训练的重量。如果您不下载权重,您将不得不使用架构从头开始训练您的模型。回想一下,基本模型在最终输出层中通常会有比您需要的更多的单元。因此,在创建基础模型时,必须移除最终输出层。稍后,您将添加与您的问题兼容的最终输出图层。
冻结层,使它们在训练过程中不会改变
冻结预训练模型的层是至关重要的。这是因为您不希望这些层中的权重被重新初始化。如果是,那么你将会失去所有已经发生的学习。这将与从头开始训练模型没有什么不同。
base_model.trainable = False
添加新的可训练层
下一步是添加新的可训练层,这将把旧的特征变成新数据集上的预测。这很重要,因为预训练模型是在没有最终输出层的情况下加载的。
在数据集上训练新图层
请记住,预训练模型的最终输出很可能与您想要的模型输出不同。例如,在 ImageNet 数据集上训练的预训练模型将输出 1000 个类。然而,您的模型可能只有两个类。在这种情况下,您必须使用新的输出图层来训练模型。
因此,您可以随意添加一些新的密集层,但最重要的是,最终的密集层的单位与您的模型预期的输出数量相对应。
通过微调改进模型
完成上一步后,您将拥有一个可以对数据集进行预测的模型。可选的,你可以通过微调来提高它的性能。微调是通过解冻基础模型或其一部分,并以非常低的学习速率在整个数据集上再次训练整个模型来完成的。低学习率将提高模型在新数据集上的性能,同时防止过度拟合。
学习率必须很低,因为模型很大,而数据集很小。这是一个过度适应的处方,因此学习率低。完成这些更改后,请重新编译模型,以便它们能够生效。这是因为每当您调用编译函数时,模型的行为就被冻结了。这意味着每当您想要改变模型的行为时,您都必须再次调用编译函数。下一步将是再次训练模型,同时通过回调来监控它,以确保它不会过度拟合。
很简单,是吧?
去哪里找预先训练好的模特?
现在让我们讨论一下在哪里可以找到在应用程序中使用的预训练模型。
Keras 预训练模型
Keras 提供了 20 多种预先训练好的模型。它们是通过 Keras 应用 送达的。每个模特旁边都有预先训练好的重量。下载模型时,重量会自动下载。它们将存储在 ~/中。keras/models/
所有的 keras 应用程序都用于图像任务。例如,下面是如何初始化在 ImageNet 上训练的 MobileNet 架构。
model = tf.keras.applications.MobileNet(
input_shape=None,
alpha=1.0,
depth_multiplier=1,
dropout=0.001,
include_top=True,
weights="imagenet",
input_tensor=None,
pooling=None,
classes=1000,
classifier_activation="softmax",
)
使用 TensorFlow Hub 进行迁移学习
值得一提的是,Keras 应用程序并不是迁移学习任务的唯一选择。也可以使用来自 TensorFlow Hub 的模型。
model = tf.keras.Sequential([
hub.KerasLayer("https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/4",
trainable=False),
tf.keras.layers.Dense(num_classes, activation='softmax')
])
了解如何使用 Neptune 与 TensorFlow/Keras 的集成来跟踪 Keras 模型训练
预训练单词嵌入
单词嵌入通常用于文本分类问题。因为你可以训练你的单词嵌入,使用一个预先训练好的会快得多。这里有几个单词嵌入,您可以考虑用于自然语言处理问题:
拥抱脸
抱脸 提供了数千个预先训练好的模型,用于在文本上执行任务。一些受支持的功能包括:
- 问题回答
- 摘要
- 翻译和
- 文本生成,仅举几例
拥抱脸支持 100 多种语言。
这里有一个例子,你可以用拥抱脸来区分否定句和肯定句。
from transformers import pipeline
classifier = pipeline('sentiment-analysis')
classifier('We are very happy to include pipeline into the transformers repository.')
[{'label': 'POSITIVE', 'score': 0.9978193640708923}]
如何使用预先训练好的模型
有三种方法可以使用预训练模型:
- 预测,
- 特征提取,
- 微调。
预言;预测;预告
在这里,你下载模型,并立即使用它来分类新的图像。下面是一个用于分类 ImageNet 类的 ResNet50 的例子。
ImageNet 是一个广泛的图像集合,用于训练模型,包括 ResNet50。该数据集中有超过 100 万幅图像和 1000 个类。
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np
model = ResNet50(weights='imagenet')
img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
preds = model.predict(x)
print('Predicted:', decode_predictions(preds, top=3)[0])
特征抽出
在这种情况下,最后一层之前的层的输出将作为新模型的输入。目标是使用预先训练的模型或其一部分来预处理图像并获得本质特征。
然后,您将这些特征传递给一个新的分类器——无需重新训练基础模型。预先训练的卷积神经网络已经具有对于手头的任务很重要的特征。
但是,预训练模型的最终部分不会转移,因为它特定于其数据集。因此,您必须构建模型的最后一部分来适应数据集。
在自然语言处理领域,预训练的单词嵌入可以用于特征提取。单词嵌入有助于将单词放置在向量空间中的正确位置。它们为模型提供相关信息,因为它们可以将单词放在句子的上下文中。单词嵌入的主要目的是语义理解和单词之间的关系。结果,这些单词嵌入对于自然语言问题是任务不可知的。
微调
当你的新分类器准备好时,你可以使用微调来提高它的精确度。为了做到这一点,你解冻分类器,或者它的一部分,并且用低学习率的新数据重新训练它。如果要使基础模型(从预训练模型中获得)的要素制图表达与您的特定任务更加相关,微调至关重要。
您还可以使用预训练模型中的权重来初始化新模型中的权重。这里的最佳选择取决于你的问题,在你得到正确的答案之前,你可能需要做一些实验。
尽管如此,还是有一个标准的工作流程可以用来应用迁移学习。
我们去看看。
带 Keras 的图像迁移学习示例
有了这样的背景,让我们看看如何使用预先训练好的模型来解决图像和文本问题。尽管训练一个模型涉及许多步骤,但重点将放在迁移学习特有的六个步骤上。
图像数据的迁移学习
在这幅图中,让我们看看如何使用预训练模型来构建和微调图像分类器。让我们假设你是一个宠物爱好者,你想创建一个机器学习模型来对你喜欢的宠物进行分类;猫和狗。不幸的是,你没有足够的数据来做这件事。幸运的是,你熟悉 Kaggle ,可以得到一个小数据集。准备就绪后,您现在可以选择一个预先训练好的模型来使用。一旦你选择了你的预训练模型,你就可以开始用 Keras 训练模型了。为了说明,让我们使用在 ImageNet 数据集上训练的异常 架构。
如果您正在编写代码,请一步一步地遵循本节,正确地应用迁移学习。
获取数据集
我推荐使用 Google Colab,因为你可以获得免费的 GPU 计算。
首先,将数据集下载到 Colab 的虚拟机中。
!wget --no-check-certificate
https://namespace.co.ke/ml/dataset.zip
-O /content/catsdogs.zip
之后,解压缩数据集,并设置训练和验证集的路径。
import os
import zipfile
with zipfile.ZipFile('catsdogs.zip', 'r') as zip_ref:
zip_ref.extractall('/content/cats_dogs')
base_dir = '/content/cats_dogs/dataset'
train_dir = os.path.join(base_dir, 'training_set')
validation_dir = os.path.join(base_dir, 'test_set')
从目录中加载数据集
现在让我们从它们的位置加载图像。可以使用“image_dataset_from_directory”函数,因为它可以推断类标签。
该函数将从目录中创建一个[tf.data.Dataset](https://web.archive.org/web/20230131180149/https://www.tensorflow.org/api_docs/python/tf/data/Dataset)
。请注意,要实现这一点,目录结构应该如下所示:
导入所需的模块并加载培训和验证集。
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing import image_dataset_from_directory
training_set = image_dataset_from_directory(train_dir,
shuffle=True,
batch_size=32,
image_size=(150, 150))
val_dataset = image_dataset_from_directory(validation_dir,
shuffle=True,
batch_size=32,
image_size=(150, 150))
数据预处理
虽然数据预处理不是迁移学习中的一个特定步骤,但它是训练机器学习模型的一个重要步骤。因此,让我们对图像进行一些放大。将增强应用于训练集时,可以防止过度拟合,因为增强会将图像的不同方面暴露给模型。
当没有大量数据用于训练时,您尤其希望扩充数据。您可以使用各种转换来扩充它,例如:
- 随机旋转,
- 水平翻转,
- 缩放,
- 剪毛。
您可以在加载数据时应用这些转换。或者,正如你在下面看到的,你可以通过引入独特的层来增加。
data_augmentation = keras.Sequential(
[ keras.layers.experimental.preprocessing.RandomFlip("horizontal"),
keras.layers.experimental.preprocessing.RandomRotation(0.1),
]
)
这些层将仅在培训过程中应用。
通过将图层应用到同一张图像,您可以看到上述变换的结果。代码如下:
import numpy as np
import matplotlib.pyplot as plt
for images, labels in training_set.take(1):
plt.figure(figsize=(12, 12))
first_image = images[0]
for i in range(12):
ax = plt.subplot(3, 4, i + 1)
augmented_image = data_augmentation(
tf.expand_dims(first_image, 0)
)
plt.imshow(augmented_image[0].numpy().astype("int32"))
plt.axis("off")
下面是结果的样子(因为图像被打乱了,你可能会得到不同的结果):
从预训练的异常模型创建基础模型
让我们用 ImageNet 上训练的重量来加载模型。完成后,就定义了所需的输入形状。
include_top=False
表示您对模型的最后一层不感兴趣。因为模型是自下而上可视化的,所以这一层被称为顶层。排除顶层对于特征提取很重要。
base_model = keras.applications.Xception(
weights='imagenet',
input_shape=(150, 150, 3),
include_top=False)
接下来,冻结基础模型层,这样它们在训练过程中就不会更新。
由于许多预训练模型都有一个“TF . keras . layers . batch normalization”层,因此冻结这些层非常重要。否则,将更新层均值和方差,这将破坏模型已经学习的内容。让我们冻结这种情况下的所有层。
base_model.trainable = False
创建最终的密集层
加载模型时,您使用了“include_top=False ”,这意味着不包括预训练模型的最终密集层。现在是时候为这个模型定义一个最终输出层了。
让我们从标准化输入图像的大小开始。
inputs = keras.Input(shape=(150, 150, 3))
之后,应用数据扩充。
x = data_augmentation(inputs)
此模型需要范围在(-1,1)而不是(0,1)的数据。所以,你必须处理数据。
幸运的是,大多数预先训练好的模型都提供了这样的功能。
x = tf.keras.applications.xception.preprocess_input(x)
现在,让我们将模型定义如下:
- 确保基础模型在推理模式下运行,以便在微调阶段(设置“training=False ”)不会更新批量标准化层;
- 使用“GlobalAveragePooling2D ”,将基础模型的特征转换为矢量;
- 应用辍学正规化;
- 添加一个最终的密集层 r(当你使用` include_top=False 时,最终的输出层不包括在内,所以你必须自己定义)。
x = base_model(x, training=False)
x = keras.layers.GlobalAveragePooling2D()(x)
x = keras.layers.Dropout(0.2)(x)
outputs = keras.layers.Dense(1)(x)
model = keras.Model(inputs, outputs)
训练模型
现在可以训练顶层了。请注意,由于您使用的是预训练模型,验证准确性从一个已经很高的值开始。
model.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),metrics=keras.metrics.BinaryAccuracy())
model.fit(training_set, epochs=20, validation_data=val_dataset)
微调模型
可以通过解冻基础模型并以非常低的学习速率重新训练它来改进模型。
您需要监控这一步,因为错误的实现会导致过度拟合。首先,解冻基本模型。
base_model.trainable = True
更新可训练属性后,必须再次编译模型以实现更改。
model.compile(optimizer=keras.optimizers.Adam(1e-5),
loss=keras.losses.BinaryCrossentropy(from_logits=True),
metrics=keras.metrics.BinaryAccuracy())
为了防止过度拟合,让我们通过回调来监控培训损失。当模型连续五个纪元没有改善时,Keras 将停止训练。让我们也用 TensorBoard 来监控损耗和精度。
from tensorflow.keras.callbacks import EarlyStopping, TensorBoard
rm -rf logs
%load_ext tensorboard
log_folder = 'logs'
callbacks = [
EarlyStopping(patience = 5),
TensorBoard(log_dir=log_folder)
]
好了,到了重新训练模型的时候了。当它完成时,你会注意到与以前的模型相比有了一点改进。
model.fit(training_set, epochs=15,validation_data=val_dataset,callbacks=callbacks)
此时,您已经有了猫狗分类数据集的工作模型。
如果您使用实验平台跟踪它,那么您现在可以保存模型并将其发送到您的模型注册中心。
自然语言处理中迁移学习的例子
在自然语言处理领域,你可以使用预先训练的单词嵌入来解决文本分类问题。我们举个例子。
预训练单词嵌入
嵌入的一个字是一个表示文档的密集向量。在向量中,意思相似的单词看起来靠得更近。你可以使用 Keras 中的嵌入层来学习单词 embedding。训练单词嵌入需要很多时间,尤其是在大型数据集上,所以让我们使用已经训练好的单词嵌入。
几个流行的预训练单词嵌入是 Word2vec 和 GloVe 。
让我们看一个在迁移学习中使用手套单词嵌入的完整例子。
加载数据集
本图将使用一个情感分析数据集。在加载它之前,让我们导入这个任务需要的所有模块。
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.layers import Embedding, LSTM, Dense, Bidirectional
from tensorflow.keras.models import Sequential
import numpy as np
import pandas as pd
接下来,下载数据集并使用 Pandas 加载它。
!wget --no-check-certificate
https://drive.google.com/uc?id=13ySLC_ue6Umt9RJYSeM2t-V0kCv-4C-P -O /tmp/sentiment.csv
-O /tmp/sentiment.csv
df = pd.read_csv('/tmp/sentiment.csv')
目标是预测上面的情绪栏。由于这是文本数据,所以必须将其转换为数字形式,因为这是深度学习模型所期望的。
选择特征,然后目标将数据分成训练集和测试集。
X = df['text']
y = df['sentiment']
from sklearn.model_selection import train_test_split
X_train, X_test , y_train, y_test = train_test_split(X, y , test_size = 0.20)
数据预处理
因为这是文本数据,所以必须对其进行处理,以便为模型做好准备。这不是特定于文本分类中的迁移学习,而是一般的机器学习模型。
修饰词语
要将句子转换成数字表示,请使用“Tokenizer”。Tokenizer 删除标点符号和特殊字符,并将句子转换为小写。
只需创建一个“tokenizer”实例,并使其适合训练集。你必须定义你想要的词汇量。还定义了一个词外标记来表示测试集中词汇表中找不到的词。
vocab_size = 10000
oov_token = "<OOV>"
tokenizer = Tokenizer(num_words = vocab_size, oov_token=oov_token)
tokenizer.fit_on_texts(X_train)
您可以使用单词索引来查看单词是如何映射到数字的。
word_index = tokenizer.word_index
让我们把单词转换成序列,这样一个完整的数字序列就可以代表每个句子。这是通过使用来自记号赋予器的“texts_to_sequences”完成的。
X_train_sequences = tokenizer.texts_to_sequences(X_train)
由于句子的长度不同,序列也将有不同的长度。但是,对于机器学习模型,序列需要具有相等的长度。这可以通过截断较长的句子并用零填充较短的句子来实现。
使用“post”进行填充会在序列末尾添加零。截断类型的“post”将在末尾截断长度超过 100 的句子。
padding_type='post'
truncation_type='post'
max_length = 100
使用手套嵌入
现在,这是特定于自然语言处理中的迁移学习。首先,让我们下载预先训练好的单词嵌入。
!wget --no-check-certificate
http://nlp.stanford.edu/data/glove.6B.zip
-O /tmp/glove.6B.zip
接下来,将它们提取到一个临时文件夹中。
with zipfile.ZipFile('/tmp/glove.6B.zip', 'r') as zip_ref:
zip_ref.extractall('/tmp/glove')
现在,使用这些单词嵌入到创建你自己的嵌入层。加载手套嵌入,并将它们添加到字典中。
embeddings_index = {}
f = open('/tmp/glove/glove.6B.100d.txt')
for line in f:
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
f.close()
print('Found %s word vectors.' % len(embeddings_index))
使用此字典为训练集中的每个单词创建嵌入矩阵。为此,使用‘embedding _ index’获得每个单词的嵌入向量。
embedding_matrix = np.zeros((len(word_index) + 1, max_length))
for word, i in word_index.items():
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector
如果找不到某个单词,零将表示它。例如,这是单词 bakery 的嵌入向量。
embeddings_index.get("bakery")
创建嵌入层
此时,您可以创建嵌入层。以下是一些需要注意的事项:
- 将“可训练”设置为假是至关重要的,因为你要确保这一层不会被重新训练;
- 权重被设置为你刚刚创建的嵌入矩阵;
- ` len(word_index) + 1 '是加上 1 的词汇表的大小,因为 0 被保留用于填充;
- “输入长度”是输入序列的长度。
embedding_layer = Embedding(len(word_index) + 1,
max_length,
weights=[embedding_matrix],
input_length=max_length,
trainable=False)
创建模型
现在,您可以使用这个嵌入层来创建模型。双向 LSTMs 用于确保信息来回传递。
model = Sequential([
embedding_layer,
Bidirectional(LSTM(150, return_sequences=True)),
Bidirectional(LSTM(150)),
Dense(6, activation='relu'),
Dense(1, activation='sigmoid')
])
训练模型
您现在可以编译和训练模型了。
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
当模型训练停止改进时,可以使用早期停止回调来停止训练过程。您可以使用 TensorBoard 回调来监控模型损失和准确性。
from tensorflow.keras.callbacks import EarlyStopping, TensorBoard
%load_ext tensorboard
rm -rf logs
log_folder = 'logs'
callbacks = [
EarlyStopping(patience = 10),
TensorBoard(log_dir=log_folder)
]
num_epochs = 600
history = model.fit(X_train_padded, y_train, epochs=num_epochs, validation_data=(X_test_padded, y_test),callbacks=callbacks)
使用“评估”功能可以评估模型的性能。
loss, accuracy = model.evaluate(X_test_padded,y_test)
print('Test accuracy :', accuracy)
不错!您已经使用预先训练的单词嵌入训练并测试了一个自然语言处理模型。
就这些了,伙计们!
在本文中,您探索了迁移学习,并举例说明了如何使用它来更快地开发模型。你在图像分类和自然语言处理任务中使用了预先训练好的模型。我希望你喜欢它,谢谢你的阅读!
PS。:下面是图像分类 Colab 和自然语言处理 Google Colab 供大家参考。
如果你想了解更多关于迁移学习的内容,请随意查看其他资源:
用于文本数据预测的转换器模型
原文:https://web.archive.org/web/https://neptune.ai/blog/transformer-models-for-textual-data-prediction
诸如谷歌的 BERT 和 Open AI 的 GPT3 等变形金刚模型继续改变着我们对机器学习(ML)和自然语言处理(NLP)的看法。只要看看 GitHub 最近推出的一款名为 Copilot 的预测编程支持工具就知道了。它接受了数十亿行代码的训练,并声称理解“你提供的上下文,并合成代码以匹配”。你的虚拟搭档程序员伙伴!
我们已经在最近的文章中写过这些模型和底层的变压器架构。我们还查看了最近对不同 Transformer 模型的研究,以理解为什么 BERT 和 GPT3 的底层架构比其他模型更好地学习上下文。
现在,像 Copilot 一样,我们希望在现实生活中实现这些模型的一些功能。因此,在这篇文章中,我们将看看使用变形金刚预测文本不同特征的实用方法。在此之前,我们需要确定我们可以预测哪些类型的特征,并理解为什么预测文本不同于其他形式的预测。
预测还是不预测?
How does predicting text differ from other forms of prediction? | Source
预测文本数据不同于其他形式的预测。如果您想要预测某项资产(如股票或房屋)的价格,您可以向模型提供所有可用的数据,并预测您认为最能代表该资产的数字。价格是一个数字,虽然它可能是对的,也可能是错的,但它没有文本那么多潜在的“不确定性维度”。
以副驾驶为例。它预测代码片段,所以它可能拼错代码,使用错误的编码语言,使用不正确的变量名,等等。即使它做到了所有这些,代码本身也可能不起作用。
类似地,一个句子可能在语法上是正确的,但是在语义上是没有意义的。诺姆·乔姆斯基写了一句著名的句子“无色的绿色想法疯狂地睡觉”,以显示机器区分语法和语义的困难。
这就是我们所说的预测文本比价格有更多的“不确定性维度”的意思。与其他形式的数据(如资产价格)相比,文本在更多方面可能是“错误的”。为了控制这种程度的不确定性,我们试图识别我们想要预测的文本数据的特定特征。
这些特性在大多数以业务为中心的 NLP 管道中也应该是有用的。考虑到这一点,我们将在本帖中探讨以下特性:
- 预测拼写错误:文本出错最简单的方法之一就是简单地拼错句子中的一个或多个单词。这个单词要么拼写正确,要么拼写错误。我们每天都在 Gmail 等应用程序的自动更正功能中看到这种情况,所以我们可以看看如何使用基于 Transformer 的模型轻松实现这样的功能。
- 预测语法错误:识别句子中的语法错误要稍微困难一些。我们可以使用基于 Transformer 的模型来预测一个句子是否包含语法错误吗?这可能是您在处理数据时使用的东西,以确定它是否需要更改或从您的管道中删除,因为它可能会增加系统中下游错误的可能性。
- 预测转述句子:通常当我们查看文本数据时,我们试图理解某些句子是否相关。思考这个问题的一种方式是,我们是否能够预测一个句子何时会转述另一个句子。这项任务比简单地寻找拼写错误或语法错误有更多的细微差别。原因是它涉及到识别两个句子的上下文,并预测一个句子和另一个句子描述相同的意图是否合理。这在处理大量文本数据时很有用,并且您希望搜索或识别可能相关但不完全相同的文本。
在研究这些特性的同时,我们还将研究一些不同的 NLP 库,它们使用转换器来执行一系列的 NLP 功能。您可以在 NLP 管道中使用这些库,它们也可以帮助您更好地理解如何将 Transformers 用于您的特定任务和用例。
这篇文章中描述的代码可以在相关的 Github repo 中找到。
用转换器预测文本数据
数据集
为了预测文本数据,我们希望使用一个表示“真实”查询和对话的数据集。我们所说的“真实”是指它包含了你在 Slack 或电子邮件中输入的所有混乱的东西。也就是说,它应该包含语法错误和拼写错误,使用缩写,以及所有其他我们可以找到的不太完美的方式来构建一个句子。
这类数据的一个重要来源是亚马逊客户支持 QA 数据集。具体来说,我们将使用问题的软件类别,因为我们想看看我们的方法是否可以识别相关领域内的主题。这个数据集很棒,因为:
- 它包含真实问题,有我们想要的所有乱七八糟的问题,比如拼写错误、作为陈述的问题、有否定和无否定的问题,以及我们想以不同方式问同样问题的所有其他方式。
- 所有的问题都有关联的答案,有些是长答案,有些是简短的是/否答案。
- 数据集被分成不同的类别。一些数据集包含各种不同主题的综合问题。这并不复制典型的业务客户数据集,该数据集将与特定的业务或技术领域相关。
- 它包含了关于如何最好地将其转换成不同格式的代码示例。作者提供了有用的代码片段来帮助将数据转换成您认为最有用的解析格式。
按照数据集作者概述的步骤,我们最终得到一个熊猫数据框架,如下所示:
We use a DF here but you can transform your data into whatever data structure you find easiest to work with. | Source: Author
预测拼写错误
Can we use transformers to better predict when a word is misspelled? | Source
作为对我们预测技能的第一个测试,我们将尝试识别数据集中的拼写错误。我们现在在几乎每个应用程序中都经常看到这个特性,以至于我们可能认为这是一个简单的问题。然而,这里的关键区别在于,我们正在执行一项预测任务,而不仅仅是向操作员建议一个潜在的拼写。
例如,如果您有一个管道,在那里您正在做诸如清理新的或传入的数据之类的事情,那么您可能会有一个消耗该数据的下游任务。下游任务可以是将数据用于训练目的的模型,或者将数据用于聚类的模型,或者是问答类型的模型。在这些情况下,重要的是特定领域的数据或特定术语或俚语不会被错误地识别为拼写错误的单词并被更改。这可能会给你的下游任务带来严重的后果。
由于有了预先训练好的模型,Transformers 使许多这类应用程序更容易实现。然而,尽管这些模型令人惊叹,您仍然需要关注您的特定用例。也许你不需要一个预先训练好的模型的所有附加功能,一个简单的拼写检查就可以了。或者,您可能想看看一些最新的 transformer 模型应用程序,看看它们是否为您的用例添加了任何新的和独特的价值。
这种方法的一个很好的例子是神经拼写校正库, NeuSpell 。NeuSpell 在神经网络上接受训练,通过使用相邻单词的上下文而不仅仅是字符扰动来学习拼写纠正。为了了解这种背景,他们使用 ELMo 和 BERT 等模型以及其他神经网络。你可以在这里找到 github 回购。
另一种方法是基于上下文的方法,就像 spaCy 通过他们的上下文拼写检查提供的方法。这使用 BERT 来在识别错误或建议更正时利用单词的上下文。
让我们先来看一下这两种方法的一些例子,看看它们在实际中是怎样的。我们将从我们的测试集中抽取 20 个句子的样本,查看两个模型,看看他们认为什么是拼写错误。
for q in original_queries:
doc = nlp(q)
spacy_misspell = doc._.performed_spellCheck
print(f'='*(len(q)))
print(q)
print(f'='*(len(q)))
print(f'-------- spaCy -------- ')
if spacy_misspell:
print(f'spaCy> spelling error detected')
print(doc._.suggestions_spellCheck)
print(doc._.outcome_spellCheck)
for i in doc._.score_spellCheck:
print(i)
for s in doc._.score_spellCheck[i]:
print(s)
else:
print(f'spaCy> No spelling error detected')
neuspell_res = checker.correct(q)
print(f'-------- NeuSpell -------- ')
print(neuspell_res)
在上面的代码中,您可以看到 spaCy 模型使我们能够检查在给定的字符串中是否确实检测到了拼写错误。您还可以查看最有可能的建议更正以及相应的分数。这些都是非常有用的功能,使您能够看到实际上是否有错误,以及模型对潜在的替代替换单词有多大的信心。
例如,查询“do you need a proceser”似乎有一个明显的拼写错误。然而,spaCy 模型似乎认为这更像是一个上下文任务,而不是拼写错误:
do you need a procceser
=======================
spaCy: spelling error detected
-----------------------
{procceser: 'coffee'}
do you need a coffee
procceser
('?', 0.85842)
('.', 0.04466)
('...', 0.00479)
(';', 0.00453)
('-', 0.00416)
('coffee', 0.00275)
('!', 0.00234)
('phone', 0.00203)
('>', 0.00153)
('room', 0.00138)
而 NeuSpell 模型确实识别了正确的拼写错误:
-----------------------
NeuSpell:
-----------------------
do you need a processor
spaCy 模型还显示了更多与上下文相关的修正,例如:
Does this work well for canada?
===============================
spaCy: spelling error detected
-------------------------------
{canada: 'anyone'}
Does this work well for anyone?
canada
('you', 0.58046)
('him', 0.11493)
('me', 0.09218)
('her', 0.06952)
('us', 0.0262)
('them', 0.02586)
('anyone', 0.00408)
('everyone', 0.00391)
('ya', 0.00098)
('now', 0.00094)
潜在的更正很有趣,因为它们看起来更像是与上下文相关的变化,而不是拼写错误。如果您将“加拿大”替换为大写的“C”,即“这对加拿大有用吗?”使用空间模型不会导致任何变化。即使使用加拿大的小写拼写,NeuSpell 模型也不会更正原始句子。
您可以浏览数据集,查看更多关于这些模型如何相互比较的示例。即使粗略地看一下,这两种型号似乎都有问题。总的来说:
- spaCy 模型似乎专注于上下文:spaCy 模型有很多很好的特性,比如为潜在的替代者提供一个置信度得分。然而,它的建议更多的是基于上下文而不是拼写错误。在几个简单的例子中,如果我们的主要焦点是纠正潜在的拼写错误的话,它会产生一些看起来有问题的建议。这只是一个例子,可能有办法使用其他 spaCy 工具来调整它,或者改变它,使它更适合您的用例。但是现在,预测拼写错误的单词的纠正似乎没有用。
- neu spell 模型不提供置信度得分:neu spell 模型作为一个预测拼写错误单词纠正的模型,似乎表现得更好。它产生了比 spaCy 模型更合理的建议,所以你可以考虑使用它。它是否比其他标准(即非基于神经网络的)模型更好还有待商榷。此外,它似乎没有为其建议提供置信度得分的事实可能会限制其预测能力。如果能够查看置信度得分并选择是否接受建议,那就太好了。这将使 NLP 管道中的过程更容易自动化,并且确信您不是在“纠正”特定领域的术语,如产品名称。
- 传统的拼写检查可能更适合你的任务:看起来基于转换器的拼写检查可能不会比传统类型的方法提供更多的优势。但是,关注像这样的新应用总是好的,这些应用可能会通过像伯特或 GPT 这样的新 NLP 模型得到改进。
预测语法错误
Do Transformer models like T5 make it easier to predict grammar errors in a sentence? | Source
虽然我们的拼写模型可能没有取得巨大成功,但希望我们在识别数据集中的语法错误方面运气更好。同样,如果您想在下游任务中使用您的数据,这很有用。
或者你可能想用一个句子去找其他类似的句子。在这种情况下,知道原文是否是一个好的、干净的、结构良好的句子是很有用的。如果它确实包含一些语法错误,那么这可能是你在查看相似性匹配分数时要考虑的事情。
像谷歌的 T5 文本到文本转换器,这是在 2020 年发布的,是基于转换器的模型的例子,可以执行多种任务,如识别正确或错误的语法。T5 型号的有趣之处在于:
- 它在许多自然语言处理任务上接受训练:该模型在广泛的自然语言处理任务上接受训练,从识别相似性、总结文本到识别语法错误。所有这些任务都使用相同的模型、损失函数和超参数。理论上,这类似于你或我学习语言的方式,即我们学习字母表,我们学习读写和拼写,回答问题,然后我们将所有这些知识结合起来,以便能够完成非常高级的语言任务。现在,我们并不是说这些模型理解语言的方式和我们一样,但它们已经开始在一些 NLP 任务中表现得接近或接近人类。
- 它使用文本进行输入和输出:这个模型的另一个关键点是,你只需通过文本告诉模型你想要它做什么,它提供的结果也总是文本格式的。这与像 BERT 这样的模型非常不同,在 BERT 模型中,输入可能是一个句子,但输出是一个实体,如大规模多维向量。相反,用 T5,你通过文本告诉它,你想让它执行什么任务,提供这个任务的文本,它会用文本告诉你结果。就抽象而言,这是一个巨大的飞跃。想一想 C 或 Java 等编码语言和 Python 的区别。Python 是一个如此高层次的抽象,它使得更多的人能够编程,并开辟了如此多的潜在用例。同样,当人们惊叹于 GPT-3 的强大时,我对它简单的界面印象深刻。真正的天才不在于无数的参数,而在于易用性,这使得人们能够生成文本、回答问题,并对他们所看到的感到惊讶,否则他们将无法测试基于 transformer 的高级模型。
你可以直接通过其 github 页面或者从 HuggingFace 库使用 T5。或者,也是我喜欢首先使用的方法,您可以尝试找到另一个库,其中包含一个抽象层,这样更容易使用。这样你可以快速测试模型,看看它是否适合你的用例。
如果是这样,那么您可以投入时间部署和测试“原始”模型,这可能使您能够在更加定制的基础上训练和调整它。最近,许多这种“抽象”类型库也允许您执行这些任务,所以您可能不需要做任何进一步的研究。
识别有语法错误的句子
如果你浏览我们的亚马逊数据集,你可以看到语法不正确的句子,例如“用户下载时有问题吗?”或者“这样开餐厅好不好”。
这是意料之中的,因为这是一个真实的数据集,我们都知道在网上聊天时很容易发生这类错误。正如我们前面提到的,如果您将客户数据用于下游任务,或者只是将清理数据作为最佳实践,那么您将需要识别句子中何时存在语法错误。结合拼写错误,您可以为您的管道创建一种质量分数,您可以在其中为您想到的任何下游任务排列更高质量的数据。
T5 执行这些类型的任务,基于 T5 任务的一个很好的“抽象”库是约翰斯诺实验室 Spark NLP 库。 Spark NLP 是一个 NLP 库,类似于 spaCy 或 NLTK 这样的库,在一个屋檐下提供了一系列的 NLP 功能。John Snow Labs 是一家为医疗保健等行业提供 NLP 服务的公司,它还提供一系列免费的 NLP 实用程序。不用说,这就是我们在这里看它们的原因。
要设置任务,您需要首先确定要使用的模型。约翰斯诺实验室提供其他模型,但现在我们将使用 T5。
documentAssembler = DocumentAssembler()
.setInputCol("text")
.setOutputCol("document")
t5 = T5Transformer.pretrained(name='t5_base',lang='en')
.setInputCols('document')
.setOutputCol("T5")
然后你需要告诉它你要执行的任务。
t5.setTask('cola sentence:')
pipe_components = [documentAssembler,t5]
pipeline = Pipeline().setStages( pipe_components)
现在我们只需要测试数据中的一些例句。
sentences = test_dataset_df['question'].sample(n=20).tolist()
sentences = [[x] for x in sentences if len(x) < 90]
df = spark.createDataFrame(sentences).toDF("text")
model = pipeline.fit(df)
annotated_df = model.transform(df)
annotated_df.select(['text','t5.result']).show(truncate=False)
This is the example output from identifying which sentences are grammatically correct | Source: Author
从上面的例子可以看出,它既识别了一个语法错误,也识别了一个拼写错误。我们可以将它与上面的拼写纠正库结合使用,看看我们需要对哪些句子进行拼写检查。这可能是解决我们之前提到的问题的另一种方法,当时我们没有一个单词拼写错误可能性的置信度得分。一旦我们知道有语法错误,我们就可以通过拼写检查,因为我们知道这个句子有问题。
再说一次,这是我们可以用来检查数据质量的另一个“引以为傲”的东西。你可以点击这里查看约翰斯诺图书馆提供的大量例子和演示。
您可以找到大量使用 T5 和其他 transformer 模型预测文本的其他示例。您还可以使用库管道结构来轻松创建自己的 ML 管道,以便按顺序执行所有这些任务。关于所有可用任务的列表,你可以阅读这篇介绍性文章,它列出了所有 T5 任务和解释。
预测转述句子
Can BERT help us predict paraphrased sentences? | Source
到目前为止,我们试图预测我们的测试句子是否包含拼写错误的单词或语法错误。现在,假设我们将这些“检查”添加到我们的 NLP 管道中,其输出将是“干净”句子的预测器。这些“干净”的句子可以代表正确形成的客户询问。这一过程的最后一步可能是尝试并预测一个句子是否是数据集中已经存在的句子的意译。
这可能是一个有用的工具,看看你是否需要处理或分组任何新的句子。如果它们已经存在,那么你可能已经有了信息。如果您正在创建一个训练数据集,那么您可能需要相应地对句子进行分组和标记。以这种方式预测转述的句子有两个主要好处:
- 很快:你可以找到相似的句子,而不是预测转述的句子。这需要将每个句子与其他句子进行比较,找出最相似的句子。如果您有大量数据,这可能会非常慢。
- 它可以使用预先训练好的模型:因为我们只寻找句子的释义版本,我们可以使用预先训练好的模型。或者,如果我们直接比较句子,我们可能需要对模型进行微调,以理解医学或法律术语之类的东西,如果我们在那个领域的话。当我们使用解释模型时,我们希望主要关注用不同的方式来表达问题。例如,想一个类似“的句子,deefee 要多少钱?”。这是一个由一个词组成的句子,这个词没有任何意义,但这并不妨碍我们把它解释为:
- deefee 的价格是多少?
- 参加 deefee 需要多少费用?
- deefee 的成本是多少?
- 段落免费吗?
- 段落免费吗?
- deefee 很贵吗?
**deefee–我通过一个叫做的酷网站生成了这个单词,这个单词并不存在,它基于 GPT2 生成了不存在的单词,但它也生成了这些单词的定义。看到模型想出的东西很有趣。例如,它将 deefee 定义为“一个赌丨博事件*”。
用句子预测释义
句子 BERT 是一个巨大的模型库,最初开始使用 BERT 和一个暹罗网络来生成语义上有意义的句子嵌入,然后您可以使用它来进行分类或句子相似性等工作。它现在有一系列不同的模型可用,你可以用它来完成许多 NLP 任务,它现在也可以作为 HuggingFace 库的一部分。
我们将使用他们的转述模型来识别亚马逊数据集中的转述句子。注意,你也可以通过 HuggingFace 库或者作为句子转换器库本身的一部分来使用这个模型。
我们首先需要下载模型,这很容易,因为它是 HuggingFace 的一部分:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
然后,我们需要从数据集中获取一个句子样本进行测试:
sentences = test_dataset_df['question'].sample(n=10).tolist()
for i, s in enumerate(sentences, 1):
print(f'{i}: {s}')
1: Will this work on a 64bit system?
2: If I buy print shop 23 can I access my old files from print shop 22?
3: does this work on a macbook mid 2010 laptop??? (Macintosh HD OS X version 10.9.4)
4: how can i play it on my mac 0s x?
5: upgrade from FMP 6? Will FMP 10 upgrade from FMP 6?
6: Can you send me only the activation code?
7: Can you use this to renew an existing subscription to McAfee Internet Security?
8: What are options for sound editing?
9: Is this useful for walking directions?
10: does the instrumentation include a generous offering from the indian orchestra plus the hammered dulcimer?
这里看起来类似的句子不多,我们来看看模型是怎么想的。
paraphrases = util.paraphrase_mining(model, sentences, top_k=1)
for paraphrase in paraphrases[0:100]:
score, i, j = paraphrase
para_list.append([round(score, 2), sentences[i], sentences[j]])
para_df = pd.DataFrame(para_list, columns=['Paraphrase Likelihood', 'Sentence 1', 'Sentence 2'])
para_df.index = np.arange(1, len(para_df) + 1)
para_df.index.name = 'Result'
para_df
Predicting paraphrasing with Sentence BERT | Source: Author
我们可以看到,这些例句中的一些是相互转述的可能性很低,42%是我们在这里看到的“在 2010 年中期的 macbook 笔记本电脑上工作吗??? (Macintosh HD OS X 版本 10.9.4) 【被转述】如何在我的 mac 0s x 上播放?
这一点的美妙之处在于,我们可以很容易地将它应用到大量的例子中。在我们的亚马逊数据集中,我们有超过 7500 个例子。让我们看看我们可以预测哪些可能的释义。处理所有 7,588 个示例需要 14 秒多一点。这个时间可能会有所不同,取决于你在哪里运行你的笔记本电脑,但一般来说,这是很快考虑到它在引擎盖下做什么。
%%time
paraphrases = util.paraphrase_mining(model, all_sentences, top_k=1)
CPU times: user 5min 34s, sys: 27.4 s, total: 6min 2s
Wall time: 13.6 s
我们的最佳结果是几乎相同的句子,所以它们并不是真正的相互转述。
Predicting paraphrasing with Sentence BERT | Source: Author
但是,如果我们看看一些较低的分数,我们可以看到它确实捕捉到了一些有趣的语言细微差别。
para_df.query('0.75 <= `Paraphrase Likelihood` <= 0.85')
Predicting paraphrasing with Sentence BERT | Source: Author
为了更好地观察,让我们看一下随机抽样的结果。
for row in sample_prar_df.sample(n=20).itertuples():
print(row[2])
print(f'------------------ {row[1]}------------------')
print(row[3])
print('='*50)
Is this version a subscription product that has to be renewed every year?
------------------ 0.82------------------
Is this a subscription for one year?
==================================================
Is it a renewal or not&
------------------ 0.77------------------
Is this a 1 yr renewal. It didn't say anything on the listing. Thanks
==================================================
Is this original installation software or only an update? I do not have iLife on my computer.
------------------ 0.76------------------
Is ilife 9 a stand alone program or an upgrade of previous ilife software?
==================================================
Do you have to use Dragon with a microphone?
------------------ 0.75------------------
Can it work with Dragon Naturally Speaking?
==================================================
Can I transfer from Quicken for PC to quick book for Mac
------------------ 0.76------------------
Is this version of Quicken for Mac ok to buy
==================================================
can i use this on all three of my macs?
------------------ 0.83------------------
Can this be installed into 3 Macs?
==================================================
Will this version allow for 1 user/ 2 computers?
------------------ 0.81------------------
Can I install on two computers for 1 user?
==================================================
My MAC does not have a CD drive - can this be downloaded?
------------------ 0.78------------------
Does this come with a CD? Or is it a download? My new MacBook doesn't have a CD slot.
==================================================
you send me the codes via email?
------------------ 0.76------------------
if i buy this one you will send the code to my e-mail ?
==================================================
can it be put on computer
------------------ 0.75------------------
can i install this on my computer can my sister put it on her computer also
==================================================
Better than Quicken? Is there something better than Quicken for Mac?
------------------ 0.81------------------
Is this version of Quicken for Mac ok to buy
==================================================
is efile included? -- nothing is specifically mentioned other in the comparison of products
------------------ 0.79------------------
Does it include free efile
==================================================
Can I just simply rip DVDs, including those infused with copy protection?
------------------ 0.84------------------
can I rip dvd's, cd's with this download?
==================================================
Can you please tell me if this is compatible with Mac Mountain Lion or Mavericks?
------------------ 0.81------------------
Will this version work with mac Mavericks?
==================================================
Will this work on a windows 8 tablet ?
------------------ 0.83------------------
will this work on Windows 8?
==================================================
what is the license deal? What's the deal here?
------------------ 0.76------------------
Can you be more specific about license specifications? Thanks for info
==================================================
Can I use this software on my macbook and if so how?
------------------ 0.83------------------
Can this software work on a Mac?
==================================================
can you do business cards and is there clipart
------------------ 0.82------------------
Can you make business cards?
==================================================
What are the main improvements of Manga Studio EX 5 to the previous EX version? Is it worth the upgrade?
------------------ 0.75------------------
What is the main difference between Manga Studio 5 and Manga Studio EX5?
==================================================
can I install it on my laptop?
------------------ 0.85------------------
Can I install it on my desktop and laptop?
这里有一些有趣的细微差别,因为人们用混乱而真实的方式表达问题,如“什么是许可协议?”。上面我们可以看到这样的措辞:
- 什么是许可协议?这是怎么回事?
- 你能更具体地说明一下许可证的规格吗?感谢信息
这些例子被看做是彼此的转述,得分 0.76。这很好,因为句子的结构非常不同。你或我会知道它们是相似的,但很难编写规则来知道这些类型的句子是相似的。
同样,如果我们看这些例子:
- 包含 efile 吗?—产品对比中未特别提及其他内容
- 是否包含免费文件
我们认为这些被预测为得分为 0.79 的转述。同样,第一句话比第二句话长得多,包含的信息对于确定这些信息是否与同一主题相关并不真正有用,例如,声明产品中没有提到它是额外的信息,但不会改变问题的性质。查询答案"是否包含免费 efile?”很可能是与第一个查询相同的答案。
在上面的例子中,我们预测了数据集中转述句子的最佳例子。换句话说,对于每一句话,该模型将在数据集中找到最佳的释义替代示例。我们可能希望找到不止一个例子,因为在这样的数据集中,很可能有多个潜在的释义例子。我们可以通过改变 top_k 参数来做到这一点。
paraphrases = util.paraphrase_mining(model, all_sentences, top_k=5)
para_list = []
for paraphrase in sorted(paraphrases, key=lambda x: x[1], reverse=True):
score, i, j = paraphrase
para_list.append([round(score, 2), all_sentences[i], all_sentences[j]])
para_df = pd.DataFrame(para_list, columns=['Paraphrase Likelihood', 'Sentence 1', 'Sentence 2'])
para_df.index = np.arange(1, len(para_df) + 1)
para_df.index.name = 'Result'
para_df
Predicting paraphrasing with Sentence BERT | Source: Author
结论
在这篇文章中,我们看了一些基于 transformer 的模型被用来预测文本的不同特征的方法。我们研究了三个主要领域,从基于单词到基于语法,再到整个句子,这三个领域的复杂性都在增加。我们关注的主要领域是:
- 预测拼写错误:我们使用了许多库,如 spaCy 和 NeuSpell,并展示了它们如何使用底层的 transformer 模型来尝试和预测拼写错误。最终,与传统算法相比,基于转换器的模型可能不会为纠正拼写错误增加太多价值。但这里的关键是,我们看了一些有用的库,现在更好地理解了这个问题,并可能使用这些库的一些其他功能,因为我们知道他们
- 预测语法错误:我们接着查看了约翰·斯诺实验室的 NLP 库,它提供了一系列漂亮的特性。我们使用语法错误特征来尝试和预测我们数据集中的一个句子在语法上是否正确。基于 Transformer 的模型似乎更适合这项任务,它似乎可以正确识别句子样本中的语法错误。在实现下一个 NLP 管道时,一定要牢记在心。
- 具有讽刺意味的是,随着我们任务的语言复杂性的增加,transformer 模型似乎提供了更多的价值。我们使用句子转换器库在亚马逊数据集中查找句子,这些句子是数据集中其他句子的释义。这看起来非常有用,因为模型不知道我们的例子中使用的技术术语、版本和短语。这似乎是一个特性,您可以用它来识别一个新的客户查询实际上是否只是一个更常见的查询的重新表述。
很明显,越来越多的应用程序建立在基于 transformer 的模型之上,这将更容易为您的特定用例找到和使用应用程序。理想情况下,您可以找到一个库来执行您需要的所有功能,但是正如我们在这里看到的,如果您不能在一个地方找到您需要的所有功能,您可以一起使用不同的库。
参考
下面是我们在这篇文章中使用的库的列表。您可以在这些库中找到更多的特性,所以一旦您开始使用它们,我鼓励您查看您认为可能对您的用例有用的任何其他特性:
- spaCy projects:spaCy projects 是一个检查酷炫新车型的好地方。如果你愿意,你可以在这里上传你自己的模型!
- 我们用这个库做了一个不同的拼写检查的例子。
- 约翰·斯诺实验室:为了进行语法检查,我们使用了这个库中的例子。正如我所提到的,这里有这么多很酷的 NLP 特性和模型可以免费获得,你很可能会找到对你的用例有用的东西。
- 句子变形金刚:最后,为了释义,我们使用了句子变形金刚库。和约翰·斯诺实验室一样,在他们的网站上有很多基于变压器模型的不同应用的例子。
Transformer NLP 模型(Meena 和 LaMDA):它们是“有感觉的”吗?这对开放域聊天机器人意味着什么?
原文:https://web.archive.org/web/https://neptune.ai/blog/transformer-nlp-models-meena-lamda-chatbots
首先,这不是一个关于谷歌最新的深度学习自然语言处理 (NLP)模型 LaMDA 是否是《2001:太空漫游》中有感知能力的人工智能(AI)计算机 Hal-9000 的现实版的帖子。这并不是说这是一个毫无意义的问题。恰恰相反,这是一个很可能主导未来人工智能研究的讨论。
然而,现在一个更紧迫的问题是这些主张对 NLP 的现状意味着什么。
- 例如,这些模型与其更早的祖先之间的关键技术差异是什么?
- 这些模型可以用于不同的 NLP 任务吗?
- 如果是,那么训练这些模型需要哪些数据?
由于早期 NLP 模型如 BERT 取得的快速进展,这些问题现在不再仅仅在机器学习(ML)博客中讨论。取而代之的是,他们现在在非技术性报纸上推动点击,比如《T2》、《经济学家》T3。这意味着更多的人会看到和听到这些模型。因此,理解推动最新一轮发展的技术创新比以往任何时候都更加重要。
“有感觉的”语言模型的真正影响
The latest neural network models have raised questions about just how well we can expect bots to work in the near future | Source
正如似乎被广泛接受的那样,LaMDA 是没有知觉的,但这个问题被提出的事实表明了在相对较短的时间内, Transformer 技术、支持 NLP 最近许多进展的深度学习架构在多大程度上推动了聊天机器人的能力。这意味着讨论不再是 ML 专家的唯一领域,并具有更广泛的影响。
随后,这也意味着预期可能会出现偏差。如果聊天机器人现在“几乎有知觉”,一些不真正熟悉该技术的人可能会认为,问答、摘要、文本生成和语义搜索等 ML 应用程序现在已经得到了全面解决。这种思路可能会让我们超越自我。
为了澄清这场争论,我们需要了解最近的进展,以及它们对这些模型的当前和未来功能的意义。
- 这些最新进展只与学术机构和像谷歌这样的大公司有关吗?
- 或者,通过采用这些最新发展,中小型企业现在能获得哪些切实的好处?
为了解决这些问题,我们将看看导致我们来到这里的一系列事件,围绕这些模型的炒作的当前状态,同时,我们还将讨论这些进步的实际方面。因此,让我们从识别这些模型试图解决的核心问题开始。
对话很难!
The nuances of a back-and-forth dialogue are varied and complex | Source
我们很少考虑简单对话中包含的许多复杂性。无论是与你几乎不认识的人,亲密的朋友或亲戚,还是客户服务代理,来回对话的细微差别是多样而复杂的。根据不同的情况,你的谈话可以随心所欲地从一个话题转换到另一个话题,使用隐喻、笑话或讽刺,假设某些常识或指定外部的、可证实的事实。简而言之,事情很多!
这就是为什么直到最近,人们还不清楚一个“端到端”的神经网络,如建立在 Transformer 架构之上的大型语言模型(LMs ),是否可以被训练来执行这样的任务。
在这些模型中,你传递给他们很多很多的文本数据,然后他们输出更多的文本或者一个大的密集向量(嵌入)。在任一情况下,输出可以表示:
- 对一个问题的回答,
- 输入文本的摘要,
- 或者基于输入提供相似性得分,
举几个日常使用的例子,但是这些实验都没有真正解决创建开放式对话模型的问题。
谷歌的 Meena:开放式对话模式的到来
在像“图灵测试”这样的比赛中,参赛者试图说服人类评委,他们实际上不是在和机器人说话,聊天机器人往往是由基于规则的组件和机器学习算法结合而成。这就是为什么谷歌在 2020 年发表的论文“走向类似人类的开放领域聊天机器人”是一个里程碑。
在这篇文章中,作者声称,他们提出的模型 Meena 通过在广泛的 NLP 任务和人类评估测试中实现最先进的性能,回答了开放的研究问题——没有任何硬编码规则的大型端到端模型可以在开放域设置中生成几乎类似人类的聊天响应。
这是一个非常大的主张,从表面上看,它似乎改变了游戏规则。但是,一个非常基本的后续问题可能是——他们是如何做到的?
An example chat between Meena (left) and a person (right) | Source: Google blog
作者基本上创建了一个新的度量标准,人类评估者可以用它来衡量 Meena 听起来是否更像人类,这被称为“敏感性和特异性平均值(SSA)”。这试图测量两件事:
-
这似乎是显而易见的。回答需要在对话的上下文中有意义。如果你问我,“现在几点了?”我说,“爱尔兰有三个峡湾”,那么这不是一个明智的回答。这似乎是一个随机的事实。
-
特异性:这是对回答与问题相关程度的衡量。例如,当被问到现在几点时,我可以说:“我不知道”。这是一个明智的反应,我可能不知道现在的时间。但不具体。相反,如果我说“我不知道,我的手表正在充电,我找不到我的手机了”这样的话,这既明智又具体,我是在提供与你当前问题相关的具体信息。
成为人类需要什么?
Meena 的作者声称,“图灵测试”类型评估的一个问题是它主要寻找合理的答案。为了说明这一点,作者创建了一个名为 GenericBot 的简单机器人,它只有两个响应:
- 我不知道:每当输入是一个问题时,它就用这个来响应
- Ok :只要输入是一个语句,它就用这个来响应。
有了这些简单的规则,机器人在与人类互动时能够获得很高的合理分数。它可能是世界上最无聊的聊天机器人(不要在聚会上用它),但它的回答没有一个可以说是不合逻辑或荒谬的。然而,你可能会觉得奇怪,如果这是你在与另一个人交谈时得到的唯一回答。
这突出了米娜论文的一个重要贡献,即,我们认为什么是类似人类的反应?
Meena 语言模型的机制
我们将研究 Meena 聊天机器人模型的两个特别有趣的技术方面,这两个方面决定了上述问题的答案:
- 困惑:Meena 使用了一种新的标准,这种标准与人类对对话质量的判断非常一致。
- 训练数据 : Meena 是在大量的对话数据上进行训练的,这与之前的模型不同。
Meena attempts to use perplexity as a way to improve human judgments of dialogues against their Sensibleness and Specificity Average (SSA) score. The dashed lines offer a baseline comparison for different approaches, and the dotted line is the regression line showing the relationship between perplexity (as measured by different Meena model sizes) and SSA scores. | Source
困惑:接下来是什么?
以前的对话模型的一个问题是如何适当地训练模型,以便它们产生与人类评估者很好相关的结果。之前的研究显示,当用于评估对话响应生成系统时,BLUE benchmark 等基准与人类判断的相关性很差。
这很重要,因为如果我们无法找到一个自动的指标来评估模型在训练期间的表现,那么世界上所有的数据都不会帮助我们学习好的响应。Meena 通过引入困惑度来解决这个问题。简而言之,困惑度量模型对预测下一个令牌的信心。
请记住,自回归 LMs 通常将之前的令牌作为输入,并尝试预测下一个令牌。这些模型将在可能的下一个令牌响应上生成概率分布。在这种情况下,困惑将预测模型预测正确的下一个单词(或者,在 Meena 的情况下,对话中的下一个单词)的能力。
以前的模型很难将它们的自动指标与人工评估相匹配。米娜展示的是,如果你试图提高困惑分数,也就是说,困惑分数越低越好,那么这与人类对对话的评级密切相关。
对话训练数据
我们注意到以前的模型如 BERT 是基于单词嵌入的。组织 BERT 的训练数据,以便模型可以学习生成表示单词及其相关上下文的嵌入。这一点很重要,因为一旦模型能够逐字解析数据,或者更准确地说,一个单词一个单词地解析数据,我们就可以从网上以任何格式输入大量数据。然后,该模型可以学习预测屏蔽词,这已被证明会产生非常令人印象深刻的结果。
像 BERT 这样的模型是从单词层次建立起来的,它是基于使用句子而不是单个单词作为输入。在这些情况下,模型的输出不是单词嵌入,而是句子嵌入。句子比单词更加多样和复杂,所以这仍然是积极研究的一个领域。
所以想象一下试图理解多回合对话的额外复杂性?现在,我们需要理解句子,以及如何与之前的句子联系起来,预测下一个话题或回答或开放式问题,并记住之前发生的事情。我们不能通过给一个模型一些随机的句子来了解这种细微差别。
为了解决这个问题,Meena 的作者从网络和社交媒体上创建了训练数据。数据中的第一条消息被视为根,所有响应都被视为子节点。该树上的每一步或每一条消息都被认为是一个回合。这使得 Meena 在试图预测下一次反应时可以使用之前的回合。
对于 Meena,训练数据由上下文-响应对组成,其中上下文是最后的回合数,最多为 7 次。因此,米娜能够分析前面的话轮,并尝试预测回应。然后,它可以将预测的响应与实际响应进行比较,以学习预测更好的响应,这与 BERT 通过将实际单词与预测单词进行比较来学习的方式非常相似。这就是我们前面提到的困惑分数发挥作用的地方。低困惑意味着模型对结果更有信心,这应该与良好的响应相关。
作者还编辑数据集,并删除任何可能不安全或包含攻击性语言或其他可能限制其作为响应的有用性的因素的消息,例如,如果消息主要由数字组成。然后,被阻止邮件下的子树也被删除。最终的数据集总共是 341GB 的文本。
Meena 对企业和机器学习团队的效用
是否与业务需求同步?
正如我们前面提到的,Meena 的设计是为了避免在对话中说“我不知道”这样的话。“我不知道”不是一个足够“具体”的回答。然而,在大多数商业案例中,这可能正是您希望从您的机器人那里得到的:
客户:“您好,我登录我的帐户时看到以下错误,我附上了一张截图”
Bot:“谢谢你的信息,这非常有帮助,我以前没见过这个错误,我已经见过很多错误了,你想看看其他的吗?
客户:“不太好,你能解决这个问题吗,因为它看起来像是一个 bug?”
Bot:“你知道软件 bug 这个术语是从哪里来的吗?这是一个有趣的故事,最初是一只昆虫飞进了世界上最早的计算机之一"
顾客:“我们能不能只关注这个问题?”
这个机器人可能是一个有趣的角色,但当你试图解决你的问题时,这不是你所需要的。如果机器人无法回答客户的查询,您可能希望将该交互升级到人类。你不希望你的机器人对你寻求解决方案的客户变得有趣和有趣。创建开放式机器人的学术目标可能与商业机器人的需求非常不同。如果企业希望部署客户认为是人类的机器人,这将有所不同。
然而,在大多数情况下,企业确实希望客户知道他们何时在与机器人交谈,何时在与人类交谈。如果您希望客户无法区分这两者,那么开放式机器人可能是您想要的。这里要注意的关键是,创建 Meena 的目标可能与您试图用机器人解决的业务问题不一致,因为大多数企业都希望他们的机器人了解他们特定的业务领域。
ML 团队的有趣发现
虽然 Meena 可能不是可以“开箱即用”来解决特定 NLP 任务的东西,但它确实有许多有趣的技术方面,可能会引起不同 ML 应用程序的兴趣:
-
困惑与人类评价密切相关,这一点是有用的。例如,如果你正在考虑构建自己的生成式对话机器人,那么困惑是一个度量标准,你可以很容易地根据自己的数据训练自己的模型。如果它确实与人类的判断有很好的相关性,那么你可能会避免昂贵的标签数据,而是使用这种自动度量作为你的指导星。
-
就对话模型的扩展而言,困惑也潜在地打开了闸门。如果你可以使用未标记的数据,那么你可以将你的对话模型指向你自己的数据,并希望通过更多的数据来提高它的准确性。这对于以前的对话模型来说是不容易实现的。
-
创建数据集的方法也非常有趣,因为以与您自己的特定领域数据相同的上下文响应格式创建数据集似乎相对容易。唯一的问题是所需的数据量,相比之下,GPT2 是在 40GB 的数据上训练的,这在当时被认为是海量数据。
正如我们前面提到的,对话模型很难,因为人类对话是一个复杂的语言框架,从单词到句子到段落再到对话。米娜是一个突破性的模型,因为它表明这种复杂性是可以解决的,对话模型是可能的。如果这种趋势继续下去,我们预计我们可以在更大和更复杂形式的对话数据上训练模型。
事实上,这正是 LaMDA 的情况,因为它代表了对话模型的下一个进步。它建立在 Meena 的发现之上,并在很短的时间内将开放域聊天机器人提升到了一个新的水平。但是 LaMDA 有什么特别之处,让它抢走了 Meena 的所有注意力?为什么没有人想知道米娜是否是一个有意识的实体?可怜的米娜,让我们来看看为什么 LaMDA 看起来聪明多了。
谷歌的 LaMDA:更好的 Meena
LaMDA broke new ground in trying to generate specific and interesting responses | Source
Meena 的一个创新之处是,它不仅要求机器人的反应是明智的,而且还需要具体。这意味着机器人必须“更加努力”来产生有意义的对话。然而,正如最近的研究表明的那样,这可能会刺激机器人“经常产生幻觉,或者对潜在的来源缺乏忠诚”。
从业务角度来看,如果“幻觉”与客户问题有关,这可能会造成严重的问题。这也是开放领域对话中的一个问题,在这种对话中,模型可以开始“编造东西”。这是 LaMDA 设计要解决的问题之一。在 Meena 早期工作的基础上,LaMDA 引入了许多对话模型的新方法,产生了令人印象深刻的结果。即:
-
兴趣度:LaMDA 在 Meena 已经引入的敏感和具体的评估指标上增加了一个新的评估指标。这个指标试图通过确保 LaMDA 尽量机智和有见地来进一步提高对话质量。
-
根植性:如前所述,机器人可能倾向于与真相保持“灵活”的关系,因此 LaMDA 引入了一个根植性指标,使模型能够在可能的情况下使用外部来源来验证声明。
-
预训练+微调 : LaMDA 表明,通过预训练扩展模型确实有助于改善几乎所有指标。然而,仅仅扩大规模并不能改善偏差和接地性等指标。为了改变这些指标,模型需要微调。但有趣的是,当微调与一种叫做“提示”的技术相结合时,有助于改善所有指标,并达到 SOTA 结果。
这些是一些有趣的进步,将会产生一些深远的影响。因此,记住这一点,让我们来看看。
一个有趣的晚餐客人
我们都经历过,无论是在朋友的婚礼上,还是在长途飞行中。你抽到了短签,坐在一个不太有趣的陌生人旁边,他的爱好包括错综复杂的税法。虽然对话非常合理和具体,但它就是不有趣。但是,有趣的是什么?
LaMDA 的作者声称,“有趣”是指对话回应可能“引起某人的注意”或“引起他们的好奇心”,或者回应可能被认为“出乎意料、机智或有见地”。不幸的是,准确地知道一个人什么时候风趣或者有趣既困难又主观。为了解决这个问题,作者需要人们手动给 LaMDAs 的回答打分,比如兴趣度。
正如我们将看到的微调,人们还需要以类似的方式标记多回合对话中的响应,以创建可用于提高 LaMDAs 在这些领域的性能的数据集。
出于评估目的,LaMDAs 质量指标由三个单独的指标组成,每个指标的得分为 1 或 0:
-
Sensible :这与 Meena 的要求相同,即响应在逻辑和语义上是一致的,并且与前面的查询相关。
-
Specific :同样,这与特定于 Meena 的指标相同,其中响应也需要与上下文相关。
-
兴趣度:这是 LaMDA 需求中增加的新指标。
在接地和安全方面也采取了类似的方法。这些分数使作者能够衡量 LaMDA 在潜在主观领域的表现,例如模型在给定对话中的有趣程度。
如上所述,人类评估者还创建了允许作者微调(我们将很快讨论)LaMDA 的数据集。人类评估者并没有为兴趣等事物打分,而是生成了“是”、“否”或“可能”等标签。为了在这些标记的训练数据集中尽可能地减少主观性,作者让 5 个人标记每个回答,然后只在 5 个人中有 3 个人同意的情况下使用这些回答。
除了这些专门为 LaMDA 创建的人类标记的数据集,作者还使用了许多其他 LMs 接受训练的常用数据集。这导致了一个两阶段的培训方法:
-
预训练:LaMDA 像常规 LM 模型一样,在广泛的对话和非对话文本数据上接受训练。以这种方式,该模型可以在下一阶段的训练之前被用作通用语言模型,下一阶段的训练是微调该模型。预训练数据集的总大小是 1.56T 单词。
-
微调:我们很快会谈到这一点,但训练的第二阶段是在特定数据集上对模型进行微调,如上面提到的质量标签数据集。除了质量之外,还有一个关于偏见、安全和基础的数据集。正是这一微调步骤产生了令人印象深刻的 SOTA 结果,并且很可能是它被认为是在模仿经典的大脑在大桶场景的原因。
有趣的是,作者添加了一个“兴趣度”指标作为训练步骤。这是基于我们在 Meena 身上看到的趋势,目标是制造一个更像人类的机器人。但是,正如我们之前和 Meena 强调的,这是你想要的商业机器人的目标吗?“有趣”是否等同于一般常识和从经验中学习的能力,以及执行模型没有训练过的任务的能力?
虽然有趣可能不是最重要的要求,但脚踏实地可能是需要的一项关键技能。LaMDA 在训练时也考虑到了这一点。
保持双脚着地
随着大型 LMs 的发展,神经网络出现了一个有趣的方面,即它们可以“产生幻觉”。正如我们前面提到的 Meena,当 LM 生成文本作为 NLP 任务的一部分时,它可能倾向于简单地编造东西。这就是所谓的 LM 背景下的幻觉。
如果任务是以类似 GPT 3 的格式生成文本,这不是一个明显的问题。在 LM 完成一个句子或段落的情况下,当它生成新的文本时,观察模型的“创造性”是很有趣的。
然而,在有问答式互动的对话模式中,幻觉是一个严重的问题。如果机器人被问到一个特定的问题,例如,“爱尔兰自行车传奇人物肖恩·凯利赢得了多少件环法自行车赛绿色球衣?”,那么就是可以对外验证的东西。这里创意不重要。当像 LaMDA 这样的模型被训练得有趣而具体时,它可以为模型产生幻觉创造一种“激励”。
如果作者没有增加接地要求,这就是 LaMDA 的倾向。根植性的目标是试图增加 LaMDA 产生基于外部和可验证来源的响应的可能性。这可以被认为类似于信息检索方法。这使得人们能够根据消息来源的可靠性来判断回应的真实性。
LaMDA 可以接触到外部知识来源的事实降低了它产生幻觉的倾向,虽然这种情况的确切原因尚不清楚,但作者假设外部来源使 LaMDA 不必使用参数来记忆信息。在某种程度上,它可以将这项工作“外包”给外部知识库,就像你或我在便笺簿上做笔记或在书中参考信息一样。
作为一个衡量标准,根植性被定义为对外部世界做出断言的回答中可由外部来源验证的百分比,即对外部世界做出断言的所有回答中的份额。
如上所述,像接地性和安全性这样的指标不能通过单独的预训练来改善。在训练的最后阶段,LaMDA 被微调到人类管理的数据集,在所有指标上产生改进的结果。从商业角度来看,微调可能是最令人感兴趣的。如果您可以使用一定数量的信息来轻松地为特定的领域或任务定制模型,那么它在您的特定业务应用程序中可能是有用的。
微调你的意识之路
好吧,目前我们知道些什么?我们可以将开放式对话问题作为 LM 问题来处理,就像我们对 BERT 所做的那样,只需输入模型数据,然后让它学习。如果我们在训练集中包括对话类型的数据,那么我们将看到特定于对话的度量的一些改进。因此,训练一个类似于一般 LM 的模型确实改善了一些对话度量,但不是全部。
质量指标确实显示了单独训练前的改善,但是像接地性和安全性这样的指标没有改善。我们不能仅仅扩展 LM 方法来改进这些指标,因此 LaMDA 作者寻找了一种替代方法,即微调。
首先,什么是 LaMDA 环境下的微调?LaMDA 采取两步过程进行微调。这些步骤是:
- 生成器:在微调的第一部分,LaMDA 预训练模型用于生成给定对话上下文的响应。LaMDA 是一个只有解码器的模型,因此需要按顺序一个接一个地向它提供令牌(例如,与 BERT 不同,它是一个基于编码器的模型,并使用掩蔽,因此可以按任何顺序向它提供令牌)。发电机通过以下示例进行培训——
对话: 怎么了?
反应:不多。
通过这种方式,它被训练来预测给定上下文的下一个令牌。
- 鉴别器:第二步是一个分类器,它被训练来预测我们前面提到的为质量和安全等任务手动创建的数据集的标签。这些标签使分类器能够预测通过生成器产生的输入响应的正确分数。
LaMDA uses an innovative approach by separating the generating and selection of responses into two separate tasks | Source
这里要注意的重要一点是,两个步骤(生成器和鉴别器)都是在一个模型上训练的,所以这意味着有一个“有效的组合生成-鉴别过程”。例如,给定一个输入,生成器将产生不止一个而是多个潜在响应。然后,它将这些响应传递给鉴别器,鉴别器作为一个分类器来预测质量和安全分数。基于这些预测,低于给定阈值的安全分数被移除,然后剩余分数按质量排序,最高分数被用作最终响应。
这是一个非常有趣的方法,因为我们从过度炒作的媒体关注中知道,该模型作为一个开放式机器人表现得非常令人印象深刻。它是一系列简单的步骤组合在一起,形成一个潜在的复杂系统。
例如,作者可以训练一个生成器来产生输出并使用它。但是,发电机很可能无法同时产生高质量和高安全性的响应。或者至少需要大量的数据来微调它。通过创建单独的任务并使用相同的模型,作者减少了将模型训练到高水平所需的数据量和资源。
但我们知道模特都很懒,对吧?他们可以通过幻觉和编造高质量的数据来绕过这些过滤器吗?他们当然可以,但这就是我们之前谈到的接地指标发挥作用的地方。
在微调(和正常操作)期间,模型可以访问作者所说的工具集。这个工具集是信息检索系统、计算器和翻译器的组合。为了训练模型以在微调期间验证潜在的声明,使用两种方法创建了一个基础对话:
-
静态:在静态模式下,人工评估者阅读 LaMDA 生成的对话,并决定是否做出需要验证的声明。如果它们确实需要验证,那么评估者通过基于文本的系统以与 LaMDA 完全相同的方式查询工具集,即使用基于文本的查询。
-
互动:在互动模式下,评价者直接与 LaMDA 进行对话,并如上评分。然而,在交互模式期间,评估者有机会直接编辑 LaMDA 响应。他们可以对其进行更改,使其包含来源充足且可验证的声明,并提供这些声明的 URL 或外部引用。
使用这些方法,微调有助于为开放域对话机器人创建一个新的基准。正如我们所指出的,LaMDA 之所以获得如此多的关注,正是因为它对类似对话的人类对话的反应非常好,或者至少比以前的机器人更好。
LaMDA 对企业和机器学习团队的效用
商业的未知空间
我们注意到 Meena 的一些目标可能与一些商业应用程序不同步。例如,Meena 试图避免说“我不知道”这样的话,并且被设计成试图在其响应中提供一些特定的信息。虽然 LaMDA 试图通过“有趣”来建立这一点,但它确实添加了脚踏实地的方法来尝试并确保模型的响应在某些情况下是准确的、有来源的和可验证的。
这确实使它看起来更符合业务要求,例如回答客户的询问,但是,正如作者所指出的,LaMDA 依赖于微调期间的一种形式提示,其中人工评估员与模型交互,试图让它生成某些响应。这对于预处理模型以执行类似业务的任务是至关重要的。然而,在我们能够安全地、可预测地使用诸如在商业环境中使用这些模型的提示等东西之前,在这个领域还需要进行大量的研究。
最近,HuggingFace 发布了一个模型,它使用提示来使模型执行未经训练的任务。您可以测试 HuggingFace 模型,发现很难知道让模型执行特定任务所需的确切提示类型。
ML 团队的新途径
毫无疑问,与 Meena 的论文类似,LaMDA 的研究在开放领域对话模型方面具有开创性。结果本身表明,这些模型提高了我们对未来模型的期望。但从 ML 的角度来看,人们很容易被最新的“闪亮”的新发展冲昏头脑,而忽略了这些模型的一些关键技术方面。特别是,我认为有两个似乎与 LaMDA 最相关:
使用外部数据库和查询该数据库的标准方法是可以在其他模型中使用的关键方法。这解决了像伯特这样的模型中知识的静态本质的许多潜在问题,伯特仍然认为巴拉克·奥巴马是总统。
像新冠肺炎和其他改变人们搜索信息方式的新趋势,很难更新这些模型。拥有一个可查询的外部数据库意味着您可以更新数据库,并且模型将能够搜索最新的信息,而不必重新训练模型。
LaMDA 是一款两阶段车型。第一阶段是一个一般训练的 LM,就像我们在许多以前的基于 Transformer 的模型中看到的一样。然而,第二阶段,微调阶段,是 LaMDA 区别于这些模型的地方。LaMDA 涉及与人的互动,并通过编辑响应和添加搜索查询和来源来训练。这是一种非常不同的微调形式,与我们以前见过的任何形式都不同,并为未来的模型开辟了许多可能性。
也许将来这些模型会像新员工一样接受培训,他们坐在一个有经验的人旁边,通过观察他们的行动向他们学习。期待看到更多的进步,因为人们开始弄清楚如何有效地执行这种交互式微调模式。
LaMDA 和 Meena 的关键要点
正如我们前面提到的,当从业务角度评估任何模型时,考虑该模型的目标以及它被训练用于什么任务总是很重要的。这很重要,因为这使您能够理解模型最适合的业务领域或问题。在这篇文章中,我们看了两个模型,即 Meena 和 LaMDA,它们都是对话模型,并强调了它们的一些关键技术创新。
LaMDA 和 Meena 的实际应用
我们注意到这些模型的某些方面,例如趣味性,可能与某些业务目标不一致,但是是否有其他领域会从这种方法中受益?例如,这些模型可以在以下两个领域产生直接影响:
教育
孩子们受益于更集中的教育。随着班级规模的扩大或教师数量的减少,学生与教师的比例会增加。一个班里的学生越多,某个学生受到的关注就越少。像 LaMDA 这样的模型,正如论文中所示,当它模仿珠穆朗玛峰时,可以提供 1:1 类型的教育对话,以帮助儿童了解科学或他们周围世界的事实。这提供了一种独特的方式来帮助人们以互动的方式发现新知识,而不需要单独的人类导师。
卫生保健
在世界上的许多地区,仍然缺乏精神卫生保健。向急需这些服务的地区提供这些服务可能会很昂贵。像 Woebot 这样的新型医疗保健机器人试图将技术和临床知识结合起来,提供精神卫生保健,这样人们就可以在需要的时候获得它。LaMDA 之类的模型可以让对话看起来更人性化、更具体,从而有助于提高这些服务的质量。看看它们是否能在这个领域得到应用将会很有趣。
在实际应用中使用 LaMDA 和 Meena 的挑战——低于预期
然而,目前这些模型可能不适合更传统的与商业相关的 NLP 任务,例如问答、摘要或实体识别。这些任务可能更适合基于规则的方法或经过专门训练的基于 Transformer 的模型,如 HuggingFace 等平台上可用的模型。
这些模型可能不适合这些任务的原因包括:
这些型号与以前的变压器型号不同。HuggingFace、SentenceBERT 或 TensorFlowHub 等资源允许任何人下载一系列模型,并以现成的方式使用它们。这些模型不太可能出现这种情况。访问可能会受到 API 的限制,如 OpenAI 限制对 GPT-3 的访问。
以前的 Transformer 模型被训练来生成单词嵌入或找到问题的答案或总结文档。这些问题有非常具体的业务用例。正如我们所讨论的,米娜和兰达被训练来产生特定而有趣的反应。
你可能不想从你的商业机器人那里得到什么。因此,这些机器人的最终目标可能不像 BERT 这样的模型那样与您的业务用例保持一致。您可能需要投入更多的资源来尝试使这些对话模型“适合”您特定领域的应用程序。
正如我们所提到的,Meena 和 LaMDA 都需要人类手动标记数据并评估响应。LaMDA 还要求人们在微调过程中与它进行交互,以编辑响应并生成搜索查询,从而提高根植性。
虽然作者确实注意到“不到 0.001%的预训练数据”是人工注释的数据,但他们仍然接受“这是一个昂贵、耗时且复杂的过程”。从商业的角度来看,在特定于商业的数据集上训练这样的模型需要具有该领域知识和技能的人。所以这仍然是简单应用这些对话模型的一大障碍。
但是微调确实带来了希望
虽然这篇文章的大部分内容以及上述观点似乎表明,在这些模型上投入大量资源可能不值得,但我认为有足够的证据表明,关注该领域的未来进展是值得的。
从商业角度来看,基础技术非常重要,因为它看起来像是一个问答型机器人,可以访问特定领域的知识库。如果训练需求很少,人们与模型互动并编辑响应或用建议提示它的微调方法似乎在未来的应用中可能是有用的。
例如,想象一个机器人,你可以与它进行几十次对话,训练它回答潜在客户可能提出的问题。如果有足够的保障措施来防止偏见和安全问题,以及 LaMDA 作者所称的“不适当响应的长尾”,那么这可能会在不久的将来产生商业成果。
参考
- Meena Google 博客:Meena 模型的一个很好的概述
- Meena 论文:关于 Meena 模型的更多细节
- Meena github repo :包含一些 Meena 对 Meena 和人类对 Meena 对话示例的资源
- 最初的 LaMDA 谷歌博客:LaMDA 的一个很好的介绍
- LaMDA Google 博客:这篇博客更详细地介绍了这个模型
- LaMDA 论文:虽然这篇论文很长,但它包含了许多有趣的例子和许多有用的附录
- 在自然语言生成模型中测量归因:这篇论文讨论了 LLM 产生幻觉的趋势
Cathal Horan
在 Intercom 的 ML 团队工作,在那里他创造了人工智能产品,帮助企业提高支持客户和与客户沟通的能力。他对哲学和技术的交叉感兴趣,尤其着迷于深度学习等技术如何能够创建有朝一日可能理解人类语言的模型。他最近完成了商业分析理学硕士学位。他的主要学位是电气和电子工程,但他也拥有哲学学位和精神分析研究的哲学硕士学位。
阅读下一篇
如何构建和管理自然语言处理(NLP)项目
Dhruvil Karani |发布于 2020 年 10 月 12 日
如果说我在 ML 行业工作中学到了什么的话,那就是:机器学习项目很乱。
这并不是说人们不想把事情组织起来,只是在项目过程中有很多事情很难组织和管理。
你可以从头开始,但有些事情会阻碍你。
一些典型的原因是:
- 笔记本中的快速数据探索,
- 取自 github 上的研究报告的模型代码,
- 当一切都已设置好时,添加新的数据集,
- 发现了数据质量问题并且需要重新标记数据,
- 团队中的某个人“只是快速地尝试了一些东西”,并且在没有告诉任何人的情况下改变了训练参数(通过 argparse 传递),
- 从高层推动将原型转化为产品“仅此一次”。
多年来,作为一名机器学习工程师,我学到了一堆东西,它们可以帮助你保持在事物的顶端,并检查你的 NLP 项目(就像你真的可以检查 ML 项目一样:)。
在这篇文章中,我将分享我在从事各种数据科学项目时学到的关键指针、指南、技巧和诀窍。许多东西在任何 ML 项目中都是有价值的,但有些是 NLP 特有的。
理解计算机视觉中的少镜头学习:你需要知道什么
自从第一个 卷积神经网络 ( CNN )算法被创建以来,它们在 计算机视觉 ( CV ) 任务上大幅提升了深度学习性能。
2015 年,微软报告称,他们的模型在对来自 ImageNet 数据集的图像进行分类方面实际上比人类更好。【1】
如今,当涉及到使用数十亿张图像来解决一项特定任务时,计算机没有对手。尽管如此,在现实世界中,你很少能构建或找到有那么多样本的数据集。
我们如何克服这个问题?如果我们在谈论一个 CV 任务,我们可以使用数据扩充 ( DA ),或者收集和标记附加数据。
DA 是一个强大的工具,可能是解决方案的重要组成部分。标记额外的样品是一项耗时且昂贵的任务,但它确实能提供更好的结果。
如果数据集真的很小,这两种技术可能都帮不了我们。想象一个任务,我们需要建立一个每类只有一到两个样本的分类,每个样本都超级难找。
这需要创新的方法。少投学()就是其中之一。
**在本文中,我们将讨论:
- 什么是少投学习——定义、目的和 FSL 问题示例
- 少量多次学习变化—多次学习、少量多次学习、一次学习、零次学习
- 少击学习逼近–元学习、数据级、参数级****
- 元学习算法–定义,度量学习,基于梯度的元学习
- 少镜头图像分类算法——模型不可知** 元学习匹配原型和**关系网络****
- 少拍物体检测–约洛玛姆
**什么是少投学习?
少镜头学习是机器学习的一个子领域。它是关于当你只有几个带有监督信息的训练样本时,对新数据进行分类。
FSL 是一个相当年轻的地区,需要更多的研究和完善。从今天起,你可以在 CV 任务中使用它。计算机视觉模型可以用相对较少的训练样本很好地工作。在这篇文章中,我们将关注计算机视觉领域的 FSL 。
例如:假设我们在医疗保健行业工作,在通过 x 光照片对骨骼疾病进行分类时遇到了问题。
一些罕见的病理可能缺少足够的图像用于训练集中。这正是可以通过构建一个 FSL 分类器来解决的问题类型。
少量变化
让我们来看看 FSL 的不同变体和极端案例。总的来说,研究人员确定了四种类型:
N 元学习(NSL)
少数镜头学习
- 一次性学习(OSL)
- 小于一或零射学习(ZSL)
- 当我们谈论 FSL 时,我们通常指的是N-way-K-Shot-class 化。
- N 代表类别数, K 代表每一类别中用于训练的样本数。
N 次学习被认为是一个比其他所有概念都更广泛的概念。意思是少射、单射、零射学习是 NSL 的子场。
零距离拍摄
对我来说,ZSL 最有趣。零投学习的目标是在没有任何训练实例的情况下,对看不见的类进行分类。
这可能看起来有点疯狂,但请这样想:你能在没有看到一个物体的情况下对它进行分类吗?如果你对一个对象有一个大概的概念,它的外观,属性和功能,这应该不是问题。
这是你在做 ZSL 时使用的方法,根据目前的趋势 , 零距离学习将很快变得更有效。
单镜头和少镜头
至此,你可能已经看到了一个大概的概念,所以在一次性学习中,我们每个类只有一个样本也就不足为奇了。少投每班有两到五个样本,使它成为 OSL 更灵活的版本。
当我们谈论整体概念时,我们使用少量学习术语。但是这个领域还很年轻,所以人们会用不同的方式使用这些术语。当你阅读文章时,请记住这一点。
少量学习方法
好了,是时候转向更实际的领域,谈谈不同的少量学习解决问题的方法了。
首先我们来定义一个 N 路 K 炮分类问题。想象一下我们有:
培训(支持)集包括:
N 类标签
K 每类的标记图像(少量,每类少于十个样本)
Q 查询图片
- 我们希望将 Q 查询图像归类到 N 类中。训练集中的 N * K 样本是我们仅有的例子。这里的主要问题是没有足够的训练数据。【1】
- FSL 任务的第一步也是最明显的一步是从其他类似的问题中获取经验。这就是为什么的少投学习被定性为的元学习问题。
- 让我们弄清楚这一点:在传统的分类问题中,我们试图从训练数据中学习如何分类,并使用测试数据进行评估。
- 在元学习中,我们学习如何在给定一组训练数据的情况下学习分类。我们用一组分类问题来解决其他不相关的问题。
一般来说,在解决 FSL 问题时,你应该考虑两种方法:
数据级方法(DLA)
参数级方法(PLA)
数据级方法
- 这个方法真的很简单。它基于这样一个概念,如果你没有足够的数据来建立一个可靠的模型并避免过度拟合和欠拟合,你应该简单地添加更多的数据。
- 这就是为什么许多 FSL 问题是通过使用来自大型基础数据集的额外信息来解决的。基本数据集的关键特征是它没有我们在少量任务的支持集中拥有的类。例如,如果我们想对一种特定的鸟类进行分类,基本数据集可以包含许多其他鸟类的图像。
我们自己也可以产生更多的数据。为了达到这个目的,我们可以使用数据增强,甚至生成对抗网络 ( GANs )。
参数级方法
从参数级的角度来看,很容易在少量学习样本上过度拟合,因为它们经常具有广泛的高维空间。
为了克服这个问题,我们应该限制参数空间,并使用正则化和适当的损失函数。该模型将概括有限数量的训练样本。
另一方面,我们可以通过将模型定向到广泛的参数空间来增强模型性能。如果我们使用标准的优化算法,它可能不会给出可靠的结果,因为训练数据量很小。
这就是为什么在参数级别上,我们训练我们的模型在参数空间中寻找最佳路线,以给出最佳预测结果。正如我们上面已经提到的,这种技术被称为元学习。
在经典范式中,当我们有一个特定的任务时,一个算法正在学习它的任务性能是否随着经验而提高。在元学习范例中,我们有一组任务。一个算法正在学习它在每个任务中的性能是否随着经验和任务数量的增加而提高。这种算法叫做元学习T4 算法。
假设我们有一个测试任务 TEST 。我们将在一批训练任务 TRAIN 上训练我们的元学习 算法。从试图解决训练任务中获得的训练经验将用于解决测试任务。
解决一个 FSL 任务有一套步骤序列。假设我们有一个分类问题,就像我们之前提到的那样。首先,我们需要选择一个基础数据集。选择一个基础数据集至关重要。你想挑一个好的,所以要小心。
现在我们有了N-way-K-Shot-class ification问题(姑且称之为测试)和一个大的基本数据集,我们将把它用作元学习训练集(训练)。
整个元训练过程将有有限数量的集。我们组成这样一集:
从训练中,我们采样 N 个类和 K 个类的支持集图像,以及 Q 个查询图像。这样,我们就形成了一个分类任务,类似于我们最终的测试**任务。
在每集结束时,模型的参数被训练以最大化来自查询集的 Q 图像的准确性。这是我们的模型学习解决一个看不见的分类问题的能力的地方。【1】
模型的整体效率通过其在测试分类任务中的准确性来衡量。
近年来,研究人员发表了许多解决 FSL 分类问题的元学习算法。它们都可以分为两大类:度量学习和基于梯度的元学习算法。
公制学习
当我们谈论度量学习时,我们通常指的是在对象上学习距离函数的技术。
一般来说,度量学习算法学习比较数据样本。在少数分类问题的情况下,他们基于查询样本与支持样本的相似性对它们进行分类。
正如你可能已经猜到的,如果我们正在处理图像,我们基本上训练一个卷积神经网络来输出一个图像嵌入向量,稍后将它与其他嵌入进行比较来预测类别。
基于梯度的元学习
对于基于梯度的方法,你需要构建一个元学习器和一个基础学习器。
元学习者是跨集学习的模型,而基础学习者是由元学习者在每集内初始化和训练的模型。
想象一集元训练,其中一些分类任务由一个 N * K 图像支持集和一个 Q 查询集定义:
我们选择一个元学习者模型,
剧集开始了,
我们初始化基础学习器(通常是一个 CNN 分类器),
我们在支持集上训练它(用于训练基础学习者的精确算法由元学习者定义),
-
基础学习者预测查询集合上的类别,
-
元学习器参数根据分类错误导致的损失进行训练,
-
从这一点来看,根据您对元学习者的选择,管道可能会有所不同。【1】
-
少镜头图像分类算法
-
这一段来自 Etienne Bennequin 写的“元学习的少镜头图像分类”。
-
从总体上看,让我们继续讨论用于解决少镜头学习图像分类问题的具体元学习算法。
在本节中,我们将介绍:
模型不可知元学习(MAML)
匹配网络
原型网络
关系网络
- 模型不可知的元学习
- MAML 基于基于梯度的元学习 ( GBML )概念。正如我们已经知道的, GBML 是关于元学习者从训练基本模型中获得先前的经验,并学习所有任务的共同特征表示。
- 每当有新任务要学习时,具有先前经验的元学习者将使用新任务带来的少量新训练数据进行一点点微调。
尽管如此,我们不想从一个随机的参数初始化开始。如果我们这样做,我们的算法在几次更新后不会收敛到好的性能。
MAML 旨在解决这个问题。
MAML 为元学习者的参数提供了良好的初始化,以实现对新任务的最佳快速学习,仅使用少量梯度步骤,同时避免使用小数据集时可能发生的过拟合。
这是如何做到的:
元学习者在每集开始时创建其自身的副本( C ),
C 在剧集中接受训练(就像我们之前讨论过的,在基本模型的帮助下),
C 对查询集进行预测,
根据这些预测计算的损失用于更新 C,
-
这种情况会一直持续到你完成所有的训练。
-
这种技术最大的优点是它被认为是不可知的元学习者算法选择。因此, MAML 方法被广泛用于许多需要快速适应的机器学习算法,尤其是深度神经网络。
-
匹配网络
-
匹配网络 ( MN )是第一个为解决 FSL 问题而设计的度量学习算法。
对于匹配网络算法,你需要使用一个大的基础数据集来解决一个的少拍学习任务。如上所示,这个数据集被分割成几集。此后,对于每一集,匹配网络应用以下程序:
来自支持和查询集的每个图像被馈送到为它们输出嵌入的 CNN ,
使用从其嵌入到支持集嵌入的余弦距离的软最大值对每个查询图像进行分类,
所得分类上的交叉熵损失通过 CNN 反向传播。
这样,匹配网络学习计算图像嵌入。这种方法允许 MN 在没有特定类别先验知识的情况下对图像进行分类。一切都是通过比较不同的类实例来完成的。
-
由于每一集的类别都不同,匹配网络计算图像的相关特征以区分类别。相反,在标准分类的情况下,算法学习特定于每个类别的特征。
-
值得一提的是,作者实际上对最初的算法提出了一些改进。例如,他们用双向 LSTM 增强了他们的算法。每个图像的嵌入依赖于其他图像的嵌入。
所有的改进建议都可以在他们的初始条中找到。不过,你必须记住,提高算法的性能可能会使计算时间更长。
原型网络
原型网络 ( PN )类似于匹配网络。尽管如此,仍有一些小的差异有助于增强算法的性能。 PN 实际上比 MN 获得更好的结果。
PN 过程本质上是相同的,但是查询图像嵌入并不与来自支持集的每个图像嵌入进行比较。相反,原型网络提出了一种替代方法。
在 PN 中,你需要形成级原型。它们基本上是通过平均来自该类的图像的嵌入而形成的类嵌入。然后,查询图像嵌入只与这些类原型进行比较。
值得一提的是,在一个单次学习问题的情况下,算法类似于匹配网络。
还有, PN 用欧氏距离代替余弦距离。这被视为算法改进的主要部分。
关系网络
为构建匹配的和原型网络而进行的所有实验实际上都导致了关系网络 ( RN )的创建。 RN 建立在 PN 概念的基础上,但是对算法做了很大的改动。
距离函数不是预先定义的,而是由算法学习的。 RN 有自己的关系模块来做这件事。如果你想了解更多,请查看初始文章。
整体结构如下。关系模块放在嵌入模块的上面,该模块是从输入图像中计算嵌入和类原型的部分。
关系模块被提供了查询图像的嵌入与每个类原型的连接,并且它为每一对输出一个关系分数。将 Softmax 应用于关系分数,我们得到一个预测。
少镜头目标检测
这一节来自 Etienne Bennequin 写的《少镜头计算机视觉的元学习算法》。
很明显,在所有的计算机视觉任务中,我们都可能遇到 FSL 问题。我们已经考虑了少镜头图像分类,现在是时候解决少镜头物体检测问题了。
让我们定义一个对象检测任务。假设我们有一个对象类型列表和一个图像,目标是检测图像上列表中的所有对象。如果满足以下条件,我们就说物体被检测到:
我们通过绘制包含它的最小的边界框来定位它,
我们对物体进行了分类。
让我们继续定义 N 路 K 射物体检测任务。想象一下:
一种支撑装置,包括:
N 类标签、
- 对于每个类别, K 个标记的图像包含至少一个属于该类别的对象,
- Q 查询图片。
我们的目标是检测查询图像中属于 N 个给定类别之一的对象。
- 注意,与少拍图像分类问题有一个关键区别,因为一幅图像可以包含属于一个或几个 N 类的多个对象。我们可能会面临一个类不平衡问题,因为我们的算法在每个类的至少 K 个示例对象上训练。
- 约洛玛姆
- 少拍物体探测领域正在快速发展,但没有太多有效的解决方案。这个问题最稳定的解决方案是 YOLOMAML 算法。
- YOLOMAML 有两个混搭的棋子:yolov 3物体检测架构, MAML 算法。
如前所述, MAML 可以应用于各种各样的深度神经网络,这就是为什么开发人员很容易将这两个部分结合起来。
YOLOMAML 是 MAML 算法对 YOLO 探测器的直接应用。如果你想了解更多,请查看官方 Github 资源库。
最后的想法
在这篇文章中,我们已经弄清楚了什么是少镜头学习,有什么 FSL 变异和问题处理方法,以及你可以使用什么算法来解决图像分类和物体检测 FSL 任务。
据我所知,小试牛刀学习是一个快速发展和有前途的领域,但仍然相当具有挑战性和未知性。还有更多的事情要做、研究和开发。
希望有了这些信息,你在开始尝试少量学习领域时不会有任何问题。
附加资源
“基于元学习的少镜头图像分类”,作者 Etienne Bennequin
“少镜头计算机视觉的元学习算法”,作者 Etienne Bennequin
https://blog.floydhub.com/n-shot-learning/
https://towards data science . com/model-agnostic-meta-learning-maml-8 a 245d 9 BC 4 AC
https://deepai . org/publication/meta-learning-algorithms-for-less-shot-computer-vision # S2。SS3
https://arxiv.org/pdf/1904.05046.pdf
- https://www . borealisai . com/en/blog/tutorial-2-little-shot-learning-and-meta-learning-I/#:~:text = The % 20 goal % 20 of % 20 little-shot,class % 20(one % 20 shot % 20 learning)
- https://deepai.org/publication/few-shot-object-detection
- https://blog.floydhub.com/n-shot-learning/
- https://medium.com/quick-code/understanding-few-shot-learning-in-machine-learning-bede251a0f67
- https://towardsdatascience.com/model-agnostic-meta-learning-maml-8a245d9bc4ac
- https://deepai.org/publication/meta-learning-algorithms-for-few-shot-computer-vision#S2.SS3
- https://arxiv.org/pdf/1904.05046.pdf
- https://www.borealisai.com/en/blog/tutorial-2-few-shot-learning-and-meta-learning-i/#:~:text=The%20goal%20of%20few-shot,class%20(one%20shot%20learning)
- https://deepai.org/publication/few-shot-object-detection******
理解渐变剪辑(以及它如何解决渐变爆炸问题)
梯度裁剪解决了我们在神经网络反向传播中计算梯度时遇到的最大问题之一。
你看,在反向传递中,我们计算所有权重和偏差的梯度,以便收敛我们的成本函数。这些梯度,以及它们的计算方式,是人工神经网络在各个领域取得成功的秘密。
但是每一件好事都伴随着某种警告。
渐变倾向于封装它们从数据中收集的信息,这些信息还包括大型文本或多维数据中的长期依赖关系。因此,在计算复杂的数据时,事情可能会很快变糟,在这个过程中,你会搞砸你的下一个百万美元模型。
幸运的是,你可以在它发生之前解决它(用渐变剪辑)——让我们先来深入看看这个问题。
到本文结束时,你会知道:
- 什么是渐变剪辑,它是如何发生的?
- 剪辑技术的类型
- 如何在 Tensorflow 和 Pytorch 中实现
- 供您阅读的附加研究
反向传播的常见问题
反向传播算法是所有现代机器学习应用的核心,它比你想象的更根深蒂固。
反向传播计算成本函数 w.r.t 的梯度,即网络中的权重和偏差。
它会告诉您需要对您的权重进行的所有更改,以最小化成本函数(实际上,-1*∇的成本函数下降最快,+∇的成本函数上升最快)。
非常酷,因为现在你可以根据你的训练数据来调整所有的权重和偏差。数学很好,都很好。
消失渐变
更深层次的网络呢,比如深度循环网络?
成本函数(C)的变化对初始层中的权重或梯度的范数的影响的转换变得非常小,这是由于具有更多隐藏单元的模型复杂度增加,以至于在某个点之后变为零。
这就是我们所说的消失渐变。
这阻碍了模型的学习。权重不再有助于成本函数(C)的减少,并且保持不变,影响正向传递中的网络,最终使模型停止。
爆炸渐变
另一方面,爆炸梯度问题指的是在训练期间梯度范数的大幅增加。
此类事件是由长期因素的爆炸造成的,其增长速度可能比短期因素快得多。
这导致网络不稳定,最多不能从训练数据中学习,使得梯度下降步骤不可能执行。
arXiv:1211.5063【cs。LG]: 高度非线性深度神经网络或递归神经网络的目标函数通常在参数空间中包含由几个参数相乘产生的尖锐非线性。这些非线性在某些地方会引起非常高的导数。当参数接近这样的悬崖区域时,梯度下降更新会将参数弹射得很远,可能会丢失已经完成的大部分优化工作。
深入探讨爆炸梯度问题
为了计算深度递归网络中的梯度,我们使用称为时间反向传播(BPTT)的东西,其中递归模型被表示为深度多层模型(具有无限数量的层),并且反向传播被应用于展开的模型。
换句话说,这是展开的 RNN 上的反向传播。
通过为每个时间步长创建模型的副本,及时展开递归神经网络:
我们用 a < t > 表示网络在时间 t 的隐藏状态,用 x < t > 表示网络在时间 t 的输入和 ŷ < t > 的输出,用 C < t > 表示从时间 t 的输出获得的误差。
让我们通过一些方程,看看这一切开始的根源。
在这一点上,我们将偏离经典的 BPTT 方程,重写梯度,以便更好地突出爆炸梯度问题。
这些方程是通过将梯度写成乘积和的形式得到的。
我们还将把我们的流程分成两部分:
- 前进传球
- 偶数道次
前进传球
首先,让我们检查在时间步长 < t > 神经元的中间激活看起来像什么:
等式:1.1
W_rec 表示将携带先前时间步长的平移效果的递归矩阵。
W_in 是当前时间步长数据进行 matmul 运算的矩阵, b 表示偏差。
在时间步长 < t > 的中间输出看起来像这样:
等式:1.2
请注意,这里的“σ”代表您选择的任何激活功能。受欢迎的选择包括 sigmoid,tanh,ReLU。
使用预测值和实际值,我们可以通过对每个时间步长<>的各个成本函数求和来计算整个网络的成本函数。
等式:1.3
现在,我们有了计算成本函数的一般方程。让我们做一个反向传播,看看梯度是如何计算的。
偶数道次
为了从所有时间步长获取梯度,我们再次对时间步长 < t > 处的所有中间梯度求和,然后对所有训练样本的梯度进行平均。
等式:1.4
所以,我们必须利用导数的链式法则计算任何时间步长 < t > 的中间成本函数(C)。
让我们看看依赖图来确定衍生链:
对于时间步长 < 3 > ,我们的成本函数将看起来像这样:
等式:1.5
注意:我们只提到了 w.r.t 对 W 的导数,它代表了我们试图优化的所有权重和偏差矩阵。
正如你在上面看到的,我们得到了激活a<3>,它将依赖于 a < 2 >,等等,直到第一层的激活没有被计算。
因此,依赖关系将类似于:
甲
所以如果我们对 W 求导,我们不能简单地把a<3>视为常数。
我们需要再次应用链式法则。最后,我们的等式看起来像这样:
等式:1.6
我们总结每个时间步对梯度的贡献。
换句话说,因为 W 用于我们关心的输出的每一步,我们需要通过网络从 t=3 一直反向传播到 t=0 的梯度。
因此,为了计算时间步长 < t > 的激活,我们需要之前时间步长的所有激活。
注意,∂a < T > /∂a < k >本身就是一个链式法则!例如:
等式:1.7
还要注意的是,因为我们对一个向量的函数求导,结果是一个矩阵(称为雅可比矩阵),它的元素都是逐点求导。
我们可以在等式 1.6 中重写上述梯度:
等式:1.8
等式:1.9
这表示一个雅可比矩阵,其值是使用 Frobenius 或 2-范数计算的。
为了理解这种现象,我们需要看一下每个时间分量的形式,特别是矩阵因子→ ∂a
同样的,(tk)实数的乘积可以缩小到零或者爆炸到无穷大,矩阵的乘积也是如此(沿着某个方向 v)。
因此,由于这个时间分量,我们得到了爆炸梯度的条件。
如何识别和捕捉爆炸渐变?
甚至在训练过程开始之前,很难理解这些梯度问题的识别。
当你的网络是一个深度循环网络时,你必须:
- 持续监控日志,
- 记录成本函数中的突然跳跃
这将告诉你这些跳跃是否频繁,梯度的范数是否呈指数增长。
最好的方法是在可视化仪表板中监控日志。
我们将利用 Neptune AI 令人敬畏的可视化和日志仪表板来监控损失和其他指标,这将有助于识别爆炸梯度。您可以阅读下面提到的详细文档来设置您的仪表板。
如何修复爆炸渐变:渐变剪辑
有两种技术专注于分解梯度问题。
一种常见的方法是 L2 正则化,其在网络的成本函数中应用“权重衰减”。
正则化参数变得更大,权重变得更小,有效地使它们变得不那么有用,结果使模型更加线性。
然而,我们将关注一种在获得结果和易于实现方面更优越的技术——渐变裁剪。
什么是渐变裁剪?
梯度削波是一种方法,其中在通过网络的反向传播期间,将误差导数改变或削波到阈值,并使用削波的梯度来更新权重。
通过重新调整误差导数,对权重的更新也将被重新调整,从而显著降低上溢或下溢的可能性。
具有两个参数 w 和 b 的递归网络中梯度削波的效果梯度削波可以使梯度下降在极其陡峭的悬崖附近表现得更加合理。(左)没有梯度剪裁的梯度下降越过这个小峡谷的底部,然后从悬崖表面接收到非常大的梯度。(右)带渐变剪裁的渐变下降对悬崖的反应更温和。当它爬上悬崖表面时,步长是受限制的,因此它不能被推离解附近的陡峭区域。图改编自 Pascanu 等人(2013) 。
渐变裁剪有两种实现方式:
- 按值剪裁
- 按范数剪裁
按值渐变剪裁
按值裁剪背后的想法很简单。我们定义最小限幅值和最大限幅值。
如果一个渐变超过了某个阈值,我们就把这个渐变剪切到这个阈值。如果梯度小于下限,那么我们也将其剪切到阈值的下限。
算法如下:
****如果‖g≥max _ threshold或‖g≤min _ threshold则
g ← 阈值(相应地)
如果结束
其中 max_threshold 和 min_threshold 是边界值,在它们之间是梯度可以取的值范围。 g ,这里是梯度,‖ g ‖是 g 的范数。
按范数渐变剪裁
按规范剪裁背后的思想类似于按值剪裁。不同的是我们通过将梯度的单位向量与阈值相乘来裁剪梯度。
算法如下:
****如果‖g≥阈值,则
g ← 阈值 g/g*
如果结束
其中阈值为超参数, g 为梯度, g 为 g 的范数。由于g/g‖是一个单位向量,在重新缩放后,新的 g 将具有等于阈值的范数。注意,如果‖ g ‖ < c ,那么我们什么都不需要做,
梯度裁剪确保梯度向量 g 的范数至多等于阈值。
这有助于梯度下降具有合理的行为,即使模型的损失景观不规则,最有可能是悬崖。
深度学习框架中的梯度裁剪
现在我们知道为什么会出现爆炸式渐变,以及渐变裁剪如何解决这个问题。
我们还看到了两种不同的方法,通过这两种方法,您可以将裁剪应用到您的深层神经网络。
让我们看看两种梯度裁剪算法在 Tensorflow 和 Pytorch 等主要机器学习框架中的实现。
我们将使用 MNIST 数据集,这是一个用于图像分类的开源数字分类数据。
对于第一部分,我们将进行一些 Tensorflow 和 Keras 通用的数据加载和处理。
数据加载
import tensorflow as tf
from tensorflow.keras import Model, layers
import numpy as np
import tensorflow_datasets as tfds
print(tf.__version__)
import neptune.new as neptune
run = neptune.init(project='common/tf-keras-integration',
api_token='ANONYMOUS')
我们建议您安装 Tensorflow 2 的最新版本,在撰写本文时是 2.3.0,但此代码将与任何未来版本兼容。确保您安装了 2.3.0 或更高版本。在这段摘录中,我们像往常一样导入了 TensorFlow 依赖项,使用 NumPy 作为我们的矩阵计算库。
from tensorflow.keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = np.array(x_train, np.float32), np.array(x_test, np.float32)
x_train, x_test = x_train.reshape([-1, 28, 28]), x_test.reshape([-1, num_features])
x_train, x_test = x_train / 255., x_test / 255.
train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_data = train_data.repeat().shuffle(5000).batch(batch_size).prefetch(1)
现在,我们来看看如何在 Tensorflow 中实现逐值和逐范数的渐变裁剪。
TensorFlow
class Net(Model):
def __init__(self):
super(Net, self).__init__()
self.lstm_layer = layers.LSTM(units=num_units)
self.out = layers.Dense(num_classes)
def __call__(self, x, is_training=False):
x = self.lstm_layer(x)
x = self.out(x)
if not is_training:
x = tf.nn.softmax(x)
return x
network = Net()
我们创建了一个简单的 2 层网络,输入层为 LSTM(基于 RNN 的单位),输出/逻辑层为密集层。
现在,让我们定义要监控和分析的其他超参数和度量函数。
num_classes = 10
num_features = 784
learning_rate = 0.001
training_steps = 1000
batch_size = 32
display_step = 100
num_input = 28
timesteps = 28
num_units = 32
def cross_entropy_loss(x, y):
y = tf.cast(y, tf.int64)
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=x)
return tf.reduce_mean(loss)
def accuracy(y_pred, y_true):
correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.cast(y_true, tf.int64))
return tf.reduce_mean(tf.cast(correct_prediction, tf.float32), axis=-1)
optimizer = tf.optimizers.Adam(learning_rate)
请注意,我们在 logit 层使用 softmax 的交叉熵损失函数,因为这是一个分类问题。您可以随意调整超参数,并使用它来更好地理解流程。
现在,让我们定义优化函数,我们将计算梯度,损失,并优化我们的权重。注意这里我们将应用渐变剪辑。
def run_optimization(x, y):
with tf.GradientTape() as tape:
pred = network(x, is_training=True)
loss = cross_entropy_loss(pred, y)
trainable_variables = network.trainable_variables
gradients = tape.gradient(loss, trainable_variables)
gradients = [(tf.clip_by_value(grad, clip_value_min=-1.0, clip_value_max=1.0))
for grad in gradients]
optimizer.apply_gradients(zip(gradients, trainable_variables))
在第 14 行,我们通过迭代第 11 行计算的所有渐变来应用逐值渐变。Tensorflow 在其 API 中有一个显式的函数定义来应用裁剪。
要实现梯度裁剪,只需将第 14 行改为:
gradients = [(tf.clip_by_norm(grad, clip_norm=2.0)) for grad in gradients]
让我们定义一个培训循环并记录指标:
for step, (batch_x, batch_y) in enumerate(train_data.take(training_steps), 1):
run_optimization(batch_x, batch_y)
if step % display_step == 0:
pred = lstm_net(batch_x, is_training=True)
loss = cross_entropy_loss(pred, batch_y)
acc = accuracy(pred, batch_y)
run['monitoring/logs/loss'].log(loss)
run['monitoring/logs/acc'].log(acc)
print("step: %i, loss: %f, accuracy: %f" % (step, loss, acc))
Keras
Keras 作为 TensorFlow API 的包装器,使事情更容易理解和实现。Keras API 让你专注于定义的东西,并负责梯度计算,在后台反向传播。渐变裁剪可以简单到在函数中传递一个超参数。我们来看看具体情况。
from tensorflow.keras.layers import Dense, LSTM
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.callbacks import Callback
import neptune
from neptune.new.integrations.tensorflow_keras import NeptuneCallback
import neptune.new as neptune
run = neptune.init(project='common/tf-keras-integration',
api_token='ANONYMOUS')
model = Sequential()
model.add(LSTM(units=num_units))
model.add(Dense(num_classes))
我们现在要声明渐变裁剪因子,最后用 Keras 的“awesome”来拟合模型。适合”的方法。
optimizer = SGD(lr=0.01, momentum=0.9, clipvalue=1.0)
model.compile(loss='binary_crossentropy', optimizer=optimizer)
neptune_cbk = NeptuneCallback(run=run, base_namespace='metrics')
history = model.fit(train_data, epochs=5, verbose=1,steps_per_epoch=training_steps,callbacks=[neptune_cbk])
Keras 优化器负责额外的梯度计算请求(如背景中的裁剪)。开发人员只需要将这些值作为超参数传递。
为了实现按范数裁剪,只需将第 11 行中的超参数改为:
optimizer = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)
PyTorch
尽管在 Tensorflow 和 Pytorch 中,梯度裁剪的实现在算法上是相同的,但在流程和语法上是不同的。
因此,在使用 Pytorch 实现的这一部分中,我们将再次加载数据,但现在使用 Pytorch DataLoader 类,并使用 pythonic 语法计算梯度,并使用我们学习的两种方法裁剪它们。
import os
import argparse
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision
from torch.optim.lr_scheduler import StepLR
import neptune
import neptune.new as neptune
run = neptune.init(project='common/pytorch-integration',
api_token='ANONYMOUS')
现在,让我们在 PyTorch 中声明一些超参数和数据加载器类。
n_epochs = 2
batch_size_train = 64
batch_size_test = 1000
learning_rate = 0.01
momentum = 0.5
log_interval = 10
random_seed = 1
torch.backends.cudnn.enabled = False
torch.manual_seed(random_seed)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
sequence_length = 28
input_size = 28
hidden_size = 128
num_layers = 2
num_classes = 10
batch_size = 100
num_epochs = 2
learning_rate = 0.01
os.makedirs('files',exist_ok=True)
train_loader = torch.utils.data.DataLoader(
torchvision.datasets.MNIST('files/', train=True, download=True,
transform=torchvision.transforms.Compose([
torchvision.transforms.ToTensor(),
torchvision.transforms.Normalize(
(0.1307,), (0.3081,))
])),
batch_size=batch_size_train, shuffle=True)
test_loader = torch.utils.data.DataLoader(
torchvision.datasets.MNIST('files/', train=False, download=False,
transform=torchvision.transforms.Compose([
torchvision.transforms.ToTensor(),
torchvision.transforms.Normalize(
(0.1307,), (0.3081,))
])),
batch_size=batch_size_test, shuffle=True)
模特时间!我们将声明相同的模型,将 LSTM 作为输入图层,将 Dense 作为 logit 图层。
class Net(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, num_classes):
super(Net, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, num_classes)
def forward(self, x):
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
out, _ = self.lstm(x, (h0, c0))
out = self.fc(out[:, -1, :])
return out
model = Net(input_size, hidden_size, num_layers, num_classes).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
现在,我们将定义训练循环,其中梯度计算以及优化器步骤将被定义。这里我们还将定义我们的裁剪指令。
total_step = len(train_loader)
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
images = images.reshape(-1, sequence_length, input_size).to(device)
labels = labels.to(device)
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
nn.utils.clip_grad_value_(model.parameters(), clip_value=1.0)
optimizer.step()
run['monitoring/logs/loss'].log(loss)
if (i+1) % 100 == 0:
print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'
.format(epoch+1, num_epochs, i+1, total_step, loss.item()))
由于 PyTorch 将渐变保存在参数名称本身(a.grad)中,我们可以将模型参数直接传递给裁剪指令。第 17 行描述了如何使用 torch 的 clip_grad_value_ 函数应用逐值剪辑。
要应用按规范裁剪,您可以将此行改为:
nn.utils.clip_grad_norm_(model.parameters(), max_norm=2.0, norm_type=2)
你可以在这里看到上述指标的可视化。
至此,您已经了解了裁剪的作用和实现方法。现在,在本节中,我们将看到它的实际应用,这是一个前后对比的场景,可以让您理解它的重要性。
为此选择的框架将是 Pytorch,因为它具有动态计算范数并将其存储在变量中的特性。
让我们从通常的依赖项导入开始。
import time
from tqdm import tqdm
import numpy as np
from sklearn.datasets import make_regression
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import neptune.new as neptune
run = neptune.init(project='common/pytorch-integration',
api_token='ANONYMOUS')
为了保持处理小的规范,我们将只为我们的神经网络定义两个线性/密集层。
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(20, 25)
self.fc2 = nn.Linear(25, 1)
self.ordered_layers = [self.fc1,
self.fc2]
def forward(self, x):
x = F.relu(self.fc1(x))
outputs = self.fc2(x)
return outputs
我们创建了" ordered_layers" 变量,以便循环访问它们来提取规范。
def train_model(model,
criterion,
optimizer,
num_epochs,
with_clip=True):
since = time.time()
dataset_size = 1000
for epoch in range(num_epochs):
print('Epoch {}/{}'.format(epoch, num_epochs))
print('-' * 10)
time.sleep(0.1)
model.train()
running_loss = 0.0
batch_norm = []
for idx,(inputs,label) in enumerate(tqdm(train_loader)):
inputs = inputs.to(device)
optimizer.zero_grad()
logits = model(inputs)
loss = criterion(logits, label)
loss.backward()
if with_clip:
nn.utils.clip_grad_value_(model.parameters(), clip_value=1.0)
for layer in model.ordered_layers:
norm_grad = layer.weight.grad.norm()
batch_norm.append(norm_grad.numpy())
optimizer.step()
running_loss += loss.item() * inputs.size(0)
epoch_loss = running_loss / dataset_size
if with_clip:
run['monitoring/logs/grad_clipped'].log(np.mean(batch_norm))
else:
run['monitoring/logs/grad_nonclipped'].log(np.mean(batch_norm))
print('Train Loss: {:.4f}'.format(epoch_loss))
print()
time_elapsed = time.time() - since
print('Training complete in {:.0f}m {:.0f}s'.format(
time_elapsed // 60, time_elapsed % 60))
这是一个基本的训练函数,包含包含梯度计算和优化步骤的主事件循环。这里,我们从所说的“ordered _ layers”变量中提取范数。现在,我们只需要初始化模型并调用这个函数。
def init_weights(m):
if type(m) == nn.Linear:
torch.nn.init.xavier_uniform(m.weight)
m.bias.data.fill_(0.01)
if __name__ == "__main__":
device = torch.device("cpu")
X,y = make_regression(n_samples=1000, n_features=20, noise=0.1, random_state=1)
X = torch.Tensor(X)
y = torch.Tensor(y)
dataset = torch.utils.data.TensorDataset(X,y)
train_loader = torch.utils.data.DataLoader(dataset=dataset,batch_size=128, shuffle=True)
model = Net().to(device)
model.apply(init_weights)
optimizer = optim.SGD(model.parameters(), lr=0.07, momentum=0.8)
criterion = nn.MSELoss()
norms = train_model(model=model,
criterion=criterion,
optimizer=optimizer,
num_epochs=50,
with_clip=True
)
这将为您指定的指标创建一个图表,如下所示:
您可以看到有和没有剪裁的规范之间的差异。在没有 限幅的实验期间,范数在几个周期之后爆炸到 NaN,而具有 限幅的实验相当稳定并且收敛。这里可以看到海王星实验这里可以看到 colab 笔记本里的源代码。
你已经到达终点了!
恭喜你!你已经成功地理解了渐变裁剪方法,它解决了什么问题,以及爆炸渐变问题。
下面是一些尾注和未来的研究内容,供你参考。
伐木为王!
每当您在一个大型网络上进行一个大项目时,请确保您的日志记录过程是彻底的。
爆炸梯度 只有在你记录和监控得当的情况下才能被高效捕捉。
您可以使用 Tensorboard 中当前的日志记录机制在 Neptune 的仪表板中可视化和监控其他指标。你要做的就是简单地安装 neptune-client 来完成这个任务。在这里浏览文档。
研究
目前就这些,敬请关注更多!再见!********
从机器学习的角度理解向量
如果你从事机器学习,你将需要使用向量。几乎没有 ML 模型在项目生命周期的某一点不使用向量。
虽然向量被用于许多其他领域,但是它们在 ML 中的使用方式有所不同。这可能会令人困惑。从 ML 的角度来看,向量的潜在混淆是我们在 ML 项目的不同阶段出于不同的原因使用它们。
这意味着向量的严格数学定义可能无法传达您在 ML 上下文中处理和理解向量所需的所有信息。例如,如果我们认为一个典型的 ML 项目的简单生命周期是这样的:
…然后有三个不同的阶段。每一个都有稍微不同的向量用例。在本文中,我们将通过查看与这些阶段相关的向量来澄清这一切:
- 输入:机器不能像你我一样阅读文字或看图像。它们需要输入被转换或编码成数字。向量和矩阵(我们一会儿会讲到)将文本和图像等输入表示为数字,这样我们就可以训练和部署我们的模型。我们不需要对向量有很深的数学理解,就可以用它们来为我们的输入编码信息。我们只需要知道向量与特征之间的关系,以及如何将这些特征表示为向量。
- 模型:大多数 ML 项目的目标是创建一个执行某些功能的模型。它可以对文本进行分类,或者预测房价,或者识别情绪。在深度学习模型中,这是通过神经网络实现的,其中神经网络层使用线性代数(如矩阵和向量乘法)来调整你的参数。这就是向量的数学定义与 ML 相关的地方。在这篇文章中,我们不会深入线性代数的细节,但是我们会看看向量和矩阵的重要方面,我们需要使用这些模型。这包括理解向量空间以及为什么它们对 ML 很重要。
- 输出:根据我们的目标,我们的 ML 模型的输出可以是一系列不同的实体。如果我们预测房价,输出将是一个数字。如果我们对图像进行分类,输出将是图像的类别。然而,输出也可以是向量。例如,NLP 模型像通用句子编码器(使用)接受文本,然后输出一个表示句子的向量(称为嵌入)。然后,您可以使用这个向量来执行一系列操作,或者作为另一个模型的输入。您可以执行的操作包括在向量空间中将相似的句子聚集在一起,或者使用余弦相似性等操作来查找不同句子之间的相似性。理解这些操作将有助于您了解如何使用像 NLP 模型这样输出向量的模型。
注:你可以在 Github 上找到这个帖子的所有代码。
标量、向量和矩阵
向量并不是机器处理和转换输入时表示数字的唯一方式。虽然我们在这篇文章中主要关注向量,但我们也需要定义其他表示数字的结构。
这将有助于我们在接下来的部分,我们需要了解向量如何与其他结构相互作用。出于本节的目的,让我们将关于房价的 Kaggle 数据集作为我们的参考框架,看看我们如何使用标量、向量和矩阵来表示这些数据。
*Our house price data has 18 potential features (21 less id, data and the price we want to predict) that a model could use to help it predict the price. *
标量:对我们来说,标量只是数字。我们可以把它们想象成我们使用的任何常规值。我们数据集中的任何单个值都代表一个标量。例如,我们房价数据中的卧室数量将是一个标量。如果我们只使用一个特征作为房价数据的输入,那么我们可以将其表示为一个标量值。
print(house_price_df['bedrooms'].values[0])
3
向量:在我们的房价数据中,似乎有不止一个可用的特征。我们如何表示多个特征?当试图预测房价时,房子的总面积将是一条有用的信息。最简单的形式是,我们可以把向量看作一维数据结构。我们稍后将更详细地定义一个 vector,但是现在可以把它看作一个列表,让我们把更多的特性传递给我们的模型:
print(house_price_df[["bedrooms", "sqft_lot"]].values[:1])
[[ 3 5650]]
我们还可以通过以列而不是行的格式排列数据来创建一维向量:
print(house_price_df[["bedrooms", "sqft_lot"]].values.T[:2, :1].shape)
[[ 3]
[5650]]
矩阵:到目前为止,我们只看了数据集中的第一栋房子。如果我们需要批量通过多个房子,有他们的卧室和平方英尺/平方米的价值?这就是矩阵的用武之地。您可以将矩阵视为二维数据结构,其中两个维度指的是行数和列数:
print(house_price_df[["bedrooms", "sqft_lot"]].values[:2])
[[ 3 5650]
[ 3 7242]]
这是一个包含行和列的二维数据结构:
print(house_price_df[["bedrooms", "sqft_lot"]].values[:2].shape)
(2, 2)
我们可以添加更多的行,查看前 3 个房价数据,看看这如何改变我们矩阵的形状:
print(house_price_df[["bedrooms", "sqft_lot"]].values[:3].shape)
(3, 2)
需要注意的一点是,我们之前创建的向量实际上是一维矩阵。从这个意义上说,向量也可以是矩阵,但反之则不然。矩阵不能是向量。
现在我们已经澄清了一些术语,让我们看看如何使用向量作为我们深度学习模型的输入。
你可以看到 TensorBoard 如何处理标量和向量
输入:作为编码器的矢量
正如我们前面提到的,我们在 ML 中使用向量的方式非常依赖于我们是处理输入、输出还是模型本身。当我们使用向量作为输入时,主要用途是它们能够以我们的模型可以处理的格式编码信息,然后输出对我们的最终目标有用的东西。让我们用一个简单的例子来看看向量是如何被用作编码器的。
假设我们想要创建一个写新大卫·鲍依歌曲的 ML 模型。要做到这一点,我们需要在实际的大卫·鲍依歌曲上训练模型,然后用输入文本提示它,然后模型将把它“翻译”成大卫·鲍依式的歌词。从高层次来看,我们的模型应该是这样的:
我们如何创建输入向量?
我们需要向我们的模型传递大量大卫·鲍依的歌词,这样它就可以像齐格·星尘一样学习写作。我们知道,我们需要将歌词中的信息编码成一个向量,以便模型可以处理它,神经网络可以开始对我们的输入进行大量的数学运算,以调整参数。另一种思考方式是,我们使用向量来表示我们希望模型学习的特征。
该模型可能试图预测房价,使用我们之前使用的房价数据集来解释标量、向量和矩阵之间的差异。在这种情况下,我们可能会传递诸如房子大小、卧室数量、邮政编码之类的信息。这些都是可能有助于模型预测更准确的房价的特征。很容易看出我们如何为我们的房价模型创建一个输入向量。当我们创建一个包含卧室数量和房屋平方英尺/平方米值的向量时,我们已经展示了如何对这些数据进行编码:
print(house_price_df[["bedrooms", "sqft_lot"]].values[:1])
[[ 3 5650]]
我们将其描述为一个二维向量,因为它编码了房价数据集的两个部分。我们不应该将这与矩阵是二维数据结构的事实相混淆。当我们说一个矩阵是二维的,我们的意思是它有 2 个索引,行和列。
要标识矩阵中的单个元素,需要指定其行和列的位置。而在 vector 中,它只有一个索引,所以只需要指定一个索引。可以把它想象成对一个列表进行寻址,你只需要确定列表的索引。而矩阵就像一个 numpy 数组,需要指定行和列的值。
但是一句话呢?
房价数据集已经包含了创建特征向量所需的所有列,我们可以将这些列用作模型的输入。数据集本身对它们进行了描述。因此,很容易将数据转换或编码成矢量格式。然而,我们的鲍伊歌词不容易转换成矢量。相反,我们需要找到一些规则来编码歌词中包含的信息。
一个简单的方法是给每个单词分配一个数字,并用它来创建一个向量。这可以通过计数矢量化来完成,您可以在 Scikit Learn 中找到一种方法。
阅读如何将 Sklea 与 Neptune 集成,并跟踪您的分类器、回归器和 k-means 聚类结果。
在这里,具体的实现并不重要,只是我们希望找到一种方法,以类似于 house 数据的方式来表示句子。举个例子,就拿鲍伊《一个自由节日的记忆》中的两行歌词来说吧:
首先我们需要创建一个固定长度的向量。在我们根据房价数据示例创建的向量中,每栋房子有 2 个数据点。通过从数据集中添加更多的特征,我们可以很容易地将它变成一个 18 维向量。
为了尝试和确定我们的 Bowie 歌词向量的长度,我们可以用上面两行来代表我们的整个 Bowie 歌词语料库。然后我们有 9 个独特的词或特征。
def get_vocab(text):
vocab = set()
for line in text:
vocab.update([word.lower() for word in line.split()])
return(vocab)
vocab = get_vocab(lyric_list[0:2])
print(f'There are {len(vocab)} unique words in these lyrics:')
print(f'They are: {vocab}')
There are 9 unique words in these lyrics:
They are: {'children', 'in', 'of', 'grass', 'gathered', 'the', 'end', "summer's", 'dampened'}
我们这里的输入向量将包含 9 个特征。显然,就输入时可能用到的所有单词而言,这是一个很小的数字。如果我们试图编码一个包含我们不认识的单词的句子,我们可以忽略它。如果该单词确实存在,我们将计算它在输入中出现的次数,并将该值添加到 vocab 中表示该单词的向量维数或特征中。
我们的特征看起来像这样:
count_vector = vector_lookup(lyric_list[0:2])
print(count_vector)
{0: 'children', 1: 'in', 2: 'of', 3: 'grass', 4: 'gathered', 5: 'the', 6: 'end', 7: "summer's", 8: 'dampened'}
如果单词“children”在输入中出现 2 次,那么向量的第一维将是 2。如果不发生,则为 0。如果我们遇到一个不在词汇库中的单词,我们将什么也不做,因为它没有特征或维度。如果我们想训练出最好的鲍伊歌词写作模型,这显然是不理想的。在下一个例子中,我们将会看到更好的输入编码方式。
如果我们的输入句子是“在草地上玩耍的孩子们”,那么表示这个句子的输入向量将如下所示:
print(input_vector(count_vector, "The children played in the grass"))
[1, 1, 0, 1, 0, 2, 0, 0, 0]
单词‘children’出现一次,是我们向量的第一个特征,所以是 1。的没有出现在输入句中,所以为零。单词“”出现了两次,因此索引 5 处的特征的值为 2。**
*现在让我们使用“一个自由节日的记忆”中的所有歌词,看看我们对同一个句子的输入向量是什么样子的:
count_vector = vector_lookup(lyric_list)
full_vec = input_vector(count_vector, "The children played in the grass")
print(f'The new feture size is {len(count_vector)}')
print(full_vec)
新的特征尺寸是 129
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
我们看到更多的零,因为有更多的特征,而且它们并不都出现在每个输入句子中。这就是我们所说的稀疏向量——它不是“密集”分布的。大多数特征不编码任何信息,因为它们是空的(它们被设置为零)。
这是低效的,因为大多数特征不包含太多信息。在实践中,我们可以通过用更少的零创建“更密集”的向量的方法来解决这个问题。
密集向量是什么样子的?
我们为输入 Bowie lyric 模型而创建的向量很少。我们可以使用一个完全独立的模型来接收一个句子并返回一个密集的向量,而不是创建我们自己的向量。然后我们可以用它作为我们自己学习鲍伊歌词模型的输入。
这是一个将模型链接在一起的例子,其中您使用一个模型的输出作为另一个模型的输入。这也是一个模型输出向量的例子,我们将在后面的文章中讨论。
通用句子编码器 (USE)是一个可以接受文本输入并输出向量的模型的例子,就像我们需要的 Bowie 模型一样。使用将产生包含 512 个维度的输出向量。这些可以被认为是我们新的输入向量,而不是我们稀疏填充的计数向量。
如前所述,这些向量包含 512 个特征或维度。有趣的是,向量的大小并不随输入句子的大小而变化:
sample_sentences = ["We scanned the skies with rainbow eyes",
"We looked up into the sky",
"It was raining and I saw a rainbow",
"This sentence should not be similar to anything",
"Erer blafgfgh jnjnjn ououou kjnkjnk"]
logging.set_verbosity(logging.ERROR)
sentence_embeddings = embed(sample_sentences)
for i, sentence_embedding in enumerate(np.array(sentence_embeddings).tolist()):
print("Lyrics: {}".format(sample_sentences[i]))
print("Embedding size: {}".format(len(sentence_embedding)))
sentence_embedding_snippet = ", ".join(
(str(x) for x in sentence_embedding[:3]))
print("Embedding: [{}, ...]n".format(sentence_embedding_snippet))
如果你仔细观察这些向量,你会发现在所有的特征中很少有零。这就是为什么它们被描述为“密集”向量。另一件要注意的事情是,我们不知道这些特性意味着什么。在我们的 Bowie 歌词示例中,我们定义了特性,因此我们确切地知道每个输入向量维度与什么相关。相比之下,对于使用,我们不知道第 135 维是否与大写、长度或特定单词相关。甚至可能没有这些特征的尺寸,我们只是猜测。
在我们对维度知之甚少的情况下创建向量似乎毫无意义。但这是向量的一个关键之处,它让向量在 ML 中变得如此强大。我们不需要理解任何关于向量的维度,或者它们是如何被创建的,就可以使用它们。我们需要理解的只是我们可以对向量执行的操作,以及这些向量所在的空间。但是在我们看当我们把一个向量传递给模型时会发生什么之前,我们需要看一下我们如何把矩阵作为输入。
鲍伊歌词矩阵
import numpy as np
np.set_printoptions(threshold=10)
lyrics = []
for lyric in lyric_list[15:18]:
print(lyric)
vec = input_vector(count_vector, lyric)
lyrics.append(vec)
lyric_matrix = np.array(lyrics)
print(f'Matrix shape: {lyric_matrix.shape})')
print(lyric_matrix)
And fly it from the toppest top
of all the tops that man has
pushed beyond his Brain.
Matrix shape: (3, 129))
[[0 0 0 ... 0 0 0]
[1 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]
正如我们所提到的,矩阵是向量的矩形阵列。它们是使我们能够以二维格式存储信息的数据结构。对于我们的 Bowie 模型,我们可能希望成批传递句子,而不是一次一个句子作为输入。为此,我们将信息存储在一个矩阵中,并将其传递给我们的模型。然后,模型可以以类似于向量的方式处理矩阵。在图像处理中,矩阵用于表示作为模型输入的图像。例如,著名的 Minst 数据集使用 28 X 28 矩阵来表示灰度数字。行中的每个元素都是 0-255 之间的值,代表其灰度强度。
模型:向量作为变压器
此时,我们已经将输入表示为一个向量,并希望用它来训练我们的模型。换句话说,我们希望我们的模型学习一种转换,这种转换使用我们输入中的特性来返回实现某个目标的输出。我们已经讨论了这种目标的一个例子:
- 预测房价:我们展示了如何创建一个向量,该向量对房价数据中所需的特征进行编码。在这个场景中,我们想要学习一个使用这些特性来输出房子的预测价格的转换。
- 创建 Bowie 风格的歌词:对于我们的 Bowie 模型,输出是文本,转换是将输入的句子转换成 Bowie 风格的歌词。
- 句子编码器:使用模型将输入句子转换成输出向量。它的目标是创建一个输出句子,使用输入句子的特征,在一个叫做向量空间的东西中表示那个句子。
神经网络是一种创建可以学习这些转换的模型的方法,因此我们可以将我们的房价数据转化为预测,将我们枯燥的句子转化为鲍伊式的思考。
具体来说,神经网络的隐藏层接收我们的矢量化输入,创建一个权重矩阵,然后使用该权重矩阵创建我们想要的输出:
The hidden layer is where the computation takes place to learn the transformations we need to create our outputs. Source DeepAi.org
我们不需要进入神经网络如何工作的细节。但我们确实需要了解更多关于向量和矩阵的知识,以及它们是如何相互作用的,这样我们才能理解我们为什么使用它们,更重要的是,我们如何使用这些网络的输出。因此,在本节中,我们将:
- 定义向量:我们需要从数学的角度简要定义向量,并展示上下文与我们使用它们作为输入的方式有何不同。
- 向量空间:向量生活在向量空间中。如果你理解了这些空间是如何工作的,那么你就能理解为什么向量在 ML 中很重要的大部分原因。
- 向量和矩阵运算:我们通过将向量与矩阵相乘来操作向量。它们挤压、挤压、移动和变换向量,直到我们的模型学会了一些我们可以用于输出的东西。这些操作对最后一节很重要,在最后一节中,我们将看看当我们的模型输出向量时使用的常见操作,就像使用模型对我们的 Bowie 歌词所做的那样。
本节的目标是帮助我们理解,我们在 ML 模型中使用向量学习函数的方式与我们在输入和输出中使用向量的方式略有不同。
这就是为什么 ML 项目中管道阶段的环境是重要的。关于向量的有用知识可能是不同的,这取决于你想用你的向量做什么。希望了解这一点能对你未来的 ML 项目有所帮助。
什么是向量?
以前,我们将向量定义为一系列数字或一维数据结构。这有助于我们理解如何将来自数据集的信息编码为输入传递给 ML 模型。
在这些模型中,一旦接收到输入,重要的是要理解向量是具有不同寻常的大小和方向的对象:
Most people will be familiar with the definition of a vector as being something that has both magnitude and direction. Source MathInsight.org
我们不会在这个定义上花时间,因为大多数人都熟悉它,但是我们要注意:
- 几何:这个定义有一个几何方面,因为它有一个方向。这意味着它存在于一个几何空间中,我们可以对向量进行操作,改变它的方向和/或大小。这也意味着这些空间可以有维度。上面的例子显示了一个二维向量,但它可以有三维甚至更多维,这使得人们很难想象。
- 与输入的相关性:我们在这里也可以看到,理解一个矢量有大小和方向并不能真正帮助我们将输入编码为矢量。我们不需要理解我们从房价数据中创建的向量的方向来创建有用的输入。
MathInsight 网站有一个很好的工具来探索向量的一些重要性质。您可以操纵向量在图形中移动,但请注意向量的大小和方向不会改变:
We can see the vector has a magnitude and direction, and is located in a certain part of the graph.
We note that we can move the vector to a different part of the graph, but the magnitude and direction are still the same. The point in space to which the vector now points is different.
从上面的例子中我们可以看到,一个向量存在于一个叫做向量空间的空间中,我们可以操纵这个向量在这个空间中移动。理解这个向量空间的本质是在 ML 中使用向量的关键。我们需要定义向量空间的含义。
向量空间
我们可以把向量空间想象成包含所有向量的区域。我们可以认为这些空间与向量的维数有关。如果我们上面的向量例子是二维的,它可以用 X 和 Y 坐标来描述,就像你在 matplotlib 上画的大多数二维图形一样:
2-D vector spaces are similar to common graphs we would draw in matplotlib. Notice here that we have drawn the vectors as points without the arrows. This is to show that we can also think of vectors as points in these vector spaces.
向量空间的关键在于它是一种定义一组向量的方法,我们可以在其中执行运算,比如向量加法和乘法。结果,我们可以得到三维向量空间,其中向量由 3 个坐标定义。这些向量空间之间的唯一区别是它们的维度。
我们可以对每个空间中的向量执行相同的操作,例如:
- 加法:我们将两个向量相加,创建第三个向量。
- 乘法:我们可以将一个矢量乘以一个标量来改变矢量的大小。
这些向量空间具有定义所有这些操作如何发生的性质。换句话说,向量空间具有以下性质:
- 加法必须创建一个新的矢量。
- 加法是可换的,即向量 A +向量 B ==向量 B +向量 A。
- 必须有一个零向量,当加到另一个向量上时返回该向量的单位向量,即 0 +向量 A ==向量 A + 0 ==向量 A。
- 对于每个矢量,都有一个指向相反方向的反向矢量。
- 向量加法也是联想,即向量 A +(向量 B +向量 C) ==(向量 A +向量 B) +向量 C。
向量空间对 ML 很重要,因为它们是我们所有变换发生的空间,在这里输入向量被操纵以创建我们输出所需的权重。我们不需要深入这些转换的细节,但是我们需要提到一些在下一节中很重要的操作,在下一节中,我们尝试对我们的输出执行操作以实现一些最终目标。
向量和矩阵运算
有一些关键的向量操作会在大多数 ML 项目中频繁出现,所以我们需要在这里涵盖它们。在下一节中,我们将查看这些操作的一些工作示例,使用 USE 模型来生成 512 维句子向量。我们将了解的操作有:
- 向量范数:在第一部分,我们注意到你可以把向量想象成代表特征的数字列表。特征的数量与向量的维数有关,正如我们刚刚看到的,与向量所在的向量空间有关。因为这些向量有一个大小,我们可以用向量范数得到它的大小。这些范数表示向量的大小或长度,可以用于不同向量之间的简单比较。因为范数代表向量的大小,所以它总是正数。即使向量中的所有值都是负的,也是如此。有很多方法可以得到向量的范数,最常见的有:
- L1 范数=矢量的绝对值之和,也称为曼哈顿距离。
这篇文章很好地概括了这些标准之间的区别以及它们在距离度量中的应用。
- L2 范数=向量平方值之和的平方根,也称为欧几里德距离。下面例子中的红线
这是另一篇更详细讨论 L2 规范的文章。
- 内积:内积是对两个向量进行运算并返回一个值的另一种方式。数学上,我们将向量 A 中的每个元素乘以向量 B 中相应的元素,然后将结果相加。与规范不同,内积可以是负数。你可能会听到这被称为点积,它只是欧几里得空间内积的一个特例。几何上,我们可以把内积想成两个向量的大小和它们之间夹角的余弦的乘积。
Wikipedia definition of dot product in Euclidean space
-
余弦:你可以把点积想成两个向量之间的夹角乘以两个向量的长度的余弦。如果向量的大小很重要,也就是说,你认为它携带了一些信息,那么你应该使用点积。相反,如果您只想知道两个向量在方向上有多接近,那么您可以使用余弦相似性度量。余弦只是点积的一种操作,可以忽略幅度,即两个向量之间的余弦角是相同的,即使向量的大小不同:
-
向量归一化:我们现在知道向量有大小,不同的向量可以有不同的大小。有时我们不关心向量的大小,只对它的方向感兴趣。如果我们根本不在乎大小,那么我们可以让每个向量大小相同。我们通过将每个向量除以其大小来实现,从而使每个向量的大小为 1,或者将它们转换为单位向量。现在余弦相似度和点积将返回相同的值:
Source: Example of vector normalization
- 降维:我们的房价向量只有两个维度,因为它们只包含两个特征值。相比之下,我们生成的使用向量有多达 512 个维度。对我们来说,画二维图很容易,但是画 512 维图呢?没那么容易。因此,我们需要使用某些技术来减少向量的维数,而不会丢失太多重要的信息。我们将看看执行这种缩减的最常见方法之一:
主成分分析(PCA): PCA 试图识别解释数据中大部分变化的超平面。类似于我们试图在线性回归中寻找趋势线的方法。PCA 中的主成分是这些超平面的轴。现在,只要把它想成一种用更少的维度来寻找代表向量中大部分变化的值的方法:
Source: A great post on PCA if you want to understand it in more detail
我们在这一部分已经讲了很多,所以在我们看最后一部分之前,让我们来回顾一下。到目前为止,我们:
- 更详细地定义了向量,并展示了如何在向量空间中表示它们。
- 展示了 ML 模型需要从我们的输入向量的特征中学习,以创建将输入数据转化为我们需要的输出的转换。
- 定义了发生这些变换的向量空间。
- 看了一些我们可以在这些空间中对向量执行的常见操作。
现在我们可以看看所有这些工作的结果,也就是我们的产出。我们将展示我们讨论过的所有操作的工作实例,并展示它们如何在许多情况下作为你下一个 ML 项目的一部分被使用。
虽然您不需要理解我们刚刚讨论的所有运算的数学原理,但是对为什么使用它们有一个宽泛的概念基础会有所帮助。当涉及到输出时,这将让您为相关任务选择正确的操作。
输出:使用向量运算
正如我们在这篇文章中提到的,如何在 ML 中使用向量取决于管道阶段。在上一节中,我们看到了向量数学、运算和变换是理解深度学习神经网络“幕后”发生的事情的关键。这些计算都发生在输入和输出之间的“隐藏层”。
但是,对于大多数 ML 项目,您不需要这种级别的细节。当然,理解深度学习算法的核心数学肯定是好的,但这对开始使用这些模型并不重要。
例如,正如我们在输入部分所展示的,你不需要矢量数学的详细知识就能以矢量格式编码输入。当你想出如何最好地编码一个句子以便你的模型可以处理它时,向量的大小并不重要。相反,重要的是要知道你正在用编码解决的问题,你是需要一个稀疏的还是密集的向量,或者你想要捕捉什么特征。
现在,类似地,关于你的模型的输出,我们将看看向量的方面,它对 ML 管道的这个阶段最有影响。请记住,这些模型的输出甚至可能不是一个向量,它可能是一幅图像,或者一些文本,或者一个类别,或者一个数字,比如房价。在这些情况下,你不需要处理任何向量,所以你可以像以前一样继续。
但是如果你有一个矢量输出,你将主要关心两个目标:
- 其他模型的输入:你可能想要使用一个模型的矢量输出作为另一个模型的输入,就像我们之前使用的和我们的 Bowie 模型一样。在这些情况下,您可以参考输入部分,将向量视为一个值列表和一个表示相关信息的编码。您还可以使用输出在这个输入的基础上构建一个分类器,并训练它来区分一些领域特定的数据。无论哪种方式,都是将向量作为另一个模型的输入。
- 向量函数的输入:如果输出是一个向量,并且我们没有将其用作另一个模型的输入,那么我们需要将其与向量函数结合使用。使用模型输出一个嵌入(即向量),但是我们不能孤立地解释这个 512 数组的数字。我们需要对它执行一些功能,以生成我们可以解释的结果。正如我们在上一节中提到的,这些函数可以识别两个向量之间的相似性,并降低向量的维数,以便我们可以可视化它们。知道对于给定的目的需要哪种操作可能会令人困惑。因此,我们将在本节中查看这些操作的一些工作示例。
为我们的行动生成向量
我们需要一些示例向量,以便在向量运算中使用。我们可以通过创建一些例句,将它们传递给用户,并存储向量输出来实现这一点。这样,我们可以将每个操作的结果与句子本身进行比较。我们将创建一组句子,一些看起来相似,另一些语义上非常不同:
- 我们用彩虹眼扫描天空—《自由节日的记忆》中鲍伊的歌词
- 我们仰望天空——这是一首非鲍伊的歌词,看起来语义相似
- 下雨了,我看到了彩虹,这句话似乎和歌词更不一样
- 此句不应与任何东西相似–此句不应有语义重叠
- 一句完整的胡言乱语
现在让我们看看我们的向量运算告诉我们这些句子。
向量范数
我们之前已经看到,向量范数是一种确定向量“大小”的方法。在为我们的向量生成嵌入之后,我们可以得到如下的 L1 和 L2 范数:
for sentence, vector in zip(sample_sentences, sentence_embeddings):
l1 = norm(vector, 1)
print(f"L1 norm of '{sentence}': is {l1:.4}")
for sentence, vector in zip(sample_sentences, sentence_embeddings):
l1 = norm(vector)
print(f"L2 norm of '{sentence}': is {l1:.4}")
我们可以看到关于这些规范的两点:
- L1 规范值在数值上接近,
- L2 标准值加起来都是 1。
这可能看起来很奇怪,但是根据我们现在对向量的了解,让我们看看他们在 Tensorflow 页面上对使用嵌入是怎么说的:
看起来嵌入已经被规范化了(近似规范化,我不确定它们是什么意思,但是让我们假设它意味着它们被规范化了)。这意味着向量除以它们的大小,然后当我们得到 L2 范数时,它总是 1,也就是单位向量。
作为一个不同的例子,让我们用一个不同的模型来得到我们的向量的 L2 范数,这个模型没有以同样的方式归一化向量。有一个很棒的库可以做到这一点,叫做快速句子嵌入 (FSE)。这些向量的 L2 范数不都是 1:
for idx, sentence in enumerate(sample_sentences):
l2 = norm(model.sv[idx])
print(f"L2 norm of '{sentence}': is {l2:.4}")
这告诉我们关于向量的什么?实际上,不多。它不擅长识别我们句子之间的语义差异。这可能表明向量的大小不是识别句子之间语义相似性的可靠方法。
内积
如果大小本身不能告诉我们很多关于向量的信息,让我们试试内积。记住,这是两个向量乘积的和:
res = {}
for sen in sample_sentences:
res[sen] = []
for i, s1 in enumerate(sample_sentences):
for j, s2 in enumerate(sample_sentences):
dot_prod = np.dot(sentence_embeddings[i], sentence_embeddings[j])
res[s1].append(round(dot_prod, 3))
pd.DataFrame(res, index=[s for s in sample_sentences])
得到每对句子的内积,我们可以看到,当它们相同时,我们得到 1,当它们不相同时,我们得到其他值。如果你看看我们的胡言乱语句子的分数,你可以看到我们对一些对得到一个负分。对于“这个句子不应该与任何东西相似”这个句子,我们也得到了低分。我们的鲍伊歌词句子和我们不太折衷的尝试确实产生了相对较高的分数,事实上是所有比较中最高的分数。也许我们毕竟有一些抒情的创造力。
余弦相似性
另一个得分是两个向量之间的余弦相似性得分。正如我们之前提到的,这忽略了向量的大小,所以它应该给内积一个不同的结果。但是请记住,我们的嵌入是标准化的,这意味着我们应该得到与内积相同的余弦相似性分数。知道这一点很有好处,因为如果要进行大量的相似性比较,内积运算会更有效。
def get_cos_sim(sen1, sen2):
sts_encode1 = embed(tf.constant([sen1]))
sts_encode2 = embed(tf.constant([sen2]))
cosine_similarities = tf.reduce_sum(tf.multiply(sts_encode1, sts_encode2), axis=1)
return cosine_similarities
res = {}
for sen in sample_sentences:
res[sen] = []
for i, s1 in enumerate(sample_sentences):
for j, s2 in enumerate(sample_sentences):
cosine = get_cos_sim(sample_sentences[i], sample_sentences[j])
res[s1].append(round(cosine.numpy()[0], 3))
pd.DataFrame(res, index=[s for s in sample_sentences])
而且看起来分数确实一样!
向量归一化
所以我们知道我们的嵌入已经被规范化了,或者,正如他们在 TF 页中所描述的,接近规范化了。在这种情况下,原始嵌入和我们对原始嵌入进行规范化应该没有区别。我们如何衡量这一点?为什么不用嵌入的大小,或者 L2 范数,就像我们之前做的那样。
non_normed_vector = embed(tf.constant([sample_sentences[0]]))
normed_vector = tf.nn.l2_normalize(embed(tf.constant([sample_sentences[0]])), axis=1)
non_normed_vector - normed_vector
是的,这两个向量之间的差很小,所以看起来它们已经被归一化了。当我们归一化一个向量时,我们只是将向量中的每个元素除以它的大小。所以你也可以这样做:
x = np.array([7, 6, 10])
nrm = norm(x)
print(f'Norm of vector {x} is {nrm}')
normal_array = x/nrm
print(f'The new normalized vecotr is {normal_array}')
print(f'And the norm of this new vector should be 1.... {norm(normal_array)}')
降维
当我们谈到向量空间时,我们注意到我们可以降低 512 维向量的维数,这样我们就可以将它们可视化。这是比较我们句子相似度的另一种方式。我们可以做像聚类这样的事情来识别哪些句子彼此相似。这是在大量句子之间寻找相似性的更好的方法,因为我们不需要在所有可能的组合之间进行成对比较。
scikit-learn 中提供了实现这一点的代码,因此您可以相对容易地减少我们嵌入的维度:
from sklearn.decomposition import PCA
import plotly.express as px
def get_3d_viz(X, sentences):
pca = PCA(n_components=3)
pca_embed = pca.fit_transform(X)
df = pd.DataFrame(columns=['x', 'y', 'z', 'word'])
df['x'], df['y'], df['z'], df['sentence'] = pca_embed[:,0], pca_embed[:,1], pca_embed[:,2], sentences
fig = px.scatter_3d(df, x='x', y='y', z='z', color='sentence')
return(fig)
get_3d_viz(sentence_embeddings, sample_sentences)
这产生了一个很好的视觉效果,就像这样:
如果你看了上面的可视化,你可能会认为“这个句子不应该和任何东西相似”这个句子和我们的胡言乱语的句子看起来很接近,彼此很相似。然而,让我们转换一下我们的视觉,看看三维图像如何帮助我们更好地区分这些句子:
这样做,我们可以看到这些句子和我们的鲍伊歌词之间有一些距离,而我们自己模仿它的尝试是最接近的。正如我们的余弦相似性和内积分数所示。
这显示了能够将向量的维度降低到我们可以在 3d 中可视化的程度的好处。
摘要
那么,我们从向量的旋风之旅中学到了什么?希望你能看到我们在 ML 中使用向量的方式与你在学校或大学中学习向量的方式不同——尽管这些知识仍然很重要。向量的数学定义是我们深度学习算法下发生的事情的关键。
然而,关键的区别在于,我们在这些模型的输入和输出中使用向量的方式不同。当你看到一些关于特征向量或者向量的线性无关性的东西时,不要混淆。相反,要知道这些信息很重要,但是为了编码你的输入和使用你的输出向量,你并不真的需要这些信息。
你可以在积累使用向量的经验时涉猎这些知识,但是在 ML 的上下文中,知道你对管道的哪个阶段感兴趣是使用向量的关键。
参考
如果你想更深入地了解向量在 ML 中是如何使用的,下面的列表提供了一些很好的资源:
- 你可以在 MathInsight 上找到一个很好的向量概述,它提供了一些关于如何执行常见向量运算(如加法和减法)的几何描述
- 如果你想更好地描述向量规范和标准化,这是一篇很好的文章,它也涵盖了如何通过 numpy 在 Python 中实现这一点。
- 如果你想理解维数减少,那么看看这篇文章,它对 PCA 是如何工作的有一些很好的可视化。
- 这是多伦多大学计算机科学系的一个讲座,讲述不同类型的神经网络以及它们如何转换输入向量来识别模式。
- 这是另一篇关于神经网络转换的伟大文章,专门关注前馈网络并描述向量和矩阵如何参与这些操作。*
揭开 BERT 的面纱:变压器模型性能的关键
原文:https://web.archive.org/web/https://neptune.ai/blog/unmasking-bert-transformer-model-performance
如果你正在阅读这篇文章,你可能知道像 BERT 这样的深度学习变压器模型。他们正在彻底改变我们处理自然语言的方式。
💡如果你不知道,我们在上一篇文章中写了关于 BERT 和 Transformer 架构的历史和影响。
Examples of some Transformer models available from HuggingFace (the largest open-source library of Deep Learning NLP models). You can see that most of them are based on BERT in some way.
这些型号性能非常好。但是为什么呢?为什么与其他变压器型号相比,BERT 的性能如此出色?
有人可能会说伯特没什么特别的。变压器架构是我们近年来看到的最先进(SOTA)改进的独特原因。
这是令人困惑的,因为我们需要确切地知道 BERT 的哪些部分值得在未来的模型中复制。否则,我们最终可能会生产出不必要的庞大的模仿模型,并且包含无助于改进的层次和培训目标。
Is it masking that makes BERT so special? How does it work? Hopefully, this slide will make more sense after you read this post. Source: Stanford slides by Jacob Devlin
为了澄清这一困惑,我们将看看这一领域的一些最新研究,并提出:
- 掩蔽是关键:“掩蔽”是培训目标,我们将大部分成功归功于 BERT 和类似 BERT 的模型。
- 屏蔽需要注意:虽然屏蔽是区别 BERT 与其他模型的关键因素,但它是建立在通过变压器架构引入的注意机制之上的。
- 我们仍然不理解掩蔽:尽管掩蔽是最近 NLP SOTA 结果中的核心元素,我们仍然不完全理解掩蔽是如何工作的。我们来看看最近的研究,这些研究表明,以前被认为对掩蔽的成功至关重要的语言(如单词排序)的句法方面并不重要。这提出了一个重要的问题,即我们认为这些模型在学习什么语言。
- 我们可能需要重新评估我们是如何学习语言的:人类如何学习语言是一个持续争论的话题。例如,我们认为,当人类学习单词的含义时,他们所做的不仅仅是简单的共现和模式匹配。但是,如果这实际上是像 BERT 这样的模型学习语言的方式,如果它们可以达到或接近人类的水平,那么,人类只是以同样的方式学习和理解语言的有机统计推理引擎吗?也许我们需要重新审视我们认为人类是如何从语言中学习意义的。
似乎很明显,目前,在 NLP 深度学习的技术生命周期中,实践远远领先于理论。我们使用了一些方法,比如屏蔽,这些方法看起来很有效,我们稍微摆弄一下数字,效果会好一点或者差一点。然而,我们无法完全解释为什么会发生这种情况!
有些人可能会觉得这令人沮丧和失望。如果我们不能解释它,那么我们如何使用它?
也许我们不需要完全解释这些模型。我们仍然可以放心地在生产和重要的商业应用中使用它们,同时努力更好地理解它们的内部工作方式。
表示和学习:变压器模型如何学习上下文
Nearly all transformer models learn some form of context which helps improve their performance in NLP tasks. The question is why do models like BERT appear to learn more from context than other models? Is this due to their learning objective? Source: Demystifying BERT
伯特不是镇上唯一的表演,或者在这种情况下,是街上唯一的木偶!还有其他模型使用 Transformer 架构,而没有学习目标,如屏蔽(不要担心,我们将很快定义所有这些术语)。我们可以看看这些模型是如何执行的,以及这些模型内部发生了什么,以比较和对比 BERTs 学习目标在来自其输入的学习环境中的执行情况。
上下文是将 BERT 和其他变形金刚模型(如 GPT-3)与以前的模型(如 Word2Vec )区分开来的原因,以前的模型只知道一个单词的一种“意思”。从这个意义上说,Word2Vec 产生静态定义(或嵌入,它们只是表示有问题的单词的向量),因为它们只有一个含义,不会根据使用它的上下文而改变。
这有明显的局限性。你目前正在阅读一个关于伯特的帖子,但是你也可以在 帖子 中接收邮件,或者在你的花园里贴一个木制 帖子 等等。“ post ”的每一次使用都有非常不同的含义。这个问题阻止了像 Word2Vec 这样的模型匹配像 BERT (… 或者也许不匹配?稍后我们将讨论 BERT 是否仅仅是带有动态上下文的 Word2Vec 的大规模放大版本。
*在这一节中,我们将看看三种不同类型的模型,它们具有三种不同的学习目标,并表明这些学习目标改变了关于意义和上下文的信息在它们的神经网络层之间传递的方式。这将导致我们声称,当掩蔽被用作学习目标时,这就是为什么像 BERT 这样的模型比非掩蔽替代方案更好地学习上下文的原因。本帖中我们要看的模型是:
- 机器翻译(MT)模型:这是第一批展示 Transformer 架构在神经机器翻译(NMT)等应用中产生重大改进潜力的模型。
- 语言模型(LM) : LMs 如类 GPT 模型,以及它们的递归神经网络(RNN)前身,通过预测序列中的下一个单词来学习。
- 掩蔽语言模型(MLM) :像伯特这样的 MLM 使用了一种叫做掩蔽的方法,他们试图预测文本序列中的一个随机单词。这对这些模型的工作方式有着非常不同的影响,我们很快就会谈到这一点。
表现:变压器模型如何相似
From a high level, we can think of the Transformer models as composed of two main “parts”; one where they represent the text, and the other where they learn from the text. Source: Author
所有变压器模型在其神经网络设计中共享一个通用方法。我们可以认为这种常见的方法有两个主要部分。尽管所有这些网络之间存在许多细微差别,但我们可以从高层次上将它们视为在方法上有些相似。这些网络的两个主要部分是:
- 表示:这是模型接受文本输入并将其表示为我们称之为嵌入的向量的地方。网络的表示部分将文本信息编码成网络可以“读取”或处理的格式。这包括对单词在句子中的位置以及它与句子中其他单词的关系进行编码。
在《变形金刚》中,这种信息编码是通过“注意”机制实现的(注意机制的细节超出了本文的范围,我们在这里详细讨论了;或者,这篇帖子很好地说明了注意力在基于变压器的网络中是如何工作的。对于这篇文章,我们需要知道的是,注意力是一种将关于我们输入文本的信息编码为矢量格式的机制——一种嵌入——我们的神经网络可以处理。 - 学习:一旦 Transformer 模型可以将文本表示为嵌入,我们就可以创建一个学习目标,使模型能够从文本中“学习”。我们希望学习目标将使这些模型能够学习诸如句法结构、语义和上下文之类的东西,这将使它们能够在广泛的语言任务中表现良好。学习目标规定了这些模型可以从它们的训练数据中学习什么,因为它控制了信息如何通过它们的网络流动。
学习:变压器型号有何不同
Each Transformer model can have its learning objective which defines how information flows through the network and how it learns from the input. Source: Author
每个变压器模型可以创建其学习对象,该学习对象将来自网络表示部分的输出作为其输入。表示部分由记号赋予器和注意层组成,它们接受输入并将其转化为嵌入,以矢量格式表示输入文本。
学习目标的选择对变压器模型至关重要,因为这种选择-
- 定义网络如何处理输入:根据学习目标,变换器模型将一次处理一个令牌(单词)的输入,即它将不能“预测”下一个单词;或者它将能够“双向”处理文本,并在学习时访问过去和未来的标记。
- 定义信息如何在网络中流动:学习对象的目标将定义信息如何在网络中流动。这一点很重要,因为像 Transformer 或 BERT 模型这样的深度神经网络由多层组成,每一层都建立在前一层的输出之上。
理想情况下,我们希望每一层都在输入中添加信息,并建立在前一层所学的基础上。这样,理论上,随着信息从较低水平传递到较高水平,深度神经网络应该建立更复杂和更高水平的知识。学习对象将定义这个信息流。
例如,在图像处理中使用的卷积神经网络(CNN)中,网络的低层学习一般细节,如形状的边界和轮廓。然后,更高层学习更多细微的细节,如面部特征和区分同一类型图像的细节方面。如果图像是一只猫,较低层将识别猫的一般格式,并能够将其与狗或人区分开来,较高层将能够区分不同类型的猫。理想情况下(我们不确定,但似乎有可能),我们希望语言模型以类似的方式从文本中学习信息,以便更高层理解语义和句法特征。
我们在这篇文章中看到的三种模型有不同的学习目标:
- 机器翻译(MT)学习目标 : MT 模型获取输入文本,并尝试预测目标句子中的单词。输入句子可以是英语,而目标句子是该句子的法语翻译。ML 模型与这里讨论的其他模型略有不同,因为表示层嵌入不用于直接预测输出。相反,对于 MT 模型,表示层的输出被传递给解码器,解码器将嵌入内容转换回目标语言。出于我们的目的,我们仍然可以用与其他模型相同的方式来考虑它,即学习目标试图预测给定不同源语言输入的目标句子的单词。
- 语言模型(LM)学习目标:像 GPT 这样的 LM 模型试图根据输入句子中的前几个单词来预测下一个单词。因此,学习目标只能访问句子中过去的单词,即它不能“期待”句子中的下一个单词来帮助它预测当前单词。这样,LM 模型被称为是单向的,因为它只从输入开始到输入结束“读取”文本。
- 屏蔽语言模型(MLM) : 学习目标 : MLMs 不是预测下一个单词,而是试图预测从输入中随机选择的“屏蔽”单词。这是完形填空的一种形式,要求参与者预测一个句子中隐藏的单词。它通常被用来评估一个人的语言能力。由于完形填空测试要求用户能够看到所有的文本以理解缺失单词的上下文,所以 MLMs 需要能够同时“看到”所有的文本。这与 LMs 相反,LMs 在预测当前单词时只看到过去的单词。这就是为什么我们说 MLM 是“双向的”,因为它们可以访问当前预测单词前后的单词。
掩蔽语言模型(MLM)的表现更好吗?
Example of a person dragging words to missing spaces in a cloze test. Source: Wikipedia
我们想要回答的关键问题是,MLM 模型是否比其他模型更擅长学习语言信息。虽然这是一件很难衡量的事情,因为我们首先不知道人类是如何学习语言的,但我们可以通过观察网络各层之间输入信息的变化来估计它。具体来说,我们关注的是:
- 模型如何学习输入:最初,模型需要理解给定的输入。它会查看可用的信息,并在生成学习目标所需的输出之前,尽可能多地尝试和理解输入。
- 模型如何使用该信息来执行其任务:学习目标定义了我们模型的目标,即它试图预测什么。一旦模型了解了一些可用的输入,它就可以关注它需要生成的输出,以尝试并满足学习目标的要求。
例如,假设给你一个类似于完形填空测试的任务,并要求你预测遗漏的单词:
"这是我看过的[ 漏字 ]帖子"
在这种情况下,你可以先读完整个句子,然后把注意力集中在缺失单词的上下文上。一开始,你不会去想那个缺失的单词本身。你会看它前后的单词,并把它们作为预测丢失单词的依据。
一旦你思考了周围的单词,你就试着去思考缺失的单词。你为这个词想出了一些可能的选项,并考虑它们是否符合上下文。在这种情况下,你会(很明显地)想到像“最好的”、“最伟大的”、“完美的”、“杰出的”、“最好的”这样的词,并选择其中一个你认为正确的。
一些研究人员已经研究了网络之间信息变化的这个方面,并试图估计不同层之间丢失或获得的信息。他们用几种不同的方法来做这件事。一种方法是查看不同阶段输入层和输出层之间获得或丢失的信息,即输入层和第二层之间的差异、输入层和第五层、第 n 层之间的差异等等。
通过这样做,他们表明:
- 机器翻译在各层之间变化较小:由于机器翻译不预测完形填空类型学习对象的标记,因此它在连续各层的表示之间变化较小。你可以在下图中看到这一点,它显示了层与层之间越来越少的变化。它试图翻译整个句子,所以它没有我们上面提到的两步焦点变化,其中模型理解上下文,然后预测标签。
- 语言模型显示伪造和重新记忆的证据:相比之下,LMs 显示出更多的层间变化,因为它们最初专注于周围单词的上下文,层间的差异逐渐变小。然后,当模型试图预测下一个单词时,我们会看到各层之间的较大变化。
- 掩蔽语言模型显示了层间最大的变化:MLM 在经历这两步过程时,显示了层间更加明显的变化。最初,MLM 丢弃或“丢失”它现在不需要的信息,即该模型关注周围单词的上下文,而不是它试图预测的缺失单词。然后,当它将注意力转移到重新记住与它试图预测的丢失标记相关的信息,即学习目标时,我们看到各层之间的表示发生了巨大变化。
被掩盖的语言模型秘密:上下文编码和标记重构
MLMs 的类似完形填空的任务,即屏蔽输入中的随机单词,似乎迫使变压器模型经历两个部分的过程,研究的作者描述为:
- 上下文编码:正如我们之前提到的,这是模型被迫关注周围单词的上下文,而不是学习目标的目的。MLMs 似乎比 LMs 做得更好,因为它们可以访问输入文本中的整个单词数组,而不像 LMs 那样只能访问前面的单词。与 LMs 或 MLMs 类似,MT 模型没有预测输出需求任务的标签,因此它们甚至更快地“忘记”与正在处理的当前单词相关的信息。
- 记号重建 : MLMs 显示了一个清晰的第二阶段,其中模型将焦点从学习上下文转移到试图预测丢失或被屏蔽的单词。为此,它会尝试“恢复”或“重建”关于当前输入令牌的信息。它这样做是因为它试图理解当前标记与句子中其他标记的相关程度。在上下文编码阶段,模型查看周围的工作,例如,如果当前单词是“银行”,我们可以首先查找类似“钓鱼”或“金钱”的周围单词,以了解我们所指的是什么类型的“银行”,即,一条河“银行”或一个金融机构。
该研究中另一个实验的下图更清楚地显示了这一两阶段过程的影响:
在上图中,我们可以看到,MLM 开始重建关于当前输入令牌的信息,而 ML 和 LM 继续丢失与输入令牌相关的信息,即它们没有明确的“重建”阶段。
像 BERT 这样的屏蔽语言模型受益于未来
像上面提到的那些研究表明,MLM 似乎是像 BERT 这样的大型预训练模型的更好选择,这些模型需要有更一般的语言知识,以便在下游 NLP 任务中表现得更好。
这似乎与 MLMs 可以访问输入文本中的未来信息的事实有关,因为 Transformer 架构提供了双向特性。还记得引言吗,我们提到掩蔽是至关重要的,但它取决于注意力?Transformer 架构的注意机制使模型能够在学习与当前输入令牌相关的周围单词的上下文时“展望”未来。
语言模型也可以使用这一功能,因为它们使用相同的底层架构,但是它们的学习目标的性质意味着它们只查看句子中以前的单词。他们不会“预测”接下来的单词,因为这会给网络设计带来一些问题。例如,如果模型可以访问输入中的所有标记,那么从理论上讲,它可以“欺骗”并总是预测正确的下一个单词,而无需学习任何东西。
因此,在模型简单性和学习目标收益之间有一个权衡。MLM 使模型了解更多关于输入文本的信息,但这是以更大的模型复杂性为代价的。
例如,GPT-3 是一种 LM 模型,它使用转换器架构的解码器部分来预测输入序列中的下一个字。像 GPT-3 这样的模型可以通过在更大和多样化的数据集上进行训练来补偿学习目标的差异。GPT-3 的表现表明,你仍然可以通过这条路线实现 SOTA 的结果。
然而,从上面的结果,我们可以看到 MLM 的好处,由于明确的上下文编码和令牌重建阶段。如果你想从你的输入文本中学习上下文,那么传销从更少的内容中学到更多。这似乎与 MLMs 访问当前输入令牌周围的未来上下文的能力有关。
这种环境优势是 MLM 在许多 NLP 任务中表现的关键。但是,有些任务不适合这种双向访问。就像在 GPT X 这样的文本生成模型中,主要目标是预测文本序列中的下一个单词。这些模型可能适合通过 LM 学习目标进行训练,以增强它们在给定输入任务的情况下预测未来单词的能力。
BERT 中的遮罩是如何工作的?
在我们结束之前,有必要特别了解一下 BERT 及其屏蔽过程实现。
在前面几节中,我们讨论了屏蔽的一般概念,即屏蔽掉一个随机单词。听起来相对容易。
但是,如果您过去曾经使用过 Transformer 模型,您会知道事情会变得更加复杂。BERT 掩蔽实施有两个主要部分:
- 屏蔽 15%的输入标记:BERT 中的屏蔽不只是屏蔽一个标记。相反,它随机选择 15%的输入标记并屏蔽它们。15%是通过试错法选择的。如果你屏蔽了更多的信息,那么模型就很难从输入中学习,因为隐藏了太多的信息。如果您使用少于 15%,可能需要更长的时间和更多的数据来学习足够的上下文,因为模型可能更容易预测丢失的令牌。
- 屏蔽记号,正确记号,或错误记号:这就是开始变得有点奇怪的地方!在选择了我们想要屏蔽的令牌之后,我们需要决定我们是否真的想要屏蔽它们。我们最终不会屏蔽掉我们说过的所有令牌。相反,我们有另一个随机选择过程(我们将在下面讨论),我们选择添加一个隐藏单词的掩码标记,或者用随机选择的不同单词替换该标记,或者用我们最初打算掩码的正确单词替换该标记。听起来很奇怪,对吧?确实是,下面我们会尽量澄清。
戴口罩还是不戴口罩?
一旦我们选择了要屏蔽的 15%的输入标记,我们就需要决定是否要屏蔽这些标记。他们在 BERT 中的工作如下:
- 80%替换为[MASK]标记:对于 80%的选定输入,标记被替换为[MASK]标记,类似于前面提到的经典完形填空测试。
- 10%替换为不正确的单词:对于 10%的所选输入,令牌被另一个随机选择的单词替换,该单词的唯一要求是与所选令牌不同。
- 10%替换为正确的单词:剩余 10%的时间,所选令牌简单地替换为正确的令牌。
伯特论文的作者指出,这些不同比率的选择有些武断,是在反复试验的过程中选择的。然而,这背后的想法似乎与:
- 如果你一直使用掩码标记:仅仅使用掩码标记导致模型很少了解周围单词的上下文。这似乎是因为模型知道它可以“忘记”关于周围单词的所有信息,而只关注目标单词。这类似于类似 LM 的方法,意味着 MLM 没有创建我们之前看到的清晰的两阶段、上下文编码和令牌重建信息流,这对于 MLMs 中看到的改进学习非常重要。
- 如果你使用掩码标记和正确的单词:为了解决这个缺点,你可以在 80%的时候使用掩码标记,然后在 20%的时候用正确的单词替换标记。但是有一个问题。模型将知道当掩码不存在时,那么单词是正确的,并且它不需要学习任何东西,只要保持当前单词,因为它是正确的。换句话说,该模型可以“欺骗”而什么也学不到,因为它知道非屏蔽令牌总是正确的。
- 如果您使用了掩码标记和错误的单词:或者,如果您只是一直使用错误的标记,那么当掩码没有出现时,模型将知道所选的标记是错误的标记,并且它会将其视为另一个掩码,即您可能会遇到与上述相同的问题。
结果是,理想的 80/10/10 分割迫使 BERT 了解输入中所有令牌的更多信息,而不仅仅是当前的输入令牌。或者正如作者指出的、这个过程的优点是变换器编码器不知道它将被要求预测哪些单词或者哪些单词已经被随机单词替换,因此它被迫保持每个输入标记的分布式上下文表示。
关于掩蔽的最新研究?
别担心,我写这篇文章的时候没有中风。这一节的标题是故意弄乱的,以表明词序对我们理解语言的重要性。这就是为什么单词袋 TF-IDF 模型在一些 NLP 任务中表现不佳。他们不保持输入句子中的词序,所以当输入句子的顺序对正在执行的任务很重要时,他们最终会失去一些意义。
像 BERT 这样的 MLM 被认为保留了输入文本中单词的顺序和位置。这经常被认为是他们性能提高的原因。同样,类似完形填空的任务被认为迫使这些模型学习语言的句法和语义方面。这与 Word2Vec 等模型形成对比,word 2 vec 仅从大量文本的分布属性中学习语义。
两篇新的研究论文对掩蔽和 MLMs 给予了更多的关注,并表明我们仍然没有完全理解这一新学习目标的所有细微差别和复杂性:
- 掩蔽语言建模和分布假设:语序对 Little 来说很重要:这篇论文声称单词的语序对 MLMs 来说并不重要。他们通过随机改变输入的句子来做到这一点,并表明这对一系列 NLP 任务的整体性能影响有限。他们认为 MLMs 性能提高的原因可能是:
- 构造糟糕的 NLP 评估框架:这些模型的测试和评估方式对于这些模型来说可能过于简单。因此,结果不能反映模型在语言任务中的实际能力。相反,作者声称这些评估框架需要改进,以跟上 BERT 等变压器模型的性能。我们在早先的帖子中谈到变压器模型的潜在极限时也提到了这一点。
- MLMs 对高阶单词共现统计建模的能力:该论文声称 BERT 表现如此之好完全是因为它能够从共现数据中学习。掩蔽和注意力只是让 BERT 比 Word2Vec 这样的模型学到更多的信息。
- 关于掩蔽语言建模的归纳偏差:从统计到句法依赖;这篇论文聚焦于 MLMs 的完形填空任务方面并声称:
- MLMs close 任务不是真正的 close 任务:因为 MLMs 随机选择要屏蔽的单词,所以它不是一个监督式完形填空测试。在完形填空测试中,通常选择缺失的单词,以确保问题要求参与者了解该语言的句法性质。随机选择这些缺失的单词意味着一些常见的或无意义的单词,如“这个”、“那个”、“那个”等可以被选择用于完形填空。根据任务的不同,这些单词在强迫模式学习对该任务有意义的东西时可能没有用。
- MLMs 不直接学习句法:人们认为类似完形填空的测试迫使模型学习关于语言句法结构的信息。然而,该论文声称表明,相反,MLM 学习标记之间的直接统计依赖性,但这使得模型能够间接学习语法。以前人们认为仅仅从统计推断中学习句法是不可能的。这篇论文声称,传销确实表明这是可能的
摘要
总而言之,让我们重温一下我们在引言中提到的最初的四点:
- 掩蔽是 BERTs 成功的关键:我们看到研究表明掩蔽作为一个学习目标如何改变像 BERT 这样的深度学习变压器神经网络中的信息流。这种变化创建了一个两阶段学习过程,其中模型首先执行上下文编码来学习当前输入单词周围的单词。然后它执行记号重建,试图预测通过类似完形填空的 MLM 测试选择的输出单词。这种两阶段过程的性质似乎将 MLMs 与 LMs 和 MT 等其他方法区分开来。
- 屏蔽需要注意:虽然屏蔽使 BERT 表现出色,但它仍然需要 Transformer 架构来实现。Transformer 网络使用注意力来双向处理文本,这意味着模型可以在当前输入标记之前和之后查看文本。非 MLM 没有充分利用转换器的这一特性,因此在学习语言特性的能力方面没有以同样的方式受益。
- 我们仍然不理解掩蔽:我们看到最近的研究提出了更多关于掩蔽如何提高性能的问题,而不是答案。然而,这并不意味着掩蔽不起作用。它只是以我们没有想到的方式运作。事实上,我们讨论的一篇论文表明,我们可能能够仅从统计推断中学习高级知识,如语言句法。直到最近,我们才认为这是可能的。
- 我们需要重新评估我们学习语言的方式吗?如果真的有可能从同现统计这样简单的东西中学习语义和句法知识,那么这对语言意味着什么呢?具体来说,它对我们如何学习语言有什么看法?虽然这是一个有争议的研究领域,但人们认为语言是一个复杂而独特的知识领域,需要独特的类似人类的技能来理解它。但也许我们和伯特这样的模特一样,通过识别常见单词何时一起出现来学习语言?如果是这样的话,那么为什么我们似乎比这些模型更快地学习像语义这样的东西,并且使用更少的数据?通过这种方式,当我们努力更好地理解像 BERT 这样的模型和像掩蔽这样的学习目标时,我们也可以更多地了解我们学习和理解语言的独特能力。
最后,是不是所有的模特都应该像伯特一样接受蒙版?与 NLP 和机器学习中的大多数事情一样,答案是:
看情况!
我们可以自信地说,大多数模型都可以通过使用像预训练中的掩蔽这样的方法来改进。然而,在某些情况下,如文本生成,像掩蔽这样的学习目标可能不适合该任务,因为在输入中访问未来的单词可能与特定任务的目标相抵触。对于更一般的模型,目标是训练一个具有一般语言能力并能在广泛的下游任务中表现良好的模型,看起来这些类型的模型确实会受益于类似掩蔽的方法。
参考
这种对变压器的研究主要来源于像 Lean Voita 这样的人的惊人工作。她的博客是所有变形金刚资料的一个很好的来源,甚至还有她教的的课程的资料,非常值得一看。像 Lean 这样的人解释这些模型内部发生了什么的工作对于提高我们对像 BERT 这样的模型如何学习语言任务的理解是至关重要的。在这篇文章中,我特别提到了她的工作:
关于 BERT 和 Masking 的更多细节,值得查看的其他文章有:
Cathal Horan
在 Intercom 的 ML 团队工作,在那里他创造了人工智能产品,帮助企业提高支持客户和与客户沟通的能力。他对哲学和技术的交叉感兴趣,尤其着迷于深度学习等技术如何能够创建有朝一日可能理解人类语言的模型。他最近完成了商业分析理学硕士学位。他的主要学位是电气和电子工程,但他也拥有哲学学位和精神分析研究的哲学硕士学位。
阅读下一篇
关于正在重塑人工智能格局的 BERT 和 Transformer 架构,你需要知道的 10 件事
25 分钟阅读|作者 Cathal Horan |年 5 月 31 日更新
目前,很少有人工智能领域比 NLP 更令人兴奋。近年来,可以执行类似人类语言任务的语言模型(LM)已经发展到比任何人预期的更好。
事实上,他们表现得如此之好,以至于人们怀疑他们是否达到了一般智力的水平,或者我们用来测试他们的评估标准跟不上。当像这样的技术出现时,无论是电力、铁路、互联网还是 iPhone,有一点是明确的——你不能忽视它。它将最终影响现代世界的每一个部分。
了解这样的技术很重要,因为这样你就可以利用它们。所以,我们来学习吧!
我们将涵盖十个方面,向您展示这项技术的来源、开发方式、工作原理以及在不久的将来会有什么样的前景。这十件事是:
- 什么是 BERT 和变压器,为什么我需要了解它?像 BERT 这样的模型已经对学术界和商业界产生了巨大的影响,因此我们将概述这些模型的一些使用方法,并澄清围绕它们的一些术语。
- 在这些模型之前,我们做了什么?要了解这些模型,重要的是要了解这一领域的问题,并了解在 BERT 等模型出现之前我们是如何解决这些问题的。通过这种方式,我们可以了解以前模型的局限性,并更好地理解 Transformer 架构关键设计方面背后的动机,这是大多数 SOTA 模型(如 BERT)的基础。
- NLPs“ImageNet 时刻;预训练模型:原来我们都是自己训练模型,或者你要针对某个特定任务,全面训练一个模型。实现性能快速发展的关键里程碑之一是创建预先训练的模型,这些模型可以“现成”使用,并根据您的具体任务进行调整,只需很少的努力和数据,这一过程称为迁移学习。理解这一点是理解为什么这些模型在一系列 NLP 任务中一直表现良好的关键。
- 了解变形金刚:你可能听说过伯特和 GPT-3,但是关于罗伯塔、艾伯特、 XLNet ,或者龙前、改革者,或者 T5 变形金刚呢?新模型的数量看起来势不可挡,但是如果您理解 Transformer 架构,您将有机会了解所有这些模型的内部工作方式。这和你理解 RDBMS 技术的时候是一样的,让你很好的掌握 MySQL、PostgreSQL、SQL Server 或者 Oracle 之类的软件。支撑所有数据库的关系模型与支撑我们的模型的转换器架构是一样的。明白了这一点,RoBERTa 或 XLNet 就成了使用 MySQL 或 PostgreSQL 的区别。学习每个模型的细微差别仍然需要时间,但是你有一个坚实的基础,你不是从零开始。
- 双向性的重要性:当你读这篇文章时,你并没有严格地从一边读到另一边。你不是从一边到另一边一个字母一个字母地读这个句子。相反,你正在向前跳跃,从你现在所处的位置之前的单词和字母中学习上下文。事实证明,这是变压器架构的一个关键特性。Transformer 架构支持模型以双向方式处理文本,从开始到结束,从结束到开始。这是以前模型局限性的核心,以前的模型只能从头到尾处理文本。
供应链中机器学习的用例、算法、工具和示例实现
我们生活在一个速度至关重要的时代。你的公司交付产品越快,获利越快。速度是公司竞争的关键领域。
与机器相比,人类速度慢且不一致。管理交付系统的端到端流程(从获取数据、管理数据、理解数据到做出决策)可能会非常困难和累人。
公司需要一个机器人伴侣,能够在日常和重复任务中表现出色,而不会感到疲劳——人工智能和机器学习。
需求不确定,供应有风险,竞争激烈。供应链(SC)的卓越通常依赖于组织整合端到端流程的能力,这些流程包括获取材料或组件、将它们组装成产品以及将它们交付给客户。
人工智能在改善人类决策过程和商业项目的后续生产力方面显示出巨大的潜力。它可以识别模式,学习商业现象,寻找信息,并智能地分析数据。
在本文中,我们将讨论:
- 人工智能在供应链中的潜在作用,
- 必要的算法,
- 工具和框架,
- 三个著名公司在供应链中使用 AI 的案例研究,
- 结论。
AI/ML 在供应链中的用例
供应链管理已经成为数据密集型。如今,所有的信息都被收集并存储在数据中心,仓库、运输设备的需求可以被替代。
可以获得大量的数据。专业人士知道它对 SCs 有多重要,在人工智能(AI)的帮助下他们可以利用它,提出优化的解决方案,并构建可以帮助他们做出更好决策的工具。
预测客户行为
客户是不确定的,并根据情绪采取行动。然而,供应链的成功取决于客户数据及其行为。
为了预测客户行为,提出了许多基于电子表格的方法,但随着大数据的兴起,这些方法被证明是过时的。电子表格模型在需求预测方面失败的主要原因是它们对于大规模数据不可伸缩。它们带来了供应链管理中的复杂性和不确定性,无法通过简单的统计方法(如移动平均或指数平滑)提取、分析和解决。
这种不一致的订单模式会导致团队之间的沟通不畅,并降低生产力。对许多公司来说,不一致订单量的可预测性是一个挑战。在这种情况下,AI 和 ML 在最佳水平上更早地为我们提供了客户行为不一致性的更接近预测。
预测能力有助于需求预测
需求预测是预测分析的一个领域,在这里,公司预测整个供应链中对产品和装运的需求,即使是在不可控的条件下。
如前所述,传统方法(电子表格模型、统计模型、移动平均和指数平滑)由于影响供应链需求的大量参数而受到限制,这使得这些方法过于简单且极不准确。
在这方面,预测只能提供对供应链中需求变化的部分理解。此外,无法解释的需求变化可以简单地认为是统计噪声,这就是为什么它们在本质上是非线性。因此,传统的或简单的模型不能映射重要的和非线性的特征。
幸运的是,机器学习提供了可以映射重要和非线性特征的算法,并将它们减少为变量,这些变量可以帮助理解过去,准确预测未来事件,帮助他们改善关于现金流、风险评估、容量规划和劳动力规划的决策过程,并满足客户需求。
一些人工智能驱动的需求预测工具包括:
- 我爱 CRM
- 胶囊!胶囊
- 蜂鸟
- 合夥人
- 效果管理器
- 未来市场
- 管道驱动
- 智能需求计划程序
避免收费风险
如前所述,客户是情绪化的。如果交货延迟,他们可能会重新考虑购买。或者购买产品后要求退款。
这最终会导致罚款,其中可能包括运费、税款和其他费用。通过像亚马逊使用的集成人工智能,公司可以分析数据,找到最近的配送中心,并减少交付时间。
这种系统可以分析延误的原因和失败的原因,比如合作伙伴之间的争执或与恶劣天气有关的灾难。
感知市场形势
市场是建立在人类情绪的基础上的,这使得整个市场变得不可预测和难以理解。
借助人工智能和深度学习系统,我们可以从天气、就业、季节等数据中发现人类行为模式,并帮助公司在仓库存储产品和优化配送系统方面进行良好投资。
这种用于研究市场的模式识别系统可以帮助公司改善其产品组合,并提供更好的客户体验。
提高跟踪出发和到达订单的准确性
供应链管理系统与不同的区域配送中心相互连接,这些中心通过运输连接在一起。但是有一些配送中心是为了运输而谨慎连接的。
这引起了企业对能否按时履行合同承诺的担忧。人工智能可以提供实时预测可见性,知道产品在任何给定时间的准确位置,以进行智能决策并提高交付准确性。
Fourkites 是为供应链提供实时可见性的一个很好的例子。
改进交货时间和降低成本的遗传算法
在物流业务中,时间和速度至关重要。公司可以使用基于遗传算法的路线规划器来规划最佳的送货路线。
人们认为,人工智能将为供应链、交付和物流过程设立一个新的效率标准。该系统正在快速变化,以自动化、智能化和更高效的方式创造了全球物流公司管理数据、运营和服务客户的“新常态”。
改善客户体验
一个企业要成功,顾客必须满意。有一件事可以帮助满足他们,那就是在正确的时间推荐正确的产品。机器学习很好地做到了这一点。
基于客户兴趣的推荐系统可以集成在移动或 web 应用程序中,这样客户的主页就个性化了。
PS:几乎所有热门 app 都有推荐系统。
智能仓库效率更高
智能仓库是一个完全自动化的设施,其中大部分工作是通过自主机器人或软件完成的。在此过程中,复杂的任务变得简单,操作变得更具成本效益。
阿里巴巴(Alibaba)和亚马逊(Amazon)通过自动化的使用,将他们的仓库改造成了一个效率的乌托邦。
供应链算法
卷积神经网络
卷积神经网络(CNN)是一种通常用于处理图像识别的算法,但事实证明,CNN 对于预测也非常有用。
CNN 以从数据集中提取有用的模式和特征而闻名。这使得 CNN 在解决分类和回归问题时非常可靠。
CNN 的一个优势是它们共享参数,即与其他分类算法相比,它们需要更少的超参数和更少的监督。
这就是为什么 CNN 是供应链管理中应用最广泛的算法之一。这里有几个使用 CNN 的例子:
图像分类
- 图像分类用于识别给定图像的类别。它在供应链中非常方便,因为它可以在一个实例中对不同的产品进行分类,并相应地将它们分开。
目标检测
- 对象检测将帮助您立即识别不同的对象。
- 在供应链管理中,你会同时遇到很多产品。手动分离这些产品非常昂贵和耗时。物体检测可以帮助你在没有任何人为干预的情况下,快速识别物体并进行分类(使图像分类更加精确)。
图象分割法
- 图像分割是另一种算法,它使用 CNN 在物体本身周围创建一个像素级的遮罩,从而了解物体的尺寸。
自主移动机器人
- 自主移动机器人使用 CNN识别路线和导航到仓库中指定的区域。这些类型的自动化机器人减少了仓库管理中的错误,也减少了仓库中的人工参与,最终降低了事故风险。
- 这些机器人使用图像分类、物体检测和图像分割在仓库中导航,为物体找到适当的指定名称,并知道物体的尺寸,以及避开路上的障碍物。
- 一些公司如IAM Roboticsgrey orange和 Bleum 提供移动机器人采摘解决方案,可以提高生产力水平。
预测
- 如前所述,CNN 的能力在于它可以提取有用的模式和特征或表示,使它们在预测销售和未来需求时非常有效。
递归神经网络
递归神经网络(RNN) 是一种用于处理序列数据的神经网络,包括文本、句子、语音或视频,或者任何具有序列的东西。
RNN 通过评估输入的先验信息并预测后验或下一个信息来工作。
rnn 在预测上下文信息方面很有用,如完成一个不完整的句子或语音序列。
自然语言处理
自然语言处理 (NLP)处理:
情感分析–每个公司都需要来自客户的反馈,这通常来自每个产品的评论部分。手动检查每一份评估,并将其分为好的、差的以及介于两者之间的任何等级,这可能是一项单调乏味的工作。通过情感分析,公司可以根据顾客提供的评论和评级来区分好的和坏的产品。这有助于改善用户体验。
聊天机器人是改善用户体验的另一种方式。客户可以与机器人谈论他们的问题或反馈,NLP 可以帮助机器人理解他们。
预测
如前所述,RNN 用于处理序列数据,因此在需求和销售预测中非常有用。
预测的关键架构之一是长期短期记忆 (LSTM)。LSTM 是一种已经被用于时间序列预测的架构。当像 CNN 这样的好的特征提取算法被添加到它上面时,预测的能力提高了。
集成方法
集成方法结合了两种或多种方法来实现给定的结果。由于供应链与理解数据有很大关系,一种方法可能无法提供足够的信息或提取足够的模式来做出任何决策。
一个供应链有几个供应点、几个仓库和来自世界各地的客户,会产生大量的产品,这使得需求预测成为一个高维问题。
为了解决这个问题,数据科学家应用了一种称为二分图聚类的聚类技术,来分析数据和不同产品出现的不同模式。例如,用移动平均模型和贝叶斯信任网络数据科学家创建一个集成模型,现在可以提高预测的准确性。
您可以在本文中了解更多信息:供应链需求预测的预测性大数据分析:方法、应用和研究机会。
作者在这篇论文中得出结论,集合方法产生了最好的精度和最小的预测误差。
表征学习
表征学习是机器学习中的另一种重要方法。表示学习用于提取模式和特征,以:
- 通过生成模型创建现实生活场景,
- 了解数据,
- 降低维度。
表征学习使用 VAE 自动编码器,其中 CNN 架构用于压缩数据,以使其包含潜在变量或主要变量。使用这些变量,我们可以了解数据的行为,并使用它来创建现实生活中的模拟,以防止公司遭受巨大的财务损失。
深度强化学习
供应链有许多组件,包括管理从原材料到制造、仓储和向客户配送的投入。
公司必须尽最大努力高效、优化地完成这些任务,同时尽可能降低成本。优化是关键。
已经投入了大量的时间和精力来构建有效的供应链优化模型,但是由于它们的规模和复杂性,它们可能难以构建和管理。随着机器学习的进步,特别是强化学习,我们可以训练一个机器学习模型来为我们做出这些决定,并且在许多情况下,比传统方法做得更好。
合适的库和框架
数据可视化和分析
数据可视化在任何 ML 项目中都占有重要的地位,在供应链中也是如此。但是由于供应链处理地理空间和时间序列数据可视化,找到正确的库变得至关重要。
空间数据分析
- 叶
- Folium 是一个强大的 Python 库,可以帮助您创建多种类型的传单地图。事实上,follow 结果是交互式的,这使得这个库对于构建仪表板非常有用。要获得一个想法,只需在下一张地图上缩放/点击即可获得印象。
*** 地质公园
* Geoplot 是 matplotlib 的扩展,用于地理空间可视化。
* geoplot 的一个关键特性是它与 matplotlib 的兼容性,这使得它更容易使用。
- NetworkX
- NetworkX 是一个 Python 包,用于创建、操作和研究复杂网络的结构、动态和功能。
- NetworkX 提供:
- 研究社会、生物和基础设施网络的结构和动态的工具;
- 适用于许多应用程序的标准编程接口和图形实现;
- 多学科合作项目的快速开发环境;
- 轻松处理大型非标准数据集的能力。
时间序列分析
【matplot lib】
- Matplotlib 是 python 社区中使用最广泛的可视化库之一,用于创建图表和绘图。它有很多功能,各有所用。在时间序列分析中,matplotlib 提供了几个非常方便的主要函数。它们是:
- 线形图。
- 直方图和密度图。
- 盒须图。
- 热图。
- 滞后图或散点图。
- 自相关图。
- 海博
- 线形图。
Seaborn 是另一个被广泛用于可视化的工具,因为它提供了调色板和通过各种阴影和设计的交互。
-
- Plotly 提供了一个以上库没有的附加功能。它有一个现场互动设计,具有各种功能,如选择,放大和缩小等。
-
机器学习
- 请求预报
ARIMA
ARIMA 代表自回归综合移动平均线。它是一类用于理解时间序列数据中不同标准时间结构的模型。
ARIMA 非常普遍地用于时间序列分析,包括需求预测。
- 使聚集
- Sklearn
- Sklearn 提供了很多不同的函数来对你的数据进行聚类。最常用的聚类算法之一是 K-means 。使用 K 均值,一组 N 个数据点被分组为 K 个聚类,每个聚类的均值成为其识别位置。
深度学习
- 自然语言处理
Transformers 是一个先进的 python 框架,可以与 pytorch 和 tensorflow 一起使用。
变压器提供了各种预训练模型,用于:
- 面向情感分析的文本分类
- 聊天机器人的问答
- 文本摘要
- 文本翻译
- 文本生成
- 计算机视觉
- Pytorch
- PyTorch 是一个科学计算框架,广泛支持机器学习算法。基于 Lua 的脚本语言为深度学习提供了广泛的算法,并使用脚本语言 LuaJIT 和底层 C 实现。
它易于实现和使用。
- 您可以创建自己的定制 CNN 模型,也可以应用迁移学习。
- Pytorch 有一个广泛而活跃的社区,通过它的论坛帮助和支持其他程序员。
- 张量流
- Tensorflow 或 tf 是 Google 开发的。它提供了来自 Google 机器学习社区的良好教育支持,并用于构建简单和复杂的神经网络。
- 与 pytorch 类似,tensorflow 提供了广泛的数学算法来从头构建神经网络。
- Tensorflow 还有 Keras ,这是一个深度学习框架。它是使用最广泛的深度学习框架之一。
- 与 pytorch 和 tensorflow 相比,Keras 简单易用。
- OpenCV
- OpenCV 是一个视觉库,用于分析和处理图像和视频。多用于实时应用。
- 它与 pytorch 和 tensorflow 都兼容。
- 强化学习
- 多级库存系统严重依赖于分布在多个配送中心(DC)的多层供应商,并以外包制造为基础。例如,耐克的分销网络由 7 个区域分销中心(RDC)和 30 多万个 DC 组成;这些配送中心服务于终端客户。
- It is compatible with both pytorch and tensorflow.
我们可以使用 Ray 和 or-gym 建立深度强化学习模型,以优化多级库存管理模型。
雷
Ray 是一个开源框架,为构建分布式应用提供了一个简单、通用的 API。
Ray 打包了 RLlib ,一个可扩展的强化学习库,和 Tune,一个可扩展的超参数调优库。
- RLib 支持深度学习框架,包括 PyTorch、PyTorch Lightning、TensorFlow 和 Keras。
- 或-健身房
- OR-Gym ,一个开源库,用于开发强化学习算法来解决运筹学问题。
- 在供应链管理中实施人工智能的三个用例
- 1.亚马逊智能收入和供应链(IRAS)管理
- 埃森哲的智能收入和供应链(IRAS)平台由埃森哲开发,将 ML 和 AI 模型产生的见解和发现整合到其业务和技术生态系统中。
其目的是改善整个供应链管理系统。IRAS 还负责预测和各种其他模型的优化,确保整个系统是最优的和具有成本效益的。
1. Amazon Intelligent Revenue and Supply Chain (IRAS) Management
2.劳斯莱斯用人工智能重新定义运输货物的安全措施
英国传奇汽车制造商劳斯莱斯(Rolls Royce)与英特尔(Intel)合作设计了一种智能人工智能系统,可以使商业运输更快、更安全。他们声称,这项技术将有能力独立管理导航,障碍检测和通信,开发一个新的自主船只系统。
IRAS objectives and their components | Source: Amazon Blog
在一份声明中,他们表示:“这种合作可以帮助我们支持船主实现导航和操作的自动化,减少人为错误的机会,让船员专注于更有价值的任务。”–劳斯莱斯
3.UPS ORIAN(道路集成优化和导航)
UPS 是一家跨国包裹递送和供应链公司管理公司。UPS 声称每天递送成千上万件货物,每个工作日 UPS 司机平均递送约 100 件货物。
为了确保包裹能够及时轻松地送达,UPS 提供了最优化的导航系统,称为路上集成优化和导航(ORIAN)。它确保 UPS 司机使用在距离、燃料和时间方面最优的递送路线。
据该公司称,“猎户座使用非常先进的算法来收集和处理大量数据,以便他们可以为司机优化路线。这有助于 UPS 以更高效的方式递送和收取包裹。该系统依靠在线地图数据来计算距离和旅行时间,设计最具成本效益的路线。”–猎户座
结论
人工智能在所有行业都在快速发展,它已经被证明是供应链管理中的一个有益工具。如果没有人工智能和人工智能,像亚马逊、耐克、UPS 或沃尔玛这样的公司就不会像现在这样快。人工智能不仅提供了敏捷性、效率和客户满意度,还通过自动驾驶汽车提供了仓库的安全性,使工作流程变得超级顺畅和无错误。
我们讨论的工具、框架和算法为我们提供了一种从消费者的角度理解世界的方式,并构建智能系统(包括混合系统),预测需求、故障、情绪,提供安全性并节省大量资金。
除了我们讨论的所有内容之外,我希望您尝试一下这个供应链模拟。如果你是供应链的新手,这将让你了解供应链管理是如何运作的。
希望你喜欢这篇文章,感谢阅读!
The tools, frameworks and algorithms that we discussed offer us a way to understand the world from a consumer’s perspective, and to build intelligent systems (including hybrid) that forecast demands, failures, sentiments, provide safety and save lots of money.
In addition to all that we discussed, I’d like you to try out this supply chain simulation. If you’re new to the supply chain, this will give you an understanding of how supply chain management works.
Hope you enjoyed this article, thanks for reading!**
使用差异隐私构建安全模型:工具、方法、最佳实践
2020 年的新冠肺炎·疫情让我们看到了生活中不同的挑战,有些是痛苦的,有些则暴露了社会的缺陷。这也让我们记住了适当数据的重要性和缺乏。
世卫组织的这篇文章引用了“数据的收集、使用、共享和进一步处理有助于限制病毒的传播,有助于加速恢复,特别是通过 数字接触追踪 。”
它还引用了“例如,从人们使用手机、电子邮件、银行、社交媒体、邮政服务中获得的移动数据可以帮助监测病毒的传播,并支持联合国系统各组织授权活动的实施。"稍后发布伦理考量,指导使用数字邻近追踪技术进行新冠肺炎接触者追踪。
这听起来像是一个简单的答案,但确实是一个需要解决的复杂问题。医疗数据是最机密的数据之一,与任何其他个人信息不同,它既可以用于个人,也可以用于个人。例如,医疗保健数据泄露可能导致 COVID 欺诈骗局,我们在过去的一年中已经听说过。
在本文中,我们将继续探讨 ML 隐私,讨论某些问题,并深入研究差分隐私(DP)概念,这是解决隐私问题的方法之一。进一步列出五个您可以使用或贡献的开源差分隐私库或工具。
什么是数据,它是如何创建的?
数据是为参考或分析而收集的事实或统计数据。
我们几乎每天都在创造数据。可能是既有在线又有离线的数据。
比如医院的病人健康记录;学校或学院的学生信息;员工信息和项目绩效的公司内部日志;或者只是简单的记笔记就可以认为是离线数据。
然而,从连接到互联网的在线平台或应用程序收集的数据被视为在线数据,如发布推文、YouTube 视频或博客帖子,或收集用户表现数据的移动应用程序等。
隐私与安全
虽然敏感的个人数据(如癌症患者记录或合同追踪数据)对于数据科学家和分析师来说似乎是一座金矿,但这也引发了人们对收集此类数据的方法的担忧,而且谁来确保这些数据不会被用于恶意目的呢?
术语“隐私”和“安全”经常被混淆,但还是有区别的。安全控制"、谁"可以访问数据,而隐私更多的是关于"、何时"和"什么"类型的数据可以被访问。 “没有安全你不可能有隐私,但没有隐私你可以有安全。
例如,我们都熟悉术语“登录认证和授权”。在这里,认证是关于谁可以访问数据,所以这是一个安全问题。授权是关于什么,什么时候,以及如何 大部分数据对特定用户是可访问的,所以这是一个隐私问题。
私有安全机器学习(ML)
来自数据泄露和数据滥用的风险已经导致许多政府制定数据保护法。为了遵守数据隐私法并最小化风险,ML 研究人员提出了解决这些隐私和安全问题的技术,称为私有和安全机器学习(ML)。
正如 PyTorch 的这篇博文所说:
私有和安全机器学习(ML) 深受密码学和隐私研究的启发。它由一组技术组成,这些技术允许在不直接访问数据的情况下训练模型,并防止这些模型无意中存储有关数据的敏感信息。”
*同一篇博文列举了一些应对不同隐私问题的常用技巧:
联合学习意味着根据存储在世界各地不同设备或服务器上的数据训练您的 ML 模型,而不必集中收集数据样本。
有时,人工智能模型可以记住他们训练过的数据的细节,并可能在以后“泄露”这些细节。差异隐私是一个衡量这种泄露并降低其发生风险的框架。
同态加密让你的数据不可读,但你仍然可以对它进行计算。
安全多方计算允许多方共同执行一些计算,并接收结果输出,而不会暴露任何一方的敏感输入。
当两方想要测试他们的数据集是否包含匹配值,但不想向对方“展示”他们的数据时,他们可以使用 PSI 来这样做。
虽然联合学习和差分隐私可以用来保护数据所有者免受隐私损失,但它们不足以保护模型免受数据所有者的盗窃或滥用。例如,联合学习要求模型所有者将模型的副本发送给许多数据所有者,从而通过数据中毒将模型置于知识产权盗窃或破坏的风险中。通过允许模型在加密状态下训练,加密计算可用于解决这种风险。最著名的加密计算方法是同态加密、安全多方计算和函数加密。
我们将重点关注差分隐私–让我们看看它是如何工作的,以及您可以使用哪些工具。
什么是差分隐私?
“差分隐私描述了数据持有人或管理者对数据主体(所有者)做出的承诺,该承诺如下: 通过允许在任何研究或分析中使用您的数据,您将不会受到不利影响或其他影响,无论有什么其他研究、数据集或信息源可用。”
差分隐私背后的直觉是“ 我们限制如果改变数据库 中单个个体的数据,输出可以改变多少”。
也就是说,如果在同一个查询中从数据库中删除了某人的数据,会改变输出吗?如果是,那么对手能够分析它并找到一些辅助信息的可能性很高。简单来说——隐私泄露!
例如:
Adam 想知道向他的 XYZ 组织捐款的捐赠者的平均年龄。在这一点上,这可能看起来没问题!但是,这些数据也有可能被用来发现特定捐赠者的年龄。简单地说,1000 人进行了捐赠,结果发现捐赠者的平均年龄为 28 岁。
现在,仅通过从数据库中排除 John Doe 的数据进行相同的查询,让我们假设 999 个捐献者的平均值已经变为 28.007。从这一点,亚当可以很容易地发现,约翰多伊是 21 岁。(1000 * 28–999 * 28.007 = 21.007)同样,Adam 可以对其他捐献者重复该过程,以找到他们的实际年龄。
注意:如果 Adam 可以进行逆向工程并获得他们的值,即使每个捐献者的年龄都被加密(例如同态加密),结果也是一样的。
为了避免这种数据泄露,我们添加了受控数量的统计噪声来掩盖数据集中个体的数据贡献。
也就是说,捐献者被要求在提交之前或者在加密他们的年龄之前,给他们的原始年龄加上 100 到 100 之间的任何值。假设 John Doe 在他的原始年龄即 21 岁上加了-30,则加密前登记的年龄将是-9。
这听起来可能很疯狂?!但是,有趣的是,根据概率统计中的大数定律,可以看出,当对这些统计收集的数据取平均值时,噪声被抵消,并且获得的平均值接近于真实平均值(没有添加噪声的数据平均值(随机数))
现在,即使亚当对无名氏的年龄进行逆向工程,-9 也没有任何意义,因此,在保护无名氏隐私的同时允许亚当找到捐献者的平均年龄。
换句话说,差分隐私是 不是 数据库的一个属性,而是查询的一个属性。t 有助于提供输出隐私,也就是说,通过对输出进行逆向工程,某人可以从输入中获得多少洞察力。
在人工智能模型训练的情况下,添加了噪声,同时确保模型仍然能够洞察总体人口,从而提供足够准确的有用预测——同时让任何人都难以从查询的数据中获得任何意义。
注:关于差分隐私的更多细节,请查看我的差分隐私基础系列。
谁在使用差分隐私?
顶尖的科技公司 FAANGs,IBM,都在使用差别隐私,并且经常发布开源工具和库。
最有趣的例子是:
- RAPPOR ,谷歌在这里使用本地差分隐私收集用户的数据,就像其他正在运行的进程和 Chrome 主页一样。
- Private Count Mean Sketch(以及 variances)苹果利用本地差分隐私收集 iPhone 用户(iOS 键盘)表情符号使用数据、单词使用情况等信息的地方。
- 隐私保护的个人健康数据流聚集 论文提出了一种新的隐私保护的个人健康数据流收集机制,其特征在于利用局部差分隐私(Local DP)以固定间隔收集时态数据
- 人口普查局为 2020 年人口普查采用尖端隐私保护 即美国人口普查局将在公布数据前使用差分隐私匿名。
更多信息,请查看我的差分隐私基础系列的本地与全球 DP 博客。
我们真的需要它吗?为什么重要?
从上面 Adam 试图找到捐献者平均年龄的例子可以看出,加密本身不能保护个人的数据隐私,因为去匿名化是可能的。
一个这样的现实世界的例子将是对 Netflix 奖品数据集 的 的 去匿名化,其中对单个订户仅了解一点点的对手可以容易地在数据集中识别该订户的记录。使用互联网电影数据库(IMDb)作为背景知识的来源,有可能成功地确定已知用户的网飞记录,揭示他们明显的政治偏好和其他潜在的敏感信息。
有时,由于深度神经网络的过度参数化导致不必要的数据泄漏,机器学习模型也可能无意中记住单个样本。
例如,设计用于发出预测文本(如智能手机上看到的下一个单词建议)的语言模型可以被探测以发布有关用于训练的单个样本的信息(“我的 ID 是……”)。
这一领域的研究让我们可以计算隐私损失的程度,并根据隐私“预算”的概念对其进行评估。最终, 差分隐私的使用是隐私保护和模型实用性或准确性之间的谨慎权衡。
差异隐私最佳实践
1.了解差别隐私承诺什么和不承诺什么总是很重要的。(参考: 辛西娅·德沃克,《差分隐私的算法基础》 )
- 差分隐私承诺保护个人免受由于他们的数据在私人数据库 x 中而可能面临的任何额外伤害,如果他们的数据不是 x 的一部分,他们就不会面临这些伤害。
- 差别隐私并不能保证一个人认为是自己的秘密将会保持秘密。也就是说,它承诺使数据成为不同的私有数据,不会泄露,但不会保护数据免受攻击者的攻击!
Ex:差分攻击是最常见的隐私攻击形式之一。 - 它仅仅确保一个人参与调查本身不会被披露,如果保持有差别的私密性,参与调查也不会导致任何个人参与调查的细节被披露。
2.差分隐私不是数据库的属性,而是查询的属性。(如前所述)
3.添加的噪声量很重要,因为为使数据保密而添加的噪声越高,模型的实用性或准确性就越低。
4.了解局限性,例如:
- 差分隐私一直是学术界和研究界广泛探讨的话题,但由于其强大的隐私保障,在业界较少涉及。
- 如果要在 k 个查询中保持原始保证,则必须注入 k 次噪声。当 k 较大时,输出的效用被破坏。
- 对于一系列的查询,需要添加更多的噪音,这将耗尽隐私预算,并可能最终导致用户死亡。这意味着一旦隐私预算耗尽,用户就不再被允许询问任何更多的问题,如果你开始允许用户之间的勾结,你就开始陷入这个隐私预算对每个用户意味着什么的麻烦中。最终导致用户死亡。
- 单独的差分隐私不能保护用户数据,因为隐私攻击可能会发生!
是的,当然,可以采取各种方法来解决这个问题,但这超出了本博客的范围。
脸书的 Opacus 是一个面向任何人的库,这些人希望以最少的代码更改训练一个具有不同隐私的模型,或者用他们的 PyTorch 代码或纯 Python 代码快速原型化他们的想法。它也有很好的文档,作为一个开源库,如果你感兴趣,你也可以贡献到它的代码库中。
加入 PyTorch 论坛提出任何问题。
资源:
Google 提供了两个开源库(或存储库)wrt 差分隐私。
这是一个包含 3 个构建块库的存储库,用于针对适用于研究、实验或生产用例的 C++ 、 Go 和 Java 支持的数据集生成ε-和(ε,δ)-差分私有统计数据。
而提供的其他工具,如 Privacy on Beam 、random tester、differential Privacy accounting library和命令行接口,用于运行带有 ZetaSQL 的 DP 查询,都是相当实验性的。
就像以前的图书馆一样,这个图书馆对投稿开放,并有一个公共讨论组。
这个库可以称为上面提到的 PyTorch Opacus 库的 TensorFlow 对应物,实现了 TensorFlow 优化器,用于训练具有差分隐私的机器学习模型。这也接受捐款,并有据可查。
资源:
另一个通用库用于试验,调查和开发差分隐私的应用程序,例如使用分类和聚类模型探索差分隐私对机器学习准确性的影响,或者只是开发一个新的应用程序。面向具有不同隐私知识的专家。
资源:
这是 Google 的 Java 差分隐私库的 Python 版本,提供了一组ε差分私有算法,用于生成包含私有或敏感信息的数字数据集的聚合统计数据。现在它被 OpenMined 的 PySyft 库所支持。
PyDP 团队正在积极招募成员,以进一步开发 Google Java 差分隐私库之外的库。
加入 OpenMined Slack #lib_pydp 与团队互动,开始贡献。
资源:
这是 SmartNoise Project 和 OpenDP 之间的合作,旨在将学术知识应用到实际的部署中。
它提供了用于发布隐私保护查询和统计数据的不同私有算法和机制,以及用于定义分析的 API 和用于评估这些分析和组成数据集的总隐私损失的验证器。
也开放贡献,所以如果感兴趣,请随时加入。
资源:
虽然这个项目已被否决,没有得到维护,但它可以用于教育目的。它是为查询分析和重写框架而构建的,目的是为通用 SQL 查询实施不同的隐私保护。
摘要
如您所见,差分隐私是当今数据科学领域的一个重要话题,也是所有顶级科技巨头都关心的问题。
这不足为奇,因为在一个依靠数据运行的世界里,尽最大努力保护这些数据符合我们的利益。
如果你对差分隐私的更新感兴趣,在 Twitter 上关注我,如果你还没有关注过的话,也关注一下海王星。
感谢阅读!
资源或额外读取:
- opened隐私会议(pricon 2020)–视频
- 为什么许多国家在 COVID 联系追踪方面失败了——但有些国家成功了
- 患者数据存在哪些风险?
- 关于公司如何使用大数据的 40 个统计数据和真实例子
- 了解联合学习的类型
- 谷歌联合学习漫画
- 什么是安全多方计算?技术+代码实现。
- 隐私和机器学习:两个意想不到的盟友?
- 差分密码分析教程*
神经网络模型中的消失和爆炸梯度:调试、监控和修复
神经网络模型采用梯度下降的优化算法进行训练。输入训练数据有助于这些模型学习,损失函数衡量参数更新时每次迭代的预测性能有多准确。随着训练的进行,目标是通过迭代调整参数来减少损失函数/预测误差。具体来说,梯度下降算法有一个前进步骤和一个后退步骤,这让它做到这一点。
- 在前向传播中,输入向量/数据通过网络向前移动,使用一个公式来计算下一层中的每个神经元。该公式由输入/输出、激活函数 f 、权重 W 和偏差 b 组成:
该计算向前迭代,直到达到输出或预测。然后,我们计算由目标变量 y(在输出层中)和每个预测 y cap 之间的损失函数(例如,均方误差 MSE)定义的差:
- 有了这个初始评估,我们通过反向传递(也称为反向传播)来调整每层中每个神经元的权重和偏差。为了更新我们的神经网络,我们首先计算梯度,这只不过是损失函数 w.r.t. 权重和偏差的导数。然后,我们推动我们的算法采取梯度下降步骤来最小化损失函数(其中α是学习速率):
在这种情况下,可能发生两种相反的情况:导数项变得非常小,即接近零,而该项变得非常大并溢出。这些问题分别被称为消失和爆炸梯度。
当你训练你的模型一段时间后,性能似乎没有变得更好,很可能你的模型正在遭受消失或爆炸梯度。
本文针对这些问题,具体来说,我们将涵盖:
- 消失和爆炸渐变问题背后的直觉
- 为什么会出现这些梯度问题
- 如何在模型训练过程中识别梯度问题
- 解决消失和爆炸渐变的案例演示和解决方案
- 消失渐变
- ReLU 作为激活函数
- 降低模型复杂性
- 具有方差的权重初始值设定项
- 更好的优化器,具有良好的学习率
- 爆炸渐变
- 渐变剪辑
- 合适的权重初始化器
- L2 范数正则化
- 消失渐变
消失或爆发的渐变——问题背后的直觉
消失
在反向传播期间,权重更新公式中的(部分)导数/梯度的计算遵循链式法则,其中早期层中的梯度是后期层的梯度的乘积:
由于梯度经常变小,直到它们接近零,新的模型权重(初始层的)将几乎与旧的权重相同,而没有任何更新。因此,梯度下降算法永远不会收敛到最优解。这就是所谓的消失梯度问题,这是神经网络不稳定行为的一个例子。
爆炸
相反,如果随着反向传播的进行,梯度变得越来越大,甚至越来越小,我们将会以具有大的权重更新的爆炸梯度结束,导致梯度下降算法的发散。
为什么会出现渐变消失或爆炸的问题?
有了对什么是消失/爆炸梯度的直观理解,您一定想知道-为什么梯度首先会消失或爆炸,也就是说,为什么这些梯度值在通过网络返回时会减小或爆炸?
消失
简而言之,当我们在隐藏层中使用 Sigmoid 或 Tanh 激活函数时,就会出现渐变消失的问题;这些函数将一个大的输入空间压缩成一个小的空间。以乙状结肠为例,我们有以下概率密度函数:
对参数 x 求导,我们得到:
如果我们想象 Sigmoid 函数及其导数:
*Sigmoid function and its derivative | Source: Author *
我们可以看到,Sigmoid 函数将我们的输入空间压缩到[0,1]之间的范围内,当输入变得相当小或相当大时,这个函数 在 0 或 1 处饱和 。这些区域被称为“饱和区域”,其导数变得非常接近于零。同样适用于在-1 和 1 处 饱和 的 Tanh 函数。
假设我们有位于任何饱和区域中的输入,我们将基本上没有梯度值传播回来,导致早期层权重的零更新。通常,对于只有几层的浅层网络来说,这不是什么大问题,但是,当我们添加更多层时,初始层中梯度的消失将导致模型训练或收敛失败。
这是由于将这些小数字的 n 相乘以计算 n 层网络中早期层的梯度的效果,这意味着梯度随着 n 呈指数下降,而早期层训练非常缓慢,因此整个网络的性能下降。
爆炸
转到爆炸梯度,简而言之,这个问题是由于分配给神经网络的初始权重造成了巨大的损失。大的梯度值可以累积到观察到大的参数更新的点,导致梯度下降振荡而不会达到全局最小值。
更糟糕的是,这些参数可能太大,以至于溢出并返回无法再更新的 NaN 值。
如何识别渐层消失或爆炸的问题?
承认梯度的问题是我们需要避免或解决的事情,当它们发生时,我们应该如何知道一个模型正在遭受消失或爆炸的梯度问题?以下是一些迹象。
消失
- 在后面的层的参数中观察到大的变化,而前面的层的参数变化很小或保持不变
- 在某些情况下,随着训练的进行,早期层的权重可以变成 0
- 该模型学习缓慢,并且经常多次,在几次迭代之后训练停止
- 模型性能很差
爆炸
- 与消失的情况相反,爆炸梯度显示出它本身是不稳定的,批量/迭代与批量/迭代之间的大参数变化
- 模型权重可以很快变为 NaN
- 南也失去了模特
修复消失或爆炸渐变问题的实践
记住这些梯度问题的指标,让我们探索潜在的补救措施来解决它们。
- 首先,我们将关注于消失场景:模拟一个遭受此问题的二进制分类网络模型,然后演示各种解决方案
- 出于同样的原因,我们将在稍后用一个回归网络模型来解决爆炸场景
通过解决不同类型的深度学习任务,我的目标是演示不同的场景供您带走。还请注意,本文致力于为您提供实用的方法和技巧,因此我们将只讨论每种方法背后的一些直觉,而跳过数学或理论证明。
如上所述,由于观察是确定这些问题的关键部分,我们将使用 Neptune.ai 来跟踪我们的建模管道:
import neptune.new as neptune
import os
myProject = 'YourUserName/YourProjectName'
project = neptune.init(api_token=os.getenv('NEPTUNE_API_TOKEN'),
project=myProject)
project.stop()
渐变消失时的解决方案
首先我们定义几个 helper 函数来训练并在 Neptune.ai 中登录我们的模型。
- 记录梯度和重量:
def getBatchGradWgts(grads, wgts, lossVal,
gradHist, lossHist, wgtsHist,
recordWeight=True, npt_exp=None):
dataGrad, dataWeight = {}, {}
for wgt, grad in zip(wgts, grads):
if '/kernel:' not in wgt.name:
continue
layerName = wgt.name.split("/")[0]
dataGrad[layerName] = grad.numpy()
dataWeight[layerName] = wgt.numpy()
if npt_exp:
npt_exp[f'MeanGrads{layerName.upper()}'].log(np.mean(grad.numpy()))
npt_exp[f'MeanWgtBatch{layerName.upper()}'].log(np.mean(wgt.numpy()))
gradHist.append(dataGrad)
lossHist.append(lossVal.numpy())
if recordWeight:
wgtsHist.append(dataWeight)
def fitModel(X, y, model, optimizer,
n_epochs=n_epochs, curBatch_size=batch_size, npt_exp=None):
lossFunc = tf.keras.losses.BinaryCrossentropy()
subData = tf.data.Dataset.from_tensor_slices((X, y))
subData = subData.shuffle(buffer_size=42).batch(curBatch_size)
gradHist, lossHist, wgtsHist = [], [], []
for epoch in range(n_epochs):
print(f'== Starting epoch {epoch} ==')
for step, (x_batch, y_batch) in enumerate(subData):
with tf.GradientTape() as tape:
yPred = model(x_batch, training=True)
lossVal = lossFunc(y_batch, yPred)
grads = tape.gradient(lossVal, model.trainable_weights)
wgts = model.trainable_weights
optimizer.apply_gradients(zip(grads, model.trainable_weights))
if step == 5:
getBatchGradWgts(gradHist=gradHist, lossHist=lossHist, wgtsHist=wgtsHist,
grads=grads, wgts=wgts, lossVal=lossVal, npt_exp=npt_exp)
if npt_exp:
npt_exp['BatchLoss'].log(lossVal)
getBatchGradWgts(gradHist=gradHist, lossHist=lossHist, wgtsHist=wgtsHist,
grads=grads, wgts=wgts, lossVal=lossVal, npt_exp=npt_exp)
return gradHist, lossHist, wgtsHist
- 可视化各层的平均梯度:
def gradientsVis(curGradHist, curLossHist, modelName):
fig, ax = plt.subplots(1, 1, sharex=True, constrained_layout=True, figsize=(7,5))
ax.set_title(f"Mean gradient {modelName}")
for layer in curGradHist[0]:
ax.plot(range(len(curGradHist)), [gradList[layer].mean() for gradList in curGradHist], label=f'Layer_{layer.upper()}')
ax.legend()
return fig
渐变消失模型
现在,我们将模拟一个数据集,并构建我们的基线二元分类神经网络:
X, y = make_moons(n_samples=3000, shuffle=True , noise=0.25, random_state=1234)
batch_size, n_epochs = 32, 100
npt_exp = neptune.init(
api_token=os.getenv('NEPTUNE_API_TOKEN'),
project=myProject,
name='VanishingGradSigmoid',
description='Vanishing Gradients with Sigmoid Activation Function',
tags=['vanishingGradients', 'sigmoid', 'neptune'])
neptune_cbk = NeptuneCallback(run=npt_exp, base_namespace='metrics')
def binaryModel(curName, curInitializer, curActivation, x_tr=None):
model = Sequential()
model.add(InputLayer(input_shape=(2, ), name=curName+"0"))
model.add(Dense(10, kernel_initializer=curInitializer, activation=curActivation, name=curName+"1"))
model.add(Dense(10, kernel_initializer=curInitializer, activation=curActivation, name=curName+"2"))
model.add(Dense(5, kernel_initializer=curInitializer, activation=curActivation, name=curName+"3"))
model.add(Dense(1, kernel_initializer=curInitializer, activation='sigmoid', name=curName+"4"))
return model
curOptimizer = tf.keras.optimizers.RMSprop()
optimizer = curOptimizer
curInitializer = RandomUniform(-1, 1)
model = binaryModel(curName="SIGMOID", curInitializer=curInitializer, curActivation="sigmoid")
model.compile(optimizer=curOptimizer, loss='binary_crossentropy', metrics=['accuracy'])
curGradHist, curLossHist, curWgtHist = fitModel(X, y, model, optimizer=curOptimizer, npt_exp=npt_exp)
npt_exp['Comparing All Layers'].upload(neptune.types.File.as_image(gradientsVis(curGradHist, curLossHist, modelName='Sigmoid_Raw')))
npt_exp.stop()
几个注意事项:
- 我们目前的香草/基线模型由 3 个隐藏层组成,每一层都有一个 sigmoid 激活
- 我们使用 RMSprop 作为优化器,Uniform [-1,1]作为权重初始化器
运行此模型将返回 Neptune.ai 中所有时期每个层的(平均)梯度,下面显示了层 1 和层 4 之间的比较:
Comparison between Layer 1 and Layer 4 from the baseline Sigmoid model generated using Neptune.ai | Source
对于第 4 层,随着训练的进行,我们看到平均梯度的明显波动,然而,对于第 1 层,梯度实际上为零,即,值大约小于 0.006。消失渐变发生了!现在我们来谈谈如何解决这个问题。
使用 ReLU 作为激活功能
如前所述,消失梯度问题是由于 Sigmoid 或 Tanh 函数的饱和性质。因此,一个有效的补救办法是切换到其他激活函数,这些激活函数的导数不饱和,例如 ReLU(整流线性单位):
ReLU as the activation function | Source
如此图所示,对于正输入 x,ReLU 不饱和。当 x <= 0, ReLU has derivative/gradient = 0, and when x > 0 时,导数/梯度= 1。因此,乘以 ReLU 导数会返回 0 或 1;因此,不会有消失的梯度。
为了实现 ReLU 激活,我们可以简单地在如下所示的模型函数中指定` relu ':
model = binaryModel(curName="Relu", curInitializer=curInitializer, curActivation="relu")
model.compile(optimizer=curOptimizer, loss='binary_crossentropy', metrics=['accuracy'])
运行该模型并比较从该模型计算的梯度,我们观察到跨时期的梯度变化,甚至对于标记为 RELU1:
Comparison between Layer 1 and Layer 4 from the ReLu model generated using Neptune.ai | Source
在大多数情况下,类似 ReLU 的激活函数本身应该足以处理渐变消失的问题。但是,这是否意味着我们要一直使用 ReLU,彻底抛弃乙状结肠?嗯,消失梯度的存在不应该阻止你使用 Sigmoid,它有许多可取的属性,如单调性和易于微分。即使使用 Sigmoid 激活函数,也有一些方法可以解决这个问题,这些方法是我们将在接下来的会议中尝试的。
降低模型的复杂性
由于消失梯度的根本原因在于一堆小梯度的相乘,直观上,通过减少梯度的数量,即减少我们网络中的层数来解决这个问题是有意义的。例如,与基线模型中指定 3 个隐藏层不同,我们可以只保留 1 个隐藏层,以使我们的模型更简单:
def binaryModel(curName, curInitializer, curActivation, x_tr=None):
model = Sequential()
model.add(InputLayer(input_shape=(2, ), name=curName+"0"))
model.add(Dense(3, kernel_initializer=curInitializer, activation=curActivation, name=curName+"3"))
model.add(Dense(1, kernel_initializer=curInitializer, activation='sigmoid', name=curName+"4"))
return model
该模型为我们提供了清晰的梯度更新,显示在该图中:
Comparison between Layer 1 and Layer 4 from the reduced Sigmoid model generated using Neptune.ai | Source
这种方法的一个警告是,我们的模型性能可能不如更复杂的模型(具有更多隐藏层)。
使用带有方差的权重初始值设定项
当我们的初始权重设置得太小或缺少方差时,通常会导致梯度消失。回想一下,在我们的基线模型中,我们将权重初始化为均匀的[-1,1]分布,这可能会陷入这些权重太小的陷阱!
在他们 2010 年的论文中,Xavier Glorot 和 Yoshua Bengio 提供了从特定方差的均匀或正态分布中采样初始权重的理论依据,并保持所有层的激活方差相同。
在 Keras/Tensorflow 中,这种方法被实现为 Glorot 正态 *glorot_normal* 和 Glorot Uniform
Glorot _ Uniform`,顾名思义,这两种方法分别从(截尾)正态和均匀分布中采样初始权重。两者都考虑了输入和输出单元的数量。
对于我们的模型,让我们用 glorot_uniform 进行实验,根据 Keras 文档:
回到具有 3 个隐藏层的原始模型,我们将模型权重初始化为 glorot_uniform :
def binaryModel(curName, curInitializer, curActivation, x_tr=None):
model = Sequential()
model.add(InputLayer(input_shape=(2, ), name=curName+"0"))
model.add(Dense(10, kernel_initializer=curInitializer, activation=curActivation, name=curName+"1"))
model.add(Dense(10, kernel_initializer=curInitializer, activation=curActivation, name=curName+"2"))
model.add(Dense(5, kernel_initializer=curInitializer, activation=curActivation, name=curName+"3"))
model.add(Dense(1, kernel_initializer=curInitializer, activation='sigmoid', name=curName+"4"))
return model
curOptimizer = tf.keras.optimizers.RMSprop()
optimizer = curOptimizer
curInitializer = 'glorot_uniform'
npt_exp['Comparing All Layers'].upload(neptune.types.File.as_image(gradientsVis(curGradHist, curLossHist,
modelName='Sigmoid_NormalWeightInit')))
npt_exp.stop()
检查我们的 Neptune.ai 跟踪器,我们看到梯度随着这个权重初始化而变化,尽管第 1 层(在左边)与最后一层相比显示出较少的波动:
Comparison between Layer 1 and Layer 4 from the Glorot weight initializer model generated using Neptune.ai | Source
选择更好的优化器并调整学习率
现在,我们已经解决了导数和初始权重的选择,公式的最后一部分是学习率。随着梯度接近零,优化器陷入次优局部最小值或鞍点。为了克服这一挑战,我们可以使用一个优化器,它具有将累积的先前梯度考虑在内的动力。例如, Adam 有一个动量项,计算为过去梯度的指数衰减平均值。
此外,作为一个高效的优化器,Adam 可以快速收敛或发散。因此,稍微降低学习率将有助于防止你的网络太容易发散,从而降低梯度接近零的可能性。要使用 Adam 优化器,我们需要修改的只是 curOptimizer
arg。:
curOptimizer = keras.optimizers.Adam(learning_rate=0.008)
curInitializer = RandomUniform(-1, 1)
model = binaryModel(curName="SIGMOID", curInitializer=curInitializer, curActivation="sigmoid")
model.compile(optimizer=curOptimizer, loss='binary_crossentropy', metrics=['accuracy'])
在上面的代码中,我们将 Adam 指定为模型优化器,学习率相对较小,为 0.008,激活函数设置为 sigmoid。下面是第 1 层和第 4 层渐变的比较:
Comparison between Layer 1 and Layer 4 from the Adam model generated using Neptune.ai | Source
正如我们所看到的,通过 Adam 和调整良好的小学习率,我们看到梯度的变化使它们的值远离零,并且我们的模型也根据下面所示的损失图收敛到局部最小值:
Selecting better optimizer and adjusting learning rate | Source
到目前为止,我们已经讨论了渐变消失的解决方案,让我们继续讨论渐变爆炸的问题。
渐变爆炸时的解决方案
对于爆炸梯度问题,让我们看看这个回归模型。
nfeatures = 15
X, y = make_regression(n_samples=1500, n_features=nfeatures, noise=0.2, random_state=42)
def regressionModel(X, y, curInitializer, USE_L2REG, secondLayerAct='relu'):
inp = Input(shape = (X.shape[1],))
if USE_L2REG:
x = Dense(35, activation='tanh', kernel_initializer=curInitializer,
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l2(0.01))(inp)
else:
x = Dense(35, activation=secondLayerAct, kernel_initializer=curInitializer)(inp)
out = Dense(1, activation='linear')(x)
model = Model(inp, out)
return model
为了编译该模型,我们将使用统一的[4,5]权重初始化器以及 ReLu 激活,目的是创建爆炸梯度情况:
sgd = tf.keras.optimizers.SGD()
curOptimizer = sgd
curInitializer = RandomUniform(4,5)
model = regressionModel(X, y, curInitializer, USE_L2REG=False)
model.compile(loss='mean_squared_error', optimizer=curOptimizer, metrics=['mse'])
curModelName = 'Relu_Raw'
curGradHist, curLossHist, curWgtHist = fitModel(X, y, model, optimizer=curOptimizer, modelType = 'regression', npt_exp=npt_exp)
npt_exp['Comparing All Layers'].upload(neptune.types.File.as_image(gradientsVis(curGradHist, curLossHist,
modelName=curModelName)))
npt_exp.stop()
有了这么大的权重初始化,随着训练的进行,下面的错误消息出现在我们的 Neptune.ai 跟踪器中就不足为奇了,正如前面讨论的那样,这清楚地表明我们的梯度爆炸了:
Error message in Neptune.ai | Source
渐变剪辑
为了防止渐变爆炸,最有效的方法之一是渐变裁剪。简而言之,梯度裁剪将导数限定在一个阈值,并使用限定的梯度来更新权重。如果您对该方法的详细解释感兴趣,请参考文章“了解渐变裁剪(以及它如何修复爆炸渐变问题)”。
可以通过` clipvalue '参数指定将渐变限制为某个值。如下图所示:
sgd = tf.keras.optimizers.SGD(clipvalue=50)
curOptimizer = sgd
curInitializer = 'glorot_normal'
model = regressionModel(X, y, curInitializer, USE_L2REG=False)
model.compile(loss='mean_squared_error', optimizer=curOptimizer, metrics=['mse'])
curModelName = 'GradClipping'
通过裁剪运行该模型,我们能够将梯度保持在定义的范围内:
合适的权重初始化器
Layer gradients from the gradients clipping model generated using Neptune.ai | Source
如前所述,梯度爆炸的一个主要原因在于太大的权重初始化和更新,这是我们的回归模型中梯度爆炸的原因。因此,正确初始化模型权重是解决这个爆炸梯度问题的关键。
与消失梯度相同,我们将使用正态分布实现 Glorot 初始化。
由于 Glorot 初始化与 Tanh 或 Sigmoid 配合使用效果最佳,我们将在本实验中将 Tanh 指定为激活函数:
这是该模型的渐变图,修复了渐变爆炸问题:
curOptimizer = tf.keras.optimizers.SGD()
curInitializer = 'glorot_normal'
model = regressionModel(X, y, curInitializer, USE_L2REG=False, secondLayerAct='tanh')
model.compile(loss='mean_squared_error', optimizer=curOptimizer, metrics=['mse'])
curModelName = 'GlorotInit'
L2 范数正则化
除了权重初始化之外,另一个优秀的方法是采用 L2 正则化,它通过将模型权重的平方项强加到损失函数来惩罚大的权重值:
Layer gradients from the Glorot initialization model generated using Neptune.ai | Source
添加 L2 范数经常会导致整个网络中较小的权重更新,并且在 Keras 中使用 args 实现这种正则化相当简单。*内核 _ 正则化子*
和*活动 _ 正则化子*
:
根据 Razvan 等人的建议,我们将这个模型的初始权重设置为 glorot normal。,2013 初始化小值和方差的参数。这里显示了每层的损耗曲线和梯度:
curInitializer = 'glorot_normal'
x = Dense(35, activation='tanh', kernel_initializer=curInitializer,
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l2(0.01))(inp)
curInitializer = 'glorot_normal'
model = regressionModel(X, y, curInitializer, USE_L2REG=True)
model.compile(loss='mean_squared_error', optimizer=curOptimizer, metrics=['mse'])
curModelName = 'L2Reg'
再次,通过所有历元将梯度控制在合理的范围内,并且模型逐渐收敛。
最后的话
Layer gradients from the L2 regularization model generated using Neptune.ai | Source
除了我们在本文中讨论的主要技术,其他值得尝试避免/修复渐变的方法包括和 缩放输入数据 。这两种方法都可以使您的网络更加健壮。直觉是,在反向投影过程中,我们每一层的输入数据可能会有很大的不同(就像前一层的输出一样)。使用批量归一化允许我们固定每个图层的输入数据的均值和方差,从而防止其移动过多。有了更强大的网络,就不太可能遇到两个梯度问题。
**## 在本文中,我们讨论了与神经网络训练相关的两个主要问题-消失和爆炸梯度问题。我们解释了它们的原因和后果。我们还研究了解决这两个问题的各种方法。
希望你发现这篇文章是有用的,并且学到了实用的技术来训练你自己的神经网络模型。供您参考,完整的代码可以在我的 GitHub repo 这里获得,而 Neptune 项目可以在这里获得。
In this article, we have discussed two major issues associated with neural network training – the Vanishing and Exploding gradients problems. We explained their causes and consequences. We also walked through various approaches to address the two problems.
Hope you have found this article useful and learned practical techniques to use in training your own neural network models. For your reference, the full code is available in my GitHub repo here and the Neptune project is available here.**
NLP 中的矢量化技术[指南]
原文:https://web.archive.org/web/https://neptune.ai/blog/vectorization-techniques-in-nlp-guide
自然语言是我们人类交流思想和观点的方式。自然语言有两种主要媒介——语音和文本。
对于健康的人来说,听和读毫不费力,但对于机器学习算法来说却很难。这就是为什么科学家们不得不提出自然语言处理(NLP)。
什么是自然语言处理?
- NLP 使计算机能够处理人类语言,理解意义和上下文,以及背后相关的情感和意图,并最终使用这些见解来创造新的东西。
- NLP 将计算语言学与统计机器学习和深度学习模型相结合。
我们如何开始让计算机能够解释单词呢?这就是矢量化的目的。
什么是矢量化?
-
矢量化是一种经典方法的行话,这种方法将输入数据从原始格式(即文本)转换为 ML 模型支持的实数矢量格式。这种方法自从计算机诞生以来就一直存在,它在各个领域都非常有效,现在被用于 NLP。
-
在机器学习中,矢量化是特征提取的一个步骤。这个想法是通过将文本转换为数字向量,从文本中获取一些独特的特征,供模型训练。
我们很快就会看到,有很多方法可以执行矢量化,从简单的二进制术语出现特征到高级的上下文感知特征表示。根据用例以及模型的不同,他们中的任何一个都有可能完成所需的任务。
让我们了解一下这些技术,看看如何使用它们。
矢量化技术
1.一袋单词
所有技术中最简单的。它包括三个操作:
首先,输入文本被标记化。一个句子被表示为其组成单词的列表,对所有输入的句子都是如此。
在所有获得的标记化单词中,仅选择唯一的单词来创建词汇表,然后按字母顺序排序。
最后,从词汇单词的频率中为输入创建稀疏矩阵。在这个稀疏矩阵中,每一行都是一个句子向量,其长度(矩阵的列)等于词汇表的大小。
让我们来看一个例子,看看它在实践中是怎样的。在这个练习中,我们将使用 Sklearn 库。
让我们进行必要的进口。
from sklearn.feature_extraction.text import CountVectorizer
考虑我们有下面的文档列表。
sents = ['coronavirus is a highly infectious disease',
'coronavirus affects older people the most',
'older people are at high risk due to this disease']
让我们创建一个 CountVectorizer 的实例。
cv = CountVectorizer()
现在让我们对输入进行矢量化,并将其转换为 NumPy 数组,以便于查看。
X = cv.fit_transform(sents)
X = X.toarray()
这是向量的样子:
我们把词汇表打印出来,了解一下为什么会是这个样子。
sorted(cv.vocabulary_.keys())
- 你可以看到每一行都是‘sents’中各个句子的相关向量表示。
- 每个向量的长度等于词汇的长度。
- 列表中的每个成员都代表了相关单词在分类词汇中出现的频率。
在上面的例子中,我们仅将单个单词视为在词汇键中可见的特征,即它是一个单字表示。这可以被调整以考虑 n-gram 特性。
假设我们想考虑输入的二元模型表示。这可以通过在实例化 CountVectorizer 对象时简单地更改默认参数来实现:
cv = CountVectorizer(ngram_range=(2,2))
在这种情况下,我们的向量和词汇看起来像这样。
因此,我们可以随心所欲地操作这些特性。事实上,我们还可以将单字母词、双字母词、三字母词等组合起来,形成特征空间。
虽然我们在这里使用 sklearn 构建了一个单词包模型,但它可以通过多种方式实现,例如 Keras、Gensim 等库。您也可以很容易地编写自己的单词包实现。
这是一种简单而有效的文本编码技术,可以多次完成这项工作。
2.TF-IDF
TF-IDF 或术语频率-逆文档频率,是一个数字统计,旨在反映一个单词对文档的重要性。虽然是另一种基于频率的方法,但也没有一袋文字那么幼稚。
TF-IDF 如何改进单词袋?
在单词包中,我们看到了矢量化只与给定文档中单词的频率有关。结果,对意义贡献不大的冠词、介词和连词变得和形容词一样重要。
TF-IDF 帮助我们克服了这个问题。经常重复的单词不会压倒不太频繁但重要的单词。
它有两个部分:
TF 代表词频。可以理解为归一化的频率得分。它通过以下公式计算:
因此,可以想象这个数字将始终保持≤ 1,因此我们现在判断一个单词在文档中所有单词的上下文中的出现频率。
IDF 代表逆文档频率,但在我们进入 IDF 之前,我们必须弄清楚 DF–文档频率。它由以下公式给出:
DF 告诉我们包含某个单词的文档的比例。那么 IDF 是什么?
它是文档频率的倒数,最终 IDF 得分由以下公式得出:
为什么要逆 DF?
正如我们上面讨论的,其背后的直觉是,一个单词在所有文档中越常见,它对当前文档的重要性就越小。
在最终计算中,采用对数来抑制 IDF 的影响。
TF-IDF 的最终得分为:
这就是 TF-IDF 如何设法融入一个词的意义。分数越高,这个词就越重要。
现在就让我们把手弄脏,看看 TF-IDF 在实践中是什么样子的。
同样,在这个练习中,我们将使用 Sklearn 库,就像我们在单词袋中所做的那样。
进行所需的进口。
from sklearn.feature_extraction.text import TfidfVectorizer
让我们再次使用同一套文件。
sents = ['coronavirus is a highly infectious disease',
'coronavirus affects older people the most',
'older people are at high risk due to this disease']
创建 TfidfVectorizer 的实例。
tfidf = TfidfVectorizer()
让我们现在转换我们的数据。
transformed = tfidf.fit_transform(sents)
现在让我们看看哪些特性是最重要的,哪些特性是无用的。为了便于解释,我们将使用熊猫图书馆,只是为了更好地查看分数。
进行所需的导入:
import pandas as pd
创建以特征名称(即单词)作为索引、以排序的 TF-IDF 分数作为列的数据帧:
df = pd.DataFrame(transformed[0].T.todense(),
index=tfidf.get_feature_names(), columns=["TF-IDF"])
df = df.sort_values('TF-IDF', ascending=False)
由于转换后的 TFIDF 特征矩阵以 Scipy 压缩稀疏行矩阵的形式出现,无法以原始形式查看,因此我们在进行转换后,通过 todense()操作将其转换为 Numpy 数组。类似地,我们通过 get_feature_names()获得了标记化单词的完整词汇表。
这是从另一端出来的:
因此,根据 TF-IDF 的说法,“传染性”一词是最重要的特征,而在词汇包等幼稚方法中用于特征构建的许多词在这里都等于 0。这是我们一直想要的。
关于 TF-IDF 的几点建议:
- n 元语法的概念在这里也是适用的,我们可以将单词组合成 2、3、4 等组来构建我们的最终特征集。
- 除了 n-gram,还有许多参数,如 min_df、max_df、max_features、sublinear_tf 等。一起玩耍。仔细调整这些参数可以为您的模型的功能创造奇迹。
尽管如此简单,TF-IDF 还是被广泛用于信息检索等任务中,以判断哪个响应对查询来说是最好的,在聊天机器人或关键字提取中特别有用,以确定哪个单词在文档中最相关,因此,您会发现自己经常依赖 TF-IDF 的直觉智慧。
到目前为止,我们已经看到了基于频率的文本编码方法,现在是时候看看更复杂的方法了,正如我们所知,这些方法改变了单词嵌入的世界,并在 NLP 中开辟了新的研究机会。
3. Word2Vec
这种方法早在 2013 年由谷歌研究人员在这篇论文中发布,它席卷了 NLP 行业。简而言之,这种方法使用简单的神经网络的能力来生成单词嵌入。
与基于频率的方法相比,Word2Vec 有何改进?
在单词袋和 TF-IDF 中,我们看到了每个单词是如何被当作一个单独的实体来对待的,语义完全被忽略了。随着 Word2Vec 的引入,单词的向量表示被认为是上下文感知的,这可能是有史以来的第一次。
或许,Word2Vec 最著名的例子之一就是下面这个表达式:
国王——男人+女人=王后
因为每个单词都被表示为一个 n 维向量,所以可以想象所有的单词都被映射到这个 n 维空间,使得具有相似含义的单词在这个多维空间中彼此非常接近。
Word2Vec 主要有两种实现方式,我们一个一个来看看:
答:跳格
第一种是跳格法,我们向神经网络提供一个单词,让它预测上下文。大致的想法可以在下图的帮助下捕捉到:
这里 w[i]是句子中“I”位置的输入单词,输出包含关于“I”的两个前面的单词和两个后面的单词。
从技术上讲,它预测一个单词成为给定目标单词的上下文单词的概率。网络输出的概率会告诉我们在输入单词附近找到每个词汇单词的可能性有多大。
这个浅层网络包括一个输入层、一个隐藏层和一个输出层,我们很快就会看到。
然而,有趣的是,我们实际上并没有使用这个经过训练的神经网络。相反,目标只是在正确预测周围单词的同时学习隐藏层的权重。这些权重就是单词嵌入。
网络要预测多少个邻词是由一个叫做“窗口大小”的参数决定的。该窗口向单词的两个方向延伸,即向左和向右。
假设我们想要在一个输入句子上训练一个跳过 gram 的 word2vec 模型:
“敏捷的棕色狐狸跳过懒惰的狗”
下图说明了窗口大小为 2 时,从这句话生成的训练样本。
- ‘成为第一个目标单词,并且因为它是句子的第一个单词,所以在它的左边没有单词,所以大小为 2 的窗口只延伸到它的右边,导致列出的训练样本。
- 当我们的目标移动到下一个单词时,由于在目标的左边出现了一个单词,所以窗口向左扩展了 1。
- 最后,当目标单词在中间某处时,训练样本按预期生成。
神经网络
现在,让我们来讨论将要根据上述训练样本进行训练的网络。
直觉
-
如果你知道什么是自动编码器,你会发现这个网络背后的想法类似于自动编码器。
-
你取一个非常大的输入向量,在隐藏层将其压缩成一个密集的表示,然后不是像自动编码器那样重建原始向量,而是输出与词汇表中每个单词相关的概率。
输入/输出
现在问题来了,你如何输入一个单一的目标词作为一个大的
向量?
答案是 One-Hot 编码。
- 假设我们的词汇包含大约 10,000 个单词,而我们当前的目标单词“fox”介于两者之间。我们要做的是,在对应于单词“fox”的位置放置 1,在其他位置放置 0,这样我们就有了一个 10,000 维的向量,其中一个 1 作为输入。
- 类似地,我们网络的输出也将是一个 10,000 维的向量,包含我们词汇表中的每个单词成为我们输入目标单词的上下文单词的概率。
这是我们的神经网络的架构,看起来像这样:
- 可以看出,给定我们的词汇量=10,000,输入是一个 10,000 维的向量,包含对应于目标单词位置的 1。
- 输出层由应用了 Softmax 激活函数的 10,000 个神经元组成,以便获得我们词汇表中每个单词的相应概率。
- 现在,这个网络的最重要的部分,隐藏层是一个线性层,即没有应用激活函数,并且该层的优化权重将成为学习的单词嵌入。
- 例如,假设我们决定用上面的网络学习单词嵌入。在这种情况下,隐藏层权重矩阵形状将是 M x N,其中 M =词汇量(在我们的例子中是 10,000),N =隐藏层神经元(在我们的例子中是 300)。
- 一旦模型得到训练,我们的目标单词的最终单词嵌入将由以下计算给出:
1×10000 输入向量 10000×300 矩阵= 1×300 向量*
- Google 在其训练的模型中使用了 300 个隐藏层神经元,然而,这是一个超参数,可以相应地进行调整以获得最佳结果。
这就是跳格 word2vec 模型的一般工作方式。是时候看看它的竞争对手了。
B. CBOW
CBOW 代表连续单词包。在 CBOW 方法中,我们不是预测上下文单词,而是将它们输入到模型中,并要求网络预测当前单词。总体思路如下所示:
你可以看到 CBOW 是跳格法的镜像。这里所有的符号的意思和它们在 skip-gram 中的意思完全一样,只是方法颠倒了。
现在,既然我们已经深入研究了什么是 skip-gram 以及它是如何工作的,我们就不再重复这两种方法中常见的部分。相反,我们将只讨论 CBOW 在工作上与 skip-gram 有何不同。为此,我们将粗略地看一下 CBOW 模型架构。
它看起来是这样的:
- 我们的隐藏层和输出层的尺寸保持与 skip-gram 模型相同。
- 然而,正如我们所读到的,CBOW 模型将上下文单词作为输入,这里的输入是 C 个上下文单词,其形式为大小为 1xV 的单热编码向量,其中 V =词汇的大小,使得整个输入 CxV 是多维的。
- 现在,这些 C 向量中的每一个都将乘以我们的隐藏层的权重,其形状为 VxN,其中 V = vocab 大小,N =隐藏层中的神经元数量。
- 如果你可以想象,这将导致 C,1xN 向量,所有这些 C 向量将平均元素的方式,以获得我们的隐藏层的最终激活,然后将馈入我们的输出 softmax 层。
- 隐藏层和输出层之间的学习权重构成了单词嵌入表示。
如果这对你来说有点太难了,CBOW 模型的 TLDR 是:
因为有多个上下文单词,所以进行平均来计算隐藏层值。在这之后,它变得类似于我们的 skip-gram 模型,并且学习的单词嵌入来自输出层权重而不是隐藏层权重。
什么时候使用跳格模型,什么时候使用 CBOW?
- 根据原始论文,skip-gram 可以很好地处理小数据集,并可以更好地表示罕见的单词。
- 然而,CBOW 被发现比 skip-gram 训练得更快,并且可以更好地表示频繁出现的单词。
- 所以选择 skip-gram 还是 CBOW 取决于我们要解决的问题的类型。
现在有了足够的理论,让我们看看如何使用 word2vec 来生成单词嵌入。
在这个练习中,我们将使用 Gensim 库。
进行所需的进口。
from gensim import models
现在这里有两个选择,要么我们可以使用预先训练的模型,要么我们自己训练一个新的模型。我们会经历这两种方式。
让我们先使用谷歌预先训练好的模型,看看我们能用它做些什么。你可以从这里下载这个模型,并在下面给出解压文件的路径,或者你可以通过下面的 Linux 命令得到它。
wget -c "https://s3.amazonaws.com/dl4j-distribution/GoogleNews-vectors-negative300.bin.gz"
gzip -d GoogleNews-vectors-negative300.bin.gz
让我们现在加载模型,但是,请注意,这是一个非常沉重的模型,您的笔记本电脑可能会因为内存不足而死机。
w2v = models.KeyedVectors.load_word2vec_format(
'./GoogleNews-vectors-negative300.bin', binary=True)
任何单词的矢量表示,比如健康,可以通过以下方式获得:
vect = w2v['healthy']
这将给出一个 300 维的向量。
我们还可以利用这个预先训练的模型来获得输入单词的相似意思的单词。
w2v.most_similar('happy')
令人惊讶的是,它对这项任务的表现是如此之好,输出包括一个相关单词元组及其相应的相似性得分的列表,按相似性降序排列。
如前所述,您也可以训练自己的 word2vec 模型。
让我们再次使用前面的句子集作为数据集来训练我们的自定义 word2vec 模型。
sents = ['coronavirus is a highly infectious disease',
'coronavirus affects older people the most',
'older people are at high risk due to this disease']
Word2vec 需要标记化句子列表形式的训练数据集,因此我们将预处理 sents 并将其转换为:
sents = [sent.split() for sent in sents]
最后,我们可以用以下内容训练我们的模型:
custom_model = models.Word2Vec(sents, min_count=1,size=300,workers=4)
这个自定义模型的表现如何将取决于我们的数据集以及它的训练强度。然而,它不太可能击败谷歌预先训练的模型。
这就是 word2vec 的全部内容。如果您想直观感受 word2vec 模型的工作方式,并想更好地理解它,请访问这个链接。这是见证 CBOW & skip-gram 运行的一个非常酷的工具。
4.手套
GloVe 代表单词表示的全局向量。它是在斯坦福开发的。你可以在这里找到原始论文,它发表于 word2vec 一年之后。
与 Word2Vec 类似,GloVe 背后的直觉也在创建上下文单词嵌入,但考虑到 Word2Vec 的出色性能。为什么需要像手套这样的东西?
【GloVe 如何比 Word2Vec 有所提升?
- Word2Vec 是一种基于窗口的方法,在这种方法中,模型依赖于本地信息来生成单词嵌入,而单词嵌入又受到我们选择的判定窗口大小的限制。
- 这意味着学习目标词的语义只受原句中周围词的影响,这是一种有点低效的统计使用,因为我们可以处理更多的信息。
- 另一方面,GloVe 捕获全局和局部统计数据,以便得出单词 embeddings。
我们看到 Word2Vec 中使用了局部统计,但是现在什么是全局统计呢?
GloVe 通过对共现矩阵进行训练来获得语义。它建立在单词-单词共现是一条重要信息的想法上,使用它们是对生成单词嵌入的统计的有效使用。这就是 GloVe 如何设法将“全局统计”合并到最终结果中的。
对于那些不知道共现矩阵的人,这里有一个例子:
假设我们有两个文档或句子。
文献 1: 闪光的不一定都是金子。
文件二:结局好的都是好的。
然后,对于 n = 1 的固定窗口大小,我们的共生矩阵将如下所示:
- 如果您花点时间看一下,就会发现行和列是由我们的词汇表组成的,也就是从两个文档中获得的一组唯一的标记化单词。
- 这里,
和 用来表示句子的开始和结束。 - 大小为 1 的窗口向单词的两个方向延伸,因为“that”&“is”只在“glitters”附近的窗口中出现一次,这就是为什么(that,glitters)和(is,glitters) = 1 的值,现在你知道如何处理这个表了。
关于它的训练,GloVe 模型是一个加权最小二乘模型,因此它的成本函数如下所示:
对于可能共现的每一对单词(I,j ),我们试图最小化它们的单词嵌入的乘积和(I,j)的共现计数的对数之间的差异。f(Pij)项使其成为加权总和,并允许我们对非常频繁的词共现给予较低的权重,从而限制了这种对的重要性。
什么时候使用手套?
- 已经发现 GloVe 在单词类比、单词相似性和命名实体识别任务方面优于其他模型,所以如果你试图解决的问题的性质与这些类似,GloVe 将是一个明智的选择。
- 由于它结合了全局统计,所以它可以捕获罕见词的语义,即使在小语料库上也能表现良好。
现在让我们看看如何利用手套单词嵌入的力量。
首先,我们需要下载嵌入文件,然后我们将使用下面的代码创建一个查找嵌入字典。
Import numpy as np
embeddings_dict={}
with open('./glove.6B.50d.txt','rb') as f:
for line in f:
values = line.split()
word = values[0]
vector = np.asarray(values[1:], "float32")
embeddings_dict[word] = vector
在这个嵌入字典中查询一个单词的向量表示时,结果是这样的。
你可能会注意到这是一个 50 维的向量。我们下载了文件 glove.6B.50d.txt,这意味着这个模型已经在 60 亿个单词上进行了训练,可以生成 50 维的单词嵌入。
我们还可以定义一个函数来从这个模型中获取相似的单词,首先进行所需的导入。
From scipy import spatial
定义功能:
def find_closest_embeddings(embedding):
return sorted(embeddings_dict.keys(), key=lambda word:
spatial.distance.euclidean(embeddings_dict[word], embedding))
让我们看看当我们在这个函数中输入“健康”这个词时会发生什么。
我们提取了模型认为与“健康”最相似的前 5 个单词,结果还不错,我们可以看到上下文已经被很好地捕捉到了。
我们可以用手套做的另一件事是把我们的词汇转换成向量。为此,我们将使用 Keras 库。
您可以通过以下方式安装 keras:
pip install keras
我们将使用到目前为止一直在使用的同一组文档,但是,我们需要将它们转换成一个标记列表,以使它们适合矢量化。
sents = [sent.split() for sent in sents]
首先,在将数据集转换成嵌入之前,我们必须对其进行一些预处理。
进行所需的进口:
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
以下代码将索引分配给单词,这些单词稍后将用于将嵌入映射到索引单词:
MAX_NUM_WORDS = 100
MAX_SEQUENCE_LENGTH = 20
tokenizer = Tokenizer(num_words=MAX_NUM_WORDS)
tokenizer.fit_on_texts(sents)
sequences = tokenizer.texts_to_sequences(sents)
word_index = tokenizer.word_index
data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)
现在我们的数据看起来像这样:
最后,我们可以通过使用上面刚刚创建的嵌入字典执行简单的查找操作,将数据集转换为手套嵌入。如果在字典中找到这个单词,我们将只获取与之相关的单词嵌入。否则,它将仍然是一个零向量。
为此操作进行所需的导入。
from keras.layers import Embedding
from keras.initializers import Constant
EMBEDDING_DIM = embeddings_dict.get(b'a').shape[0]
num_words = min(MAX_NUM_WORDS, len(word_index)) + 1
embedding_matrix = np.zeros((num_words, EMBEDDING_DIM))
for word, i in word_index.items():
if i > MAX_NUM_WORDS:
continue
embedding_vector = embeddings_dict.get(word.encode("utf-8"))
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector
这是从另一端出来的:
这是一个简单的 NumPy 矩阵,其中索引 I 处的条目是矢量器词汇表中索引 I 的单词的预训练矢量。
您可以看到我们的嵌入矩阵具有 19×50 的形状,因为我们的词汇表中有 19 个唯一的单词,并且我们下载的手套预训练模型文件具有 50 维向量。
您可以使用 dimension,只需更改文件或从头开始训练您自己的模型。
这个嵌入矩阵可以以你想要的任何方式使用。它可以被输入到神经网络的嵌入层,或者只是用于单词相似性任务。
这就是手套,让我们继续下一个矢量化技术。
5. FastText
FastText 是脸书在 2016 年推出的。FastText 背后的思想与 Word2Vec 非常相似。然而,像 Word2Vec 和 GloVe 这样的方法仍然缺少一样东西。
如果你一直在关注,你一定注意到了 Word2Vec 和 GloVe 的一个共同点——我们如何下载一个预先训练好的模型,并执行查找操作来获取所需的单词嵌入。尽管这两个模型都经过了数十亿单词的训练,但这仍然意味着我们的词汇量是有限的。
FastText 如何超越其他产品?
FastText 比其他方法有所改进,因为它具有对未知单词的泛化能力,这是其他方法一直缺少的。
它是怎么做到的?
- FastText 不是使用单词来构建单词嵌入,而是更深入一层,即字符层。积木是字母而不是单词。
- 通过 FastText 获得的单词嵌入不是直接获得的。它们是低层嵌入的组合。
- 用字符代替单词还有一个好处。训练所需的数据更少,因为一个单词在某种程度上变成了它自己的上下文,从而可以从一段文本中提取更多的信息。
现在我们来看看 FastText 是如何利用子词信息的。
-
假设我们有单词“reading ”,长度为 3-6 的字符 n 元语法将以如下方式为该单词生成:
-
尖括号表示开始和结束。
-
由于可能有大量的 n 元文法,所以使用散列,而不是学习每个唯一 n 元文法的嵌入,我们学习全部 B 个嵌入,其中 B 表示桶大小。原纸用的是 200 万的桶大小。
-
通过这个散列函数,每个字符 n-gram(比如‘eadi’)被映射到 1 到 B 之间的一个整数,并且该索引具有相应的嵌入。
-
最后,通过平均这些组成的 n 元文法嵌入来获得完整的单词嵌入。
-
尽管这种散列方法会导致冲突,但它有助于在很大程度上控制词汇表的大小。
FastText 中使用的网络类似于我们在 Word2Vec 中看到的网络,就像我们可以在两种模式下训练 fast text——CBOW 和 skip-gram,因此我们在这里不再重复这一部分。如果想详细了解 Fasttext 的更多内容,可以参考这里的原始论文——paper-1和 paper-2 。
让我们继续,看看我们能用 FastText 做些什么。
你可以用 pip 安装 fasttext。
pip install fasttext
你可以从这里下载一个预先训练好的快速文本模型,或者你可以训练你自己的快速文本模型并将其用作文本分类器。
因为我们已经看到了足够多的预训练模型,即使在这种情况下也没有什么不同,所以在这一节中,我们将专注于如何创建自己的快速文本分类器。
假设我们有以下数据集,其中有关于一些药物的对话文本,我们必须将这些文本分为 3 种类型,即与它们相关的药物类型。
现在,为了在任何数据集上训练快速文本分类器模型,我们需要以某种格式准备输入数据,该格式为:
_ _ 标签 __ <标签值> <空格> <关联数据点>
我们也将为我们的数据集这样做。
all_texts = train['text'].tolist()
all_labels = train['drug type'].tolist()
prep_datapoints=[]
for i in range(len(all_texts)):
sample = '__label__'+ str(all_labels[i]) + ' '+ all_texts[i]
prep_datapoints.append(sample)
在这一步中,我省略了很多预处理,在现实世界中,最好进行严格的预处理,以使数据适合建模。
让我们将这些准备好的数据点写入一个. txt 文件。
with open('train_fasttext.txt','w') as f:
for datapoint in prep_datapoints:
f.write(datapoint)
f.write('\n')
f.close()
现在我们有了训练快速文本模型所需的一切。
model = fasttext.train_supervised('train_fasttext.txt')
由于我们的问题是一个监督分类问题,我们训练了一个监督模型。
同样,我们也可以从训练好的模型中获得预测。
该模型给出了预测的标签以及相应的置信度得分。
同样,这个模型的性能取决于很多因素,就像任何其他模型一样,但是如果您想快速了解基线精度应该是多少,fasttext 可能是一个非常好的选择。
这就是关于快速文本和如何使用它的全部内容。
结束了!
在本文中,我们涵盖了单词嵌入的所有主要分支,从简单的基于计数的方法到子单词级别的上下文嵌入。随着自然语言处理的效用不断增加,完全了解它的组成部分是非常必要的。
鉴于我们对幕后发生的事情和这些方法的用例了解得如此之多,我希望现在当你偶然发现一个 NLP 问题时,你将能够做出关于使用哪种嵌入技术的明智决定。
未来方向
我希望不言而喻的是,无论我们在本文中涵盖了什么,都不是详尽无遗的,还有许多技术有待探索。这些只是主要的支柱。
从逻辑上讲,下一步应该是阅读更多关于文档(句子)级嵌入的内容,因为我们已经在这里介绍了基础知识。我会鼓励你去阅读像 Google 的 BERT、通用句子编码器以及相关的主题。
如果你决定尝试 BERT,从这个开始。它提供了一个惊人的方式来利用伯特的力量,而不是让你的机器做所有繁重的工作。阅读自述文件以设置它。
目前就这些。感谢阅读!
阿布舍克·贾
一个好奇的家伙,目前正在建造模型,希望有一天能建造天网。跟随这个空间,学习未被理清的数据科学概念,并站在未来的正确一边!
阅读下一篇
如何构建和管理自然语言处理(NLP)项目
Dhruvil Karani |发布于 2020 年 10 月 12 日
如果说我在 ML 行业工作中学到了什么的话,那就是:机器学习项目很乱。
这并不是说人们不想把事情组织起来,只是在项目过程中有很多事情很难组织和管理。
你可以从头开始,但有些事情会阻碍你。
一些典型的原因是:
- 笔记本中的快速数据探索,
- 取自 github 上的研究报告的模型代码,
- 当一切都已设置好时,添加新的数据集,
- 发现了数据质量问题并且需要重新标记数据,
- 团队中的某个人“只是快速地尝试了一些东西”,并且在没有告诉任何人的情况下改变了训练参数(通过 argparse 传递),
- 从高层推动将原型转化为产品“仅此一次”。
多年来,作为一名机器学习工程师,我学到了一堆东西,它们可以帮助你保持在事物的顶端,并检查你的 NLP 项目(就像你真的可以检查 ML 项目一样:)。
在这篇文章中,我将分享我在从事各种数据科学项目时学到的关键指针、指南、技巧和诀窍。许多东西在任何 ML 项目中都是有价值的,但有些是 NLP 特有的。