歌詞生成相較於普通文本生成,需要配合特定的樂曲,並演唱。因而要求,每句歌詞演唱的長度正好合拍,即不同曲子,每句歌詞的字符個數是要受限制於樂曲。
本文暫不考慮曲配詞問題,只是將問題抽象為,在已知歌詞每句的字數時,如何生成一個文本,滿足字數格式。歌詞的押韻沒有古詩那么嚴格,但押韻的歌詞朗朗上口,更易演唱,對於歌詞生成還是很重要的。總之,歌詞生成應當滿足兩個條件:
(1) 每句的字數可控
(2) 押韻
針對上述兩個問題,發表在ACL2020的《Rigid Formats Controlled Text Generation》【1】,可以很好地解決字數可控和押韻問題。該論文將其模型稱為SongNet。既可以讀作“宋(詞)Net”(論文本身是為了生成宋詞),又可以讀作“Song Net”(歌詞網絡),一語雙關。
1. SongNet簡述
SongNet是基於BERT【2】做的改進。相較於BERT,SongNet有如下不同:
將格式信息embedding,輸入到模型
通過mask使得BERT具有生成能力
接下來首先介紹,SongNet所屬的領域:條件文本生成。
2. 條件文本生成
文本生成領域分為三個部分,自由文本生成(Generic / Free-Text Generation )、條件文本生成(Conditional Text Generation)以及受約束的文本生成(Constrained Text Generation),條件文本生成和受約束的文本生成兩者並沒有明確的界限,該文將文本生成領域看做兩個部分自由文本生成和條件文本生成。【3】
自由文本生成是,沒有顯式地給出條件的文本生成任務,即只要不是條件文本生成,便是自由文本生成任務。其概率公式如下,
相較於條件文本生成,自由文本生成,只是去建模文本的一個前后依賴。
條件文本生成是,在已知條件情況下,生成滿足條件的文本的任務。該任務的概率表示如下,
即,模型需要建模一個條件概率,p(x|c),其中c是條件的向量表示,x是單個文本的向量表示,<i表示在第i個時間步之前的文本。
實際情況下,條件文本生成的應用更多,狹義的包括根據主題生成文本、根據情感生成文本,廣義的角度來看,機器翻譯也可以看做條件文本生成,對於中-英翻譯任務,可以看做條件為中文,然后生成英文文本。
例如,生成一個情緒為積極樂觀的文本。(文本情緒為積極樂觀,即是條件)
條件文本生成的關鍵在於,如何將條件加入到模型中,常見方法有兩種:
將條件進行embedding:無論訓練還是生成截斷,條件作為輸入編碼,進行embedding
重加權:在生成階段,用條件信息重新調整每個時間步下,每個詞生成的概率值。
SongNet采用的是第一種方式,將條件進行embedding。
3. Embedding
該章節主要介紹,Embedding的發展,即從Token Embedding(字符編碼)到Position Embedding(位置編碼),有了這些前置知識,能更好地理解條件Embedding。
最初的Embedding:Token Embedding
embedding是,將離散的符號組成的序列數據,轉化為由詞向量(word vector)表示的矩陣的過程。
token embedding是, 將自然語言文本轉化為詞向量(word vector)表示的矩陣的過程。只包含了文本的字符序列信息。
機器學習模型是在做數值的運算s,而自然語言文本是由離散的符號表示的,無法直接進行加法、乘法等運算,更無法進行反向傳播,因而需要將文本數值化(連續化),這個過程即是embedding。通用的方案是,將文本切分成token,接着id化,然后再將每個token用一個向量來表示,該過程即完成了embedding工作。
embedding的過程可以分解為如下的過程:
1. token化:將文本切分成token,token指的是代表文本的組成元素的符號,常用的是字、子詞或者詞。
2. id化:每個token都對應着一個id號,用id號表示token。
3. embedding:將id轉化為向量。通常id號對應着向量的embedding的權重表中的位置。對於每個id,查找權重表中其對應的向量,拼接成整個文本。
如下為對文本“無謂人海的擁擠”進行embedding。
文本:無畏人海的擁擠
第一步:token化(字為單位,空格分割各個token),token化的結果為無 畏 人 海 的 擁 擠 的
第二步:id化,假設,無的id為0,依此類推,重復的字用第一次出現的id號表示
則id化的結果為0 1 2 3 4 5 3
第三步:embedding,(只截取用到的)假設,V的大小為6,dim的大小為6
假設embedding的權重矩陣為 W =[[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],[31,32,33,34,35,36]]
則該文本的embeddding為E = [[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],[31,32,33,34,35,36],[19,20,21,22,23,24]]
3.1 Position Embedding
但只有字符信息,並不能很好的表示文本。如下,
文本一:我喜歡這個電影,因為它不包含人性的思考。
文本二:我不喜歡這個電影,因為它包含人性的思考。
文本一和文本二的意思完全相反,但對於自然語言模型而言,尤其是self-attention的模型,難以識別字符位置的不同導致的文本差異。
如下為self-attention的公式。dense為全連接層。
相應的示例為下圖。
如圖,self-attention相當於對所有的e進行了兩兩運算,這過程中並沒有建模序列,因而說self-attention基本上沒有序列建模能力。
因而,NLPer提出了Position Embedding【4】,即將每個token的位置,通過運算變成向量,然后與原本的token embedding進行add操作,作為文本的表示。從而加強模型對token的位置敏感性,該過程也是在建模句法特征。
該過程體現一個思路,將模型難以建模的特征通過embedding,融入模型中,從而增強其建模能力。
對於條件文本生成,可以將條件看做是文本中難以建模的信息,然后進行embedding。
回顧文章開始提到的兩個要求,字數可控和押韻,兩者均是目前文本生成模型所缺乏的,作者提出了Token Embeddings、Format and Rhyme Embeddings、Segment Embeddings、Intra-Position Embeddings四個額外的格式信息embedding來增強模型對字數可控和押韻的表現。
4. 格式信息embedding
格式信息的embedding也類似token embedding的步驟,第一w步也是進行token化,由於信息本身並不是離散的符號,因而第一步需要將其表示為離散的符號。
4.1 Format and Rhyme Embeddings
對於每句歌詞,用標點符號用c1表示,最后一個字用符號c2表示,其他字符用c0表示。
例如:我聽見遠方下課鍾聲響起(11個字,1個標點)
其Format and Rhyme Embeddings = [c0,c0,c0,c0,c0,c0,c0,c0,c0,c0,c2,c1] 10個c0,1個c2,一個c1。
這樣可以讓押韻的那個字單獨獲得一種表示,從而讓模型注意到該位置的字與其他字符的不同,從而做到押韻。
4.2 Intra-Position Embeddings
對於每句歌詞,將字符位置從右到左,依次用p[位置索引]的方式表示。
例如:我聽見遠方下課鍾聲響起,(11個字,1個標點)
其Intra-Position Embeddings = [p11,p10,p9,p8,p7,p6,p5,p4,p3,p2,p1,p0]
Intra-Position Embeddings是為了讓模型在生成第一個字的時候,就知道這句歌詞有幾個字;從右到左的順序,使得p1正好指向韻腳,更好押韻。
4.3 Segment Embeddings
類似BERT的Segment Embedding,第一句每個字符的segment Embeddings為s0,第二句每個字符的segment Embeddings為s1。
對於歌詞:
我聽見雨滴落在青青草地
我聽見遠方下課鍾聲響起
可是我沒有聽見
你的聲音認真呼喚我姓名
其Segment Embeddings為
s0,s0,s0,s0,s0,s0,s0,s0,s0,s0,s0,s0,
s1,s1,s1,s1,s1,s1,s1,s1,s1,s1,s1,s1,
s2,s,2,s2,s2,s2,s,2,s2,s2,s2,s,2,s2,s2,
s3,s3,s3,s3,s3,s3,s3,
s4,s4,s4,s4,s4,s4,s4,s4,
Segment Embeddings可以使模型確定每個字在所在的句子順序。
4.4 如何將如上的格式信息融合到模型中
這三種embedding都兼顧到了字數可控和押韻。
SongNet將上述三種的embedding的符號(s0、s1、c0、c1、p0、p1等等)看做字(token),加入到vocab中,與文本字符(我、你等等)經過同一個embedding層,得到向量,再相加。
即,將Intra-Position Embeddings、Segment Embeddings、Format and Rhyme Embeddings相加得到format_embedding。
相應代碼為:
x = self.tok_embed(ys_inp) + self.pos_embed(ys_inp) + self.tok_embed(ys_tpl) + self.tok_embed(ys_seg) + self.tok_embed(ys_pos)
ys_inp:Token Embeddings的id表示
ys_tpl:Format and Rhyme Embeddings的id表示
ys_seg:Segment Embeddings的id表示
ys_pos:Intra-Position Embeddings的id表示
self.tok_embed:字符embedding層
self.pos_embed:位置embedding層
相較於embedding章節的token embedding,格式信息的embedding是用符號而不是字來表示token。也要進行id化以及embedding。
以上即為SongNet的第一個亮點,接下來闡述,SongNet是如何讓BERT擁有生成能力。
5. Mask策略
原版的BERT並不具有生成能力,究其原因要從自回歸語言模型說起。
5.1 自回歸語言模型
自回歸生成模型是文本生成常用的一種模型。通過迭代生成token,來完成整個文本的生成。
如下圖,淺綠色的矩形為同一個模型(可以看做單向單層RNN網絡模型),藍色矩形為文本的token(可以看做字)。
要生成“你是誰”需要,在第一個時間步,根據”你“生成“是”;第二個時間步,根據”是“和第一個時間步傳來的“你”信息,生成”誰“·····
5.2 使BERT具有生成能力:Masking Multi-Head Self-Attention
BERT是雙向的transformer模型,在每個時間步知道下文(即在“你”位置,知道“是”和“誰”的信息),從而無法作為生成模型使用。
BERT的各個時間步所知道的信息可以表示為:
第一個時間步:你是誰
第二個時間步:你是誰
第三個時間步:你是誰
自回歸生成模型,在各個時間步所知道的信息:
第一個時間步:你
第二個時間步:你是
第三個時間步:你是誰
兩者可以通過一個三角矩陣進行轉換,即mask,如下圖。
SongNet就是通過上圖的mask,將BERT變成自回歸語言模型,其核心實現為Masking Multi-Head Self-Attention。
Masking Multi-Head Self-Attention的算法步驟是:
(1) 將embedding信息mask,得到mask_embedding
(2) 將mask_embedding輸入到transformer層中,得到context_vector
注:該方案並非SongNet首創,類似的思路在19年微軟的Unilm【5】模型中,有所體現。
5.3 讓模型有大局觀:Global Multi-Head Attention
在每個時間步,模型不應當知道格式信息,但可以知道文本整體格式的信息,從而更好地輸出符合格式的文本。因而,對於格式信息,不應當進行mask操作,即沒有mask的attention即是Global Multi-Head Attention。
另外,Global Multi-Head Attention還將內容信息和格式信息進行了融合。
注:該過程涉及了self attention的實現,暫不做展開。
算法步驟:
將格式信息和內容信息通過沒有mask的transformer層,進行融合。
這時候再看SongNet結構圖。
可以總結出SongNet模型的算法步驟:
(1) 進行格式信息的embedding,得到format_embedding
(2) 將format_embedding經過add得到format_vector
(3) 對當前時間步以前的字符信息和格式信息進行embedding,得到content_embedding
(4) 將content_embedding經過Masking Multi-Head Self-Attention得到content_vector
(5) 將content_vector與content_embedding一同輸入到Global Multi-Head Attention中,得到輸出
6. 總結
SongNet的架構,沒有什么數學推導,更多的是符合直覺的設定。通過增加embedding,從而控制文本生成,可能成為可控文本生成領域的一個主要思路。
即:特征->符號化->embedding->融入模型
該文旨在初步介紹SongNet模型用於歌詞生成,行者AI將會持續跟進歌詞生成的博文推送,希望大家多多關注。
參考文獻
- Li, P., Zhang, H., Liu, X. and Shi, S., 2020. Rigid Formats Controlled Text Generation. arXiv preprint arXiv:2004.08022.
- Devlin J, Chang MW, Lee K, Toutanova K. Bert: Pre-training of deep bidirectional transformers for language understanding. arXiv preprint arXiv:1810.04805. 2018 Oct 11.
- Garbacea, C. and Mei, Q., 2020. Neural Language Generation: Formulation, Methods, and Evaluation. arXiv preprint arXiv:2007.15780.
- Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A.N., Kaiser, Ł. and Polosukhin, I., 2017. Attention is all you need. In Advances in neural information processing systems (pp. 5998-6008).
- Dong, L., Yang, N., Wang, W., Wei, F., Liu, X., Wang, Y., Gao, J., Zhou, M. and Hon, H.W., 2019. Unified language model pre-training for natural language understanding and generation. In Advances in Neural Information Processing Systems (pp. 13063-13075).
PS:
我們是行者AI,我們在“AI+游戲”中不斷前行。
如果你也對游戲感興趣,對AI充滿好奇,那就快來加入我們(hr@xingzhe.ai)。