導航:首頁 > 網路共享 > 參數共享是一種網路正則化嗎

參數共享是一種網路正則化嗎

發布時間:2022-10-11 10:49:59

① 信息傳輸的網路類型有幾種

下面就幾種常見的網路類型及分類方法作簡單的介紹。

按網路的地理位置分類

*區域網(LocalAreaNetwork,簡稱LAN)

一般限定在較小的區域內,小於10km的范圍,通常採用有線的方式連接起來。

*城域網(MetroolisAreaNetwork,簡稱MAN)

規模局限在一座城市的范圍內,10~100km的區域。

*廣域網(WideAreaNetwork,簡稱WAN)

網路跨越國界、洲界,甚至全球范圍。

目前區域網和廣域網是網路的熱點。區域網是組成其他兩種類型網路的基礎,城域網一般都加入了廣域網。廣域網的典型代表是Internet網。

按網路的拓撲結構分類

網路的拓撲結構是指網路中通信線路和站點(計算機或設備)的幾何排列形式。

*星型網路

各站點通過點到點的鏈路與中心站相連。特點是很容易在網路中增加新的站點,數據的安全性和優先順序容易控制,易實現網路監控,但中心節點的故障會引起整個網路癱瘓。

*環形網路

各站點通過通信介質連成一個封閉的環形。環形網容易安裝和監控,但容量有限,網路建成後,難以增加新的站點。

*匯流排型網路

網路中所有的站點共享一條數據通道。匯流排型網路安裝簡單方便,需要鋪設的電纜最短,成本低,某個站點的故障一般不會影響整個網路。但介質的故障會導致網路癱瘓,匯流排網安全性低,監控比較困難,增加新站點也不如星型網容易。

樹型網、簇星型網、網狀網等其他類型拓撲結構的網路都是以上述三種拓撲結構為基礎的。

按傳輸介質分類

*有線網

採用同軸電纜和雙絞線來連接的計算機網路

同軸電纜網是常見的一種連網方式。它比較經濟,安裝較為便利,傳輸率和抗干擾能力一般,傳輸距離較短。

雙絞線網是目前最常見的連網方式。它價格便宜,安裝方便,但易受干擾,傳輸率較低,傳輸距離比同軸電纜要短。

*光纖網

光纖網也是有線網的一種,但由於其特殊性而單獨列出,光纖網採用光導纖維作傳輸介質。光纖傳輸距離長,傳輸率高,可達數千兆bs,抗干擾性強,不會受到電子監聽設備的監聽,是高安全性網路的理想選擇。不過由於其價格較高,且需要高水平的安裝技術,所以現在尚未普及。

*無線網

採用空氣作傳輸介質,用電磁波作為載體來傳輸數據,目前無線網聯網費用較高,還不太普及。但由於聯網方式靈活方便,是一種很有前途的連網方式。

區域網通常採用單一的傳輸介質,而城域網和廣域網採用多種傳輸介質。

按通信方式分類

*點對點傳輸網路:數據以點到點的方式在計算機或通信設備中傳輸。星型網、環形網採用這種傳輸方式。

*廣播式傳輸網路:數據在共用介質中傳輸。無線網和匯流排型網路屬於這種類型。

按網路使用的目的分類

*共享資源網:使用者可共享網路中的各種資源,如文件、掃描儀、繪圖儀、列印機以及各種服務。Internet網是典型的共享資源網。

*數據處理網:用於處理數據的網路,例如科學計算網路、企業經營管理用網路。

*數據傳輸網:用來收集、交換、傳輸數據的網路,如情報檢索網路等。

目前網路使用目的都不是唯一的。

按服務方式分類

*客戶機/伺服器網路

伺服器是指專門提供服務的高性能計算機或專用設備,客戶機是用戶計算機。這是客戶機向伺服器發出請求並獲得服務的一種網路形式,多台客戶機可以共享伺服器提供的各種資源。這是最常用、最重要的一種網路類型。不僅適合於同類計算機聯網,也適合於不同類型的計算機聯網,如C機、Mac機的混合聯網。這種網路安全性容易得到保證,計算機的許可權、優先順序易於控制,監控容易實現,網路管理能夠規范化。網路性能在很大程度上取決於伺服器的性能和客戶機的數量。目前針對這類網路有很多優化性能的伺服器稱為專用伺服器。銀行、證券公司都採用這種類型的網路。

*對等網

對等網不要求文件伺服器,每台客戶機都可以與其他每台客戶機對話,共享彼此的信息資源和硬體資源,組網的計算機一般類型相同。這種網路方式靈活方便,但是較難實現集中管理與監控,安全性也低,較適合於部門內部協同工作的小型網路。

其他分類方法

如按信息傳輸模式的特點來分類的ATM網,網內數據採用非同步傳輸模式,數據以53位元組單元進行傳輸,提供高達1.2Gbs的傳輸率,有預測網路延時的能力。可以傳輸語音、視頻等實時信息,是最有發展前途的網路類型之一。

另外還有一些非正規的分類方法:如企業網、校園網,根據名稱便可理解。

從不同的角度對網路有不同的分類方法,每種網路名稱都有特殊的含意。幾種名稱的組合或名稱加參數更可以看出網路的特徵。千兆乙太網表示傳輸率高達千兆的匯流排型網路。了解網路的分類方法和類型特徵,是熟悉網路技術的重要基礎之一。

② AI面試題第二彈(神經網路基礎)

提取主要特徵,減小網路參數量,減小計算量

層層傳遞的梯度>1 梯度爆炸

層層傳遞的梯度<1 梯度消失

與權重有很大關系,激活函數的影響較小。

