1.2 神經網絡

此文基于周莫煩大神@莫煩的視頻,文章以及各種論文以及自己的一些心得。

1.2.1 卷積神經網絡 CNN

卷積和神經網絡

卷積神經網絡是近些年逐步興起的一種人工神經網絡結構, 因為利用卷積神經網絡在圖像和語音識別方面能夠給出更優預測結果, 這一種技術也被廣泛的傳播可應用. 卷積神經網絡最常被應用的方面是計算機的圖像識別, 不過因為不斷地創新, 它也被應用在視頻分析, 自然語言處理, 藥物發現, 等等. 近期最火的 Alpha Go, 讓計算機看懂圍棋, 同樣也是有運用到這門技術.

我們來具體說說卷積神經網絡是如何運作的吧, 舉一個識別圖片的例子, 我們知道神經網絡是由一連串的神經層組成,每一層神經層里面有存在有很多的神經元. 這些神經元就是神經網絡識別事物的關鍵. 每一種神經網絡都會有輸入輸出值, 當輸入值是圖片的時候, 實際上輸入神經網絡的并不是那些色彩繽紛的圖案,而是一堆堆的數字. 就比如說這個. 當神經網絡需要處理這么多輸入信息的時候, 也就是卷積神經網絡就可以發揮它的優勢的時候了. 那什么是卷積神經網絡呢?

圖15 卷積神經網絡

我們先把卷積神經網絡這個詞拆開來看. “卷積” 和 “神經網絡”. 卷積也就是說神經網絡不再是對每個像素的輸入信息做處理了,而是圖片上每一小塊像素區域進行處理, 這種做法加強了圖片信息的連續性. 使得神經網絡能看到圖形, 而非一個點. 這種做法同時也加深了神經網絡對圖片的理解. 具體來說, 卷積神經網絡有一個批量過濾器, 持續不斷的在圖片上滾動收集圖片里的信息,每一次收集的時候都只是收集一小塊像素區域, 然后把收集來的信息進行整理, 這時候整理出來的信息有了一些實際上的呈現, 比如這時的神經網絡能看到一些邊緣的圖片信息, 然后在以同樣的步驟, 用類似的批量過濾器掃過產生的這些邊緣信息, 神經網絡從這些邊緣信息里面總結出更高層的信息結構,比如說總結的邊緣能夠畫出眼睛,鼻子等等. 再經過一次過濾, 臉部的信息也從這些眼睛鼻子的信息中被總結出來. 最后我們再把這些信息套入幾層普通的全連接神經層進行分類, 這樣就能得到輸入的圖片能被分為哪一類的結果了.

圖16 卷積作用于圖像

我們截取一段 google 介紹卷積神經網絡的視頻, 具體說說圖片是如何被卷積的. 下面是一張貓的圖片, 圖片有長, 寬, 高 三個參數. 對! 圖片是有高度的! 這里的高指的是計算機用于產生顏色使用的信息. 如果是黑白照片的話, 高的單位就只有1, 如果是彩色照片, 就可能有紅綠藍三種顏色的信息, 這時的高度為3. 我們以彩色照片為例子. 過濾器就是影像中不斷移動的東西, 他不斷在圖片收集小批小批的像素塊, 收集完所有信息后, 輸出的值, 我們可以理解成是一個高度更高,長和寬更小的”圖片”. 這個圖片里就能包含一些邊緣信息. 然后以同樣的步驟再進行多次卷積, 將圖片的長寬再壓縮, 高度再增加, 就有了對輸入圖片更深的理解. 將壓縮,增高的信息嵌套在普通的分類神經層上,我們就能對這種圖片進行分類了.

圖17 圖片的可視化表示

池化

圖18 池化

研究發現, 在每一次卷積的時候, 神經層可能會無意地丟失一些信息. 這時, 池化 (pooling) 就可以很好地解決這一問題. 也就是說在卷集的時候, 我們不壓縮長寬, 盡量地保留更多信息, 壓縮的工作就交給池化了,這樣的一項附加工作能夠很有效的提高準確性. 有了這些技術,我們就可以搭建一個屬于我們自己的卷積神經網絡啦.

流行的CNN結構

圖19 CNN結構

比較流行的一種搭建結構是這樣, 從下到上的順序, 首先是輸入的圖片(image), 經過一層卷積層 (convolution), 然后在用池化(pooling)方式處理卷積的信息, 這里使用的是 max pooling 的方式. 然后在經過一次同樣的處理, 把得到的第二次處理的信息傳入兩層全連接的神經層 (fully connected),這也是一般的兩層神經網絡層,最后在接上一個分類器(classifier)進行分類預測.

