【Keras之父】DL用於Text

        用於處理序列的2種基本的深度學習算法分別是循環神經網絡RNN (recurrent neural network) 和一維卷積神經網絡(1D convnet)。這些算法的應用包括:

  • 文檔分類和時間序列分類,比如識別文章的主題或書的作者;
  • 時間序列對比,比如估測兩個文檔或兩支股票行情的相關程度;
  • 序列到序列的學習,比如將英語翻譯成法語;
  • 情感分析,比如將推文或電影評論的情感劃分爲正面或負面;
  • 時間序列預測,比如根據某地最近的天氣數據來預測未來天氣。

     字符序列和單詞序列是最常用的序列數據之一,但最常見的是單詞級處理。深度學習用於NLP是將模式識別應用於單詞、句子和段落。深度學習模型不會接收原始文本作爲輸入,只能處理數值張量。文本向量化vectorize就是將文本轉換爲數值張量的過程。常用方法如下:

  • 將文本分割爲單詞,並將每個單詞轉換爲一個向量。
  • 將文本分割爲字符,並將每個字符轉換爲一個向量。
  • 提取單詞或字符的 n-gram,並將每個 n-gram 轉換爲一個向量。n-gram 是多個連續單詞或字符的集合(n-gram 之間可重疊)

================================================================

       

        詞袋是一種不保存順序的分詞方法(生成的標記組成一個集合,而不是一個序列,捨棄了句子的總體結構),因此它往往被用於淺層的語言處理模型,而不是深度學習模型。提取 n-gram 是一種特徵工程,深度學習不需要這種死板而又不穩定的方法,並將其替換爲分層特徵學習。在使用輕量級的淺層文本處理模型時(比如 logistic 迴歸和隨機森林)n-gram 是一種功能強大、不可或缺的特徵工程工具

