巴赫塗鴉創作者Anna Huang現身上海,傾情講解「音樂生成」兩大算法

  • 2019 年 10 月 4 日
  • 筆記

作者 | camel 編輯 | 唐里

近日在上海舉辦的世界人工智能大會(WAIC)TensorFlow 峰會中,「巴赫塗鴉」( Bach Doodle)的創作者 Anna Huang(黃成之) 現身會場,詳細講解了「巴赫塗鴉」背後音樂生成的技術原理及相關研究,包括能在任意塗白處填充曲調的 Coconet算法,以及能夠生成長時段樂曲的Music Transformer算法。

音樂生成(Music/MIDI Generation),作為一個研究領域儘管小眾,卻歷史悠久,過去主要用遺傳算法、專家系統等來實現,近幾年基本都用深度學習研究。

像深度學習下的大多數研究一樣,當下的音樂生成技術取得了巨大的進步,然而離自動創作出一部優美的音樂還有很大的距離。

Anna Huang作為一個作曲家兼AI研究員對音樂生成技術的定位是:人類作曲的好幫手。

1. Anna Huang 與巴赫塗鴉

Anna 出生在香港,卻成長於美國。從小她接受了嚴苛的藝術教育,但她的矛盾在於一方面喜愛音樂,而另一方面卻備受枯燥的音樂考試及音樂創作中的重複性工作的折磨。幸運的是,她的父親是大學的計算機教授,對於用計算機代替人類重複性的勞動,Anna 有着「天然」的興趣。[1]

Anna認為「我們上課,或者向作曲家學習的,應該是學習怎樣去表達我們想表達的東西,去尋找我們到底想說的是什麼」[1]。

2006年,在加州大學讀書期間,Anna自編程序完成了她人生第一個音樂與計算機結合的學術課題——Palestrina Pal,這是一款基於Java的分析工具,幫助檢測學生模仿文藝復興時期作曲名家帕萊斯特里納的作曲風格時是否存在語法、風格和規則不符的問題。

隨後Anna 先後在麻省理工學院媒體實驗室和哈佛大學拿到了相關專業的碩士和博士學位,並最終於2016年加入 Google Brain 中著名的 Magenta 團隊,這是一支專註於音樂和藝術生成的團隊。

2019 年 3 月 21 日,為紀念作曲家約翰·塞巴斯蒂安·巴赫誕辰 334 周年,Google 上線了首款基於 AI 技術的巴赫誕辰紀念 Doodle「巴赫塗鴉」。這是一款交互式的小程序,用戶在五線譜上用鼠標隨意點擊譜寫一段音樂,點擊「和聲」(Harmonize),幾秒之後 Doodle 背後的機器學習算法就會根據用戶輸入的旋律,生成一段巴赫風格的協奏小曲。

巴赫塗鴉僅在谷歌搜索首頁上線兩天,但全球範圍共創作了多達5500萬首旋律,累積作曲時長長達350年。[2]

巴赫塗鴉背後的核心算法,正是Anna Huang等人提出的Coconet。

論文:Counterpoint by Convolution 論文地址:https://arxiv.org/abs/1903.07227

2. Coconet

Coconet,其名字或許來源於「Counterpoint by Convolution」,因此可以認為是「卷積對位網絡」。它的基本功能就是將一個不完整的樂譜填寫完整。例如為了訓練它,要先隨機擦除樂譜中的一些音符,然後網絡以殘缺的部分為基礎,通過卷積的方法重建整個樂譜,通過與原來的樂譜對比來逐漸提升學習性能。這樣便可以得到一個能夠補全任意不完整輸入樂譜的模型。

事實上,這種想法來源於對人類作曲的觀察。傳統音樂生成算法模型往往是將生成任務分解為按時間順序排列的過程,從頭到尾一次性構成一首音樂。但是人類作曲家卻並不是這樣,而常常是以非線性的方式來編寫音樂,在這裡或那裡塗塗改改,重新審視之前寫過的章節等。Coconet正是為了更好地近似這個過程而提出的。Anna表示,「很多時候我們寫音樂或者寫文章,並不是從頭到尾一氣呵成,而是會有很多次修改、很多跳動,這個模型創作的方式也是這樣,一開始先寫一個比較粗糙的稿,然後慢慢決定每一個地方的細節,再去修改。」

