莫扎特、披頭士隨意切換,這個AI會用10種樂器演奏不同風格音樂

機器之心發表於2019-04-26

前不久,為紀念偉大作曲家巴赫,谷歌建立了 Coconet 多功能模型,該模型可以將任何人的作品以巴赫的風格的演奏。該 AI 模型雖然不錯,但只限於巴赫風格的曲子。若我們想創作肖邦、莫扎特呢?OpenAI 新近建立的模型 MuseNet 可以解決這個問題啦~

MuseNet 是一個深度神經網路,它可以用 10 種不同的樂器生成 4 分鐘的音樂作品,並且還可以結合各種風格的音樂,如鄉村音樂、莫扎特、披頭士樂隊。

Musenet 沒有根據我們對音樂的理解來顯式程式設計,而是通過學習預測成千上萬個 MIDI 檔案中的下一個 token,來發現和絃、節奏和曲風的模式。Musenet 使用了與 GPT-2 相同的通用無監督技術。

MuseNet 瞭解很多不同的音樂風格,我們可以用新穎的方式融合生成作品。此處展示的樣本里,給定肖邦夜曲的前 6 個音符,要求模型用鋼琴、鼓、貝斯和吉他生成一段流行風格的作品。模型成功地將這兩種風格融合在一起,整合的片段大概在 30 秒左右開始演奏。

5月份開放嚐鮮

MuseNet 支援的合作作曲家很多(下面會有展示),並將在 5 月 12 號釋出(屆時 OpenAI 將根據反饋制定下一步計劃)。也就是說,5 月 12 號的時候,大家可以利用 MuseNet 嘗試創作自己的音樂作品啦。雖然到時候只能使用 MuseNet 眾多選項中的一個子集,但大家還是可以創作很多種不同的音樂。

在『簡單模式』(預設顯示)下,你會聽到 OpenAI 預先生成的隨機未切割樣本。選擇一個作曲家或一種風格,一首著名作品的可選開頭,然後開始生成。你可以探索模型能夠建立的各種音樂風格。在『高階模式』下,你可以直接和模型互動。這種情況下生成音樂作品耗時更長,但你建立的將會是全新的作品。

這個工具目前還是一個原型,所以耐心點哦!MuseNet 具有以下限制:

你選擇的樂器不是一定會使用,而是很可能會使用。MuseNet 通過計算所有可能的音符和樂器的概率來生成每個音符。模型會盡量傾向你選擇的樂器,但有可能會選擇其它樂器。

MuseNet 在風格和樂器的奇特搭配方面(比如肖邦與貝斯和鼓)也有困難。如果你選擇的樂器與該作曲家或樂隊的風格接近,則生成的音樂也會更自然一些。

好多好多作曲家和樂器 token

OpenAI 建立了作曲家和樂器 token,以便更好地控制 MuseNet 生成的樣本型別。在訓練期間,這些作曲家和樂器 token 被預先新增到每個樣本中,因此模型會學習利用這一資訊進行音符預測。在生成音樂的時候,我們可以調整模型以選定的風格建立樣本,比如以拉赫瑪尼諾夫的鋼琴曲開頭作為前提,或者以旅程樂團、鋼琴、貝斯、吉他、鼓作為前提。

我們可以視覺化來自 MuseNet 的嵌入,以深入瞭解模型所學到的東西。下面 OpenAI 用 t-SNE 視覺化了各個作曲家和風格嵌入的餘弦相似性

莫扎特、披頭士隨意切換,這個AI會用10種樂器演奏不同風格音樂

原圖為互動圖。將滑鼠懸停在某個特定的作曲家或風格上可以檢視其與其他作曲家或風格之間的關係。

利用 Sparse Transformer 記住長期結構

MuseNet 使用 Sparse Transformer 的重算和優化核來訓練一個具有 24 個注意力頭的 72 層網路—全部注意力放在擁有 4096 個 token 的語境中。這個長語境大概是 MuseNet 能夠記住一個片段中長期結構的原因。

MuseNet 還可以建立音樂旋律形態。

