在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于Keras實現雙向LSTM,可視化其注意力機制

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-10-04 10:11 ? 次閱讀

編者按:Datalogue的Zafarali Ahmed介紹了RNN和seq2seq的概念,基于Keras實現了一個雙向LSTM,并可視化了它的注意力機制。

循環神經網絡(RNN)在翻譯(谷歌翻譯)、語音識別(Cortana)和語言生成領域取得了巨大的成功。在Datalogue,我們處理大量的文本數據,我們很有興趣幫助社區理解這一技術。

在這篇教程中,我們將基于Keras編寫一個RNN,將“November 5, 2016”、“5th November 2016”這樣的日期表達轉換為標準格式(“2016–11–05”)。具體來說,我們希望獲得一些神經網絡是如何做到這些的直覺。我們將利用注意力概念生成一份類似下圖的映射,揭示哪些輸入字符在預測輸出字符上起著重要作用。

教程概覽

我們將從一些技術背景材料開始,接著編程模型!在教程中,我會提供指向更高級內容的鏈接。

如果你想要直接查看代碼:

請訪問GitHub:datalogue/keras-attention

你需要了解

如果你想直接跳到本教程的代碼部分,你最好熟悉Python和Keras。你應該熟悉下線性代數,畢竟神經網絡不過是應用了非線性的一些權重矩陣。

下面我們將解釋RNN和seq2seq(序列到序列)模型的直覺。

循環神經網絡(RNN)

RNN是一個應用同一變換(稱為RNN單元或步驟)至一個序列的每個元素的函數。RNN層的輸出是RNN單元應用至序列的每個元素后的輸出。在文本情形下,這些通常是后續的單詞或字符。此外,RNN單元維護內部記憶,總結了目前為止所見序列的歷史。

RNN層的輸出是一個編碼序列h,可以處理該序列,也可以將它傳給另一個網絡。RNN的輸入和輸出極為靈活:

多對一:使用完整的輸入序列做出單個預測h。

一對多:轉換單個輸入以生成序列h。

多對多:轉換整個輸入序列至另一個序列。

理論上,訓練數據的序列長度不用一樣。在實踐中,我們補齊或截斷序列得到相同長度,以利用TensorFlow的靜態計算圖的優勢。

我們將重點關注第三種RNN,“多對多”,也稱為序列到序列(seq2seq)。

由于訓練中梯度計算的不穩定性,RNN很難學習長序列。為了解決這一問題,可以將RNN單元替換為門控單元,比如門控循環單元(GRU)或長短時記憶網絡(LSTM)。如果你想了解更多LSTM和門控單元,我強烈推薦Christopher Olah的博客(我就是從這篇開始理解RNN單元的)。從現在開始,當我們談論RNN的時候,我們指的是門控單元。

seq2seq一般框架:編碼器-解碼器設定

幾乎所有處理seq2seq問題的神經網絡都涉及:

編碼輸入序列為某種抽象表示。

處理這一編碼。

解碼至目標序列。

編碼器和解碼器可以是任意種類的神經網絡組合。在實踐中,大多數人編碼器和解碼器都使用RNN。

上圖顯示了一個簡單的編碼器-解碼器設定。編碼步驟通常生成向量序列h,對應輸入數據中的字符序列x。在一個RNN編碼器中,通過納入之前向量序列的信息生成每個向量。

在將h傳給解碼器之前,我們可以先處理一番。例如,我們也許選擇只使用最后的編碼(如下圖所示),因為理論上它是整個序列的總結。

直觀地說,這類似總結整個輸入數據為單個表示,接著嘗試加以解碼。盡管對于情緒檢測這樣的分類問題(多對一),總結狀態可能已經具備足夠信息,對于翻譯之類的問題,僅僅使用總結狀態可能不夠,需要考慮隱藏狀態的完整序列。

然而,人類不是這么翻譯日期的:我們并不讀取整個文本,然后單獨寫下每個字符的翻譯。從直覺上說,一個人會整體理解一組字符“Jan”對應一月,“5”對應日期,“2016”對應年。如前所述,這一想法是RNN可以捕捉的注意,并且成功用于圖像說明生成(Xu等. 2015),語音識別(Chan等. 2015),還有機器翻譯(Bahdanau等. 2014)。最重要的是,它們生成可解釋的模型。