Anna等人選擇了巴赫的眾讚歌作為 Coconet 模型的訓練數據。之所以選擇巴赫作品,主要是因為它簡單,這些曲目都是類似《安魂曲》這樣比較安靜的作品,總是四聲部,而且結構化的特點較為明顯。此外,就是對位(即當我們在同時寫一個複雜的旋律時,如何讓這段旋律和諧好聽,這也是學生在學習作曲和樂器演奏要學的第一件事情),音樂不僅僅是旋律,更重要的是如何將許多條線和諧地組合到一起,而巴赫的音樂正是有這樣需要多個旋律相互對位的曲子。

然而需要注意,巴赫的眾讚歌只有306首,這個數據體量對於當前深度卷積網絡來說太小了。不過正如剛才提到的「隨機擦除」解決了問題,事實上通過「隨機擦除」部分音符,Anna等人能夠獲得近乎無限大小的訓練數據集。

針對樂譜的表示,Anna認為「樂譜」是一個三維物體。首先,巴赫的合唱包括四種聲音:女高音(Soprano)、女低音(Alto)、男高音(Tenor)和男低音(Bass)。此外,每種聲音都是一個二維數組:以(離散的)時間為行數據,以音高為列數據。因此對於每個時刻點的每種聲音,都有一個one-hot的基音向量,除了表示正在唱的向量元素為 1外,其餘元素都為0。在存在不確定的情況下(例如模型生成時),這個基音向量將包含基音上的分類概率分佈。

隨後他們將每種聲音作為一個通道,將時間和音高構成二維卷積空間,三者共同構成卷積特徵圖。

注意,由於他們輸入模型的樂譜是不完整的,於是他們為每種聲音都提供了一個額外的掩膜通道,這是一個二進制值,用來指示每個時間點該聲音的音高是否已知。因此進入模型的是一個八通道特徵圖。

接下來就是一個非常簡單的卷積神經網絡了,它具有批標準化和殘差連接。對於使用 tensorflow.js 實現在瀏覽器中運行模型的 Doodle,可以通過切換到非縱向可分離卷積來加快計算速度。與常規的卷積網絡不同的地方是,這裡將空間軸上的卷積和跨越通道混合區分了開來,這樣一來,它需要的參數就會更少,因此也更適合在瀏覽器中加速。

模型生成的結果將再次是一堆樂譜,每個聲音一個,但這次包含了在刪除音符的音高上的概率分佈。 該模型使用給出的音符來試圖找出被刪除的音符,從而導致在每個時間點由每種聲音演唱的音高上的分類分佈。

研究人員通過訓練模型,來提高音高分配給真正的音符的概率。這個過程就類似於人類作曲,促使模型去理解它所接收的不完整樂譜的音樂含義——現在用的是什麼音調,用的是什麼樂器,下一個音符是什麼,前面的音符是什麼?

一旦模型得到訓練,就可以從模型產生的概率分佈中提取音樂。我們可以根據每個音符的分佈對每個音符進行採樣。然而,這不能解釋被採樣音符之間的相互作用。通常,確定其中一個音符會改變其他音符的分佈。

計算這些交互作用的一種方法是對其中一個音高進行採樣,將其添加到不完整的樂譜中,然後再次通過模型傳遞結果,再重新計算剩餘音高的分佈。通過重複這個過程直到所有的音符都確定,團隊在考慮所有的關聯關係的同時完成樂譜。

實際上,他們採用的方法更加強大:將模型的輸出視為一個粗略的草稿,然後通過反覆重寫逐步細化。具體地說,他們同時對所有音符進行採樣,獲得一個完整的(但通常是無意義的)樂譜,然後將其部分刪除並再次傳遞到模型中,然後重複該過程。隨着時間的推移,需要抹去和重寫的音符越來越少。

