自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文簡述循環(huán)神經(jīng)網(wǎng)絡(luò)

開發(fā) 開發(fā)工具 深度學(xué)習(xí)
什么是循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)?它們?nèi)绾芜\行?可以用在哪里呢?本文試圖回答上述這些問題,還展示了一個 RNN 實現(xiàn) demo,你可以根據(jù)自己的需要進(jìn)行擴(kuò)展。

什么是循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)?它們?nèi)绾芜\行?可以用在哪里呢?本文試圖回答上述這些問題,還展示了一個 RNN 實現(xiàn) demo,你可以根據(jù)自己的需要進(jìn)行擴(kuò)展。

循環(huán)神經(jīng)網(wǎng)絡(luò)架構(gòu)

循環(huán)神經(jīng)網(wǎng)絡(luò)架構(gòu)

基礎(chǔ)知識。Python、CNN 知識是必備的。了解 CNN 的相關(guān)知識,是為了與 RNN 進(jìn)行對比:RNN 為什么以及在哪些地方比 CNN 更好。

我們首先從「循環(huán)」(Recurrent)這個詞說起。為什么將其稱為循環(huán)?循環(huán)的意思是:

經(jīng)?;蛑貜?fù)出現(xiàn)

將這類神經(jīng)網(wǎng)絡(luò)稱為循環(huán)神經(jīng)網(wǎng)絡(luò)是因為它對一組序列輸入重復(fù)進(jìn)行同樣的操作。本文后續(xù)部分將討論這種操作的意義。

一、我們?yōu)槭裁葱枰?RNN?

也許你現(xiàn)在想的是,已經(jīng)有像卷積網(wǎng)絡(luò)這樣表現(xiàn)非常出色的網(wǎng)絡(luò)了,為什么還需要其他類型的網(wǎng)絡(luò)呢?有一個需要用到 RNN 的特殊例子。為了解釋 RNN,你首先需要了解序列的相關(guān)知識,我們先來講一下序列。

序列是相互依賴的(有限或***)數(shù)據(jù)流,比如時間序列數(shù)據(jù)、信息性的字符串、對話等。在對話中,一個句子可能有一個意思,但是整體的對話可能又是完全不同的意思。股市數(shù)據(jù)這樣的時間序列數(shù)據(jù)也是,單個數(shù)據(jù)表示當(dāng)前價格,但是全天的數(shù)據(jù)會有不一樣的變化,促使我們作出買進(jìn)或賣出的決定。

當(dāng)輸入數(shù)據(jù)具有依賴性且是序列模式時,CNN 的結(jié)果一般都不太好。CNN 的前一個輸入和下一個輸入之間沒有任何關(guān)聯(lián)。所以所有的輸出都是獨立的。CNN 接受輸入,然后基于訓(xùn)練好的模型輸出。如果你運行了 100 個不同的輸入,它們中的任何一個輸出都不會受之前輸出的影響。但想一下如果是文本生成或文本翻譯呢?所有生成的單詞與之前生成的單詞都是獨立的(有些情況下與之后的單詞也是獨立的,這里暫不討論)。所以你需要有一些基于之前輸出的偏向。這就是需要 RNN 的地方。RNN 對之前發(fā)生在數(shù)據(jù)序列中的事是有一定記憶的。這有助于系統(tǒng)獲取上下文。理論上講,RNN 有***的記憶,這意味著它們有***回顧的能力。通過回顧可以了解所有之前的輸入。但從實際操作中看,它只能回顧***幾步。

本文僅為了與人類大體相關(guān)聯(lián),而不會做任何決定。本文只是基于之前關(guān)于該項目的知識做出了自己的判斷(我甚至尚未理解人類大腦的 0.1%)。

二、何時使用 RNN?

RNN 可用于許多不同的地方。下面是 RNN 應(yīng)用最多的領(lǐng)域。

1. 語言建模和文本生成

給出一個詞語序列,試著預(yù)測下一個詞語的可能性。這在翻譯任務(wù)中是很有用的,因為最有可能的句子將是可能性***的單詞組成的句子。

2. 機(jī)器翻譯

將文本內(nèi)容從一種語言翻譯成其他語言使用了一種或幾種形式的 RNN。所有日常使用的實用系統(tǒng)都用了某種高級版本的 RNN。

3. 語音識別

基于輸入的聲波預(yù)測語音片段,從而確定詞語。

4. 生成圖像描述

