用机器学习生成披头士的歌词 | 项目实战
来源 | Medium
译者 | Arno
披头士乐队是一个巨大的文化现象。他们永恒的音乐直到今天仍然与人们产生共鸣,无论老少。在我看来,他们是有史以来最伟大的乐队¹。他们的歌曲充满了有趣的歌词和深刻的思想。比如说下面的歌词:
-
When you’ve seen beyond yourself
-
Then you may find peace of mind is waitingthere²
是否觉得很强大?披头乐队之所以伟大,是因为他们多才多艺。他们的一些歌曲深沉而有思想,另一些则有趣而轻松。毫无疑问,贯穿他们歌词的最大主题是爱。这里有这么一段:
-
My sweet little darling can’t you see,
-
how wonderful it is when you’re mine.
-
If only I could be your lover forever,
-
I can never get my heart, I can’t get my mind.
事实上,如果你是披头士的忠粉的话,你会发现这些歌词并不是你所知道的披头士写的。不是Lennon,不是McCartney,不是Harrison,甚至也不是RingoStarr。它们实际上是由OpenAI的GPT-2[1]机器学习模型生成的。尽管这里使用了他们最小的模型,但结果却相当惊人。
在我们过于超前之前,让我们后退一步,看看这一切是如何实现的。之后,在github上,都有完整的代码可用。
语言模型
语言模型试图学习语言的结构(如英语或披头士的歌词)。它们是使用监督学习训练的生成模型。与其他监督学习任务一样,语言模型试图预测给定某些特征的标签。然而,与大多数有监督的学习任务不同,它没有明确的标签,而是语言本身同时扮演着特征和标签的角色。
在更高的层次上,语言模型所要做的是根据前面的单词序列预测下一个单词。一个好的语言模型能预测到像“milk”是“to buy a gallon of____.”这一短语的合乎逻辑的下文。
为了猜测下一个出现的单词,我们真正要做的是学习一个基于词汇表的概率分布,而这个词汇表上的单词是我们目前所能见到的。也就是说,我们想要学习

其中,Wi是词汇表上的单词。
因为我们正在显式地对这个分布建模,我们可以用它做一些很酷的事情,比如用它生成我们以前没有见过的单词。我们可以做到这一点的方法是从这个分布中反复采样下一个单词,然后当我们采样下下一个单词时,用它作为条件,以此类推。为了让它更具体,我们在Python中看看这可能是什么样子。如果我们有一个带有采样方法的模型对象,那么我们可以通过这样做来生成新的样本:
previous_words = [...] #已经生成的单词列表
while True:
previous_words.append(model.sample(conditioned_on=previous_words))
当然,这上面跳过了一些细节,但随着我们下面的介绍,这些会变得更清晰。现在,让我们考虑世界上最简单的语言模型–Unigram模型。
Unigram模型忽略任何条件,只是从训练数据中随机选择下一个单词。这相当于把我们的训练数据扔进搅拌机,搅拌10分钟后就把里面的内容倒出来。换句话说,我们不会创造出任何类似英语的东西。
Bigram 模型
在Unigram之上的是Bigram模型,正如你能从这个名字猜出来,Bigram模型学习的分布仅受前一个单词的限制,即


