1. 程式人生 > >長短期記憶(LSTM)系列_LSTM的建模方法(1)——生成式LSTM網路,Encoder-Decoder LSTM網路,CNN LSTM(LRCN)網路建模介紹

長短期記憶(LSTM)系列_LSTM的建模方法(1)——生成式LSTM網路,Encoder-Decoder LSTM網路,CNN LSTM(LRCN)網路建模介紹

導讀

文中介紹了三種LSTM的建模應用,分別是生成式LSTM網路,Encoder-Decoder LSTM網路,CNN LSTM(LRCN)網路。

大致介紹了一下每種網路的建模方法和應用場景,這裡僅做了解即可

原文連結:

生成式長短期記憶網路的介紹

生成模型

LSTM可以用作生成模型。

給定大量序列資料,例如文字文件,可以設計LSTM模型以學習語料庫的一般結構屬性,並且當給定種子輸入時,可以生成代表原始語料庫的新序列。

開發用於概括文字語料庫的模型的問題在自然語言處理領域中被稱為語言建模。語言模型可以在單詞級別工作並且學習文件中的單詞之間的概率關係,以便準確地完成句子並生成全新的句子。在最具挑戰性的語言模型中,語言模型在角色級別工作,從角色序列中學習,並一次生成一個角色的新序列。

雖然更具挑戰性,但字元級模型的附加靈活性允許生成新單詞,新增標點符號以及生成文字資料中可能存在的任何其他結構。

語言建模是迄今為止生成LSTM最常研究的應用,可能是因為使用標準資料集可以量化和比較模型效能。這種方法已被用於生成一系列有趣的語言建模問題的文字,例如:

  • 生成維基百科文章(包括標記)。
  • 生成莎士比亞等偉大作家的片段。
  • 生成技術手稿(包括標記)。
  • 生成計算機原始碼。
  • 生成文章標題。

結果的質量各不相同; 例如,標記或原始碼可能需要手動干預才能呈現或編譯。然而,結果令人印象深刻。

該方法還應用於不同的域,其中可獲得大量現有序列資訊,並且可以一次一步地生成新序列,例如:

  • 手寫生成。
  • 音樂生成。
  • 語音生成。
  • 生成式LSTM架構

    生成型LSTM實際上不是架構,它更多地是關於LSTM預測模型學習內容以及如何使用模型的觀點的變化。

    我們可以想象使用任何LSTM架構作為生成模型。在這種情況下,我們將使用簡單的Vanilla LSTM。

                                                                  用於生成模型的Vanilla LSTM架構

    用於生成模型的Vanilla LSTM架構

    在字元級語言模型的情況下,所有可能字元的字母表是固定的。一個熱編碼用於學習輸入序列和預測輸出序列。

    使用一對一模型,其中針對每個輸入時間步驟預測一步。這意味著輸入序列可能需要專門處理以便被向量化或格式化以有效地訓練監督模型。

 

編碼器 - 解碼器LSTM介紹

 

編碼器 - 解碼器LSTM是一種遞迴神經網路,旨在解決序列到序列問題,有時稱為seq2seq。

序列到序列預測問題具有挑戰性,因為輸入和輸出序列中的專案數可以變化。例如,文字翻譯和學習執行程式是seq2seq問題的例子。

 

序列到序列預測問題

序列預測通常涉及預測實值序列中的下一個值或輸出輸入序列的類標籤。

這通常被構造為一個輸入時間步長到一個輸出時間步長(例如一對一)或多個輸入時間步長到一個輸出時間步長(多對一)型別序列預測問題的序列。

存在更具挑戰性的序列預測問題型別,其將序列作為輸入並且需要序列預測作為輸出。這些被稱為序列到序列預測問題,或簡稱為seq2seq。

使這些問題具有挑戰性的一個建模問題是輸入和輸出序列的長度可能不同。假定存在多個輸入時間步長和多個輸出時間步長,則這種形式的問題被稱為多對多型別序列預測問題。

編碼器 - 解碼器LSTM架構

已證明非常有效的seq2seq預測問題的一種方法稱為編碼器 - 解碼器LSTM。