RNN 一個非常廣泛的應(yīng)用是理解圖像中發(fā)生了什么,從而做出合理的描述。這是 CNN 和 RNN 相結(jié)合的作用。CNN 做圖像分割,RNN 用分割后的數(shù)據(jù)重建描述。這種應(yīng)用雖然基本,但可能性是無窮的。

5. 視頻標(biāo)記

可以通過一幀一幀地標(biāo)記視頻進(jìn)行視頻搜索。

三、深入挖掘

本文按照以下主題進(jìn)行。每一部分都是基于之前的部分進(jìn)行的,所以不要跳著讀。

  • 前饋網(wǎng)絡(luò)
  • 循環(huán)網(wǎng)絡(luò)
  • 循環(huán)神經(jīng)元
  • 基于時間的反向傳播(BPTT)
  • RNN 實現(xiàn)

1. 前饋網(wǎng)絡(luò)入門

前饋網(wǎng)絡(luò)通過在網(wǎng)絡(luò)的每個節(jié)點上做出的一系列操作傳遞信息。前饋網(wǎng)絡(luò)每次通過每個層直接向后傳遞信息。這與其他循環(huán)神經(jīng)網(wǎng)絡(luò)不同。一般而言,前饋網(wǎng)絡(luò)接受一個輸入并據(jù)此產(chǎn)生輸出,這也是大多數(shù)監(jiān)督學(xué)習(xí)的步驟,輸出結(jié)果可能是一個分類結(jié)果。它的行為與 CNN 類似。輸出可以是以貓狗等作為標(biāo)簽的類別。

前饋網(wǎng)絡(luò)是基于一系列預(yù)先標(biāo)注過的數(shù)據(jù)訓(xùn)練的。訓(xùn)練階段的目的是減少前饋網(wǎng)絡(luò)猜類別時的誤差。一旦訓(xùn)練完成,我們就可以用訓(xùn)練后的權(quán)重對新批次的數(shù)據(jù)進(jìn)行分類。

一個典型的前饋網(wǎng)絡(luò)架構(gòu)

一個典型的前饋網(wǎng)絡(luò)架構(gòu)

還有一件事要注意。在前饋網(wǎng)絡(luò)中,無論在測試階段展示給分類器的圖像是什么,都不會改變權(quán)重,所以也不會影響第二個決策。這是前饋網(wǎng)絡(luò)和循環(huán)網(wǎng)絡(luò)之間一個非常大的不同。

與循環(huán)網(wǎng)絡(luò)不同,前饋網(wǎng)絡(luò)在測試時不會記得之前的輸入數(shù)據(jù)。它們始終是取決于時間點的。它們只會在訓(xùn)練階段記得歷史輸入數(shù)據(jù)。

2. 循環(huán)網(wǎng)絡(luò)

也就是說,循環(huán)網(wǎng)絡(luò)不僅將當(dāng)前的輸入樣例作為網(wǎng)絡(luò)輸入,還將它們之前感知到的一并作為輸入。

我們試著建立了一個多層感知器。從簡單的角度講,它有一個輸入層、一個具備特定激活函數(shù)的隱藏層,最終可以得到輸出。

多層感知器架構(gòu)示例

多層感知器架構(gòu)示例

如果在上述示例中的層數(shù)增加了,輸入層也接收輸入。那么***個隱藏層將激活傳遞到下一個隱藏層上,依此類推。***到達(dá)輸出層。每一個隱藏層都有自己的權(quán)重和偏置項。現(xiàn)在問題變成了我們可以輸入到隱藏層嗎?

每一層都有自己的權(quán)重(W)、偏置項(B)和激活函數(shù)(F)。這些層的行為不同,合并它們從技術(shù)層面上講也***挑戰(zhàn)性。為了合并它們,我們將所有層的權(quán)重和偏置項替換成相同的值。如下圖所示:

現(xiàn)在我們就可以將所有層合并在一起了。所有的隱藏層都可以結(jié)合在一個循環(huán)層中。所以看起來就像下圖:

我們在每一步都會向隱藏層提供輸入。現(xiàn)在一個循環(huán)神經(jīng)元存儲了所有之前步的輸入,并將這些信息和當(dāng)前步的輸入合并。因此,它還捕獲到一些當(dāng)前數(shù)據(jù)步和之前步的相關(guān)性信息。t-1 步的決策影響到第 t 步做的決策。這很像人類在生活中做決策的方式。我們將當(dāng)前數(shù)據(jù)和近期數(shù)據(jù)結(jié)合起來,幫助解決手頭的特定問題。這個例子很簡單,但從原則上講這與人類的決策能力是一致的。這讓我非常想知道我們作為人類是否真的很智能,或者說我們是否有非常高級的神經(jīng)網(wǎng)絡(luò)模型。我們做出的決策只是對生活中收集到的數(shù)據(jù)進(jìn)行訓(xùn)練。那么一旦有了能夠在合理時間段內(nèi)存儲和計算數(shù)據(jù)的先進(jìn)模型和系統(tǒng)時,是否可以數(shù)字化大腦呢?所以當(dāng)我們有了比大腦更好更快的模型(基于數(shù)百萬人的數(shù)據(jù)訓(xùn)練出的)時,會發(fā)生什么?

