增强您的基础数据科学技能
原文:https://towardsdatascience.com/make-your-foundational-data-science-skills-stronger-45ee28574256
在像数据科学这样快速变化的领域,你的学习曲线一定会到达一个感觉非常陡峭的点,甚至可能是不可逾越的。(这种情况可能会发生不止一次。)
在那些时刻,你基础的力量真的很重要——努力掌握基础最终会有回报。如果你是一名数据科学家,想要确保自己为旅途中的挑战做好准备,这里有几篇最近的帖子,提供了实用的见解和灵感。
- 帮助数据职业者脱颖而出的特质有哪些? 卡西·科济尔科夫的帖子总是直截了当,可以付诸行动,这一篇——新系列的第一篇——也不例外。根据她多年的经验,Cassie 概述了那些仅仅涉足数据分析的人和那些处于该领域顶端的人之间的差异,并分享了如何在后者中立足的想法。
- 对于新数据科学家来说,专注是关键。 作为一名自学成才的数据科学家,Soner yld rum不得不通过反复试验来学习许多重要的课程。现在,他慷慨地提供了他的一些主要观点——关于敏捷性的价值和开发部署就绪模型的重要性——以便您可以更有效地推进您的旅程。
Pam Menegakis 在 Unsplash 上拍摄的照片
- 你能说出你的数据是否足够好吗? 评估你正在处理的数据质量的能力至关重要。对于 Seungjun (Josh) Kim 来说,这个过程中最有用的元素之一是异常值检测,他的最新帖子聚焦于你可以在广泛的行业环境中使用的三种可靠方法。
- 如何导航你的第一个时间序列分析项目。 如果(或者,更有可能的是,当时)你发现自己面临一个棘手的时间序列预测问题,你需要一个坚实的路线图来解决它。艾琳·张(Irene Chang)对她的作品集项目的彻底演练正是提供了这一点,并结合了对每个步骤的耐心解释和方便的代码片段,您可以根据自己的需要进行调整。
对于所有如饥似渴的读者来说,我们还没有完成——如果你想了解我们最近的一些杰出作品,请点击这里:
- 在拥挤的就业市场上,实习变得比以前更加重要,而且越来越难找到工作。 Murtaza Ali 的详细指南提供了一个三步走的蓝图,为你的应用提供助力。
- 解释机器学习模型是死路一条吗?瓦莱里娅·丰塞卡·迪亚兹在她对人工智能现状的反思中提出了许多发人深省的问题,并怀疑模型的复杂性是否正在成为技术民主化的障碍。
- 想了解更多关于线性编程的知识吗?本周你很幸运,有两本关于这个主题的优秀入门读物——马克西姆·拉博恩的总论,侧重于数学优化,以及线性规划的商业应用,由 Ezequiel Ortiz Recalde 提供。
- Ayla Kangur 在人工智能、产品管理和团队建设的交叉点上写作,邀请我们了解她的公司最近组织的内部 ML 竞赛,以及她的同事如何从这一倡议中受益。
- 人工智能什么时候会有下一次飞跃?在 TDS 播客上,Jeremie Harris 与人工智能研究员 Jaime Sevilla 聊起了预测 AGI 出现时间表的挑战。
一如既往地感谢您阅读并参与我们作者的工作;特别感谢你们所有选择通过成为灵媒成员来进一步支持他们的人。
直到下一个变量,
TDS 编辑
使用日期时间功能使您的机器学习模型更好地工作
特征工程,机器学习
使用日期时间功能使您的机器学习模型更好地工作
解释如何从日期和时间中提取新要素的现成教程
在 Unsplash 上拍摄的 ThisisEngineering RAEng
毫无疑问,特征工程是构建机器学习模型的最重要的方面之一。研究表明,一个好的模特和一个优秀的模特之间的差别可以通过你设计你的特征的方式来实现。
为了提高模型的准确性,您需要解决数据(不完整或不一致)和模型构建过程中的问题。当精度与您期望的不相似时,您可以使用不同的参数重新训练,或者设计与问题更相关的新功能。
在这篇文章中,我将通过一个实际的例子来讨论如何从日期时间变量中提取新的特征来增加机器学习模型的准确性。
文章组织如下:
- 从日期提取特征
- 时间特征提取
- 实际例子
1 从日期提取特征
有些数据集提供了日期或日期时间字段,在为机器学习模型构建输入要素时通常会将其删除(显然,除非您正在处理时间序列😃).
相反,DateTime 可用于提取新要素,这些新要素可添加到数据集的其他可用要素中。
日期由一天、一个月和一年组成。从这三个部分中,至少可以提取四个不同的特征:
- 一年中的某一天、一月中的某一天或一周中的某一天
- 一年中的月份
- 季节
- 年
在所有情况下,除了年份,所考虑的特征应分为两部分:正弦和余弦,以保证周期性,例如 1 月 1 日接近 12 月 31 日。
1.1 一年中的某一天、一月中的某一天或一周中的某一天
一年中的某一天是指 1 到 365(或 366)之间的数字。当您有一个细粒度的精细数据集,并且在几天内有一个平衡的分布时,可以使用这个特性,否则,使用这个特性可能是危险的,因为它可能会产生过度拟合。
在 Python 中,一年中的某一天可以按如下方式计算:
import **numpy** as npcurrent_date = "2022-01-25 17:21:22"
cdate = datetime.strptime(current_date, '%Y-%m-%d %H:%M:%S')**day_sin** = np.sin(2 * np.pi * cdate.timetuple().tm_yday/365.0)
**day_cos** = np.cos(2 * np.pi * cdate.timetuple().tm_yday/365.0)
对于数据集中更稀疏的日期值,我建议您利用一天作为一个月中的某一天或一周中的某一天。
一年的 1.2 个月
一年中的月份是指 1 到 12 之间的数字。如果您的 Pandas 数据帧中有一个 DateTime 列,则一年中的月份可以提取如下:
df['month_sin'] = np.sin(2 * np.pi * df['date_time'].dt.month/12.0)
df['month_cos'] = np.cos(2 * np.pi * df['date_time'].dt.month/12.0)
1.3 季节
季节是一个分类变量,它包括以下值:春天、夏天、秋天、和冬天。关于前面的特征,不计算季节的周期性。
在 Python 中,可以提取季节,如 Stackoverflow 上这个有趣的帖子中所解释的。
或者,季节可以被视为一个数字特征。在这种情况下,你应该注意周期性,所以你应该计算正弦和余弦。
1.4 年
**通常,当您必须预测未来的值时,年份作为输入特征不是很有用。**然而,为了完整起见,我描述了如何利用它作为输入特性。
如果数据集包含多个年份,则可以使用年份。根据您的需要,它可以是分类变量,也可以是数值变量。
如果您的 Pandas 数据帧中有一个 DateTime 列,则年份可以提取如下:
df['year'] = df['date_time'].dt.year
2 时间特征提取
可以从 DateTime 列中提取时间特征。
根据数据集的粒度,可以提取不同级别的时间要素(小时、分钟、秒……)。然而,最常见的时间特性是以小时为基础的。请始终记住,时间特征应分为正弦和余弦,以反映数据的周期性(例如,23:59 接近 0:01)。
在 Python 中,给定一个日期时间变量,可以按如下方式提取一个小时:
import **numpy** as np**hour_sin** = np.sin(2 * np.pi * cdate.hour/24.0)
**hour_cos** = np.cos(2 * np.pi * cdate.hour/24.0)
3 一个实例
这个例子利用了 Kaggle 上的天气数据集,该数据集有 CC0: Public Domain 许可。
本例的目标是构建一个多类分类器,该分类器根据输入要素预测天气状况(由数据集的列摘要给出)。我计算了两种情况下的准确性:有和没有 DateTime 特性。
3.1 加载数据集
该数据集可在 Kaggle 上获得。我把它作为一个熊猫的数据框打开:
import **pandas** as pddf = **pd.read_csv**('../input/weather-dataset/weatherHistory.csv')
作者图片
该数据集包含 96,453 条记录和 12 列。
3.2 探索性数据分析
现在,我去掉对预测没有太大影响的变量。我注意到隔音罩对于所有行都是一样的,所以我可以将其移除。
df['Loud Cover'].**value_counts**()
它给出了以下输出:
0.0 96453
Name: Loud Cover, dtype: int64
我还可以删除每日摘要列,因为它只包含文本。
df.**drop**(['Daily Summary','Loud Cover'],axis=1,inplace=True)
最后,我处理缺失值:
df.**isnull()**.**sum()**
它给出了以下输出:
Formatted Date 0
Summary 0
Precip Type 517
Temperature (C) 0
Apparent Temperature (C) 0
Humidity 0
Wind Speed (km/h) 0
Wind Bearing (degrees) 0
Visibility (km) 0
Pressure (millibars) 0
预测类型列包含一些缺失值。我放下了。
df.**dropna**(inplace=True)
3.3 数据清理
首先,我将分类数据转换成数字数据:
from sklearn.preprocessing import **LabelEncoder**le = LabelEncoder()
df['Precip Type']=le.fit_transform(df['Precip Type'])
df['Summary']=le.fit_transform(df['Summary'])
然后,我标准化输入特征:
from sklearn.preprocessing import **StandardScaler**scaler = StandardScaler()
df[df.columns[2:]] = scaler.fit_transform(df[df.columns[2:]])
我从第二个第三列开始,因为我没有标准化前两列(DateTime 和 Summary)。
3.4 特征工程
现在,我准备提取一年中的某一天和某一小时。我定义了一个函数,在给定日期的情况下,提取天数和小时数的正弦和余弦值:
import **numpy** as np
from **datetime** import datetimedef **discretize_date**(current_date, t):
current_date = current_date[:-10]
cdate = datetime.strptime(current_date, '%Y-%m-%d %H:%M:%S')if t == 'hour_sin':
return np.sin(2 * np.pi * cdate.hour/24.0)
if t == 'hour_cos':
return np.cos(2 * np.pi * cdate.hour/24.0)
if t == 'day_sin':
return np.sin(2 * np.pi * cdate.timetuple().tm_yday/365.0)
if t == 'day_cos':
return np.cos(2 * np.pi * cdate.timetuple().tm_yday/365.0)
现在,我提取新的特征:
date_types = ['hour_sin', 'hour_cos', 'day_sin', 'day_cos']
for dt in date_types:
df[dt] = df['Formatted Date'].apply(lambda x : discretize_date(x, dt))df.drop(['Formatted Date'],axis=1,inplace=True)
我计算特征之间的相关性,以检查是否有一些特征高度相关。在这种情况下,两个功能中的一个可能会被删除。
df.corr()
作者图片
表观温度和温度高度相关,因此我可以降低表观温度:
df.**drop**(['Apparent Temperature (C)'],axis=1,inplace=True)
3.5 列车测试拆分
我将数据分成 X 和 y 两部分,然后分成训练集和测试集:
from sklearn.model_selection import train_test_splitX = df.iloc[:,1:]
y=df.iloc[:,0]
X_train,X_test,y_train,y_test = **train_test_split**(X,y,test_size=0.3,random_state=1)
3.6 模型培训和评估
我测试了两个模型,一个有 DateTime 特性,另一个没有。首先,我用日期时间特征训练模型:
from sklearn.ensemble import RandomForestClassifiermodel = **RandomForestClassifier**(max_depth=32,n_estimators=120,random_state=1)
model.**fit**(X_train,y_train)
y_pred = **model.predict**(X_test)
我计算的准确度是:
from sklearn.metrics import **accuracy_score****accuracy_score**(y_test, y_pred)
它给出了以下输出:
0.6695389319342622
现在,我在没有日期时间功能的情况下训练模型:
model = **RandomForestClassifier**(max_depth=32,n_estimators=120,random_state=1)
model.**fit**(X_train[X_train.columns[:-4]],y_train)y_pred = model.**predict**(X_test[X_test.columns[:-4]])
我计算精确度:
accuracy_score(y_test, y_pred)
它给出了以下输出:
0.5827108161634411
请注意具有日期时间功能的模型如何优于另一个模型。
你可以在我的 Kaggle 简介中获得本教程的完整代码。
摘要
恭喜你!您刚刚学习了如何从机器学习模型中提取日期时间特征!本文中描述的实际例子证明了日期时间特性的存在可以提高机器学习模型的性能。
我留给你一个挑战性的问题:
日期时间特性会引入过度拟合吗?
敬请关注…
你可以通过阅读哈希尔·帕特尔的这篇有趣的文章来了解更多关于特征工程的概念,这篇文章题为什么是特征工程——机器学习的重要性、工具和技术。
如果你已经走了这么远来阅读,对我来说今天已经很多了。谢谢!你可以在这篇文章中读到更多关于我的内容。
相关文章
让你的神经网络产生幻觉
原文:https://towardsdatascience.com/make-your-neural-network-hallucinate-a587ceeb4dbe
来自谷歌人工智能的深度梦想项目教程
在这个项目中,我们将采用一个输入图像,并使用生成模型对其应用一些幻觉效果。本教程基于谷歌人工智能和 Keras 的实现的这篇博客文章。它需要对机器学习和深度神经网络有一些基本的了解。
级别:中级—高级
最后提供了所有代码参考。作者修改了原始代码,并添加了一些额外的实现来适应本教程。
等等,我的狗怎么了?或者是我?—作者图片
(不用担心!在本教程的剩余部分,我将不再在我的狗身上测试这个模型。)
概观
对于高级功能,如使用指导图像控制梦境,请参见继续进一步会话。
为了完成这项任务,我们将:
- 处理输入图像
- 通过预先训练的图像分类模型输入该图像
- 取一些隐藏层的输出并“放大”激活信号
- 用这些放大的神经元重新构建一个新的图像
最大的技术挑战是“放大”激活信号。由于该模型已经被训练来检测和分类图像,我们可以有把握地假设,激活隐藏层可以捕捉有关图像的重要信息:形状,边缘,上下文,…
这意味着模型可以“看到”我们看不到的东西。我们能做的就是把这些信号“放大”到原始的画面,在一个迭代的过程中再次馈入模型。随着我们的图像获得更多的“隐藏上下文”,该模型可以接收这些新信号,甚至发现上下文,从而创建一个反馈循环。
这一步的程序是:
- 创建一个新模型,从一些隐藏的图层中提取特征
- 通过模型输入图像
- 根据这些特征计算激活信号
- 使用这些信号增强输入图像
- 重复第二步
我将使用 TensorFlow/Keras 来完成这项任务。与 PyTorch 相比,TF 的一个优势(在本文发表时)是可以很容易地获得 Keras 隐藏层的输出。因此,构建一个新的模型来提取特征成为一个琐碎的任务。
一般来说,精通这两种框架并了解哪一种最适合您的项目是有利的。
履行
属国
本教程在 Python3 上运行。我使用 Anaconda for Windows 来管理和安装所有的依赖项。
预处理和后处理
我们应用了在训练中使用的相同的预处理。
- 预处理:加载并归一化输入图像到[-1,1]之间
- 后处理:将范围[-1,1]转换为[0,255],并将数据类型转换为 uint8
定义模型
我们将使用 InceptionV3 作为基线模型。
对于这项任务,我们将构建一个新的模型,从我们的基线模型输出一些隐藏层的激活。
我怎么知道选择哪几层?
方法 1: 使用 TF 中的summary()
方法获得图层名称列表。
>>> feature_extractor.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, None, None, 0 []
3)]conv2d (Conv2D) (None, None, None, 864 ['input_1[0][0]']
32)batch_normalization (BatchNorm (None, None, None, 96 ['conv2d[0][0]']
alization) 32)activation (Activation) (None, None, None, 0 ['batch_normalization[0][0]']
...
**方法二:**用 Netron 可视化(这是我比较喜欢的方法):
- 保存模型
>>>feature_extractor.save('extractor.h5')
- 用 Netron 加载并检查模型。
- 在这个模型中有一些“交通路口”,看起来它们应该包含有用的信号,让我们使用这些。
识别“良好”的输出图层-按作者分类的图像
- 网络的每一层都在不同的抽象层次上学习图像。通常,第一层对边缘、颜色和形状等基本特征更敏感。而更深的层可能包含更多关于对象、上下文等的信息
定义损失函数
这就是事情变得有趣的地方。我们将使用以下损失函数:
其中y_i’s
是特征提取器模型的激活输出,d_i's
是这些输出的大小(尺寸的乘积)。
为什么要用这个损失函数?
- 我们想捕捉神经元最“活跃”的地方
- 特征图的范数对应于来自这些层的信号
- 大的损失值意味着特征映射在图像中检测到许多“隐藏的上下文”
- 我们根据输出大小进行归一化,以便所有选择的层对损耗的贡献相等
定义更新规则
在一个典型的深度学习问题中,我们会使用梯度下降来最小化目标损失。然而,这里的情况并非如此:
- 最小化损失函数意味着最小化输出激活的范数。这不是我们的真正目标。
- 激活信号是我们想要注入到我们图像中的东西(模型看到的东西,但是我们看不到)
- 所以我们想保持模型的权重不变。我们将仅使用激活信号来增强我们的输入图像。
→梯度上升!
把所有的放在一起
Google 在原始博客中建议,我们应该迭代地将我们的算法应用于图像输入,并在每次迭代后应用一些缩放。
以下是一些结果:
Fernando Paredes Murillo 在 Unsplash 上拍摄的照片
作者的幻觉
由弗拉基米尔·阿尼奇耶夫在 Unsplash 拍摄的照片
被作者强化的梦
更进一步
为了控制模型如何做梦,我们可以
- 修改变量:渐变步长、缩放步长数、每次缩放的比例以及每步的迭代次数
- 为特征提取选择一组不同的层:同样,我们可以利用 Netron 并挑选出一些候选层
- 修改损失函数:归一化范数是从模型中捕捉隐藏信号的最佳函数吗?
- 为我们的梦想使用向导图像
使用向导图像
除了依赖激活信号,我们还可以使用一个引导图像作为我们迭代的“GPS”。在每一步,来自引导图像的隐藏信号也被注入到我们的图像中。
为了完成这项任务,我们需要做出以下改变:
-
加载指南图像
-
将两个图像的大小调整到相同的分辨率
-
修改损失函数:我们将改为计算图像之间激活的点积。
-
基本原理:模型可以在两幅图像中“看到”我们肉眼看不到的东西。高损耗意味着来自引导图像的强信号增强了点积。因此,随着梯度上升,我们正在添加额外的“抽象”从指南图像到我们的原始图像。
示例结果:
作者图片
因热带梦幻而增强——作者图片
结论
这个项目是机器学习中生成模型的一个很好的例子。我们不是修改权重以最小化损失,而是使用梯度来增强输入图像以最大化该损失。随着我们反复重复这个过程,图像可以逐渐从模型中获得额外的信号,这些信号以前是我们看不到的。
希望你能从本教程中获得乐趣,并创作出一些美丽的仲夏夜之梦。
资源
谷歌人工智能的博客文章:
https://ai.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html
TensorFlow 教程:
https://www.tensorflow.org/tutorials/generative/deepdream
Keras 深梦:
https://keras.io/examples/generative/deep_dream/
如果你愿意支持 Thu,你可以考虑注册成为一名中等会员。每月支付 5 美元,你就可以无限制地阅读媒体上的故事。如果你使用他的推荐链接,Thu 也会得到一小笔佣金。
https://medium.com/@tdinh15/membership
让您的 R 代码速度提高 10 倍:3 分钟解释矢量化
r 并不以快速编程语言著称。与 C++等速度更快的同类产品相比,它充其量只能算是缓慢的。也就是说,如果您理解了整个语言背后的一个关键概念,您可以让 R 代码运行得更快。
这个概念叫做矢量化,三分钟就能了解到。
在 R 中,向量是包含一个值或一组值的变量的基本类型。它们很常见。如果你曾经给一个变量名分配了一组数字,比如x <- 1:50
,那么你就创建了一个向量。您可以在 vector 中存储最常见的数据类型,包括 doubles、integers、logicals、characters 等等。
向量也可以有额外的属性。例如,向量中的每个值(或“元素”)都可以有一个名称。R like 列表和数据帧中常见的数据结构也是由带有一些额外属性的向量组成的。
因为 R 是围绕向量构建的,所以它的许多运算会自动作用于向量中的所有元素。换句话说,它们是“矢量化”的。为了解释,这里有一个例子,当你创建一个整数向量,然后乘以 2 时会发生什么。
如上所述,乘法运算适用于向量的所有元素。更何况,这并不只是对运营商起作用。许多常见的函数都是矢量化的,这意味着它们以与上面的例子完全相同的方式跨矢量元素工作。例如,您知道粘贴函数是矢量化的吗?
在这一点上,你可能想知道为什么 R 用户不简单地循环向量元素。这是大多数编程语言中的标准方法,那么为什么在 R 中不能这样做呢?这是省时的部分。
事实是,您可以在 R 中使用循环,有时有很好的理由这样做。然而,因为 R 是围绕向量构建的,矢量化表达式的运行速度通常比循环快很多倍。根据您的代码,您通常可以看到矢量化带来 10 倍的速度提升。下面的例子比较了上面粘贴例子中两个代码块的运行时间。
矢量化粘贴表达式与循环的执行时间比较。
这段代码的结果将在一定程度上取决于您机器的规格。在我的计算机上,循环运行平均需要 180 微秒,而矢量化表达式只需要 18 微秒;快十倍!就其本身而言,节省 162 微秒似乎不是什么大事。但是,当你运行这些相同的表达式成千上万次时,这会对你的总运行时间产生巨大的影响。
除了速度,矢量表达式还可以节省空间。 For 循环通常很庞大,需要在循环前初始化变量。矢量化将这些冗长的代码块缩减为几行,甚至是上面例子中的一行。这样,你将拥有更快的代码,需要更少的时间和精力来通读;你不能输!
向量化更进一步
虽然我已经简单介绍了向量化,但是对于高级 R 用户来说,深入研究这个概念是必须的。一旦你有了更多的经验,并且想学习更多关于 R 中的向量和其他数据类型,请阅读 Hadley Wickham 的“高级 R”中的这一章。
如果您是矢量化的新手,首先要做的就是尝试一下。查看您经常使用的函数,看看它们是否是矢量化的。在你的脚本中加入一些矢量化的操作。过一段时间,这将成为你的第二天性,你将能够用向量而不是循环来思考。试一试,享受你在这个过程中节省的时间。
想阅读我所有关于编程、数据科学等方面的文章吗?在这个链接注册一个媒体会员,就可以完全访问我所有的作品和媒体上的所有其他故事。这也直接帮助了我,因为我从你的会员费中得到一小部分,而不需要你额外付费。
你也可以通过订阅这里让我的所有新文章直接发送到你的收件箱。感谢阅读!
制作一个聊天机器人来搜索附近的餐馆
原文:https://towardsdatascience.com/making-a-chat-bot-to-search-for-eating-places-nearby-64df233ce48a
雅各布·卡普斯纳克在 Unsplash 上的照片
我们使用 Rasa 框架和 FOURSQUARE Places API 来制作一个搜索餐馆和咖啡馆的聊天机器人
饿吗?想找家餐馆吗?在这个示例项目中,我们制作了一个简单的聊天机器人,可以帮助您做到这一点。
我们将使用 Rasa 制作聊天机器人。它是一个用于制作基于任务的对话聊天机器人的开源框架。Rasa 使用机器学习模型来理解用户输入,并保持对话。
使用 FOURSQUARE Places API,我们可以在任何地点搜索感兴趣的地方。
结合这两者,我们得到了我们项目的聊天机器人。所以让我们开始吧。
目录:
文章中用到的所有代码都可以在 GitHub 资源库 中找到。
入门指南
首先,我们需要创建一个安装 Rasa 的虚拟环境。如果我们安装了 Anaconda,我们可以使用下面列出的命令。我们应该确保使用 Python 版本 3.7 或 3.8。这个命令列表还会安装一些我们需要的额外的库。
# This command creates the virtual environment
conda create --name env_name python=3.8# This command activates the virtual environment
conda activate env_name# This command installs pip in the virtual environment
conda install pip# And this command installs Rasa in the virtual environment
pip install rasa# We also need to install some additional libraries for the project, which may be done using the command given below.conda install pandas
pip install python-dotenv
pip install geopy
pip install word2number
我们也可以在 Rasa 开源上找到安装说明。
我们将在这个项目中使用的库是:
- 请求 :是一个处理 HTTP 请求的简单库。
- geopy :这是一个简单的 Python 接口,用于许多地理编码 web 服务,如 Google Maps、nomim、MapBox 等。
- 熊猫 :它是一个数据操作库,特别针对表格数据
- word2number :用于将数字字如“五”或“五十五”转换成相应的数字。
- -python-dotenv:用于从项目根目录下的. env 文件中读入环境变量。稍后当我们讨论 FOURSQUARE API 时会有更多的介绍。
一切就绪后,我们现在准备初始化我们的 Rasa 项目。首先激活虚拟环境(我的命名为 rasa),然后制作一个空目录并移入其中,最后输入命令rasa init
。Rasa 会在过程中要求一些提示;我们可以接受默认值。
Rasa 入门(图片由作者提供)
在这个阶段,我们应该有一个目录,其结构如下所示。
.
├── actions
│ ├── actions.py
│ ├── __init__.py
│ └── __pycache__
│ ├── actions.cpython-38.pyc
│ └── __init__.cpython-38.pyc
├── config.yml
├── credentials.yml
├── data
│ ├── nlu.yml
│ ├── rules.yml
│ └── stories.yml
├── domain.yml
├── endpoints.yml
├── models
│ └── 20220210-173055-ambitious-agate.tar.gz
└── tests
└── test_stories.yml5 directories, 13 files
重要的文件和目录有:
- 。/actions/ 目录:该目录下的主要文件有:
- actions.py 文件:Rasa 允许聊天机器人运行自定义 Python 代码,称为自定义‘自定义动作’。这些在这个文件中定义。
- init。py 文件:这个文件告诉 Python 把目录当作一个包
- config.yml 文件:这是配置文件;它定义了模型的各个部分、它们之间的关系以及它们的参数。
- credentials.yml 文件:包含了连接到 slack、脸书等各种渠道的凭证。
- 。/data/ 目录:包含训练数据的目录。有关培训数据格式的详细信息可在处找到[。它包含三个文件:
- nlu.yml 文件:它包含可能的用户输入的标记样本。
- stories.yml 文件:这包含了机器人和用户之间的对话示例。
- rules.yml 文件:它包含应该总是遵循相同路径的用户-机器人对话的小段。](https://rasa.com/docs/rasa/training-data-format)
- domain.yml 文件:这个文件定义了 bot 的环境,它看到什么,它知道什么,以及用什么来响应。
- endpoints.yml 文件:它定义了机器人可以用于各种内部任务的各种端点。
- 。/models/ 目录:包含训练好的模型。默认情况下,推理过程中使用最新的模型。
- 。/tests/ 目录:它包含 test_stories.yml 文件,该文件包含用于评估 bot 性能的示例用户-bot 对话。
对于这个项目,我们将在数据文件夹的三个文件中添加训练数据。我们将在 actions 文件夹的 actions.py 文件中编写一些自定义操作。我们还需要修改 domain.yml 文件。
完成基本的设置后,是时候设置下一个组件了,FOURSQUARE API。
获取 FOURSQUARE Places API
要使用任何一个 FOURSQUARE APIs,首先我们需要在 FOURSQUARE 上创建一个开发者账户。然后我们创建一个新项目并生成一个新的 API 密匙。我们可以在 FOURSQUARE 网站上找到这个过程。
我们需要对 API 密钥保密,所以通常的做法是将其作为环境变量来检索。为此,我们创建一个名为’的文件。env '(是的,。env 是项目根目录中的文件名,而不仅仅是扩展名。的内容。env 文件将类似于如下所示。
API_KEY=replace_this_with_your_api_key
之后,我们可以使用 python-dotenv 库检索这个值,如下所示。确保包括。env 在。gitignore 文件。
from dotenv import dotenv_valuesAPI_KEY = dotenv_values()["API_KEY"]
FOURSQUARE 有许多 API,但我们将只在项目中使用 Places API 的搜索端点。我们可以在下面给出的页面中试用 API。
FOURSQUARE 支持许多不同类别的名胜古迹。在我们的例子中,我们希望将搜索范围限制在餐馆和咖啡馆。为此,我们需要在 categories 参数中传递相关的类别 ID。类别 id 及其相应类别名称的完整列表在这里给出。
生成 NLU 数据
NLU 代表 N 自然 L 语言 U 理解,nlu.yml 文件将包含用户输入的标签示例,模型将使用这些示例来理解用户输入。模型需要从用户输入中学习两件事:
- 用户所说的,叫做意图
- 以及从用户输入中提取的信息,称为实体。
在我们的聊天机器人中,我们将在 API 调用中指定三个参数:ll(纬度、经度)、半径和类别。使用 categories 参数而不是 query 参数有三个好处:
- 从用户输入中提取查询字符串很麻烦
- 确保结果与我们的用例相关
- 我们可以在我们这边执行数据验证,而不依赖于 API
为了填充这三个参数,我们需要从用户输入中提取三个实体:
- place_type:这将被映射到 category 参数。
- 地址:这将被映射到 ll 参数。
- 半径:这将被映射到半径参数。
Rasa 有一个叫做 Forms 的有用特性,可以从用户输入中提取所需的信息。关于如何使用表格的详细信息可以在这里找到。
下面是 nlu.yml 文件的一个示例。完整的数据可以在 Github 上找到。
version: "3.0"
nlu:- intent: greet
examples: |
- hey
- hello
- hi
- hello there- intent: goodbye
examples: |
- bye
- goodbye
- have a nice day- intent: mood_great
examples: |
- perfect
- great
- amazing
- feeling like a king- intent: mood_unhappy
examples: |
- my day was horrible
- I am sad
- I don't feel very well
- sad- intent: giving_place_type
examples: |
- I want to look for [restaurants](place_type)
- I would like to make a search for [restaurants](place_type)
- Look for [both restaurants and coffee houses](place_type)
- Search for them [both](place_type)- intent: giving_address
examples: |
- I live in [Scarborough](address), [Toronto](address), [ON](address), [Canada](address)
- [317 Dundas St W](address), [Toronto](address), [ON M5T 1G4](address), [Canada](address)
- [Dhaka](address), [Bangladesh](address)
- [London](address)- intent: giving_radius
examples: |
- [20](radius)
- [ninety one](radius)
- [fifty](radius) kilometers
- Search within [15](radius) km
自定义操作
定制操作是 Rasa 灵活性背后的主要动力。它们使机器人能够根据用户输入在对话期间运行定制的 python 代码。
要使用自定义操作,我们需要做四件事:
- 在 actions 文件夹的 actions.py 文件中编写 python 代码。关于如何编写自定义函数的详细信息可以在 Rasa 操作服务器文档中找到。
- 通过在 domain.yml 文件中列出自定义操作,让 bot 知道这些操作。
- 取消对 endpoints.yml 文件中以下行的注释。
action_endpoint: url: "http://localhost:5055/webhook"
- 最后,当我们想要使用定制动作时,我们需要在单独的终端中运行命令
rasa run actions
。
我们将在以下任务中使用自定义操作:
- 地址验证:我们将用户的位置提取为一个地名列表,如[‘纽约’,‘美国’]。然后我们使用。join()字符串运算符来生成完整的地址字符串。然后,我们使用 geopy Nominatim 对地址进行地理编码,即将地址映射到一个准确的位置。如果地址无效,则不返回任何结果。如果返回一个结果,我们还存储纬度和经度值,以便传递给 API 调用。
- 半径验证:半径应该是一个数字或一个可以转换成数字的单词,如“六”。我们使用 word2number Python 库来检查这种情况。
- 发出 API 调用:我们使用 Python 请求库发出 get 请求。用于授权的 API 密钥在头中传递,而参数作为 url 的一部分传递。该调用返回一个 json 对象,我们解析该对象以获得所需的值。
这些功能可以在 Github 页面中找到。
领域、规则和故事
domain.yml 文件描述了聊天机器人的环境。它包含所有意图、实体、动作、响应、插槽以及表单的列表。可以在这里找到该文件中包含的内容和形式的详细信息。
到目前为止,我们所做的一切都必须列在这个文件中,聊天机器人才能知道它们。而且,我们还需要做槽和 bot 响应。这个项目的 domain.yml 文件可以在这里找到。
rules.yml 文件描述了应该总是以相同方式进行的简短对话。“激活表单”和“提交表单”是我们项目中的两个主要规则。关于编写规则的详细信息可以在这里找到。
故事是用户与机器人互动的例子。它们帮助模型响应用户输入,即使是长时间的对话。关于如何为 Rasa 写故事的细节可以在这里找到。
现在我们从命令行运行命令rasa train
。
聊天机器人用户界面
测试聊天机器人最简单的方法是在一个终端使用命令rasa shell
,在另一个终端运行命令rasa run actions
。
从终端与聊天机器人互动(图片由作者提供)
这是可行的,但是我们可以通过使用下面显示的聊天机器人 UI 来获得一个更好的界面。
https://elysian01.github.io/Rasa-Chatbot-UI/
首先,我们下载文件,提取其内容,然后在 web 浏览器中打开 index.html 文件。关于如何修改聊天机器人设计的说明可以在网站上找到。
将所有这些放在一起,在一个终端中我们运行下面的命令。
rasa run actions
然后在另一个终端中,我们运行下面的命令:
rasa run --enable-api --cors='*'
最后,我们运行 index.html 文件。
使用聊天机器人用户界面在浏览器中与聊天机器人互动(图片由作者提供)
结论
我们结束了。我们刚刚制作了一个聊天机器人,可以搜索附近的餐馆和咖啡馆。
对于进一步的工作,我们可以:
- 我们可以添加另一个功能,可以帮助查找场馆的细节。
- 我们还可以尝试部署应用程序,并使其为生产做好准备。
目前就这些。感谢您的阅读。
https://rasa.com/ https://developer.foursquare.com/ https://github.com/AhmedFahim-git/simple_chatbot
产生影响有时意味着为了广度而牺牲深度
作者聚焦
阿德里安娜·克莱恩思考了一个跨越医学、机器学习和工程的多学科职业生涯
在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与 艾德丽安·克莱恩 分享我们的对话。
照片由阿德里安娜·克莱恩提供
Adrienne Kline 是西北大学预防医学系的博士后研究员。她完成了生物医学工程博士学位(机器学习中的成像专业),医学博士学位,之前获得了电气工程学士学位。
她的兴趣在于医学和工程的交叉,特别是利用算法决策支持医学转化应用。她的工作导致了处理缺失数据的新方法、评估机器学习预测可靠性的创新指标以及多模态数据流的信息融合的发展。通过强调结构数据、计算机视觉、强化学习和生成算法,她希望改变医学实践的效率和可靠性。
最近你最感兴趣的话题和项目是什么?
我的工作总是由新颖的应用和方法组成。应用程序,因为我经常想利用现有的工具来完成任务;但是当我想要的工具不存在的时候,我就努力去创造它。目前,我正在研究新的插补和机器学习能力工具,这两者都是方法和数学密集型的。
我在心脏病学领域从事的另外两个项目是生成模型和强化学习。这些都是以应用为基础的,用于提高心力衰竭患者决策的可靠性。此外,当我看到需要的问题时,我会寻找结合硬件和软件的新颖项目。我总是回归理论,解决一个有意义的问题。
作为一个拥有工程、机器学习和医学等多学科背景的人,你是如何决定走哪条职业道路的?
我的机器学习生涯始于我工程本科学位的后期。我的顶点项目是关于脑机接口(BCIs)——利用脑电图(EEG)进行信号/图像处理以控制机器人手。
本科毕业后,我同时被博士和医学博士项目录取,并选择在完成研究生学业的同时推迟医学院的学习。在博士期间,我继续将机器学习应用到我为脊髓损伤患者设计的 BCI 机器人中,这些机器人使用了 fMRI(功能性磁共振成像)和 EEG。
当我带着工程学的视角进入医学院时,我开始体会到医学决策的细微差别和困难。医学是一个要求很高的职业,但当我学会如何像临床医生一样思考时,我开始注意到我希望在当前范式上改进的许多方式。尽管对我焦虑的同学来说很前卫,我还是参加了一场住院医师比赛,因为我认为自己是两个世界之间的桥梁,而不是执业医师。
我喜欢照顾病人,但我的理想角色,发挥我的嵌合体优势,成为一个我可以为我从未谋面的病人提供照顾的角色,为了广度牺牲深度。我总是说我不是在找工作,我是在找一个角色——一个我可以“坐在板凳上”工作,管理一支工程师和科学家团队,与我们的临床医生合作伙伴合作,并且可信地说两种语言的角色。
最终,我希望开发和转化技术(算法、设备、信息),以提高可靠性、降低成本并提高患者护理的效率。
今天的数据从业者有很多职业选择。你会建议他们在开始旅程时问自己什么样的问题?
在这个蓬勃发展和令人兴奋的领域有大量的机会。
我认为人们很容易被过度使用的“人工智能”一词所迷惑归根结底,职业决策是基于个人价值的判断。如果你的动机是薪水,那么你在工业界会更好。如果你想按照自己的节奏前进,也许学术界或创业公司适合你。
也就是说,这曾经是学术界与工业界的较量,但许多公司都有强大、纯粹的 R&D 部门发布白皮书,许多学术界人士在实验室里为他们的研究和出生公司申请专利。因此,在做任何决定时,就像任何好的算法一样,找到对你来说最重要的方面(薪水、向上的流动性、自主性、地域流动性等等。)作为决策的基础。然后根据你的每一个预期选项满足这些内在愿望的程度,对它们进行评分(如果你愿意,也可以对它们进行不同的加权);这就是我如何做出生活和职业决定的。
无论在哪个领域,适应性和灵活性对于保持现状都是绝对必要的,为了发展技能,人们需要在工作中有发展空间。因此,如果你更看重行业,要谨慎行事,确保工作描述中包含一些发展空间;它往往被自动构建到学术学习中心。
不管职业阶段如何,我鼓励人们永远不要放弃数学、统计学、计算机科学和工程学的基础知识。这些基本原则是创新赖以建立的关键。每天都有新的架构和算法出现,如果你只关注树叶,你就会看不到树。总是问自己“那又怎样?”给你的工作打基础,并提醒你回答大问题。
你为什么决定为更广泛的受众撰写关于数据和机器学习的文章?
我关于 TDS 的第一篇文章是关于我创建的一个 Python 包——pspy。现在有一个正式的白皮书,我已经在媒体文章中引用过了。白皮书的提交发生在 2022 年初,直到 7 月份才在 IEEE 会议上提交。但是因为这篇论文需要一个工作包,我觉得它提供了一个独特的机会,让数据科学和统计社区意识到它的存在,而不是通过一个隐藏在看不见的存储库中的自述文件。
奇怪的是,它成了一篇受欢迎的文章,所以我开始写其他文章,灵感来自我们的研究生在实验室问我的问题。我一直喜欢教学,并且非常重视指导。通过创建这些文章的存储库,我有了可供学生参考的资源。这些文章既是教学的资源,也减少了我被问到的问题中的一些重复。
最近几个月,你已经出版了优秀的统计训练营系列。是什么激发了这个想法,你希望你的读者从中学到什么?
我有幸教过本科生和研究生。教学一直是一种有益的经历,我的学生一直是我的灵感来源。训练营建立在我以前教过的统计学研究生入门课程的基础上。
我对训练营的希望是,它可以成为那些上过研究生院的人(可能想更新一下)和那些想从研究生水平的统计学课程中获得知识但没有机会这样做的人容易获得和负担得起的笔记库。通过阅读,人们成为更好的信息生产者和消费者。
无论是在你自己的特定领域还是在更广泛的生态系统中,你希望在近期或中期看到什么样的进步?
在接下来的几年里,我希望看到更多的机器学习部署到翻译应用中。我要补充的告诫是,我希望在一个预测的可靠性或不确定性与首先获得预测的能力同等重要的环境中工作和建设。
了解算法的局限性,也就是说,它适合谁,不适合谁,是非常重要的。这是算法和专家决策者之间的权衡,应该根据具体情况而定。
最后,在医疗领域,我希望看到多模态数据推动更多的患者决策。在医学上,许多决定被称为临床诊断;这意味着它不是一个单一的实验室或影像学研究,而是一个星座的迹象,症状,实验室,成像等。这就是 ML 真正闪光的地方:它可以将不同的数据类型加权到一个统一的诊断中,因为临床医生(以及更广泛的人类)在检查病人时并不擅长执行矩阵代数。
要了解更多关于艾德丽安的工作,了解她的最新文章,请点击媒体、推特和谷歌学术关注她。为了体验阿德里安娜的 TDS 文章,这里有一些突出的:
- 浏览 统计训练营系列中的所有当前帖子。
- 插补方法的实施与限制(2022 年 5 月,9 分钟)
- 用 Dash/Heroku 创建仪表盘 App:精简的流程(2022 年 6 月,5 分钟)****
- 参数与非参数测试,以及何时使用它们(2022 年 4 月,4 分钟)
想和广大观众分享一些你自己的作品吗?我们很乐意收到你的来信。
这个 Q & A 是为了长度和清晰而稍加编辑的。
让 CDR 准备好与真正的量子计算机一起工作
原文:https://towardsdatascience.com/making-cdr-ready-to-work-with-a-real-quantum-computer-fcdf270a6730
做程序员没坏处
量子机器学习要不要入门?看看 动手用 Python 学习量子机器 。
克利福德数据回归(CDR)是一种很有前途的量子误差缓解方法。在之前的帖子中,我们有效地改编了来自开源库 Mitiq 的代码。因此,我们只需进行微小的调整,就可以连接到 IBM 量子云,并降低真实量子计算机的噪音。
作者图片
然而,完成该方法需要一整天的时间。它不需要这么长时间,因为它需要这么多的计算时间。但这需要很长时间,因为我们提交给 IBM cloud 的量子电路已经等待了很长时间才能执行。
IBM 免费提供他们的量子设备。但是,当然,这些是共享设备。当您将一个量子电路发送到 IBM cloud 上的一个量子系统时,在最终执行之前,它会与来自其他用户的作业一起进入一个队列。根据排队作业的数量,可能需要几个小时才能运行作业。
在我们执行 CDR 的过程中,我们向 IBM cloud 提交了 11 个电路。问题是我们没有马上把它们都发出去。但我们总是等到一项工作完成后,再发送下一项。结果,我们的等待时间大大增加了。
幸运的是,IBM 允许我们同时发送多个电路。这将大大减少我们的总等待时间。
在上一篇的代码中,我们使用了从 mitiq 导入的execute_with_cdr
方法。我们用一个定制的执行器作为参数来调用它——real_jakarta
执行器。这个执行器是一个函数,它接受量子电路,运行它,并返回感兴趣的可观察对象的期望值。
让我们简单看一下execute_with_cdr
函数的代码,你可以在这里找到。在第 155 行,我们调用执行器的evaluate
函数,并将一列电路和可观察值作为参数传递。
电路列表是训练电路加上我们要计算其期望值的原始电路。CDR 方法建立在从数据中学习如何减轻噪声的基础上。我们看到,我们可以指定我们想要在更近的检查中使用的训练电路的数量。默认值为10
。所以,我们用 11 个电路的列表调用evaluate
函数。
执行器(参见代码这里的)循环遍历列表,通过调用我们提供的函数来“执行”每个电路。
让我们简单回顾一下所提供的函数,看看我们是如何执行一个电路的。
*# ...*mapped_circuit **=** transpile(circ, backend**=**jakarta)
qobj **=** assemble(mapped_circuit, backend**=**jakarta, shots**=**shots)*# execute the circuit*
job **=** jakarta.run(qobj)counts **=** job.result().get_counts()*# ...*
首先,我们在真实的量子设备(Jakarta)上传输、组装和运行电路。然后,我们在执行器内部直接获得的结果,因此也是在循环内部。这就是问题所在,因为result()
是一种屏蔽方法。它不返回任何内容,但会一直等到作业完成。因此,只要我们的电路在队列中等待,它就会等待。因此,整个循环无法继续。但是它在提交下一个电路执行之前等待结果。
为了防止代码等待,我们必须在使用结果之前将所有电路提交给 IBM cloud。因此,我们需要把execute_with_cdr
功能拆开。
第一步,我们准备训练电路。我们将这个与代码的其余部分分开,因为我们在执行之前和之后都需要这些电路。
我们剥离了这个函数,只包含生成训练电路所需的部分。但是我们接手的那些部分保持不变(见原函数)。
现在,让我们使用这个函数来创建电路列表。出于这个目的,我们首先重用以前帖子中的一些东西,比如创建量子电路的get_circuit()
函数,我们的目标是计算它的可观测期望值。此外,我们定义了这个可观察值(obs
)和无噪声模拟器(sim
)。
一旦我们准备好电路,我们就像最初的 Mitiq 代码一样重新组织它们。
我们将想要运行的电路存储在to_run
变量中。因此,现在让我们创建一个函数,将这些电路一次性提交给 IBM cloud(不等待结果)。
submit_to_jakarta
函数接受to_run
列表、可观察值、每条电路的运行次数(shots
)以及我们想要运行电路的backend
。在这个函数中,我们声明了另一个函数submit_executor
。这是我们作为执行器使用的回调函数。在这个函数的实现中,我们只准备电路(transpile 和 assemble)并发送到backend
后端。执行程序不返回结果,而是返回一个job
。这是提交给给定后端的量子电路的本地引用。submit_to_jakarta
函数收集所有的jobs
并返回它们。
在我们使用这个函数之前,我们需要连接到我们的帐户并获得一个允许我们访问后端(这里是jakarta
)的提供者(您需要使用不同的参数值来连接到ibmq_quito
)。这篇文章更详细地解释了如何做到这一点。
让我们看看调用这个函数时会发生什么。
输出是一个作业对象列表。前往你的 IBM 量子控制台。当您在“最近的工作”中点击“查看全部”时,您会看到这些工作已经到达 IBM,它们正在等待处理。您还可以看到大致的执行时间。在我的情况下,他们今天根本不会运行,因为有超过 140 个其他电路在排队等候。
如果我需要更多的动力来推动我们今天所做的事情,这就是了。
至少,等待这些作业运行给了我足够的时间来完成这篇文章。
当然,在我们等待结果的时候,你不会想让你的电脑一直开着。所以,我们需要坚持这些工作。幸运的是,每个作业都有一个 id,我们可以用它在以后取回。如果您使用 Jupyter 笔记本,您可以简单地将 id 打印到单元格的输出中,并将它们保存在笔记本旁边。
'6218d0f147f37310a6377ee0',
'6218d0f3a2eeaa7a80ad27c8',
'6218d0f48c4ac898e4687d1c',
'6218d0f5a2eeaa782fad27c9',
'6218d0f7f0b807c602db65b0',
'6218d0f8a16487a0ade6eb39',
'6218d0fa3895be83e73e214f',
'6218d0fbf0b8079824db65b1',
'6218d0fc5ac21f18a4473086',
'6218d0fe976d9fc87220be83',
'6218d0ff3f99d49bef399494',
我们看到 11 个作业 id 的列表。
您可以使用它们通过jakarta.retrieve_job("JOB_ID")
功能获得一个新的作业对象。所以,让我们把这些放入一个数组,我们可以使用它。这里,我使用以前运行的 id。
我们可以很容易地将 id 列表映射到实际作业列表。
[<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c154f7b50>,
<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c7c5c61c0>,
<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c154513a0>,
<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c151c2370>,
<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c422d01c0>,
<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c14b50fd0>,
<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c18978520>,
<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c14e90400>,
<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c14e909a0>,
<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c14e90d00>,
<qiskit.providers.ibmq.job.ibmqjob.IBMQJob at 0x7f5c14e90ac0>]
一旦这些工作完成,我们就可以获得它们的结果,而无需进一步等待。
Result(backend_name='ibmq_jakarta', backend_version='1.0.28', qobj_id='471fdd0a-c273-4ea4-aded-28f0ed4b0ed7', job_id='6216307c89a5f0ba67accdc8', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0x0': 238, '0x1': 41, '0x2': 49, '0x3': 696}), header=QobjExperimentHeader(qubit_labels=[['q', 0], ['q', 1], ['q', 2], ['q', 3], ['q', 4], ['q', 5], ['q', 6]], n_qubits=7, qreg_sizes=[['q', 7]], clbit_labels=[['meas', 0], ['meas', 1]], memory_slots=2, creg_sizes=[['meas', 2]], name='circuit-3333', global_phase=4.71238898038469, metadata={}))], date=2022-02-23 13:17:22+00:00, status=Successful completion, status=QobjHeader(backend_name='ibmq_jakarta', backend_version='1.0.28'), execution_id='ec06e180-94aa-11ec-ac54-bc97e15b08d0', time_taken=5.931757688522339, error=None, client_version={'qiskit': '0.33.0'})
因此,让我们编写另一个处理作业结果的函数。它需要工作和可观察的事物。同样,我们在这个函数中定义了一个执行实际工作的执行器。
[0.9172392848406065,
0.5629408486360803,
0.4802712135216911,
0.8463795975997012,
0.8463795975997012,
0.7204068202825363,
0.6259272372946627,
0.7322167681560205,
0.7400900667383433,
0.7440267160295047,
0.1417193744818105]
当我们处理作业时,我们会收到一个期望值列表。类似于 Mitiq 的原始函数,我们需要将这些与我们从模拟器中获得的无噪声测量值结合起来。因此,让我们也执行这些步骤,以获得减少误差的测量。
1.0135726520354982
因此,让我们来计算理想值(无噪声)和未优化的测量值。当我们创建要运行的电路列表时,第一个是未修改的电路。我们也可以用这个来计算未优化的测量。
最后,我们可以计算并打印缓解的关键性能指标。
Error (unmitigated): 0.06987552491811488
Error (mitigated with CDR): 0.026457842276776833
Relative error (unmitigated): 0.07078763708873381
Relative error (mitigated with CDR): 0.026803206694106713
Error reduction with CDR: 62.1%.
结果显示误差减少了 60%以上。尽管这不如我们在以前的帖子中实现的模拟测量的缓解效果好,但相对于未缓解的结果来说,这是一个不错的改进。
量子机器学习要不要入门?看看 动手量子机器学习用 Python 。
在这里免费获得前三章。
数据网格:使气候数据易于查找、使用和共享
原文:https://towardsdatascience.com/making-climate-data-easy-to-find-use-and-share-5190a0926407
准确、可用和一致的可互操作气候数据对于解决我们的全球气候危机至关重要。这是 OS-Climate 如何使用数据网格使气候数据更容易查找、使用、共享和管理。
卡塔丽娜·若昂在 Unsplash 上的照片
OS-Climate 正在应对气候和 ESG 数据挑战
OS-Climate (OS-C)正在应用开源功能来帮助组织有效地利用 ESG 数据。结合开源分析工具,企业、金融机构、政府和民间社会可以利用这些数据提高物理风险和弹性、转型分析以及投资组合与净零和适应目标的一致性等领域的透明度和洞察力。OS-C 的愿景是大幅推动全球资本流入气候变化缓解和复原领域。
OS-C 的使命是帮助组织确定他们是否在与巴黎协议目标和 ESG 价值观一致的公司中运营、投资或合作。为了做到这一点,OS-C 正在构建开源工具的技术基础,以组织和提供气候和 ESG 数据。
但道路上有一个根本性的潜在障碍:可信的气候 ESG 数据极难发现、消费、分享和管理。
为了克服这一障碍,OS-C 开始采用“数据网格”原则,目标是让 ESG 和气候数据更容易查找、使用、共享和管理。
这篇文章描述了 OS-C 的数据网格之旅。
可信的气候数据很难找到、消费、分享和管理
ESG 和气候数据是 OS-C 的基础促成因素。但是这些数据几乎每时每刻、每天每年都在变化:
- 随着基础设施被用来获取排放数据,以及越来越多的公司选择发布其排放数据,ESG 和气候数据的数量正在激增。
- 随着更多不同数据的出现,ESG 和气候数据的可变性呈指数级增长。
- ESG 和气候数据的价值正在急剧增加,因为监管机构和投资者都要求访问这些数据。
这种情况因为一个根本性的挑战而变得复杂:ESG 和气候数据很难发现、消费、共享和管理。ESG 和气候数据是:
- 分布在数千个数据源中,很难找到。
- 无结构,难以理解和消费。
- 不一致,难以共享、比较和汇总。
图 1,目标:使 ESG 和气候数据易于查找和使用
OS-C 的目标是克服这些障碍,使 ESG 和气候数据易于查找、消费、共享和管理。为了实现这一目标,OS-C:
- 创建一个数据产品生态系统(也称为数据网),使 ESG 和气候易于查找、理解和信任。
- 建立一个符合数据网格原则的联合来源和治理模型,将公共数据或任何人都可以使用的“开放”数据,以及在气候数据生产者和消费者之间强加定制合同的私人数据结合起来。
- 设计一个符合数据网格原则的“自助式”数据平台,以释放 ESG 和气候数据。
OS-Climate:建立环境、社会和治理/气候数据产品生态系统
数据网格现在正成为解决大型企业大规模数据挑战的一种现代方法。但是,使数据网格对企业如此有价值的原则也使它成为解决 OS-C 及其生态系统合作伙伴正在应对的数据挑战的理想方法。
但是什么是“数据网格”呢?首先也是最重要的一本书是扎马克·德赫加尼(Zhamak Dehghani)的《数据网格,提供大规模的数据驱动价值》(Data Mesh)。这里有许多很棒的文章这里(模式)、这里(架构)、这里(原则)和这里(经验教训),它们将提供关于数据网格更详细的技术信息。
出于我们的目的,我们将数据网格定义为一个交互“数据产品”的生态系统。简单地说,数据产品是将数据视为产品的一种方式。每个数据产品:
- 有一个清晰的边界,
- 参与生产者和消费者的生态系统,
- 使用一个平台来简化数据的查找、消费、共享和管理,
- 发布元数据,实现自助服务和发现,
- 遵守一套明确的治理标准,同时尊重地方自主权。
图 2,OS-C 正在介绍 ESG 和气候数据产品
我们应用数据网格原理的原因基于以下基本原理。
首先,应用数据网格原则将使 ESG 和气候数据产品更易于查找、消费、共享和管理:
- 数据网格定义了数据域,即可信的 ESG 和气候数据的公认边界和位置,这为在高度分散和多样化的 ESG 和气候数据环境中查找数据提供了至关重要的第一步。
- 数据网格识别数据域的所有者,这将使个人或团体能够提出如何使数据可消费。
- Data Mesh 实施了一种“自助式”模型,其中通过标准且一致的机制(例如,通过 API 或其他通用/开放方法)访问数据域**,从而简化了组织内部和组织之间的数据共享**。
- Data Mesh 提供了一个“联合”治理模型,该模型为数据所有者提供了最有效地尊重地区需求和多样化监管要求的本地自主权,同时还使数据的治理和可信度更容易联合。
其次,通过应用这些原则,OS-C 可以建立一个数据产品的生态系统(也称为数据网格),其中每个气候数据产品都是可发现的、可寻址的、可互操作的、自描述的、可信赖的、安全的。
OS-Climate 的 ESG 和气候数据产品生态系统将使用开源组件实现数据网格功能,包括:
- 使查找数据变得容易的数据目录,
- 使访问数据变得容易的通用通信服务,
- 具有明确界限和所有者的分布式“数据产品”,以实现快速决策,以及,
- 每个数据产品中的 API 使得访问和共享数据变得容易。
图 3,OS-C 的 ESG 和气候数据产品生态系统
借助这些数据网格功能,数据产品将使环境、社会和气候数据更易于查找、消费、共享和管理,这将带来更好、更快的洞察,缩短环境、社会和气候数据的上市时间,降低环境、社会和气候数据可用性和可访问性的成本和开销。
操作系统环境:建立联合采购模型
为了与数据网格联合治理原则保持一致,OS-C 正在建立一个“联合采购”模型,该模型结合了公共数据或任何人都可以使用的“开放”数据,以及在气候数据生产者和消费者之间强加定制合同的私有数据。
图 4,OS-C 的气候数据联合采购模型
OS-C 的联合采购模式将努力创建“共享”数据,我们在其中建立了有限使用的优先许可,从而使 ESG 和气候数据更易于消费和共享。我们预见到一种“气候数据即服务”的能力,这种能力默认是开放的,但有访问和使用封闭数据的明确许可。这种方法是仿照 IB1 (破冰船 1)建立的惯例。
OS-Climate:创建自助式 ESG 和气候平台
OS-C 正在建立一个“自助式”平台,使 ESG 和气候数据易于查找、消费和共享。
图 5,走向自助式 ESG 和气候数据平台
OS-Climate 预见了一个开源产品的生态系统,该生态系统提供“从模型到微服务”的能力,涵盖各种关键群体,包括商业领袖、数据科学家、开发人员和运营人员。流行的开源工具被集成到 OS-C 的 ESG 和气候数据价值链中,包括 Spark、Kafka、Jupyter、Trino 和 Prometheus 等等。
OS-C 的目标是让价值链的每个元素都以“自助”的方式构建,从而为全球 ESG 和气候数据社群提供本地自主权和控制权。
图 6,数据网格——支持 ESG/气候数据价值链
为了支持这些功能,OS-C 将投资一个“ESG/气候数据产品工厂”,该工厂拥有可重复的模板和流程,可以轻松构建、保护、部署和管理数据产品。
值得注意的是,OS-Climate 正在将这些数据产品开发为公共产品,这些产品不是为了与商业数据提供商的数据产品竞争,而是为了支持商业提供商的商业创新,如 OS-Climate 成员 S&P 全球和伦敦证券交易所集团
总结想法
气候变化是一场危机,影响着这个奇妙星球上的每一个人。OS-Climate 正在采取几个步骤,使组织、政府和非政府组织更容易发挥作用,帮助解决这场危机。
OS-Climate 是实践和行动的共同体。他们欢迎来自数据工程师、数据科学家、软件工程师、分析师、主题专家、产品领导和项目经理的贡献,无论贡献大小。加入我们来构建、发展和改进 OS-Climate,以实现更好的气候成果!联系 OS-Climate 或点击此处了解更多信息。
关于操作系统-气候
OS-Climate (OS-C)是一个非盈利、非竞争性的组织,其大胆的使命是使用开源工具来统一解决气候变化(我们时代的重大挑战之一)所需的 ESG 和气候数据。
OS-C 的愿景是根据所有相关醋酸领域和基于科学的方法学的最佳奖学金,将全球最佳可用数据、建模、计算和数据科学聚合到一个人工智能增强的物理经济模型中,该模型的功能类似于操作系统,能够在未来与过去截然不同的世界中为气候综合投资提供强大的应用。
OS-C 的目标是迅速加快全球投资从相对 GHG 密集型和易受气候影响的公司、技术和基础设施向财务上可持续和高影响力的缓解、复原和适应项目的转移,特别是在发展中国家,以及设计更好的政策,有效地让资本市场参与应对气候变化。
图 7,OS-Climate——用于 ESG 和气候数据的开源工具
OS-C 平台将加速基于情景的预测分析工具的开发,以管理与气候相关的风险,并加速投资产品的开发,以资助各个地区、部门和资产类别的气候解决方案。OS-C 开源实践和行动社区——使用 Linux Foundation 的高度发展的许可、结构化协作和社区管理工具——将服务于利益相关者社区,并使优先数据和建模需求方面的工作协调一致,将共享资源集中在执行这些优先事项上,并加快采用。
OS-C 是由跨越银行、资产管理公司和技术供应商的国际贡献者团体发起的。OS-C 正在使用开源技术开发满足巴黎协议气候目标所需的数据和工具。更多关于 OS-Climate 及其使命、愿景和路线图的信息可以在这里找到。
下面列出了其他操作系统环境资源:
- 通过开源和数据网格架构释放气候相关数据(文森特·卡尔代拉/埃里克·厄兰森,ODSC 西部,2021 年 11 月 17 日)
- 通过开源气候数据平台为气候融资行动提供动力(文森特·卡尔代拉/埃里克·厄兰森,2022 年红帽峰会)
Eric Broda 是 OS-Climate 的一名架构师,也是 Broda Group Software 的总裁,Broda Group Software 是一家致力于帮助企业加速数据网格之旅的精品咨询公司。
除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作或经许可使用。图像中使用的图标是普通的 PowerPoint 图标,不受版权保护。
本文表达的观点仅代表我个人,并不代表我的客户的观点。
根据实时传感器数据做出决策
原文:https://towardsdatascience.com/making-decisions-from-live-sensor-data-1febf8db9464
物联网发展
如何在 Azure 中为实时数据分析设计可扩展的物联网架构
利用数据来洞察问题可能很困难。无论是您拥有的数据量、您可以收集数据的速度,还是数据本身的质量,成为数据驱动都有许多障碍。然而,还有另一个问题,也许是更基本的问题:你根本没有收集到做决定所需的信息。这个可能很难修复。
你经营一家工厂,你想知道你的生产线什么时候会出现故障。你在一家商店工作,想知道大楼里的人流量。你想知道你公寓的温度,这样你就可以相应地调节暖气。这有时是很难得到的数据!然而,有一个解决方案:有针对性地部署物联网(IoT)传感器,旨在收集做出决策所需的特定信息。
这篇文章就是关于这样做的实用性。我们将主要关注能够处理来自众多传感器的实时数据的软件堆栈的创建和部署。这个架构将必须能够分析数据,做出人工智能/人工智能预测,并最终可视化一切。这将集中在 Azure 技术上,尽管我确信有亚马逊(或其他云服务)的等价物。首先,我们将花一点时间预先讨论硬件考虑事项。
这篇文章讲述了我为了解如何管理和使用物联网设备而经历的旅程。该解决方案可能并不完美,但我希望它能让您在构建自己的架构时有所考虑。
本文基于我最近在东北数据科学会议上发表的演讲“从任何事物中获得洞察力”
五金器具
所以,如果我们想把传感器放在现实世界的某个地方,我们会有一些限制。天真地,我认为一个好的 Arduino 或 Raspberry Pi 是我所需要的。然而,现实世界有其他想法。以下是现实世界部署的一些考虑:(一)便宜吗?(ii)您如何为其供电?(iii)您如何将其连接到互联网?㈣安全吗?
一个树莓派可能看起来符合这些类别中的大部分!我花了很长时间开发一个电池供电、支持 3G、装满传感器的系统。但是,事实是这些大多是开发设备。要让工厂、政府大楼、学校等舒适地容纳一大群人是很困难的。它是 IP67 等级的吗?即使在一种情况下,是否防尘?耐摔?你确定电池安全吗?(事实上,锂离子电池相当危险!).坦率地说,一个有电缆和传感器的电路板会让人紧张——他们想知道这是不是合法的?挑战不胜枚举!带试验板的 Raspberry Pi 和生产就绪系统之间的差距是巨大的。当你跨过那道鸿沟时,你可能会意外地发现自己进入了硬件行业。我很晚才知道这个。
这里的解决方案是找到一个生产就绪的传感器设置。我了解了传感器制造商蒙尼特公司。他们提供了一个集线器,通过 3G sim 卡连接到 Azure。理想—我们不需要连接一个公司的 WiFi(把陌生的设备连接到 WiFi 会让网络安全的人很紧张!)该集线器还连接到一组传感器,从温度/湿度到二氧化碳和加速度计。
Monnit 设备有各种各样的传感器可用于与集线器通信。图片作者。
这些传感器具有超长的电池寿命,Monnit 声称(我的测试也支持这一点),它们可以在不充电的情况下持续多年。理想——没有烦人的电缆挂在周围,也不需要人们不断给它们充电!重要的是,它们很便宜,符合工业标准。谈到物联网数据收集,这些是我首选的硬件。
因此,例如,我们可以将加速度计连接到工业锯上来测量振动(一个很好的故障指示器),并让传感器将振动发送到 Monnit hub,mon nit hub 又将数据放入 Azure 进行分析。
软件
硬件决定后,我们需要整理软件。我们的软件解决方案需要考虑多个方面,而使用 1 Raspberry Pi 的较小项目可能不会考虑这些方面:(I)我们如何处理多个设备及其设置,(ii)我们如何处理和存储传入的实时数据,以及(iii)如何使其可扩展,确保它可以与 1 或 1,000 个传感器一起工作。
为此,我们将完全留在 Azure 生态系统中。让我们先来看看我们的架构:
提议的系统架构。图片作者。
我们将这个过程分成三个独立的部分。这样做的目的是有一个通用的“中间”层,清洁的传感器数据和其他实时数据最终可以到达该层。对于在这里访问它的用户来说,它现在应该是“通用的”——他们不需要关心硬件本身。我们可以进出其他传感器或 API 调用,访问数据的人不会受到影响。
让我们浏览一下架构,并解释这些服务是什么以及为什么选择它们。
流式数据输入
- 物联网中枢:这是 Azure 为物联网设备管理提供的服务。在这里,我可以注册设备并控制它们的固件。它还允许我向设备发送信息,并接收信息。在这种情况下,我收到的信息是来自传感器的数据。
- 功能:微软将其描述为“功能即服务”(为什么现在什么都是服务了?).函数是无服务器的计算,允许你编写由一个动作触发的代码,而不需要处理它将以任何方式运行的硬件。留在 Azure 栈中的好处是你不必硬编码文件路径(通常)。通常,你可以将它指向另一个 Azure 服务,并告诉该函数在该服务被使用时触发。例如,当物联网中心收到消息时,或者当文件被放入存储时,可以触发功能。此外,它们非常便宜——一些粗略的数学计算表明,2 亿次函数调用可能花费 35 美元左右。
在这个架构中,我们使用了一个函数来清理一些特别杂乱的数据(稍后会详细介绍)
通用事件处理
- Event Hub :这是(非常松散的),没有设备管理的物联网 Hub。我们希望有地方存放所有的数据。某个通用的地方,其他开发人员可以调用它来访问我们收集的信息,不管它来自什么物联网设备,甚至完全来自另一个来源(即调用 API 来获取实时天气数据)。
已经被清理并落在这里的事件现在可以进行分析了。
现场/历史
- 流媒体分析:微软的命名惯例有时会非常字面化。流分析(SA)是一个处理流数据分析的平台。如果你看看微软为物联网设置提供的大多数架构图,SA 通常直接连接到物联网 Hub。然而,我们发现这很难做到。该服务使用一种类似 SQL 的语言,这种语言非常严格,我们发现在 s a 中清理数据和执行分析是不可能的。有人建议我们开始将一个 SA 实例通过管道传输到另一个,但这很快变得非常昂贵。因此,在 SA 执行分析之前,清理由函数完成。
SA 使用的语言非常适合执行窗口和聚合等操作。你可以快速形成移动平均线,并为下一阶段准备数据:可视化 - Power BI :到目前为止,一切都是现场发生的:SA 由 Event Hub 触发,由 Functions 活动触发,Functions 活动正在观察物联网 Hub 的输出。我们将继续让 Power Bi 实时绘制数据。Power Bi 是模型优先的 Bi 解决方案,而不是可视化优先的 Bi 解决方案。我认识的一位非常聪明的 Bi 开发人员曾经说过这句话,我听得一清二楚,现在我还在不停地重复这句话。我认为 Power Bi 有一个非常强大的建模引擎和一个强大的查询语言(DAX)。最后,这也是非常好的观想。
台式机上的 Power Bi 有一些刷新限制,但有一个仅在线的仪表盘版本是真正实时的。您可以将流分析直接指向这个实时仪表盘,从而简化集成。在上图中,我们定期将数据存入存储器。这在传统的电力商业智能中显露出来。
这种设置允许我们处理实时数据和历史数据。它允许我们从同一系统访问物联网数据和其他实时来源。拥有物联网中心让我们能够进行设备管理。最后,Azure 工具具有很好的可扩展性——函数调用既便宜又快速,你可以在物联网中心免费获得成千上万条消息,Power Bi 将能够处理巨大的数据集。
获得洞察力
到目前为止,我们的解决方案可以处理实时数据,并通过流分析对其进行深入分析。然而,下一步是用 Azure 让我们访问的机器学习堆栈进行更深入的数据分析。
Azure 机器学习,或时间序列分析,是将数据科学应用于物联网数据的好选择。图片作者。
我觉得有趣的两项服务是:
- 时间序列分析:同样,微软的命名惯例非常字面化。时间序列分析(TSA)正如它所说的那样:它允许您将预先构建的标准时间序列分析技术应用于时间序列数据。事实上,您可以直接将其指向 IoT Hub 的一个实例。我在这里的保留来自于使用流分析:关于集成到物联网中心是多么容易的承诺,我最终需要增加功能。这一点也会如此吗?
- Azure 机器学习 : Azure 的机器学习服务棒极了。它是我开发机器学习的首选工具。它具有大量的功能(模型跟踪、管道和几乎所有现代 ML 平台的功能),是实现机器学习模型的好选择。您可以将它指向存储,并使用它对我们刚刚收集的历史数据执行分析。结果可能会在 Power Bi 中浮出水面
正如我在开始时说的,这也是我正在进行的一段旅程。这个末端部分,尖锐的分析部分,是最不发达的。然而,Azure 为探索提供了很多选择。
结论
很难洞察你想要理解的每一个过程。有时候,你根本没有数据来做你想做的决定。然而,在某些情况下,您可以部署廉价、灵活、非侵入性的物联网设备来执行高度有针对性的数据收集。这些数据可以用来帮助你做出正确的决定。
本文的大部分内容都在讨论我构建的软件栈,它用来处理从各种不同传感器收集的实时数据。它非常关注 Azure 技术。它利用物联网中心来处理设备和数据登陆,利用功能来清理一切,利用流分析来获得一些见解,并利用 Bi 来实现实时数据可视化。
展望未来,Azure 提供了两个(可能不止这些!)有趣的工具来自动化决策,并从我们收集的数据中获得更多知识:时间序列分析和机器学习。展望未来,我期待着玩这些更多!
我希望你喜欢这篇文章,并且对创建你自己的架构有用!
安德鲁·布朗斯
请在 Medium 上订阅我,以跟踪任何令人兴奋的未来文章!也可以在这里联系: LinkedIn | Twitter
让深度学习变得气候友好
原文:https://towardsdatascience.com/making-deep-learning-climate-friendly-74ed4f2404e2
如何解决人工智能的碳足迹
佩吉·安克在 Unsplash 上的照片
深度学习正在给世界带来许多好处:解决 50 年的蛋白质折叠问题,检测癌症,改善电网。虽然深度学习推动了很多事情,但我们也需要考虑成本。
在寻求更精确和更通用的模型的过程中,网络规模和功耗出现了爆炸式增长。似乎每年模特的尺寸都在飙升。2020 年,GPT-3 发布,拥有1750 亿参数和 460 万美元的理论培训成本,拥有市场上价格最低的 GPU 云。
不到一年后,谷歌发布了参数超过万亿的 Switch Transformer。OpenAI 发现,同类最佳大型模型所需的计算能力每 3.4 个月翻一番(六年内翻了 300,000 倍)。随着参数的指数增长,能量也有了指数增长。
人工智能研究人员和工程师如何解决这个问题?
迪伦·吉利斯在 Unsplash 上的照片
神经架构
常识告诉我们,模型越大,结果越好。然而,情况并非总是如此。谷歌研究刚刚发布了一份元分析,展示了更高的预训练准确度如何达到饱和点。随着模型精度的提高,其被微调以解决特定任务的能力*(即迁移学习)*并没有同样快速地提高。在某些时候,精度甚至会降低。
当您开始质疑更大的模型是否总是答案时,探索改进当前架构的机会就来了。更多的努力被放在架构选择上,像 进化算法这样的工具被用来为一项任务选择最佳的神经架构,从而大大减少了所需的计算量。
另一个引起兴趣的领域是彩票假说,其中神经网络的密集子网络(“彩票”)可以被训练以实现与整个网络类似的性能。以前,这只能在训练完整个网络后才能完成,但是我在这里详细讨论了这些彩票是如何更早地被发现的。
这些方法挑战了越大越好的观念。与此同时,他们跳过了训练大型模型的成本,只修剪模型的大部分。相反,他们直接跳到最佳架构,使训练模型更便宜、更快、更节能。
数据移动
虽然训练大型模型消耗大量的能量,但是大部分能量都用于推理(80–90%)。理想情况下,像 ResNet50 这样的模型被训练一次,然后在应用程序中使用多次。结果,大量的努力进入了推理阶段。这里最大的领域是数据传输。缩小我们的网络规模是有帮助的,但之后,无论如何数据都必须通过。这有软件和硬件方法。
软件
在软件方面,数据类型选择是关键。虽然某些应用程序可能需要更高精度的数据类型,但在其他应用程序中,它们可能不会提高模型性能。精度较低的数据类型需要传输的数据较少,比如 16 位浮点数与 32 位浮点数。不同的公司正在创建不同的数据类型,进一步减少数据大小和处理需求,如微软的 MSFP。
经常运行的模型也可以利用**批处理。**批量发送请求通常比发送单个请求或数据包更有效。
硬件
在硬件方面,确保数据紧密相连非常重要。深度学习服务器和客户端之间的共享内存比来回发送更有效。在你的 iPhone 上做边缘机器学习更高效(也更安全!)比把这些数据发送到苹果的数据中心要容易得多。数据越接近,需要传输的数据就越少。
也有针对不同深度学习应用的专门芯片,如 Eyeriss ,它通过可重构的片上网络最大化数据重用。
压缩也常用于最小化传输的数据,因为压缩数据比直接发送数据需要更少的资源。这对于稀疏网络来说尤其如此,在稀疏网络中,许多技巧被用来利用稀疏性。稀疏也是剪枝的一个常见动机,因为在存储和计算中 0 值的条目通常可以被忽略。
克林特·王茂林在 Unsplash 上拍摄的照片
数据存储
除了数据移动,数据存储是另一个丰富的硬件节能领域。当深度学习从大脑中获取灵感时,研究人员会查看大脑的能效。大脑的效率高达深度学习的 1000 倍。不像我们数字计算机世界的 1 和 0,大脑的突触看起来更像模拟系统。随着大脑学习和遗忘,信号变得越来越弱。利用这种更加连续的模拟光谱,研究人员已经创造出更接近大脑能量效率的系统(T21)。
以类似的方式,其他形式的计算正在被探索。比如存储光子而不是电子,一次以多种状态表示数据(量子计算)。这些可能是更有效的存储数据的方式。
结束语
深度学习已经为世界做了很多好事,它有潜力做得更多。随着人工智能使用的增长,提高其效率变得至关重要。研究人员正在将神经结构和大小视为一个关键领域。与此同时,他们正在探索降低数据存储和数据传输成本的方法,影响了大多数技术,包括你正在上阅读这篇文章的设备。
在 Matplotlib 中制作经济学家风格的绘图
原文:https://towardsdatascience.com/making-economist-style-plots-in-matplotlib-e7de6d679739
作者照片
在 Matplotlib 中制作经济学家风格的绘图
推动 Matplotlib 制作精美易读的剧情
你可以在 Deepnote 上找到这篇文章的 Jupyter 笔记本。
如果你喜欢数据可视化,你可能已经在他们的网站或杂志上看到过《经济学人》的的图表。几十年来,它们以简单有效的可视化著称,以简单的方式传达有用的信息。在过去的几年里,我一直被他们的形象所鼓舞。无论我是在 Kindle 上、在网上还是在移动设备上看到它们,它们总是引人入胜,而且能让人理解。这是所有数据科学家在他们自己的可视化中应该追求的东西。
2018 年 10 月,《经济学人》为他们的数据可视化发布了一个专门的博客,名为图形细节。如果你浏览他们的文章,你会发现他们的风格在不同的图表类型中保持一致。这并不是因为他们是一个尽可能快的制造可视化的工厂。相反,这种一致的风格旨在简化它们的可视化,并尽可能快地向读者提供关键信息。
作为一名专注于 Python 的数据科学家,在我的日常工作中,我几乎只使用 Matplotlib 进行数据可视化。我喜欢它,因为它是难以置信的可定制的。每一个元素都在你的掌控之中。虽然我肯定《经济学人》的数据记者使用 Matplotlib 进行探索工作或实体模型(或 R 的 ggplot),但我非常怀疑他们只使用 Matplotlib 进行生产可视化。
然而,我非常喜欢将尽可能多的工作流程放在一个地方。这种想法启发我用 100% Python 和 Matplotlib 重新创建了几个经济学家的图表类型。这个项目我有两个目标。首先,我想举例说明如何在 Matplotlib 中执行出色的图表设计。其次,我想展示一个编程绘图库可以用来创建生产绘图。
请注意,我不会为此制作可重用的函数或库。相反,如果您感兴趣,我希望您可以复制任何您可能想要的代码,并自己重用它。
我将重现《经济学人》常用的三种图表类型:条形图、折线图和哑铃图。但在此之前,让我们先来分解一下经济学家的可视化的关键要素。
请注意,这样做只是为了教育和信息的目的。
《经济学家》的风格
为了了解《经济学人》的可视化风格,我们可以使用他们 2017 年的视觉风格指南。这里是环节。让我们来分析一下《经济学人》风格的常见元素。
标题和副标题
图表通常都有标题和副标题。标题通常是文字游戏,比如食品价格上涨的“不开心的一餐”。副标题将是图表内容的简单陈述。它们总是位于左上方,与图表内容的左边缘齐平。标题总是加粗,比副标题大。
网格线
仅显示水平网格线。次要网格线根本不会显示。网格线的间距符合数据的逻辑,易于理解。
轴和刻度标签
仅显示了水平轴。除此之外,图表数据周围没有其他边界框。在 x 轴上,刻度(标签旁边的小线条)仅在需要显示哪些数据连接到哪个刻度标签时显示。y 轴上没有刻度,只有主要的网格线。y 轴刻度标签位于图表区内主要网格线的顶部。
水平条形图是一个例外。在这种情况下,显示了 y 轴,但没有 x 轴。y 轴刻度标签位于数字的正上方。
颜色;色彩;色调
《经济学人》使用两个图表调色板,一个用于网络,一个用于印刷。我们将把重点放在网络上。主色“经济红”(#E3120B)用于顶行和标签框。样式指南中的灰色(#758D99)似乎用于网格线。用于绘图的颜色有:
- 红色,#DB444B
- 蓝色,#006BA2
- 青色,#3EBCD2
- 绿色,#379A8B
- 黄色,#EBB434
- 橄榄,#B4BA39
- 紫色,#9A607F
- 金色,#D1B07C
风格指南中有更多的调色板用于不同的用途,但这是主要的调色板。每种图表类型的颜色顺序都是不同的,下面我将尝试重现这一点。所有地块将使用白色背景的网络样式。
其他文体要点
一条“经济学人红色”的水平线贯穿图表的整个顶部。一个水平的矩形,他们称之为标签,位于左上角。数据源以 75%的不透明度显示在左下角。
我们可以在下面的章节中讨论特定于图表的样式。
条形图
让我们按照《经济学人》的风格制作一个条形图!下面是《经济学人》中条形图的一个例子。我们将使用来自 Kaggle 数据集的按国家分列的 2020 年 GDP 值(链接)。该图表的目的是按 GDP 值显示排名前 5 位的国家。
《经济学人》通常只使用一个垂直条形图,其中一个或两个分类变量是随着时间进行比较的。对于我们正在处理的数据,水平条形图更合适。这是因为国家名称比较长,如果不旋转的话,它们在 x 轴上不太合适。这将使它们更难阅读。解决方案是将数据推过一些,并将标签放在 y 轴上。
让我们导入pandas
和matplotlib
并读入我们的数据。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# This makes out plots higher resolution, which makes them easier to see while building
plt.rcParams['figure.dpi'] = 100gdp = pd.read_csv('data/gdp_1960_2020.csv')
gdp.head()
这里的 GDP 数据很长。为了便于阅读,我们可以将 GDP 除以 1 万亿。
gdp['gdp_trillions'] = gdp['gdp'] / 1_000_000_000_000
现在,我们只能过滤到 2020 年,并抓住底部 9。我们这样做,而不是按降序排序,因为 Matplotlib 是从下到上绘制的,所以我们实际上希望数据的顺序相反。
gdp[gdp['year'] == 2020].sort_values(by='gdp_trillions').tail(9)
现在我们可以构建我们的图表了。代码在这里有注释。
以及由此产生的图:
作者照片
哇,代码真多!那里有很多东西,值得花时间一行一行地去理解,用评论来理解。
现在让我们继续看折线图。
折线图
折线图可能是《经济学人》中最具标志性的图表。下面是《经济学人》的一个折线图例子。
我们将使用与上述相同的国内生产总值数据,创建一个按国内生产总值排名前 9 名的国家的时间序列图。为了突出中国所走的道路,我们只会用醒目的颜色显示美国和中国,其他 7 个为灰色。
首先,我们可以从前面的代码中得到我们想要过滤的国家的名称。
countries = gdp[gdp['year'] == 2020].sort_values(by='gdp_trillions')[-9:]['country'].valuescountries# Output
array(['South Korea', 'Canada', 'Italy', 'France', 'India',
'United Kingdom', 'Germany', 'China', 'United States'],
dtype=object)
Matplotlib 在时间序列的日期时间方面做得很好,所以我们可以将日期列转换为熊猫日期时间序列。
gdp['date'] = pd.to_datetime(gdp['year'], format='%Y')
我们的数据已经准备好了,开始密谋吧!
作者照片
这次会有更多的代码。通常情况下,《经济学人》的图表更为方形,尤其是印刷版。我决定把它做得更宽,以便更适合一篇文章本身。
哑铃图
最后一个图表,我们做一个哑铃图。这些图表用于显示分类变量的差异,通常是随着时间的推移。这里有一个来自经济学家的哑铃图的例子。
我们将再次使用 GDP 数据。这次是为了显示前 9 个国家从 1960 年到 2020 年的 GDP 差异。
gdp_dumbbell = gdp[(gdp['country'].isin(countries)) & ((gdp['year'] == 1960) | (gdp['year'] == 2020))].sort_values(by='gdp')gdp_dumbbell.head(5)
作者照片
作者照片
结论
虽然我们已经看到在 Matplotlib 中重现经济学人的图表风格是可能的,但这肯定不容易。对于每个图,都需要几十行代码,每个图都经过几次反复试验才得到上面看到的结果。
正如您在代码中看到的,Matplotlib 中数据的绘制相当简单。然而,对齐文本、行和标签需要手动输入非常具体的自定义位置。这是上面代码中值得改进的一点。
这是一次很棒的经历,在这个过程中我学到了一些关于 Matplotlib 的东西。该库的定制能力继续让我惊叹。也许在将来,我会在 Matplotlib 中构建一个更具重现性的方法来创建打印质量图表。
感谢阅读。我主要在 datafantic.com 的写文章,所以一定要看看我写的更多文章。
如果你喜欢媒体,并且想直接支持我的文章,你可以使用我的推荐链接注册成为媒体会员。
参考文献
让应用程序开发人员更容易使用机器学习
Towhee 可以帮助加速机器学习应用的开发
介绍
试图手工制作算法来理解人类生成的内容通常是不成功的。例如,计算机很难仅仅通过分析图像的低级像素来“掌握”图像的语义内容,例如汽车、猫、大衣等。颜色直方图和特征检测器在一定程度上发挥了作用,但对于大多数应用来说,它们很少足够精确。
在过去的十年里,大数据和深度学习的结合从根本上改变了我们处理计算机视觉、自然语言处理和其他机器学习(ML)应用的方式;从垃圾邮件检测到逼真的文本到视频合成,各种任务都取得了令人难以置信的进步,某些任务的准确性指标达到了超人的水平。这些改进的一个主要积极副作用是增加了嵌入向量的使用,即通过在深度神经网络中获取中间结果而生成的模型工件。OpenAI 的文档页面给出了一个很好的概述:
嵌入是一种特殊的数据表示格式,可以很容易地被机器学习模型和算法利用。嵌入是一段文本的语义的信息密集表示。每个嵌入是浮点数的向量,使得向量空间中两个嵌入之间的距离与原始格式的两个输入之间的语义相似性相关。例如,如果两个文本相似,那么它们的矢量表示也应该相似。
下表显示了三个查询图像以及它们在嵌入空间中对应的前五个图像(我使用了 Unsplash Lite 的前 1000 个图像作为数据集):
作者图片
你在上面看到的这些结果是基于 ResNet50 的图像嵌入模型生成的,这是一个众所周知的纯卷积图像分类模型。嵌入不仅限于图像,还可以为各种不同类型的非结构化数据生成,包括图像、音频、时序数据和分子结构。将多种不同类型的数据嵌入同一个空间的模型,也就是通常所说的多模态嵌入模型,也已经存在,并且正在越来越多的应用中使用。
正如我们将在接下来的两节中看到的,生成这些高质量的嵌入可能很困难,尤其是在大规模的情况下。
训练嵌入任务的新模型
理论上,训练一个新的 ML 模型并使用它生成嵌入听起来很容易:采用最新的和最好的预建模型,由最新的架构支持,并用一些数据训练它。很简单,对吧?
没那么快。从表面上看,使用最新的模型架构来实现最先进的结果似乎很容易。然而,这与事实相去甚远。让我们来看看一些与训练嵌入模型相关的常见陷阱(这些也适用于一般的机器学习模型):
- 没有足够的数据:在没有足够数据的情况下,从头开始训练一个新的嵌入模型,容易出现过拟合的现象。在实践中,只有最大的全球性组织有足够的数据来从头开始培训一个新的模型是值得的;其他人必须依靠 微调 ,这是一个过程,在这个过程中,具有大量数据的已经训练好的模型然后使用较小的数据集进行提取。
- 差超参数选择 : 超参数为常量,用于控制训练过程,如模型学习的快慢或单批训练使用多少数据。微调模型时,选择一组适当的超参数极其重要,因为某些值的微小变化可能会导致非常不同的结果。该领域的最新研究还显示,使用改进的训练程序从头开始训练相同的模型,ImageNet-1k 的准确性提高了 5%以上(这是一个很大的进步)。
- 高估自我监督模型:术语自我监督指的是一种训练程序,其中输入数据的“基本面”是通过利用数据本身来学习的,而不需要标签。一般来说,自监督方法非常适合预训练(即,在用较小的标记数据集对模型进行微调之前,用大量未标记数据以自监督方式训练模型),但直接使用自监督嵌入可能会导致次优性能。
解决上述所有三个问题的一个常见方法是,首先使用大量数据训练一个自我监督的模型,然后根据标记的数据对模型进行微调。这已经证明对 NLP 很有效,但是对 CV 还没那么有效。
使用嵌入模型有其自身的缺陷
这些只是与训练嵌入模型相关联的许多常见错误中的一些。这样做的直接结果是,许多寻求使用嵌入的开发人员直接使用学术数据集上预先训练的模型,如 ImageNet (用于图像分类)和 SQuAD (用于问题回答)。尽管目前有大量的预训练模型可用,但为了提取最大的嵌入性能,应该避免几个陷阱:
- 训练和推理数据不匹配:使用由其他组织训练的现成模型已经成为一种流行的方式来开发 ML 应用程序,而不需要数千个 GPU/TPU 小时。理解特定嵌入模型的局限性以及它如何影响应用程序的性能是极其重要的;如果不了解模型的训练数据和方法,很容易误解结果。例如,一个被训练来嵌入音乐的模型在应用于语音时会表现不佳,反之亦然。
- 层选择不当:使用全监督神经网络作为嵌入模型时,特征一般取自激活的倒数第二层(正式名称为倒数第二层)。然而,这可能导致次优性能,具体取决于应用。例如,当使用为图像分类而训练的模型来嵌入徽标和/或品牌的图像时,使用较早的激活可能会导致性能提高。这是因为较好地保留了对非复杂图像分类至关重要的低级特征(边缘和拐角)。
- 不同的推理条件:训练和推理条件必须完全相同,以从嵌入模型中提取最大性能。实际上,情况往往并非如此。例如,来自
[torchvision](https://pytorch.org/vision/stable/index.html)
的标准resnet50
模型在使用双三次插值与最近邻插值进行下采样时会产生两种完全不同的结果(见下文)。
照片由 Patrice Bouchard 在 Unsplash 上拍摄
作者图片
部署嵌入模型
一旦您跨越了与培训和验证模型相关的所有障碍,扩展和部署它就成为了下一个关键步骤。同样,嵌入模型部署说起来容易做起来难。 MLOps 是与 DevOps 相邻的一个油田,专门用于此目的。
- 选择正确的硬件:与大多数其他 ML 模型类似,嵌入式模型可以在各种不同类型的硬件上运行,从标准的日常 CPU 到可编程逻辑(FPGAs)。完整的研究论文分析了成本与效率之间的权衡,强调了大多数组织在这方面面临的困难。
- 模型部署平台:有很多 MLOps 和分布式计算平台可用(包括很多开源的)。弄清楚这些如何适合您的应用程序本身就是一个挑战。
- 嵌入向量的存储:随着应用程序的扩展,您需要为您的嵌入向量找到一个可扩展的、更持久的存储解决方案。这就是 矢量数据库 的用武之地。
我自己学着做!
我为你的热情喝彩!需要记住几个关键的事情:
ML 与软件工程非常不同:传统的机器学习源于统计学,这是一门与软件工程非常不同的数学分支。正则化和特征选择等重要的机器学习概念都有很强的数学基础。虽然用于训练和推理的现代库( PyTorch 和 Tensorflow 是两个众所周知的库)已经使得训练和生产嵌入模型变得非常容易,但是理解不同的超参数和训练方法如何影响嵌入模型的性能仍然非常重要。
学习使用 PyTorch 或 Tensorflow 可能并不直观:如前所述,这些库大大加快了现代 ML 模型的训练、验证和部署。对于经验丰富的 ML 开发人员或熟悉 HDL 的程序员来说,构建新模型或实现现有模型可能非常直观,但对于大多数软件开发人员来说,潜在的概念可能很难理解。还有选择哪个框架的问题,因为这两个框架使用的执行引擎有相当多的差异(个人推荐 PyTorch)。
找到一个适合你的代码库的 MLOps 平台需要时间:这里有一个 MLOps 平台和工具的精选列表。有数百个不同的选项可供选择,评估每个选项的利弊本身就是一个长达数年的研究项目。
说了这么多,我想把我上面的陈述修改为:我为你的热情鼓掌,但是我不建议学习 ML 和 MLOps 。这是一个相当漫长而乏味的过程,会占用最重要的事情的时间:开发一个用户会喜欢的可靠的应用程序。
用 Towhee 加速数据科学
Towhee 是一个开源项目,它帮助软件工程师开发和部署应用程序,这些应用程序仅用几行代码就利用了嵌入式技术。Towhee 为软件开发人员提供了开发他们自己的 ML 应用程序的自由和灵活性,而不必深入嵌入模型和机器学习。
一个简单的例子
一个Pipeline
是由几个子任务组成的单个嵌入生成任务(在 Towhee 中也称为Operators
)。通过在Pipeline
中抽象出整个任务,Towhee 帮助用户避免了上面提到的许多嵌入生成陷阱。
>>> from towhee import pipeline
>>> embedding_pipeline = pipeline('image-embedding-resnet50')
>>> embedding = embedding_pipeline('https://docs.towhee.io/img/logo.png')
在上面的示例中,图像解码、图像变换、特征提取和嵌入归一化是编译到单个管道中的四个子步骤——您无需担心模型和推理细节。Towhee 为各种任务提供了预构建的嵌入管道,包括音频/音乐嵌入、图像嵌入、人脸嵌入等等。有关管道的完整列表,请随时访问我们的 Towhee hub 。
方法链接 API
Towhee 还提供了一个名为DataCollection
的 Pythonic 非结构化数据处理框架。简而言之,DataCollection
是一个方法链 API,它允许开发者在真实世界的数据上快速构建嵌入和其他 ML 模型的原型。在下面的例子中,我们使用DataCollection
通过resnet50
嵌入模型计算嵌入。
对于这个例子,我们将构建一个“应用程序”,让我们用一个数字3
来过滤质数:
>>> from towhee.functional import DataCollection
>>> def is_prime(x):
... if x <= 1:
... return False
... for i in range(2, int(x/2)+1):
... if not x % i:
... return False
... return True
...
>>> dc = (
... DataCollection.range(100)
... .filter(is_prime) # stage 1, find prime
... .filter(lambda x: x%10 == 3) # stage 2, find primes that ends with '3'
... .map(str) # stage 3, convert to string
... )
...
>>> dc.to_list()
DataCollection
可用于开发整个应用程序,只需一行代码。下一节将展示如何使用DataCollection
开发一个反向图像搜索应用程序——继续阅读了解更多。
Towhee 培训师
如上所述,完全或自我监督的训练模型通常擅长于一般的任务。然而,你有时会想要创建一个嵌入模型,它擅长于一些非常具体的事情,例如区分猫和狗。Towhee 专门为此提供了一个培训/微调框架:
>>> from towhee.trainer.training_config import TrainingConfig
>>> training_config = TrainingConfig(
... batch_size=2,
... epoch_num=2,
... output_dir='quick_start_output'
... )
您还需要指定一个数据集进行训练:
>>> train_data = dataset('train', size=20, transform=my_data_transformer)
>>> eval_data = dataset('eval', size=10, transform=my_data_transformer)
一切就绪后,从现有运营商那里培训新的嵌入模型是小菜一碟:
>>> op.train(
... training_config,
... train_dataset=train_data,
... eval_dataset=eval_data
... )
一旦完成,您就可以在应用程序中使用相同的操作符,而无需更改其余的代码。
作者图片
一个示例应用程序:反向图像搜索
为了演示如何使用 Towhee,让我们快速构建一个小型的反向图像搜索应用程序。反向图像搜索是一个众所周知的。让我们开始吧:
>>> import towhee
>>> from towhee.functional import DataCollection
对于这个示例应用程序,我们将使用一个小数据集和 10 个查询图像(此处的可用)。使用DataCollection
,我们可以加载数据集和查询图像:
>>> dataset = DataCollection.from_glob('./image_dataset/dataset/*.JPEG').unstream()
>>> query = DataCollection.from_glob('./image_dataset/query/*.JPEG').unstream()
下一步是计算整个数据集集合的嵌入:
>>> dc_data = (
... dataset.image_decode.cv2()
... .image_embedding.timm(model_name='resnet50')
... )
...
这一步创建嵌入向量的本地集合—数据集中的每个图像一个。这样,我们现在可以查询最近的邻居:
>>> result = (
... query.image_decode.cv2() # decode all images in the query set
... .image_embedding.timm(model_name='resnet50') # compute embeddings using the `resnet50` embedding model
... .towhee.search_vectors(data=dc_data, cal='L2', topk=5) # search the dataset
... .map(lambda x: x.ids) # acquire IDs (file paths) of similar results
... .select_from(dataset) # get the result image
... )
...
我们还提供了一种使用 Ray 部署应用程序的方法。只需指定query.set_engine('ray')
就可以了!
结束语
最后一点:我们并不认为 Towhee 是一个成熟的端到端模型服务或 MLOps 平台,这也不是我们的目标。相反,我们的目标是加速需要嵌入和其他 ML 任务的应用程序的开发。有了 Towhee,我们希望能够在您的本地机器上实现嵌入模型和管道的快速原型化(Pipeline
+ Trainer
),允许仅用几行代码(DataCollection
)开发一个以 ML 为中心的应用程序,并允许轻松快速地部署到您自己的集群中(通过 Ray )。
我们一直在寻找人们加入我们的开源社区——如果你对此感兴趣,请随时通过 Slack 和 Twitter 与我们联系。
这就是所有的人——希望这篇文章是有益的。如果您有任何问题、意见或顾虑,请在下面留下您的评论。敬请关注更多内容!
原载于 2022 年 4 月 9 日https://frankzliu.com。
用文字制作图片
原文:https://towardsdatascience.com/making-pictures-with-words-9aac0b97b356
人工智能文本到图像生成器的崛起
当我第一次听这首歌的时候,我还很年轻。我觉得这是一首有趣又朗朗上口的歌,就像一首顺口溜,尽管我不知道这首歌是关于什么的。但这没什么,我只是一个小男孩,听着收音机,看着录像机上的录像。我真的没有太注意标题或歌词。
Dall-E 2 使用文本提示创建的图像“视频杀死了电台明星,在用迷幻灯光演唱 80 年代流行歌曲风格的乐队中演奏”
很久以后,我才意识到歌词的真正含义。
视频杀了电台明星
视频杀了电台明星在我的脑海里,在我的车里
我们不能倒带,我们已经走得太远
画面传来,伤透了你的心
归咎于录像机视频杀了电台明星(道恩斯/伍利/霍恩)
这首歌是塑料时代专辑的一部分,该专辑的主题是怀旧和对现代技术影响的焦虑。虽然这张专辑发行于 40 多年前(1980 年),但这些主题仍然真实而清晰。
生成图像
当抖音开始在他们的应用程序中推出时,你就知道一项技术已经进入了大联盟。仅在本周,我就阅读了几份人工智能文本到图像生成器的前 10 名名单。这项技术炙手可热,模型和创业公司一夜之间如雨后春笋般涌现。每隔一周或一个月,整个思维方式都会被推翻,昨天令人兴奋的技术已经是旧闻了。
最知名的文本到图像 AI 模型当然是 2021 年 1 月发布的 OpenAI 的 Dall-E 。OpenAI 在 2021 年 12 月发布了另一款机型 GLIDE(没事,后面我再说首字母缩写)而之后没多久, Dall-E 2 在 2022 年 4 月公布。至少可以说,发布的速度非常快。
图片由 Dall-E 2 创建,使用文本提示“一名宇航员以逼真的风格租用一匹马”
谷歌备受期待的 Imagen 于 2022 年 6 月发布,尽管它尚未发布,但大量媒体报道已经开始称赞它如何完全超越了王者 Dall-E 2 。
在这股浪潮中, Meta(脸书)于 2022 年 7 月发布了他们的文本到图像工具,Make-A-Scene 。Make-a-Scene 与中的其他场景稍有不同,因为它允许用户根据自己的选择用一个简单的草图来补充文本提示。
就连微软也赶了上来,宣布推出女娲-Infinity ,这是一种人工智能模型,可以从任何给定的文本、图像或视频输入中生成高质量的图像和视频。
是的,视频。
然而,大公司并没有垄断文本到图像的淘金热。在同一个领域有很多小型创业公司。 Midjourney 是一家小型创业/研究实验室(不到 10 人),拥有一批使用其工具创作艺术作品的用户。它于 2022 年 7 月公开测试。
睡前咖啡是另一个流行的工具,来自澳大利亚。该公司于 2019 年 11 月作为神经风格转移应用程序成立,但当较新的人工智能模型在 2021 年年中登场时,他们很快转向图像生成。如今,它自称已经在其平台上创作了超过 500 万件艺术品。
小型人工智能文本到图像初创公司的新宠必须是稳定性人工智能。所以滔滔不绝的报道已经写在上面,他们炒作泛滥。资金也越来越多——一家投资公司表达了对一项交易的初步兴趣,该交易对总部位于伦敦的初创公司 Stability AI 的估值为 5 亿美元。Stability AI 的首席执行官兼创始人艾玛德·莫斯塔克表示:“我们已经谈成了大规模交易,因此与大多数亏损的大公司相比,我们在门口就能盈利。”
它于 2022 年 8 月进行了公开测试,并与它赞助的由慕尼黑路德维希·马克西米利安大学开发的新的强大的稳定扩散文本到图像人工智能模型密切相关。Stability AI 也比其他小型创业公司更进了一步,不仅拥有自己强大的人工智能模型,还迈出了大胆的一步,将该模型作为开源软件发布。
新的稳定扩散模型也不是唯一的开源模型。
6 月 6 日,拥抱脸,一家托管开源人工智能项目和应用的公司,突然看到其托管的人工智能文本到图像应用 Dall-E mini 的流量激增。顾名思义,Dall-E mini 是对 Dall-E 模型的一种改进。
这个应用程序很简单——它只是用文本提示创建了 9 张图片。它之所以广受欢迎,是因为它是可用的,而且是免费的,不像它最初的同名游戏 Dall-E,需要一个等待名单才能加入测试版。Dall-E mini 很快就达到了每天 50,000 张图片,最终迫使创作者将该应用程序从拥抱脸中移除。当 OpenAI 开始注意到并对 Dall-E 这个名字的使用感到不舒服时,它甚至不得不改变它的名字(改为 Craiyon )。
另一个流行的开源文本到图像是 VQGAN+CLIP ,这样命名是因为它结合了两种不同的人工智能模型(VQGAN 和 CLIP)来创建一个强大的文本到图像模型。大约在 2021 年 4 月,瑞安·默多克将剪辑与一个名为比根的图像生成技术结合起来。后来,凯瑟琳·克劳森和其他一些人用 VQGAN 取代了 BigGAN,并把它放在了一个 Google Colab 笔记本上。剩下的就是开源历史了。
截至今天,在 Replicate 中,一家 AI 模型托管公司(拥有出色的 API)拥有 32 个开源文本到图像模型,包括稳定扩散、各种 GAN+CLIP 模型,当然还有 Dall-E mini。
有很多模型。
它是如何工作的
人工智能行业充满了令人惊讶的难以破译的首字母缩写词和行话,而 tex-to-image 子行业也一样模糊,如果不是更模糊的话。如果你涉水通过技术,你会在不同的时间听到甘斯,剪辑,变压器和扩散模型。技术术语可能令人难以置信(自然,它们毕竟是重大研究成果),但我会尽可能简单地解释它。让我们从技术组件开始,然后从那里继续。我不会试图解释神经网络,因为这是已知的。如果你不确定它们是什么,想要一本快速入门,我不久前写了一篇关于它的文章。
变压器
变压器是一个神经网络。斯坦福大学的研究人员在 2021 年 8 月的一篇论文中将变形金刚基金会模型称为,因为他们看到它们正在推动人工智能的范式转变。
神经网络已经被用于分析复杂的数据类型,如图像、视频、音频和文本,并且不同类型的神经网络被设计用于不同类型的数据。例如,CNN(卷积神经网络)经常用于图像数据。
不幸的是,还没有一个真正好的用于语言和文本的神经网络,尽管 rnn(递归神经网络)也经常被使用(在 transformers 之前),尽管它们很难训练并且在处理长段落时有问题。
transformer 神经网络是由谷歌和多伦多大学的研究人员在 2017 年开发的,最初是为语言任务设计的。Transformers 易于训练,因为它可以有效地并行化,并且它有效地取代了 RNNs,成为最终用于许多事情的主要神经网络。
多伦多大学(维基媒体中的知识共享)
今天最著名的变形金刚之一是 OpenAI 的 GPT-3,它是一个巨大的模型,在 45 TB 的文本数据上进行训练,几乎包括整个公共网络。
虽然它最初是为自然语言处理(即语言和文本)而设计的,但它已经用于许多其他事情,包括文本到图像生成器。如你所见,变形金刚无处不在。事实上,这里的其他技术要么完全是变压器,要么将变压器作为模型的一部分。
夹子
CLIP(对比语言-图像预训练)是一个神经网络,它识别图片中的对象,并提供文本片段来描述它们。这听起来像你的老式图像分类器,但它比那更强大。如果对标记数据进行训练,您习惯的图像分类器可以识别图片中的对象,如果对象不符合任何类别,则不会被识别。
另一方面,CLIP 不是使用带标签的图像数据集训练的,而是来自互联网上的 4 亿张图像及其文本描述。因此,它不按类别识别,而是从单词列表中提供图像的文本片段。
CLIP 还创建了一种图像-文本字典,允许图像和文本之间的翻译,这对于文本到图像的人工智能模型非常有帮助。CLIP 本身使用两种不同的转换器作为编码器——图像编码器是视觉转换器,而文本转换器是 GPT-2。
VQGAN
VQGAN(矢量量化生成对抗网络)是另一种类型的神经网络,由海德堡大学的研究人员在 2020 年首次开发。它由一个获取一组图像来学习特征的 GAN(生成对抗网络)和一个获取序列来学习远程交互的转换器组成。
GANs 是一种有趣的机器学习技术,它让两个神经网络相互竞争,这是一场永无止境的争霸赛。其中一个神经网络称为生成器,另一个称为鉴别器。生成器生成模拟真实数据的数据,而鉴别器尝试从生成的数据中识别真实数据。本质上,GANs 创建它们自己的训练数据,生成器和鉴别器之间的反馈回路产生越来越好的结果。
巴特
BART(双向自回归变压器)是由脸书人工智能研究人员创建的神经网络,结合了谷歌的 BERT 和开放人工智能的 GPT 技术。
BERT(变压器的双向编码器表示)的定向方法适用于下游任务,如需要整个序列信息的分类,但不适用于生成数据仅依赖于先前生成的数据的生成任务。GPT 的单向自动回归方法对文本生成很好,但对需要整个序列信息的任务就不太好了。
巴特把伯特的编码器和 GPT 的解码器结合在一起,结合了两者的优点。这对于文本生成和文本理解都非常有用。
传播
扩散是一种生成式机器学习技术,这意味着他们创建的数据看起来像他们接受训练的数据。例如,稳定扩散使用 3 个神经网络、自动编码器和 U-Net 以及 CLIP。
该模型的主要思想是,它获取一幅图像,并对其进行随机置乱,直到它变成纯粹的噪声。然后,它训练一个神经网络,一步一步地将其改变回类似原始图像的东西。这有效地从随机性中生成图像,当给定随机样本时,它甚至可以生成新的图像!
模型
在几个段落中塞进了大量的缩写词和技术!希望对这些技术的作用有一个更清晰的了解,让我们看看如何使用这些技术将模型放在一起。先从 OpenAI 的机型说起吧。
Dall-E 基本上是 GPT-3 的 120 亿参数版本,一个变形金刚模型,用文本-图像对的数据集训练。
GLIDE(用于生成和编辑的引导语言到图像扩散)是具有 35 亿个参数的剪辑引导扩散模型。
Dall-E 2 与 Dall-E 截然不同,更类似于 GLIDE。和 GLIDE 一样,比 Dall-E 小,只有 35 亿个参数。它还使用了一个扩散模型,由剪辑模型指导,然后用 6.5 亿个文本图像对进行优化、精炼和训练。它将从 Dall-E、CLIP 和 GLIDE 中学到的概念整合在一起。
VQGANs 擅长生成看起来彼此相似的图像,而 CLIP 则决定提示与图像的匹配程度。艺术家兼数学家凯瑟琳·克劳森(Katherine Crowson)受瑞安·默多克(Ryan Murdoch)的启发,将这两个模型结合在一起,这一想法首次出现在谷歌的 Colab 笔记本上。本质上,VQGAN 生成候选图像,并对它们进行剪辑排序,直到生成可接受的候选图像。这变得非常流行,有几个模型使用这种方法,并有自己的调整。例如,NightCafe 使用 VQGAN+CLIP 作为其人工智能文本到图像生成器的基础。
由 NightCafe 使用 VQGAN+剪辑创建,带有文本提示“新加坡滨海湾金沙日落油画,作者詹姆斯·格尼”
另一个使用 VQGAN+CLIP 的型号是我前面提到的 Dall-E mini。它基本上是 VQGAN + CLIP,但是使用 BART 对 VQGAN 的文本提示进行编码。
稳定扩散,顾名思义用的是扩散模型。事实上,扩散模型越来越多地被许多公司用作其人工智能模型的基础。例如,Midjourney 也使用扩散模型。稳定扩散是潜在扩散模型(LDM)的开源实现,在 256x256 图像上进行预训练,然后在 512x512 图像上进行微调,所有这些都来自 LAION-5B 数据库的子集。
这是当前技术和模型的快速浏览。
未来如此光明?
所有这些技术都很吸引人,但它们也会对现实世界产生影响。
2022 年 8 月,Jason Allen 凭借一件名为Thétre D ’ opéra Spatial的作品赢得了科罗拉多州博览会的数字艺术竞赛。然而,杰森·艾伦不是艺术家。这张图片是使用 Midjourney 创建的——它接受了艾伦的文本提示,并创建了一个令人惊叹的作品,为他赢得了第一个价格。
不出所料,它引发了对作弊、人工智能产生艺术的伦理的指责,并声称这本质上是一种高科技形式的抄袭。
最后是可以理解的。我自己也走了一半路程,在几分钟内完成了这件作品。如果你熟悉亨利·马蒂斯的作品,这应该会让你想起它。我只用了几分钟就想出了这个。
中途创作——“马蒂斯绘画风格的新加坡滨海湾金沙日落”
当然,新的艺术制作技术总是有争议的。当时的许多画家和艺术家都对照相机的发明感到愤怒。法国诗人兼艺术评论家夏尔·波德莱尔这样评价摄影:“T2 入侵了艺术的领地,成为了艺术最大的敌人”。然而今天,摄影是一种完全不同的艺术形式。
就在几个月前,有人在 MakeUseOf 杂志上写了一篇关于人工智能文本到图像生成器的文章,他用这句话结束了这篇文章。
就像人工智能写作工具一样,虽然最终产品看起来足够“真实”,就像是由人类制作的一样,但它仍然错过了一些东西。艺术家可以添加创意、情感和自我定义的风格,使艺术作品个性化和原创。也许几年后,人工智能也可以进化成那样,但艺术家的工作目前是安全的。
【https://www.makeuseof.com/ai-text-to-art-generators/(2022 年 6 月 11 日出版)
现在看来有点过时了。毕竟,如果一个人工智能模型能想出上面这些图片,艺术家和插画师的工作有多安全?就像艾伦在接受《纽约时报》采访时说的那样:“艺术已经死了,伙计。结束了。人工智能赢了。人类输了。”
冰的故事
在我职业生涯的早期,我听过盖伊·川崎的一次演讲,他是苹果公司的传奇人物和传道者。他讲述了采冰行业的故事(克里斯托弗在迪士尼电影《冰雪奇缘》开始时所做的事情),并谈到技术变革通常不是进化性的,而是革命性的。
在 19 世纪和 20 世纪早期,斯堪的纳维亚国家和北美有一个大型的采冰工业。大块的冰块从湖泊和河流中切割下来,储存在冰库中,然后运送到温暖国家或夏季的家庭和企业。在 19 世纪 90 年代的巅峰时期,美国冰贸易雇佣了大约 90,000 人,并将冰出口到远至香港、东南亚、菲律宾和波斯湾。
19 世纪 90 年代,加拿大安大略省多伦多市的切冰工人(公共领域)
然而,在 20 世纪早期,事情发生了迅速的变化。生产人造冰的冰工厂开始取代天然冰贸易,加上暖冬期间天然冰的稀缺、对天然冰污染的担忧以及来自冰工厂的低成本竞争,促使其最终消亡。在第一次世界大战后的几年里,整个冰贸易崩溃了,随之而来的还有工业和采冰工作。
第二个变化发生在制冰厂开始接管天然冰贸易的时候。1913 年,第一台家用电冰箱 DOMELRE(家用电冰箱)发明并出售。它是革命性的,也是成功的,甚至包括自动温度控制和引入冰块冷冻托盘等创新。到 1944 年,85%的美国家庭拥有冰箱。正如制冰厂取代了冰贸易一样,家用冰箱取代了家庭从制冰厂购买冰的需求。
不幸的是,没有一家冰贸易公司从收获和销售冰转向经营冰厂,同样,也没有一家冰厂公司转向制造冰箱。冰收割机没有成为冰厂工人,冰厂工人没有成为冰箱厂工人。
正如摄影改变了绘画行业,照片编辑改变了艺术和摄影行业,人工智能文本到图像生成器形式的生成艺术也将改变艺术和插图行业。没有人真正知道当前的艺术家和插画师有多擅长曲线跳跃。
下一跳?
transformer 模型是为了解决 2017 年的一个自然语言处理问题而创建的。2020 年,OpenAI 发布了非常受欢迎的 GPT-3 模型,使用了变形金刚模型。这在 2021 年发展成用于软件代码生成的 Codex(现在用于 Github Copilot),也发展成用于文本到图像生成的 Dall-E (2021)和 Dall-E 2 (2022)模型。
文本到图像似乎不太可能是最后的领域。有视频、音频和音乐(有人想唱歌吗?)前方还有更多。我们正处于激动人心的时代,但也有一些可怕的时代。
视频杀死了电台明星,也许人工智能正在杀死艺术家和插画师。下一个是谁?
理解偏差和差异!
原文:https://towardsdatascience.com/making-sense-of-bias-and-variance-a5e639f6bd86
关于两个基本数据科学概念的初级入门书
什么是偏见?
取决于你从哪里听到这个词。我半开玩笑地列出了各种偏见用法的清单,供你娱乐,但在本文中,我们将重点关注一种特殊的偏见——统计偏见——我将在 时刻 解释它。
打靶
带上你的弓和箭!或者水枪。或者飞镖。或者猫炮。如果你是一个优秀的射手,你正在瞄准靶心,那么当你完成后,你的目标会是什么样子?类似这样的?
你对猫炮的异议已被正式记录。
没错。
现在想象你的目标有偏差。你的目标会是什么样子?
点,到处都是点?没有。这就是我们所说的高 方差 ,而不是高偏差。
相反,偏见看起来是这样的:
这一系列图像是作者创作的。
有偏结果系统地偏离标记,但如果方差较低,仍可能紧密地聚集在一起。
在统计中,偏差完全是关于系统的不平衡,而方差衡量的是数据的分布程度。
方差是指数据中有更多的分布。不带偏见的高方差是一种快乐的无能,这种无能是公平分布的。这就是为什么当我玩飞镖的时候,你不想 T21 站在我 20 码以内的任何方向。这足以让你希望我是有偏见的(在镖靶的大方向上)。
正如您从该图中看到的,最差的可能结果是那些具有高方差和高偏差的结果,而最佳组合是使它们都保持较低的结果。
如果你来到这里是因为你对机器学习中一个叫做偏差-方差权衡的概念感到好奇,那么最重要的是要明白,最好的机器学习模型有 无偏差和无方差 。如果你正在训练一个模型,并且你设法让你的偏差和方差都下降了,那就没有必要谈论权衡:如果你成为了一个更好的射手,你就成为了一个更好的射手。(大概是多加练习— 数据!—为了到达那里。)
但是如果你不能在不破坏另一个的情况下改善其中一个呢?如果收紧射击意味着偏离目标呢?为什么会这样?为什么这很重要?为什么大多数自认为理解偏差-方差权衡的人实际上完全误解了它?
我将在这个关于偏差和方差的迷你系列中回答这些问题和更多问题——请自行点击跟随按钮,以免错过。
你的高斯-马尔科夫作者。差异太大了!
延伸阅读:横着走
如果你已经对方差有了充分的了解,我建议阅读我的平行文章,这篇文章使用冠状病毒案例研究来告诉你其他类型的偏差:采样偏差、选择偏差、信息偏差、报告偏差、和确认偏差。
延伸阅读:更深入
你们中的一些人可能希望更深入,尤其是如果你热衷于理解偏差-方差权衡的话。在这种情况下,请继续关注本系列的其余部分……尽管它将变得更加专业。但我会支持你。在你等待下一期文章的时候,你可以通过链接到我温和的自我介绍来获得所有你需要的背景知识,以便理解它。
想知道你是否应该跳过背景阅读?这里有一个核心概念的清单,我假设您在本系列的其余部分已经理解了:
- 人口
- 样品
- 观察
- 参数
- 统计
- 估计
- 估计器
- 预计需求
如果他们中的任何一个不熟悉,这里是我的方便的词汇指南来帮助你。
如果你对机器学习中的偏差-方差权衡感兴趣——这也是本迷你系列正在构建的——稍微熟悉一下 ML/AI 的这些基础知识会有所帮助,我在这里谈到了这些:
- ML/AI 的意义是什么
- 车型
- 损失函数
此外,您应该知道其中每一个的定义,我已经在这里和分别解释了和:
- 预期值
- 随机变量
- 分配
- 概率
- 的意思是
- 差异
放心吧!这些概念比大多数人想象的要简单得多,我的向导会带你慢慢了解它们。快乐学习!
喜欢作者?与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 、 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。
快速理解文本:正则表达式入门
照片由丁诺(Pexels.com)拍摄
介绍
无论您是第一次接触正则表达式,并且有想要理解的文本数据,还是您有研究堆栈溢出问题的经验,希望找到完全相同的用例,而不太理解您正在使用的正则表达式的混乱;当你使用它们来扩展你的经验时,这个介绍将证明是一个有用的基础。
今天我们将讨论三个关键功能和三种关键模式。
正则表达式的简要说明
正则表达式是匹配文本中模式的有用工具。
模式识别对于给定文本串的分类特别有用。例如,假设您有客户的网站数据,但是您想检查给定短语的出现情况;regex 来救援了!
关键功能
我们将使用re
包,并运行以下三个函数:
- 重新搜索()
- 重新拆分()
- re.findall()
够简单!
搜索
定义
搜索允许我们在字符串中搜索给定的模式。如果模式出现在字符串中,函数将返回“匹配对象”,否则返回空值。
例子
假设您想要搜索一个名为 company description 的字符串,以查找包含“tech”的内容。出于示例的目的,让我们假设您将在公司描述中使用单词“tech”来对每个记录进行相应的分类。
调用函数,传递模式和字符串。
company_description = "selling tech products to retailers"
re.search('tech', company_description)
就这么简单,您有一个直接的方法来检测模式的存在。匹配对象本身将包括模式第一次出现的字符索引。
裂开
定义
Split 允许我们将一个字符串“分割”成一个列表中不同的元素。在 split 中,我们使用正则表达式来指定函数拆分字符串的模式。以下是更多相关信息。
例子
假设您希望根据潜在客户当前拥有的技术产品向他们进行营销,并且您甚至拥有这些数据,但不幸的是,每个客户的数据是一个长的连续字符串,用逗号分隔每项技术。
一个简单的解决方案是用逗号(和空格)拆分字符串。
technologies = 'salesforce, gainsight, marketo, intercom'
re.split(', ', technologies)
现在,您已经将每项技术分解到列表中它自己的条目中。
芬达尔
定义
Findall 与 search & match 非常相似。关键区别在于“findall”中的“all”。findall 不只是返回第一次出现的位置,而是返回模式的每次出现。为了便于说明,我们用直接引用的模式来保持事情的简单,但是很快我们将回顾您也可以使用的不同模式。
例子
假设你正在向电子商务公司销售退货处理产品,你浏览了一些潜在客户的网站,希望看看他们是否提供免费评论;在这种情况下,假设“免费退货”的提及量越大,表明注册该产品的倾向越高。
website_text = 'free returns... yada yada yada... free returns... and guess what... free returns'
returns = re.findall('free returns', website_text)
关键模式
现在您的工具箱中有了一些关键函数,让我们通过讨论模式来扩展它们的有用性。
在上面的每个例子中,我们明确地定义了我们的模式;我们现在要做的是回顾如何在更复杂的条件下更快地达到目标。
我们将回顾以下内容:
- 数字
- 话
- 间隔
数字
与前面的例子类似,我们将使用 findall 但在这种情况下,我们将这样做,以找到一个数字的每一次出现。假设我们第一季度的月销售额记录在一个字符串中,我们希望提取这些数字。密切注意我们通过的模式。
string = 'Jan: 52000, Feb: 7000, Mar: 9100'
print(re.findall(r"\d+", string))
让我们将这个命令分成不同的部分:
- 向 python 表明我们将使用正则表达式,这有助于 python 不会对你要做的事情感到困惑。
- 我们使用反斜杠
(\)
告诉 python 按字面意思处理下一个字符。有些情况下,一个“特殊的”字符告诉 python 做一些事情;在这种情况下,python 知道不要做任何时髦的事情。 d
是我们用来表示我们想要的数字。- 不带+号运行同样的操作会将每个单独的数字视为列表中自己的项目。+表示我们希望将符合我们指定标准的完整单词作为一个单独的项目。
话
让我们再做一次,只是把数字换成单词。我们会说我们想要提取月份值。
print(re.findall(r"[A-z]\w+", string))
我们看到这里包含了很多相同的东西:r
、反斜杠、+;但是我们现在看到,我们已经包括了w
,而不是 d。w
是任何字符的指示,从技术上讲,它也可以扩展到其他字符,所以我们指定它是谨慎的。
在\w+
语句之前,我们可以修改我们想要允许的特定字符类型的模式。在这种情况下,我们通过[A-z]
指定包含所有大写和小写字母。
间隔
让我们重温一下之前为re.split
制作的例子。
假设我们不想对逗号进行拆分,而是希望根据空格进行拆分。
print(re.split(r"\s", technologies))
如您所见,考虑到逗号现在是如何被包含在各个项目中的,这真的没有多大用处。如果没有逗号,这将是一个更有用的方法。
结论
你有它!几乎在任何时候,我们已经涵盖了相当多的内容。
你学到了:
3 个关键的正则表达式函数:
- 重新搜索()
- 重新拆分()
- re.findall()
3 种便捷模式:
- 数字
- 话
- 间隔
和一些应该可以帮助你理解 regex 世界的规则。
我希望这可以证明是有用的脚手架,您可以使用它来构建您的正则表达式知识和经验。
我希望你喜欢这篇文章,并希望它对你的工作有所帮助!请分享什么有用,什么没用!
请随意查看我在 datasciencelessons.com 的其他帖子
祝数据科学快乐!
充分利用数据科学团队
原文:https://towardsdatascience.com/making-the-most-of-data-science-teams-cc91371d4fd6
作为技术领导者的经验教训
充分利用数据科学团队中的技能(由 Brooke Cagle 在 Unsplash 上拍摄)
数据科学团队有各种各样的结构,但鉴于他们的专业,数据科学家通常在跨职能团队中工作。跨职能团队由组织内不同工作职能的人组成(例如软件工程师、数据科学家和 scrum masters)。
跨职能团队理想地负责整个价值流,这带来了能够以高度的自主性和速度工作的好处。例如,一个跨职能团队可以拥有一个完整的预测性维护解决方案,包括数据管道、机器学习模型和用户界面。
也就是说,充分利用跨职能团队可能会很棘手。促进团队间的知识共享更加困难,协调不同的工作方式也是一项挑战。
凭借多年的技术领导经验,我想分享一下我对如何成为优秀的数据科学技术领导的看法——不仅仅是技术技能。
1.了解团队中的技能
跨职能团队的领导者面临的一个共同挑战是,他们往往在特定的职能领域更强。例如,以我作为数据科学家的背景,我的优势在于模型的设计和原型制作,而不是软件工程和部署。在计划和设定目标时,这很容易导致偏见和错误的假设。
为了最大限度地发挥团队的潜力,任何领导者都必须了解每个团队成员的个人动机、技能和抱负。在科技公司,这通常与管理职位有关。然而,在我看来,如果你对团队成员的需求和兴趣视而不见,你就不会充分利用他们的技能和潜力。
我建议定期与团队成员联系,并询问以下问题
- 在我们目前的项目中,你最感兴趣的是什么?一般什么样的工作让你兴奋?
- 你想成长的技能是什么?
2.没有跨职能就没有跨职能团队
仅仅让不同职能的团队成员在一个团队中并不能使它成为跨职能的。如果你坚持严格的角色定义,你最终会在角色之间产生技能/责任差距。
工作职能之间的潜在差距以及跨职能团队如何弥补这些差距(图片由作者创建)
根据我的经验,对于团队领导来说,找出这样的差距并扩大职能之间的重叠来解决它们是至关重要的。例如,一个 ML 工程师应该对团队在他们的产品中运行的模型有一个基本的理解。这些交互也有助于 ML 科学家在早期理解非功能性需求(比如运行时性能)。
我认为在团队中跨越职能的最佳方式是设定以结果为导向的目标,这些目标跨越多个职能,不仅鼓励,而且要求协作。
以结果为导向的目标示例:
- “可以在用户界面中看到占位符模型的预测”
- “模型保持应用于新(相似)数据集的预测准确性”
填补空缺的另一个好方法是找到那些想要拓展核心技能之外的团队成员(见第 1 点)。
3.极度的所有权和信任
“领导者必须拥有他或她的世界中的一切。没有其他人可以责怪。领导者必须承认错误,承认失败,承担责任,并制定取胜计划。”乔科·威林克和叶小开·巴宾的《极端所有权》
应用于数据科学团队,“极端所有权方法”意味着领导者应对团队、整个解决方案及其交付负责。如果你没有 DevOPS 方面的背景,并且 CI/CD 管道的问题拖慢了团队的进度,你不能只责怪你的工程师。如果团队成员筋疲力尽,不要只是等待他们的直线经理来解决(或者更糟,让他们离开)。
任何领导者都应该将解决影响团队或交付的问题视为自己的责任——即使这不是他们职责的一部分。
重要的是,极端所有权并不意味着微观管理!使用极端所有权作为技术领导的关键是与团队成员建立信任。对团队成员的技能有了很好的理解,你应该能够预测他们在工作任务或项目时需要多少支持。此外,他们还应该有心理安全感来提出和谈论不舒服的问题,或者在遇到困难时向你寻求帮助。
4.超越你的核心技能
技术领导通常拥有团队中的技术决策,设定技术方向,并向更广泛的组织代表团队的需求。如果你处于这样一个角色(而不是一个管理角色),你很可能不得不在你的核心能力之外发展你的技术技能来承担这些责任。
当然,你不应该期望拥有和更专业的同事一样的技术深度。然而,如果你不扩展你的技能,你可能会成为一个协调者而不是领导者;安排会议和联系同事,而不是积极参与。
通常很难抽出时间来学习和发展。典型的建议是将个人发展目标分成可管理的部分。过去,它帮助我做到了以下几点:
- 提高理论理解:向同事寻求资源,如书籍、博客、在线讲座
- 提高你的代码审查技能:向资深同事学习。当他们审查拉动式请求时,他们会对什么进行评论,为什么?
- 了解代码库:向不熟悉的代码库中添加小的错误修复或特性
结论
专注于技术领导角色的技术责任很有吸引力,但希望这篇文章能强调该角色的其他一些方面:了解同事的需求,拓展你的技能,并在团队中发展健康的工作文化。
像专业人士一样管理您的 AWS EKS 负载平衡器
原文:https://towardsdatascience.com/manage-your-aws-eks-load-balancer-like-a-pro-7ca599e081ca
AWS 负载平衡器高级提示和技巧
在 Unsplash 上由Manuel n Geli拍摄的照片
我的上一篇文章描述了在 AWS 管理的 Kubernetes 集群(EKS)中设置入口控制器。在本文中,我想强调一些高级特性,否则这些特性可能会被忽略,但会显著影响集群内部的自动化水平。
你在下面看到的提示和技巧是为了遵守软件工程的基本原则之一 DRY 而设计的。
什么是入口“控制器”?
Kubernetes 的设计和开发使用了一组“控制器”,负责将当前状态带到由集群内的配置和资源源定义的期望状态。
作为一个实际的例子,如果您将您的 Nginx 部署扩展到 2 个副本,负责的控制器将与运行在 worker 节点上的 Kubelet 对话,以加速 Nginx 映像的两个副本,根据需要放大或缩小。
当涉及到将您的逻辑添加到 Kubernetes 工作负载时,这为您打开了一个无限可能的世界。
我们今天将深入探讨的可能性之一是入口“控制器”,它负责将到达您的集群的流量路由到具有配置规则的适当服务。
Kubernetes 中的运算符是什么?
在我们进入主要讨论之前,定义一个操作符是至关重要的,但是如果您已经知道这个模式,您可以安全地跳过这一部分。
Kubernetes 集群中的操作符是一组自定义资源定义和一个“控制器”,它将负责将 CRD 的当前状态带到期望状态,与上面定义的其他 Kubernetes 控制器的行为非常相似。
作为一个虚拟示例,假设您在集群中定义了以下 CRD。
这可能不是这个星球上最好的三明治。尽管如此,一旦您的控制器被部署到集群中,对端点上的 Kubernetes api-server 的每个 API 调用,然后通过应用上面的 YAML 文件,您将在集群中拥有一个汉堡三明治。
如果您有兴趣了解更多信息,请进入文档获取完整参考。
为什么在这里了解运营商很重要?
Kubernetes 不附带任何入口控制器[ 来源 ]。但是它允许社区编写他们的入口控制器,这些控制器可能有也可能没有一组 CRDs 因此,了解操作符模式非常重要!
AWS 负载平衡器控制器是 Operator 模式的一个实现,它监听集群内部的入口资源,在创建这些资源时,将执行一系列 API 调用来创建正确的TargetGroupBinding
资源。
TargetGroupBinding
填补了 Kubernetes 工作负载和 AWS 基础设施之间的空白,因为 AWS 设计和构建了其负载平衡器的方式&位于这些负载平衡器的上游。如果你想了解更多,这里有参考指南的链接。
目标组和TargetGroupBindings
之间是一一对应的。
目标组是位于 AWS 应用程序负载平衡器[ source ]后面的一个或多个 EC2 实例的组。
你可以在下面看到一个TargetGroupBinding
资源的例子。
TargetGroupBinding 是 AWS 管理的 Kubernetes 中目标组的映射。
这不是您通常自己创建/管理的资源,而是在您创建/修改入口资源时由 AWS 负载平衡器控制器维护的资源。
了解了这一点,当您试图创建一个带有入口的服务来接收来自互联网的流量时,您应该记住一个重要的注意事项。您的服务资源应该是 NodePort 类型,以便入口控制器能够创建TargetGroupBindings
。这在 AWS 的世界中是有意义的,因为如果服务只作为ClusterIP
公开,AWS 负载平衡器就不能与之对话,因为它只公开在集群内部,实际上甚至从主机工作节点本身都无法访问。
你可以通过下面的链接阅读我上一篇文章中的讨论,或者阅读参考指南来理解设计和配置。
既然我们已经介绍了基础知识和先决条件,现在是时候谈谈控制器和 CRD 了,这就是你想要如何配置你的 AWS 负载平衡器。
IngressClass 的作用是什么?
IngressClass 是将管理入口资源的责任委派给指定控制器的资源。为了澄清这一说法,让我们来看一些代码。
如果您遵循安装指南,这个*IngressClass*
将会为您创建。
正如你从上面看到的,两个基本属性在spec
部分下面。controller
是决定谁/什么将通过这个 IngressClass 处理入口资源,而parameters
是传递给同一个控制器以定制其行为的可选键值。
拥有
parameters
允许拥有具有不同风格的相同controller
,定制为不同地处理不同的入口资源。
简单地说,如果我创建一个入口资源,并将ingressClassName
设置为aws-alb
,名为ingress.k8s.aws/alb
的控制器将做它必须做的事情,以便将传入的流量路由到上游的 Kubernetes 服务。
我们在接下来的讨论中需要的关键信息放在spec.parameters.kind
下面。这个属性的值是IngressClassParams
,这是一个 CRD,AWS 负载平衡器控制器将使用它来为您创建最终的负载平衡器。
IngressClassParams 是你最好的朋友
AWS 负载平衡器控制器有自己的一套 CRD。您应该知道的最重要的 CRD 名为IngressClassParams
,它有一系列有益的可配置属性,这些属性会影响如何创建/配置最终的 AWS 负载平衡器。
这些属性允许您定义和定制您的 AWS 负载平衡器,它将充当您的应用程序的前沿。
注意:我在本文中说的是应用负载均衡器。如果您需要使用网络负载平衡器,您可以使用相同的控制器,但一定要检查此链接以获取相应的信息。
现在,我们来介绍一下IngressClassParams
来源提供的规范 API。没有一个好的例子是最好的,所以让我们用下面的例子来支持这个论点。
将影响如何创建负载平衡器的属性。
如果您打开 AWS 控制台,上述配置将导致以下负载平衡器。
截图由作者取自 AWS 控制台。
当在生产级别的环境中工作时,这些属性中的一些是至关重要的,而其他的只是好的。我们将在下面深入探讨每一个问题。
您可以在IngressClassParams
资源上指定以下属性。
**spec.group.name**
:这种“分组”使得在一个负载均衡器后面有多个入口资源成为可能。如果在IngressClassParams
级别没有提供,那么另一种方法是注释你的每一个入口资源 source 。如果你没有为入口资源“分组”,AWS 将为每个入口资源创建一个负载平衡器,这将花费大量的成本。**spec.scheme**
:由于 AWS 中可能有内部和面向互联网的负载平衡器,您可以在此指定您的选择。区别是显而易见的,一个只对您的内部资源可用,另一个在公共互联网上公开。**spec.loadBalancerAttributes**
:最有价值的规范之一将为您提供足够的灵活性来根据您的需求定制您的负载平衡器。这个规范就是本文的全部内容,所以我们将再次讨论它。**spec.ipAddressType**
:您可以选择ipv4
和dualstack
。以防有一天世界用完了 IPv4!
负载平衡器属性
参考上一节中从 AWS 控制台截取的屏幕截图,从属性部分可以看到,您在这里修改了相当多的属性。所有这些属性都在相应的网页上有适当的记录。所以,一定要去查一下,全面了解。
简单介绍一下,下面是从IngressClassParams
资源配置的属性。
**deletion_protection.enabled**
:移除最后一个入口资源是否会终止负载平衡器。您可能想要关闭它,因为每个新的负载平衡器都将获得一个新的 DNS 名称,所以您必须在 AWS DNS 条目中或之外重新配置您的 DNS 记录。**idle_timeout.timeout_seconds**
:这是负载均衡器在自身和连接两端(用户&上游服务器)之间保持两个通信通道打开的秒数。对于文件上传和类似的大型操作,您可能希望增加这个数量,并对您的客户端进行编程,以便在这个数量之前至少发送一个字节[ source ]。**routing.http.drop_invalid_header_fields.enabled**
: 根据 IANA ,HTTP 头名应该符合字母数字和连字符。如果您希望负载平衡器丢弃不对应的标头,请启用此配置。**routing.http2.enabled**
:顾名思义,这将为您的负载平衡器打开 HTTP/2 协议。默认为true
。**routing.http.preserve_host_header.enabled**
:如果设置为true
,负载均衡器会将 HTTP 请求的主机头传递给上游服务器。不过,这不会改变[X-FORWARDED](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/x-forwarded-headers.html)
标题的行为。**access_logs.s3.enabled**
:这将打开记录负载平衡器对 S3 的访问日志。
每个入口组只需指定一次这些设置。如果您使用 Helm 安装入口控制器,您可以在安装过程中将它们设置为值。作为一个实用的指南,这里有一个你将使用的样本values.yaml
文件,把它传给 Helm 安装。
AWS 入口控制器舵安装的 values.yml
如果您没有将任何 IngressClass 注释为
default
,也没有在您的入口资源中指定任何ingressClassName
,就好像您根本没有任何入口,因为没有控制器会拾取它!
创建此类入口类后,由此类控制的任何入口都将归入同一个group.name
下,并有效地位于单个负载平衡器之后,从而节省您的成本并为您提供对进入您集群的向内流量的更多管理&控制。
如果您没有在IngressClassParams
中指定group.name
,您将被要求如下注释每个入口。
现在我们已经介绍了 IngressClass,是时候讨论入口资源和通过指定正确的注释集来控制负载平衡器了。
入口注释
Kubernetes 集群中的入口资源没有任何特别之处。它们只是一个或多个规则的规范,必须被处理并发送到指定的服务。您指定主机和路径,相应的入口控制器将处理剩下的工作。
然而,让它们与众不同的是metadata.annotations
,当它位于任何供应商或非供应商负载平衡器之后时,它可以对您想要如何定制入口进行更多的控制。
为了保持传统,让我们从另一个实际例子开始这一部分,并使用这个例子解释每个注释。
**group.order**
:该整数指定当数据包到达负载均衡器时要匹配的规则的优先级。负载平衡器将从最低编号到最高编号评估规则。你通常希望你最常访问的网址在最上面,这样匹配你最常点击的规则就不会花太多时间。- 与健康检查相关的注释非常简单明了,不言自明,所以我在这里就不多花时间了。
**listen.ports**
:这将是您的负载平衡器中的最终监听器。如果不指定此注释,默认情况下,AWS 负载平衡器控制器将在端口 80 上公开入口。您很可能希望处理安全端口 443(称为 HTTPS)上的每个流量,同时将所有内容从 HTTP(端口 80)重定向到它。本文的最后一部分就是关于这个重定向的!**target-type**
:默认值是instance
,意味着负载均衡器会将流量发送到 EC2 的 exposed NodePort。另一个允许的值是ip
,它将把流量发送到 Pod 的 IP,但是这个选项要求 VPC CNI 支持它[ 源 ]。**success-codes**
:可以是单个值,如200
,也可以是多个逗号分隔的值,如200,300
,也可以是一系列值,如200-300
。
上面讨论的注释是您需要为您创建的每个入口资源指定的注释。其他注释只需设置一次,负载均衡器就会选择它并将其用于所有入口资源。我将在下一节&最后一节讨论这些。
OPPO Find X5 Pro 在 Unsplash 上拍照
负载平衡器的一次性配置
将 HTTP 重定向到 HTTPS
正如在上一篇文章中提到的,仅仅通过部署 AWS 入口控制器不会得到任何负载平衡器。您将需要创建您的第一个入口资源,具有规范中指定的 Ingres class 或者是默认的 Ingres class,然后 AWS 将在一两分钟内提供您的负载平衡器。
安全最佳实践之一是配置负载平衡器,将非 HTTPS 流量重定向到安全的 HTTPS 流量。要使用 AWS 入口控制器做到这一点,您需要创建一个带有正确注释集的入口资源。
这个任务我们需要的注释是:actions.${action-name}
。“action name”将是一个虚拟服务名,甚至不作为 Kubernetes 服务资源存在,但是为了填补 AWS 和 Kubernetes 之间的空白,需要在spec.defaultBackend.service.name
下指定它。
这是 AWS EKS 内部的入口资源将 HTTP 流量重定向到 HTTPS 的最终效果。
在actions.ssl-redirect
下指定的注释是一种特殊的注释,只有 AWS 入口控制器可以理解,尽管 JSON 格式看起来需要处理很多,但它是可读的,您可以了解它的作用。
这里要提到的重要一点是,spec.defaultBackend.service.port.name
应该完全是use-annotation
,如果你想让它像解释的那样工作,你不能在那里放任何东西。
这里需要再次提及的另一个重要问题是,集群中没有名为ssl-redirect
的 Kubernetes 服务资源。我们之所以在这里指定这个名称,是因为要使用kubectl
创建这个资源,我们必须填写所有必需的属性&规范,因为它将在发送到 api 服务器之前被验证,即使您通过了--validate=false
,API 服务器本身也会向您反馈错误的规范。
最终,上述入口资源会将所有 HTTP 流量重定向到 HTTPS 端口,为了确保这一点,下面是它在 AWS 控制台中的样子。
这个负载均衡器目前只监听端口 80,所以让我们定义一个虚拟服务来重定向所有不需要的流量,以防所有其他规则与传入的数据包不匹配。
每个负载平衡器都有一个默认的后端规则,如果所有先前的规则都不匹配传入的数据包,该规则将确定将流量发送到哪里。这允许您将用户重定向到一个友好的页面,提醒他们没有这样的主机或路径,他们需要确保他们正在前往正确的地址。
默认后端的虚拟上游
这一部分非常简单明了,因为您可以根据自己的需要定制它。但是,我会尝试将所有没有特定规则的流量发送到一个友好的维护页面,如下所示。
我个人对哑上游的偏好(图片由作者提供)。
下面提供了该规则的代码和资源,包括前面的 SSL 重定向。
创建上述资源后,每个不是以您配置的入口规则为目的地的传入流量都将被发送到友好维护页面。
您还可以选择审核这些传入的数据包,以了解最常被请求的内容,并在发现任何可疑情况时采取相应的措施。
其他非关键但注释
作为最后一块拼图和一个奖励,这里列出了所有其他可能对您的工作负载有用的注释。
不要忘记,这些最后的注释在每个入口组中只被指定一次。如果您用不同的值设置多个,它将覆盖以前的值,并且您可能会得到意外的结果。
结论
如果您选择加入 AWS 中的托管 Kubernetes 集群,那么在拥有生产级集群时,请准备好应对一些严峻的挑战。
Kubernetes 是与云无关的,允许您将数据库、缓存、消息代理和其他所有东西作为自我管理的解决方案放在集群中。这为您提供了更高的性能,因为您的应用程序将受益于地理上的接近,但这也意味着您将花费更少的钱来购买 RDS、ElastiCache 和 AWS 提供的其他产品。我很确定他们不喜欢这种声音。
这意味着您将面临 Kubernetes 领域之外的挑战,以使您的集群在 AWS 基础设施中工作,为您提供学习和成长的机会。我建议你尽可能多带些,并且一定要享受旅程!
祝你今天休息愉快,敬请期待保重!
参考
- https://kubernetes-sigs . github . io/AWS-load-balancer-controller/v 2.4/
- https://aws.amazon.com/elasticloadbalancing/
- https://kubernetes.io/docs/
如果你喜欢这篇文章,看看我的其他内容,你可能也会觉得有帮助。
https://medium.com/skilluped/what-is-iptables-and-how-to-use-it-781818422e52 https://medium.com/amerandish/clean-architecture-simplified-223f45e1a10 https://medium.com/amerandish/a-tmux-a-beginners-guide-7c129733148 https://medium.com/skilluped/10-tips-on-writing-a-proper-dockerfile-13956ceb435f https://meysam.io/what-is-haproxy-how-to-get-the-most-from-of-it-a9009b67f618