arXiv 精选—2021 年 2 月阅读
ML 论文每月精选。
在你的阅读清单上保持领先是很难的,而找到哪些论文应该在阅读清单上更难。在 Zeta Alpha 我们总是密切关注最新的 ML 研究,所以我们认为每月分享一次最近的论文精选会很有用,以展示我们认为会有影响力的出版物,主要基于每部作品的贡献和作者的声誉。不要把这个列表看得太全面:像其他人一样,我们也有自己的偏见,但是你能从 2000 多篇论文中选择的就这么多了。尽情享受吧!
1.从自然语言监督中学习可转移的视觉模型(OpenAI CLIP) | ✍️ 博文 |👾代码
亚历克·拉德福德、琼·金旭等人
🎖 为什么→ OpenAI 论文总是在社区中制造很多噪音,大多数时候是有充分理由的。结果部分的广泛性和令人印象深刻的零射击性能使这部作品成为对 CV 和 NLP 感兴趣的人的必读之作。
💡关键见解→ 这部作品的主旨遵循了 OpenAI 的剧本,并再次证明了萨顿的惨痛教训:
- 为任务策划有史以来最大的同类最佳数据集;在这种情况下,(图像、文本)对从网络上爬取(4 亿个样本🤯).
- 精心设计大规模和大型计算机培训。
- 展示如何一个简单的任务就是你所需要的全部如果你扩展数据和计算足够的话。
在这种情况下,他们从网络上创建了一个 4 亿(文本,图像)对的数据集,没有任何人工标记,并在对比设置中共同学习文本和图像的表示;其中该模型最大化正面(文本、图像)对的相似性,并且推开负面对。实验的广度确实令人惊叹,在这些结果中,也许最有趣的是那些**零镜头分类、**在顶级 ResNet-50 特征上的性能可与完全监督的线性分类器相媲美(见下图)。
剪辑(左)和零镜头分类方法的对比预训练框架。来源:https://cdn . open ai . com/papers/Learning _ Transferable _ Visual _ Models _ From _ Natural _ language . pdf
CLIP vs ResNet50 的零射击性能+微调线性分类器。来源:https://cdn . open ai . com/papers/Learning _ Transferable _ Visual _ Models _ From _ Natural _ language . pdf
2. RepVGG:让 VGG 式的网络再次伟大起来👾代码
丁小寒等著
🎖 为什么→ SOTA 不是一切,这项工作证明了它回到了图像分类的鲁棒快速 CNN 的基础,同时保留了分支 resnets 的最新技巧的性能,实现了速度-性能的平衡。
💡关键见解→ 随着计算机视觉领域的成熟,效率、速度和可定制性变得越来越重要,因为研究希望与现实世界的应用相关。这项工作背后的主题是“让我们回到基础并擅长于此”:他们吹嘘没有分支,只使用 3x3 卷积+ ReLUs,不使用架构搜索、复合缩放或任何其他“繁重的设计”。
本文的主要贡献是作者所谓的**结构重新参数化。**该方法允许训练具有剩余连接的模型,然后将它们转换成单路径模型拓扑,这使得推理非常快。ImageNet Top-1 的性能仍然在 80%左右(远远低于 SOTA 的 90%),但单个 GPU 上每秒示例的真实速度远远领先于竞争对手。
与其他现有模型相比,ImageNet top-1 精度和推理速度的权衡。来源:https://arxiv.org/abs/2101.03697
3.让预先训练的语言模型成为更好的一次性学习者 |👾代码
高天宇、亚当·费舍尔和陈。
🎖 **为什么:**我们不会很快部署 GPT-3 大小的型号,因为它需要资源,但我们都在为更小的型号带来令人惊讶的少量拍摄能力!
💡**关键见解:**可以说,GPT-3 的主要贡献是令人惊讶的少数和零射击性能以及“提示范式”,其中不是在任务上微调模型,而是找到提示,使模型成功执行任务,而无需任务特定的标签。在这项工作中,作者研究了我们如何训练更小的语言模型来显示类似的少数镜头能力。论文的相关工作部分是类似研究方向的相关参考文献的金矿,如 Schick 和 Schütze 的《小语种模型也是少镜头 Learners"⁴》。
本文考虑了几个镜头学习设置,其中我们假设有一个预训练的模型 L,我们希望用每类 K 个训练示例的有限集合对新任务 D 进行微调。为此,他们研究了基于提示的微调,这种微调不是用来自任务 D 的监督信号来更新模型参数,而是将训练样本与提示连接起来,这将使模型通过分类来完成句子。例如,给出一个电影评论"没有理由看它。”,模型提示“无理由观看。果然是【面具】”该模型预测掩码标记,我们将掩码标记与情感标签相关联。
他们通过手动和自动提示以及“演示”来探索微调,这将标记的示例连接到模型提示的输入。结果表明,使用这些技术,小语言模型可以在少数镜头设置上表现得非常好。
不同提示和微调策略的结果。来源:https://arxiv.org/abs/2012.15723
4.开关变压器:通过简单有效的稀疏性扩展到万亿参数模型 |👾代码
威廉·费杜斯、巴雷特·佐夫和诺姆·沙泽尔。
🎖 为什么→ 我们经常把更多的参数与需要更多的计算联系在一起,但事实并非如此。放大模型是一种趋势,将在未来几年保持相关性,这项工作是一个很好的例子,推动模型大小的边界。
💡关键见解 →题目中的万亿这个词需要一些说明,这些万亿参数是稀疏,这意味着它们中的大部分在计算一次向前传球时都没有用到。每个转换器层都是专家的混合体,在推理时进行硬路由,这样,当您添加专家时,每次向前传递的操作数保持不变,尽管内存占用和计算节点之间的通信开销会增加。
这篇论文有太多的内容要在几个段落中浓缩,但我要强调的是,最有趣的发现之一是如何通过向每一层添加专家来扩大变压器的规模,从而大大加快学习速度,同时保持其他变量不变。
从结果来看,在最大参数数量时,性能仍然没有接近收敛,因此我们可以期待在变得更大时发现更多有趣的现象。这在现实世界的设置中很重要,因为较小的模型可以从较大的模型中提炼或删减,而较大的模型优于从零开始训练的等效模型;这是一种可能在未来几年成为主导的学习模式。
作为稀疏模型参数(左)和训练步骤(右)的函数的性能增益。对于所有显示的情况,推断中的失败次数都是相同的。来源:https://arxiv.org/pdf/2101.03961.pdf
5.论随机鹦鹉的危险:语言模型会不会太大?
作者:艾米莉·本德、t·格布鲁、a·麦克米兰·梅杰和 Ss·什米切尔。
🎖Why → 作为我们刚刚分享的关于大变形金刚的工作的对比,这里有一篇论文指出了语言模型现状的危险。2020 年 12 月初,关于这项工作初步版本的争议引发了谷歌人工智能伦理研究员蒂姆尼特·格布鲁(Timnit Gebru)的解雇,这成为了人工智能内部伦理和谷歌在 2010 年可疑地位的公开辩论的中心。
💡关键见解→ 在这份立场文件中,作者回顾了语言模型的现状及其带来的更广泛的危险,如环境和财务成本,这是一个长期存在负面社会偏见的训练数据集,与从业者缺乏问责制有关。作者提出的建议是在建立语言模型时权衡这些因素,并超越语言研究中越来越大的模型,而是专注于诸如管理和记录更高质量数据集的领域。虽然这篇论文背后的整个故事使其内容比实际更重要,但这是一篇有趣的阅读,有许多相关参考资料,捕捉了截至 2021 年 1 月的语言模型快照。
突出的语言模型及其参数计数和预训练数据集大小。来源:http://faculty . Washington . edu/e bender/papers/random _ parrots . pdf
6.反思多级检索管道中 BERT 重排序器的训练👾代码
高鲁豫、戴、杰米卡兰。
🎖 为什么 →我们发现这项工作在 MS-Marco 排行榜上名列前茅,这是最受欢迎的信息检索基准之一,尽管边缘非常粗糙,但这篇论文基于神经检索损失函数的一个非常简单的变化,结果很有希望。
💡关键见解→ 现代神经重排序器分两步工作,以减轻运行完整神经网络来计算每个文档查询对的相关性的高计算成本。
- 初始检索器(M)从整个文档集 d 中选择候选库 C
- 一个神经模型——re-ranker®——获得每个文档-查询对作为输入,并对它们的相关性进行评分。该过程通常依赖于查询文档相关性的人工注释,其中重分类器最小化所有候选 C 中的二进制交叉熵损失,将它们分类为正样本或负样本。
人们通常会期望,当第一模型 M 变得更好时,系统的整体性能将会提高,因为重新排序器得到了更好的样本可供选择,并且工作人员已经试图改进这个第一检索阶段。然而,实验表明,当检索器 M a 选择更好的文档池时,重新排序器 R 通常更难区分相关文档和不相关文档。本文针对这种现象提出了一种非常简单的解决方案,该解决方案包括用对比损失来代替 BCE 损失(其中所有文档被分类为相关或不相关),其中一次仅考虑一个正面文档,并且负面文档通过 M 在排名靠前的文档中进行采样,这比 BCE 对假阳性的征税更强:
这个巧妙简单的改变足以让这部作品达到 MS-MARCO benchmark 的巅峰。然而,如果你查看这篇论文,你会发现这仍然是非常粗略的初步工作,结果非常有限:顶级性能依赖于技巧和启发(正如所有领先的 IR 方法一样),并且需要更多的消融实验来真正理解在重新排序中使用这种对比损失的好处。我们期待着那一天!
与之前最先进的 PROP 相比,建议模型的性能。来源:https://arxiv.org/abs/2101.08751
7.用于开放领域问题回答的神经检索器的端到端训练👾代码
Devendra Singh Sachan 等人
🎖为什么→ 与之前的论文不同,这项工作对开放式问题回答(QA)的预训练任务进行了详细的系统研究,它与我们刚刚讨论的文档排序和重新排序任务有很多共同之处。它很好地介绍了在 QA 排行榜上占主导地位的最新实践,由来自 MILA、麦吉尔和英伟达的知名研究人员撰写。
💡关键见解→ 在这种情况下,开放式问题回答的神经管道也包括第一阶段检索器,它选择一组上下文、和读者提出的问题“ q 和上下文“*K”的集合,*对它们进行编码,然后基于这两部分输入对答案“*a”*进行解码。作为读者模型,他们使用预先训练的 T5 模型。
与开关变压器论文类似,在一个段落中要总结很多内容。为检索者研究的两个主要的训练前任务是逆向完形填空任务(ICT)和掩蔽显著跨度:
- 逆向完形填空任务(ICT):提取文档的片段,并在对比设置中学习片段和文档的表示,该表示将片段与它们原来所属的文档相匹配。
- 掩蔽显著跨度:预测标记(如命名实体)的掩蔽显著跨度。
此外,这项工作比较了将上下文纳入答案生成的两种方法:
- 单个 top-k:答案的可能性被分解为上下文集合的边际总和 K 。
- 联合 top-k:答案的可能性是直接在上下文集合上计算的 K. 在实践中,这意味着上下文被连接起来作为读者模型的输入,问题可以同时关注所有文档以生成答案。
这项工作为第一个检索阶段以及自然问题和 TriviaQA 数据集的“端到端”QA 提供了最先进的技术。
只检索自然问题和繁琐问题的结果。来源:https://arxiv.org/pdf/2101.00408.pdf
与之前的 SOTA 相比,端到端 QA 性能。来源:https://arxiv.org/pdf/2101.00408.pdf
8。对手实例化:差分私有机器学习的下限
米拉德·纳斯尔等人
🎖 为什么→ 差分隐私(DP)的机器学习实践仍然不是主流,部分原因是进入门槛高,研究阶段相对较早。不要让标题中的花哨词汇吓到你,这项工作提供了对 DP 的广泛介绍,并研究了在现实约束下实例化对手时可以保留多少隐私。
💡关键见解→ 假设您想要在医院托管的机密医疗数据上训练一个模型。您使用这些数据定义一个用于训练模型的计算,对于训练的每一次迭代,您将模型的权重发送给医院,医院计算一些权重更新并将其发送给您。现在,如果你是一个非常聪明的坏演员——一个对手— ,在给定权重更新的情况下,你能从训练数据集中推断出任何个人数据吗?差分隐私负责给你收到的数据添加足够的噪音,这样你就无法从中恢复任何有意义的数据(这是一种极端的过度简化,但你已经明白了要点)。
现在,差分隐私通常研究隐私的正式上限(即最坏的情况),例如,假设的对手可以完全访问每个中间权重更新。但是在真实的环境中,我们可以将这些约束进一步细化为更现实的约束。例如,的对手只能访问最终模型,或者只能通过 API 访问其预测,等等。本文考察了隐私保护如何在这些更现实的案例中发挥作用。结果表明,当这些现实的约束被强加时,隐私界限是如何大大增加的,这是这些技术的现实世界适用性的一个有希望的结果。
现实对手约束下的差分隐私保护综述。来源:https://arxiv.org/pdf/2101.04535.pdf
9. GENIE:文本的人在回路评估排行榜 |👾代码 |🌐网站
丹尼尔·哈沙比等人
🎖 **为什么:**如果当今的 ML 进展都是关于排行榜的,那么这些就不应该局限于完全自动评估的领域。文本生成就是这样一个任务,完全自动的评估是非常困难的:BLEU,ROUGE 分数在一定程度上与人类的判断相关,一旦它们成为优化目标,这种相关性就会消失。
提出了一种结合经典自动评测和众包便捷人工评测的评测基准。这里做了大部分繁重的工作:人工评估基准已经使用了几十年,但是从来没有像 GLUEbenchmark 这样的自动基准那样大规模和方便。现有的人在回路评估框架,如 HYPE⁵、ChatEval⁶或 HUME⁷,每个都只专注于一项任务,所以看看 GENIE 作为一个更通用的基准在社区中获得多少牵引力将是有趣的。
🔗**哪里可以找到:**你可以在 https://leaderboard.allenai.org/genie-mt/submissions/public找到更多关于它以及如何提交你的模型的信息
GENIE 目前支持的任务。来源: GENIE
文本生成的人在回路评估排行榜
10.机器人操作中自动发现目标的不对称自我游戏 |📺演示
作者 OpenAI 等人(要求论文引用格式)
🎖 为什么→ 自我游戏适用于机器人操作。尽管由于缺乏实验深度(即所有实验都只是模拟)而被 ICLR 2021 拒绝,但其背后的想法是非常有前途的,毫无疑问将产生坚实的影响。
💡关键见解→ 本文介绍了机器人操纵的任务,这实质上意味着让机器人学习操纵给定指令或特定目标的对象。在这种情况下,他们探索机器人如何学习操纵物体来实现目标,只给定最终目标,没有指令。
解决这个问题的想法很简单:我们考虑两个机器人,爱丽丝和鲍勃。Alice 创建对象的配置,Bob 需要复制它们。Alice 因提出 Bob 无法创建的配置而获得奖励,Bob 因能够复制 Alice 的状态而获得奖励。假设 Alice 需要为 Bob 生成配置,我们确信 Bob 呈现的状态是可行的。在这种情况下,爱丽丝和鲍勃都不需要被贴上标签的监督,并且鉴于爱丽丝和鲍勃都是在这种对立的情况下从头开始,爱丽丝提出的配置自然会变得越来越困难,模仿课程学习的概念,其中任务变得越来越困难,但没有明确地管理一组按复杂程度分级的任务。
要使这一过程稳定并在实践中发挥作用,还需要许多额外的细节,但正如模拟实验所指出的那样,自我游戏似乎比教会鲍勃成为操纵表面上的物体的专家的课程学习更有效和更强大。
机器人操作的自我游戏框架。来源:https://arxiv.org/pdf/2101.04882.pdf
不同简单任务上自我游戏与课程学习的比较。来源:https://arxiv.org/pdf/2101.04882.pdf
我们的每月精选到此结束,但我们才刚刚开始。如果你想了解最新的研究,请在推特上关注我们 @zetavector 。我已经在期待分享二月份的下一个选择;回头见!
参考文献:
[1]“弱监督开放领域问答的潜在检索”Kenton Lee 等 2019。
[2]领域:检索-增强语言模型预训练Guu 等 2020。
[3] " 用统一的文本到文本转换器探索迁移学习的极限" Colin raff El 等人,2020。
[4] " 小语种模特也是很少出手的学习者" Schick 和 Schütze 2020。
[5]HYPE:生成模型的人眼感知评价基准Sharon Zhou 等 2019。
[6] " ChatEval:一个聊天机器人评测的工具" joo Sedoc 等人 2019。
[7]“统一人工和统计评价的自然语言生成”Tatsunori Hashimoto 等人 2019。
arXiv 精选—2021 年 6 月阅读
最近的 ML 论文每月精选:MLPs 回归,无令牌语言模型,视觉变形金刚上的 SSL 等等。
图片作者。
在过去的一个月里,ML 研究文献带来了令人惊讶的结果,例如 MLPs 作为计算机视觉的竞争性架构的复兴,或者对批处理规范化作为一种完全无害的层的质疑。变形金刚也(当然)在盘子上:用于视觉上的自我监督学习,以及句子表示技术和字符级语言建模。
这是每月一次的最新 ML 研究文献精选,由 Zeta Alpha 支持,我们总是密切关注最新的论文。尽情享受吧!
MLP 混合器:一个全 MLP 架构的愿景👾代号
作者:伊利亚·托尔斯泰欣、尼尔·霍尔斯比、亚历山大·科列斯尼科夫、卢卡斯·拜尔等人
❓Why → 非常简单的基于 MLP 的架构突然比它们应该的工作得更好,这具有有趣的含义,并推进了我们关于深度学习工作原理的知识。
💡关键见解→ 你或许可以通过扩大规模来解决 ML 问题。好吧,好吧,这是一个过于简化和夸张的说法,但是里奇·萨顿的惨痛教训似乎比好酒更容易陈酿。
本文构建了一个既不使用注意力也不使用 CNN 的架构,其工作方式如下:
- 将图像分割成小块,展平成矢量并叠加。
- 转置堆栈,并对所有面片的每个要素应用 2 层 MLP。
- 转置回原始形状,并在每个面片的所有要素上应用 2 层 MLP。
- 重复前面的块 N 次。
结果并不十分 SOTA,但足以引起一些眉毛和引发讨论。虽然 CNN 目前还没有走向任何地方,但这加强了一个想法,即架构选择不是引入所需归纳偏差(如平移不变性/等方差)的必要条件,这些可以通过增强等技术仅从数据中学习,尽管效率较低。
非常有趣的是,就在这篇论文被上传到 arXiv 之后,其他几篇显示非常相似结果的文章也被上传,如注意 MLPs, RepMLP:将卷积重新参数化为完全连接的图像识别层, ResMLP:具有数据高效训练的图像分类前馈网络和你甚至需要注意吗?一堆前馈层在 ImageNet ⁴.上表现惊人的好
来源:https://arxiv.org/pdf/2105.01601.pdf
字节 5:通过预先训练的字节到字节模型走向无令牌的未来👾代码
作者薛阿迪蒂亚·巴鲁阿、诺亚·恒、拉米·阿尔-Rfou 等人
❓Why → 大多数 NLP 语言模型(LM)都是在几万个标记的固定词汇或子词单元上操作的。虽然这种方法在大多数时候都很有效,但它仍然会遇到诸如打字错误、大写变化或形态变化等问题。无令牌 LMs 是解决这些问题的一个很有前途的方向。
💡关键见解→ 本文的主要目标是展示如何在不牺牲性能的情况下,通过最少的修改,使现有的基于令牌的语言模型(mT5⁹)适用于字符或字节级操作。事实上,作者几乎没有改变主干 T5 架构:他们只是简单地去掉了原来的句子片段标记器,并把文本作为 UTF 8 字符的原始序列,这相当于 256 的“词汇表”大小。训练前的目标-最初屏蔽大约 3 个标记的范围并预测它们-被调整为大约 20 个字符的平均屏蔽范围长度。最后,作者还发现,byT5 受益于编码器和解码器之间的不均匀参数分布:与常规 T5 不同,以较轻的解码器为代价获得“沉重”的编码器是有益的。
来源:https://arxiv.org/pdf/2105.13626.pdf
这篇文章最令人惊讶的方面是,byT5 几乎不需要任何调整就可以达到与其原始版本相当的性能。此外,byT5 具有几个优点,例如对噪声的鲁棒性更强,并且在拼写和发音很重要的任务中表现更好。这为现有的转换器适应字节级序列输入描绘了一个充满希望的未来,尽管有许多警告适用:训练和推理效率仍然明显较差。
自监督视觉变压器的新兴特性 (DINO)👾代号
作者玛蒂尔德·卡隆等人
❓Why → 成熟的自我监督视觉变形金刚是迟早的事,现在它们来了。虽然这只是 vision transformers 和 SSL 的第一步,但这项技术将在接下来的几个月里变得更加实用。
💡关键洞察力→ 视觉变形器可以使用 Bootstrap Your Own Latent 方法训练,其中图像的不同视图由教师和学生编码,输出的相似性最大化。该方法通过使一个网络是另一个网络的指数平均值来避免崩溃(即,对所有图像输出相同的嵌入)。
然而,与 BYOL 不同的是,他们在模拟分类器上使用交叉熵作为输出之间的相似性度量,而不是内积相似性,这允许他们在 softmax 中设置“温度”正则化,这有助于训练稳定性。
这种方法最引人注目的结果是,在没有任何监督的情况下,transformer 中深层的注意力图形成了令人惊讶的高性能对象分割,并且对学习表示的 k-NN 检索也显示了将该技术应用于图像检索的有希望的结果。
资料来源:https://arxiv.org/pdf/2104.14294.pdf
你可能也会喜欢 : 用 Swin 变形金刚进行自我监督学习
简单的句子嵌入对比学习👾代码
由王彤宙和菲利普·伊索拉创作
❓Why → 在无监督的句子表征学习上取得了令人印象深刻的进步,这是一种非常简单的方法,有可能用于其他领域。
💡关键见解→ 在计算机视觉中,生成输入的两个视图就像获取图像的两种不同作物一样简单,但由于语言的离散性,这种简单的增强不能直接应用于语言,这使得对比学习有点棘手。
在这项工作中,作者建议简单地将同一个句子输入到 transformer encode 两次,但在前馈层和注意力层中绘制不同的随机丢失。令人惊讶的是——至少对我来说——添加任何其他以前使用过的增强功能,如“删除一个单词”或“裁剪句子的一部分”,都会降低性能。类似地,添加以前研究过的目标,如“下一句预测”,也会降低性能。
虽然最令人印象深刻的结果是针对仅无监督的训练,但作者也扩展了他们的方法,通过使用正面和负面句子对分别作为正面和硬负面样本来利用标记的数据。
结果不仅包括标准的句子级基准,如 STS⁵,还包括对表征的对齐和一致性的分析,最近被提议作为表征 quality⁵.的预测代理
来源:https://arxiv.org/pdf/2104.08821.pdf
蛋白质序列到结构的学习:这是终点(-端到端的革命)?
作者:埃洛蒂·莱恩、斯蒂芬·艾斯曼、阿恩·埃洛夫松和谢尔盖·格鲁丁宁
❓Why → 几个月前,DeepMind 的 AlphaFold 进行了一轮展示,展示了变形金刚和 SSL 如何跳过被称为蛋白质折叠的任务,蛋白质的 3D 结构仅由它们的线性氨基酸结构构建而成。我没有必要的背景来理解这到底有多有影响力,但这篇论文帮助奠定了事态的发展,并提供了关于蛋白质结构领域深度学习未来的知情意见。
💡关键见解→ AlphaFold 2 确实走在了时代的前面,这是 it 计算资源的一个重要原因,它越来越成为研究的一个区分因素。这再一次将学术研究团体置于一个困难的位置,与资金雄厚的公司支持的实验室竞争。
结构生物学精确预测的影响在很大程度上仍然是未知的。虽然蛋白质结构的确在很大程度上决定了它的性质,但还有更多变量在起作用。从乐观的方面来看,计算机模拟结构蛋白预测将会以比以前更快的数量级实现一致、深刻和新颖的生物学见解;但在悲观的一端,这些不足以成功地模拟更现实的蛋白质行为,如复杂的动力学,灵活性和相互作用,这种方法只会在少数情况下有用。
来源:https://arxiv.org/pdf/2105.07407.pdf
扩散模型在图像合成上击败甘斯👾代码
Prafulla Dhariwal 和 Alex Nichol
❓Why → GANs⁶自从引入以来,多年来一直是无可争议的图像生成方法。然而,在过去的几年里,越来越多的基于可能性的替代方法正在出现,以取代它们。他们会变得一样受欢迎吗?
💡关键见解→ 一个月前,我们在 ICLR 强调了一篇扩散模型论文,这篇论文的主旨大部分是相似的,尽管需要额外 8 个月的工作来完善。扩散模型的要点如下:你可以将图像转换成“噪声”作为“扩散过程”。想想单个水分子是如何在流动的水中运动的:有一些确定性的水流遵循一个梯度,并伴随着一些额外的随机抖动。你可以对像素图像做同样的事情,扩散它们,这样它们最终就像一个易于处理的概率分布中的噪声。现在,这个过程实际上是可逆的,所以同样的“反向”扩散过程可以用来从噪声中生成图像。
作者展示了一个良好调整的模型如何在许多图像生成基准上达到 SOTA,超越甘斯。然而,仍然有警告。
来源:https://arxiv.org/pdf/2105.05233.pdf
有一些权衡仍然是不可避免的:GANs 仍然是图像生成任务中最受欢迎的技术,并且速度很快,但它们通常缺乏多样性,并且没有覆盖图像的整个领域,这使得它们更难扩展和应用到新的领域。另一方面,基于可能性的模型——如 VQ-VAE、扩散模型或自回归生成——以速度和图像保真度为代价提供了更好的覆盖范围,由人类(或其他代理指标)来判断。
重新思考 BatchNorm 中的“批处理”
吴雨欣和贾斯廷·约翰逊
❓Why → 自从 batchnorm⁷被提出以来,它已经成为 DL 工具箱中无处不在的工具。然而,它具有不可忽视的含义,而这些含义往往被经验驱动的研究所忽视。
💡关键见解→ 这里有很多东西需要解开,但我要强调的是,BatchNorm 并不像乍看上去那样无害。
首先,BatchNorm 是唯一一个对组而不是对单个输入进行操作的层,这意味着它在训练和推理过程中必然会有不同的行为。而且,BatchNorm 会导致批内信息泄露。该论文给出了以下有见地的例子:设想通过具有 16 个不同类别的 32 个图像,每个类别 2 个图像,一致地构造训练批;该模型将通过至少“成对地”而不是单独地为每个样本生成标签来学习利用这种批量模式。在对比 learning⁸.中可以观察到类似的“欺骗”现象
训练-测试的不一致性也无意中损害了用 BatchNorm 训练的模型的性能:指数移动平均(EMA)技术——最常用于估计用于推断的总体统计数据——导致有偏差的估计,损害了测试集中的性能。
那么我们能从这一切中得到什么呢?您可能应该继续使用 BatchNorm,并受益于它在最常见的设置下的良好工作(从训练集中提取固定大小的批处理 i.i.d ),并使用从同一数据分布中提取的测试集);但在其他情况下使用时要格外小心。
来源:https://arxiv.org/pdf/2105.07576.pdf
我们的月度评选到此结束;如果你想了解最新的研究,请在 Twitter 上关注我们。如果你想了解更多关于 ML 代码、实现和库的最新进展,请查看我们的其他博客系列 最佳 ML 工具和软件 *。*下集再见!
参考文献:
[1] 关注 MLPs*——*作者,戴子航,David R. So,Quoc V. Le,2021。
[2] RepMLP:将卷积重新参数化为全连通层,用于图像识别——丁小寒,,韩,丁桂光,2021 .
[3] ResMLP:数据高效训练的图像分类前馈网络 — Hugo Touvron 等 2021。
【4】你甚至需要关注吗?一堆前馈层在 ImageNet——Luke Melas-Kyriazi,2021。
[5] 通过超球面上的对齐和一致理解对比表征学习——王彤宙和菲利普·伊索拉,2020。
[6] 生成对抗网络——作者 Ian J. Goodfellow 等人 2014。
[7] 批量归一化:通过减少内部协变量移位加速深度网络训练——作者谢尔盖·约夫,克里斯蒂安·塞格迪
[8] 采用对比预测编码的数据高效图像识别 — 作者 Oliver Henaff,2020。
[9]【mT5:一个大规模的多语种预训练文本到文本转换器——由薛、诺亚康斯坦、等人 2020。
arXiv 精选——2021 年 4 月阅读:GPT 反击战,视频变形金刚等等
ML 论文每月精选
图片作者。
在你的阅读清单上保持领先是很难的,而找到哪些论文应该在清单上就更难了。在 Zeta Alpha 我们总是密切关注最新的人工智能研究,所以我们每月都会分享一些最近的论文,以展示我们认为会有影响力的出版物,主要基于每部作品的贡献和作者的影响力。不要把这个列表看得太全面:像其他人一样,我们也有自己的偏见,但是你能从 4000 多篇论文中选择的就这么多了。尽情享受吧!
1。所有 NLP 任务都是生成任务:一个通用的预训练框架 |👾代号
作者:杜,钱玉洁,小刘,,,邱,,杨,。
🎖Why → 本文是现有的三种主要语言预训练方法的地图:自回归(例如,擅长文本生成的 GPTs),掩蔽语言建模(又称填空,如 BERT,擅长 NLU 分类任务)和 seq2seq(针对 T5 等编码器-解码器模型,擅长翻译或摘要等条件文本生成)。这三种技术各有优缺点,所以如果我们能得到最好的结果,那不是很好吗?这里有一个尝试。
💡关键见解→ 下表总结了三种主要语言预处理方法的主要用途。提醒一下,NLU 是基准测试中的分类任务,比如 SuperGLUE (情感分析,自然语言推理等。),条件生成是文本生成任务,其中输入和输出序列之间存在特定的关系(如翻译或总结文本),而无条件生成是自由生成文本的任务。
其中\003; =擅长;—=可以适应;✕=cannot 被直接应用到。资料来源:https://arxiv.org/pdf/2103.10360.pdf
作者提出了一种统一的预训练技术,他们称之为通用语言模型(GLM),并在图描述中进行了精确总结。
来源:https://arxiv.org/pdf/2103.10360.pdf
部分 A 和 B 的这种分离背后的动机是迫使同一模型学习双向编码器(A)和单向解码器(B)。以前基于跨度的模型(如 spanBERT)之间的一个区别是,跨度的长度现在对模型来说是未知的。这项技术需要一些技巧和细节来解决,比如位置编码,这在本文中有详细说明。
说到结果,与 RoBERTA 的比较可能是最有趣的比较之一,其中采用这种新的预训练方法的相同模型优于原始实现。在某些情况下,把最初的 MLM 训练目标和 GLM 混合起来更好,这表明 GLM 并不是普遍优越的。对于 seq2seq 评估,他们执行抽象概括,与类似大小的模型相比,它表现良好。
2。GPT 也明白了👾代号
【作者:】刘潇、延安郑、杜、、钱玉洁、杨、。
🎖Why → 我可以自信地把这篇文章放在我过去一个月的首要任务中。这个想法既聪明又简单,结果看起来非常惊人,论文非常清晰,充满了真知灼见。它挑战了来自同一个研究小组的前一篇论文提出的一个既定事实:自回归预训练对 NLU 没有好处。好吧,拿着你的纸!继续阅读……他们提出的技术 p-tuning ,有可能成为少量学习和微调大型 LMs 的标准技术,对于这些技术,传统的微调效果不是很好,或者成本太高。
💡关键见解→2020 年 5 月,GPT-3 让最持怀疑态度的人感到惊讶,它展示了一个简单的生成性预训练如何扩展到数千亿个参数,只需通过用描述任务的自然语言和/或给它一些例子来“提示”模型,就可以显示出令人印象深刻的零击球和少击球性能。这激发了一些深入探究“提示”艺术的作品,如 PET⁴.甚至有人提出了自动为模型寻找好的提示来解决任务的技术,而不需要像 AutoPrompt 那样更新任何模型参数。
在这项工作中,作者有一个绝妙的想法,不再将提示限制为固定词汇表中的实际单词。相反,他们学习固定数量的连续嵌入,可以通过梯度下降进行优化,他们称之为 p-tuning 。这意味着所有的原始模型参数可以保持冻结,只有提示嵌入被更新。把这想象成某种差异化编程 2.0 很有趣,在这里你学会解释一个冻结的预训练模型做什么。
来源:https://arxiv.org/pdf/2103.10385.pdf
在微调、p-tuning 和手动提示之间的比较中,结果是最有趣的。特别是对于知识探测(从一个冻结的预训练模型中提取仿真陈述),p-tuning 比其他方法表现得好得多。在 SuperGLUE 基准测试中,虽然 p-tuning 不能与其他 SOTA 相提并论(但考虑到那里巨大的模型大小差异,这不是一个公平的比较),但与标准微调或手动提示相比,p-tuning 显示出非常强的性能。
来源:https://arxiv.org/pdf/2103.10385.pdf
3。作为通用计算引擎的预训练变压器 |👾代号 | ✍️ 博客
凯文·卢、阿迪蒂亚·格罗弗、彼得·阿贝耳和伊戈尔·莫达奇。
🎖Why → 尽管在我看来,这篇论文的核心主张仍未确定(细节决定成败),但将预先训练好的变形金刚理解为“计算引擎”的想法很有意思——给出适当的指令,它可以计算出任何东西。在我看来,这与“GPT 也理解”的论文有很好的联系,在这篇论文中,学习了任务的模型输入,而不是模型参数。
💡关键见解→ 作者探索了变形金刚如何执行各种不同寻常的任务,特别是计算任务:位存储(重复损坏的位串)、位异或(计算两个位串的元素异或,这是 NNs 历史上很难执行的事情)、ListOps(给定一系列预测结果位的操作)、MNIST(手写数字数据集)和 CIFAR-10(图像分类基准)。
更有趣的是,他们声称有一些关于语言的预训练,使它学习所有这些其他任务的普遍性(这些任务事先与语言无关)。为了研究这一假设,他们获得了一个预训练的语言转换器,**冻结了除层归一化和输入和位置嵌入之外的所有权重,**称之为冻结预训练转换器(FPT)。
来源:https://arxiv.org/pdf/2103.05247.pdf
问题出在细节上,因为允许规范化层中的微调仍然会影响自我注意力在未来层中的行为,尽管自我注意力被冻结,但这种微调还是会隐式地优化它们(参见表 11 中它对性能的影响)。此外,通过微调嵌入、输出和层范数参数,随机初始化的转换器已经在许多任务上表现得非常好。
无论如何,尽管论文关于变压器是通用计算引擎的核心主张仍有争议,但论文充满了消融研究——如下表所示——这些研究很新颖,并提供了深刻的结果,以了解它们擅长什么,不擅长什么。
来源:https://arxiv.org/pdf/2103.05247.pdf
4。生成具有稀疏表示的图像
作者:查理·纳什、雅各布·梅尼克、桑德·迪勒曼和彼得·w·巴塔格利亚
🎖Why → 提醒您,用于压缩的离散余弦变换(DCT)图像处理等经典众所周知的技术可以增强图像生成等 ML 任务。
💡关键见解→ 部分受最近基于可能性的图像生成模型(如 OpenAI 或 VQ-VAE⁶的达尔·e⁵)的成功启发,本文探索了稀疏表示在任务中的应用。与 GANs 相比,基于似然性的生成模型的优点之一是,它们训练起来更稳定,并且也没有陷入没有覆盖图像分布的整个空间的模式的风险。使用稀疏表示的动机是它们易于压缩(有很多 0!),研究神经网络在这种表示空间中的表现非常有趣,与常见的图像网格结构形成对比。
我个人不知道 JPEG 压缩中使用的 DCT 变换,它真的很酷。以手动方式,您可以将图像分割成几个像素(即 8×8)的块,然后将所有像素值拟合到 2D 中基于余弦的函数中,8×8 = 64 个自由度。这将图像块表示为由 64 个系数加权的 64 个“频率”函数的叠加。这些系数中的大部分可以在不影响感知图像质量的情况下被移除(我们人类不会看到很多小的高频信息),这导致了易于压缩的稀疏表示(这就是为什么它被用于 JPEG 文件压缩)。看完这段精彩的 DCT 介绍视频后,这篇论文会更有意义。
本文构建的图像表示由一个来自这个 DCT 变换的所有非零稀疏系数的列表(经过一些特殊的量化技巧,但您可以得到它的要点)以及它们的通道和位置信息组成。该模型被训练为自回归预测这些元组,考虑它们的值分类,以自我监督的方式最大化可能性。
来源:https://arxiv.org/pdf/2103.03841.pdf
就结果而言,它们总体来说非常好;即使没有超过 SOTA,也可以与之相提并论(除了在比根仍然统治的阶级条件下)。然而,让我们不要忘记,这些指标只是人类判断质量的代理,所以用你自己的眼睛检查结果!
来源:https://arxiv.org/pdf/2103.03841.pdf
5。ViViT:视频视觉转换器
作者:阿努拉格·阿纳、穆斯塔法·德赫加尼、格奥尔格·海戈尔德、孙辰、马里奥·卢奇奇和科迪莉亚·施密德。
🎖Why → 变形金刚征服的又一个任务(这可能是一个独立的部分)。给定足够的参数和数据(以及适当的扩充),似乎没有变压器不能破解的任务。
💡关键见解→ 本文基于现有的视觉转换器(ViT ),例如“一幅图像相当于 16x16 words"⁷”,并尝试使用不同的策略来同时表示空间和时间维度。这项工作最有趣的一个方面是概述不同的策略来标记视频并对它们应用变形层。首先,在对视频进行标记时,他们解释了统一帧采样与小管嵌入,见下图。
来源:https://arxiv.org/pdf/2103.15691.pdf
其次,在计算跨空间和时间的注意力时,他们提出了 4 种替代方案:时空注意力(一切关注一切)、因式分解的编码器(首先仅空间变换器,然后时间)、因式分解的自我注意力(每个变换器块具有空间然后时间的自我注意力块)、因式分解的点积注意力(一个具有空间头部和时间头部的自我注意力随后被连接)。
他们的消融显示,如果训练良好,4 种不同的模型并没有那么不同,并且在图像数据集上利用预先训练的变压器很有帮助。事实上,他们并没有真正详细地披露他们是如何预先训练他们的模型的,只是说他们是在 ImageNet 或 JFT 数据集上进行的。他们在多个视频分类基准测试中取得了一流的性能,包括 Kinetics 400 和 600、Epic Kitchens、Something-Something v2 和 Moments in Time。标签平滑、混合和随机深度等增强和技巧仍然是实现这一性能的关键,正如它们的消融所示。
6。感知者:具有重复注意的一般感知
安德鲁·耶格尔、菲利克斯·吉梅诺、安德鲁·布洛克、安德鲁·塞斯曼、奥里奥尔·维尼亚尔斯和若昂·卡雷拉。
🎖Why → 对数据进行尽可能少的假设是有趣的,因为它有潜力很好地转移到许多领域。在这种情况下,感知者是一个关注可伸缩性(消除自我关注的讨厌的 N 次方),并对数据结构做最小假设的架构。
💡关键见解→ 感知者架构包括重复以下架构模块,包括:
- 潜在表示(大小为 NxD,长度为嵌入大小)和数据的原始表示(大小为 MxC,长度为通道)之间的交叉关注步骤。这使得交叉注意力具有 NxM 而不是 MxM 的复杂度,这在 N<
- A transformer layer that maps a latent representation to another latent representation of the same shape (see figure below).
Source: https://arxiv.org/pdf/2103.03206.pdf时是相当大的
这可以被认为是将原始表示重复缩小为潜在表示。假设在该实现中,块共享它们的权重,则可以认为是展开的 RNN。实际上,在附录中我们可以看到重量共享和非重量共享之间的比较,其中前者达到更好的性能,因为它不像非重量共享那样过度拟合;这种重量分担导致 44M 参数模型。
作者对各种形式进行了实验:图像、原始音频、视频、原始音频+视频和点云。虽然结果部分不是很全面,但性能与现有模型相当或更好,特别是与现有的多模态模型相比(例如,ImageNet top-1 上的 85.7%)。结果令人印象深刻,但我们不能忘记细节:虽然架构对所有模态保持相同,但需要一些模态特定的扩展和位置嵌入来实现它(裁剪、特殊位置编码等)。)
顶级 ImageNet 性能。红色的方法利用了特定领域的“图像网格结构”,而蓝色的结果则没有。来源:【https://arxiv.org/pdf/2103.03206.pdf】T4
7。注意力并不是你所需要的全部:纯粹的注意力会随着深度成倍地下降👾代码
作者董一禾、让·巴普蒂斯特·科多尼尔和安德烈亚斯·卢卡斯。
🎖Why → 偶尔一篇理论论文不会要了我们的命,有时它们会提供有价值的见解,而不仅仅是到处都是可怕的核心数学。这就是一个这样的例子:为什么这些跳跃连接如此重要?
💡关键见解→ 感谢上帝,我们有这些跳过连接。注意和跳过连接是你需要的全部*。
好吧,让我们扩展一下,你可能听说过跳过连接(或残差)有助于通过更深的网络传播梯度稳定训练。这篇论文提供了一个理论基础,解释了为什么这在变形金刚中如此重要:没有变形金刚,自我注意力输出可以证明会非常快速地退化——通过 SGD成双指数级——,这意味着它会变成一个秩 1 矩阵,其中会杀死流经它的信息(即,想象一个嵌入序列,其中所有嵌入都是彼此的倍数)。
这篇论文的主要观点与其说是惊人的见解,不如说是对现有怀疑的确认。一些工作已经根据经验展示了如何将注意力矩阵分解成对性能影响最小的低秩矩阵,例如“Linformer"⁸.”
8。可变速率离散表示学习 |⏯演示
作者:桑德·迪勒曼、查理·纳什、杰西·恩格尔和卡伦·西蒙扬。
🎖Why → 可变利率表示法的想法令我着迷。直觉上,听和理解口语,信息并不是均匀分布的,我们的表征又何必如此呢?这提出了许多挑战,但很高兴看到研究解决了这个问题。
💡关键见解→ 这项工作构建了基于事件的表示,涉及随时间量化的编码器解码器架构,经过训练后,解码器输出的对数似然性最大化,以适应量化的潜在表示。“慢度惩罚”激励潜在表示保持与前一时间步相同的值;这种惩罚是由明确强加容量瓶颈的想法所激发的。他们使用的另一个技巧是施密特触发量化:由于噪声,量化值可能会跳跃太多,因此 STQ 会施加一个记忆量化,只有当变量变化超过一定量时才会跳跃。
给定这种设置,直觉是量子化的潜在表示应该只在有*事件时改变。*例如,如果有 2 秒钟的沉默,表征可能会保持不变,但如果有人在说话,平均事件发生率(AER,潜在表征的变化)应该会更高。将编码器和解码器参数化的神经网络是一个“鼓形变压器”,要完成这项工作,还需要本文中详述的更多技巧。
关于结果,最有趣的部分是关于所有超参数的烧蚀,如慢度、AER、量子化水平等。与现有工作的比较不像人们所希望的那样广泛,但这主要是因为口语建模的自动评估不是非常可靠。
来源:https://arxiv.org/pdf/2103.06089.pdf
9。巴洛双胞胎:通过减少冗余进行自我监督学习 |👾代号
作者:Jure Zbontar、李静、Ishan Misra、Yann LeCun 和 Stéphane Deny。
🎖Why → 这是一个新的自我监督的损失!它非常简单,可与其他 SOTA 表示学习技术(SimCLR,BYOL)相媲美,并呈现了一些有趣的特性,值得进一步研究…
💡关键见解→ 我喜欢将它概念化的方式是在“每个特征”的基础上进行某种对比学习(但是不要做太多的类比,因为这是不正确的)。您有一个图像的两个视图(假设两个作物),您最大化每个特征的相关性,同时最小化其余特征之间的相关性。您也可以将此视为计算两个表示的外积(估计两个表示的互相关),对整个批次求和并归一化,并使其尽可能接近一个单位矩阵。
巴洛双胞胎损失函数。
这一目标的理论依据可以追溯到 1961⁹的神经科学家 H. Barlow,他假设处理感官信息的目标是将其重新编码为阶乘代码,这意味着具有令人满意的独立成分的表示。巴洛孪晶损失函数受这一想法的启发,因为它鼓励表示只与每个分量相关,而不是全局相关。
其结果可与现有的表示学习技术相媲美,如 BYOL 和 SimCLR,但它有几个有趣的特性。首先,与 BYOL 不同,它对较小的批量(小= 256,512)似乎很稳健;对于大批量(2048,4096),它实际上会降级!我们就此询问了作者,他们告诉我们他们也很困惑。第二,表示维度似乎没有饱和,与比较的方法不同,它不断改进下游性能。
来源:https://arxiv.org/pdf/2103.03230.pdf
10。如何在神经网络中表示部分-整体层次
杰弗里·辛顿。
🎖Why → 深度学习的创始人之一押注于计算机视觉的关键挑战是什么以及如何解决这些挑战。但是没有提供一个工作系统。(还没?).
💡关键见解→ 论文提出的第一点是,人类将视觉场景解析为部分-整体层次,并在元素之间建立视点不变的空间关系。换句话说,我们将图像的一部分表示为一个层次结构,即什么东西属于什么东西(或者对象的子部分等等),并且这些是视点不变的(我们将铅笔和纸建模为当我们四处移动时仍然是相同的*)。这项工作似乎是他的胶囊网络⁰想法的自然延伸,也试图捕捉不同层次的表现。*
根据 Hinton 的说法,这里的主要问题是,当前的端到端神经网络不允许我们动态构建这些解析树,并动态分配神经元组来表示其中的节点。他设想的解决方案——GLOM——最好理解为处理一系列图像(或视频)。它由代表不同层次视觉结构的向量列迭代表示图像的块组成(即每个块约 5 个向量)。在每个时间步,这些列以不同的贡献进行更新:自下而上的预测(L-1 到 L),自上而下的预测(L+1 到 L),相同级别的预测,以及补丁邻域中嵌入的注意力加权平均。理想情况下,对其进行训练将在不同级别产生相同向量的岛,对应于表示其部分-整体层次的图像的解析树。**
来源:https://arxiv.org/pdf/2102.12627.pdf
论文继续用生物学、数学和神经网络的观点来推动这一点;以及描述关于该系统如何以及为什么工作的许多考虑,这些考虑太长了,无法在此进行总结。
最后,尽管这篇文章没有描述一个工作系统,但是有些人已经实现了它,所以来看看吧!
我们的每月精选到此结束;如果你想了解最新的研究,请在 Twitter 上关注我们。我已经在期待着分享五月的下一个选择;回头见!
参考文献
[1] " SuperGLUE:通用语言理解系统的更具粘性的基准"作者 A. Wang,Y. Pruksachatkun,N. Nangia,A. Singh 等人 2019。
[2] " SpanBERT:通过表示和预测跨度来改善预训练" Mandar Joshi,Chen 等人 2019。
[3]“RoBERTa:稳健优化的 BERT 预训练方法”,作者刘,Myle Ott,Naman Goyal,杜等,2019。
[4]“重要的不仅仅是规模:小型语言模型也是很少尝试的学习者”Timo Schick 著,Hinrich Schütze,2020 年。
[5]“零镜头文本到图像生成”作者 Aditya Ramesh、Mikhail Pavlov、Gabriel Goh、Scott Gray、Chelsea Voss、Alec 拉德福德、陈唐山和 Ilya Sutskever 等人,2021。
[6] " 神经离散表征学习" Aaron van den Oord,Oriol Vinyals,Koray Kavukcuoglu 等人 2017。
[7]《一幅图像抵得上 16x16 个字:大规模图像识别的变形金刚》阿列克谢·多索维茨基、卢卡斯·拜尔、亚历山大·科列斯尼科夫、德克·韦森博恩、翟晓华等人 2020。
[8]“林前者:线性复杂性的自我注意”,作者:王思农、李贝琳达、马迪安·卡巴萨、和,2020。
[9] " 感官信息转换的潜在原则" Horace Barlow,1961。
[10] " 胶囊间的动态路由" Sara Sabour,Nicholas Frosst,和 Geoffrey E. Hinton,2017。
[11]“自动提示:通过自动生成的提示从语言模型中获取知识”T19,作者:Taylor Shin,Yasaman Razeghi,Robert L. Logan IV,Eric Wallace 和 Sameer Singh,2020 年。
arXiv 精选—2021 年 7 月阅读
最近的 ML 论文每月精选:专家的回归,注意力可能没有那么特别,像变形金刚一样思考是什么感觉?
图片作者。
在你的阅读清单上保持领先是很难的,而找到哪些论文应该在清单上就更难了。在 Zeta Alpha 我们总是密切关注最新的人工智能研究,所以我们每月都会分享一些最近的论文,以展示我们认为会有影响力的出版物,主要基于每部作品的贡献和作者的影响力。不要把这个列表看得太全面:像其他人一样,我们也有自己的偏见,但是你能从 4000 多篇论文中选择的就这么多了。
这个月,我们将志愿者计算带到了最前沿,更多的变形金刚,专家的组合等等。尽情享受吧!
开放协作中的分布式深度学习 |👾代号
迈克尔·迪斯金、阿列克谢·布克蒂亚罗夫、马克斯·里亚宾等人
❓Why → 汽车几乎一生都在停放,同样,世界上很大一部分计算在大部分时间处于闲置状态。这篇论文展示了志愿者计算——不同团体自愿提供计算资源——如何成功地训练大型语言模型。
💡关键见解→ 志愿者计算(VC)是一种范式,其中各方通过为一种通用算法提供计算资源来进行合作(例如,人们在睡觉时让他们的个人计算机为其他人运行东西)。尽管前景看好,但风险投资并不是免费的午餐:要让它在实践中发挥作用,需要许多考虑因素和谨慎的设计决策,因为你可以从参与者那里假设很少:他们的互联网可能有不同的速度和延迟,硬件可能从移动芯片到高端多 GPU 节点。您希望能够使用一个异质的志愿者团队,为需求设置一个低标准,但是您也希望避免使用最小公分母来平衡所有资源。
本文出色地展示了现有的分布式计算范例,同时讨论了它们的主要权衡,例如节点通信与计算。基于这一分析,作者提出了 DeLOC,其中对等体独立且异步地对微批次执行训练步骤,存储网络一小部分的权重梯度,并以一定的频率聚合它们,以更新整个模型的状态。实际上,这相当于在非常大的批量上训练整个模型。节点进行通信以同步模型的全局状态的方式介于“参数服务器”和“全简化”模型之间(即,一个中心节点进行聚合,或者所有节点自己进行聚合)。所有这些超参数,比如多长时间一次以及哪些节点互相通信,都被巧妙优化,以最大化训练吞吐量。
来源:https://arxiv.org/pdf/2106.10207.pdf
实现是通过 Hivemind 完成的,这是一个专门从事志愿者计算的 PyTorch 库(下面将更深入地描述)。
利用专家的稀疏混合来缩放视觉
作者:卡洛斯·里克尔梅、琼·普伊格韦尔、巴兹尔·穆斯塔法等人
❓Why → 混合专家正在成为将模型扩展到惊人规模的首选技术:关键优势是增加模型参数的可能性,同时保持推理计算成本不变。
💡关键见解→ 简而言之,专家的混合是一个模型,其中输入在推理时被路由到不同的子模型:推理的计算成本将由使用的计算路径决定,而模型表达能力将由参数的总数决定;有点儿两全其美。
专家的混合先前已经表明对于语言模型转换器(例如开关转换器)和系统(例如 FastMoE)是有效的,但是还没有在这种规模上应用于图像。该模型几乎与原始 ViT 相同:将图像分成小块,线性投影到小块嵌入中,并作为序列通过转换器。然而,在这种情况下,常规 ViT 层与 MoE ViT 层交错,其中 MLP 前馈层由一组 k MLP 专家取代,在此之前有一个路由器,该路由器根据输入的值通过不同的专家*发送每个图像补丁。*专家和路由器都通过梯度下降进行训练,并精心设计损失函数,以激励训练中的各种专家,避免崩溃模式,例如只有一个活跃的专家。
来源:https://arxiv.org/pdf/2106.05974.pdf
也许 MoE 应用于大型神经网络的最令人惊讶的结果是,相对于原始 ViT,学习效率(即,将模型训练到特定性能所需的计算量)得到了显著提高。
来源:https://arxiv.org/pdf/2106.05974.pdf
最近的其他工作比较了计算机视觉的 CNN 和 Transformers:VOLO:视觉识别的 Vision outlook er及其在 GitHub 上的流行实现。
无注意力变压器
翟双飞等人
❓Why → 加入上个月基于 MLP 的 CV 架构的热潮,越来越多的证据表明注意力本身并没有多少特别之处。只要网络以某种方式模拟其输入的相互作用,在给定足够的参数和数据的情况下,梯度下降将恰好找到它的方式。
💡Key insights → 作者提出了一种简单的学习成对偏差 w 添加到关键字矩阵,而不是将注意力计算为查询和关键字矩阵之间的传统矩阵乘积,该偏差通过以下表达式形式的指数进行转换,其中 t 是序列元素,所有乘积都是元素式的,而不是点积。
当计算完整的注意力-自由-注意力时,计算成本并没有减少(只在内存空间中),在我看来,最有趣的一点是这样的事实:结果不是 SOTA,但它们足够高,足以引起一些人的注意。实验在图像(使用图像自回归建模)和文本(自回归语言建模)上进行,显示了该机制的通用性。
来源:https://arxiv.org/pdf/2105.14103.pdf
你可能还会喜欢… Charformer:通过基于梯度的子词标记化的快速字符变形器,它与上个月发布的字符级 T5 语言模型 byt⁵⁶有相似的精神。
重新审视表格数据的深度学习模型
尤里·戈里什尼、伊万·鲁巴切夫、瓦伦丁·赫鲁尔科夫和阿尔特姆·巴奔科。
❓Why → 表格数据可能是学术研究和行业应用之间利益差距最大的形式之一,学术研究如今很少受到关注,而行业应用则无处不在。也许是因为深度学习的最新和最棒的在这里做得不太好…?无论如何,这篇文章是我很久以来看到的最好的表格数据直接比较方法!
💡关键见解→ 梯度推进决策树(GBDTs)自 200 年⁴以来就已经存在,诸如 XGBoost ⁷等流行的实现被广泛使用是有充分理由的:深度学习方法仍然没有在稳健和全面方面胜过它。
这项工作提出了许多表格数据集和几种算法的详细数值结果,重要的是,没有对神经网络进行额外的优化和技巧;然而,它们开箱即用。在我看来,最有见地的一点是他们使用合成数据进行的实验。作者使用适应 GBDTs 风格决策规则或神经网络回归的试探法生成合成表格数据集。当混合到不同程度时,结果是一系列数据集,其中两种技术有望优于另一种。在下图中,最左侧是神经网络友好数据集的误差,最右侧是 GBDT 友好数据集的误差。正如预期的那样,ResNet 和 CatBoost 在两者之间表现出明显的权衡,但基于 Transformer 的分类器似乎是一个万事通,不精通。
来源:https://arxiv.org/pdf/2106.11959.pdf
像变形金刚一样思考
盖尔·维斯、约夫·戈德堡和埃兰·亚哈夫。
❓Why → 这篇论文与众不同,很有趣。用新的方式思考和谈论已知的东西对于发展新的想法是必不可少的,这是一个很好的例子。作为一个奖励,魔鬼在细节中,看起来注意力是图灵完全的 ⁸(有点像?).
💡关键见解→ 受限访问序列处理语言(RASP)是一种编程语言,能够自然地表达转换器执行的计算。要点如下,RASP 将转换器建模为处理长度为 n 的序列和大小为 n×n 的矩阵的任意算法。输入序列可以通过逐元素操作和/或通过选择和聚合元素来转换,这些元素的关系通过类注意力矩阵(聚合器)来建模。差不多就是这样,您可以通过只使用本文中显示的这些原语来解决许多任务,这些原语可以很好地映射到 Transformer 计算中,并且可以相互编译。
来源:https://arxiv.org/pdf/2106.06981.pdf
最有趣的见解之一是如何在 RASP 形式中表达受限注意力转换器(例如,高效转换器)(例如,通过在某些区域将聚合器矩阵设置为假)必然削弱其计算表达能力。作者在综合任务中展示了这一点,如排序,只有完全转换才能成功。
用于展示 RASP 及其预测和理解转换器如何执行计算的其他综合任务包括反转字符串、制作直方图、双直方图、按字母顺序排序、返回最频繁的令牌以及识别 Dick-k 语言。
高效深度学习:关于让深度学习模型更小、更快、更好的调查
作者高拉夫·蒙哈尼。
❓Why → 虽然没有任何新颖的贡献,但这是一篇从工程师角度出发的精彩介绍,涵盖了每个从业者都应该知道的高效数据挖掘的相关技术。
💡关键见解→DL 的效率有很多方面。也许最重要的区别在于学术研究花费最多资源的训练和大规模应用花费最多资源的推理;这项调查涵盖了这两种情况。
例如,这项工作向读者介绍了数据扩充、提炼或迁移学习等技术,这些技术对培训效率有着积极的影响。同时,其他解释的技术,如量化或剪枝,通常用于提高推理效率。
涵盖的其他主题包括超参数优化、高效架构和关于框架的基础设施考虑事项,如 PyTorch Mobile 或 TensorFlow Lite ,它们是生态系统的关键要素。调查中最有用的部分之一是在每一部分末尾推荐的经验法则和方法,它们有助于将每种技术与其用例联系起来。
来源:https://arxiv.org/pdf/2106.08962.pdf
调查可能是了解你不是专家的研究领域发生了什么的最好方法。以下是其他最近的调查,作为进入这些领域的一个极好的切入点:自然语言处理的图形神经网络:一项调查、一项关于变形金刚的调查、一项关于在低资源情况下自然语言处理的最近方法的调查
我们的月度评选到此结束;如果你想了解最新的研究,请关注我们的 Twitter @zetavector *。*下集再见!
参考文献
[1] 开关变压器:以简单有效的稀疏性缩放至万亿参数模型——William Fedus、Barret Zoph 和 Noam Shazeer,2021。
[2] FastMoE:一种快速的专家混合训练系统 —何家傲等,2021。
[3] 一幅图像抵得上 16x16 个字:大规模图像识别的变形金刚——作者阿列克谢·多索维茨基、卢卡斯·拜尔、亚历山大·科列斯尼科夫、德克·韦森博恩、翟晓华等 2021。
[4] 贪婪函数逼近:一个梯度推进机—j . h . Friedman 著,2001。
[5] 从大型语言模型中提取训练数据*—*Nicholas Carlini 等人 2020。
[6] ByT5:用预先训练好的字节到字节模型走向无令牌的未来*——作者:*薛、阿迪蒂亚·巴鲁阿、诺亚·康斯坦特、拉米·阿尔-Rfou 等人 2021。
[7] XGBoost:一个可扩展的树提升系统 —陈天琦,Carlos Guestrin,2016。
[8] XCiT:互协方差图像变形器*——*Alaaeldin El-Nouby 等人 2021。
[9] 注意力是图灵——完成*——*豪尔赫·佩雷斯、巴勃罗·巴塞洛和哈维尔·马林科维奇,2021。
[10] 通过内容自适应多分辨率合并将单目深度估计模型提升到高分辨率 — 作者:S. Mahdi H. Miangoleh,Sebastian Dille,龙脉,Sylvain Paris 和 Ya yaz Aksoy,2021。
arXiv 精选—2021 年 3 月阅读
ML 论文每月精选。
在你的阅读清单上保持领先是很难的,而找到哪些论文应该在清单上就更难了。在 Zeta Alpha 我们总是密切关注最新的人工智能研究,所以我们每月都会分享一些最近的论文,以展示我们认为会有影响力的出版物,主要基于每部作品的贡献和作者的影响力。不要把这个列表看得太全面:像其他人一样,我们也有自己的偏见,但是你能从 4000 多篇论文中选择的就这么多了。尽情享受吧!
TransGAN:两个变形金刚可以组成一个强大的 GAN 👾代号
由、畅&由王。
🎖Why → 变形金刚征服的又一个任务。事实上,我很惊讶地听说,以前没有人成功地建立了完全基于变压器的 GANs 但是它们很难做好,需要一些技巧,本文将对此进行探讨。主要作者江一帆告诉我们,⁴之前曾与甘斯广泛合作,这对我们帮助很大,因为魔鬼在细节中,很可能许多人在这次尝试之前已经尝试过,但没有成功。
💡关键见解→ GANs 向来以训练不稳定著称,TransGAN 更是如此。一个完全基于 Transformer 的 GAN 不能开箱即用,它需要一些技巧来使它的性能与它的成熟的 CNN 兄弟相当。
实现这一点的 3 个主要技巧是:
- 数据扩充是强大性能的关键(对于基于 CNN 的 GANs 来说,这一点并不突出)。
- 作为均方误差的辅助自监督重建损失。
- 在训练中动态增加注意感受野,从仅局部注意开始,逐渐增加到全局注意。这可能是最有争议的技巧,因为局部注意力是对像素邻域的线性操作,这与卷积核的操作非常接近。
这最后一点并没有使研究无效,但是证实了归纳偏差在 ML 中的重要性。此外,最新的结果令人印象深刻,需要在这个方向上进一步研究。
资料来源:https://arxiv.org/pdf/2102.07074.pdf
来源:https://arxiv.org/pdf/2102.07074.pdf
转移的标度律
来自 OpenAI 的 Danny Hernandez 等人
🎖Why → 迁移学习正变得越来越重要,因为自我监督的预训练和特定任务的微调是许多任务实现 SOTA 的主导范式。本文从 OpenAI 的大规模实验中得出经验法则,量化迁移对语言建模的帮助。
💡关键见解→ 传输的有效数据被定义为从头开始的模型需要匹配传输的模型性能的数据量。这种有效的数据传输遵循以下形式的幂定律:
其中 D_F 为微调数据大小,N 为模型参数个数。令人印象深刻的是,这个经验法则适用于从文本到 python 数据的转换实验,而不是从头开始训练;对于模型大小在 4 个数量级以内、目标数据集大小在 3 个数量级以内的语言建模任务。
有效数据、有效数据传输和微调数据集等关键概念的可视化解释。来源:https://arxiv.org/pdf/2102.01293.pdf
这篇论文仍然有许多局限性,例如,实验只关注英文文本和 python 代码之间的转换,但在模型和数据集不断增加的时代,比例定律将是相关的。最有趣的结果之一是,即使在微调数据集“很小”的情况下,根据文本预训练的模型也不会受到“数据约束”,这与从头开始训练不同(见下图)。
来源:https://arxiv.org/pdf/2102.01293.pdf
我们能自动化科学审查吗?(没有,但是……)|👾代码 | 🕹 演示
作者袁,&格雷厄姆纽比格。
🎖 为什么→ 这个挑衅性的标题背后隐藏着一项关于科学审查自动化的细致而严肃的研究。有趣的是,问这个问题的行为暗示了对当前复习状态的某种程度的怀疑…
💡关键见解→ 本文提出使用 NLP 模型为科学论文生成第一轮同行评审。作者收集了机器学习领域的论文数据集,用每篇评论中涵盖的内容的不同方面对它们进行注释,并训练有针对性的摘要模型,该模型接收论文以生成评论。他们进行了大量的实验,以表明系统生成的评论往往比人工撰写的评论触及更多的论文方面,但生成的文本在所有方面的建设性都较低,除了对核心观点的解释,这些观点在很大程度上是事实上正确的。(第一段完全是由本文介绍的系统生成的。)
该论文的结论是,评论生成在当前状态下不能取代人工评论者,但是作为一个辅助过程可能是有帮助的。为了证明这一立场,作者定义了一组可以在一定程度上客观衡量的定量研究人类评论的方面:
- 果断性—以推荐准确度(RAcc)衡量
- 全面性——用方面覆盖率(ACov)和方面召回率(ARec)来衡量
- 调整—以信息含量(Info)衡量,如
- 准确性——以汇总准确性(SAcc)衡量
生成的评论非常令人印象深刻,但它在关键的事实陈述中出现,因为这是文本生成模型经常出现的情况,这在科学评论环境中是不可接受的。数据集的收集和评估非常广泛和复杂,因此值得一试。这项工作提出了一个有趣的问题:如果自动审查模型比人好得多(如果可以正确定义的话),它应该被使用吗?古德哈特定律“当一个指标成为一个目标,不再是一个好的指标”会对它造成更严重的影响吗?
来源:https://arxiv.org/pdf/2102.00176.pdf
挖掘自己的观点:通过跨样本预测进行自我监督学习 |👾代码
迈赫迪·阿扎布等人
🎖Why → 这项工作令人惊讶,因为在硬负挖掘的背景下,人们经常使用最近邻嵌入,假设它们是需要在对比损失中“推开”的负样本。然而,这篇论文恰恰相反。这很有效。
💡重要见解→ 有趣的是,这篇论文来自神经科学背景,人们可以通过实验部分直观地感受到这一点。Mehdi aza bou——主要作者——告诉我们这个项目是如何通过尝试使用自我监督来解码神经脉冲数据开始的,结果非常好,他们决定将这项技术应用到图像上!这是相近田地间异花授粉的极好例子。
这项工作是 BYOL 的自然延伸,其中通过仅使用正样本进行对比学习来学习表示,并且将同一图像的增强表示一起推送到,并且通过使用两个编码器,一个在线编码器和一个平均编码器(其参数是在线编码器的移动指数平均值),该模型避免了崩溃。然而,在这种情况下,作者更进了一步;他们不是只使用图像的增强作为正样本,而是通过从嵌入空间中最近的邻居采样来挖掘不同的视图,并将这些视图视为图像的挖掘正视图。
这种方法如此有效的事实非常令人震惊,并且挑战了一些关于成功的表征学习的假设。它轻松实现了 MNIST、CIFAR-10 和 100 的最先进表现;它能够比以往任何时候都更好地代表神经记录,而且它肯定会激发类似方向的进一步工作。
来源:https://arxiv.org/pdf/2102.10106.pdf
零截图文本到图像生成 | ✍️ 博客 |👾代码
由 OpenAI 等人撰写
🎖Why → 大规模再印象,可以创建以字幕为条件的引人注目的图像生成 ala 语言建模,以自监督自回归模式训练。这项工作在文本到图像的生成方法上取得了进展,并且一定会产生影响。
💡关键见解→ 将图像的标题编码成标记,并将它们与表示图像的标记连接起来。表示图像的记号是对图像训练离散 VAE 的结果,该离散将图像表示为 32×32 记号的网格,其中该记号的词汇大小是 8192。您可以将这种表示方式想象成每幅图像是 8192 个词汇中的 32×32 = 1024 个单词。这个技巧大大减小了图像空间的大小,使其类似于语言符号,即字典中的离散符号。
该记号序列可以被大规模地自回归训练,这在推理时可以用图像的标题来提示,这将由具有图像记号的模型自回归完成,该图像记号又可以由 dVAE 解码到像素空间中。
像往常一样,制作这个大规模模型所需的工程是令人震惊的,结果是真正的赏心悦目。
来源:https://arxiv.org/pdf/2102.12092.pdf
走向因果表征学习
作者:b . schlkopf,F. Locatello,S. Bauer,N. Rosemary Ke,N. Kalchbrenner,A. Goyal & Y. Bengio。
🎖why→2021 年机器学习和因果关系的状态。虽然还不是最突出的,这一领域的研究有一个充满希望的潜力,以克服经典的 ML 限制分布外推广;最终放弃著名的 i.i.d .假设。
💡关键见解→ 本文可作为对 ML 因果关系感兴趣的从业者和研究人员的切入点。世界模型的一个有用和简单的分类被提出,其中每个类的能力被仔细考虑(见下表)。
资料来源:https://arxiv.org/pdf/2102.11107.pdf
不可能在一个段落中涵盖论文的全部内容,但它涉及的一些相关主题是 i.i.d .假设的脆弱性、观察数据和干预数据之间的差异、因果图模型和结构因果模型之间的差异(只有后者可以进行反事实推理)以及独立因果机制等基础原则。
最后,作者回顾了因果表征学习对半监督学习、对抗性脆弱性、鲁棒性和泛化、自我监督、数据扩充、强化学习、多任务学习和一般科学应用等方法的影响。
来源:https://arxiv.org/pdf/2102.11107.pdf
无需归一化的高性能大规模图像识别
作者:安德鲁·布洛克,索哈姆·德,塞缪尔·l·史密斯&卡伦·西蒙扬。
🎖Why → 分层和批量归一化已经成为深度学习工具集中的标准方法有一段时间了。本文通过展示大规模图像识别如何在没有任何标准化的情况下工作,对这种技术的重要性提出了挑战;仅使用渐变剪辑。
💡关键见解→ 通常,普通梯度裁剪将梯度向量的范数限制为固定的超参数*λ。*虽然这种技术可防止梯度爆炸,并允许在训练中进行更大批量,但该程序对超参数 *lambda 的调整非常敏感。*为了规避这个问题,作者提出了“自适应梯度裁剪”(AGC),它基于权重梯度和权重值之间的比率来裁剪梯度:
自适应渐变剪辑。资料来源:https://arxiv.org/pdf/2102.06171.pdf
抛弃规范化的最大吸引力之一是它的计算效率低下;将批量标准化转换为自动增益控制可以为同等大小的模型提供更快的训练。此外,如下所示,限幅超参数是稳健的,并且该技术允许训练中更大的批量。
(左)AGC 缩放至更大批量;(右)跨越限幅阈值的性能。
主要结果部分似乎只提供了与其他工作相比有利的精选案例,因此有必要进行进一步审查。尽管如此,在没有任何规范化的情况下训练端到端模型是使 DL 模型更有效的一个有希望的方向。
变压器中的位置信息:概述
菲利普·杜弗特、马丁·施密特、辛里奇·舒茨。
🎖 为什么→ 变形金刚中的编码顺序——它不会因自我关注的设计而改变——似乎总是一种事后想法,让我们面对现实吧,它们无处不在!这篇论文阐明了这个话题,并解释了所有的变化。然而,问题仍然是这在多大程度上是相关的…!
💡关键见解→ 变形金刚中位置信息的编码方式尚未统一,存在大量不同的研究想法。本文的作者提供了一个分类,可用于绘制这项研究的状态图(见下表)。
来源:https://arxiv.org/pdf/2102.11090.pdf
作者还提供了一个全面的理论框架来比较不同的方法:添加位置嵌入与修改注意屏蔽,顺序与基于图的排序,或对跨语言学习的影响。
虽然这篇论文没有向读者提供任何新颖的结果,但它是一个关于变形金刚动物园研究的的极好例子,因为变形金刚无处不在。这类研究的另一个最近的例子是"变压器的修改会在实现和应用之间转移吗?”,作者在其中探索了对核心变压器架构的大量小修改是否真的产生了有意义的差异(剧透:不尽然)。
PAQ:6500 万个可能被问到的问题以及你可以用它们做什么👾代码
帕特里克·刘易斯等人
🎖Why → 从语料库中自动生成问答方法的令人印象深刻的结果:如果你能想出所有可能的问题及其答案,你只需要记住它们!
💡关键见解→ 现有技术开放领域问题回答模型通常遵循两步检索器和读者方法,其中对于给定的问题,检索器检索问题答案可能所在的证据段落,读者通过联合处理问题和段落来提取答案。实际上,这意味着每个单个答案所需的计算量很高。
在这项工作中,作者提出了一种仅检索器的方法,该方法与检索器-读取器模型的性能相匹配,速度快几个数量级。这种方法在概念上很简单:从维基百科语料库中,找到看起来像答案的片段,并生成人类可能会问的与之匹配的问题。这导致了大规模的、自动生成的 6500 万个问答对,其在 TriviaQA 和自然问题上表现得很有竞争力,因为它已经有了许多答案。此外,问答检索器非常擅长确定答案的可信度,因此当问题看起来不像任何现有的 PAQ 时,适合添加一个后备的完整检索器-阅读器模型。
来源:https://arxiv.org/pdf/2102.07033.pdf
我们的每月精选到此结束;如果你想了解最新的研究,请在推特上关注我们 @zetavector 。我已经很期待分享四月份的下一个选择了;回头见!
参考文献
[1] 引导你自己的潜能:自我监督学习的新方法,作者 Jean-Bastien Grill 等人,2020 年。
[2]Transformer 的修改会在实现和应用之间转移吗?,由莎兰纳朗等人 2021。
[3] EnlightenGAN:无需配对监督的深度光线增强,江一帆等人 2019。
[4] AutoGAN:生成对抗网络的神经架构搜索,新宇龚等 2019。
arXiv 精选—2021 年 11 月阅读
ML 论文、新闻和代码月刊
图片作者。
在经历了一个缓慢的暑假之后,人工智能世界在过去的一个月里全速回归:会议回到了面对面的形式,新的参数计数记录,Deepmind 成为了强化学习的罗宾汉,或者像现在已经出版和开源的 GPT-3 模型(T-0)一样的 T2-3。
尽管如此,当我们接近 2021 年底时,AI arXiv 上的出版物增长首次出现放缓:经过几年的持续指数增长(每年约 30-40%)后,2021 年的出版物数量似乎只会略微超过 2020 年(约 10%以上)。我们会看到 NeurIPS 和 ICLR 的强劲增长吗?还是人工智能研究已经成熟了?
与人工智能相关主题的年度 arXiv 出版物。
新闻
让我们从过去几周的一些热点新闻开始:
- 自然语言处理会议 (EMNLP)将于 11 月 7 日至 11 日以混合形式举行:同时在线和在多米尼加共和国的 Punta Cana 举行。正式的公开会议将很快在 ACL 选集中发表。
- Deepmind 收购了 MuJoCo 并开源。这是一件大事,因为 MuJoCo 是机器人学和 RL 中使用最广泛的物理模拟软件之一,它曾经很贵。虽然大型大学为他们的学生和员工购买了许可证,但费用使得贪玩好奇的人进入门槛更高。
- 微软的威震天 530B 参数模型。但是等等…它仍然只是一个手波浪的博客帖子!他们声称这是迄今为止最大的单片变压器;你可能会想,单片到底是什么?这是使用所有参数的一种方式,不像混合专家(MoE)类型的模型,如吴导的 1,750 万亿或 Switch Transformer 的万亿,在每个推理/训练步骤中只有一个较小的子集被激活。虽然庞大的规模看起来令人难以置信,但我们必须等到他们分享更深入的作品。说到参数计数,我们会停止关心它们吗?
- 人工智能投资者内森·贝纳奇和伊恩·霍加斯最近发布了 2021 年人工智能状况报告。它从鸟瞰的角度提供了关于人工智能的有用的年度执行摘要:研究、工业、人才、政治和预测。绝对值得一读!
密码
- 如果你想尝试大型的基于注意力的计算机视觉架构,这是你的幸运日,因为最近发布了Scenic【4】:一个运行计算机视觉 JAX 模型的代码库(有很多样板代码和例子),包括几个流行的,像最初的 Vision Transformer【6】,ViViT【7】等等。
- 如果你对图像的生成模型感兴趣,可以看看 VQGAN-CLIP ,这是一个运行流行的生成模型的 repo,可以将自然语言句子转换成图像。
- 最后,我们建议您检查 Dagster 一个“用于开发、生产和观察数据资产的编排平台”。
🔬研究
最后,这是一些有影响力的近期论文。
递归总结有人类反馈的书籍
作者 OpenAI 等人
❓Why → 超长文档摘要(例如书籍规模)对机器来说是一项艰巨的任务,主要是因为标注数据非常耗时:为了标注一个实例或例子,一个人需要阅读一本书并得出它的摘要,这需要几个小时。
💡关键见解→ 长期摘要可以(在某种程度上)成功地分解成注释成本更低的分级摘要任务:将一本书分成几大块,然后将每个块汇总成摘要。把那些摘要串联起来,进行总结。递归地应用该过程,直到达到期望的整本书摘要长度。
来源:https://arxiv.org/pdf/2109.10862.pdf
让我们了解一下所涉及的数据规模:使用了 40 本书,平均 10 万个单词,大部分是虚构的,每个摘要子任务的压缩率大约为 5–10:1。
这个过程的结果离人类质量还很远,只有 5%的摘要达到可比较的质量。有趣的是,模型大小似乎起着重要的作用,因为来自最大模型的摘要明显优于来自遵循相同训练程序的较小模型的摘要。
总之,这又是一次令人印象深刻的大规模、复杂的人在回路中训练大模型的努力。这离产生“哇,这太棒了”的感觉还很远,但这是一个开始。我在想接下来,如何将这转化为一些镜头设置,其中只需要很少或很少的人类注释?
多任务提示训练使零射击任务普遍化
作者维克多·桑,艾伯特·韦布森,科林·拉弗尔,斯蒂芬·h·巴赫。等人
❓Why → 超大型模型研究大多局限于预算庞大的公司。这是拥抱脸大科学研讨会的第一篇论文,提出了一个合作努力,使大规模的 ML 对较小的机构如大学可行。平心而论,这不是第一个开源的大型 GPT-3 模型(例如,查看 GPT-J ),但这肯定会有影响。
💡关键见解→ 我们正在谈论一个 110 亿参数模型,完全开源,可通过🤗拥抱脸。
model = AutoModelForSeq2SeqLM.from_pretrained("bigscience/T0pp")
您可以在论坛上查看项目、 GitHub repo 的所有详细信息,其中包括对模型的每个变体的训练的详细描述。
该模型是 T5 风格的编码器-解码器转换器(不同于 GPT-3 的仅解码器架构),其在自回归语言建模上被训练以预测下一个令牌。然而,现在训练集被更仔细地管理:除了使用通用语言的大型网络抓取之外,作者建议包括用自然语言提示表达的带标签的 NLP 任务。例如,对于带有如下注释的电影评论的句子分类任务
The film had a superb plot, enhanced by the excellent work from the main actor. | Positive
使用模板转换为:
The film had a superb plot, enhanced by the excellent work from the main actor. It was <great/amazing/fantastic...>.
为了避免对一组狭窄的模板进行过度优化,这些模板来自多个人(36)以最大化多样性,最终形成几十个模板供许多 NLP 任务交替使用。
结果是,即使比 GPT-3 小 16 倍,T0 在大多数任务中也优于它,即使这些任务的训练集在训练期间没有被看到。
以下是主要结果的总结。T0 的不同变型反映了在训练期间包括哪些数据集:T0 排除了 GPT-3 用于评估的所有数据集,T0+添加了在评估中使用的数据集(仅训练分裂,仍然保证对测试集盲化),T0++在 T0+之上添加了强力胶中的数据集[2]。
来源:https://arxiv.org/pdf/2110.08207.pdf
如果你读了我们上个月的博客,你可能已经注意到这种方法与谷歌几周前发布的 FLAN [1]非常相似。作者彻底解决了这项工作,T0 仍然有很多优势:T0 和+/+++变体具有相当或更好的性能,同时小 10 倍(137B 对 11B 参数!!!).这两部作品的主要区别在于:
- T0 使用在 MLM 和仅解码器 FLAN 上训练的编码器-解码器(MLM 已经证明是更有效的预训练方法,尽管它不适合自回归生成,因此编码器-解码器策略使用 MLM 预训练表示)
- 更多样的提示
- 一次完成多项任务,而不是一次完成一项任务。
P-Tuning v2:即时调优可以与跨规模和任务的通用微调相媲美
由小刘、纪凯旋、傅毅成等创作
❓Why → 连续 p 调优/即时调优/前缀调优被提出还不到一年[3],它已经成为许多任务中微调的可行替代方案,成为 ML 研究的一个热点。这是它的最新修订版,显示了 p-tuning 在以前苦苦挣扎的任务中的优势。
💡关键见解→ 如果任何人对即时调整仍有疑问,这篇文章应该消除他们的疑虑(例如,对小型冷冻模型不太适用,或者对某些特定任务(如硬序列标记)不太适用)。对于那些迟到的人来说,p-tuning(也称为前缀调整、软或连续提示调整)是一种在不改变预训练参数模型的情况下,针对特定任务微调预训练模型的技术。相反,它包括通过一些连续嵌入的梯度下降来学习提示,这些连续嵌入是任何输入的固定前缀。这已经显示出对于在自回归语言建模上训练的变压器执行得非常好,并且参数效率更高(即,与完全微调相比,对于特定任务,只需要学习非常少量的参数)。
作者们在这项工作中采取的进一步措施是给提示增加“深度”。也就是说,向转换器的不同层添加各种提示。虽然这增加了可训练参数的数量,但它提高了性能,同时将总模型参数与可训练提示的比率保持在 0.1–3%的范围内。这些在夹层中彼此独立(它们在每一层独立训练,而不是来自变压器层向前传递)。
下面是主要结果的总结,期望在不久的将来看到 p-tuning 应用于其他任务!
来源:https://arxiv.org/pdf/2110.07602.pdf
探索大规模预训的极限
作者:周欣宇·阿布纳尔、穆斯塔法·德赫加尼、贝南·奈沙布尔和哈尼·塞德吉。
❓Why → 规模一直是 ML 圈子里讨论的话题。几个月来,我们一直在收录关于这个主题的论文,因为这绝对是这个领域必须努力解决的重要问题之一:添加参数和数据在哪里会不再有用?继续读。
💡关键见解→ 类似于“随着我们提高上游精度,下游任务的性能会饱和”。
好了,这篇论文的主旨很简单,他们研究了上游(US)任务(例如大规模 imagenet 标签)的预训练性能如何转移到下游(DS)性能(例如鲸鱼检测)。然后对很多架构和规模做这个实验:“对视觉变压器、MLP 混频器和 ResNets 进行 4800 次实验,参数数量从一千万到一百亿,在最大规模的可用图像数据上进行训练”🤑💸
这些有趣的图表比较了上游绩效(US)和下游绩效(DS ),前者是指预训练任务的绩效,后者是指评估任务的绩效。几乎是全面的,它最终会饱和。尽管如此,对于计算机视觉来说,跨架构的差异还是非常有趣的!
资料来源:https://arxiv.org/pdf/2110.02095.pdf
作者声称,他们的观察总体上看起来对诸如上游数据的大小或训练次数以及架构选择等选择是稳健的。他们还探索了超参数选择的影响:一些超参数对我们非常好,但不能很好地转化为 DS 吗?是啊!他们在第 4 节中深入研究了这一现象,并发现,例如,重量衰减是一个特别显著的超参数,它以不同的方式影响着我们和 DS 的性能。
在没有人真正从头开始训练模型,而是选择预先训练的模型来引导他们的应用的背景下,这项研究是关键。这篇论文不仅仅是几段话就能概括的,如果你想深入研究,它绝对值得一读!
多举几个例子可能就值几十亿参数
尤瓦尔·克尔斯坦,帕特里克·路易斯,塞巴斯蒂安·里德尔和奥默·利维。
❓Why → 注解还是成长?这可能是 ML 从业者在决定如何分配资源时的一个常见困境:更大的预训练模型还是注释更多的数据。看情况!
💡关键见解→ 主要观点是,在 NLP 任务的环境中,缩放参数始终能提高性能,但是,额外注释的贡献高度依赖于任务。例如,在开放式问答数据集中,添加注释不会显著提高性能,而在句子分类或抽取式问答中,却可以。这是这篇论文的发现的最佳总结图,人们可能会期望热图沿着对角线有一个梯度:大小和注释都会产生性能改进,但事实并非如此。
来源:https://arxiv.org/pdf/2110.04374.pdf
差不多就是这样了!公平地说,它并不是那么全面,我们将不得不看看这些在其他模式上的可复制性如何,但是,正在解决的问题无疑是相关的。
演讲 5:用于口语处理的统一模态编解码器预训练
由敖俊逸、、等创作
❓Why → 自然语言处理几乎经常被用作文本处理的同义词,但是自然语言不仅仅是文本!口语不仅仅使用文字,还使用更多的表达方式。这里有一种方法,通过利用过去几年在 NLP 中非常成功的现有技术来对所有这些进行建模。
💡关键见解→ 通过向模型输入音频和文本来共同学习文本和语音表示,并在自我监督的环境中训练自己,其任务类似于应用于声音的双向掩蔽语言建模。但是将 MLM 应用于音频并不像应用于文本那样简单,它涉及将音频预处理为一种称为 log-Mel filterbank 的适当表示,并在这种表示状态下应用量化目标,在这种状态下可以执行分类任务。重要的是,音频和文本表示被组合在一起并被共同提供给模型,从而允许跨模态建模。
来源:https://arxiv.org/pdf/2110.07205.pdf
对于语音转换(VC)、自动语音识别(ASR)等任务来说,其结果是最先进的,并且在应用于文本到语音和语音到类别(SID)时表现出竞争力。
来源:https://arxiv.org/pdf/2110.07205.pdf
ADOP:近似可微分单像素点渲染
作者:大流士·吕克特、莱纳斯·弗兰克和马克·斯塔明格。
❓Why → 与传统技术相比,使用神经网络以更低的计算成本改善渲染是一件非常令人兴奋的事情,尤其是在 VR 和 AR 领域缓慢但稳步起飞的时候(hello Meta )。毕竟,深度学习可能在渲染元宇宙方面发挥关键作用…
💡关键见解→ 渲染场景视图(例如在视频游戏或模拟中)是一个令人印象深刻的复杂过程:3D 对象可以用多种方式定义,照明、遮挡、纹理、透明、反射以复杂的方式交互,将东西光栅化到像素网格中,等等。强制执行这些任务对于低延迟应用程序来说是不可能的;相反,人们必须聪明地不去计算不需要计算的东西,比如遮挡其他物体的不透明物体。
事实证明,渲染中涉及的大多数过程都可以由可微分模块来执行,这意味着可以使用梯度下降来优化它们,给定适当的损失函数。渲染场景的新视图所涉及的主要模块是光栅化器、渲染器和色调映射器,如下图所示。
来源:https://arxiv.org/pdf/2110.06635.pdf
我们不能说得太详细,因为老实说,这个话题有点超出我们的理解范围。尽管如此,他们提供的视频演示还是令人印象深刻,我们迫不及待地希望这种技术被主流渲染技术广泛采用。
在人工智能的伦理方面,在过去的一个月里,我们也看到了一些我们想要强调的论文
- 德尔福:走向机器伦理和规范是一次勇敢的尝试,旨在教会机器错综复杂的是非曲直。虽然这项任务的复杂性几千年来一直没有达成哲学共识,但这项工作是向将伦理判断引入算法迈出的切实一步。
- 语言技术在全球语言中表现的系统性不平等介绍了一个评估语言技术“全球效用”的框架,以及它如何涵盖全球语言的多样性。
来源:https://arxiv.org/pdf/2110.06733.pdf
在信息检索的主题上,用于密集文本检索的对抗性检索器-排序器是一种令人兴奋的新方法,用于为两阶段检索设置模拟检索器和排序器之间的交互,其中检索器试图用“看起来相关”但实际上不相关的文档来欺骗排序器,排序器试图显示最相关的标记文档。
我们的月度评选到此结束;如果你想了解最新的研究,请在 Twitter 上关注我们。下一集再见!
参考文献:
*【1】*微调过的语言模型是零射击学习者。Jason Wei,Maarten Bosma,Vincent Y. Zhao,Kelvin Guu 等人 2021
SuperGLUE:通用语言理解系统的一个更具粘性的基准。作者:王敬实,Yada Pruksachatkun,Nikita Nangia,Amanpreet Singh,Julian Michael,Felix Hill,Omer Levy,Samuel R. Bowman,2019。
*【3】*调前缀:优化连续提示生成。向,佩西梁,2021。
SCENIC:JAX 的一个图书馆,用于计算机视觉研究及其他领域。Mostafa Dehghani,Alexey Gritsenko,Anurag Arnab,Matthias Minderer,Yi Tay,2021。
[6]一幅图像相当于 16x16 个字:大规模图像识别的变形金刚。阿列克谢·多索维茨基等人 2020 年。
[7] ViViT:视频视觉转换器。作者:Anurag Arnab,Mostafa Dehghani,Georg Heigold,孙辰,Mario Lu CIC,Cordelia Schmid,2021。
arXiv 精选—2021 年 10 月阅读
ML 论文每月精选
图片作者。
在你的阅读清单上保持领先是很难的,而找到哪些论文应该在清单上就更难了。在 Zeta Alpha 我们总是密切关注最新的人工智能研究,所以我们每月都会分享一些最近的论文,以展示我们认为会有影响力的出版物,主要基于每部作品的贡献和作者的影响力。不要把这个列表看得太全面:像其他人一样,我们也有自己的偏见,但是你能从 4000 多篇论文中选择的就这么多了。尽情享受吧!
让我们从我想强调的一些趋势开始:
- 大型语言模型不再与较小的模型在同一类别中竞争(如预训练+使用监督数据的微调)。为什么?它不再有意义,因为每个人都知道当更大的模型在像强力胶这样的监督基准上微调时会发生什么:它们只会变得更好。相反,我们认为这些模型探索了以前不可行的问题空间,例如零/少镜头和/或多模态学习。
- 度量和基准——我们如何量化我们关心的东西——需要不断地重新思考和发明,以使进展有意义。MNIST 是一些计算机视觉研究的好地方,但你不会在数据集上找到吹嘘新 SOTA 的头条新闻。幸运的是,学者们经常关注这一点,传统上大多数揭露性的论文来自大学,就像我们马上要看到的这一篇。
- 我们经常讨论事物的建模方面——模型的架构、损失函数、优化器等。——因为它们很性感,但不断有证据表明,如果你想解决一个新问题,你的大脑时间最好花在处理数据上。安德烈斯·吴(Andres Ng)已经花了数年时间倡导这一观点,它就像美酒一样陈年。
事不宜迟,下面是 arXiv 最近的一些亮点!
网络结构之战:CNN、Transformer 和 MLP 的实证研究
作者:赵玉成、王光庭、唐传新、、曾文军、查正军。
❓Why?→ 这篇论文的缺点也是它的优点:谦逊的范围和的努力投入到进一步优化他们的实验中。当一个社区通过数百次迭代来优化某项技术时,很难以一种公平的方式将其与一项新技术进行比较:现有方法的成功有多少可以归功于其基本思想,而有多少是小的优化和技术诀窍的纯粹积累,这是理所当然的?这是过去十年统治计算机视觉的 CNN 的情况,也是变形金刚统治语言的情况。
💡关键见解→ 作者提出了一个相当简单的策略来直接比较这三种架构:将网络架构定义为嵌入、空间混合和下采样块的组合,并且只交换不同架构的空间混合。一个重要的警告是所有架构共享一个初始补丁嵌入层,它实际上是原始图像上的卷积(即共享权重的每个补丁的线性投影),因此所有技术都包含一个第一类卷积层。
来源:https://arxiv.org/pdf/2108.13002.pdf
我们可以从这些实验中得出的结论是有限的:在最初的补丁嵌入之后,当有足够的数据时, MLPs 表现得令人惊讶地好,尽管 CNN 仍然在数据受限的状态下统治,并且**变压器缩放得更好,**如在中,当你继续增大它们时,它们不会饱和。总结:今天你可能仍然会使用 CNN,但是一定要在一年后再来询问。这些发现与常识相一致,即架构中的强归纳偏差有助于提高学习效率,但在某些时候对图像不再重要,因为等方差可以学习而不是先验注入(尽管这种推理并不适用于所有数据形态,并且模型等方差可能是从组合爆炸(如大图)的数据中学习所必需的)。
来源:https://arxiv.org/pdf/2108.13002.pdf
其他类似著作:稀疏 MLP 用于图像识别:自我关注真的有必要吗?
稀疏标签浅池
作者:Negar Arabzadeh、Alexandra Vtyurina、Xinyi Yan、Charles L. A. Clarke。
引用作者的话:“我们对这些观察的结果感到不安。”
❓Why?→MARCO 女士是最受欢迎的信息检索(IR)基准之一。本文揭示了现有基准的一些缺点,并就如何评估 IR 提出了更广泛的改进建议。
💡关键见解→ IR 基准通常以如下方式标注:给定一个查询,语料库中的一段被标记为与该查询相关。大多数查询只有一个段落被标注为相关,尽管事实上语料库中可能有更多的段落——标注所有的查询-文档对在大多数情况下是不可行的——因此我们可以说标签是稀疏的。然后使用平均倒数排名(MRR)评估退休模型,其中注释为相关的段落应排在第一位,但不“惩罚”未注释的段落为不相关(记住,尽管缺乏注释,它们可能实际上是相关的)。
这种设置的问题是:如果检索模型将没有注释但实际上比注释段落更相关的段落排在第一位,会怎么样?这部作品恰恰回答了这个问题。
给定 Marco 女士的查询子集,他们运行查询,并要求注释者回答以下问题:哪一段与查询最相关,注释为相关的那一段,或神经排序模型的顶部结果?当然,只有当注释和模型在排名靠前的段落中不同时,注释者才不知道哪个是哪个。事实证明,来自神经排序器的结果比注释更受欢迎(见下图)。换句话说,有人可能会说这些模型比 perfect 更好*,因为与 perfect run 相比,它们的结果更受注释者青睐,perfect run 中检索到的顶部段落总是被标记为相关的段落。*
来源:https://arxiv.org/pdf/2109.00062.pdf
这个结果非常相关,因为它表明流行排行榜可能不再反映 IR 的任何改进,而是注释的过度拟合。作为解决这个问题的一个建议,作者建议移动到一个非静态的标注数据集,其中顶部相关性段落用成对标签连续标注(例如,两个段落中的哪一个与给定查询最相关?).
训练短,测试长:注意线性偏差,可推断输入长度 |👾代码
迈克·刘易斯,诺亚·史密斯,奥菲尔出版社。
❓Why?→ 变压器是天生的集对集神经网络,这意味着该架构是顺序不变的,这就是为什么研究人员尝试了不同的方式将位置信息编码到模型中。本文提出了一种新的超简单的、非可学的编码相对位置信息的方法,这种方法在比训练更大的上下文中进行推理时是鲁棒的。这会成为新的标准吗?
💡关键见解→ 变形金刚中的位置编码长期以来一直有点泛滥,因为它看起来像“任何事情都可以发生”:给定一种编码位置的方法,变形金刚和梯度下降将找到一种性能良好的方法。我们甚至需要一个调查来解释它![2]但是像正弦位置嵌入或固定学习绝对嵌入这样的普通技术有什么隐藏的陷阱呢?当他们用比在所受训练更长的时间进行推理时,他们不能很好地概括。
这里提出的方法简单地依赖于向注意力矩阵(在 softmax 之前)添加一个偏差,该偏差与中心令牌与其邻居之间的距离成比例(见下图)。这些偏差是固定的,不需要学习,比例因子 m 被设置为超参数。
来源:https://arxiv.org/pdf/2108.12409.pdf
令人惊讶的是,变形金刚很好地学习了这种位置编码,并与类似大小的等效模型进行了竞争。有趣的比较发生在当模型对比其训练长度更长的序列执行推理时(见下图)。虽然现有的模型难以概括(即,随着序列越长,困惑急剧增加),但不在场证明的情况并非如此。
然而,有一个重要的警告在本文中没有彻底解决:注意力矩阵中的偏差通过一个 softmax 运行,该 soft max 抑制了远处标记的贡献,这就像有一个注意力的“软窗口”:我们不是只关注 N 个相邻的标记,而是关注递减的权重。实际上,这意味着在位置偏差足够负的某个点上,该标记将不会有任何有意义的贡献,使得有效上下文的大小总是有限的,而不管推断时的输入长度。
来源:https://arxiv.org/pdf/2108.12409.pdf
微调过的语言模型是零射击学习者
作者:Jason Wei、Maarten Bosma、Vincent Y. Zhao、Kelvin Guu 等人
❓Why?→ 尽管有了很大的进步,NLP 中的提示仍然不是很健壮:在不应该的地方添加逗号,输出可能会完全改变。本文展示了在自回归语言建模预训练期间包括标记数据如何使模型在零触发设置中更稳健地学习并更好地转移到新任务。
💡关键见解→ 零镜头学习是机器学习中最有前途的发展领域之一。梦想是清晰的:找到一个模型,并让它在第 0 天就在你的领域中工作,而不需要数据收集、标记、培训、维护、监控漂移等。
大型自我监督语言模型目前是最终实现这一梦想的主要候选对象(尽管有许多障碍需要克服)。特别是自从 GPT-3(现在一岁多了!),提示已经成为一项关键技术,而且还会持续下去。本文研究了如何训练大型语言模型,使其像 GPT-3 一样对零镜头自然语言提示更加鲁棒和准确。尽管将它与 GPT-3 进行比较是不公平的:该模型包括预训练期间的标记数据,但他们不是直接在其上微调模型,而是使用模板来创建该任务的自然语言表达(见下图);而 GPT-3 不包括任何训练数据——原则上,一些数据集意外泄露到预训练数据中,使其暴露给预训练中的模型[3]。
来源:https://arxiv.org/pdf/2109.01652.pdf
结果是一个在许多任务上表现得比 GPT-3 更好的模型,并且在没有包括在预训练中的任务上表现出良好的泛化能力,尽管它仍然远不是一个完全监督的模型。
来源:https://arxiv.org/pdf/2109.01652.pdf
使用冻结语言模型的多模态少量学习
Maria Tsimpoukelli、Jacob Menick、Serkan Cabi、S. M. Ali Eslami、Oriol Vinyals 和 Felix Hill。
❓Why?→ 更多提示:现在多模式和*异步。*您能否利用预训练语言模型中的信息完成视觉任务,而无需重新训练?嗯,有点…继续读。
💡关键见解→ 本文提出的想法相当简单:训练一个语言模型,冻结它,使其参数保持固定,然后训练一个图像编码器将图像编码成提示,让语言模型执行特定任务。我喜欢将其概念化为“为模型学习一个图像条件提示(通过神经网络的图像)来执行任务”。
来源:https://arxiv.org/pdf/2106.13884.pdf
这是一个很有前途的研究方向,但结果并不令人印象深刻?)就绝对性能而言。然而,比较使用多模态数据完全微调的模型(冻结微调)和保持语言模型冻结的模型(冻结 VQA 盲)是有趣的:只有后者显示出从训练数据集(概念标题[4])到目标评估数据集(VQAv2 [5])的良好概括,仍然远离完全监督的模型。
https://arxiv.org/pdf/2106.13884.pdf
关于大型变压器和自我监督学习的其他工作
Rishi Bommasani 著《论基金会模式的机遇与风险》, Percy Liang 等人在 8 月发布时引起了不小的轰动。这本书有很多内容:对新兴领域的大型神经模型的概述、介绍和立场文件,这些模型是在大量数据的基础上不受监督地训练的,他们为此创造了基础模型的名称。虽然这是一个令人信服的全面概述,涵盖了这些模型的技术和社会影响,但似乎还不清楚它们是否需要一个新的术语。
Primer:Searching Efficient Transformer for Language Modeling作者 David R. So 等人提出了一种方法来搜索效率最高且性能良好的转换器架构,与普通架构相比,实现了大约 2 倍的加速。与标准变压器相比,最终的发现架构有两个主要修改:平方 ReLU 激活和在自我关注中的每个 Q、K 和 V 投影后添加深度方向卷积层。
谷歌地图中用图形神经网络进行 ETA 预测
作者:Austin Derrow-Pinion、Jennifer She、David Wong、Petar Velič ković等人
❓Why?→ 有没有想过当谷歌地图计算你从 A 点到 B 点需要多少时间时,幕后发生了什么?以下是它的一瞥…
💡关键见解→ 同样,大规模的高质量数据是您最需要的。本文描述了完全用神经网络估计某物从 A 点到 B 点所需时间的问题设置和形式化。他们基本上:
- 收集庞大的数据集(你好,谷歌)。
- 将道路地图表示为带有线段和交叉点的图形。
- 应用图形神经网络(GNN)来学习每个节点的嵌入,并使用它们来进行推理,使用监督数据以及一些辅助损失来训练,以使训练规范化。GNN 由边、节点和全局超段表示(嵌入)组成,它们通过聚合函数(神经网络)组合在一起,聚合函数将以前的表示作为输入,并输出可用于进行预测的新表示。例如,给定先前的节点、边和超段表示,边表示将用于估计每个段经过的时间。
来源:https://arxiv.org/pdf/2108.11482.pdf
谷歌地图在现有生产基线上的收益是巨大的,像悉尼这样的城市预计到达时间的准确性提高了 40%。本文的另一个有趣的方面是详细介绍如何部署这样的模型,同时满足延迟需求,这涉及到预计算和缓存对几个超分段的预测。
来源:https://arxiv.org/pdf/2108.11482.pdf
眼睛告诉一切:不规则的瞳孔形状揭示了 GAN 生成的脸
作者:郭辉、胡舒立、王欣、张铭清和吕思伟。
❓Why?→ 这是一个好玩的。Deepfakes 的挑战是,在必要时能够有效地检测到它,以防止错误信息的传播。deep fakes 是一种计算机生成的内容,对于普通人来说,它与原始来源没有什么区别。事实证明,瞳孔是一张人脸非常具有揭示性的一面!
💡关键见解→ 仔细观察一张脸的瞳孔:人类的瞳孔碰巧一直都很圆,但生成性对抗网络(GAN)生成的人脸并没有很好地捕捉到这一特征。结果是 GAN 生成的人脸通常显示出略微不规则的瞳孔,这使得有可能通过观察它们来检测图像何时是人工生成的。
资料来源:https://arxiv.org/pdf/2109.00162.pdf
通过分割瞳孔并将其拟合为椭圆形状,这项工作显示出令人惊讶的良好的 ROC 曲线,用于检测虚假的面部图像。
来源:https://arxiv.org/pdf/2109.00162.pdf
你可能喜欢的类似论文:用精心制作的自然妆容躲避攻击,作者尼赞·古埃塔等人。
🐍代码和流行的实现
👾 RL-VIG/LibFewShot |📄论文 ⭐️ 176
作者李文斌等人
LibFewShot 是一个为少数镜头学习提供的综合库。随着少数镜头学习的成功越来越多,这个新的图书馆可以帮助你开始。它包括太多的方法在这里命名,所有这些方法都是在过去 4 年的研究中提出的,分为微调方法,元学习方法和度量学习方法。
来源:https://github.com/RL-VIG/LibFewShot
👾景云亮/斯温尼尔📄论文 ⭐️ 490
梁景云等
SwinIR 是一种使用 Swin Transformer 的图像恢复方法,Swin Transformer 是几个月前由微软[1]提出的计算机视觉(CV)的模型主干。他们的方法在三个基准上达到了 SOTA,老实说,计算摄影在过去十年里带给我们的进步令人印象深刻。你也可以玩他们的 colab 笔记本。
来源:https://github.com/JingyunLiang/SwinIR
👾Facebook research/mask former📄论文 ⭐️ 619
作者:郑博文、亚历山大·g·施维因、亚历山大·基里洛夫
现代语义分割通常被构建为每像素分类任务(即,将每个像素分配一个类别,作为属于汽车、道路或鸟的类别),但随后执行实例级分割(即,在每张图片中找到选择人脸的遮罩)被建模为二进制遮罩分类任务。MaskFormer 提出直接学习一组二进制掩模(就像在实例级分割中一样),然后对每个掩模进行分类步骤,在不显式进行逐像素分类的情况下显示出很好的结果。
来源:https://github.com/facebookresearch/MaskFormer
我们的月度评选到此结束;如果你想了解最新的研究,请在推特上关注我们 @zetavector 。下一集再见!
参考文献
[1] Swin 变换器:使用移位窗口的分级视觉变换器。由https://arxiv.org/search/cs?searchtype=author&query=Liu%2C+Z林语桐*https://arxiv.org/search/cs?searchtype=author&query=Cao%2C+Y韩虎【奕譞】魏张铮2021*********
**【2】变压器中位置信息:概述。由菲利普·杜特尔、马丁·施密特、辛里奇·舒茨; 2021。
【3】语言模型是很少出手的学习者。由 OpenAI 等人完成;2020.
【4】概念 12M:推送网页级图文预训练,识别长尾视觉概念。由Soravit ChangpinyoPiyush SharmaNan DingRadu Soricut;2021.****
【5】让 VQA 的 V 字发挥作用:提升图像理解在视觉问答中的作用。由 亚什·戈亚尔特哈斯·Khot道格拉斯·萨默斯-留斯德茹夫·巴特拉德维·帕里克2016.******
最佳 ML 代码和软件—2021 年 6 月
每月精选的最近实现、工具和软件正在 ML 领域获得牵引力:Google 的 Vertex AI、PyTorch Vision、HuggingFace Accelerate 等等。
图片作者。
构建 ML 软件并从研究跳到生产并不是一件容易的事,即使当资源的海洋是巨大的:很难跟上。确切地说,当我们努力将最新的模型投入生产并找到最佳的纸面实现时,我们经常在 Zeta Alpha 遇到这个问题,因此我们希望通过分享我们每月在最新的存储库、工具、库和软件新闻中的发现来做出贡献。尽情享受吧!
⚙️ MLOps 亮点
ML Operations (MLOps)的空间正在以令人眼花缭乱的速度移动,这可能会使它变得混乱:在过去的几年里,数百家公司和产品已经出现,以更可靠和更强大的方式帮助 ML 投入生产,但结果是一个非常拥挤,尚未确定的市场,仍然很难导航。当我们自己试图理解它的时候,我们密切关注着最新的新闻和发展。这里有一个选择:
- 谷歌发布 VertexAI :一个“MLOps 的统一平台”。大型云提供商(微软的 Azure ,亚马逊的 AWS )正在快速构建与他们的技术集成的 ML 工具——可能是为了锁定更多的客户——而像 DataBricks 这样的公司,凭借新的 DataBricks ML ,或者像 MLFlow 或 Kubeflow 这样的框架,继续推动一个不可知的未来,即你在哪里运行你的 ML 项目。我们将看到内置或第三方解决方案是否会在未来几年内得到更广泛的采用,以及端到端 MLOps 产品是否会赢得特定功能工具的海洋,如带有通气管的标签、带有海王星的跟踪实验以及带有气流的协调。
- Huggingface 将变压器推向大众,加速了这些架构在生产中的应用。随着变形金刚几个月前在解决计算机视觉任务的研究方面取得进展, Huggingface 最近发布了第一个完整的“视觉版本”,其中包括 CLIP、ViT 和 Deit。工业中使用的模型总是比研究中使用的模型落后几个月,因为性能/ 简单性的权衡适用于不同的情况。因此,尽管 ViTs 最近取得了成功,我们仍然想知道:变形金刚会在不久的将来取代 CNN 吗?
- 吴恩达的新 coursera“生产中的人工智能”:Andrew 的原创机器学习课程通过将人工智能介绍给数百万从业者,成为人工智能迅速崛起的催化剂。如果这是一个指标的话,这个新课程有可能通过教育成千上万的工程师和研究人员来缩小研究和生产之间的差距。
同时,在 GitHub 上
一系列最近发布的库、框架和实现。
👾Facebook research/pytorchvideo⭐️1.4k |📄文档 |🌐网站
👉 Pytorch Video 提供了加速视频理解研究所需的可重用、模块化和高效的组件。PyTorchVideo 是使用PyTorch开发的,支持不同的深度学习视频组件,如视频模型、视频数据集和视频特定变换。
🚀非常适合构建定制视频处理研究模型并进行基准测试。功能和特点:
- 一个“模型动物园”,包含现有模型的几个实现,以及最常见数据集的数据加载器。
- 高效的视频组件:组件针对视频进行了优化,并支持硬件上的加速推理。
来源:https://github.com/facebookresearch/pytorchvideo
👾微软/swin-transformer ⭐️ 3.4k |📄论文
👉如果你想玩视觉变形金刚,这里有你现在可能需要的支柱。
❓此报告是“swin transformer:使用移位窗口的分层视觉转换器”的正式实现,它还包括以下论文和任务的代码:
- 对象检测和实例分割:参见Swin Transformer for Object Detection。
- 语义分割:参见 Swin Transformer 进行语义分割 。
- 自监督学习:参见Transformer-SSL。
如果你想玩一个立体的视觉变形器迭代,这个实现将是有用的。
来源:https://github.com/microsoft/Swin-Transformer
👾拥抱脸/加速 ⭐️1.4k |📄文档
👉在不同的硬件加速配置(单个/多个 GPU 和单个/多个节点上的 TPU)上运行 PyTorch 的非常简单的方法,无需特定于硬件的样板代码。
🚀一次定义,随处训练。很快。accelerate 的用途和用途:
- Accelerate 让您可以在分布式环境(即跨计算节点或许多其他配置)中运行训练脚本,而不会放弃对训练循环的控制。
- Accelerate 不会让你从训练循环本身中抽象出来,不像 PyTorch 之上的其他高级框架,比如 pytorch/ignite 。
来源:https://github.com/huggingface/accelerate
👾 open-mmlab/mmocr ⭐️ 1.2k |📄文档
👉一个基于 PyTorch 和mm detection的开源工具箱,用于文本检测、文本识别,以及包括关键信息提取在内的相应下游任务。
🚀非常适合构建图像或视频处理管道。主要特性和组件:
- 一个综合管道,包括下游信息提取任务。
- 用于文本检测和识别的各种最先进的模型
- 一个模块化的设计来定义你自己的优化器,数据预处理,模型骨干或损失函数。
- 几个可视化工具,地面纹理和预测边界框等等。
来源:https://mmocr.readthedocs.io/en/latest/demo.html
👾LinkedIn/grey kite⭐️939 |📄文档
👉Greykite 库通过其旗舰算法 Silverkite 提供灵活、直观和快速的预测。Silverkite 算法适用于大多数时间序列,尤其适用于趋势或季节性变化点、事件/假日效应以及时间相关性。它的预测是可解释的,因此有助于可信的决策和洞察力。
🚀非常适合快速现成的时序应用。主要特性和特征:
- 灵活的设计:提供基本的回归检测趋势和季节性,假期和变化点;以及最先进的 ML 型号可供选择。同一管道支持所有模型的预处理、交叉验证、回溯测试、预测和评估。
- 直观的可视化界面、适用于特定数据特征的模板,以及可生成可解释输出以检查每个回归变量贡献的 it。
- 使用网格搜索进行模型选择的快速培训、基准测试和原型制作。
来源:https://github.com/linkedin/greykite
👾谷歌/天琴座 ⭐️ 2.6k | 博文 |📄论文
👉一种高质量、低比特率的语音编解码器,即使在最慢的网络上也能进行语音通信。为此,它应用传统的编解码器技术,同时利用机器学习(ML)的进步,通过数千小时的数据训练模型,创建一种压缩和传输语音信号的新方法。
🚀这项工作在精神上类似于 Nvidia 基于 GAN 的极低比特率视频压缩。该方法的工作原理是每 40 毫秒提取语音特征,基于心理声学特性进行量化(即去除人耳对其敏感度低的方面),并通过信道传输该信号。解码器是一个生成模型,它接收语音特征作为输入,并输出音频波形。这对于构建带宽受限的移动应用程序非常有用。主要功能和特点包括:
- 极低比特率语音编解码(3kbps)。
- 易于集成基于 Android 和 Linux 的应用程序。
来源:https://ai . Google blog . com/2021/02/lyra-new-very-low-bitrate-codec-for . html
如果你对 MLOps 的广阔世界更感兴趣,我怎么推荐都不为过,你可以看看迟虎燕在她的博客上的工具诊断摘要,以及ml-ops.org网站和他们在 GitHub 上的资源列表。
这就是这个月的内容,如果你想跟上 ML 世界的最新发展,请在 Twitter 上关注我们。要了解更多有趣的近期研究,请查看其他月度博客系列 和 arXiv 精选,它们主要关注学术文献。下个月见!
【所有 GitHub 回购星级统计截至 2021 年 6 月 1 日】。
参考文献
[1] 从自然语言监督中学习可转移的视觉模型——亚历克·拉德福德、琼·金旭等 2021。
[2] 一幅图像抵得上 16x16 个字:大规模图像识别的变形金刚——作者阿列克谢·多索维茨基、卢卡斯·拜尔、亚历山大·科列斯尼科夫、德克·韦森博恩、翟晓华等 2021
[3] 训练数据高效的图像转换器&通过注意力的升华——Hugo Touvron 等人 2020
在各种预算范围内,最适合深度学习的电脑
意见
探索在每个预算范围内执行深度学习计算的最佳 PC 构建平台
随着人工智能的所有现代发展,深度学习的普及程度已经上升到了顶峰。深度学习的崛起和广泛的应用前景非常可观。随着对许多感兴趣的主要主题进行深入研究,深度学习的革命必将在未来几年继续下去。
如果你的目标是精通深度学习,你最终需要一个强大的系统。一个系统,你可以用它来处理各种各样的具有挑战性的任务,这些任务可以在互联网上进行深度学习。虽然旨在实现这一目标,你可能有一定的预算限制。你可能对你期望构建和实现的构建类型没有最好的想法。
请记住,本文中提到的所有构建都是针对机器学习的,特别是针对那些对深入研究和探索深度学习感兴趣的人。但是,在我们直接进入我们的 PC 构建之前,让我们了解一些核心要求,这些要求对于加快我们在深度学习过程中会遇到的一些任务是必不可少的。
在您继续阅读本文之前,我想向所有感兴趣的读者提一下几个先决条件。确保您完全愿意花费指定的金额,这取决于它是低端、普通还是高端版本。更重要的是,确保你想要追求深度学习,作为你未来的一个重要部分。
如果你不太确定你是否想在这上面投入时间,或者如果你想追求你的梦想,但目前没有购买 PC 的最佳预算,我强烈建议读者查看本文的下一部分。
在你深入研究这篇文章之前,我建议你检查一下你是否真的需要 GPU 来进行深度学习。本文将帮助您了解图形处理单元、CUDA 内核和其他基本概念。
不确定该做什么?
如果您有以下问题之一,该怎么办?—
- 降低预算限制。
- 还是不确定深度学习。
- 你不喜欢在技术上花钱(或者你觉得技术很无聊)。
- 其他类似原因。
从每个人的角度来看,上述理由绝对有效。对于以上四点所提到的情况,我主要有几个建议。首先,我强烈推荐检查一下 Google Colab 环境,因为它为初学者和专家提供了许多奇妙的功能。
如果你是数据科学、人工智能和深度学习的初学者,Google Colab 是一个类似于 Jupyter 笔记本的环境,它为用户提供了一个难以置信的平台,只需登录你的电子邮件 ID 就可以执行任何类型的复杂任务。你也可以安装带有数据集的 Google Drive,并在旁边执行计算。
我想建议第一次观看的人,甚至那些完全不确定自己对深度学习的兴趣或定位的人,开始使用谷歌 Colab,花时间做他们的项目,探索他们的兴趣。请随意尝试您想要的新东西,因为云环境为您提供了一种利用其 GPU 以及与他人轻松共享 Jupyter 笔记本内容的方式。
在我之前的一个作品中,我在 Jupyter 笔记本上写了一个完整的入门指南。查看下面提供的文章,了解 Jupyter 笔记本的几乎所有信息。
你应该考虑的另一个选择是利用各种公司为人工智能提供的众多云平台。其中包括亚马逊的 AWS、微软的 Azure、IBM 的 Watson Studio 等等。使用这些云环境,您不仅可以按照自己的意愿构建有效的模型,还可以将它们部署到云环境中,以获得更广泛的受众。
随着这些初始问题的解决,让我们开始探索在各种预算范围内,深度学习的最佳 PC 构建是什么。
各种预算范围内深度学习的最佳 PC 构建:
在我们深入探讨哪种 GPU 最适合您的构建之前,让我们分析一下构建您的最终 PC 构建所需的其他基本组件。首先,数据集将需要大量存储来执行复杂的应用程序。如果你想做更大的项目,大容量硬盘是必须的。我还会推荐一个更小的固态硬盘(SSD)来加快您的操作速度。固态硬盘可以存储您的操作系统,各种任务将更快、更高效。
下一个基本组件是随机存取存储器(RAM)。系统上的 RAM 对于处理电脑上某些任务的执行速度非常重要。拥有相当高的 RAM 对于提高工作效率来说通常是必不可少的。另一个需要考虑的基本因素是您所使用的处理器类型。您可以选择英特尔或 AMD 的 CPU。两者都有自己的好处,我强烈建议观众去研究它们。
最后,让我们探索深度学习的核心,即 GPU 的最佳选项。最好的公司选择 GPU 的明显选择是英伟达,主要是因为一个首要原因。英伟达提供了一种叫做计算统一设备架构(CUDA)的东西,这对于深度学习模型的计算极其有益。
CUDA 是 Nvidia 创建的并行计算平台和应用编程接口模型。这些 CUDA 核心在人工智能领域是高度有益和进化的。与 AMD 等其他公司相比,在这些 CUDA 模块上投入的研究和时间要多得多。
虽然其他一些图形卡可能功能强大,但它们没有 CUDA 对某些关键操作的完全支持。因此,出于深度学习的目的,英伟达 GPU 优于其他同行。英伟达的 CUDA 支持多种深度学习框架,如 TensorFlow、Pytorch、Keras、Darknet 等。
选择处理器时,尽量选择没有集成 GPU 的处理器。因为我们已经单独购买了一个 GPU,所以您不需要在 CPU 中预先构建集成 GPU。遵循这一步骤将帮助你节省更多的钱。我对 Intel CPUs 比较有经验,对这个话题的评论会比 AMD 多。
其他重要组件,如主板、电源单元(PSU)和 CPU 外壳,将不在本文中详细讨论。无论是英特尔还是 AMD,都应该相应地研究和购买适合您的 CPU 分支的主板。配备显卡的 PSU 版本通常在 450 瓦以上的低预算版本中表现最佳,在 750 瓦以上的高预算版本中表现最佳。CPU 外壳是舒适的选择。选择最适合你的。
低预算构建:
在低预算的个人电脑中,您应该寻找能够轻松处理一些复杂操作的处理器,例如 Jupyter 笔记本电脑。英特尔的建议将是 I3-I3–10100 F 或任何其他 I3–9 代 F 系列。这些处理器没有集成 GPU,可以以较低的预算最佳地执行大多数任务。我会推荐研究 AMD 的 CPU,因为我听说它们在较低的价格预算下,具有更高的内核和线程,性能会好得多。
你至少应该寻找 8GB 的内存。但是,如果其他组件没有到位,4GB RAM 应该暂时足够了。但是,请尽快升级它们。如果可以,尝试获得 128 GB 的固态硬盘,以及 1TB 的硬盘,用于执行像样的深度学习项目。最后,对于显卡,我的主要建议是 GTX 1050 或低于这个范围的任何东西。
平均预算构建:
在普通预算的电脑中,您应该寻找像 i5–9400 f 这样的处理器,也就是说,一个不需要集成 GPU 就可以支持大多数任务的处理器。请研究各自的 AMD 公司的同行也彻底。根据我的研究,AMD 锐龙 5 (6 核,3.4 GHz)似乎是一个合适的选择。
您应该寻找 8GB 到 16GB 的内存范围,最好是 16 GM 的内存。尽量购买 256 GB 到 512 GB 大小的 SSD,用于安装操作系统和存储一些至关重要的项目。以及 1TB 到 2TB 的 HDD 空间,用于存储深度学习项目及其数据集。对于显卡建议,请查看任何类似的 GPU,如 GTX 1650、GTX 1660、GTX 1660 Ti、RTX 2060、GTX 1070 以及该范围内的其他类似 GPU。
我要说的是,我的第一台定制 PC 也是一台普通预算的 PC,由以下组件组成,即 i5–9400k、2 TB 硬盘、256 MB 固态硬盘和 GPU GTX 1660。对于大多数较小的深度学习任务来说,这些构建构成了显著的性能。然而,某些更高复杂性的问题,如 GANs 上的项目,可能会有点问题。
高预算构建:
在高预算构建中,您应该寻找的组件是带有或不带有集成 GPU 的 AMD 或英特尔处理器。在这些价格范围内,这些 CPU 通常都带有集成的 GPU。我的英特尔建议是 i7–10700k、i9–9900k 或 i9–10900 x。至于磁盘空间,我会推荐 512 GB 到 1 GB 或更多的 SSD 和至少 4 TB 的 HDD。尝试以 16–32 GB DDR 4 的高频率 RAM 为目标。
这些范围的最佳显卡通常有多种选择,包括购买多个显卡。一些最好的选择是 GTX 1080 钛,RTX 2080,RTX 2080 钛,RTX 3080 和 RTX 3090,以及许多其他神话般的选择。
如果你有一个较高的预算,那么请随意花费你的资源来建立最好的设备。你也可以看看其他元素,比如 RGB 风扇,或者更酷的 CPU 外壳。你也可以包括液体冷却的元素,以防止你的高强度引擎表现良好。
结论:
照片由 Artiom Vallat 在 Unsplash 上拍摄
“艾温特斯不是由于想象力陷阱,而是由于缺乏想象力。想象力从混乱中带来秩序。具有深度想象力的深度学习是通往 AI 春天和 AI 秋天的路线图。”
— 阿密特雷
作为一个额外的提示,我建议观众关注这些 GPU 在你们各自国家的价格范围。每当价格大幅或小幅下降时,将是您购买这些设备的最佳时机。继续自己研究,在你的价格范围内寻找更好的选择。
本文涵盖了查看您的 PC 构建的大多数基本方面,以便在您期望的价格范围内获得有史以来最好的深度学习设置。请随意研究和探索,直到你最终决定什么是最适合你的选择。顺便说一句,我个人的建议是,如果你有足够的预算,那就去做吧。
最糟糕的情况是,如果你买了一台 PC,然后决定深度学习可能不是你的最佳选择,因为它不适合你当前的兴趣,你仍然可以将它用作游戏、编辑、流媒体等等的设备。所以,如果你买得起,那就去买吧!这个选择带来的遗憾将会很少。
如果你对这篇文章中提到的各点有任何疑问,请在下面的评论中告诉我。我会尽快给你回复。
看看我的其他一些文章,你可能会喜欢读!
</7-best-free-tools-for-data-science-and-machine-learning-3e630125f87e> [## 数据科学和机器学习的 7 个最佳免费工具
towardsdatascience.com](/7-best-free-tools-for-data-science-and-machine-learning-3e630125f87e) </6-best-programming-practices-f2605c5b469c> </5-essential-skills-to-develop-as-a-data-scientist-16442f094c09> </5-nlp-topics-and-projects-you-should-know-about-65bc675337a0>
谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!
为计算机视觉任务构建深度学习模型的最佳平台
查看用于构建和建立自己的深度学习模型以解决计算机视觉任务的最佳平台选项
卡尔·海尔达尔在 Unsplash 上拍摄的照片
自从深度神经网络在分割神经元网络方面赢得 ISBI 挑战赛以来,构建深度学习模型来解决众多计算机视觉项目的技术已经获得了巨大的欢迎。在过去的十年里,大多数重大的计算机视觉比赛都被深度学习成功征服。
随着深度学习领域的快速发展,每年都有新的方法和技术被发现,跟上这些大规模趋势变得至关重要。虽然大多数数据科学爱好者和有志之士可能希望用最好的深度学习工具构建一些独特的计算机视觉应用和项目,但不幸的是,他们可能无法利用最好的机会。
在本文中,我们将讨论几个重要的计算机视觉任务,即对象分类和检测,以及实例分割。一旦我们理解了这些主题的基础,我们将讨论如何在这些任务的最佳平台的帮助下完成这些项目。实现大多数深度学习任务的一个主要贡献因素是 GPU。要了解和探索更多关于 GPU 的重要性,请通过下面提供的链接查看下面的文章。
重要的计算机视觉应用:
安妮·斯普拉特在 Unsplash 上的照片
随着深度学习和计算机视觉领域的每一项进展,计算机视觉的光芒开始闪耀,现代世界需要几个现代计算机视觉项目。猫狗分类、人脸识别、情感和手势识别、对象检测和分割任务等项目都非常有名。
在本文的这一部分,我们将了解并涵盖计算机视觉的三个主要应用,它们被认为是最重要的应用,即分类任务、对象检测和实例分割。事不宜迟,让我们探索这些基本概念,并了解以下概述。
1.分类:
图像分类是执行的最显著的计算机视觉操作之一。常见的分类图像处理任务可以包括简单到在狗或猫之间进行分类或者在许多狗品种之间进行分类。图像分类是我们倾向于对图像甚至视频执行的最基本的任务。大多数图像分类任务可以用卷积神经网络、迁移学习模型和其他类似的项目来执行。
2.物体检测:
目标检测是计算机视觉最重要的任务之一。几十年来,一直在开发几种算法来解决以下问题。然而,直到最近(大约十年前),这项任务才获得了更多的关注。简单地说,目标检测的目的是在期望的目标位置周围创建边界框。
3.实例分段:
我们将在文章的这一部分讨论的最后一个重要的计算机视觉操作是分割。分割用于推断图像中的单个实体。在分段技术的帮助下,您可以相应地分离基本元素。语义分割试图识别给定特定图像中每个像素的作用,而实例分割倾向于识别每个类别的标签。
讨论完成这些任务的最佳平台:
作者图片
实现上一节中提到的这些任务并获得最佳结果的最佳平台之一是数据仓库。为了解决这些问题,构建各自的深度学习模型并从零开始构建它们所需的时间相当长。然而,在这个端到端平台的帮助下,您可以成功地注释、训练和部署您的模型,而不会招致任何技术债务。
进入 Nexus 网站后,您可以注册一个免费计划,这足以开始您的计算机视觉之旅。该免费计划非常适合探索 MLOps 工具的团队、学生、研究人员和希望深入研究计算机视觉的数据科学爱好者。免费计划的一些亮点包括:(I)访问增强库;( ii)基于 web 的注释器;( iii)免费的 GPU 计算时间。
数据预处理:
作者图片
登录后,您可以使用拖放编辑器上传您的图像和注释,轻松地从头开始创建一个新项目。注释支持多种格式,所以从 OpenCV 导入数据集没有问题。然后,您可以使用基于 web 的注释器对图像进行注释,该注释器支持绘制边界框、多边形和遮罩。
训练您的神经网络模型:
注释完图像后,只需点击几下鼠标,您就可以开始构建工作流程了。
作者图片
该平台为您提供了许多选项来构建不同类型的模型。您可以构建的一些模型示例有 RetinaNet、fast R-CNN、Mask R-CNN 和 EfficientDet 模型,它们也支持超参数调整。您可以从他们的四种可用 GPU 模型中选择一种,然后继续训练网络。一旦神经网络被初始化,您就可以在神经监视器上快速监视进度。根据数据集的大小,训练模型可能需要 20 分钟,一旦生成模型,您就可以执行预测任务了。
作者图片
可视化模型推理:
作者图片
大多数开发人员在构建任何深度学习项目以解决计算机视觉任务的过程中面临的一个关键问题是他们需要编写的大量代码。一旦你成功地完成了一个模型的训练,你就必须编写更多的代码来确保这个模型能够做出正确的预测并且能够被成功地部署。
对于大多数开发人员来说,这个过程可能非常乏味,因为他们每次构建新的深度学习模型时都必须处理这些情况。然而,Datature 提供了自己的开源门户库,有助于克服数据科学爱好者面临的大多数常见困难。Portal 是游戏规则的改变者,因为它允许开发人员以最快的方式加载和可视化模型。
对于大多数初级开发人员来说,Portal 也很容易使用。只需几个步骤,您就可以执行所有需要的操作。Portal 目前支持 TensorFlow 和 DarkNet 模型,而 PyTorch 支持计划在不久的将来发布。安装门户库后,使用门户库的基本步骤是相应地注册和加载所需的模型。完成这些步骤后,您可以添加图像或视频,并轻松地做出适当的预测。
作者图片
使用 Portal 可视化预测的步骤总结如下:
- 启动门户
- 注册模型(本地或使用数据关系)
- 加载资产(图像/视频)
- 实时观察模型推理
其他功能如下:
- 类别过滤
- 设置 IoU 阈值
- 运行视频推理
- 选择视频帧间隔
结论:
设计生态学家在 Unsplash 上拍摄的照片
深度学习和计算机视觉在现代的兴起是无可争议的。虽然有几种方法可以解决各种计算机视觉任务,但开发人员在试图找到最佳方法时经常会面临几个问题。拥有一个合适的 MLOps 管道允许团队在从头构建模型和部署模型时有效地启动和迭代他们的模型。在本文中,我们讨论了相对容易地实现这两个任务的最佳平台。
对于大多数重要的计算机视觉项目来说,Datature 平台是一个非常棒的地方。除了允许您在不需要编码和可视化工作流的情况下构建大量模型之外,注释还可以完全在线监控和管理。培训过程在云上完成,无法访问 GPU 支持的用户可以从这些功能中受益匪浅。
该平台最棒的部分是,您不仅可以构建和训练模型,还可以使用他们的开源门户库来注册和加载您构建的模型,以便对您的图像或视频内容进行适当的预测。这样做将大大减少开发人员所需的计算工作,并使他们能够更有效地执行任务。想开始吗?看看这个 5 分钟视频,今天就启动你的第一个计算机视觉项目吧!
如果你对这篇文章中提到的各点有任何疑问,请在下面的评论中告诉我。我会尽快给你回复。
看看我的其他一些文章,你可能会喜欢读!
</10-computer-vision-terms-everyone-must-know-about-687a98845fc8> </5-best-python-projects-with-codes-that-you-can-complete-within-an-hour-fb112e15ef44> </14-pandas-operations-that-every-data-scientist-must-know-cc326dc4e6ee> </7-best-ui-graphics-tools-for-python-developers-with-starter-codes-2e46c248b47c>
谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!
Spark SQL 中存储桶的最佳实践
Spark 斗气终极指南。
Spark 从 2.0 版开始支持分桶功能。这是一种如何在文件系统中组织数据并在后续查询中利用它的方法。
有许多资料解释了分桶的基本思想,在本文中,我们将更进一步,更详细地描述分桶,我们将看到它可能具有的各种不同方面,并解释它如何在幕后工作,它如何随着时间的推移而发展,以及最重要的是,如何有效地使用它。
我们将从两个不同的角度来看分桶—一个是数据分析师的角度,他是数据的典型用户;另一个是数据工程师的角度,他负责准备数据并将其展示给数据用户。
在本报告中,我们将讨论 Spark 3.1.1 中对 bucketing 的最新增强,这是撰写本文时的最新版本,对于代码,我们将使用 PySpark API。
什么是 bucketing?
让我们从这个简单的问题开始。Spark 中的分桶是一种如何以特定的方式组织存储系统中的数据的方式,以便可以在后续的查询中利用它,从而变得更加高效。如果存储桶设计得很好,这种效率的提高与避免查询中的连接和聚合混乱特别相关。
具有排序-合并联接或混排-散列联接以及聚合或窗口函数的查询要求数据按联接/分组键重新分区。更具体地说,具有相同联接/分组键值的所有行必须在同一个分区中。为了满足这一要求,Spark 必须对数据进行重新分区,为了实现这一点,Spark 必须将数据从一个执行器物理地移动到另一个执行器——Spark 必须进行所谓的洗牌(有关 Spark 用来确定是否需要洗牌的逻辑的更多详细信息,请参见我的另一篇与该主题密切相关的文章。
有了 bucketing,我们可以提前洗牌,并以这种洗牌前的状态保存数据。在从存储系统读回数据后,Spark 将会意识到这种分布,并且不需要重新洗牌。
如何使数据分桶
在 Spark API 中,有一个函数 bucketBy 可用于此目的:
(
df.write
.mode(saving_mode) # append/overwrite
.bucketBy(n, field1, field2, ...)
.sortBy(field1, field2, ...)
.option("path", output_path)
.saveAsTable(table_name)
)
这里有四点值得一提:
- 我们需要将数据保存为表格(一个简单的保存函数是不够的),因为关于分桶的信息需要保存在某个地方。调用 saveAsTable 将确保元数据保存在 metastore 中(如果配置单元 metastore 设置正确的话), Spark 可以在访问表时从那里获取信息。
- 与 *bucketBy、*一起,我们也可以调用 sortBy ,这将按照指定的字段对每个桶进行排序。调用 sortBy 是可选的,分桶也可以在没有排序的情况下工作。反过来也不行——如果不调用 bucketBy ,就不能调用 sortBy 。
- bucketBy 的第一个参数是应该创建的桶的数量。选择正确的数量可能很棘手,最好考虑数据集的整体大小以及所创建文件的数量和大小(参见下面更详细的讨论)。
- 不小心使用 bucketBy 函数可能会导致创建过多的文件,并且在实际写入之前可能需要对数据帧进行自定义重新分区——参见下面关于此问题的更多信息(在从数据工程师的角度进行分桶部分)。
数据是如何在存储桶之间分布的?
因此,我们知道分桶会将数据分发到一些桶/组中。您现在可能想知道这些桶是如何确定的。有了一个特定的行,我们知道它将在哪个桶中结束吗?嗯,是的!粗略地说,Spark 使用一个应用于 bucketing 字段的散列函数,然后计算这个散列值模应该创建的桶数(hash(x) mod n)。这个模操作确保创建的存储桶不超过指定的数量。为了简单起见,让我们首先假设在应用散列函数之后我们得到这些值:(1,2,3,4,5,6)并且我们想要创建 4 个桶,所以我们将计算模 4。模函数返回整数除法运算后的余数:
1 mod 4 = 1 # remainder after the integer division
2 mod 4 = 2
3 mod 4 = 3
4 mod 4 = 0
5 mod 4 = 1
6 mod 4 = 2
计算出的数字就是最终的桶。如您所见,我们只是将这六个值分配到四个桶中
(1, 2, 3, 4, 5, 6 ) -> (1, 2, 3, 0, 1, 2)
更确切地说,Spark 不是使用简单的模函数,而是所谓的正模,它确保最终的桶值是一个正数,定义如下:
b = value mod nif b < 0:
b = (b + n) mod n
因此,如果桶值为负,我们将添加 n (桶数)并再次计算对取模,这将不再是负的。让我们假设这个例子,其中散列函数返回负数-9,我们想要计算它属于哪个桶(仍然假设我们使用四个桶):
n = 4
value = -9b = value mod n = -9 mod 4 = -1# be is negative so we continue:
b = (b + n) mod n = (-1 + 4) mod 4 = 3 mod 4 = 3
因此值-9 将属于第 3 个存储桶。
Spark 使用的哈希函数是通过 MurMur3 哈希算法实现的,该函数实际上是在 DataFrame API 中公开的(参见文档),因此如果我们需要,我们可以使用它来计算相应的桶:
from pyspark.sql.functions import hash, col, expr(
spark.range(100) # this will create a DataFrame with one column id
.withColumn("hash", hash(col("id")))
.withColumn("bucket", expr("pmod(hash, 8)"))
)
在这里,我们可以看到,如果我们使用带有 8 个存储桶的列 id 的存储桶,数据将如何分布到存储桶中。注意, pmod 函数是在 expr 内部调用的,因为该函数在 PySpark API 中不直接可用,但在 SQL 中可用(要查看关于如何将 expr 函数与 SQL 函数一起使用的更多信息,可以查看我最近的关于 DataFrame 转换的文章)。
桶装的优势
分桶的主要目的是加快查询速度,提高性能。分桶主要在两个方面有所帮助,第一个方面是避免在使用连接和聚合的查询中出现混乱,第二个方面是通过称为分桶修剪的特性来减少 I/O。让我们在下面的小节中更详细地了解这两种优化机会。
无洗牌连接
如果您要连接两个表,并且这两个表都不是特别小,Spark 将必须确保这两个表以相同的方式分布在集群上(根据连接键),因此将对数据进行混洗(这两个表都将被混洗)。在查询计划中,您将在连接的两个分支中看到一个交换操作符。让我们看一个例子:
tableA.join(tableB, 'user_id')
如果计划使用排序合并连接,则执行计划将如下所示:
作者图片
正如您所看到的,连接的每个分支都包含一个代表 shuffle 的交换操作符(注意 Spark 并不总是使用排序-合并连接来连接两个表——要查看 Spark 选择连接算法所使用的逻辑的更多细节,请参阅我的另一篇关于 Spark 3.0 中的连接的文章)。
但是,如果两个表都被连接键存储到相同数量的存储桶中,Spark 将读取具有这种特定分布的集群上的数据,因此不需要额外的重新分区和洗牌——计划中将不再出现交换操作符:
作者图片
单向无洗牌加入
一个有趣的问题是,如果只有一个表被分桶,而另一个没有,会发生什么情况。答案实际上取决于桶的数量和洗牌分区的数量。如果存储桶的数量大于或等于洗牌分区的数量,Spark 将只洗牌连接的一边——没有被存储桶的表。但是,如果桶的数量少于混洗分区的数量,Spark 将混洗两个表,并且不会利用其中一个表已经被很好地分布的事实。随机分区的默认数量是 200,可以通过以下配置设置进行控制:
spark.conf.set("spark.sql.shuffle.partitions", n)
因此,如果我们使用默认设置(200 个分区),其中一个表(比如说 tableA )被分成 50 个桶,而另一个表( tableB )根本没有被分成桶,那么 Spark 会将两个表进行混洗,并将这些表重新分成 200 个分区。
为了确保利用表 A 的分桶,我们有两个选择,或者我们将洗牌分区的数量设置为桶的数量(或者更小),在我们的例子中是 50,
# if tableA is bucketed into 50 buckets and tableB is not bucketedspark.conf.set("spark.sql.shuffle.partitions", 50)tableA.join(tableB, joining_key)
或者,我们通过显式调用 repartition 将表 B 重新分区为 50 个分区,如下所示:
(
tableA
.join(tableB.repartition(50, joining_key), joining_key)
)
这两种技术都将导致单向无洗牌连接,这也可以从查询计划中看出,因为交换操作符将只出现在连接的一个分支中,因此只有一个表将被洗牌。
具有不同存储桶编号的表
这里还有一种情况我们可以考虑。如果两个表都分桶,但是分入不同数量的桶中,会怎么样呢?将会发生什么取决于 Spark 版本,因为在 3.1.1 中对这种情况进行了增强。
在 3.1 之前,情况实际上类似于前面的情况,其中只有一个表被分桶,而另一个没有,换句话说,两个表都将被混洗,除非满足混洗分区和桶数量的特定条件,在这种情况下,只有一个表将被混洗,我们将获得一个单边无混洗连接。这里的条件与前面类似—洗牌分区的数量必须等于或小于较大表的桶的数量。让我们在一个简单的例子上更清楚地看到这一点:如果 tableA 有 50 个桶, tableB 有 100 个,洗牌分区的数量是 200(默认),在这种情况下,两个表都将被洗牌为 200 个分区。然而,如果混洗分区的数量被设置为 100 或更少,则只有表 A 将被混洗到 100 个分区中。类似地,我们也可以将其中一个表重新划分为另一个表的桶数,在这种情况下,在执行过程中也只会发生一次洗牌。
在 Spark 3.1.1 中,实现了一个新特性,如果桶数是彼此的倍数,它可以将较大数量的桶合并成较小数量的桶。这个特性默认是关闭的,可以用这个配置设置spark . SQL . bucketing . coalescebucketsinjoin . enabled来控制。因此,如果我们打开它,再次将表 A 存储到 50 个桶中,表 B 存储到 100 个桶中,那么连接将是无洗牌的,因为 Spark 将把表 B 合并到 50 个桶中,所以两个表将具有相同的编号,这将与洗牌分区的数量无关。
那种呢?
我们已经看到,通过分桶,我们可以从排序-合并连接计划中消除交换。该计划还包含排序操作符,就在交换之后,因为必须对数据进行排序才能正确合并。我们能不能也取消排序?您可能想说是,因为分桶也支持排序,我们可以在 bucketBy 之后调用 sortBy 并对每个桶进行排序,这样在连接期间就可以利用这一点。然而,sort 的情况更加复杂。
在 Spark 3.0 之前,如果每个存储桶恰好由一个文件组成,那么可以从连接计划中删除排序操作符。在这种情况下,Spark 确信在集群上读取数据后对数据进行了排序,实际上最终的计划是 Sort- free。然而,如果每个桶有更多的文件,Spark 不能保证数据是全局排序的,因此在计划中保留了 Sort 操作符——数据必须在连接执行期间排序。(参见下面的从数据工程师的角度分桶一节,了解如何实现每个桶一个文件。)
在 Spark 3.0 中,这种情况发生了变化,默认情况下,即使每个存储桶只有一个文件,也会出现排序。这种变化的原因是列出所有文件来检查每个存储桶是否只有一个文件太昂贵(如果有太多文件),所以决定关闭这种检查,并在计划中一直使用排序(用于排序-合并连接)。如你所见,这是一种权衡,一种优化对另一种优化。还引入了一个新的配置设置spark . SQL . legacy . bucket edtablescan . output ordering,您可以将它设置为 True 以强制执行 3.0 之前的行为,并且仍然利用一个文件的排序桶。
无洗牌聚合
与联接类似,聚合也要求数据在集群上正确分布,通常 Spark 将不得不对数据进行洗牌,以便进行以下查询:
# this requires partial shuffle if tableA is not bucketed:
(
tableA
.groupBy('user_id')
.agg(count('*'))
) # this requires full shuffle if tableA is not bucketed :
(
tableA
.withColumn('n', count('*').over(Window().partitionBy('user_id')))
)
然而,如果字段 user_id 对 tableA 进行分桶,那么两个查询都将是无洗牌的。
桶形修剪
Bucket pruning 是 Spark 2.4 中发布的一个特性,它的目的是减少 I/O,如果我们在表被分桶的字段上使用过滤器的话。让我们假设以下查询:
spark.table('tableA').filter(col('user_id') == 123)
如果表不是分桶的,Spark 将不得不扫描整个表来查找这个记录,如果表很大,它可能需要启动和执行许多任务。另一方面,如果表是分桶的,Spark 将立即知道这一行属于哪个桶(Spark 用模计算散列函数以直接看到桶号),并且将只从相应的桶中扫描文件。而 Spark 又是如何知道哪些文件属于哪个桶的呢?每个文件名都有一个特定的结构,不仅包含它所属的存储桶的信息,还包含哪个任务生成了该文件,如图所示:
作者图片
如果表非常大,桶形修剪可以大大加快速度。
桶装的缺点
我们刚刚描述了 bucketing 可以提供的优势。你可能想知道是否也有一些缺点,或者只是一些最好避免它的情况。实际上,分桶的一个结果是值得记住的,那就是执行过程中的并行化。如果一个表被分成 n 个桶,并且您将查询它,那么结果作业的第一阶段将正好有 n 个任务。另一方面,如果表没有分桶或者分桶被关闭,许多任务可能会非常不同,因为 Spark 会尝试将数据划分到分区中,每个分区大约有 128 MB(这由配置设置Spark . SQL . files . maxpartitionbytes控制),因此任务具有合理的大小,不会遇到内存问题。
如果一个表被分桶,并且随着时间的推移它的大小增加,桶变大,那么关闭分桶以允许 Spark 创建更多的分区并避免数据溢出问题可能会更有效。这非常有用,尤其是当查询不执行任何可能直接利用 bucketing 提供的分布的操作时。
在 Spark 3.1.1 中,实现了一个新特性,它可以根据查询计划(没有连接或聚合)识别分桶没有用的情况,并将关闭分桶,因为它将丢弃分布,并以与未分桶相同的方式扫描数据。该功能默认开启,可由spark . SQL . sources . bucket ing . autobucketedscan . enabled配置设置控制。
从数据分析师的角度来看
数据分析师想要查询数据,而在理想情况下,他/她不想关心表如何存储在数据湖中的细节。嗯,我们并不是生活在一个理想的世界中,有时了解一些关于表的细节仍然是有用的,以便利用更快的执行和实现更好的性能。重要的是至少能够检查查询中是否利用了分桶,或者是否可以利用分桶,换句话说,是否有一种方法可以轻松地提高查询的性能。
桌子是桶装的吗?
要查看一个表是否被分桶以及如何分桶,我们只需通过调用 SQL 语句来检查关于该表的详细信息
spark.sql("DESCRIBE EXTENDED table_name").show(n=100)
作者图片
从这里,您可以看到该表是否分桶,哪些字段用于分桶,以及该表有多少个桶。注意,我们在这里调用了 show(n=100) ,因为默认情况下 show 函数只显示 20 行,但是如果表的模式很大,关于分桶的信息将不会出现在前 20 行中,所以请注意,根据表的不同,可能需要显示更多的行来查看分桶信息。
我的查询中是否利用了分桶?
首先,必须启用分桶,这是默认的,但是如果您不确定,可以按如下方式进行检查
spark.conf.get("spark.sql.sources.bucketing.enabled")
并且它应该返回真值。此配置设置可用于控制存储是打开还是关闭。
如果一个表被分桶,关于它的信息将保存在 metastore 中。如果我们希望 Spark 使用它,我们需要以表的形式访问数据(这将确保 Spark 从 metastore 获得信息):
# Spark will use the information about bucketing from metastore:
df = spark.table(table_name)# Spark will not use the information about bucketing:
df = spark.read.parquet(path_to_data)
请注意,在第二种情况下,我们直接从路径访问数据,Spark 将不会与 Hive metastore 通信,也不会获得有关分桶的信息—分桶将不会被使用。
最后但同样重要的是,我们可以检查查询计划,看看在计划中我们想要避免的地方是否有交换操作符。
我能帮火花吗?
通常,如果表存储在相同数量的存储桶中,存储桶将开箱即用。但在某些情况下,Spark 将无法利用分桶,我们实际上可以帮助它工作。为了有个概念,让我们来看看这些情况。
在 Spark 3.0 之前,如果分桶列在我们想要连接的两个表中具有不同的名称,并且我们将数据帧中的列重命名为具有相同的名称,则分桶将停止工作。例如, tableA 由 user_id、分桶, tableB 由 userId 分桶,列的含义相同(我们可以对其进行联接),但名称不同(user _ idvsuserId)。在以下查询中,将不会完全利用存储桶:
# The bucketing information is discarded because we rename the
# bucketed column and we will get extra shuffle:
(
tableA
.withColumnRenamed('user_id', 'userId')
.join(tableB, 'userId')
)
为了让它工作,我们需要保留原来的名字:
# Here bucketing will work:
(
tableA
.join(tableB, tableA['user_id'] == tableB['userId'])
)
Spark 3.0 修复了这个问题,因此重命名列不再是问题。
另一件需要注意的事情是连接列的数据类型——它们需要相同。让我们假设这个例子: tableA 被整数类型的 user_id 分桶, tableB 也被整数类型的 user_id 分桶,但是它是长类型的,并且两个表都被分桶到 50 个桶中。在这种情况下,每个表中连接列的数据类型都不同,因此 Spark 必须对其进行转换,丢弃存储桶信息,并且两个表都将被打乱:
# both tables will be shuffled if user_id has different data type
# in both tables:tableA.join(tableB, user_id)
非常不幸的是,这两个表是用不同的数据类型为一个具有相同含义的列创建的。然而,我们可以帮助 Spark 实现至少一方的无洗牌连接,如下所示:
(
tableA
.withColumn('user_id', col('user_id').cast('long'))
.repartition(50, 'user_id')
.join(tableB, 'user_id')
)
如您所见,我们显式地将两个表中的数据类型转换为相同,然后将更改后的表重新分区为与另一个表相同数量的分区。洗牌将只发生在我们重新分配它的这一边,另一张桌子将不洗牌。这基本上相当于只有一个表被分桶,而另一个没有。
本节中的最后一个示例与在带有连接的查询中使用用户定义的函数(UDF)有关。我们需要记住,UDF 将丢弃关于分桶的信息,所以如果我们在连接之前调用 UDF,将导致相同的情况,就好像只有一个表被分桶。要么两个表都将被混洗,要么如果我们对表进行重新分区,或者如果我们将混洗分区的数量设置为存储桶的数量,我们将得到单向无混洗连接:
# Spark will shuffle both tables because of the UDF
(
tableA.withColumn('x', my_udf('some_col'))
.join(tableB, 'user_id')
)# One-side shuffle-free join:
(
tableA.withColumn('x', my_udf('some_col'))
.repartition(50, 'user_id') # assuming we have 50 buckets
.join(tableB, 'user_id')
)# One-side shuffle-free join:
# set number of shuffle partitions to number of buckets (or less):spark.conf.set('spark.sql.shuffle.partitions', 50)
(
tableA.withColumn('x', my_udf('some_col'))
.join(tableB, 'user_id')
)
如果我们想完全避免混乱,我们可以在加入后简单地调用 UDF
(
tableA
.join(tableB, 'user_id')
.withColumn('x', my_udf('some_col'))
)
从数据工程师的角度来看
数据湖中的表通常是由数据工程师准备的。他们需要考虑如何使用数据,并准备好数据,以便为数据用户(通常是数据分析师和科学家)的典型用例服务。分桶是需要考虑的技术之一,类似于分区,分区是在文件系统中组织数据的另一种方式。现在让我们看看数据工程师通常必须面对的一些问题。
如何创建分桶表
我们已经看到上面使用函数 bucketBy 的查询。实际上的问题是控制创建文件的数量。我们需要记住,Spark 作业最后阶段的每个任务都将为它携带数据的每个存储桶创建一个文件。让我们假设这个例子,其中我们处理一个 20 GB 的数据集,我们在最后一个阶段将数据分布到 200 个任务中(每个任务处理大约 100 MB),我们希望创建一个有 200 个存储桶的表。如果集群上的数据是随机分布的(这是一般情况),这 200 个任务中的每一个都将携带这 200 个存储桶中的每一个的数据,因此每个任务将创建 200 个文件,导致 200 x 200 = 40 000 个文件,其中所有最终文件都将非常小。您可以看到,结果文件的数量是任务数量与请求的最终存储桶数量的乘积。
我们可以通过在群集上实现我们希望在文件系统(存储)中实现的相同分布来解决这个问题。如果每个任务只有一个存储桶的数据,在这种情况下,每个任务将只写一个文件。这可以通过写入前的自定义重新分区来实现
(
df.repartition(expr("pmod(hash(user_id), 200)"))
.write
.mode(saving_mode) # append/overwrite
.bucketBy(200, 'user_id')
.option("path", output_path)
.saveAsTable(table_name)
)
这将为每个存储桶创建一个文件。如您所见,我们通过 Spark 使用的相同表达式对数据进行重新分区,以便在存储桶之间分配数据(有关如何工作的更多详细信息,请参见上面的相关部分)。实际上,您可以在这里使用更简单的 df.repartition(200,’ user_id’) 来获得相同的结果,但是上述方法的优点是,如果您希望同时按照如下所示的另一个字段对文件系统中的数据进行分区,它也可以工作
(
df
.repartition(200, "created_year",expr("pmod(hash(user_id), 200)"))
.write
.mode(saving_mode)
.partitionBy("created_year")
.bucketBy(200, "user_id")
.option("path", output_path)
.saveAsTable(table_name)
)
这里,每个文件系统分区将正好有 200 个文件(每个存储桶一个文件),因此文件总数将是存储桶的数量乘以文件系统分区的数量。请注意,如果您只调用 df.repartition(200,“created_year”,“user_id”),这是行不通的。
如何确定合理的桶数
这可能很棘手,取决于更多的情况。考虑最终存储桶的大小很重要——请记住,当您读回数据时,一个存储桶将由一个任务处理,如果存储桶的大小很大,任务将遇到内存问题,Spark 将不得不在执行期间将数据溢出到磁盘上,这将导致性能下降。根据您将对数据运行的查询,每个存储桶 150-200 MB 可能是一个合理的选择,如果您知道数据集的总大小,您可以据此计算要创建多少个存储桶。
实际上,情况更加复杂,人们必须面对以下挑战:
- 该表不断被追加,其大小随着时间的推移而增长,桶的大小也是如此。在某些情况下,如果数据集也按某个日期维度(例如年和月)进行分区,并且存储桶均匀地分布在这些分区上,这可能仍然没有问题。如果典型的查询总是只要求最近的数据,例如最近 6 个月,我们可以设计存储桶,使合理的大小对应于 6 个月的数据。存储桶的总大小会增长,但这没有关系,因为我们永远不会请求整个存储桶。
- 数据是不对称的,如果存储关键字的某个特定值的记录比该关键字的其他值多得多,就会出现这种情况。例如,如果表按 user_id 分桶,则可能有一个特定的用户有更多的交互/活动/购买或数据集表示的任何内容,这将导致数据倾斜——处理这个更大桶的任务将比其他任务花费更长的时间。
存储功能的演变
Spark 本身也在随着每个新版本不断发展和改进。此外,分桶功能在最近几个版本中也有所改进,所以让我们在这里提一下其中的一些改进:
Spark 2.4 的改进
- 桶形修剪(参见吉拉 )—在桶形字段上使用过滤器减少 I/O。
Spark 3.0 的改进
- 丢弃关于排序的信息(参见吉拉)——这并不是对分桶的真正改进,而是相反。更改后,排序-合并连接总是需要排序,不管存储桶是否已经排序。这样做是为了有一个更快的解释命令,该命令需要做文件列表来验证每个桶是否只有一个文件。有一个配置设置可以恢复原来的行为(spark . SQL . legacy . bucketedtablescan . output ordering,默认情况下它是 False ,所以如果您想在连接期间利用排序的存储桶,您需要将其设置为 True )。另外,请参见上面相关部分中关于排序的讨论。
- 尊重输出分区中的别名(参见吉拉 ) —它确保排序-合并连接对于分桶表是无混乱的,即使我们重命名了分桶列。
Spark 3.1 的改进
- 合并用于连接的分桶表(参见吉拉 ) —如果两个表具有不同数量的桶,则启用无洗牌连接。请参见上面相关章节中关于该功能的讨论。
- 通过规则启用/禁用分桶(参见吉拉 ) —如果不能在查询中利用,该规则将关闭分桶。
未来的改进
这里列出了一些在撰写本文时(2021 年 4 月)尚未实现的特性:
- 添加存储桶扫描信息进行解释(参见吉拉 ) —如果在查询计划中使用存储桶,请查看该信息
- 读取多个排序桶文件(见吉拉 ) —即使每个桶有更多文件,也要利用排序桶进行排序合并连接
- 配置单元分桶写支持(见吉拉 ) —启用与配置单元分桶的兼容性(因此 Presto 也可以利用它)
与存储桶相关的配置设置
在整篇文章中,我们已经看到了其中的一些,但是让我们在这里列出它们,把它们放在一个地方:
- spark . SQL . sources . bucket ing . enabled—控制分桶是否打开/关闭,默认为 True 。
- spark . SQL . sources . bucket ing . max buckets-可用于表的最大存储桶数。默认情况下,它是 100 000。
- spark . SQL . sources . bucketing . autobucketedscan . enabled-如果存储信息没有用,它会将其丢弃(基于查询计划)。默认情况下为真。
- spark . SQL . bucketing . coalescebucketsinjoin . enabled-如果两个表的存储桶数量不同,它会将编号较大的表的存储桶与另一个表的存储桶合并在一起。只有当两个数字互为倍数时才有效。它还受到下一个配置设置的约束。默认情况下,为假。
- spark . SQL . bucket ing . coalescebucketsinjoin . maxbuckertratio-两个存储桶编号进行合并工作的最大比率。默认情况下,它是 4。换句话说,如果一个表的存储桶数量是另一个表的 4 倍以上,合并将不会发生。
- Spark . SQL . legacy . bucketedtablescan . output ordering—使用 Spark 3.0 之前的行为来利用分桶中的排序信息(如果每个桶有一个文件,这可能会很有用)。默认情况下,为假。
- spark.sql.shuffle.partitions —控制随机分区的数量,默认情况下为 200。
最终讨论
在本报告中,我们从不同的角度描述了分桶操作。我们已经看到了数据工程师在创建分桶表时需要处理的一些问题,比如选择合理数量的桶和控制创建的文件的数量。我们还讨论了 data analyst 视图—分桶表提供了优化机会。在许多情况下,这些机会被 Spark out of the box 所利用,但是在某些情况下,需要特别注意利用挖掘潜力。这种情况发生在存储桶细节不同的表的连接中,例如,表具有不同数量的存储桶,存储桶列具有不同的名称或数据类型,这里我们已经看到,通过使用数据帧的显式重新分区或改变混洗分区的数量以满足存储桶的数量的简单技巧,至少可以实现单侧无混洗连接。
R 编程的最佳实践
摄影:@ karst en _ wuerth—Unplash.com
作为一个有统计学背景的人,我承认我必须不断提高我的计算机科学和工程技能,几乎每天都是如此。虽然在分析数据时考虑分布、统计和其他关键概念对我来说是很自然的,但编写高效、干净的代码却不是。
幸运的是,我有机会与许多工程师一起工作,他们教导并解释了为什么代码需要干净和高效——如果我可以用一句话来总结这一需求,最好的一句话来自约翰·多恩的诗(这句话几乎有 400 年的历史了!):‘没有人是孤岛’。
说到开发我们的代码和脚本,我们不是一个孤岛。当作为一名数据科学家、分析师(或几乎任何其他职业)工作时,协作是最重要的技能之一——如果你想以分析数据为职业,未来有人不得不查看你的代码的概率可能是 99.99%。您的代码组织得越好,将来就越容易被人查看、调试和改进。而且这并不排斥你可能必须去做的其他人,它也将为你未来的自己省去很多麻烦(那些从来没有看着自己的代码并想:“我到底在这个函数中做了什么?))
因此,让我们直接进入 R 编程的一些常见的最佳实践(有些有争议,有些被社区广泛接受)!
图书馆第一
应该放入 R 脚本的第一件事是你的库——你的代码的依赖关系应该在一开始就明确。这将避免有人在运行代码时感到惊讶,因为其中一个导入隐藏在代码中间,而用户没有为此准备好环境。
大多数风格指南都同意这一建议,您应该避免这样做:
my_vector <- c(1,2,3)library(readxl)read_excel(path_file)
在导入库 readxl — 之前,创建一个向量 my_vector ,这通常是一个不好的做法。
我发现唯一可以打破这一规则的地方是在教学过程中——例如,当一个人在一个依赖于库的讲座中引入一个新概念时——可以在脚本中间加载该库,以便学生保留正在使用的函数和包含该段代码的库的可视引用。
硬编码变量次之
另一个普遍接受的规则是硬编码的变量,如访问数据库的路径或配置文件(如果您有密码,最好看看这篇文章来管理机密:https://cran . r-project . org/web/packages/httr/vignettes/secrets . html)在脚本的开头,在导入库之后。
许多脚本都使用 csv 或 xlsx 文件中的数据,因此一般最佳做法是执行以下操作:
library(readxl)path_file <- "data/data.csv"my_df <- read_excel(path_file)
这样,无论谁读了你的代码,都有两个重要的信息:
- 你的代码依赖于哪些库。
- 源文件夹结构应该包含哪些文件和文件夹。
哦,关于文件路径…
绝对路径上的相对路径
绝对路径从来都不是应该走的路。当您在操作系统用户结构中的文件夹上工作时,这一点尤其重要。
绝对路径如下所示:
"C:\Users\ivopb\My Documents\R Project\data\data.csv"
如果我把我的代码传递给需要在他们机器上运行它的人,除非他们有用户名 ivopb, 否则他们永远也不能在我们使用这个文件的地方运行代码。即使他们在相同的文件夹结构(My Documents/R Project/等)中运行它。).
哦,即使碰巧他们是用户***【ivopb】,*** 但是他们的硬盘中映射了另一个字母,不是***C:***祝你执行代码好运!
通常,相对路径总是首选的:
"data\data.csv"
这将迫使您将工作目录设置为您正在工作的文件夹,或者从文件夹中打开脚本——这确实比调试和更改脚本中的大量路径要好得多!
命名约定—文件名
对于文件名,总是使用易于理解的文件名,不要在文件名中使用空格(我实际上在我的课程脚本中犯了这个错误,试图匹配 Udemy 上的讲座名称,我将来可能会改变这一点)——一个好的和坏的例子:
# Good example
my_file.R# Bad example
My File.R
此外,在脚本名称中尽量使用小写字母。例如,如果您的脚本的目标是在 csv 文件中创建一些特定数据的聚合,请使用与脚本总体目标相关的名称:
aggregating_data.R
命名约定—对象和函数
这在任何编码语言中都是一个热门话题——人们倾向于争论哪种命名约定是最好的。
除了你选择的命名约定之外,一定要在整个脚本中遵循相同的命名约定——对我来说,这是一个通用的黄金法则。
我喜欢用蛇皮箱(使用 _ )作为物件,用骆驼或蛇皮箱作为功能,但这有待讨论。一个例子:
# Good
my_vector <- c(1,2,3)# Bad
myvector <- c(1,2,3)# Good
ThisFunction()
this_function()# Bad
thisfunction()
此外,您的对象和函数名称应该尽可能明确和简短,想象一个接受一个元素并计算一个数的幂的函数:
ComputePowerOfBaseWithExponent <- function (base, exponent) {
return (base**exponent)
}
函数名确实很长,所以我们可以缩短它,通常建议这样做:
ComputePower <- function (base, exponent) {
return (base**exponent)
}
再说一遍,我唯一的黄金法则是在整个剧本中保持风格一致。
返回
这与变量和函数的命名一样,是社区中最有争议的话题之一(看一下这个帖子来检查争论的双方——https://stack overflow . com/questions/11738823/explicitly-calling-return-in-a-function-or-not
每个函数末尾的 R 中的 Return 语句增加了冗余—这是事实。注意,我在上面的例子中使用了显式返回:
ComputePower <- function (base, exponent) {
return (base**exponent)
}
可以从函数中删除返回语句,从显式返回改为隐式返回:
ComputePower <- function (base, exponent) {
base**exponent
}
使用显式返回对代码的速度有一点点影响——增加了一点点(它通常非常小,几乎无法辨认)。
我倾向于认为显式返回对于所有级别的 R 程序员都更容易,因为显式返回让初学者更容易理解代码的流程。但这主要是程序员的选择——当谈到这一点时,人们往往会站在两边,我个人的观点是,我认为指责任何使用隐式或显式回报的人都是不公平的。
在循环中显式
在对象上进行循环时,一件重要的事情是显式命名正在循环的元素。
让我们想象下面的练习:你有一个特定人群的年龄向量,你想用“主要”或“次要”来分类,你使用 for 循环(为了讨论,让我们忽略我们可以使用的更好实现的其他方法):
ages_people = c(10, 20, 20, 30, 40)ClassifyAge <- function (ages) {
age_class <- c()
for (age in ages) {
if (age < 18) {
age_class <- c(age_class, 'Minor')
}
else {
age_class <- c(age_class, 'Major')
}
}
age_class
}
如果我们将 for 循环中的 age 称为 i 或 元素:
ages_people = c(10, 20, 20, 30, 40)ClassifyAge <- function (ages) {
age_class <- c()
for (i in ages) {
if (i < 18) {
age_class <- c(age_class, 'Minor')
}
else {
age_class <- c(age_class, 'Major')
}
}
age_class
}
通常最好是显式命名循环的元素——在上面的例子中,我们是基于一个 年龄 来做一些事情,因此最好将循环元素命名为 年龄 而不是 i、元素 或*。这将使不熟悉代码的人更容易理解代码在功能级别上做什么。*
对对象赋值使用
这是社区上的另一个热门话题——在创建对象或函数时,我倾向于使用*-<-**,尽管在这种情况下 = 的表现完全相同。大多数风格指南同意这一点,但没有一个放之四海而皆准的意见。*
一个普遍接受的规则是,当你使用
*# Good example
my_vector <- c(1, 2, 3)# Bad example
my_vector<-c(1, 2, 3)*
Of course, as I intertwine a lot between Python and R scripts, sometimes the naughty = 的时候就完成了赋值:-)
线长度
避免每行超过 80 个字符,以便您的代码可以适合大多数 IDE 窗口。这也是其他编程语言(如 Python)的最佳实践。您希望避免脚本的读者来回使用水平滚动条(这是一个容易迷失在代码中的方法)。
想象一个函数,用很长的参数调用:
*CalculatesMeaningOfLife('This is a really long argument','This is another really long argument','This is a third really long argument!')*
调用此代码时的一般最佳做法是执行以下操作:
*CalculatesMeaningOfLife(
'This is a really long argument',
'This is another really long argument',
'This is a third really long argument!'
)*
R Studio 有一些自动缩进,当你在逗号后按回车键。这是一个简洁的特性,它使得我们的代码更容易保持整洁。
间隔
当调用函数或索引对象时,在每个*、*之后提供一个空格总是一个好主意。这使得代码可读性更好,避免了“压缩代码”的想法。压缩代码是当我们有如下:
*my_array = array(1:10,c(2,5))
my_array[,c(1,2)]*
代码可以工作,但是所有的代码都被捆绑在一起,没有空格。从视觉上看,很难理解哪个位是指数组中的第一维还是第二维。
更干净的方法是执行以下操作:
*my_array = array(1:10, c(2, 5))
my_array[, c(1, 2)]*
请注意我是如何在代码中的每个逗号后添加一个空格的。这就是人们通常所说的让代码呼吸— 你可以更容易地理解你在每个维度上索引了什么,以及你的函数调用的每个参数包含了什么。
不要重复自己的话
*任何编程语言(至少是函数式语言)中最重要的概念之一是 **DRY 的概念。*一条普遍的黄金法则是,当你发现自己复制并粘贴了大量代码时,这是一个函数的好用法。
举一个非常简单的例子,假设我们想用 R:
*paste('Hello','John')
paste('Hello','Susan')
paste('Hello','Matt')
paste('Hello','Anne')
paste('Hello','Joe')
paste('Hello','Tyson')
paste('Hello','Julia')
paste('Hello','Cathy')*
您多次重复相同的代码,只是更改了学生的姓名。在您看来,这应该会立即引发使用功能的需求:
*GreetStudent <- function(name) {
paste(‘Hello’,name)
}class_names <- c(‘John’, ‘Susan’, ‘Matt’ ,’Anne’,
‘Joe’, ‘Tyson’, ‘Julia’, ‘Cathy’)for (student in class_names){
print(GreetStudent(student))
}*
酷的是,现在您可以向我们的 class_names 向量添加更多的学生,并且您可以避免多次重复粘贴命令!
函数确实是 r 中最强大的概念之一。人们应该多次依赖它们,因为它们将使我们的代码高效且可测试。
就是这样!你还有什么要补充吗?
这里有很多我没有涉及的最佳实践,可能还有很多我自己都不知道的。开源语言让我着迷的是它们发展的速度有多快,以及社区如何在开发更好的程序和脚本以实现更高的生产力方面相互支持。
最后一点,记住学习一门新的语言是一项需要时间的技能,对一个人来说成为万事通几乎是不可能的。你周围的每个人,不管他们是多么高级的语言,总是有东西要学,学习的心态是成为一个更好的专业人士和普通人的最佳心态。
随时伸出手如果你想了解更多关于 R 的知识,可以在这里加入我的 R 编程课程: 绝对初学者 R 编程课程
感谢您花时间阅读这篇文章!随意在 LinkedIn 上加我(https://www.linkedin.com/in/ivobernardo/)查看我公司网站(https://daredata.engineering/home)。**
如果你有兴趣接受分析和数据科学方面的培训,你也可以访问我在 Udemy(https://www.udemy.com/user/ivo-bernardo/)上的页面
这个讲座摘自我在 Udemy 平台上的 R 编程课程——该课程适合初学者和想学习 R 编程基础的人。该课程还包含 50 多个编码练习,使您能够在学习新概念的同时进行练习。**
设置 Python 环境的最佳实践
面向数据科学家的 PYTHON-DEV
pyenv-> Pipx-> poem,python 工具链的三大支柱
作者图片
你是一个数据科学家,刚刚构建了一个 ML 模型,却不能让它在 docker 容器上工作吗?你是否害怕尝试新的 python 版本,因为你不想搞乱你的本地 python 开发环境?您是否同时从事多个副业项目,并希望分别用沙箱保护每个环境?您是否不清楚如何管理您的 python 应用程序从开发到发布的生命周期?
您一直在错误地设置您的 python 环境!
与 python 开发人员不同,数据科学家很少关心他们代码的开发环境和可移植性。代码大部分存在于 jupyter 笔记本上,交给负责部署的开发人员。当您的机器上只有一个版本的 python,并且一直在一个项目上工作时,这种方法非常有效。但是,一旦您开始在需要不同环境的多个 python 版本或多个项目上工作,就越来越难以保护这些环境。
一旦您用沙箱保护了您的环境,您就开始向您的项目添加包,每个包都有它自己的依赖项列表。您需要管理您的依赖关系图,并确保您的合作者能够获得完全相同的依赖关系。
掌握新的 python 版本和开发是提高 python 技能的必要条件。当你开始一个新项目时,你不想成为你的团队中的一个人,这个人对 f 弦感到不舒服,害怕 T2 异步,不理解 T4 海象操作符,并且把你的本地开发环境搞得一团糟。
下面是设置 python 环境来处理这些棘手情况的工具和步骤列表。
Pyenv
每当你有一个全新的操作系统安装,首先安装 pyenv 开始。Pyenv 是一个命令行工具,不依赖于 python 的安装。
您可以为每个项目设置一个全局 python 版本和一个本地 python 版本。例如,您可以拥有 python 的全球版本 3.8.2,但仍然可以在您的项目中试用 python 3.9.2 或 3.10。使用 pyenv ,您可以设置 python 安装的范围。您有一个全局 python 版本,它应该是 python 的一个稳定版本,您应该将它作为大多数项目的基础,然后您可以根据项目需要使用较新或较旧的 python 版本。对于 Windows,有一个可用的端口 pyenv-win 。
Pyenv Cheatsheet
- 列出可用版本并安装:
这将给出可以使用 pyenv 安装的 python 版本列表。该列表可能因操作系统而异。
# List all available python versions
>pyenv install -l
:: [Info] :: Mirror: [https://www.python.org/ftp/python](https://www.python.org/ftp/python)
2.4-win32
2.4.1-win32
2.4.2-win32
…
3.9.0a3
3.9.0a4-win32
3.9.0a4# Install a specific python version
>pyenv install 3.9.0a4# Rehash your new installables. Needed to update pyenv shims.
>pyenv rehash
2.全球和本地版本:
既然安装多个 python 版本很简单,那么您可以在多个 python 版本之间切换。即使您的机器上可能有多个 python 版本,您也需要将 1 个版本设置为全局版本。您可以检查您的全局 python 版本,
# Set global python version
>pyenv global 3.9.0a4# Check global python version
>pyenv global
3.9.0a4
与全局版本不同,您可以为特定项目设置特定的 python 版本。比如,你有一个项目在 python 3.8.2 中运行;您可以首先安装 python 版本,然后为该项目设置一个本地 python 版本。这将覆盖全局 python 版本。
# Install other verion of python
>pyenv install 3.8.2# Change directory to your project
>cd DreamProject# Set local python version inside your project
DreamProject>pyenv local 3.8.2# Check your local python version
DreamProject>pyenv local
3.8.2
这将在您的项目中创建一个包含 python 版本的.python-version
文件。Pyenv 将使用这个来巧妙地设置 python 版本,只要你在这个目录的范围内。现在您已经设置了 python 版本,您可以打开一个新的终端并进行验证。
Pipx
使用 pipx 安装全局 python 工具。mypy、flake8、black 和 poem 可以使用 pipx 安装一次,然后跨项目重用*。*
保持干燥。当您跨项目重用 python 工具时,最好是全局安装一次,然后跨项目重用。 Pipx 用于全球安装 python 工具。像 mypy 、 flake8 这样的林挺工具,像 black、这样的格式化工具,以及像poems这样的依赖管理工具,都可以在全局范围内安装一次,然后跨项目重用。这有助于只保留这些工具的一个版本,并避免不同项目之间的版本不匹配。如果需要覆盖这个全局版本,您也可以在您的虚拟环境中安装它。
例如,您可以在您的计算机上安装一次black
格式化程序,并在多个项目中重用它。
# Verify global python version is active
>pyenv global
3.9.0a4# Install pipx
>pip install pipx# Make sure pipx is added to the path
>pipx ensurepath# Install black globally
>pipx install black# Check if install is successful
>black --version
black, version 20.8b1
现在您已经安装了 black,您可以在您的 IDE 中设置这个路径,以便开始跨项目使用它。
在 vscode 中,可以通过在用户settings.json
文件中添加下面一行来设置它,
# Set path for the python executable
“python.formatting.blackPath”: “C:\\Users\\username\\.local\\pipx\\venvs\\black\\Scripts\\black.exe”,
诗意
对于 python 应用程序的整个生命周期来说,诗歌是一个完美的工具。从创建虚拟环境、设置开发环境、安装包、解决依赖性、分发代码、打包和发布代码。
诗歌在项目的整个生命周期中帮助开发者。通常,一个项目从创建一个虚拟环境开始,添加项目所需的包,然后以将应用程序打包给最终用户或在 PyPI 中发布它结束。我们将在下面的诗歌中看到你如何做到这一切。
使用诗歌的 Python 项目生命周期
- **启动诗歌:**这将在您的目录中创建一个
pyproject.toml
文件,其中包含与您的项目相关的元信息。您可以打开该文件,稍后再进行编辑。
# Create a directory and setup python version
DreamProject>pyenv local 3.8.2# Initiate poetry. This will ask meta info related to the project. DreamProject>poetry init
This command will guide you through creating your pyproject.toml config.Package name [DreamProject]:
Version [0.1.0]:
Description []:
Author [aspiring_dev <[aspiring_dev@gmail.com](mailto:mak.adi55@gmail.com)>, n to skip]:
License []:
Compatible Python versions [^3.8]:
**2。创建一个虚拟环境:**注意到目前为止我们只创建了一个 toml 文件,我们必须从创建一个虚拟环境开始。这可以如下进行,
# Create virtual environment
DreamProject>poetry shell
Creating virtualenv DreamProject-hJUIGXBx-py3.8 in C:\Users\username\AppData\Local\pypoetry\Cache\virtualenvs
Spawning shell within C:\Users\username\AppData\Local\pypoetry\Cache\virtualenvs\DreamProject-hJUIGXBx-py3.8
Microsoft Windows [Version 10.0.19043.1165]
(c) Microsoft Corporation. All rights reserved.
**3。安装开发/生产包:**对于一个数据科学项目,我们将从安装 pandas 和 ipython 开始。这里需要注意的一点是,并不是所有的包都是平等的。有些是开发包,有些是生产包。您可以在开发和测试时使用 ipython 和 jupyter 笔记本,但是当您将应用程序作为脚本部署在main.py
文件中或者公开class
或function
时,您就不需要它了。这种隔离避免了将开发工具打包到最终版本中,最终版本将交付给最终用户或被部署。
# Add prod packages, will be included in final build
DreamProject>poetry add pandas
Using version ^1.3.1 for pandasUpdating dependencies
Resolving dependencies...Writing lock filePackage operations: 5 installs, 0 updates, 0 removals• Installing six (1.16.0)
• Installing numpy (1.21.1)
• Installing python-dateutil (2.8.2)
• Installing pytz (2021.1)
• Installing pandas (1.3.1)# Add dev packages, will not be included in final build
DreamProject>poetry add ipython --dev
poetry add ipython --dev
Using version ^7.26.0 for ipythonUpdating dependencies
Resolving dependencies...Writing lock filePackage operations: 13 installs, 0 updates, 0 removals• Installing ipython-genutils (0.2.0)
• Installing parso (0.8.2)
• Installing traitlets (5.0.5)
.......
• Installing pygments (2.9.0)
• Installing ipython (7.26.0)
poetry add
比pip install
强大多了。Pip install 只是从 PyPi 安装软件包,不做任何依赖解析。poem 解决依赖性并为您安装正确的包版本。
每当你的项目增长并开始依赖几个包时,依赖地狱就出现了。您安装的每个软件包都有自己的依赖关系,所以每当您安装或升级一个软件包时,解析这个依赖关系图会变得越来越困难。
例如,假设您为依赖于 request ≤ v2.24.0 的项目安装了包 x,而为依赖于 request >v2.25.0 的项目安装了包 y,即使 x 和 y 包都依赖于 requests,但它们在版本上不兼容,也没有重叠。诗歌会发现并标记这些问题,而匹普不会。随着您不断添加越来越多的包,依赖图呈指数级增长,这变得很困难。但是 poem 确保每次你添加一个包时,它都会为你解决依赖性并安装正确的包版本。
**4。与您的代码和环境协作:**一旦您完成了开发或者您想要与您的团队成员协作,您需要开始使用版本控制和中央存储库。其他人现在可以克隆你的回购协议,并开始工作。传统上,requirements.txt
用于建立一个环境并安装所有的包。但是有了 poem,一旦你在本地克隆了 repo,你就可以运行poetry install
来安装所有的包和依赖项,安装的顺序和在你的机器上安装的顺序完全一样,从而消除了跨机器设置环境的任何差异。诗歌为你的工作环境和依赖树提供了一个可重复的、精确的副本。
# After cloning the repo run poetry install
DreamProject>poetry install
这将在虚拟环境中安装此项目所需的所有包。
**5。打包并分发您的代码:**在开发和测试之后,是时候打包并分发您的代码了。帮助构建 python 项目。它可以生成package.tar.gz
和package.whl
两种格式。
最佳实践是使用 wheel 格式而不是 tarballs(源代码分发)。对于 wheel 格式,源代码已经由开发人员构建好了,并且可供用户使用。使用 tarballs,用户获得源代码,并需要将其构建为 wheel 格式,然后安装它。当你没有开发工具并且你的代码库包含多种语言如 c,c++时,从源代码构建是很困难的。与 tarballs 相比,Wheel 文件也更小,非常适合 PyPi 包装和分发。
# Build the project
>poetry build
Building DreamProject (1.0.0)
- Building sdist
- Built dreamproject-1.0.0.tar.gz
- Building wheel
- Built dreamproject-1.0.0-py2.py3-none-any.whl
**6。发布您的代码:**基于开发的类型,您可以将您的代码发布到 PyPi 或者使用私有的存储库。默认情况下,会将您的代码发布到 PyPi
$ poetry publish
Publishing dreamproject (1.0.0) to PyPI
- Uploading dreamproject-1.0.0.tar.gz 100%
- Uploading dreamproject-1.0.0-py2.py3-none-any.whl 58%
备注:
**1。**正如评论中的 Duncan McRae 所指出的,如果 python 版本不兼容,有时包安装会失败。
例如,假设您有一个 3.9 的本地 python 版本。poem 将 python 版本初始化为^3.9,这意味着该环境兼容任何高于 3.9 的 python 版本。但是如果你安装了一个包,比如说scipy
,它的依赖项是> =3.9,< 3.10,那么诗歌安装失败。如果出现这种情况,您可能需要打开pyproject.toml
文件,并将 python 版本更改为> = 3.9,< 3.10。此行为自版本 1.1.6 起有效,将来可能会改变。
2.弗朗西斯科·帕多瓦尼在评论里问了一个极好的问题,不知道,康达不就是类似于诗歌吗?而且 conda 不是数据科学界用的吗?因此,数据科学家比 python 开发人员更关心代码的可移植性,因为许多 python 开发人员都使用 pip。我错过了什么?
以上是我个人用诗代替康达的原因。
- Conda 不使用 PyPI,有自己的包索引器。官方渠道是几个版本落后于几个软件包,但也有其他渠道有最新版本可用。但是你必须小心你从哪里得到你的软件包的作者。
2.由 Anaconda Inc .拥有,不像 poems 是一个开源项目。
3.Conda 可以访问系统,并可以更改系统二进制文件,不像 poems 那样在虚拟环境中沙箱化,这使它非常适合码头工人。
4.诗与康达兼容。所以您仍然可以使用 conda 来设置复杂的包。