論作曲的能力,深度學習打不過簡單的概率方法
作者:Haebichan Jung
編譯:Bing
編者按:本文來自資料科學家Haebichan Jung,他發現用深度學習製作音樂時存在某些邏輯上的問題,並用資料方法建立自己的模型解決了這一問題。本文分為四部分:
- 問題定位: 我是如何發現在利用深度學習技術生成流行音樂時會有問題的。
- 解決方法: 我如何建立了一個原始的音樂生成機器,只需要簡單方法就能與深度學習相媲美。
- 結果評估: 我是如何建立一套評估體系,用數學方法證明“我的音樂比深度學習生成的方法聽起來更像流行音樂”的。
- 泛化: 如何發現生成自己模型的方法,將其應用到場景而不是音樂生成上。
以下是論智帶來的編譯:
我建立了一個簡單的概率模型,可以生成流行音樂。有了客觀評判尺度之後,我認為模型生成的音樂聽起來更接近流行音樂的風格。我是如何做到的呢?其中最主要的原因是我關注到了流行音樂的核心: 主旋律(melody)和和聲(harmony)之間的資料關係 。

問題所在
在研究二者的關係之前,讓我們首先對這一問題下個定義。我最初開始這個專案時,只是單純想用深度學習生成流行音樂。然後我就接觸到了LSTMs,這是一種特殊的迴圈神經網路,是用於文字和音樂生成的流行工具。
另一位資料科學家Sigurður Skúli曾寫過一篇教程,講述瞭如何用LSTM神經網路和Keras生成音樂。地址: ofollow,noindex">towardsdatascience.com/how-to-generate-music-using-a-lstm-neural-network-in-keras-68786834d4c5
但是我深入瞭解後,對使用RNN和各種變體生成流行音樂的方法背後的邏輯產生了懷疑。這種邏輯看起來是建立在多種有關流行音樂內部結構的假設上,但我並不完全認可。
其中一個具體的假設是主旋律和和聲彼此獨立的關係。
例如,2017年,多倫多大學的研究人員Hang Chu等人曾發表文章: Song From Pi: A Musically Plausible Network for Pop Music Generation 。其中作者認為:“假設和絃是獨立於給定的旋律的……”基於這一論斷,作者搭建了一個複雜多層的RNN模型,主旋律在它所在的層中可以生成音符,而在和絃層中音符是自動生成的。除了彼此獨立,該模型是依靠主旋律生成和絃的,這就意味著和絃的音符生成是取決於主旋律的。

我覺得這種模型很奇怪,因為他並沒有模仿人類創作歌曲的方法。我本人曾學過鋼琴,就個人而言,我是不會在創作主旋律音符時不考慮和絃的。因為和絃音符既定義了旋律,也對旋律有所限制。西方流行音樂有一個很重要的特質:和絃是決定主旋律的關鍵。用資料科學語言表達,我們可以說某一有條件的概率控制了主旋律和和聲之間的資料關係。
解決方法
首先,我研究了控制不同型別音符之間關係的預定概率。其中一個例子就是上文中提到的旋律與和聲之間的“垂直”關係。
處理資料
關於資料,我將20首流行音樂轉換成midi格式,完整歌單可以點選: www.popmusicmaker.com/
利用一個名為music21的Python庫,主要通過馬爾科夫過程處理了midi檔案,提取出作為輸入的不同型別的音符之間的資料關係。具體來說,我會計算我的音符之間的轉移概率(transition probability)。這表示,當音符從前一個過渡到下一個時,我們可以計算其中的概率(下文會繼續深入講解)。

首先,我會提取旋律音符和和絃音符之間“垂直”的轉移概率。同時我也會根據資料集計算旋律與和絃音符之間“水平”的轉移概率。下表就是三種不同型別的音符所計算出的不同轉移概率矩陣:

