靳聰,侯聰聰,程致遠,張海茵
(1.中國傳媒大學(xué)信息與通信工程學(xué)院,北京 100024;2.中國傳媒大學(xué)計算機與網(wǎng)絡(luò)空間安全學(xué)院,北京 100024)
算法作曲(algori thmic composition),或稱自動作曲(automated composition),是試圖使用某個形式化的過程,以使人(或作曲家)在利用計算機進行音樂創(chuàng)作時的介入程度達到最小的研究[1]。在一系列技術(shù)中,音樂被特征化地提取出諸如像音高、音長(時值)和音色這些參量并加以分別控制。從每個參量中,依次選擇可能的值就可以組織成一個音列參量值,可以依據(jù)當前音列或該音列的倒置或逆行進行變化。1906~1912年間,馬爾科夫提出并研究了一種能用數(shù)學(xué)分析方法研究自然過程的一般圖式——馬爾科夫鏈,即已知當前的音符來根據(jù)概率產(chǎn)生下一個音符[3][4]。由 Ames 和 Domino 研制的 Cybernetic Composer 是成功地使用 Markov 鏈和隨機過程的典型系統(tǒng)[5]。隨著人們的研究,[6][7]為在已定義完善的領(lǐng)域內(nèi)建立模型或者是介紹一個清晰的結(jié)構(gòu)或規(guī)則,必然是要使用音樂知識庫的,Ebciogln[8]建立了一種回溯說明語言(backtracking specification language,簡稱BSL),用它來實現(xiàn)CHORAL——一個基于規(guī)則的專家系統(tǒng),該系統(tǒng)可以為單聲部主旋律構(gòu)造具有巴赫風(fēng)格的四聲部合唱曲,且有一定的實用價值[9]。接著Mozer使用遞歸神經(jīng)網(wǎng)絡(luò)技術(shù)構(gòu)造了CONCERT,并用反向傳播學(xué)習(xí)算法來訓(xùn)練CONCERT以一音接一音的方式來創(chuàng)作旋律。隨著深度學(xué)習(xí)在各個應(yīng)用領(lǐng)域的迅速發(fā)展,人們對它的研究也越來越深入,在此我們提出一種基于深度學(xué)習(xí)用我們所定義的規(guī)則建立音樂生成模型。
對于音樂有時序信息的數(shù)據(jù)的生成,無監(jiān)督學(xué)習(xí)網(wǎng)絡(luò)最適合,尤其是遞歸神經(jīng)網(wǎng)絡(luò)(RNN)和長短期記憶網(wǎng)絡(luò)(LSTM)在該領(lǐng)域表現(xiàn)出相當?shù)男阅?。然而,這些網(wǎng)絡(luò)在處理消失和爆炸梯度問題方面表現(xiàn)不足[1],為了解決這些問題,人們也在不斷的研究新的網(wǎng)絡(luò)結(jié)構(gòu)[2]。如今變分自動編碼器(VAE)和生成性對抗網(wǎng)絡(luò)(GAN)[8]被大家廣泛應(yīng)用到生成數(shù)據(jù)的復(fù)雜結(jié)構(gòu)模型?;赩AE-GAN網(wǎng)絡(luò)結(jié)合我們所規(guī)定的規(guī)則智能生成音樂。
本論文章節(jié)安排如下:第二部分介紹所依據(jù)的理論部分以及所規(guī)定的規(guī)則;第三部分介紹我們的實驗部分;第四部分介紹了實驗結(jié)果以及分析;第五部分對本論文進行了總結(jié),同時對未來做出一些規(guī)劃。
循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)是一類用于處理序列數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò),從而RNN是一個序列到序列的模型,做出如下的定義:Xt:表示t時刻的輸入,Ot:表示t時刻的輸出,St:表示t時刻的記憶,根據(jù)公式:
St=f(U×Xt+W×St-1)
(1)
其中f為激活函數(shù),使其做一個非線性映射,可以用來過濾信息。RNN預(yù)測時利用當前時刻的記憶St去預(yù)測,然后利用softmax來預(yù)測每種輸出的概率如公式:
Ot=softmax(VSt)
(2)
其中V表示權(quán)重矩陣,Ot就表示時刻t的輸出。
變分自編碼器(variational auto-encoder,VAE)是一個使用很好的近似推斷的有向模型,可以純粹地使用基于梯度的方法進行訓(xùn)練。VAE首先從編碼分布Pmodel(z)中采樣z。然后使用樣本通過可微生成器網(wǎng)絡(luò)g(z)。最后,從分布Pmodel(x;g(z))= Pmodel(x|z)中采樣x。VAE由一個近似后驗p(z|x)的編碼器qλ(z|x)和一個參數(shù)化似然性p(x|z)的解碼器pθ(x|z)組成。在實踐中,近似后驗分布和似然分布(“編碼器”和“解碼器”)分別由參數(shù)λ和θ的神經(jīng)網(wǎng)絡(luò)參數(shù)化。遵循變分推理的框架,我們通過最大化讓下界(ELBO)[2]來最小化KL散度,利用編碼器和后驗p(z|x)之間的KL散度,來進行后驗使其推理到z~qλ(z|x)和KL(·||·)。由于用于獲取z的采樣操作,通過ELBO計算梯度是不可行的。所以在p(z)是對角協(xié)方差高斯的常見情況下,這可以通過將z~N(μ,σ)替換。
VAE中的編碼器和解碼器網(wǎng)絡(luò),具體地說,編碼器qλ(z|x)是一個循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),它處理輸入序列x={x1,x2,...,xT}并產(chǎn)生一系列隱藏狀態(tài)h1,h2,...,H(t)。 然后將潛在代碼z上的分布參數(shù)設(shè)置為h(t)的函數(shù)。 解碼器pθ(x|z)使用采樣的潛在向量z來設(shè)置解碼器RNN的初始狀態(tài),解碼器RNN自動生成輸出序列y = {y1,y2,...,y(t)}。 該模型被訓(xùn)練以重建輸入序列(即,yi = xi,i∈{1,...,T})并且學(xué)習(xí)接近先前的p(z)的近似后驗qλ(z|x)。對于編碼器qλ(z|x),我們使用雙向RNN網(wǎng)絡(luò)。通過對這個解碼器進行分析,使用一種分層次的RNN解碼器。
生成式對抗網(wǎng)絡(luò)(GAN,Generative Adversarial Networks)是一種深度學(xué)習(xí)模型,是近年來復(fù)雜分布上無監(jiān)督學(xué)習(xí)最具前景的方法之一。模型通過框架中(至少)兩個模塊:生成模型(Generative Model)和判別模型(Discriminative Model)的互相博弈學(xué)習(xí)產(chǎn)生相當好的輸出。生成器網(wǎng)絡(luò)直接產(chǎn)生的樣本如:
x=g(z;θ(g))
(3)
判別器網(wǎng)絡(luò)試圖區(qū)分從訓(xùn)練數(shù)據(jù)抽取的樣本和從生成器抽取的樣本。判別器發(fā)出由給出的概率值,指示X是真實訓(xùn)練樣本而不是從模型抽取的偽造樣本的概率。
判別模型D的訓(xùn)練目的就是要盡量最大化自己的判別準確率。當這個數(shù)據(jù)被判別為來自于真實數(shù)據(jù)時,標注1,來自于生成數(shù)據(jù)時,標注0。而與這個目的相反的是,生成模型G的訓(xùn)練目標,就是要最小化判別模型D的判別準確率。在訓(xùn)練過程中,GAN采用了一種非常直接的交替優(yōu)化方式,它可以分為兩個階段,第一個階段是固定判別模型D,然后優(yōu)化生成模型G,使得判別模型的準確率盡量降低。而另一個階段是固定生成模型G,來提高判別模型的準確率。他的目標函數(shù)為:
Ez[log(1-D(G(z)))]
(4)
這驅(qū)使判別器試圖學(xué)習(xí)將樣品正確的分類為真的或者偽造的,同時,在收斂時,生成器的樣本與實際數(shù)據(jù)不可區(qū)分,并且判別器處處都輸出二分之一。從而達到學(xué)習(xí)的效果。
生成對抗式網(wǎng)絡(luò)框架能訓(xùn)練任何一種生成器網(wǎng)絡(luò)。大部分其他的框架需要該生成器網(wǎng)絡(luò)有一些特定的函數(shù)形式,比如輸出層是高斯的。重要的是所有其他的框架需要生成器網(wǎng)絡(luò)遍布非零質(zhì)量(non-zero mass)。生成對抗式網(wǎng)絡(luò)能學(xué)習(xí)可以僅在與數(shù)據(jù)接近的細流形(thin manifold)上生成點。不需要設(shè)計遵循任何種類的因式分解的模型,任何生成器網(wǎng)絡(luò)和任何鑒別器都會有用。與VAE相比,它沒有變化的下限。如果鑒別器網(wǎng)絡(luò)能完美適合,那么這個生成器網(wǎng)絡(luò)會完美地恢復(fù)訓(xùn)練分布。換句話說,各種對抗式生成網(wǎng)絡(luò)會漸進一致(asymptotically consistent),而VAE有一定偏置。
綜合以上兩者,結(jié)合各網(wǎng)絡(luò)的優(yōu)缺點,我們提出新的多模態(tài)神經(jīng)網(wǎng)絡(luò)模型:基于規(guī)則的神經(jīng)網(wǎng)絡(luò)(RVAE-GAN)。 該網(wǎng)絡(luò)模型包括一個編碼器E,一個發(fā)生器G(解碼器)和一個鑒別器D。如圖所示:
圖1 系統(tǒng)框圖
在VAE解碼器和GAN發(fā)生器中,通過讓它們共享參數(shù)并共同訓(xùn)練使它們合并為一個。這部分中使用的三個網(wǎng)絡(luò)的主要架構(gòu)都加入了卷積神經(jīng)網(wǎng)絡(luò)。將輸入時間相關(guān)數(shù)據(jù)視為一系列具有內(nèi)部相關(guān)性的單獨幀。而這些幀利用卷積神經(jīng)網(wǎng)絡(luò)提取生成,同時保持它們之間的相互依賴關(guān)系。對于每一對連續(xù)幀,使用編碼器將先前幀編碼為其相應(yīng)的潛在信息。然后,生成器嘗試從先前幀的潛在分布產(chǎn)生(預(yù)測)后續(xù)幀的信息。這樣就將當前的信息和來自先前幀的信息結(jié)合起來以生成下一個所需內(nèi)容。 然后將每一對當前真實訓(xùn)練幀和合成幀分別作為真實數(shù)據(jù)和假數(shù)據(jù)轉(zhuǎn)發(fā)給鑒別器。
3.2.1 旋律規(guī)則
由音樂理論所形成的一系列創(chuàng)作規(guī)則或者約束條件的完成度來形成reward函數(shù)。旋律線是音樂中最重要的表現(xiàn)手段之一,從一般的意義上來說,音樂離開了旋律線和節(jié)奏是不可能存在的。旋律線的表現(xiàn)能力和規(guī)律性,在相當程度上是以緊張度增長的上行同緊張度逐漸下降的下行的自然聯(lián)系為依據(jù)的。
在這里,本論文根據(jù)旋律線中音程的約束條件,盡量避免超過五度的大跳,而在旋律線中的音程避免超過八度的大跳同時避免連續(xù)同方向的大跳;在三個音符依次組成上升旋律線的時候,大跳之后一般要緊隨一個小音程在三個音符依次組成下降旋律線;盡量避免在旋律線中使用三全音或者減五度以及連續(xù)重復(fù)同一個音符。若兩個相鄰的音符之間的音程差如果大于八度音階的話將被記為0,反之則記為1,g1(x)則是每段音樂的平均值。即:若一段音樂有a組相鄰音符的音程差大于八度音階,剩余的b組小于等于八度音階??捎萌缦鹿奖硎荆?/p>
(5)
對于音樂來說,音調(diào)一直上升或一直下降都不會是好的音樂。所以,用g5(x)來評價一個樂曲的整體輪廓。定義如下:
(6)
音高線即音的高低隨時間律動的線條。音高線以級進或小跳為主,以大跳為輔。為了指導(dǎo)算法設(shè)計,構(gòu)建一個音高律動規(guī)則模型(記為Rp),如式(7)-(9)所示:
Δp=|p(i)-p(i-1)|∈SI
(7)
SI={I/I≥0,I≤Imax,I∈Z}
(8)
(9)
式(1)中,p(i)為第i個音符的音高,SI為相鄰音符的音程的樣本集合,各樣本值代表兩個音相距的半音個數(shù)(音程均用半音的個數(shù)來表示),式(3)中,SP為在知覺統(tǒng)一體內(nèi)的音高樣本集合。知覺統(tǒng)一體即在人的感覺中屬于同一結(jié)構(gòu)之內(nèi)的東西,兩個音如果不在一個知覺統(tǒng)一體內(nèi),即便相鄰,也不會發(fā)生統(tǒng)一感的判斷,或統(tǒng)一感的體驗較弱。Rp表達的音樂信息為“在知覺統(tǒng)一體之內(nèi)只使用級進或小跳,在知覺統(tǒng)一體之間可以使用大跳”。
3.2.2 和聲規(guī)則
盡量使用協(xié)和音程(即振動頻率之比的公倍數(shù)較小的音程,例如純一、四、五、八度和大小三、六度),少用或不使用不協(xié)和音程(即振動頻率之比的公倍數(shù)較大的音程,例如大小二、七度). 但是過多的使用協(xié)和音程,會在聽覺上產(chǎn)生 “單一”、“不豐富” 的感覺,這一點無論在和聲音程還是旋律音程中都適用,因為即使聲音的物理刺激停止后,大腦中仍保留著它的聽覺印象. 而且這一考慮也與音高律動規(guī)則RP產(chǎn)生一定的矛盾. 為了兼顧音樂的美感和表現(xiàn)的對象以及RP,這里設(shè)定一個 “統(tǒng)一規(guī)則”Ru,如式(10)-(13)所示。
Ib∈{0,2,3,4}
(10)
Ibb∈{0,2,3,4,5,7}
(11)
I→P∈{7,9,10,12}
(12)
Ni=1∈{1,2}
(13)
其中,Ib,Ibb,I→P分別表示小節(jié)之內(nèi)、小節(jié)之間、推向高潮對應(yīng)的音程樣本值,Ni=1為一個樂段中小二度音程(半音數(shù)為1)的次數(shù),之所以限定它的使用次數(shù)不超過2,是因為該音程具有強烈的緊張度。
3.3.3 節(jié)奏規(guī)則
構(gòu)建規(guī)則模型Rd來表示樂曲的速度和節(jié)奏的變化。如式(14)-(16)所示。
DC(i)=D(i)/D(i-1)∈[2-a,2a]
(14)
(15)
Nt∈{1,2},
(16)
式(8)中,DC(i)為相鄰音符時值的對比度,D(i)為第i個音符的時值;Nt為知覺統(tǒng)一體內(nèi)長時值音符的個數(shù)。一段樂曲不能夠變化的太劇烈,用g7(x)評估這種情況。定義如下:
(17)
3.3.4 編排規(guī)則
對于音樂來說,音調(diào)一直上升或一直下降都不會是好的音樂。所以,用g5(x)來評價一個樂曲的整體輪廓。定義如下:
(18)
如果一個樂曲持續(xù)在一個音高或時值上,聽眾會覺得枯燥無味。因此,如果一個樂曲中,超過四個音符在同一音高和時值上連續(xù)出現(xiàn),那么這個參數(shù)將被記為0,反之為1.
時值是指時間的長短或者一個特定長度的音程。由于兩個連續(xù)音符劇烈的時值變化會給聽眾帶來煩躁不安,因此,如果出現(xiàn)超過4的時值變化,就將此記為0,反之為1。
由于音樂的生成是隨機的,所以可能在連續(xù)的音符之間存在較大的間隔??梢灾付ㄒ舴g的最大音程,當音程超過了指定的最大值時,降低reward。處于強拍位置的音符:在一個小節(jié)中,第一強拍和次強拍是小節(jié)中最有意義的兩個拍子。當?shù)谝粡娕暮痛螐娕氖呛鸵艋蛐葜狗麜r,賦予正的reward,當它們不是和音,但有一個音階音符,或者沒有音階音符時,不賦予reward。
本論文中所采取的數(shù)據(jù)是classical piano MIDI數(shù)據(jù)集,該數(shù)據(jù)集包含所有古典音樂的不同格式音樂文件,這些樂曲是通過MIDI基座上的音序器在數(shù)碼鋼琴上傳遞出來的,然后轉(zhuǎn)換為音頻格式。每個MIDI文件被分成單獨的小節(jié),我們?nèi)サ袅瞬辉贑鍵或不使用四拍的歌曲。對于每個小節(jié),我們將寬度(時間分辨率)設(shè)置為96,用于建模常見的時間模式,如三連音,十六音符和(最小音符)第32個音符等。我們將高度設(shè)置為84以覆蓋從C1到C8的音高。因此,每條數(shù)據(jù)張量的大小為96(timestep)*84(note)*5(track)。矩陣的每個元素的值是某個時間步的音符的速度(音量)。n條的序列由X = {x0,...,xt-1,xt,...,xn}表示,其中xt-1和xt是兩條連續(xù)的信息。
如圖2所示為實驗數(shù)據(jù)預(yù)處理。
圖2 數(shù)據(jù)預(yù)處理
VAE解碼器和GAN發(fā)生器通過讓它們共享參數(shù)并共同訓(xùn)練使它們合并為一個。這部分中使用的三個網(wǎng)絡(luò)的主要架構(gòu)是CNN。將輸入時間相關(guān)數(shù)據(jù)視為一系列具有內(nèi)部空間相關(guān)性的單獨幀。而這些幀利用CNN分別生成,同時保持它們之間的依賴關(guān)系。對于每一對連續(xù)幀,使用E將先前幀編碼為其相應(yīng)的潛在表示。然后,G嘗試從先前幀的潛在分布產(chǎn)生(預(yù)測)后續(xù)幀。這樣就將歷史和來自先前幀的信息結(jié)合起來以生成下一個所需內(nèi)容。 然后將每一對當前真實訓(xùn)練幀和合成幀分別作為真實數(shù)據(jù)和假數(shù)據(jù)轉(zhuǎn)發(fā)給D。
所有模型都用最小批量隨機梯度下降(SGD)進行培訓(xùn),最小批量為64。Adam優(yōu)化器的動量為0.5,E和G的學(xué)習(xí)率為0.0005,D為0.0001。
結(jié)合旋律規(guī)則模型、和聲規(guī)則模型、節(jié)奏規(guī)則模型等理論,已經(jīng)成功實現(xiàn)不同風(fēng)格的音樂,如流行、古典、爵士、旋律+和弦等等,如圖所示分別為生成的不同音樂的音軌的結(jié)果圖。
圖3 流行風(fēng)格音樂生成
圖4 爵士風(fēng)格音樂生成
圖5 古典巴赫風(fēng)格音樂生成
圖6 音樂旋律+和弦生成
本文介紹了一種用于生成序列數(shù)據(jù)的RVAE-GAN模型。該模型由三個網(wǎng)絡(luò)(編碼器,發(fā)生器和鑒別器)組成,其中利用卷積神經(jīng)網(wǎng)絡(luò)和根據(jù)樂理知識制定的約束條件在空間上學(xué)習(xí)各個幀中數(shù)據(jù)的局部相關(guān)性。通過使用編碼器映射前一幀而獲得的潛在分布對每個幀進行采樣。最終生成的結(jié)果的序列中的幀之間的一致性相對較一致,與現(xiàn)有的技術(shù)相比,本論文中鋼琴音樂自動生成的實驗有較好的結(jié)果,接下來可以繼續(xù)對此網(wǎng)絡(luò)結(jié)構(gòu)和約束條件進行改進,使自動生成音樂的效果更好。