一文搞懂什么是RNN(超直观易懂)
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。