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