另一篇文章(https://deeplearning4j.org/lstm.html)的有趣觀點:人總是被自己的行為所困擾。

我們用一個例子來闡述上面的解釋,這個例子是預(yù)測一系列字母后的下一個字母。想象一個有 8 個字母的單詞 namaskar。

namaskar(合十禮):印度表示尊重的傳統(tǒng)問候或姿勢,將手掌合起置于面前或胸前鞠躬。

如果我們在向網(wǎng)絡(luò)輸入 7 個字母后試著找出第 8 個字母,會發(fā)生什么呢?隱藏層會經(jīng)歷 8 次迭代。如果展開網(wǎng)絡(luò)的話就是一個 8 層的網(wǎng)絡(luò),每一層對應(yīng)一個字母。所以你可以想象一個普通的神經(jīng)網(wǎng)絡(luò)被重復(fù)了多次。展開的次數(shù)與它記得多久之前的數(shù)據(jù)是直接相關(guān)的。

循環(huán)神經(jīng)網(wǎng)絡(luò)的運作原理

3. 循環(huán)神經(jīng)元

這里我們將更深入地了解負(fù)責(zé)決策的實際神經(jīng)元。以之前提到的 namaskar 為例,在給出前 7 個字母后,試著找出第 8 個字母。輸入數(shù)據(jù)的完整詞匯表是 {n,a,m,s,k,r}。在真實世界中單詞或句子都會更復(fù)雜。為了簡化問題,我們用的是下面這個簡單的詞匯表。

循環(huán)神經(jīng)元

在上圖中,隱藏層或 RNN 塊在當(dāng)前輸入和之前的狀態(tài)中應(yīng)用了公式。在本例中,namaste 的字母 n 前面什么都沒有。所以我們直接使用當(dāng)前信息推斷,并移動到下一個字母 a。在推斷字母 a 的過程中,隱藏層應(yīng)用了上述公式結(jié)合當(dāng)前推斷 a 的信息與前面推斷 n 的信息。輸入在網(wǎng)絡(luò)中傳遞的每一個狀態(tài)都是一個時間步或一步,所以時間步 t 的輸入是 a,時間步 t-1 的輸入就是 n。將公式同時應(yīng)用于 n 和 a 后,就得到了一個新狀態(tài)。

用于當(dāng)前狀態(tài)的公式如下所示:

h_t 是新狀態(tài),h_t-1 是前一個狀態(tài)。x_t 是時間 t 時的輸入。在對之前的時間步應(yīng)用了相同的公式后,我們已經(jīng)能感知到之前的輸入了。我們將檢查 7 個這樣的輸入,它們在每一步的權(quán)重和函數(shù)都是相同的。

現(xiàn)在試著以簡單的方式定義 f()。我們使用 tanh 激活函數(shù)。通過矩陣 W_hh 定義權(quán)重,通過矩陣 W_xh 定義輸入。公式如下所示:

上例只將***一步作為記憶,因此只與***一步的數(shù)據(jù)合并。為了提升網(wǎng)絡(luò)的記憶能力,并在記憶中保留較長的序列,我們必須在方程中添加更多的狀態(tài),如 h_t-2、h_t-3 等。***輸出可以按測試階段的計算方式進(jìn)行計算:

其中,y_t 是輸出。對輸出與實際輸出進(jìn)行對比,然后計算出誤差值。網(wǎng)絡(luò)通過反向傳播誤差來更新權(quán)重,進(jìn)行學(xué)習(xí)。本文后續(xù)部分會對反向傳播進(jìn)行討論。

4. 基于時間的反向傳播算法(BPTT)

本節(jié)默認(rèn)你已經(jīng)了解了反向傳播概念。如果需要對反向傳播進(jìn)行深入了解,請參閱鏈接:http://cs231n.github.io/optimization-2/。

現(xiàn)在我們了解了 RNN 是如何實際運作的,但是在實際工作中如何訓(xùn)練 RNN 呢?該如何決定每個連接的權(quán)重呢?如何初始化這些隱藏單元的權(quán)重呢?循環(huán)網(wǎng)絡(luò)的目的是要準(zhǔn)確地對序列輸入進(jìn)行分類。這要靠誤差值的反向傳播和梯度下降來實現(xiàn)。但是前饋網(wǎng)絡(luò)中使用的標(biāo)準(zhǔn)反向傳播無法在此應(yīng)用。

與有向無環(huán)的前饋網(wǎng)絡(luò)不同,RNN 是循環(huán)圖,這也是問題所在。在前饋網(wǎng)絡(luò)中可以計算出之前層的誤差導(dǎo)數(shù)。但 RNN 的層級排列與前饋網(wǎng)絡(luò)并不相同。

答案就在之前討論過的內(nèi)容中。我們需要展開網(wǎng)絡(luò)。展開網(wǎng)絡(luò)使其看起來像前饋網(wǎng)絡(luò)就可以了。

展開 RNN

展開 RNN

在每個時間步取出 RNN 的隱藏單元并復(fù)制。時間步中的每一次復(fù)制就像前饋網(wǎng)絡(luò)中的一層。在時間步 t+1 中每個時間步 t 層與所有可能的層連接。因此我們對權(quán)重進(jìn)行隨機(jī)初始化,展開網(wǎng)絡(luò),然后在隱藏層中通過反向傳播優(yōu)化權(quán)重。通過向***層傳遞參數(shù)完成初始化。這些參數(shù)作為反向傳播的一部分也得到了優(yōu)化。

展開網(wǎng)絡(luò)的結(jié)果是,現(xiàn)在每一層的權(quán)重都不同,因此最終會得到不同程度的優(yōu)化。無法保證基于權(quán)重計算出的誤差是相等的。所以每一次運行結(jié)束時每一層的權(quán)重都不同。這是我們絕對不希望看到的。最簡單的解決辦法是以某種方式將所有層的誤差合并到一起。可以對誤差值取平均或者求和。通過這種方式,我們可以在所有時間步中使用一層來保持相同的權(quán)重。

5. RNN 實現(xiàn)

本文試著用 Keras 模型實現(xiàn) RNN。我們試著根據(jù)給定的文本預(yù)測下一個序列。

代碼地址:https://gist.github.com/09aefc5231972618d2c13ccedb0e22cc.git

該模型是 Yash Katariya 建的。我對該模型做了一些細(xì)微的改動以適合本文的要求。

【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號“機(jī)器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2019-11-19 08:00:00

神經(jīng)網(wǎng)絡(luò)AI人工智能

2017-11-29 13:55:55

神經(jīng)網(wǎng)絡(luò)循環(huán)神經(jīng)網(wǎng)絡(luò)RNN

2017-04-17 13:10:09

神經(jīng)網(wǎng)絡(luò)人工智能網(wǎng)絡(luò)

2020-12-08 20:20:15

神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)機(jī)器學(xué)習(xí)