1.2.2 循環神經網絡 RNN

序列數據

CNN的局限在于他只能接受一個指定大小的輸入,然后輸出一個指定大小的結果。不僅如此,這個模型還使用了指定好的層數。然而,RNN的核心問題就是,它能夠讓我們操作序列數據。

你可能會想,處理序列的輸入輸出很少見,但是很重要的一點是,即使你的輸入是固定的,那么用RNN來訓練也是可以的。

?我們想象現在有一組序列數據 data 0,1,2,3. 在當預測 result0 的時候,我們基于的是 data0, 同樣在預測其他數據的時候, 我們也都只單單基于單個的數據. 每次使用的神經網絡都是同一個 NN. 不過這些數據是有關聯 順序的 , 就像在廚房做菜, 醬料 A要比醬料 B 早放, 不然就串味了. 所以普通的神經網絡結構并不能讓 NN 了解這些數據之間的關聯.

圖20 序列示意圖

處理序列數據的神經網絡

圖21 RNN工作流

那我們如何讓數據間的關聯也被 NN 加以分析呢? 想想我們人類是怎么分析各種事物的關聯吧, 最基本的方式,就是記住之前發生的事情. 那我們讓神經網絡也具備這種記住之前發生的事的能力. 再分析 Data0 的時候, 我們把分析結果存入記憶. 然后當分析 data1的時候, NN會產生新的記憶, 但是新記憶和老記憶是沒有聯系的. 我們就簡單的把老記憶調用過來, 一起分析. 如果繼續分析更多的有序數據 , RNN就會把之前的記憶都累積起來, 一起分析.

圖22 S(t)與S(t+1)

我們再重復一遍剛才的流程, 不過這次是以加入一些數學方面的東西. 每次 RNN 運算完之后都會產生一個對于當前狀態的描述 , state. 我們用簡寫 S( t) 代替, 然后這個 RNN開始分析 x(t+1) , 他會根據 x(t+1)產生s(t+1), 不過此時 y(t+1) 是由 s(t) 和 s(t+1) 共同創造的. 所以我們通常看到的 RNN 也可以表達成這種樣子.

下面的圖能更清晰的解釋這個原理:

RNN 的運用

RNN 的形式不單單這有這樣一種, 他的結構形式很自由. 如果用于分類問題, 比如說一個人說了一句話, 這句話帶的感情色彩是積極的還是消極的. 那我們就可以用只有最后一個時間點輸出判斷結果的RNN.

又或者這是圖片描述 RNN, 我們只需要一個 X 來代替輸入的圖片, 然后生成對圖片描述的一段話.或者是語言翻譯的 RNN, 給出一段英文, 然后再翻譯成中文.

有了這些不同形式的 RNN, RNN 就變得強大了. 有很多有趣的 RNN 應用. 比如之前提到的, 讓 RNN 描述照片. 讓 RNN 寫學術論文, 讓 RNN 寫程序腳本, 讓 RNN 作曲. 我們一般人甚至都不能分辨這到底是不是機器寫出來的.

1.2.3 循環神經網絡 LSTM RNN

colah.github.io/posts/2015-08-Understanding-LSTMs/

RNN 的弊端

之前我們說過, RNN 是在有順序的數據上進行學習的. 為了記住這些數據, RNN 會像人一樣產生對先前發生事件的記憶. 不過一般形式的 RNN 就像一個老爺爺, 有時候比較健忘. 為什么會這樣呢?

想像現在有這樣一個 RNN, 他的輸入值是一句話: ‘我今天要做紅燒排骨, 首先要準備排骨, 然后…., 最后美味的一道菜就出鍋了’, shua ~ 說著說著就流口水了. 現在請 RNN 來分析, 我今天做的到底是什么菜呢. RNN可能會給出“辣子雞”這個答案. 由于判斷失誤, RNN就要開始學習 這個長序列 X 和 ‘紅燒排骨’ 的關系 , 而RNN需要的關鍵信息 ”紅燒排骨”卻出現在句子開頭,

圖23 RNN弊端例子

再來看看 RNN是怎樣學習的吧. 紅燒排骨這個信息原的記憶要進過長途跋涉才能抵達最后一個時間點. 然后我們得到誤差, 而且在 反向傳遞 得到的誤差的時候, 他在每一步都會 乘以一個自己的參數 W. 如果這個 W 是一個小于1 的數, 比如0.9. 這個0.9 不斷乘以誤差, 誤差傳到初始時間點也會是一個接近于零的數, 所以對于初始時刻, 誤差相當于就消失了. 我們把這個問題叫做梯度消失或者梯度彌散 Gradient vanishing. 反之如果 W 是一個大于1 的數, 比如1.1 不斷累乘, 則到最后變成了無窮大的數, RNN被這無窮大的數撐死了, 這種情況我們叫做梯度爆炸, Gradient exploding. 這就是普通 RNN 沒有辦法回憶起久遠記憶的原因.