該架構由兩個模型組成:一個用於讀取輸入序列並將其編碼為固定長度向量,第二個用於解碼固定長度向量並輸出預測序列。這些模型的使用使該架構的名稱為Encoder-Decoder LSTM,專門針對seq2seq問題而設計。

                                                           編碼器 - 解碼器LSTM模型體系結構

                                            編碼器 - 解碼器LSTM模型體系結構

 

在Keras中實現編碼器 - 解碼器LSTM

編碼器 - 解碼器LSTM可以直接在Keras深度學習庫中實現。

我們可以認為模型由兩個關鍵部分組成:編碼器和解碼器。

首先,輸入序列一次向網路顯示一個編碼字元。我們需要一個編碼級別來學習輸入序列中的步驟之間的關係,並開發這些關係的內部表示。

可以使用一個或多個LSTM層來實現編碼器模型。此模型的輸出是固定大小的向量,表示輸入序列的內部表示。該層中的儲存器單元數定義了該固定大小的向量的長度。

model = Sequential()

model.add(LSTM(..., input_shape=(...)))

解碼器必須將輸入序列的學習內部表示轉換為正確的輸出序列。

一個或多個LSTM層也可用於實現解碼器模型。該模型從編碼器模型的固定大小輸出中讀取。

與Vanilla LSTM一樣,Dense層用作網路的輸出。通過將Dense層包裝在TimeDistributed包裝器中,可以使用相同的權重輸出輸出序列中的每個時間步長。

model.add(LSTM(..., return_sequences=True))

model.add(TimeDistributed(Dense(...)))

但是有一個問題。

我們必須將編碼器連線到解碼器,它們不適合。

也就是說,編碼器將產生2維輸出矩陣,其中長度由層中的儲存器單元的數量來定義。解碼器是LSTM層,其期望[樣本,時間步長,特徵]的3D輸入,以便產生由問題定義的某個不同長度的解碼序列。

如果您嘗試將這些碎片強制在一起,則會出現錯誤,指示解碼器的輸出為2D,並且需要向解碼器輸入3D。

我們可以使用RepeatVector圖層來解決這個問題。該層簡單地重複提供的2D輸入多次以建立3D輸出。

RepeatVector圖層可以像介面卡一樣使用,以將網路的編碼器和解碼器部分組合在一起。我們可以將RepeatVector配置為對輸出序列中的每個時間步重複一次固定長度向量。

model.add(RepeatVector(...))

把這些放在一起:

model = Sequential()

model.add(LSTM(..., input_shape=(...)))

model.add(RepeatVector(...))

model.add(LSTM(..., return_sequences=True))

model.add(TimeDistributed(Dense(...)))

總而言之,RepeatVector用作介面卡,以使編碼器的固定大小的2D輸出適合解碼器所期望的不同長度和3D輸入。TimeDistributed包裝器允許為輸出序列中的每個元素重用相同的輸出層。

CNN LSTM(LRCN)遞迴神經網路介紹

CNN長短期記憶網路或簡稱CNN LSTM是一種LSTM架構,專門用於具有空間輸入的序列預測問題,如影象或視訊。

CNN LSTM(LRCN)架構

CNN LSTM架構涉及使用卷積神經網路(CNN)層來對與LSTM組合的輸入資料進行特徵提取以支援序列預測。

CNN LSTM是針對視覺時間序列預測問題以及從影象序列(例如視訊)生成文字描述的應用而開發的。具體來說,問題是:

  • 活動識別:生成在一系列影象中演示的活動的文字描述。
  • 影象描述:生成單個影象的文字描述。
  • 視訊描述:生成影象序列的文字描述。

這種架構最初被稱為長期迴圈卷積網路或LRCN模型,儘管我們將使用更通用的名稱“CNN LSTM”來指代在本課程中使用CNN作為前端的LSTM。

該架構用於生成影象的文字描述的任務。關鍵是使用在具有挑戰性的影象分類任務上預先訓練的CNN,該任務被重新用作字幕生成問題的特徵提取器。

 

該體系結構還用於語音識別和自然語言處理問題,其中CNN用作音訊和文字輸入資料上的LSTM的特徵提取器。

