关注时间序列预测和分类
利用 NLP 的最新进展进行时间序列预测和分类
- 注意这篇文章发表于 10/18/19,我不知道为什么媒体说它来自 4/9/19。这篇文章包含了最近和最新的结果,包括将在 Neurips 2019 上发表的文章和刚刚在今年 8 月发表的预印本。
- 2020 年 8 月 24 日更新 : 很多人要求更新。我没有时间就这个主题写另一篇文章,但是你可以在流量预测库中找到 transformer 和其他几个模型的实现。
变形金刚(特别是自我关注)推动了 NLP 的重大进展。它们使伯特、GPT-2 和 XLNet 等模型形成了强大的语言模型,可用于生成文本、翻译文本、回答问题、分类文档、总结文本等等。随着他们最近在 NLP 中的成功,人们会期望对时间序列预测和分类等问题的广泛适应。毕竟,两者都涉及处理顺序数据。然而,到目前为止,关于它们适应时间序列问题的研究仍然有限。此外,尽管一些结果很有希望,但其他结果仍较为复杂。在本文中,我将回顾当前关于应用变压器的文献,以及对时间序列问题的更广泛关注,讨论当前的障碍/限制,并集思广益可能的解决方案,以(希望)使这些模型达到与 NLP 相同的成功水平。这篇文章假设你对软注意、、自我注意和 transformer 架构有一个基本的了解。如果你不喜欢,请阅读其中一篇链接的文章。你也可以观看我在 PyData Orono 展示之夜的视频。
关注时间序列数据:回顾
对时间序列数据进行准确预测和分类的需求跨越了几乎每个行业,并且远远早于机器学习。例如,在医院中,您可能希望尽早对死亡率最高的患者进行分类,并预测患者的住院时间;在零售业,你可能想预测需求和销售;公用事业公司希望预测用电量等。
尽管深度学习在计算机视觉方面取得了成功,但许多时间序列模型仍然很肤浅。特别是,在行业中,许多数据科学家仍然利用简单的自回归模型,而不是深度学习。在某些情况下,他们甚至可能使用像 XGBoost 这样的模型,以人工制造的时间间隔进行馈送。通常,选择这些方法的常见原因仍然是可解释性、有限的数据、易用性和培训成本。虽然没有单一的解决方案来解决所有这些问题,但深度模型提供了一个令人信服的案例。在许多情况下,它们以注意力热图的形式提供了整体性能改进(其他普通 lstm/rnn)和可解释性的好处。此外,在许多情况下,它们比使用 RNN/LSTM 更快(特别是使用我们将讨论的一些技术)。
一些论文研究了使用基本的和修改的注意机制的时间序列数据。 LSTNet 是最早提出对多元预测时间序列使用 LSTM +注意机制的论文之一。多变量时间序列预测的时间模式注意由 Shi Shun-Yao 等人提出,主要关注于应用特别针对多变量数据的注意。这种机制旨在解决多变量时间序列中包含噪声变量的问题,并引入一种比简单平均更好的方法。具体来说,
行上的注意力权重选择那些有助于预测的变量。因为上下文向量 vt 现在是包含跨多个时间步长的信息的行向量的加权和,所以它捕获时间信息。
简单地说,这旨在从各种特征时间序列数据中选择有用的信息来预测目标时间序列。首先,他们在 RNNs 隐藏状态的行向量上利用 2d 卷积。随后是一个评分函数。最后,他们使用 sigmoid 激活代替 softmax,因为他们期望多个变量与预测相关。其余的遵循一个相当标准的注意力练习。
Code for the temporal pattern attention mechanism. Notice that the authors choose to use 32 filters.
Diagram from the paper
就结果而言,该模型在预测太阳能和电力需求、交通和汇率方面优于(使用相对绝对误差)其他方法,包括标准自回归模型和 LSTNet。
尽管这篇文章没有使用自我关注,但我认为这是一个非常有趣且经过深思熟虑的对关注的使用。许多时间序列研究似乎集中于单变量时间序列数据。此外,那些研究多变量时间序列的人往往只扩展了注意机制的维度,而不是将其横向应用于特征时间序列。这可能是有意义的,看看是否修改自我注意机制可以选择相关的源时间序列数据来预测目标。本文的完整代码可在 GitHub 上公开获取。
自我关注到底是怎么回事?
在我们深入时间序列部分之前,让我们先简单回顾一下自我关注的几个细节。有关更详细的检查,请参见这篇关于注意力数学的文章或图示的转换图 r。对于自我注意力,回想一下,我们通常有查询、关键字、值向量,它们是通过嵌入与权重矩阵的简单矩阵乘法形成的。很多解释性文章没有提到的是查询、键和值通常可以来自不同的来源,这取决于任务,并且根据它是编码器还是解码器层而有所不同。例如,如果任务是机器翻译,编码器中的查询、键和值向量将来自源语言,但是解码器中的查询、键和值向量将来自目标语言。然而,在无监督语言建模的情况下,它们通常都是由源序列形成的。稍后我们将会看到,许多自我关注时间序列模型修改了这些值是如何形成的。
其次,自我注意通常需要位置编码,因为它不知道序列顺序。它通常通过添加到单词或时间步长嵌入而不是连接来结合这种位置信息。这有点奇怪,因为您可能会认为将位置编码直接添加到单词嵌入会对它造成伤害。然而,根据这个 Reddit 响应,由于单词嵌入的高维度,位置编码得到近似正交性(即,位置编码和单词嵌入已经占据不同的空间)。此外,海报认为正弦和余弦有助于给邻近的词相似的位置嵌入。
但最终这仍然留下了一个挥之不去的问题:在这方面,直接连接不是更好吗?这是我目前没有直接答案的事情。然而,最近有一些关于创建更好的位置嵌入的好论文。transformer-XL(XLNet 的基础)有自己特定的关系嵌入。NIPs 2019 年的论文“功能时间表征学习的自我关注”也研究了通过功能特征地图创建更有效的位置表征(尽管该论文目前不在 arxiv 上)。
许多最近的研究分析了在像伯特这样的模型中实际发生了什么。虽然完全面向 NLP,但这些研究可以帮助我们了解如何有效地利用这些时间序列数据架构,以及预测可能出现的问题。
在《T2》中,伯特在看什么?伯特注意力的分析“作者分析了伯特的注意力,并调查了语言关系。这篇论文很好地说明了自我关注(或任何类型的关注)是如何自然地有助于解释的。因为我们可以使用注意力权重来可视化焦点的相关部分。
Figure 5 from the paper. This technique of illustrating attention weights is highly useful for interpretability purposes and cracking open the “black box” of deep learning. Similar methods of analyzing specific attention weights could show which time steps or time series a model focuses on when predicting.
同样有趣的是,作者发现了以下事实:
我们发现大多数头很少关注当前令牌。然而,有一些头专门专注于下一个或前一个令牌,尤其是在网络的早期层
显然,在时间序列数据中,注意力集中在“关注下一个标记”是有问题的。因此,在处理时间序列时,我们将不得不应用某种掩码。其次,很难判断这是否仅仅是伯特接受训练的语言数据的产物,或者更广泛地说,这是否可能随着多头注意力而发生。为了形成语言表达,关注最接近的单词是很有意义的。然而,时间序列数据的变化更大,在某些时间序列中,因果关系可能来自更早的步骤(例如,对于一些河流,暴雨可能需要 24 小时以上才能抬高河水)。
在这篇文章中,作者发现修剪几个注意力头对表现的影响有限。一般来说,只有当超过 20%的注意力被削减时,表现才会显著下降。这与时间序列数据特别相关,因为我们经常处理长相关性。尤其是仅消融单个注意力头部似乎对分数几乎没有影响,并且在某些情况下导致更好的表现。
From p. 6 of the article. Using fewer attention heads may serve as an effective strategy for reducing the computational burden of self-attention for time series data. There seems to be a substantial amount of overlap of certain heads. In general it might make sense to train on more data (when available) rather than have more heads.
Umap visualization of the different semantic sub-spaces of the word “run.” Visualization made using context atlas https://storage.googleapis.com/bert-wsd-vis/demo/index.html?#word=run . It would be interesting to create Umap visualization of different time series representations from a large scale trained transformer model.
本文探讨了伯特模型中的几何结构。他们得出结论,BERT 内部似乎有解析树的几何表示。他们还发现在更大的嵌入空间中存在语义上有意义的子空间。虽然这一探索显然是以语言学为重点的,但它提出的主要问题是,如果伯特学习了这些有语言学意义的模式,那么它会学习类似的时间相关模式吗?例如,如果我们大规模训练一个 transformer 时间序列,我们会在嵌入空间中发现什么?例如,我们是否会看到相似的患者轨迹聚集在一起,或者如果我们对许多不同的流进行训练以进行洪水预测,它是否会将具有相似释放周期的坝馈流分组在一起,等等。在数千个不同的时间序列上对变压器进行大规模训练可以证明是有洞察力的,并增强我们对数据的理解。作者提供了两个很酷的 GitHub 页面,带有交互式可视化,您可以使用它们来进一步探索。
2019 年 ICLR 的另一项有趣的研究工作是减少对轻量级和动态卷积的关注。这项工作调查了为什么自我关注的工作,并提出了动态回旋作为替代。动态卷积的主要优点是,与自关注相比,它们在计算上更简单且更具并行性。作者发现这些动态回旋大致相当于自我注意。作者还采用了重量共享,这进一步减少了总体所需的参数。有趣的是,尽管潜在的速度提高,我还没有看到任何时间序列预测研究采用这种方法(至少目前没有)。
时间序列的自我关注
只有几篇研究论文在时间序列数据上使用了自我注意,并取得了不同程度的成功。如果你知道任何额外的,请让我知道。此外,GitHub 上的 huseinzol05 已经实现了一个普通版本的股票预测。
参加和诊断利用自我对医疗时间序列数据的关注。该时间序列数据是多变量的,包含诸如患者心率、SO2、血压等信息。
The architecture for attend and diagnose
他们的架构从每个临床因素的一维卷积开始,用于实现初步嵌入。回想一下,1D Conv 将利用特定长度的内核,并对其进行一定次数的处理。重要的是要注意,这里 1-D 卷积并不像通常那样应用于时间序列步骤。因此,如果初始时间序列包含 100 步,它仍将包含 100 步。相反,它被应用于创建每个时间步长的多维表示。有关时间序列数据的一维卷积的更多信息,请参考这篇文章。在一维卷积步骤之后,作者使用位置编码:
通过在训练和预测期间将时间步长 t 映射到相同的随机化查找表来执行编码。
这不同于标准的自我注意,标准的自我注意使用余弦和正弦函数来捕捉单词的位置。位置编码被加入(可能是添加的,虽然…作者没有指出具体的方式)到 1D Conv 层的各个输出中。
接下来是自我关注操作。这与标准类型的多头注意力操作基本相同,但也有一些细微的区别。首先,如上所述,由于这是时间序列数据,自我注意机制不能包含整个序列。它只能包含所考虑的时间步长。为了做到这一点,作者似乎使用了一种屏蔽机制,这种机制也屏蔽了太久以前的时间戳。不幸的是,作者对此的实际公式非常不具体,但是,如果我不得不猜测,我会假设它大致类似于作者在克服 transformer 瓶颈时展示的屏蔽操作。
在多头关注之后,现在转换的嵌入在有用之前仍然需要采取额外的步骤。通常在标准的自我关注中,我们有一个附加和层规范化组件。层标准化将标准化自我关注和原始嵌入的输出(参见此处了解更多关于此的信息),然而,作者反而选择密集插值。这意味着从多头注意力模块输出的嵌入以对捕获句法和结构信息有用的方式被获取和使用。
在密集插值算法之后,有一个线性层,后面是 softmax、sigmoid 或 relu 层(取决于任务)。该模型本身是多任务的,因此它旨在预测住院时间、诊断代码、失代偿风险、住院时间和死亡率。
总的来说,我认为这篇论文很好地展示了自我关注在多元时间序列数据中的应用。这个结果在发布的时候是最先进的,现在已经被 TimeNet 超越了。然而,这主要是由于基于迁移学习的预训练的有效性,而不是架构。如果我不得不猜测类似的沙子预训练会导致更好的表现。
我对这篇文章的主要批评主要是从可再现性的角度,因为没有提供任何代码,各种超参数(如内核大小)要么没有包括在内,要么只是模糊地暗示了一下。其他概念讨论得不够清楚,如掩蔽机制。我目前正试图在 PyTorch 中重新实现,当我对它的可实现性更有把握时,我会在这里发布代码。
最近另一篇相当有趣的论文是马家伟等人的“多变量、地理标记时间序列插补的跨维度自我关注”。这篇文章主要关注于插补(估计)缺失的时间序列值。有效的数据插补对于许多现实应用非常重要,因为传感器经常会出现故障,导致数据丢失。这在尝试预测或分类数据时会产生问题,因为缺失值或空值会影响预测。作者建立了他们的模型来使用交叉注意机制,该机制通过利用不同维度的数据来工作,例如时间位置和测量。
This is another fascinating example of modifying the standard self-attention mechanism to work across multi dimensional data. In particular as stated above the value vector is meant to capture contextual information. Oddly this is in contrast to what we will see later where the query and key vectors utilize contextual information but not the value vector.
作者在几个交通预测和空气质量数据集上评估了他们的结果。他们从预测和估算两方面进行评估。为了测试插补,他们丢弃了一定比例的值,并尝试使用模型对其进行插补。他们将这些与实际值进行比较。在所有缺失数据率方面,他们的模型优于其他 RNN 和统计插补方法。在预测方面,该模型也取得了最好的性能。
这是最近的一篇文章,将于 2019 年在 NIPS 上发表。它着重于将转换器应用于时间序列数据的几个问题。作者基本上认为经典的自我注意确实充分利用了情境数据。他们认为,这尤其会给随季节变化的动态时间序列数据带来问题(例如,预测假期前后与一年中其他时间的销售额,或者预测极端天气模式)。为了解决这个问题,他们引入了一种生成查询和值向量的新方法。
我们提出了卷积自我关注【机制】,通过使用因果卷积在自我关注层产生查询和密钥。知道局部上下文(例如形状)的查询键匹配可以帮助模型实现更低的训练误差,并进一步提高其预测精度。
From p. 3 of article. Essentially with other versions of multi-headed attention query, value, and key vectors are created off a single time-step, whereas a larger kernel size allows it to create the key and query vectors from multiple time-steps. This allows the model to be able to understand a greater degree of context.
本文的第二部分主要关注与 transformer 模型的内存使用相关的解决方案。自我注意是非常占用内存的,特别是对于很长的序列(具体来说是 O(L))。作者提出了一种新的注意机制,即 O(L(log L))。有了这种自我关注机制,细胞只能以指数级的步长关注先前的细胞。例如,第五单元将负责第四单元和第二单元。它们还引入了这种日志关注的两种变体:本地关注和重启关注。更多信息见下图
From page 5. of the article. All these variations have the same overall time complexity O(L(log L)²), however the actual runtime of Local Attention + Logsparse would likely be longest due to it attending to the most cells.
作者在几个不同的数据集上评估了他们的方法,包括耗电量(以 15 分钟为间隔记录)、旧金山的交通流量(以 20 分钟为间隔)、每小时的太阳能数据产量(来自 137 个不同的发电厂)和风力数据(28 个县风能潜力占总发电量的百分比的每日估计值)。他们选择ρ-分位数损失作为评估指标有点奇怪,因为通常我会期待 MAE、MAP、RMSE 或类似的时间序列预测问题。
Equation for p quantile regression loss.
我仍在努力理解这个指标到底代表了什么,但是至少从结果来看,分数越低越好。使用这一指标,他们的卷积自我注意力转换器优于 DeepAR、DeepState、ARIMA 和其他模型。他们还进行了一项消融研究,研究在计算七天预报时内核大小的影响。他们发现内核大小为 5 或 6 通常会产生最好的结果。
我认为这是一篇很好的研究文章,它解决了 transformer 在应用于时间序列数据时的一些缺点。我特别认为卷积核(大小大于 1)的使用在时间序列问题中非常有用,在时间序列问题中,您需要捕获关键和查询向量的周围环境。目前还没有代码,但 NeurIPs 仍然需要一个多月的时间,所以希望作者在现在和那时之间发布它。
结论和未来方向
总之,自我关注和相关体系结构已经导致了几个时间序列预测用例的改进,但是,总的来说,它们还没有得到广泛的应用。这可能与几个因素有关,如内存瓶颈、位置信息编码困难、关注点值以及缺乏对处理多元序列的研究。此外,在 NLP 之外,许多研究人员可能不熟悉自我注意及其潜力。虽然 ARIMA 等简单模型在许多情况下对解决行业问题很有意义,但我相信变形金刚也大有可为。
希望本文中总结的方法能对有效地将 transformers 应用于时间序列问题有所启发。在后续的文章中,我计划给出一个用 PyTorch 中的转换器对时间序列数据进行预测和分类的实际例子。欢迎在评论中提出任何反馈和/或批评。如果我有不正确的地方,请告诉我(鉴于这个话题的复杂性,这是很有可能的),我会更新这篇文章。
神经网络中的注意力
注意力结构的一些变化
在“ 注意力 介绍”的早期帖子中,我们看到了那里介绍的注意力架构解决的一些关键挑战(并在下面的图 1 中提到)。本着同样的精神,你也可能会遇到其他的变体。在其他方面,这些变体的不同之处在于注意力被用于“何处”(独立的,在 RNN,在 CNN 等)以及注意力是如何产生的(全球与地方,软与硬等)。这篇文章是一些变种的简要列表。
Fig 1: From “Introduction to Attention”, based on paper by Bahdanau et al.
免责声明 1 :这里的想法只是为了了解在不同论文中提出的解决方案是如何利用注意力机制的。因此,重点将不是论文试图解决的任务类型,而是解决方案中注意力机制的使用。
免责声明 2 :选择这些论文/变体的背后没有严格的理由。这份名单只是随机搜索和热门搜索的结果。
免责声明 3 :自我关注和变形金刚值得单独发布(真的,我那天失去了动力),这里不涉及。
全球关注 vs 局部关注
全局注意力与“ 注意力介绍 ”帖子中探讨的内容相同。当我们使用所有编码器隐藏状态来为每个解码器步骤定义基于注意力的上下文向量时。但正如你可能已经猜到的,这可能会变得昂贵。
另一方面,局部注意力只注意在一个较小窗口内的几个隐藏状态。该窗口以第“p”个编码器隐藏状态为中心,包括出现在“p”两侧的“D”个隐藏状态。因此,这使得该窗口的长度,即所考虑的隐藏状态的数量,为 2D+1。单调对齐是指 p 简单地设置为与解码器位置相同(第 5 个输出将具有 p = 5,如果 D = 2,则只关注 3,4,5,6,7 个隐藏状态)。预测对齐是当“p”被定义为解码器隐藏状态 ht 的函数(论文使用 s .sigmoid(vp⊤双曲正切(Wpht))并且该函数的参数被模型联合学习时。
Fig 2: Global vs Local Attention as defined by Luong et al. here
硬注意力 vs 软注意力
Luong 等人在他们的论文中提到的以及和徐等人在他们的论文中描述的,软注意是当我们将上下文向量计算为编码器隐藏状态的加权和时,正如我们在上面的图中所看到的。硬注意是指我们用注意力分数来选择一个单独的隐藏状态,而不是所有隐藏状态的加权平均。选择是一个问题,因为我们可以使用类似 argmax 的函数来进行选择,但它是不可微的(当我们使用 argmax 时,我们选择了与 max score 相对应的索引,并轻推权重以稍微移动分数,因为 backprop 的一部分不会改变该索引选择),因此采用了更复杂的技术。注意,的论文在图像字幕上下文中使用了硬注意,所以“编码器隐藏状态”实际上是 CNN 生成的“特征向量”。
Fig 3: Soft vs Hard Attention as defined by Xu et al.
潜在注意力
我偶然发现了陈等人的这篇论文,这篇论文是关于把自然语言句子翻译成“如果-那么”程序的。即,给定一个类似“将你的 Instagram 照片发布到 Tumblr”的语句,网络应该预测描述触发器(“Instagram 照片”)和动作(Tumblr)的最相关的词,这将有助于获得相应的标签(trigger=Instagram)。Any_new_photo_by_you,action=Tumblr。Create_a_photo_post)。
我们如何运用注意力来达到这一点呢?我们再来看另一个例子,“将你 Dropbox 文件夹中的照片发布到 Instagram”。与前一个相比,这里的“Instagram”与行动最相关,而“Dropbox”是触发器。同一个词既可以是触发器,也可以是动作。因此,要确定这个词的作用,我们需要调查像“to”这样的介词在这样的句子中是如何使用的。本文介绍了一个“潜在注意”模型来做到这一点。
Fig 4: “Latent Attention” presented by Chen et al. in this paper
准备了一个“J”维的“潜在注意力”向量——这里的每个维代表一个单词,softmax 给出了向量中单词的相对重要性。
- 输入序列的长度为“J”(即“J”个字)。每个单词由一个“d”维嵌入向量表示。因此,整个序列是一个 d×J 矩阵。
- 计算该矩阵与长度为“d”的可训练向量“u”的乘积,并对其进行 softmax。这给出了长度为“J”的“潜在注意力”向量
接下来,类似于上述准备“主动注意”,但是不使用类似“u”的“d”维向量,而是使用“d×J”维可训练矩阵 V,从而产生“J×J”主动注意矩阵。列级 softmax 是在每个单词的维度之间完成的。
然后“有效重量被计算为这两个重量的乘积。然后,用这些“有效权重对另一组单词嵌入进行加权,以导出输出,该输出是达到预测的软最大化。
对我来说,作为代表输入中每个单词的向量和代表单词重要性的潜在注意力向量的乘积的主动权重的推导是“自我注意”的一种形式,但稍后更多地是关于自我注意。
基于注意力的卷积神经网络
在这篇论文中,Yin 等人提出了 ABCNN——基于注意力的 CNN 来建模一对句子,用于答案选择、复述识别和文本蕴涵任务。所提出的基于注意的模型的关键亮点是,它考虑了一个输入句子的不同部分或单词或整个句子之间存在的影响/关系/影响,并提供了可用于后续任务的相互依赖的句子对表示。让我们先快速浏览一下基础网络,然后再来看看注意力是如何被引入其中的。
Fig 5: Yin et al. in this paper
- 输入层 :从两个分别有 5 个和 7 个单词的句子 s0 和 s1 开始。每个单词由一个嵌入向量表示。如果你正在数盒子,那么图 5 的表示嵌入向量的长度为 8。所以 s0 是一个 8×5 秩 2 张量,s1 是一个 8×7 秩 2 张量。
- :可能有一个或多个卷积层。先前 conv 图层的输出将作为当前 conv 图层的输入。这被称为“制图表达要素地图”。对于第一 conv 层,这将是表示输入句子的矩阵。卷积层应用宽度为 3 的过滤器。这意味着对具有 5 个字的 s0 执行卷积运算 7 次(xx1,x12,123,234,345,45x,5xx),从而创建具有 7 列的特征映射。对于 s1,这变成了具有 9 列的特征映射。在每个步骤中执行的卷积运算是“tanh (W.c+ b)”,其中“c”是在 7 个卷积步骤(xx1,x12,123,234,345,45x,5xx)的每个步骤中单词的级联嵌入。换句话说,c 是一个长度为 24 的向量。如果你在数箱子,那么根据图 5 中的,W 的尺寸是 8 x 24。**
- :应用“平均池层”对“w”列进行逐列平均,其中“w”是该层中使用的卷积滤波器的宽度。在我们的例子中,这是 3。因此,s0 的平均值为 123,234,345,456,567,将 7 列特征转换回 5 列。s1 也是如此。
- 最后一层汇集 :在最后一个卷积层,平均汇集不是在“w”列上进行,而是在所有列上进行,因此将矩阵特征映射转换为表示向量的句子。
- 输出层 :根据任务选择处理表示向量的句子的输出层,图中显示了一个逻辑回归层。
请注意,第一层的输入是单词,下一层是短短语(在上面的示例中,过滤器宽度 3 使其成为 3 个单词的短语),下一层是较大的短语,依此类推,直到最后一层,其中输出是句子表示。换句话说,对于每一层,都会产生一个较低到较高粒度的抽象表示。
本文介绍了将注意力引入这个基本模型的三种方式。
ABCNN-1
Fig 6: ABCNN-1 in this paper
- 在 ABCNN-1 中,在卷积运算之前引入注意力。句子 s0(8×5)和 S1(8×7)的输入表示特征图(在基本模型描述的#2 中描述,在图 6 的中显示为红色矩阵)被“匹配”以得到注意矩阵“A”(5×7)。
- 注意矩阵中的每个单元 Aij 代表 s0 中的第 I 个单词和 s1 中的第 j 个单词之间的注意分数。在本文中,该分数计算为 1/(1+| x y |),其中| |是欧几里德距离。
- 该注意力矩阵然后被转换回“注意力特征图”,其具有与输入表示图(蓝色矩阵)相同的维度,即分别使用可训练权重矩阵 W0 和 W1 的 8×5 和 8×7。
- 现在,卷积运算不仅在像基本模型那样的输入表示上执行,而且在输入表示和刚刚计算的注意力特征图上执行。
- 换句话说,不是如上面基本模型描述的#1 中所述使用秩 2 张量作为输入,而是对秩 3 张量执行卷积运算。
ABCNN-2
Fig 7: ABCNN-2 in this paper
- 在 ABCNN-2 中,注意矩阵不是使用如在 ABCNN-2 中描述的输入表示特征图,而是在卷积运算的输出上准备的,我们称之为“conv 特征图”。在我们的示例中,这是分别代表 s0 和 s1 的 7 列和 9 列特征映射。因此,与 ABCNN-1 相比,注意力矩阵的维度也将不同,这里是 7 x 9。
- 然后,通过对给定行(对于 s0)或列(对于 s1)中的所有关注值求和,使用该关注矩阵来导出关注权重。例如,对于 s0 的 conv 特征图中的第一列,这将是关注度矩阵中第一行中所有值的总和。对于 s1 的 conv 特征图中的第一列,这将是关注度矩阵的第一列中所有值的总和。换句话说,conv 特征图中的每个单元/列都有一个关注权重。
- 注意力权重然后用于“重新加权”conv 特征地图列。池化输出要素地图中的每一列都被计算为被池化的“w”conv 要素地图列的关注度加权和,在上述示例中为 3。
ABCNN-3
Fig 8: ABCNN-3 in this paper
ABCNN-3 简单地将两者结合起来,本质上是在汇集的同时关注卷积的输入和卷积的输出。
可分解的注意力模型
对于自然语言推理,Parikh 等人的这篇论文首先创建注意力权重矩阵,将一个句子中的每个单词与另一个句子中的所有单词进行比较,并如图所示进行归一化。但在这之后,在下一步中,问题被“分解成子问题”,分别解决。即,前馈网络用于采用级联的单词嵌入和相应的归一化对齐向量来生成“比较向量”。然后将每个句子的比较向量相加,以创建代表每个句子的两个集合比较向量,然后通过另一个前馈网络进行反馈,以进行最终分类。在这个解决方案中,词序并不重要,只需要注意。
Fig 9: From this paper by Parikh et al
用于在线注意力的神经传感器
对于在线任务,如实时语音识别,我们没有处理整个序列的奢侈jait ly等人的这篇论文介绍了一种神经转换器,它可以在一次处理输入块的同时进行增量预测,而不是在整个输入序列上进行编码或引起注意。
输入序列被分成等长的多个块(可能除了最后一个块),并且神经换能器模型只为当前块中的输入计算注意力,然后用于生成对应于该块的输出。与先前块的连接仅通过隐藏状态连接存在,隐藏状态连接是编码器和解码器侧的 RNN 的一部分。虽然这在一定程度上类似于前面描述的局部注意力,但是没有如那里描述的明确的“位置对准”。
Fig 10: Neural Transducer — attending to a limited part of the sequence. From this paper by Jaitly et al
区域注意事项
回头参考图 1 ,这是我们在早先的帖子中看到的基础介绍性注意力模型的图示。对齐的一个概括抽象是,它就像在我们生成输出时查询内存的。记忆是输入的某种表示,查询是输出的某种表示。在图 1 的中,存储器或密钥集合是编码器隐藏状态“h”,蓝色节点,查询是当前解码器隐藏状态“s”,绿色节点。然后将导出的比对分数乘以“值”——输入的另一种表示,即图 1 中的金色节点。**
区域注意力是当注意力被施加到一个“区域”上时,不一定只是像普通注意力模型那样的一个项目。“区域”被定义为存储器中一组结构上相邻的项目(即一维输入中的输入序列,如单词的句子)。通过组合存储器中的相邻项目来形成一个区域。在像图像这样的二维情况下,该区域将是图像内的任何矩形子集。
Fig 11: Area attention from this paper by Yang et al.
一个区域的“键”向量可以简单地定义为该区域中每个项目的键的平均向量。在序列到序列翻译任务中,这将是该区域中涉及的每个隐藏状态向量的平均值。在图 11 中的“简单关键向量”下的定义中,“k”是隐藏状态向量。如果我们定义一个包含 3 个相邻字的区域,那么平均向量就是在编码器中三个字的每一个之后产生的隐藏状态向量的平均值。
另一方面,“值”被定义为该区域中所有值向量的总和。在我们的基本例子中,这将再次是对应于为其定义区域的三个字的编码器隐藏状态向量。
我们还可以定义更丰富的关键向量表示,不仅考虑平均值,还考虑标准偏差和形状向量,如图 11 中所述。形状向量在这里被定义为高度和宽度向量的连接,而高度和宽度向量又是使用嵌入矩阵从投影为向量的实际宽度和高度数字中创建的,我假设这是通过模型学习的。该密钥是作为单层感知器的输出导出的,该感知器将平均值、标准差和形状向量作为输入。
一旦定义了关键向量和值向量,网络的其余部分可以是任何注意力利用模型。如果我们使用如图 1 中所示的编码器-解码器 RNN,那么插入导出的基于区域的键和值向量来代替图 1 中的那些将使其成为基于区域的注意力模型。
通读这些论文给了我们一个有趣的视角,让我们了解研究人员如何将注意力机制用于各种任务,以及思维是如何进化的。希望这个快速的研究能让我们知道如何在我们自己的任务中调整和使用其中的一个或一个新的变体。
新闻推荐的注意力模型
利用注意机制解决冷启动问题
Photo by Sam Wheeler on Unsplash
虽然奇异值分解为推荐系统提供了一个令人满意的解决方案,但是当新项目没有积累足够的数据时,它就不那么有效了。新闻推荐更具挑战性,因为它提出了三个额外的挑战:
- 新闻文章对时间高度敏感
- 用户对话题敏感,有不同的兴趣
- 新闻语言是高度浓缩的,由每天创造的大量新实体组成
在本文中,我将向您展示如何利用注意力机制来解决推荐系统中的冷启动问题。
注意机制
注意机制有着悠久的应用历史,最近被引入来解决自然语言处理中的问题。注意机制使模型能够根据上下文对输入施加不同的权重。例如,在神经机器翻译(NMT)中,注意机制可以用来克服双向信息流。借助注意机制,NMT 模型可以通过“看”原文中的不同位置来生成单词。
新闻推荐系统的情况类似。推荐引擎要学会“看”相关的部分,忽略阅读历史中不相关的部分。
深度知识感知网络
在 HK01 中,我们的数据团队在新闻推荐系统上投入了巨大的努力。我们采用最先进的算法来改进原始的奇异值分解协同过滤算法。具体来说,我们使用带有三重丢失的自动编码器和 StarSpace 来学习文章嵌入。
使用具有三重损失的去噪自动编码器生成嵌入,然后计算嵌入的余弦相似性
medium.com](https://medium.com/@LouisKitLungLaw/compute-document-similarity-using-autoencoder-with-triplet-loss-eb7eb132eb38) [## 使用脸书空间学习文档嵌入
medium.com](https://medium.com/@LouisKitLungLaw/documents-embeddings-using-facebook-s-starspace-67b8d1feba32)
对于问题 1 和 2,我们利用微软[1]提出的深度知识感知网络(DKN) ,来解决冷启动问题。我们用自己的文章嵌入代替知识嵌入,并保持注意力网络来学习用户兴趣和文章嵌入之间的相互作用。
Architecture of DKN
DKN 由两个网络组成。DKN 的整体建筑展示在右手边。为了预测点击概率,算法学习聚合阅读历史序列,形成用户嵌入。用户嵌入被视为阅读历史中文章嵌入的加权和。那么,问题来了:如何求权重?
每篇文章嵌入的权重由注意力网络获得。注意力网络对候选新闻、我们要预测的新闻和用户点击的新闻之间的交互进行建模。由于用户可能有各种各样的兴趣,并且不存在能够匹配每一个兴趣的单一新闻,注意力网络的作用是将候选新闻匹配到任何一个。
在获得权重后,该模型通过加权和生成用户嵌入,并将用户和候选新闻嵌入传递给前馈神经网络。
DKN 基本上是一个基于项目的算法。它不需要用户-项目交互数据来进行新项目推荐。而且,它可以在不干预的情况下处理多个利益。
结果
我们比较原始模型,奇异值分解的正则化版本,与奇异值分解和 DKN 的集合。通过仔细调整,集合可以实现比原始模型 10%的增量。
参考
[1]:周,,等.“深度兴趣网络点击率预测研究”第 24 届 ACM SIGKDD 知识发现国际会议论文集&数据挖掘。ACM,2018。
注意力模型简介
在自然语言处理、机器翻译领域已经有了新的发展,并且大多数最新的(SOTA)结果已经使用注意力模型实现。胶水基准组长板上最上面的模型使用自关注模型变形金刚。
为了从最基本的意义上理解注意力,让我们从吴恩达教授关于深度学习的课程中举个例子
Source — Deep Learning Coursera
以上注意模型基于“ *Bahdanau 等人,2014 联合学习对齐和翻译的神经机器翻译”的一篇论文。这是一个使用双向递归神经网络和注意力进行序列到序列句子翻译的例子。*此处,上图中的符号“alpha”代表输出向量的每个时间步长的注意力权重。有几种方法计算这些权重“α”,例如使用点积、具有单个隐藏层的神经网络模型等。这些权重乘以源中的每个单词,然后该乘积与来自前一层的输出一起被馈送到语言模型,以获得当前时间步长的输出。这些字母值决定了源中每个单词的重要性,从而决定了输出的句子。
Souce-Lilian Weng Github post.
它是可用于计算注意力权重(alpha)的不同函数的列表,更普遍的说法是*对齐分数。*在(加性)函数中( s < t >,h < i > ) 将前一时间步和源嵌入的输出串联起来,通过单层神经网络,输出为注意权重(α)。该神经网络模型与 RNN 模型并行训练,并且相应地调整这些权重。
注意力模型的类型:
- 全球和地方关注(地方-m,地方-p)
- 软硬注意
- 自我关注
全局注意力模型
这和上面讨论的注意力模型是一样的。来自当前状态之前的每个源状态(编码器)和解码器状态的输入被考虑来计算输出。下面是全球注意力模型的图表。
Source-(Luong et.al. 2015)
从图中可以看出, (a < t > ) 对齐权重或注意权重是使用每个编码器步骤和 (h < t > ) 解码器前一步骤计算的。然后使用 (a < t > ) 通过取全局对齐权重和每个编码器步长的乘积来计算上下文向量。然后,它被馈送到 RNN 单元,以找到解码器输出。
局部注意力模型
它与全局注意力模型的不同之处在于,在局部注意力模型中,仅使用来自源(编码器)的少数位置来计算对齐权重 (a < t >)。下面是局部注意力模型的示意图。
Source-(Luong et.al. 2015)
从图中可以看出,首先找到单对齐位置 (p < t > ) ,然后使用来自源(编码器)层的单词窗口连同 (h < t > ) 来计算对齐权重和上下文向量。
局部注意- 有单调对齐和预测对齐两种。在单调比对中,我们简单地将位置 (p < t > ) 设置为“t”,而在预测比对中,位置 (p < t > ) 不是仅仅假设为“t”,而是由预测模型预测。
软硬注意
软注意几乎和全局注意模型一样。
硬注意模型和局部注意模型的区别在于,局部模型在每一点上几乎都是不同的,而硬注意却不是。局部注意是硬注意和软注意的混合。最后给出了进一步研究的链接。
自我关注模型
关于同一输入序列的不同位置。理论上,自我注意可以采用上述任何得分函数,但只是用相同的输入序列替换目标序列。
变压器网络
变压器网络完全建立在自我关注机制上,不使用递归网络架构。变形金刚是用多头自关注模型制作的。
Source- Attention is all you need.
编码器层由两个子层组成,一个是多头注意,另一个是前馈神经网络。解码器由三个子层两个多头注意力网络构成,然后反馈给前馈网络。解码注意力网络从编码器输出获得输入,从解码器的前一层获得输出。
参考链接
引文
- 通过联合学习对齐和翻译的神经机器翻译
- 神经机器翻译的有效方法。
如果有些地方不正确,或者我应该再补充些什么,请在下面评论。
收件人:图文并茂
gif 图片中的注意力,以及如何在谷歌翻译这样的机器翻译中使用它
(TLDR:动画为关注 此处 )
变更日志:【2022 年 1 月 5 日—修复错别字并提高清晰度
F 几十年来,统计机器翻译一直是占主导地位的翻译模式 9 ,直到神经机器翻译 (NMT)的诞生。NMT 是一种新兴的机器翻译方法,它试图建立和训练一个单一的大型神经网络,该网络读取输入文本并输出翻译[ 1 ]。
NMT 的先驱是来自 Kalchbrenner 和 Blunsom (2013) 、 Sutskever 等人的提议。al (2014) 和 Cho。 etal (2014b) ,其中更熟悉的框架是从 Sutskever 等人那里学习的序列对序列(seq2seq)。艾尔。本文将基于 seq2seq 框架,以及如何在其上建立注意力。
Fig. 0.1: seq2seq with an input sequence of length 4
在 seq2seq 中,想法是拥有两个具有编码器-解码器架构的递归神经网络(RNNs):逐个读取输入单词以获得固定维度的向量表示(编码器),并根据这些输入,使用另一个 RNN(解码器)逐个提取输出单词。解释改编自 5 。
Fig. 0.2: seq2seq with an input sequence of length 64
seq2seq 的问题在于,解码器从编码器接收到的唯一的信息是最后一个编码器隐藏状态(图 0.1 中的 2 个微小红色节点),这是一种矢量表示,就像输入序列的数字汇总。因此,对于一个长的输入文本(图 0.2),我们不合理地期望解码器只使用这个一个向量表示(希望它“充分概括了输入序列”)来输出翻译。这可能会导致灾难性的遗忘。这一段有 100 个单词。你能把这一段翻译成你知道的另一种语言吗,就在这个问号后面?
如果不能,那我们就不应该对解码者这么残忍。不仅仅是一个向量表示,让我们在每个编码器时间步给解码器一个来自的向量表示,这样它就可以做出消息灵通的翻译,怎么样?进入关注。
Fig 0.3: Adding an attention layer as an interface between encoder and decoder. Here, the first decoder time step is getting ready to receive information from the encoder before giving the first translated word.
注意是编码器和解码器之间的接口,它向解码器提供来自每个编码器隐藏状态的信息(除了图 0.3 中红色的隐藏状态)。通过这种设置,模型可以有选择地关注输入序列的有用部分,从而学习它们之间的对齐。这有助于模型有效地处理长输入句子[ 9 ]。
定义:对齐 对齐是指将原文的片段与其对应的译文片段进行匹配。定义改编自 此处 。
Fig. 0.3: Alignment for the French word ‘la’ is distributed across the input sequence but mainly on these 4 words: ‘the’, ‘European’, ‘Economic’ and ‘Area’. Darker purple indicates better attention scores (Image source)
正如[ 2 中所介绍的,注意力有两种类型。使用所有编码器隐藏状态的注意力类型也被称为全局注意力。相反,局部注意仅使用编码器隐藏状态的子集。由于本文的范围是全球关注,本文中提到的任何“关注”都是指“全球关注”
这篇文章总结了注意力是如何使用动画工作的,这样我们就可以在没有数学符号的情况下(或者在阅读了充满数学符号的论文或教程之后)理解它们😬。作为例子,我将分享过去 5 年设计的 4 个 NMT 建筑。我还会在这篇文章中穿插一些关于一些概念的直觉,所以请保持警惕!
1.注意:概述
在我们看注意力是如何使用的之前,请允许我用 seq2seq 模型与你分享翻译任务背后的直觉。
直觉:seq2seq 译者从头到尾阅读德文文本。一旦完成,他开始逐字翻译成英语。如果句子非常长,他可能会忘记在文章的前几部分读过的内容。
这是一个简单的 seq2seq 模型。我将要经历的注意力层的分步计算是一个 seq 2 seq+注意力模型。这里有一个关于这个模型的快速直觉。
直觉:seq2seq +注意 一个翻译读德文文本,同时从头到尾写下关键词*,之后开始翻译成英文。在翻译每个德语单词时,他会使用自己写下的关键词。*
注意力通过给每个单词分配一个分数来将不同的焦点放在不同的单词上。然后,使用 softmaxed 分数,我们使用编码器隐藏状态的加权和来聚集编码器隐藏状态,以获得上下文向量。关注层的实现可以分为 4 个步骤。
步骤 0:准备隐藏状态。
让我们首先准备好所有可用的编码器隐藏状态(绿色)和第一个解码器隐藏状态(红色)。在我们的例子中,我们有 4 个编码器隐藏状态和当前解码器隐藏状态。(注意:最后合并的编码器隐藏状态作为输入输入到解码器的第一个时间步长。解码器第一个时间步长的输出称为第一个解码器隐藏状态,如下所示。)
Fig. 1.0: Getting ready to pay attention
步骤 1:获得每个编码器隐藏状态的分数。**
分数(标量)由分数函数(也称为比对分数函数 [ 2 ]或比对模型 [ 1 )获得。在这个例子中,分数函数是解码器和编码器隐藏状态之间的点积。
各种得分函数见附录 A 。
Fig. 1.1: Get the scores
**decoder_hidden** = [10, 5, 10]**encoder_hidden score**
---------------------
[0, 1, 1] 15 (= 10×0 + 5×1 + 10×1, the dot product)
[5, 0, 1] 60
[1, 1, 0] 15
[0, 5, 1] 35
在上面的例子中,我们获得了编码器隐藏状态[5, 0, 1]
的高关注分数60
。这意味着下一个字(解码器的下一个输出)将会受到编码器隐藏状态的严重影响。
第二步:通过一个 softmax 层运行所有的分数。
我们将分数放到一个 softmax 层,这样 soft max 的分数(标量)加起来就是 1。这些 softmaxed 分数代表注意力分布 [ 3 , 10 。
Fig. 1.2: Get the softmaxed scores
**encoder_hidden score score^**
-----------------------------
[0, 1, 1] 15 0
[5, 0, 1] 60 1
[1, 1, 0] 15 0
[0, 5, 1] 35 0
请注意,根据 softmaxed 分数score^
,注意力的分布仅如预期的那样放在[5, 0, 1]
上。实际上,这些数字不是二进制的,而是介于 0 和 1 之间的浮点数。
第三步 : 将每个编码器隐藏状态乘以其 softmaxed 分数。
通过将每个编码器隐藏状态与其 softmaxed 分数(标量)相乘,我们获得了对齐向量 [ 2 ]或注释向量 [ 1 ]。这正是对齐发生的机制。
Fig. 1.3: Get the alignment vectors
**encoder score score^ alignment**
---------------------------------
[0, 1, 1] 15 0 [0, 0, 0]
[5, 0, 1] 60 1 [5, 0, 1]
[1, 1, 0] 15 0 [0, 0, 0]
[0, 5, 1] 35 0 [0, 0, 0]
在这里,我们看到除了[5, 0, 1]
之外的所有编码器隐藏状态的对齐由于低注意力分数而减少到 0。这意味着我们可以预期第一个翻译的单词应该与嵌入了[5, 0, 1]
的输入单词相匹配。
第四步 : 对对齐向量求和。
将对齐向量相加以产生上下文向量 [ 1 , 2 ]。上下文向量是来自前一步骤的对齐向量的聚合信息。
Fig. 1.4: Get the context vector
**encoder score score^ alignment**
---------------------------------
[0, 1, 1] 15 0 [0, 0, 0]
[5, 0, 1] 60 1 [5, 0, 1]
[1, 1, 0] 15 0 [0, 0, 0]
[0, 5, 1] 35 0 [0, 0, 0]**context** = [0+5+0+0, 0+0+0+0, 0+1+0+0] = [5, 0, 1]
第五步 : 将上下文向量馈入解码器。
完成的方式取决于架构设计。稍后,我们将在 2a、2b 和 2c 部分的示例中看到该架构如何为解码器利用上下文向量。
Fig. 1.5: Feed the context vector to the decoder
差不多就是这样!这是完整的动画:
Fig. 1.6: Attention
训练和推理 在推理过程中,每个解码器时间步长 t 的输入是解码器时间步长 t-1 的 预测输出 。
训练时,输入到每个解码器时间步长 t 是我们从解码器时间步长 t-1 得到的 地真值输出 。直觉:注意力实际上是如何工作的?**
答案:反向传播,惊喜惊喜。反向传播将尽一切努力确保输出接近地面真实情况。这是通过改变 RNNs 中的权重和得分函数(如果有的话)来实现的。这些权重会影响编码器隐藏状态和解码器隐藏状态,进而影响注意力得分。
[ 返回页首 ]
2.注意:示例
在前面的章节中,我们已经看到了 seq2seq 和 seq 2 seq+注意力架构。在接下来的几个小节中,让我们研究另外 3 个基于 seq2seq 的 NMT 架构,它们实现了注意力。为了完整起见,我还附上了他们的双语评估替角(BLEU)分数——这是评估生成句子与参考句子的标准指标。
2a。巴赫达瑙等人。铝(2015) [ 1
这种注意力的实现是创始注意力之父之一。作者在论文标题“通过学习联合对齐和翻译的神经机器翻译”中使用了“对齐”一词,指的是在训练模型时调整直接负责得分的权重。以下是关于该架构需要注意的事项:
- 编码器是双向(正向+反向)门控循环单元(BiGRU)。解码器是一个 GRU,其初始隐藏状态是从反向编码器 GRU(下图中未显示)的最后一个隐藏状态修改而来的向量。
- 注意力层中的得分函数是加法/串联。
- 下一个解码器步骤的输入是来自前一个解码器时间步骤的生成字(粉红色)和来自当前时间步骤的上下文向量(深绿色)之间的连接。
Fig. 2a: NMT from Bahdanau et. al. Encoder is a BiGRU, decoder is a GRU.
作者在 WMT 大学的 14 个英语-法语数据集上取得了 26.75 的 BLEU 分数**。**
直觉:seq2seq 带双向编码器+注意力
译者 A 一边读德文文本,一边写下关键词。翻译者 B(承担高级角色,因为他具有从倒读句子翻译句子的额外能力)从最后一个单词到第一个单词阅读相同的德语文本,同时记下关键词。这两个人定期讨论他们到目前为止读到的每一个单词。阅读完这篇德语文章后,译者 B 的任务是根据讨论内容和他们两人收集的综合关键词,将德语句子逐字翻译成英语。
译者 A 是前进的 RNN,译者 B 是落后的 RNN。
2b。Luong 等人。铝(2015) [ 2
基于注意力的神经机器翻译的有效方法的作者已经把简化和概括 Bahdanau 等人的架构作为一个重点。艾尔。方法如下:
- 编码器是两层长短期记忆(LSTM)网络。解码器也具有相同的架构,其初始隐藏状态是最后的编码器隐藏状态。
- 他们试验的评分函数是(i) 加法/串联、(ii) 点积、(iii) 基于位置的、(iv)‘通用’。
- 来自当前解码器时间步长的输出和来自当前时间步长的上下文向量之间的连接被馈送到前馈神经网络,以给出当前解码器时间步长的最终输出(粉红色)。
Fig. 2b: NMT from Luong et. al. Encoder is a 2 layer LSTM, likewise for the decoder.
在 WMT 2015 年英语对德语的测试中,该模型获得了 25.9 分的 BLEU 分数。
直觉:seq2seq 带 2 层堆栈编码器+注意
译者 A 一边读德语文本,一边写下关键词。同样,译者 B(比译者 A 级别高)也阅读相同的德语文本,同时记下关键词。请注意,初级译者 A 必须向译者 B 报告他们阅读的每个单词。一旦阅读完毕,他们两人会根据他们所掌握的关键词,一起将句子逐字翻译成英语。
[ 返回页首 ]
2c。谷歌的神经机器翻译(GNMT) [ 9
因为我们大多数人肯定都以这样或那样的方式使用过谷歌翻译,所以我觉得有必要谈谈 2016 年实施的谷歌 NMT。GNMT 是我们已经看到的前两个例子的组合(很大程度上受第一个[ 1 ]的启发)。
- 编码器由 8 个 LSTMs 堆栈组成,其中第一个 LSTMs 是双向的(其输出是级联的),剩余连接存在于连续层的输出之间(从第三层开始)。解码器是 8 个单向 LSTMs 的独立堆栈。
- 使用的评分函数是加法/串联,如[ 1 ]中所示。
- 同样,像在[ 1 ]中一样,下一个解码器步骤的输入是前一个解码器时间步骤的输出(粉红色)和当前时间步骤的上下文向量(深绿色)之间的连接。
Fig. 2c: Google’s NMT for Google Translate. Skip connections are denoted by curved arrows. *Note that the LSTM cells only show the hidden state and input; it does not show the cell state input.
该模型在 WMT 的 14 英法语上达到了 38.95 BLEU,在 WMT 的 14 英德语上达到了 24.17 BLEU。
直觉:GNMT — seq2seq 带 8 层编码器(+双向+剩余连接)+注意
8 名译者从下到上排成一列,从译者 A,B,…,h 开始。每个译者阅读相同的德语文本。在每一个单词上,翻译 A 都与翻译 B 分享他/她的发现,翻译 B 将对其进行改进并与翻译 C 分享——重复这一过程,直到我们找到翻译 H。此外,在阅读德语文本时,翻译 H 根据他所知道的和他所收到的信息写下相关的关键词。
一旦每个人都读完了这篇英语文章,译者 A 被告知翻译第一个单词。首先,他尝试回忆,然后与翻译 B 分享他的答案,翻译 B 改进答案并与翻译 C 分享-重复此操作,直到我们找到翻译 H。然后,翻译 H 根据他写的关键字和他得到的答案,写出第一个翻译单词。重复这个直到我们翻译出来。
3.摘要
下面是您在本文中看到的所有架构的快速总结:
- seq2seq
- seq2seq +注意
- 带双向编码器的 seq2seq 注意
- seq2seq 带 2 层编码器+注意
- GNMT — seq2seq,带 8 层编码器(+双向+剩余连接)+注意
暂时就这样吧!在我的下一篇文章中,我将和你一起回顾自我关注的概念,以及它是如何在 Google 的 Transformer 和自我关注生成对抗网络(SAGAN)中使用的。留意这个空间!
附录:分数函数
下面是由 Lilian Weng 编译的一些得分函数。分数函数加法/串联和点积在本文中已经提到。分数函数背后的思想涉及点积运算(点积、余弦相似性等。),就是衡量两个向量的相似度。对于前馈神经网络得分函数,想法是让模型学习对齐权重和翻译。
Fig. A0: Summary of score functions
Fig. A1: Summary of score functions. h represents encoder hidden states while s represents decoder hidden states. (Image source)
【返回页首
参考
[1] 神经机器翻译通过联合学习来对齐和翻译(Bahdanau et。艾尔,2015)
[2] 基于注意力的神经机器翻译的有效方法(Luong et .阿尔,2015)
你所需要的只是关注。阿尔,2017)
[5] 用神经网络进行序列对序列学习(Sutskever 等。铝,2014)
[6] TensorFlow 的 seq2seq 教程带关注(seq 2 seq+关注教程)
[7] Lilian Weng 关于关注的博客(关注的伟大开始)
[8] Jay Alammar 在 Seq2Seq 上的博客,关注度(seq 2 seq+关注度上的精彩插图和工作示例)
【9】谷歌的神经机器翻译系统:弥合人与机器翻译之间的鸿沟(吴 et。艾尔,2016)
深度学习相关文章
逐行 Word2Vec 实现(关于单词嵌入)
如果你喜欢我的内容并且还没有订阅 Medium,请通过我的推荐链接 这里 订阅!注意:你的会员费的一部分将作为介绍费分配给我。
特别感谢 德里克 、威廉【Tjhi】宇轩*【任杰 、克里斯和软软为本文出谋划策、提出建议和修改意见。*
关注我上 推特 @remykarem 或者LinkedIn。你也可以通过 raimi.bkarim@gmail.com 联系我。欢迎访问我的网站remykarem . github . io*。*
Python-IV 和 WoE 中的属性相关性分析
最近我写了关于递归特征消除——我最常用的许多特征选择技术之一。今天我要讲的是另一个——属性相关性分析。与 RFE 不同,它更深入地挖掘个人属性,并试图告诉你变量的哪个部分与目标变量有最强的联系。
Photo by Vladislav Babienko on Unsplash
在我攻读数据科学硕士学位的第一个学期,我遇到了一位“古怪”的教授。他真的是个老古董——乍一看,你可以看出他是这个行业的老手。他的课叫做“数据科学简介”,根据这个名字,你会期望对数据科学领域、基本术语的基本介绍,以及对数据科学库的介绍。
不是这样的。
开始的时候,我对这门课不是很满意,主要是因为它有严重的偏见。他谈论的都是客户流失模型和一些我一无所知的神秘术语— 属性相关性分析。
我现在在业内工作,现在才真正体会到他的话。对于一个新人来说,听客户流失建模并不是最有趣的事情——你可能更愿意学习用超复杂的神经网络对狗和猫进行分类。
但是残酷的现实是——这不是你在日常工作中要做的事情!
大多数“数据科学”工作,至少在我居住的这个不发达的第三世界国家,包括与数据库和数据仓库打交道,而每天写 R/Python 代码不是很多人做的事情。
突然听到关于流失建模变得更有趣了!
但是什么是属性相关性分析呢?
好问题。我引用一下官方课书里的一段话:
属性相关性分析阶段的任务是识别对客户流失影响最大的属性(特征)。通过属性相关性分析,显示出与流失(流失=“是”或“否”)相关的最大分离能力的属性将被选为建立预测流失模型的最佳候选。[1]
出于某种原因,这本书里的英语很糟糕。我不是说我的是完美的,但作为有声读物听这个是一个痛苦的过程。
尽管如此,我还是希望你能领会它的要点。
属性相关性分析绝不仅仅用于预测性流失模型开发,您可以将其用于所有分类任务。它基于两个术语:信息值和证据权重。
信息价值和证据权重
好吧,我保证我会简短的讲讲这个理论。根据www.listendata.com的证据权重解释如下:
证据的权重表明了自变量相对于因变量的预测能力。由于它是从信用评分世界演变而来的,它通常被描述为区分好客户和坏客户的一种方法。**【不良客户】指拖欠贷款的客户。【好客户】**指还贷客户。[2]
从同一来源,信息价值的解释如下:
信息值是选择预测模型中重要变量的最有用的技术之一。这有助于根据变量的重要性对其进行排序。[3]
两者都很容易计算。下面是公式:
WoE and IV formulas
如果我们在讨论客户流失建模,那么商品将是没有流失的客户,而商品将是流失的客户。仅仅从这一点,就可以看出公式背后的简单。
然而,计算这两者将是你最后要做的事情之一——一些先决条件需要事先满足。
WoE 和 IV 先决条件
为了突出先决条件,我将把它们放在一个有序列表中。
- 数据集必须干净。您可以用单词’ MISSING '逐字填充缺失的值,我建议您这样做,看看缺失的值是如何与目标变量联系起来的。
- 不应该有任何连续属性。根据你的喜好,代表年龄或任何连续事物的属性应该被分成 5-10 个格。只要确保每个箱至少有 5%的观察值。
一旦您的数据集处于这种形式,您就可以继续进行 WoE 和 IV 计算过程。
流失建模示例
为了制作这个例子,我使用了来自 Kaggle 的客户流失建模数据集。装入熊猫时,看起来是这样的:
Head of Churn_Modeling.csv
流失建模示例的属性相关性分析分为 6 个步骤:
- 数据清理和准备
- 计算 IV 和 WoE
- 识别搅拌器轮廓
- 粗分类
- 虚拟变量创建
- 虚拟变量之间的相关性
所以,事不宜迟,我们开始吧!
第一步。数据清理和准备
数据集不包含缺失值,因此满足先决条件 1/2!
有 10,000 个观察值和 14 列。从这里开始,我开始清理数据。以下是我采取的步骤:
- 删除CustomerId姓氏*——任意,不能用。*
- 将 信用分数 、 年龄 、 余额 和 估计销售额 分组到 5 个箱中
- 删除年龄余额 和 估计销售额 ,因为不再需要它们**
下面是实现这些步骤的代码片段:
Data Cleaning — https://gist.github.com/dradecic/10f4b1a909a8ad42539e7b8aee4da74b
数据集现在是干净的,不包含连续变量。2 的先决条件 2 已满足!
新的、清理后的数据集如下所示:
Head of the Cleaned version of Churn_Modeling.csv
第二步。计算 IV 和 WoE
现在我可以开始计算 IV 和 WoE 了。出于某种原因,我无法找到这样做的 Python 包,至少我没有找到有良好文档记录的包,所以我必须自己编写代码——没问题!
下面是计算证据权重和信息值的函数。给定 Pandas 数据帧、属性名和目标变量名,它将进行计算。
该函数将返回熊猫数据帧和 IV 分数。代码乍一看可能有点复杂,但如果逐行阅读,就不会复杂。
IV and WoE function — https://gist.github.com/dradecic/52d8b2b2213dd3d46f4b75f85c1183f2
为了避免在内存中创建许多不必要的数据帧,一个简单的循环将为您打印出所有内容:
Printing Loop — https://gist.github.com/dradecic/9bd774d84c3ad9f193646fb7dccbd326
这里注意 Exited 是目标变量的名字,由于逻辑原因,你不会为它做计算。当执行这个代码单元时,您将在笔记本中获得大量输出:
Excerpt of IV and WoE output
如果这是你第一次计算 IV 和 WoE,你可能会想:这到底是怎么回事?!
有一个简单的解释。
现在,你应该只关心 IV 分数那一行。更准确地说,把你的想法放在 IV 分数最高的变量上。下面是 IV 解释表:
IV Interpretation table
现在你应该能看到更清晰的画面了。您应该只保留那些具有良好预测能力的属性!在当前数据集中,它们是:
- NumOfProducts(0.80)
- 年龄 _ 仓位 (0.74)
- 地理 (0.17)
- is active member(0.15)
第三步。识别搅拌器轮廓
这实际上并不是必需的步骤,但是这样做是非常有益的。
作为一家公司,你可能想知道典型的厨师是什么样子的。我的意思是,你不关心他/她的外表,但你想知道那个人住在哪里,他/她的年龄,等等…
为了找出答案,您需要仔细查看那些预测能力最强的变量的返回数据帧。更准确地说,看看 WoE 一栏。理想情况下,你会发现负的 WoE 分数**——这是大多数搅拌者拥有的数值。**
在我们的示例中,这是典型的搅拌器配置文件:
- 生活在德国(权重系数 0.63)
- 使用 3 种产品/服务(WoE -2.92)
- 不是活跃成员(WoE -0.36)
- 已超过 46 年(WoE -1.20)
有了这些信息,作为一家公司,您可以采取行动,解决这个关键的客户群。
第四部分。粗分类
粗分类是另一个我在攻读硕士学位之前没有听说过的术语。解释其背后的想法非常简单,你基本上是想把有相似遭遇的实例放在一起,因为它们提供了相同的信息。
我再次需要自己编写代码来完成这项工作。
对于这个数据集,应该对 地理 属性中的西班牙和法国进行粗分类(0.24 和 0.28)。
IV and WoE for Geography attribute
下面是用于粗略分类的函数,以及函数调用。要调用该函数,您必须事先知道您想要粗化的两行的索引位置。代码非常简单明了,请看一下:
Coarse Classing function — https://gist.github.com/dradecic/564c3a9de955ef972b74575f2b700920
以下是粗分类过程后数据集的样子:
IV and WoE for Geography after coarse classing
您可以注意到,对于新创建的行,值为 NaN 。这没什么好担心的,你可以简单地重新映射原始数据集,用新的东西替换西班牙和法国,例如西班牙 _ 和 _ 法国。
Geography remapping — https://gist.github.com/dradecic/f1a72679206cdc5285983f40fbe3a679
相关属性中的所有唯一值现在都有非常不同的 WoE——这意味着您可以继续下一步——创建虚拟变量。
第五步。虚拟变量创建
我们就要到达终点了。差不多了。
如您所知,当只有二元属性时,分类模型表现最好。这就是虚拟变量出现的原因。
根据维基百科:
虚拟变量是一个取值为 0 或 1 的变量,用来表示可能会改变结果的某种分类效应的存在与否。[4]
简而言之,如果属性有 n 个唯一值,您将需要创建 n — 1 个虚拟变量。当一个变量是另一个变量的完美预测变量时,可以少创建一个虚拟变量以避免共线性问题。
以下属性将需要虚拟变量:
- 地理
- NumOfProducts
- 年龄 _ 仓位
下面的代码将创建它们,然后将它们与 IsActiveMember 属性和目标变量 Exited 连接成一个新的数据帧:
Dummy Variables — https://gist.github.com/dradecic/e6eaafed7ed5cd6599abb12dc8a40f60
如果您现在看一下新创建的数据帧的头部:
DF with Dummy Variables — Head
现在所有的属性都是二进制格式——只剩下最后一步了!
第六步。虚拟变量之间的相关性
你已经坚持到最后了。该过程的最后一步是计算虚拟变量之间的相关性,并排除相关性高的变量。
什么被认为是高相关系数还有待讨论,但是我建议你去掉任何相关度超过 0.7** (绝对值)的东西。**
如果您想知道在这两个变量中要删除哪个虚拟变量,删除证据权重较低的那个,因为它与目标变量的联系较弱。
我决定绘制一个相关性矩阵,以获得相关性的直观表示:
Correlation Matrix
这里可以看到,虚拟变量之间不存在相关性,因此,它们都必须保留。
结论
我将在这里结束这一部分。下一部分将在几天内完成,最多一周,将涵盖基于虚拟变量的预测模型的开发和优化。
我希望你能看到属性相关性分析的威力,不仅在特征选择领域,而且在客户特征分析领域。这篇文章只涉及了整个过程的一小部分,所有的事情都被简化了。为了全面了解情况,我强烈建议你阅读整本书——这本书可以在亚马逊上买到。这不是最便宜的,当然也不是没有错别字,但嘿,如果你能在 YouTube 上观看印度教程,你将能够理解一些刺耳的斯拉夫英语。大概吧。
一旦文章上线,第二部分的链接将附在这里。
在那之前,敬请期待!
感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制的学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
** [## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)**
参考
[1] Klepac,g .,Kopal,r .,MRI,L. (2014 年)。使用数据挖掘技术和社会网络分析开发流失模型。美国:IGI-全球
[4]https://en . Wikipedia . org/wiki/Dummy _ variable _(statistics)
音频人工智能:使用卷积神经网络从立体声音乐中分离乐器
黑客音乐走向衍生内容的民主化
这是我在三月份开始的“音频人工智能”系列的第二篇文章,它可以被认为是继之后的第二部分我的第一篇关于使用 CNN 进行人声隔离的文章。如果你还没有读过那本书,我强烈推荐你从那里开始!
简单回顾一下,在第一篇文章中,我向您展示了我们可以构建一个非常小的卷积神经网络(~300k 参数)来实时执行声音隔离。我们欺骗这个网络“认为”它正在解决一个更简单的问题,最终我们得到了这样的结果:
现在,我们如何从这里开始将任何专业制作的立体声混音反向工程到 4 个乐器层,更具体地说,到主 4 个主干?
关于茎
在继续之前,先了解一下词干的背景。
Stems 是来自多个单独音轨的立体声录音。例如,鼓干通常是一个立体声音频文件,听起来像所有鼓轨道混合在一起。在大多数情况下,还包括额外的处理,如均衡、压缩和基于时间的效果……[Izotope,on Stems vs multi tracks】。**
茎从哪里来?stems 已经在录音棚中使用了几十年,作为控制、处理和操纵整组乐器的一种方式,简化了混音、母带制作和制作过程。有些人会互换使用词干、子混音、子组或总线。除了工作流程方面之外,
stems 作为一种独立的格式已经获得了一些欢迎,它可以扩展创作的可能性,特别是在混音和 DJing 方面。
在这种背景下,许多玩家一直在尝试开发这个空间,包括拥有 STEM 格式的原生乐器。
随着艺术家和唱片公司变得更加舒适,越来越少受到一个不断增长的生态系统的威胁,这个生态系统拥抱合作,并了解衍生品的创意和商业潜力,stems 重新受到了一些关注。
惯例是用 4 个词干表示混合:
彻底地
我的第一篇文章的旅程结构得到了很好的反馈,所以我将尝试在这里做一些类似的事情。然而,在这种情况下,'’ A ‘现在是我们训练有素、随时可用的人声隔离模型,而’’ Z ',则是词干隔离模型。
假设:我们可以将用于分离人声的相同方法应用于其他乐器
这个假设实际上应该被分解成两部分:
- 我们用来从混音中分离人声的二进制掩蔽试探法同样适用于其他类型的内容。或者换句话说,使用相同的二进制掩蔽技术,我们期望所有词干的隔离的可比较的感知质量。
- 不管 1)是否为真,我们用于学习有声二进制掩码的相同 CNN 架构将能够以相当的准确度学习其他词干的二进制掩码。
如果 1)和 2)都是真的,我们应该处于一个相当好的位置。
输入/输出表示
之前,我向你展示了我们可以创建二进制掩码*,当应用于原始混音时,它会产生一个感觉上不错的人声重建。然后,我们训练我们的 CNN 学习如何估计这些二元掩模,这是一个比估计实际人声的幅度谱简单得多的任务。*
在这种情况下,我们的输入-输出表示和生成的训练集如下所示:
按照第一篇文章中描述的构建训练集的相同过程,我们现在有了与之前相同的输入*,但是有 4 组可能的目标输出**,每个词干一组。*
Our Stems training set is now composed of 15 million, ~300-millisecond mix fragments and their corresponding vocals, drums, bass, and others middle frame binary masks.
在这种情况下,youtube 抓取方法没有给我们带来多少,我们不得不投入大量的时间和精力来寻找(以及合成)完全对齐的混合词干对。
让我们以鼓二进制掩码为例。现在,值“1”表示在给定频率仓(时间帧位置 )主要存在鼓内容,而值“0”表示在给定位置主要存在 或其他内容 。当谈到频率仓—时间帧位置时,请记住我们实际上指的是二进制掩码中的单个元素(像素),它对应于幅度 STFT 域中的某个值。
多源二值掩蔽
现在我们有多个来源,有许多不同的方法可以生成我们的二进制掩码。实际上,我们在两个主要原则下完成了 7 种不同的变化:
a) 假设在给定的频率仓-时间帧位置上只能出现一个* 源。在这种情况下,您可以想象所有 4 个源 在每个单独的位置竞争 。尽管这是对现实的巨大过度简化,但在某些情况下,它的效果惊人地好。(就感知而言,就听觉掩蔽而言,对存在感的竞争实际上并不那么远离现实。)*
b) 源被允许共享一个频率仓—时间帧位置。或者换句话说,在任何给定位置都可能存在多个源。这显然更符合实际。
由于 b)不依赖于彼此竞争的源,二进制化试探法基于在每个频率仓-时间帧位置的每个单独源和原始混合的幅度 STFT 之间的幅度比标准,并且在一些情况下,以时间-频率空间中的相邻区域为条件。
这两个原则都有其利弊。本文中的内容和演示使用了原则 b)下的专有方法的组合。有关时频掩蔽的全面概述和参考资料,您可以查看本资源。
example: left channel of a full song and the resulting binary masks for each stem
现在回到我们的假设,我们如何验证假设 1?我想到了两种方法。
E. Vincent et al. https://hal.inria.fr/inria-00544230/document
1)使用类似于 SAR、SIR、SDR 的音频源分离度量。这些标准是由源分离学术界在几年前提出的,其目标是使评估从源分离过程中回收的估计源的质量的标准标准化,以及用于基准测试的目的。 museval 工具箱 实现了这些指标。
2)一种不太正式(但在构建特定应用时不一定不太有效)的方法是构建小型测试集,并进行监听会话,比较原始源和通过对原始混合进行二进制掩蔽而恢复的源。有了这些,您就可以根据您感兴趣的特定质量向量建立一些评分。
那么,假设 1 的结论是什么?你以后会发现…
模型:学习词干的二进制掩码
现在我们已经有了词干训练集,我们如何将这个输入/输出表示插入一些兼容的架构中,这些架构将学习混合词干任务?
同样,实现这一点的方法不止一种,我将向大家展示我们在设计过程中采用的几种方法。
模型[ 1 ]:合并独立训练的模型用于联合推理
我们知道我们的第一个声音隔离模型效果很好。在考虑重新发明轮子之前,让我们首先验证我们用于学习声乐二进制掩码的相同 CNN 架构与其他词干的行为类似。(假设二)
本质上,
通过简单地改变我们的目标二进制掩码,我们可以训练与人声完全相同的架构,用于隔离鼓、低音和其他声音
例如,对于鼓声干,我们将在输入端呈现 X(混音),在输出端呈现 y(鼓声)。
*一旦我们的 4 个独立模型训练完毕,**我们就可以将预训练的权重加载到 4 个相同的模型占位符中。*从到我们可以连接这些模型,使它们共享一个公共输入,同时连接它们的输出层,以便在每个推理步骤,我们同时获得所有 4 个词干的二进制掩码。把这 4 个模型想象成一个新的、更大的模型的分支(这就是这里发生的事情)。
查看这个新模型的输出层,你可以看到我们的维度现在是 2052 (4 x 513)。因为我们确切地知道这些模型分支是如何连接的,我们可以通过简单的索引很容易地检索每个主干的二进制掩码。
下面,我将向您展示使用 Keras 的 Functional API 构建上述架构的代码。我将把把权重从预训练模型加载到新模型占位符中的任务留给您。在 Keras 中使用load _ weights()/get _ weights()/set _ weights()函数应该相对简单。
*from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, Concatenate
from keras.layers.advanced_activations import LeakyReLU
from keras import Input, Model# this can be done in a for loop but I'll do it the 'redundant' way
# for clarityinput_shape = Input(shape=(513, 25, 1))# BRANCH VOCALSx_1 = Conv2D(32, (3,3), padding=’same’, input_shape=(513, 25, 1))(input_shape)
x_1 = LeakyReLU()(x_1)
x_1 = Conv2D(16, (3,3), padding=’same’)(x_1)
x_1 = LeakyReLU()(x_1)
x_1 = MaxPooling2D(pool_size=(3,3))(x_1)
x_1 = Dropout(0.25)(x_1)x_1 = Conv2D(64, (3,3), padding=’same’)(x_1)
x_1 = LeakyReLU()(x_1)
x_1 = Conv2D(16, (3,3), padding=’same’)(x_1)
x_1 = LeakyReLU()(x_1)
x_1 = MaxPooling2D(pool_size=(3,3))(x_1)
x_1 = Dropout(0.25)(x_1)x_1 = Flatten()(x_1)
x_1 = Dense(128)(x_1)
x_1 = LeakyReLU()(x_1)
x_1 = Dropout(0.5)(x_1)
x_1 = Dense(513, activation='sigmoid')(x_1)# BRANCH DRUMSx_2 = Conv2D(32, (3,3), padding=’same’, input_shape=(513, 25, 1))(input_shape)
x_2 = LeakyReLU()(x_2)
x_2 = Conv2D(16, (3,3), padding=’same’)(x_2)
x_2 = LeakyReLU()(x_2)
x_2 = MaxPooling2D(pool_size=(3,3))(x_2)
x_2 = Dropout(0.25)(x_2)x_2 = Conv2D(64, (3,3), padding=’same’)(x_2)
x_2 = LeakyReLU()(x_2)
x_2 = Conv2D(16, (3,3), padding=’same’)(x_2)
x_2 = LeakyReLU()(x_2)
x_2 = MaxPooling2D(pool_size=(3,3))(x_2)
x_2 = Dropout(0.25)(x_2)x_2 = Flatten()(x_2)
x_2 = Dense(128)(x_2)
x_2 = LeakyReLU()(x_2)
x_2 = Dropout(0.5)(x_2)
x_2 = Dense(513, activation='sigmoid')(x_2)# BRANCH BASSx_3 = Conv2D(32, (3,3), padding=’same’, input_shape=(513, 25, 1))(input_shape)
x_3 = LeakyReLU()(x_3)
x_3 = Conv2D(16, (3,3), padding=’same’)(x_3)
x_3 = LeakyReLU()(x_3)
x_3 = MaxPooling2D(pool_size=(3,3))(x_3)
x_3 = Dropout(0.25)(x_3)x_3 = Conv2D(64, (3,3), padding=’same’)(x_3)
x_3 = LeakyReLU()(x_3)
x_3 = Conv2D(16, (3,3), padding=’same’)(x_3)
x_3 = LeakyReLU()(x_3)
x_3 = MaxPooling2D(pool_size=(3,3))(x_3)
x_3 = Dropout(0.25)(x_3)x_3 = Flatten()(x_3)
x_3 = Dense(128)(x_3)
x_3 = LeakyReLU()(x_3)
x_3 = Dropout(0.5)(x_3)
x_3 = Dense(513, activation='sigmoid')(x_3)# BRANCH OTHERSx_4 = Conv2D(32, (3,3), padding=’same’, input_shape=(513, 25, 1))(input_shape)
x_4 = LeakyReLU()(x_4)
x_4 = Conv2D(16, (3,3), padding=’same’)(x_4)
x_4 = LeakyReLU()(x_4)
x_4 = MaxPooling2D(pool_size=(3,3))(x_4)
x_4 = Dropout(0.25)(x_4)x_4 = Conv2D(64, (3,3), padding=’same’)(x_4)
x_4 = LeakyReLU()(x_4)
x_4 = Conv2D(16, (3,3), padding=’same’)(x_4)
x_4 = LeakyReLU()(x_4)
x_4 = MaxPooling2D(pool_size=(3,3))(x_4)
x_4 = Dropout(0.25)(x_4)x_4 = Flatten()(x_4)
x_4 = Dense(128)(x_4)
x_4 = LeakyReLU()(x_4)
x_4 = Dropout(0.5)(x_4)
x_4 = Dense(513, activation='sigmoid')(x_4)# concatenate output layers
merged_output = keras.layers.concatenate([x_1, x_2, x_3, x_4], axis=1)# connect to single/common input layer
model = Model(input_shape, merged_output)# define optimizers, loss, etc and compile model...*
尽管最终模型有接近 1.3M 的参数,但学习过程仅在约 300K 参数的架构中进行
得出你自己的结论,但我想在这里指出的是:
- 我们总是可以通过解决多个更小的问题来尝试解决一个大问题。(在 ML 中不总是最好的做法,但有时确实如此)
- 您肯定希望关注您的参数数量与您的模型在训练期间将接触到的示例数量。请记住,在从声音隔离到词干解构的过程中,我们所做的只是生成备选的目标二元掩码集,但训练实例的数量保持不变。通过这种设计,我们保持了与之前相同的# 训练示例< > #参数比率。
- 因为我们隔离地训练每个词干的模型,所以每个模型的能力学习其相应的二进制掩码不受其他模型的训练过程的影响。
你可能会问…“为什么不在推理过程中将这四个模型分开呢?”
这是一个完全合理的问题。答案是,对于这个特定的应用程序,我们需要执行混合到词干解构,作为连接到其他几个进程的实时管道的一部分,包括回放。正因为如此,我们希望所有的词干同时生成,以避免缓冲和同步问题。最重要的是,我们必须在单个 GPU 上运行它。将这四种模式分开会让双方都面临更大的挑战。例如,如果您正在构建一个 API,并且您不关心同步或实时性,那么您将拥有更大的灵活性。
模型[ 2 ]:使用原始的单茎模型估计 4 个二元掩模
假设我们想对我们使用单茎架构一次生成所有二进制掩码的能力进行压力测试。我们可以做的是将输出维数增加到 2052 ,这样我们就可以在训练期间在输出端呈现所有 4 个二进制掩码。然而,输出维数的增加将使参数总数增加到大约 0.5M。这并不一定是一个问题,但是,就像有人说的那样“解耦你的假设!” 一天 3 次,先看看我们在可比条件下训练这个模型会发生什么。
有许多不同的方法可以减少参数的数量。例如,我们可以将输出前最后一个 FC 层的维度从 256 减少到 77,如下所示:
在训练期间,我们在输入端呈现 X(mix ),在输出端呈现所有 4 个词干的二进制掩码的串联。这里需要指出几点:
- 这个模型现在必须弄清楚如何分享它的权重,以满足每个茎干对的要求:它自己的二元掩码。然而,学习过程现在将是全球性的,而不是特定于 stem 的。
- 1)的一个重要含义是,在某种程度上,我们的茎现在 与竞争重建质量。(不要与我们的二进制化原则混淆 a)其中我们的茎在构建我们的二进制掩码时竞争存在)。即使我们在输出端只有一个向量,模型预测每个词干的二元掩码的能力也会受到其他词干的影响,这是基于:
- 我们的组合和每个词干之间的输入/输出关系在我们的训练集中有多一致。
- 与其他词干相比,每个词干的时频模式一般有多复杂。根据 MSE 损失标准,网络可以“优先考虑”具有更容易估计的掩码的茎,和/或在对其他茎进行重建之前,对某些茎收敛到良好的重建。**
以上两点是部分有效的假设,完全可以讨论。它们来自我们在实验中持续观察到的行为。
型号[ 3 ]:单茎多茎杂交
**
在这种情况下,前两个卷积层是不可知词干的*。该模型在如何在所有 4 个茎干之间共享这些层的权重方面拥有完全的决定权。在第二个卷积层之后,我们创建 4 个分支,每个分支包含 2 个卷积层,每个分支对应一个主干。虽然我们没有明确地告诉模型哪个分支对应于哪个词干,但是模型将被迫根据输出端的目标二进制掩码将每个分支优化为特定的词干。*
这种设计背后的推理是基于在空间域中具有结构化数据的 CNN 的已知行为,其中学习过程衍生为特征的分层分解;从粗糙原始到细致具体。我们的假设是,我们可以通过说服它在词干无关的过滤操作和词干特定的过滤操作之间划分任务,来帮助模型更好地学习。通过检查第一卷积阶段的一些特征图,我们没有观察到明确的词干特定模式。然而,随着我们深入研究,在每个分支的输出端计算的大多数特征图揭示了清晰的茎特定模式。这不应该是一个惊喜,尽管看到它非常酷:)
与模型 2 的情况一样,优化是全局的,而不是特定于词干的。
感觉上,这个模型的结果与模型 1 的结果相当。我要说我们关于这种特殊设计的有效性的假设部分得到了验证,但不是结论性的。
模型[ 4 ]:从头开始训练模型 1 的架构
对于模型 1,我们合并了独立训练的模型,记得吗?
如果我们从头开始训练同样的完整架构会怎么样?
也不错。这里值得一提的几点:
- 在这种情况下,每个分支的任务是特定于 stem 的。例如,人声分支将学习如何隔离人声和人声,因为它的目标二进制掩码和它的权重不共享或连接到任何其他分支。
- 然而,**每个分支的能力学习其分配的任务会受到其他分支的影响……为什么?就像模型 2 和 3 一样,优化是全局的,而不是特定于 stem 的。**在训练期间,将为完整的 2052 维输出向量计算损失,而没有任何约束来对所有词干实施“公正”。这意味着,模型可能再次决定基于难度等级优先考虑某些词干。另一种解读方式是,一些分支可能在其他分支之前收敛到更好的解决方案。
从回归到分类
在第一篇文章中,我解释了我们最初的声音隔离设计是如何成为某种回归-分类混合体的。
“我们要求模型“将输出端的像素”分类为有声或非有声,尽管从概念上来说(以及根据使用的损失函数-MSE-),这项任务仍然是一项回归任务”
通过查看我们的输出表示,是什么阻止我们将我们的问题作为一个分类问题来对待呢?最后,我们需要在输出端的两个离散值 0 或 1 之间做出选择。因此,我们可以将词干分离问题转化为一个多标签分类器。
以声音隔离模型为例,输出维度等于 513。想想这些价值代表什么。我们知道它们都是同一事物的一部分*,对吗?只是二进制掩码中的点,稍后映射到幅度谱,等等&等等……嗯,另一种解释这些值的方式是,它们是 标签或类别,表示不同桶中内容的存在。*
一个类比可能有助于明确这一点:
where ‘fb’ can be defined as ‘frequency bin’ and where each label describes a position or bucket
为了将我们的问题转化为多标签分类器,我们需要做什么改变?
- *我们现在将使用 二元交叉熵 *,而不是使用 MSE 作为损失函数。你可以这样想:,我们现在每个词干有 513 个二元分类器,它们将以单个时间帧的分辨率进行分类。
- 输出前的最后一层应跟随一个s 形激活函数。(我们的 MSE-loss 模型已经是这种情况,但现在它是一个要求)
现在,当我们进行一次推理来估计中间帧的二进制掩码时,我们得到的是给定源按照 频率仓出现**的概率。为了构建最终的二进制掩码,在第一篇文章中描述的滑动窗口和连接机制之前,我们需要通过简单的阈值处理重新二进制化这些输出:**
*predicted_mask[predicted_mask >= 0.5] = 1
predicted_mask[predicted_mask < 0.5] = 0*
将我们的问题视为多标签分类器,与 MSE 损失、基于回归的等效模型相比,在隔离质量方面有了一些显著改善。
最小延迟模式下的中间帧预测与最后一帧预测。
on the left, the input representation we’ve been working with so far. In blue, the timeframe for which we’ll be predicting our binary mask. On the right, an alternative, past-context-only solution for minimum latency.
对于这项工作,实时操作是一个重要的设计约束。这要求我们除了机器学习之外,还要花大量时间做软件架构设计和实现工作。具体来说,我们必须确保两件事:
从信号处理/流水线的角度看实时性
确保以下过程
…【读取音频,将其分段,转换,使用我们的 ML 模型预测二进制掩码,将词干重建回时域,并从估计的词干中提取附加特征,包括开始、音高、转录等…这一切都在立体声中] …
比音频回放速度还快。在追求这一点时,拥有一个快速推理的 ML 模型显然是非常需要的(因此在我们的设计中减少了模型参数的数量),尽管这只是难题的一部分…你好多线程、滑动窗口、缓冲、同步等*。为了实现这一点,我们在 GStreamer 的基础上构建了一个优化的 C/C++管道,这远非没有痛苦,但当我们看到隧道尽头的光明时,这是非常美好的。我们最终的解决方案比回放快了大约 2.5 倍。*
实时传输动态生成的音频
这就是事情变得真实的地方……在第一种情况下,我们关心的只是性能,但是在提前访问输入数据方面没有任何限制。如果您的过程比您的回放或交付速率更快,那么您需要实现所需的排队机制来保存您的数据,以便以后检索。
现在,当您的输入在录制过程中以流的形式传输给您时,会发生什么情况呢?例如,您需要为现场音乐安装执行去混音?嗯,因为你不能再向前看,如果你需要未来的环境来预测现在,你将会引入延迟!那么我们能做些什么来避免(减少)这种延迟呢?
回到我们训练模型的输入输出表示,一个替代方案是仅依靠过去的上下文来学习预测我们的二进制掩码,如左图所示。这样,无论我们的管道有什么样的记录/回放缓冲阶段,我们都可以很好地限制延迟。
最大的问题是:当只依赖过去时,隔离质量会受到影响吗?是的,非常重要!这并不奇怪,因为音乐是时间序列数据。如果我们知道在之前和之后*发生了什么,那么任何给定的时间范围都将更加可预测。然而,这对于我们的目的来说已经足够好了。[现在你可以想象我咆哮着谈论真正特征工程的重要性,就像我在我的第一篇文章中所做的那样…]***
回到我们的 4 个型号,你一定想知道…哪一个更好?
很抱歉这么无聊,但是它们都有各自的优点和缺点…有些型号比其他型号对某些类型的内容和混合条件更敏感。其他方法以重构源的更高退化为代价实现了更好的隔离,等等。总的来说,除了模型 2,他们都很好地学习了这项任务,这可能是因为它的参数数量有限(~300k 参数)和高维输出。在任何情况下,我在这里的目标都不是给你音频源分离的圣杯*(当我到达那里时,我可能会保留给自己:),而是为你提供一些与这个特定问题相关的关键见解和直觉,以及设计一般人工神经网络时的一些考虑。*
根据假设 1,最终的答案是,用于人声的二进制掩蔽方法对低音相对适用,但对鼓和其他不太适用。在大多数情况下,您在鼓中听到的衰减(尤其是在高音/钹中)更多地与二进制掩蔽有关,而不是与 ML 模型有关。在 others 的情况下,同样的二进制掩蔽导致来自其他来源的某种程度的干扰,尤其是人声。你可以在例子中听到这一点,这留下了证据,表明’垃圾入…垃圾出…’ 原则肯定适用于 ML。
最终注释
- 首先,非常感谢花时间阅读这篇文章和/或第一篇关于声音隔离的文章的每一个人。我收到了一些很棒的评论和反馈。让他们继续前进!
- 与我的第一篇文章相关,我发现一些帖子里有人指出了其他类似的工作,我猜他们想知道我是否意识到了。我的答案是肯定的。但是澄清一下,我的作品,包括你在这里看到的演示,实际上是 2016 年的… 那些特别的论文和演示是在那之后。虽然我的重点是应用方面的东西,我很好地跟上时代(并且非常热情!)关于这个主题的所有伟大的学术工作。也就是说,即使在 3 年后,你在这里看到的输出质量也超过了当前许多学术和商业解决方案。
- 然而,如果我今天必须解决这个问题,我可能会探索其他方向,也许是在时域中重复出现的东西,或者是基于 GAN 的渐进设计,以及其他想法。在追求完美隔离的过程中,基于二进制/软屏蔽的解决方案总是会遇到瓶颈。
不要犹豫,留下问题。时间允许的话,我会继续写音频 AI 的东西!
ps:再次感谢 Naveen Rajashekharappa 和 Karthiek Reddy Bokka 对这项工作的贡献。
奖金轨道(我的意思是,茎…)
免责声明:本文所述的知识产权、设计和技术此前已在美国专利 US10014002B2、US9842609B2、US10325580B2 中公开。
音频人工智能:使用卷积神经网络从立体声音乐中分离人声
黑客音乐走向衍生内容的民主化
如果我们能回到 1965 年,拿着“所有人都可以进入”的徽章敲开艾比路录音室的大门,并有幸聆听那些标志性的列侬-麦卡特尼和声 A-五车二,会怎么样?我们在这里输入的是一个中等质量的 mp3,由甲壳虫乐队的演奏。顶部音轨是输入混音,底部音轨是从我们的模型中分离出来的人声。
正式名称为音频源分离,我们在这里试图解决的问题在于恢复或重建一个或多个源信号,这些信号通过一些- 线性 或 卷积- 过程已经与其他信号混合。该领域具有许多实际应用,包括但不限于语音去噪和增强、音乐再混合、空间音频、重新灌制等。在音乐制作的背景下,它有时被称为去混合或去混合。关于这个主题有大量的资源,从基于 ICA 的- 盲- 源分离,到半监督非负矩阵分解技术,再到最近的基于神经网络的方法。为了更好地了解前两个,你可以看看 CCRMA 的系列迷你教程,我发现它在过去非常有用。
但是在开始设计之前…一点点应用机器学习哲学…
作为一个在“*深度学习解决一切”*热潮之前已经在信号和图像处理领域工作了一段时间的人,我将作为一次特征工程之旅来介绍该解决方案,并向您展示为什么对于这个特定的问题,人工神经网络最终成为最佳方法。为什么?我经常发现人们写下这样的东西:
“有了深度学习,你再也不用担心特征工程了;这就去做"
或者最差…
“机器学习和深度学习的区别 < 让我就此打住……深度学习还是机器学习! > 在 ML 中你做特征提取,在深度学习中它在网络内部自动发生”。
这些概括,可能来自于 DNNs 在学习好的潜在空间方面非常有效的事实,是错误的。我很沮丧地看到最近的毕业生和从业者被上述错误观念所说服,并采用’*深度学习解决一切’*方法作为你只是扔一堆原始数据(是的,即使在做了一些预处理后,你仍然可能是罪人:),并期望事情只是按照预期工作。在现实世界中,您的数据不像 MNIST 数据集那样简单、干净和漂亮,而且您必须关心实时性、内存等问题,这些误解会让您在很长一段时间内陷入实验模式…
特征工程不仅在设计人工神经网络时仍然是一个非常重要的学科;在大多数情况下,就像任何其他 ML 技术一样,它将生产就绪解决方案与失败或表现不佳的实验区分开来。对您的数据及其领域的深刻理解仍然可以让您走得更远……
彻底地
好了,现在我已经结束了说教,让我们进入你来的目的吧!就像我在职业生涯中处理的所有其他数据问题一样,我将从提出问题 “数据看起来怎么样”? 。让我们来看看下面一段来自原始录音室录音的歌声片段。
‘One Last Time’ studio vocals, Ariana Grande
不太有趣吧?这是因为我们正在可视化波形或时域信号,我们所能获得的只是信号随时间变化的幅度值。我们可以提取诸如包络、RMS 值、过零率等东西,但是这些特征太过原始*,不足以帮助我们解决问题。如果我们想从混音中提取声音内容,我们应该以某种方式展示** 人类语言的结构,从开始。幸运的是,短时傅立叶变换(STFT) 来拯救我们了。*
STFT magnitude spectrum - window size = 2048, overlap = 75%, log-frequency [Sonic Visualizer]
虽然我喜欢语音处理,我肯定会喜欢浏览源滤波器建模、倒谱、倒频、LPC、MFCC* 等等,但我将跳过所有这些内容,专注于与我们的问题相关的核心元素,以便尽可能多的人能够理解这篇文章,而不仅仅是音频信号处理/语音社区。*
那么,人类语言的结构告诉了我们什么?
我们在这里可以发现三个主要因素:
- 一个基频 (f0),由我们声带的振动频率决定。在这种情况下,阿丽亚娜在 300-500 赫兹范围内歌唱。
- f0 以上的多个谐波,遵循类似的形状或模式。这些谐波以 f0 的整数倍出现。
- 清音语音,包括类似‘t’,‘p’,‘k’,‘s’(不是我们声带振动产生的)、呼吸等辅音。它们在高频区表现为短脉冲。
使用基于规则的方法进行首次拍摄
让我们暂时忘记这个叫做机器学习的东西。基于我们对数据的了解,我们能想出一种方法来提取我们的声音吗?让我试一试…
幼稚人声隔离 V1.0:
- 识别声乐部分。在一个混合体中有很多事情在发生。我们希望将重点放在实际包含有声内容的部分,而忽略其他部分。
- 区分浊音和清音部分。正如我们所看到的,有声语音和无声语音看起来非常不同,因此它们可能需要不同的处理。
- 估计基波频率随时间的变化。
- 基于 3 的输出,应用某种屏蔽来捕捉谐波内容。
- 对无声部分做点别的…
如果我们做得不错,这个过程的输出应该是一个软或二进制* 掩码,当它应用于(元素级乘法)混音的幅度 STFT 时,给我们一个人声幅度 STFT 的近似重建。然后,我们将该人声 STFT 估计与原始混音的相位信息相结合,计算逆 STFT,并获得重建人声的时域信号。*
从头开始做这件事已经是很大的工作量了。但是为了便于演示,我们将使用一个 pYIN 算法的实现。即使它是为了解决第三步,在正确的约束下,它也很好地处理了第一步和第二步,同时即使在有音乐的情况下也能跟踪声乐基础。下面的例子包含了这种方法的输出,没有处理无声部分。
嗯…?它有点成功了,但是恢复的声音质量还没有达到。也许有了额外的时间、精力和预算,我们可以改进这个方法,让它变得更好。
现在让我问你…
当你有多种唱腔时会发生什么,这在今天至少 50%的专业制作的曲目中肯定是这种情况?
人声经过混响、延迟等效果处理后会怎么样?让我们最后一次看看爱莉安娜·格兰德的《T4》的最后一段合唱。
你已经感到疼痛了吗…?我是。
很快,如上所述的特别方法就变成了纸牌屋。这个问题太复杂了。规则太多,规则的例外太多,变化的条件太多(效果和不同的混音设置)。多步骤方法还意味着一个步骤中的错误会将问题传播到下一个步骤。改进每一步都是非常昂贵的,它需要大量的迭代来获得正确和持久,但同样重要的是,我们可能会以计算昂贵的管道而告终,这本身就可能是一个交易破坏者。
在这些场景中,我们需要开始考虑一种更加端到端的方法,让 ML 找出解决问题所需的底层流程和操作的一部分。然而,当谈到特性工程时,我们不会认输,你会明白为什么。
假设:我们可以使用 CNN 作为传递函数,将混音映射到人声
受 CNN 在自然图像上的成就的启发,为什么不在这里应用同样的推理呢?
CNNs have been successful at tasks such as image colorization, deblurring and super-resolution.
最后,我们知道我们可以使用短时傅立叶变换将音频信号表示为图像,对吗?即使这些音频 图像不遵循自然图像的统计分布,它们仍然揭示了我们应该能够从中学习的空间模式(在时间与频率空间中)。**
Mix: you can see the kick drum and baseline at the bottom, and some of the synths in the middle getting mixed with the vocals. On the right, the corresponding vocals-only
当时,验证这项实验是一项昂贵的工作,因为获得或生成所需的训练数据已经是一项巨大的投资。在应用研究中,我总是试图实现的一个实践是首先确定一个更简单的问题,该问题验证与原始问题相同的原则** ,,但是不需要做太多的工作。这允许你保持你的假设更小,迭代更快,当事情不像预期的那样工作时,以最小的影响为中心。**
最初的解决方案起作用的一个隐含条件是一个 CNN 必须能够理解人类语言的结构。一个更简单的问题可以是:给定一个混合片段,让我们看看 CNN 是否可以将这些片段分类为包含有声内容或不包含有声内容。我们正在寻找一个音乐鲁棒的声音活动检测器(VAD) ,实现为二进制分类器。
设计我们的特征空间
我们知道,音乐和人类语音等音频信号嵌入了时间相关性。简单地说,在特定的时间范围内,没有任何事情是孤立发生的。如果我想知道一段给定的音频是否包含人类语音,我可能也应该查看邻近区域。那个时间背景可以给我关于感兴趣区域正在发生什么的好信息。同时,我们希望以非常小的时间增量来执行我们的分类,以便我们能够以尽可能高的时间分辨率来捕捉人类的声音。
让我们做一些数字…
- 采样率(fs): 22050 Hz(我们从 44100 向下采样到 22050)
- *STFT 设计:窗口大小= 1024,跳跃大小= 256,梅尔标度用于感知加权的插值。由于我们的输入数据是*实数,我们可以使用一半的 STFT(原因不在本文讨论范围之内……),同时保留 DC 分量(不是必需的),这样我们就有 513 个频率仓。
- 目标分类分辨率:单个 STFT 帧(~11.6 毫秒= 256 / 22050)
- 目标时间范围:~300 毫秒= 25 个 STFT 帧。
- 训练样本的目标数量:50 万
- 假设我们使用步长为 1 STFT 时间帧的滑动窗口来生成我们的训练数据,我们需要大约 1.6 小时的标记音频来生成我们的 0.5M 数据样本。[如果你想知道更多关于生成实际数据集的细节,请在评论中提问]
根据上述要求,我们的二元分类器的输入/输出数据如下所示:
型号
使用 Keras,我们可以建立一个小的 CNN 模型来验证我们的假设。
**import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.optimizers import SGD
from keras.layers.advanced_activations import LeakyReLUmodel = Sequential()
model.add(Conv2D(16, (3,3), padding='same', input_shape=(513, 25, 1)))
model.add(LeakyReLU())
model.add(Conv2D(16, (3,3), padding='same'))
model.add(LeakyReLU())
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))model.add(Conv2D(16, (3,3), padding='same'))
model.add(LeakyReLU())
model.add(Conv2D(16, (3,3), padding='same'))
model.add(LeakyReLU())
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))model.add(Flatten())
model.add(Dense(64))
model.add(LeakyReLU())
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss=keras.losses.binary_crossentropy, optimizer=sgd, metrics=['accuracy'])**
****
通过 80/20 的训练测试分割,在大约 50 个时期后,我们达到了 97%的测试准确度,这意味着有足够的证据表明我们的 CNN 模型可以区分包含声乐内容的音乐部分和没有声乐内容的音乐部分。通过检查来自第四卷积层的一些特征图,看起来我们的网络已经优化了它的内核来执行两个任务:过滤音乐和过滤人声…
Sample feature maps at the output of the 4th conv. layer. Apparently, the output on the left is the result of a combination of kernel operations that try to preserve vocal content while ignoring music. The high values resemble the harmonic structure of human speech. The feature map on the right seems to be the result of the opposite task.
从 VAD 到源分离
既然我们已经验证了这个简单的分类问题,我们如何从检测音乐中的人声活动一直到从音乐中分离出人声呢?好吧,从我们在开始描述的幼稚的方法中挽救一些想法,我们仍然想要以某种方式结束对人声的幅度谱图的估计。这现在变成了一个回归问题。我们想要做的是,给定一个来自混合的 STFT 的时间帧(具有足够的时间上下文),估计相应的声音时间帧的幅度谱。
训练集怎么样?(此时你可能会问自己)
哦,主啊…那真了不起。我将在文章的最后解决这个问题,这样我们就不会切换上下文了!
如果我们的模型学习得很好,在推理过程中,我们需要做的就是在混合的 STFT 上实现一个简单的滑动窗口。每次预测后,我们将窗口向右移动 1 个时间帧,预测下一个声音帧,并将其与前一个预测连接起来。关于模型,我们可以从使用我们用于 VAD 的相同模型作为基线开始,并且通过进行一些改变(输出形状现在是(513,1),输出处的线性激活,MSE 作为损失函数),我们可以开始我们的训练。
不要宣称胜利……
虽然上面的输入/输出表示有意义,但是在用不同的参数和数据标准化训练我们的声音分离模型几次之后,结果还没有出来。看来我们要求的太多了……****
我们从二元分类器转向尝试在 513 维向量上做回归。尽管网络在一定程度上学习了该任务,但是在重构人声的时域信号之后,存在来自其他源的明显的伪像和干扰。即使在添加更多层和增加模型参数的数量后,结果也不会有太大变化。
于是问题变成了:我们能不能欺骗网络让它认为*它正在解决一个更简单的问题,并且仍然能达到预期的结果?*
如果我们不是试图估计人声的幅度 STFT,而是训练网络来学习一个二进制掩码,当它应用于混音的 STFT 时,会给我们一个简化但感知上可接受的人声幅度谱图估计呢?
通过试验不同的试探法,我们想出了一个相对简单的(从信号处理的角度来看肯定是非正统的)方法来使用二进制掩码从混音中提取歌声。在不涉及太多细节的情况下,我们将把输出视为二进制图像,其中值“1”表示在给定频率和时间帧位置主要存在声乐内容**,值“0”表示在给定位置主要存在音乐。视觉上,它看起来很不美观,但是在重构时域信号时,结果却出乎意料地好。**
Binary masking (or TF masking) techniques have been around for decades and have been proven very effective in specific audio source separation and classification problems. However, most available techniques have been optimized for speech enhancement / recognition applications and fall short when it comes to real-world data such as professionally-produced & mastered music. Our binarization method was specifically designed for this scenario.
我们的问题现在变成了某种回归分类的混合体。我们要求模型“将输出端的像素”分类为有声或非有声,尽管从概念上来说(以及根据所使用的损失函数-MSE-),该任务仍然是一个回归任务。
虽然这种区别对某些人来说似乎无关紧要,但它实际上对模型学习指定任务的能力产生了巨大的影响,第二种方法更简单,也更受限制。同时,考虑到任务的复杂性,它允许我们在参数数量方面保持我们的模型相对较小,这是实时操作非常需要的,这是这种情况下的设计要求。经过一些小的调整,最终的模型看起来像这样。
****
我们如何重建时域信号?
基本上,如天真T2【方法】一节所述。在这种情况下,对于我们所做的每一次推理,我们都预测了人声的二进制掩码的单个时间帧。同样,通过实现一个简单的滑动窗口,一个时间帧的跨度,我们不断估计和连接连续的时间帧,最终组成整个人声二进制掩码。
创建训练集
如你所知,有监督的机器学习中最大的痛点之一(抛开所有那些有可用数据集的玩具例子不谈)是拥有针对你试图解决的特定问题的正确数据(数量和质量)。基于所描述的输入/输出表示,为了训练我们的模型,我们首先需要大量的混音及其对应的、完全对齐和标准化的声道。建立这个数据集的方法不止一种,在这里我们使用了多种策略,从手动创建带有一些网上找到的 acapellas 的混合<>声乐对,到寻找 RockBand stems,再到浏览 Youtube。为了让您了解这个耗时且痛苦的过程,我们的“数据集项目”包括创建一个工具来自动构建 mix <>人声对,如下图所示:
我们知道网络需要大量数据来学习将混音映射到人声所需的传递函数。我们最终的数据集由大约 1500 万个大约 300 毫秒的混音片段及其相应的人声二进制掩码组成。
流水线架构
为给定的任务建立机器学习模型只是交易的一部分。在生产环境中,我们需要考虑软件架构、管道和优化策略,特别是当我们处理实时时。
对于这个特殊的问题,可以在预测完整的人声二进制掩码(离线模式)后立即进行时域重建,或者更有趣的是,作为多线程管道的一部分,我们在小片段中进行采集、处理、重建和回放,从而使其成为流友好的,甚至能够以最小的延迟对正在录制的音乐进行实时解构。鉴于这本身就是一个完整的主题,我将把它留给另一篇关注实时 ML 管道** …**
我想我已经讲得够多了,我们为什么不再听几个例子呢?
蠢朋克——走运(工作室)
we can hear some minimal interference from the drums here…
阿黛尔——放火烧雨(现场录音!)
Notice how at the very beginning our model extracts the crowd’s screaming as vocal content 😃. In this case we have some additional interference from other sources. This being a live recording it kinda makes sense for this extracted vocal not to be as high quality as the previous ones.
好的,那么还有“最后一件事”…
既然这适用于人声,为什么不把它应用到其他乐器上呢?
这篇文章已经足够广泛了,但是鉴于你已经做了这么多,我想你应该看看最后一个演示。利用提取声乐内容的完全相同的推理,我们可以通过对我们的模型进行一些修改,当然,通过适当的训练集,尝试将立体声轨道分割成主干(鼓、低音线、声乐等:)
准备好再去兔子洞了吗?下面是第二部分!
** [## 音频人工智能:使用卷积神经网络从立体声音乐中分离乐器
黑客音乐走向衍生内容的民主化
towardsdatascience.com](/audio-ai-isolating-instruments-from-stereo-music-using-convolutional-neural-networks-584ababf69de)
感谢阅读,不要犹豫,留下问题。我会继续在音频 AI 上写文章,敬请期待!最后,您可以看到我们最终构建的实际 CNN 模型并没有那么特别。这项工作的成功是由对特征工程方面的关注和对假设验证实施精益流程推动的,这是我将在不久的将来写的东西!
ps:感谢 Naveen Rajashekharappa 和 Karthiek Reddy Bokka 对这项工作的贡献!**
使用预训练的 VGG-19 (Keras)进行音频分类
在这篇文章中,我将针对音频分类的问题。我将根据预先训练的 VGG-19 从音频波形中提取的特征训练一个 SVM 分类器。这篇文章背后的主要思想是展示预训练模型的力量,以及应用它们的容易程度。
我想在真实世界的数据上评估这种方法。于是我想到把超跑和重型自行车的音频分类。下面是我创建这个分类器的步骤:
从 Youtube 下载音频文件
首先,我选择了我想要音频的 youtube 视频,然后我使用下面这段代码下载了. mp3 格式的音频文件。
**from** __future__ **import** unicode_literals
**import** youtube_dl
ydl_opts = {
**'format'**: **'bestaudio/best'**,
**'postprocessors'**: [{
**'key'**: **'FFmpegExtractAudio'**,
**'preferredcodec'**: **'mp3'**,
**'preferredquality'**: **'192'**,
}],
}
**with** youtube_dl.YoutubeDL(ydl_opts) **as** ydl:
ydl.download([<youtube video link>])
# for bike sounds : [https://www.youtube.com/watch?v=sRdRwHPjJPk](https://www.youtube.com/watch?v=sRdRwHPjJPk)#forcar sounds : [https://www.youtube.com/watch?v=PPdNb-XQXR8](https://www.youtube.com/watch?v=PPdNb-XQXR8)
将音频文件从. mp3 转换为。wav
下载了. mp3 文件后,我把它们转换成了。wav 文件,使用下面这段代码。
**from** pydub **import** AudioSegment
sound = AudioSegment.from_mp3(**"car.mp3"**)
sound.export(**"car.wav"**, format=**"wav"**)
提取音频块
下一步,我从。wav 文件。
**from** pydub **import** AudioSegment
**import** os
**if not** os.path.exists(**"bike"**):
os.makedirs(**"bike"**)
count=1
**for** i **in** range(1,1000,15):
t1 = i * 1000 *#Works in milliseconds* t2 = (i+15) * 1000
newAudio = AudioSegment.from_wav(**"bikes.wav"**)
newAudio = newAudio[t1:t2]
newAudio.export(**'bike/'**+str(count)+**'.wav'**, format=**"wav"**) *#Exports to a wav file in the current path.* print(count)
count+=1
绘制振幅波形
下一步是绘制这些音频的波形。这是用下面的代码完成的。
**from** scipy.io.wavfile **import** read
**import** matplotlib.pyplot **as** plt
**from** os **import** walk
**import** os
**if not** os.path.exists(**"carPlots"**):
os.makedirs(**"carPlots"**)
car_wavs = []
**for** (_,_,filenames) **in** walk(**'car'**):
car_wavs.extend(filenames)
**break
for** car_wav **in** car_wavs:
*# read audio samples* input_data = read(**"car/"** + car_wav)
audio = input_data[1]
*# plot the first 1024 samples* plt.plot(audio)
*# label the axes* plt.ylabel(**"Amplitude"**)
plt.xlabel(**"Time"**)
*# set the title
# plt.title("Sample Wav")
# display the plot* plt.savefig(**"carPlots/"** + car_wav.split(**'.'**)[0] + **'.png'**)
*# plt.show()* plt.close(**'all'**)
提取特征和训练直线 SVM
一旦我有了汽车和自行车的这些波形,我就从这些图像中提取特征,将它们输入 LinearSVM 进行分类。为了提取特征,我使用了 VGG-19 的预训练模型,并从展平层提取图像的抽象特征。提取这些特征后,我创建了一个 70-30 的训练测试分割,并训练了一个 LinearSVM。下面是代码。
**import** os
**from** keras.applications.vgg19 **import** VGG19
**from** keras.preprocessing **import** image
**from** keras.applications.vgg19 **import** preprocess_input
**from** keras.models **import** Model
**import** numpy **as** np
base_model = VGG19(weights=**'imagenet'**)
model = Model(inputs=base_model.input, outputs=base_model.get_layer(**'flatten'**).output)
**def** get_features(img_path):
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
flatten = model.predict(x)
**return** list(flatten[0])
X = []
y = []
car_plots = []
**for** (_,_,filenames) **in** os.walk(**'carPlots'**):
car_plots.extend(filenames)
**break
for** cplot **in** car_plots:
X.append(get_features(**'carPlots/'** + cplot))
y.append(0)
bike_plots = []
**for** (_,_,filenames) **in** os.walk(**'bikePlots'**):
bike_plots.extend(filenames)
**break
for** cplot **in** bike_plots:
X.append(get_features(**'bikePlots/'** + cplot))
y.append(1)
**from** sklearn.model_selection **import** train_test_split
**from** sklearn.svm **import** LinearSVC
**from** sklearn.metrics **import** accuracy_score
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42, stratify=y)
clf = LinearSVC(random_state=0, tol=1e-5)
clf.fit(X_train, y_train)
predicted = clf.predict(X_test)
*# get the accuracy* print (accuracy_score(y_test, predicted))
这个简单的模型在测试集**上取得了 97% 的准确率。**这显示了这些预先训练的模型有多么强大,以及任何人都可以使用它们来创建工具。
我能想到的一个应用是创建一个 chrome 扩展,它可以判断网页上的视频音频是否包含明显的噪音。我鼓励阅读这篇文章的初学者思考一个新问题,并用这里介绍的方法解决它。
具有深度学习的自动化吉他转录
使用卷积神经网络加速学习音乐。
Photo by Jacek Dylag on Unsplash
这篇文章概述了使用 Python、TensorFlow 和 Keras 从音频文件中自动转录吉他的实现,并详细介绍了执行的表层方法。为了进行训练,使用了吉他集数据集,因为它有大量带有相应标签的孤立吉他录音。请注意,这个项目的大部分方向是由 NEMISIG 2019 的一张研究海报提供的,在这里找到。
背景
如果你熟悉卷积神经网络(CNN),那么你可能听说过它们在用于计算机视觉的图像处理和分析方面的潜力。我们希望利用 CNN 的这一功能来输出吉他标签;因此,首先需要使用常数 Q 变换将输入音频文件转换成声谱图图像。
为什么是常数 Q 变换?
为了理解使用常数 Q 变换而不是傅立叶变换来选择频率和创建输入图像的好处,我们必须研究音符是如何定义的:
在音符列中,音符由左边的字母标识,右边的数字代表当前的八度音阶。下面是音符 c 的前六个八度音阶的频率(Hz)图。
我们可以看到,每个连续的八度音程的频率是前一个八度音程的两倍。由于一个八度音程跨越十二个音符,所以我们知道每十二个音符,频率必然加倍,可以用下面的公式表示[1]:
通过绘制这种关系,我们可以看到下图显示了一条指数曲线:
由于这种指数性质,常数 Q 变换比傅立叶变换更适合拟合音乐数据,因为它的输出是振幅对对数频率。此外,常数 Q 变换的精度类似于对数标度,并模拟人耳,在较低频率下具有较高的频率分辨率,在较高频率下具有较低的分辨率[1]。
在 Python 中应用常数 Q 变换
使用 libROSA 库,常量 Q 变换可以很容易地应用于 python 中的音频文件。
通过从指定的开始时间( start )到持续时间( dur )遍历吉他数据集的每个音频文件,并将输出保存为图像,我们可以创建训练 CNN 所需的输入图像。对于这个项目, dur 被设置为 0.2 秒, start 被设置为从零增加到每个音频文件的长度,增加的持续时间如下:
注意,当被用作 CNN 的输入图像时,颜色方案首先被转换成灰度。
培训解决方案
对于每个常数 Q 变换图像,必须有一个解,以便网络可以调整它的猜测。幸运的是,吉他数据集包含作为 MIDI 值播放的所有音符、每个音符在录音中开始的时间以及每个音频文件的音符持续时间。注意:下面的代码片段被放在一个函数中,这样它们可以用于每 0.2 秒的音频。
首先,必须从 jams 文件中提取在加载的 0.2 秒音频中播放的唯一音符(作为 MIDI 音符检索)。
一次只能演奏六个音符(每根弦最多一个音符);因此,代码通常会重复六次。
首先,在变量 Fret 下创建表示吉他的 6 根弦和 18 个品的 MIDI 值的矩阵(6,18):
[[40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57]
[45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62]
[50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67]
[55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72]
[59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76]
[64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81]]
然后使用音柱确定在吉他上检索到的唯一音符的所有可能位置,下面的矩阵显示了一个可能的解决方案:
[[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1]
[0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0]
[0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0]
[0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
必须确定音品和琴弦组合的所有可能的解决方案。创造了“手指经济”的概念——和弦的最低音,根音,与和弦中的其余音进行比较,其中每个音来自根音的品数(不考虑弦)相加,以产生“手指经济”数。具有最低“手指经济”数的解决方案被选为正确的弦形状。
虽然这种方法并不总是与录音中正在演奏的和弦的正确版本相匹配,但它不会对 CNN 的性能产生负面影响,因为在开放位置演奏的 c 大调和弦与在第八品上演奏的 c 大调和弦并无不同。
随后使用最终解决方案中的琴弦和音品阵列的组合来选择最终解决方案:
此外,在每一行的第一列中,如果存在注释(行中的 1),则附加零,反之亦然,如果注释不存在。这样做是为了让 softmax 函数在没有音符演奏的情况下仍然可以为弦乐选择类别。
前面的代码片段返回数据,使得输出类似于类别的一键编码,对于每 0.2 秒的音频,返回以下矩阵格式:
[[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]]
上面的矩阵是吉他选项卡解决方案,从吉他数据集随机选择 0.2 秒。每个矩阵形状是(6,19),其中六行对应于每个吉他弦(eBGDAE 从上到下)。第一列标识弦是否未被弹奏,第二列标识开放弦是否被弹奏,第三至第十九列标识从第一品开始弹奏的特定品。训练时,这个矩阵被分成六个独立的数组来训练模型的每个头部。
模型架构和培训
Keras functional API 用于创建以下多任务分类模型,在训练和测试数据中采用 90/10 分割。该模型有六个任务(eBGDAE 弦乐)来确定弦乐是否未演奏、打开或正在演奏音符。对于这六个输出中的每一个,应用 softmax 激活以及分类交叉熵损失函数。添加脱落层以减少过度拟合。
该模型运行 30 个时期,并记录每个字符串的最终精度。
结果
该模型没有使用完整的吉他数据集音频文件,但是使用了足够数量的输入文件,总共 40828 个训练图像和 4537 个测试样本。
每个字符串的精度被确定为:
Test accuracy estring: 0.9336566011601407
Test accuracy Bstring: 0.8521049151158895
Test accuracy Gstring: 0.8283006392545786
Test accuracy Dstring: 0.7831165967256665
Test accuracy Astring: 0.8053780030331896
Test accuracy Estring: 0.8514436851100615
其平均准确率为 84.23%。
结束语
这个模型还没有准备好开始创建全长吉他琴谱,因为几个问题仍然挥之不去。当前模型尚未考虑音符保持的持续时间,并将继续在代码中指定的持续时间内重复制表符。此外,由于和弦可以有不同的变化,每个变化都包含相同的音符,因此该模型无法识别何时使用特定的发音-这可能会证明不方便-但不是一个重大问题。然而,该模型正确标记音频片段的能力是一个了不起的发展。
参考
[1]c . schrkhuber 和 Anssi Klapuri,用于音乐处理的 Constant-Q 变换工具箱 (2010),第七届声音和音乐计算会议。
增强现实(AR)趋势:2021 年的过去、现在和未来预测
Augmented Reality (AR) Trends
2020 年已经过去,在增强现实领域留下了一些密集的增长记录。这项技术肯定会通过开发更多的雏鸟项目继续在软件领域发展,并出现在大规模产品中。2018 年,许多公司体验了各种增强现实原型以及 POC 概念。
许多创新项目向世界表明,增强现实具有非常好的商业价值和未来潜力。大型企业正在见证增强现实的增长,他们已经计划使用 AR 开发他们即将到来的项目。
专家们正试图将基于增强现实的项目转化为实时客户应用。2021 年的增强现实预测称,AR 技术将继续增长,并加快步伐,打破所有头条新闻。
增强现实的发展确实在进步
ar 是类型的技术之一,最初由萨瑟兰于 1968 年开始,他在头戴式显示系统的构建中使用了 AR。就增强现实的发展而言,它已经迅速用于商业、物流、游戏、制造、零售行业等领域。AR 曾经是一种活动,可以通过其视觉覆盖轻松促进任何业务的增长。
许多组织已经使用增强现实技术进行了实验,结果让他们大吃一惊。报告称,通过构建一个基本的 AR 项目,准确率提高了 90%,时间消耗减少了 30%。该项目得到了进一步的管理,效率后来通过 DHL 得到了提高,使其达到了 25%,并在更广泛的推广中继续增长。
如今,增强现实几乎适用于所有的建筑行业。报告证明,大多数关于增强现实的反馈都是积极的,因为就设计师和客户而言,这是一个非常透明的过程。
增强现实对未来的洞察
1。AR 与人工智能(AI)的密切关系
人工智能对于增强现实的操作非常重要。AR 允许在观看者的视觉视角中标记和识别对象。我们今天使用的许多社交媒体应用程序都是结合增强现实和人工智能开发的。例如,在 Instagram 和 Snapchat 上有各种各样的有趣的滤镜,比如狗滤镜、兔子耳朵、猪滤镜等等。它们基于面向消费者的应用程序。
除非并且直到 AI 和 AR 都被组合和操作,否则这些应用不会起作用。我们肯定会看到并开始使用更多的社交媒体应用程序,它们具有图像增强等功能。
- AR 在教学和培训方面
培训和教学技术都属于教育领域。通过使用增强现实技术,任何信息或数据都可以实时传递给学习者。这些系统提供了更好的视觉感受,并能找出最终导致最佳实践的物体和危险。增强现实已经证明了它的价值,它降低了训练的风险和成本。2021 年,我们将看到使用增强现实技术并使用更昂贵的设备和工具进行工作的行业快速增长。
3。AR 与虚拟现实的联系
脸书是最常用的社交媒体应用之一,它相信增强现实和虚拟现实环境。 AR vs VR 也是时下病毒式的话题。
增强现实将人们联系在一起,在虚拟现实的帮助下使他们社会化。虚拟现实和增强现实一起开发了“电话会议”,用户可以看到彼此,同时也可以相互交流。
这些电话会议也可以同时承载两个以上的人。所有这一切碰巧都是因为增强现实和虚拟现实之间的联系才成为可能。随着这两个平台的结合,一个名为 Spatial 的先驱已经为 AR 设备的使用铺平了道路。
这些工具和设备允许用户见证插针板和白板。增强现实和虚拟现实共同作用于基于设计的文档,这些文档位于实时对象之上。在 2021 年,我们可能会看到用户通过使用虚拟现实见面和社交。还有一个关于这些系统在 VR 和 AR 头戴设备销售方面增长的预测。2021 年将是令人兴奋的一年,等待和体验现实世界中人们之间的互动。
4。AR 正在赶超汽车行业
自动驾驶汽车可能还需要几年时间才能成为现实。与此同时,许多汽车公司正在利用增强现实和人工智能技术来标志他们在市场上的存在。汽车行业是增强现实业务的到来。在 2021 年,我们将会看到语音助手方面的发展,比如 Siri 。汽车中的增强现实技术也会有所增长。
汽车公司目前正在借助摄像机镜头,在汽车周围的仪表板上显示图形。这项技术有可能减少事故的发生,因为它有能力指出危险以及沿途的历史地标。
看到基于 AR 技术的公司取得的成果,特斯拉、丰田、奔驰和沃尔沃等大型汽车公司已经签署了在这个平台上工作的合同。增强现实技术也有能力保护汽车挡风玻璃上的 AR 数据。
在增强现实技术的帮助下,我们还可以体验常用车道的识别、导航提示、危险检测、正确方向信息等。
通过使用 AR 技术,公司可能会制定策略来改善驾驶员的安全状况。这些策略将允许驾驶员将全部注意力集中在道路上,同时浏览显示在手机屏幕上的反馈。这个过程还可以增加驾驶员在车辆中的舒适程度,并且他可以方便地驾驶他的汽车。
即将推进的 AR 趋势
因此,这里有一些我们期待很快成熟和流行的增强现实趋势。
a)移动 AR 是秀塞
随着基于耳机的 AR 的推出,出现了更多使用增强现实进行测量、可预测跟踪、改进渲染和 3D 检测的进步。苹果已经展示了他们的一些经验,通过使用一种新的文件格式来检测物体来共享 AR 空间。
这种格式被称为 USDZ 或通用场景描述。这种格式对第三方软件可能比以往更加开放。
b) AR 提供自然体验
大家都在等着看手势识别的改进。有些问题,比如凝视的方向,是很有趣的。为了给用户提供自然的体验,最好制造一种方便的产品。例如,当用户只是看着一个物体,它就会立即被检测到,这将会非常有趣。这是我们可以在现实生活中通过消除一个人转头的工作来实现的。
目前,很少有公司专注于最小化跟踪延迟,这是最新 AR 设备中的主要问题之一。这些问题不会持续超过一毫秒,但是它们仍然会给用户带来一定程度的不适。2021 年,我们将看到更多问题在增强现实测试的帮助下得到解决,因为它可能会跟踪任何东西。
c) AR 迎来扩展现实(XR)
扩展现实是一种我们可以数字化改变现实的形式。XR 由思维现实、虚拟现实和增强现实组成。“扩展现实”缩写中的字母“X”代表了上述所有字母。
所有这些现实在其目的和起源上都是独特的。他们的界限有时会被删除,他们重叠的相似之处会变得更加明显。我们相信今年 2021 年将会成功利用所有这些现实。这是增强现实的顶级趋势之一。
d) XR 的重点仍然是在娱乐领域
娱乐领域目前正在尽可能地利用增强现实和扩展现实以及虚拟现实的领域,今年肯定不会后退一步。XR 有充分的潜力在未来几年在娱乐领域生存下去。
苹果在游戏中使用增强现实,而其他公司则将其用于教育目的。我们将继续见证移动 AR 在业务和软件开发方面的快速增长。
AR 市场为现代化创新解决方案铺平道路
如果你有一个有意义的想法,可以增加产品的产量和销量,那么增强现实技术已经准备好以其现代化和创新的能力带你走向成功。随着增强现实领域的快速发展,你的想法将会占上风,并获得超越其艺术结构或领域的胜利。
许多被市场抛弃的想法现在又重新出现,只是因为使用了卓越的增强现实技术和趋势。例如,在室内导航设计中面临的问题,如场景的定位、起点和终点、标记等,现在正以很高的速度返回来解决并进入市场。
随着时间的推移,这些技术将在增强现实的帮助下得到改进和完善。市场总是对那些在他们的想法中利用增强现实的人开放。
f) AR 导致进化而非革命
2018 年可能不是增强现实的突破时期,但苹果等许多顶级公司正在尽最大努力,通过实施更好的想法,将增强现实带入跨平台环境。
让 AR 直接出现在浏览器中,这是苹果目前正在努力的一个想法,预计甚至在 2021 年就会有一些创新。这将消除下载移动应用程序的需要。我们非常急切地等待 XR 技术在应用后为企业服务的方式。在技术专业知识稳步增长的情况下,必须正确和精确地使用算法进行增强现实开发。
前进
许多技术专家正在考虑 AR,因为它被认为在几乎每个应用领域都取得了成功。几乎任何问题都可以在增强现实解决方案的帮助下迎刃而解。当谈到使用增强现实开发应用程序时,很明显它提供了如此好的机会来愉悦用户体验。通过包括增强现实的使用,我们可以在多个领域带来更多的进步,尤其是考虑到增强应用程序开发的未来。
UX 的设计师们已经开始使用增强现实技术趋势来改进他们的设计。这种增强现实技术无疑会给 UX 专家带来很多优势。UX 的专业人士正试图提高设备的能力,以利用其在 IT 世界的进步。
因此,今年充满了许多惊喜,等待着通过使用 ar 技术提高任何对象的当前质量、效率和生产率。做好准备,见证 AR 技术单独或与虚拟现实和人工智能相结合的发展。
用机器学习的合成数据扩充分类数据集。
在扩充的合成分类数据中进行标签验证的高斯混合模型。
考虑一个假设但常见的场景。您需要构建一个分类器来将样本分配给一个群体组。你有一个相当大的一百万样本的训练数据集。已经清洗、准备好并贴好标签。少数连续变量已经标准化,而代表大多数特征的分类变量使用一次性编码方案推出。现在构建一个简单的神经网络分类器,或者一个随机的 forrest,或者你的箭筒中的另一个首选方法应该是轻而易举的。但是由于您是一名彻底的数据科学家,您对数据集进行了快速的描述性分析,并发现了一个问题。不平衡的基本利率。
人口映射到 10 个类别,但其中两个代表 98%的数据。剩下的八个类只覆盖了可怜的 2 %,几乎不足以让你的统计模型舒适地收敛。你能做什么?
一种方法是增加数据并为代表性不足的类别合成新的样本,目的是平衡基本速率。该方法非常简单,常用于图像分类。每幅图像都被裁剪、旋转、移动多次,以增加分类器学习的可用样本数量。有一个软保证,图像的微小扰动不会改变分类标签。所以这项技术非常有效。为什么不对我们的连续和分类变量数据集使用类似的方法呢?难道我们不能随机地,但分钟地扰动数据集,并扩大我们的代表性不足的类吗?
我们不能。事实上,我们可能会遇到大麻烦。虽然扩充图像通常保留了像素之间的关系,从而保留了标签分配,但是用大部分二进制分类特征扰乱数据集会将被扰乱的样本转移到完全不同的类别中。例如,考虑跑步者和游泳者的数据集,然后考虑在 0 或 1 之间随机翻转性别特征。这种干扰可能会在增强期间将女性游泳运动员移动到男性游泳运动员类别中,但不会改变标签。最后,一双没用的泳裤可能会被推荐给那些寻找连体泳衣的人。
我将描述一种解决标签转换的方法,这种方法在过去为我们的项目发挥了作用。这个想法的主旨是
- 从代表性不足的类别中选择所有样本
- 将子集中的每个类复制 N 次,以获得合理的表示
- 使用分布的平均值和标准偏差作为扰动界限,随机扰动每个子集中的要素,并对分类值归一化为 0 和 1
- 验证每个新样本属于正确的类别,或者使用高斯混合模型和 Mahalanobis 距离重新分配到新的类别。
实现的实际机制与上面的元算法略有不同,但保留了理论结构。我们接下来会讨论。
样本分析的高斯混合模型。
出于直觉,让我们将高斯混合模型(GMM)视为 K-均值聚类的推广,因为大多数人在某个时候都使用 K-均值。一个区别是 GMM 考虑了多维分布的椭球形状,并允许每个样本的多分量分配,而 K-Means 基于球形分布假设和单分量分配。我将不讨论 GMM 背后的理论,而是将它们的好处用于我们的事业。
Mahalanobis 距离(MD)是一个多维度的概括,它表示样本与分布平均值之间的标准偏差。该度量是无单位的和尺度不变的,并且它尊重数据的椭圆形状,随着样本沿着每个主分量轴远离平均值而增加。这里我想插入一些 LaTex 代码来说明这个函数,但是 Medium 不支持它:-(。
提醒一下,我们的目标是通过扰动现有样本来合成新的类样本,以便平衡成功分类器训练的基本速率。我们的问题是大量的分类特征使得扰动不稳定——分类特征的小变化可能导致标签的大变化——新样本可能成为不同类别的成员。因此,我们必须验证每个新样本,如果扰动将样本转移到新的类别,则重新分配新的标签。
下面是我们在 N = 10 的 N 类例子中是如何做的。我假设你对转基因大豆和熊猫有一些经验。Python 警察注意:代码是为了清晰而写的,而不是为了效率——是的,有冗余,而且确实有更好的方法来做事。
1)在任何扩充之前,让我们训练 10 个单独的单分量高斯混合模型。我们从每个类别中提取所有样本的子集,然后为每个类别连续训练单个 GMM,并将μ和σ值存储在字典中。我们将使用scikit
实现 GMMs。
2)让我们计算每个分布的平均 Mahalanobis 距离(MD ),稍后我们将使用它进行成员资格检查。
3)让我们使用 Mahalanobis 距离(MD)作为健全性检查,以验证我们已知样本的子集映射到由新训练的 GMM 表示的其对应的类。这里的想法是计算从每个样本到所有 GMM 的 Mahalanobis 距离。最小距离给出了我们将样本分配到的类别。我们使用正确和不正确的赋值来计算准确度。注意:如果已知样本映射的精确度很低,那么你的类就不容易分离,这种方法就不起作用。我们的目标是 90%的准确率作为下限,但是准确率目标应该取决于您的问题的具体情况。
4)将所有代表性不足的类别提取到单独的子集中,并捕获每个类别的分布统计。我们将使用平均值和标准偏差值作为参数,使用高斯先验为每个类别随机生成新样本。这相当于干扰现有的样本集。这实际上偏离了我之前介绍的元算法,但实现了相同的目标。
5)迭代新样本,并测量每个 GMM 的 MD。最小 MD 将表示课程分配。如果新样本最接近正确的 GMM,则保留类别标签。如果新样品最接近不同的 GMM,则首先检查样品的 MD 是否在我们在步骤 2 中为该 GMM 计算的平均值范围内。如果是,则重新分配样本类;否则,丢弃样品。
这一过程通过可靠的标签保存增加了连续和分类数据。从概念上讲,该过程类似于机器视觉中广泛使用的图像增强。然而,许多数据集不适合这种方法。你要了解你的数据,合理判断一次成功隆胸的概率。
这种方法帮助我们用不平衡的数据集训练分类器,这些数据集可以很好地推广到看不见的数据。我希望它对你的工作有用。
用数据科学充实投资分析师
基本面投资如何受益于机器学习
基本面投资包括建立一个世界如何旋转和走向的理论,然后确定与战略愿景一致的相关投资。第二部分可能相当乏味,因为它意味着梳理符合该战略的数百到数千家公司的财务指标,以确定定价过低或过高的投资,然后分别买入或卖出。本文将展示如何将机器学习模型与基本投资策略相结合,以允许分析师以透明和可解释的方式衡量他们的投资论点。建模将通过 AuDaS 完成,这是一个易于访问和使用的数据科学之旅使能器。
免责声明:此信息仅供参考。它不构成也无意构成任何金融工具买卖的投资建议或要约或邀约,也不作为任何交易的官方确认。不保证所有市场价格、数据和其他信息的完整性或准确性,如有变更,恕不另行通知。
下载数据
财务比率数据是使用以下简单脚本从晨星获取的:
datadict={}
用于报价器中的名称:
用于范围(10)中的尝试:
尝试:
data dict[name]=(PD . read _ CSV(http://financials.morningstar.com/ajax/exportKR2CSV.html?t='+name ,skiprows=2))
除:
print(‘带’+name+‘的错误-重试’)
time . sleep(0.3 *尝试+0.5)
else:
break
else:
print(‘无法导入’+name)
为了简单起见,我从最初的 100 个特性中抽取了 22 个。
投资论点
对于每家公司,如果是好的投资,我们给 1 分,如果不是,给 0 分。分数是根据一个非常简单的 T21 理论得出的,即如果一只股票的每股收益在第二年增加,那么这只股票就是好股票。当我们考虑年度财务数据时,我们也将在几年内拍摄公司的年度快照,以建立一个合理平衡的数据集。这也说明了一个事实,即一项投资并不总是多年保持良好!
我们现在想用 AuDaS 建立一个分类器,它已经学习了输入和分数之间的关系,以预测哪些投资值得持有。
数据预处理
这是上传到 AuDaS 的数据快照。
在对数据集进行初步分析后,AuDaS 能够识别出支付率%栏中的一些缺失值,这引发了一些关于如何纠正它的建议。当派息率缺失时,这仅仅意味着没有股息返还给投资者,因此我们可以用 0 来填充缺失的值。奥达斯使得按照建议行动变得非常容易。
应用该建议会在数据工作流中添加一个用于审计目的的步骤,如果需要,该步骤也可以反转。
然后,我们可以查看直方图视图,直观地了解我们的“好”和“坏”公司在财务比率中的分布情况。
似乎没有一个清晰的模式,但希望 AuDaS 能够为我们找到一个机器学习模型,准确地映射变量之间的动态!
构建模型
在 AuDaS 中,我们只需要指定我们希望预测 score 列,因为它已经自动排除了 ticker 列(因为它具有级别标识)。此外,AuDaS 为训练模型提供了一个健壮的框架,该框架不会过度拟合,并且可以在生产中工作。
AuDaS 中的建模由 Mind Foundry 的专有优化器OPTaaS 提供支持。它使用贝叶斯方法,从每次迭代中学习什么可行,什么不可行,从而更有效地收敛到最佳解决方案! OPTaaS 作为单独产品提供(可从我的 个人资料 中获得试用链接),目前由全球量化对冲基金和量子计算机使用!
经过几次迭代后,AuDaS 已经找到了一个简单的随机森林分类器,其分类准确率为 67%。
AuDaS 还提供了相关特性和各种性能统计数据。在我们的案例中,似乎每股账面价值对得分的影响最大,其次是派息率%和每股收益。
做预测
AuDaS 构建的模型既可以在平台内使用,也可以通过应用程序或 excel 电子表格进行部署。然后我从晨星拿了微软 2018 年的财务数据,让奥达斯预测它的分数。
AuDaS 使用 LIME 来解释每个特征对预测的影响。正如你所看到的,特性之间的错综复杂比预期的更复杂,这表明分析师在没有机器学习的情况下很难做出结论!
聚集股票
然后,我们可以通过要求 AuDaS 对公司进行聚类来扩展分析。AuDaS 使用 K 均值聚类确定了 8 个聚类:
在构建投资组合时,此分析可用于最终风险分析。
这里没有介绍的其他相关用例可能是:
- 预测公司收入以得出估价
- 为贸易结算预测贸易失败
- 依赖分销策略的基金的营销/销售优化
您可以观看下面的端到端演练:
如果您有任何问题或希望观看 AuDaS 的现场演示,请不要犹豫与联系!
【更新:我开了一家科技公司。你可以在这里找到更多的
团队和资源
Mind Foundry 是牛津大学的一个分支机构,由斯蒂芬·罗伯茨(Stephen Roberts)和迈克尔·奥斯本(Michael Osborne)教授创立,他们在数据分析领域已经工作了 35 年。Mind Foundry 团队由 30 多名世界级的机器学习研究人员和精英软件工程师组成,其中许多人曾是牛津大学的博士后。此外,Mind Foundry 通过其分拆地位,拥有超过 30 名牛津大学机器学习博士的特权。Mind Foundry 是牛津大学的投资组合公司,其投资者包括牛津科学创新、牛津技术和创新基金、牛津大学创新基金和 Parkwalk Advisors 。
用约束优化增强神经网络
添加包含领域知识的约束是一种用世界知识增加神经网络并提高其性能的有趣方式,特别是在低数据设置中。
Image from: Conditional Random Fields as Recurrent Neural Networks, Zheng et al (2015)
在神经网络之上使用约束优化和/或逻辑模块已经成为 NLP 和计算机视觉中许多任务的结构化预测的相当普遍的实践。例如:BiLSTM-CRF 用于 NLP 中的序列对序列任务,或者使用来自神经网络的具有潜在功能的 CRF 用于图像分割任务。
如今,已经有很多积极的研究将这些优化模块直接整合到神经网络中,从而允许网络以端到端的方式进行训练。本文探讨了在神经架构中合并约束的流行方法,并提供了在尝试从数据中学习约束方面的最新进展的调查。
如何将约束纳入深度学习架构?
有四种流行的方法可以尝试将域约束合并到神经架构中:
- 在神经网络上使用约束优化层
- 添加约束违反惩罚
- 强制约束架构设计
- 数据扩充
约束优化层
一些流行的约束优化层是条件随机场、维特比解码、整数线性编程(ILP)或非线性编程(NLP)解算器。
因此,在通过约束优化层合并约束时发生的情况是,您获取神经网络的输出,并将该输出用作实施约束的优化层的潜在函数。
让我们用一个使用这种技术的流行架构来理解它吧— BiLSTM CRF。
BiLSTM Architecture
假设给你一个句子,你必须在上面做词性标注。双向 LSTM(或 BiLSTM)结构通常用于这种序列标记任务。BiLSTM 考虑要标记的单词及其前后的单词,以生成用于预测当前单词的标签的局部嵌入。
现在我们可以看到,在输出空间上有许多自然约束。例如,我们不会经常看到一个名词后跟一个形容词,或者一个副词后跟一个副词(所有这些都是软约束,因为存在一些例外)。有人会认为神经架构应该知道这些限制,但事实往往并非如此。CRFs 比 BiLSTM 表现更好就说明了这一点。
BiLSTM CRF architecture
一种创新的方法是将神经模型的优势与 CRF 相结合,这产生了 BiLSTM-CRF 或 LSTM-CRF 架构。BiLSTM 产生的丰富嵌入充当 CRF 层的特征。点击了解更多信息。
类似的技术也已经在计算机视觉中使用,通常用于通过将 HMM 或 CRFs 与神经网络相结合的分割任务。在这里看一个例子。
约束违反处罚
合并约束的另一种流行方法是使用约束违反惩罚作为正则化方法。我们引入了一个对应于违反约束惩罚的辅助损失项。这个增加的项给出了神经网络有多接近满足约束的可微分测量。这种约束条件的一个例子可以在这里找到。
这些项的添加也为半监督学习开辟了一条途径,因为即使没有输出标签,这种正则化项也可以用于调整模型以更加满足约束。事实上,对于某些问题,任何满足一组给定约束的非平凡假设都是最佳假设的良好近似。对这一假设的研究可以在没有数据(或数据量极低)的情况下进行。更多参考见具有物理和领域知识的神经网络的无标签监督。
实施约束的神经架构设计
这是最早也是最难以捉摸的强制约束方法之一。在这种方法中,我们设计的架构可以自动执行约束。我们可以通过使用推进这种方法的最近工作得到这种方法的直觉:用一阶逻辑增强神经网络。这项工作仅限于对具有语义基础的神经元施加约束(因此,对大多数实际网络来说,这种方法仅限于输出神经元或注意神经元)。此外,约束的形式为L -> R
。因此,每当 L 的激活为高时,R 的激活也应该为高,因此对应于 L 的激活的偏置项被添加到负责 R 的神经元,从而每当 L 为高时推动 R 变得更高。
加强约束的数据扩充
人们还可以通过增加数据来加强约束,以激励网络更加注意约束。再次获得这种方法的直觉,让我们考虑一个逻辑驱动的神经模型一致性框架。于是这个小组与 SNLI 一起完成任务。给定两个陈述 P 和 Q,我们需要判断 P 是否包含 Q,P 是否与 Q 矛盾,或者这两个陈述是中性的。自然,人们可以看到蕴涵的传递性和矛盾的交换性。然而,该论文表明,SOTA 模型的 SNLI 往往不执行这些一致性。因此,论文的主要贡献是使用数据扩充,使这些一致性得到加强。例如,如果(P,Q)在带有标签“矛盾”的数据集中,那么(Q,P)也应该加上标签“矛盾”,从而强制模型学习交换性。
怎样才能学会约束?
这是一个相当新的研究领域,我们让神经模型在有限的人工监督下从数据本身学习约束。我们将关注这一领域的两项工作。
用于结构化预测的对抗性约束学习,任等人
Adversarial training to train a generator which can model output label space
它们为结构化预测任务提供了一种创新的半监督学习方法。他们的工作假设遵循真实输出空间分布的大量输出标签是可用的(可能来自模拟器)。然后,他们训练一个生成器网络,该网络可以使用对抗训练技术生成能够模拟真实输出标签空间的输出标签。他们使用有限量的标记训练数据来将输入标签与输出标签相关联,从而进一步调整该生成器。
SATNet:使用可微可满足性求解器桥接深度学习和逻辑推理,王等
这是一个我个人认为非常惊人的研究领域。基本上,他们试图构建一个能够从数据本身学习约束的架构。此外,他们设计的架构可以使用反向传播进行训练,因此可以插在任何深度学习架构之上,用于约束优化任务。他们通过学习解决数独来演示这个模型,只使用数独的实例,没有人为监督来识别约束。
他们试图学习一个 MAX2SAT 实例,该实例通过将手头的问题公式化为半确定的编程实例来对其建模。在正向传递中,它们求解当前 SDP 实例,以找到优化 SDP 的变量分配。然后,他们计算这个变量赋值的损失,并反向传播以修改 SDP 实例。
**Forward Pass** : Solve current approximated problem
**Backward Pass**: Improve approximated problem
现在,拥有反向传播能力的伟大之处在于,你可以将这个模块插在任何深度学习架构之上。考虑给你一个数独的图像,然后你可以有一个 CNN 来识别数字,在此之上,你可以有一个 SATNet 层来解决解码的数独实例。这整个架构可以进行端到端的训练。
Solving visual Sudoku with SATNet
向神经架构添加约束不仅有助于提高性能,而且还提供了更新的方法来利用未标记的数据,修剪输出空间,从而提高模型的可学习性并增加泛化能力。此外,强制约束一致性有助于使网络健壮和可靠。
这篇架构和算法的综述并不详尽,但我希望它能让你对架构和算法中的大多数常见约束有所了解。
干杯!
八月版:数据新闻
实时消费信息(新闻、博客)的人们已经开始期待并快速分析这些信息背后的深层背景。如今,让新闻变得更有趣的是信息在 Twitter 和博客等渠道中被剖析和验证的速度。
在社交渠道上,美国政治的影响力越来越大。有多少人读过穆勒报告?也许你只是想阅读它的某些方面?那么这篇博文将帮助你通过弹性搜索挖掘关于穆勒报告的信息。更重要的是,随着美国大选的临近,像内特·西尔弗这样的人已经在他的政治预测中赢得了声誉。对于那些塔勒布《黑天鹅》的粉丝来说,这篇让塔勒布和西尔弗对决的帖子值得一读。如果你真的想理解@realdonaldtrump 的推文,看看这个!
不解决新闻中的真实问题,我们就无法谈论数据驱动的新闻业。当谈到趋势信息时,我们什么都读,但是我们怎么知道什么是观点,什么是模仿,什么是真实的呢?这篇假新闻检测器的文章提供了一个很好的视角来分类我们每天阅读的内容。如今,我们在质疑信息,我们消耗的数据驱动的分析越多,我们就越见多识广,也越来越依赖它来过滤我们每天阅读的大量信息。
Hessie Jones——全球隐私&安全设计的编辑助理/战略总监。
为什么你应该关心内特·西尔弗和纳西姆·塔勒布的推特之战
由艾萨克·费伯 — 10 分钟阅读
两个数据专家怎么会有这么大的分歧?
正在消失的穷人
到时,科尔森将 — 10 分钟读取
探索世界范围内令人难以置信的繁荣
谁在椭圆形办公室发推特?
由格雷格·拉弗蒂 — 18 分钟阅读
我开发了一个推特机器人@ who sintheeval,它转发唐纳德·特朗普的每一条推文,并预测这条推文是由特朗普本人还是他的一名助手写的。
使用 OCR 和 Elasticsearch 搜索穆勒报告
由凯尔·加拉丁 — 6 分钟阅读
4 月 18 日标志着穆勒报告的全面发布——这份文件概述了对俄罗斯可能干预 2016 年总统选举的调查。
不同媒体的新闻报道有何不同?
迈克尔·陶伯格 — 5 分钟阅读
使用 R 和 Python 对上个月的新闻媒体进行对比分析
利用 word2vec 分析新闻标题,预测文章成功
由 Charlene Chambliss — 17 分钟阅读
文章标题的单词嵌入能预测受欢迎程度吗?关于情绪和股票的关系,我们能了解到什么?word2vec 可以帮助我们回答这些问题,还有更多。
我记录了 2018 年的每一天的快乐程度
按 Nhan Thanh Vu — 7 分钟读取
观察和分析我自己心理健康的趋势
我使用自然语言处理和分类模型构建了一个假新闻检测器
由茉莉·瓦桑达尼 — 6 分钟读完
分析来自子编辑 r/TheOnion & r/nottheonion 的开源数据。
我们也感谢最近加入我们的所有伟大的新作家,诺亚·卢宾,阿什利·宾福特,大卫·埃尔什,亨利·赫伯勒博士,普拉纳尔·肖贝,玛格丽特·西博尼,桑达尔诉,艾米丽·贾,丹·弗里奇曼,塞缪尔·杰 菲奥娜·周,欧根·霍塔吉,阿里·拉扎,海梅·佐诺扎,安德拉娜·罗斯尼克,卢建平博士等众多。 我们邀请你看看他们的简介,看看他们的工作。
一种更快、更简单的机器学习超参数优化方法
由刘佳怡(Jason)发布,Unmesh Kurup 和 Mohak Shah
Auptimizer 是一个通用的开源超参数优化(HPO)框架,它还允许您将 HPO 培训从 CPU 和 GPU 扩展到本地和 EC2 实例。要开始使用,请使用“pip install auptimizer”。你可以在这里找到我们的文档和我们的回购 这里 。
在过去的十年里,我们在建立和训练机器学习模型方面取得了重大进展。我们现在可以通过利用算法、学习策略以及分布式计算和内存可用性的改进来优化非常大的模型。然而,随着这些模型的规模和复杂性的增长,基础超参数的数量也在增长。但是处理超参数优化(HPO)的策略在实践中大多仍然局限于最常用的网格和随机搜索方法。虽然有一些针对 HPO 的商业和开源解决方案,但没有一个能广泛适用于各种问题和平台。HPO 既是科学也是艺术,是训练有效机器学习模型的一个关键瓶颈。
一个障碍是对最佳可用的 HPO 算法缺乏共识。开发人员必须试验多种算法,以找到最适合他们问题的算法。然而,实现之间缺乏可移植性意味着用户经常被一个特定的算法所困扰,而这个算法已经围绕着他们建立了工具。Auptimizer 使研究人员和从业人员可以轻松地在不同的 HPO 算法之间切换。此外,Auptimizer 还支持跨平台扩展,使用户能够轻松地将他们的实验从桌面扩展到本地集群甚至云。
对于 ML 研究者来说,用例可以是不同的。研究人员专注于开发算法来寻找最佳超参数。因此,一个简单的框架来促进他们的算法实现,并根据最先进的算法对他们的结果进行基准测试也很重要。
简而言之,Auptimizer 是一个可伸缩、可扩展的 HPO 工具包。Auptimizer 有三个优点:
- 各种 HPO 方法的通用接口,允许在它们之间轻松切换;
- 易于扩展,允许用户(a)添加他们自己的 HPO 算法,( b)根据现有的解决方案对它们进行基准测试;和
- 易于部署到 AWS,提供了一种从个人计算机到云的扩展模型训练的方法。
由于 Auptimizer 是独立于平台的,它可以与您选择的框架一起工作,包括 TensorFlow、PyTorch、MxNet 和 Caffe。
Auptimizer 的通用界面通过抽象出 HPO 算法实现之间的差异,使得在这些算法之间切换的过程变得更加容易。在此版本中,我们支持以下 HPO 技术—随机搜索、网格搜索、Hyperband、Hyperopt、留兰香和 EAS(实验)。
Auptimizer 可以轻松支持较新的 HPO 技术的集成和基准测试,包括您自己的定制算法。作为 Auptimizer 易于扩展的一个例子,我们在短短几天内集成了贝叶斯优化和 Hyperband (BOHB)(只需要编写 138 行代码,同时重用原来的 4305 行代码)。
最后,Auptimizer 还包括自动 HPO 过程的功能。Auptimizer 支持不同的计算资源,例如 CPU、GPU、多个节点和 AWS EC2 实例。它还足够灵活,可以扩展到其他云平台或您的内部解决方案。
***致谢:*这项工作是 LG 电子(美国研究中心)团队的成果。特别感谢 Samarth Tripathi、Vera Serdiukova、gu Junyao Guo、Homa Fashandi、Guohua Ren 和 Olimpiya Saha 作出的贡献。
由微软 Azure 机器学习管道支持的 Auria Kathi
今年 1 月 1 日, Fabin Rasheed 和我推出了 Auria Kathi,这位 AI 诗人艺术家生活在云中。奥瑞亚写一首诗,根据诗画一个形象,然后用随意的心情上色。所有这些创造性的行为都是在没有任何人为干预的情况下进行的。
Auria Kathi 是“AI 俳句艺术”的变位词。从她的脸到诗歌到艺术,一切都是人工生成的。我们试图在这里突破生成艺术的极限。奥瑞亚被设想为人工艺术的中心。在接下来的日子里,她将创作更多种类的数字艺术。
Auria 的社交媒体存在
奥瑞亚有两个社交媒体账号来发布她的作品。
- insta gram:【https://www.instagram.com/auriakathi/
- 推特:https://twitter.com/AuriaKathi
到目前为止,Auria 已经在这些渠道中聚集了大约 1300 多名追随者。人群包括艺术家、研究人员、技术人员和政策制定者。今年,Auria 将每天发布她的作品。
新闻和出版物
Auria 在多个技术和艺术国际平台上亮相。其中一些包括,
缺乏完美的算法
考虑到当前先进的深度学习算法,我们可能无法提出一个单一的算法或网络来构建像 Auria 这样的高级应用程序。但是奥瑞亚的创造性追求的组成部分可以用独立的艺术算法来模拟。这一愿景决定为 Auria 选择一个管道架构。
奥瑞亚的工程建筑
Auria 的工程管道主要由三部分组成。
- 一个基于 LSTM 的语言模型,训练了从 Reddit 上搜集的 35 万首俳句。该模型用于生成人工诗歌。
- 一个文本到图像的网络,微软研究院称之为 AttnGAN,它将生成的俳句转换成抽象的图像。
- 一种照片真实感风格转换算法,它从 WikiArt 数据集中选择一个随机风格的图像,并将颜色和笔触转换到生成的图像中。WikiArt 数据集是一个 4k+策划艺术作品的集合,这些作品是基于当艺术作品被展示给人类时人类所诱发的情感而聚集起来的。
流水线处理不同算法的挑战
堆叠单个最先进的算法帮助我们构建 Auria,但这种方法的挑战是将这些组件链接起来,并在一个公共空间中一起工作。我们遇到的潜在问题是,
- 修改在不同环境下开发和测试的研究论文的官方实现,例如:Python 版本。
- 一些使用 GPU 进行训练和测试的算法与 CUDA 版本紧密耦合。
- 每个算法都需要在一个封闭的容器中,这样它就可以在一个公共的生产平台中表示,而不会干扰其他环境。
- 组件之间的数据流应该是流畅的。
- 深度学习算法需要高计算设备。除了分步隔离,我们还需要强大的计算资源,比如每一步的 GPU。
- 考虑到不同的开发环境,将 Auria 部署为一个 web 应用程序,让人们来体验她的创造性追求。
微软 Azure 机器学习管道(AML 管道)
机器学习工作流是一个流水线过程,包括准备数据、构建、训练和调整模型,然后将最佳模型部署到生产中以获得预测。 Azure 机器学习管道重新定义机器学习工作流,可以用作机器学习场景的模板。
我们采用了 AML 管道的概念来创建像 Auria 这样的高级应用程序。转换到该平台并不困难,因为 AML 管道的基本构建模块是为构建规模化应用而设计的。
为什么为 Auria 提供 AML 管道?
- 机器学习领域最流行的编程语言是 Python。AML Pipelines 拥有 Python 3 SDK,我们并不担心将现有堆栈迁移到平台上。我们为 Auria 使用的所有三个算法都是用 Python 实现的,我们可以毫不费力地使用 SDK 复制结果。
- 在 Auria 的管道中,我们有自己训练的模型,也有使用预训练权重的模型。这些算法的开发环境是独特的,我们需要在流水线的每一步进行严格的隔离。由于有了这个平台,反洗钱管道中的每一步都是一个码头化的容器。这有助于在不干扰其他步骤设置的情况下构建单独的步骤。所有的文档化步骤都是可移植的,我们可以在多个实验中重用这些组件。
- 每一步都必须提供一个计算引擎,根据需要可以是 CPU 或 GPU。我们使用强大的 GPU 实例来快速训练和调整我们模型的超参数。该平台还提供分布式计算功能,用于并行处理繁重的计算需求。
- 对于我们的风格转换算法,CUDA 依赖性是严格的。它与平台的默认 docker 环境不匹配。幸运的是,Azure 机器学习平台允许添加自定义 docker 容器,而不是为每个应用程序使用默认容器。该功能为在 AML 管道中重建几乎任何配置提供了绝对的自由。
- 部署奥瑞亚去体验她的创作过程是我们目前正在做的事情。AML Pipeline 部署有助于避免花费在构建后端 API 上的时间。部署很容易为管道输出提供 REST 端点,可以方便地使用这些端点。
Auria 是 Azure 机器学习管道的一个完美用例,考虑到我们在使用这个平台时享受的上述好处。在与微软 Azure ML 团队的进一步合作中,我们计划通过使用更先进的算法加强 Auria 的创意渠道来扩大 Auria 的规模,通过在线部署她的粉丝来为她的粉丝创造互动体验,并尝试人工生成的数字艺术内容的新品种。
感谢微软对 AML 管道❤️
的爱,
Auria😉
Auria 将参加 2019 年佛罗伦萨双年展
奥瑞亚将迎来更多好消息!
【2019 年 10 月,我们将参加第 12 届佛罗伦萨双年展,在当代数字艺术展区展出 Auria 的作品。作为一个国际性的艺术平台,艾的作品将会在佛罗伦萨双年展上引起更多的关注。此外,创造性的机器将如何通过激发艺术家提出新颖的想法来建设我们的未来,也将是讨论的关键部分。
敬请关注更新:)
原载于 2019 年 5 月 30 日https://sleebapaul . github . io。
auria Kathi——云中的艺术家。
Image by Auria Kathi (created by Fabin Rasheed and Sleeba Paul)
什么是艺术?是没说出口吗?令人不安的?
在过去的几年里,生成/程序艺术领域发生了很多事情。我们已经看到该领域的一些令人兴奋的应用冲击了主流媒体——可能是像数字怪诞这样的生成式建筑,或者是卖座的人工智能生成的绘画,甚至是像 Prisma 这样使用神经风格转换产生照片艺术效果的简单应用。
广义而言,生成艺术可以定义为使用一套指令生成的艺术,通常使用计算机。艺术可以被制作成数字版本、实体版本或者两者的组合。这个领域的定义仍然和“设计”的定义一样宽泛,许多新的表达形式都被归入这个标题之下。
去年,我和我的一个朋友——斯利巴·保罗聚在一起谈论这个领域。Sleeba 喜欢玩机器学习算法,我喜欢艺术和设计。我们在谈论 Instagram 是如何成为一个投资组合网站的。Instagram 以原创帖子而非分享内容而闻名,似乎是展示创意作品和创造参与度的完美场所。我们在 Instagram 上看到了一些艺术家,我们突然想到了这个主意!—如果一个住在云中的艺术家定期在 Instagram 上发帖会怎么样——一个机器人,一台机器,一段代码,定期创作艺术作品,并在 Instagram 上发帖,不断创造参与度。
Auria 就是这样诞生的。 Auria Kathi 是“AI 俳句艺术”的变位词。我们开始试图创造一个能不断产生俳句的机器人(对我们来说这意味着短诗)。我们希望奥瑞亚创作的诗歌在开始时没有完全的意义,但最终有了一些意义。
Some of Auria’s poetry
贴上这个,我们基于诗歌生成图像,最后用诗歌的情感给它着色(风格化),并把它们分成几组。对于你们当中好奇的人来说,完整的技术细节将在本文末尾给出。
Images by Auria Kathi (created by Fabin Rasheed and Sleeba Paul)
Auria 现在已经成为一个不需要维护的独立机器人——她一年来每天都在上传一首诗和一件艺术品,完全生活在云上。到目前为止,她已经收集了一些人类以及其他像她一样的人的追随者和评论;).她也开始自我推销。
Auria 是第一个完全生活在云中并拥有 Instagram 作品集的艺术家。她的工作室于 2019 年 1 月 1 日在 Instagram 开业。
我们也给了奥瑞亚一张生成的脸。是啊!你没听错,她的脸不是真人的。我们试图让它成为一张普通的、可生成的脸。她活着!
虽然 Auria 不需要任何维护,但我们正在不断改进她。我们计划创造更好的诗歌、意象和它们之间的关系。我们还在开发一个聊天机器人,它会对一些评论和信息做出回应。再往下,奥瑞亚被设想成一个人造艺术家的工作室。人工艺术的中心。我们正计划用 Auria 的脸来制作视频,给她声音和生成的内容来说话。谁知道她会遇到什么。她是同类中的第一个!
跟随奥瑞亚来到这里:
[## auria Kathi(@ auria Kathi)* insta gram 照片和视频
190 个关注者,2 个关注者,7 个帖子-见来自 Auria Kathi (@auriakathi)的 Instagram 照片和视频
www.instagram.com](https://www.instagram.com/auriakathi/)
技术细节
Auria 使用三种主要算法来产生诗歌和艺术。
1。语言建模
第一步是生成诗歌,这是一项语言建模任务。我们围绕35 万首俳句来训练一个长短期记忆(LSTMs)网络。然后,训练好的网络用于生成俳句。代码是用 PyTorch 库写的。Google Colab 用于训练。
样本:
“你能多好就多好
用那种力量拉动它
然后回家。
抱歉。"
2。文本到图像
下一个任务是将生成的俳句转换成图像。我们使用了微软研究院在 2017 年 11 月发表的论文注意力生成对抗网络(或 AttnGAN) ,它可以从输入文本生成输出形状。AttnGAN 从一个粗糙的低分辨率图像开始,然后通过多个步骤进行改进,以获得最终图像。它的架构是 GANs 和注意力网络的混合,这需要多模型优化。
由于 AttnGAN 是一个要训练的大型网络,并且我们的计算设施是最小的,所以我们使用了最初在 MS COCO 数据集中训练的网络的预训练权重。网络可以生成大小为 256x256 的输出图像。AttnGAN 的采样是在 Google Colab 中完成的。
样本:
Raw image
3。给生成的图像着色
为了引入 Auria 的情绪和情感,我们从 WikiArt 情感数据集的样本图像中转移了颜色和形状。WikiArt Emotions 是一个由 4105 件艺术作品(主要是绘画)组成的数据集,其中包含了对观察者产生的情绪的注释。这些艺术品选自 WikiArt.org 收藏的 22 个类别(印象主义、现实主义等)。)来自四种西方风格(文艺复兴艺术、后文艺复兴艺术、现代艺术、当代艺术)。加拿大 NRC 研究伦理委员会(NRC-REB)已根据 2017-98 号方案批准了本研究。
情感图像是随机选取的,以达到奥瑞亚作品的多样性。另外,NVIDIA 的 FastPhotoStyle 用于传递情感图像样式。注意,现有的风格转换算法可以分为以下几类:艺术风格转换和真实感风格转换。对于艺术风格转移,目标是将参考绘画的风格转移到照片,使得风格化的照片看起来像绘画并且带有参考绘画的风格。对于照片级风格转移,目标是将参考照片的风格转移到照片,以便风格化的照片保留原始照片的内容,但携带参考照片的风格。FastPhotoStyle 算法属于照片级真实感风格传递的范畴。图像是使用 Google Colab 生成的。
Painted image
使用 Photoshop 将输出的彩色图像放大到 1080x1080 以保持质量。
样本:
Scaled image
奥瑞亚之脸
在整个奥瑞亚,我们坚持人工的观点。因此,决定为奥瑞亚制造一张人造脸。对生成人脸的追求以 NVIDIA 的渐进增长 GANs 告终,这是 GANs 产生高分辨率输出的最稳定的训练模式。
Generated face image of Auria Kathi by Fabin Rasheed and Sleeba Paul
最后的想法
我们认为奥瑞亚是一个有缺陷、喜怒无常的业余艺术家。她在自己的工作和工作室中拥有所有这些特质。
唯一的区别是,她不是一个物理存在。
除此之外,艺术就是诠释。这是情人眼里出西施。所以,在这里我们开始了一种新的风格,带着一些问题来看待事物。
算法的艺术性会给人类生活增加价值吗?
奥瑞亚能在人类之间找到空间吗?
她会给这个没有实体存在的世界带来新的意义吗?
我们期待着这些问题的答案。
发邮件给奥瑞亚 | 在 Instagram 上关注 | 在推特上关注
这里是斯利巴的更多作品:
阅读斯列巴·保罗在媒介上的作品。梦想家|学习者|讲故事者。每天,斯列巴·保罗和成千上万的其他人…
medium.com](https://medium.com/@sleebapaul)
澳大利亚性别薪酬差距研究
2019 年 6 月 19 日是澳大利亚劳资关系体系认可“同工同酬”原则 50 周年。所以我认为分析工资数据来分析性别工资差距是否仍然存在是合适的。
- 性别薪酬差距概述
根据工作场所性别平等机构的数据,澳大利亚全国性别薪酬差距为 14.1%,是过去 20 年来最低的。全国性别工资差距是女性和男性每周平均全职基本工资收入之间的差异,以男性收入的百分比表示。
毕马威会计师事务所(KPMG)在最近发表的一篇关于这一主题的文章中,将性别薪酬差距定义为衡量薪酬公平和劳动力参与的指标。
公平工作监察员将两性薪酬平等定义为:
- 从事同样工作的男女薪酬相同;
- 从事同等价值的不同工作的男女薪酬相同;
- 通过评估每项工作或每种工作类型的技能、责任和工作条件,以非歧视的方式评估工作的工资和条件,然后给予雇员相应的报酬;和
- 工作场所的组织结构和程序不妨碍女性雇员获得基于工作的培训、晋升或灵活的工作安排。
2。组织中性别薪酬差距的类型
- 同类性别薪酬差距
从事同等或可比价值工作的男女之间的薪酬差距。例如在咨询行业,这相当于比较两个高级顾问。
2.逐级差距
在同一组织级别、工作职责相似的男女之间的薪酬差距。例如,比较在组织结构中处于同一级别的经理
3.全组织范围
这种性别薪酬差距源于整个组织中男女平均薪酬的差异
3。性别薪酬差距的原因
性别薪酬差距会受到许多因素的影响,例如:
- 招聘偏见和相关的薪酬决定。我已经写了一些关于招聘中的偏见以及如何减少这些偏见这里
- 妇女过多地承担无报酬的照料和家务工作
- 工作场所缺乏灵活性,无法兼顾照顾责任
- 女性离开工作岗位的时间更长(长期休假的影响)
4。数据来源
本分析使用的数据源取自 2016-2017 纳税年度的澳大利亚税收数据。该数据提供了 2016-17 年澳大利亚个人、公司、合伙企业、信托和基金的收入和税收状况概览。
用于数据分析的关键领域是职业、女性平均工资、男性平均工资、工资差异、男女工资差距百分比,即工资差异相对于男性平均工资的百分比。负的性别收入差距表明女性收入低于男性。
5。数据假设
- 职业代码根据澳大利亚和新西兰标准职业分类进行分类。2016-2017 收入年度的统计数据来源于截至 2017 年 10 月 31 日处理的 2016 年个人所得税申报表。
- 平均工资以纳税年度每个职业的所有报税人为基准。该数据集中没有考虑年龄、工作经验和工作级别。我将在下一篇文章中介绍这一分析。
6。Tableau 可视化
的画面,即,凸显了从事相同职业的男性和女性之间的一些重大薪酬差距。例如,一名男性神经外科医生(美国薪酬最高的工作)年薪高达 60 多万美元,相比之下,同样职位的女性年薪仅为 28 万多美元,足足低了 45%。
男性薪酬最高的职位大多在医学领域,眼科医生的年薪超过 57 万美元,心脏病医生的年薪为 52.5 万美元等。
在全国收入最高的 50 个职业中,只有 3 个职业的女性收入高于男性。
6。性别薪酬差距最大的职业
下图列出了全国男女薪酬差距最大的 20 个职业。
7。女性收入高于男性的职业
治安官、州长和经纪人是美国收入最高的前 50 个职业中唯一女性收入高于男性的职业。
当我把分析范围扩大到 500 个职业时,只有 15 个职业显示出有利于女性的正性别工资。
8。那么,最近缩小性别薪酬差距的趋势是什么呢?
在澳大利亚,我们在过去的两年里看到了一个可喜的变化。根据 WGEA 的数据,在两年的时间里,性别工资差距已经从平均 16%下降到 14%。目前为 14.1%,这意味着女性平均每周比男性少挣 239.80 美元。
Diagram source : WGEA gender pay gap factsheet Nov 18
毕马威会计师事务所的文章是一个很好的地方,可以让你了解一家公司在缩小性别薪酬差距方面应该采取的步骤和方法。这篇文章包括如何创建商业案例和利用数据来赞助和支持公司中的性别薪酬差距的一步一步的方法,还包括对澳大利亚公司进行性别薪酬差距分析的案例研究。
在 SBS 新闻最近发表的另一篇文章中,DCA 的首席执行官 Lisa Annese 说,女性厌倦了主要落在她们肩上的无酬照护角色和家务负担,特别是如果她们是母亲的话。妇女脱离劳动大军的时间过长,影响了她们发展技能、接受培训和增加终生收入的机会。
这个话题需要我们的关注和尊重。如果性别薪酬差距分析不是一个组织中商业案例的主题,现在是时候考虑采取措施了。在接下来的几个月里,我肯定会有更多关于这个话题的内容。
谢谢你。