深度学习之循环神经网络(1)序列表示方法
深度學(xué)習(xí)之循環(huán)神經(jīng)網(wǎng)絡(luò)(1)序列表示方法
- 序列表示方法
- Embedding層
- 2. 預(yù)訓(xùn)練的詞向量
前面的卷積神經(jīng)網(wǎng)絡(luò)利用數(shù)據(jù)的局部相關(guān)性和權(quán)值共享的思想大大減少了網(wǎng)絡(luò)的參數(shù)量,非常適合于圖片這種具有 空間(Spatial)局部相關(guān)性的數(shù)據(jù),已經(jīng)被成功地應(yīng)用到計(jì)算機(jī)視覺領(lǐng)域的一系列任務(wù)上。自然界的信號(hào)除了具有空間維度外,還有一個(gè) 時(shí)間(Temporal)維度。具有時(shí)間維度的信號(hào)非常常見,比如我們正在閱讀的文本、說話時(shí)發(fā)出的語音信號(hào)、隨著時(shí)間變化的股市參數(shù)等。這類數(shù)據(jù)并不一定具有局部相關(guān)性,同時(shí)數(shù)據(jù)在時(shí)間維度上的長(zhǎng)度也是可變的,卷積神經(jīng)網(wǎng)絡(luò)并不擅長(zhǎng)處理此類數(shù)據(jù)。
?那么如何解決這一類信號(hào)的分析、識(shí)別等問題是將人工智能推向通用人工智能路上必須解決的一項(xiàng)任務(wù)。本章將要介紹的循環(huán)神經(jīng)網(wǎng)絡(luò)可以較好地解決此類問題。在介紹循環(huán)神經(jīng)網(wǎng)絡(luò)之前,首先我們來介紹對(duì)于具有時(shí)間先后順序的數(shù)據(jù)的表示方法。
序列表示方法
?具有先后順序的數(shù)據(jù)一般叫做序列(Sequence),比如隨時(shí)間而變化的商品價(jià)格數(shù)據(jù)就是非常典型的序列。考慮某件商品A在1月到6月之間的價(jià)格變化趨勢(shì),我們記為一維向量:[x1,x2,x3,x4,x5,x6][x_1,x_2,x_3,x_4,x_5,x_6][x1?,x2?,x3?,x4?,x5?,x6?],它的shape為[6][6][6]。如果要表示b件商品在1月到6月之間的價(jià)格變化趨勢(shì),科技委2維張量:
[[x1(1),x2(1),…,x6(1)],[x1(2),x2(2),…,x6(2)],…,[x1(b),x2(b),…,x6(b)]][[x_1^{(1)},x_2^{(1)},…,x_6^{(1)} ],[x_1^{(2)},x_2^{(2)},…,x_6^{(2)} ],…,[x_1^{(b)},x_2^{(b)},…,x_6^{(b)} ]][[x1(1)?,x2(1)?,…,x6(1)?],[x1(2)?,x2(2)?,…,x6(2)?],…,[x1(b)?,x2(b)?,…,x6(b)?]]
其中bbb表示商品的數(shù)量,張量shape為[b,6][b,6][b,6]。
?這么看來,序列信號(hào)表示起來并不很麻煩,只需要一個(gè)shape為[b,s][b,s][b,s]的張量即可,其中bbb為序列數(shù)量,sss為序列長(zhǎng)度。但是對(duì)于很多信號(hào)并不能直接使用一個(gè)標(biāo)量數(shù)值表示,比如每個(gè)時(shí)間戳產(chǎn)生長(zhǎng)度為nnn的特征向量,則shape為[b,s,n][b,s,n][b,s,n]的張量才能表示??紤]更復(fù)雜的文本數(shù)據(jù): 句子。它在每個(gè)時(shí)間戳上面產(chǎn)生的單詞是一個(gè)字符,并不是數(shù)值,不能直接運(yùn)用某個(gè)標(biāo)量表示。我們已經(jīng)知道神經(jīng)網(wǎng)絡(luò)本質(zhì)上是一系列的矩陣相乘、相加等數(shù)學(xué)運(yùn)算,它并不能夠直接處理字符串類型的數(shù)據(jù)。如果希望神經(jīng)網(wǎng)絡(luò)能夠用于自然語言處理任務(wù),那么怎么把單詞或字符轉(zhuǎn)化為數(shù)值就變得尤為關(guān)鍵。接下來我們主要探討文本序列的表示方法,其他非數(shù)值類型的信號(hào)可以參考文本序列的表示方法。
?對(duì)于一個(gè)含有nnn個(gè)單詞的句子,單詞的一種簡(jiǎn)單表示方法就是前面我們介紹的One-hot編碼。以英文句子為例,假設(shè)我們只考慮最常用的10000個(gè)單詞,那么每個(gè)單詞就可以表示為某位為1,其它位置為0且長(zhǎng)度為10000的稀疏One-hot向量; 對(duì)于中文句子,如果也只考慮最常用的5000個(gè)漢字,同樣的方法,一個(gè)漢字可以用長(zhǎng)度為5000的One-hot向量表示。如下圖所示,如果只考慮n個(gè)地名單詞,可以將每個(gè)地名編碼為長(zhǎng)度為n的One-hot向量。
?我們把文字編碼為Word Embedding。One-hot編碼方式實(shí)現(xiàn)Word Embedding簡(jiǎn)單直觀,編碼過程不需要學(xué)習(xí)和訓(xùn)練。但是One-hot編碼的向量是高緯度而且及其稀疏的,大量的位置為0,計(jì)算效率較低,同時(shí)也不利于神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。從語義角度來講,One-hot編碼還有一個(gè)嚴(yán)重的問題,它忽略了單詞先天具有的語義相關(guān)性。舉個(gè)例子,對(duì)于單詞“l(fā)ike”、“dislike”、“Rome”、“Paris”來說,“l(fā)ike”和“dislike”在語義角度就強(qiáng)相關(guān),它們都表示喜歡的程度; “Rome”和“Paris”同樣也是強(qiáng)相關(guān),它們都表示歐洲的兩個(gè)地點(diǎn)。對(duì)于一組這樣的單詞來說,如果采用One-hot編碼,得到的向量之間沒有相關(guān)性,不能很好地體現(xiàn)原有文字的語義相關(guān)度,因此One-hot編碼具有明顯的缺陷。
?在自然語言處理領(lǐng)域,有專門的一個(gè)研究方向在探索如何學(xué)習(xí)到單詞的表示向量(Word Vector),使得語義層面的相關(guān)性能夠很好地通過Word Vector體現(xiàn)出來。一個(gè)衡量詞向量之間相關(guān)度的方法就是余弦相關(guān)度(Cosine similarity):
similarity(a,b)?cos?(θ)=a?b∣a∣?∣b∣\text{similarity}(\boldsymbol a,\boldsymbol b)?\text{cos}?(θ)=\frac{\boldsymbol a\cdot \boldsymbol b}{|\boldsymbol a|\cdot|\boldsymbol b|}similarity(a,b)?cos?(θ)=∣a∣?∣b∣a?b?
其中a\boldsymbol aa和b\boldsymbol bb代表了兩個(gè)詞向量。下圖演示了單詞“France”和“Italy”的相似度,以及單詞“ball”和“crocodile”的相似度,θθθ為兩個(gè)詞向量之間的夾角??梢钥吹?span id="ze8trgl8bvbq" class="katex--inline">cos?(θ)\text{cos}?(θ)cos?(θ)較好地反映了語義相關(guān)性。
Embedding層
?在神經(jīng)網(wǎng)絡(luò)中,單詞的表示向量可以直接通過訓(xùn)練的方式得到,我們把單詞的表示層叫做Embedding層。Embedding層負(fù)責(zé)把單詞編碼為某個(gè)詞向量v\boldsymbol vv,它接受的是采用數(shù)字編碼的單詞符號(hào)iii,如2表示“I”,3表示“me”等,系統(tǒng)總單詞數(shù)量記為NvocabN_\text{vocab}Nvocab?,輸入長(zhǎng)度為nnn的向量v\boldsymbol vv:
v=fθ(i∣Nvocab,n)v=f_θ (i|N_\text{vocab},n)v=fθ?(i∣Nvocab?,n)
?Embedding層實(shí)現(xiàn)起來非常簡(jiǎn)單,構(gòu)建一個(gè)shape為[Nvocab,n][N_\text{vocab},n][Nvocab?,n]的查詢表對(duì)象table,對(duì)于任意的單詞編號(hào)iii,只需要查詢到對(duì)應(yīng)位置上的向量并返回即可:
v=table[i]\boldsymbol v=table[i]v=table[i]
Embedding層是可訓(xùn)練的,它可放置在神經(jīng)網(wǎng)絡(luò)之前,完成單詞到向量的轉(zhuǎn)換,得到的表示向量可以繼續(xù)通過神經(jīng)網(wǎng)絡(luò)完成后續(xù)任務(wù),并計(jì)算誤差L\mathcal LL,采用梯度下降算法來實(shí)現(xiàn)端到端(end-to-end)的訓(xùn)練。
在TensorFlow中,可以通過layers.Embedding(NvocabN_\text{vocab}Nvocab?, nnn)來定義一個(gè)Word Embedding層,其中NvocabN_\text{vocab}Nvocab?參數(shù)指定詞匯數(shù)量,nnn指定單詞向量的長(zhǎng)度。例如:
運(yùn)行結(jié)果如下圖所示:
上述代碼創(chuàng)建了10個(gè)單詞的Embedding層,每個(gè)單詞用長(zhǎng)度為4的向量表示,可以傳入數(shù)字編碼為0~9的輸入,得到這4個(gè)單詞的詞向量,這些詞向量隨機(jī)初始化的,尚未經(jīng)過網(wǎng)絡(luò)訓(xùn)練。
?我們還可以直接查看Embedding層內(nèi)部的查詢表table:
運(yùn)行結(jié)果如下圖所示:
并查看net.embeddings張量的可優(yōu)化屬性為True,即可以通過梯度下降算法優(yōu)化。
運(yùn)行結(jié)果如下圖所示:
2. 預(yù)訓(xùn)練的詞向量
?Embedding層的查詢表是隨機(jī)初始化的,需要從零開始訓(xùn)練。實(shí)際上,我們可以使用預(yù)訓(xùn)練的Word Embedding模型來得到單詞的表示方法,基于預(yù)訓(xùn)練模型的詞向量相當(dāng)于遷移了整個(gè)語義空間的知識(shí),往往能得到更好的性能。
?目前應(yīng)用的比較廣泛的預(yù)訓(xùn)練模型由Word2Vec和GloVe等。它們已經(jīng)在海量語料庫訓(xùn)練得到了較好的詞向量表示方法,并可以直接導(dǎo)出學(xué)習(xí)到的詞向量表,方便遷移到其它任務(wù)。比如GloVe模型GloVe.6B.50d,詞匯量為40萬,每個(gè)單詞使用長(zhǎng)度為50的向量表示,用戶只需要下載對(duì)應(yīng)的模型文件即可,“glove6b50dtxt.zip”模型文件約69MB。
?那么如何使用這些預(yù)訓(xùn)練的詞向量模型來幫助提升NLP任務(wù)的性能呢?非常簡(jiǎn)單,對(duì)應(yīng)Embedding層,不再采用隨機(jī)初始化的方式,而是利用我們已經(jīng)預(yù)訓(xùn)練好的模型參數(shù)去初始化Embedding層的查詢表。例如:
經(jīng)過預(yù)訓(xùn)練的詞向量模型初始化的Embedding層可以設(shè)置為不參與訓(xùn)練: net.trainable=False,那么預(yù)訓(xùn)練的詞向量就直接應(yīng)用到此特定任務(wù)上; 如果希望能夠?qū)W到區(qū)別于預(yù)訓(xùn)練詞向量模型不同的表示方法,那么就可以把Embedding層包含進(jìn)反向傳播算法中去,利用梯度下降來微調(diào)單詞表示方法。
總結(jié)
以上是生活随笔為你收集整理的深度学习之循环神经网络(1)序列表示方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习之卷积神经网络(13)Dense
- 下一篇: 宽带接入服务器的方式有哪些