1. 程式人生 > >AI嘻哈寫歌詞軟體總結

AI嘻哈寫歌詞軟體總結

(一)軟體功能

實現兩個功能:根據主題生成歌詞和輔助寫歌詞

  • 根據使用者給定的主題生成一段歌詞,歌詞表達要流暢,語句通順,押韻
  • 提供相關的詞語和句子供使用者選擇,使使用者在幫助下完成歌詞創作

核心模型

  • 主題生成首句模型-相似度計算 + 基於SIF加權的word2vec模型
  • 首句生成整段歌詞模型-基本的Seq2Seq模型和雙向Decoder + beam search的改進模型

(二) 核心模型

A. 主題生成首句模型--基於向量和基於字元的相似度模型 + 基於SIF加權的word2vec模型

事先劃定20個主題詞,將語料庫的歌詞人工標註為20類中的一種。將使用者輸入的主題和20個主題詞對比,找到最相近的主題詞。每個主題詞下有30句預先定義了30句歌詞,從這些歌詞中隨機抽取一句作為生成的首句。使用Dice相似度和基於SIF的word2vec方式。

基於向量和基於字元的相似度模型

  1. 如果使用者輸入的字元已經存在的語料庫中,那麼直接使用輸入字元的word embedding和預定義主題的word embedding做餘弦相似度比較,餘弦相似度可以將文字置於向量空間,解釋性強,效果好。

  2. 如果使用者輸入的字元不在語料庫中,那麼使用基於字元的Dice相似度計算方式如下,這種計算方式可以是直接計算字元之間的相似度,不需要通過字元的向量表示。

Dice係數=$\frac{2*commmon(S_1,S_2)}{len(S_1)+len(S_2)}$

基於SIF加權的word2vec模型

模型的目標是計算和主題詞最相關的30句話。計算語料庫每一句歌詞中所有關鍵詞的word embedding,使用SIF對所有詞的word embedding加權平均。求得句子的embedding表示。計算主題詞的embedding和句子embedding之間的相似度,找到相似度最大的30句歌詞。

word2vec原理

word2vec是個單層的神經網路,包括輸入、隱含層和輸出層。輸入是詞語的one hot向量,輸出的是詞語的在語義上的唯一向量表示embedding。Word2Vec包含兩個模型:CBOW和Skip-gram。CBOW是上下文預測當前詞的詞向量;Skip-gram使用當前詞預測上下文的詞向量。在模型求解過程中使用分級是softmax和負取樣方式加快演算法。

計算句子的word embedding

  • 對句子中所有詞的word vector求平均,獲得sentence embedding,對不相關的詞給太多權重。
  • 以每個詞的tf-idf為權重,對所有詞的word embeddingr加權平均,獲得sentence embedding
  • 以SIF的方式計算權重,對所有詞的word embedding加權平均,最後從中減掉principal component,得到sentence embedding。解決了tf-idf對出現頻率過高詞的權重的依賴。

SIF加權:類似詞頻計算權重的方法,但是這種方式多考慮不常見元素的權重。SIF取句中詞嵌入的平均權重。每個詞嵌入都由a/(a +p(w))進行加權,其中a的值經常被設定為0.01,而p(w)是詞語在語料中出現的頻率。常見元素刪除:接下來,SIF計算了句子的嵌入中最重要的元素。然後它減去這些句子嵌入中的主要成分。這就可以刪除與頻率和句法有關的變數,他們和語義的聯絡不大。最後,SIF使一些不重要的詞語的權重下降,例如but、just等,同時保留對語義貢獻較大的資訊。


B. 主題生成首句模型--押韻版模型和不押韻版模型

給定第一句生成一段歌詞。輸入是第一句歌詞的字元形式,輸出是幾段歌詞的字元形式。根據使用者要求歌詞分成押韻和不押韻兩種。不押韻的基本模型是雙LSTM+Decoder的Seq2Seq模型 + Attention + Beam Search加強模型效果。押韻和不押韻的區別在於押韻模型是雙Decoder和自定義的Beam search方式。

Seq2Seq + Attention + Beam search + Techer forcing模型

雙向RNN

在經典的迴圈神經網路中,狀態的傳輸是從前往後單向的。然而,在有些問題中,當前時刻的輸出不僅和之前的狀態有關係,也和之後的狀態相關。我_ _ 想吃羊肉,要預測空格中的詞語要同時看前後的詞語的意思和時態、詞性。這時就需要雙向RNN(BiRNN)來解決這類問題。

雙向RNN是由兩個RNN上下疊加在一起組成的。輸入是同時傳到來個RNN,輸出由這兩個RNN的輸出共同決定,一般採用均值的方式。

input_gate_3

其中,正向計算時,隱藏層的 $s_t$ 與 $s_{t-1}$ 有關;反向計算時,隱藏層的 $s_t$ 與 $s_{t+1}$ 有關。

Seq2Seq

模型的目標是輸入一句歌詞生成下一句歌詞。但是傳統的LSTM神經網路存在兩個問題:1.每個字詞的預測和之前的預測結果是獨立的。2.輸入語句和輸出語句的長度必須一致。但這是違反常規的,所以我們使用Seq2Seq模型,分成encoder和decoder模型,可以使輸入語句和輸出語句的長度不一樣。

seq0