Anna 等人在建模的過程中,每次只建模一個變量。同時,他們採用無序建模的方式,並且採用 Gibbs 採樣的方法,從多個序列中生成樂譜。因此,可以保證模型是有效的。

論文:Music Transformer 論文地址:https://arxiv.org/abs/1809.04281

3. Music Transformer

但,Coconet只能生成較短的音樂片段。一首音樂往往會在不同的時間尺度上具有多個主題、短語或重複,因此對於結構複雜的長時程音樂生成一直以來都是一個巨大的挑戰。

Anna等人對此的解決之道就是引入Transformer技術,他們稱之為Music Transformer。Transformer是一種基於自注意力的序列模型,在許多需要保持長時程一致性的生成任務中取得極大的成果。「這表明自注意力也可能適用於音樂的建模」Anna說道。

在這項工作之前,Magenta團隊在2017年也提出了一個稱為Performance RNN算法,這是一種基於LSTM的遞歸神經網絡(RNN)算法。然而我們知道RNN(或者LSTM等)的計算限制為順序的,也就是說RNN相關算法只能從左向右或從右向左依次計算,這種機制會帶來兩個問題:

  1. 時間片t的計算依賴t-1時刻的計算結果,這樣限制了模型的並行能力;
  2. 順序計算的過程中信息會丟失,儘管LSTM等門機制的結構一定程度上緩解了長期依賴的問題,但是對於特別長期的依賴現象,LSTM依舊無能為力。

這些問題也同樣表現在音樂生成當中。

以上是基於Performance RNN針對肖邦的Black Key Etude生成的連續樂曲。雖然基於LSTM的模型能夠在幾秒左右的時間尺度上產生聽起來似乎合理的音樂,但顯而易見缺乏長期結構。這個模型似乎「忘了」它之前彈奏的什麼內容。

而 Transformer能夠解決以上兩個問題。首先它使用了Attention機制,將序列中的任意兩個位置之間的距離縮小為一個常量;其次它不是順序結構,因此具有更好的並行性。

然而僅有Transformer並不夠。原始的Transformer依賴絕對定時信號,因此很難跟蹤基於相對距離、事件順序和周期性的規律。如上圖所示在這種情況下,生成的音樂後半部分完全不忍直視。

相對全局注意力:底下一行描述了內存高效「傾斜」算法,它不需要實例化R(上面一行,即O(L2D))。灰色表示掩膜或填充位置。每種顏色對應不同的相對距離。

Anna等人於是在Tranformer的基礎上又加入了相對注意力的概念,它能夠基於兩個token之間的距離進行調節注意力。通過這種方式,Music Transformer便能夠更多地關注關係特徵。更值得強調的是,相對自注意力還允許模型生成超出訓練樣本長度的音樂,這是原始的Transformer模型無法做到的。

這是Music Transformer生成的樂曲:

把三者放在一起對比:

第一行:Music Transformer;第二行:Baseline Transformer;第三行:PerformanceRNN (LSTM)

可以看出它能夠延續樂曲一貫的演奏風格,且能生成多個主題。相比之下,Performance RNN和Transformer這兩種算法,要麼完全缺乏可辨別結構,要麼無法保持結構一致。

針對相對自注意力,Anna還提供了一種可視化方法。她用弧線顯示了最後一層注意力權重,顯示過去的那些音符會影響未來。模型會將注意力集中在各種顫音塊之間,並且能夠跳過不太相關的部分。

但 Anna 也承認Music Transformer並不能達到完美,它有時會重複次數過多,部分又過於稀疏。但她希望Music Transformer能成為音樂家需要靈感時有用的幫手。這為用戶提供了一種可能性,他們可以指定開頭,並將模型作為一種創造性工具來探索一系列可能的延續。「試想一個作曲家有一天突然沒有了靈感,那麼這個時候他就可以藉助於這個模型獲得一些啟發」,Anna說。

在報告之後,AI科技評論榮幸參與了對Anna Huang的採訪,以下是部分採訪紀要:

Anna:我們把機器學習當做是一個非常好的工具去助推和加速整個文化和音樂創造的整個過程。我們在談到機器學習如何去助推創作的過程當中,針對不一樣的人群,它是有不同的含義的。

如果說您是一個新人,機器學習可以讓你以更快的方式去了解旋律,我畫出一些旋律,機器學習會告訴你這將是什麼效果,巴赫 Doodle就是很好的一個例子,能夠讓我們只需要簡單地輸入一點旋律,就可以體驗作曲的樂趣。

如果您是一個比較資深的作曲家,利用機器學習可以讓你很快做出一個小樣,先看一下這樣的創作到底是什麼樣的效果,然後你再去看能做些什麼調整,這樣也是很有幫助。

記者:創造力是人類對於機器最大的優勢之一,為什麼人類會需要讓機器來幫忙做作曲這樣創造類的事情?

Anna:我自己是一個作曲家,我想從我個人感受談下這個問題。創作的過程可以分成兩個階段。第一個階段就是產生大量想法的階段,這個時候你需要大量的想法,為後續的創作提供靈感來源;第二階段是一個想法聚合的階段,你需要從海量的想法當中找到能夠表達你的述求的想法。在這兩個階段,機器學習都能夠給人們提供極大的幫助。試想一個作曲家有一天突然沒有了靈感,那麼這個時候他就可以藉助於機器學習獲得一些靈感上的啟發。而在創作中,如果要在結構層面上進行調整的話會是一個非常重複性的工作,這個時候機器學習便能夠幫上忙了,當然後續的微調還是需要由人來完成。

記者:我們研究的目標之一,是想在未來讓機器創作出完全屬於它自己的一個完整的作品嗎?

Anna:我不認為,未來我們會希望讓機器去做出它自己的音樂作品。從我作為作曲家的角度來看,音樂其實是一種溝通方式,一種表達感情和感受的方式,而作曲家是在利用自己的作品去向他的讀者或聽眾表達情感和感受。

所以我們要做的其實應該是給他們(作曲家)提供賦能的工具,讓他們可以更直接地、更好地把自己的情感和感受表達出來。

記者:目前機器創作出來的音樂的風格,跟人類有不一樣的地方嗎,還是說機器創造出來的(音樂)特別像它學習到的那些人類音樂家的風格?

Anna:談到這個問題,我想舉兩個例子來回答。

巴赫Doodle是一個很好的例子。如果你去學作曲的話,任何一個初學者都會先從巴赫的音樂去聽、去模仿,因為它有很多的規律、很多樂理包含在裏面。每一個音樂的學生,在學音樂之前都要先了解這些樂理。但是機器是非常有趣的載體,它不知道這些樂理知識,它只是從它本身的學習過程中去揣測應該怎麼作曲,因此它會無意識地打破很多傳統樂理上面的條條框框。機器可能會借用其他領域的內容和數據來做作曲。換句話說,某些它認為音樂性特彆強的、可以放到作曲環境中表達的點,在我們人類作曲家看來可能會覺得與樂理知識相衝突、甚至格格不入。機器可以讓我們從許多不同的角度來理解作曲這件事。

再來說第二個例子,目前機器學習在作曲方面還沒有辦法做到長時程的音樂生成。比如,我要用長段音樂來表達故事,塑造一個主人公,或和我們的聽眾互動,現在機器學習還做不到。所以目前人類和機器學習,還處在一種相互訓練和相互學習的過程,一個過渡階段。這個過渡階段非常有趣。因為我們可以看到,機器認為這部分音樂性特彆強,把這個元素加到創作當中;人類會覺得這違背樂理,但也有可能被激發出新的靈感來。結構化這一塊,機器學習現在還沒有辦法做得很好,但目前機器學習生成的一些結構化的數據可以幫助我們人類去做音樂創作。這整個過程是很有趣的。

記者:以巴赫 Doodle為例,要基於 TensorFlow 去做AI Doodle的話,最大的挑戰是什麼?是模型數據集的建立嗎?

