前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用深度学习预测Phish乐队接下来唱什么歌(上)

用深度学习预测Phish乐队接下来唱什么歌(上)

作者头像
AiTechYun
发布2019-12-03 15:17:50
5310
发布2019-12-03 15:17:50
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号

编辑 | sunlei 发布 | ATYUN订阅号

Phish, Hampton 2018

Phish——一个标志性的现场摇滚乐队,和机器学习的世界…他们可能有什么共同之处?

与绝大多数音乐艺术家的现场表演不同,对Phish来说,大多数活动都是没有计划的。从乐队踏上舞台的那一刻起,没有预先确定的节目单、歌曲选择或演出时长。每一场演出,乐队和观众都开始了一段全新的旅程,充满了集体的能量和高超的即兴表演的能力。

我和我的朋友多年来一直在看Phish的演出,就像社区里的许多Phans一样,我们经常在每次演出前玩一个游戏,看看谁能猜出Phish的876首歌曲中哪首会在某个晚上演出。我们的游戏版本包括:每个人猜测节目的开场,在节目中播放三首歌曲,再唱一首歌曲。考虑到你(在技术上)有大约0.11%的成功几率,如果你的预测中有一个是正确的,那么这通常是一个非常美好的夜晚。

在业界做了几年的数据科学家之后,我开始发现Phish的歌曲选择中隐藏的统计模式,并建立一个模型来预测接下来的歌曲。

方法

我决定以类似于神经语言模型的方式,把这个问题框定为一个连续的多类分类任务——即:

“我能准确地预测接下来演出的歌曲是什么吗?”

在本文的以下部分中,我将详细介绍我的数据收集/准备过程、建模练习、结果和改进计划—让我们开始深入了解细节。

数据

对我来说幸运的是,在Phish.net上有一个很棒的团队,他们积极维护和更新一个全面的数据库和公共API,用于所有Phish相关的事情,包括:演出、设置列表、场地、歌曲等等。在编写了Python API包装器(与Mike Arango合作)之后,我能够检索所有1752个Phish显示的历史数据,这些数据可以追溯到1983年。

来自Phish.net API的最新5个示例,使用解析的setlist数据和分隔的管道

创建训练数据集

有了语言建模方法,我通过首先删除不完整的setlist,然后按时间顺序将每个setlist连接到一个长列表中,并将876首唯一歌曲中的每首歌的数据编码为整数,再加上所有setlist标识符来生成训练数据。在序列中维护setlist标识符(Set 1, Set 2, Encore,等等)提供了上下文,并将允许模型了解某些歌曲更有可能出现在第二个Set的开头与中间与Encore之间。

接下来,我创建了训练样本对——即序列(Y)中与下一首歌曲配对的歌曲列表(X)。我将单个连接列表切片为N个长度为L的样本,其中L成为用于建模的超参数。这个模型需要多长时间才能准确预测下一首歌曲?我测试了长度为25、50、100、150和250的序列,稍后将进行更多的测试。然后我在大约37000个样本上创建了一个80/20的训练/验证分离来评估我的模型。

一个样本训练对的示例

建模

虽然有许多机器学习模型可以应用到这个场景中,但我选择了实现一个深度学习方法,因为它在我的隐喻性语言建模任务中保持了最先进的性能。具体地说,我选择测试了具有嵌入层和LSTM(长短时记忆)细胞的顺序RNN(递归神经网络)的几种不同配置。RNN的周期性使得信息可以跨时间步长共享,使得学习到的知识可以作为“记忆”在网络中保持。因此,这种体系结构非常适合学习我们的setlist建模问题的顺序性质。我的模型的其他组件包括:

歌曲嵌入层-类似于NLP世界中的单词嵌入…我选择为876个类中的每一个嵌入一个N维向量,希望该模型能够了解每首歌曲的潜在因素,以提供更丰富的特征集,用于以后的预测层。此处的嵌入大小成为另一个可探索的超参数。稍后将对此进行更多分析。

LSTM细胞——典型的RNN非常擅长学习和联想短期依赖关系。如果我们的输入序列只有一个setlist(大约10-20首歌曲),这是可以的,但是因为我们需要监视和跟踪许多节目的长期依赖关系,所以我们的输入序列长度在50-250首歌曲之间。LSTM单元引入了一个称为“cell state”的学习参数,该参数为网络提供了一个选项,可以选择“记住”或“忘记”重要或不重要的长期依赖关系。

退出-在[相对]小数据集上应用神经网络的一个常见问题是过度拟合的诅咒。我在这里提出的深度学习架构有>300,000个学习参数,这意味着模型很容易从它看到的训练数据“学习太多”,而不能很好地泛化到新数据。为了防止这种情况发生,我实施了dropout正则化,即在训练过程中随机“关闭”某些神经元的激活。这种故意阻碍模型学习的方法对于防止过拟合非常有效。

学习速率查找器——选择最优的学习速率对于神经网络的及时有效训练至关重要。学习速率过高,模型就会偏离;太低,你的模型将永远训练,损失几乎没有改善。我整合了这个了不起的LR Finder Keras回调函数,它为几个小批量运行绘制了学习速率与丢失的关系图,以帮助您可视化最佳学习速率。我还添加了一个平滑特性,它采用指数移动平均来帮助清理视觉上的障碍,以便于理解。最佳学习率对应于损失的最大降幅——如下图绿色所示。

带有平滑图的学习速率查找器示例(右)

Adam Optimizer -Adam通过结合每个参数的学习速率(来自AdaGrad)和动量(来自RMSProp)的概念改进了基本随机梯度下降(SGD)。简而言之,这种增强的优化器使您的模型能够更快地学习,并且已经成为该领域的“入门”技术。

对于这些模型和优化器组件,以下是用于实验的两种体系结构变体:

模型结构1:

具有嵌入层,Dropout层,LSTM层,Dropout层,和一个密集层的序列模型

模型结构2:

与上述模型相同,但两个堆叠的LSTM层用于附加学习参数

今天先学到这里,明天我们来进行一个小实验。

原文链接:

https://towardsdatascience.com/predicting-what-song-phish-will-play-next-with-deep-learning-947ccce3824d

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档