日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

深度学习之循环神经网络(1)序列表示方法

發布時間:2023/12/15 循环神经网络 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习之循环神经网络(1)序列表示方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深度學習之循環神經網絡(1)序列表示方法

  • 序列表示方法
    • Embedding層
  • 2. 預訓練的詞向量

前面的卷積神經網絡利用數據的局部相關性和權值共享的思想大大減少了網絡的參數量,非常適合于圖片這種具有 空間(Spatial)局部相關性的數據,已經被成功地應用到計算機視覺領域的一系列任務上。自然界的信號除了具有空間維度外,還有一個 時間(Temporal)維度。具有時間維度的信號非常常見,比如我們正在閱讀的文本、說話時發出的語音信號、隨著時間變化的股市參數等。這類數據并不一定具有局部相關性,同時數據在時間維度上的長度也是可變的,卷積神經網絡并不擅長處理此類數據。

?那么如何解決這一類信號的分析、識別等問題是將人工智能推向通用人工智能路上必須解決的一項任務。本章將要介紹的循環神經網絡可以較好地解決此類問題。在介紹循環神經網絡之前,首先我們來介紹對于具有時間先后順序的數據的表示方法。

序列表示方法

?具有先后順序的數據一般叫做序列(Sequence),比如隨時間而變化的商品價格數據就是非常典型的序列。考慮某件商品A在1月到6月之間的價格變化趨勢,我們記為一維向量:[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月之間的價格變化趨勢,科技委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表示商品的數量,張量shape為[b,6][b,6][b,6]

?這么看來,序列信號表示起來并不很麻煩,只需要一個shape為[b,s][b,s][b,s]的張量即可,其中bbb為序列數量,sss為序列長度。但是對于很多信號并不能直接使用一個標量數值表示,比如每個時間戳產生長度為nnn的特征向量,則shape為[b,s,n][b,s,n][b,s,n]的張量才能表示。考慮更復雜的文本數據: 句子。它在每個時間戳上面產生的單詞是一個字符,并不是數值,不能直接運用某個標量表示。我們已經知道神經網絡本質上是一系列的矩陣相乘、相加等數學運算,它并不能夠直接處理字符串類型的數據。如果希望神經網絡能夠用于自然語言處理任務,那么怎么把單詞或字符轉化為數值就變得尤為關鍵。接下來我們主要探討文本序列的表示方法,其他非數值類型的信號可以參考文本序列的表示方法。

?對于一個含有nnn個單詞的句子,單詞的一種簡單表示方法就是前面我們介紹的One-hot編碼。以英文句子為例,假設我們只考慮最常用的10000個單詞,那么每個單詞就可以表示為某位為1,其它位置為0且長度為10000的稀疏One-hot向量; 對于中文句子,如果也只考慮最常用的5000個漢字,同樣的方法,一個漢字可以用長度為5000的One-hot向量表示。如下圖所示,如果只考慮n個地名單詞,可以將每個地名編碼為長度為n的One-hot向量。

地名系統One-hot編碼方案


?我們把文字編碼為Word Embedding。One-hot編碼方式實現Word Embedding簡單直觀,編碼過程不需要學習和訓練。但是One-hot編碼的向量是高緯度而且及其稀疏的,大量的位置為0,計算效率較低,同時也不利于神經網絡的訓練。從語義角度來講,One-hot編碼還有一個嚴重的問題,它忽略了單詞先天具有的語義相關性。舉個例子,對于單詞“like”、“dislike”、“Rome”、“Paris”來說,“like”和“dislike”在語義角度就強相關,它們都表示喜歡的程度; “Rome”和“Paris”同樣也是強相關,它們都表示歐洲的兩個地點。對于一組這樣的單詞來說,如果采用One-hot編碼,得到的向量之間沒有相關性,不能很好地體現原有文字的語義相關度,因此One-hot編碼具有明顯的缺陷。

?在自然語言處理領域,有專門的一個研究方向在探索如何學習到單詞的表示向量(Word Vector),使得語義層面的相關性能夠很好地通過Word Vector體現出來。一個衡量詞向量之間相關度的方法就是余弦相關度(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?ba?b?
其中a\boldsymbol aab\boldsymbol bb代表了兩個詞向量。下圖演示了單詞“France”和“Italy”的相似度,以及單詞“ball”和“crocodile”的相似度,θθθ為兩個詞向量之間的夾角。可以看到cos?(θ)\text{cos}?(θ)cos?(θ)較好地反映了語義相關性。

余弦相似度示意圖

Embedding層

?在神經網絡中,單詞的表示向量可以直接通過訓練的方式得到,我們把單詞的表示層叫做Embedding層。Embedding層負責把單詞編碼為某個詞向量v\boldsymbol vv,它接受的是采用數字編碼的單詞符號iii,如2表示“I”,3表示“me”等,系統總單詞數量記為NvocabN_\text{vocab}Nvocab?,輸入長度為nnn的向量v\boldsymbol vv:
v=fθ(i∣Nvocab,n)v=f_θ (i|N_\text{vocab},n)v=fθ?(iNvocab?,n)
?Embedding層實現起來非常簡單,構建一個shape為[Nvocab,n][N_\text{vocab},n][Nvocab?,n]的查詢表對象table,對于任意的單詞編號iii,只需要查詢到對應位置上的向量并返回即可:
v=table[i]\boldsymbol v=table[i]v=table[i]
Embedding層是可訓練的,它可放置在神經網絡之前,完成單詞到向量的轉換,得到的表示向量可以繼續通過神經網絡完成后續任務,并計算誤差L\mathcal LL,采用梯度下降算法來實現端到端(end-to-end)的訓練。
在TensorFlow中,可以通過layers.Embedding(NvocabN_\text{vocab}Nvocab?, nnn)來定義一個Word Embedding層,其中NvocabN_\text{vocab}Nvocab?參數指定詞匯數量,nnn指定單詞向量的長度。例如:

import tensorflow as tf from tensorflow import keras from tensorflow.keras import layersx = tf.range(10) # 生成10個單詞的數字編碼 x = tf.random.shuffle(x) # 打散 # 創建共10個單詞,每個單詞用長度為4的向量表示的層 net = layers.Embedding(10, 4) out = net(x) # 獲取詞向量 print(out)


運行結果如下圖所示:


上述代碼創建了10個單詞的Embedding層,每個單詞用長度為4的向量表示,可以傳入數字編碼為0~9的輸入,得到這4個單詞的詞向量,這些詞向量隨機初始化的,尚未經過網絡訓練。

?我們還可以直接查看Embedding層內部的查詢表table:

# 查看Embedding層內部的查詢表table print(net.embeddings)


運行結果如下圖所示:


并查看net.embeddings張量的可優化屬性為True,即可以通過梯度下降算法優化。

# 查看net.embeddings張量的可優化屬性為True,即可以通過梯度下降算法優化 print(net.embeddings.trainable)


運行結果如下圖所示:



2. 預訓練的詞向量

?Embedding層的查詢表是隨機初始化的,需要從零開始訓練。實際上,我們可以使用預訓練的Word Embedding模型來得到單詞的表示方法,基于預訓練模型的詞向量相當于遷移了整個語義空間的知識,往往能得到更好的性能。

?目前應用的比較廣泛的預訓練模型由Word2Vec和GloVe等。它們已經在海量語料庫訓練得到了較好的詞向量表示方法,并可以直接導出學習到的詞向量表,方便遷移到其它任務。比如GloVe模型GloVe.6B.50d,詞匯量為40萬,每個單詞使用長度為50的向量表示,用戶只需要下載對應的模型文件即可,“glove6b50dtxt.zip”模型文件約69MB。

?那么如何使用這些預訓練的詞向量模型來幫助提升NLP任務的性能呢?非常簡單,對應Embedding層,不再采用隨機初始化的方式,而是利用我們已經預訓練好的模型參數去初始化Embedding層的查詢表。例如:

# 從預訓練模型中加載詞向量表 embed_glove = load_embed('glove.6B.50d.txt') # 直接利用預訓練的詞向量表初始化Embedding層 net.set_weights([embed_glove])


經過預訓練的詞向量模型初始化的Embedding層可以設置為不參與訓練: net.trainable=False,那么預訓練的詞向量就直接應用到此特定任務上; 如果希望能夠學到區別于預訓練詞向量模型不同的表示方法,那么就可以把Embedding層包含進反向傳播算法中去,利用梯度下降來微調單詞表示方法。

總結

以上是生活随笔為你收集整理的深度学习之循环神经网络(1)序列表示方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。