白 勇 齊 林 帖 云
(鄭州大學產(chǎn)業(yè)技術(shù)研究院 河南 鄭州 450001)
音樂作為一種表達情感的藝術(shù)形式,在市場上有著很高的需求。目前專業(yè)的音樂創(chuàng)作者數(shù)量有限,且音樂制作費時費力,成本較高[1]。但隨著計算機技術(shù)的發(fā)展,利用神經(jīng)網(wǎng)絡自動生成音樂成為了可能,可以在降低音樂制作成本的同時提高音樂作品的生產(chǎn)力[2]。
如今,遞歸神經(jīng)網(wǎng)絡RNN和長短期記憶網(wǎng)絡LSTM被大量應用在序列預測和音樂生成方面[3]。文獻[4]使用了RNN網(wǎng)絡結(jié)構(gòu),通過真實音樂數(shù)據(jù)集的訓練實現(xiàn)音樂的有效生成。文獻[5]基于LSTM網(wǎng)絡進行自動作曲,LSTM很好地避免了梯度消失問題,并且能夠?qū)W到音符之間的長期依賴關(guān)系。文獻[6]利用LSTM網(wǎng)絡的結(jié)構(gòu)特點,學習并生成富有節(jié)奏的打擊樂。以上敘述中雖然使用的網(wǎng)絡不同,但訓練RNN和LSTM生成音樂的標準方法都是在給定前一個正確音符的情況下最大化預測音符的對數(shù)似然,這種方法通常稱為teacherforcing[7]。在生成時,輸出通常是根據(jù)所學習到的分布近似搜索最可能的候選者來產(chǎn)生。在此搜索過程中,模型以其自身的猜測為條件,這可能是不正確的,從而導致錯誤的生成,對于較長的音樂來說,這個問題將會更加明顯。由于訓練和測試條件之間存在這種差異,表明teacherforcing可能不是最理想的方法[8]。
本文借鑒強化學習提出一種訓練音樂生成網(wǎng)絡的方法,旨在模擬生成階段直接對生成策略進行改進。加入并訓練一個稱為Critic的附加網(wǎng)絡來輸出生成音符的價值,該價值可以定義為預期特定任務的得分。這樣做能在很大程度上規(guī)范生成的音樂,生成網(wǎng)絡將要執(zhí)行下一步輸出時會接受這個得分,并根據(jù)得分的大小改變自己的生成策略。
遞歸神經(jīng)網(wǎng)絡RNN處理較長時序序列存在梯度消失的現(xiàn)象,以至于讓網(wǎng)絡學不到知識。為了捕捉音符之間的長期依賴關(guān)系,本文使用了LSTM網(wǎng)絡作為音樂生成網(wǎng)絡[9],這是RNN網(wǎng)絡的改進結(jié)構(gòu),引入了帶有門控制結(jié)構(gòu)的簡單記憶單元。這些門使LSTM網(wǎng)絡能夠在長序列中學習有用的依賴關(guān)系,其網(wǎng)絡結(jié)構(gòu)如圖1所示。
圖1 LSTM網(wǎng)絡結(jié)構(gòu)
用x0,x1,…,xt表示輸入序列,h0,h1,…,ht表示隱藏層數(shù)據(jù),y0,y1,…,yt表示輸出序列。U是輸入權(quán)值矩陣,W是上一時刻隱藏層權(quán)值矩陣,f是隱藏層的激活函數(shù),隱藏層的輸出計算公式如下:
ht=f(Uxt+Wht-1)
(1)
有了隱藏層的輸出之后,進過輸出層的激活函數(shù)δ和權(quán)值矩陣V可以得到輸出序列,公式如下:
yt=δ(Vht)
(2)
本文方法的第一步是得到經(jīng)過訓練的LSTM音樂生成網(wǎng)絡的權(quán)值參數(shù),為Actor網(wǎng)絡和Critic網(wǎng)絡提供初始參數(shù),目的是讓二者具備經(jīng)過常規(guī)訓練之后LSTM音樂生成網(wǎng)絡的權(quán)值參數(shù)。LSTM音樂生成網(wǎng)絡分為三層:輸入層、隱藏層和輸出層,其中隱藏層所含神經(jīng)元個數(shù)設置為512。神經(jīng)網(wǎng)絡的輸入為向量形式,所以將數(shù)據(jù)預處理得到的輸入向量Xn輸入網(wǎng)絡中,具體流程如算法1所示。
算法1 訓練LSTM音樂生成網(wǎng)絡
輸入:訓練數(shù)據(jù)
輸出:網(wǎng)絡模型參數(shù)
1.輸入訓練數(shù)據(jù),設置迭代次數(shù),批量大小,隱藏層單元數(shù)和網(wǎng)絡層數(shù)。
2.取當前時刻神經(jīng)網(wǎng)絡的輸出和下一時刻輸入作交叉熵為損失函數(shù),以此更新網(wǎng)絡參數(shù)。
3.按照步驟2循環(huán)更新,直至迭代完成,loss值收斂。
4.輸出LSTM音樂生成網(wǎng)絡的模型參數(shù)(權(quán)值參數(shù))。
強化學習(RL)針對的是基于弱監(jiān)督的有效行動問題,其方式是對智能體(agent)的行為給予獎勵,從而控制agent的行動達到最優(yōu)的效果[10]。在Actor-Critic(A-C)算法中,Critic網(wǎng)絡會根據(jù)Actor網(wǎng)絡的輸出動作給出一個任務分數(shù),即時間差分TD。Actor網(wǎng)絡根據(jù)TD更新自己的生成策略,從而使生成的動作更加符合當前的環(huán)境和狀態(tài)[11]。
本文借鑒Actor-Critic算法的思想和術(shù)語在常規(guī)訓練的基礎(chǔ)上給予生成網(wǎng)絡一種模擬生成階段的訓練方式。本次訓練中將基于字符級LSTM音樂生成網(wǎng)絡視為Actor網(wǎng)絡,生成音符序列并接受設定的任務分數(shù),根據(jù)接收的分數(shù)再次更新生成策略,優(yōu)化生成結(jié)果。本文將特定的任務分數(shù)設置為時間差分TD,由LSTM網(wǎng)絡和音樂理論規(guī)則共同構(gòu)成Critic網(wǎng)絡輸出。兩個網(wǎng)絡中的LSTM網(wǎng)絡由上文得到的權(quán)值參數(shù)進行初始化。具體流程如圖2所示。
圖2 本文方法流程
在A-C算法中任務分數(shù)為時間差分TD,是一種無模型的強化學習方法。而本文借用其思想和術(shù)語構(gòu)成基于模型的動態(tài)規(guī)劃方法,利用狀態(tài)價值和音樂理論規(guī)則共同構(gòu)成時間差分TD。
2.2.1 狀態(tài)價值
本文把已生成的音符和LSTM的內(nèi)部狀態(tài)即通常說的“細胞狀態(tài)”看作狀態(tài)st,把生成的音符看作被選擇的動作at,執(zhí)行該動作后進入下一時刻的狀態(tài)st+1。在同一狀態(tài)下每個音符被選擇的概率是不同的,為了讓模型更加嚴格的遵循從數(shù)據(jù)中學習到的規(guī)律,避免因先前錯誤的猜測而繼續(xù)發(fā)生更大的錯誤,設置在同一狀態(tài)下Softmax層音符被選擇概率的方差為該狀態(tài)的價值。設狀態(tài)s下,每個音符被選擇的概率為Pi,其中i=1,2…,n,EP為該狀態(tài)下音符被選擇概率的均值,那么由此可以得到狀態(tài)s的價值V:
(3)
2.2.2 音樂理論規(guī)則
在真實的編曲過程中,作曲家是按照一定的音樂理論規(guī)則作曲的[12],為了給予更真實的生成反饋,本文在Critic網(wǎng)絡增加了音樂理論規(guī)則部分。
音樂有著各種各樣的風格,每種風格都有著各自不同的創(chuàng)作理論規(guī)則。古典音樂的理論經(jīng)過長時間的演進已經(jīng)非常成熟,所以本文參考了文獻[13]定義了以下幾條古典音樂的特征規(guī)則:(1) 在一首樂曲中兩個相鄰音符之間的音程差應小于八度;(2) 所有的音都應該在同一個調(diào)上,樂曲的開頭和結(jié)尾都應該以該調(diào)的主音為主,例如,如果是C大調(diào),那么出現(xiàn)在第一拍和最后四拍的音符應該是中音C;(3) 音調(diào)不能一直上升或者下降,也不能一直持續(xù)在同一個音高上;(4) 一個音符的連續(xù)重復次數(shù)不能大于4次;(5) 音樂節(jié)奏的變化不能過快;(6) 一首樂曲中最高音符是唯一的,最低音符也是唯一的;(7) 應當盡量避免切分音的出現(xiàn)。符合這些規(guī)則的提供獎勵即得到正值,反之將受到懲罰即得到負值,最后求這些值的總和即為音樂理論規(guī)則得分Rm(a,s)。
上述的規(guī)則特征并不是詳盡無遺的,但這些規(guī)則的加入會使該訓練過程更加接近真實編曲,讓生成的音樂更具結(jié)構(gòu)性,古典風格更加明顯。
Critic網(wǎng)絡的模型參數(shù)在訓練過程中保持不變,目的是讓網(wǎng)絡始終保持從真實音樂數(shù)據(jù)中學習到知識。得到當前狀態(tài)的價值V(s)和下一時刻的狀態(tài)價值V(s′)以及音樂理論規(guī)則的獎勵Rm(a,s)可以構(gòu)建一個時間差分TD:
TD=Rm(a,s)+εV(s′)-V(s)
(4)
式中:ε為下一時刻狀態(tài)價值的折扣系數(shù)。
TD就是本文設定的任務分數(shù),通過把TD返回給Actor網(wǎng)絡就可以構(gòu)建Actor網(wǎng)絡的損失函數(shù),P(a,s;θA)是該音符在狀態(tài)下被選擇的概率,θA為Actor網(wǎng)絡的參數(shù),損失函數(shù)如下:
L(θA)=E[-[logP(a,s;θA)×TD]2]
(5)
得到Actor網(wǎng)絡的損失函數(shù)之后就可以進行訓練,其訓練過程見算法2。
算法2 Actor-Critic訓練網(wǎng)絡
輸入:隨機音符序列例子
輸出:Actor網(wǎng)絡的模型參數(shù)
1.利用1.2節(jié)算法1得到的權(quán)值參數(shù)初始化Actor網(wǎng)絡和Critic網(wǎng)絡。
2.向Actor網(wǎng)絡中輸入一個隨機音符序列。
3.Actor網(wǎng)絡根據(jù)輸入和此刻的狀態(tài)s生成音符序列a。
4.將s和a輸入Critic網(wǎng)絡得到時間差分TD。
5.Actor網(wǎng)絡接收時間差分TD,根據(jù)式(5)更新Actor網(wǎng)絡的模型參數(shù)θA。
6.循環(huán)執(zhí)行上述步驟,直至迭代完成,loss值收斂。
經(jīng)過Actor-Critic訓練之后的Actor網(wǎng)絡就可以用來生成音樂,每次讀入一個音符,網(wǎng)絡根據(jù)之前生成的音符和策略來預測下一個音符。生成算法見算法3。
算法3 音樂生成
輸入:初始序列
輸出:音樂片段
1.隨機選擇一個長度為n的初始序列作為網(wǎng)絡的初始輸入。
2.將初始序列one-hot編碼成輸入向量,按順序?qū)⒌谝粋€音符向量輸入到網(wǎng)絡中。
3.初始序列輸入完畢之后,將初始序列作為生成音符序列的開頭部分。
4.經(jīng)過前向傳播從輸出層得到輸出向量Y,并將Y作為下一次的輸入。
5.將生成向量Y解碼為音符序列y,添加到生成音符序列的末尾,若沒有達到指定的長度m,則循環(huán)執(zhí)行步驟4-步驟5。
6.輸出長度為m的音符序列。
7.將長度為m的音符序列經(jīng)過反向處理轉(zhuǎn)化為midi格式的音樂片段。
實驗所用服務器配置為Intel Xeon 2640v4 2.4 GHz處理器,500 GB運行內(nèi)存和12 GB顯存的NVIDIA 1080Ti GPU,所用編程語言為Python 3.6.1,框架為Tensorflow。
實驗收集了18世紀-19世紀的多個作曲家的古典音樂集并從中提取鋼琴軌道旋律,得到20 000首midi格式的音樂樣本。為了消除節(jié)奏和音調(diào)對音樂的影響,將節(jié)拍統(tǒng)一調(diào)為4/4拍,音調(diào)都轉(zhuǎn)移到C大調(diào)上,時長大多集中在2~3分鐘。
神經(jīng)網(wǎng)絡的輸入和輸出都表示為向量形式,所以需要對音樂數(shù)據(jù)進行預處理。設定時間量化為十六分音符,然后使用piano roll[14]把樣本中表示音符的信息轉(zhuǎn)化成序列的形式。得到音符序列之后需要用向量的形式表示這些序列,本文使用one-hot編碼對音符序列進行向量處理,也可以理解為是對音符序列的標注。即把輸入音符序列xn轉(zhuǎn)化為輸入向量Xn,midi音符的編號共有128個,因此經(jīng)過編碼后的輸入向量Xn共有128維。其數(shù)據(jù)預處理過程如圖3所示。
圖3 數(shù)據(jù)預處理
本文做了四組對比實驗,測試了不同隱藏層神經(jīng)元個數(shù)對實驗結(jié)果的影響,結(jié)果如圖4所示。
圖4 不同神經(jīng)元個數(shù)對訓練效果的影響
從圖4可以看出,神經(jīng)元個數(shù)越多,網(wǎng)絡學習數(shù)據(jù)集本質(zhì)和抽象化數(shù)據(jù)特征的能力越強,越能有效地減少預測值與目標值之間的誤差。隱藏層維數(shù)的大小對生成的音樂質(zhì)量有非常重要的影響,但使用更深層、更寬的神經(jīng)網(wǎng)絡在訓練階段需要更多的計算量。
對于不同迭代次數(shù)生成的音樂文件,本文針對生成音樂和樣本音樂做頻譜分析,結(jié)果如圖5所示??梢钥闯觯旱? 000次時生成的音樂中有很多樣本音樂所不具備的頻率,因此生成的音樂也是雜亂無章的;迭代2 000次時生成音樂的頻譜開始出現(xiàn)樣本音樂的頻率,但生成音樂的頻率中缺失了一些樣本音樂中的頻率;迭代達到4 000次時,生成音樂序列的頻率分布總體上和樣本頻率分布趨于一致??梢宰C明迭代次數(shù)越大,權(quán)值參數(shù)學習和調(diào)整的次數(shù)就越多,在一定程度上就會提高模型的準確率。
圖5 生成音樂頻譜圖
為了比較直觀地顯示本文方法生成音樂的旋律特征,增加了生成音樂和樣本音樂的聲譜圖分析,結(jié)果如圖6所示??梢钥闯霰疚姆椒ㄉ梢魳返穆曌V圖和樣本音樂的聲譜圖在總體分布上很接近,因此可以驗證本文方法生成的音樂具有和樣本音樂相似的旋律特征。
圖6 生成音樂與樣本音樂及差異聲譜圖
本文方法是對基于字符級LSTM音樂生成網(wǎng)絡訓練方式的改進,為了表明本文方法的有效性,本文做了兩組實驗,對比的網(wǎng)絡是經(jīng)過常規(guī)訓練的基于字符級LSTM的音樂生成網(wǎng)絡。該網(wǎng)絡和本文方法通過相同的實驗環(huán)境設置,各生成300首音樂作為測試樣本。
4.4.1 十二平均律對比
十二平均律是一種音樂定律方法,其將一個純八度音平均分成十二等分,每等分稱為半音,是最主要的調(diào)音法[15]。提取兩組測試樣本中的十二平均律音符使用次數(shù),并計算其統(tǒng)計分布,結(jié)果如圖7所示。
圖7 十二平均律音符分布
由圖7(a)可以看出,經(jīng)過常規(guī)訓練的LSTM生成的測試樣本中C、D、E、G、A、B音出現(xiàn)的次數(shù)多,剩余的音符幾乎沒有出現(xiàn),而圖7(b)顯示本文方法生成的音樂每個音符所占的比例相差不大。對比結(jié)果可以證明本文方法在生成音樂時選擇的音符種類較多,即生成的音樂曲調(diào)更為豐富。
4.4.2 音樂特征對比
為了更進一步表明本文方法的有效性,定量了音樂理論規(guī)則的表現(xiàn)形式。從生成的測試樣本音樂中提取七個有效的特征信息,對比已知的音樂規(guī)則,計算統(tǒng)計數(shù)據(jù),結(jié)果如表1所示。
表1 音樂理論規(guī)則特征對比
可以看出,本文方法生成的音樂有效避免了音符過度重復和音程跨度過大等現(xiàn)象,并且生成的音樂在古典風格方面對比經(jīng)過常規(guī)訓練的LSTM有很明顯的提升,較為符合音樂理論規(guī)則。
本文還設計了人耳聽覺判斷作為實驗準確度的評判標準之一。從兩組測試樣本以及真實樣本音樂隨機采樣各得到30首。在完全匿名的情況下,讓5名音樂學院的老師和20名音樂學院的學生從旋律、節(jié)奏、流暢度、悅耳程度以及主題性五個角度進行打分。匯總打分后,去掉一個最低分和一個最高分,對剩余的得分取均值,結(jié)果如圖8所示。
圖8 人耳評判對比
可以看出,本文方法生成的音樂在五個角度均高于經(jīng)過常規(guī)訓練的LSTM生成的音樂,雖然略低于真實音樂,但也比較接近。對比結(jié)果表明本文方法相比與經(jīng)過常規(guī)訓練的基于字符的LSTM音樂生成網(wǎng)絡來說具有明顯優(yōu)勢。
本文在常規(guī)訓練音樂生成網(wǎng)絡的基礎(chǔ)上增加了基于強化學習Actor-Critic算法的訓練,是一種模擬生成過程的訓練方式。根據(jù)音樂理論規(guī)則和訓練數(shù)據(jù)規(guī)律構(gòu)造Critic網(wǎng)絡,以給予生成網(wǎng)絡Actor更接近真實音樂編曲的反饋,更新網(wǎng)絡參數(shù),提高生成音樂質(zhì)量。音樂理論規(guī)則的添加促使生成的音樂更具結(jié)構(gòu),風格更加明顯。由于篇幅限制本文只討論了關(guān)于古典風格的音樂理論規(guī)則,但為其他風格的音樂生成提供了一個很好的方向。由于音樂的復雜性,本文方法生成的音樂并不能完全滿足人們的實際需求,所以提高音樂生成的質(zhì)量還需要進一步研究。