『壹』 利用神經網路進行文本分類演算法綜述(持續更新中)
傳統的文本分類一般都是使用詞袋模型/Tf-idf作為特徵+機器學習分類器來進行分類的。隨著深度學習的發展,越來越多的神經網路模型被用來進行文本分類。本文將對這些神薯漏虛經網路模型做一個簡單的介紹。
本文介紹了一種詞向量模型,雖然算不得文本分類模型,但由於其可以說是fasttext的基礎。因此也簡單提一下。
作者認為cbow和skipgram及大部分詞向量模型都沒有考慮到單詞的多態性,而簡單的將一個單詞的多種形態視為獨立的單詞。例如like的不同形式有likes,liking,liked,likes,這些單詞的意思其實是相同的,但cbow/skipgram模型卻認為這些單詞是各自獨立的,沒有考慮到其形態多樣性。
因此作者提出了一個可以有效利用單詞字元級別信息的n-gram詞向量模型,該模型是以skipgram模式實現的。例如單詞 where,其n-gram表示為<wh, whe, her, ere, re>, where。其中<>分別表示前後綴。在原始的skipgram模型中,輸入僅僅只是where的onehot向量,而在此模型中輸入則變成了<wh, whe, her, ere, re>, where的onehot編碼的加和,有效的利用了字元級別的信息,因此效果更加好。
而在loss方面,文中採用了負采樣+binary LogisticRegression的策略。即對每一個目標單詞都預測為正負中的一種。
在本文中作者提供了一數燃個基於神經網路的文本分類模型,這個模型是基於cbow的,與cbow非常類似。
和CBOW一樣,fastText模型也只有三層:輸入層、隱含層、輸出層(Hierarchical Softmax),輸入都是多個經向量表示的單詞,輸出都是一個特定的target,隱含層都是對多個詞向量的疊加平均。不同的是,CBOW的輸入是目標單詞的上下文,fastText的輸入是多個單詞及其n-gram特徵的embeding表示方式,這些特徵用來表示單個文檔;CBOW的輸入單詞被onehot編碼過,fastText的輸入特徵是被embedding過;CBOW的輸出是目標詞彙,fastText的輸出是文檔對應的類標。輸出層的實現同樣使用了層次softmax,當然如果自己實現的話,對於類別數不是很多的任務,個人認為是可以直接使用softmax的。
最後,貼一個Keras的模型fasttext簡化版。
基於詞向量表示,本文提出利用卷積神經網路來進行文本分類。其演算法如上圖所示:
在本文中,作者嘗試了多種不同的詞向量模式:
在上一篇文章中CNN網路的輸入一般是預訓練好的詞向量,而在本文中作者提出一種直接將embedding訓練與分類任務結合在一起,且能有效提取/保留詞序信息,也即有效訓練出n-gram的模型方法,其實也可以理解為一種利用CNN來進行embedding的搜碰方法。
此外,另一個問題是輸入序列長度變化問題(在上一篇文章textCNN中通過padding解決的?),在本文作者提出使用一個動態可變的pooling層來解決這個問題,使得卷積層輸出的大小是相同的。關於可變pooling其實與圖像識別中的 空間金字塔池化 (Spatial Pyramid Pooling) 是類似的。
這篇文章有點將fastText與TextCNN結合在一起的感覺,將n-gram embedding與分類任務結合在了一起進行訓練,通過CNN來進行Embedding。
Text Categorization via Region Embedding》
在本篇文章中作者提出了一個tv-embedding(即two-view embedding),它也屬於region embedding(也可以理解為ngram embedding)。這種方法與上面的bow-CNN表示相似,使用bow(bag of words)的方式來表示一個區域的詞句,然後通過某個區域(region,左右鄰域的單詞或詞句)來預測其前後的區域(單詞或詞句),即輸入區域是view1,target區域是view2。tv-embedding是單獨訓練的,在使用的時候與CNN中的embedding組合在一起(形成多個channel?)。作者認為,word2vec方法預訓練得到的embedding向量是普適性的,而通過特定任務的數據集的訓練得到tv-embedding具有任務相關的一些信息,更有利於提升我們的模型效果。
吐槽一下,這篇文章沒太看懂,也可能是英語太差,作者文章中沒有那種一眼就能讓人理解的網路圖,像textCNN的圖就非常一目瞭然,看圖就知道是怎麼做的了。
本文提出了一個使用監督學習加半監督預訓練的基於LSTM的文本分類模型。文章作者與上面相同,所以用到的很多技術可以說與上面也是同出一轍。因此簡單說下本文的一些思路。
作者認為已有的直接使用LSTM作為文本分類模型並直接將LSTM的最後一個輸出作為後續全連接分類器的方法面臨兩個問題:(1)這種方式一般都是與word embedding整合在一起(即輸入onehot經過一個embedding層再進入LSTM),但是embedding訓練不穩定,不好訓練;(2)直接使用LSTM最後一個輸出來表示整個文檔不準確,一般來說LSTM輸入中後面的單詞會在最後輸出中佔有較重的權重,但是這對於文章表示來說並不總是對的。因此作者對這兩點進行了改進:
本文其實可以看作是作者將自己前面的tv-embedding半監督訓練與RCNN的一個融合吧,大有一種一頓操作猛如虎,一看人頭0-5的感覺(因為作者的實驗結果跟一般的CNN相比其實也搶不了多少)。
本文的作者也是前面兩篇使用CNN來進行文本分類處理的文章的作者。因此在本文中,結合了前面兩篇文章提出的一些方法,並使用了一個深層的卷積神經網路。具體的細節包括:
更多詳細的關於DPCNN的細節可以查看 從DPCNN出發,撩一下深層word-level文本分類模型 。
本文提出了一種基於CNN+Attention的文本分類模型。作者認為已有的基於CNN的文本分類模型大都使用的是固定大小的卷積核,因此其學習到的表示也是固定的n-gram表示,這個n與CNN filter大小相關。但是在進行句子的語義表示時,不同句子發揮重要作用的ngram詞語常常是不同的,也即是變化的。因此,模型能根據句子來自適應的選擇每個句子最佳的n-gram對於提升模型的語義表示能力是非常關鍵的。本文便是由此思路提出了一種自適應的來選擇不同n-gram表示的模型。
本文模型在主題結構上參照了CV中的DenseNet,藉由DenseNet中的稠密連接來提取到豐富的n-gram特徵表示。舉例來說,在layer3的特徵不僅能學習到f(x1, x2, x3),還能學習到f(x1(x2,x3))這種更多層次,更加豐富的特徵。網路的結構主要包括三部分:DenseCNN主網路,Attention mole和最後的全連接層分類網路。下面對這三部分進行簡單的說明:
本文通過Dense connection + Attention來自動獲取對於文本語義最重要的n-gram特徵,結果很好。但是缺點是,這個網路比較適合較短的文本,文中對輸入文本進行了padding補齊,對於不同數據集最大長度分別為50,100等,但這對於較長的文本明顯是不足的。因此對於較長的文本或許HAN這種借用RNN來不限制輸入長短的網路會更好。
本文提出了一種結合循環神經網路(RNN)和卷積神經網路來進行文本分類的方法,其結構如上圖所示,該網路可以分為三部分:
雖然說是RNN與CNN的結合,但是其實只用到了CNN中的pooling,多少有一點噱頭的意思。文中還提到了RCNN為什麼比CNN效果好的原因,即為什麼RCNN能比CNN更好的捕捉到上下文信息:CNN使用了固定大小window(也即kernel size)來提取上下文信息,其實就是一個n-gram。因此CNN的表現很大程度上受window大小的影響,太小了會丟失一些長距離信息,太大了又會導致稀疏性問題,而且會增加計算量。
在眾多自然語言處理任務中,一個非常突出的問題就是訓練數據不足,且標注難度大。因此文本提出了一種多任務共享的RNN模型框架,其使用多個不同任務數據集來訓練同一個模型共享參數,已達到擴充數據集的作用。
文中作者提出了三個模型,如上圖所示:
三個模型的訓練方式相同:
本文提出了一個層次LSTM+Attention模型。作者認為,雖然一篇文章有多個句子組成但真正其關鍵作用的可能是其中的某幾個,因此對各個句子施加了注意力機制,以使得對文章語義貢獻較多的句子佔有更多的權重。同樣的,組成一個句子的單詞有多個,但是發揮重要作用的可能就那麼幾個,因此使用注意力機制以使得重要單詞發揮更大的作用,這些便是本文的核心思想。整個網路可分為三層,兩個LSTM層分別用來進行word encode和sentence encode,最頂上為一個全連接分類層。若加上兩層注意力層,則可認為網路為5層。下面簡單聊聊這五層網路的結構:
總體來說,本文看起來還是比較有意思的,符合人閱讀文章的習慣,我們寫文章的時候也是有中心詞和中心句的。但是由於這個層級結構是否會導致訓練慢或者不好訓練還不得而知。最後,文中還提出對文章按長短先進行排序,長度相似的進入一個batch,這將訓練速度加快了3倍。
本文提出了一個基於圖神經網路的文本分類方法。該方法的主要思想是將所有文章及其包含的詞彙都放到一個圖網路裡面去,圖網路中的節點分為兩種類型:單詞節點和文章節點。其中連接單詞節點和文章節點的邊的權重使用TF-IDF來表示,而單詞與單詞之間邊的權重則是使用點互信息(PMI)來表示。點互信息與傳統語言模型中的條件概率計算方式非常相似。只不過PMI採用的是滑窗方式而條件概率是直接在所有語料中進行統計,可以認為是將所有語料當做一個大窗口,這時就又與PMI相同了。
A表示圖網路的鄰接矩陣,表示如下:
GCN同樣也是可以含有多層隱藏層的,其各個層的計算方式如下:
其中A'為歸一化對稱鄰接矩陣, W0 ∈ R^(m×k) 為權重矩陣,ρ是激活函數,例如 ReLU ρ(x) = max(0,x) 如前所述,可以通過疊加多個GCN層來合並更高階的鄰域信息:
其中j表示層數。
損失函數定義為所有已標記文檔的交叉熵誤差:
文中提到Text GCN運行良好的原因有兩個方面:
但是其也有一些缺:
總的來說,文章的idea還是挺有意思的,效果也還不錯。初識GCN可能還是有一點難以理解,可以參考如下資料進行進一步學習:
基於圖卷積網路的文本分類演算法
如何理解 Graph Convolutional Network(GCN)?
『貳』 神經網路模型-27種神經網路模型們的簡介
【1】Perceptron(P) 感知機
【1】感知機
感知機是我們知道的最簡單和最古老的神經元模型,它接收一些輸入,然後把它們加總,通過激活函數並傳遞到輸出層。
【2】Feed Forward(FF)前饋神經網路
【2】前饋神經網路
前饋神經網路(FF),這也是一個很古老的方法——這種方法起源於50年代。它的工作原理通常遵循以下規則:
1.所有節點都完全連接
2.激活從輸入層流向輸出,無回環
3.輸入和輸出之間有一層(隱含層)
在大多數情況下,這種類型的網路使用反向傳播方法進行訓練。
【3】Radial Basis Network(RBF) RBF神經網路
【3】RBF神經網路
RBF 神經網路實際上是 激活函數是徑向基函數 而非邏輯函數的FF前饋神經網路(FF)。兩者之間有什麼區別呢?
邏輯函數--- 將某個任意值映射到[0 ,... 1]范圍內來,回答「是或否」問題。適用於分類決策系統,但不適用於連續變數。
相反, 徑向基函數--- 能顯示「我們距離目標有多遠」。 這完美適用於函數逼近和機器控制(例如作為PID控制器的替代)。
簡而言之,RBF神經網路其實就是, 具有不同激活函數和應用方向的前饋網路 。
【4】Deep Feed Forword(DFF)深度前饋神經網路
【4】DFF深度前饋神經網路
DFF深度前饋神經網路在90年代初期開啟了深度學習的潘多拉盒子。 這些依然是前饋神經網路,但有不止一個隱含層 。那麼,它到底有什麼特殊性?
在訓練傳統的前饋神經網路時,我們只向上一層傳遞了少量的誤差信息。由於堆疊更多的層次導致訓練時間的指數增長,使得深度前饋神經網路非常不實用。 直到00年代初,我們開發了一系列有效的訓練深度前饋神經網路的方法; 現在它們構成了現代機器學習系統的核心 ,能實現前饋神經網路的功能,但效果遠高於此。
【5】Recurrent Neural Network(RNN) 遞歸神經網路
【5】RNN遞歸神經網路
RNN遞歸神經網路引入不同類型的神經元——遞歸神經元。這種類型的第一個網路被稱為約旦網路(Jordan Network),在網路中每個隱含神經元會收到它自己的在固定延遲(一次或多次迭代)後的輸出。除此之外,它與普通的模糊神經網路非常相似。
當然,它有許多變化 — 如傳遞狀態到輸入節點,可變延遲等,但主要思想保持不變。這種類型的神經網路主要被使用在上下文很重要的時候——即過去的迭代結果和樣本產生的決策會對當前產生影響。最常見的上下文的例子是文本——一個單詞只能在前面的單詞或句子的上下文中進行分析。
【6】Long/Short Term Memory (LSTM) 長短時記憶網路
【6】LSTM長短時記憶網路
LSTM長短時記憶網路引入了一個存儲單元,一個特殊的單元,當數據有時間間隔(或滯後)時可以處理數據。遞歸神經網路可以通過「記住」前十個詞來處理文本,LSTM長短時記憶網路可以通過「記住」許多幀之前發生的事情處理視頻幀。 LSTM網路也廣泛用於寫作和語音識別。
存儲單元實際上由一些元素組成,稱為門,它們是遞歸性的,並控制信息如何被記住和遺忘。
【7】Gated Recurrent Unit (GRU)
【7】GRU是具有不同門的LSTM
GRU是具有不同門的LSTM。
聽起來很簡單,但缺少輸出門可以更容易基於具體輸入重復多次相同的輸出,目前此模型在聲音(音樂)和語音合成中使用得最多。
實際上的組合雖然有點不同:但是所有的LSTM門都被組合成所謂的更新門(Update Gate),並且復位門(Reset Gate)與輸入密切相關。
它們比LSTM消耗資源少,但幾乎有相同的效果。
【8】Auto Encoder (AE) 自動編碼器
【8】AE自動編碼器
Autoencoders自動編碼器用於分類,聚類和特徵壓縮。
當您訓練前饋(FF)神經網路進行分類時,您主要必須在Y類別中提供X個示例,並且期望Y個輸出單元格中的一個被激活。 這被稱為「監督學習」。
另一方面,自動編碼器可以在沒有監督的情況下進行訓練。它們的結構 - 當隱藏單元數量小於輸入單元數量(並且輸出單元數量等於輸入單元數)時,並且當自動編碼器被訓練時輸出盡可能接近輸入的方式,強制自動編碼器泛化數據並搜索常見模式。
【9】Variational AE (VAE) 變分自編碼器
【9】VAE變分自編碼器
變分自編碼器,與一般自編碼器相比,它壓縮的是概率,而不是特徵。
盡管如此簡單的改變,但是一般自編碼器只能回答當「我們如何歸納數據?」的問題時,變分自編碼器回答了「兩件事情之間的聯系有多強大?我們應該在兩件事情之間分配誤差還是它們完全獨立的?」的問題。
【10】Denoising AE (DAE) 降噪自動編碼器
【10】DAE降噪自動編碼器
雖然自動編碼器很酷,但它們有時找不到最魯棒的特徵,而只是適應輸入數據(實際上是過擬合的一個例子)。
降噪自動編碼器(DAE)在輸入單元上增加了一些雜訊 - 通過隨機位來改變數據,隨機切換輸入中的位,等等。通過這樣做,一個強制降噪自動編碼器從一個有點嘈雜的輸入重構輸出,使其更加通用,強制選擇更常見的特徵。
【11】Sparse AE (SAE) 稀疏自編碼器
【11】SAE稀疏自編碼器
稀疏自編碼器(SAE)是另外一個有時候可以抽離出數據中一些隱藏分組樣試的自動編碼的形式。結構和AE是一樣的,但隱藏單元的數量大於輸入或輸出單元的數量。
【12】Markov Chain (MC) 馬爾科夫鏈
【12】Markov Chain (MC) 馬爾科夫鏈
馬爾可夫鏈(Markov Chain, MC)是一個比較老的圖表概念了,它的每一個端點都存在一種可能性。過去,我們用它來搭建像「在單詞hello之後有0.0053%的概率會出現dear,有0.03551%的概率出現you」這樣的文本結構。
這些馬爾科夫鏈並不是典型的神經網路,它可以被用作基於概率的分類(像貝葉斯過濾),用於聚類(對某些類別而言),也被用作有限狀態機。
【13】Hopfield Network (HN) 霍普菲爾網路
【13】HN霍普菲爾網路
霍普菲爾網路(HN)對一套有限的樣本進行訓練,所以它們用相同的樣本對已知樣本作出反應。
在訓練前,每一個樣本都作為輸入樣本,在訓練之中作為隱藏樣本,使用過之後被用作輸出樣本。
在HN試著重構受訓樣本的時候,他們可以用於給輸入值降噪和修復輸入。如果給出一半圖片或數列用來學習,它們可以反饋全部樣本。
【14】Boltzmann Machine (BM) 波爾滋曼機
【14】 BM 波爾滋曼機
波爾滋曼機(BM)和HN非常相像,有些單元被標記為輸入同時也是隱藏單元。在隱藏單元更新其狀態時,輸入單元就變成了輸出單元。(在訓練時,BM和HN一個一個的更新單元,而非並行)。
這是第一個成功保留模擬退火方法的網路拓撲。
多層疊的波爾滋曼機可以用於所謂的深度信念網路,深度信念網路可以用作特徵檢測和抽取。
【15】Restricted BM (RBM) 限制型波爾滋曼機
【15】 RBM 限制型波爾滋曼機
在結構上,限制型波爾滋曼機(RBM)和BM很相似,但由於受限RBM被允許像FF一樣用反向傳播來訓練(唯一的不同的是在反向傳播經過數據之前RBM會經過一次輸入層)。
【16】Deep Belief Network (DBN) 深度信念網路
【16】DBN 深度信念網路
像之前提到的那樣,深度信念網路(DBN)實際上是許多波爾滋曼機(被VAE包圍)。他們能被連在一起(在一個神經網路訓練另一個的時候),並且可以用已經學習過的樣式來生成數據。
【17】Deep Convolutional Network (DCN) 深度卷積網路
【17】 DCN 深度卷積網路
當今,深度卷積網路(DCN)是人工神經網路之星。它具有卷積單元(或者池化層)和內核,每一種都用以不同目的。
卷積核事實上用來處理輸入的數據,池化層是用來簡化它們(大多數情況是用非線性方程,比如max),來減少不必要的特徵。
他們通常被用來做圖像識別,它們在圖片的一小部分上運行(大約20x20像素)。輸入窗口一個像素一個像素的沿著圖像滑動。然後數據流向卷積層,卷積層形成一個漏斗(壓縮被識別的特徵)。從圖像識別來講,第一層識別梯度,第二層識別線,第三層識別形狀,以此類推,直到特定的物體那一級。DFF通常被接在卷積層的末端方便未來的數據處理。
【18】Deconvolutional Network (DN) 去卷積網路
【18】 DN 去卷積網路
去卷積網路(DN)是將DCN顛倒過來。DN能在獲取貓的圖片之後生成像(狗:0,蜥蜴:0,馬:0,貓:1)一樣的向量。DNC能在得到這個向量之後,能畫出一隻貓。
【19】Deep Convolutional Inverse Graphics Network (DCIGN) 深度卷積反轉圖像網路
【19】 DCIGN 深度卷積反轉圖像網路
深度卷積反轉圖像網路(DCIGN),長得像DCN和DN粘在一起,但也不完全是這樣。
事實上,它是一個自動編碼器,DCN和DN並不是作為兩個分開的網路,而是承載網路輸入和輸出的間隔區。大多數這種神經網路可以被用作圖像處理,並且可以處理他們以前沒有被訓練過的圖像。由於其抽象化的水平很高,這些網路可以用於將某個事物從一張圖片中移除,重畫,或者像大名鼎鼎的CycleGAN一樣將一匹馬換成一個斑馬。
【20】Generative Adversarial Network (GAN) 生成對抗網路
【20】 GAN 生成對抗網路
生成對抗網路(GAN)代表了有生成器和分辨器組成的雙網路大家族。它們一直在相互傷害——生成器試著生成一些數據,而分辨器接收樣本數據後試著分辨出哪些是樣本,哪些是生成的。只要你能夠保持兩種神經網路訓練之間的平衡,在不斷的進化中,這種神經網路可以生成實際圖像。
【21】Liquid State Machine (LSM) 液體狀態機
【21】 LSM 液體狀態機
液體狀態機(LSM)是一種稀疏的,激活函數被閾值代替了的(並不是全部相連的)神經網路。只有達到閾值的時候,單元格從連續的樣本和釋放出來的輸出中積累價值信息,並再次將內部的副本設為零。
這種想法來自於人腦,這些神經網路被廣泛的應用於計算機視覺,語音識別系統,但目前還沒有重大突破。
【22】Extreme Learning Machine (ELM) 極端學習機
【22】ELM 極端學習機
極端學習機(ELM)是通過產生稀疏的隨機連接的隱藏層來減少FF網路背後的復雜性。它們需要用到更少計算機的能量,實際的效率很大程度上取決於任務和數據。
【23】Echo State Network (ESN) 回聲狀態網路
【23】 ESN 回聲狀態網路
回聲狀態網路(ESN)是重復網路的細分種類。數據會經過輸入端,如果被監測到進行了多次迭代(請允許重復網路的特徵亂入一下),只有在隱藏層之間的權重會在此之後更新。
據我所知,除了多個理論基準之外,我不知道這種類型的有什麼實際應用。。。。。。。
【24】Deep Resial Network (DRN) 深度殘差網路
【24】 DRN 深度殘差網路
深度殘差網路(DRN)是有些輸入值的部分會傳遞到下一層。這一特點可以讓它可以做到很深的層級(達到300層),但事實上它們是一種沒有明確延時的RNN。
【25】Kohonen Network (KN) Kohonen神經網路
【25】 Kohonen神經網路
Kohonen神經網路(KN)引入了「單元格距離」的特徵。大多數情況下用於分類,這種網路試著調整它們的單元格使其對某種特定的輸入作出最可能的反應。當一些單元格更新了, 離他們最近的單元格也會更新。
像SVM一樣,這些網路總被認為不是「真正」的神經網路。
【26】Support Vector Machine (SVM)
【26】 SVM 支持向量機
支持向量機(SVM)用於二元分類工作,無論這個網路處理多少維度或輸入,結果都會是「是」或「否」。
SVM不是所有情況下都被叫做神經網路。
【27】Neural Turing Machine (NTM) 神經圖靈機
【27】NTM 神經圖靈機
神經網路像是黑箱——我們可以訓練它們,得到結果,增強它們,但實際的決定路徑大多數我們都是不可見的。
神經圖靈機(NTM)就是在嘗試解決這個問題——它是一個提取出記憶單元之後的FF。一些作者也說它是一個抽象版的LSTM。
記憶是被內容編址的,這個網路可以基於現狀讀取記憶,編寫記憶,也代表了圖靈完備神經網路。
『叄』 神經網路、流形和拓撲
譯者:樹石
最近,由於在諸如計算機視覺領域取得了突破性成果,深層神經網路引起了廣泛的關注和興趣。
然而,該領域仍然存在一些顧慮。比如, 要了解神經網路能夠做什麼相當具有挑戰性 。如果一個網路被訓練得很好,輸出高品質的結果,但了解它是如何做到的具有挑戰性。如果網路出現故障,也很難理解什麼地方出了錯。
雖然通常理解深層神經網路的行為比較困難, 探索低維度深層神經網路相對容易的多 ——在每一層只有幾個神經元的網路。事實上,我們可以通過創建可視化效果來理解網路的行為和對網路的培訓。這種方法將讓我們 獲取對神經網路行為的深層直覺,並觀察到神經網路和拓撲學之間的聯系 。
另外,還探討了一些有趣的事情,包括對某些數據集進行分類的神經網路的最低復雜性。
讓我們從一個非常簡單的數據集開始:在一個平面上的兩條曲線。該網路將學習如何將線上的點歸類為這一個還是另外一個。
將神經網路(或任何分類演算法)的行為可視化,顯而易見的方法是簡單地看它是如何對每一個可能的數據點進行分類。
我們將先從最簡單的神經網路開始,只有一個輸入層和一個輸出層的網路。這樣的網路只是試圖通過畫一條線將兩個類數據的分離。
諸如此類的網路不是很有趣。現代神經網路一般在輸入和輸出之間,具有稱為「隱藏」層的多個層次。至少包含一個隱藏層。
與以前一樣,我們可以通過查看它對其領域不同點進行的處理來觀察這個網路的行為。數據分割通過一條曲線來完成,而不是直線。
通過神經網路的每一層,數據被轉換,創建了一個新的 表示 (represention)。我們可以看一下在這些表示中的數據以及網路是如何劃分他們的。當我們到達最後一層的表示時,網路只需要繪制一條線(或者,在更高維度里繪制一個超平面)。
在前面的可視化中,我們看到其「原始」表示的數據,你可以將其視為輸入層。現在我們將看看經過第一層轉化後,你可以認為這是我們看到了隱藏層。
每個維度對應於該層中神經元的興奮。
在上一節中所概述的方法,我們知道通過查看每層的表示來了解網路。這給了我們一個離散的表示列表。
最棘手的部分是了解我們是如何從一個表示到另一個的。值得慶幸的是,神經網路層具有很好的性能,使這一點變得很容易。
神經網路由多種不同類型的層構成。我們將談論一個具體的例子:雙曲正切層(tanh)。一個雙曲正切層tanh(Wx+b)由以下組成:
我們可以觀察到這是一個連續變換,具體如下:
這個故事和其它標准層大體相同,由一個映射變換之後單調激活函數的逐點應用。
我們可以用這種技術來了解更復雜的網路。例如,下面的網路劃分兩個被略微纏結的螺旋,使用四個隱藏層。隨著時間的推移,我們可以看到它的「原始」表示轉移到更高層次為了對數據進行分類。而螺旋最初是糾結的,最終他們是線性可分的。
另一方面,以下的網路,也是使用多個層,分類兩個螺旋沒有成功,反而更加纏結。
這里值得明確指出,這些任務將變得有些困難,如果我們使用的是低維神經網路。如果我們使用更廣泛的網路,這一切都將是相當容易的。
( Andrei Karpathy有 很好的演示 基於ConvnetJS,讓您可以互動式地瀏覽網路,就像上面的這種可視化培訓! )
每一層都會拉伸和擠壓空間,但它永遠不會切割、斷裂和褶皺它。直觀地說,我們可以看到它保留了拓撲性質。例如,一組數據將在轉化後保持連接,如果它之前是連接的(反之亦然)。
這樣的轉換,不影響拓撲結構,被稱為同胚。在形式上,他們是連續函數的雙向映射。
定理 :具有N個輸入和N個輸出的層是同胚,如果權重矩陣W是非奇異的。(雖然需要小心它的值域和范圍。)
證明 :讓我們一步步考慮:
因此,如果W所有因子都是非零的,我們的層就是同胚的。∎
這一結果始終正確,如果我們將任意多個這些層組合在一起。
考慮包含兩個類的二維數據集
![][01]
[01]: http://latex.codecogs.com/svg.latex?,A,B subsetmathbb{R}^2
A = {x | d(x,0) < 1/3}
B = {x | 2/3 < d(x,0) < 1}
如前面提到的,用一個S形函數或SOFTMAX層分類相當於試圖找到一個超平面(或在這種情況下是一條線)在最終表示中分隔A與B。只有兩個隱藏層的網路對於分離這組數據在拓撲上是無能的,並註定要失敗。
在下面的可視化圖中,我們觀察到網路訓練隱藏的表示,通過試圖使用一條直線來分類。我們可以看到,它在努力學習某種方式來做到這一點是不斷掙扎而且困難重重。
最後,它被拉到一個相當低效的擬合。雖然它實際上能夠實現〜80%分類精度。
這個例子只有一個隱藏層,但無論如何它都會失敗。
證明 :要麼每層是一個同胚,要麼該層的權重矩陣具有0因子。如果該層是同胚的,A被B所環繞,一個直線不能將它們分開。但是,假設它具有一個0因子:那麼數據集將在某些軸上崩塌。因為我們正在處理的東西同胚於原始數據集,A被B所包圍,在任一軸崩塌於意味著我們將有一些A中的點和B中的點混合,從而無法完成A與B的區分。∎
如果我們增加第三個隱藏層,問題就變得微不足道。神經網路學習以下表示:
用這個表示,我們可以用一個超平面分開數據集。
為了更好的理解這是怎麼做到的,讓我們考慮一個更簡單的一維數據集:
![][02]
[02]: http://latex.codecogs.com/svg.latex?,A=[- frac{1}{3},,frac{1}{3}]
![][03]
[03]: http://latex.codecogs.com/svg.latex?,B=[-1,- frac{2}{3}]cup[frac{2}{3},1]
如果不使用兩個或多個隱藏單元層,我們不能將此數據集進行分類。但是,如果我們使用一個帶有兩層的網路,我們就學會將數據轉化成一個很好的曲線,讓我們能用一條線將數據分開:
發生了什麼?一個隱藏單元學習當x>-1/2時興奮,另一個單元學習當x>1/2時興奮。當第一個興奮,而不是第二個時,我們知道數據屬於A。
這個假說和現實世界的數據集相關嗎,比如圖像數據?如果你認真對待流形假說,我覺得他值得思考。
流形假說是指自然數據在它的嵌入空間構成了較低維度的數據流形。同時具有理論和實驗的理由相信這一假說是真的。如果你相信這一點,那麼分類演算法的任務是從根本上分離一堆糾結的流形。
在前面的例子中,一個類完全被另一個類包圍。然而,這似乎並不可能,比如狗的圖像流形完全被貓的圖像流形包圍。因為我們將在下一節中看到其他更合理的拓撲情況。
另一個有趣的數據集要考慮的是兩個鏈接的tori,A和B。
就像之前的數據集,這個數據不能被分離,如果不使用n+1維,即4個維度。
鏈接在結點理論(knot theory)中被討論,拓撲學的一個領域。有時,當我們看到一個鏈接,並不能一眼看出它是否真正相連(一堆被纏結在一起的事情,但可以通過連續變形分開)。
如果僅僅使用3個層次的神經網路就能夠對其進行分類,那麼它就是一個未鏈接(unlink)。(問:理論上是否能將所有未鏈接都通過只有3個層次的網路進行分類?)
從這個結的角度看,我們通過神經網路產生的連續可視化不僅僅是一個漂亮的動畫,它是解開鏈接的程序。在拓撲學中,我們把它稱為原始鏈接和分離環之間一個環境同痕(an ambient isotopy)。
形式上,流形A和B之間的一個環境同痕是一個連續函數F:[0,1]× X→Y,使得每個Ft是一個從X到它自己范圍的同胚,F0是一個標識函數,並F1是從A到B的一個映射。也就是,Ft是從A到自身的映射到從A到B的映射的連續轉換。
定理 :在輸入和網路層之間具有環境同痕,如果:
證明 :同樣,我們分別考慮網路的每個階段:
我想這也許是十分有趣的,通過程序自動發現這樣的環境同痕並自動證明某些鏈接的等價性,或者某些環節是可分離的。這將很有趣知道,如果神經網路是否可以各種情況。
(顯然,確定結點是否重要是一個NP,這不太適用於神經網路。)
我們已經談到的這類鏈接,到目前為止似乎不太可能是現實世界的數據,但他們是更高維的生成。這似乎是合理的。
鏈接和結點是1維流形,但我們需要4個維度才能夠解開他們。類似地,可能需要更高維度的空間,以便能夠解開n維流形。所有n維流形可在2n+2維度上解開。
(我對於結點理了解不多,確實需要更多地了解維度和鏈接。如果我們知道一個流形可以被嵌入到n維空間,而不是流形的維度,我們有什麼限制? )
很自然的想法,一個神經網路試圖直接將流形從糾結盡可能薄的部分拉出。雖然這不會在任何情況下都是一個好的解決方案,但是大多情況它可以實現較高的分類准確率,到達一個誘人的最低點(local miminum)。
它試圖拉伸具有高延展性的空間,並銳化靠近中斷處。我們知道這些事情發生。壓縮的處罰,在對數據點衍生層的處罰,都是很自然的做法。
由於這些局部最小點對於解決這種拓撲問題完全無用,拓撲問題值得很好的探索。
在另一方面,如果我們只關心取得了良好的分類結果,好像我們可能並不關心。如果很小的一個數據流形的點陷入另一個流形,會是一個問題嗎?看起來我們應該能夠得到很好的分類結果,盡管有這個問題。
(我的直覺是,像這樣欺騙自己是一個壞主意:這是很難想像它不會是死路一條。特別是,針對一個局部最小很重要的優化問題,選擇這種方式不能真正解決問題,這似乎是糟糕的表現。)
我越思考標準的神經網路層 - 即用映射變換後逐點激活功能 - 我就越不抱幻想。很難想像,他們能夠很好地操縱流形。
也許這可能是有意義的,我們採用一個非常不同的層,而不是傳統的神經網路層?
非常自然的感覺是,通過一個矢量場的學習,我們希望流形移動方向:
然後再對他變形空間:
人們可以學會在固定點的矢量場(只是需要從訓練集合選取一些固定點作為錨),並以某種方式介入。上面的矢量場的形式是:
![][04]
[04]: http://latex.codecogs.com/svg.latex?,F(x)= frac{v_0f_0(x)+v_1f_1(x)}{1+f_0(x)+f_1(x)}
其中,v0和v1是矢量,F0(X)和F1(X)是n維高斯函數。這一點來自於徑向基函數(radial basis functions)的靈感。
我也開始覺得線性可分可能是一個巨大的,也可能不合理的,神經網路的需求。在某些方面,非常自然的會想到使用K-近鄰(K-NN)。然而,K-NN的成功在很大程度上取決於它所分類的數據表示(represention),因此,人們在K-NN之前,需要一種良好的表示。
作為第一個實驗中,我訓練了一些MNIST網路(兩層卷積網,沒有下降現象)到達〜1%測試誤差。然後我放棄了最後的SOFTMAX層而使用K-NN演算法,我能夠始終如一地降低0.1-0.2%的測試誤差。
不過,這並不完全覺得是正確的事情。該網路還在試圖做線性分類,但由於我們使用K-NN測試,它能夠從它所犯的錯誤中恢復一些。
K-NN有區別於相對於它的網路層次,因為會用到(1 /距離值)加權。因此,我們可以直接訓練網路K-NN分類。這可以被認為是一種「k-NN」層替SOFTMAX。
我們不希望為每個小批量數據遍歷整個訓練集,因為這將非常消耗計算資源。我認為一個很好的辦法是根據小批次的其它元素對每個小批次的元素進行分類,賦予每一個元素(1 /從分類目標的距離)的權重。
可悲的是,即使有完善的體系結構,採用K-NN只下到5-4%檢測錯誤 - 使用簡單的架構會得到更壞的結果。不過,我已經很少把努力放在高維參數上了。
不過,我真的很喜歡這個方法,因為它好像就是我們「要求」網路運行的更加合理。我們希望在同一流形的點比其它的點更加接近,相對於由一個超平面被分離的其他流形。這相對需要拉伸不同類別流形之間的空間,同時收縮每一個流形。這感覺就像是在簡化問題。
具有拓撲性質的數據,例如鏈接,可能導致無法使用低維網路進行線性分類,無論深度有多大。即使在技術上是可能的情況下,例如螺旋,也是非常具有挑戰性的。
為了使神經網路准確的分類數據,多個層次有時是必要的 。此外,傳統的神經網路層似乎並不能很好的處理流形數據;即使我們巧妙的手工設置權重,想要緊湊的表達我們想要的轉換也是非常困難的。新建層次,特別使用流形相關的機器學習,可能是有用的補充。
(這是一個發展中的研究項目。相關研究信息會在網上公布。我會很高興聽聽您對這些想法的反饋:您可以發表評論。對於錯別字,技術錯誤,或任何澄清,我們鼓勵你發一個請求在GitHub上。)
致謝
謝謝Yoshua Bengio,邁克爾·尼爾森,達里奧 Amodei,埃利安娜洛奇,雅各布斯坦哈特和Tamsyn Waterhouse的意見和鼓勵。
『肆』 BP神經網路的梳理
BP神經網路被稱為「深度學習之旅的開端」,是神經網路的入門演算法。
各種高大上的神經網路都是基於BP網路出發的,最基礎的原理都是由BP網路而來 [1] ,另外由於BP神經網路結構簡單,演算法經典, 是神經網路中應用最廣泛的一種。
BP神經網路(back propagation neural network)全稱是反向傳播神經網路。
神經網路發展部分背景如下 [2] :
為解決非線性問題,BP神經網路應運而生。
那麼什麼是BP神經網路?稍微專業點的解釋要怎麼說呢?
很喜歡 最簡單的神經網路--Bp神經網路 一文對演算法原理的解釋,語言活潑,案例簡單,由淺入深。
文中提到所謂的 AI 技術,本質上是一種數據處理處理技術,它的強大來自於兩方面:1.互聯網的發展帶來的海量數據信息;2.計算機深度學習演算法的快速發展。AI 其實並沒有什麼神秘,只是在演算法上更為復雜 [3] 。
我們從上面的定義出發來解釋BP神經網路的原理。
BP神經網路整個網路結構包含了:一層輸入層,一到多層隱藏層,一層輸出層。
一般說L層神經網路,指的是有L個隱層,輸入層和輸出層都不計算在內的 [6] 。
BP神經網路模型訓練的學習過程由信號的 正向傳播 和誤差的 反向傳播 兩個過程組成。
什麼是信號的正向傳播?顧名思義,就是結構圖從左到右的運算過程。
我們來看看結構圖中每個小圓圈是怎麼運作的。我們把小圈圈叫做神經元,是組成神經網路的基本單元。
正向傳播就是輸入數據經過一層一層的神經元運算、輸出的過程,最後一層輸出值作為演算法預測值y'。
前面正向傳播的時候我們提到權重w、偏置b,但我們並不知道權重w、偏置b的值應該是什麼。關於最優參數的求解,我們在 線性回歸 、 邏輯回歸 兩章中有了詳細說明。大致來講就是:
BP神經網路全稱 back propagation neural network,back propagation反向傳播是什麼?
反向傳播的建設本質上就是尋找最優的參數組合,和上面的流程差不多,根據演算法預測值和實際值之間的損失函數L(y',y),來反方向地計算每一層的z、a、w、b的偏導數,從而更新參數。
對反向傳播而言,輸入的內容是預測值和實際值的誤差,輸出的內容是對參數的更新,方向是從右往左,一層一層的更新每一層的參數。
BP神經網路通過先正向傳播,構建參數和輸入值的關系,通過預測值和實際值的誤差,反向傳播修復權重;讀入新數據再正向傳播預測,再反向傳播修正,...,通過多次循環達到最小損失值,此時構造的模型擁有最優的參數組合。
以一個簡單的BP神經網路為例,由3個輸入層,2層隱藏層,每層2個神經元,1個輸出層組成。
【輸入層】傳入
【第一層隱藏層】
對於 神經元而言,傳入 ,加權求和加偏置激活函數處理後,輸出 ;
對於 神經元而言,傳入 ,加權求和加偏置函數處理後,輸出 ;
輸出:
【第二層隱藏層】
對於 神經元而言,傳入 ,加權求和加偏置激活函數處理後,輸出 ;
對於 神經元而言,傳入 ,加權求和加偏置激活函數處理後,輸出 ;
輸出:
【輸出層】
對於輸出層神經元而言,輸入 ,加權求和加偏置激活函數處理後,輸出 ,輸出的是一個值
第一次運行正向傳播這個流程時隨用隨機參數就好,通過反向傳播不斷優化。因此需要在一開始對 設置一個隨機的初始值。
首先計算正向傳播輸出值 與實際值的損失 ,是一個數值。所謂反向是從右到左一步步來的,先回到 ,修正參數 。
以此類推,通過對損失函數求偏導跟新參數 ,再跟新參數 。這時又回到了起點,新的數據傳入又可以開始正向傳播了。
keras可以快速搭建神經網路,例如以下為輸入層包含7129個結點,一層隱藏層,包含128個結點,一個輸出層,是二分類模型。
神經網路反向傳播的優化目標為loss,可以觀察到loss的值在不斷的優化。
可以通過model.get_layer().get_weights()獲得每一層訓練後的參數結果。通過model.predict()預測新數據。
至此,BP神經網路的整個運算流程已經過了一遍。之前提到BP神經網路是為解決非線性問題應運而生的,那麼為什麼BP神經網路可以解決非線性問題呢?
還記得神經元里有一個激活函數的操作嗎?神經網路通過激活函數的使用加入非線性因素。
通過使用非線性的激活函數可以使神經網路隨意逼近復雜函數,從而使BP神經網路既可以處理線性問題,也可以處理非線性問題。
為什麼激活函數的使用可以加入非線性因素 [7] ?
其實邏輯回歸演算法可以看作只有一個神經元的單層神經網路,只對線性可分的數據進行分類。
輸入參數,加權求和,sigmoid作為激活函數計算後輸出結果,模型預測值和實際值計算損失Loss,反向傳播梯度下降求編導,獲得最優參數。
BP神經網路是比 Logistic Regression 復雜得多的模型,它的擬合能力很強,可以處理很多 Logistic Regression處理不了的數據,但是也更容易過擬合。
具體用什麼演算法還是要看訓練數據的情況,沒有一種演算法是使用所有情況的。
常見的前饋神經網路有BP網路,RBF網路等。
BP神經網路的一個主要問題是:結構不好設計。
網路隱含層的層數和單元數的選擇尚無理論上的指導,一般是根據經驗或者通過反復實驗確定。
但是BP神經網路簡單、易行、計算量小、並行性強,目前仍是多層前向網路的首選演算法。
[1] 深度學習開端---BP神經網路: https://blog.csdn.net/Chile_Wang/article/details/100557010
[2] BP神經網路發展歷史: https://zhuanlan.hu.com/p/47998728
[3] 最簡單的神經網路--Bp神經網路: https://blog.csdn.net/weixin_40432828/article/details/82192709
[4] 神經網路的基本概念: https://blog.csdn.net/jinyuan7708/article/details/82466653
[5] 神經網路中的 「隱藏層」 理解: https://blog.csdn.net/nanhuaibeian/article/details/100183000
[6] AI學習筆記:神經元與神經網路: https://www.jianshu.com/p/65eb2fce0e9e
[7] 線性模型和非線性模型的區別: https://www.cnblogs.com/toone/p/8574294.html
[8] BP神經網路是否優於logistic回歸: https://www.hu.com/question/27823925/answer/38460833