上面提到的圖像說明生成論文展示了一個注意力機制如何工作的可視化例子。在女孩和泰迪熊的復雜例子中,我們看到,生成單詞“girl”(女孩)時,注意力機制成功地聚焦女孩,而不是泰迪熊!相當聰明。這不僅可以生成效果很好的可視化圖像,同時便于作者診斷模型中的問題。

SpaCy的創造者寫了一篇編碼器-注意-解碼器范式的深度概覽:Embed, encode, attend, predict: The new deep learning formula for state-of-the-art NLP models。如果你想了解其他改動RNN的方式,可以參考Distill上的Attention and Augmented Recurrent Neural Networks。

這篇教程將介紹使用單個雙向LSTM作為編碼器和注意解碼器。更具體地說,我們將實現Bahdanau等在2014年發表的Neural machine translation by jointly learning to align and translate論文中提出的模型的簡化版本。我會講解部分數學,但如果你想了解細節,我邀請你閱讀論文的附錄。

現在我們已經了解了RNN這一概念,以及注意力機制背后的直覺,讓我們開始學習如何實現這一模型,接著取得一些漂亮的可視化結果。后續小節所有的代碼都可以在本文開頭給出的GitHub倉庫(datalogue/keras-attention)中找到,/models/NMT.py為模型的完整實現。

編碼器

Keras自帶了RNN(LSTM)實現,可以通過以下方式調用:

BLSTM = Bidirectional(LSTM(encoder_units, return_sequences=True))

encoder_units參數是權重矩陣的大小。return_sequences=True表示我們需要完整的編碼序列,而不僅僅是最終總結狀態。

我們的BLSTM將接受輸入序列x=(x1,...,xT)中的字符作為輸入,并輸出編碼序列h=(h1,...,hT),其中T為日期的字符數。注意這和Bahdanau等論文有點不一樣,原論文中句子以單詞而不是字符為單位。我們也不像原論文那樣把編碼序列叫做注釋(annotations)。

解碼器

下面到了有趣的部分:解碼器。對序列t處的任意給定字符,解碼器接受編碼序列h=(h1,...,hT)、之前的隱藏狀態st-1(和解碼器單元共享)、字符yt-1。我們的解碼器層將輸出y=(y1,...,yT)(標準化日期中的字符)。上圖總結了我們的整體架構。

等式

如前所示,解碼器相當復雜。所以讓我們將它分解為嘗試預測字符t的解碼器單元執行的步驟。在下式中,大寫字母變量表示可訓練參數(注意,為了簡明,我省去了偏置項)。

根據編碼序列和解碼器單元的內部隱藏狀態st-1,計算注意概率α=(α1,…,αT)。

計算上下文向量,即帶關注概率的編碼序列加權和。直觀地說,這一向量總結了不同編碼字符在預測第t個字符上的作用。

我們接著更新隱藏狀態。如果你熟悉LSTM單元的等式,這些也許會喚起你的回憶,重置門r,更新門z,以及提議狀態。st-1用于創建提議隱藏狀態。更新門控制在新的隱藏狀態st中包括多少提議。(沒有頭緒?看這篇逐步講解LSTM的文章)

根據上下文向量、隱藏狀態、之前字符,使用一個簡單的單層神經網絡計算第t個字符。相比原論文,這里做了一點改動,原論文用了一個maxout層。這一改動是因為我們想要讓模型盡可能地簡單。

上面的這些等式應用于編碼序列中的每個字符,以生成解碼序列y,該序列表示每個位置出現某個轉譯字符的概率。

代碼

models/custom_recurrent.py實現了我們的定制層。這一部分比較復雜,因為我們需要對整個編碼序列進行處理。多思考一下能幫助你看懂代碼。我保證,如果你一邊看等式,一邊看代碼,會容易不少。

最低限度的定制Keras層需要實現這些方法:__init__,compute_output_shape,build,call。出于完整性考慮,我們也實現了get_config,這讓我們可以很容易地重新加載模型到內存之中。此外,Keras循環層實現了step方法,包括單元中的所有計算。

下面我們首先分步講解下樣板代碼:

__init__是在初始化層時調用的方法。它設定將逐漸用于初始化權重、正則化、限制的函數。由于我們的層輸出是序列,我們硬編碼了self.return_sequences=True。

