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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LSTM实现详解

發布時間:2025/7/25 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LSTM实现详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LSTM實現詳解

發表于2015-09-14 16:58|?5021次閱讀| 來源Apaszke Github|?3?條評論| 作者Adam Paszke

LSTM神經網絡RNN深度學習 allowtransparency="true" frameborder="0" scrolling="no" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-09-14%2F2825693%3Futm_source%3Dtuicool&type=3&count=&appkey=&title=Long%20Short%20Term%E7%BD%91%E7%BB%9C%E4%B8%80%E8%88%AC%E5%8F%AB%E5%81%9A%20LSTM%EF%BC%8C%E6%98%AF%E4%B8%80%E7%A7%8D%20RNN%20%E7%89%B9%E6%AE%8A%E7%9A%84%E7%B1%BB%E5%9E%8B%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%AD%A6%E4%B9%A0%E9%95%BF%E6%9C%9F%E4%BE%9D%E8%B5%96%E4%BF%A1%E6%81%AF%E3%80%82LSTM%20%E7%94%B1%20Hochreiter%20%26%20Schmidhuber%20(1997)%20%E6%8F%90%E5%87%BA%EF%BC%8C%E5%B9%B6%E5%9C%A8%E8%BF%91%E6%9C%9F%E8%A2%AB%20Alex%20Graves%20%E8%BF%9B%E8%A1%8C%E4%BA%86%E6%94%B9%E8%89%AF%E5%92%8C%E6%8E%A8%E5%B9%BF%E3%80%82%E7%A9%B6%E7%AB%9F%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0LSTM%EF%BC%8C%E7%94%B1%E6%AD%A4%E6%96%87%E5%B8%A6%E7%BB%99%E5%A4%A7%E5%AE%B6%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1461833888927" width="22" height="16">摘要:Long Short Term網絡一般叫做 LSTM,是一種 RNN 特殊的類型,可以學習長期依賴信息。LSTM 由 Hochreiter & Schmidhuber (1997) 提出,并在近期被 Alex Graves 進行了改良和推廣。究竟如何實現LSTM,由此文帶給大家。

前言

在很長一段時間里,我一直忙于尋找一個實現LSTM網絡的好教程。它們似乎很復雜,而且在此之前我從來沒有使用它們做過任何東西。在互聯網上快速搜索并沒有什么幫助,因為我找到的都是一些幻燈片。

幸運地是,我參加了Kaggle EEG?競賽,而且我認為使用LSTM很有意思,最后還理解了它的工作原理。這篇文章基于我的解決方案,使用的是Andrej Karpathy的char-rnn代碼,這也是我強烈推薦給大家的。

RNN誤區

我感覺有一件很重要的事情一直未被大家充分強調過(而且這也是我為什么不能使用RNN做我想做的事情的主要原因)。RNN和前饋神經網絡并沒有很大不同。最容易實現RNN的一種方法就是像前饋神經網絡使用部分輸入到隱含層,以及一些來自隱含層的輸出。在網絡中沒有任何神奇的內部狀態。它作為輸入的一部分。


RNN的整體結構與前饋網絡的結構非常相似

LSTM回顧

本節內容將僅覆蓋LSTM的正式定義。有很多其它的好博文,都詳細地描述了你該如何設想并思考這些等式。

LSTM有多種變換形式,但我們只講解一個簡單的。一個Cell由三個Gate(input、forget、output)和一個cell單元組成。Gate使用一個sigmoid激活函數,而input和cell state通常會使用tanh來轉換。LSTM 的cell可以使用下列的等式來定義:

Gates:


輸入變換:


狀態更新:


使用圖片描述類似下圖:


由于門控機制,Cell可以在工作時保持一段時間的信息,并在訓練時保持內部梯度不受不利變化的干擾。Vanilla LSTM 沒有forget gate,并在更新期間添加無變化的cell狀態(它可以看作是一個恒定的權值為1的遞歸鏈接),通常被稱為一個Constant Error Carousel(CEC)。這樣命名是因為它解決了在RNN訓練時一個嚴重的梯度消失和梯度爆炸問題,從而使得學習長期關系成為可能。

建立你自己的LSTM層

這篇教程的代碼使用的是Torch7。如果你不了解它也不必擔心。我會詳細解釋的,所以你可以使用你喜歡的框架來實現相同的算法。

該網絡將作為nngraph.gModule模塊來實現,基本上表示我們定義的一個由標準nn模塊組成的神經網絡計算圖。我們需要以下幾層:

  • nn.Identity() - 傳遞輸入(用來存放輸入數據)
  • nn.Dropout(p) - 標準的dropout模塊(以1-p的概率丟棄一部分隱層單元)
  • nn.Linear(in, out) - 從in維到out維的一個仿射變換
  • nn.Narrow(dim, start, len) - 在第dim方向上選擇一個子向量,下標從start開始,長度為len
  • nn.Sigmoid() - 應用sigmoid智能元素
  • nn.Tanh() - 應用tanh智能元素
  • nn.CMulTable() - 輸出張量(tensor)的乘積
  • nn.CAddTable() - 輸出張量的總和

輸入

首先,讓我們來定義輸入形式。在lua中類似數組的對象稱為表,這個網絡將接受一個類似下面的這個張量表。


local?inputs?=?{}
table.insert(inputs, nn.Identity()())??-- network input
table.insert(inputs, nn.Identity()())??-- c at time t-1
table.insert(inputs, nn.Identity()())??-- h at time t-1
local?input?=?inputs[1]
local?prev_c?=?inputs[2]
local?prev_h?=?inputs[3]

