譯者 | 朱先忠
審校 | 重樓
本文將以實(shí)戰(zhàn)方式探討基于Spotify公司的開源音樂大模型Llark并聯(lián)合阿里巴巴的語音多模態(tài)大模型Qwen2-AudioQwen2-Audio將音樂轉(zhuǎn)錄成樂譜的完整過程。
自動(dòng)音樂轉(zhuǎn)錄是將MP3和WAV等音頻文件轉(zhuǎn)換為樂譜、吉他指法譜以及音樂家可能想要用樂器學(xué)習(xí)歌曲的任何格式的過程。
本文中,我們將介紹目前用于執(zhí)行上述操作的最佳工具,這些工具恰好是基于深度學(xué)習(xí)的,并采用了一種新穎的方法。
當(dāng)前最先進(jìn)的技術(shù)
這項(xiàng)任務(wù)的當(dāng)前最先進(jìn)的技術(shù)來自Magenta,這是一個(gè)開源研究項(xiàng)目,由現(xiàn)已解散(截至2023年4月)的Google Brain團(tuán)隊(duì)開發(fā)。
這個(gè)開發(fā)團(tuán)隊(duì)在2021年發(fā)表了一篇論文《使用轉(zhuǎn)換器進(jìn)行序列到序列鋼琴轉(zhuǎn)錄》,該論文使用了受T5啟發(fā)的轉(zhuǎn)換器模型(類似于“t5-small”),該模型具有5400萬個(gè)參數(shù)和Maestro數(shù)據(jù)集,取得了很好的效果。使用編碼器-解碼器轉(zhuǎn)換器架構(gòu)將問題作為序列到序列任務(wù)來解決。編碼器將梅爾頻譜圖幀作為輸入處理并生成嵌入,而解碼器通過交叉注意力機(jī)制使用這些嵌入以自回歸方式生成一系列類似MIDI的標(biāo)記。這個(gè)開發(fā)團(tuán)隊(duì)使用的詞匯表由四種類型的標(biāo)記組成:
- 音符標(biāo)記(MIDI音高的128個(gè)值)
- 速度標(biāo)記(128個(gè)值,包括零表示音符關(guān)閉)
- 時(shí)間標(biāo)記(用于絕對(duì)計(jì)時(shí)的10毫秒bin格式文件中有6000個(gè)值)
- EOS標(biāo)記(用于標(biāo)記序列結(jié)束)
請(qǐng)參見下圖,了解這種架構(gòu)的可視化形式以及其自定義MIDI標(biāo)記的示例序列:
圖1.來自使用轉(zhuǎn)換器進(jìn)行序列到序列鋼琴轉(zhuǎn)錄的論文
說明:我們的模型是一個(gè)通用的編碼器-解碼器轉(zhuǎn)換器架構(gòu),其中每個(gè)輸入位置包含一個(gè)頻譜圖幀,每個(gè)輸出位置包含來自我們類似MIDI的詞匯表的事件。輸出標(biāo)記是從解碼器自回歸采樣的,每一步都以最大概率獲取標(biāo)記。
2022年,開發(fā)團(tuán)隊(duì)發(fā)表了一篇論文《MT3:多任務(wù)多軌音樂轉(zhuǎn)錄》。該實(shí)驗(yàn)使用了與上一個(gè)實(shí)驗(yàn)相同的方法,但添加了額外的樂器標(biāo)記來表示不同的樂器。同樣,他們使用了類似的T5模型,并在許多訓(xùn)練過的數(shù)據(jù)集上取得了出色的表現(xiàn),尤其是Slakh、Maestro和MusicNet數(shù)據(jù)集。
MR-MT3于次年發(fā)布,作為MT3的輕微改進(jìn)版本出現(xiàn)。
為什么要使用語言模型而不是繼續(xù)使用這些SOTA模型?
計(jì)算/GPU資源
盡管與最小的語言模型相比,其規(guī)模要小得多,但從頭開始訓(xùn)練此模型仍然需要大量資源。2021年的論文指出:
“我們?cè)?2個(gè)TPUv3核心上訓(xùn)練了所有模型,每個(gè)核心的訓(xùn)練批次大小為8。根據(jù)驗(yàn)證集結(jié)果,過度擬合似乎不是問題,因此我們?cè)试S訓(xùn)練進(jìn)行400K步,這對(duì)于我們的基線模型來說大約需要2.5天。”
此MT3論文沒有提供關(guān)于訓(xùn)練的具體細(xì)節(jié),只是說他們訓(xùn)練了100萬步。
其他限制
這些模型在輸出靈活性方面有一些固有的限制。雖然語言模型通常具有大量詞匯(通常超過30,000個(gè)標(biāo)記),并且已在各種自然語言數(shù)據(jù)上進(jìn)行了廣泛的預(yù)訓(xùn)練,但MT3和類似的音樂轉(zhuǎn)錄模型使用小得多的專門標(biāo)記詞匯(只有幾千個(gè)標(biāo)記),僅專注于音樂事件。這種專業(yè)化意味著添加新標(biāo)記(例如新樂器或演奏技巧,如吉他上的手掌靜音或小提琴上的撥弦)可能并不容易——需要進(jìn)行大量的再訓(xùn)練才能將這些新標(biāo)記有效地與現(xiàn)有詞匯結(jié)合起來,并且通常需要大量的訓(xùn)練數(shù)據(jù)來展示這些技巧。這與大型語言模型不同,大型語言模型通常可以在不進(jìn)行修改的情況下用自然語言描述這些音樂細(xì)微差別,因?yàn)樗鼈冊(cè)趶V泛的預(yù)訓(xùn)練中遇到了這些概念。
遷移學(xué)習(xí)和零樣本
我們可以利用大型開源預(yù)訓(xùn)練音頻和語言模型的遷移學(xué)習(xí)。音樂生成模型的示例包括OpenAI的Jukebox和Meta的MusicGen。
現(xiàn)代多模態(tài)模型架構(gòu)
GPT-4o旨在以“原生”方式處理文本、音頻和圖像。盡管OpenAI尚未公布這方面的技術(shù)細(xì)節(jié),但假設(shè)網(wǎng)絡(luò)中的某些權(quán)重?cái)?shù)據(jù)集能夠處理所有各種模態(tài)。該模型可能使用僅解碼器架構(gòu)(如僅語言的GPT模型),而無需編碼器組件先將不同模態(tài)轉(zhuǎn)換為密集表示。這種設(shè)計(jì)允許模型無縫地處理和解釋文本和圖像等輸入,從而可能在計(jì)算和模型理解方面提供性能優(yōu)勢(shì)。
許多多模態(tài)模型采用一種更簡單的方法,讓人聯(lián)想到編碼器-解碼器架構(gòu):它們結(jié)合了兩個(gè)預(yù)訓(xùn)練模型——一個(gè)用于特定輸入模態(tài)的編碼器(如用于視覺的ViT或用于聲音的音頻編碼器)和一個(gè)大型語言模型(如LLaMA、Gemma或Qwen)。這些模型通過投影層連接起來,投影層將它們的表示對(duì)齊到共享的潛在空間中,通常只使用一個(gè)線性層。這些投影層學(xué)習(xí)將編碼器的輸出轉(zhuǎn)換為與LLM的預(yù)期輸入維度和特征相匹配的格式。投影從輸入模態(tài)創(chuàng)建新的嵌入/標(biāo)記,然后可以將其注入到LLM的輸入序列中。LLaVA是這種架構(gòu)在視覺語言任務(wù)中的典型示例,而Spotify的Llark和Qwen-Audio則使用音頻編碼器而不是視覺編碼器應(yīng)用了相同的原理。
以下是一些關(guān)于如何將模型拼接在一起的偽代碼:
#從音頻編碼器的最后一層中提取特征
#形狀: [batch_size, audio_seq_len, encoder_dim=1024]
audio_features = audio_model(audio_input)
#投影音頻特征,以匹配LLM的嵌入維度
# 形狀: [batch_size, audio_seq_len, llm_embed_dim=4096]
audio_embeddings = projection_layer(audio_features)
#從LLM的嵌入層中獲取文本嵌入
# 形狀: [batch_size, text_seq_len, llm_embed_dim=4096]
text_embeddings = llm.embed_text(text_input)
#沿著序列長度方向進(jìn)行連接
# 形狀: [batch_size, audio_seq_len + text_seq_len, llm_embed_dim=4096]
combined_input = concatenate([audio_embeddings, text_embeddings], dim=1)
# 將它們正常送入LLM進(jìn)行生成
output = llm(combined_input)
Spotify的Llark和Qwen2-Audio
架構(gòu)概述
Llark使用OpenAI的Jukebox,Qwen2-Audio使用OpenAI的Whisper作為音頻塔。Jukebox是一種音樂生成模型,但它也可以接收音頻片段作為輸入并輸出音頻片段的延續(xù)。Whisper用于將語音轉(zhuǎn)錄為文本。
考慮到它們的用途,音頻模塊的選擇很明確:Llark專注于音樂分析,而Qwen2Audio主要專注于通過一些基本的音頻和音樂分析功能響應(yīng)語音指令。
確定從大型預(yù)訓(xùn)練模型中提取嵌入的最佳來源需要研究和實(shí)驗(yàn)。此外,決定是否微調(diào)整個(gè)模塊或凍結(jié)部分模塊是一個(gè)至關(guān)重要的設(shè)計(jì)選擇。例如,LlaVa的訓(xùn)練策略包括凍結(jié)視覺塔并專注于微調(diào)投影層和語言模型。我們將在接下來介紹每個(gè)模型的這一特征。
Llark:為什么是Jukebox?截至2024年9月,這些嵌入是否是最好的?
確定從大型模型中提取嵌入的最佳位置通常需要進(jìn)行大量探索。這涉及通過反復(fù)試驗(yàn)的過程在不同的分類任務(wù)上測(cè)試模型的各種激活或提取層。對(duì)于音樂生成模型,這可能包括流派識(shí)別、樂器檢測(cè)、情緒檢測(cè)以及和聲結(jié)構(gòu)和時(shí)間模式分析等任務(wù)。許多商業(yè)嵌入模型(如OpenAI的嵌入模型)都是專門為嵌入生成而訓(xùn)練的,具有專門的架構(gòu)和訓(xùn)練目標(biāo),而不是現(xiàn)有語言模型的微調(diào)版本。
兩個(gè)最大的公開可用的音樂生成和音樂延續(xù)(即:能夠?qū)⒁纛l作為輸入)模型是Jukebox和MusicGen。其中,MusicGen模型的更新更快,對(duì)我來說似乎是顯而易見的選擇。然而,根據(jù)關(guān)于探索MusicGen的論文,從Jukebox中提取的嵌入似乎在分類任務(wù)中平均表現(xiàn)優(yōu)于MusicGen。這篇論文的研究結(jié)果促使Llark的作者使用以下方法提取嵌入:
嵌入來自Jukebox編碼器第36層的輸出,遵循Castellon等人(2021)中描述的方法。
原始Jukebox編碼:
- 345Hz的4800維向量。
- 對(duì)于25秒的剪輯:超過4.14*10?個(gè)浮點(diǎn)值。
作者使用下采樣方法:在100ms幀內(nèi)進(jìn)行均值池化,結(jié)果:
- 下采樣頻率:10Hz。
- 嵌入大?。?5秒音頻剪輯的1.2×10?。這意味著使用一個(gè)形狀為[240,4800]的二維數(shù)組。
- 保留時(shí)間信息(與Castellon等人在時(shí)間維度上取平均值的方案有所不同)。
(下采樣嵌入大小大約是許多多模態(tài)視覺模型中使用的CLIPViT-L14模型的6倍)
Qwen2Audio:Whisper
本文未詳細(xì)提及Qwen2Audio的嵌入提取。Whisper是一種編碼器-解碼器架構(gòu);其中,編碼器負(fù)責(zé)生成音頻的深度學(xué)習(xí)表示,解碼器則負(fù)責(zé)將表示解碼為文本(轉(zhuǎn)錄)。在Qwen2Audio中,他們似乎從Whisper編碼器的最后一層提取嵌入,盡管他們沒有提到他們是否在訓(xùn)練期間凍結(jié)它。
預(yù)訓(xùn)練權(quán)重、訓(xùn)練數(shù)據(jù)和數(shù)據(jù)集
不幸的是,Spotify尚未向公眾提供任何數(shù)據(jù)集或其訓(xùn)練過的模型權(quán)重,并指出:
“關(guān)于輸入:我們模型的輸入是公開的、開源的、知識(shí)共享許可的音頻和相關(guān)注釋。但是,每個(gè)音頻文件都有自己的、可能更嚴(yán)格的許可證。許多音頻文件都包含“禁止衍生”許可證。我們鼓勵(lì)數(shù)據(jù)集的用戶熟悉這些許可證的限制;為了遵守這些許可證,我們不會(huì)發(fā)布本文中訓(xùn)練數(shù)據(jù)的任何衍生品(包括查詢-響應(yīng)對(duì)或訓(xùn)練模型權(quán)重)。”
訓(xùn)練過程中,他們使用了以下數(shù)據(jù)集:
- MusicCaps(Agostinelli等人,2023年)
- YouTube8M-MusicTextClips(McKee等人,2023年)
- MusicNet(Thickstun等人,2017年)
- FMA(Defferrard等人,2017年)
- MTG-Jamendo(Bogdanov等人,2019年)
- MagnaTagATune(Law等人,2009年)
Llark在以下摘錄中詳細(xì)介紹了其訓(xùn)練數(shù)據(jù)生成過程:
“我們使用ChatGPT的變體來提取所有實(shí)驗(yàn)的指令調(diào)整數(shù)據(jù)。但是,所使用的確切語言模型因數(shù)據(jù)集而異。我們選擇OpenAI模型如下:我們對(duì)所有推理任務(wù)都使用GPT-4。我們發(fā)現(xiàn)GPT-4更擅長遵循推理任務(wù)系列中的復(fù)雜指令。對(duì)于樣本超過25k的數(shù)據(jù)集,我們將推理數(shù)據(jù)限制為25k個(gè)軌道的隨機(jī)子樣本。”
這會(huì)產(chǎn)生如下問答數(shù)據(jù):
LLark的示例文本輸入和輸出,用于提供的音頻
用于訓(xùn)練Qwen2Audio的數(shù)據(jù)集也沒有共享,但經(jīng)過訓(xùn)練的模型廣泛可用,并且也在轉(zhuǎn)換器庫中實(shí)現(xiàn):
- Qwen2-Audio官方github代碼倉庫
- Qwen2-Audio轉(zhuǎn)換器文檔
對(duì)于這個(gè)項(xiàng)目,微調(diào)預(yù)先訓(xùn)練的Llark模型將是最佳選擇,因?yàn)樗赟potify論文中所述的評(píng)估基準(zhǔn)方面表現(xiàn)良好。
但是,鑒于他們沒有發(fā)布它的權(quán)重,如果沒有相當(dāng)多的專業(yè)知識(shí)和資金,從頭開始訓(xùn)練這樣的模型是不可行的。Spotify對(duì)其進(jìn)行了訓(xùn)練:
我們的模型在4個(gè)80GB NVIDIA A100 GPU上進(jìn)行訓(xùn)練。訓(xùn)練大約需要54小時(shí)。
如果使用LambdaLabs等提供商提供的云服務(wù)的話,這將花費(fèi)大約700美元。
由于上述原因,我選擇了Qwen。然而,Qwen2-Audio在節(jié)奏和樂器檢測(cè)等基本音樂任務(wù)中表現(xiàn)不佳。我將在下面的評(píng)估部分詳細(xì)說明這一點(diǎn)。這意味著,該模型可能不夠大或預(yù)訓(xùn)練不足,無法完成這項(xiàng)任務(wù),但我希望至少可以為將來微調(diào)這項(xiàng)任務(wù)設(shè)定一個(gè)起點(diǎn)和框架。正如阿里巴巴在其Qwen2-Audio博客文章中所述:
“我們還計(jì)劃構(gòu)建更大的Qwen2-Audio模型,以探索音頻語言模型的縮放規(guī)律”。
不過,為了我自己的學(xué)習(xí),我確實(shí)嘗試使用torch和帶有轉(zhuǎn)換器庫的預(yù)訓(xùn)練模型重新創(chuàng)建模型。
我還為問答數(shù)據(jù)和嵌入創(chuàng)建了數(shù)據(jù)集。我為URMP數(shù)據(jù)集生成了簡短形式的問答數(shù)據(jù),例如:“這首曲子的節(jié)奏是多少”、“這段音頻中演奏的樂器是什么”。
在Colab環(huán)境中運(yùn)行Jukebox的筆記本源文件地址是https://colab.research.google.com/drive/1jdR5w-XlJQFog47ZJ36ckEVMW0F5qIpl,使用的是廉價(jià)的T4GPU。我在鏈接https://huggingface.co/jonflynn處將問答和嵌入數(shù)據(jù)集上傳到HuggingFace。
復(fù)制有Llark的筆記本源文件的地址是:https://colab.research.google.com/drive/1_V5B9ZrwrKtom-N4r-Om3mqlXKPacUBh#scrollTo=72Gv5raTIPqi。
訓(xùn)練音樂轉(zhuǎn)錄數(shù)據(jù)
轉(zhuǎn)錄格式
我選擇ABC音樂符號(hào)作為語言模型轉(zhuǎn)錄音樂的輸出格式。以下是一個(gè)例子:
X:1
M:4/4
L:1/16
K:none
Q:67
V:1 name="Electric Bass (finger)"
%%octave-default C4
GAA^2E3A2<A^2 | D^D^2E2A2A^4 A^2E2 | A2A^4A^2E2 A2A^4 | A^2E2A2A^4A^2E2A2 |
A^4 A^2E2 A2A^4A^2 E2 | A2A^4 |
V:2 name="Bright Acoustic Piano"
%%octave-default C5
[E3C3][E3C3][E3C3] [E3C3][A^,2E2A^2] | [E3A^3][E3A^3][E3A^3][E3A^3][E3A^3] |
[E3A^3][E3A^3][E3A^3] [E3A^3][E3A^3] | [E3A^3][E3A^3][E3A^3][E3A^3][E3A^3] |
[E3A^3][E3A^3][E3A^3] [E3A^3][E3A^3] | [E3A^3] |
V:3 name="Electric Guitar (jazz)"
%%octave-default C5
E'3C'3A^4E'3C'3 | A^4E'3 C'3A^4E'3C'3 | A^4 E'3C'3A^4 E'3C'3 | A^4E'3C'3A^4E'3C'3 |
A^4E'3C'3 A^4E'3C'3 | A^4 |
在上面的符號(hào)中,我們?cè)陧敳慷x了拍號(hào)和節(jié)奏,用“M”和“Q”表示。“L”表示符號(hào)的默認(rèn)音符長度,在本例中是十六分音符,這是常態(tài)。然后,我們定義每個(gè)樂器,以及在為每個(gè)樂器寫音符時(shí)它們應(yīng)該遵循的默認(rèn)八度。以下是ABC音樂符號(hào)中寫音符的關(guān)鍵句法要點(diǎn)的總結(jié):
- 音符用字母A-G表示,小寫字母表示高八度
- 升號(hào)用音符前的^表示,降號(hào)用_表示
- 還原符號(hào)用=表示
- 音符長度用音符后的數(shù)字表示(C2是C的兩倍長)
- 音符后附點(diǎn)音符使用a.(C.是附點(diǎn)四分音符)
- 休止符用z表示,數(shù)字表示持續(xù)時(shí)間(z2是半休止符)
- 和弦用方括號(hào)[CEG]括起來
- 連音符用連字符-表示
- 小節(jié)線用|表示
- 斷奏節(jié)奏在音符之間使用>或<(C>D表示附點(diǎn)C八分音符后跟D十六分音符)
為什么使用ABC音樂符號(hào)?
選擇這種符號(hào)的原因是:
- 這是一種極簡主義的音樂創(chuàng)作格式。
- 它被廣泛使用且很受歡迎;語言模型已經(jīng)對(duì)ABC符號(hào)進(jìn)行了廣泛的預(yù)訓(xùn)練,因此已經(jīng)很好地理解了它。
- 它很靈活,可以輕松擴(kuò)展以包括節(jié)奏變化、拍號(hào)變化、如上所述的其他演奏風(fēng)格等……
我使用庫https://github.com/sshlien/abcmidi將數(shù)據(jù)集提供的MIDI文件轉(zhuǎn)換為ABC符號(hào)。創(chuàng)建數(shù)據(jù)集的筆記本文件位于鏈接https://colab.research.google.com/drive/1CdQ_PUjhCvCR2VjGt3ya1hNowPrr0Xun處。
評(píng)估
為了評(píng)估原始模型以及此后執(zhí)行的每個(gè)微調(diào)階段,我從URMP數(shù)據(jù)集中隨機(jī)選擇了30個(gè)復(fù)雜程度不同的樣本,并在每個(gè)樣本上運(yùn)行模型三次,手動(dòng)檢查所有響應(yīng)。
通過手動(dòng)測(cè)試,我發(fā)現(xiàn)最佳解碼參數(shù)是溫度為0.7,top_p為1.2。返回的最大標(biāo)記數(shù)上限為2048。調(diào)整最大值似乎對(duì)性能影響不大。
原始模型在此評(píng)估集上表現(xiàn)不佳。雖然它偶爾能正確預(yù)測(cè)節(jié)奏和樂器,但大多數(shù)時(shí)候都做不到。評(píng)估結(jié)果的文本文件可在此處獲取。
鑒于這個(gè)起點(diǎn),如果沒有強(qiáng)大的預(yù)訓(xùn)練模型,我們不太可能從這個(gè)實(shí)驗(yàn)中看到強(qiáng)勁的結(jié)果。然而,目標(biāo)是制定可以在未來隨著更先進(jìn)的預(yù)訓(xùn)練模型的出現(xiàn)而應(yīng)用的策略。
微調(diào)策略
我首先嘗試使用基本的交叉熵?fù)p失進(jìn)行微調(diào)。使用交叉熵?fù)p失進(jìn)行監(jiān)督微調(diào)是一種快速開始教授模型的方法,但像這樣的基本損失函數(shù)有局限性,我們將在下面看到。這個(gè)訓(xùn)練階段背后的直覺是,它會(huì)將模型推向正確的方向,并會(huì)拾取數(shù)據(jù)集中可能存在的任何模式或任何自定義的ABC符號(hào),而模型可能以前從未見過。
使用教師強(qiáng)制型交叉熵?fù)p失
首先,我們以典型的監(jiān)督微調(diào)方式對(duì)語言模型進(jìn)行訓(xùn)練。我為此使用了trl庫中的SFTtrainer,它使用交叉熵?fù)p失和教師強(qiáng)制機(jī)制,具體定義如下:
- 模型預(yù)測(cè)序列中的下一個(gè)標(biāo)記。
- 損失是根據(jù)預(yù)測(cè)概率(logits)和實(shí)際下一個(gè)標(biāo)記之間的差異計(jì)算的。
- 對(duì)于下一個(gè)預(yù)測(cè),模型被賦予實(shí)際正確的標(biāo)記(真實(shí)數(shù)據(jù)),而不是它自己的預(yù)測(cè)。這被稱為“教師強(qiáng)制”,它有助于穩(wěn)定訓(xùn)練并顯著加快訓(xùn)練速度,尤其是在早期階段。
此訓(xùn)練階段的結(jié)果很差,它降低了原始模型的性能。該模型以前可以很好地處理節(jié)奏和樂器識(shí)別,但現(xiàn)在大部分都出錯(cuò)了。它還開始產(chǎn)生無休止重復(fù)的亂碼文本輸出。即使在設(shè)置低學(xué)習(xí)率、應(yīng)用梯度裁剪和使用低LoRA等級(jí)來減輕對(duì)模型的重大更改時(shí),也會(huì)發(fā)生這種情況。總體而言,該模型似乎對(duì)所應(yīng)用的訓(xùn)練非常敏感。
然而,雖然這個(gè)訓(xùn)練階段可能會(huì)帶來一些改進(jìn),但由于我們的基本損失函數(shù)的限制,它不會(huì)帶來最佳性能。該函數(shù)很難完全捕捉模型的性能細(xì)微差別。例如,當(dāng)使用教師強(qiáng)制時(shí),樂器預(yù)測(cè)可能會(huì)在某些標(biāo)記部分產(chǎn)生看似較低的損失。如果樂器名稱以“V”開頭,無論準(zhǔn)確度如何,模型都可以根據(jù)我們的數(shù)據(jù)集自信地預(yù)測(cè)“小提琴”或“中提琴”。此外,損失函數(shù)可能無法準(zhǔn)確反映近乎失敗的情況,例如預(yù)測(cè)節(jié)奏為195而不是200——這是一個(gè)相當(dāng)準(zhǔn)確的小差異,但可能會(huì)受到懲罰,這在很大程度上取決于logit之間的概率分布。相鄰數(shù)字也可能具有較高的概率。
結(jié)合近端策略優(yōu)化(PPO)的RLHF模型
由于這些限制,我們可以創(chuàng)建自己的自定義損失函數(shù),可以更準(zhǔn)確地對(duì)模型的響應(yīng)進(jìn)行評(píng)分。也就是說,給定模型的預(yù)測(cè)序列,損失函數(shù)可以給出0到1之間的分?jǐn)?shù)來表示其好壞。
然而,將這個(gè)自定義損失函數(shù)集成到監(jiān)督微調(diào)中是一項(xiàng)重大挑戰(zhàn)。問題源于自定義損失函數(shù)引入的非線性,這阻礙了梯度的直接計(jì)算。讓我們來分析一下:
在具有交叉熵?fù)p失的傳統(tǒng)SFT中:
- 模型輸出詞匯表中每個(gè)標(biāo)記的logit(原始分?jǐn)?shù))。
- 這些logit直接表示模型的預(yù)測(cè)概率。
- 損失函數(shù)將這些概率與基本事實(shí)進(jìn)行比較。
- 可以通過此比較直接計(jì)算梯度。
- 微積分的鏈?zhǔn)椒▌t允許我們將這些梯度傳播回模型。
使用我們的自定義損失函數(shù):
- 模型必須首先生成完整的文本輸出。
- 此生成過程涉及從概率分布中進(jìn)行采樣。
- 然后,我們的損失函數(shù)分析此文本輸出(檢查節(jié)奏、音符等)。
- 這在模型的logit和我們的損失計(jì)算之間創(chuàng)建了一個(gè)不可微分的步驟。
- 采樣和文本分析步驟打破了反向傳播所需的梯度鏈。
為了克服這個(gè)問題,可以采用強(qiáng)化學(xué)習(xí)技術(shù),例如近端策略優(yōu)化(PPO)。PPO專門用于處理不可微分損失函數(shù),可以通過考慮整個(gè)策略(模型的輸出分布)來優(yōu)化模型,而不是依賴來自logits的梯度信息。
PPO的關(guān)鍵思想是,它不是試圖直接通過不可微分步驟進(jìn)行反向傳播,而是:
- 將模型的輸出視為強(qiáng)化學(xué)習(xí)框架中的動(dòng)作。
- 使用自定義損失函數(shù)作為獎(jiǎng)勵(lì)信號(hào)。
- 更新模型的策略(其在標(biāo)記上的概率分布)以最大化預(yù)期獎(jiǎng)勵(lì)。
- 同時(shí)確保更新后的策略不會(huì)偏離當(dāng)前策略太遠(yuǎn)。
這種方法使我們能夠使用自定義損失函數(shù)有效地訓(xùn)練模型,確保性能改進(jìn)而不會(huì)破壞核心訓(xùn)練動(dòng)態(tài)。PPO算法的保守更新策略有助于在訓(xùn)練期間保持穩(wěn)定性,這在使用大型語言模型時(shí)尤為重要。
此評(píng)分函數(shù)將以“獎(jiǎng)勵(lì)模型”的形式作為單獨(dú)的LLM實(shí)現(xiàn),通常用于通過RLHF微調(diào)模型,這是ChatGPT問世時(shí)首次引入的一項(xiàng)突破。由于此任務(wù)的性質(zhì),我們可以手動(dòng)編寫代碼來對(duì)響應(yīng)進(jìn)行評(píng)分,這樣使用的資源更少,速度更快。
對(duì)于拍號(hào)和節(jié)奏識(shí)別,這很容易計(jì)算。我們使用正則表達(dá)式提取所有預(yù)測(cè)項(xiàng),例如提取節(jié)拍:
def extract_metre(self, abc_string):
return re.search(r'M:(\S+)', abc_string).group(1)
模型應(yīng)該學(xué)習(xí)我們希望它在SFT階段輸出的語法和結(jié)構(gòu)。如果它輸出的內(nèi)容會(huì)導(dǎo)致我們的正則表達(dá)式找不到任何內(nèi)容或出現(xiàn)錯(cuò)誤,我們可以跳過該樣本,假設(shè)它只是數(shù)據(jù)集中的一小部分。
我們提取預(yù)測(cè)的節(jié)奏并編寫一個(gè)函數(shù),該函數(shù)對(duì)小錯(cuò)誤更寬容,但對(duì)大錯(cuò)誤懲罰更嚴(yán)厲:
- 對(duì)于小差異(≤10BPM),它使用線性縮放。
- 對(duì)于較大的差異,它會(huì)切換到指數(shù)縮放。
- 最終損失上限在0和1之間。
讓我們分解一下這個(gè)自定義損失的關(guān)鍵組成部分:
1. 節(jié)拍損失
節(jié)拍損失關(guān)注作品的拍號(hào)。它將預(yù)測(cè)的節(jié)拍與基本事實(shí)進(jìn)行比較,分別考慮分子和分母以及它們的比率。這種方法允許進(jìn)行細(xì)致入微的評(píng)估,可以準(zhǔn)確處理各種拍號(hào)。
節(jié)拍損失使用線性和指數(shù)縮放的組合來懲罰差異。小差異會(huì)導(dǎo)致?lián)p失線性增加,而較大的差異會(huì)導(dǎo)致指數(shù)增加,最大值為1。
2. 節(jié)奏損失
節(jié)奏損失評(píng)估預(yù)測(cè)的每分鐘節(jié)拍數(shù)(BPM)的準(zhǔn)確性。與節(jié)拍損失類似,它使用線性和指數(shù)縮放的組合。
對(duì)于小節(jié)奏差異(≤10BPM),該函數(shù)應(yīng)用線性縮放。較大的差異會(huì)觸發(fā)指數(shù)縮放,確保顯著的節(jié)奏不匹配受到更嚴(yán)重的懲罰。
3. 音高損失
音高損失可能是最重要的組成部分,因?yàn)樗u(píng)估轉(zhuǎn)錄音符的準(zhǔn)確性。此函數(shù)使用Levenshtein距離來比較每個(gè)聲音中的音符序列。
音高損失計(jì)算考慮了多個(gè)聲音,將每個(gè)預(yù)測(cè)聲音與最接近的真實(shí)聲音進(jìn)行匹配。這種方法允許靈活地對(duì)聲音進(jìn)行排序,同時(shí)仍保持整體音調(diào)內(nèi)容的準(zhǔn)確性。
4. 樂器損失
樂器損失評(píng)估每個(gè)聲音的樂器選擇的準(zhǔn)確性。
此函數(shù)考慮精確匹配、來自同一家族的樂器,并使用字符串相似性進(jìn)行更細(xì)致的比較。它全面評(píng)估了模型識(shí)別和為每個(gè)聲音分配樂器的能力。
5. 合并損失
最終損失是這些單個(gè)組件的加權(quán)組合:
total_loss = (0.5 * pitch_loss +
0.15 * metre_loss +
0.15 * tempo_loss +
0.2 * instrument_loss)
這種加權(quán)方案優(yōu)先考慮音高準(zhǔn)確性,同時(shí)仍考慮音樂轉(zhuǎn)錄的其他重要方面。
訓(xùn)練和超參數(shù)
PPO訓(xùn)練通常需要比SFT多得多的內(nèi)存,原因如下:
- 多個(gè)策略評(píng)估:PPO需要維護(hù)當(dāng)前策略(模型權(quán)重)和“舊”策略來計(jì)算它們之間的概率比。這實(shí)際上使內(nèi)存中的模型參數(shù)翻倍。
- 經(jīng)驗(yàn)緩沖區(qū):PO存儲(chǔ)經(jīng)驗(yàn)緩沖區(qū)(狀態(tài)、動(dòng)作、獎(jiǎng)勵(lì)等),以在小批量中執(zhí)行更新。這個(gè)緩沖區(qū)可能非常大,占用大量內(nèi)存。
- 優(yōu)勢(shì)估計(jì):計(jì)算優(yōu)勢(shì)需要跟蹤軌跡中的值估計(jì)和回報(bào),這又增加了一層內(nèi)存開銷。
- 額外的優(yōu)化目標(biāo):PPO跟蹤多個(gè)損失成分(策略損失、值損失、熵獎(jiǎng)勵(lì))及其梯度,而SFT只有一個(gè)損失。
由于上述原因,我們?cè)诳梢杂?xùn)練的模型大小和成本方面比SFT更受限制。雖然我可以在Colab中的A100 40GB上進(jìn)行上述訓(xùn)練,但對(duì)于PPO訓(xùn)練,我需要更多內(nèi)存。我在H100 80GB上進(jìn)行訓(xùn)練,它可以訓(xùn)練等級(jí)為128且批處理大小為8的LoRA。
我的超參數(shù)范圍很窄,我選擇了最直觀的方法,使用批處理大小從1到16,學(xué)習(xí)率從2e-5到2e-4。
該模型對(duì)任務(wù)沒有改進(jìn)。包含結(jié)果的文本文件在鏈接http://asdf/處提供。
我使用權(quán)重和偏差(WandB)跟蹤了各種訓(xùn)練指標(biāo)。關(guān)鍵指標(biāo)包括策略損失、價(jià)值損失、總損失、KL散度和獎(jiǎng)勵(lì)模型的分?jǐn)?shù)。
對(duì)于所有超參數(shù)運(yùn)行,記錄的獎(jiǎng)勵(lì)和損失隨時(shí)間推移的計(jì)算沒有改善。KL散度保持在預(yù)定義的閾值內(nèi)。
總結(jié)
雖然本文中的初步實(shí)驗(yàn)在音樂轉(zhuǎn)錄方面沒有達(dá)到預(yù)期的效果,但我們?yōu)樵擃I(lǐng)域的未來發(fā)展奠定了一些基礎(chǔ)。所遇到的挑戰(zhàn)為解決這一復(fù)雜任務(wù)的技術(shù)要求和潛在方法提供了寶貴的見解。未來的工作可以探索以下幾個(gè)有希望的方向:
- 在更大的預(yù)訓(xùn)練模型可用時(shí)進(jìn)行實(shí)驗(yàn)
- 使用更多樣化的音樂示例擴(kuò)展訓(xùn)練數(shù)據(jù)集
- 進(jìn)一步完善獎(jiǎng)勵(lì)函數(shù)以捕捉更細(xì)微的音樂關(guān)系
- 探索將傳統(tǒng)音樂處理技術(shù)與語言模型功能相結(jié)合的混合方法
我使用Qwen2-Audio運(yùn)行本文中這些實(shí)驗(yàn)的筆記本文件位于下面鏈接處:https://colab.research.google.com/drive/1lpPfn9EFE2rBsasIJNv8Cy9qTvtfXzq-
譯者介紹
朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。
原文標(biāo)題:Exploring Music Transcription with Multi-Modal Language Models,作者:Jon Flynn