每次訓練一層隱節點,訓練時將上一層隱節點的輸出作為輸入,而本層隱節點的輸出作為下一層隱節點的輸入,此過程就是逐層「預訓練」(pre-training);在預訓練完成後,再對整個網路進行「微調」(fine-tunning)。Hinton在訓練深度信念網路(Deep Belief Networks中,使用了這個方法,在各層預訓練完成後,再利用BP演算法對整個網路進行訓練。

這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然後更新梯度的時候,如果梯度超過這個閾值,那麼就將其強制限制在這個范圍之內。這可以防止梯度爆炸。

比較常見的是l1l1l1正則,和l2l2l2正則,在各個深度框架中都有相應的API可以使用正則化

反向傳播中,經過每一層的梯度會乘以該層的權重。

舉個簡單例子:

為了得到一致假設而使假設變得過度復雜稱為過擬合(overfitting), 過擬合表現在訓練好的模型在訓練集上效果很好,但是在測試集上效果差 。也就是說模型的泛化能力弱。

過擬合主要由兩個原因造成,數據集太小或模型太復雜

(1). 數據集擴增(Data Augmentation)

(2). 改進模型

·Early Stopping。在模型效果比較好的時候便提前停止訓練

 ·正則化(regularization)

L1:稀疏參數

L2:更小參數

·Dropout

·多任務學習

深度學習中兩種多任務學習模式:隱層參數的硬共享和軟共享

硬共享機制是指在所有任務中共享隱藏層,同時保留幾個特定任務的輸出層來實現。硬共享機制降低了過擬合的風險。多個任務同時學習,模型就越能捕捉到多個任務的同一表示,從而導致模型在原始任務上的過擬合風險越小。

軟共享機制是指每個任務有自己的模型,自己的參數。模型參數之間的距離是正則化的,以便保障參數相似性。

見後文

leaky relu

輸入是x輸出是y,正常的流程是:我們首先把x通過網路前向傳播,然後把誤差反向傳播以決定如何更新參數讓網路進行學習。使用Dropout之後,過程變成如下:

(1)首先隨機(臨時)刪掉網路中一半的隱藏神經元,輸入輸出神經元保持不變(圖中虛線為部分臨時被刪除的神經元)

(2) 然後把輸入x通過修改後的網路前向傳播,然後把得到的損失結果通過修改的網路反向傳播。一小批訓練樣本執行完這個過程後,在沒有被刪除的神經元上按照隨機梯度下降法更新對應的參數(w,b)。

(3)然後繼續重復這一過程:

恢復被刪掉的神經元(此時被刪除的神經元保持原樣,而沒有被刪除的神經元已經有所更新)

從隱藏層神經元中隨機選擇一個一半大小的子集臨時刪除掉(備份被刪除神經元的參數)。

對一小批訓練樣本,先前向傳播然後反向傳播損失並根據隨機梯度下降法更新參數(w,b) (沒有被刪除的那一部分參數得到更新,刪除的神經元參數保持被刪除前的結果)。

不斷重復這一過程。

沒有對數據進行歸一化

忘記檢查輸入和輸出

沒有對數據進行預處理

沒有對數據正則化

使用過大的樣本

使用不正確的學習率

在輸出層使用錯誤的激活函數

網路中包含壞梯度

初始化權重錯誤

過深的網路

隱藏單元數量錯誤

網路設計不合理(任務-網路不匹配)

機器學習有個很重要的假設:就是假設訓練數據和測試數據是滿足獨立同分布的,這保障了通過訓練數據獲得的優秀模型也能夠在測試集獲得好的效果。但是在機器學習訓練中輸入層的每個批量(X,Y)中X的分布是不一致的,並且神經網路的隱藏層的輸入分布在每次訓練迭代中發生變化。 BatchNorm就是在深度神經網路訓練過程中使得每一層神經網路的輸入保持相同分布的。

BN的基本思想其實相當直觀:因為深層神經網路在做非線性變換前(激活前)的 輸入值 (就是那個x=WU+B,U是輸入) 隨著網路深度加深或者在訓練過程中,其分布逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近 (對於Sigmoid函數來說,意味著激活輸入值WU+B是大的負值或正值),所以這 導致反向傳播時低層神經網路的梯度消失 ,這是訓練深層神經網路收斂越來越慢的 本質原因 , 而BN就是通過一定的規范化手段,把每層神經網路任意神經元這個輸入值的分布強行拉回到均值為0方差為1的標准正態分布 ,其實就是把越來越偏的分布強制拉回比較標準的分布,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會導致損失函數較大的變化,意思是 這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味著學習收斂速度快,能大大加快訓練速度。

但是接下來的問題是:如果都通過BN,那麼不就跟把非線性函數替換成線性函數效果相同了,意味著網路的非線性表達能力下降了, 所以BN為了保證非線性的獲得,對變換後的滿足均值為0方差為1的x又進行了scale加上shift操作(y=scale*x+shift), 每個神經元增加了兩個參數scale和shift參數,這兩個參數是通過訓練學習到的,意思是通過scale和shift把這個值從標准正態分布左移或者右移一點並長胖一點或者變瘦一點,每個實例挪動的程度不一樣,這樣等價於激活前的值經過標准正太分布歸一化後再從正中心周圍的線性區往非線性區動了動。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網路收斂速度太慢

Batch Normalization 好處:(1)提高了訓練速度,收斂速度也大大加快(2)另外調參過程也簡單多了,對於初始化要求沒那麼高,而且可以使用大的學習率等 (3)可以防止梯度消失(4)BN類似於Dropout的一種防止過擬合的正則化表達方式,可以有效防止過擬合,不用太依賴dropou和正則化

以下情況最好不要使用BN:(1)數據不平衡(2)batch_size太小

batch_size是機器學習中的一個重要參數,決定了梯度下降的方向,如果數據集比較小,完全可以採用全數據集的形式計算梯度,由全數據集確定的梯度方向能夠更好地代表樣本總體,從而更准確地朝向極值所在的方向。對於大型數據集則需要使用mini-batch_size,因為隨著數據集的海量增長和內存限制,一次性載入所有的數據進來變得越來越不可行。

當batch_size=1,即在線學習,模型難以達到收斂 。

合理增加batch_size好處 :

(1)內存利用率提高了,大矩陣乘法的並行化效率提高

(2)跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。

(3)在一定范圍內,一般來說 Batch_Size 越大,其確定的下降方向越准,引起訓練震盪越小

盲目增大 Batch_Size 壞處 :

(1)內存利用率提高了,但是內存容量可能撐不住了

(2)跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同精度所需要的 epoch 數量越來越多,花費的時間越長

(3)大的batchsize收斂到sharp minimum,而小的batchsize收斂到flat minimum,後者具有更好的泛化能力。

總之batchsize在變得很大(超過一個臨界點)時,會降低模型的泛化能力。在這個臨界點之下,模型的性能變換隨batch size通常沒有學習率敏感

    目標所在的真實框(ground truth) 與演算法預測的目標所在的框(bounding box)的交集與並集的比值,我們會用IOU閾值來判定預測的bounding box是否有效。一般閾值會設定在0.5,當IOU的值大於等於0.5時,我們會把這個預測的bounding box 歸為正類,而小於0.5的歸為負類。

牛頓法使用的是目標函數的二階導數,在高維情況下這個Hessian(n*n維度)矩陣非常大,計算復雜度是n*n,計算和存儲都是問題

(1) 通過控制卷積核個數實現升維或者降維,從而減少模型參數和計算量

(2) 用於不同channel上特徵的融合

(3)1x1的卷積相當於全連接層的計算過程,並且加入了非線性激活函數,從而增加了網路的非線性,使得網路可以表達更加復雜的特徵。

它能夠把輸入的連續實值變換為0和1之間的輸出,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1

缺點:

(1)函數的飽和區,導致梯度幾乎為0,造成梯度消失問題

(2)Sigmoid 的 output 不是0均值,具體解釋見 https://blog.csdn.net/tyhj_sf/article/details/79932893

(3)其解析式中含有冪運算,計算機求解時相對來講比較耗時。對於規模比較大的深度網路,這會較大地增加訓練時間。

它解決了Sigmoid函數的不是零均值輸出問題,然而,梯度消失(gradient vanishing)的問題和冪運算的問題仍然存在。

(1)在正區間解決了梯度消失的問題

(2)函數簡單,計算速度快,收斂速度遠快於sigmoid和tanh

缺點:

(1)Relu函數輸出不是0均值

(2)神經元壞死問題:指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新,有兩個主要原因導致這種狀況發生

        (1) 非常不幸的參數初始化,這種情況比較少見 

        (2) learning rate太高導致在訓練過程中參數更新太大,不幸使網路進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的演算法

為了解決ReLU函數帶來的神經元壞死問題 , 提出了將ReLU的前半段設為αx,α通常設為0.01,,另外一種直觀的想法是基於參數的方法PReLU函數, α可由方向傳播演算法學習出來。

ELU也是為解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優點,以及:(1)不會有神經元壞死現象(2)函數輸出均值接近於0

但是ELU的小問題就是計算量稍微有點大。

1、使用不同的激活函數,比如Relu,Leak-Relu,PRelu,elu等激活函數代替sigmoid函數

2、使用Batch Normalizaion(批量歸一化)

3、使用殘差網路

4、預訓練加微調

1、梯度裁剪

2、權重正則化

兩個3x3的卷積核的感受野比5x5的卷積核的感受野大,在保持相同感受野的同時,用3x3的卷積核可以提升網路的深度,可以很明顯的減少計算量。

1、局部連接

2、權值共享:減小參數量

3、池化操作:增大感受野

4、多層次結構:可以提取low-level以及high-level的信息

1、數據集太小,數據樣本不足時,深度學習相對其它機器學習演算法,沒有明顯優勢。

2、數據集沒有局部相關特性,目前深度學習表現比較好的領域主要是圖像/語音/自然語言處理等領域,這些領域的一個共性是局部相關性。圖像中像素組成物體,語音信號中音位組合成單詞,文本數據中單片語合成句子,這些特徵元素的組合一旦被打亂,表示的含義同時也被改變。對於沒有這樣的局部相關性的數據集,不適於使用深度學習演算法進行處理。舉個例子:預測一個人的健康狀況,相關的參數會有年齡、職業、收入、家庭狀況等各種元素,將這些元素打亂,並不會影響相關的結果。

作用 :對輸入的特徵圖進行壓縮,

一方面使特徵圖變小,簡化網路計算復雜度;

一方面進行特徵壓縮,提取主要特徵。

通常來講,max-pooling的效果更好,雖然max-pooling和average-pooling都對數據做了下采樣,但是 max-pooling感覺更像是做了特徵選擇,選出了分類辨識度更好的特徵,提供了非線性 。 pooling的主要作用一方面是去掉冗餘信息,一方面要保留feature map的特徵信息,在分類問題中,我們需要知道的是這張圖像有什麼object,而不大關心這個object位置在哪,在這種情況下顯然max pooling比average pooling更合適。在 網路比較深的地方,特徵已經稀疏了,從一塊區域里選出最大的,比起這片區域的平均值來,更能把稀疏的特徵傳遞下去 。

average-pooling更強調對整體特徵信息進行一層下采樣,在減少參數維度的貢獻上更大一點,更多的體現在 信息的完整傳遞這個維度 上,在一個很大很有代表性的模型中,比如說DenseNet中的模塊之間的連接大多採用average-pooling,在減少維度的同時,更有利信息傳遞到下一個模塊進行特徵提取。

average-pooling在 全局平均池化操作 中應用也比較廣,在ResNet和Inception結構中最後一層都使用了平均池化。有的時候在模型接近 分類器的末端使用全局平均池化還可以代替Flatten操作 ,使輸入數據變成一位向量。

CNN網路中另外一個不可導的環節就是Pooling池化操作,因為Pooling操作使得feature map的尺寸變化,假如做2×2的池化(步長也為2),假設那麼第l+1層的feature map有16個梯度,那麼第l層就會有64個梯度,這使得梯度無法對位的進行傳播下去。其實解決這個問題的思想也很簡單,就是把1個像素的梯度傳遞給4個像素,但是需要保證傳遞的loss(或者梯度)總和不變。根據這條原則,mean pooling和max pooling的反向傳播也是不同的

mean pooling的前向傳播就是把一個patch中的值求取平均來做pooling,那麼反向傳播的過程也就是把 某個元素的梯度等分為n份分配給前一層,這樣就保證池化前後的梯度(殘差)之和保持不變 ,圖示如下 :

(2) max pooling

max pooling也要滿足梯度之和不變的原則 ,max pooling的前向傳播是把patch中最大的值傳遞給後一層,而其他像素的值直接被舍棄掉。那麼 反向傳播也就是把梯度直接傳給前一層某一個像素,而其他像素不接受梯度,也就是為0。 所以max pooling操作和mean pooling操作不同點在於需要記錄下池化操作時到底哪個像素的值是最大,也就是max id,這個變數就是記錄最大值所在位置的,因為在反向傳播中要用到,那麼假設前向傳播和反向傳播的過程就如下圖所示 :

28、細粒度分類

29、LSTM&RNN

30、解釋LSTM結構(相對於RNN)的好處

31、RNN的梯度消失原因和解決辦法

32、Object Detection

33、Unet的介紹

34、FCN和Unet的區別

35、RCNN系列的演算法流程和區別

36、Fast RCNN中 bbox 回歸的損失函數什麼

37、解釋 ROI Pooling 和 ROI Align

38、Mask RCNN中 mask branch 如何接入 Faster RCNN中

39、解釋 FPN

40、解釋 ROI Align

41、簡述 YOLO 和 SSD

42、簡述 Hough 直線檢測、Sobel 邊緣檢測演算法流程

43、Mask RCNN中的anchors如何判定為正負樣本

44、簡述 NMS 演算法流程

45、attention起源是用在哪裡?pixel還是frame,是soft還是hard

46、anchor的正負樣本比是多少

47、演算法和激活函數等

48、BN的原理和作用

49、BN層反向傳播,怎麼求導

50、BN 的作用和缺陷,以及針對batch_size小的情況的改進(GN)

51、BN層,先加BN還是激活,有什麼區別

52、手推BP

53、優化演算法舉例和他們的區別(SGD、SGDM、RMSprop、Adam)

54、隨機梯度下降和梯度下降

55、訓練不收斂的原因有哪些

56、簡述 SVM 流程、核函數尋參及常見的核函數舉例

57、batch_size 和 learning rate 的關系(怎麼平衡和調整二者)

58、解釋過擬合和欠擬合,以及解決方法

59、激活函數有哪些,各自區別

60、損失函數有哪些

61、Sigmoid 和 ReLu 對比(各自優缺點)

62、為什麼不用sigmoid而用relu?做出了哪些改進?

63、梯度消失和梯度爆炸的原因和解決方法

64、Precision 和 Recall 的定義

65、精確率高、召回率低是為什麼

66、SVM,線性回歸和邏輯回歸的原理及區別

67、PCA原理,PCA和SVD的區別和聯系

68、正則化怎麼選擇,有哪些方式

69、L1、L2范數,區別

70、boost、Adaboost

71、dropout和batch normalization

72、講一下決策樹和隨機森林

73、講一下GBDT的細節,寫出GBDT的目標函數。 GBDT和Adaboost的區別與聯系

74、偏差、方差

75、距離度量公式哪些,區別

76、多標簽識別怎麼做

77、data argumentation怎麼處理的

78、數據不均衡怎麼處理、只有少量帶標簽怎麼處理

79、權重初始化方法都有哪些

80、權值衰減這個參數怎麼設置

81、分類問題有哪些評價指標?每種的適用場景。

82、無監督學習了解哪些

83、圖像處理Opencv

84、邊緣檢測運算元有哪些

85、霍夫變換

86、直方圖是什麼

87、canny運算元是怎麼做的

88、圖像的特徵提取有哪些演算法,適用范圍、優缺點

參考:

https://blog.csdn.net/bluesliuf/article/details/89389117

https://zhuanlan.hu.com/p/107279000

https://zhuanlan.hu.com/p/56475281

③ 卷積神經網路為什麼適合圖像處理

神經網路的本質就在於做信息形式的變換,而要想做數據的處理,首要解決的問題就是如何將數據張量化,問題就在於卷積神經網路要處理的數據必須是向量形式,對於圖像這種數據類型來說,如果將其展開成一維的向量,且不說得到向量的維數過高,網路太深導致網路中參數太多,圖像中的空間信息也會丟失。
而卷積神經網路能夠用卷積的方式從原信息中提取"部分特定的信息(信息跟卷積核相關)",且對於二維的圖像來說是原生支持的(不需要處理),這就保留了圖像中的空間信息,而空間信息是具有可平移性質的.。
並且卷積神經網路的參數就只是卷積核的參數以及偏置(Bias),而卷積核的參數可以做到共享,卷積核也可以用多個,從多個角度對原圖像解讀。
這就是卷積神經網路的幾個特點:局部感知,參數共享,多核,平移不變性正是因為這些特點,在圖像領域處理上,卷積神經網路取代了人工神經網路。
卷積神經網路 (CNN) 是當今最流行的模型之一。這種神經網路計算模型使用多層感知器的變體,並包含一個或多個可以完全連接或池化的卷積層。這些卷積層創建了記錄圖像區域的特徵圖,該區域最終被分成矩形並發送出去進行非線性處理。
優點:
圖像識別問題的非常高的准確性。自動檢測重要特徵,無需任何人工監督。權重共享。
缺點:
CNN 不對物體的位置和方向進行編碼。缺乏對輸入數據空間不變的能力。需要大量的訓練數據。

④ CNN之Lenet5

LeNet誕生於 1994 年,是最早的卷積神經網路之一,並且推動了深度學習領域的發展。

LeNet-5是Yann LeCun等人在多次研究後提出的最終卷積神經網路結構,主要用於手寫數字識別

LeNet5的網路結構如下所示:

LeNet-5包含七層,不包括輸入,每一層都包含可訓練參數(權重),當時使用的輸入數據是32*32像素的圖像。下面逐層介紹LeNet-5的結構,並且,卷積層將用Cx表示,子采樣層則被標記為Sx,全連接層被標記為Fx,其中x是層索引。

該層使用了6個卷積核,每個卷積核的大小為5×5,這樣就得到了6個feature map(特徵圖)。

每個卷積核(5×5)與原始的輸入圖像(32×32)進行卷積,這樣得到的feature map(特徵圖)大小為(32-5+1)×(32-5+1)= 28×28

卷積核與輸入圖像按卷積核大小逐個區域進行匹配計算,匹配後原始輸入圖像的尺寸將變小,因為邊緣部分卷積核無法越出界,只能匹配一次,匹配計算後的尺寸變為Cr×Cc=(Ir-Kr+1)×(Ic-Kc+1),其中Cr、Cc,Ir、Ic,Kr、Kc分別表示卷積後結果圖像、輸入圖像、卷積核的行列大小。

由於參數(權值)共享的原因,對於同個卷積核每個神經元均使用相同的參數,因此,參數個數為(5×5+1)×6= 156,其中5×5為卷積核參數,1為偏置參數

卷積後的圖像大小為28×28,因此每個特徵圖有28×28個神經元,每個卷積核參數為(5×5+1)×6,因此,該層的連接數為(5×5+1)×6×28×28=122304

這一層主要是做池化或者特徵映射(特徵降維),池化單元為2×2,因此,6個特徵圖的大小經池化後即變為14×14。池化單元之間沒有重疊,在池化區域內進行聚合統計後得到新的特徵值,因此經2×2池化後,每兩行兩列重新算出一個特徵值出來,相當於圖像大小減半,因此卷積後的28×28圖像經2×2池化後就變為14×14。

這一層的計算過程是:2×2 單元里的值相加,然後再乘以訓練參數w,再加上一個偏置參數b(每一個特徵圖共享相同的w和b),然後取sigmoid值(S函數:0-1區間),作為對應的該單元的值。卷積操作與池化的示意圖如下:

S2層由於每個特徵圖都共享相同的w和b這兩個參數,因此需要2×6=12個參數

下采樣之後的圖像大小為14×14,因此S2層的每個特徵圖有14×14個神經元,每個池化單元連接數為2×2+1(1為偏置量),因此,該層的連接數為(2×2+1)×14×14×6 = 5880

C3層有16個卷積核,卷積模板大小為5×5。

與C1層的分析類似,C3層的特徵圖大小為(14-5+1)×(14-5+1)= 10×10

需要注意的是,C3與S2並不是全連接而是部分連接,有些是C3連接到S2三層、有些四層、甚至達到6層,通過這種方式提取更多特徵,連接的規則如下表所示:

例如第一列表示C3層的第0個特徵圖(feature map)只跟S2層的第0、1和2這三個feature maps相連接,計算過程為:用3個卷積模板分別與S2層的3個feature maps進行卷積,然後將卷積的結果相加求和,再加上一個偏置,再取sigmoid得出卷積後對應的feature map了。其它列也是類似(有些是3個卷積模板,有些是4個,有些是6個)。因此,C3層的參數數目為(5×5×3+1)×6 +(5×5×4+1)×9 +5×5×6+1 = 1516

卷積後的特徵圖大小為10×10,參數數量為1516,因此連接數為1516×10×10= 151600

與S2的分析類似,池化單元大小為2×2,因此,該層與C3一樣共有16個特徵圖,每個特徵圖的大小為5×5。

與S2的計算類似,所需要參數個數為16×2 = 32

連接數為(2×2+1)×5×5×16 = 2000

該層有120個卷積核,每個卷積核的大小仍為5×5,因此有120個特徵圖。由於S4層的大小為5×5,而該層的卷積核大小也是5×5,因此特徵圖大小為(5-5+1)×(5-5+1)= 1×1。這樣該層就剛好變成了全連接,這只是巧合,如果原始輸入的圖像比較大,則該層就不是全連接了。

與前面的分析類似,本層的參數數目為120×(5×5×16+1) = 48120

由於該層的特徵圖大小剛好為1×1,因此連接數為48120×1×1=48120

F6層有84個單元,之所以選這個數字的原因是來自於輸出層的設計,對應於一個7×12的比特圖,如下圖所示,-1表示白色,1表示黑色,這樣每個符號的比特圖的黑白色就對應於一個編碼。

該層有84個特徵圖,特徵圖大小與C5一樣都是1×1,與C5層全連接。

由於是全連接,參數數量為(120+1)×84=10164。跟經典神經網路一樣,F6層計算輸入向量和權重向量之間的點積,再加上一個偏置,然後將其傳遞給sigmoid函數得出結果。

由於是全連接,連接數與參數數量一樣,也是10164。

Output層也是全連接層,共有10個節點,分別代表數字0到9。如果第i個節點的值為0,則表示網路識別的結果是數字i。

該層採用徑向基函數(RBF)的網路連接方式,假設x是上一層的輸入,y是RBF的輸出,則RBF輸出的計算方式是:

上式中的Wij的值由i的比特圖編碼確定,i從0到9,j取值從0到7×12-1。RBF輸出的值越接近於0,表示當前網路輸入的識別結果與字元i越接近。

由於是全連接,參數個數為84×10=840

由於是全連接,連接數與參數個數一樣,也是840

from skimage import io,transform

import os

import glob

import numpy as np

import tensorflow as tf

#將所有的圖片重新設置尺寸為32*32

w = 32

h = 32

c = 1

#mnist數據集中訓練數據和測試數據保存地址

train_path = "E:/data/datasets/mnist/train/"

test_path = "E:/data/datasets/mnist/test/"

#讀取圖片及其標簽函數

'''os.listdir()返回指定的文件夾包含的文件或文件夾的名字,存放於一個列表中;os.path.isdir()判斷某一路徑是否為目錄

enumerate()將一個可遍歷的數據對象(如列表、元組或字元串)組合為一個索引序列,數據下標和相應數據'''

def read_image(path):

    label_dir = [path+x for x in os.listdir(path) if os.path.isdir(path+x)]

    images = []

    labels = []

    for index,folder in enumerate(label_dir):

        for img in glob.glob(folder+'/*.png'):

            print("reading the image:%s"%img)

            image = io.imread(img)

            image = transform.resize(image,(w,h,c))

            images.append(image)

            labels.append(index)

    return np.asarray(images,dtype=np.float32),np.asarray(labels,dtype=np.int32)

#讀取訓練數據及測試數據           

train_data,train_label = read_image(train_path)

test_data,test_label = read_image(test_path)

#打亂訓練數據及測試數據  np.arange()返回一個有終點和起點的固定步長的排列,

train_image_num = len(train_data)

train_image_index = np.arange(train_image_num) ##起始點0,結束點train_image_num,步長1,返回類型array,一維

np.random.shuffle(train_image_index)

train_data = train_data[train_image_index]

train_label = train_label[train_image_index]

test_image_num = len(test_data)

test_image_index = np.arange(test_image_num)

np.random.shuffle(test_image_index)

test_data = test_data[test_image_index]

test_label = test_label[test_image_index]

#搭建CNN 此函數可以理解為形參,用於定義過程,在執行的時候再賦具體的值,形參名X,y_

x = tf.placeholder(tf.float32,[None,w,h,c],name='x')

y_ = tf.placeholder(tf.int32,[None],name='y_')

def inference(input_tensor,train,regularizer):

    #第一層:卷積層,過濾器的尺寸為5×5,深度為6,不使用全0補充,步長為1。

    #尺寸變化:32×32×1->28×28×6

    '''參數的初始化:tf.truncated_normal_initializer()或者簡寫為tf.TruncatedNormal()、tf.RandomNormal() 去掉_initializer,大寫首字母即可

生成截斷正態分布的隨機數,這個初始化方法好像在tf中用得比較多mean=0.0, stddev=1.0 正態分布

http://www.mamicode.com/info-detail-1835147.html'''

    with tf.variable_scope('layer1-conv1'):

        conv1_weights = tf.get_variable('weight',[5,5,c,6],initializer=tf.truncated_normal_initializer(stddev=0.1))

        conv1_biases = tf.get_variable('bias',[6],initializer=tf.constant_initializer(0.0))

        conv1 = tf.nn.conv2d(input_tensor,conv1_weights,strides=[1,1,1,1],padding='VALID')

        relu1 = tf.nn.relu(tf.nn.bias_add(conv1,conv1_biases))

    #第二層:池化層,過濾器的尺寸為2×2,使用全0補充,步長為2。

    #尺寸變化:28×28×6->14×14×6

    with tf.name_scope('layer2-pool1'):

        pool1 = tf.nn.max_pool(relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

    #第三層:卷積層,過濾器的尺寸為5×5,深度為16,不使用全0補充,步長為1。

    #尺寸變化:14×14×6->10×10×16

    with tf.variable_scope('layer3-conv2'):

        conv2_weights = tf.get_variable('weight',[5,5,6,16],initializer=tf.truncated_normal_initializer(stddev=0.1))

        conv2_biases = tf.get_variable('bias',[16],initializer=tf.constant_initializer(0.0))

        conv2 = tf.nn.conv2d(pool1,conv2_weights,strides=[1,1,1,1],padding='VALID')

        relu2 = tf.nn.relu(tf.nn.bias_add(conv2,conv2_biases))

    #第四層:池化層,過濾器的尺寸為2×2,使用全0補充,步長為2。

    #尺寸變化:10×10×6->5×5×16

    with tf.variable_scope('layer4-pool2'):

        pool2 = tf.nn.max_pool(relu2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

    #將第四層池化層的輸出轉化為第五層全連接層的輸入格式。第四層的輸出為5×5×16的矩陣,然而第五層全連接層需要的輸入格式

    #為向量,所以我們需要把代表每張圖片的尺寸為5×5×16的矩陣拉直成一個長度為5×5×16的向量。

    #舉例說,每次訓練64張圖片,那麼第四層池化層的輸出的size為(64,5,5,16),拉直為向量,nodes=5×5×16=400,尺寸size變為(64,400)

    pool_shape = pool2.get_shape().as_list()

    nodes = pool_shape[1]*pool_shape[2]*pool_shape[3]

    reshaped = tf.reshape(pool2,[-1,nodes])

    #第五層:全連接層,nodes=5×5×16=400,400->120的全連接

    #尺寸變化:比如一組訓練樣本為64,那麼尺寸變化為64×400->64×120

    #訓練時,引入dropout,dropout在訓練時會隨機將部分節點的輸出改為0,dropout可以避免過擬合問題。

    #這和模型越簡單越不容易過擬合思想一致,和正則化限制權重的大小,使得模型不能任意擬合訓練數據中的隨機雜訊,以此達到避免過擬合思想一致。

    #本文最後訓練時沒有採用dropout,dropout項傳入參數設置成了False,因為訓練和測試寫在了一起沒有分離,不過大家可以嘗試。

    '''tf.matmul()這個函數是專門矩陣或者tensor乘法,而不是矩陣元素對應元素相乘

    tf.multiply()兩個矩陣中對應元素各自相乘

    tf.nn.dropout(x, keep_prob):TensorFlow裡面為了防止或減輕過擬合而使用的函數,它一般用在全連接層,

    x:指輸入;keep_prob: 設置神經元被選中的概率,使輸入tensor中某些元素變為0,其它沒變0的元素變為原來的1/keep_prob大小,可以想像下,比如某些元素棄用

    在初始化時keep_prob是一個佔位符,keep_prob = tf.placeholder(tf.float32).

    tensorflow在run時設置keep_prob具體的值,例如keep_prob: 0.5,train的時候才是dropout起作用的時候

    keep_prob: A scalar Tensor with the same type as x. The probability that each element is kept.'''

    with tf.variable_scope('layer5-fc1'):

        fc1_weights = tf.get_variable('weight',[nodes,120],initializer=tf.truncated_normal_initializer(stddev=0.1))

        if regularizer != None:

            tf.add_to_collection('losses',regularizer(fc1_weights))

        fc1_biases = tf.get_variable('bias',[120],initializer=tf.constant_initializer(0.1))

        fc1 = tf.nn.relu(tf.matmul(reshaped,fc1_weights) + fc1_biases)

        if train:

            fc1 = tf.nn.dropout(fc1,0.5)

    #第六層:全連接層,120->84的全連接

    #尺寸變化:比如一組訓練樣本為64,那麼尺寸變化為64×120->64×84

    '''tf.add_to_collection:把變數放入一個集合,把很多變數變成一個列表

    tf.get_collection:從一個結合中取出全部變數,是一個列表

    tf.add_n:把一個列表的東西都依次加起來'''

    with tf.variable_scope('layer6-fc2'):

        fc2_weights = tf.get_variable('weight',[120,84],initializer=tf.truncated_normal_initializer(stddev=0.1))

        if regularizer != None:

            tf.add_to_collection('losses',regularizer(fc2_weights))

        fc2_biases = tf.get_variable('bias',[84],initializer=tf.truncated_normal_initializer(stddev=0.1))

        fc2 = tf.nn.relu(tf.matmul(fc1,fc2_weights) + fc2_biases)

        if train:

            fc2 = tf.nn.dropout(fc2,0.5)

    #第七層:全連接層(近似表示),84->10的全連接

    #尺寸變化:比如一組訓練樣本為64,那麼尺寸變化為64×84->64×10。最後,64×10的矩陣經過softmax之後就得出了64張圖片分類於每種數字的概率,

    #即得到最後的分類結果。

    with tf.variable_scope('layer7-fc3'):

        fc3_weights = tf.get_variable('weight',[84,10],initializer=tf.truncated_normal_initializer(stddev=0.1))

        if regularizer != None:

            tf.add_to_collection('losses',regularizer(fc3_weights))

        fc3_biases = tf.get_variable('bias',[10],initializer=tf.truncated_normal_initializer(stddev=0.1))

        logit = tf.matmul(fc2,fc3_weights) + fc3_biases

    return logit

#正則化,交叉熵,平均交叉熵,損失函數,最小化損失函數,預測和實際equal比較,tf.equal函數會得到True或False,

#accuracy首先將tf.equal比較得到的布爾值轉為float型,即True轉為1.,False轉為0,最後求平均值,即一組樣本的正確率。

#比如:一組5個樣本,tf.equal比較為[True False True False False],轉化為float型為[1. 0 1. 0 0],准確率為2./5=40%。

'''規則化可以幫助防止過度配合,提高模型的適用性。(讓模型無法完美匹配所有的訓練項。)(使用規則來使用盡量少的變數去擬合數據)

規則化就是說給需要訓練的目標函數加上一些規則(限制),讓他們不要自我膨脹。

TensorFlow會將L2的正則化損失值除以2使得求導得到的結果更加簡潔

如tf.contrib.layers.apply_regularization/l1_regularizer/l2_regularizer/sum_regularizer

https://blog.csdn.net/liushui94/article/details/73481112

sparse_softmax_cross_entropy_with_logits()是將softmax和cross_entropy放在一起計算

https://blog.csdn.net/ZJRN1027/article/details/80199248'''

regularizer = tf.contrib.layers.l2_regularizer(0.001)

y = inference(x,False,regularizer)

cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=y_)

cross_entropy_mean = tf.rece_mean(cross_entropy)

loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses'))

train_op = tf.train.AdamOptimizer(0.001).minimize(loss)

correct_prediction = tf.equal(tf.cast(tf.argmax(y,1),tf.int32),y_)

accuracy = tf.rece_mean(tf.cast(correct_prediction,tf.float32))

#每次獲取batch_size個樣本進行訓練或測試

def get_batch(data,label,batch_size):

    for start_index in range(0,len(data)-batch_size+1,batch_size):

        slice_index = slice(start_index,start_index+batch_size)

        yield data[slice_index],label[slice_index]

#創建Session會話

with tf.Session() as sess:

    #初始化所有變數(權值,偏置等)

    sess.run(tf.global_variables_initializer())

    #將所有樣本訓練10次,每次訓練中以64個為一組訓練完所有樣本。

    #train_num可以設置大一些。

    train_num = 10

    batch_size = 64

    for i in range(train_num):

        train_loss,train_acc,batch_num = 0, 0, 0

        for train_data_batch,train_label_batch in get_batch(train_data,train_label,batch_size):

            _,err,acc = sess.run([train_op,loss,accuracy],feed_dict={x:train_data_batch,y_:train_label_batch})

            train_loss+=err;train_acc+=acc;batch_num+=1

        print("train loss:",train_loss/batch_num)

        print("train acc:",train_acc/batch_num)

        test_loss,test_acc,batch_num = 0, 0, 0

        for test_data_batch,test_label_batch in get_batch(test_data,test_label,batch_size):

            err,acc = sess.run([loss,accuracy],feed_dict={x:test_data_batch,y_:test_label_batch})

            test_loss+=err;test_acc+=acc;batch_num+=1

        print("test loss:",test_loss/batch_num)

        print("test acc:",test_acc/batch_num)

⑤ 深度學習為什麼不過擬合

深度學習:過擬合

為了得到一致假設而使假設變得過度復雜稱為過擬合。想像某種學習演算法產生了一個過擬合的分類器,這個分類器能夠百分之百的正確分類樣本數據(即再拿樣本中的文檔來給它,它絕對不會分錯),但也就為了能夠對樣本完全正確的分類,使得它的構造如此精細復雜,規則如此嚴格,以至於任何與樣本數據稍有不同的文檔它全都認為不屬於這個類別。
標準定義:給定一個假設空間H,一個假設h屬於H,如果存在其他的假設h』屬於H,使得在訓練樣例上h的錯誤率比h』小,但在整個實例分布上h』比h的錯誤率小,那麼就說假設h過度擬合訓練數據。 —-《Machine Learning》Tom M.Mitchell

假設我們用深度學習來判斷西瓜,過擬合會使得你判斷西瓜更加嚴厲,導致在某些西瓜數據上與你准備的數據有些出入(差別並不會太大),從而結果判定不是西瓜。。。

-----------------
深度學習防止過擬合的方法

過擬合即在訓練誤差很小,而泛化誤差很大,因為模型可能過於的復雜,使其」記住」了訓練樣本,然而其泛化誤差卻很高,在傳統的機器學習方法中有很大防止過擬合的方法,同樣這些方法很多也適合用於深度學習中,同時深度學習中又有一些獨特的防止過擬合的方法,下面對其進行簡單的梳理.
1. 參數范數懲罰
范數正則化是一種非常普遍的方法,也是最常用的方法,假如優化:

minObj(θ)=L(y,f(x))+αG(θ)

其中L為經驗風險,其為在訓練樣本上的誤差,而G為對參數的懲罰,也叫結構風險.α是平衡兩者,如果太大則對應的懲罰越大,如過太小,甚至接近與0,則沒有懲罰.
最常用的范數懲罰為L1,L2正則化,L1又被成為Lasso:

||w||1=|w1|+|w2|+...

即絕對值相加,其趨向於是一些參數為0.可以起到特徵選擇的作用.
L2正則化為:

||w||2=w12+w22+...−−−−−−−−−−−−√

其趨向與,使權重很小.其又成為ridge.
關於更多可以參考:機器學習中的范數規則化之(一)L0、L1與L2范數

2. 數據增強
讓模型泛化的能力更好的最好辦法就是使用更多的訓練數據進行訓練,但是在實踐中,我們擁有的數據是有限的,解決這一問題可以人為的創造一些假數據添加到訓練集中.
一個具體的例子:
在AlexNet中,將256*256圖像隨機的截取224*224大小,增加了許多的訓練樣本,同時可以對圖像進行左右翻轉,增加樣本的個數,實驗的結果可以可降低1%的誤差.
在神經網路中輸入雜訊也可以看做是數據增強的一種方式.
3. 提前終止
如下圖所示(圖片來源deep learning),當隨著模型的能力提升,訓練集的誤差會先減小再增大,這樣可以提前終止演算法減緩過擬合現象.關於演算法的具體流程參考deep learning.

提前終止是一種很常用的緩解過擬合的方法,如在決策樹的先剪枝的演算法,提前終止演算法,使得樹的深度降低,防止其過擬合.
4. 參數綁定與參數共享
在卷積神經網路CNN中(計算機視覺與卷積神經網路 ),卷積層就是其中權值共享的方式,一個卷積核通過在圖像上滑動從而實現共享參數,大幅度減少參數的個數,用卷積的形式是合理的,因為對於一副貓的圖片來說,右移一個像素同樣還是貓,其具有局部的特徵.這是一種很好的緩解過擬合現象的方法.
同樣在RNN中用到的參數共享,在其整條時間鏈上可以進行參數的共享,這樣才使得其能夠被訓練.
5. bagging 和其他集成方法
其實bagging的方法是可以起到正則化的作用,因為正則化就是要減少泛化誤差,而bagging的方法可以組合多個模型起到減少泛化誤差的作用.
在深度學習中同樣可以使用此方法,但是其會增加計算和存儲的成本.
6. Dropout
Dropout提供了一種廉價的Bagging集成近似,能夠訓練和評估指數級數量的神經網路。dropout可以隨機的讓一部分神經元失活,這樣彷彿是bagging的采樣過程,因此可以看做是bagging的廉價的實現.
但是它們訓練不太一樣,因為bagging,所有的模型都是獨立的,而dropout下所有模型的參數是共享的.
通常可以這樣理解dropout:假設我們要判別一隻貓,有一個神經元說看到有毛就是貓,但是如果我讓這個神經元失活,它還能判斷出來是貓的話,這樣就比較具有泛化的能力,減輕了過擬合的風險.
7. 輔助分類節點(auxiliary classifiers)
在Google Inception V1中,採用了輔助分類節點的策略,即將中間某一層的輸出用作分類,並按一個較小的權重加到最終的分類結果中,這樣相當於做了模型的融合,同時給網路增加了反向傳播的梯度信號,提供了額外的正則化的思想.
8. Batch Normalization
在Google Inception V2中所採用,是一種非常有用的正則化方法,可以讓大型的卷積網路訓練速度加快很多倍,同事收斂後分類的准確率也可以大幅度的提高.
BN在訓練某層時,會對每一個mini-batch數據進行標准化(normalization)處理,使輸出規范到N(0,1)的正太分布,減少了Internal convariate shift(內部神經元分布的改變),傳統的深度神經網路在訓練是,每一層的輸入的分布都在改變,因此訓練困難,只能選擇用一個很小的學習速率,但是每一層用了BN後,可以有效的解決這個問題,學習速率可以增大很多倍.
未完待續…
參考資料:
deep learning
tensorflow實戰
機器學習中的范數規則化之(一)L0、L1與L2范數

⑥ 聯合檢測惡意域和受感染的客戶端

感染惡意軟體的計算機的連接和基於加密的HTTPS流量的惡意web域的檢測是具有挑戰性的問題,因為只有地址、時間戳和數據量是可見的。檢測問題是耦合的,因為受感染的客戶端往往與惡意域交互。流量數據可以大規模收集,反病毒工具可以用來識別受感染的客戶端。相反,域必須在取證分析後單獨標記。探討了基於閘網路的轉移學習方法;這使得檢測模型來引導對方。在一項大規模的實驗研究中,我們發現該模型比已知的參考模型性能更好,可以檢測到以前未知的惡意軟體、以前未知的惡意軟體家族和以前未知的惡意域。

1介紹

惡意軟體侵犯了用戶的隱私,獲取密碼和個人信息,可以加密用戶的文件索取贖金,用於實施點擊欺詐,並通過在社交媒體上推廣特定內容來促進政治議程(Kogan, 2015)。基於客戶機的防病毒工具使用特定於供應商的混合方法,包括基於簽名的分析、可移植可執行文件的靜態分析、模擬(在實際操作系統中執行之前不訪問實際系統資源的部分執行)和基於動態行為的分析來檢測惡意軟體(Swinnen和Mesbahi, 2014)。網路流量分析是殺毒軟體的補充,廣泛應用於企業網路。流量分析允許組織在整個網路中一致地實施可接受使用和安全策略,並最小化管理開銷。流量分析使得將惡意軟體檢測封裝到網路設備或雲服務中成為可能,這些設備或雲服務可以檢測多態惡意軟體(Karim et al., 2005)以及基於URL模式(Bartos和Sofka, 2015)的未知惡意軟體。

然而,惡意軟體可以很容易地阻止分析其HTTP有效載荷使用加密的HTTPS協議。HTTPS本身的使用並不引人注目,因為谷歌、Facebook、LinkedIn和許多其他流行的網站默認加密它們的網路流量,而且HTTPS的全球數據量已經超過了HTTP (Finley, 2017)。為了對HTTPS流量進行網路流量分析,現在的組織必須對其網路進行配置,以便所有web流量都通過web安全伺服器進行路由。該伺服器的根證書必須作為可信證書安裝在所有客戶端計算機上,這允許服務充當客戶端和主機之間的中間人。它可以解密、檢查和重新加密HTTPS請求。這種方法在大型網路上的伸縮性很差,因為加密操作的計算開銷很大,而且會給網路帶來潛在的漏洞。

在不破壞加密的情況下,HTTPS流量的觀察者只能看到客戶端和主機的IP地址和埠,以及數據包的時間戳和數據量。網路設備將一對IP地址和埠之間交換的TCP/IP數據包聚合到網路流中,地址、時間和數據量信息保存到日誌文件中。大多數情況下,觀察者還可以看到未加密的主機域名。HTTP有效負載(包括HTTP頭欄位和URL)被加密。

網路主機參與了廣泛的非法活動,將已知的惡意域和IP地址的流量列入黑名單是對抗惡意軟體的有效機制。惡意域可以承載銀行木馬和金融詐騙、點擊欺詐伺服器或惡意內容分發中心的後端。將一個域識別為惡意需要一個復雜的取證分析。分析人員必須收集關於承載域、軟體和使用的技術的伺服器的信息,並且可以研究域和共同承載域的所有權,以及觀察主機的行為。

由於許多類型的惡意活動涉及與基於客戶機的惡意軟體的交互,因此檢測惡意主機和受感染的客戶機是耦合問題。在神經網路環境中,相關任務的標記數據常常被設計成共享部分參數的耦合網路。在水閘網路中(Ruder et al., 2017),參數共享的程度本身由參數控制,這使得輔助數據可以作為手頭任務的靈活先驗。

本文其餘部分的結構如下。第二節回顧相關工作。我們在第3節中描述我們的操作環境和數據,在第4節中描述問題設置。在第5節中,我們推導了惡意軟體和惡意域的聯合檢測模型,並描述了參考方法。第六部分是實驗,第七部分是結論。

2相關工作

之前的HTTP日誌分析工作(Nguyen和Armitage, 2008)已經解決了識別命令和控制伺服器(Nelms et al., 2013)、無監督檢測惡意軟體(Kohout和Pevny, 2015b;Bartos等人,2016),並監督檢測惡意軟體使用領域黑名單作為標簽(Franc等人,2015;Bartos and Sofka, 2015)。HTTP日誌文件包含完整的URL字元串,從中可以提取大量的信息特性(Bartos和Sofka, 2015)。

最近的大量工作都是通過網路流量分析來檢測Android惡意軟體。Arora等人(2014)使用平均包大小、平均流持續時間和一小組其他特徵來識別一小組48個惡意Android應用程序,具有一定的准確性。Lashkari等(2015)收集了1500個良性和400個惡意的Android應用程序,提取了流量持續時間和流量特徵,並從Weka庫中應用了幾種機器學習演算法。他們觀察到個別流量水平的高精度值。Demontis等人(2018)針對這種檢測機制建立了不同類型的攻擊模型,並設計了一個特徵學習範式來緩解這些攻擊。Malik和Kaushal(2016)通過眾包領域聲譽服務(信任網路)和應用程序的資源許可來匯總應用程序的排名。

之前關於HTTPS日誌的工作旨在識別應用層協議(Wright et al., 2006;Crotti et al., 2007;Dusi等人,2009)。為了對承載類似應用程序的web伺服器進行集群化,Kohout和Pevny (2015a)開發了從可見時間間隔和連接數據量的直方圖派生出來的特性。Lokoc等人(2016)利用這種特徵表示,開發了一個近似的k-NN分類器來識別被惡意軟體連接的伺服器。被惡意軟體聯系的主機不一定是惡意的。惡意軟體使用URL轉發和其他技術,通過合法的主機路由其流量,並可能聯系合法的服務,只是為了稀釋其網路流量。不過,我們將使用直方圖特徵作為參考特徵表示。

基於圖的分類方法(如Anderson et al., 2011)已經被探索過,但不能應用到我們的操作環境中。在我們的操作環境中,雲Web安全伺服器只觀察組織內的網路流量。為了感知網路圖的一個重要部分,公司將不得不交換他們的網路流量數據,這在邏輯和隱私方面是不切實際的。

之前關於網路流分析的神經網路的工作(Pevny和Somol, 2016)使用客戶端計算機的標簽(已感染和未感染)——這導致了一個多實例學習問題。相比之下,我們的操作環境允許我們觀察流和可執行文件之間的關聯。利用域名的word2vec嵌入和長短期內存網路(LSTMs)相結合的方法,研究了來自HTTPS流量的惡意軟體檢測(Prasse et al., 2017)。我們將把這種方法作為實驗的參考。最近的研究結果表明,卷積神經網路(CNNs)更強的魯棒性超過了LSTMs考慮長期依賴關系的能力(Gehring et al., 2017)。這激發了我們對卷積架構的探索。神經網路也被應用於靜態惡意軟體分析(Pascanu et al., 2015)。

在深度學習環境中,多任務學習通常通過隱藏層的軟、硬參數共享來實現。在硬參數共享中,所有任務的模型可以共享卷積層(Long and Wang, 2015),甚至所有隱層(Caruana, 1993),這可以顯著增加用於優化大部分參數的樣本量(Baxter, 1997)。相比之下,軟參數共享可以作為分層貝葉斯建模在神經網路中的直接應用來實現:在所有任務中,每個參數都被正則化為其平均值(Duong et al., 2015;楊和Hospedales, 2016)。 Cross-stitch (Misra et al., 2016)和水閘網sluice networks絡(Ruder et al., 2017)允許網路中不同部分的任務耦合程度由參數控制。水閘網路具有比十字綉網路更一般的形式,因為它們有額外的參數,允許特定任務的網路層加權。

神經網路的替代轉移學習方法加強了在不同任務之間不變的中間表示(Ganin et al., 2016)。除了深度學習之外,lasso正則化器組還加強了子空間共享,並研究了多種用於多任務學習的方法,這些方法基於層次貝葉斯模型(如Finkel和Manning, 2009)、學習任務不變特徵(如Argyriou等,2007)、任務相似核(Evgeniou等,2005)和學習實例特定權重(如Bickel等,2008)。

3操作環境

本節描述我們的應用程序環境。為了保護組織的所有計算機,雲Web安全(CWS)服務提供了組織的私有網路和internet之間的介面。客戶端計算機建立到CWS服務的VPN連接,來自組織內任何客戶端的所有外部HTTP和HTTPS連接都將通過該服務進行路由。該服務可以基於主機域和組織的可接受使用策略阻止HTTP和HTTPS請求。CWS服務將阻止所有惡意域之間的所有流量。當在客戶端檢測到惡意軟體時,它會發出警告。由於安全分析師必須處理惡意軟體警告,所有發布的警告中,假警報的比例必須很小。

在應用層,HTTPS使用HTTP協議,但是所有消息都通過傳輸層安全性(TLS)協議或其前身安全套接字層(SSL)協議進行加密。CWS服務將單個客戶端計算機、客戶端埠、主機IP地址和主機埠之間的所有TCP/IP包聚合起來,這些包來自單個HTTP請求或HTTPS請求的TLS/SSL隧道到網路流。對於每個網路流,將一行寫入日誌文件,其中包括數據量、時間戳、客戶機和主機地址以及持續時間信息。對於未加密的HTTP流量,這一行也包含完整的URL字元串。對於HTTPS流量,它包含域名——如果該名稱可以通過以下機制之一觀察到的話。

使用伺服器名稱指示協議擴展(SNI)的客戶機在建立連接時發布未加密的主機域名。SNI被廣泛使用,因為它需要驗證承載多個域的伺服器的證書,就像大多數web伺服器一樣。當網路使用透明的DNS代理(Blum和Lueker, 2001)時,該伺服器緩存DNS請求-響應對,並可以將IP地址映射到以前解析的域名。日誌文件行的結果序列作為惡意軟體和惡意域檢測模型的輸入。

3.1數據收集

在我們的實驗中,我們結合了大量的HTTPS網路流(Prasse et al., 2017),它們被標記為是否來自一個惡意的合法應用程序,以及一個由Cisco的取證專家維護的域黑名單。

Prasse等人(2017)收集了340個公司網路中通過CWS伺服器的HTTPS網路流。這些網路中的客戶機運行一個VPN客戶機,該客戶機監視進程表和網路介面,並記錄哪個可執行文件創建每個網路流。回顧過去,可執行文件已經用多種防病毒工具進行了分析。結果數據集由已知客戶端(由組織和VPN帳戶標識)、域(完全合格的域名)、數據量和時間戳以及一個標簽組成,該標簽指示生成流量的應用程序是否被防病毒工具識別為惡意軟體。我們按時間順序對訓練和測試數據進行分層。訓練數據包含了2016年7月為期5天的171個小型到大型計算機網路的完整HTTPS流量。測試數據包含了2016年9月為期8天的169個不同計算機網路的完整HTTPS流量。思科的取證專家一直在調查可疑的主機名、二級域名和伺服器IP地址,這些都被各種各樣的機制標記過。這包括對託管軟體和使用的技術、注冊表記錄、URL和流量模式的分析,以及對特定域可用的任何附加信息的分析。我們相信域幾乎從不被錯誤地評定為惡意的,但是由於昂貴的分析過程,惡意域的黑名單必然是不完整的。所有來自或轉至惡意服務的通訊都很容易被ws服務攔截。網路流量不包含任何流向在收集流量數據時已在我們的黑名單上的域的流量。流量數據集包含與4,340個惡意主機名、二級域名和伺服器IP地址之間的網路流,這些惡意主機名、二級域名和伺服器IP地址在收集數據後被添加到黑名單中。

3.2數據的定量分析

表1和表2總結了良性和惡意網路流、客戶機計算機、受感染計算機、具有唯一散列的應用程序和組織的數量。

表3給出了最常見的惡意軟體家族的統計數據。它列舉了發生的變化的數量、受感染的客戶機的數量,括弧內是訓練數據中受感染的客戶機的數量。

總的來說,只有不到18000台電腦被惡意軟體感染,並與當時未被列入黑名單的域名進行通信,這幾乎相當於0.6%。

在流量數據中,記錄流量數據後加入黑名單的域名有4340個。表4詳細列出了所有數據和訓練數據中出現的惡意主機名、二級域和伺服器IP地址的類型。

⑦ CNN和Transformer相結合的模型

©作者 | 小欣

CNN廣泛應用於計算機視覺的各種任務中,比如分類,檢測,分割,CNN通過共享卷積核提取特徵,減少網路參數數量,提高模型效率,另一方面CNN具有平移不變性,即無論特徵被移動到圖像的哪個位置,網路都能檢測到這些特徵。

盡管CNN存在很多優勢,但是其感受野通常很小,不利於捕獲全局特徵。

視覺Transformer由於能夠捕獲一張圖片的全局信息,因此在許多視覺任務中超越許多CNN結構。

ViT是第一個替代CNN,使用純Transformer的結構,輸入一張224×224×3的圖片,ViT將其分成14×14=196個非重疊的patches,每個patch的大小是16×16×3,然後將這些patch輸入到堆疊的多個transformer編碼器中。

CNN的成功依賴於其兩個固有的歸納偏置,即平移不變性和局部相關性,而視覺Transformer結構通常缺少這種特性,導致通常需要大量數據才能超越CNN的表現,CNN在小數據集上的表現通常比純Transformer結構要好。

CNN感受野有限導致很難捕獲全局信息,而Transformer可以捕獲長距離依賴關系,因此ViT出現之後有許多工作嘗試將CNN和Transformer結合,使得網路結構能夠繼承CNN和Transformer的優點,並且最大程度保留全局和局部特徵。

Transformer是一種基於注意力的編碼器-解碼器結構,最初應用於自然語言處理領域,一些研究最近嘗試將Transformer應用到計算機視覺領域。

在Transformer應用到視覺之前,卷積神經網路是主要研究內容。受到自注意力在NLP領域的影響,一些基於CNN的結構嘗試通過加入自注意力層捕獲長距離依賴關系,也有另外一些工作直接嘗試用自注意力模塊替代卷積,但是純注意力模塊結構仍然沒有最先進的CNN結構表現好。

Transformer中有兩個主要部分,多頭自注意力層和全連接層,最近,Cordonnier et al.在研究中表明卷積可以通過使用多頭自注意力層達到同樣的效果。

Transformer 理論上比CNN能得到更好的模型表現,但是因為計算全局注意力導致巨大的計算損失,特別是在淺層網路中,特徵圖越大,計算復雜度越高,因此一些方法提出將Transformer插入到CNN主幹網路中,或者使用一個Transformer模塊替代某一個卷積模塊。

BoTNet.[1] 通過使用Multi-Head Self-Attention(MHSA)替代ResNet Bottleneck中的3×3卷積,其他沒有任何改變,形成新的網路結構,稱為Bottleneck Transformer,相比於ResNet等網路提高了在分類,目標檢測等任務中的表現,在ImageNet分類任務中達到84.7%的准確率,並且比EfficientNet快1.64倍。

BoTNet中使用的MHSA和Transformer中的MHSA有一定的區別,首先,BoTNet中使用Batch Normalization,而Transformer中使用Layer Normalization,其次,Transformer中使用一個在全連接層中使用一個非線性激活,BoT(Bottleneck Transformer)模塊中使用三個非線性激活,最後Transformer中的MHSA模塊包含一個輸出映射,而BoT中的MHSA沒有。

CNN有局部性和平移不變性,局部性關注特徵圖中相鄰的點,平移不變性就是對於不同區域使用相同的匹配規則,雖然CNN的歸納偏差使得網路在少量數據上表現較好,但是這也限制了在充分數據上的表現,因此有一些工作嘗試將CNN的歸納偏差引入Transformer加速網路收斂。

DeiT.[2] 為了減小ViT對於大量數據的依賴,Touvron et al.提出了Data-efficient image Transformer(Deit),提高網路在小量數據上的表現,通過使用數據增強和正則化技術,與此同時還引入了蒸餾策略,即使用一個教師網路去指導學生網路,通常來說使用CNN要比Transformer作為教師模型效果要好,CNN模型可以將其歸納偏置引入到Transformer。

作者使用兩種蒸餾方式,一種是硬蒸餾,一種是軟蒸餾 ,軟蒸餾通過計算學生模型和教師模型分別經過softmax之後的KL散度,硬蒸餾通過使用教師模型的預測作為真實標簽。

DeiT中引入了一個新的distillation token,和class token的作用類似,和其他token之間通過自注意力交互,作者發現class token和distillation token會收斂於不同的向量,餘弦距離為0.06,說明這兩個token希望得到相似但不相同的目標,為了證明distillation token的有效性是由於知識蒸餾的作用,通過對比實驗將distillation token換成class token,就是使用兩個class token,最終效果不如加入distillation token。

對比卷積神經網路和Transformer在Imagenet上的分類表現:

ConViT.[3] 通過引入gated positional self-attention(GPSA)層模仿卷積層帶來的局部性,將GPSA替代一部分 self-attention層,然後每一個注意力頭通過調整可學習的門控參數來調整對於位置信息和上下文信息的關注程度。GPSA層的輸出可以表示為:

其中,

是一個可學習的向量去模仿卷積,

是一個固定的相對位置編碼,

是一個可學習門控參數去調整對上下文和位置信息的關注程度。

Cordonnier et al.[4] 在論文中證明多頭自注意機制可通過調整頭的數量和可學習的位置編碼來近似達到卷積層的效果。

對比ConViT和DeiT在Imagenet-1k上的表現,以及不同大小訓練集對結果的影響

CeiT.[5] 改變了patch到token的方式,先將圖片通過卷積和最大池化再切分成patch,最開始對圖片使用卷積操作可以捕獲圖片的低級特徵,即I2

並且使用了Layer-wise class token Attention(LCA)去結合多層特徵,提出了Locally-Enhanced Feed-Forward Netword(LeFF),將最開始的全連接層(Feed-forward network)替換成了LeFF層,MSA(Multi-head self-attention)層保持不變,用於捕獲全局信息,LeFF層用於捕獲局部信息,最終的效果要比DeiT好。

Early Conv.[6] Xiao et al.通過使用多個步長為2的3×3卷積核替代ViT中最初的stem(步長為16的16×16卷積),使得網路在ImageNet-1k上取得1-2%的提高,並且穩定性和泛化能力在下游任務中都有所提高,對於學習率的選擇和優化器的選擇沒有那麼敏感,並且收斂速度也更快。

這篇文章表面在ViT模型中使用一個小的卷積核相比於最初的ViT使得模型有更好的泛化能力。

CoAtNet.[7] Dai et al. 提出a Convolution and Attention NetWord(CoAtNet),通過引入深度卷積到注意力模塊中,深度卷積中一個卷積核負責一個通道,一個通道只被一個卷積核計算,相比於正常卷積,其參數和運算成本相對比較低,在淺層網路中堆疊卷積層,比較了不同的堆疊方式,比如C-C-C-T,C-T-T-T,C-C-C-T,其中C代表卷積模塊,T代表Transformer模塊。

通過綜合考慮模型泛化能力,遷移能力,模型在訓練集上的表現,最後使用C-C-T-T 這種堆疊方式。在沒有額外訓練數據的情況下,CoAtNet達到了86%的准確率,在ImageNet-21K上預訓練時,達到了88.56%的准確率。

參考文獻

[1] A. Srinivas, T.-Y. Lin, N. Parmar, J. Shlens, P. Abbeel, and A. Vaswani, 「Bottleneck transformers for visual recognition.」 in Proc. CVPR, 2021.

[2] H. Touvron, M. Cord, D. Matthijs, F. Massa, A. Sablayrolles, and H. Jegou, 「Training data-effificient image transformers & distillation through attention,」 in Proc. ICLR, 2021.

[3] S. d』Ascoli, H. Touvron, M. Leavitt, A. Morcos, G. Biroli, and L. Sa gun, 「Convit: Improving vision transformers with soft convolutional inctive biases,」 in Proc. ICLR, 2021.

[4] Cordonnier, J.-B., Loukas, A., and Jaggi, M. On the relationship between self-attention and convolutional layers. arXiv preprint arXiv:1911.03584, 2019.

[5] K. Yuan, S. Guo, Z. Liu, A. Zhou, F. Yu, and W. Wu, 「Incorporating convolution designs into visual transformers,」 in Proc. ICCV, 2021.

[6] T. Xiao, M. Singh, E. Mintun, T. Darrell, P. Dollar, and R. B. Girshick, 「Early convolutions help transformers see better,」 ArXiv, vol. abs/2106.14881, 2021.

[7] Z. Dai, H. Liu, Q. V. Le, and M. Tan, 「Coatnet: Marrying convolution and attention for all data sizes,」 arXiv preprint arXiv:2106.04803, 2021.

私信我領取 目標檢測與R-CNN/數據分析的應用/電商數據分析/數據分析在醫療領域的應用/NLP學員項目展示/中文NLP的介紹與實際應用/NLP系列直播課/NLP前沿模型訓練營等 干貨學習資源。

⑧ 循環神經網路

花書中關於RNN的內容記錄於 https://www.jianshu.com/p/206090600f13 。

在前饋神經網路中,信息的傳遞是單向的,這種限制雖然使得網路變得更容易學習,但在一定程度上也減弱了神經網路模型的能力。在生物神經網路中,神經元之間的連接關系要復雜的多。 前饋神經網路可以看作是一個復雜的函數,每次輸入都是獨立的,即網路的輸出只依賴於當前的輸入。但是在很多現實任務中,網路的輸入不僅和當前時刻的輸入相關,也和其過去一段時間的輸出相關 。因此,前饋網路難以處理時序數據,比如視頻、語音、文本等。時序數據的長度一般是不固定的,而前饋神經網路要求輸入和輸出的維數都是固定的,不能任意改變。因此,當處理這一類和時序相關的問題時,就需要一種能力更強的模型。

循環神經網路(Recurrent Neural Network,RNN)是一類具有短期記憶能力的神經網路。在循環神經網路中,神經元不但可以接受其它神經元的信息,也可以接受自身的信息,形成具有環路的網路結構。 和前饋神經網路相比,循環神經網路更加符合生物神經網路的結構。循環神經網路已經被廣泛應用在語音識別、語言模型以及自然語言生成等任務上。循環神經網路的參數學習可以通過 隨時間反向傳播演算法 來學習。

為了處理這些時序數據並利用其歷史信息,我們需要讓網路具有短期記憶能力。而前饋網路是一個靜態網路,不具備這種記憶能力。

一種簡單的利用歷史信息的方法是建立一個額外的延時單元,用來存儲網路的歷史信息(可以包括輸入、輸出、隱狀態等)。比較有代表性的模型是延時神經網路。

延時神經網路是在前饋網路中的非輸出層都添加一個延時器,記錄最近幾次神經元的輸出。在第 個時刻,第 層神經元和第 層神經元的最近 次輸出相關,即:

延時神經網路在時間維度上共享權值,以降低參數數量。因此對於序列輸入來講,延時神經網路就相當於卷積神經網路

自回歸模型(Autoregressive Model,AR) 是統計學上常用的一類時間序列模型,用一個變數 的歷史信息來預測自己:

其中 為超參數, 為參數, 為第 個時刻的雜訊,方差 和時間無關。

有外部輸入的非線性自回歸模型(Nonlinear Autoregressive with ExogenousInputs Model,NARX) 是自回歸模型的擴展,在每個時刻 都有一個外部輸入 ,產生一個輸出 。NARX通過一個延時器記錄最近幾次的外部輸入和輸出,第 個時刻的輸出 為:

其中 表示非線性函數,可以是一個前饋網路, 和 為超參數。

循環神經網路通過使用帶自反饋的神經元,能夠處理任意長度的時序數據。

給定一個輸入序列 ,循環神經網路通過下面
公式更新帶反饋邊的隱藏層的活性值 :

其中 , 為一個非線性函數,也可以是一個前饋網路。

從數學上講,上式可以看成一個動力系統。動力系統(Dynamical System)是一個數學上的概念,指 系統狀態按照一定的規律隨時間變化的系統 。具體地講,動力系統是使用一個函數來描述一個給定空間(如某個物理系統的狀態空間)中所有點隨時間的變化情況。因此, 隱藏層的活性值 在很多文獻上也稱為狀態(State)或隱狀態(Hidden States) 。理論上,循環神經網路可以近似任意的非線性動力系統。

簡單循環網路(Simple Recurrent Network,SRN)是一個非常簡單的循環神經網路,只有一個隱藏層的神經網路。

在一個兩層的前饋神經網路中,連接存在相鄰的層與層之間,隱藏層的節點之間是無連接的。而 簡單循環網路增加了從隱藏層到隱藏層的反饋連接

假設在時刻 時,網路的輸入為 ,隱藏層狀態(即隱藏層神經元活性值) 不僅和當前時刻的輸入 相關,也和上一個時刻的隱藏層狀態 相關:

其中 為隱藏層的凈輸入, 是非線性激活函數,通常為Logistic函數或Tanh函數, 為狀態-狀態權重矩陣, 為狀態-輸入權重矩陣, 為偏置。上面兩式也經常直接寫為:

如果我們把每個時刻的狀態都看作是前饋神經網路的一層的話,循環神經網路可以看作是在時間維度上權值共享的神經網路 。下圖給出了按時間展開的循環神經網路。

由於循環神經網路具有短期記憶能力,相當於存儲裝置,因此其計算能力十分強大。 前饋神經網路可以模擬任何連續函數,而循環神經網路可以模擬任何程序。

定義一個完全連接的循環神經網路,其輸入為 ,輸出為 :

其中 為隱狀態, 為非線性激活函數, 和 為網路參數。

這樣一個完全連接的循環神經網路可以近似解決所有的可計算問題

循環神經網路可以應用到很多不同類型的機器學習任務。根據這些任務的特點可以分為以下幾種模式: 序列到類別模式、同步的序列到序列模式、非同步的序列到序列模式

序列到類別模式主要用於序列數據的分類問題:輸入為序列,輸出為類別。比如在文本分類中,輸入數據為單詞的序列,輸出為該文本的類別。

假設一個樣本 為一個長度為 的序列,輸出為一個類別 。我們可以將樣本 按不同時刻輸入到循環神經網路中,並得到不同時刻的隱藏狀態 。我們可以將 看作整個序列的最終表示(或特徵),並輸入給分類器 進行分類:

其中 可以是簡單的線性分類器(比如Logistic 回歸)或復雜的分類器(比如多層前饋神經網路)

除了將最後時刻的狀態作為序列表示之外,我們還可以對整個序列的所有狀態進行平均,並用這個平均狀態來作為整個序列的表示:

同步的序列到序列模式 主要用於序列標注(Sequence Labeling)任務,即每一時刻都有輸入和輸出,輸入序列和輸出序列的長度相同 。比如詞性標注(Partof-Speech Tagging)中,每一個單詞都需要標注其對應的詞性標簽。

輸入為序列 ,輸出為序列 。樣本 按不同時刻輸入到循環神經網路中,並得到不同時刻的隱狀態 。每個時刻的隱狀態 代表當前和歷史的信息,並輸入給分類器 得到當前時刻的標簽 。

非同步的序列到序列模式也稱為 編碼器-解碼器(Encoder-Decoder)模型,即輸入序列和輸出序列不需要有嚴格的對應關系,也不需要保持相同的長度。 比如在機器翻譯中,輸入為源語言的單詞序列,輸出為目標語言的單詞序列。

在非同步的序列到序列模式中,輸入為長度為 的序列 ,輸出為長度為 的序列 。經常通過 先編碼後解碼 的方式來實現。先將樣本 按不同時刻輸入到一個循環神經網路(編碼器)中,並得到其編碼 。然後再使用另一個循環神經網路(解碼器)中,得到輸出序列 。為了建立輸出序列之間的依賴關系,在解碼器中通常使用非線性的自回歸模型。

其中 分別為用作編碼器和解碼器的循環神經網路, 為分類器, 為預測輸出 的向量表示。

循環神經網路的參數可以通過梯度下降方法來進行學習。給定一個訓練樣本 ,其中 為長度是 的輸入序列, 是長度為 的標簽序列。即在每個時刻 ,都有一個監督信息 ,我們定義時刻 的損失函數為:

其中 為第 時刻的輸出, 為可微分的損失函數,比如交叉熵。那麼整個序列上損失函數為:

整個序列的損失函數 關於參數 的梯度為:

即每個時刻損失 對參數 的偏導數之和。

循環神經網路中存在一個遞歸調用的函數 ,因此其計算參數梯度的方式和前饋神經網路不太相同。在循環神經網路中主要有兩種計算梯度的方式: 隨時間反向傳播(BPTT)和實時循環學習(RTRL)演算法。

隨時間反向傳播(Backpropagation Through Time,BPTT) 演算法的主要思想是通過類似前饋神經網路的錯誤反向傳播演算法來進行計算梯度。

BPTT演算法將循環神經網路看作是一個展開的多層前饋網路,其中「每一層」對應循環網路中的「每個時刻」。在「展開」的前饋網路中,所有層的參數是共享的,因此參數的真實梯度是將所有「展開層」的參數梯度之和

因為參數 和隱藏層在每個時刻 的凈輸入 有關,因此第 時刻的損失函數 關於參數 的梯度為:

其中 表示「直接」偏導數,即公式 中保持 不變,對 求偏導數,得到:

其中 為第 時刻隱狀態的第 維; 除了第 個值為 外,其餘都為 的行向量。

定義誤差項 為第 時刻的損失對第 時刻隱藏神經層的凈輸入 的導數,則:

從而:

寫成矩陣形式為:

由此得到整個序列的損失函數 關於參數 的梯度:

同理可得, 關於權重 和偏置 的梯度為:

在BPTT演算法中,參數的梯度需要在一個完整的「前向」計算和「反向」計算後才能得到並進行參數更新。如下圖所示。

與反向傳播的BPTT演算法不同的是,實時循環學習(Real-Time Recurrent Learning)是通過前向傳播的方式來計算梯度。

假設循環神經網路中第 時刻的狀態 為:

其關於參數 的偏導數為:

RTRL演算法從第1 個時刻開始,除了計算循環神經網路的隱狀態之外,還依次前向計算偏導數 。

兩種學習演算法比較:

RTRL演算法和BPTT演算法都是基於梯度下降的演算法,分別通過前向模式和反向模式應用鏈式法則來計算梯度。 在循環神經網路中,一般網路輸出維度遠低於輸入維度,因此BPTT演算法的計算量會更小,但BPTT演算法需要保存所有時刻的中間梯度,空間復雜度較高。RTRL演算法不需要梯度回傳,因此非常適合於需要在線學習或無限序列的任務中

循環神經網路在學習過程中的主要問題是由於 梯度消失或爆炸問題 ,很難建模長時間間隔(Long Range)的狀態之間的依賴關系。

在BPTT演算法中,我們有:

如果定義 ,則:

若 ,當 時, ,會造成系統不穩定,稱為梯度爆炸問題;相反,若 ,當 時, ,會出現和深度前饋神經網路類似的梯度消失問題。

雖然簡單循環網路理論上可以建立長時間間隔的狀態之間的依賴關系,但是由於梯度爆炸或消失問題,實際上只能學習到短期的依賴關系。這樣,如果t時刻的輸出 依賴於 時刻的輸入 ,當間隔 比較大時,簡單神經網路很難建模這種長距離的依賴關系,稱為 長程依賴問題(Long-Term dependencies Problem)

一般而言,循環網路的梯度爆炸問題比較容易解決,一般 通過權重衰減或梯度截斷來避免。 權重衰減是通過給參數增加 或 范數的正則化項來限制參數的取值范圍,從而使得 。梯度截斷是另一種有效的啟發式方法,當梯度的模大於一定閾值時,就將它截斷成為一個較小的數。

梯度消失是循環網路的主要問題。除了使用一些優化技巧外,更有效的方式就是改變模型,比如讓 ,同時使用 ,即:

其中 是一個非線性函數, 為參數。

上式中, 和 之間為線性依賴關系,且權重系數為1,這樣就不存在梯度爆炸或消失問題。但是,這種改變也丟失了神經元在反饋邊上的非線性激活的性質,因此也降低了模型的表示能力。

為了避免這個缺點,我們可以採用一種更加有效的改進策略:

這樣 和 之間為既有線性關系,也有非線性關系,並且可以緩解梯度消失問題。但這種改進依然存在兩個問題:

為了解決這兩個問題,可以通過引入 門控機制 來進一步改進模型。

為了改善循環神經網路的長程依賴問題,一種非常好的解決方案是引入門控機制來控制信息的累積速度,包括 有選擇地加入新的信息,並有選擇地遺忘之前累積的信息 。這一類網路可以稱為基於門控的循環神經網路(Gated RNN)。本節中,主要介紹兩種基於門控的循環神經網路: 長短期記憶網路和門控循環單元網路。

長短期記憶(Long Short-Term Memory,LSTM)網路 是循環神經網路的一個變體,可以有效地解決簡單循環神經網路的梯度爆炸或消失問題。

在 基礎上,LSTM網路主要改進在以下兩個方面:

其中 和 三個門(gate)來控制信息傳遞的路徑; 為向量元素乘積; 為上一時刻的記憶單元; 是通過非線性函數得到的候選狀態:

在每個時刻 ,LSTM網路的內部狀態 記錄了到當前時刻為止的歷史信息。

在數字電路中,門(Gate)為一個二值變數{0, 1},0代表關閉狀態,不許任何信息通過;1代表開放狀態,允許所有信息通過。LSTM網路中的「門」是一種「軟」門,取值在(0, 1) 之間,表示 以一定的比例運行信息通過 。LSTM網路中三個門的作用為:

(1)遺忘門 控制上一個時刻的內部狀態 需要遺忘多少信息。
(2)輸入門 控制當前時刻的候選狀態 有多少信息需要保存。
(3)輸出門

閱讀全文

與參數共享是一種網路正則化嗎相關的資料

熱點內容
為什麼說創業必須會網路營銷 瀏覽:988
網路電視機頂盒如何安裝軟體 瀏覽:426
蘋果開發者賬號網路錯誤 瀏覽:534
網路犬有哪些 瀏覽:458
網路盒子哪個直播軟體清晰 瀏覽:166
如何修改路由器密碼和網路名稱 瀏覽:742
為什麼用路由器網路很卡 瀏覽:997
網路中聯接共享列印機時總閃退 瀏覽:531
電腦網路老是接不上怎麼辦 瀏覽:591
麥吉如何更換網路連接 瀏覽:60
網路癱瘓換句話怎麼說 瀏覽:335
網路神經結構設置 瀏覽:517
聯通網路卡怎麼連接電視 瀏覽:108
wifi經常沒有網路服務怎麼辦 瀏覽:256
網路營銷引流一般需要多少錢 瀏覽:808
聯想300關網路的按鈕是哪個 瀏覽:790
監控網路超時什麼意思怎麼解決 瀏覽:731
怎麼給一個應用設置網路加速 瀏覽:80
全屋wifi加網路tv 瀏覽:427
怎麼恢復忽略的網路 瀏覽:124

友情鏈接