Identity模塊只將我們提供給網絡的輸入復制到圖中。

計算gate值

為了加快我們的實現,我們會同時運用整個LSTM層轉換。

locali2h=nn.Linear(input_size,4*rnn_size)(input)-- input to hiddenlocalh2h=nn.Linear(rnn_size,4*rnn_size)(prev_h)-- hidden to hiddenlocalpreactivations=nn.CAddTable()({i2h,h2h})-- i2h + h2h

如果你不熟悉nngraph,你也許會覺得奇怪,在上一小節我們建立的inputs屬于nn.Module,這里怎么已經用圖節點調用一次了。事實上發生的是,第二次調用把nn.Module轉換為nngraph.gModule,并且參數指定了該節點在圖中的父節點。

preactivations輸出一個向量,該向量由輸入和前隱藏狀態的一個線性變換生成。這些都是原始值,用來計算gate 激活函數和cell輸出。這個向量被分為四個部分,每一部分的大小為rnn_size。第一部分將用于in gates,第二部分用于forget gate,第三部分用于out gate,而最后一個作為cell input(因此各個gate的下標和cell數量i的輸入為{i, rnn_size+i, 2?rnn_size+i, 3?rnn_size+i})。


接下來,我們必須運用非線性,但是盡管所有的gate使用的都是sigmoid,我們仍使用tanh對輸入進行預激活處理。正因為這個,我們將會使用兩個nn.Narrow模塊,這會選擇預激活向量中合適的部分。

-- gates
localpre_sigmoid_chunk=nn.Narrow(2,1,3*rnn_size)(preactivations)
localall_gates=nn.Sigmoid()(pre_sigmoid_chunk)
-- input
localin_chunk=nn.Narrow(2,3*rnn_size+1,rnn_size)(preactivations)
localin_transform=nn.Tanh()(in_chunk) 在非線性操作之后,我們需要增加更多的nn.Narrow,然后我們就完成了gates。

localin_gate=nn.Narrow(2,1,rnn_size)(all_gates)
localforget_gate=nn.Narrow(2,rnn_size+1,rnn_size)(all_gates)
localout_gate=nn.Narrow(2,2*rnn_size+1,rnn_size)(all_gates)

Cell和hidden state

有了計算好的gate值,接下來我們可以計算當前的Cell狀態了。所有的這些需要的是兩個nn.CMulTable模塊(一個用于,一個用于),并且nn.CAddTable用于把它們加到當前的cell狀態上。

-- previous cell state contribution
localc_forget=nn.CMulTable()({forget_gate,prev_c})
-- input contribution
localc_input=nn.CMulTable()({in_gate,in_transform})
-- next cell state
localnext_c=nn.CAddTable()({
?c_forget,
?c_input
}) 最后,是時候來實現hidden 狀態計算了。這是最簡單的部分,因為它僅僅是把tanh應用到當前的cell 狀態(nn.Tanh)并乘上output gate(nn.CMulTable)。

localc_transform=nn.Tanh()(next_c)
localnext_h=nn.CMulTable()({out_gate,c_transform})

定義模塊

現在,如果你想要導出整張圖作為一個獨立的模塊,你可以使用下列代碼把它封裝起來:

-- module outputs
outputs={}
table.insert(outputs,next_c)
table.insert(outputs,next_h)

-- packs the graph into a convenient module with standard API (:forward(), :backward())
returnnn.gModule(inputs,outputs)

實例

LSTM layer實現可以在這里獲得。你也可以這樣使用它:

th> LSTM= require 'LSTM.lua'?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[0.0224s]
th> layer= LSTM.create(3, 2)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[0.0019s]
th> layer:forward({torch.randn(1,3), torch.randn(1,2), torch.randn(1,2)})
{ ?
1 : DoubleTensor - size: 1x2?
?2 : DoubleTensor - size: 1x2}?
}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[0.0005s]

為了制作一個多層LSTM網絡,你可以在for循環中請求后續層,用上一層的next_h作為下一層的輸入。你可以查看這個例子。

訓練

最后,如果你感興趣,請留個評論吧,我會試著擴展這篇文章!

結束語

確實是這樣!當你理解怎樣處理隱藏層的時候,實現任何RNN都會很容易。僅僅把一個常規MLP層放到頂部,然后連接多個層并且把它和最后一層的隱藏層相連,你就完成了。

如果你有興趣的話,下面還有幾篇關于RNN的好論文:

  • Visualizing and Understanding Recurrent Networks
  • An Empirical Exploration of Recurrent Network Architectures
  • Recurrent Neural Network Regularization
  • Sequence to Sequence Learning with Neural Networks

原文鏈接:LSTM implementation explained(編譯/劉帝偉 審校/趙屹華、朱正貴、李子健 責編/周建丁)

譯者簡介:?劉帝偉,中南大學軟件學院在讀研究生,關注機器學習、數據挖掘及生物信息領域。

鏈接:深入淺出LSTM神經網絡


1. 加入CSDN人工智能用戶微信群,交流人工智能相關技術,加微信號“jianding_zhou”或掃下方二維碼,由工作人員加入。請注明個人信息和入群需求,并在入群后按此格式改群名片:機構名-技術方向-姓名/昵稱

2. 加入CSDN 人工智能技術交流QQ群,請搜索群號加入:465538150。同上注明信息。

3. CSDN高端專家微信群,采取受邀加入方式,不懼高門檻的請加微信號“jianding_zhou”或掃描下方二維碼,PS:請務必帶上你的BIO

總結

以上是生活随笔為你收集整理的LSTM实现详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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