1. 程式人生 > >網路流量預測入門(一)之RNN 介紹

網路流量預測入門(一)之RNN 介紹

[toc] # 網路流量預測入門(一)之RNN 介紹 瞭解RNN之前,神經網路的知識是前提,如果想了解神經網路,可以去參考一下我之前寫的部落格:[資料探勘入門系列教程(七點五)之神經網路介紹](https://www.cnblogs.com/xiaohuiduan/p/12623925.html) and [資料探勘入門系列教程(八)之使用神經網路(基於pybrain)識別數字手寫集MNIST](https://www.cnblogs.com/xiaohuiduan/p/12635624.html) 這篇部落格介紹RNN的原理,同時推薦大家去看李巨集毅老師的課程:[ML Lecture 21-1: Recurrent Neural Network (Part I)](https://www.youtube.com/watch?v=xCGidAeyS4M&t=1101s&ab_channel=Hung-yiLee)。基本上看完他的課程,也就沒有必要看這篇部落格了。 ## RNN簡介 RNN全稱**Recurrent Neural Network** ,中文名為迴圈神經網路(亦或稱遞迴神經網路)。相信大家在看這篇部落格之前都已經簡單的瞭解過RNN。將RNN說的簡單一點,就是進行預測(或者回歸)的時候,不僅要考慮到當前時刻的輸入,還要考慮上一個時刻的輸入(甚至有些RNN的變種還會考慮未來的情況)。換句話說,預測的結果不僅與當前狀態有關,還與上一個時刻的狀態有關。 RNN用於處理時序資訊 。而在傳統的神經網路中,我們認為輸入的 $x_1,x_2,x_3$,是相互獨立的:比如說在**Iris**分類中,我們認為鳶尾花的長寬是獨立的,之間不存在前後序列邏輯關係。 ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120442391-39506956.png) 儘管傳統的神經網路在預測中能夠取得不錯的成績(比如說人臉識別等等),但是對於以下方式情景可能就愛莫能助了。 ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120442735-600176405.png) 當我們想要預測一段話“小丑竟是我自____”時,我們必須根據前文的意思來predict。而RNN之所以叫做迴圈(recurrent),這是因為它的預測會考慮以前的資訊。換句話說,也就是RNN具有**memory**,它“記得”之前計算後的情況。 在知乎[全面理解RNN及其不同架構](https://zhuanlan.zhihu.com/p/34152808)上,說了一個很形象的例子: > 以捏陶瓷為例,不同角度相當於不同的時刻: > > ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120442926-1331576597.jpg) > > - 若用前饋網路:網路訓練過程相當於不用轉盤,而是徒手將各個角度捏成想要的形狀。不僅工作量大,效果也難以保證。 > - 若用遞迴網路(RNN):網路訓練過程相當於在不斷旋轉的轉盤上,以一種手勢捏造所有角度。工作量降低,效果也可保證。 ## RNN 結構 RNN的原理圖,我們最多見的便是如左圖所示,但是實際上將它展開,便是如下右圖所示。 ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120443152-1136961212.jpg) 1. 在RNN中,我們可以將黃框稱之為一個layer,所有的layer的**引數**在一個batch中是相同的(引數共享),也就是說,上圖中的 $U,W,V$ 等引數在某個batch全部相同。(通過一個batch的訓練之後,經過反向傳播,引數會發生改變) 2. Layer的層數根據自己的需要來定,舉個例子,比如說我們分析的句子是5個單詞構成的句子,那麼layer的層數便是5,每一個layer對應一個單詞。 3. 上圖既有多個輸入$X_{t-1},X_{t},X_{t+1}$ , 也可以有多個輸出$O_{t-1},O_{t},O_{t+1}$ , 但是實際上輸出可以根據實際的需要而定,既可以為多個輸出,也可以只有一個輸出,有如下幾種: | **Type of RNN** | **Illustration** | **Example** | | -------------------------- | -------------------------------------------- | -------------------------- | | One-to-one $T_x=T_y=1$ | ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120443357-1684700888.png) | Traditional neural network | | One-to-many $T_x=1, T_y>1$ | ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120443605-1961147767.png) | Music generation | | Many-to-one $T_x>1, T_y=1$ | ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120443803-1432149687.png) | Sentiment classification | | Many-to-many $T_x=T_y$ | ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120443989-430482236.png) | Name entity recognition | | Many-to-many $T_x\neq T_y$ | ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120444282-292207015.png) | Machine translation | Gif圖如下所示: ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120444951-1934166239.gif) 下圖是李巨集毅老師在課堂上講的一個例子。 ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120447833-292636114.png) ## RNN原理 ### 結構原理 下面是來自[Recurrent Neural Networks cheatsheet](https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-recurrent-neural-networks)對RNN原理的解釋: ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120448186-1458623014.png) $a^{}$ 和 $y^{}$ 的表示式如下所示: $$ a^{}=g_{1}\left(W_{a a} a^{}+W_{a x} x^{}+b_{a}\right) \quad \text { and } \quad y^{}=g_{2}\left(W_{y a} a^{}+b_{y}\right) $$ - $W_{a x}, W_{a a}, W_{y a}, b_{a}, b_{y}$ 在時間上是共享的:也就是說,在一個batch中,無論是哪一個layer,其$W_{a x}, W_{a a}, W_{y a}, b_{a}, b_{y}$都是相同的(shared temporally)。當然,經過一個batch的訓練之後,其值會因為反向傳播而發生改變。 - $g_{1}, g_{2}$ 皆為啟用函式(比如說tanh,sigmoid) ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120448515-1139681002.png) ### 損失函式$E$ $ \mathcal{L}$ 為可微分的損失函式,比如交叉熵,其中$y^{}$為t時刻正確的詞語,$\hat{y}^{}$為t時刻預測的詞語。 $$ \mathcal{L}^{} = \mathcal{L}(\hat{y}^{}, y^{}) \\ {E}(\hat{y}, y)=\sum_{t=1}^{T_{y}} \mathcal{L}^{} $$ ### 反向傳播 反向傳播目的就是求預測誤差 $E$ 關於所有引數 $(U, V, W)$ 的梯度, 即 $\frac{\partial E}{\partial U}, \frac{\partial E}{\partial V}$ 和 $\frac{\partial E}{\partial W}$ 。關於具體的推導可以參考[迴圈神經網路(RNN)模型與前向反向傳播演算法](https://www.cnblogs.com/pinard/p/6509630.html)。 ![](https://img2020.cnblogs.com/blog/1439869/202101/1439869-20210125120448712-985284068.jpg) 知道梯度後,便可以對引數係數進行迭代更新了。 ## 總結 在上述部落格中,簡單的對RNN進行了介紹,介紹了RNN作用,以及部分原理。而在下篇部落格中,我將介紹如何使用keras構建RNN模型寫唐詩。