build是在運行Model.compile(…)時調用的方法。由于我們的模型相當復雜,你可以看到這里初始化了一大堆權重。self.add_weight調用自動處理初始化權重,并將權重設為模型的可訓練參數。下標為a的權重用于計算上下文向量(第1步和第2步)。下標為r、z、p的權重用于計算第3步的新隱藏狀態。最后,下標為o的權重將計算層輸出。

我們還實現了一些輔助函數:compute_output_shape為任意給定輸入計算輸出形狀;get_config讓我們從保存文件中加載模型(完成訓練之后)。

現在讓我們來看單元邏輯:

默認情況下,單元的每次執行只具備上一時步的信息。由于我們需要訪問單元內的完整編碼序列,我們需要將它保存在某處。

def call(self, x):

# 儲存完整序列

self.x_seq = x

# 對序列的時間維度應用一個密集層。

# 由于它不依賴任何之前的步驟,

# 我們可以在這里應用,以節省計算時間:

self._uxpb = _time_distributed_dense(self.x_seq, self.U_a, b=self.b_a,

input_dim=self.input_dim,

timesteps=self.timesteps,

output_dim=self.units)

return super(AttentionDecoder, self).call(x)

下面我們將講解代碼最重要的部分,執行單元邏輯的step函數。回憶一下,step應用于輸入序列的每個元素。

def step(self, x, states):

# 獲取上一時步的元素

ytm, stm = states

## ## ## ## ## ## ## ## ##

# 等式 1

# > 重復隱藏狀態至序列長度

_stm = K.repeat(stm, self.timesteps)

# > 權重矩陣乘以

# 重復隱藏狀態

_Wxstm = K.dot(_stm, self.W_a)

# > 計算未歸一化的概率

et = K.dot(activations.tanh(_Wxstm + self._uxpb),

K.expand_dims(self.V_a))

## ## ## ## ## ## ## ## ##

# 等式 2

at = K.exp(et)

at_sum = K.sum(at, axis=1)

at_sum_repeated = K.repeat(at_sum, self.timesteps)

# 向量 (batch大小, 時步, 1)

at /= at_sum_repeated

## ## ## ## ## ## ## ## ##

# 等式 3

context = K.squeeze(

K.batch_dot(at,

self.x_seq,

axes=1),

axis=1)

# ~~~> 計算新隱藏狀態

# 等式 4 (重置門)

rt = activations.sigmoid(

K.dot(ytm, self.W_r)

+ K.dot(stm, self.U_r)

+ K.dot(context, self.C_r)

+ self.b_r)

# 等式 5 (更新門)

zt = activations.sigmoid(

K.dot(ytm, self.W_z)

+ K.dot(stm, self.U_z)

+ K.dot(context, self.C_z)

+ self.b_z)

# 等式 6 (提議狀態)

s_tp = activations.tanh(

K.dot(ytm, self.W_p)

+ K.dot((rt * stm), self.U_p)

+ K.dot(context, self.C_p)

+ self.b_p)

# 等式 7 (新隱藏狀態)

st = (1-zt)*stm + zt * s_tp

# 等式 8

# 出現每個字符的概率

yt = activations.softmax(

K.dot(ytm, self.W_o)

+ K.dot(st, self.U_o)

+ K.dot(context, self.C_o)

+ self.b_o)

# 方便我們返回

# 可視化注意的開關

if self.return_probabilities:

return at, [yt, st]

else:

return yt, [yt, st]

在這個單元中,我們想要訪問從states獲得的之前字符ytm和隱藏狀態stm(代碼第4行)。

我們在第11-18行實現了等式1的一個版本,一次性計算序列中的所有字符。

在第24-28行我們以向量形式為整個序列實現了等式2. 使用repeat讓我們可以根據各自的總和劃分每個時步。

為了計算上下文向量,我們要記得self.x_seq和at有一個“batch維度”,因此我們需要使用batch_dot以免在那個維度上相乘。squeeze操作不過是移除殘留維度。(代碼第33-37行。)

之后的代碼是等式4-8的比較直接的實現。

現在我們需要一點先見之明,我們想要計算文章開頭那樣酷炫的注意映射,所以需要一個切換開關。

訓練

數據