音樂生成是測試 Sparse Transformer 的一個有用領域,因為音樂處於文字和影像的中間區域。音樂有文字流暢的 token 結構(在圖形中,你可以檢視 N 個 token,並找到上面行,而在音樂中,檢視上一小節起點沒有固定數)。但是,我們可以輕易地聽到模型是否可以按照成百上千的 token 順序來獲取長期結構。一個音樂模型是否通過改變節奏而打亂自身結構會更顯而易見,而文字模型是否出現了短暫偏離則沒有那麼明顯。

它都用了哪些資料集?

OpenAI 從諸多不同的來源為 MuseNet 收集了訓練資料。ClassicalArchives 和 BitMidi 為該專案貢獻了大量的 MIDI 檔案,同時他們還在網上找到了爵士樂、流行樂、非洲樂、印度樂和阿拉伯樂等幾種不同風格的音樂合集。此外,他們使用了 MAESTRO 資料集。

Transformer 在時序資料上進行訓練:OpenAI 根據給定的音符來預測即將出現的音符。他們嘗試使用幾種不同的方法將 MIDI 檔案編碼成適用於本次任務的 token。

首先,OpenAI 使用和絃方法,該方法將同一時間聽到的每個音符組合作為一個獨立的「和絃」,同時為每個和絃指定一個 token。其次,他們嘗試通過僅關注音符的開頭來壓縮音樂模式,並且嘗試使用位元組對編碼方案來進行進一步壓縮。

OpenAI 還嘗試使用兩種不同的方法來標記時間推移:要麼是根據音樂節奏進行縮放的 token(因此該類 token 表示一個音樂節拍或節拍的一部分),要麼是以秒為單位標記絕對時間的 token。OpenAI 最終找到了一種結合了表現性和簡潔性的編碼:將音高、音量和樂器資訊組合成一個單獨的 token。

bach piano_strings start tempo90 piano:v72:G1 piano:v72:G2 piano:v72:B4 piano:v72:D4 violin:v80:G4 piano:v72:G4 piano:v72:B5 piano:v72:D5 wait:12 piano:v0:B5 wait:5 piano:v72:D5 wait:12 piano:v0:D5 wait:4 piano:v0:G1 piano:v0:G2 piano:v0:B4 piano:v0:D4 violin:v0:G4 piano:v0:G4 wait:1 piano:v72:G5 wait:12 piano:v0:G5 wait:5 piano:v72:D5 wait:12 piano:v0:D5 wait:5 piano:v72:B5 wait:12

樣本編碼

在訓練中,OpenAI:

  • 通過升調和降調來調換音符(之後,OpenAI 減少了變調數量,從而使生成的音符在單個樂器範圍內)

  • 提高音量,調高或調低不同樣本的整體音量

  • 延長計時(當使用以秒計量的絕對時間進行編碼時),有效地稍微放慢或加快片段。

  • 在 token 嵌入空間中使用 mixup

OpenAI 還建立了一個內部評測:在訓練期間,要求模型預測給定的樣本是出自資料集或是模型之前生成的樣本。該評測分數被用來在生成作品時選擇樣本。

它新增了哪些嵌入?

OpenAI 新增了幾種不同的嵌入,為模型提供更加結構化的語境。除了標準位置嵌入之外,他們還新增了一個學習到的嵌入,該嵌入可以在給定的樣本中追蹤時間推移。這樣,所有同時發出聲音的音符都有相同的時間嵌入。

接下來,OpenAI 為和絃中的每個音符新增了一個嵌入(這是在模仿相關注意力,因為這樣可以讓模型更容易學到:音符 4 需要回看音符 3,或者回顧前一個和絃的音符 4)。

最後,他們新增了兩個結構化嵌入,該嵌入告訴模型指定的音樂樣本在較大音樂片段中的位置。一個嵌入將較大的音樂片段分成 128 塊,另一個嵌入編碼是在模型接近(末尾)token 時從 127 倒數到 0。


原文連結:https://openai.com/blog/musenet/

相關文章