Anna:在做巴赫Doodle的過程中,我們遇到了很多挑戰。剛才你談到數據集的問題,就是我們遇到的第一個挑戰。因為我們只有306首巴赫的曲目來做訓練樣本,要學習一個作曲家的風格,這個數據集的規模是非常小的。我們用到了一個叫本能化,或者叫直觀化的數據採樣方式。什麼意思呢?就是說我們輸入一篇樂譜時,不是從頭到尾去讀這段音節或這段旋律,而是隨機從中抽出幾塊遮蓋起來,讓機器去猜測這段旋律中空白的部分。如此一來,我們就將一段旋律,從不同角度、以排列組合的方式衍變成了許多段旋律,這就解決了我們數據集的問題。

第二個問題,是建模的問題。建模最大的挑戰在於「速度」,因為我們需要實現互動性——在瀏覽器網頁上與用戶做互動,速度非常關鍵。當你輸入一段旋律進去後,它會有很多重寫的工作。我們做了很多架構上的改進,實現了從40秒加速到現在的2秒。除此之外,我們還納入很多其他方面的技術來最終實現AI Doodle的互動效果。

記者:為什麼選擇巴赫而不選擇其他一些更近現代(像施特勞斯這樣的作曲家)的作品來做這個 Doodle?因為我們知道巴赫的風格和他的旋律性是特別難的。

Anna:我們在作品選擇上是有一些篩選標準的。我們選了巴赫作品中相對簡單的作品:都是類似《安魂曲》這樣比較安靜的作品,總是四聲部,而且結構化的特點非常明顯。此外,就是對位。對位就是,當我們在同時寫一個複雜的旋律時,如何讓這段旋律和諧好聽。這是學作曲的學生都要做的第一個事情。因為音樂不僅是旋律,還是如何把很多條線和諧地組合到一起。結合到巴赫Doodle這個項目,作曲不是說我簡單把旋律寫進去,它就出一首歌,它一定是多個旋律之間相互對位,才能夠形成一個非常完整的曲子。這個是谷歌 Doodle團隊、Magenta團隊和 TensorFlow.js 合作的一個項目。剛好 Doodle團隊當時有工程師正在學習作曲,他就想說這第一個AI Doodle,能不能讓每一個人都能夠在瀏覽器上面利用機器學習來體驗作曲。這也是我們開始這個項目的初衷。

記者:目前巴赫 Doodle對創作者來說是完全免費嗎?

Anna:巴赫 Doodle是對所有人完全免費開放的。即使它現在不在Google的主頁上了,但是在存檔的網站還是可以繼續玩。此外,巴赫 Doodle背後的機器學習模型和所有的代碼也都是開源的[10]。除了提供開源的模型給創作者,我們同時也提供即插即用、與創作軟件相融合的一個功能,因此在一些傳統的、主流的音樂創作軟件中也可以使用我們的這個機器學習的算法。另外我很感興趣但還沒有做很多的一項工作是,這些模型或許會對音樂教育有所幫助,可以讓更多人擁有主動創作的體驗、去作曲,去發掘他們的興趣。

參考資料:

[1] Google 為你復活巴赫, https://mp.weixin.qq.com/s/wFcCnzRnI4mPIDOYD1X8yA

[2] Counterpoint by Convolution, https://arxiv.org/abs/1903.07227

[3] Music Transformer, https://arxiv.org/abs/1809.04281

[4] The Bach Doodle: Approachable music composition with machine learning at scale, https://arxiv.org/abs/1907.06637

[5] Coconet: the ML model behind today』s Bach Doodle, https://magenta.tensorflow.org/coconet

[6] Music Transformer: Generating Music with Long-Term Structure, https://magenta.tensorflow.org/music-transformer

[7] 詳解Transformer (Attention Is All You Need), https://zhuanlan.zhihu.com/p/48508221

[8] 谷歌機器學習模型新進展:生成時長更長且連貫的音樂, https://cloud.tencent.com/developer/article/1380289

[9] 谷歌發佈音樂 AI Doodle 慶祝巴赫生日,這裡是它背後的技術, https://www.leiphone.com/news/201904/GQYJhhj91UdjSV2P.html

[11] 巴赫誕辰紀念 Doodle, https://www.google.com/doodles/celebrating-johann-sebastian-bach