Faker庫可以生成虛假日期,我用這個庫生成了日期,并用Babel庫生成不同語言和格式的日期(借鑒了rasmusbergpalm/normalization的做法)。如果你想要了解細節,我邀請你直接去看data/generate.py中的代碼(歡迎改進)。

這個腳本同時生成了轉換字符至整數的詞匯表,以便神經網絡理解字符。data/reader.py腳本可以讀取數據,并為神經網絡準備數據。

模型

如前所述,我們實現的模型見models/NMT.py。你可以通過python run.py運行這個模型(我設定了一些默認參數,詳見Readme)。我建議在GPU上訓練模型,因為在CPU上訓練會比較慢。

如果你想要跳過訓練部分,那我在weights/中提供了一些權重。

可視化

visualizer.py是可視化部分的代碼,兩次加載權重:一次用于預測模型,一次用于獲取概率。

from models.NMT import simpleNMT

predictive_model = simpleNMT(...)

predictive_model.load_weights(..., return_probabilities=False)

probability_model = simpleNMT(..., return_probabilities=True)

probability_model.load_weights(...)

運行以下命令可以查看提供的命令行選項:

python visualizer.py -h

可視化例子

現在讓我們檢視下probability_model生成的關注。我們可以在y軸上看到上面的probability_model返回的轉換后日期。在x軸上則是我們的輸入日期。下圖顯示了在預測y軸上的輸出字符時用到了哪些x軸上的輸入字符。顏色越淡,字符的權重越高。

下面是一些我覺得相當有趣的例子。

毫不在意星期幾這樣的無關信息:

下面則是一個轉換錯誤的例子,因為我們提交的樣本的順序不合常規:“January 2016 05”被轉換成“2016–01–02”,而不是“2016–01–05”。

我們可以看到,模型將2016的“20”錯誤地解讀為幾號,不過這一激活很薄弱,部分甚至和實際日期“5”的激活相當。這給我們提供了如何更好地訓練模型的洞見。

結語

我希望這篇教程能讓你了解如何從頭到尾求解一個機器學習問題。此外,我也希望它有助于你嘗試可視化用于seq2seq問題的循環神經網絡。如果我遺漏了什么,或者你發現了什么可以改進的地方,歡迎在twitter上聯系我(zafarali),或者在本文的配套代碼倉庫上提交工單。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編碼器
    +關注

    關注

    45

    文章

    3751

    瀏覽量

    136628
  • 神經網絡
    +關注

    關注

    42

    文章

    4797

    瀏覽量

    102346
  • 可視化
    +關注

    關注

    1

    文章

    1231

    瀏覽量

    21534