由上至下分別是三種不同的過渡概率:旋律和和絃音符之間的概率;旋律音符之間的概率;和絃音符之間的概率
模型
利用這三種概率矩陣,我的模型可以遵循以下步驟執行:
1.從資料中隨機選擇可用的和絃音符。
2.用上表中第一種概率矩陣,基於和絃音符選擇旋律音符。
3.用上表中第二種概率矩陣,基於旋律音符選擇和絃音符。
4.重複步驟3,直至結尾。

5.用上表中第三種概率矩陣,基於此前的和絃音符選擇新的和絃音符。

為了詳細解釋這一過程,我們用具體例子代替。
1.機器隨機選擇了伴奏音符F。
2.音符F可以選擇四個旋律音符。利用第一種轉移概率矩陣,它可能會選擇旋律音符C(因為有24.5%的概率可能被選到)。
3.之後,旋律音符C會進入第二種概率矩陣,選擇下一個旋律音符,它可能會選A(概率有88%)。
4.第三步會繼續生成新的旋律音符,直至結尾。
5.和絃音符F會轉入第三個矩陣,選擇下一個和絃音符。根據表中的概率,它可能會選擇和絃音符F或和絃音符C。
6.重複步驟1~4。
結果評估
接著就是最難的部分了——如何對不同模型進行評估。在文章開頭,我曾說這個簡單的概率模型能超越神經網路,但如何將我的模型和來自神經網路的模型進行比較呢?如何用客觀事實說明我生成的音樂的確更接近流行風格呢?
為了回答這個問題,我們首先要明確流行音樂的定義。我是從資料角度出發的,但是流行音樂還有另一個重要的決定因素,即要看在一首歌曲中,開頭、中間和結尾部分(前奏、主歌、副歌、橋段、尾奏等各個部分)都是如何重複的。
例如迪士尼電影《冰雪奇緣》的主題曲《Let it go》中的“Let it go, let it go, can’t hold it back anymore…”就是處於整首歌的中間部分而不是開頭或結尾,並且這一部分在整首歌裡重複了三次。

知道了這一點,我們可以使用一種名為“自相似性矩陣”的工具,它可以通過數學方法將歌曲的前奏、中間主歌和尾奏進行視覺化。下方是電影《曾經(Once)》的歌曲《Falling Slowly》的自相似性矩陣。

在上方動圖中,第一個藍色的大方塊表示歌曲的開頭部分,第二個黃色方塊表示歌曲的另一個片段。第一和第三個方塊都是藍色,是因為它們有相同的自相似性。第二和第四也是如此。
接著,我對資料庫中的20首歌曲全部進行了視覺化處理。
結果
結果非常有說服力。在引入自相似性矩陣之前,我的模型生成的樂曲沒有內部的重複結構。但是將輸入資料的結構進行復制,你可以看到生成的音樂出現了對應的模組。

多倫多大學提出的神經網路模型生成的音樂視覺化後是這樣的:

對比如下:

泛化
最後我想解決的是泛化的問題。我們如何把這個由資料驅動的模型用於除生成流行音樂以外的其他場景呢?換句話說,有沒有其他的模型和我的流行音樂生成模型結構相同?
經過我的思考,我發現另一種創作確實有這種結構,即流行歌詞!
以Edward McCain的《I’ll be》為例,其中一段是這樣的:
I’ll be your cryin’ shoulder
I’ll be love suicide
I’ll be better when I’m older
I’ll be the greatest fan of your life
讓我們把這段歌詞分解,用同樣的機器學習泛化語境。我們可能會將“I’ll be”作為語言模型的第一個輸入,這一二元模型會生成“your”、“crying”和“shoulder”。

之後就是重要的問題:開頭短語“I’ll be”是否和結尾的“shoulder”彼此獨立呢?換句話說,第一句話的最後一個單詞和第二句話的開頭單詞是否有關?
我覺得沒有關係。雖然以“shoulder”結尾,但開頭的“I’ll be”是基於前幾句話的規律,它們形成了重複,說明這幾句話之間的開頭都有相似的關係。

我覺得這一發現很奇妙!流行音樂和流行歌詞都有相似的結構,即內部都能用資料表示。你可以瀏覽我的網站: www.popmusicmaker.com 試試創造自己的音樂。