LSTM(Long Short Term Memory)

圖24 LSTM RNN 結構圖

LSTM 就是為了解決這個問題而誕生的. LSTM 和普通 RNN 相比, 多出了三個控制器. (輸入控制, 輸出控制, 忘記控制). 現在, LSTM RNN 內部的情況是這樣.

他多了一個控制全局的記憶, 我們用粗線代替. 為了方便理解, 我們把粗線想象成電影或游戲當中的 主線劇情. 而原本的 RNN 體系就是 分線劇情. 三個控制器都是在原始的 RNN 體系上, 我們先看 輸入方面 , 如果此時的分線劇情對于劇終結果十分重要, 輸入控制就會將這個分線劇情按重要程度 寫入主線劇情 進行分析. 再看 忘記方面, 如果此時的分線劇情更改了我們對之前劇情的想法, 那么忘記控制就會將之前的某些主線劇情忘記, 按比例替換成現在的新劇情. 所以 主線劇情的更新就取決于輸入 和忘記 控制. 最后的輸出方面, 輸出控制會基于目前的主線劇情和分線劇情判斷要輸出的到底是什么.基于這些控制機制, LSTM 就像延緩記憶衰退的良藥, 可以帶來更好的結果.

更理論的論述如下:

標準的RNN結構圖
LSTM結構圖

從上圖可以看出,RNN和LSTMs的結構大體是相同的,稍微不同的地方是重復模塊部分。取而代之RNN的一個神經網絡層的是四個。

LSTM的關鍵點事它具有cell state.

Cell state就像一條輸送帶。它能直接跑到鏈條的終端,對信息來說,保持不變的直接從上游傳到下游事很容易的事情。但是LSTM有能力將信息刪除或者添加進入cell state.

Gate就是一種途徑去控制信息的加入或刪除。它是由sigmoid神經元組成。因為sigmoid的輸出是在0到1之間,所以,它能衡量到底有多少的數據要進入cell state。1就代表讓所有的信息進入,0就代表全都不進去。

LSTM有三個這樣的Gate.

1. forget gate layer

對于LSTM來說,第一步就是決定什么樣的信息我們要從cell state中舍棄。

它是由sigmoid神經元組成。因為sigmoid的輸出是在0到1之間,所以,它能衡量到底有多少的數據要從cell state忘記。1就代表讓所有的信息記住,0就代表全部忘記。

2. input gate layer

第二步,就要決定什么樣的新信息要存在cell state當中。這個由兩部分組成,第一部分是由sigmoid層決定什么信息我們要更新,第二部分是由tanh層生成一個新信息的向量,來加入到state當中去。

所以到目前為止,我們將老的狀態乘以ft, 也就是forget gate計算得出來多少以前的數據要留下來,然后加上新的多少的數據要記住,即it*Ct,如下圖:

3. output gate layer

最后,我們要決定我們要輸出什么。這個輸出將基于當前的cell state,但是必須是一個過濾的版本。首先,我們用sigmoid層來決定有多少的信息我們將輸出,然后,我們將cell state通過tanh層(目的是將值壓縮到-1到1之間),最后將sigmoid的輸出乘以tanh的結果就是我們最終的輸出內容。

總的來說,cell state是一條主線,會一直延續下去,但是output gate的輸出只是作為下一層的輸入,所以稱為分線。

1.2.4 RNN應用:Character-Level Language Models

karpathy.github.io/2015/05/21/rnn-effectiveness/

我們現在將在一個有趣的應用程序:這將訓練RNN字符級語言模型。也就是說,我們將給RNN一個巨大的文本塊,并要求它模擬下一個字符在給定一系列先前字符的序列中的概率分布。這將允許我們一次生成一個字符的新文本。

作為一個工作實例,假設我們只有四個可能的字母“helo”的詞匯,并且希望在訓練序列“hello”上訓練RNN。該訓練序列實際上是4個單獨的訓練樣本的來源:1.“e”的概率應該可能給定為“h”的上下文,2.“l”應該可能在“he”的上下文中,3 。“l”也應該是給定“hel”的上下文,最后4.“o”應該可能給出“hell”的上下文。

具體地,我們將使用1-of-k編碼(即,除了在詞匯中的字符的索引處的單個字符之外的所有零)將每個字符編碼到向量中,并且一次一個地將它們饋送到RNN,使用step功能。然后我們將觀察4維輸出向量的序列(每個字符一維),我們將其解釋為RNN當前分配給序列中下一個字符的每個字符的置信度。如圖:

