用于信息融合的门控多通道单元
The output of the GMU architecture
深度学习已经在许多领域证明了它的优越性,在各种各样的任务中,例如图像分类和文本生成。处理涉及来自多个模态的输入的任务是一个有趣的研究领域。
门控多模式单元(GMU)是由最近的一篇论文提出的一种新的构建模块,该论文在 2017 年 ICLR 世博会上以研讨会的形式展示。这个构建模块的目标是以一种智能的方式融合来自多个不同模态的信息。
在这篇文章中,我将描述 GMU,并说明它如何在玩具数据集上工作。
建筑
给定不同模态的两种表示,xᵛ和 xᵗ(例如视觉和文本模态),GMU 块执行一种形式的自我注意
GMU architecture
描述 GMU 的方程相对简单:
(1) + (2)将表示转换成不同的表示,然后根据在(3)中计算的 z 在(4)中参与。因为 z 是 xᵛ和 xᵗ的函数,这意味着我们在处理自我关注机制。
GMU 背后的直觉是,它使用表示本身来理解哪个模态应该影响预测。考虑预测一个被拍照者的性别的任务,伴随着他的声音记录。如果给定示例的记录噪声太大,模型应该学会仅使用该示例中的图像。
综合数据
在论文中,他们描述了一个很好的合成数据集,展示了 GMU 是如何工作的。
在这里,我们将实现相同的数据集,并自己找出 GMU 是否真的有效(剧透:它有效)。
首先,让我们做导入:
生成数据
Data generating process
不要被这个图表吓到——稍后您会发现这个图表生成的数据的可视化。
基本上图中所说的是目标类 C 描述了模态 yᵛ和 yᵗ的值——当然带有一些随机性。
在下一步中,随机变量 M 决定忽略 yᵗyᵛ的哪个输入,而是使用 ŷᵗ.ŷᵛ的噪声源
最终,xᵛ和 xᵗ要么包含了能够描述目标类 C 的真实信息源,要么包含了随机噪声。
GMU 块的目标是成功地找出给定特定示例的哪个来源是信息来源,并对该来源给予全部关注。
Synthetic data. Color denotes the class C
创建模型
我将实现 GMU 的一个基本版本——只是为了让它更容易理解。
将代码一般化以处理两种以上的模态是很简单的。
训练模型
检查结果
损失看起来不错。
让我们看看 z 和预测是什么样子的。论文中还出现了以下可视化内容。
我们可以看到 z 的行为完全如我们所愿(左图)。它的好处在于,实际上只使用一种模态就可以预测远离边界线的点类。这意味着模型学会了何时忽略包含纯无预测噪声的模态。
为什么不用简单的 FF(前馈)?
如果我们忽略数据生成过程,只看数据点,显然有 4 个不同的集群。
这些集群不是线性可分的。虽然 GMU 为模型提供了容量以解释这种非线性行为,但人们可以改为向混合物中添加另一层,从而用简单的前馈(FF)网络解决问题。
普适逼近定理指出,一个包含有限个神经元的单隐层前馈网络,可以逼近连续函数……(维基 )
因此,实际上,对于这个人为的例子,一个简单的 FF 就可以完成这项工作。然而,引入新架构(在这种情况下是 GMU)的目的是引入归纳偏差,允许训练过程利用我们对问题的先验知识。
结论
对于涉及多模态的真实世界问题,作者声称 GMU 实现了优越的性能。他们使用基于情节和海报识别电影类型的任务来展示他们的方法。
GMU 很容易实现,如果您需要训练一个模型使用多种模态作为输入,将它放在您的工具箱中是值得的。为此,您可以为每个主机创建一个子网。子网络不必相同——例如,你可以用 CNN 做视觉模态,用 LSTM 做文本模态。重要的是每个子网络输出其模态的密集表示。然后,将这些表示送入 GMU 块,以便将信息融合成一个表示。融合的表示将被馈送到另一个子网络,其输出将是最终的预测。
本帖原帖www.anotherdatum.com。
神经网络中的门控和深度
深度是现代神经网络的关键部分。它们通过构建层次规则来实现高效的表示。到目前为止,我们都知道这一点,所以我假设我不需要说服任何人,但如果你需要复习一下,这基本上是因为我们无法有效地建模许多数据分布,这些分布在没有指数数量的神经元的情况下用单个或几个函数出现。这些分布太复杂了,无法以这样一种直接的方式建模,但尽管如此,它们确实有结构,只是碰巧是分层的。换一种方式想,想象一下如果数据生成过程是而不是分层的。那么生成一个复杂的分布也需要指数级的资源。毫无疑问,有些过程是这样的。也就是说,我们所知道的关于这个世界的一件事是,它是由简单的部分组成的,但是把它们放在一起有时会产生极其复杂的行为。
不幸的是,我们的网络训练算法,误差反向传播,不喜欢当事情太多递归。考虑线性神经元链的情况。如果这些神经元的(范数)权重不等于 1,误差信号将连续收缩或增长。如果收缩太快,我们看到它消失了,如果增长太快,我们说它爆炸了。对于具有非线性激活函数的神经元,情况大致相同,只是我们考虑雅可比矩阵的范数,但基本上是一样的。缩放并不酷,因为这意味着当我们从损失向后传播误差时,我们看到信号变得不正常,这意味着对权重的更新是无用的,并且我们的网络训练发散。
很好,我们都熟悉消失和爆炸渐变。我们该怎么办?基本策略是确保所有缩放不会干扰误差信号,同时仍然支持深度。我们需要保护一些信号。
在前馈网络(FFNs)中,我们可以通过跳过连接来实现这一点。最简单的情况是剩余学习,从较低层到较高层的输出被加到该较高层的输出上。然后,连续的层只需要学习增量,因为它们已经从前一层的位置“开始”了。这种剩余被认为比从零开始构建新的转换更容易学习。
这样做的另一个原因是残余连接实际上使得从给定层到输出的路径更短。你所需要做的就是穿过连续层的剩余连接,直到你到达终点,跳过中间的层。碰巧的是,深度残差网络实际上具有明显小于指定深度的有效深度,因为这正是训练中发生的情况。换句话说,我们避免了很多不利的转变。这隐含地发生在剩余网络中,但是可以通过在每一层和输出之间具有被称为密集网络的连接来明确地实现。
顺便说一下,有可能从上一层的输出开始实际上会使学习下一层的最佳变换变得更加困难。或者至少,这可能是对许多层的低效使用。因此,我们引入了门的概念,并说让我们学习一个系数来衰减相对于普通堆叠层应该使用多少身份连接。然后,剩余网络成为具有加权跳跃连接的网络的特殊情况,称为公路网络。
这非常有趣,因为在某种意义上,我们已经为 FFNs 实现了一个内存,通过门控机制,我们可以了解何时访问该内存,何时忽略它。您已经在较低层创建了一些表示,该信号可以跳过许多层,并在其他地方找到自己。其他地方层上的(学习)门告诉你是否访问该信息。
现在让我们考虑一个不同的问题:序列建模。ffn 在这方面当然很棒,序列是证明深度的好方法。如果你使用卷积 FFN(现在每个人都这样),你实际上需要一定的深度来考虑输入中的长程相关性。这在语言建模中非常明显,因为长程相关性可能非常长。然后,跳过连接以及注意力之类的东西充当更细粒度信息的内存查找机制,以服务于更高级别的表示。这一切都很酷。
还有另一种有趣的方式来看待这个问题,那就是循环网络(RNNs)。在这种情况下,我们有一个单一的隐藏层,它应用于序列中的每个元素,然后在最后一个元素之后,您可以“及时”反向传播您的错误。所以你可以想象,当我们的梯度回到序列的开始时,它们会消失。然而,因为我们在每个序列步骤中使用相同的权重,所以在这里添加跳过连接没有意义。
相反,RNN 人所做的是用一种门控机制把其它小的记忆系统放进去。现在,您可以通过将信号写入某处的特殊状态来保护信号的某一部分,并了解何时将其读回。那么有效深度对 RNN 来说意味着什么呢?我不确定这是否真的比得上在序列方向上的深度概念,但无论如何这是一个有趣的类比。
想想我们根本没有解决渐变消失或爆炸的问题,这真的很有趣,我们只是回避了这个问题。所以现在我们可以问这是自然的还是怪异的。我碰巧觉得,我们能这么好地凭空拉出层次化的表示,还是很奇怪的。值得注意的是中间损失的有效性,特别是在 NLP 应用程序中,由于存在各种可以生成供您预测的特征(例如,词性、命名实体)的解析器,所以您可以获得这种类型的信息。
为什么这样做是很明显的,这与跳过连接有关。简单地说,你将你的表现锚定在除了最终图层输出之外的东西上。在剩余 FFN 的情况下,它是到较低层的输出,这没有什么不同,因为它也是一个额外的信号,你知道在某种程度上是一个先验的良好表示(就像你的输入!).
目前看来,渐变的消失和爆炸确实是一个基本的问题,尽管不是不可克服的。
高斯混合模型聚类:如何选择分量(聚类)数
如果你看到了这篇文章,你可能已经知道什么是高斯混合模型,所以我将避免对这种技术的一般性描述。
但是如果你不知道细节,你可以把 GMM 看作是一个 k-means,它能够形成拉伸的簇,就像你在图 2 中看到的那样。
这个帖子使用的所有代码都是这个笔记本中的。在同一个仓库中,你可以找到完全复制你所看到的绘制结果的数据。
现在:假设您处于图 1 中描述的情况,您想要辨别我们有多少个集群(或者,如果您喜欢,有多少高斯分量生成了数据),并且您没有关于“基础事实”的信息。一个真实的例子,数据没有模拟数据表现的好。
Figure 1: The vecotrs we are going to cluster. The transparency on the points reflects the density.
乍一看,人们可能会大叫“三个主星系团加上两个副星系团!”。也许这是正确的,但是这里我们想要检查一个自动的方法来找到“正确的”集群数。
值得注意的是,这个“正确”的数字无论如何都是一个模糊的数字,因为每个问题的特殊性都可能导致人们决定克服自动算法的决定。
但是让我介绍一下我们刚刚宣布的配置(五个集群)的 GMM 结果。在下图(图 2 )中,我们为我们的数据拟合了一个包含五个组件的 GMM。我们有第一个问题:同样的数据,同样的模型,但是不同的结果。
Figure 2: Clusters shapes: since the algorithm we rely on is not deterministic, we can have very different results!
这种行为的罪魁祸首是拟合过程:期望值最大化(EM)算法。这种算法只能保证我们到达一个局部最优点,但不能保证这个局部最优点也是全局最优点。因此,如果算法从不同的初始化点开始,通常会进入不同的配置。
虽然有其他方法适合 GMM,但我们想坚持使用这一种:其他方法更复杂,需要设置更多的超参数;这超过了这篇文章的目标。
那么,我们必须考虑我们的家伙的不确定性。
最简单的处理方法是多次运行拟合程序,并考虑每个配置的平均值和标准偏差。简而言之:我们考虑了每次拟合的误差。
集群性能评估
因为我们不知道我们的聚类生成器的基本事实,即我们不知道生成数据的原始分布,所以我们关于聚类过程的性能评估的选择是有限的并且相当嘈杂。
尽管如此,我们将探索三种不同的技术。
剪影分数
这个分数,正如 SKLearn 的开发者所说,考虑了两个标准:
- 样本与同一聚类中所有其他点之间的平均距离。
- 样本与下一个最近簇中所有其他点之间的平均距离。
也就是说,它检查簇的紧密程度和分离程度。分数越接近 1,聚类越好。
因为我们已经知道拟合过程是不确定的,所以我们对每个聚类数运行二十次拟合,然后我们考虑最佳五次运行的平均值和标准偏差。结果在图 3 中。
Figure 3: Silhouette scores for our dataset
事实证明,我们用五个群集得到了最好的分数。如果我们考虑两种配置的标准偏差(“误差”),我们还必须考虑四群集配置几乎同样好。所以,这个分数并没有给我们一个明确的结果。
GMM 之间的距离
这里我们形成两个数据集,每个数据集有一半随机选择的数据量。然后,我们将检查对于每个配置,在这两个集合上训练的 GMM 有多少是相似的。
既然我们在讨论分布,相似性的概念就嵌入了詹森-香农(JS)指标。两个 GMM 之间的 JS 距离越小,GMM 就越同意如何拟合数据。
所有的功劳都在(漂亮!)计算詹森-香农度规的方法转到 Dougal ,并转到它在 StackOverflow 上的帖子。
Figure 4: Distance between half data GMMs
按照这种技术,具有三个集群的配置是最保守的;这并不一定意味着它是好的配置,因为我们只是在谈论两组结果的可重复性。
该图有趣的部分是我们在通过六个集群配置后看到的距离的突然变化:平均距离及其相关误差都显示出巨大的增加。
这意味着从七个聚类开始,两个集合的 GMM 差异更大(因为距离更大),并且也更不稳定(因为误差带更大)。
我们可以说,考虑到所包含的信息量(=最大可能的聚类数)和拟合过程的稳定性(=最低可能的 GMMs 距离)的良好配置是考虑了六个聚类的配置。
贝叶斯信息准则 (BIC)
这个标准给了我们一个估计,在预测我们实际拥有的数据方面,GMM 有多好。BIC 越低,模型就越能准确预测我们拥有的数据,进而预测真实的未知分布。为了避免过度拟合,该技术对具有大量聚类的模型进行惩罚。
Figure 5: Bayesian information criterion scores as function of the number of normal components (clusters) forming the GMMs.
按照这个标准,聚类的数量越大,模型就应该越好。这意味着 BIC 标准对复杂模型的惩罚并没有使我们免于过度拟合。或者,用更通俗的话来说,这个分数糟透了。至少以这种基本形式。
但是在叫嚣和摒弃这项技术之前,我们可以注意到两件事。首先是曲线相当平滑和单调。第二,曲线的不同部分遵循不同的斜率。从这两个观察开始,检查 BIC 曲线变化斜率大的地方的诱惑就大了。所以我们来检查一下!
从技术上讲,我们必须计算 BIC 得分曲线的梯度。直观上,梯度的概念很简单:如果两个连续的点有相同的值,那么它们的梯度为零。如果它们具有不同的值,如果第二个点具有较低的值,则它们的梯度可以是负八分之一,否则是正八分之一。梯度的大小告诉我们这两个值相差多少。
Figure 6: plot of the gradients of the curve in Figure 5
正如所料,所有的梯度都有负值。但是我们更清楚地看到,从 7 个簇的大小开始,梯度变得几乎恒定,即原始函数具有更平缓的下降,即增加簇的数量没有太大的增益。简而言之,这项技术建议我们使用六个集群。
最终决定:改变模式
我们探索了三种不同的技术来选择可以在该数据集中辨别的正确的聚类数。结果如下表所示:
即使决策是相似的,也没有一个所有策略都认同的明确的价值观。在这种特定情况下,这意味着 GMM 不是对我们的数据进行聚类的好模型。
你可以捕捉到的另一个症状是,BIC 的轮廓和梯度都显示了第二个值,几乎与选择一个值一样好:4 几乎与 5 一样好的轮廓,5 几乎与 6 一样好的 BIC 分数的梯度。
有人可能会说只取五个(在 medio stat virtus 中)作为集群的正确数量,但这可能不是最佳选择。事实证明,这并不是针对我的具体问题。
这是因为星团没有显示出清晰的对称(类似椭圆形)形状,因此它们不能用一个二维高斯模型来近似,就像你在图 7 中看到的那样,而是对称的。
Figure 7: a bi-variate normal distribution.
我希望你喜欢阅读!
极客圣诞节:娱乐数据科学家的 10 本最佳书籍
Joost Swarte for The New Yorker, August 2015 (detail)
哦,每年的圣诞节顿悟:为我们认为认识的人购物是很难的。为了帮助那些为他们友好的数据科学家寻找完美礼物的人,或者那些想尽情阅读的人,这里有一个不会让任何数据极客失望的书籍综述。选择是主观的:我故意错过了经典,并把重点放在不太明显的选择,保证娱乐和启发。
排名不分先后:
- 破坏数学的武器。大数据如何增加不平等并威胁民主,凯茜·奥尼尔(2016)
这是一本关于企业和政府应用数学模型的精彩读物。凯茜·奥尼尔讲述了影响我们日常生活的黑盒算法和固有偏见:工作、信贷和教育。现代的一本令人振奋的必读读物。 - 数据化。《我们是谁》(当我们认为没人在看的时候),克里斯蒂安·鲁德尔(2014)
“OK 丘比特”的联合创始人克里斯蒂安·鲁德尔挖掘了该网站的数据,以发现什么是爱:在数字中。这本书既吓人又有趣,它是一个关于我们的谎言、无意识偏好和网络约会中偶尔出现的种族歧视的数据包装的账户。引用 Nick Paumgarten 在《纽约客》中的话:“他不会对大数据现象(见国家安全局、谷歌广告、那个鬼祟的 Fitbit)拍手叫好,而是让他们投入到大数据中,并试图从黑暗的深处拉出奇怪的生物。” - 信号和噪音。为什么这么多的预测失败了,但有些没有,内特·西尔弗(2012)
被《时代周刊》评为 2009 年 100 位最有影响力的人之一,内特·西尔弗在正确预测 2008 年美国大选并在 2012 年击败它(通过预测 51 个州中的 50 个)后声名鹊起。信号和噪声深入应用概率的世界。挑战传统的(“频繁主义者”)统计数据,Silver 为事件预测的复杂性提供了一个案例,通过对扑克、金融危机和气候变化的研究来支持他的观察。 - 被随机性愚弄。机会在生活和市场中的隐藏角色,《纳西姆·尼古拉斯·塔勒布》(2005)
在其后续畅销书,《黑天鹅》,《被随机性愚弄》的阴影下,本身就是一部小小的杰作。纳西姆·尼古拉斯·塔勒布会让你对我们的决策能力大失所望:我们充满偏见,倾向于在大量随机收集的事件中看到模式。驱动成功的往往是运气,而不是技能或努力,尽管我们不愿意承认。规范科学也受到抨击,有一句名言令人难忘:“规范经济学就像没有美学的宗教”。 - 统计学做错了,亚历克斯·莱因哈特(2015)
这是一个关于应用统计学的警示故事,既令人震惊又富有教育意义。统计错误是常见的,不一定是业余爱好者的领域。亚历克斯·莱因哈特(Alex Reinhart)讨论了统计分析、出版文献和同行评议论文中出现的典型错误——有些是由冷血欺骗引发的。这本书让你质疑你所知道的一切,但并不沮丧:统计做错了既是研究评估框架,也是创建有意义分析的指南。 - 《局外人:成功的故事》,《马尔科姆·格拉德威尔》(2008)
马尔科姆·格拉德威尔讲述引人入胜的故事:《局外人》是他的,通常被称为自传,关于幸运和不幸的故事。看着重大成功的故事,他拿出统计证据来检查他们所谓的和真正的促成因素。出现的画面是,与财富、社会背景甚至出生月份所能达到的目标相比,智力甚至毅力都不算什么。也许不是你典型的统计阅读,这是一个令人大开眼界的观点,以鼓励我们创造的产品的包容性和公平性。这是一个不寻常的视角,就像纳西姆·尼古拉斯·塔勒布在一本书里遇到了凯茜·奥尼尔。 - 给我看数字:设计表格和图表来启发,斯蒂芬·诺(2004)
对于那些热衷于用数据讲故事的人来说,这是必备的。信息可视化是一种技能,这本书是一个伟大的建议,避免可怕的想法,和一些实用主义有助于掌握这种技能的实用选择。 - 糟糕的科学,本·戈德阿克里(2008)
本·戈德 arce 的工作是一个人对伪科学的讨伐。他研究了医疗保健趋势背后的证据:营养学家、顺势疗法和替代医学等等。Goldarce 提醒我们注意误导性的术语和公关技巧,并保证研究的透明度。它的主要焦点可能是健康产业,但这种思维模式是普遍适用的:现在和 10 年前一样。毕竟,我们刚刚了解到,尽管没有科学证据证明这种做法的有效性,但英国的大多数自来水公司还是使用了中世纪的水检测方法。 - 《金钱球:赢得不公平游戏的艺术》,迈克尔·刘易斯(2004)
它也可以被称为金钱球:现实生活中的数据库管理*。一个关于极客占领棒球场的迷人故事(不是字面意思)。统计学已经改变了棒球中的球探方法:整个行业开始研究数字,完全无视它遵循了几十年的传统智慧。这是一个科学胜于情感的普遍故事,任何极客都会欣赏。* - 随机性,黛博拉·j·贝内特(Deborah j . Bennett)1999
有趣的故事:我订这本书的时候,亚马逊又给我发了一本。也许他们认为我非常想要某样东西,我的愿望应该得到满足。
随机性是一本很棒的概率入门书:通过它在人类历史中的作用仔细研究机会,迂回到哲学和宗教,到它在技术中的现代应用。与同类书籍不同的是,数学问题用人类流利的语言解释。
如果你知道有一本书可以很好地补充这个列表,请发表评论或发微博。
这篇文章最初发表在我的博客上, 一个分析师在数据仙境中的冒险 。
大会毕业生招聘
我最近从大会的数据科学项目毕业,并为我的下一次冒险感到兴奋!我在劳联-产联有五年管理、管理和可视化数据的经验。我正在寻找一个可以继续使用这些技能的地方,同时也磨练我新获得的机器学习技能。我主要在 DC 和洛杉矶地区找工作,但也愿意去旧金山、圣地亚哥和拉斯维加斯(这些都是我住过的城市)。
巨大的成果
我很高兴我不是一个人在找工作,而是有大会的结果的帮助。Outcomes 是大会的职业准备部门,我希望其他教育机构能够复制他们的模式。
对于结果支持,你需要写 10 篇博文(这是我开这个博客的原因),创建一个在线文件夹,以及其他一些要求。这是为了让学生习惯于获得曝光和网络。该计划本身是一个支持小组,有几项责任措施:每周申请 10 份工作,每月参加 2 次社交活动,以及其他目标。
My Portfolio brendanbailey.github.io
除了支持小组,Outcomes 还将您与雇主联系起来。昨天我们在学生聚光灯下展示了我们的作品集。我与优步、蓝色实验室和摩根富兰克林咨询公司进行了几次有意义的交谈。
最后,我对大会成果小组提供的支持感到非常兴奋。
建设性的批评:简历
我对大会的职业准备计划的一点建设性的批评是关于要求学生在简历中两次列出 GA,一次在经验下,一次在教育下。
对于没有技术背景的学生来说,这完全有意义。如果你想在科技行业找份工作,那么你应该尽一切努力突出你的科技技能,这些技能主要来自你在 GA 的经历。
然而,对于有技术背景的学生来说,学习一门课程来补充他们的经验或转换行业,那么这是重复的。例如,我用 Python、SQL、AWS 和大会上涉及的其他工具为美国劳工联合会-产业工会联合会管理了五年的政治和会员数据。我来 GA 的原因是通过获得机器学习技能来补充这一经验,以及探索政治以外的行业。这一组中还有其他具有 SQL 和商业智能经验的学生,他们可能也属于这一类别。
在这些学生的简历中两次列出大会是一个问题,因为它可能会挤占其他相关的有偿经验。根据以前的经验对学生进行细分,可以帮助大会更好地解决他们的相对需求。
人工智能系统中的泛化
泛化的主要目标是使 AI 系统在测试数据上表现得更好。同样,迁移学习是指在某些任务上训练系统,以提高它在其他任务上的表现。虽然这两种方法在实践中可能看起来非常不同,但它们有一个共同的目标:迫使神经网络或其他 ML 算法在一个场景中学习有用的概念,以便在新的场景中更好地执行。
此外,它们与欠拟合和过拟合问题密切相关:
当模型没有足够的能力或者训练的时间不够长以至于不能记住重要的特征时,就会发生欠拟合。当模型尺寸太大和/或训练时间太长时,会发生过度拟合,结果它会根据训练数据调整太多。这篇论文表明,深度神经网络可以很容易地记住整个训练数据集。考虑到这一点,许多关于正则化技术的研究正在进行,其目标是处理这些问题。
从数学的观点来看,正如这个的工作所示,具有良好推广质量的目标函数的局部极小值具有低的 Hessian 范数。这意味着在这一点附近,网络输出对参数的微小变化不敏感。
有趣的是,通常的随机梯度下降往往以非常高的概率收敛到一个好的最小值。但是使用一些特殊的技术,你可以达到更好的效果。
常见的正则化方法
- 降低模型的复杂性-参数越少,模型从训练数据中记忆的就越少。
- 早期停止—通过跟踪验证集的性能,当验证错误开始增加时,您可以立即停止训练。
- 权重衰减-保持较小的权重并增加稀疏度。
- DropOut —在训练过程中停用随机神经元,并强制它们的每个子集给出有意义的结果。
- 批量标准化-重新缩放数据并将数据转换到一个公共值范围。
最初发表于 认知混乱 。
广义线性模型
自从我写了第一篇面向所有人的机器学习文章以来,已经有很长时间了。从现在开始,我会试着更频繁地发表文章。
快速提示:不幸的是,Medium 不支持数学类型设置(Latex 等。),所以我把数学公式作为图片放到文章中,我不知道方程在不同的设备中是否看起来很优雅。
今天的主题是广义线性模型,这是一堆用于监督学习问题的通用机器学习模型(用于回归和分类)。
让我们从线性回归模型开始。我想,每个人在大学期间都遇到过线性回归模型,以这样或那样的方式。线性回归模型的目标是找到观察到的特征和观察到的实际输出之间的线性映射,以便当我们看到新的实例时,我们可以预测输出。在本文中,我们接受有 N 个输出为 y 的观察值和 M 个特征 x 用于训练。
N observations with 1 output and M features for each.
我们定义一个 M 维向量 w 来表示将输入映射到输出的权重。我们也定义 N 乘 M 维矩阵 X 来表示所有的输入。 y 被定义为 N 维输出向量。
We try to approximate output vector with Xw
我们的目标是找到最佳的 w ,最小化实际输出向量 y 和近似值 X w 之间的欧几里德距离。为此,我们一般使用最小二乘误差和矩阵演算来使其最小化。这里我们用 L 来表示损失(误差)函数。
Optimum w for linear regression problem
这是问题的线性代数近似,但为了更好地理解问题,并将其扩展到不同的问题设置,我们将以更概率的方式处理它。
在开始,我们说输出是真实的。实际上,我们假设输出是从正态分布中采样的。让我们明确地定义它,将分布均值设置为 Xw,方差设置为 I(单位方差)。
现在,我们的目标是找到最大化概率为 p( y |X, w )的 w 。上面我们定义 p( y |X, w )为正态分布,所以我们知道它的展开形式是正态分布的 pdf。
likelihood of y
很难直接使用似然函数,相反,我们将使用对数似然函数,它具有与似然函数相同的最大值和最小值。我们可以最大化对数似然或最小化负对数似然。我们选择第二个,称之为损失函数。
Loss function(-loglikelihood)
该损失函数与最小二乘误差函数完全相同。因此,我们从统计学角度解释了线性回归,这将对即将推出的模型非常有帮助。
地图解决方案
上面的解决方案被称为最大似然法,因为这正是我们所做的,最大化似然。我们可以将先验概率放在权重上,并最大化 w 的后验分布,而不是y 的可能性。
MAP solution
在上述方程中,我们定义了零均值、单位方差先验权重 w ,并利用负对数后验分布导出了损失函数。 w 的先验分布试图将权重值保持在其平均值附近,在这种情况下平均值为 0。这一过程被称为 L2 正则化(岭回归),它惩罚边际 w 值,因为它可以在损失函数中看到。
先验分布反映了我们对 w 值的信念,它不一定是正态分布。如果我们把拉普拉斯分布作为先验,正则项将是 w 的 1-范数(L1 正则化-Lasso)。
为了更好的说明正则化效果,我举个例子。假设我们有一个数据点,其特征为[2,1],输出为 3。对于这个问题,有无限多种方法来设置权重,但其中,L2 正则化将首选[1,1],L1 正则化将首选[1.5,0],因为[1,1]的 2-范数和[1.5,0]的 1-范数是所有可能的解决方案中最小的一个。因此,我们看到 L2 正则化试图使所有权重值尽可能接近 0。另一方面,L1 正则化偏好稀疏解。
泊松回归
我们对实值输出使用线性回归。更具体地说,如果输出值是计数,那么我们可以改变似然分布,并对这个新问题使用相同的设置。泊松分布是模拟计数数据的合适分布,我们将利用它。
泊松分布的超参数不能取负值。所以我们稍微改变一下生成模型的定义,使用线性模型不像正态分布那样直接生成超参数,而是生成它的对数(实际上是自然对数 ln)。对数是广义线性模型中泊松分布的连接函数,我们再次使用负对数似然来寻找最大似然解。
Loss function for Poisson Regression
我们取损失函数相对于 w 的导数,并使其等于 0。就我所见,它没有封闭形式的解,与线性回归相反。但是我们可以使用无约束最优化方法来寻找迭代解,下面我提供了梯度下降法。在梯度下降法中,我们通过损失梯度的负方向(因为这是损失相对于 w 减少的方向)逐渐更新权重并采取小步骤。
Iterative updates for weight
逻辑回归
上面我介绍了回归问题的模型,但是广义线性模型也可以用于分类问题。在二类分类问题中,似然性由伯努利分布定义,即输出为 1 或 0。
这次我们使用 sigmoid 函数将线性模型的输出映射到(0,1)的范围,因为伯努利平均值应该在这个范围内。
Sigmoid function
Cross-Entropy Loss Function
上面定义的损失函数被称为交叉熵损失函数,并广泛用于分类问题,我们从统计角度说明了使用它的原因。该解不存在封闭形式,我们将使用随机梯度下降法,它逐个处理实例并提供在线迭代更新机制。
Stochastic Gradient Descent for Logistic Regression
多项式逻辑回归
如果类别数大于 2,伯努利分布不足以描述数据。在这种情况下,我们更喜欢多项式分布。对于 K 类分类问题,我们用一热编码表示输出。在独热编码中,每个输出都用 K 维向量表示,除了取值为 1 并显示实例类的索引之外,所有向量都是 0。
One-hot encoding
这一次,我们定义了 y 可以属于的 K 个不同的概率。每个类都有自己的概率和权重。因此,与上述模型不同,我们定义了 K 个不同的权重向量。
An output is sampled from Multinomial Distribution
每个类别的概率需要大于 0,因此我们可以像在泊松回归中一样采用线性映射的指数。但是这次有 K 个不同的概率,它们的和应该等于 1。因此,它需要被规范化,为此我们使用 softmax 函数。
再次,我们使用负对数似然来定义损失函数,它被称为交叉熵损失函数。类似于泊松回归和逻辑回归,梯度下降优化器可以用来解决这个问题。
Cross-Entropy Loss Function for Multinomial Logistic Regression
在这篇文章中,我试图尽可能清楚。我们推导的方程很重要,因为它们构成了更复杂的机器学习模型的基础,比如神经网络。我希望你喜欢它。
用人工神经网络生成数字和声音
为乐趣而实验…
在 Cisco Emerge,我们喜欢尝试新旧工具和想法。最近,我们开始修补生成模型。
在 GitHub 上查看这些实验的源代码
什么是生成模型?
生成模型是人工神经网络,能够创建人类从未见过的“假”数据,目标是使其与真实数据无法区分。
这里有一个例子,说明了一组特定的生成模型——称为生成对抗网络——在观察了成千上万张人脸图像后能够创造出什么:
Source: https://arxiv.org/pdf/1711.09020.pdf
这就好像神经网络学会了创造一个他们观察到的世界的替代现实。
我们探索了变型自动编码器
一组特殊的生成模型被称为变分自动编码器。
除了花哨的名字,这个概念非常简单,下图可以帮助解释我们可以用它们实现什么。
Variational Autoencoder
- 编码器:神经网络的第一部分(称为编码器)读取输入——在这个例子中是一个数字——并试图将信息压缩成一个比原始输入更小的向量。
- 潜在向量(Latent Vector):这个向量被“强制”匹配一个特定的概率分布——通常是高斯分布(Gaussian Distribution),但是实际上你可以选择任何东西。
不赘述,之所以会这样,是因为我们希望能够从这个分布中采样一个向量,然后将其馈送到神经网络的第二部分,以生成新数据。 - 解码器:网络的第二部分,用来产生新数据,称为解码器。
在训练期间,编码器试图以“损失最小”的方式压缩输入,而解码器试图在只给定潜在向量作为输入的情况下尽可能地匹配原始输入。
损坏的数据
如果我们在编码器中输入损坏的输入,并要求解码器重建未损坏的输入,会发生什么情况?
Denoising Variational Autoencoder
神奇的事情发生了:解码器的输出是一个完整的图像,整个数字被精确地绘制出来。
数字明显比原始数字更平滑,也更模糊,因为关于“缺陷”的信息没有通过网络传输。只有使数字成为数字的信息会保留下来。
这一切都意味着:
- 编码器能够学习构建一个数字的表示,即使是在数字本身的一部分丢失(在上面的例子中是 20%)的情况下。
- 解码器能够学习如何从编码器学习的表示中重建完整的图像。
让我们试试声音
人工神经网络非常通用:可以执行对象识别、语音生成、自然语言处理等
出于这个原因,我们保持了相同的神经网络结构,并尝试了相同的声音实验。
嘈杂的 c 大调音阶
我们没有使用 10 个不同的数字图像,而是使用了 7 个音符——c 大调音阶。更准确地说,它们是正弦曲线(因此它们听起来或多或少像笛子)加上了白噪声(因此它们听起来像笛子,演奏者使用了大量空气)。
Click to listen to the sound
Sound1: Non corrupted noisy sinusoid
与我们之前的实验类似,我们向编码器输入斩波输入。
Sound2: This is the input of sounds we fed into the Encoder with, while the image “Sound1” is the reference that the Decoder tries to reconstruct
培养
- 0 次迭代 最初自动编码器只能产生随机噪声:
0 iterations — Line1: Spectogram of Reconstructed audio. Line 2: Waveform of Reconstructed Audio. Line 3: Spectogram of Chopped Audio fed into the Autoencoder. Line 4: Waveform of Chopped Audio
- 100 次迭代
100 iterations — Line1: Spectogram of Reconstructed audio. Line 2: Waveform of Reconstructed Audio. Line 3: Spectogram of Chopped Audio fed into the Autoencoder. Line 4: Waveform of Chopped Audio
- 200 次迭代
200 iterations — Line1: Spectogram of Reconstructed audio. Line 2: Waveform of Reconstructed Audio. Line 3: Spectogram of Chopped Audio fed into the Autoencoder. Line 4: Waveform of Chopped Audio
- 400 次迭代
这似乎类似于数字图像实验中发生的情况,输出是平滑和模糊的。
声谱图还显示,除主频率外,所有其他频率的能量都较弱。
400 iterations — Line1: Spectogram of Reconstructed audio. Line 2: Waveform of Reconstructed Audio. Line 3: Spectogram of Chopped Audio fed into the Autoencoder. Line 4: Waveform of Chopped Audio
- 800 次迭代: 自动编码器学习重建完整信号,并忽略原始输入中添加的白噪声。
800 iterations — Line1: Spectogram of Reconstructed audio. Line 2: Waveform of Reconstructed Audio. Line 3: Spectogram of Chopped Audio fed into the Autoencoder. Line 4: Waveform of Chopped Audio
听起来是这样的
这是被破坏的输入的声音。请记住,神经网络是用一个只有一部分丢失的短输入来训练的,而完整的声音是一个有许多随机丢失部分的较长输入。
重建的输入听起来像这样:
用更复杂的输入自己尝试一下
你可以在这个 GitHub repo 中找到我们用来运行这些实验并产生这些结果的所有源代码,这样你就可以尝试为数字、声音以及可能更复杂的输入复制它们。随意留下评论,叉回购。
您不需要任何特定的数据集或硬件,只需要安装一台计算机和 TensorFlow(MNIST 数据集附带 tensor flow)。
如果你得到了什么有趣的结果,请在评论中分享。
谷歌洋红色
你可能想看看谷歌的这个项目:用 NSynth 生成你自己的声音。
与我们刚刚展示的实验类似,他们建立了能够学习并直接生成原始音频样本的神经网络。
结论
正如上面提到的 Google Magenta 的项目,已经有人在努力用人工神经网络生成音频,他们取得的结果令人印象深刻。
我们试图让这个实验尽可能简单,这样任何人都可以在不需要庞大数据集和配备 GPU 的昂贵机器的情况下进行尝试,并深入了解可变自动编码器如何对图像和原始声音进行处理。
使用语言模型和 LSTMs 生成德雷克说唱歌词
深入了解你的 MC-LSTM,即将在 iTunes 上发布
所有未来人工智能应用的一个主要部分是建立能够从一些数据集学习的网络,然后生成原创内容。这个想法已经被应用到自然语言处理(NLP)中,这就是人工智能社区如何开发出所谓的语言模型
语言模型的前提是了解句子是如何在文本中构建的,并使用这些知识来生成新的内容
就我而言,我想尝试将说唱一代作为一个有趣的附带项目,看看我是否能重现加拿大流行说唱歌手德雷克(又名# 6 上帝)的歌词
我还想分享一个通用的机器学习项目管道,因为我发现,如果你不知道从哪里开始,建立自己的东西往往是非常困难的。
1.获取数据
这一切都是从寻找德雷克所有歌曲的数据集开始的,我不想浪费太多时间,所以我自己构建了一个快速脚本,抓取一个叫做metrolyrics.com的流行网站的网页
我用一个众所周知的 Python 包 BeautifulSoup 来抓取页面,这是我从这个由 Justin Yek 写的的很棒的教程中用了大约 5 分钟学会的。注意,我实际上预先定义了我想从 *metrolyrics 中获取的歌曲,*这就是为什么你可能会注意到我在上面的代码中迭代了我的songs
dataframe。
DataFrame storing all of the songs lyrics
运行剪贴簿后,我有我所有的歌词在适当的格式。csv 文件,并准备开始预处理数据和构建模型。
关于模型
现在,我们将讨论文本生成的模型,这才是你真正要做的,这是真正的酱油-生酱油。我将从讨论模型设计和一些使歌词生成成为可能的重要元素开始,然后,我们将开始讨论它的实现。
建立语言模型有两种主要方法:(1)字符级模型和(2)单词级模型。
每种模型的主要区别在于输入和输出是什么,我将在这里详细讨论每种模型的工作原理。
字符级模型
在字符级模型的情况下,你的输入是一系列字符seed
,你的模型负责预测下一个字符new_char
。然后你一起使用seed + new_char
来生成下一个字符,以此类推。请注意,由于您的网络输入必须总是相同的形状,我们实际上会在此过程的每次迭代中从种子中丢失一个字符。这是一个简单的可视化:
Fig. 2 Iterative process of word generation with Character-level Language Model
在每一次迭代中,该模型基本上是在给定种子字符的情况下预测下一个最可能的字符是什么,或者使用条件概率,这可以描述为寻找最大值P(new_char|seed)
,其中new_char
是字母表中的任何字符。在我们的例子中,字母表是一组全英文字母和一个空格字符。(注意,您的字母表可以非常不同,可以包含您想要的任何字符,这取决于您正在为其构建模型的语言)
单词级模型
单词级模型与字符级模型几乎相同,但它生成下一个单词而不是下一个字符。这里有一个简单的例子:
Fig. 3 Iterative process of word generation with Word-level Language Model
现在,在这个模型中,我们以一个单位向前看,但这次我们的单位是一个词,而不是一个字符。因此,我们在寻找P(new_word|seed)
,其中new_word
是我们词汇表中的任何单词。
请注意,现在我们正在搜索比以前大得多的集合。使用 alphabet,我们搜索了大约 30 个项目,现在我们在每次迭代中搜索更多的项目,因此单词级算法在每次迭代中更慢,但由于我们生成的是整个单词而不是单个字符,所以实际上一点也不差。作为我们的单词级模型的最后一点,我们可以拥有非常多样化的词汇,我们通常通过从我们的数据集中找到所有独特的单词来发展它(通常在数据预处理阶段完成)。因为词汇表可以变得无限大,所以有许多技术可以提高算法的效率,比如单词嵌入,但那是以后的文章了。
出于本文的目的,我将把重点放在字符级模型上,因为它的实现更简单,并且对字符级模型的理解可以很容易地转移到更复杂的单词级模型上。当我写这篇文章的时候,我也建立了一个单词级的模型,当我写完之后,我会附上一个链接(或者你可以关注我来保持更新😉)
2。数据预处理
对于角色级别的模型,我们将不得不以下列方式预处理数据:
- 标记化数据集 —当我们将输入输入到模型中时,我们不想只输入字符串,而是希望使用字符,因为这是一个字符级的模型。所以我们要把所有的歌词拆分成字符列表。
- 定义字母表—现在,我们知道了歌词中可能出现的每一种字符(来自之前的标记化步骤),我们希望找到所有独特的字符。为了简单起见,事实上整个数据集并不是很大(我只使用了 140 首歌曲),我将坚持使用英文字母和几个特殊字符(如空格),并将忽略所有数字和其他东西(因为数据集很小,我宁愿让我的模型预测更少的字符)。
- 创建训练序列 —我们将使用滑动窗口的概念,通过在句子上滑动固定大小的窗口来创建一组训练示例。这里有一个形象化的好方法:
Fig. 4 Sliding window on the dataset with input/output generation
通过一次移动一个字符,我们生成长度为 20 个字符的输入和一个输出字符。此外,由于我们一次移动一个字符,我们实际上大大扩展了数据集的大小。
4.标签编码训练序列—最后,由于我们不希望模型处理原始字符(尽管理论上这是可能的,因为字符在技术上只是一个数字,所以你几乎可以说 ASCII 为我们编码了所有的字符)。我们将一个唯一的整数与字母表中的每个字符相关联,你可能听说过标签编码。这也是我们创建两个非常重要的映射character-to-index
和index-to-character
的时候。有了这两个映射,我们总是可以将任何字符编码成它的惟一整数,并且还可以将模型的输出从索引解码回它的原始字符。
5.One-Hot-encoding dataset—因为我们正在处理分类数据,其中所有字符都属于某种类别,所以我们必须对输入列进行编码。这里有一个伟大的描述由 Rakshith Vasudev 写的单热编码实际上做了什么。
一旦我们完成了这五个步骤,我们就差不多完成了,现在我们要做的就是建立模型并训练它。如果您想更深入地了解细节,这里是前五个步骤的代码。
3.构建模型
为了用一组先前的字符来预测下一个字符,我们将使用递归神经网络(RNN),或者特别是长短期记忆网络(LSTM)。如果你对这两个概念都不熟悉,我建议你仔细阅读一下。 RNNs 作者 Pranoy Radhakrishnan 和 LSMTs 作者 Eugine Kang 。如果你只是需要一个复习或感觉勇敢,这里有一个快速纲要:
RNN 进修
通常,您会看到网络看起来像一张网,从许多节点汇聚到一个输出。大概是这样的:
Fig. 5 Image of a Neural Network. credit
这里我们有一个单一的输入点和一个单一的输出点。这对于不连续的输入非常有用,因为输入的顺序不会影响输出。但在我们的例子中,字符的顺序实际上非常重要,因为字符的特定顺序是创建独特单词的原因。
RNNs 通过创建一个网络来解决这个问题,该网络接收连续的输入,并且还使用来自前一个节点的激活作为下一个节点的参数。
Fig. 6 Overview of a simple RNN
还记得我们的一个序列Tryna_keep_it_simple
的例子,我们提取出在它之后的下一个字符应该是_
。这正是我们希望我们的网络所做的。我们将输入字符序列,其中每个字符进入T — > s<1>, r -> x<2>, n -> x<3>... e-> x<n>
,网络预测输出y -> _
,这是一个空格,是我们的下一个字符。
LSTM 进修
简单的 rnn 有一个问题,它们不太擅长将信息从非常早期的细胞传递到后来的细胞。例如,如果你正在看一个句子Tryna keep it simple is a struggle for me
,如果你不能回头看看之前出现的其他单词,那么预测最后一个单词me
(可以是字面上的任何人或任何东西,如:巴卡、猫、土豆)是非常困难的。
lstm 通过给每个单元增加一点内存来解决这个问题,每个单元存储一些关于之前发生的事情的信息(之前出现了什么单词),这就是为什么 lstm 看起来像这样:
Fig. 7 LSTM visualization, taken from Andrew Ng’s Deep Learning specialization
除了传递a<n>
激活之外,您还传递了c<n>
,它包含了之前节点中发生的事情的信息。这就是为什么 LSTMs 更好地保留了上下文,并且通常可以为语言建模等目的做出更好的预测。
实际上在建造它
我以前学过一点 Keras,所以我用它作为框架来建立网络,但在现实中,这可以手工完成,唯一的区别是它会花很多时间。
如您所见,我们使用了 LSTM 模型,也使用了批处理,这意味着我们对数据子集进行训练,而不是一次训练所有数据,以略微加快训练过程。
4.生成歌词
在我们的网络被训练之后,这里是我们将如何寻找下一个字符。我们将获得一些随机种子,它将是用户输入的一个简单的字符串。然后,我们将使用种子作为网络的输入来预测下一个字符,我们将重复这个过程,直到我们生成一串新的行;类似于上面显示的图 2。
下面是一些生成的歌词的例子
**注意:**歌词未经审查,请自行查看
您可能已经注意到,单词有时没有意义,这是字符级模型的一个常见问题,因为输入数据经常在单词中间被分割,这使得网络学习并生成奇怪的新单词,而这些单词对它来说却有意义。
这是用单词级模型解决的问题,但是对于不到 200 行的代码,字符级模型仍然令人印象深刻。
其他应用
这个字符级网络中描述的想法可以扩展到许多其他应用程序,这些应用程序远比歌词生成有用。
例如,iPhone 键盘上的下一个单词推荐也是如此。
Keyboard next word prediction
想象一下,如果您构建一个足够精确的 Python 语言模型,您不仅可以自动完成关键字或变量名,还可以自动完成大块代码,从而为程序员节省大量时间。
你可能已经注意到这里的代码并不完整,并且缺少一些部分,这里是我的 Github repo 的链接,在这里你可以更深入地了解自己构建一个类似项目的细节。
感谢来自 github 的 Keras 示例
总之,我希望你喜欢阅读这个故事,请考虑跟随或鼓掌👏如果你做了。如果你对更多类似的内容感兴趣,你可以在这里关注我,或者在其他任何社交媒体上关注@nikolaevra。
下次我会抓住你的!
用深度学习生成俳句(第一部分)
使用神经网络生成 5–7–5 音节结构的俳句。
https://imgur.com/r/all/4aYN3 (Original source unknown)
有很多关于使用深度学习生成文本的工作——计算机生成模仿人类书写文本的新文本。甚至简单的模型也能产生令人信服的文本,正如安德烈·卡帕西因而出名。但是他们努力的一个地方是当文本必须满足严格的结构约束时。我们如何改进当前的文本生成模型,使其更好地完成这项任务?
俳句生成是严格约束任务的一个例子。它们是由三行诗组成的非常短的诗。传统上第一行是 5 个音节,第二行是 7 个音节,第三行是 5 个音节。例如,由布莱恩·德尔·韦基奥:
俳句的发明者
的中指一定有七根手指
现代俳句保留了一首简短的三行诗的精髓,但并不严格遵循 5-7-5 音节的结构。因此,大多数用于获取训练数据的在线俳句都不具备这种结构,而且许多先前关于生成俳句的研究也没有强制音节数。
这让我想到了我的问题:我们能创作出既有意义又结构正确的俳句吗?
https://www.savagechickens.com/2010/02/easy-haiku.html
先前的工作
我以前做过俳句生成方面的工作。这个生成器使用在非俳句诗歌语料库上训练的马尔可夫链,一次生成一个词,当所有可能的下一个词都违反 5–7–5 结构时,通过退格确保 5-7-5 结构。这和我写俳句时做的没什么不同。我尝试一些东西,数出音节,发现它们不起作用,然后返回。但这并不令人满意。这感觉更像是蛮力,而不是真正理解写俳句意味着什么的东西。我还使用了同样的方法,使用了一个非诗歌训练语料库。
我不是唯一一个尝试过的人。萨姆·巴拉斯和 T2【塔内尔·基尔斯&马库斯·康塞普都使用了标准的字符级递归神经网络(RNN)来生成俳句。他们产生的输出看起来像俳句,但不是很有凝聚力,当然也不符合我们所寻找的结构。部分问题是,正如我上面所说的,大多数现代俳句不遵循这种结构,这意味着训练语料库不会反映它。另一个问题是,字符与音节的相关性很差,因此,即使有一个好的语料库,只给字符的模型也不太可能选择 5–7–5 形式。
杰克·霍普金斯和多维基拉提出了几种生成诗歌的模式。他们把重点放在十四行诗上,十四行诗不仅对每行的音节数有限制,而且必须遵循特定的押韵方案。一个模型是音素级别的,这允许他们在训练时限制结构。另一个是字符级模型,可以产生更连贯的文本,但对形式没有任何限制。他们在采样时通过使用鉴别器来限制文本,该鉴别器将拒绝不符合期望度量的文本,类似于我的马尔可夫模型技术。
数据
我使用了四个来源来构建我的训练语料库:
- http://www.tempslibres.org/tl/en/dbhk00.html
- 来自《叙事描述之外的三行诗:多元对抗训练下的意象生成诗》语料库。
- 山姆·巴拉斯的诗集。
- 赫瓦尔·弗莱雷的海枯藻文集。
这个 Jupyter 笔记本有我的资料准备流程。它清理数据并使用CMU 发音词典 (CMUdict)计算每行的音节数。CMUdict 将单词映射到它们的音素,这又可以用于计算每个单词的音节数。如果一个单词有多个有效发音,则保留每个发音。
最终的语料库包含了 25886 首诗,其中只有 725 首(3%!)匹配 5–7–5 结构,这远远不足以训练模型。
问题是
这让我们陷入了困境。我们的目标是生成符合传统的 5–7–5 结构的俳句,但我们在这方面的训练数据很少。我们有什么选择?
1.获取更多数据。如果有人自愿为我写几千首俳句,我很乐意接受这个提议。
2.使用类似于霍普金斯和基拉所做的方法,我们在整个语料库上不受限制地训练一个字符级网络来“学习英语”——学习如何构成单词、句子结构等。,然后在采样时使用一个可以将诗歌分类为俳句或不分类的鉴别器来约束形式。这种方法的一个问题是,它可能很难产生有凝聚力的、完整的俳句。从本质上讲,生成器是贪婪的,它将一直生成文本,直到鉴别器告诉它停止,此时不确定生成器是否完成了“完整的思想”。给定任何严格约束的格式,在采样时实施格式的同时,很难保持内容的内聚性。为了证明我所说的不完整的想法是什么意思,这里有一个例子,是我以前的作品使用类似的样本时间限制生成的一首诗:
哦,福楼沙,看看
它来得多快,滋养着
食物,直到最后死亡
击杀什么?
3.在整个语料库上训练,但是在训练时告诉网络和在采样时告诉网络该行有多少音节。即使我们在一条有 3 或 10 个音节的线上训练,我的希望是当我们在采样时间要求 5 或 7 个音节时,模型可以概括。这是我采用的技术。
模型
High level diagram of the model. Three dense layers are used to embed the number of syllables for each line into the LSTM’s state. Then text is fed through the LSTM one character at a time and a dense network
该模型本质上是一个扭曲的字符到字符的文本生成网络。每行的音节数被提供给网络,通过一个密集层,然后添加到 LSTM 的内部状态。这意味着通过改变提供的三个数字,我们可以改变网络的行为。我的希望是,这仍然允许网络从整个语料库中学习“英语”,即使大多数样本不是 5-7-5 句俳句,同时仍然允许我们以后生成那个长度的俳句。这个 python 文件实现了模型和生成器。
这个 Jupyter 笔记本展示了训练过程。简而言之,我在角色层面对数据进行一次热编码,将数据分成训练集和验证集,然后使用教师强制进行训练。我在 Paperspace P6000 虚拟机器上对该模型进行了大约 2 个小时的训练,尽管在 4 个周期之后,它很快就停止了改进。这是一张培训和验证损失随时间变化的图表:
The training loss (blue line) and validation loss (red line) after each epoch of training. After two epochs the validation loss is almost as good as it will get, and it gets worse after epoch 4. Meanwhile the training loss keeps improving, meaning the model is over-fitting the training data.
结果
最后,我们到了有趣的部分——看看这会产生什么样的废话。
为了生成每首俳句,我首先为三行中的每一行指定我想要的音节数(即 5,7,5)。然后,我为第一个单词随机选择一个字符,并将其输入模型,该模型输出每个字符成为下一个字符的概率。我从这些字符中选择一个,与它们的概率成比例,并根据“温度”进行缩放,温度影响我们选择低概率字符的可能性。温度越高,随机性越大。一旦我选择了下一个字符,我就将它反馈到模型中,并重复直到行尾。在行间,我输入下一行的音节数来更新 LSTM 的状态。该函数包含生成代码。
当验证损失停止下降时,我在训练时期 4 后使用检查点生成了以下所有内容。
以下是一些采样温度为 0.1(不太随机)时产生的 5–7–5 个俳句:
就在我走在沙滩上的时候
太阳像一顶皇冠
春天来了正当我越来越深的时候,我想看看春风的底部
清晨的太阳
从被搬运的花园命运
日落时的星星
虽然音节数并不完美,但很酷的是我们可以看到我们提供的音节数影响了生成的文本。例如,输入 3–5–3 会产生:
春天的阳光
来自星星的水的味道深冬
来自星星的乌鸦
的气味海滩上学
水的味道
天空中
而 10–10–10 会产生更长的线:
上帝一定偷听到了春天的友好气息随着我的每一次心跳,我将爱你
你能看见太阳的离去吗?我想看看太阳在春天的消逝,在落日的余晖中
就像街灯说的那样,阳光灿烂,灵魂和春天在吹拂,我将爱你,伴随着我每一次心跳
如你所见,它可能相当重复和公式化。我们可以调高采样温度,让模型更有“创造性”取样温度
5–7–5 首俳句,温度 0.3:
春天晚上的早餐
我和一只蝴蝶看见了
她面朝大海一月的黎明
老路树上蛾子清扫的声音月亮上滑稽的下午
和春风的轨迹
到了 0.5 岁,它开始在拼写上有问题:
远离公路
千里之外的村庄
夏想的大海每一个睡觉的妻子都从他的手里掉下来
和同一个枕头棉下
的个人时间
在电脑灯下
到了 1.0 版本,这几乎是无稽之谈:
佐德过去最后一个巴斯特?我从未向往过冬天的山
这个 Jupyter 笔记本有更多生成的俳句。
未来的工作
这是一个好的开始。对于当前的所有缺点,我们证明了通过将音节的数量作为模型的输入,我们可以影响生成的行的长度。
要改善这一点,还有很多工作要做。我想谈几个问题:
- 更加一致地坚持 5-7-5 音节形式,而不仅仅是在正确的邻近地区。
- 创作更连贯、更有意义的俳句
从哪里开始的一些想法:
- 更多更好的数据。我想得到更多的 5-7-5 个俳句的例子,或者一种在任何文本上训练然后从中产生俳句的方法。
- 尝试其他神经网络架构,比如一个更简单的模型,我预先输入音节数,然后生成整个俳句,而不是一次一行。
- 尝试一个音素级别的模型,类似于霍普金斯和基拉在他们的工作中使用的模型。这将使学习音节变得更容易,因为只有特定的音素才有音节的重量。但是它引入了将音素映射回单词的复杂性。
- 使用生成性对抗网络(GAN ),在该网络中,鉴别者可以评估俳句的内容和/或形式。
感谢 Abigail Pope-Brooks 的编辑和反馈。
所有用到的代码和数据都可以在 github 上获得。杰里米·内曼在他的网站上做着同样毫无意义的事情:http://jeremyneiman.com/
使用深度学习生成印度尼西亚歌词-第一部分
循序渐进。从刮擦到从零开始生成“?lalala”。(英文)
“shallow focus photography of audio mixer” by Hannah Troupe on Unsplash
H ello 各位,我对现在真正炒作的人工智能 (AI)真的很感兴趣。我也对用它来制作东西很感兴趣。目前,创建几个人工智能应用程序是我的爱好之一。在我的空闲时间,有时,我会制作一个人工智能应用程序来释放我的无聊。
source: pexels.com
我想习惯写作。为了练习,我需要开始写作。由于我有制作人工智能的爱好,我想分享我制作人工智能的知识和经验来练习我的写作技巧。“印度尼西亚歌词生成器”是我在空闲时间制作的一个人工智能应用程序。
我会让这篇文章对新手友好。希望这篇文章对你有用:d。
本文的目标读者是对人工智能感兴趣的人,尤其是对机器学习和深度学习感兴趣的人。我也会让这篇文章没有数学。如果你想知道它是如何工作的,我会在源代码部分附上一些文章。
这是我们的介绍歌词。
saat senyum manismu kalbuku
杨振宁说
terakhir kali ku hilang dariku
yang kau ajak kau disana
如果你想看这篇文章的实现和代码,你可以在这个 GitHub 链接中看到笔记本
介绍
新音乐总是会出现取代旧音乐。人们应该在创作新歌时有创造性。他们需要时间创作一首新歌。他们在制作歌曲时应该考虑的一个因素是歌词。对于那些很难找到一个合适的词来创作歌词的人(比如我),这将是一个问题。他们会花很多时间来做歌词。你想过帮助他们解决问题吗?
Source : pixabay.com
在这篇文章中,我想创建一个应用程序,可以让他们轻松地创作歌词。我会做一个基于人工智能的应用程序。人工智能知识是我的兴趣之一,我希望能帮助他们。
目前,人工智能是最热门的时髦词汇之一,人们在每个角落谈论它。它可以轻松解决一些对人类来说相当困难的问题。人工智能的一个分支是机器学习。机器学习是人工智能领域的一个分支,它可以根据给定的数据预测输出。它会从数据中学习。当我们想写一首歌词时,我认为我们应该偷看一些老歌,以了解他们是如何写歌词的。我们需要搜索他们如何连接每个单词的“模式”。这类似于从给定数据中学习的机器学习。
在本文中,我们将基于我丢弃的歌词数据集生成一个新的歌词。我们将使用深度学习,一种机器学习技术。我们将使用递归神经网络(RNN)来制作发电机的模型。
即使我选择的歌词是印度尼西亚语,不要担心。我将用英语写这篇文章。如果你想知道歌词的意思,用谷歌翻译或其他熟悉的工具翻译。
如果你对深度学习的术语还不熟悉,不要担心。我将告诉你每个人的简要描述。我会告诉你如何从开始(刮)管道。正如我在开始时所说的,我会尽可能让它对新手友好。
概述
我将按以下顺序写这篇文章:
- 工具
- 步骤
- 收集数据
- 预处理数据
- 建立模型
- 生成歌词
- 结论
- 编后记
- 来源
工具
将使用的库、工具和语言编程包括:
- Python 3.6
- Python 库 numpy,python 中的数学工具
- Python 库 pandas,python 中的数据表格工具
- Python 库— Keras ,深度学习框架。必须有 Tensorflow、CNTK 或 Theano 库
- Python 库— Scrapy ,Python 中流行的 scrapper 工具
- Jupyter 笔记本,(可选)牛逼的 Python IDE,也可以用来做演示或者教育代码。
我使用图形处理器英伟达 GTX 1050 来训练我的模型。
步骤或管道
Image 1 : Step or Pipeline
这是我们制作发电机的步骤。
首先,通过使用 scrapy 抓取一些包含印度尼西亚歌词的网站来收集数据。然后使用 regex 清理仍然包含 HTML 标签的文本歌词。之后,处理歌词中的文本,以便它可以用于模型的输入。我们将需要构建深度学习架构。最后训练模型生成歌词。我会告诉你我是如何做到每一步的。
收集数据(网络搜集)
我从一个印尼歌词收集网站(lirik.kapanlagi.com)搜集了所有的歌词。网络抓取是从网站中提取数据。所有的工作都是由一个应用程序,我们将创建。我们将使用 scrapy 库来抓取一个网站。我们要提取的信息是宋的歌词和歌名。
在本文中,我们将使用 lirik.kapanlagi.com 作为我们的目标。
首先,在终端或命令提示符下使用以下命令创建 scrapy 项目:
scrapy startproject lyric_scrapper
它将创建一个新的目录。切换到新目录并执行以下命令
scrapy genspider lyric_scrapper lirik.kapanlagi.com
它将在 tutorial/spiders 文件夹中创建一个lyricscrapper.py
。我们称之为网络爬虫,因为它通过“爬行”进入目标网站。这是我们的代码:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractorclass LyricScrapperSpider(CrawlSpider):
name = 'lyric_scrapper'
allowed_domains = ['lirik.kapanlagi.com']
start_urls = ['[https://lirik.kapanlagi.com/lagu/a_id'](https://lirik.kapanlagi.com/lagu/a_id')]
rules = (Rule(LinkExtractor(allow=(), restrict_css=(".pagination2 ul li a",".col-lirik .div-horizontal2-list a", "div .letterLinksAnchor")), callback="parse_page", follow=True),)
def parse_page(self, response):
song = response.css('.col-lirik').extract_first()
title= response.css('.head-lirik h5::text').extract_first()
if len(title) > 0 and len(song) > 0:scraped_info = {
'song' : song,
'title' : title,
}yield scraped_info
让我们看看这一部分:
start_urls = ['[https://lirik.kapanlagi.com/lagu/a_id'](https://lirik.kapanlagi.com/lagu/a_id')]
rules = (Rule(LinkExtractor(allow=(), restrict_css=(".pagination2 ul li a",".col-lirik .div-horizontal2-list a", "div .letterLinksAnchor")), callback="parse_page", follow=True),)
我们将从start_urls
中的 URL 开始。为了确定起始 URL,我们应该找到包含歌词索引列表的页面。我发现是 https://lirik.kapanlagi.com/lagu/a_id的索引列表。
爬行器将通过在当前网页中查找 URL 来找到下一个要抓取的目标。为了让爬虫跟踪我们想要的页面,我们必须指定爬虫必须看到网页的哪个部分。在这种情况下,我们需要瞄准图 2 所示的这部分:
Image 2 : We will target these parts (blue marker)
我们需要通过检查 HTML 代码来得到我们想要的部分。对我来说,我用 Inspect Element 来做(Firefox)。对于这个网站,我们将限制爬虫将目标(“.pagination2 ul li a”,”.col-lirik .div-horizontal2-list a”, “div .letterLinksAnchor”)
。它将抓取网站,直到没有更多的网址抓取(它还会检查该网址是否已被访问)。
Image 3: Part that we want to extract
接下来,我们要从网页中提取歌词和标题的歌曲。为此,我们需要找到包含它们的 HTML 标签(图 3 中红色和蓝色的标签)。
song = response.css('.col-lirik').extract_first()
title = response.css('.head-lirik h5::text').extract_first()
对于歌词(我将其命名为’ song '变量),我们需要 HTML 代码,因为这个网站的 HTML 组成有点乱。我们一会儿需要清理它。
救你的lyricscrapper.py
。然后,打开文件夹内的settings.py
。
添加或取消注释这些行:
FEED_FORMAT = "csv"
FEED_URI = "scrape.csv"DOWNLOAD_DELAY = 1 # important, sometimes you will get banned if you set it to 0\.
保存它,然后在控制台上执行以下命令:
scrapy crawl lyric_scrapper
瞧,我们的爬虫将爬行我们的目标站点。只要等到它结束或强迫它结束,如果你很无聊。结束后,它会在文件夹内生成scrape.csv
。您可以使用电子表格工具打开它来查看。有点乱,不是吗?。如上所述,我们需要清理歌词的文本。所以让我们进入下一步。
清除报废数据
现在是时候清理我们的脏数据了。因为我们只想生成歌词,所以我们只需要来自scrape.csv
的歌曲列。在开始之前,我建议我们使用 Python IDE,如 Jupyter Notebook 或 Spyder,以便更好地查看我们的数据。在这一部分,我们将使用 pandas 库来查看表格中的数据。
打开您的代码,然后让我们导入我们的 csv 数据,并将其转换成 dataframe 类型(pd.DataFrame
)。为了检查歌词的歌曲,我们将采样 5 个实例。一定要把scrape.csv
文件放到我们 python 的代码文件夹中。
import pandas as pd
scrape_lyric = pd.read_csv('scrape.csv')
scrape_lyric.sample(5)
首先,我们需要确保我们的数据没有缺失数据。然后,如果提取了一些错误页面,我们就移除不想要的数据。在我们的例子中,我们会发现我们的歌词网页应该包含 span 标签。所以删除没有 span 标签的实例。我们将删除包含“Belum ada Lirik”文本实例(翻译:没有任何歌词)。
在清理之前,我们应该检查数据的大小。使用scrape_lyric.shape
进行检查。我有 20259 行。
scrape_lyric = scrape_lyric.dropna()
scrape_lyric = scrape_lyric[scrape_lyric.song.str.contains('span')]
scrape_lyric = scrape_lyric[~(scrape_lyric.song.str.contains('Belum Ada Lirik'))]
检查你的数据帧scrape_lyric.shape
的大小,我有 13791 行。它遗漏了 6468 行!
我们只会看到‘宋’一栏。通过查看 song 列,我们会看到文本仍然有 HTML 标记。我们需要清理它。我们将使用正则表达式来做这件事。
Image 4: Example of 1 instance in the data
这个清理正则表达式只适用于我们的目标网站。如果我们的目标是其他网站,我们需要看看 HTML 模式是怎样的,并使用适当的正则表达式来清理它(或者如果网站很好解析,可能不需要清理数据)。
这里是清理我们的网页的正则表达式:
def clean_text_lyric(lyric, max_length):
lyric_sample = lyric.split('</span>')
lyric_sample = lyric_sample[:-1]
clean_song_lyric = ""
for sentence in lyric_sample:
if 'http' not in sentence:
sentence = re.sub(r'<div .*>','',sentence)
sentence = re.sub(r'<span .*>','',sentence)
sentence = sentence.strip()
if len(sentence) > 0:
sentence = re.sub(r'[^a-zA-Z0-9<\/>\s]',' ', sentence) sentence = " <div> " + sentence + " </div> "
sentence = re.sub(r'<div>\s+<br>','<br> <div> ', sentence)
sentence = re.sub(r'(\d|\r|\t|\n)','',sentence) clean_song_lyric += sentence clean_song_lyric = ' <start> ' * (max_length-1) + clean_song_lyric
return clean_song_lyric
我们将逐一看到:
lyric_sample = lyric.split('</span>')
lyric_sample = lyric_sample[:-1]
如果我们查看我们提取的歌词,他们用 HTML 标签“<br>
”来分隔他们的诗句。1 节包含几行。每行由 HTML 标记“</span>
”分隔。我们需要通过使用“</span>
”来拆分行。
现在我们移除 HTML 标签(div,span)
sentence = re.sub(r'<div .*>','',sentence)
sentence = re.sub(r'<span .*>','',sentence)
然后我们将删除除了 [^a-zA-Z0–9<\/>\s]
以外的所有字符。我们删除了转义字符和多余的空白。如果你不熟悉 regex,建议你试试这个站点玩 regex。
sentence = re.sub(r'[^a-zA-Z0-9<\/>\s]',' ', sentence)sentence = " <div> " + sentence + " </div> "
sentence = re.sub(r'<div>\s+<br>','<br> <div> ', sentence)
sentence = re.sub(r'(\d|\r|\t|\n)','',sentence)
我讨厌这个网站的 HTML 代码。提取的歌词有时在歌词内有 URL。这就是为什么我设置了循环保护来确保里面没有 URL。
在我们清理文本之后,我们想要标记我们的开始和结束歌词的行。
对我来说,我使用了<div>
和</div>
标签来标记我们歌词的开始和结束。
我们不会删除<br>
标签。这是一个标记,用来分隔每一节。
最后,我们将在所需的max_length-1
的歌词开头添加<start>
标签。我们为什么要这么做?我以后会告诉你。
将其应用到数据框中:
scrape_lyric['song'] = scrape_lyric['song'].apply(lambda x: clean_text_lyric(x))
这是我们想要使用的歌词格式文本。
Image 5: desired lyric’s format
预处理数据
清理完数据后,让我们进入数据预处理。为什么我们需要这样做?我们的深度学习模型的输入是一系列文本。它不能在字符串模式下读取文本。我们需要将数据集中的所有单词编码到索引号中,在一次热编码中将索引号映射到单词中。当我们使用嵌入时,在 keras 中,我们不必将文本编码成一个热编码。我们可以使用键索引映射来映射模型中带有索引号的单词。
在此之前,让我们将包含几行的歌词转换成一个具有所需长度的序列文本数组集合。
def generate_train_dataset(song_series, window):
train_data = []
train_label = []
for song_string in song_series:
song_arr = song_string.split()
len_song_arr = len(song_arr) for i in range(0,len_song_arr-window+1):
train_data.append(' '.join(song_arr[i:i+window-1]))
train_label.append(song_arr[i+window-1])
return np.array(train_data), np.array(train_label)
请看图 6,想象一下generate_train_dataset
功能是如何工作的。它将从开始切片到window-1
并将其添加到 train_data 列表中。然后将最后一个索引添加到train_label
列表中。这叫做滑动窗口,窗口长度等于我们的window
参数。在本文中,我们将设置窗口等于 10。
Image 6: sent_len parameter set to 5
我们创建的函数需要一个pandas.Series
类型作为输入。
max_length = 10 #window
X, y = generate_train_dataset(scrape_lyric.song, sent_len=max_length)
成功了吗?很好,接下来我们将使用keras.preprocessing.text.Tokenizer
库来创建一个输入映射,它将一个单词映射到函数选择的索引号。确保更改参数过滤器,不包括‘<’
和‘>’
。
pre = keras.preprocessing.text.Tokenizer(filters='!"#$%&()*+,-.:;=?@[\\]^_`{|}~\t\n')
pre.fit_on_texts(X.flatten()) # need to flatten the array
我们将得到词汇量,它包含了我们的数据中有多少独特的单词。
vocab_size = len(pre.word_index)
我们将数据转换成单词索引序列:
X = pre.texts_to_sequences(X)
y = pre.texts_to_sequences(y)
Image 7: How Our Tokenization works
我们已经完成了对输入数据的预处理。我有大约 200 万个例子。
让我们继续创建模型。
定义深度学习的架构
在我们深入研究代码和实现之前,让我们回忆一下什么是深度学习、密集层、RNN、LSTM 层和激活函数。我们会召回他们。
深度学习
深度学习是机器学习技术的一个子集。根据 Yoshua Bengio 的说法,他说“深度学习算法寻求利用输入分布中的未知结构,以便发现良好的表示,通常是在多个级别,较高级别的学习特征根据较低级别的特征来定义”。
Source : pixabay.com
深度学习将从数据中学习特征表示。我们不必从数据中提取特征。它不同于其他需要提取特征的机器学习算法。它由模仿人脑的几个层次和网络组成。它有许多别名,如深度神经网络。深度神经网络的主要部分是反向传播算法,它将使用优化器算法更新我们的模型权重,使误差最小。如果你想了解更多,请访问这个网站。
把…嵌入
Source : ruder.io
嵌入是一种技术,它将使我们在数据集中的实例成为一种经过学习的表示。在本教程中,我们将使用单词嵌入。单词嵌入将把我们的单词表示成作为实值向量的学习表示。它通常由十维或数百维向量组成。向量通常会捕捉单词的意思。
有几种算法可以进行单词嵌入。有:
- 嵌入层
- Word2vec
- 手套
- 节目预留装置
- 埃尔莫(新)
在我们的模型中,我们将使用嵌入层。它将根据我们的模型更新向量。
致密层
这是全连接层的别名。它是一个线性层,传播一个线性函数,并使用该函数的导数(梯度)从一个神经元反向传播到另一个神经元。更简单地说,这是一个网络,它只接受输入并乘以从反向传播中学习到的权重。我找到了一篇中型文章,可以帮助你更好地理解全连接层。
RNN 和 LSTM
Source : colah.github.io
递归神经网络(RNN)是一个具有内部存储器的层,因此它可以记住输入的序列信息。神经元之间连接是一系列有向图。它会记住前一个神经元的信息(权重),并将其传递给当前神经元。
使用 RNN 有几个缺点。它学不会’长期依赖’。它会遇到一个问题,叫做“消失梯度”。它不会再更新神经元的权重。为了解决这个问题,长短期记忆(LSTM)被使用。
LSTM 是 RNN 问题的一剂良药。它有能力解决“长期依赖”问题。LSTM 有能力通过一种叫做“门”的结构给新神经元添加或删除信息。LSTM 有三个门:遗忘门、输入门和输出门。他们将控制神经元的状态。如需了解更多信息,您可以访问此网站。
批量标准化
归一化目标图层的输出值。它们的平均输出激活为 0,标准偏差为 1。它有几个好处,如加快我们的训练速度。如果你想了解更多关于 BatchNormalization 的细节,请看这篇文章。
激活功能
它用于确定一个层的输出是否被激活。它将输出映射到激活函数的范围。要了解更多细节,请访问这篇文章。
体系结构
回忆完了吗?让我们进入代码
我们将建立的是一个简单的架构深度网络。它由嵌入层、LSTM 层和密集层组成,以分类交叉熵和 softmax 激活作为输出。图 7 是我们想要创建的架构的可视化。
Image 7 : Visualization of our architecture
model = Sequential()
e = Embedding(vocab_size,100 ,input_length=max_length-1, trainable=True)
model.add(e)
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Bidirectional(keras.layers.CuDNNLSTM(100)))
model.add(keras.layers.BatchNormalization())model.add(Dense(100, activation='relu'))
model.add(keras.layers.BatchNormalization())model.add(Dense(vocab_size+1, activation='softmax'))
# vocab_size +1 to avoid out of bound
# compile the model
model.compile(optimizer='adam', loss='categorical_crossentropy')
在本文中,我们将使用具有所述超参数的模型。当然,你可以调整我们模型的超参数。为了简单起见,我们将只使用一个双 LSTM 和一个密集层。我们使用批处理标准化来加速我们的学习者。如果用 GPU,就要用 CuDNNLSTM 来加快训练速度。
我使用亚当优化,因为它是一个流行的优化现在。该算法速度快,能很好地适应反向传播模型的学习速度。
火车模型
在我们调整或训练我们的模型之前。我们有一个问题要解决。如果我们看到我们的 vocab_size,它有大约 45000 个独特的单词。在 keras 中,我们应该将火车标签编码成一个热编码[0 0 0 … 1 … 0]。如果我们将我们所有训练标签改变成一个热编码,这将导致内存错误(它需要 45.000 * 2 兆* 4 字节内存。不可能保存到内存中)。因此,我们需要将我们的火车标签批量更改为一个热编码。
def batch_data(start,end):
global X,y,y_input, X_input
X_input = np.array(X)[start:end]
y_input = np.array(y)[start:end]
y_input = keras.utils.to_categorical(y_input,vocab_size+1)max_epoch = 40
instance_max = len(X)
batch_size = 10000for i in range(max_epoch):
start_idx_counter = 0
while start_idx_counter < instance_max:
batch_data(start_idx_counter, min(start_idx_counter+batch_size,instance_max))
model.fit(X_input, y_input, epochs=1, batch_size=64)
start_idx_counter += batch_size
我们将 10000 定义为我们的批量。你可以随意增减尺寸。我们用 40 个时期(迭代)来拟合我们的模型。执行代码!fit 方法中的 batch_size 也可以调整。
等着吧!!
source: me.me
用 GPU 训练我的模型花了 1 天。如果你不想等那么久,减小max_epoch
。
完成了吗?不要忘记保存模型和记号赋予器。你想再等一天来训练我们的模特吗?没有吗?不要忘记保存模型!
model.save('lyric_gen_model.h5')
我们将使用pickle
库来保存我们的标记器
import pickle
pickle.dump( pre, open( "tokenizer_pre_lyric.p", "wb" ) )
我们完了。让我们创作我们的歌词吧!!!
生成歌词
让我们使用我们的模型来生成歌词。我们已经训练了我们的模型,我们将使用它。为此,我们需要加载我们的模型和标记器。
model = keras.models.load_model('lyric_gen_model.h5')
pre = pickle.load( open( "tokenizer_pre_lyric.p", "rb" ) )
然后我们需要首先预处理我们的输入。
def preprocess_predict(X):
X = pre.texts_to_sequences(X)
return X
在我们的文章中,我们在歌词的开头插入了“”符号。我们这样做是为了标志这首歌歌词的开始。如果我们想在没有任何起始词的情况下生成。我们可以这样做:
seed = "<start> " * (max_length-1)
或者,您也可以包含一些起始单词。
seed = "<start> " * (max_length-3)
seed = "<div> love"
我们应该定义函数来帮助我们生成歌词
def is_word_in_dict(words, word_idx):
for word in words.split():
if word not in word_idx:
return False
return Truedef generate_song_by_model(model, idx_word, X_sent, word_idx, total_classes, word_generated=80):
string_returned = X_sent
if is_word_in_dict(X_sent, word_idx):
X = np.array(preprocess_predict([X_sent]))
counter = 1
for i in range(word_generated):
y_pred = model.predict(X)
rnd_choice = np.random.choice(range(0,total_classes),size=1,replace=False, p=y_pred[0])
word_predict = idx_word[rnd_choice[0]]
string_returned += " " + word_predict
X = ' '.join(string_returned.split()[counter:])
X = np.array(preprocess_predict([X]))
counter += 1 return string_returned
在这个函数中,我们将根据我们的种子(generate 函数中的 X_sent 变量)来预测单词。我们将窗口大小长度为 1 的标记作为我们的模型的输入,并且该模型将预测下一个标记。在下一个循环中,它将把预测的输出和 size-length-2 标记带入模型。它会一直循环到我们设定的终点。我们将根据 softmax 的输出产生的概率分布得到一个随机单词。如果您正在使用 Jupyter Notebook,使用此命令显示生成的歌词
from IPython.display import HTML
generated_lyric = generate_song_by_model(model, pre.index_word, seed, max_length, pre.word_index, vocab_size+1,loop_count=50)
HTML(generated_lyric)
它将生成 50 个新的令牌/单词(包括标签)。生成的歌词应该有 HTML 标签
和
,作为行和诗的分隔符。我们使用 IPython.display 中的 HTML 函数来清理显示中的标签。这里有一些我们生成的歌词的例子。
我试着带你回家
我是救世主之光
总有一天沙漠会飞走
谁俯视着我的双手
如果我做得不好
你开始想办法
在这个生成的歌词里。使用英语单词非常一致。虽然有些令人困惑的意思,但还不错。我们的结果是基于随机性的。如果你的模型学得少,它会产生糟糕的歌词!
如果你想知道为什么它会产生英语单词,有时印尼歌曲包含混合语言。有些歌曲包含完整的英文单词。
这里是另一个生成的歌词。
dara kau bertanya siapa namamu
杨森永坦吉斯穆
pasti pahit di ayahku
帕达·贝尔穆拉·迪潘当·卢卡
dan semua karena cintamu
这是我第一次见到你。
ku tak ingin sendiri
想知道歌词的意思就翻译一下。关于用印尼语和谈情说爱也很一致。同样,它的随机性将决定歌词的好坏。
结论
如果你关注这篇文章,我们已经建立了一个工具来生成印度尼西亚歌词。我们利用网络爬虫和深度学习库来构建生成器。它可以产生一些好的歌词,虽然这取决于我们的运气(随机性对概率)。
在本文中,我们跳过了一些步骤,如探索性分析。我们应该尝试另一种架构或超参数。我们还需要评估生成的歌词。
编后记
感谢您阅读我的第一篇关于人工智能的文章。由于这是我的第一次,我在这方面还不太专业,我需要一些建设性的反馈,让我在写作和深度学习方面做得更好。请手下留情> _
抱歉任何拼写错误,语法,和低效的代码。
哦,我提到第一部分了吗?是的,我计划通过使架构更复杂(可能使用 GAN),使用另一种嵌入和超参数来改进这个歌词生成器。
在下一篇文章中,我将从一个将从头开发的游戏中进行一些强化学习。
下一篇文章再见!
Source: pixabay.com
来源
- https://www . up work . com/hiring/for-clients/web-scraping-tutorial/
- https://colah.github.io/posts/2015-08-Understanding-LSTMs/
- https://machine learning mastery . com/what-are-word-embedding/
- https://medium . com/deep-learning/glossary-of-deep-learning-batch-normalization-8266 dcd2fa 82
- https://towards data science . com/activation-functions-neural-networks-1 CBD 9 F8 d 91d 6
为计算机视觉生成大型、合成、带注释和照片级真实感数据集
我给大家介绍一下我们在 Greppy 一直在做的一个工具的 beta 版,叫 Greppy 元宇宙(2020 年 2 月 18 日更新: 合成 AI 已经获得了这个软件,请通过Synthesis . AI联系他们!),它通过快速轻松地生成大量用于机器学习的训练数据,来辅助计算机视觉对象识别/语义分割/实例分割。(旁白:如果可以的话,合成 AI 也喜欢帮助你的项目——在 LinkedIn 上通过【https://synthesis.ai/contact/】或 联系他们)。
如果您过去做过图像识别,您会知道数据集的大小和准确性非常重要。你的所有场景也需要被注释,这可能意味着成千上万的图像。对于我们的小团队来说,这样的时间和精力是不可扩展的。
概观
因此,我们发明了一种工具,使得创建大型的带注释的数据集更加容易。我们希望这可以对增强现实、自主导航和机器人技术有所帮助——通过生成识别和分割各种新对象所需的数据。
我们甚至开源了我们的 VertuoPlus 豪华银数据集,其中有 1000 个咖啡机的场景,所以你可以一起玩!是个 6.3 GB 下载。
为了展示它的功能,我将在 Greppy 这里为您展示一个真实的例子,我们需要用一个英特尔实感 D435 深度摄像头来识别我们的咖啡机及其按钮。将来会有更多关于为什么我们想认识我们的咖啡机,但可以说我们经常需要咖啡因。
Screenshot of the Greppy Metaverse website
在过去的日子里,我们不得不用手来注释。
VGG Image Annotator tool example, courtesy of Waleed Abdulla’s “Splash of Color”
对于过去的大多数数据集,注释任务都是由(人类)手工完成的。正如你在左边看到的,这不是特别有趣的工作,而且和所有人类的事情一样,它容易出错。
它也几乎不可能准确地注释其他重要信息,如物体姿态,物体法线和深度。
合成数据:10 年前的想法
人工标记的一个有希望的替代方法是合成产生(理解:计算机生成)的数据。这是一个已经存在了十多年的想法(参见这个 GitHub repo 链接到许多这样的项目)。
From Learning Appearance in Virtual Scenarios for Pedestrian Detection, 2010
不过,我们在现有项目中遇到了一些问题,因为它们要么需要编程技能才能使用,要么不能输出逼真的图像。我们需要一些非编程团队成员可以用来帮助有效生成大量数据以识别新类型对象的东西。此外,我们的一些对象在没有光线追踪(维基百科)的情况下很难产生真实感,这是其他现有项目没有使用的技术。
用格雷皮·元宇宙制作大规模合成数据
为了达到我们想要的目标数量,我们制作了 Greppy 元宇宙工具。例如,我们可以使用来自 3D 仓库网站的预制 CAD 模型,并使用网络界面使它们更加逼真。或者,我们的艺术家可以创建一个定制的 3D 模型,但不必担心如何编码。
让我们回到咖啡上。使用我们的工具,我们首先上传我们拥有的 Nespresso VertuoPlus 豪华银机的 2 个非真实感 CAD 模型。我们实际上上传了两个 CAD 模型,因为我们想在两种配置中识别机器。
Custom-made CAD models by our team.
CAD 模型上传后,我们从预先制作的照片级真实材料中进行选择,并应用到每个表面。Greppy 元宇宙的目标之一是建立一个开源的、真实感的材料库,任何人都可以使用(最好是在社区的帮助下!).作为一个旁注,3D 艺术家通常需要创建自定义材料。
Select pre-made, photorealistic materials for CAD models.
为了能够识别机器的不同部分,我们还需要标注我们关心机器的哪些部分。web 界面提供了实现这一点的工具,因此不了解 3D 建模软件的人可以帮助完成这一注释。不需要 3D 艺术家或程序员;-)
Easily label all the parts of interest for each object.
然后……就这样了!我们自动生成多达数万个场景,这些场景在姿势、对象实例数量、相机角度和照明条件方面各不相同。它们都会被自动标注,并且精确到像素。在幕后,该工具用 GPU 旋转了一堆云实例,并在一个小“renderfarm”上渲染这些变化。
以下是来自开源 VertuoPlus 豪华银数据集的 RGB 图像示例:
A lot of scene RGBs with various lighting conditions, camera angles, and arrangements of the object.
对于每个场景,我们输出一些东西:基于所选相机的单目或立体相机 RGB 图片,相机看到的深度,所有对象和对象部分的像素完美注释,相机和每个对象的姿势,最后,场景中对象的表面法线。
让我再次强调任何场景都不需要手工标注!
单个场景的输出示例如下:
Output examples from each scene
基于合成数据集的机器学习
随着整个数据集的生成,很容易使用它来训练 Mask-RCNN 模型(关于 Mask-RCNN 的历史有一个很好的帖子)。在后续的帖子中,我们将使用 Mask-RCNN 的 Matterport 实现,开源我们用于从 Greppy 元宇宙数据集训练 3D 实例分割的代码。
与此同时,这里有一个小小的预览。这是来自英特尔实感 D435 相机的原始捕捉数据,左边是 RGB,右边是对齐的深度(总共构成 4 个通道的 RGB-D):
Raw data capture from Intel RealSense D435. Yes, that’s coffee, tea, and vodka together 😉
对于这个 Mask-RCNN 模型,我们在具有大约 1000 个场景的开源数据集上进行训练。经过 30 个时期的模型训练后,我们可以在上面的 RGB-D 上看到运行推理。瞧!我们得到一个几乎 100%确定的输出掩码,只对合成数据进行训练。
当然,我们也会开源培训代码,这样你就可以自己验证了。
一旦我们能够识别图像中的哪些像素是感兴趣的对象,我们就可以使用英特尔实感框架来收集这些像素处咖啡机的深度(以米为单位)。知道 Nespresso 机器的精确像素和精确深度对任何 AR、导航规划和机器人操纵应用都非常有帮助。
总结想法
目前,Greppy 元宇宙还处于测试阶段,我们还有很多需要改进的地方,但我们对目前的结果非常满意。
同时,如果你有一个项目需要帮助,请联系 https://synthesis.ai/contact/的合成人工智能或 LinkedIn 的。
通过机器学习为机器学习项目产生新想法
使用预先训练的语言模型从 2.5k 句子的小型语料库中生成风格特定的文本。PyTorch 代码
让我们做一个快速图灵测试。下面,你会看到十个机器学习项目创意。其中五个是由人类产生的,五个是由神经网络产生的。你的任务是区分它们。
准备好了吗?(不要想多了。跟着感觉走)。
- 股票交易学习者
- 预测数据中的频率差异
- 专利分类的机器学习
- 遥感图像卷积特征的分类
- 基于随机森林的人脸检测
- 机器学习预测职业成功
- 旋转不变稀疏编码
- 深度学习在公平性中的应用
- 三维点云中的物体识别
- 加利福尼亚的建筑模型
看到名单了吗?记下你认为神经网络产生的五个想法,以及人类产生的五个想法。
提示鼓声寻找答案。
Who’s the robot and who’s the human? Reveal time. (image via Pixabay)
回答:所有奇数编号的想法都是斯坦福大学 CS229 机器学习课程完成的最终项目的标题,所有偶数编号的想法都是由在该数据集上训练的神经网络生成的。
是的,向上滚动并再次查看列表,比较您的笔记,然后我们将深入了解这些想法是如何产生的细节。你有多准确?(评论里讲!)
这个项目的动机是让我学会使用递归神经网络(RNN)来生成类似于我最喜欢的哲学家和思想家的引文。我见过许多其他人用 RNNs 创作音乐、笑话,甚至分子。除了哲学,我也想做同样的事情。
我从网上收集了大约 5000 条来自加缪、尼采、维特根斯坦、费曼、大卫·休谟、斯蒂芬·霍金和詹姆斯·卡尔斯等思想家的引文。
我完全没有注意到的是,我作为灵感的项目通常有数百万的数据集,而我自己只有 5000 个句子。天真而盲目地,我继续前进,而在让我的人造哲学家工作方面一再失败。最后,在三次失败的实验后,我让它工作了,随后我为机器学习的想法建立了一个生成器。
当训练样本很小时,RNNs 不合理的顽固
这是我用 RNNs 做的第一个失败的实验:
- 我认为语料库不够大,不足以训练一个单词级语言模型,所以我选择了一个字符级语言模型
- 我在语料库上训练了一个非常简单的基于 LSTM/GRU 的单层递归网络,但效果不佳
- 它输出看起来像英语,但最终却是乱码的句子,如“我可以到某处我们和可以到这来撕到界限撕到保留地
我的第二次失败的实验:
- 我想也许一层循环单元是不够的,所以我试验了两层,也尝试了更高的学习率。
- 什么都没用。我仍然在胡言乱语,比如:“我真的在昨天的演讲中发现,在你那里的男人对你来说更重要一些
我的第三次失败的实验:
- 由于语料库规模较小,我认为生成性对抗框架可能会更好
- 但这也没用,我意识到 LSTMs 的 GAN 很难,有关于它的论文,但训练很难,输出质量也不是很好。
- 经过大量训练后,我的感冒更严重了。它生成的文本完全是垃圾:“x 11114111141111111111111111
经过这么多次失败的尝试,我感到非常沮丧,我的人工哲学家将永远是一个白日梦。
Why can’t I get my artificial philosopher to work? (Not my photo, but you wouldn’t know) via Pixabay
我从这些失败的尝试中得出的结论是,罪魁祸首是小文本语料库。
也许 5000 个报价不足以产生高质量的类似报价?
因此,作为我的下一个实验,我想尝试预先存在的单词嵌入,如 word2vec ,而不是强迫网络从头开始学习嵌入。但是,在此之前,我决定听取 Reddit 的机器学习 subreddit 的建议。在我开始的帖子上,有人给我指了一张 2018 NeurIPS 大会的海报,标题是:“针对特定风格文本生成的迁移学习”。我遵循了那篇论文的观点,它们非常有效。
什么是迁移学习?
迁移学习是一个简单但强大的想法。这意味着使用在非常大的数据集上训练的现有模型作为起点,并调整它以在特定领域的数据集上工作良好。
Image via Intel’s developer website
在计算机视觉领域,迁移学习已经使用了很长时间。这个想法是使用一个公开可用的模型,如 VGG,它在 ImageNet 数据集上进行训练,该数据集包含 20,000 个类别的 1400 万张图像,并使用其最后一层的激活作为附加任务特定层的输入。然后,额外的层专门在您的小型、特定于域的数据集上进行训练,以用于预测、分类或任何其他任务。
使用预训练模型的惊人之处在于你可以免费使用预训练模型在数百小时的训练中从数百万张图片中学到的所有概念。
预先训练的模型是压缩的知识。
这些预先学习的概念和激活使您能够对您的小型特定领域数据集进行预测和分类。这种神奇的事情发生是因为所有“自然”数据集都有相似的特征。大多数图像共享许多特征:从形状、线条和边缘的原始概念到诸如纹理和光影效果的高级概念。
如果没有预先训练的模型,您将不得不从头开始学习所有这些概念,并且您的数据集可能不包含足够的示例来做到这一点。有了一个预先训练好的模型,你可以直接了解在你的领域/问题中什么是重要的和不同的,而不用担心在数据集之间发现的共同的东西。
使用预先训练的语言模型进行文本和自然语言处理中的迁移学习
最近,迁移学习开始在 NLP 中出现,令人兴奋的可能性已经出现。有谷歌的巨型伯特模型,然后还有乌尔姆菲特。
这些语言模型是在公开可用的文本语料库(如议会记录、维基百科等)上训练的,并且隐含地编码了英语知识。因此,即使数据集非常小,它们也能实现机器学习任务,如对文本进行分类和预测。
这正是我想要的!我的引语数据集很小(~5k),我的目标是生成与我最喜欢的思想家风格相似的新引语。
从小型数据集生成文本的代码
为了从我的小语料库中生成风格特定的文本,我遵循了从 Reddit 线程链接的论文,这将我带到了 FastAI 的关于使用预训练模型对 IMDB 评论进行分类的课程。这一课是关于分类的,但是当我浏览 FastAI 库的文档时,我发现由于库中的帮助函数,即使是生成文本也变得很简单。
我的代码和数据集存在于这个库中。你需要 PyTorch v1,FastAI v1 和熊猫。注意,我的代码实际上是从 F astAI 文本模块的文档中复制粘贴而来的。他们让使用预先训练好的模型变得如此简单。
**我们使用什么样的预训练模型?**这是一个由 Salesforce 的研究团队开发的三层 AWD-LSTM 模型,它在来自维基百科文章的 1 亿个令牌上进行训练。我鼓励你阅读更多关于这个特定模型的细节,但是使用预训练模型的一个主要好处是,你可以不理解底层的细节。就像你很可能不关心 Pytorch 和 Numpy 如何在幕后工作一样,你也可以不关心 AWD-LSTM 法案如何在幕后工作。
由预先训练的模型提供的这种抽象级别是真正革命性的。
现在,任何人都可以在各自的领域组装最先进的深度学习模型,而不需要数月或数年的努力。(但是当你没有得到结果时,知道细节是有好处的)
人工哲学家:由我的神经网络产生的新的哲学见解
What would my artificial philosopher spit out? (Photo by Pixabay)
当我运行我的模型时,我简直不敢相信它的结果。兴奋之余,我发了微博:
我的网络说:“世界上没有一个人不是奴隶”,这听起来好得令人难以置信,以至于我首先检查了它是否只是重复了一段从数据集中背下来的话。当我没有找到它时,我谷歌了确切的短语,看看这个想法以前是否被表达过。你瞧,我也没有在谷歌上找到它。
这是由神经网络生成的 100 个报价的运行。这些都不是我以任何方式修改的。我从我的笔记本上复制粘贴了这些。(我加粗的是那些耐人寻味且可能独一无二的)。
'por las vida de los mundo de los mundo en el chi',
'**the truth is that we can not be sure of what we do not know** .',
'according to the standard , man is the real animal .',
"it is my business that i think that 's what i do n't know .",
'after a adventure , it was not until that point that old ideas were drawn up .',
'the lives of a finite player player must be avoided .',
'**a human being is also an animal** .',
'i had to turn',
"i want people to be happy but i do n't want to be ourselves .",
'there is a greater freedom for the philosophers and for the philosophers .',
'**for a moment is not merely a thought , but a tragedy** .',
'at this stage it is the true art .',
'i am the bridge , which is the bridge and the one that carries the bridge .',
'it is the wisdom that the world has not yet seen established at all .',
'**the future is great because we love everything** .',
'what is the belief in the right to man ?',
'nature is a perfect field of vision .',
't',
'**to learn to draw is to impose a law on the law of physics** .',
'**the feeling of absurdity : that is , as we see why we are here** .',
'**he who fights with monsters knows what he is** .',
'**no longer culture is a sign of self - mastery** .',
'when the universe is rotating , i will make a very very big decision .',
'today this is probably the most so - called mystery of science .',
'it is not a matter of fact , a reason for being ashamed of love .',
'the world around me , i believe , it is the world itself .',
'the subject must always be a man who is not alone . the',
"some people n't want to be stupid .",
'**the good dream is that you have to struggle for the good and the bad** .',
'there is no community without the strong and just no one to live across .',
'i am not the man who is myself .',
'**i felt that i had to quite cease to exist when i was touched** .',
'the above principle of infinite players is perfectly good .',
'**the stars are small and solitary , though they are neither great nor bad** .',
'all souls are ignorance .',
'**the limits of my language are always your limits** .',
'**the world is a world without any real purpose** .',
'beyond the curve of the days become his favorite .',
'i continue to believe in this condition of life',
'here is the origin of all things .',
'**we have to live and let live in order that we can create a universe** .',
'**a man is very much the most fertile man** .',
'**this world comes out of nowhere** .',
'to live is to be happy .',
'**the present man has a reason to be able to give birth to a dancing star** .',
"it 's surprising to say that the real world had a beginning :",
'the first thing is to die at heart .',
'and how i learned to walk and dance , i must sing .',
'**as long as the mind is limited by its laws , it can not be understood** .',
'**the weakness of the apes is not infinite , but our surprise** .',
'at the end of a conversation there is an invincible summer .',
'les de la vida pour la vie a es se non het la vida .',
'i say the last thing , in the end , is to die .',
'**what does man understand is that the true man is a unjust child** .',
'the soul is a dead cause .',
"it seems that there is nothing less than a child 's love .",
'that is why the world is governed by the laws of physics .',
'the king is a genius who goes to school to be a public relations yes .',
'**the child is born of this solitude** .',
'**i am a tree among trees** .',
'we have never got the least of ideas and ideas .',
'every age in the middle ages is born of the holy spirit of peace .',
'but no one is willing to strive for peace , justice or reason .',
"but n't the time is going to happen if what breathe is bad .",
'at the heart of all beauty lies something monstrous and full of things .',
'really , my heart is never .',
'yes , it is to say that there is a very rapid increase in human affairs .',
'everything in the world is like a dead world .',
'the good man is a man who wants to play my own .',
'there are no real truths , but it is a perpetual truth that is true .',
'you imagine that he can not live without knowing how to live .',
'the problems of life are not universal , but the future of mankind .',
'no one can build a bridge across the river of life .',
'**passion is the desire to be strong . however it is necessary to love the weak** .',
'**in the end one must have experience to live with envy** .',
'from the dark horizon of my future a future will never be seen .',
'he who does not know has the meaning , his reason to do .',
'**no one has any idea how youth ... must have learned how to walk** .',
'it is true that mersault was a very poor soil .',
'this is where we see and where there are , and what we see here .',
'a species of th',
'there are no boundaries between those limits of physical limits .',
'man is one who has the advantage of being overcome',
'woman is a woman . she is a tahu .',
'**to live is to live alone**',
'**the fate of a man must be as great as the rank of man** .',
'all artists of the twentieth century are quite free to live alone !',
'there is no justification of the state for the astonishment of the world .',
'there is evidence that in every human being , a human being must win the match .',
'**the world is worth living** .',
'the dumb man is not a bad bad conscience but a bad liar',
'because we have to choose between being understood we have a friend and love .',
'the mother of child dignity is a mother or mother .',
'**it is the art of value that we do not understand** .',
'a writer has been written with a definite idea of what is really in his universe',
'they believe that something is rare for the rare .',
'every step forward in the world preclude a future and there is a certain future .',
'and continuing that is the horror of original conservation .',
'**solitude is often an activity** .',
'**one concerns me that things can never be forgotten** .',
'**i love people who have no happiness , but not lest they become strong** .'
您一定在其他文章中看到过同样令人印象深刻的生成文本。但是我认为这里令人印象深刻的是生成文本的质量,因为我的训练集非常小 (5k 个句子)。只有使用预先训练好的模型才可能做到这一点。
这可能看起来不多,但我认为像“我语言的极限永远是你的极限”这样的想法似乎是语言哲学家路德维希·维特斯坦根说过的。事实上,当你用谷歌搜索这个短语时,你找不到确切的结果,但是谷歌建议你去维基百科上查一下关于维特根斯坦的文章。
Getting Wittgenstein to say new things after he’s dead
事实上,维特根斯坦说过:“我的语言的限制意味着我的世界的限制”,我们的模型聪明地(并且以语法上准确的方式)把它改成了新的东西。
类似地,生成的引用“现在的人有理由能够生下一颗跳舞的星”让人想起尼采,因为他在他的书中提到了“跳舞的星”,但他从未在现在的人的上下文中说过。我可能读得太多了,但对我来说,产生的引用代表了这样一种想法,即我们在技术上已经变得如此先进,以至于我们可以产生真正复杂的机器(像一个跳舞的明星),我们已经变得如此具有竞争力,以至于我们有理由这样做。(我的神经网络是在警告我们 AI 的潜在危险和它的不可避免性吗?)
让我们产生跳舞的明星:产生新的机器学习想法
记得我的哲学引语语料库大约有 5000 句。我想知道如果我给它一个更小的语料库,这种方法会有什么表现。
我决定产生机器学习的想法会很有趣。据我所知,到目前为止还没有人尝试过这样做。所以我收集了斯坦福大学 CS229 班的学生从 2004 年到 2017 年提交的所有机器学习项目的标题。数据集包括 2500 个想法,每个想法包含五到七个单词。数据集和相应的笔记本可在我的存储库中找到。(注:我不拥有创意的版权。收集这些只是为了研究和探索)
该项目似乎令人兴奋,但我主要担心的是,机器学习项目想法的领域非常狭窄,包含利基和技术术语。我认为这个模型会把记忆中的想法吐出来,和数据集中的想法一样。
然而,令我惊讶的是,它产生了一些非常新颖的想法(粗体,后面是我的评论):
- 通过数码相机行为的不同类型的社交视频游戏。数据集中没有“社交视频游戏”这个短语,所以这一定是新的。
- 从学术话题中学习识别事件的机器学习方法。数据集中没有“学术话题”短语。
- "预测数据中的频率差异 " < -数据集中没有"数据中的频率"短语。
- "利用学习预测特征来识别基因表达 " < -实际上是一个新颖的想法!
- 对光学图像中的人类基因表达进行分类<-目前还没有对人类基因表达进行分类的项目构想。
- 制作世界图像。我认为这是一个有趣的项目建议,你必须想出一个代表整个世界的图像/图形。
- 预测人类行为的维度。可能是对人类所有不同行为方式的无监督分类的建议?
- **强化学习提高专业学习”。**训练数据集没有短语“专业学习”。如何运用强化学习的思想来提高专业课的学习能力?我对此印象深刻,因为它看起来既有价值又可行。
- ”单一表达公司市场上有什么?”。你如何将所有股票市场的可用指标结合起来,得出一个最能提供信息的指标?
- 心脏过程的类型。无监督学习,对心脏过程的相似模式进行聚类,以帮助预测和分析可能导致心脏骤停的模式。
- 人类交往的自然史。使用人类迁移数据集,如何对历史上的人类互动进行分类。你能对历史学家和人类学家忽略的人类互动产生新的见解吗?
- 遥感图像卷积特征分类。数据集没有“卷积特征”这个短语。对于任何对 CNN 背后的理论感兴趣的人来说,这个项目听起来像是一个有趣的研究项目。
- "分类预测事件评论 " < -哇,数据集没有"事件评论"这个词。就像 IMDB 评论一样,我们可以收集事件评论(戏剧或摇滚音乐会)并预测未来的事件,哪些会成功,哪些会失败吗?
如果你想从模型中得到未经过滤的输出,这里有它产生的 100 个想法。我没有修改任何东西(只是把我认为有趣和新颖的部分加粗)。
'the problem is right : grasping and extracting the face of pose',
'applying machine learning to text treatment',
'machine learning techniques for learning through machine learning',
'**a machine learning approach to predicting career success from a single object**',
'**using machine learning to predict the outcome of a machine learning approach**',
'based on stock prices',
'**identifying stock price models for machine learning techniques**',
'a study in time travel time series analysis of musical features',
'vectors in the amazon impact network',
'**classification of web articles in facebook**',
'dynamic signal processing in post - secondary order data',
'copy selection with machine learning techniques',
'interpretation of user classification',
'**the application of deep learning to fairness in using a semantic framework**',
"creating a different entity 's portfolio",
'using supervised learning of blind data',
'system classification for driving automatic vehicle design and classification with gene expression',
'based on public documents from text expression',
'**semantic learning for music**',
'**machine learning for cancer prediction**',
'learning static variations with deep learning for learning options',
'image classification for svm',
'**satellite imagery classification**',
'making decision selection from a single object',
'object detection using product preferences',
'**speech detection with deep learning**',
'**genomic data based on stock trading**',
'**learning to predict approach to handwriting**',
'**classification of musical features from the composer data**',
'semantic social network and smartphone features',
'machine learning techniques',
'**using real - time information to predict the popularity of the market**',
'**video game classification**',
'a learning task for time series players',
'using a single machine learning approach for a single learning approach to learning to identify other environments',
'multiple - genre classification of fraud \n prediction for a mass neural network',
'**learning of human activity recognition from analysis of text**',
"an nba player 's approach to learning and character forecasting through video game ecg",
'playing a vocal instrument in local mri learning',
'real - time music recordings',
'**finding new artistic and artistic features in music videos**',
'**an analysis of musical genres**',
'predicting a single image - specific musical style',
'a cost approach to crime prediction',
'automatic user prediction and automated review recognition',
'**food processing via machine learning**',
'human activity recognition using multi - label fantasy',
'predicting a match in the keystroke poker',
'estimation of game types',
'ai identification of deep learning in locomotion monitoring using neural networks',
'the value of collaborative attention projecting for real - time playing',
'the sea level and low speed : the two waves',
'learning to predict the price of beer and personal genomes',
'**trading and removing a novel image from the text**',
'real - time news user identification on google gestures',
'removing and re - learning to play game and lyrics',
'rapid - mass dynamics with acoustic images',
'real - time music direction',
"what 's your right ?",
'exploring event and music',
'human activity prediction using machine learning',
'**model of architecture in california**',
'vs light crime',
'**adaptive learning for image recognition**',
'predicting the approach of human activity using machine learning',
'the win given trajectories',
'**a machine learning approach to online design**',
'a massive based multi - layer feature unsupervised approach for multi - agent music',
'can you learn from a single hand',
'reaction with the media',
'measurement of time to order over time',
'how people can stop : learning the objects of blood and blood',
'machine learning for autonomous vehicles',
'**vehicle types in neural networks**',
'building a model for what does it store ?',
'for enhanced identification of machine learning techniques',
"**exploring new york city 's public image through machine learning**",
'a novel approach to career image recognition',
'in general game playing',
'structure classification for adaptation of text',
'a variance learning approach for speech recognition',
'the optimization of a non - peer temporal layer',
"a distinguishing feature of a song 's legal expression",
'learning to sound in english : learning to learn using word learning',
'information sharing with adaptive neural networks',
'playing the game with multi - touch neural networks',
'recursive estimation of dynamic and static images',
'predicting the quality of the net - style result in the media',
'the character of the sea snake robot',
'predicting the stock market price of machine learning',
'using inverted nucleotide data to predict the price of convolutional protein models',
'**search engine**',
'using twitter data to predict prices in high - cost trading',
'a machine learning approach',
'creating a new approach to building a deep learning approach',
'fingerprint learning component',
'machine learning techniques for functional change learning for the building of new york city college football networks',
'predicting cancer risk of breast cancer risk',
'cancer diagnosis and prediction',
'stock market classification',
'**identifying the outcome of the news media**'
我没有彻底检查过,但随机检查告诉我,大多数生成的想法都是独特的。我认为生成的文本没有从训练语料库中记忆的原因是因为我们使用了预先训练的模型。预训练语言模型是在维基百科上训练的,因此它甚至在看到训练数据之前就对概念和单词如何相关有强烈的看法。
对于随机初始化的模型,减少训练数据的最简单方法是记住训练语料库。这导致过度拟合。然而,对于预训练的模型,如果网络试图学习训练语料库,它只能在首先忘记先前学习的权重的情况下才能这样做。并且由于这导致更高的误差,更容易的方法是在更早学习的权重的上下文中适应训练语料库。因此,网络被迫归纳并生成语法正确的句子(这要感谢维基百科上的预先训练),但使用特定领域的概念和单词(这要感谢你的数据集)。
你会用这种方法训练什么?
在预先训练好的模型出现之前,你需要一个巨大的文本语料库来做任何有意义的事情。现在,即使是很小的数据集也足以做有趣的事情。请在评论中告诉我,你想到了哪些可以使用小型文本语料库和预训练模型的项目想法。
一些让你的神经元兴奋的想法:
- 利用你的微博,训练一个像你一样发微博的模型
- 使用 WhatsApp 上的数据转储,制作一个像你一样聊天的机器人
- 对于您的公司,将支持票据分类为错误或功能请求
- 制作一个机器人,生成类似于你最喜欢的作者的报价
- 为 Gmail 制作您自己定制的自动回复草稿
- 提供一张照片和一个 Instagram 帐户,按照该帐户以前的标题样式生成标题
- 为您的博客产生新的博文想法(基于以前的博文标题)
此外,如果你最终实现了由我的模型(或本文中包含的模型)生成的机器学习项目想法,那将会非常酷。你将成为的一部分,这是世界上第一个由机器思考并由人类实施的项目!
感谢阅读到目前为止。请在评论中告诉我你的想法和问题。
PS:查看我之前的动手教程 贝叶斯神经网络
感谢 Nirant Kasliwal 审阅本帖草稿并给出有益建议。
在 Twitter 上关注我
我定期发关于人工智能、深度学习、创业公司、科学和哲学的推特。跟着我上https://twitter.com/paraschopra
[## Paras Chopra (@paraschopra) |推特
Paras Chopra 的最新推文(@paraschopra)。@Wingify |的创始人兼董事长写道…
twitter.com](https://twitter.com/paraschopra)
使用具有交互式代码的条件对抗网络从分割掩模生成像素化图像
Gif from this website
我想用条件对抗网络 实现这篇论文的图像到图像翻译已经很久了,现在我终于有机会这样做了。
此外,我们将使用来自“显著对象分割的秘密的二进制掩码数据集,更具体地说,我将使用来自 pascal 数据集的图像。
Paper from this website
数据集
左图像 →全彩色图像
右图像 →分割蒙版
因此,数据集由两种类型的图像组成,全色图像和分割掩模。我们将为网络提供分段掩码,希望它能够生成全色图像。也请注意,有几个类别的图像。(例如,有图像的人,公共汽车,飞机等……)
网络层(单层)
红线 →每一层是如何组成的它是由卷积批量归一化最后 Relu()
从上图中我们已经可以看到,这个网络的每一层都由三个操作组成,当在 Tensorflow 中实现时,它看起来像下面这样。
批规范化之所以有 if 条件,是因为生成器的第一层没有批规范化层。
发电机网络架构(全网)
蓝色下划线→发电机网络架构
如上所述,网络的生成器部分与 U-Net 架构非常相似,如果有人感兴趣,我在这里写了一篇关于 U-Net 的博文,请查看。
网络的解码器部分用转置卷积运算代替卷积运算,当在 Tensorflow 中实现时,它看起来像下面这样。
请注意批处理规范化和删除层的 if 条件。所以把编码器部分和解码器放在一起,我们得到如下的东西。
请注意,我们的网络比原始论文中的网络层数少。原始网络具有用于编码器网络和解码器网络的 8 层。然而,在我们上面的网络中,每个解码器和编码器只有 5 层。
鉴别器网络架构(全网络)
黄线→如上所述,鉴别器网络本身并不难实现。它只是背对背连接的卷积层,(我们也可以称这个网络为全卷积网络。)在 Tensorflow 中实现上述架构时,它看起来会像下面这样。
相同的卷积层,我们用于编码器部分,但与泄漏 ReLU()激活函数。
结果
左图像 →输入图像分割蒙版
中间图像 →地面真实图像,原始图像是什么样子
右图像 →网络生成图像
一些图像看起来不错,当然不是很令人印象深刻,但我仍然能够说出网络中呈现的是什么对象。然而,该网络在其他图像上表现不佳。
如右图所示,我们可以看到图像的很大一部分没有被填充,只是灰色的方块。这当然不是一个好消息。最后让我们看看生成的 GIF 格式的图像。
交互代码
对于 Google Colab,您需要一个 Google 帐户来查看代码,而且您不能在 Google Colab 中运行只读脚本,因此请在您的操场上创建一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
遗言
对于 Pix2Pix Gan 来说,这是一个很好的实践,下次我将在编码器部分添加更多的层,希望能够生成更清晰的图像。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的推特这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- tf.nn.leaky_relu | TensorFlow。(2018).张量流。检索于 2018 年 4 月 29 日,来自https://www.tensorflow.org/api_docs/python/tf/nn/leaky_relu
- tf.exp |张量流。(2018).张量流。检索于 2018 年 4 月 29 日,来自 https://www.tensorflow.org/api_docs/python/tf/exp
- 乙状结肠的导数。(2018).Ai.mit.edu。检索于 2018 年 4 月 29 日,来自http://www . ai . MIT . edu/courses/6.892/lecture 8-html/SLD 015 . htm
- affini layer/pix 2 pix-tensor flow。(2018).GitHub。检索于 2018 年 4 月 29 日,来自https://github . com/affini layer/pix 2 pix-tensor flow/blob/master/pix 2 pix . py
- phillipi/pix2pix。(2018).GitHub。检索于 2018 年 4 月 29 日,来自https://github.com/phillipi/pix2pix
- 医学图像分割[第 1 部分] — UNet:交互式编码卷积网络。(2018).走向数据科学。检索于 2018 年 5 月 1 日,来自https://towards data science . com/medical-image-segmentation-part-1-unet-convolutionary-networks-with-interactive-code-70f 0 f 17 f 46 c 6
- 设计,R. (2018)。显著对象分割的秘密。Cbi.gatech.edu。于 2018 年 5 月 1 日检索,来自http://cbi.gatech.edu/salobj/
从神经网络生成受口袋妖怪启发的音乐
Cory Nguyen、Ryan Hoff、Sam Malcolm、Won Lee、Abraham Khan 的项目
机器学习技术能创造出好到足以愚弄人类的音乐吗?
一.摘要
最近,生成神经网络已经登上了艺术追求的舞台,如图像生成和照片修饰。这些深度学习网络开始留下印记的另一个领域是音乐生成。在这个项目中,我们的目标是探索使用 LSTM 和甘神经网络来生成音乐,就好像它是人为的。
通过将 MIDI 文件中的音符和和弦视为离散的顺序数据,我们能够训练这两个模型,并使用它们来生成全新的 MIDI 文件。我们成功地创造了真正的音乐吗?请继续收听我们的结果!
二。项目大纲
这个项目很大程度上是由两个独立的媒体职位启发和通知的。sigur ur skúLi 关于使用 LSTM 生成音乐的帖子帮助我们清楚地理解了使用音乐作为数据的机制和需要注意的问题。例如,单个乐器轨道是一个很好的起点,因为它们远没有那么复杂。钢琴音乐被特别提到,因为它有清晰、明确的音符,可以来自很宽的音域。此外,Alexander Osipenko 关于使用 GAN 生成音乐的帖子展示了一种替代方法,并向我们介绍了由于输入数据的顺序性而使用 RNN-GAN 的策略。
借鉴这两者,我们选择创建两个独立的神经网络架构:长短期记忆(LSTM)和递归生成对抗网络(RNN-甘),我们在大约五个小时的 MIDI 文件形式的口袋妖怪视频游戏背景音乐上对其进行了训练。音符被转换成一个数字标度,并被标准化以输入到神经网络中。
经过多次实验,我们能够创作出与实际的口袋妖怪音乐相混淆的短歌曲。下面将更详细地讨论模型和参数,以及在时间和输出方面的性能比较。
三。数据收集和处理
如上所述,我们想要一个相对简单的钢琴音乐语料库来训练和学习。使这个项目在我们的时间框架内更加可行的其他标准包括寻找在类型和模式上同质的曲目,以及避免停顿的曲目。这仅仅是因为我们不知道模型在学习模式时如何处理无笔记空间。一组 307 首口袋妖怪歌曲(仅钢琴版)选自这个 MIDI 文件的在线收藏。该语料库仅包含几代口袋妖怪游戏的背景音乐(意味着没有停顿),每首曲目长度约为一分钟。这里可以看到一个音轨示例:
我们使用 Music21 从 MIDI 文件中提取相关信息,该软件也在 Skúli 的文章中介绍过。Music21 允许我们将每个音轨的音符和和弦(音符组)读入 Python,同时保持它们的顺序。每个音符都表示为其特定的音符类型或相应的数字。然后,这些音符被转换为 0:1 比例(对于 LSTM 输入)或-1:1 比例(对于 GAN 输入)。
Function to prepare sequences for GAN input
来自每个音轨的信息被合并成一个列表,然后被分成 100 个音符的片段。当然,音乐比音符本身更复杂。我们原本打算使用 MIDO 包提取其他数据特征,如时间和后效。然而,这增加了复杂性,使得训练模型明显需要更多的资源,因此在我们的时间框架内是不可行的。
四。学问
T 我们在 Music21 包的输出中认识到的第一个特征是,它可以被视为文本数据,每个音符被解释为一个“单词”基于我们对自然语言处理的先验知识,我们认为 LSTM 网络可以有效地对笔记随时间变化的模式进行建模。这种直觉得到了 Skúli 帖子的肯定。此外,他的帖子向我们介绍了 Keras,这是一个深度学习库,可以使用 CPU 或 GPU 通过 Tensorflow 后端运行。由于其计算速度和相对易用性,Keras 库最终成为我们两个音乐生成模型的主干。
长短期记忆
LSTMs 有几个关键特性,使它们非常适合处理本项目中使用的歌曲。LSTM 是一种递归神经网络,它按时间顺序而不是按空间顺序处理信息。这个模型架构随着时间的推移共享特征权重,这允许它输出某种程度上一致的模式。此外,在这种情况下,长时间记忆和重复使用输入的能力,复制一种长期记忆,是非常有用的。因此,LSTM 让我们在一首歌曲中保持相对的一致性,并牢记一个“主题”。
LSTM “pipeline”
来源:【http://colah.github.io/posts/2015-08-Understanding-LSTMs/】
与其他缺乏长期记忆的 rnn 不同,LSTM 就像一条管道,可以在很长的时间间隔内传输信息。它通过一个平行于网络的“管道”从过去收集信息,并使用门控机制来选择进出每一步的信息。这种机制源自乘以网络元素的 sigmoid 变换,执行三项任务来控制信息流:输入、遗忘和输出。它决定了新状态的哪些方面与新的输入相关,以前状态的哪些方面需要被忘记,以及状态的哪个部分被继续。这些机制允许 LSTM 使用复杂但自适应的参数来开发音符序列,模拟人们可能从歌曲中听到的模式。
下面是我们自己的模型中各层的分解及其目的。
第一层 CuDNNLSTM 是一个 LSTM 层,它使用 NVIDIA 的 Cuda 工具包来单独运行 GPU,使其在许多情况下比常规 LSTM 更快。这一层是我们的模型学习如何预测特定序列中的音符的关键。
丢弃层是一种正则化技术,它通过在每次迭代中随机删除一部分神经元来防止过拟合。这迫使模型通过在剩余的神经元之间分割所学的概念来概括它们。这对于音乐生成至关重要,因为过拟合将导致输出听起来与一首或多首原始歌曲几乎相同。
双向 LSTM 层通过使用过去和未来的信息将当前的音符联系起来。该层并行训练两个 LSTMs,其中一个以相反的顺序读取输入。为了真正理解为什么特定的和弦在特定的地点和时间被使用,我们需要通过回顾特定和弦之前和之后的内容来了解它。双向层模仿这种方法,从排序中学习并拼凑所需的音符。
密集层在神经网络中很常见。它们包含一层神经元,所有节点都从输入连接到输出。每个神经元计算其输入的加权和,并添加一个偏置向量。然而,根据激活功能,它可能被激活,也可能不被激活。该函数定义给定输入的节点的输出,并将结果映射到 0 和 1 之间的值。我们选择使用 Softmax 激活函数来完成这一任务,并将每个输出除以一个因子,使其总和为 1。然后,该模型可以生成一个概率分布,允许在其输出中包含多个类别。根据这些概率,我们可以在生成步骤中进行预测,这将在后面的**“音乐生成”中详细介绍**
生成对抗网络
除了 LSTM 模型之外,我们还想构建一个 GAN,它能够完成同样的任务,即从经过音乐转换的输入中生成音乐。通过使用相同的输入,我们可以比较和对比输出的 MIDI 文件,找出一个模型优于另一个模型的地方。
在 GAN 网络中,鉴别器模型和生成器模型被同时训练和测试。鉴别器收到的是真实数据——在我们的例子中,是真实的歌曲——以及随机噪音产生的虚假数据。对于每个样本,鉴别器的任务是正确地将数据分类为真或假。另一方面,生成器的任务是从随机噪声中生成假数据,这些假数据能够欺骗鉴别器犯更多的分类错误(即,将真正的歌曲称为“假的”,反之亦然)。通过堆叠这两个模型,鉴别器模型和生成器模型开始相互竞争,在我们的例子中,期望的最终结果是生成器可以轻松地欺骗鉴别器(希望是人)。
Artistic representation of a GAN model
蒙特利尔大学的 Ian Goodfellow 是关于 GAN 的原始论文的作者,他将 GAN 比作一群试图欺骗侦探(代表鉴别器模型)的绘画伪造者(代表发电机模型)。
已经有一些利用 GAN 制作音乐的作品,如 MuseGAN 和 C-RNN-GAN 。对于我们的项目,我们决定将我们的 GAN 基于 C-RNN-GAN,但使用 Keras 实现它,以进一步开发我们新获得的库经验。
我们的输入数据几乎与用于训练 LSTM 网络的数据相同。然而,我们决定将输入规范化在-1 和 1 之间,而不是从 0 到 1。这是为了让我们的发电机网络变得更容易,该网络被馈送来自标准正态分布的随机噪声,期望它将产生范围在-1 和 1 之间的输出。
现在,为了实际构建 GAN,我们从鉴频器网络开始:
在这个模型中,前两层是 LSTM 层。这允许鉴别器在训练期间从我们的音乐输入中学习序列数据。如果没有这些层,我们发现只要生成器能够计算出输入数据的离散域,鉴别器就无法区分真实音乐和虚假音乐。有了 LSTM,生成器现在要做的不仅仅是简单地计算真实数据的范围;它还需要明白音乐遵循一定的模式。最后,我们选择了 sigmoid 激活函数,因为我们希望输出为单个 0 或 1,分别代表伪数据或真实数据。
接下来,发电机网络:
为此,我们可以看到生成器网络只是一个多层感知器,它接收等于潜在维度大小的随机输入(我们使用 1000,因为与 100 相比,它可以以最小的速度更好地学习)。有了这两个网络,我们就可以开始训练了:
为了训练这个堆叠模型,我们首先给生成器一批来自标准正态分布的随机噪声,并让它处理这些噪声,以生成一批编码为数字的 100 个音符的序列。然后将这些数据作为一组假数据传递给鉴别器,鉴别器将经历一次训练迭代。然后,生成器生成另一组假数据,并将其作为假数据传递给堆叠模型,以训练鉴别器和生成器。
音乐生成
训练完这两个模型后,我们想生成新的 MIDI 文件。对于这两个模型,我们希望使用该模型根据输入进行预测,并创建对应于音符和和弦序列的编码输出。对于 LSTM 网络,我们从语料库中随机抽取 100 个音符序列,并将其输入到网络中,让它做出预测,这就是我们的编码输出。对于 GAN 网络,我们向生成器提供一个从标准正态分布中采样的随机数字序列,并让它进行预测。有了这些预测,我们可以使用 Music21 将我们预测的序列变成全新的 MIDI 文件。
动词 (verb 的缩写)结果和见解
我们所创造的样本包括在下面。首先,从 LSTM 模式来看:
接下来,从 GAN 模型来看:
损失与培训
我们使用交叉熵损失函数,因为它们适用于我们的两个模型:LSTM 使用分类交叉熵来选择接下来出现概率最高的音符,而 GAN 使用二项式交叉熵来选择将序列分类为真实或虚假的较高概率。
从这些损失图中值得注意的是,模型能够在运行时间(在 Google Colab 的 GPU 运行时间上不到 12 小时)和纪元方面相对快速地进行训练。我们可以将此归因于我们数据的小尺寸和我们对多个 LSTM 层的使用。就表现而言,LSTM 的表现符合预期,损失逐渐减少,直到收敛到渐近线。为了避免过度拟合,我们在训练模型时小心翼翼,不要超过它开始收敛的地方。
对于 GAN,初始损耗与预期一致:发生器损耗高,鉴频器损耗低。我们预计这些值会在某个点上收敛——发生器下降到起点以下,而鉴频器上升到起点以上。有趣的是,在大约 2000 个时期之后,发生器和鉴别器开始朝着它们的初始起点分叉,这表明它们可以被训练更长时间(尽管对于 5000、10000 和 100000 个时期来说情况并非如此)。这种不一致的一个可能的解释可能是由于数据的小规模或由于同时训练两个模型。
我们试图颠覆这种快速收敛的方法之一是使用随机离散噪声预先训练鉴别器。通过 10000 个历元的预训练,我们发现生成器需要超过 50000 个历元才能开始与鉴别器竞争:
(in thousands of Epochs)
当比较两种模型的输出时,我们发现 GAN 在输出 MIDIs 的真实性和训练时间方面更胜一筹。LSTM 模型倾向于在开始每首歌曲时,在调整之前重复几秒钟同一个音符。我们推断网络还没有被训练到足以有效地学习音乐中的所有模式,即使模型的损失开始渐近。然而与此同时,虽然我们可以减少缺失层并允许过度拟合,但我们希望避免创建一个模型,该模型可以有效地从我们用于预测的 100 个音符中填充预先存在的歌曲的剩余部分。使用 GAN 模型时,我们不必担心过度拟合,也不再有“卡住”音符。
LSTM is able to find a long pattern and repeat it. GAN only plays notes from high-to-low and back.
LSTM 胜过 GAN 的地方在于对某些模式的执着。我们发现 LSTM 能够更好地专注于特定的模式,并在一首歌的整个过程中重复利用它们。该模型还能够跳出某些音符循环,并过渡到另一组音符循环。就甘而言,它只能掌握基本概念,如以由低到高的方式提升音符,而不会陷入更微妙的模式。
不及物动词结论
未来的工作
我们当前的音乐生成过程可以通过使用编码器-解码器框架来改进。这使我们能够将其他乐器演奏的音乐转换成模型的标准输入。也可以通过允许输入包含 MIDI 文件中包含的其他信息来改进输入,如力度、偏移和暂停。
处理停顿的一个初步方法是用超出人类正常听觉范围的音符替换停顿。这就为 Music21 的翻译提供了一个不可忽略的音符。就我们的模特而言,我们希望扩大我们用于训练的音乐的语料库,以便模特将接触到更多种类的音乐。我们想看看这些歌曲是否有什么总体模式,以及我们的网络是否能捕捉到它们。在对 GAN 的具体改进方面,我们希望对生成器模型实施 RNN 架构,因为我们相信这将有助于网络更好地组织音乐模式。然后,它也可以使用以前的输出作为附加输入。
应用程序
考虑到可以在过程中实现一定程度的复杂性和控制,使用深度学习网络来生成音乐的用例是无限的。例如,我们的模型可以提供一种方式来创建独特的、免版税的股票音乐,这种音乐来源于他们所接受的任何音乐。
除了我们的方法,机器可以被训练来检测尚未自动化的音乐的潜在模式。一旦这些模式可以被检测到,机器学习就可以用来在声波水平上编译和分析音乐。这可以与类似于热门歌曲科学的技术结合使用,使用定量和定性摘要来预测音乐,而不必听单个曲目。最后,虽然使用机器创造艺术可能会导致“错误”,但这些不准确性可能会意外地导致未被发现的音乐模式,这些模式可能会形成下一个流行的声音。
外卖食品
总的来说,我们觉得我们在音乐生成方面的实验是成功的。通过这个过程,我们能够获得关于深度学习的 Keras 库的实践经验,事实证明它像宣传的那样对用户友好。就模型架构而言,我们能够了解并实现双向层,并看到它对于从序列数据中学习的价值。
剧透警告:在样本内预测精度和输出一致性方面,双向 LSTM 的表现比 LSTM 好得多
我们还对多层感知器的能力感到惊讶,因为我们基于 MLP 的使用连续输入的生成器网络能够在短时间内与我们基于 RNN 的基于离散数据训练的鉴别器网络竞争。这继续证明了 MLPs 非凡的多功能性。
最后,这个项目给了我们尝试强化学习的机会。对我们来说,这种方法代表了监督学习和非监督学习之间的一个很好的中间地带。与以前不同的是,我们现在可以获得生成器 AI 的帮助,在不需要目标变量的情况下将模型引向“正确的结果”。我们很高兴看到这种类型的机器学习将带来的新进展。
我们这个项目的代码可以在 Github 上找到!
参考
sigur ur skúLi 的博文—https://towards data science . com/how-to-generate-music-using-a-lstm-neural-network-in-keras-68786834 d4c 5
布莱恩·麦克马洪的人工智能点唱机—https://medium . com/@ cipher 813/AI-Jukebox-creating-music-with-neural-networks-1d 9585 C4 d 649
丹尼尔·约翰逊用 RNNs 作曲的页面—http://www . hexad RIA . com/2015/08/03/composing-Music-with-recurrent-neural-networks/
斯坦福大学关于深度学习网络音乐生成的论文—https://web.stanford.edu/class/cs224n/reports/2762076.pdf
中-甘纸业—https://arxiv.org/pdf/1611.09904.pdf
更多关于 GANs 的阅读,请点击以下链接:
甘斯简介—https://skymind.ai/wiki/generative-adversarial-network-gan
关于 GANs 的 PyTorch 简短教程—https://medium . com/@ devnag/generative-adversarial-networks-GANs-in-50-lines-of-code-py torch-e81b 79659 e3f
喀拉斯甘图书馆—https://github.com/eriklindernoren/Keras-GAN
甘动物园—【https://deephunt.in/the-gan-zoo-79597dc8c347】
用熊猫生成产品使用数据
我们如何近似高级用户行为?
Source: Pixabay
洞察我们产品的行为使用是至关重要的,因为它不仅表明我们如何获得用户,而且还能留住他们。这是一种确定**问题答案的方法,有多少用户真正在使用我们的产品?**它通常被称为重要指标(OMTM),帮助我们抵制使用虚荣指标来量化业务增长的诱惑。更多关于 OMTM 和产品成长的在这里和在这里。
虽然我通常更喜欢探索现有的数据集,但这次我采用了一种不同的方法,试图从头开始逼近一个真实的数据集。
有两个主要原因:
- 对行为数据的更深入理解。正如从头开始编写一个算法来理解它的运动部分是有价值的一样,我相信数据集也是如此。这是在回答的问题“我如何才能估算出产品的使用情况?”我们的行为模型中肯定会有一些简化但必要的假设。
- 探索熊猫,了解如何更好地建立数据模型,因为有效的数据操作可以大大加快数据科学工作流程以更深入地了解您想要探索的数据。
我们的目标是为 1000 个用户生成一个数据集,其中每个用户都存储有一个可能使用 20 个月的设备 uuid。正如我们将在后面看到的,模拟数据很好地收敛到预期值。我们添加了两个过程来更接近真实数据集:
- 定义用户群组(用户首次使用产品时)
- 定义用户流失(用户上次使用产品的时间)
这使我们能够更准确地表示我们可能在公司工作的数据集。
决赛成绩
我们希望最终数据集包括设备所有月份的活动数据:
- 数字(使用)特性:用户在那个月使用了多少特性(当用户不活跃时,我们删除条目)
- 分类特征:根据设备定义(如平台、国家)
为了简化模型,每个设备的数据仅针对使用特征而变化,而对于分类特征而言是静态的。
Preview of the final dataset
最终数据集看起来像是我们从两个表中查询我们业务的关系数据库(例如 MySQL、PostgreSQL)得到的东西,一个包含用户的表(包含分类特征),另一个包含所有事件(包含使用特征)。然后,我们将在 device_uuid(两个表中的主键)上连接两个表,并得出如下所示的结果。每个公司的数据基础设施明显不同,但这是我们可能达到这一点的方式之一。
本文将只关注生成数据,但稍后我们可以使用它来产生群组分析,例如,用户保留曲线,这在本文中没有涉及,但将在接下来的文章中探讨:
User retention plot based on the final data frame
我们什么时候会失去大部分用户?在上一个产品版本中,我们的入职流程的变化是否提高了员工保留率?我们不同细分用户的留存有区别吗?通过这种分析,我们可以回答不同类型的问题,从而更好地了解我们的用户如何使用产品。
你可以在这里找到本帖中使用的所有代码的笔记本。
1。定义主要参数
我们首先导入所有必要的依赖项,并定义上面提到的主要参数(1000 台设备,20 个月,从 2016 年 1 月开始)。
Importing the dependencies
2.生成设备 uuids 并将其与日期时间数据相结合
生成设备 uuid
Generating device uuids
An example oof two device uuids
设备 uuids 是用户使用的每个设备的唯一标识符。
生成日期时间
Generating datetime
输出:
(’ 2016–01–01 00:00:00 ‘,’ 2017–08–01 00:00:00 ')
我们可以看到,使用指定的参数(起始月,月数),我们将生成 2016 年 1 月到 2017 年 8 月的数据。
Adding datetime
Adding datetime data
我们得到一个包含两列的数据帧,device_uuid 和 date。有 1000 * 20 行(设备 uuids 数*周期数)。
3.生成使用特征
在我们的数据帧包括设备 uuid 和日期时间数据之后,我们接下来生成描述产品用途的特性。
我们要做的第一件事是定义:
- 我们希望生成的使用特征数量
- 用户使用每项功能的频率相对于其他功能的比率
虽然特性的数量是不言自明的,但是特性比率需要一些进一步的解释。
我们将特征的数量设置为 3,比率为 0.8,这意味着第一个特征将采用随机生成的数字并乘以 1(保持不变)。这就是比例的来源。第二个特征是第一个特征的 0.8 倍。第三个特征的使用是第二个特征的 0.8 倍。
这意味着如果第一个特性被使用 10 次,第二个特性被使用 8 次,第三个特性被使用 6 次。这只是一种简单的方法,可以避免所有的使用特性都被用在相同的程度上。在这种情况下,特征 1 对应于产品的核心特征。这当然是完全任意选择的。
这种调整产生了以类似方式一致使用的特性,就像真实产品一样。这里有一个很强的假设,即的使用是同质的,因此所有用户都以相同的比例使用特性,这对我们的使用来说已经足够了。
3.1。计算特征比率
然后我们应用上面定义的比率。
Calculate feature ratios
输出:
每个特征的比率:{ ‘特征 1’: 1.0,‘特征 2’: 0.8,‘特征 3’: 0.6}
3。2.将群组分配给设备
现在,我们选择任意数量的群组,并将每个设备分配给特定群组。每个群组对应于用户开始使用产品的日期时间(在我们的例子中是月)。在我们的数据中,群组的数量等于所有月数的一半。在这种情况下,它是 20 / 2 = 10 个群组。1000 个用户意味着每个群组大约有 100 个用户。
Assigning cohort groups to devices
Cohort per device uuid
3.3.添加群组数据
首先,我们定义一个函数,将一系列数据帧连接成一个数据帧。我们将在获得一系列数据帧的输出时使用它,每个数据帧代表特定设备的数据:
Concatenate series of dataframes into one dataframe
然后,我们定义一个函数,并将指定的群组添加到主数据框架中:
Adding cohorts to the main dataframe
接下来,我们使用两个函数来添加群组:
Applying both functions to all devices
Adding cohort data
**正如我们在上面第一个用户的例子中看到的,我们将他们的群组定义为 2016 年 4 月,因此他们是在那时开始使用产品的。**我们删除了他们前 3 个月的数据来模拟这种情况。
An average number of months per device
输出:
15
因为我们给用户分配了群组,所以在这个过程中我们删除了相当多的行。我们可以看到,现在每个用户的平均使用时间从 20 个月下降到了 15 个月。
3.4.生成使用数据
这里我们为功能 1 的使用生成一个随机数(0 到 14)。然后,我们根据为功能 1 生成的数量,使用功能比率来计算功能 2 和功能 3 的使用率。
Generating usage data
Generating usage data
3.5.产生流失行为
虽然我们通过分配群组定义了使用时间段的下限,但我们将使用流失率定义上限。当用户停止使用产品时,就会发生流失。
一般来说,我们有两个简化原则,在此基础上,我们决定用户如何使用产品:
- 搅拌器仍是搅拌器(一个月不使用后,用户不再使用该产品)
- 50%的用户在第一个月流失(大约 50%的用户有 1 个月的数据,50%有更多,因此使用时间更长)
第一个是为了简化模拟,第二个是为了更准确地模拟现实生活中的数据,因为大多数用户通常在尝试产品后就再也不会回来了。
我们定义了模拟流失的函数:
Simulating churn
我们将它应用于我们的数据框架:
Applying the simulating _churn function to all devices
我们有与上一个相同的数据帧结构。现在唯一的区别是,我们删除了模拟用户流失的额外行
An average number of months per device
输出:
5
我们可以看到,我们现在有大约 25%的月份是最初为每个用户生成的(5 / 20)。
4.生成分类特征
在使用特征之后,我们将定义一些分类特征来丰富我们的数据集。然后,我们将能够根据用户的平台、国家或他们是否注册来细分用户,并尝试找到一些模式。
注册用户和未注册用户使用产品的方式有所不同吗(如果有,如何使用)?特定国家的用户呢?我们的大部分超级用户位于哪里,他们有什么共同点?
像这样的洞察力的有益影响可以帮助我们的营销努力瞄准对我们的业务最有利可图的用户(最高 LTV)。更多关于那个这里。
Defining categorical features
输出:
{ ‘国家’:[‘NL ‘,’ AU ‘,’ FR’],‘平台’:[‘iOS ‘,’ Android’],’ user_registered’:[False,True]}
4.1.生成分类特征权重
为与单个用户相关联的分类特征出现的可能性定义权重。
Defining weights for categorical features
如果分类变量中有两个可能的变量(例如“Android”和“iOS”),那么我们预计生成的数据将包含第一个变量的 70%和第二个变量的 30%。
如果分类变量中有三个可能的变量(例如“NL”、“AU”、“FR”),那么我们期望生成的数据包含第一个变量的 60%、第二个变量的 30%和第三个变量的 10%。
4.2.应用分类特征权重
我们创建一个函数来根据定义的参数产生分类特征。
Generating categorical features
接下来,我们应用函数:
Applying the generation of categorical features to all devices
Applying categorical feature weights
每个设备都有自己对应的国家、平台以及是否注册。
5.将所有特征合并到最终数据帧中
我们现在有两个数据帧,一个包含日期时间数据和使用特性,另一个包含分类特性。接下来,我们将它们合并成最终的数据帧。
Merging categorical and usage features
然后,我们将该功能应用于所有设备:
Merging all features
我们可以看到第一台设备(da5e 3464-d356–4572-b962-f2b 57e 730732)于 2016 年 5 月开始使用该产品,使用了三个月,然后被搅动。他们来自荷兰,使用 Android 手机,还没有注册该产品。
6.检查最终数据帧中的模拟输出
我们可以检查我们设置的参数是否也体现在最终的数据帧中。
我们是否生成了我们想要的数据?为什么我们能够做到这一点?因为大数定律:从大量试验中得到的结果的平均值应该接近期望值,并且随着更多试验的进行,将趋向于变得更接近)。更多关于大数定律这里。
6.1.检查使用功能模拟
每项功能的平均使用情况:
Checking simulating of usage features
注册用户和未注册用户的平均值大致相同。
然后我们检查使用特性的比例(每个特性是前一个特性的 80%)。
Checking proportion feature 1 / feature 2
输出:
功能 1 /功能 2: 79%(预期值为 80%)
Checking proportion feature 2/ feature 3
输出:
功能 2 /功能 3: 75%(预期值为 80%)
正如我们在上面的输出中看到的,比例很好地收敛到了期望值。如果我们增加设备的数量,数字会更接近。
6.2.检查分类特征模拟
我们用两个可能的变量来检查分类特征的比例。我们已经将具有 2 个可能变量的特征的权重设置为[0.7,0.3]并将 user_registered 设置为[False,True],因此它具有 2 个可能变量。
检查注册用户:
Checking the proportion for user_registered
输出:
32%的用户注册(预期值为 30%)
检查国家:
我们用三种可能的变量来检查分类特征的比例。
Plotting proportion of rows per country
Checking the simulation of the country feature
我们可以在上面的图表中看到每个国家所有事件的百分比。比例接近定义的参数([0.6,0.3,0.1])
6.3.检查流失模拟
第一个月有多少流失用户,有多少继续使用产品更长时间?
输出:
m1 搅拌器数量/非 m1 搅拌器数量:489 / 455
输出:
48%的用户在第一个月流失(预期值为 50%)
正如预期的那样,大约 50%的用户在第一个月的使用中流失,另外 50%的用户使用产品的时间更长。
7.后续步骤
接下来要做的是进一步处理最终的数据框架,以便更清楚地了解产品中用户的行为模式。我们可以制作可视化图,如上面的保留曲线来回答一些最关键的业务问题:我们在发展业务方面有多成功?