Google 慶祝巴哈生日,這是音樂 AI Doodle 背後的技術

作者 | 發布日期 2019 年 04 月 03 日 8:45 | 分類 AI 人工智慧 , Google , 科技趣聞 follow us in feedly


3 月 21 日,Google 發表有史以來第一個人工智慧音樂 AI Doodle,慶祝世界著名的德國作曲家和音樂家──Johann Sebastian Bach(約翰‧塞巴斯蒂安‧巴哈)的生日!

Doodle 是 Google Magenta 和 Google PAIR 團隊合作完成,是一種互動遊戲,玩家可創作自己選擇的兩種旋律音樂。按下按鈕後,Doodle 會使用機器學習將旋律協調為巴哈的音樂風格(如果你碰巧在 Doodle 發現非常特別的復活節彩蛋,那可能是巴哈時 1680 年代的混合搖滾風格)。

偉大的德國音樂家巴哈

1685 年 3 月 21 日,巴哈出生在德國艾森納赫小鎮。他在一個音樂大家庭長大:父親能用多種樂器演奏,還擔任鎮上樂隊的指揮。大哥也是音樂家,巴哈 10 歲時父親去世了,從此跟著哥哥長大。巴哈也是傑出的風琴手,他還懂得如何製作和修復複雜的管弦樂器。

巴哈是多產音樂家,每週都能創作一首大合唱曲,同時巴哈也非常謙遜,把自己的成功歸於天賜靈感和嚴格的職業道德。他活著的時候只有幾部作品出版,但現在散於世界各地的手稿作品超過 1,000 部。

隨著 19 世紀「Bach revival」,巴哈名聲一飛衝天,當時,音樂界開始認可和推崇他的四聲部和聲。也許衡量音樂家的最好標準是對其他藝術家的影響,幾個世紀以來一直如此。

然而,音樂家並不是唯一受巴哈音樂影響的人。「旅行者 2 號」太空探測器發射後,科學家兼作家 Lewis Thomas 建議將巴哈的音樂傳遞到太陽系最外層。「我建議使用巴哈的音樂,所有巴哈的音樂」,他寫道。

Doodle 背後的故事

我們可先看看下面的影片,了解 Doodle 誕生的經過。

開發 Doodle 的第一步是什麼?就是建立機器學習模型。傳統的電腦程式設計是訂定一套規則讓電腦給答案,但機器學習是經過輸入大量資料,讓電腦學會找出答案。今天 Doodle 使用的模型是由 Magenta 團隊的 Anna Huang 開發,她開發了 Coconet,是一種多功能模型,可用於各種音樂工作,如協調旋律或從頭開始作曲(可在 Magenta 部落格看到更多技術細節)。

具體來說,Coconet 接受 306 次巴哈合唱協調訓練。巴哈的合唱團總是有四聲部,每聲部都有自己的旋律線,同時演奏能創造出豐富悅耳的和聲。這種簡潔架構成為機器學習模型良好的訓練資料。

PAIR 團隊使用 TensorFlow.js,使機器學習完全在 Web 瀏覽器進行,不需要像傳統機器學習使用大量伺服器。如果某人電腦或裝置不夠快,無法使用 TensorFlow.js 執行 Doodle,Doodle 還可與 Google 新 Tensor 處理單元(TPUs)一起使用,就是在資料中心快速處理機器學習工作。

這些套件與 Doodle 團隊的工程相結合,創造了今天看到的 Doodle。

Bach Doodle 背後的機器學習模型

Doodle 背後的機器學習模型是 Coconet。3 年前 Magenta 團隊成立時,開始研究這個模型。當時他們只使用機器學習(ML)生成旋律。寫出好旋律很難,更不用說和弦了。但就像每個音樂系學生,他們想到了巴哈的音樂!使用巴哈 306 個合唱協調數據集,他們能訓練機器學習模型,以巴哈的風格生成複調音樂。

Coconet 被訓練從殘缺片段回復巴哈的音樂:團隊從巴哈音樂裡取一片段,隨機移除一些音符,然後讓模型根據內文推測出缺失的音符。結果是通用的對位模型,接受任意不完全的樂譜輸入,計算出完整的樂譜。這設定涵蓋了各種各樣的音樂工作,例如協調旋律、建立平滑過渡、重寫和細化現有音樂及從頭開始創作音樂。

傳統的模型通常是按照開始到結束的時間順序生成音符,而 Coconet 可從任何時間開始,以任何順序開發音符。這種彈性使它成為有效的輔助合成工具。音樂家將這點使用於工作流程的方法是反覆讓 Coconet 填寫分數,每次都保留好內容並移除其餘內容。事實上,這就是 Coconet 的內部工作機制:在迴圈生成材料,反覆重寫和移除自己的工作。它從粗略的想法開始,然後反覆算出細節,並把材料調整成連貫的整體。

模型的工作原理

Coconet 抓取不完整的樂譜並補充缺失的部分。為了訓練它,團隊從巴哈的四聲部聖詠選出一段,隨機移除一些音符,並要求模型重建移除的音符。巴哈作曲和 Coconet 作品間的差異有個學習訊號,透過這個訊號就可訓練模型。

透過隨機移除音符,團隊希望得到能處理任意不完整輸入的模型。它相當於一次訓練多個模型,每個模型都適用不同場景。

在團隊看來,「樂譜」是 3D 的。巴哈的合唱是為四聲部創作,分別是女高音(S)、女中音(A)、男高音(T)和男低音(B)。每聲部的音樂都用鋼琴曲來表現:一個 2D 陣列,時間(離散)為行,音高為欄。我們假設每聲部在任何給定的時間都只唱一個音。因此對每聲部、每個時間點,都有一 one-hot 基音向量,除了一個單獨表示正在唱音高向量,其他元素都為零。有不確定性的情況下(例如模型匯出),此基音向量將包含基音上的分類機率分布。

團隊把這疊鋼琴視為捲積特徵圖,時間和音高構成 2D 捲積空間,每聲部都提供一個通道。由於他們輸入模型的音符不完整,於是為每聲部提供其餘的掩膜通道:二進位值指示每個時間點該聲部的音高是否已知。故進入模型的是八通道特徵圖。

模型是非常簡單的捲積神經網路,有批量標準化和殘差連結。對使用 TensorFlow.js 達成在瀏覽器執行模型的 Doodle,可透過切換到非垂直可分離捲積來加快計算速度。

團隊訓練該模型,以提高分配音高給真正音符的機率,促使模型去理解接收的不完整樂譜的音樂含義──現在用什麼調,是什麼樂器,下個音符是什麼,前面的音符是什麼?

一旦模型訓練好,就可從模型產生的機率分布擷取音樂。我們可根據每個音符的分部取樣每個音符。然而,這無法解釋取樣音符之間的相互作用。通常,確定其中一個音符會改變其他音符的分部。

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

實際上他們採用的方法更強大:將模型匯出視為粗略的草稿,然後反覆重寫、逐步細化。具體地說,同時取樣所有音符,獲得完整的(但通常無意義)樂譜,然後將部分移除並再次傳給模型,然後重複此過程。隨著時間推移,需要抹去和重寫的音符越來越少。

團隊建模的過程中,每次只建模一個變數。同時,他們採用無序建模,且採用 Gibbs 取樣法,從多個順序生成樂譜,因此保證模型有效。

(本文由 雷鋒網 授權轉載;首圖來源:Google

延伸閱讀: