人工智能大火的当下,随便搜一搜RNN,文章就一堆,很多讲理论的,也有很多附上代码的。不过咱看了理论后自己写不出代码,看人家的代码也总是掌握不到要点。自己真正用到的时候还是懵。
那么,本文就记录一下我这个小白的学习思路吧。
什么是rnn?
你以为我要列出公式推导或者原理图了吗?不不不,我只会放链接:
原理性介绍https://blog.csdn.net/zhaojc1995/article/details/80572098
其实关于理论和代码网上可以找到很多很多了。因此就引用一下大佬的文章。接下来我就谈谈自己对RNN的理解:(个人理解,如有不同见解欢迎讨论!)
1)本质上来讲,
RNN是一种计算方法,
是一个值到另一个值的映射,
是一个复杂的函数。
2)RNN的所谓“记忆”,其实可以理解为前面的输入信息会影响到下一次的计算
3)RNN的介绍中很多“长期记忆”“短期记忆”“遗忘”等词汇的使用只是数学计算公式效果的一种形象化表示。不要因此觉得RNN有多么的智能和类人。
下面这张图是从这个博客里截的
其实呢,从数学角度上看,就是一个向量x经过线性变换得到了h然后h经过非线性变换得到了o,然后o和y比较得到了L。
1)x经过线性变换得到了h h=Ux + Wh‘(用到线性代数知识,U,W是矩阵,是可以反向更新的参数;h’是上一时刻的h值)
2)非线性变换有很多种啦,关键在于“非线性”。如,tanh()函数
3)o就是预测值,y是实际值
4)L 即loss反映了预测值和实际值的差距,也是有很多数学公式可以实现,如,Cross-entropy loss,softmax-cross-entropy-loss 等,(其实你用 L = o-y 得到L也算是一种方法,就是这种方法太直接,不太好用罢了。在具体运用时也要根据不同情况来选择不同的损失函数。)
那么RNN“引以为傲”的“记忆”体现在哪里呢?
就是图中的那个红圈圈住的循环。
简单来说就是:在计算h时要用到前一时刻的h值和当前的x输入。这不就是考虑到了原来的输入了吗,考虑到了原来的输入,上一时刻的输入对本次输入有影响,这不就是“记忆”的体现吗。所以,还是说,形象化的表达在提升了科学技术亲民性的同时,也为科技蒙上了一层玄幻的面纱。其实放平心态慢慢探索就好。
RNN代码实例
简单的代码实现(MNIST数据集识别):https://luanshiyinyang.github.io/pytorch/2019/04/21/RNN/
在运行过程中如果遇到错误:
就把num_workers=4改成num_workers=0就好,涉及到’进程‘的知识,我想以后慢慢研究,要是有了解具体原因的小伙伴期待告知~
其实要是想从头实现RNN是挺困难的,因为涉及到很多公式的推导,把这些公式,更新过程改成代码也不容易不是。现在又很多神经网络的构架,如pytorch,tensorflow,kares等等。就是已经把函数写好了,只需要调用,配置参数就可以实现RNN。
我们要了解rnn的原理,以及常见的网络结构,对参数的配置就会很清楚了。
下面的代码是pytorch下的结构设置
class RNN(nn.Module):
def __init__(self):
super(RNN, self).__init__()
self.rnn = nn.LSTM( # 这里使用LSTM(长短时记忆单元)
input_size=28, # 图片的行数据
hidden_size=64, # 隐层单元数目
num_layers=1, # 这样的层数目
batch_first=True, # batch_size是否为第一个维度如(batch_size, time_step, input_size)
)
self.output = nn.Linear(64, 10) # 这里使用全连接输出
#原文链接:https://luanshiyinyang.github.io/pytorch/2019/04/21/RNN/
这里输入和输出这两个参数都明白是怎么回事了,batch_first也可以查到
关于num_layer我的困惑比较大,什么是RNN的层数呢?
是这样的,在上面的图中,x经过线性变换得到了h,h非线性变换得到了o,这样的只是一层的结构,如果我得到o之后再把o当成输入,输入到同样的构架中呢?这就多了一层了。这就是RNN的层数概念。(详情参见下面两篇文章)
https://www.cnblogs.com/curtisxiao/p/10830369.html
和http://www.pianshen.com/article/4068257457/
下面的图片引用自:[http://www.pianshen.com/article/4068257457/]这篇文章就说明了RNN层数的问题。(http://www.pianshen.com/article/4068257457/)