例如,我們看到在第一時間步驟中,當RNN看到字符“h”時,其分配到下一個字母是“h”的置信度為1.0,到字母“e”是2.2,到“l”是-3.0,到“o”是4.1。因為在我們的訓練數據(字符串“hello”)下一個正確的字符是“e”,我們想增加其置信度(綠色),降低所有其他字母(紅色)的置信度。類似地,我們在4個時間步長中的每一個都有一個期望的目標字符,我們希望網絡分配更大的置信度。由于RNN完全由可微分操作組成,我們可以運行反向傳播算法(這只是來自微積分的鏈式規則的遞歸應用),以找出在什么方向我們應該調整每一個權重以增加正確目標的分數(綠色粗體數字)。然后,我們可以執行參數更新,其在該梯度方向上微調每個重量很小的量。如果我們在參數更新之后向RNN饋送相同的輸入,我們將發現正確字符的分數(例如,第一時間步長中的“e”)將稍高(例如2.3而不是2.2),并且分數不正確的字符會稍微降低。然后,我們重復這個過程多次,直到網絡收斂,其預測最終與訓練數據一致,因為正確的字符總是預測下一步。

在測試時,我們將一個字符饋入RNN,并獲得可能接下來的字符的分布。我們從這個分布中采樣,并立即喂它以獲得下一個字母。重復這個過程。

1.2.5 自編碼 Auto Encoder

壓縮與解壓

圖25 AutoEncoder

有一個神經網絡, 它在做的事情是接收一張圖片, 然后給它打碼, 最后再從打碼后的圖片中還原. 太抽象啦? 行, 我們再具體點.

圖26 AutoEncoder對應的神經網絡結構圖

假設剛剛那個神經網絡是這樣, 對應上剛剛的圖片, 可以看出圖片其實是經過了壓縮,再解壓的這一道工序. 當壓縮的時候, 原有的圖片質量被縮減, 解壓時用信息量小卻包含了所有關鍵信息的文件恢復出原本的圖片. 為什么要這樣做呢?

圖27 AutoEncoder原理圖

原來有時神經網絡要接受大量的輸入信息, 比如輸入信息是高清圖片時, 輸入信息量可能達到上千萬, 讓神經網絡直接從上千萬個信息源中學習是一件很吃力的工作. 所以, 何不壓縮一下, 提取出原圖片中的最具代表性的信息, 縮減輸入信息量, 再把縮減過后的信息放進神經網絡學習. 這樣學習起來就簡單輕松了. 所以, 自編碼就能在這時發揮作用. 通過將原數據白色的X 壓縮, 解壓 成黑色的X, 然后通過對比黑白 X ,求出預測誤差, 進行反向傳遞, 逐步提升自編碼的準確性. 訓練好的自編碼中間這一部分就是能總結原數據的精髓. 可以看出, 從頭到尾, 我們只用到了輸入數據 X, 并沒有用到 X 對應的數據標簽, 所以也可以說自編碼是一種非監督學習. 到了真正使用自編碼的時候. 通常只會用到自編碼前半部分.

編碼器 Encoder

圖28 編碼器

這部分也叫作 encoder 編碼器. 編碼器能得到原數據的精髓, 然后我們只需要再創建一個小的神經網絡學習這個精髓的數據,不僅減少了神經網絡的負擔, 而且同樣能達到很好的效果.

圖29 PCA vs Encoder


這是一個通過自編碼整理出來的數據, 他能從原數據中總結出每種類型數據的特征, 如果把這些特征類型都放在一張二維的圖片上, 每種類型都已經被很好的用原數據的精髓區分開來. 如果你了解 PCA 主成分分析, 再提取主要特征時, 自編碼和它一樣,甚至超越了 PCA. 換句話說, 自編碼 可以像 PCA 一樣給特征屬性降維.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 姓名:周雪寧 學號:1702110196 轉載:https://mp.weixin.qq.com/s/Si2jtA...
    周雪寧閱讀 6,091評論 0 13
  • 生活總是向與人們心背離的方向發展著,人們看似越是咬牙堅持著不用面對的,其實是內心向往,但是和生活不符的,就像...
    我叫雷歐我姓雷閱讀 219評論 0 1
  • amiibo無限刷 打開系統設置-systerm 選擇時間 Date and Time 把Synchronize...
    c061fdc62218閱讀 1,098評論 0 0
  • 今天我看到了那句老公這個稱呼時… 我發現其實自己知道結果會是這樣但為什么自己還要堅持,放不下 只會越來越痛越來越放...
    Emilybb閱讀 218評論 0 0