原文標題:可視化循環神經網絡的注意力機制

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    利用Keras實現四種卷積神經網絡(CNN)可視化

    Keras實現卷積神經網絡(CNN)可視化
    發表于 07-12 11:01

    Keras可視化神經網絡架構的4種方法

    解模型結構、激活函數、模型參數形狀(神經元數量)等keras 中有一些現成的包可以創建我們的神經網絡模型的可視化表示。前三個包可以在模型訓練之前使用(只需要定義和編譯模型);但是Tensor
    發表于 11-02 14:55

    keras可視化介紹

    , 0.24421487748622894]5 訓練過程的可視化keras + Tensorboard Tensorboard提供訓練過程可視化的功能,是通過keras的回調函數來
    發表于 08-18 07:53

    深度分析NLP中的注意力機制

    注意力機制越發頻繁的出現在文獻中,因此對注意力機制的學習、掌握與應用顯得十分重要。本文便對注意力機制
    的頭像 發表于 02-17 09:18 ?4076次閱讀

    如何使用多注意力長短時記憶進行實體屬性的情感分析

    時記憶(LSTM)的不同位置加入不同類型的注意力機制,充分利用多注意力機制的優勢,讓模型能夠從不同的角度關注句子中特定屬性的情感信息,彌補了
    發表于 05-08 17:07 ?5次下載
    如何使用多<b class='flag-5'>注意力</b>長短時記憶進行實體屬性的情感分析

    基于注意力機制的深度學習模型AT-DPCNN

    情感分析是自然語言處理領域的一個重要分支,卷積神經網絡(CNN)在文本情感分析方面取得了較好的效果,但未充分提取文本信息中的關鍵情感信息。為此,建立一種基于注意力機制的深度學習模型AT-
    發表于 03-17 09:53 ?12次下載
    基于<b class='flag-5'>注意力</b><b class='flag-5'>機制</b>的深度學習模型AT-DPCNN

    基于通道注意力機制的SSD目標檢測算法

    為提升原始SSD算法的小目標檢測精度及魯棒性,提出一種基于通道注意力機制的SSD目標檢測算法。在原始SSD算法的基礎上對高層特征圖進行全局池操作,結合通道注意力
    發表于 03-25 11:04 ?20次下載

    LSTM注意力機制相結合的機器學習模型

    置預測的影響權重不同,以及長期的歷史信息會來帶維數災難等,移動對象的位置預測面臨著嚴峻的挑戰。針對這些挑戰,在分析現有預測算法的不足的基礎上,提出了一種長短期記憶網絡(LSTM)和注意力( Attention)機制相結合的機器學
    發表于 04-08 13:51 ?7次下載
    <b class='flag-5'>LSTM</b>和<b class='flag-5'>注意力</b><b class='flag-5'>機制</b>相結合的機器學習模型

    基于深度LSTM注意力機制的金融數據預測方法

    這些問題,文中提出了基于深度LSTM注意力機制的金融數據預測模型。首先,該模型能處理復雜的金融市場數據輸入,主要是多序列的輸入;其次,該模型使用深度LSTM網絡對金融數據進行建模,解
    發表于 04-23 11:32 ?7次下載
    基于深度<b class='flag-5'>LSTM</b>和<b class='flag-5'>注意力</b><b class='flag-5'>機制</b>的金融數據預測方法

    基于注意力機制等的社交網絡熱度預測模型

    基于注意力機制等的社交網絡熱度預測模型
    發表于 06-07 15:12 ?14次下載

    基于多通道自注意力機制的電子病歷架構

    基于多通道自注意力機制的電子病歷架構
    發表于 06-24 16:19 ?75次下載

    基于注意力機制的跨域服裝檢索方法綜述

    基于注意力機制的跨域服裝檢索方法綜述
    發表于 06-27 10:33 ?2次下載

    基于注意力機制的新聞文本分類模型

    基于注意力機制的新聞文本分類模型
    發表于 06-27 15:32 ?30次下載

    計算機視覺中的注意力機制

    計算機視覺中的注意力機制 卷積神經網絡中常用的Attention 參考 注意力機制簡介與分類 注意力
    發表于 05-22 09:46 ?1次下載
    計算機視覺中的<b class='flag-5'>注意力</b><b class='flag-5'>機制</b>

    PyTorch教程11.4之Bahdanau注意力機制

    電子發燒友網站提供《PyTorch教程11.4之Bahdanau注意力機制.pdf》資料免費下載
    發表于 06-05 15:11 ?0次下載
    PyTorch教程11.4之Bahdanau<b class='flag-5'>注意力</b><b class='flag-5'>機制</b>
    主站蜘蛛池模板: 午夜性视频播放免费视频 | 九九热精品在线观看 | 67pao强力打造高清免费 | 国产午夜精品理论片在线 | 99久久久久国产精品免费 | 久草免费在线播放 | 1024国产手机视频基地 | 国产成人a | 色噜噜狠狠网站 | 亚洲国产成a人v在线观看 | 色婷婷免费视频 | 日韩中文视频 | 国产麻豆成人传媒免费观看 | 日本黄色大片免费观看 | dy天堂| 日本不卡视频一区二区 | 日本三级视频在线播放 | 37pao强力打造免费高速高清 | 免费大片黄在线观看日本 | 天堂视频在线观看 | 日本三级免费观看 | 国产精品一区二区三区四区 | www在线观看 | 农村苗族一级特黄a大片 | 国产成人精品视频一区二区不卡 | 天天射天天干天天 | 亚洲免费网 | 亚洲狠狠色丁香婷婷综合 | 51xtv成人影院 | 午夜影院在线免费 | 都市禁忌猎艳风流美妇 | 人操人爱 | 天天干一干| 一级做a爱片久久毛片 | 免费播放黄色 | 欧美一级视频免费看 | 美女扒开尿口给男人捅 | 欲色影院| 国产免费亚洲 | 性瘾高h姚蕊全文免费阅读 性做久久久久 | 精品综合久久88色鬼首页 |