上圖是Seq2Seq的總體流程圖。
Encoder和Decoder分別是一個傳統的RNN,encoder最後一個時刻的cell的hidden state輸出到decoder的第一個cell裡,通過啟用函式和softmax層,得到候選的symbols,篩選出概率最大的symbols,作為下一個cell的輸入。彙總所有的decoder的output就是最後的預測結果。

為什麼要使用Encoder的最後一個hidden state?
在Encoder-Decoder結構中,Encoder把所有的輸入序列都編碼成一個統一的語義特徵c再解碼,因此, c中包含原始序列中的所有資訊。

seq1
這是Encoder的構造,它和普通的RNN、LSTM沒有區別。具體每個細胞接受的是每一個單詞word embedding,和上一個時間點的hidden state。輸出的是這個時間點的hidden state。

seq0
這是Decoder的構造,第一個cell是輸入是encode的最後一個cell的hidden state,並且當前的output會輸入到下一個cell中。

Attention

設計思想

由於Seq2Seq模型中是將encoder的最後一個hidden state輸入到decoder,encdoer要將整個序列的資訊壓縮排一個固定長度的向量中去。這就造成了 (1)語義向量無法完全表示整個序列的資訊,(2)最開始輸入的序列容易被後輸入的序列給覆蓋掉,會丟失許多細節資訊。在長序列上表現的尤為明顯。

引入Attention

相比於之前的encoder-decoder模型,attention模型最大的區別就在於它不在要求編碼器將所有輸入資訊都編碼進一個固定長度的向量之中。相反,此時編碼器需要將輸入編碼成一個向量的序列,而在解碼的時候,每一步都會選擇性的從向量序列中挑選一個子集進行進一步處理。這樣,在產生每一個輸出的時候,都能夠做到充分利用輸入序列攜帶的資訊。

原理

1.完整流程

seq1
上圖是Seq2Seq模型+Attentionmo模型的完整示意圖。

現在的解碼過程(Decoder)是:
預測當前詞$y_i$需要當前時刻的$h_i$和$c_i$上下文向量和上一時刻的輸出$y_i$
預測當前詞的$h_i$需要上一時刻的$h_{i-1},y_{i-1}$和$C_i$

  1. 計算$c_i$

seq1
上圖是計算$c_i$的完整過程示意圖

其中:$c_i=\sum_{j=1}^{T_x}{\alpha_{ij}h_j}$,
$T_x$表示Encoder輸入文字的長度,
$i$ 表示預測的第i個字元,
$j$ 表示Encoder中第j個字元,
$\alpha_{ij}$ 表示:輸入Encoder中的第j個字元對預測第i個字元的影響程度,
$h_j$ 表示輸入Encoder的第j個字元的hidden state。
這個計算公式的本質意義就是將輸入字元的hidden state加權。重點是權重的計算方式。

seq1
上圖是計算$c_i$的圖形過程示意圖,之前的計算過程表示成圖形就是這個樣子的。
3.計算$\alpha_{i}$(也就是權重)

seq1
$\alpha_{ij}=\frac{exp(e_{ij})}{\sum_{k=1}^{T_x}{exp(e_{ik})}} \quad$,底下分母的意義就是歸一化

$e_{ij}=a(y_{i-1,h_j})$,意義就是將已經得到的預測輸出和輸入Encoder的文字做匹配計算,得到i時刻的輸出和j時刻的輸入之間的注意力分配關係。最後帶入上一個公式計算$c_i$.

Attention分類
  • Soft Attention
    就是我們剛才舉例的模型,使用輸入Encoder的所有hidden state加權取平均。我們使用的soft Attention型別。
  • Hard Attention
    使用概率抽樣的方式,選擇某個hidden state,估計梯度的時候也採用蒙特卡洛抽樣的方法。

teacher forcing

Teacher Forcing是運用在解碼過程中加強細胞的學習的方法。細胞接受來自上一個細胞的隱藏狀態和細胞狀態和上一個細胞的預測值的時候,這裡細胞改成不用上一個細胞的預測值作為輸出,用真實值作為輸入,提高細胞的學習內容。

就拿Seq2Seq模型來舉例,我們假設正輸出到第三項,準備生成第四項:
input  = [A,B,C,D]
output = [X,Y,Z,W]
label  = [X,Y,N,W]

押韻模型

輸入是根據主題詞生成的第一句歌詞的反序形式和押韻要求(單押、雙押、長度)。
輸出是一段按照符合預定義押韻形式的歌詞。

使用skip thought模型和改進的beam search模型。skip thought使模型產生的結果更通順,beam search完成押韻的要求。

Skip Thought

skip thought模型是雙decoder,可以同時預測當前句子的上一句和下一句,使梯度回傳到Encoder,增強encoder的引數學習,更好地捕捉前後文的資訊。同時Encode和Decoder之間使用均值的方式連線。

Beam search

Beam Search是運用在inference階段的加強預測結果的方法。它改進了貪婪解碼中只選擇一個得分最大的詞語作為輸出的方式,而是選出得分最大的K個詞,在下一步的時候在當前選擇的詞語的基礎上還是選擇K個單詞,然後不斷沿著時間步長走下去,保證整體得到的結果最優。

有了首句之後,不是直接搜尋首句韻腳相同的詞語,而且先通過skip thought模型得到首句的上一句和下一句和最後一個細胞的輸出(語料庫的詞語的概率分佈),用概率最大並且滿足韻腳的詞語作為歌詞末尾的韻腳歌詞,使用自定義的beam search方式,使其從最後一個押韻詞開始向前搜尋每個詞語,直至遇到停止符,輸出整個語句。