admin管理员组

文章数量:1645531

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

避免使用“pip 冻结”,而是使用“pipreqs”

原文:https://towardsdatascience/goodbye-pip-freeze-welcome-pipreqs-258d2e7a5a62

您的项目依赖关系很重要—有效地管理它们

图像由安赫塞娜蒙在 Unsplash 上拍摄

动机

包管理是软件开发工作流的最佳实践之一,因为它促进了软件交付的自动化。

如今,大多数数据科学家和机器学习工程师已经在他们的管道自动化中采用了这种最佳实践。即使这个过程被认为是一个好的实践,大多数从业者采用的方法可能并不总是有效的:使用[pip freeze](https://pip.pypa.io/en/stable/cli/pip_freeze/).

在这篇概念博客中,你会明白有一个比使用pip freeze.更好的选择

这就是为什么你不应该使用画中画冻结

假设您正在处理一个需要 5 个依赖项的项目:dep1dep2dep3dep4dep5。大多数人在生成依赖文件时的反应是使用下面这个神奇的命令:

pip freeze > requirements.txt

但是这怎么会是一个问题呢?

大多数库的安装需要其他自动安装的库。下面是一个插图。

# Install the **transformers** library
pip install transformers

transformers库的安装会生成以下消息:

Successfully installed huggingface-hub-0.10.1 tokenizers-0.13.1 transformers-4.23.1

这意味着这两个额外的库huggingface-hub-0.10.1 tokenizers-0.13.1已经和 transformer 库一起安装了,并且这两个库将自动包含在 requirement.txt 文件中。

pip 冻结命令的图示(图片由作者提供)

但我还是不觉得有什么问题!不要担心,我们会成功的…

现在,想象一下变形金刚库被升级并需要不同的库**new_lib-1.2.3****another_new_lib-0.2.1**。这意味着先前的依赖关系huggingface-hub-0.10.1 tokenizers-0.13.1不再相关,对吗?至少对❌.项目来说是这样

问题来了👇🏽

生成 requirements.txt 文件的新版本除了包含新的依赖项之外,还将包含旧的依赖项;如果您只想保留相关的依赖项,您将不得不手动删除旧的依赖项。然后想象一下处理一个需要 20、30 或 50 个库的项目!这很快就会成为一个令人头疼的问题🤯。

pip 冻结保留以前安装的不再需要的旧包(图片由作者提供)

总之,pip freeze不够聪明,无法有效地管理依赖关系,以下是一些原因:

**pip freeze** 仅用于“pip 安装”:它仅知道使用pip install命令安装的软件包。这意味着任何使用不同方法安装的软件包,如peotrysetuptoolsconda等。不会包含在最终的 requirements.txt 文件中。

pip 冻结仅考虑使用 pip 命令安装的库(图片由作者提供)

**pip freeze** **不考虑依赖版本冲突:**项目生命周期是迭代的,因此可能需要现有库的全新或升级版本。使用pip freeze保存环境中的所有包,包括那些与项目无关的包。

**→ **pip freeze** **抓取一切:如果你没有使用虚拟环境,pip freeze生成包含所有库的需求文件,包括你的项目范围之外的库。

那么,我能做些什么来解决这些问题呢?
好问题!

答案是通过使用pipreqs🎉

Pipreqs —更好的选择

[pipreqs](https://pypi/project/pipreqs/)首先扫描所有的 python 文件(。py),然后基于项目的每个 python 文件中的import语句生成 requirements.txt 文件。此外,它解决了使用pip freeze时面临的所有问题。

pireqs 扫描过程(图片由作者提供)

使用下面的pip命令,安装非常简单。

pip install pipreqs

一旦您安装了库,您只需要提供项目的根位置,并运行这个命令来生成项目的 requirements.txt 文件。

pipreqs /<your_project_root_path>/

有时您可能想要更新需求文件。在这种情况下,您需要使用--force选项来强制重新生成文件。

pipreqs **--force** /<your_project_root_path>/

假设您想要忽略特定子文件夹中的一些 python 文件的库。这可以通过在指定需要忽略的子文件夹之前使用--ignore选项来实现。

pipreqs /<your_project_root_path>/ **--ignore** /<your_project_root_path>/folder_to_ignore/

结论

恭喜你!🎉🍾您刚刚了解了一种新的、有效的管理项目相关性的方法。

如果你喜欢阅读我的故事,并希望支持我的写作,考虑成为一个媒体成员。每月支付 5 美元,你就可以无限制地阅读媒体上的故事。

欢迎在媒体、推特和 YouTube 上关注我,或者在 LinkedIn 上打招呼。讨论人工智能、人工智能、数据科学、自然语言处理和人工智能是一种乐趣!

再见散点图,欢迎入库散点图

原文:https://towardsdatascience/goodbye-scatterplot-welcome-binned-scatterplot-a928f67413e4

因果数据科学

如何可视化并对条件手段进行推理

作者图片

当我们想要可视化两个连续变量之间的关系时,定位图就是散点图。这是一个非常直观的可视化工具,允许我们直接查看数据,无需任何操作。然而,当我们有大量数据和/或数据有偏差时,散点图可能噪声太大,无法提供信息。

在这篇博文中,我将回顾散点图的一个非常强大的替代方案,来可视化两个变量之间的相关性:装箱散点图。装箱散点图不仅是一个很好的可视化工具,而且还可以用来对条件均值进行推断,等等。

散点图

先说个例子。假设我们是一个网上市场,多家公司提供商品,消费者可以有效地浏览、比较和购买。我们的数据集包含了活跃在市场上的公司的快照。

让我们加载数据并查看一下。你可以在这里找到数据生成过程dgp_marketplace 的代码。我还从[utils](https://github/matteocourthoud/Blog-Posts/blob/main/notebooks/src/utils.py)导入了一些代码来制作更好的图形。

from src.utils import *
from src.dgp import dgp_marketplace

df = dgp_marketplace().generate_data(N=10_000)
df.head()

作者图片

我们有 10000 家公司的信息。对于我们知道的每个公司:

  • age:公司的时代
  • sales:上月的月销售额
  • online:公司是否只在网上活动
  • products:公司提供的产品数量

假设我们有兴趣了解agesales之间的关系。销售的生命周期是什么?

让我们从一个简单的salesage散点图开始。

sns.scatterplot(x='age', y='sales', data=df);
plt.title("Sales by firm's age");

作者图片

剧情极其。我们有许多观察结果,因此,很难将它们全部形象化。如果我们必须猜测,我们可以说这种关系看起来是负的(salesage减少),但这将是一个非常无知的猜测。

我们现在要探索一些合理的调整和替代方案。

散点图备选方案

当我们有一个非常密集的散点图时,我们能做什么?一种解决方案是绘制观测值的密度图,而不是观测值本身。

Python 中有多种解决方案来可视化二维分布的密度。很有用的一个就是seabornjoint plot。jointplot绘制两个变量的联合分布,以及沿轴的边际分布。默认选项是散点图,但也可以选择添加回归线(reg),将图更改为直方图(hist),六边形图(hex),或核密度估计值 ( kde)。

让我们试试 hexplot ,它基本上是数据的直方图,其中的条柱是二维空间中的六边形。

s = sns.jointplot(x='age', y='sales', data=df, kind='hex', );
s.ax_joint.grid(False);
s.ax_marg_y.grid(False);
s.fig.suptitle("Sales by firm's age");

作者图片

没什么变化。看起来agesales的分布都非常偏斜,因此,大部分动作都集中在非常小的子空间中。

也许我们可以移除异常值并放大大部分数据所在的区域。让我们放大左下角,有age < 3sales < 3000的观察。

s = sns.jointplot(x='age', y='sales', data=df.query("age < 3 & sales < 3000"), kind="hex");
s.ax_joint.grid(False);
s.ax_marg_y.grid(False);
s.fig.suptitle("Sales by firm's age");

作者图片

现在空地少了很多,但看起来我们并没有走远。关节分布还是太偏。当数据遵循某种幂分布时就是这种情况,业务数据通常就是这种情况。

一种解决方案是通过取https://en.wikipedia/wiki/Natural_logarithm****转换变量。

df['log_age'] = np.log(df['age'])
df['log_sales'] = np.log(df['sales'])

我们现在可以画出agesales的对数之间的关系。

s = sns.jointplot(x='log_age', y='log_sales', data=df, kind='hex');
s.ax_joint.grid(False);
s.ax_marg_y.grid(False);
s.fig.suptitle("Sales by firm's age", y=1.02);

作者图片

对数绝对有帮助。现在,数据在空间上更加分散,这意味着可视化提供了更多信息。此外,看起来这两个变量之间没有关系。

不过还是有噪音太大**。也许光靠数据可视化不足以得出结论。**

让我们换一种更结构化的方法: 线性回归 。让我们在log_age上线性回归log_sales

smf.ols('log_sales ~ log_age', df).fit().summary().tables[1]

作者图片

log_age的回归系数为且具有统计显著性(即不同于零)。似乎所有以前的想象都非常误导。从上面的图表中,我们没有一个能猜到如此强的正相关关系。

然而,也许这种关系对于online-仅仅是公司和样本中的其他公司是不同的。我们需要控制这个变量,以避免辛普森悖论以及更普遍的偏见。

通过线性回归,我们可以对协变量进行条件分析。让我们添加二进制指标为online-只有公司和变量计数的数量products回归。

smf.ols('log_sales ~ log_age + online + products', df).fit().summary().tables[1]

作者图片

log_age的系数仍然是正的,并且在统计上是显著的,但是它的大小已经减半。

我们应该得出什么结论?平均来说,似乎随着年龄的增长而增加。然而,这种模式可能是非常非线性的。

在线性回归框架内,一种方法可以是添加额外的项**,例如多项式(age^2)或分类特征(例如age < 2)。然而,如果有一种更灵活的方法可以告诉我们公司agesales之间的关系,那就太棒了。**

要是……

装箱散点图

****装箱散点图是一个非常强大的工具,它提供了一种灵活简约的方式来可视化和总结大型数据集中的条件均值(不仅仅是)。

面元散点图背后的思想是将条件变量age分成个大小相等的面元或分位数**,然后在每个面元内绘制因变量sales的条件均值。**

细节

Cattaneo,Crump,Farrell,Feng (2021) 在 R, binsreg 中构建了一个非常好的分箱散点图包。而且,他们已经把包移植到 Python 上了。我们可以使用pip install binsreg直接从 pip 安装binsreg。你可以在这里找到关于 Python 包的更多信息,而原始和详细的 R 包文档可以在这里找到。

构建面元散点图时最重要的选择是面元数量**。这个权衡就是通常的 偏差-方差权衡 。通过选择更多数量的箱,我们在图中有更多的点。在极端情况下,我们最终得到一个标准的散点图(假设条件变量是连续的)。另一方面,通过减少箱的数量,情节将更加稳定。然而,在极端情况下,我们将有一个代表样本平均值的单点**。****

Cattaneo,Crump,Farrell,Feng (2021) 证明,在基本分格散点图中,最小化均方误差的分格数与成正比,其中 n 为观察次数。因此,一般来说,更多的观察导致更多的箱。

斯塔尔和戈德法布(2020) 增加以下考虑因素:

然而其他元素也很重要。例如,保持 x 的分布不变,x 和 y 之间的真实关系曲线越多,算法将选择越多的箱(否则均方误差将增加)。这意味着即使有大的 n,也将为相对平坦的关系选择很少的箱。因此,计算基本分箱散点图中的最佳箱数时,考虑了可用于识别 x 和 y 之间关系的数据的变化量和位置。”

强烈建议使用默认的最佳箱数。然而,用户也可以使用nbins选项通过binsreg设置定制的箱数。

然而,分格散点图不仅仅计算最优选择区间的条件均值,还可以为这些均值提供推断*。特别是,我们可以围绕每个数据点建立置信区间。在binsreg包中,选项ci将置信区间添加到估计结果中。该选项将一组参数(p, s)作为输入,并使用带有s平滑度约束的p次分段多项式来构建置信区间。默认情况下,置信区间不包含在图中。关于ps的选择,包文档报告:***

" 推荐的规格是ci=c(3,3),它将基于感兴趣的回归函数的三次 B 样条估计的置信区间添加到装箱散点图中。"

宾斯雷格

这个包的 Python 版本的一个问题是它不太像 Python。因此,我将binsreg包包装到一个函数binscatter中,该函数负责清理和格式化可读性良好的 Pandas DataFrame 中的输出。

我们现在可以进行估计可视化基于salesage的分级散点图。**

*# Estimate binsreg
df_est = binscatter(x='age', y='sales', data=df, ci=(3,3))
df_est.head()*

作者图片

binscatter函数输出一个数据集,其中,对于条件变量age的每个箱,我们有结果变量sales的值和置信区间。

我们现在可以画出估计值。

*# Plot binned scatterplot
sns.scatterplot(x='age', y='sales', data=df_est);
plt.errorbar('age', 'sales', yerr='ci', data=df_est, ls='', lw=2, alpha=0.2);
plt.title("Sales by firm's age");*

作者图片

情节相当暴露。现在,这种关系看起来非常的非线性*,在一个公司生命周期的开始sales急剧增加,然后是一个平台期。***

此外,该图还告诉我们关于agesales分布的信息。其实左边的地块更密集,这里集中了age的分布。此外,左边的置信区间更小,这里是大多数条件分布的所在地。

正如我们在上一节已经讨论过的,控制其他变量可能很重要。例如,products的数字,因为销售更多产品的公司可能在市场上生存得更久,并且也销售得更多。

通过w选项,binsreg允许限制对任意数量变量的分析。**

*# Estimate binsreg
df_est = binscatter(x='age', y='sales', w=['products'], data=df, ci=(3,3))

# Plot binned scatterplot
sns.scatterplot(x='age', y='sales', data=df_est);
plt.errorbar('age', 'sales', yerr='ci', data=df_est, ls='', lw=2, alpha=0.2);
plt.title("Sales by firm's age");*

作者图片

根据products的数量,sales生命周期的形状会进一步改变。现在,在最初的销售增长后,我们观察到随着时间的推移逐渐下降。

相对于混合的线上-线下企业,只有online企业有不同的sales生命周期吗?我们可以使用选项by按组生成不同的分级散点图****

*# Estimate binsreg
df_est = binscatter(x='age', y='sales', by='online', w=['products'], data=df, ci=(3,3))

# Plot binned scatterplot
sns.scatterplot(x='age', y='sales', data=df_est, hue='online');
plt.errorbar('age', 'sales', yerr='ci', data=df_est.query("online==0"), ls='', lw=2, alpha=0.2);
plt.errorbar('age', 'sales', yerr='ci', data=df_est.query("online==1"), ls='', lw=2, alpha=0.2);
plt.title("Sales by firm's age");*

作者图片

从分箱散点图中,我们可以看到online产品的平均寿命更短,在sales中有一个更高的初始峰值,随后是更急剧的下降。

结论

在这篇博文中,我们分析了一个非常强大的数据可视化工具:装箱散点图。特别是,我们已经看到了如何使用binsreg包来自动挑选最佳数量的箱,并对条件均值执行非参数推断。然而,binsreg套件提供的远不止这些,我强烈建议更深入地查看的手册。

参考

[1]E . Starr,B . goldf ARB,分箱散点图:使研究更容易和更好的简单工具 (2020),战略管理杂志。

[2] M. D. Cattaneo,R. K. Crump,M. H. Farrell,Y. Feng, On Binscatter (2021),工作文件。

[3]p·戈德史密斯-平克姆,第六讲。线性回归 II:半参数和可视化,应用计量学博士课程。

密码

你可以在这里找到 Jupyter 的原版笔记本。

***https://github/matteocourthoud/Blog-Posts/blob/main/notebooks/binscatter.ipynb ***

感谢您的阅读!

非常感谢!🤗如果你喜欢这个帖子并且想看更多,可以考虑 关注我 。我每周发布一次与因果推断和数据分析相关的主题。我尽量让我的帖子简单而精确,总是提供代码、例子和模拟。**

还有,一个小小的 免责声明 :我写作是为了学习所以错误是家常便饭,尽管我尽了最大努力。当你发现他们的时候,请告诉我。也很欣赏新话题的建议!

古德哈特定律和 A/B 测试中度量选择的危险

原文:https://towardsdatascience/goodharts-law-and-the-dangers-of-metric-selection-with-a-b-testing-91b48d1c1bef

选择度量标准的令人惊讶的违反直觉的问题(以及它与眼镜蛇的关系)

照片由 Unsplash 上的 NIvedh P 拍摄

实验有很多部分:选择假设,实施变化,任务,结果分析,文档等,每一部分都有自己的细微差别,使其变得复杂。通常,选择决定假设是否正确的指标是很简单的。然而,在某些情况下,选择度量标准可能会有问题,并且会暴露出古德哈特定律的经典问题。

古德哈特定律说,当一个衡量标准成为一个目标时,它就不再是一个好的衡量标准。这与坎贝尔定律、眼镜蛇效应以及更普遍的不正当激励有着密切的关系。简单地说,这些定律描述了选择指标会产生意想不到的负面影响的情况。

“眼镜蛇效应”背后的经典例子和词源来自殖民时期的印度,据说那里有太多的眼镜蛇。为了解决这个问题,英国政府悬赏捉拿死眼镜蛇。这导致当地人开始饲养眼镜蛇以换取赏金。

最近的一个例子来自《美国新闻与世界报道》最佳大学排名。排名中的一个因素是选择性——有多少学生申请和被录取。这一措施鼓励一些学校通过将每一张表达兴趣的明信片都作为“申请”来控制申请人数,并拒绝更多的秋季入学学生以提高排名。

这些意想不到的负面影响同样适用于 A/B 测试。如果你告诉你的团队改进一个指标,团队可以被激励去实现这些指标。作为一个例子,考虑这样的情况,你想增加每次访问的页面。一个绝对可行的方法是将你的内容分页成越来越小的页面(你可以在很多网站上看到真实的例子)。你冒着破坏用户体验和惹恼用户的风险,但这一指标几乎肯定会增加。

脸书是这一现象的典型例子。脸书以高度关注增长指标(如活跃用户和用户参与度)而闻名。团队将这些增长指标作为他们的主要绩效指标,并有依赖于改进它们的奖金。因此,他们没有动力去改进不相关的指标,以提供更完整的图像。脸书确实有团队来衡量他们工作的其他影响,如他们的诚信团队或内部研究人员,但由于这些利益冲突,通常无法有意义地解决这些问题。即使在决策升级时,增长也被放在首位。这导致他们开发了一种产品,这种产品肯定有很高的参与度,但却疏远了很大一部分人,并传播了在世界上造成真正伤害的错误信息(见 1 月 6 日或缅甸)。

假设您已经为您的团队仔细地选择了度量标准,以避免上述问题,并且您的内部团队善于避免玩弄度量标准,那么在使用 A/B 测试选择度量标准时,仍然有其他方面的非预期的负面影响需要注意。

相关性、因果关系和代理指标

几年前,我们在一个免费增值内容网站上做了一个有趣的实验,我们有一个提高收入的北极星指标。该实验的假设来自我们数据团队的一个见解,他们注意到使用多种类型内容的用户以比正常情况高得多的比率转化为付费。考虑到这种相关性,我们的产品团队开始推动更多用户消费多种内容,以期增加收入。对于这些测试,我们使用了代理(多内容使用)和目标(收入)的指标。结果令人着迷,也违反直觉。

我们在多次实验后发现,它们不仅没有增加收入,而且通过推动用户做他们不愿意做的事情,我们减少了每次访问的页面,实际上减少了收入。然而,我们确实成功地增加了多内容使用的指标。我们通过这些实验实际上证明了这种相关性不是因果关系。如果我们只是使用多种内容的代理指标,并相信其与收入的因果关系,我们可能已经宣布这些测试成功了。

推行度量标准也会破坏原有的相关性。在实验过程中,我们回顾了最初的相关性,但它已经消失了。在收入没有增加的情况下,我们迫使更多不合格的用户使用多种内容类型,以至于最初的相关性不再重要。

使用代理指标的另一个常见原因是因为这是您所拥有的全部。你要确保你测试的是你需要的指标,而不是你拥有的指标。想想什么是证明假设的正确指标,如果你发现自己不能用它们来测试,那么你就有问题了。在不知道对目标指标的影响的情况下使用代理指标将意味着您无法确定因果关系,这将限制您的实验的有效性。确保您的实验平台不是运行正确实验的限制因素,并使用正确的指标运行测试。

结论

从古德哈特定律中得到的度量选择的教训是,要对你的度量深思熟虑。尽量不要使用代理指标,除非你确定它们是因果关系。小心你的目标度量的含义,并考虑可能还需要测量哪些其他度量来确定可能的负面影响。最后,并不是所有的实验结果都可以直接分析,需要仔细考虑才能为您的产品确定正确的结论,这往往是微妙的。记住这些想法,希望你可以避免一些度量驱动的决策的陷阱。

[1] G. S. Morson 和 M. Schapiro,哦,学校编织了一个多么复杂的网络:大学排名游戏 (2017)芝加哥论坛报

[2] C. Timberg,E. Dwoskin 和 R. Albergotti,1 月 6 日,在脸书,暴力激起了愤怒,对错过警告标志感到遗憾 (2021 年)《华盛顿邮报》

[3] J. Clayton,罗辛亚因缅甸仇恨言论起诉脸书索赔 1500 亿美元 (2021) BBC 新闻

拟合优度:调整的 R 和 Bootstrapping 确定回归系数的标准误差

原文:https://towardsdatascience/goodness-of-fit-adjusted-r²-and-bootstrapping-to-determine-standard-error-of-regression-4897cb4bb811

多元线性回归分析

图片来自 Unsplash

简介

当执行线性回归时,我们需要评估回归模型。第一个也是最重要的策略是查看 R 平方值,它表明自变量可以解释因变量的多少变化。然而,这对于简单的线性回归是正确的。当我们执行多元线性回归时,调整的 R-square 是回归模型评估的更可靠的度量。

自举是简单的替换采样技术。当我们有大量人口时,通常会对数据进行抽样以预测人口统计数据。Bootstrapping 是一种非常有效的技术,可以根据采样数据确定标准误差和建立置信区间。这是降低重采样成本的简单而有效的策略。

R

r 平方是回归分析中拟合优度的度量。这是可变性的一种度量。它也被称为决定系数。当我们有一个单独的自变量和另一个单独的响应变量时,R 的值指定了可由自变量解释的响应变量的可变性的百分比。

我们经常需要执行多元线性回归,最终得到数据集中的几个独立变量。通过在分析中包含更多的独立变量,我们允许更多的参数变化。因此,添加更多的变量会对因变量的可变性产生影响,不管这种影响有多小,这是有意义的。这就是为什么总是期望在回归分析中增加更多的变量会增加 R 值,这并不坏。当这些变量相关时,问题就出现了。这种多重共线性问题产生了一个不太稳健的模型,其中系数的估计变得系统性错误。

调整后的 R

如上所述,在回归分析中增加更多的独立变量有助于增加 R 值。然而,分析变量的系数是否有很大价值也很重要。当两个变量相关时,我们可以去掉一个,利用其他不相关的变量。检查共线性的一种方法是检查方差膨胀因子(VIF)。通常,大于 5 的 VIF 值表示可能存在多重共线性。本文解释了获取 VIF 值的过程。

统计软件在进行回归分析时,会计算 R 和调整后的 R。调整后的 R 会减少添加更多独立变量的影响,并保持 R 值来自最重要变量的可变性。这就是为什么调整后的 R 值总是等于或小于常规的 R 值。

调整后的 R 在动作中

让我们以 GPL 2.0 许可下的“鱼”数据集为例。有 5 个独立变量和一个响应变量。在一次添加一个独立变量后,观察到 R 值从 0.84 增加到 0.89,虽然很小,但潜在地证明了多重共线性的存在,从 VIF 值可以明显看出这一点。

鱼类数据集中的 VIF

由于观察到多重共线性,我们必须获得调整的 R,因为常规 R 是误导性的。

这里 N =观察值的总数,k =分析中考虑的独立变量的总数。当 k=5 时,调整后的 R 值变为 0.88,这是一个非常小的下降。

为什么自举计算标准误差

当我们进行线性回归分析时,有时我们可能对回归系数的估计不是很有信心,因为我们只处理样本。当无法了解全貌时,样本估计值可能会远离实际数据。

让我们看看下面的两个图表,它们在数据点上有相同的线性拟合线。

线性拟合线 1(图片由作者提供)

线性拟合线 2(图片由作者提供)

当我们想从第一个图中计算人口统计数据时,样本将产生具有不同斜率的不同线,而第二个图中的任何样本(大小为 2 或更大)将提供具有相同斜率的相同线。如果第一个数字样本的系数变化不大,我们将对估计值有信心,另一方面,如果系数变化很大,我们将对估计值缺乏信心。这就是为什么在处理样本时,引导数据点、拟合数据点并确定拟合系数非常重要。

从这两个图中观察到的另一个有趣的事情是,虽然两个图中的线性拟合方程是相同的,但 R 是不同的。在第二幅图中,R 为 1,这表明了完美的拟合,而第一幅图中的 R 小于 1,因为存在残余误差。

结论

本文解释了 R 和调整后 R 的概念。执行多元线性回归时,调整后的 R 是正确的决定系数。对于简单的线性回归,R 和调整后的 R 都非常接近。同样,为了对样本估计值有信心,我们可以执行 bootstrapping 并确定回归系数的标准误差,这将告诉我们多个样本的值如何变化。

https://mdsohel-mahmood.medium/membership https://mdsohel-mahmood.medium/subscribe

谷歌分析:2022 年回顾

原文:https://towardsdatascience/google-analytics-in-r-review-of-2022-52d6bf4c1bb7

了解如何通过 R 中的 googleAnalyticsR 包为您的博客或网站分析和可视化通用分析(UA)和 Google 分析 4 (GA4)数据

照片由帕韦尔·切尔文斯基拍摄

介绍

It 快到年底了,这意味着是时候做一个统计和 R 的回顾,回顾过去的一年。

今年的回顾会比往年短得多,因为在那些以前的回顾中已经有很多例子了。

请注意,2022 年 9 月初,我从通用分析(被称为 UA)转移到谷歌分析 4(被称为 GA4)。你可能知道如果你经常使用谷歌分析;2023 年 7 月 1 日,标准通用分析属性将停止处理新的点击。这意味着,如果您想在此日期后继续使用它,您将需要转移到 GA4。

今年,我将简要介绍不同的指标以及如何分析您的 Google Analytics (GA)数据。然而,这篇文章也许会对那些已经迁移到(或将迁移到)GA4 并且仍然想从 UA 和 GA4 分析 GA 数据的人有所帮助。

我不得不承认,将两者的数据结合起来是相当耗时的,特别是因为 UA 和 GA4 的度量和维度是不同的。所以如果你还没有搬家,我建议你在一年的年底或年初搬家。这将避免您必须从两个 GA IDs 获取数据,然后必须在 r 中组合这两个数据。

像往常一样,我在 R 中分析我的 GA 数据,这要感谢来自 Mark Edmondson 的惊人的{googleAnalyticsR}包。

请注意,下面给出的实际数字对您来说不是很有用。每个博客和网站都不一样,所以每个受众都不一样。这篇帖子更多的是说明在 R 中分析 GA 数据的过程(今年,也是为了说明合并来自两个 GA IDs 的 GA 数据的过程),而不是展示我的数字。

先决条件

首先,您必须指定要分析数据的 GA ID。我的如下:

ga_id <- c("208126346", "250795226")

您将在 GA 帐户的管理部分找到您的。

分析学

在这一节中,我将展示一些在分析 GA 数据时可能有用的可视化工具。如果你使用了其他有趣的可视化工具,请在文章末尾随意评论。

请注意,我在这篇文章中关注的是页面浏览量指标,但是您也可以编辑我的代码来显示其他指标。查看 UA 的可用指标和 GA4 的可用指标。

一段时间内的页面访问量

先说过去一年的浏览量演变,那么从 2021 年 12 月 16 日到 2022 年 12 月 15 日。

library(googleAnalyticsR)
# set date range
start_date <- as.Date("2021-12-16")
end_date <- as.Date("2022-12-15")# extract data from both IDs
dat1 <- google_analytics(ga_id[1],
  date_range = c(start_date, end_date),
  metrics = "pageviews",
  dimensions = "date",
  anti_sample = TRUE # avoid sampling
)dat2 <- ga_data(ga_id[2],
  date_range = c(start_date, end_date),
  metrics = "screenPageViews",
  dimensions = "date",
  limit = -1 # return all data (no limit)
)# combine data from both IDs
library(dplyr)
dat <- full_join(dat1, dat2, by = "date")
dat$page_views <- rowSums(select(dat, pageviews, screenPageViews),
  na.rm = TRUE
) # scatter plot with a trend line
library(ggplot2)
dat %>%
  ggplot(aes(x = date, y = page_views)) +
  geom_point(size = 1L, color = "gray") + # change size and color of points
  geom_smooth(color = "steelblue", alpha = 0.25) + # change color of smoothed line and transparency of confidence interval
  theme_minimal() +
  labs(
    y = "Page views",
    x = "",
    title = "Evolution of daily page views",
    subtitle = paste0(format(start_date, "%b %d, %Y"), " to ", format(end_date, "%b %d, %Y")),
    caption = "Data: Google Analytics data of statsandr"
  ) +
  theme(plot.margin = unit(c(5.5, 17.5, 5.5, 5.5), "pt")) + # to avoid the plot being cut on the right edge
  scale_y_continuous(labels = scales::comma) # better y labels

作者的情节

正如您在上面的代码中看到的,我们需要:

  • 从两个不同的 id 中提取数据:这是用 UA 的google_analytics()和 GA4 的ga_data()完成的(每个函数都有自己的参数)
  • 连接来自两个 id 的数据(用一个full_join()连接,因为即使在移动到 GA4 之后,UA 上仍然有一些点击,所以我需要保留全年来自两个 id 的数据)
  • 合计两个 id 的度量(用rowSums())

这个过程将对每个可视化重复进行。

从上面的图中,我们看到页面浏览量遵循一个周期性的演变过程(在夏季有所下降)。这一趋势遵循与去年相同的模式,但今年最后一个季度的增幅在 2022 年更大。

请注意,似乎总有一些日子的页面浏览量低于其他日子。这实际上是周末。在部分中可以看到更多相关信息。还要注意页面浏览量超过 5000 的异常值的存在。那天没有发布任何帖子,所以它可能来自一个分享给大量观众的旧帖子。

最后,将所有天数相加,总浏览量为 938,630。去年是 876280,所以 2022 年增长了 7.12%。

每月和每年的页面访问量

比较前几年每月的页面浏览量也是有用的。下面是两种不同类型的可视化。

# set new date range to include previous years
start_date_launch <- as.Date("2019-12-16")
# extract data from both IDs
dat1 <- google_analytics(ga_id[1],
  date_range = c(start_date_launch, end_date),
  metrics = "pageviews",
  dimensions = "date",
  anti_sample = TRUE # avoid sampling
)dat2 <- ga_data(ga_id[2],
  date_range = c(start_date_launch, end_date),
  metrics = "screenPageViews",
  dimensions = "date",
  limit = -1 # return all data (no limit)
)# combine data from both IDs
dat <- full_join(dat1, dat2, by = "date")
dat$page_views <- rowSums(select(dat, pageviews, screenPageViews),
  na.rm = TRUE
) # add year and month columns to dataframe
dat$month <- format(dat$date, "%m")
dat$year <- format(dat$date, "%Y")# page views by month by year using dplyr then graph using ggplot2 barplot
dat %>%
  filter(year != 2019) %>% # remove 2019 because there are data for December only
  group_by(year, month) %>%
  summarize(page_views = sum(page_views)) %>%
  ggplot(aes(x = month, y = page_views, fill = year)) +
  geom_bar(position = "dodge", stat = "identity") +
  theme_minimal() +
  labs(
    y = "Page views",
    x = "Month",
    title = "Page views per month and year",
    subtitle = paste0(format(start_date_launch, "%b %d, %Y"), " to ", format(end_date, "%b %d, %Y")),
    caption = "Data: Google Analytics data of statsandr",
    fill = "" # remove legend title
  ) +
  theme(legend.position = "top") + # change legend position
  scale_y_continuous(labels = scales::comma) # better y labels

作者的情节

另一种可能性如下:

dat2 <- dat
library(lubridate)
dat2$day <- day(dat2$date)
dat2$day_month <- as.Date(paste0(dat2$month, "-", dat2$day), format = "%m-%d")dat2 %>%
  filter(year != 2019 & page_views < 7500) %>% # remove 2019 and outliers
  ggplot(aes(x = day_month, y = page_views, color = year)) +
  geom_point(size = 1L, alpha = 0.25) + # change size and alpha of points
  geom_smooth(se = FALSE) + # remove confidence interval
  theme_minimal() +
  labs(
    y = "Page views",
    x = "",
    title = "Evolution of daily page views",
    subtitle = paste0(format(start_date_launch, "%b %d, %Y"), " to ", format(end_date, "%b %d, %Y")),
    caption = "Data: Google Analytics data of statsandr",
    color = "" # remove legend title
  ) +
  theme(legend.position = "top") + # change legend position
  scale_y_continuous(labels = scales::comma) + # better y labels
  scale_x_date(date_labels = "%b") # show only months

作者的情节

从上面的两个图中,我们看到,与 2020 年至 2021 年相比,该博客在页面浏览量方面的全球表现更好(除了 2021 年第一季度的表现更好)。

请注意,3 年之间的比较是好的,但如果用更多的年份来比较,这些图将很快变得不可读!

表现最佳的页面

如果您有兴趣了解表现最佳的页面(仍以页面浏览量计):

# extract data from both IDs
dat1 <- google_analytics(ga_id[1],
  date_range = c(start_date, end_date),
  metrics = "pageviews",
  dimensions = "pageTitle",
  anti_sample = TRUE # avoid sampling
)
dat2 <- ga_data(ga_id[2],
  date_range = c(start_date, end_date),
  metrics = "screenPageViews",
  dimensions = "pageTitle",
  limit = -1 # return all data (no limit)
)# combine data from both IDs
dat <- full_join(dat1, dat2, by = "pageTitle")
dat$page_views <- rowSums(select(dat, pageviews, screenPageViews),
  na.rm = TRUE
)## Create a table of the most viewed posts
library(lubridate)
library(reactable)
library(stringr) most_viewed_posts <- dat %>%
  mutate(Title = str_sub(pageTitle, start = 1, end = -nchar(" - Stats and R"))) %>% # remove blog site in pageTitle
  count(Title, wt = page_views, sort = TRUE) %>%
  mutate(Title = str_trunc(Title, width = 30)) # keep maximum 30 characters# plot
top_n(most_viewed_posts, n = 7, n) %>% # edit n for more or less pages to display
  ggplot(., aes(x = reorder(Title, n), y = n)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  theme_minimal() +
  coord_flip() +
  labs(
    y = "Page views",
    x = "Page title",
    title = "Top performing pages",
    subtitle = paste0(format(start_date, "%b %d, %Y"), " to ", format(end_date, "%b %d, %Y")),
    caption = "Data: Google Analytics data of statsandr"
  ) +
  scale_y_continuous(labels = scales::comma) # better y labels

作者的情节

表现最佳的帖子与去年非常相似,即:

  1. R 中的描述性统计
  2. R 中的离群点检测
  3. R 中的相关系数和相关检验
  4. R 中的方差分析
  5. R 中独立性的卡方检验

由于它们是几年来阅读量最大的帖子,我已经通过 Gumroad 提供下载。

按国家列出的页面浏览量

了解你的读者来自哪个国家也很有用,特别是对于电子商务或者除了写文章以外还销售实体产品的博客。

# extract data from both IDs
dat1 <- google_analytics(ga_id[1],
  date_range = c(start_date, end_date),
  metrics = "pageviews",
  dimensions = "country",
  anti_sample = TRUE # avoid sampling
)
dat2 <- ga_data(ga_id[2],
  date_range = c(start_date, end_date),
  metrics = "screenPageViews",
  dimensions = "country",
  limit = -1 # return all data (no limit)
)# combine data from both IDs
dat <- full_join(dat1, dat2, by = "country")
dat$page_views <- rowSums(select(dat, pageviews, screenPageViews),
  na.rm = TRUE
)# table
countries <- dat %>%
  mutate(Country = str_trunc(country, width = 30)) %>% # keep maximum 30 characters
  count(Country, wt = pageviews, sort = TRUE)# plot
top_n(countries, n = 10, n) %>% # edit n for more or less countries to display
  ggplot(., aes(x = reorder(Country, n), y = n)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  theme_minimal() +
  coord_flip() +
  labs(
    y = "Page views",
    x = "Country",
    title = "Top performing countries",
    subtitle = paste0(format(start_date, "%b %d, %Y"), " to ", format(end_date, "%b %d, %Y")),
    caption = "Data: Google Analytics data of statsandr"
  ) +
  scale_y_continuous(labels = scales::comma) + # better y labels
  theme(plot.margin = unit(c(5.5, 7.5, 5.5, 5.5), "pt")) # to avoid the plot being cut on the right edge

作者的情节

对于 Stats 和 R 来说,大多数读者来自美国,很大程度上是因为第二大国家(英国)在页面浏览量方面相差甚远。

这一趋势与去年相同,只是:

  • 英国已经超过印度,而
  • 比利时(曾在 2020 年和 2021 年分别排名第三和第六)现在仅列第八。由于我来自比利时,这表明这个博客这些年来吸引了越来越多的国际读者(而来自我的国家的读者相应地越来越少)。

每周每天的页面浏览量

正如在关于每日页面浏览量演变的章节中所讨论的(查看此章节),似乎有些日子的表现一直比其他日子差。

下面的情节将展示这些日子是什么:

# extract data from both IDs
dat1 <- google_analytics(ga_id[1],
  date_range = c(start_date, end_date),
  metrics = "pageviews",
  dimensions = c("date"),
  anti_sample = TRUE # avoid sampling
)
dat2 <- ga_data(ga_id[2],
  date_range = c(start_date, end_date),
  metrics = "screenPageViews",
  dimensions = c("date"),
  limit = -1 # return all data (no limit)
)# combine data from both IDs
dat <- full_join(dat1, dat2, by = "date")
dat$page_views <- rowSums(select(dat, pageviews, screenPageViews),
  na.rm = TRUE
)
# find day of week
dat$weekday <- wday(dat$date, label = TRUE, abbr = TRUE)## Reordering dat$weekday so Monday is first
dat$weekday <- factor(dat$weekday,
  levels = c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
)# boxplot
library(scales)
dat %>%
  ggplot(aes(x = weekday, y = page_views)) +
  geom_boxplot(fill = "steelblue", outlier.colour = alpha(0.25)) +
  geom_jitter(alpha = 0.25) + # adds transparency
  theme_minimal() +
  labs(
    y = "Page views",
    x = "",
    title = "Page views per day of week",
    subtitle = paste0(format(start_date, "%b %d, %Y"), " to ", format(end_date, "%b %d, %Y")),
    caption = "Data: Google Analytics data of statsandr"
  ) +
  scale_y_continuous(labels = scales::comma) # better y labels

作者的情节

正如一个技术博客所预期的那样,一周内的读者比周末多得多。

感谢信

感谢所有今年来到 Stats and R 的读者。你让这段旅程变得无比丰富。对于明年和未来的许多年,我将继续写我熟悉和感兴趣的话题。敬请关注!

感谢阅读。我希望这篇文章能帮助你在 R 中分析你的 Google Analytics 数据,或者帮助你结合你的 Universal Analytics 和 Google Analytics 4 数据。有关 R 中 GA 数据的可视化或汇总的更多示例,另请参见往年的评论。

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

相关文章

  • Stats 和 R 都 2 岁了!
  • 如何跟踪你的博客在 R?
  • 如何让自己了解最新的 R 新闻?
  • 为什么我有一个数据科学博客?分享代码的 7 个好处
  • R 中的图形与 ggplot2

原载于 2022 年 12 月 16 日 https://statsandrhttps://statsandr/blog/review-of-2022/

谷歌云实体+情感分析快速参考

原文:https://towardsdatascience/google-cloud-entity-sentiment-analysis-quick-reference-2a4196546133

为什么通过调查收集和分析开放式文本回答很有帮助(如果你也可以使用 NLP)

介绍

本文提供了一个关于使用 Google Cloud 的自然语言 API 作为工具的快速参考,可以帮助您快速分析反馈调查中的开放文本响应。

反馈调查通常采用问卷的形式,征求客户或员工对产品、服务或其他主题的反馈。调查可以是在线的,也可以是离线的,通常包括关于满意度的问题、对质量的意见以及改进的建议。客户或员工可以以文本响应的形式提供反馈,这可能难以手动分析。这就是谷歌云的自然语言 API 的用武之地:它可以帮助你快速轻松地从大量开放的文本数据中提取见解。

图片来源:Canva 的库存图片。

如果你还不知道,自然语言处理 (NLP)是计算机科学和语言学的一个领域,处理计算机和人类语言之间的交互。它包括开发能够理解人类语言输入并以人类自然的方式做出反应的程序。NLP 应用程序可用于情感分析、文本分类和机器翻译等任务。

在阅读下面的内容之前,同样重要的是,NLP 技术至少可以在两个主要方面提供帮助。首先,NLP 可以量化情绪。第二,NLP 可以识别实体

情感分析量化情感,它是识别和量化文本中表达的情感的过程。通常,情感分析用于确定文档或文档的一部分的总体情感。此外,该分析可以量化整个文档、段落、段落、句子或实体级别的情感。

自然语言处理中的实体分析是指对文本中的物、人、场所、对象等有形物体进行识别和分类。粗略地说,你可能认为实体是一个“名词”

收集非结构化的开放式回答,优势

首先,许多人可能会建议不要在调查中收集开放式的回答。避免这种非结构化的数据收集将减少与进行分析相关的技术挑战。的确,没有任何分析能够完全概括大量开放式文本回复中的所有细微差别。然而,包括 Fowler (2014)和 Heinrich (2005)在内的多位科学家记录了与开放式调查项目相关的方法优势和劣势。开放式问题有可能发现或“获得意想不到的答案”(Fowler,2014 年,第 88 页)。同样,这种开放式的回答可能揭示主题、思想、观点或“研究者未知的参考框架”(Heinrich,2005,第 559 页)。相关的、开放式的回答有助于“思维过程的检查”(Heinrich,2005,第 559 页)。

开放式文本收集,缺点

非结构化的开放式文本数据收集和相关分析策略的主要弱点之一是,来自不太感兴趣、注意力分散或没有响应动机的潜在回答者的数据可能较少。可能有帮助的替代策略包括涉及面对面互动的数据收集策略(访谈、焦点小组、电话或其他双向交流)。双向沟通的存在允许访问者或焦点小组主持人从研究参与者和回答者那里探索更多的细节。此外,研究人员可以考虑从受访者那里收集定量、序数和名义数据。这种定量的、有序的和名义上的数据可能有助于确定一项研究可能提出的其他开放式问题。具体而言,定量数据、序数数据和名词性数据可以帮助识别对回答者来说更有趣和更吸引人的开放式问题主题。理论上,问一些让受访者感兴趣的开放式问题,会让受访者在分心或缺乏动力的情况下更好地生存下来。

谷歌的云的自然语言 API 能有什么帮助

谷歌的云的自然语言 API 可以通过从大量开放的文本数据中提取见解来帮助分析调查响应。该 API 可用于快速、轻松地从大量开放文本数据中提取见解。这对于情感分析、文本分类和机器翻译等任务很有帮助。

请记住,机器学习输出的计算机审查可以帮助人类审查打开的文本。但是,没有什么可以替代对文本中讨论的主题有所了解的人的审查。

谷歌云的自然语言 API(或其他可以量化文档任何层次情感的工具)最强大的用途之一是,这样做有能力部分抽象调查响应提交的信息。例如,一些调查受访者可能会提交符合个人身份信息条件的信息。同样,受访者有时可能会提交令人不快的信息。通过提取实体,然后在响应或实体级别找到情感,该过程增加了一层,该层可以帮助限制限制性或攻击性响应的传播。

更多关于情绪

为了更深入地理解上面的内容,考虑一下“量化情感”意味着什么是有帮助的在一个最简单的例子中,情绪分数通常将快乐和高兴识别为积极的。否则它通常会将悲伤或愤怒识别为负面的。谷歌云实体情感分析 API 返回一个介于-1 和 1 之间的情感得分。通常,接近 0 的分数表示中性情绪,而接近-1 的分数表示消极情绪,接近 1 的分数表示积极情绪。(引用)。

关于显著性的一个注记

突出度是谷歌云的自然语言 API 和其他 NLP 工具提供的另一个重要指标。“显著性分数”表示该实体对整个文档文本的重要性或相关性(引)。具体来说,“这个分数可以通过区分显著实体的优先级来帮助信息检索和摘要。更接近 0.0 的分数不太重要,而更接近 1.0 的分数非常重要。”(引自)。

结论

我撰写本指南是为了帮助分析师和其他人准备反馈调查,或任何可能涉及一个或多个要求开放式回答的问题的调查。在这种情况下,单端响应可能是这样的:

图片来源:作者使用调查软件和屏幕截图的插图。

我还希望本指南能为使用谷歌云的自然语言 API 帮助开放式调查反馈的情感分析提供快速参考。该 API 可用于从大量开放文本数据中提取见解,这有助于情感分析、文本分类和机器翻译等任务。此外,通过提取实体并在响应或实体级别发现情绪,API 可用于帮助限制受限或攻击性响应的传播。

将实体分析与情感评分相结合是一种强大的技术,每个拥有调查数据的人都应该考虑利用这种技术。通过提取实体,然后在响应或实体级别找到情感,我们可以获得对我们收到的响应的有价值的见解。这可以帮助我们更好地理解我们正在收集的数据,并识别数据的任何潜在问题。此外,这项技术可以帮助我们限制限制性或攻击性反应的传播。

感谢阅读

你准备好了解更多关于数据科学职业的信息了吗?我进行一对一的职业辅导,并有一份每周电子邮件列表,帮助专业求职者获取数据。联系我了解更多信息。

感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。推特:@ adamrossnelsonLinkedIn:亚当罗斯尼尔森。

参考资料:

F. J .福勒(2014 年)。调查研究方法(第 5 版。).千橡,加州:圣人出版社。

海因里希·h . a .(2005 年)。谁感知集体的过去,如何感知?对开放式问题的拒绝是实质性的回答吗?质与量,39 (5),559–579。

用简笔画理解谷歌云 IAM 概念

原文:https://towardsdatascience/google-cloud-iam-with-stick-figures-cd5ce19c142b

用涂鸦描述谷歌云平台上的 IAM 概念

IAM 概念插图-作者图片

用类比和例子解释新概念会很有帮助。在本文中,我将尝试使用涂鸦来解释 GCP 的 IAM(身份和访问管理)概念。GCP 的 IAM 并不特别难,尽管这样做很有趣,我希望我不那么复杂的涂鸦能帮助你多理解一点 IAM 的概念。

在我们开始之前,这里有一个我们将涉及的每个关键概念的地图,以便您可以跟随类比。

  • 人物:在 GCP,这相当于一个principal或者identity。这可能是一个实际的用户帐户(alex@example)、一个服务帐户或其他实体。我将交替使用“主体”和“身份”。
  • :相当于 GCP 的一个role。例如,alex@example 可以有一个云存储桶管理员角色。
  • 房子:相当于 GCP 的一个resource。这可能是一个计算引擎实例或 BigQuery。

使用上面的图像作为指导,让我们想象简笔画用户(可能是任何 GCP identity)试图进入一所房子(可能是任何resource,像 GCP 的计算引擎实例)。需要进行一些验证,以确保我们的用户拥有正确的 权限 来访问特定的属性。用户需要被授予正确的权限才能继续。

在 IAM 中,访问资源的权限不是直接授予终端用户的。相反,权限被分组到角色中,角色被授予经过身份验证的主体。

那么什么是角色呢?

一个角色是权限的集合。权限决定了允许对资源进行哪些操作。当您将一个role授予一个principal时,您就授予了该角色包含的所有权限。

什么是权限?

权限决定了允许对资源进行哪些操作。例如,“调用”云功能是可以在云功能上执行的操作。在 IAM 世界中,权限以service.resource.verb的形式表示,例如pubsub.subscriptions.consume

继续上图中的例子,图中的将代表一个*role*,它可能被分配了以下虚拟权限:living.house.openFrontDoorliving.house.openKitchenDoorliving.house.openBasement

对密钥(即角色)的允许权限—按作者排列的图像

在 GCP,角色和权限的映射在概念上是这样的:

图片来源— 谷歌云平台

既然我们已经为密钥分配了权限,流程的下一步就是将密钥分配给简笔画用户。我们还需要让房屋主人知道用户在物业中被允许做什么。要做到这一点,我们需要某种策略来概述授权用户并明确定义他们可以做什么。

为了在 GCP 实现这一点,每个资源被分配一个叫做 IAM 策略 的东西。

IAM 策略

一个 IAM 策略定义并强制执行哪些角色被授予哪些身份。此策略附加到资源。如果我们有 20 个计算引擎实例,它们每个都有一个 IAM 策略。重要的是,如果您将策略分配给 GCP 项目,用户将获得整个项目的指定角色。

所以实际上,IAM 策略只是绑定的集合。绑定是将身份与角色联系起来的东西。以下是 GCP 实际的 IAM 政策。

{
  "bindings": [
    {
      "members": [
        "user:alex@example"
      ],
      "role": "roles/pubsub.subscriptions.consume"
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

IAM 策略可以是 JSON 或 YAML 格式。你可以在这里阅读更多关于 IAM 政策的信息。

最后,想象我们有一个叫做“IAM”的房子主人,在插图中的房产前站岗。当我们经过身份验证的用户试图访问这个房产(又名resource)时,IAM 会检查房子的策略,以确定用户试图执行的操作是否被允许。

IAM 政策说明—作者图片

如果根据预定义的策略允许该动作,则用户将被允许在房子上执行该动作(也称为resource)。

结论

我们已经看了 Google Cloud 中 IAM 的几个关键概念,我希望这些插图有助于更好地理解。IAM 允许您授予对特定 Google 云资源的细粒度访问权限,并帮助阻止对其他资源的访问。IAM 允许您采用最小特权的安全原则,即任何人都不应该拥有超过他们实际需要的权限。

继续在您的环境中尝试这些!

你可以成为的中等会员,享受更多这样的故事。

参考

  • IAM 政策
  • https://cloud.google/iam/docs/overview

Google Cloud vs. Fly.io 作为 Heroku 替代方案

原文:https://towardsdatascience/google-cloud-vs-fly-io-as-heroku-alternatives-1f5a47716a58

自由层 Docker 部署的比较

照片由 Poodar Chu 在 Unsplash 上拍摄

随着 Heroku 的免费层时代的结束,我正在努力寻找一个替代方案来托管我的 web 应用程序。我之前的一篇关于使用 Heroku 部署 Docker 的文章肯定不太适合。

对于各种工作流,有许多 Heroku 替代方案,但在我的例子中,它是专门用于使用 Docker 映像部署 web 应用程序的。因此,我需要一个可以构建 docker 映像和托管 docker 容器的服务,谷歌云平台(GCP)和 Fly.io 是很有前途的替代品。

本文简要解释了使用 GCP 和 Fly.io 的部署过程,并将对这两个平台的最终用户体验进行比较,重点是免费定制域名、易于部署、易于维护、价格差异、冷启动等。

诚然,我并不精通 docker 和特定于平台(GCP,Fly.io)的知识,我可能会指出有解决方案或变通办法的问题。欢迎在评论中分享你的专业知识!

目录

  • 使用谷歌云部署
  • 使用 Fly.io 部署
  • 易于部署
  • 易于维护(CICD)
  • 免费自定义域名对比
  • 计费对比
  • 启动时间对比
  • 环境变量和秘密比较

注:由于这是我的爱好项目,我关心的是尽可能降低成本,但不幸的是,它可能不会完全免费。我将详细说明什么是自由层功能和限制,以及如何根据部署设置产生成本。

使用 Google 云部署

要使用 Google Cloud Console 部署 Docker 工作流,这些是您将使用的主要服务及其用途,

  • 云运行:指定构建设置,部署 Docker 容器
  • 云构建:设置规则触发云运行,实现持续集成持续部署(CICD)
  • 容器注册或工件注册:存储容器图像,工件注册比容器注册贵 4 倍左右,功能稍微多一些(但可能不必要)
  • IAM & Admin :管理项目权限

根据您的用例,您可能还需要其他服务,比如用于管理秘密的秘密管理器,这将在本文的最后一节详细介绍。

因为本文旨在进行比较,所以我不会重点介绍 GCP 部署的分步指南。如果你有兴趣,我推荐这本关于 Google 云部署的指南。

使用 Fly.io 部署

Fly.io 使用的是命令行实用程序flyctl,大部分初始设置都是使用命令行完成的。设置中涉及的主要步骤是,

  1. 注册 Fly.io :安装flyctl并注册 Fly.io
  2. 注册 Docker Hub(可选):如果您正在本地运行 Docker 来测试您的应用程序(我强烈推荐这一点),您将需要一个 Docker Hub 帐户来推送至 Docker 注册表,Fly.io 将从那里部署您的 Docker 映像。否则,将使用 Fly.io 的内部注册表。
  3. 启动应用程序:这是为您的应用程序创建配置的一次性设置
  4. 部署应用程序:这是通过一行命令完成的!

设置文档可以在 Fly.io 动手教程中找到。

易于部署

获胜者: Fly.io 为了更大的透明度

在部署方面的一个巨大差异是,谷歌云控制台允许用户在连接网页的同时进行部署,而不是像 Fly.io 那样需要用户运行命令行操作。

虽然使用网页更加用户友好,但我觉得在 Google Cloud 上部署有一个更陡峭的学习曲线,因为 Google 提供了所有的产品。这一点在谷歌服务的使用量(云运行、云构建等)中显而易见。).

就其服务而言,Fly.io 更加透明和直接,您不会因为您不知道自己正在使用的服务而被收费(在接下来的部分中会有更多介绍)!

易于维护(CICD)

赢家:谷歌云如果你知道自己在做什么,否则可能会有令人震惊的代价

我将维护分为三类,重新部署、扩展和处理旧版本。

重新部署

作为持续集成持续部署(CICD)最佳实践的一部分,Google Cloud 附带了 Cloud Build ,它在存储库分支更新时触发云运行重新部署。如果您想要更改部署设置,例如 CPU 的数量,您还可以在云运行上手动重新触发部署。

这在 Fly.io 中就不那么简单了,在 fly . io 中,重新触发必须使用命令行终端来完成。或者,您可以使用 Fly.io 设置 GitHub 动作,以便在存储库分支更新时重新部署,这与 Google Cloud 相比是一个额外的步骤,但仍然可以完成工作。

缩放比例

云托管的一个重要方面是能够动态地扩展和缩减实例(CPU 和内存),并支持自动扩展(实例数量)。这两个平台都具有可伸缩性和自动伸缩性,但实现方式不同。

图 1:谷歌云上的自动缩放——作者图片

Google Cloud 伸缩可以通过修改构建设置来推送新的版本,而自动伸缩则取决于实例的最大和最小数量(图 1)。所有这些改变都可以在谷歌云控制台上轻松完成。

图 2:fly . io 上的缩放——作者图片

在 Fly.io 中,缩放是在 Fly 仪表板上完成的(图 2 ),新的修订会立即推送,而指定实例数量和启用自动缩放只能使用命令行来完成。我发现这很麻烦,因为我不能在旅途中改变我的实例数量,只能在安装了flyctl的笔记本电脑上这样做。

处理旧版本

在 Heroku 中,旧版本是可见的,用户可以很容易地回滚到以前的版本,这是我所欣赏的。回滚也可以在 Cloud Run 上的 Google Cloud Console 中完成,用户可以从容器注册表或工件注册表中指定容器映像 URL。

图 3:云存储的价格——作者图片

这让我想到了我的下一个观点,容器注册或工件注册存储了您以前的所有容器映像——而这种存储是有代价的。我想当然地认为它会像 Heroku 一样免费,直到我经历了人生中的震惊(图 3)。此外,谷歌云控制台没有任何允许用户自动删除旧版本的选项——这种删除必须手动完成。

如果您将容器映像存储在容器注册中心或工件注册中心,记得经常清除旧的构建!

在 Fly.io 中,旧的构建被丢弃,只有现有的构建可以在 Fly 仪表板上查看。这意味着无法进行回滚。

总的来说,我发现在谷歌云上维护我的网络应用程序更容易——只要你知道你在做什么。

免费自定义域名比较

胜利者: Fly.io 手放下

正如本文开头提到的,我保持低成本,我没有自己定制域名,依赖于平台提供商提供的免费定制域名。

Google Cloud 的默认域名格式是<app-name>-<random-string>.a.run.app,坦率地说,这种格式不容易记住,看起来不太好,也不像 URL。比如我的 web 应用有 的链接 Kay Jan-634 I2 gf 6 LQ-as . a . run . app(这个链接可能无效)。

Fly.io 有一个更友好、更酷、更容易记住的域名,格式为<app-name>.fly.dev,我的 web 应用有链接 kayjan.fly.dev 。这是 Fly.io 的一大加分点!

帐单比较

赢家: Fly.io 对最大成本的更多控制

与主要的云服务一样,谷歌云根据使用情况收费。对于低使用率,它可能是免费的,但对于高使用率,没有最大成本的保证,因为它会自动扩展您的应用程序。

Fly.io 提供了对成本的更多控制,因为它基于设置(而不是使用)收费,并且免费层具有 3 倍 CPU 和 256MB 内存余量。升级设置将根据 Fly.io 定价指南收取相应费用。除非启用自动缩放,否则如果超出资源,web 应用程序将没有响应,并且您还会收到一封关于崩溃的电子邮件。

如果您更喜欢自动扩展以获得高可用性,Google Cloud 和 Fly.io 在将产生的最大成本方面提供了相同的不确定性。但是,如果您不关心高可用性,限制资源可能是控制成本的好方法。

启动时间比较

赢家: Fly.io 如果你想保持严格免费

为了减少冷启动,我们可以在 Google Cloud Run 上将最小实例设置为 1。但是,我意识到资源正在被消耗,并且我不断地被收取使用费用(或缺少使用费用),所以我将最小实例设置为 0,以获得某种程度的“自由”层。我的 web 应用程序的冷启动需要大约 5-10 秒的时间来加载。

如前所述,Fly.io 根据设置而不是使用情况收费,其免费层有 3 倍 CPU 和 256MB 内存。这意味着 Fly.io 服务始终可用,即使对于自由层也不会有冷启动

环境变量和机密比较

获胜者:谷歌云用于秘密管理,但有成本

图 4:在云上设置环境变量和秘密——作者图片

对于我的 web 应用程序,我在代码中将 API 键设置为环境变量。谷歌云控制台允许我在云运行(图 4)中定义环境变量和秘密。一个警告是,这需要 Secrets Manager,另一个谷歌云服务,并且访问操作是收费的。Fly.io 还允许用户设置秘密,但不需要额外的费用。

如果访问控制和安全性是您的应用程序最关心的问题,Google Cloud 有更严格和可定制的 IAM 策略。否则 Fly.io 实现 secrets 零成本就足够了。

希望你对使用 Google Cloud 和 Fly.io 进行部署有了更好的理解,并从我代价高昂的错误中吸取了教训。由于我最近刚从 Heroku 换过来,考虑到我的网络应用程序使用和 GCP 与 Fly.io 的不同计费框架,我不确定从长远来看哪个平台更贵

我确实偏爱 Fly.io,因为免费的自定义域名和快速的启动时间对我来说是巨大的决定因素。你选择虚拟主机服务的决定因素是什么?我很乐意听听你的想法!

相关链接

  • 我的 web 应用(fly . io):https://Kay Jan . fly . dev

Google Colab:你绝对应该试试的在线 Jupyter 笔记本

原文:https://towardsdatascience/google-colab-an-online-jupyter-notebook-that-you-should-definitely-try-2572a3d4afb6

谷歌的 Colab 允许任何人在任何地方在线编写和分享 Jupyter 笔记本

Google Colab 中的 Jupyter 笔记本——作者图片

谷歌 Colab 我用得挺多的。它曾经是我默认的 Jupyter 笔记本环境,也是我许多关于 Medium 的文章的起点(我现在也使用 VSCode,但那是另一个故事了)。

Colab 是谷歌的在线 Jupyter 笔记本环境。它可以做本地笔记本会做的一切(甚至更多),但它在云中,所以没有软件安装是必要的,它可以从任何连接互联网的计算机上获得。

它看起来非常熟悉,类似于您可能已经安装在自己的 PC 上的 Jupyter 环境——我们稍后将研究一些差异。

它目前只运行 Python 3(尽管 R 和 Scala 被认为是未来可能的发展方向),并且已经安装了许多最流行的 Python 库。

如果你需要安装任何额外的软件包,你可以使用笔记本电脑中的 pip 来完成。

!pip install a-new-package

这将在您的会话期间保持加载状态。

一个谷歌账户

要使用 Colab,您需要一个 Google 帐户,否则,不需要设置,您创建的任何笔记本都将存储在与您的帐户关联的 Google Drive 中。如果您愿意,也可以将它们放在 Github 存储库中。

Google Colab 是在免费增值的基础上提供的。免费订阅层的资源有限,尽管我认为你需要做一些非常复杂的事情才能达到极限。如果您需要更多的内存或计算能力,您可以订阅更高的层。

如果您的本地机器上有笔记本,您可以将它们上传到 Colab,也可以下载 Colab 笔记本以将其存储在本地。

Colab 笔记本在虚拟机中执行,如果它闲置了一段时间,就会自动终止,尽管如果你在工作时不小心关闭了浏览器,你可能会发现当你再次打开它时,笔记本仍然在运行。你可以让一个虚拟机运行的最长时间是有限的,但谷歌建议这可以长达 12 小时。

所有这一切似乎意味着,出于各种意图和目的,Colab 对个人使用是免费的,但如果你需要将其用于商业目的,你可能需要每月支付几美元。

数据存储在你的谷歌硬盘上。提供了库来读写驱动器,当然,您可以使用常用的 Python 包从 web 加载数据。

Jupyter 笔记本电脑非常适合数据科学,Colab 也是如此,但此外,如果你想在 Tensorflow(当然包括)中运行 ML 代码,那么 Colab 提供了 GPU,以便更好地运行你的代码。

它看起来像什么

正如你从下面的图片中看到的,布局与标准的 Jupyter 笔记本非常相似。但是 Colab 有一些不同之处。

来自 Google Colab 的截图——图片由作者提供

Jupyter 笔记本截图——图片由作者提供

您可以看到的主要区别是 Colab 中缺少图标,但所有命令都可以从下拉菜单或每个单元格上方的图标栏中获得。

Colab 中的单元格图标栏—按作者排序的图像

Colab 中没有内核菜单,因为只有一个内核可供选择——重启内核是通过运行时菜单完成的。

检查数据

Colab 的一个非常有用的特性是变量面板,在这里你可以看到每个当前变量的类型和值。

“Colab 变量”面板—按作者分类的图像

更令人印象深刻的是,你可以把一个数据帧看作一个交互式的表格。当您从代码单元格显示数据帧时,如下面的单元格所示…

Colab 单元格中显示的数据框架—作者图片

您将看到一个淡蓝色的图标,单击该图标将调用交互式表格。

互动表格—作者图片

您不仅可以看到表中的数据和所有值,还可以通过各列中的值来过滤数据,并通过单击列标题来对数据进行排序。

尝试

正如我前面提到的,Colab 曾经是我的 go to Jupyter 编辑器,原因之一是我希望能够在不同的机器上从不同的地方运行和编辑我的代码。Colab 使这变得极其容易。

另一个优势是,在云中运行 Colab 笔记本的计算能力远远优于我用来编辑笔记本的通常很弱的硬件,这意味着它们会运行得更好更快。

我希望对 Google Colab 的简要介绍对您有所帮助,并且您可以尝试一下。

一如既往,感谢阅读。如果你愿意,你可以订阅我偶尔发布的免费时事通讯,Substack 上的Technofile——我在那里发布新文章。这里举例来说就是我写的一堆 Streamlit 文章的帖子。

https://alanjones2.github.io/

2022 年谷歌数据云峰会:回顾

原文:https://towardsdatascience/google-data-cloud-summit-2022-recap-e1c6d5097ccd

谷歌云平台的许多新更新概述

活动发起人在 Unsplash 上的照片

“数据是无限的”这句话拉开了谷歌 2022 年云峰会的序幕,看起来这一思维过程将成为未来几年他们各种云产品的中心主题。我们做的每一件事所使用的数据量都有了巨大的增长,谷歌认为这种趋势不会很快停止。今年的云峰会是对基于云的数据技术的未来的一个很好的预览,所以让我们来看看谷歌云平台的未来。

主题演讲 1:统一数据实现无限创新

发言人 Gerrit Kazmaier 和 Anita Kibunguchy-Grant 首先概述了云数据解决方案的重要性。如此多的公司正在迅速转向在线的、以数据为中心的解决方案,对像数据工程师这样的角色的需求出现了巨大的增长。谷歌宣布,它自己的云数据工程证书被评为全球专业数据工程证书的第一名——如果你正在考虑学习数据工程,现在似乎是开始的好时机!

在概述之后,两位演讲者采访了沃达丰的首席信息官 Ignacio Garcia,他给出了一些谷歌产品的真实使用案例。他们的公司拥有数百万不同的用户,服务遍布整个欧洲,以下是他们使用 GCP 的三种主要方式:

  • 数据物流

沃达丰有大量的数据存储在遍布欧洲大陆的众多孤岛中。为了将这些数据从这些遗留系统转移到云中,他们需要良好的、可扩展的管道。他们通过 Google Cloud 使用 Dynamo、DataFusion 和 DataPro 实现了这一目标。

  • 数据平台

为了存储所有这些数据,沃达丰需要一个用于分析和查询的一体化中心。他们使用 BigQuery 监控一切,并为 BI 和分析创建报告。

  • 数据建模

沃达丰希望使用机器学习来更快、更有效地解决客户的问题。通过使用 VertexAI,他们能够在谷歌云中建立 ML 模型,以做出数据驱动的决策。

这个演练很好地展示了如何将 Google 的一些云产品结合起来实现一个共同的目标。他们的公司现在对客户需求的响应能力大大提高,并且他们的存储解决方案的错误总数和总体成本显著下降。

新产品发布

沃达丰采访结束后,主题演讲以快速概述谷歌云的一些新产品结束。对一些现有应用程序进行了许多激动人心的更新,并发布了新的 GCP 产品!

谷歌大湖(预览版)

  • BigLake 将给开发者一个统一数据湖和数据仓库的平台。该功能将全面扩展 BigQueries 的功能,并允许用户跨云和使用开源引擎工作。
  • 对于必须处理跨各种来源、云和格式存储的大量数据的工程师来说,这将是惊人的。

图片由谷歌云团队提供

云扳手换流

  • 该应用程序将为用户提供实时复制数据库变化的能力。谷歌还将使 Spanner 的访问民主化,让更多用户看到这些变化。
  • 对于云开发者来说,能够在云上测试应用程序并实时观察变化将是巨大的。

谷歌云上的火花

  • GCP 将拥有第一个自动扩展的无服务器 Spark 集成。这将简化整体开发体验,并允许分析师在大量不同的 GCP 平台上运行统一的工作负载。

顶点人工智能工作台

  • 构建和训练模型的速度比传统笔记本电脑快 5 倍!我以前从未使用过 Vertex AI 笔记本,但现在我正在考虑使用它。

图片由谷歌云团队提供

MySQL 云 SQL 洞察

  • 洞察将为理解和解决数据库性能提供更好的反馈。

统一 BI

  • 集成了 Looker、Google Sheets 和 Data Studio,提供一体化的云 BI 体验。

对于 GCP 开发者来说,这绝对是一个激动人心的时刻,这些新的应用程序应该为所有用户提供更多的功能和更好的整体体验!

产品路线图

在主要基调之后,活动被分成几个小组,观众可以选择观看的区域。我决定观看谷歌的每一次产品路线图讨论,他们没有让人失望。查看每个演示文稿的幻灯片,以获得良好的概述:

  • 数据分析产品路线图 : 展示

如果您想进一步了解他们的新分析产品,如 BigLake、Analytics Hub 和 Unified BI,本演示适合您。

  • 数据库战略和产品路线图 : 演示

谷歌的产品比以往任何时候都更加可靠,具有行业领先的 99.999%可用性,云 SQL 成为最大限度减少停机时间的行业领导者。如果你对谷歌如何提高其可用性、安全性和治理感兴趣,这个演示是为你准备的。

  • AI/ML 战略和产品路线图 : 演示

随着这些 GCP 新产品的发布,基于云的机器学习和无服务器人工智能正在成为现实。如果你有兴趣了解更多关于 Vertex AI 或 BigQuery 机器学习的知识,这个演示就是为你准备的。

最后但同样重要的是,演示!

2022 云数据峰会在最后一场会议上展示了他们的一些新产品。主要演示是对他们的云架构工具的概述,该工具允许用户构建交互式的基于云的应用程序。演示介绍了一家太阳能公司正在为其客户开发一款应用。使用云扳手,BigQuery,无服务器 Spark,Vertex AI,Looker,扳手。通过使用云架构工具进行设计,他们能够实时测试这款应用!

图片由谷歌云团队提供

演示非常有趣,云架构设计器似乎是创建和管理云应用程序的一个很好的工具。如果你想了解一下,这里有一个链接,可以链接到云架构演示以及其他一些来自 GCP 的有趣演示:

云架构

未来工厂 < — —我的最爱

MLB x 谷歌云

使用谷歌云进行车队管理

如何选择合适的数据库

最终想法

今年参加 Google 的云数据峰会,我学到了很多!演讲者很棒,视觉和演示做得很好,一些新的公告让云开发者看起来很快就会有令人惊讶的新东西。我从整个峰会中最大的收获是:

  • 数据工程将成为 GCP 用户更需要的技能。
  • 谷歌正在让所有人更容易获得整个云体验
  • 基于云的机器学习和商业智能工具将会非常庞大,尤其是对于大型数据科学团队而言。
  • 谷歌正在继续提高安全性和可靠性的门槛,在这一点上,在云上存储数据对我来说几乎是显而易见的!

我肯定会重新观看一些 2022 年峰会,以更好地了解一切,以及看看他们的一些新应用程序一旦发布!如果你读完这篇文章后也有兴趣了解更多,你可以在这里观看整个 2022 峰会。

感谢您的阅读!

想从我这里得到更多?

  1. 在媒体上跟随我
  2. 通过使用我的推荐链接注册媒体来支持我的写作
  3. 在 LinkedIn 和 Twitter 上与我联系
  4. 在bench amble . blog注册订阅我的时事通讯

谷歌足球挑战赛:第一关

原文:https://towardsdatascience/google-foobar-challenge-level-1-3487bb252780

对秘密编码挑战和问题分解的介绍

照片由米切尔罗在 Unsplash

什么是 Foobar 挑战?🧐

Foobar Challenge 是 Google 主办的一项编码挑战,可以用 Python 或 Java 完成。我用 Python 完成了挑战。挑战赛有自己的服务器,提供特定的终端式命令。

图片作者。

为了增加一些乐趣,它以太空为主题。邪恶的指挥官拉姆达绑架了太空兔子,你必须救出他们。每个问题都增加了背景故事的内容。这些问题有不同的难度,分为 5 个级别。每个问题都必须在一定的时间内解决。更多的时间是给更高的水平。

我个人发现 1、2、3 级题和 Leetcode 题差不多,无论是难度还是结构。问题很简单,很少需要优化代码来提高速度。另一方面,第 4 级和第 5 级更复杂,将多个概念整合成一个问题。

如何参加 Foobar 挑战赛?🙋‍♀️

有两种方式参与挑战:

  1. 谷歌通过浏览器发出邀请。
  2. 一位朋友向您发送了一个邀请码

我通过第一种方法遇到了挑战。我在谷歌上搜索“列表理解”寻找另一篇文章,我的浏览器打开了,显示出邀请。我以前从未听说过 Foobar 挑战,所以有点谨慎。在确认这是一个合法的挑战后,我接受了。

不用说,惊喜的元素激起了我对挑战的兴趣。更不用说,谷歌向我发出独家邀请,无疑给了我作为开发人员的信心。我把这看作是对冒险的召唤,并立即想把我所有的注意力都投入进去。

第二种方法,需要朋友给你发邀请码。完成第 2 级后,将获得一个邀请码。另一个是在完成四级后给出的。

如果你有兴趣参加挑战,请告诉我。我有一个未使用的推荐代码。

谷歌会用挑战来招聘员工吗?🤑

谷歌一度利用这一挑战来寻找新的人才。你会在网上找到很多人,他们在完成挑战后的一两天就让谷歌的招聘人员联系他们。然而,自 2020 年以来,谷歌似乎没有在招聘中使用这项挑战。

完成第 3 级后,Foobar 服务器会询问你是否愿意向 Google 招聘人员提供你的联系信息。我提供了我的信息,但是没有他们的消息。

尽管如此,我仍然相信这个挑战是值得的。它将让你接触到新的编码概念,提高你的技能,并最终使你成为一名更好的开发人员。

注意事项和其他提示💡

Google 提供了一个constraints.txt文件,但是它不是很详细。例如,它声明除了列出的几个例外,所有标准库都是允许的。然而,mathnumpy是不允许的,即使它们是公共库。为了测试哪些库是允许的,我导入了这个库,返回了其中一个测试用例的答案,然后验证了这个解决方案。如果解决方案通过了一个测试用例,那么这个库是可以接受的。

此外,在验证代码之前,注释掉所有的 print 语句。任何打印语句都会导致测试用例失败。

输入和输出类型是非常特殊的挑战。如果问题陈述要求特定的输入或输出类型,请确保提供正确的类型。

最后,在这次挑战之前,我没有任何使用 Python 2.7 的经验。事实上,我在 Python 3 中测试了我的许多低级问题的解决方案。后来在挑战中这让我吃了一惊。具体来说,我不知道在 Python 2.7.13 中,如果输入是整数,/运算符会执行整数除法。举个例子,

然而,在 Python 3 中,/执行浮点除法。

问题和概念📚

警告——⛔️前方剧透

下面,我将问题分解,解释我的思考过程。我也提供解决方案。不过, 我强烈推荐你先尝试一下问题 。挑战最好的部分是解决一个难以捉摸的问题的惊喜和满足感。

我考虑过不发布解决方案,只解释基本概念。然而,编码的一部分是学习如何排除故障,并确定代码失败的地方。因此,我决定发布解决方案,这样如果你陷入困境,你就可以准确地看到你的逻辑分歧在哪里。

第一级:问题 1 ⭐️

我爱 Lance & Janice
= = = = = = = = = = = = = = = = = = = = =

你已经抓到你的两个同伴在来回传递密码纸条——当他们在值班的时候!更糟糕的是,你很确定这与工作无关——他们都是太空肥皂剧《兰斯与珍妮丝》的超级粉丝。你知道 Lambda 指挥官有多讨厌浪费,所以如果你能证明这些奴才在浪费她的时间传递与工作无关的纸条,你就离升职更近了一步。

幸运的是,奴才们并不完全是高级的密码学家。在他们的代码中,每个小写字母[a…z]被替换为[z]中相应的一个…a],而其他所有字符(包括大写字母和标点符号)保持不变。也就是,’ a ‘变成了’ z ‘,’ b ‘变成了’ y ‘,’ c ‘变成了’ x '等等。例如,单词“vmxibkgrlm”在解码时会变成“encryption”。

编写一个名为 solution(s)的函数,它接收一个字符串并返回解密后的字符串,这样您就可以向指挥官证明这些奴才在谈论“Lance & Janice”,而不是在做他们的工作。

语言

要提供 Python 解决方案,请编辑 solution.py
要提供 Java 解决方案,请编辑 solution.java

测试用例

输入:
(string)s = " wrw blf hvv ozhg mrtsg ’ h vkrhlwv?"
输出:
(string)“昨晚那集你看了吗?”

输入:
(string) s = “Yvzs!我是 yvor vev Lzmxv olhg srh qly ZG gsv xlolmb!!”
输出:
(字符串)“耶!我不敢相信兰斯丢了他在殖民地的工作!!"

使用 verify [file]测试您的解决方案,看看效果如何。编辑完代码后,使用 submit [file]提交您的答案。如果您的解决方案通过了测试用例,它将从您的主文件夹中删除。

巧合的是,我最近开发了一个移位密码的应用程序,这个问题立刻提醒了我。点击此处了解更多关于移位密码的信息:

只有小写字符需要被破译。其他字符保持不变。首先,创建一个字典来存储编码的字符和它们被解码的对应字符。接下来,使用 for 循环遍历输入字符串中的每个字符。如果字符是小写的,从字典中取出它的解码值。如果没有,将该字符添加到答案字符串中。

在我看来,这个问题旨在测试参与者对strdict数据类型及其内置方法的了解。

结论📌

我计划在以后的文章中继续描述我的 Foobar 之旅,并详细说明我是如何解决这些问题的。关注我,阅读更多关于挑战的信息。此外,欢迎所有反馈。我总是渴望学习新的或更好的做事方法。请随时留下您的评论或联系我 katyhagerty19@gmail。

https://medium/@katyhagerty19/membership

谷歌足球挑战赛:第二关

原文:https://towardsdatascience/google-foobar-challenge-level-2-7a021f625c1

对秘密编码挑战问题的深入探究

Pawel Czerwinski 在 Unsplash 上的照片

第二级包括两个问题。就难度而言,我发现这两个问题都类似于 Leetcode 的简单问题。像第 1 级一样,这些问题需要对内置数据类型及其方法有扎实的理解。

如果你不熟悉 Foobar 挑战,我推荐你阅读我以前的文章,这篇文章提供了 1 级问题的概述和分解。

问题和概念📚

警告——⛔️前方剧透

下面,我将问题分解,解释我的思考过程。我也提供解决方案。不过, 我强烈推荐你先尝试一下问题 。挑战最好的部分是解决一个难以捉摸的问题的惊喜和满足感。

我考虑过不发布解决方案,只解释基本概念。然而,编码的一部分是学习如何排除故障,并确定代码失败的地方。因此,我决定发布解决方案,这样如果你陷入困境,你就可以准确地看到你的逻辑分歧在哪里。

第二级:问题 1 ⭐️

电梯维修

你被分配了繁重的电梯维护任务——啊!除了所有的电梯文档已经在文件柜的底部杂乱无章的堆了好几年,而且你甚至不知道你将要工作的电梯版本号,这不会太糟糕。电梯版本由一系列数字表示,分为主要、次要和修订整数。电梯的新版本增加了主要编号,例如 1、2、3 等等。当新的特征被添加到电梯中而不是一个完整的新版本时,名为“次要”的第二个数字可以用于表示那些新添加的特征,例如 1.0、1.1、1.2 等。小的修复或维护工作可以用第三个数字“修订”来表示,例如 1.1.1、1.1.2、1.2.0 等等。数字 0 可以用作电梯预发布版本的主要版本,例如 0.1、0.5、0.9、2 等(Lambda 指挥官总是小心翼翼地测试她的新技术,以她的忠实追随者为对象!).给定一个用字符串表示的电梯版本列表,写一个函数解(l ),返回同样的列表,按主版本号、次版本号和修订号升序排序,这样你就可以识别当前的电梯版本。列表 l 中的版本将总是包含主要版本号,但是次要版本号和修订版本号是可选的。如果版本包含修订号,那么它也将有一个次版本号。
例如,给定列表 l 为[“1.1.2 “,” 1.0 “,” 1.3.3 “,” 1.0.12 “,” 1.0.2”],函数 solution(l)将返回列表[“1.0 “,” 1.0.2 “,” 1.0.12 “,” 1.1.2 “,” 1.3.3”]。如果两个或多个版本相同,但其中一个版本包含的数字比其他版本多,则这些版本必须根据它们包含的数字升序排列,例如[“1 “、” 1.0 “、” 1.0.0”]。列表 l 中的元素数量至少为 1,不会超过 100。

测试用例
= = = = = = = = = = =
你的代码应该通过下面的测试用例。
注意,它也可以针对这里没有显示的隐藏测试用例运行。

  • Python 案例-
    输入:
    solution.solution([“1.11 “,” 2.0.0 “,” 1.2 “,” 2 “,” 0.1 “,” 1.2.1 “,” 1.1.1 “,” 2.0”])
    输出:
    0.1,1.1.1,1.2,1.2.1,1.11,2,2.0,2.0

输入:
solution.solution([“1.1.2 “,” 1.0 “,” 1.3.3 “,” 1.0.12 “,” 1.0.2”])
输出:
1.0,1.0.2,1.0.12,1.1.2,1.3.3

输入是字符串列表,目标是根据标准对它们进行排序。list类型有一个sort方法,通过执行<比较对列表中的项目进行排序。对于类似于l的字符串列表,sort将查看每个字符串的第一个数字。如果两个字符串有相同的第一个数字,那么比较将使用下一个数字,依此类推。因此,不同长度的字符串之间的比较可能不正确。例如,sort会将“1.12”放在“1.2”之前。字符串具有相同的第一个数字,因此比较将使用下一个数字。由于“1” < “2”,即使 2 小于 12,“1.12”也在“1.2”之前。

如果这些是整数而不是字符串,sort将使用整数进行比较,而不是逐位比较。然而,将每个条目转换为int对于带有修订号的条目不起作用。sort需要将每个组成部分作为一个整数与其对应部分进行比较。将每个项目转换为int类型的list就可以实现这一点。

如下所示,嵌套列表理解创建了answer,一个整数列表的列表。str type 有一个内置的方法split,它给定一个分隔符,将一个字符串分割成子字符串。这里,‘.’是分隔符。split输出子字符串列表,int函数将它们转换成整数。

对于列表的列表,sort将根据每个列表中的第一个元素对项目进行排序。如果元素相等,sort检查下一个元素。answer.sort()就地排序answer

最后,将列表列表转换为字符串列表,即预期的返回值。str.join方法获取一系列字符串并将它们连接起来。‘.’.join将连接字符串,以便‘.’ 分隔输出字符串中的每一项。

这个问题需要字符串方法、list.sort和列表构造的知识。

级别 2:问题 2 ⭐️

途中敬礼

Lambda 指挥官热爱效率,讨厌任何浪费时间的事情。毕竟,她是一只忙碌的羔羊!她慷慨地奖励那些找出效率低下的根源并想出消除它们的方法的追随者。你已经发现了一个这样的源头,你认为解决它将有助于你建立晋升所需的声誉。

每当指挥官的员工在大厅里擦肩而过时,他们每个人都必须停下来向对方敬礼——一次一个人——然后再继续他们的道路。一个敬礼有五秒钟长,所以每次交换敬礼用了整整十秒钟(Lambda 司令的敬礼有点,呃,牵扯)。你认为通过取消敬礼要求,你可以每天节省几个小时的员工时间。但是首先,你需要让她知道问题有多严重。

写一个程序,计算在一次典型的走廊行走中交换了多少次敬礼。大厅由一根弦代表。比如:“— ->-> -”

每个走廊字符串将包含三种不同类型的字符: ‘>’,向右走的员工;

Write a function answer(s) which takes a string representing employees walking along a hallway and returns the number of times the employees will salute. s will contain at least 1 and at most 100 characters, each one of -, >或<./>

Sample output:

Test cases

输入:

s = " >—

Output:

2

Inputs:

s = “<<>> < "

输出:

4

在我看来,这是迄今为止最简单的问题!对于每一个右行走者,计算他/她经过的左行走者的数量。由于每个敬礼都涉及到两个人,所以将经过的左边步行者的数量乘以 2,并将该数量加到答案中。

‘-’字符与答案无关。删除‘-’字符会缩短字符串,从而缩小搜索空间。enumerate功能输出no_dash中每个字符的索引和字符。如果角色是‘>’(一个右行走者),那么创建子串people_in_frontpeople_in_front每一个左行者代表一个敬礼,涉及 2 个人。answer是敬礼的总人数。

这个问题测试字符串、子字符串和循环的知识。

结论📌

我计划在以后的文章中继续描述我的 Foobar 之旅,并详细说明我是如何解决这些问题的。关注我,阅读更多关于挑战的信息。此外,欢迎所有反馈。我总是渴望学习新的或更好的做事方法。请随时留下您的评论或联系我 katyhagerty19@gmail。

https://medium/@katyhagerty19/membership

谷歌正在提供 LaMDA

原文:https://towardsdatascience/google-is-making-lamda-available-3745dd5c4d08

你将能够自己判断它是否有知觉

鸣谢:Lumartist#7282 via Midjourney(没错,这是 AI 生成的)

两个月前,全世界都在关注一件事:谷歌的人工智能系统 LaMDA。一场关于感知和人工智能明显技能的对话吸引了人们长达两周的注意力。现在,谷歌决定是时候向世界开放这个系统了。如果你参加了关于人工智能的辩论,这条新闻会让你感兴趣。

简要回顾:LaMDA 和 AI sentience

除了 GPT-3, LaMDA (对话应用的语言模型)可以说是最著名的大型语言模型(LLM)。谷歌在 2021 年 I/O 主题演讲上宣布了这一消息,但它只是在去年 6 月引起了公众的注意,当时《华盛顿邮报》记者妮塔莎·蒂库发表了一篇关于布雷克·莱莫因(现谷歌前工程师)和他对 LaMDA 感知的说法的报道。

莱莫因的信念——加上 LLM 明显的语言掌握——引发了一场关于意识、拟人化和人工智能炒作的激动人心的对话。当时我给了我的两分钱。我没有参与支持或反对莱莫因立场的辩论,而是采取了不同的视角。我解释说,问 LaMDA 是否有知觉,这本身就是一个空洞的问题。我们没有合适的术语或合适的工具来认为这是一个科学问题——它是不可证伪的,因此“甚至没有错。”

正如妮塔莎·蒂库所写的,莱莫因澄清说,他认为 LaMDA 是一个“以牧师的身份,而不是科学家”的人。尽管如此,他还是花了很多时间试图拿出科学证据来说服他在谷歌的同事。但是他失败了。谷歌的一位发言人总结道:“没有证据表明 LaMDA 是有感情的(有很多证据反对这一点)。”

莱莫因写了一篇文章公开分享了一段可能未经编辑的与 LaMDA 的对话。我读了它,我看到了和人工智能伦理学家玛格丽特·米歇尔看到的一样的东西,“一个计算机程序,而不是一个人。”然而,尽管事实上大多数人不同意莱莫因的观点,LaMDA 的知名度越来越高,许多人想得到它,亲眼看看到底是怎么回事。现在,谷歌正在让这成为可能。

谷歌正在提供 LaMDA

该公司计划通过 AI Test Kitchen 发布 LaMDA,这是一个旨在让人们“了解、体验和反馈”该模型的网站(可能还有其他人,如 PaLM)。他们承认 LaMDA 还没有准备好在世界上部署,并希望通过真人的反馈来改进它。人工智能测试厨房不像 GPT 3 的游乐场那样开放——谷歌已经建立了三个主题演示,但一旦他们积极地重新评估 LaMDA 为开放对话做好准备,将有望解除限制。

该模型是 LaMDA 的第二个版本,比桑德尔·皮帅去年在主题演讲中展示的有所改进。LaMDA 2 可以进行创造性和引人入胜的对话,并像第一代一样“即时”做出回应,但在安全性、实用性和对话质量(分为敏感性、特异性和趣味性)方面有所改善,变量由谷歌精心定义。

为了有资格使用它,你可以注册一个等候名单 (OpenAI 的风格)。谷歌将让“小群体的人逐渐”进入。在使用 LaMDA 时要小心,因为谷歌已经声明他们可以使用你的对话来改进产品和服务,人类评论者将能够“阅读、注释和处理”你的聊天(如果你不希望谷歌存储它们,你可以在退出演示之前删除你的会议)。不用说,不要在你的交流中包含任何个人信息。除此之外,你不应该明确地写性(例如,你不能描述性场景),充满仇恨(例如,你不能使用诽谤),或者是非法的(例如,你不能宣传恐怖主义)。

就目前而言,AI 测试厨房提供了三个演示:想象、列举、谈论(狗版)。在第一个故事中,你从一个地方开始,LaMDA 将“提供探索你想象力的途径。”在第二篇中,LAMDA 将尝试将一个主题或目标分解成子任务。第三个是一个开放式的环境,你可以谈论任何事情,LaMDA 会尝试将话题转回到狗身上。

谷歌已经实施了一套过滤器来降低 LaMDA 产生不适当或不准确响应的概率,但他们并没有完全消除这些风险(用当前的方法是不可能的)。对于 GPT-3、J1-Jumbo 和任何其他公开可用的 LLM 也是如此。

虽然谷歌已经建立的演示不是成品,但它们标志着该公司最终将 LaMDA 嵌入搜索和谷歌助手等服务的意图。正如我在之前的一篇文章中所说的,科技公司将 LLM 整合到现有服务中只是时间问题——这就是为什么我们应该仔细评估这项技术是否已经准备好了。

让我来说明这是一个怎样的问题。一方面,LaMDA(以及 GPT-3 和其他 LLM)会产生有害的输出和事实上不准确的信息。另一方面,它掌握了创造人格幻觉的能力——正如莱莫因的主张所暗示的那样。想象一下,如果 LaMDA 为 Google Assistant 提供动力,会产生什么样的下游影响。人们可能是模型的毒性和偏见的受害者,他们会盲目地相信它说的话,尽管模型有幻觉的倾向,而且他们可能——就像莱莫因发生的那样——对它产生依恋。

我们已经一次又一次地看到大型科技公司如何容易地失去对这些强大的人工智能模型的控制(谷歌和 Meta 不断地为他们模型的不当行为道歉——这是一种后验行为)。如果连他们都不能准确预测 LLM 的不当行为,外行人又有多没准备好与他们健康互动呢?

最后的想法

谷歌正在大步将其新兴的人工智能技术部署到现实世界的日常产品中。AI 测试厨房就是这么回事。但是他们也声称关心安全和负责任的发展。他们知道 LaMDA 可能非常有用,但也可能无法满足用户的期望,甚至更糟,以这样或那样的方式造成伤害。这就是为什么他们希望反馈有所改善。

我相信,正如在之前发生的那样,反馈不足以让 LaMDA 准备好投入生产。透明的研究非常重要(谷歌还没有部署 LaMDA,只是在收集人们的反馈),因此在这一层面进行监管会适得其反。然而,从研发到生产的过渡并不简单,应该小心谨慎。随着这些模型走向世界,公司将失去对它们的治理。但是,只要利润能弥补安全的不足——甚至是可能的负面新闻——他们就会这么做。这就是为什么对这些强大人工智能的监管应该到位,至少在应用层面。

即使谷歌不打算在短期内将 LAMDA 集成到其服务中,与它交谈也可能是一种有趣和令人大开眼界的体验,即使对那些厌倦了玩 GPT 3 的人来说也是如此。无论 LaMDa 是否超过了谷歌为其设定的生产资格门槛,你都可以自己评估 LaMDA 确实没有感知能力。

订阅 算法桥 。弥合算法和人之间的鸿沟。关于与你生活相关的人工智能的时事通讯。

您也可以直接支持我在 Medium 上的工作,并通过使用我的推荐链接 这里 成为会员来获得无限制的访问权限! 😃

谷歌提出新方法来推导量子力学计算中术语的解析表达式

原文:https://towardsdatascience/google-proposes-new-method-to-derive-analytical-expressions-for-terms-in-quantum-mechanics-d70fff6e1ef2

符号回归的现实应用

新方法以符号形式导出精确的泛函(量子力学计算的元素),因此人类可以理解,计算成本低廉,并且易于集成到现有的量子力学计算软件中。

巨头 Alphabet 通过 Google Research 和 Deepmind 等渠道对科学的 ML 应用进行了大量投资,这已经不是什么新闻了。虽然在化学和生物学领域, AlphaFold 是其迄今为止最著名的项目,但 Deepmind 也进入了量子力学(QM)计算领域(我在这里的博客条目),谷歌研究也是如此。

QM 计算在化学中非常重要,因为它们提供了关于分子和材料中电子密度、分布和自旋状态的最高水平的细节,所有这些都是建模、理解和预测其化学反应性和物理化学性质所需的关键元素-其中没有一个是经典方法所能达到的。我在这里评论的新工作来自 Google Research,也提出了改进 QM 计算的方法。特别地,马等人发展了一种新的方法来推导 DFT 泛函的符号解析形式。

这都是什么?

从本质上讲,量子力学计算试图从第一原理,从电子的分布、状态和能量来描述分子和材料的电子性质。为此,QM 本质上需要求解相互作用电子的多体薛定谔方程。

今天,最广泛使用的方法进行量子力学计算是密度泛函理论(DFT)。DFT 要求模块以某种方式处理多个电子如何相互作用,这是通过特定的交换相关(XC)项实现的。这些术语在理论上应该是精确的,但在实践中却不是。因此,在大多数应用中,它们是以数值方式近似的,例如拟合参数的分析方程、根据数据训练的神经网络等。利用分子或材料属性的数据集。

大多数可用的 XC 泛函存在于包含少量拟合参数的方程中,其运行速度很快,但以结果质量为代价,或者存在于具有大量参数的复杂表达式中,甚至存在于黑盒神经网络中,其产生更精确的结果,但以计算速度和可解释性为代价。最重要的是,神经网络和其他不基于解析形式的 XC 项很难集成到 DFT 计算的软件包中。

马等人的工作兼顾了两个世界的优点:它使用基于符号回归的 ML 方法来建立解析方程,该解析方程表示基于初等数学指令的泛函和其他更小的、已经存在的泛函。该算法从一小群简单的参数、项和最终的小的现有泛函开始,创建一群候选解,并对它们进行世代进化,以得出将所有这些成分放在一起成为符号表达式的方程,该符号表达式再现用于训练的数据集。

由这种新方法产生的 XC 泛函的符号表示看起来就像 QM 软件中使用的常规 XC 泛函,因此它们集成到软件包中是简单的。

这种新方法不使用复杂的类似黑盒的神经网络,而是开发出计算 XC 项的显式解析公式。推导出的方程可以直接整合到质量管理程序中,它们的表现和现有的替代方案一样好,甚至更好,而且由于它们的形式简单,它们是人类可以理解的。由作家卢西亚诺·阿布利亚塔创作的人物。

应用程序

马等人将该过程命名为“符号泛函进化搜索”,因为它是这样做的:它进化出描述泛函的符号表达式,并在方程形式和参数的空间中搜索,以优化训练数据的再现效果。

作为第一个应用,作者证明了他们的方法可以从零开始重新发现简单的现有泛函,并且可以进一步获得从更简单的泛函发展而来的新的、更精确的泛函,但是保留了符号回归所允许的简单性。

然后,他们应用他们的方法开发了一个新的泛函,他们称之为“Google Accelerated Science 22”(gas 22),它比最好的替代方案表现更好,表现出良好的数值稳定性,并可以无缝集成到现有的 QM 软件中。最重要的是,鉴于 GAS22 的简单性,它适用于通常应用于泛函的所有解释方法,以理解它们的工作原理和局限性。

性能更好的泛函对于提高质量管理计算的质量至关重要;而更快的执行允许访问更大的系统,即处理生物系统和材料碎片通常需要更大数量的原子。这种新方法以及谷歌研究的这一分支(当然还有学术界以及其他规模较小但成熟的公司)正在进行的其他发展,对于科学家花更少时间和金钱做实验的未来非常重要,因为他们可以更快更准确地预测他们的结果。

相关阅读

arXiv 中的预印本:

https://arxiv/abs/2203.02540

更新:预印本在科学进展 : 通过同行评审

【https://www.science/doi/10.1126/sciadv.abq0279】T5T6

Deepmind 的相关工作:

符号回归在科学中的其他应用示例:

www.lucianoabriata我写作并拍摄我广泛兴趣范围内的一切事物:自然、科学、技术、编程等等。 成为媒介会员 访问其所有故事(我免费获得小收入的平台的附属链接)和 订阅通过电子邮件 获取我的新故事 。到 咨询关于小职位 查看我的 服务页面这里 。你可以在这里 联系我

在 BigQuery 中使用 Google Trends 作为机器学习功能

原文:https://towardsdatascience/google-trends-as-a-machine-learning-features-with-bigquery-d0cbbb1e8679

合著者:丹尼尔·申,斯坦福大学的 MSCS

Firmbee在 Unsplash 上拍照

有时候,作为工程师和科学家,我们认为数据只是 RAM 中的字节、GPU 中的矩阵和进入预测黑盒的数字特征。我们忘记了它们代表了一些现实世界模式的变化。

例如,当真实世界的事件和趋势出现时,我们倾向于首先遵从谷歌来获取相关信息(例如,去哪里远足,术语 X 是什么意思)——这使得谷歌搜索趋势成为解释和理解我们周围正在发生的事情的非常好的数据源。

这就是为什么我们决定研究谷歌搜索趋势之间的复杂相互作用,用它来预测其他时态数据,并看看它是否可以用作时态机器学习模型的特征,以及我们可以从中得出的任何见解。

⚠️ 提醒一句

在这个项目中,我们研究了如何将 Google Trends 数据用作时间序列模型或回归模型的特征。我们选择犯罪率作为我们的兴趣点(响应变量),因为它是 Google Cloud Platform 上具有数百万行的大型时态数据集之一,这符合我们使用 BigQuery 的目的。

然而,我们会注意到,无论何时我们处理任何涉及敏感话题的数据集,重要的是不偏不倚,不要有太多关于受保护特征(即年龄、性别和种族)的先入为主的假设。我们在最后加入了一个我们鼓励你不要跳过的部分:关于 AI ⚖️️.中公平性的讨论

此外,对于该项目,我们主要关注的是 ML 模型中的毒品相关犯罪(即贩毒)。即便如此,我们认为最好不要在没有护栏和对其社会影响的进一步研究的现实世界中部署类似的模型。这项研究纯粹是为了探索和教育的目的,应该这样对待。

⚙️ 设置:通过 Google Colab 使用 big query

BigQuery 是一个无服务器的数据仓库,拥有许多可用的公共数据集。这可能是一个用大规模数据集尝试机器学习的很酷的地方,其中许多数据集在**bigquery-public-data**下定期更新。在本节中,我们将介绍如何设置 BigQuery。

我们首先从我们在 BigQuery 上有积分的同一个帐户认证自己进入 Google Colab 。每个人都有大约 1 TB 的查询量,这对于我们的目的来说已经足够了(也就是说,我们每个优化的查询需要大约 200 MB)。学生也可以获得一些教育学分。

# Authenticate yourself into Google Colab
from google.colab import auth
auth.authenticate_user()
project_id = "YOUR_PROJECT_ID_IN_BIGQUERY"
# create a BigQuery client with the same account as Colab
from google.cloud import bigquery
client = bigquery.Client(project=project_id)

然后,我们可以将一个 IPython notebook 单元格转换成如下所示的 SQL 单元格,它会将输出存储到**variable_name**中的一个pd.DataFrame中。

%%bigquery variable_name --project $project_id

SELECT *
FROM `bigquery-public-data.chicago_crime.crime`
LIMIT 5

📚同现:谷歌趋势特征建议使用 **Wordnet**

我们最初的想法是使用google_trends.top_rising_terms 数据集,对有日期偏移的列进行LEFT JOIN。然而,我们遇到了数据集被当前事件和名称所支配的问题,这些事件和名称与我们的响应变量无关。

用于选择芝加哥搜索趋势的 SQL 语句,由作者于 2022 年 12 月 3 日更新

然后,我们尝试使用非官方的 PyTrends API 为 Google Trends 获取术语。然而,我们很快就遇到了速度限制,所以我们必须更好地选择数据。我们唯一的选择是通过在谷歌趋势网站上查询每个单词来下载我们的数据,并手动将单词数据集与脚本结合起来。所以,我们专注于获得正确的单词特征。

我们的一个直觉是,描述物质的术语会有地区差异和不同的名称。针对这个问题,我们使用 wordnet 生成了一组与一些常见街头毒品术语具有“**高共现度”**的词。

但是为什么要使用 NLTK 呢?

我们使用 WordNet 的灵感来自于基于“共现”的推荐模型(也就是可能用于 YouTube 视频、亚马逊目录等),这些模型经常对共现进行批量计算,以对相关项目进行排序。这类似于掩蔽语言模型(即 BERT)试图表现的内容。

import nltk=
nltk.download('wordnet')
nltk.download('omw-1.4')
from nltk.corpus import wordnet

all_words = set()
def find_word_features(word):
   words = set()
   for syn in wordnet.synsets(word):
       for i in syn.lemmas():
           words.add(i.name())
   print(words)
   all_words.update(words)

然后我们下载并结合一些简单的脚本。之后,我们拟合了若干个线性回归模型,提取了模型的 R 平方值,然后根据一个月后与犯罪率的相关性对它们进行了排名(详见后面的原因)。

作者列出的与 1 个月后犯罪率高度相关的热门词汇

我们非常惊讶地发现其中一些单词的 R 值非常高,尤其是单词“go”。这个词是与“狂喜”同现产生的,但最终,我们认为这只是与谷歌搜索上的短语“去哪里得到……”相关。

🥞加入训练数据集

连接数据集需要某种程度的数据操作,我们不会讨论技术细节。但我们在这里注意到,我们对总犯罪数量进行了 1 个月2 个月的转移,因为我们认为要想有时间相关性,搜索和我们的反应变量之间必须有一个时滞。

时滞可以是我们以后调优的超参数。

%%bigquery narcotics_year_month_two_months_lag --project $project_id

WITH shifted_date_tbl AS (
 SELECT
 date,
 CAST( DATE_SUB(CAST (date AS datetime), INTERVAL 2 MONTH) AS timestamp) AS shifted_date,
 *
 FROM `bigquery-public-data.chicago_crime.crime`
),
date_count AS (
SELECT
CONCAT(CONCAT(EXTRACT(YEAR FROM shifted_date), '-'), EXTRACT(MONTH FROM shifted_date)) AS year_month, COUNT(*) as crime_count
FROM shifted_date_tbl
WHERE primary_type = 'NARCOTICS'
GROUP BY year_month
ORDER BY year_month DESC
)

SELECT *
FROM `your-project-id.crime_search_trends.chicago_narcotics`
AS chicago_narcotics,
date_count
WHERE year_month = Month

在这一点上,我们还不想做任何功能工程,因为我们想在决定如何优化每个单词分布之前,将相关性可视化。

例如,我们可能想要记录或移动数据,或者将特征分布转换为分位数。但是我们首先要把分布可视化。

📈特征选择的相关性

我们分析了由 WordNet 和我们自己的直觉生成的 30-50 个单词。他们中的许多人遵循一个积极的趋势,如“喷气”,但我们惊讶地发现,负相关的,如“锅。”

“Jet”趋势分数与毒品犯罪计数(按作者)

按作者划分的“大麻”趋势得分与毒品犯罪计数

我们很好奇为什么会这样。我们最初的想法是,这与我们感兴趣的地区(芝加哥,发生在 2020 年)的大麻合法化有关,但事实证明,即使我们只关联 2015 年之前的数据,情况也并非如此。

按作者分列的 2015 年前“大麻”趋势与毒品犯罪数量

只有在将“正相关词”的趋势与“负相关词”如“大麻”并列后,我们才能意识到这种趋势。见下图。

按作者分列的毒品犯罪和其他术语的下降趋势以及“大麻”搜索趋势的上升

对此的一个合理解释是,随着时间的推移,与毒品相关的犯罪和逮捕一直在稳步下降,然而搜索趋势和流行文化实际上在对大麻的态度方面存在负相关。

这意味着,虽然是的,由于负相关,它将是预测犯罪的一个伟大特征,但不是出于我们最初认为的原因。这表明我们对特性的最初解释和模式可能是扭曲的,甚至可能是错误的。

🌐地理分析

我们还使用热图做了一些地理分析,搜索词语位置和犯罪地点。

%%bigquery crime_time_data --project $project_id

SELECT longitude, latitude
FROM `bigquery-public-data.chicago_crime.crime`
WHERE primary_type = "NARCOTICS" AND
longitude IS NOT NULL AND
latitude IS NOT NULL

不幸的是,没有办法从 Google Trends 中导出这些数据,所以我们无法推断和映射这些数据进行聚合。否则,我们可以在将每个犯罪地点映射到他们所在的县或城市后,对城市名称进行左连接。

芝加哥毒品犯罪密度图与搜索词密度图(按作者)

旧金山毒品犯罪密度地图,作者

🚀训练预测模型

我们不会深入讨论如何优化和选择模型的最佳特性,因为在 Medium 上已经有很多这样的指南了。

相反,在这一部分,我们将快速浏览

  • (1)我们可以对这个数据集使用两个不同学校/类别的机器学习模型
  • (2)使用 CREATE MODEL 语句 Google 云平台上训练具有海量数据集的模型的快速指南🚀

时序/时间序列模型与我们这里的相似,我们使用历史数据来预测未来趋势。这样的例子有脸书先知模型,或者ARIMA/萨里玛 模型。我们认为这通常很适合处理时态数据的问题,因为它可以考虑季节性和模式。

你可以在进行一些 SQL 转换后,直接在 Colab 中训练它们,然后使用 CREATE MODEL 语句在 Google 云平台上进行一次调用。

时序模型的训练和测试集拆分(按作者)

回归模型类似于我们对时移数据集所做的。在给定当前状态的情况下,我们将训练我们的模型来预测未来时间步会发生什么。这种类型的模型往往会过度拟合并忽略趋势,但如果我们在短时间内有大量可用数据,我们总是可以用过去几周、几天甚至几小时的数据来重新训练模型。

我们可以在 bigQuery 中使用这个命令训练一个逻辑回归模型

%%bigquery --project $project_id
CREATE OR REPLACE MODEL `crime_search_trends.narcotics_log_regression_3_terms_trend_quantile`
OPTIONS(MODEL_TYPE='LOGISTIC_REG')
AS
SELECT
 block AS feature1,
 # iucr AS feature1,
 arrest AS feature2,
 domestic AS feature3,
 # beat AS feature3,
 district AS feature4,
 ward AS feature5,
 community_area AS feature6,
 x_coordinate AS feature7,
 y_coordinate AS feature8,
 #drug terms
 NTILE(5) OVER(ORDER BY smoke) AS feature9,
 NTILE(5) OVER(ORDER BY weed) AS feature10,
 NTILE(5) OVER(ORDER BY go) AS feature11,
 smoke AS feature12,
 weed AS feature13,
 go AS feature14,
 CAST(primary_type = 'NARCOTICS' AS INT) AS label
FROM (
 SELECT *
   FROM `your_project_id.crime_search_trends.chicago_cooccur_processed`
   AS chicago_narcotics, (SELECT
     FORMAT_DATE('%Y-%m', date) AS year_month,
     FORMAT_DATE('%Y-%m-%d', date) AS year_month_date,
     *
   FROM `bigquery-public-data.chicago_crime.crime`
   WHERE date IS NOT NULL) AS crime_with_date
   WHERE year_month = Month
)
WHERE
 date BETWEEN '2004-01-01 00:00:01' AND '2018-01-01 23:59:59'

在特性探索过程中,我们的一个直觉是,也许一个词有多“流行”并不重要,我们只关心这个特性是上升的还是它的基线搜索率“高于平均水平”。

所以我们想使用量化作为特性工程函数——它可以在 bigquery 中使用SELECT语句中的NTILE(N) OVER (ORDER BY feature_name) AS feature_name来完成。

不同单词的流行趋势不同

您还可以使用ML.TRAINING_INFO标签在笔记本上获取培训信息,这些信息通常会在培训期间打印出来。这有助于优化超参数。

%%bigquery --project $project_id

SELECT
*
FROM
ML.TRAINING_INFO(MODEL `crime_search_trends.narcotics_log_regression_3_terms_trend_quantile`)

根据我们的研究,分位数会降低 F1 分数,但会提高准确度、精确度或召回率。我们认为这可能是因为我们的许多术语在语义上高度相关,因此总体上降低了机器学习模型的“整体性能”,因为数据集分布中即使很小的变化也会极大地影响性能。

解决这个问题的一个常见方法是对我们的数据集运行普通最小二乘(OLS)模型,迭代识别具有高度多重共线性的冗余要素(即,OLS 模型在迭代中赋予很小权重的要素),直到出现我们认为是好的要素子集。把它输入到你选择的其他更复杂的模型中(比如逻辑回归,MLP,其他神经模型)。

⚖️关于人工智能中公平性的讨论

让我们想象一个我们在这项研究中所做的更愤世嫉俗的例子。

假设我们正在为犯罪预测建立一个延时预测算法,假设我们是一个(无意中)信息不足的数据科学团队,试图建立一个期限很短的模型。我们快速构建它,它有很好的指标,所以我们把它扔给了 DevOps 团队。

由于我们不知道哪些词是有用的,假设我们建立了一个无监督机器学习模型,该模型为 Google trends 找到“高度预测”的词,并将其用作特征。随着时间的推移,该模型选择了一些被边缘化群体过度使用的词,现在该模型以最糟糕的方式出现了偏差。

在犯罪预测的情况下,如果用于错误的目的,这种模型将非常成问题,并对真实的人产生有害的影响。

在这项研究中,我们还表明,我们对什么是“好的特征”的看法,甚至我们对为什么一个特征可能是好的背后的直觉,可能是有缺陷的,或者只是确认偏差,就像“大麻”和“杂草”关键字的负相关性一样。

这就是为什么数据科学团队之间就“道德人工智能”进行清晰的沟通非常重要。其他人可能不太了解人工智能在幕后如何工作,因此,作为工程师和数据科学家,我们有责任确保我们的模型没有偏见和危害。

谷歌的 Minerva,用 AI 解决数学问题

原文:https://towardsdatascience/googles-minerva-solving-math-problems-with-ai-4f0a6aaabaf1

定量推理对人类来说很难,对计算机来说也很难。谷歌的新模型在解决数学问题上取得了惊人的成果。

来自 unsplash的迈克尔·马特隆的图片

我们现在已经习惯了语言模型,比如 GPT-3 ,但是一般来说,它们的输出是文本的。定量推理很难(我们很多人从大学到现在还在做微积分的噩梦)。对语言模型来说也很难,它们的表现远远没有达到人类的水平。解决数学或科学问题需要不同的技能,正如他们在博客文章中所说:

使用自然语言和数学符号正确解析一个问题,回忆相关的公式和常数,并生成涉及数值计算和符号操作的分步解决方案。

克服这些挑战是困难的,因此预测模型将在 2025 年在数学数据集(包含 12,000 个高中数学问题的数据集)上达到最先进的精确度。我们提前了三年,谷歌人工智能研究宣布了 Minerva。

在他们的文章中,他们提出了一个模型,该模型在解决不同学科(如代数、概率、物理、数论、几何、生物、天文、化学、机器学习等等)的问题时,取得了令人难以置信的结果。他们写道:

Minerva 通过生成包括数值计算和符号操作的解决方案来解决这些问题,而不依赖于计算器等外部工具。

这里有一个代数的例子,Minerva 输入一个问题,并给出解决方案。请注意,该模型能够通过简化和替换变量来求解方程。

代数中一个问题的例子和 Minerva 模型提供的答案。图片来源:原文章

您也可以在交互式样本浏览器中查看,以查看来自其他 STEM 学科的其他问题示例。在这里,我只粘贴几个例子来展示它有多先进:

线性代数中一个问题的例子和 Minerva 模型提供的答案。图片来源:原文

或者在生物学中:

生物学中一个问题的例子和 Minerva 模型提供的答案。图像取自交互式样品浏览器

化学:

化学中一个问题的例子和 Minerva 模型提供的答案。图像取自交互式样品浏览器。

或者机器学习:

机器学习中一个问题的例子和 Minerva 模型提供的答案。图像取自交互式样品浏览器

Minerva 基于 Pathways 语言模型 (PaLM),该语言模型已经通过来自 arXiv 的 118 科学论文(在数学表达式中相当密集)进行了进一步训练。2022 年 4 月发布的 PaLM 模型是一个 5400 亿参数的语言模型,能够跨不同的领域和任务进行归纳。博文解释了培训的一个重要段落:

标准文本清理过程通常会删除对数学表达式的语义意义至关重要的符号和格式。通过在训练数据中维护这些信息,模型学习使用标准数学符号进行转换。

换句话说,需要一种不同的文本预处理方法来训练模型。

用于培训的数据集。图片来源:原文章

有趣的是,Minerva 不仅生成了一个解决方案,还生成了不同的解决方案(虽然步骤不同,但正如他们所写的,总的来说,他们会得到相同的最终答案)。不同的解决方案分配了不同的概率,然后选择最常见的答案作为解决方案(多数投票,这在 PaLM 中被证明是一个成功的策略)。

多数表决过程的说明,这是不同模型的基础。在 Minerva 案例中,模型为每个问题生成多个解决方案,并选择最常见的答案作为解决方案。图片来源:此处

然后,他们在不同的基准数据集上评估他们的方法。他们使用了 MATH(高中数学竞赛水平题),但也使用了更复杂的数据集,如 OCWCourses(由麻省理工学院开放课件收集的大学和研究生问题的集合)。在所有这些情况下,他们都达到了最先进的结果:

Minerva 在不同的定量推理基准数据集上展示了最先进的结果。摘自原文

这些结果令人印象深刻,然而,该模型仍远非如所述的那样完美:

密涅瓦仍然犯了不少错误。

在文章中,他们指出了这些错误的原因:

大约一半是计算错误,另一半是推理错误,其中求解步骤没有遵循逻辑思维链。

至于人类学生,也有可能模型可以得出正确的最终答案,但使用了错误的推理(在论文中被定义为“假阳性”)。但据他们观察,这些情况不太常见(讽刺的是,人类学生也是如此):

在我们的分析中,我们发现假阳性率相对较低(Minerva 62B 在数学上产生的假阳性不到 8%)。

他们还注意到,当问题更困难时,假阳性更常见(从 1 到 5,当模型遇到难度为 5 的问题时,假阳性率更高)。

在文章中,他们将此描述为一种限制,因为当模型预测正确答案但使用错误推理时,不可能自动识别情况。

以下是一个错误示例:

机器学习中一个问题的例子和 Minerva 模型提供的答案。在这种情况下,模型提供了一个错误的答案。图像取自交互式样品浏览器

有时错误在于模型误解了问题,或者使用了不正确的事实来回答。另一种错误是答案太短(没有推理就直接不正确,我们可以把这比作学生在不知道答案的情况下试图猜测答案)。在某些情况下,当模型生成不真实的事实或方程时,模型会产生他们所谓的“幻觉数学对象”。然而,这些情况是罕见的,普遍的错误是不正确的推理和不正确的计算。

在论文中,研究人员还讨论了他们模型的潜在社会影响。正如他们所认识到的,影响可能是巨大的:

能够在一般情况下解决定量推理问题的人工神经网络具有潜在的重大社会影响

然而,目前有两个主要限制因素正在降低潜在影响:

Minerva 虽然朝着这个方向迈出了一步,但仍远未实现这一目标,因此其潜在的社会影响有限。该模型的性能仍然远低于人类的性能,此外,我们没有一个自动的方法来验证其输出的正确性。

根据研究人员的未来,这些模型可以帮助教师减少教育不平等。然而,计算器和电脑并没有减少教育不平等,反而加大了这些资源容易获得的国家与教育资金不足的国家之间的差距。在任何情况下,它都代表了对许多领域有用的强大工具的第一步。例如,研究人员会发现,作为一种帮助他们工作的工具是非常有益的。

如果你觉得有趣:

你可以寻找我的其他文章,你也可以 订阅 在我发表文章时得到通知,你也可以在**LinkedIn**上连接或联系我。感谢您的支持!

这里是我的 Github 资源库的链接,我计划在那里收集代码,以及许多与机器学习、人工智能等相关的资源。

**https://github/SalvatoreRa/tutorial **

谷歌的巴利文:100 种语言的语言图像学习

原文:https://towardsdatascience/googles-pali-language-image-learning-in-100-languages-31d32f9b74fe

令人印象深刻的新型号,能够在复杂任务中达到最先进水平

unsplash的格兰特·里奇的图片

近年来的趋势是增加神经网络的容量。一方面,越来越多的参数的不同模型被公布,另一方面,用于训练的数据量增加。无论输入和任务是文本的还是视觉的,这种观点都是普遍的。

关于文本模型,增加的容量显示了改进的性能和有趣的涌现行为: GPT 、 GLaM 、 PaLM 、 T5 等等。而对于图像,在卷积神经网络主导该领域之前,近年来的趋势一直是视觉变压器。

在所有两个领域(文本和视觉)中的类似进展已经允许在这两个领域的交叉点上打开一个新的领域:视觉语言模型。

**什么是视觉语言模型?**将图像和文本都视为输入的模型可用于各种任务。今年,我们惊讶于 DALL-E 或 T21 这样的模型是如何从文字描述中创造出详细的图像的。另一方面,这只是视觉语言模型可以解决的任务之一:

  • 可视字幕(VC) :生成可视输入(图像、视频)的描述。该模型分析图像并提供表示该图像的文本描述。
  • 视觉问题回答(VQA) :为视觉输入提供答案。
  • 视觉常识推理(VCR) :从视觉输入中推断常识信息和认知理解。
  • 视觉生成(VG) :从文本输入(提示)生成视觉输出。
  • 上下文光学字符识别(OCR) : OCR 是将包含文本(打印、手写或印刷)的图像转换成计算机可以理解的文本输出。
  • 物体识别

此外,许多模型仅使用英语进行训练,但是有数千种语言(估计有 7000 种语言)并且重要的是其他语言被表示和包括在内。

本周展示了一个语言视觉模型,可以用 100 种语言执行任务。

总的模型参数是 170 亿(语言模型计数为 13 B,视觉组件为 4)。该模型由一个处理文本的变压器编码器和一个生成测试输出的 n 自回归变压器解码器组成。图像输入由连接到编码器的视觉转换器(Vit) 处理。有趣的是,这些组件取自早期型号:

PaLI 模型的一个关键组成部分是重用,其中我们用来自先前训练的单模态视觉和语言模型的权重来播种模型,例如 mT5-XXL 和大 ViTs 。这种重用不仅能够转移单模态训练的能力,而且还节省了计算成本。— 谷歌人工智能

模型建筑。图片来源:原文

事实上,作者创建了三个不同的模型,它们的参数越来越多,但架构相似(最终的模型容量最大)

图片来源:原文

作者专门为这个模型构建了一个数据集: WebLI。该数据集是通过从网上收集图像和文本构建的(它们不限于英语,而是收集了 109 种语言的数据)。他们因此收集了 120 亿张图像和 120 亿条替代文本(描述图像的文本)。他们还使用 GCP 视觉 API 提取了图像中的文本(OCR 注释),产生了 290 亿个图像-OCR 对。最终,只有 10 亿张图像被用于训练。

“与多语言替代文本(可用)和光学字符识别(使用 GCP 视觉 API5 计算)相关的样本图像 4”。图片来源:原创文章

WebLI 中 alt-text 和 OCR 识别语言的统计。图片来源:原创文章

WebLI 等大规模视觉语言数据集的图文对计数、 CLIP 、 ALIGN 和 LiT 。图片来源:原文

视觉语言任务需要不同的能力,有时会有不同的目标。一些任务本质上需要对象的本地化来精确地解决任务,而另一些任务可能需要更全局的视图。类似地,不同的任务可能需要长的或紧凑的答案。— 谷歌人工智能

正是因为这个原因,他们开发了一种特殊的训练策略,目的是每次为模型提供一个输入(图像+文本)并接收一个输出(文本)。事实上,该模型伴随着一系列预训练任务(仅文本损坏、本地和翻译的替代文本数据上的字幕、分割字幕等),但仍保持相同的系统(输入:图像+文本;输出:文本)。因此,允许以相同的方式训练模型,同时仍然保持模型能够概括和能够执行其他任务。

training.image 来源:原文

模型在 JAX 与亚麻使用开源的 T5X 和 Flaxformer 框架进行训练。对于视觉组件,我们使用开源的 BigVision 框架引入并训练了一个大型 ViT 架构,名为 ViT-e,具有 4B 参数。

一旦模型被训练,作者将它与其他最先进的方法(包括 SimVLM 、 CoCa 、 GIT2 、 Flamingo 、 BEiT3 )进行比较,以完成多种视觉和语言任务:

  • 图像字幕。作者在三个数据集上测试了该模型的能力:COCO(标准基准)、NoCaps(类似于 COCO,但目标有更多的视觉概念)和 TextCaps(图像包含文本)。此外,他们使用了另一个数据集 XM-3600(与其他三个不同,它是多语言的)

纯英文基准数据集上的图像字幕结果。图片来源:原文

多语言数据集上的图像字幕结果(此处显示:英语、法语、印地语、希伯来语、罗马尼亚语、泰语和中文以及 35 种语言的平均值)。图片来源:原文

  • 视觉问答。正如作者指出的,这是一项艰巨的任务,因为答案必须完全匹配才能被认为是准确的,而巴利文的词汇有 100 种语言。尽管如此,他们在几个数据集上取得了非常好的结果:VQAv2、OKVQA(其中需要外部知识来回答它的问题,因为所有知识都不存在于输入图像中,必须进行推断),TextVQA & VizWiz-QA(模型必须使用图像中存在的文本来回答)。他们还使用了跨语言和多语言数据集(xGQA 和 MaXM)。

英语数据集上的可视化问答结果。图片来源:原创文章

跨语言和多语言数据集的可视化问答。图片来源:原创文章

  • 语言理解能力。作者想知道模型一旦被训练用于多模态任务(图像+文本)是否会忘记它的语言建模能力。他们在英语和几种语言的数据集上测试了这些功能。该模型,尽管培训设置有利于多模态,保持了高水平的英语语言理解能力。

语言理解能力的结果。图片来源:原创文章

  • 零镜头图像分类。在这种情况下,作者没有通过在原始模型上添加分类器来修改模型。相反,他们调整了数据集。该模型显示了良好的性能,但仍低于最先进水平

图片来源:原文

虽然结果令人惊讶,但模型并不完美,也有一些局限性:

  • 该模型不能描述有许多对象的情况,因为训练数据集无论如何都没有复杂的注释。
  • 当模型针对纯英语数据进行微调时,会丢失一些多语言功能。
  • 正如作者所言,这种评估存在固有的局限性:“模型可能会生成一个正确的响应,它是目标响应的同义词或释义,并且与目标不完全匹配。”

此外,他们试图减少潜在的偏差,并在文章的附录中提供了所用模型和数据集的详细表格(模型和数据卡)。尽管正如作者在文章中指出的:

大型模型可能会产生更广泛的社会影响。虽然这些模型在公共基准上表现强劲,但它们可能包含未知的偏见或成见,或者传播不准确或扭曲的信息。虽然我们已经努力衡量其中的一些问题,但在用于特定目的之前,需要对这些模型进行仔细的重新评估。

结论

PaLI 表明,它在几项迄今为止被认为具有挑战性的任务中达到了最先进的水平。而且,不仅仅是英语,还有几种语言。

虽然它已经达到了最先进的水平,但很可能更多的视觉语言模型将很快发布(希望是开源的)。它还展示了一些趋势:

  • 性能更高但不一定能力更强的型号(它比 Flamingo 更好,但只有 18 个 B 对 80 个 B 参数)
  • 除了英语之外,还接受多种语言训练的模特(如梅塔的 NLLB 或布鲁姆)
  • 这种情况下是多模态、图像和文本,但也有视频、音乐等…
  • 专注于避免偏见

如果你觉得有趣:

你可以寻找我的其他文章,你也可以 订阅 在我发表文章时得到通知,你也可以在**LinkedIn上连接或联系我。感谢您的支持!**

这是我的 GitHub 知识库的链接,我计划在这里收集代码和许多与机器学习、人工智能等相关的资源。

**https://github/SalvatoreRa/tutorial

或者随意查看我在 Medium 上的其他文章:

**

谷歌的 PaLM-SayCan:第一代下一代机器人

原文:https://towardsdatascience/googles-palm-saycan-the-first-of-the-next-generation-of-robots-6dac158955a

谷歌进入了一条新的道路:融合人工智能和机器人技术。

棕榈说可以拿起一个苹果。鸣谢:谷歌研究

不管谷歌搜索怎么说,从历史上来说,人工智能与具有人形的闪亮金属机器人几乎没有什么关系。现在似乎不再是这样了。在过去的几年里,科技公司在人工智能机器人上下了很大的赌注。不是任何类型的(Roomba 是一个有用的工具,但远非机器人的原型)。不。公司正在制造人形机器人。

波士顿动力公司是该集团在机器人领域经验最丰富的公司,于 2021 年展示了最新版本的 Atlas 。三十年后,他们得到了一个具有相当不错的运动和本体感受技能的模型(它可以进行致命的跳跃)。现在由亚马逊支持的 Agility Robotics 生产 Digit,这是一种通用机器人,可以可靠地以人类的速度做仓库工作三星(Samsung)的 Handy 似乎能够做一些需要一些手工技巧的家务。小米最近加入了这个群体,并在两周后的特斯拉人工智能日推出了会说话的机器人 CyberOne ,它类似于特斯拉的 Optimus 。

许多高知名度的科技和机器人公司正在押注人形机器人,这一事实本身就很有趣。我以前曾提出过制造具有人类特征的机器人有很好的理由:世界在高度、形状、动作方面适应了我们……这些项目揭示了该行业对制造机器人的兴趣,正如马斯克去年在 2021 年人工智能日期间所说,“消除危险、重复和无聊的任务”,或在家里帮助我们。

但是这篇文章不是关于人形机器人的。至少不仅仅是。这是一种机器人学的新方法,我上面提到的例子中没有一个是遵循的。我说的是将最先进的人工智能系统——特别是语言模型——与可以在世界上导航的全身机器人融合在一起。大脑和身体。一些人工智能公司专注于构建下一个超大型语言模型,而机器人公司想要最灵巧的机器人,但似乎没有重叠——尽管这似乎是显而易见的前进道路。

莫拉维克悖论和人工智能与机器人融合的复杂性

为什么大多数人工智能公司不进入机器人领域(OpenAI 去年解散了其机器人分支)以及为什么大多数机器人公司将其机器人的范围限制在简单的任务或简单的环境(或两者都有)是有充分理由的。其中一个主要原因是所谓的莫拉维克悖论。它说,与直觉相反,很难让机器人足够好地执行感觉运动和感知任务(例如,拿起一个苹果),而创造能够解决困难的认知问题(例如,玩棋盘游戏或通过智商测试)的人工智能相对容易。

对人类来说,微积分显然比在空中接球更难。但那只是因为从进化论的角度来说,微积分是相对较新的。我们还没来得及掌握。正如人工智能的创始人之一马文·明斯基所说:“我们更了解工作不好的简单过程,而不是工作完美的复杂过程。”简而言之,制造可以四处移动并与环境完美互动的机器人极其困难(在过去几十年中进展甚微)。

但现在,有一家公司试图克服莫拉维克悖论的明显局限性(我想强调“努力”,我们会看到为什么)。我指的是谷歌。在与日常机器人的合作中,这个科技巨头创造了很可能是机器人领域的下一个突破: PaLM-SayCan (PSC),一个(没有那么多)人形机器人,拥有上面其他人只能梦想的混合能力。

我对谷歌的方法特别感兴趣,因为我是人工智能虚拟系统和现实世界机器人融合的倡导者。不管我们是否想要建立一个人工通用智能,这是两个学科的自然道路。一些研究人员和公司认为缩放假说是人类智能人工智能的关键。相反,我认为让人工智能在现实世界中扎根是至关重要的,这既是为了解决当前的缺点(如人工智能对世界如何工作的普遍无知或互联网数据集的偏见),也是为了将其提升到下一个水平(推理和理解需要只有通过探索世界才能获得的隐性知识)。

(注:如果你想进一步了解这个话题,我推荐我这个大多被遗忘的帖子“人工智能和机器人技术将不可避免地融合”)

谷歌的 PSC 显示,该公司最终接受了这是前进的方向,并决定不放弃纯粹的人工智能,而是重新关注人工智能+机器人,作为实现更有能力的智能系统的一种手段。最后,这与训练多模态模型没有什么不同(通常被认为是深度学习模型的自然下一步)。同样,能够“看”和“读”的人工智能比那些只能感知一种信息模式的人工智能更强大,能够行动和感知的人工智能或机器人将在我们的物理世界中表现得更好。

让我们看看谷歌的 PSC 有什么能力,以及它如何设法将大型语言模型的能力与物理机器人的灵活性和动作能力结合起来。

PaLM-SayCan:第一代新一代机器人

在高层次上,我们可以将 PSC 理解为一个结合了 PaLM 对自然语言的掌握(PaLM 是一种语言模型,很像 GPT-3 或 LaMDA——尽管略胜一筹)和机器人与世界互动和导航的能力的系统。手掌充当人类和机器人之间的中介,机器人充当语言模型的“手和眼”。

用更专业的术语来说,PaLM 允许机器人执行高级复杂任务(记住 Moravec 悖论指出,随着任务变得更加复杂,对于一个没有享受数千年进化进步的机器人来说,正确完成任务变得更加困难)。例如,“给我拿一份点心”虽然看似简单的任务,但包含许多不同的基本动作(表达本身包含某种程度的省略和暗示;“哪种零食?”).

PaLM 为机器人提供了任务基础:它可以将自然语言请求转化为精确(尽管复杂)的任务,并将其分解为有助于完成任务的基本动作。像 Atlas 或 Digit 这样的机器人可以非常好地完成简单的任务,但如果没有显式编程,它们无法解决 15 步请求。PSC 可以。

作为回报,机器人向 PaLM 提供关于环境和自身的上下文知识。它给出了基于世界的信息,这些信息可以告诉语言模型,在给定外部真实世界条件的情况下,哪些基本动作是可能的——它能够做什么。

手掌陈述什么是有用的,机器人陈述什么是可能的。这是谷歌创新设计的关键,也是这种方法让该公司处于领先地位的原因(尽管不一定是在成就方面——PSC 仍然是一个研究原型,而 Atlas 和 Digit 是完整的产品)。PSC 结合了任务基础(给定请求的意义)和世界基础(给定环境的意义)。PaLM 和机器人都无法独自解决这些问题。

现在,让我们来看一个 PSC 能做什么的例子,它是如何做到的,以及它与替代方案相比有多好。

PaLM-SayCan 在行动:利用 NLP 导航世界

谷歌研究人员在他们的实验中使用的一个例子(发表在论文“尽我所能,不要像我说的那样:机器人启示中的基础语言”中)以人类的请求开始,自然地表达:“我刚刚健身,请给我带点小吃和饮料来恢复。”

这对于一个人来说是一件容易的事情,但是传统设计的机器人对如何完成请愿毫无头绪。为了使请求有意义,PSC 利用 PaLM 的语言能力(特别是,思维链提示,它只是使用中间推理步骤来得出结论)来将请求重新定义为可以分解成步骤的高级任务。PaLM 可以总结道:“我会给这个人带一个苹果和一个水瓶。”

PaLM 充当了人类语言的微妙和含蓄与机器人能够理解的精确、僵硬的语言之间的中介。既然 PaLM 已经定义了一个任务来满足用户的请求,它就可以提出一系列有用的步骤来完成这个任务。然而,由于 PaLM 是一个与世界没有联系的虚拟 AI,它不一定会提出最佳方法,只会提出对任务有意义的想法——而不会考虑实际设置。

这就是机器人启示发挥作用的地方。经过训练的机器人“知道”在现实世界中什么是可行的,什么是不可行的,它可以与 PaLM 合作,为那些可能的动作赋予更高的价值,而不是那些更难或不可能的动作。PaLM 给有用的动作打高分,机器人给可能的动作打高分。这种方法允许 PSC 最终找到给定任务和环境的最佳行动计划。PSC 集两者之长。

回到零食的例子。PaLM 已经决定它应该“给这个人一个苹果和一个水瓶”然后它可能会提议去商店买一个苹果(有用)。然而,机器人会给这一步打很低的分,因为它不会爬楼梯(不可能)。另一方面,机器人可能会建议拿一个空杯子(可能),PaLM 会说完成任务没有用,因为这个人想要的是水,而不是杯子(没用)。通过从有用的和可能的提议中获得最高分,PSC 将最终决定去厨房找一个苹果和水(有用的和可能的)。一旦该步骤完成,该过程将重复,PSC 将决定在新状态下应该采取的下一个基本行动,即在每个后续步骤中更接近任务的完成。

谷歌的研究人员在 101 个教学任务中测试了 PSC 与两种选择的对比。一个使用了一个较小的模型,该模型在指令回答方面进行了明确的微调( FLAN ),另一个没有使用将语言模型融入现实世界所必需的机器人启示。他们的发现很清楚:

“结果显示,使用具有启示基础的 PaLM(PaLM-say can)的系统在 84%的情况下选择正确的技能序列,在 74%的情况下成功执行它们,与 FLAN 和没有机器人基础的 PaLM 相比,错误减少了 50%。”

这些结果揭示了一种很有前途的方法,可以将最先进的语言人工智能模型与机器人结合起来,形成更完整的系统,可以更好地理解我们,同时更好地导航世界。

不过,这种方法也有缺点。有些在 PSC 中是显而易见的,而其他的将在公司探索了问题的整个范围后显现出来。

PaLM-SayCan 做不到的:很难打败进化

这里我将忽略外围模块的有效性(例如,语音识别、语音转文本、检测和识别对象的视觉传感器等。)尽管这些必须完美地工作以使机器人发挥作用(例如,照明的变化可能使物体检测软件变得无用,从而使 PSC 不能完成任务)。

我想到的第一个问题——也是我在文章中反复提到的一个问题——是语言模型无法从人类的角度理解。我举了一个例子,一个人想要一份点心和饮料,手掌正确地解释了一个苹果和一个水瓶就可以了。然而,这里有一个隐含的问题,即使是最好的语言模型,如 PaLM,也可能无法解决更复杂的情况。

PaLM 是一个非常强大的自动完成程序。它被训练成在给定令牌历史的情况下准确预测下一个令牌。虽然这个训练目标已经被证明对于令人满意地解决大量的语言任务非常有用,但是它没有为 AI 提供理解人类或者有意图地生成话语的能力。PaLM 输出单词,但它不知道为什么,它们意味着什么,或者它们可能产生的后果。

PaLM 可以正确地解释这个请求,并指示机器人拿一个苹果和水来,但这将是一个无脑的解释。如果它猜错了,就不会有自我评估的内部机制让模型知道它得出了错误的解释。即使 PaLM(或者更聪明的人工智能)可以处理大多数请求,也没有办法确保 100%的请求可以得到解决——也没有办法知道人工智能可以解决哪些请求,不能解决哪些请求。

PSC 很可能遇到的另一个问题是机器人的动作出错。假设 PaLM 已经正确地解释了这个人的请求,并且提出了一个合理的任务。PSC 已经决定了一系列有用的和可能的步骤,并且正在采取相应的行动。如果其中一个动作没有正确完成或者机器人犯了一个错误怎么办?比方说,它去摘苹果,苹果掉在地上,滚到墙角。PSC 是否有反馈机制来重新评估其状态和世界状态,以提出一套新的行动来解决新情况下的请求?答案是否定的。

谷歌在一个非常受限的实验室环境中进行了实验。如果 PSC 在世界上运行,它将遇到无数不断变化的条件(移动的物体和人,地面的不规则性,意外事件,阴影,风等)。).它几乎什么也做不了。现实世界中的变量数量几乎是无限的,但 PSC 是用在受控环境中行动的其他机器人的数据集来训练的。当然,PSC 是一个概念证明,所以这不是判断其性能的最公平的镜头,但谷歌应该记住,从这一点到现实世界工作机器人的飞跃不仅仅是数量上的。

这些是主要的语言和动作问题。但还有许多其他的与此有些关联:PaLM 提出的任务可能需要比机器人的上限更高的步骤。失败的概率随着完成任务所需的步骤数呈指数增长。机器人可以找到它不熟悉的地形或物体。由于缺乏常识,它可能会发现自己处于一种无法随机应变的新局面。

最后一个缺点是,PaLM 和所有其他语言模型一样,容易使它在训练中看到的偏见永久化,对此我将用一整段话来说明。有趣的是,来自约翰·霍普金斯大学的研究人员最近分析了一个机器人的行为,在它通过互联网数据得到增强后,发现偏见超越了语言:机器人是种族主义者和性别歧视者——机器人的行为和数据一样有偏见。这是极有问题的。语言中存在的偏见可能是显而易见的(大部分时间都是如此),但行动中的偏见更加微妙,这使得它们更难定位、分析和消除。

最后,这总是谷歌人工智能博客帖子的补充,该公司以优先考虑安全和负责任的开发而自豪。PSC 带有一系列机制来确保程序的安全性:PaLM 不应该产生不安全或有偏见的建议,机器人不应该采取潜在的危险行动。尽管如此,这些问题普遍存在,公司没有一个标准的解决方案。虽然 PSC 似乎是新一代最先进的人工智能机器人的第一款,但在这方面没有什么不同。

订阅 算法桥 。弥合算法和人之间的鸿沟。关于与你生活相关的人工智能的时事通讯。

您也可以直接支持我在 Medium 上的工作,并通过使用我的推荐链接 这里 成为会员来获得无限制的访问权限! 😃

英语到 Cypher 与 GPT-3 在博士艾

原文:https://towardsdatascience/gpt-3-for-doctor-ai-1396d1cd6fa5

使用英语浏览医学知识图表

作者黄思兴和 Maruthi Prithivirajan

由塞巴斯蒂安·比尔在 Unsplash 上拍摄的照片

2021 年 12 月,四名 Neo4j 工程师与 Maruthi 和我一起在新加坡医疗保健 AI Datathon & EXPO 2021(图 1)上开发了一个名为 Doctor.ai ( 此处和此处)的医疗聊天机器人。得益于 AWS Lex,Doctor.ai 以 Neo4j 图表的形式管理电子健康记录,并以英语与用户互动。

在 Datathon 之后,我们继续扩展了 Doctor.ai,在整合了三个公共知识图谱(此处)之后,Doctor.ai 对疾病、基因、药物化合物、症状等都有所了解。这种扩展将患者的健康记录连接到医学知识网络。换句话说,它把具体和一般联系起来。现在我们可以在更广阔的背景下了解每个病人的病史。例如,在我们询问患者的最后一次诊断后,我们可以进一步询问是什么导致了该疾病,以及可以使用哪些药物(图 1)。

图一。Doctor.ai 的知识图谱和界面。图片作者。

在自然语言中,我们可以用许多不同的方式表达同样的想法,也就是重述。令人惊讶的是,我们人类可以重新措辞和重述很多,而我们的对话伙伴仍然可以理解我们。但对计算机来说,情况并非如此。编程语言往往有我们开发人员必须遵守的严格语法。违规将导致程序失败。自然语言理解(NLU)引擎的工作是将各种人类重述汇聚成一个严格的编程语句(图 2)。Doctor.ai 使用 AWS Lex 和 Lambda 作为其 NLU 引擎。

这一切都很好。Lex 和 Lambda 像宣传的那样工作。然而,开发非常耗时。首先,开发人员需要熟悉一系列新概念,如意图、话语、槽、槽类型和上下文。其次,对于每个意图,开发人员需要提供多个示例话语,设置插槽并管理上下文。最后,每个意图都与一个 Lambda 函数联系起来,在这个函数中,Cypher 查询被合成。Lambda 编程需要一些时间来适应,因为开发人员首先需要学习特定于 Lex 的规则。

图二。自然语言理解引擎将一系列话语汇聚成一个严格的编程语句。图片作者。

问题是:我们能用简单而强大的东西代替 Lex 和 Lambda 吗?答案是肯定的。镇上有了一位新警长: GPT-3 。

OpenAI 的 GPT 3 号首次以其逼真的对话震惊了科技界。但这只是它众多惊人能力之一。除了模仿史蒂夫·乔布斯,GPT-3 还可以执行一系列自然语言任务,包括摘要、语法纠正、代码解释、代码纠正、代码翻译、文本到命令等等。尽管仍需要人为干预,但 GPT 3 号独自就能正确完成大部分任务。更重要的是,它具有“认知”灵活性,可以根据人类的输入来提高其性能。在我们看来,GPT-3 可以被认为是 NLU 近年来改变游戏规则的技术迭代之一。

图 3。这个项目的架构。图片作者。

在本文中,我们将向您展示如何在 Doctor.ai 中使用 GPT-3。图 3 展示了该架构。我们将利用它的能力把我们的英语问题转换成密码。但是在这种情况下,Text to Cypher可能是一个更好的名字。这个项目的源代码存放在 Github 仓库中:

https://github/dgg32/doctorai_ui_gpt3

Neo4j 数据库转储文件位于:

https://1drv.ms/u/s!Apl037WLngZ8hhj_0aRswHOOKm0p?e=7kuWsS

1.GPT 三号账户

首先,我们需要一个 GPT 协议 3 的账户。请注意,并非所有地区都受支持,例如中国。确保您所在的地区在列表中。一旦您获得了帐户,您就获得了一个密钥(图 4)。18 美元的初始贷款足够支付整个项目了。

图 4。在您的帐户管理页面获取您的 GPT-3 密钥。图片作者。

2.在云上设置一个 Neo4j 后端

我们可以在 AWS、GCP 或 AuraDB 上托管我们的 Neo4j 数据库。你也可以简单地使用我下面的 CloudFormation 模板在 AWS 上设置它。用户名是neo4j,密码是s00pers3cret

https://github/dgg32/doctorai_gpt3_aws

在任何情况下,您都可以使用上面的转储文件来恢复完整的数据库。例如,在 EC2 中,首先以ubuntu的身份登录您的实例,并执行以下 bash 命令:

代码 1。从转储文件恢复 Neo4j。

设置 EC2 或 Compute 时,确保端口7686打开。另外,HTTPS 和 HTTP 也分别需要端口74737474。如果你想使用 AuraDB,你至少需要专业版,因为 Doctor.ai 的知识图中节点和边的数量超过了免费版的硬性限制。

在继续之前,请测试您的 Neo4j 数据库。首先,在浏览器中输入地址:

登录后,您应该在界面中看到节点和关系:

图 5。用 Neo4j 浏览器考察 Doctor.ai 的知识图谱。图片作者。

现在让我们使用 JavaScript 中的bolt协议来测试连接。你首先需要neo4j-driver

然后在控制台中输入node并执行以下命令:

代码 2。测试螺栓连接。

如果你看到输出SARS-CoV-2,这种情况下值得庆祝!

3.GPT-3

现在我们可以在 Doctor.ai 中使用 GPT-3,我们将修改我们的同事 Irwan Butar Butar 的react-simple-chatbot中的代码,该代码反过来基于 Lucas Bassetti 的工作。并且所有的动作都发生在一个文件中:DoctorAI_gpt3.js。在这个文件中,我们将从用户那里一次提取一个英语问题,打包并发送给 GPT-3。GPT-3 会将其转换成密码查询。我们对后端数据库执行这个密码查询。最后,我们将查询结果返回给用户。

GPT-3 是这样工作的:你给它一些英语-密码对作为例子。比如:

如果你有几个表达式应该从 GPT-3 中触发相同的响应,你可以用“或”或“或”把它们放在一起像这样。

GPT-3 将学习并为您的下一个英语问题生成密码查询。没有证据表明 GPT-3 以前接受过 Cypher 的训练。但是它可以用一些例子推断出密码的语法,并写出密码。太神奇了。你可以在 GPT 三号游乐场亲自测试一下:

图 6。在操场上测试 GPT-3。图片作者。

英文提示以一个#符号开始。当您点击Generate按钮时,GPT-3 将在下一行生成正确的密码查询:

图 7。Cypher 测试的结果。图片作者。

你会注意到有过多的文本。你可以通过调节右边的Response length参数来控制。

DoctorAI_gpt3.js中的 GPT-3 部分只是上面演示的一个代码。

图 8。作者的 ai 医生图像的 GPT-3 组件。

4.用 GPT-3 密码查询 Neo4j

一旦 GPT 3 号完成了这一重任,剩下的事情就简单多了。Neo4j 查询的 JavaScript 只是上面代码 2 的扩展。

图 9。Doctor.ai. Image by author 的 Neo4j 查询组件。

您可以在 Github 资源库中看到完整的代码。

5.托管前端

现在是托管前端的时候了。这个过程已经在我的上一篇文章 Doctor.ai 中描述过,这是一个人工智能驱动的虚拟语音助手,用于医疗保健 。只有两个小变化。首先,将 Amplify 指向当前的 Github 资源库,而不是文章中提到的旧资源库。其次,环境变量完全不同。在Configure build settings页面的Advanced settings下,设置以下四个环境变量,并填入正确的值:

请注意,在客户端,我们首先需要允许浏览器通过端口 7687 访问 URL。如果我们的 EC2 实例没有 SSL,这是必要的。如果使用 AuraDB 托管后端,就没有这个问题。但是在撰写本文时,AuraDB Free 太小,无法承载 Doctor.ai。在你浏览器的地址栏输入https://[EC_public_ip]:7687,点击Advanced... ➡️ Accept the Risk and Continue(此处读)。

图 10。在浏览器地址栏中输入 EC2 公共 IP。图片作者。

图 11。接受风险,继续。图片作者。

图 12。确认异常的消息。图片作者。

当您看到图 12 中的消息时,您已经准备好了。

6.测试 GPT-3 博士. ai

最后,我们可以测试这个新的 Doctor.ai,看看 GPT 的魔力-3:

图 13。测试由作者提供的 GPT-3 powered Doctor.ai 图像。

在这里,我向艾医生询问了一些关于艾滋病毒感染和脊椎跗骨结合综合征的信息。这些问题遵循我们的培训示例的模式。因此,它们运行良好并不令人意外。让我们重新措辞我们的问题,看看 ai 医生是否还能理解我们的意图:

图 14。用重述测试 Doctor.ai。图片作者。

起初,艾医生无意中发现了这些重述。它可以识别一些语句,但不能识别其他语义相同的语句。要改进 Doctor.ai,可以给它提供更多的例子。让我们在训练集中添加一个额外的示例对:

通过它,Doctor.ai 能够在构建 Cypher 查询之前将关键字“有机体”转换为“病原体”。此外,它还可以推广到其他类似的问题。

图 15。我们可以通过增加更多的训练例子来改进 NLU 医生。图片作者。

最后,我们来测试一下 Doctor.ai 能不能听懂代词。

图 16。作者对博士艾形象的代词测试。

这里我们看到一个错误。患者 id_2 于 2015 年就诊于 ICU。经过仔细检查,很明显 GPT-3 询问的是病人 id_1 的入院时间,而不是 id_2。因此,当 GPT-3 遇到“他”或“她”等代词时,它假设我们指的是对话中提到的第一个而不是最后一个。

结论

GPT 3 是一个可怕的游戏改变者。在许多情况下,它对自然语言的理解可以与人类说话者相媲美,它只需要少量的训练数据。很容易扩展。如果它犯了一个错误,我们可以只添加一个或两个正确的答案到训练集,GPT-3 将把这种纠正推广到其他类似的情况。对于开发人员来说,向 GPT-3 展示一些例子要比写许多行死板的编程语句容易得多。在 GPT-3 之前,我们在 Doctor.ai 的 Lambda 中看到了大量代码重复。Lex 的配置也是劳动密集型的。GPT 3 号改变了这一切。只需在前端增加 60 行代码,它就取代了庞大的 Lex 和 Lambda。可以有把握地说,GPT-3 可以极大地减少开发和测试时间,并缩减其他自然语言相关项目的代码。

但它完美吗?不。正如这个项目所展示的,它在理解代词方面有困难。不知何故,它专注于第一个提到的问题,而不是最后一个提到的问题。那肯定不像人类。此外,一些重述可以智胜 GPT-3。但对我来说,这些都只是小问题。

这篇文章只是对 GPT-3 的一点皮毛。示例代码中的英语-密码对远非详尽。我们可以做更多来覆盖 Doctor.ai 中的整个知识图表。GPT-3 也可以通过微调作业进行微调以获得更好的性能。可能性是无穷的。

我们鼓励您将 GPT-3 用于您自己的 NLU 项目。告诉我们你是如何使用它的。

Update: my next article Can Doctor.ai understand German, Chinese and Japanese? GPT-3 Answers: Ja, 一点点 and できます!shows that Doctor.ai can understand German, Chinese and Japanese thanks to GPT-3.

执照

Hetionet 发布为 CC0 STRING 在“4.0 知识共享”许可下 免费提供,而 学术用户可以免费使用 KEGG 网站

https://dgg32.medium/membership

本文标签: 中文翻译博客TowardsDataScience一百七十九