===============================================================

  1. 標記token --- 將文本分解而成的單元(單詞、字符或n-gram
  2. 分詞tokenization ---- 將文本分解成標記的過程

===============================================================

         所有文本向量化過程都是應用某種分詞方案,然後將數值向量與生成的標記相關聯。這些向量組合成序列張量,被輸入到DNN中。將向量與標記相關聯的方法有很多種。其中2種主要的方法:one-hot 編碼( one-hot encoding)與標記嵌入(token embedding, 通常只用於單詞,爲詞嵌入)。

        1. one-hot編碼

         One-hot編碼是將標記轉換爲向量的最常用、最基本的方法。定義:將每個單詞與一個唯一的整數索引相關聯,然後將這個整數索引i轉換爲長度N的二進制向量(N是詞表大小),這個向量只有第i 個元素是1,其餘元素都是0,得到的向量是二進制的、稀疏的(絕大部分元素都是0)、維度很高的(維度大小等於詞表的單詞個數)。同時也有對應的字符級的one-hot編碼。Keras的內置函數可以對原始文本數據進行單詞或字符級的one-hot編碼。

         One-hot編碼的一種變體是所謂的one-hot散列技巧( one-hot hashing trick) ---將單詞散列編碼爲固定長度的向量,通常用一個非常簡單的散列函數來實現。如果詞表中唯一標記的數量太大而無法直接處理,就可以使用這種技巧。

         優點:避免了維護一個顯式的單詞索引,從而節省內存並允許數據的在線編碼(即在讀取完所有數據之前,就可以立刻生成標記向量)

         缺點:散列衝突(hash collision即2個不同的單詞可能具有相同的散列值,隨後任何機器學習模型觀察這些散列值,都無法區分它們所對應的單詞。如果散列空間的維度大於散列的唯一標記個數,散列衝突的可能性會減少。

         2. 詞嵌入word embedding

         使用密集的詞向量(word vector),低維的浮點數向量。常見的詞向量維度是2565121024, One-hot編碼的詞向量通常是 >=20000

獲取詞嵌入有2種方法:

         1. 在完成主任務(比如文檔分類或情感預測)的同時學習詞嵌入。在這種情況下,一開始是隨機的詞向量,然後對這些詞向量進行學習,其學習方式與學習神經網絡的權重相同,即利用Keras 中的embedding層來學習詞嵌入

         詞向量之間的幾何關係應該表示這些詞之間的語義關係。詞嵌入的作用 應該是將人類的語言映射到幾何空間中。在真實的詞嵌入向量中,常見的有意義的幾何變換的例子包括“性別”向量和“複數”向量。詞嵌入空間通常具有幾千個這種可解釋的、並且可能很有用的向量。語言是特定文化和特定環境的反射。但是從更實際的角度來說,一個好的詞嵌入空間在很大程度上取決於要解決的任務

 

         將一個 Embedding 層實例化時,它的權重(即標記向量的內部字典)最開始是隨機的,與其他層一樣。在訓練過程中,利用反向傳播來逐漸調節這些詞向量,改變空間結構以便下游模型可以利用。一旦訓練完成,嵌入空間將會展示大量結構,這種結構專門針對訓練模型所要解決的問題。

         2. 在不同於待解決問題的機器學習任務上預計算好詞嵌入,然後將其加載到模型中---預訓練詞嵌入 (pretrained word embedding) 。在NLP中使用預訓練的詞嵌入,其原理與在Image Classification中使用預訓練的CNN是一樣的:沒有足夠的數據來學習真正強大的特徵,但是又需要的特徵應該是非常通用的,比如常見的視覺特徵或語義特徵。在這種情況下,重複使用在其他問題上學到的特徵是很有道理的。This is舉一反三。

         常見的算法:1. word2vec算法---Google 13年用無監督的方法計算一個密集的低維詞嵌入空間 ;2. GloVe---斯坦福大學 14年基本對詞共現統計矩陣進行因式分解,數據來自於維基百科數據和Common Crawl數據。

 

 ================================================================

~~~~~~~~~~~~~~RNN系列~~~~~~~~~~~~~~

         循環神經網絡(RNNrecurrent neural network):它處理序列的方式是遍歷所有序列元素並保存一個狀態(state),其中包括與已查看內容相關的信息。實際上,RNN是一類具有內部環的神經網絡。

         最終輸出是一個形狀爲 (timesteps, output_features) 的二維張量,其中每個時間步是循環在 t 時刻的輸出。輸出張量中的每個時間步 t 包含輸入序列中時間步 0~t 的信息,即關於全部過去的信息。網絡的初始狀態(initial state)是指 需要將狀態初始化爲一個全零向量

         Keras中的SimpleRNN層:SimpleRNN 層能夠像其他 Keras 層一樣處理序列批量,而不是 像 Numpy 示例那樣只能處理單個序列。因此,它接收形狀爲 (batch_size, timesteps, input_features) 的輸入,而不是 (timesteps, input_features)。與 Keras 中的所有循環層一樣,SimpleRNN 可以在2種不同的模式下運行 ,由 return_sequences 這個構造函數參數來控制。如下:

         1. 返回每 個時間步連續輸出的完整序列,即形狀爲 (batch_size, timesteps, output_features) 的三維張量

         2. 只返回每個輸入序列的最終輸出,即形狀爲 (batch_size, output_ features) 的二維張量。

      【缺點】通常過於簡化,沒有實用價值。最大問題是: 在時刻 t,理論上來說,它應該能夠記住許多時間步之前見過的信息,但實際上它是不可能學到這種長期依賴的。其原因在於梯度消失問題(vanishing gradient problem),這一效應類似於在層數較多的非循環網絡(即前饋網絡)中觀察到的效應:隨着層數的增加,網絡最終變得無法訓練

———————————————————————————————————

下面介紹一下在Keras中其他的循環層應用:

===========================LSTM層和GRU層======================

LSTM (長短期記憶long short-term memory ): 允許過去的消息稍後重新進入,從而解決了梯度消失的問題。

          LSTM層是SimpleRNN層的一種變體,它增加了一種攜帶信息跨越多個時間步的方法。假設有一條傳送帶,其運行方向平行於所處理的序列。序列中的信息可以在任意位置跳上傳送帶,然後被傳送到更晚的時間步,並在需要時原封不動地跳回來。其原理爲:保存信息以便後面使用,從而防止較早期的信號在處理過程中逐漸消失

 

SimpleRNN

 

LSTM

        攜帶carry將與輸入連接 和循環連接進行運算(通過一個密集變換,即與權重矩陣作點積,然後加上一個偏置,再應用 一個激活函數),從而影響傳遞到下一個時間步的狀態(通過一個激活函數和一個乘法運算)。剖析LSTM流程如下:

        RNN 單元的類型決定了假設空間,即在訓練期 間搜索良好模型配置的空間,但它不能決定 RNN 單元的作用,那是由單元權重來決定的。同一 個單元具有不同的權重,可以實現完全不同的作用。因此,組成 RNN 單元的運算組合,最好被解釋爲對搜索的一組約束,而不是一種工程意義上的設計。

~~~~~~~~~爲什麼 LSTM 能表現得更好???~~~~~~~

        一個原因是沒有花力氣來調節超參數,比如嵌入維度或 LSTM 輸出維度。另 一個原因可能是缺少正則化。其實主要原因在於,適用於評論分析全局的長期性結構(這正是 LSTM 所擅長的),對情感分析問題幫助不大。對於這樣的基本問題,觀察每條評論中出現了哪些詞及其出現頻率就可以很好地解決。這也正是第一個全連接方法的做法。但還有更加困難的自然語言處理問題,特別是問答和機器翻譯, LSTM 的優勢就明顯了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

*********提高循環神經網絡的性能和泛化能力的三種高級技巧********

  • 循環 dropout(recurrent dropout)。這是一種特殊的內置方法,在循環層中使用 dropout來降低過擬合。
  • 堆疊循環層(stacking recurrent layers)。這會提高網絡的表示能力(代價是更高的計算負荷)
  • 雙向循環層(bidirectional recurrent layer)。將相同的信息以不同的方式呈現給循環網絡,可以提高精度並緩解遺忘問題。

3種常見的解決序列文本問題的思路:

一、基於常識的、非機器學習的一種基準方法

         一個經典的例子就是不平衡的分類任務,其中某些類別比其他類別更常見。比如:數據集中包含90%的類別A10%的類別B,那麼分類任務的一種基於常見的方法就是對新樣本始終預測類別“A”。這種分類器的總體精度爲 90%,因此任何基於學習的方法在精度高於 90% 時才能證明其有效性。有時候,這樣基本的基準方法可能很難打敗。

 

二、一種基本的機器學習方法

         如果從數據到目標之間存在一個簡單且表現良好的模型(即基於常識的基準 方法),那爲什麼訓練的模型沒有找到這個模型並進一步改進呢?

         答:這個簡單的解決方案並不是訓練過程所要尋找的目標。在模型空間(即假設空間)中搜索解決方案,這個模型空間是具有我們所定義的架構的所有兩層網絡組成的空間,這些網絡已經相當複雜。如果在一個複雜模型的空間中尋找解決方案,可能無法學到簡單且性能良好的基準方法,雖然技術上來說它屬於假設空間的一部分。通常來說,這對機器學習是一個非常重要的限制:如果學習算法沒有被硬編碼要求去尋找特定類型的簡單模型,那麼有時候參數學習是無法找到簡單問題的簡單解決方案的。

 

三、第一個循環網絡基準

         門控循環單元(GRUgated recurrent unit)的工作原理與 LSTM 相同。但它做了一些簡化,因此運行的計算代價更低(雖然表示能力可能不如 LSTM)ML中到處可以見到這種計算代價與表示能力之間的折中

 

三種RNN 降低Overfitting技巧介紹:

1.循環dropout

        其做法爲將某一層的輸入單元隨機設爲0,其目的是打破該層訓練數據中的偶然相關性15年《Uncertainty in deep learning》論文確定在RNN中使用dropout正確方法:對每個時間步應該使用相同的dropout掩碼(dropout mask,相同模式的捨棄單元),而不是讓dropout掩碼隨着時間步的增加而隨機變化。

         爲了對GRULSTM等循環層得到的表示做正則化,應該將不隨時間變化的dropout掩碼應用於層的內部循環激活(叫做循環dropout掩碼)。對每個時間步使用相同的dropout掩碼,可以讓網絡沿着時間正確的傳播其學習誤差,而隨着時間隨機變化的dropout掩碼則會破壞這個誤差信號,並且不利於學習過程。Keras 的每個循環層都有兩個與 dropout 相關的參數: 一是 dropout,它是一個浮點數,指定該層輸入單元的 dropout 比率; 二是 recurrent_dropout,指定循環單元的 dropout 比率。

 

2.循環層堆疊:

        再次複習一下ML通用工作流程:增加網絡容量通常是一個好主意,直到過擬合變成主要的障礙(假設已經採取基本步驟來降低過擬合,比如使用dropout)。只要過擬合不是太嚴重,很可能是容量不足的問題

         增加網絡容量的通常做法是增加每層單元數或增加層數循環層堆疊(recurrent layer stacking)是構建更加強大的循環網絡的經典方法。例如谷歌翻譯算法就是7個大型LSTM層的堆疊。在keras中逐個堆疊循環層,所有中間層都應該返回完整的輸出序列(一個3D張亮),而不是隻返回最後一個時間步的輸出,通過指定return_sequences=True來實現。

 

3.使用雙向/bidirectional  RNN

        雙向RNN是一種常見的RNN變體,它在某些任務上的性能比普通RNN更好,通常用於NLP

         RNN 特別依賴於順序或時間RNN 按順序處理輸入序列的時間步,而打亂時間步或反轉時間步會完全改變 RNN 從序列中提取的表示。正是由於這個原因,如果順序對問題很重要(比如溫度預測問題)RNN 的表現會很好。雙向 RNN 利用了 RNN 的順序敏感性:它包含兩個普通 RNN,比如 GRU 層和 LSTM 層,每個 RN 分別沿一個方向對輸入序列進行處理(時間正序和時間逆序),然後將它們的表示合併在一起。通過沿這兩個方向處理序列,雙向 RNN 能夠捕捉到可能被單向 RNN 忽略的模式,其工作原理如下:

         GRU 層通常更善於記住最近的數據,而不是久遠的數據, 與更早的數據點相比,更靠後的天氣數據點對問題自然具有更高的預測能力(這也是基於常識的基準方法非常強大的原因)。在機器學習中,如果一種數據表示不同但有用,那麼總是值得加以利用,這種表示與其他表示的差異越大越好,它們提供了查看數據的全新角度,抓住了數據中被其他方法忽略的內容,因此可以提高模型在某個任務上的性能。

         雙向 RNN 正是利用這個想法來提高正序 RNN 的性能。如果時間順序對數據很重要,那麼循環網絡是一種很適合的方法,與那些先將時間數據展平的模型相比,其性能要更好。

+++++++面對市場時,過去的表現並不能很好地預測未來的收益+++++++++

 

~~~~~~~~~~用1D Convent 處理序列~~~~~~~~~~~

         卷積神經網絡(convnet)在計算機視覺上表現出色:原因 在於它能夠進行卷積運算,從局部輸入圖塊中提取特徵,並能夠將表示模塊化,同時可以高效地利用數據。這些性質讓卷積神經網絡在計算機視覺領域表現優異,同樣也讓它對序列處理特 別有效。時間可以被看作一個空間維度,就像二維圖像的高度或寬度。一維卷積神經網絡[與空洞卷積核(dilated kernel)一起使用]已經在音頻生成和機器翻譯領域取得了巨大成功。

          二維卷積是從圖像張量中提取二維圖塊並對每個圖塊應用相同的變 換;一維卷積可以識別序列中的局部模式,因爲對每個序列段執行相同的輸入變換,所以在句子中某個位置學到的模式稍後可以在其他位置被識別,這使得一維卷積神經網絡具有平移不變性(對於時間平移而言)。

         二維池化運算:二維平均池化和二維最大池化,在CNN用於對圖像張量進行空間下采樣。一維池化運算: 從輸入中提取一維序列段(即子序列), 然後輸出其最大值(最大池化)或平均值(平均池化)。與2D Convent一樣,該運算也是用於降低一維輸入的長度(子採樣)。兩者對比如下:

二維卷積池化:

         model.add(layers.Conv2D(128, (3, 3), activation='relu'))      

         model.add(layers.MaxPooling2D((2, 2)))

        model.add(layers.Flatten())

一維卷積池化:

         model.add(layers.Conv1D(32, 7, activation='relu'))  

         model.add(layers.GlobalMaxPooling1D())

         model.add(layers.Dense(1))

【兩者不同】一維卷積神經網絡可以使用更大的卷積窗口。對於二維卷積層, 3×3 的卷積窗口包含 3×3=9 個特徵向量; 但對於一維卷積層,大小爲 3 的卷積窗口只包含 3 個卷積向量。

         IMDB上評估1D ConventLSTM,但是在CPUGPU上的運行速度都要更快(速度取決於硬件設備配置)。在單詞級的情感分類任務上,1D Convent可以替代循環網絡,並且速度更快、計算代價 更低。

 

~~~~~~~~~~~用CNN + RNN處理長序列~~~~~~~~~~

        要想結合卷積神經網絡的速度和輕量與 RNN 的順序敏感性,一種方法是在 RNN 前面使用一維卷積神經網絡作爲預處理步驟。對於那些非常長,以至於 RNN 無法處理的序列 (比如包含上千個時間步的序列),這種方法尤其有用。CNN可以將長的輸入序列轉換爲高級特徵組成的更短序列(下采樣)。然後提取的特徵組成的這些序列成爲網絡中 RNN 的輸入。

 

~~~~~~~~~~~~怎麼選呢?~~~~~~~~~~~~~~~

        如果序列數據的整體順序很重要,那麼最好使用循環網絡來處理。時間序列通常都是最近的數據可能比久遠的數據包含更多的信息量。可以用 RNN 進行時間序列迴歸(“預測未來”)、時間序列分類、時間序列異常檢測和 序列標記(比如找出句子中的人名或日期)

         如果整體順序沒有意義,那麼1D Convent可以實現同樣好的效果,而且計算代價更小。文本數據通常都是這樣,在句首發現關鍵詞和在句尾發現關鍵詞一樣都很有意義。可用於機器翻譯(序列到序列的卷積模型,比如 SliceNet)、文檔分類和拼寫校正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章