RNN(Recurrent Neural Network),中文稱循環神經網絡,是一種在NLP,時間序列等領域中常用的深度學習模型。本文將為大家展示RNN的結構以及它的基本原理。
我們從一個例子開始。
小明午飯吃什么
小明喜歡吃三種食物,火鍋、面條和餃子,他午飯會依次吃這三種,比如第1天吃火鍋,那么第2天就吃面條,第3天吃餃子,第4天再吃火鍋,以此類推。
要知道小明明天中午吃什么,只要知道他今天中午吃的食物,就能推出來。這個過程用數學描述一下,將火鍋、面條、餃子分別用[1, 0, 0]T, [0, 1, 0]T, [0, 0, 1]T這三個向量表示,午飯順序用矩陣表示,為如下形式:
這個矩陣起個名字,叫食物輪換矩陣,它用於表示小明午飯吃的食物的輪換順序。
午飯還要看天氣
現在把問題稍復雜一點,小明每天早上會看一下今天的天氣,如果是晴天,那么他就選擇上午出去玩,中午吃的會和昨天一樣;而如果是雨天,那么他上午在家里做飯,所以還會按順序吃新的午飯。比如小明第1天吃的是火鍋,第2天是晴天,那么他中午還會接着吃火鍋。第3天是雨天,他會吃新的食物,按順序是面條。
同樣,這個過程用數學描述一下。首先看食物,我們在食物輪換矩陣之上,再加上一個單位矩陣。新的矩陣與食物向量相乘,得到一個新的向量,這個向量的前半部分與食物向量相同,表示與相乘的食物向量一樣的食物,后半部分表示該食物向量下一次序的食物,我們把這個向量叫做食物選擇向量。
再看天氣信息,將晴天、雨天分別用[1, 0]T, [0, 1]T這兩個向量表示,這里天氣輪換矩陣,用天氣輪換矩陣乘上天氣向量,運算結果我們稱為天氣選擇向量,它表示在當前天氣下,吃的食品是否和前一次一樣。比如天氣矩陣乘上晴天向量,結果向量前3位是1,后3位是0,這表示在【晴天】條件下,吃的食物跟上次一樣。
等一下,大家這里可能會有疑問,為啥天氣信息就非得表示成這個樣子?為啥前3位是1,后3位是0就表示食品跟之前一樣?
如果有這個疑問,大家可以看一下前文構造的食物選擇向量,通過食物的矩陣運算得到的食物選擇向量,前3位與后3位,表示的是跟上次一樣的食物和新的食物。現在為了把天氣因素也反映到運算里,所以自然想到用同樣結構的向量來表示天氣的影響是選擇一樣的食物(前3位是1)還是選擇新的食物(后3位是1)。
食物方面的計算和天氣方面的計算有了一樣的結構(6行1列向量),和結構對應的意義,這里將食物選擇向量與天氣選擇向量相加,然后通過一個“激活函數”(實際上就是將結果是2的一位,變成1,其他位變成0),得到一個新的6行1列向量,然后將這個向量的上下兩部分對位相加,就得到了最后的結果,也就是新的食物向量。
將午飯推斷過程用神經網絡表示
現在我們將上述根據食物序列和每天的天氣,推斷午飯的過程,畫成一個神經網絡的形式:
這里食物向量是h[t-1] (這里我用[]符號表示下標),食物輪換矩陣是W[h],天氣向量是x[t],天氣輪換矩陣是W[x]。這個網絡表示,我們根據食物向量h[t-1],和天氣向量x[t],推算出了新的食物向量h[t]。
這里,重點來了,新的食物向量h[t],是不是可以作為一個新的食物輸入這個網絡,再結合新的輸入天氣x[t+1],推出再下一次的食物h[t+1],就像下圖這樣:
說到這里,大家就發現了,這不就是RNN么,所謂循環神經網絡,就是將每次輸出的結果h[t],作為新的輸入,再結合每次輸入網絡的x,運算得到新的結果h[t+1]。所以這里再放經典RNN的結構圖和公式,大家應該就很好理解了。
這里激活函數選擇了tanh。
所以通過上述例子,大家也很容易明白,為什么說RNN的參數W[x]和W[h]是“共享”的,因為這些綠色單元格,都是用的同一個網絡,每次更新的,就是這個網絡中的參數W[x]和W[h],輸入的是不同的x,循環的是h。