论文阅读 - Jukebox: A Generative Model for Music
文章目錄
- 1 概述
- 2 什么是VQ-VAE
- 2.1 Auto-encoder(AE)
- 2.2 Variational AutoEncoder(VAE)
- 2.3 Vector-Quantized Variational AutoEncoder(VQ-VAE)
- 2.4 VQ-VAE-2
- 3 Music VQ-VAE
- 4 Prior and upsamplers
- 5 Lyrics Conditioning
- 參考文獻
By learning to produce the data, we can learn the best features of the data.
— OpenAI
1 概述
音樂生成一直是一個很有意思的話題,之前看過一些音樂生成的方式,都是將midi格式的音樂進行結構化之后,把這些midi音樂當作文本放到NLP的模型里去訓練生成任務。然后輸出也是一堆midi,再用其他的軟件渲染出來。這樣出來的音樂雖然還可以,但是把音樂限制在了某些固定的樂器當中,如果要想這樣的音樂有人聲是別想了。
Jukebox從raw audio入手,讓模型直接生成音頻信號。最終的模型可以控制演唱者,音樂風格,以及唱的歌詞,效果很驚艷!
本文的目的是讓讀者對Jukebox有個直觀上的了解,其中很多細節不回去深究。
2 什么是VQ-VAE
如果知道VQ-VAE的,本節可跳過。知道了VQ-VAE,也就知道了Jukebox的一半,因此花些篇幅來講這個。
VQ-VAE(Vector-Quantized Variational AutoEncoder)不是這篇文章當中提出來的一種方法,而是生成任務中已有的一種方法,下面來說下什么是VQ-VAE,說的順序是AE -> VAE -> VQ-VAE -> VQ-VAE-2。這里不會設計數學公式的推導,只是直觀上的理解,要看公式推導的可以參看最下面的參考文獻。
2.1 Auto-encoder(AE)
如下圖1所示,自編碼器是很早就已經提出來的一種抽取特征的方法,它有一個Encoder和一個Decoder。以輸入圖片為例,Encoder會把圖片壓縮成一個指定維度的向量,這個向量當中包含了用于重建圖片的重要特征,Decoder會把這個特征重建成和輸入盡可能接近的圖片。這是一種無監督或者說自監督的學習方法,loss就是輸入和輸出圖片的距離,被叫做reconstruction loss。
可想而知,若要重構的圖片盡可能接近輸入圖片,Encoder輸出的特征就必須要包含輸入圖片盡可能多的信息,也就是這是一個可以表達輸入圖片的特征。
這本質上和PCA很像,就是給圖片降維。
AE的Decoder部分可以當作一個生成模型,但是有很大的問題。對于生成模型,我們希望輸入稍微變化后,輸出的圖片變化不會太大。但是AE沒有辦法保證這一點。比如下圖2所示,紅色的code線是在code特征空間上的一條線,線上每個點都是一個特征,一個code,一個decoder的輸入。假設在訓練過程中,模型知道了左邊這個點對應滿月,右邊這個點對應上弦月。那么我們希望把這兩個點的中點輸入給decoder之后,得到的是盈凸月(就是3/4個月亮是亮著的)。而AE訓練出來的模型并不知道這種事情,只能看運氣了。
因此AE并不適合用于生成任務。
2.2 Variational AutoEncoder(VAE)
為了讓AE適用于生成任務,就有人提出了VAE。想法很直接,既然映射到一個點上不好,我們就把輸入圖片映射到一個分布上,或者形象點說是一塊區域上。
VAE的Encoder輸出就是均值mim_imi?和方差σi\sigma_iσi?。Decoder接到的特征ci=mi+exp(σi)×eic_i=m_i + exp(\sigma_i) \times e_ici?=mi?+exp(σi?)×ei?。這里要這么折騰是因為從分布中sample的過程是不可導,那么就干脆把標準的正太分布當作一個外部的常量放進來,不參與梯度更新。這樣每次傳播的時候,均值和方差由encoder提供,利用外部的標準正太分布做sample,這樣整個網絡就可導了,機智啊!
不過模型也挺機智,如果還是像AE一樣只有一個reconstruction loss,那么網絡就會學會把σi\sigma_iσi?都置為0,因為σi\sigma_iσi?的存在,encoder的輸入是同一張圖片時,decoder的輸入卻會是不同的,這樣decoder煩的很,干脆把σi\sigma_iσi?置0,這樣對模型來說訓練簡單了,但是卻退化為了AE。我們就是要讓decoder在有σi\sigma_iσi?的噪聲干擾下,仍舊盡可能地還原圖片。
于是,更機智的人類就加了一項KL散度loss,讓encoder輸出的分布N(mi,σi)N(m_i,\sigma_i)N(mi?,σi?)盡可能接近N(0,1)N(0, 1)N(0,1)。這個loss化解后也就是圖中的
LKL=∑i=1n(exp(σi)?(1+σi)+(mi?0)2)L_{KL}=\sum_{i=1}^{n}(exp(\sigma_i) - (1+\sigma_i) + (m_i - 0)^2) LKL?=i=1∑n?(exp(σi?)?(1+σi?)+(mi??0)2)
實際情況下,還會有一個權重來調節reconstruction loss和KL loss的權重。
有了σi\sigma_iσi?提供的噪聲和足夠多的訓練數據,模型就會遇到不同輸入映射到同一塊特征區域的情況,這種時候,模型就知道要如何漸變了。
2.3 Vector-Quantized Variational AutoEncoder(VQ-VAE)
VAE不好的地方在于容易后驗失效,也就是容易train壞掉。而且現實生活中,有些特征它就是不連續的,它就是離散的,比如音樂當中的note,于是就有了VQ-VAE。
VQ-VAE有一個東西叫做codebook(圖5中的embedding space),這個codebook里有有限個特征,decoder的輸入就會是這個codebook中的特征的一個組合,換句話說,encoder的輸出都會被映射到codebook當中的某個特征上。映射的方法很簡單,就是取距離最接近的那一個。
codebook當中的特征都是模型學出來的。
圖5 VQ-VAE示意圖[2]整個過程可以描述成下面這樣:
(1)輸入圖片XXX,經過encoder之后得到特征Ze(X)Z_e(X)Ze?(X)
(2)在codebook中找到與Ze(X)Z_e(X)Ze?(X)最接近的特征的index,并記在q(z∣x)q(z|x)q(z∣x)當中
(3)通過q(z∣x)q(z|x)q(z∣x)從code中取特征得到Zq(X)Z_q(X)Zq?(X)
(4)Zq(X)Z_q(X)Zq?(X)經過decoder之后得到生成的圖片X′X'X′
這里從codebook中找最接近的特征的過程也是一個不可導的過程,但是作者用了一個Straight-through estimator的方法,讓整個網絡可導。其本質就是引入stop gradient,用codebook中選中的特征和encoder輸出特征的差值來輔助傳導。其loss為
L=Lrecons+Lcodebook+βLcommitL = L_{recons} + L_{codebook} + \beta L_{commit} L=Lrecons?+Lcodebook?+βLcommit?
其中,LreconsL_{recons}Lrecons?為reconstruction loss,也就是輸出圖片和原圖的距離。這個loss當中會把codebook當中的特征當成常量,不更新codebook的內容。也就是這個操作使得整個網絡可以梯度更新。
Lrecons=?log?p(X∣Zq(X))L_{recons} = -\log p(X|Z_q(X)) Lrecons?=?logp(X∣Zq?(X))
LcodebookL_{codebook}Lcodebook?為codebook loss。這部分更新codebook里的向量。sg就是stop gradient。這一步是讓codebook的向量和encode的輸出盡可能接近。
Lcodebook=∣∣sg(Ze(X))?e∣∣22L_{codebook} = || sg(Z_e(X)) - e||_2^2 Lcodebook?=∣∣sg(Ze?(X))?e∣∣22?
LcommitL_{commit}Lcommit?為commit loss。這部分不更新codebook里的向量。這一步是讓encode的輸出和codebook的向量盡可能接近。
Lcodebook=∣∣Ze(X)?sg(e)∣∣22L_{codebook} = || Z_e(X) - sg(e)||_2^2 Lcodebook?=∣∣Ze?(X)?sg(e)∣∣22?
VQ-VAE就是這點東西,有意思在這個loss的設計上。我們再來看看它的全稱,Vector-Quantized Variational AutoEncoder。Vector-Quantized指的就是把特征映射到codebook當中的向量上,用codebook的向量把encoder的輸出進行量化。Variational在哪里呢?這里沒有σi\sigma_iσi?啊?我的理解是,codebook中的每個向量都對應了一片離它最近的區域的向量,這篇區域就是它噪聲的容忍度,也就是variational的地方。
2.4 VQ-VAE-2
VQ-VAE還是容易壞掉,而且生成的大圖會比較模糊,所以又有人提出了進階版VQ-VAE-2。簡單來說就是把模型變成了multi-level的,也就是hierarchical。Top level負責全局信息,bottom level負責局部信息。這樣的模型不容易 collapse,而且細節也會比較到位。我沒有仔細看VA-VAE-2的文章,所以具體的細節這里不講了,可以參考下文獻[4]。
3 Music VQ-VAE
音樂里的"do",“re”,"mi"都是離散的,因此相比于VAE,在音樂領域VQ-VAE顯得更為合適。
這里的Music VQ-VAE既不是單純的VQ-VAE也不是VQ-VAE-2。它的結構圖如下圖6所示,乍看之下就是多個VQ-VAE。Music VQ-VAE相比于VQ-VAE和VQ-VAE-2主要有3點不同:
(1)codebook隨機初始化
VQ-VAE的codebook是很容易train壞掉的,說的夸張點,可能train著train著,codebook中的向量都映射到同一個向量上了。Music VQ-VAE會在每個batch計算codebook中各個向量的平均使用率,如果使用率過低,就會把這個向量隨機初始化成當前batch中的一個向量上。保證codebook中的向量使用率都是比較高的。
(2)多個level的VQ-VAE
Music VQ-VAE的encoder會把音頻壓縮成不同的尺寸,也就是抽取特征時的hop_length不同。比如下圖中的top level可能是1s抽一個feature,middle level可能是0.5s抽一個feature,bottom level可能是0.2s抽一個feature,這里的時間只是我隨便舉的例子。然后每個level獨自是一個VQ-VAE,相互之間不影響,codebook也是獨立的。top level關注于一些全局的信息,middle level和bottom level則更關注細節。如果單獨拿它們的feature進行decode的話,bottom level的效果應該是最好的。
(3)加了 Spectral Loss
增加了Spectral Loss來讓生成的音頻保留高頻的信號,否則高頻信號很容易丟失。不同STFT參數的結果對時間和頻率的分辨率影響不同,為了讓模型不對某一組STFT的參數過擬合,Music VQ-VAE還用了多組參數的STFT,然后取它們loss的和。
Lspec=∣∣∣STFT(x)∣?∣STFT(x^)∣∣∣2L_{spec} = || | STFT(x) | - | STFT(\hat{x}) | ||_2 Lspec?=∣∣∣STFT(x)∣?∣STFT(x^)∣∣∣2?
4 Prior and upsamplers
在生成模型的時候,我們是沒有圖5中左邊部分的encoder的,我們只需要decoder和codebook中向量的組合就可以了。decoder的輸入,也就是codebook中向量的組合在生成任務中是要無中生有變出來的,這就是prior和upsamplers的作用,生成decoder的輸入。
p(z)=p(ztop,zmiddle,zbottom)=p(ztop)p(zmiddle∣ztop)p(zbottom∣zmiddle,ztop)p(z) = p(z^{top}, z^{middle}, z^{bottom}) \\ = p(z^{top})p(z^{middle}|z^{top})p(z^{bottom}|z^{middle}, z^{top}) p(z)=p(ztop,zmiddle,zbottom)=p(ztop)p(zmiddle∣ztop)p(zbottom∣zmiddle,ztop)
我們的Music VQ-VAE是三個levels的,top level的decoder輸入生成器叫做prior,p(ztop)p(z^{top})p(ztop),因為它不依賴于其他輸入,我們只要給一個隨機的高斯分布或者什么隨機的分布就行了,它是先驗的。middle level和bottom level的decoder輸入生成器叫做upsampler,p(zmiddle∣ztop)p(z^{middle}|z^{top})p(zmiddle∣ztop)和p(zbottom∣zmiddle,ztop)p(z^{bottom}|z^{middle}, z^{top})p(zbottom∣zmiddle,ztop),它依賴于上面生成的結果,是后驗的。下圖7中藍色的block就是prior和upsamplers。
這三個東西就是三個網絡結構,對于prior,論文設計了一個和Sparse Tranformer很像的網絡,叫做Scalable Transformer的東西,對于upsampler,論文在WaveNet上加了點東西。具體的結構這里不展開講。我們希望它們生成的特征和Music VQ-VAE訓練時的中間從codebook生成的特征是類似的,這就是用自回歸的方式去訓練就可以了。
我們一方面希望生成模型是多樣的,一方面又希望可以控制一下生成的結果,因此會在prior和upsampler的輸入中也加入音樂家,音樂風格以及時間的信息。
如果不用prior和upsampler的話,也可以直接用音樂的某個片段經過Music VQ-VAE的encode部分的結果,這個時候的任務變成了續寫歌曲了(completions of the song)。
圖8 Primed sampling示意圖[5]5 Lyrics Conditioning
這篇論文驚艷的地方就在于,它可以生成有人聲的音樂,而且唱的真像那么回事兒,壓根兒聽不出是機器合成的。這就得益于它的lyrics conditioning的機制了。為什么說它厲害,現在不是Text-to-speech(TTS)也搞得像模像樣嗎?唱和說還是有難度區別的,唱有這么三個難點:
(1)模型需要學會對齊歌詞和唱的聲音
(2)模型需要知道不同音樂家唱歌的風格
(3)模型需要知道同一句話,因為音調,節奏和歌曲風格的不同,唱出來的方法是不一樣的
這么一想,還真的挺難的。不光解決這些問題難,要達到大量的歌詞和音樂對應的數據就很難。論文為了讓任務更簡單,就把音樂切成24s的一段一段,然后對應歌詞,放進去讓模型去學習。網上爬下來的歌詞和音樂是不一定能對上的,因此,論文又用了Spleeter抽取人聲,用了NUS AutoLyricsAlign把歌詞和時間對上。總之就是得到了許多音樂片段,并且這些片段都有對應的歌詞文本。
這個歌詞是經過一個tranformer變成特征之后和其他conditions一起輸進去訓練的,其結構如下圖9。
事實證明,這樣的訓練,模型可以學到歌詞和音樂之間的對齊方式。不過偶爾也會有壞掉的情況,這種情況下,歌詞就亂唱了。
Jukebox放出了很多生成的音樂,可見在https://jukebox.openai.com/聽一下。
參考文獻
[1] Unsupervised Learning: Deep Generative Model
[2] 帶你認識Vector-Quantized Variational AutoEncoder - 理論篇
[3] 變分自編碼器VAE:原來是這么一回事
[4] Generating Diverse High-Fidelity Images with VQ-VAE-2
[5] Jukebox: A Generative Model for Music
總結
以上是生活随笔為你收集整理的论文阅读 - Jukebox: A Generative Model for Music的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四、Web服务器——Session C
- 下一篇: 一、服务端开发基础(搭建Web服务器、网