2025-03-31 08:50:00

模型量化神經(jīng)網(wǎng)絡(luò)AI

2023-09-17 23:09:24

Transforme深度學(xué)習(xí)

2020-08-14 10:20:49

神經(jīng)網(wǎng)絡(luò)人工智能池化層

2019-11-06 17:00:51

深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)人工智能

2019-03-26 19:00:02

神經(jīng)網(wǎng)絡(luò)AI人工智能

2017-07-06 17:03:45

BP算法Python神經(jīng)網(wǎng)絡(luò)

2017-04-26 14:32:24

神經(jīng)網(wǎng)絡(luò)人工智能對杭樣本

2021-10-26 16:10:50

神經(jīng)網(wǎng)絡(luò)AI算法

2017-08-01 07:34:04

神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)梯度

2019-08-29 10:10:52

神經(jīng)網(wǎng)絡(luò)激活函數(shù)人工智能

2017-09-06 15:32:19

神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)硬件

2024-06-05 11:43:10

2022-10-19 07:42:41

圖像識別神經(jīng)網(wǎng)絡(luò)

2022-07-05 06:30:54

云網(wǎng)絡(luò)網(wǎng)絡(luò)云原生

2016-08-18 00:21:12

網(wǎng)絡(luò)爬蟲抓取網(wǎng)絡(luò)

2021-12-29 18:00:19

無損網(wǎng)絡(luò)網(wǎng)絡(luò)通信網(wǎng)絡(luò)
點贊
收藏

51CTO技術(shù)棧公眾號