此體系結構適用於以下問題:

  • 在其輸入中具有空間結構,例如2D結構或影象中的畫素或句子,段落或文件中的單詞的一維結構。
  • 在其輸入中具有時間結構,諸如視訊中的影象的順序或文字中的單詞,或者需要生成具有時間結構的輸出,諸如文字描述中的單詞。

                                                               卷積神經網路長短期記憶網路體系結構

                                             卷積神經網路長短期記憶網路體系結構

 

在Keras實施CNN LSTM

我們可以定義一個在Keras聯合訓練的CNN LSTM模型。

可以通過在前端新增CNN層,然後在輸出上新增具有Dense層的LSTM層來定義CNN LSTM。

將此體系結構視為定義兩個子模型是有幫助的:用於特徵提取的CNN模型和用於跨時間步驟解釋特徵的LSTM模型。

讓我們在一系列2D輸入的背景下看一下這兩個子模型,我們假設它們是影象。

CNN模型

作為複習,我們可以定義一個2D卷積網路,它由Conv2D和MaxPooling2D層組成,這些層被排列成所需深度的堆疊。

Conv2D將解釋影象的快照(例如小方塊),並且輪詢層將合併或抽象解釋。

例如,下面的片段需要讀入具有1個通道(例如黑色和白色)的10×10畫素影象。Conv2D將以2×2快照讀取影象,並輸出一個新的10×10影象解釋。MaxPooling2D將解釋彙集為2×2塊,將輸出減少到5×5合併。Flatten圖層將採用單個5×5貼圖並將其轉換為25個元素的向量,準備用於處理其他圖層,例如用於輸出預測的Dense。

cnn = Sequential()

cnn.add(Conv2D(1, (2,2), activation='relu', padding='same', input_shape=(10,10,1)))

cnn.add(MaxPooling2D(pool_size=(2, 2)))

cnn.add(Flatten())

這對於影象分類和其他計算機視覺任務是有意義的。

LSTM模型

上面的CNN模型僅能夠處理單個影象,將其從輸入畫素變換為內部矩陣或矢量表示。

我們需要跨多個影象重複此操作,並允許LSTM在輸入影象的內部矢量表示序列中使用BPTT建立內部狀態和更新權重。

在使用現有的預訓練模型(如VGG)從影象中提取特徵的情況下,可以固定CNN。CNN可能未經過訓練,我們可能希望通過將來自LSTM的錯誤反向傳播到多個輸入影象到CNN模型來訓練它。

在這兩種情況下,概念上存在單個CNN模型和一系列LSTM模型,每個時間步長一個。我們希望將CNN模型應用於每個輸入影象,並將每個輸入影象的輸出作為單個時間步驟傳遞給LSTM。

我們可以通過在TimeDistributed層中包裝整個CNN輸入模型(一層或多層)來實現這一點。該層實現了多次應用相同層的期望結果。在這種情況下,將其多次應用於多個輸入時間步驟,並依次向LSTM模型提供一系列“影象解釋”或“影象特徵”以進行處理。

model.add(TimeDistributed(...))

model.add(LSTM(...))

model.add(Dense(...))

我們現在有了模型的兩個元素; 讓我們把它們放在一起。

CNN LSTM模型

我們可以在Keras中定義CNN LSTM模型,首先定義一個或多個CNN層,將它們包裝在TimeDistributed層中,然後定義LSTM和輸出層。

我們有兩種方法可以定義相同的模型,只是在品味上有所不同。

您可以先定義CNN模型,然後將整個CNN層序列包裝在TimeDistributed層中,將其新增到LSTM模型,如下所示:

# define CNN model

cnn = Sequential()

cnn.add(Conv2D(...))

cnn.add(MaxPooling2D(...))

cnn.add(Flatten())

# define LSTM model

model = Sequential()

model.add(TimeDistributed(cnn, ...))

model.add(LSTM(..))

model.add(Dense(...))

另一種可能更容易閱讀的方法是在將CNN模型中的每個圖層新增到主模型時將其包裝在TimeDistributed圖層中。

model = Sequential()

# define CNN model

model.add(TimeDistributed(Conv2D(...))

model.add(TimeDistributed(MaxPooling2D(...)))

model.add(TimeDistributed(Flatten()))

# define LSTM model

model.add(LSTM(...))

model.add(Dense(...))

第二種方法的好處是所有層都出現在模型摘要中,因此目前是首選。