本文是「小孩都看得懂」系列的第六篇,本系列的特点是极少公式,没有代码,只有图画,只有故事。内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!
-
-
-
-
小孩都看得懂的循环神经网络
本文受以下两部视频所启发,但用了我最喜欢的 NBA 巨星哈登举例。
-
Luis Serrano 的「A friendly introduction to RNNs」
-
Brandon Rohrer 的「How RNNs and LSTM Work」
纯纯的致敬!
1
首先聊聊场景,哈登进攻有三招,三分,扣篮和传球。
观众喝彩有两种:NB 和 SB (喝倒彩)。
如下图所示,用向量来表示三种招式和两种喝彩。
再往下继续看时,希望读者脑子里就记着以下对应关系:
-
三分:[1 0 0]
-
扣篮:[0 1 0]
-
传球:[0 0 1]
-
NB:[1 0]
-
SB:[0 1]
2
先看看一个最简单的例子:
-
当观众喊 NB 时,哈登就拔三分
-
当观众喊 SB 时,哈登就扣篮泄愤
这样我们用一个神经网络来讲「观众的喝彩」和「哈登的招式」连接起来。
-
NB → 三分
-
SB → 扣篮
神经网络其实就是一堆参数,我们用矩阵来表示这些参数好不好?具体公式见下图,大家来用矩阵乘以向量来验证一下上面两组联系。
为了进一步讲明「神经网络就是一堆参数」,我们可视化下神经网络,如下图。关键记住
-
矩阵的行代表第一层神经元,一行有 2 个元素,第一层有 2 个神经元
-
矩阵的列代表第二层神经元,一列有 3 个元素,第二层有 3 个神经元
下面两图完整的可视化两种喝彩和招式的联系。
-
NB → 三分
-
SB → 扣篮
本小节介绍的就是全连接神经网络 (Fully Connected Neural Network, FCNN) 的极简版本。
3
但哈登发招是连续的,下图就是一系列发招顺序。
三分 → 扣篮 → 传球
→ 三分 → 扣篮 → 传球 ...
这些招式都是一个接一个哦,可以用循环神经网络连接它们呢。
还记得神经网络其实就是一堆参数吗?那循环神经网络也就是另一堆参数嘛,就是下面这个矩阵。
我们来可视化循环神经网络,注意我们故意不画出权重为 0 的箭头 (太多看起来乱),循环神经网络和普通神经网络最大的区别就是下面那条回形线。本次输出可作为下次输入,就这么简单。
好了,读者来验证下,用循环神经网络这个矩阵来乘以不同招式的向量是不是可以得到下一个招式的向量?
本小节介绍的是循环神经网络 (Recurrent Neural Network, RNN) 的极简版本,同样也是不现实的版本。
4
哈登是个人,不会像机器那样一直不停的「三分 → 扣篮 → 传球」机械发招。哈登是有情绪的,他会根据观众喝彩来决定如何出招的:
观众喊 NB,那么哈登觉得自己不会改变打法,上招出什么下招还是出什么,好用呗。
观众喊 SB,那么哈登就会陷入自我怀疑,是不是上招打法不合理,那么他会这样调整:
-
上招是三分,那么下招是扣篮
-
上招是扣篮,那么下招是传球
-
上招是传球,那么下招是三分
所以带情绪的出招序列如下。
现在我们来分析两个重要矩阵:招式矩阵和喝彩矩阵。
先看招式矩阵,它的输入是本轮招式,输出是「本轮招式 + 下轮招式」
再看喝彩矩阵,它就把观众的喝彩声拉长了些。为什么要这么做呢?只是为了要把「输出向量的大小」和「招式矩阵矩阵的输出向量的大小」设计的一样,这样才能做之后的合并操作。
骚操作来了,让我们把两个矩阵水平合并。
再乘以以 [招式 喝彩] 为格式的向量,比如
-
[三分 SB] = [1 0 0 0 1]
-
[扣篮 SB] = [0 1 0 0 1]
-
[传球 SB] = [0 0 1 1 0]
等等。
这样得到的向量是 [1 0 0 1 2 1],看起来难以解释,但是我们注意
-
2 是里面最大的元素,是真正的信息,我们希望保留它
-
0 和 1 都是噪声,我们希望剔除它们
那么可以试一下非线性函数哦,比如 RELU?
深度学习不是总用各种转换函数吗?这里用到的函数将该向量中最大值变成 1,其余值变成 0,得到 [0 0 0 0 1 0]。
最后再把 [0 0 0 0 1 0] 拆成两个小向量再加一起,不就有点类似池化 (pooling) 吗?但用的不是平均池化,不是最大池化,而是加总池化。哎,都为了解释效果,因此没那么严谨,get 到那个意思就行。
最后得到的输出是 [0 1 0],这向量不就是我们的老朋友扣篮么?
现在开始看一套完整的循环神经网络流程图,从输入开始。我们输入是三分 + SB。
三分和 SB 乘上对应的招式矩阵和喝彩矩阵得到两个 6 × 1 的向量,向量意思上面已经解释过。
将这两个向量相加。
再对加总的向量做非线性转化,去掉噪声只留下最显著的信息。
再把这个 6 × 1 的向量分拆成两个 3 × 1 的向量并加总,最后得到 [0 1 0],那就是扣篮。因此哈登投完三分后,如果观众喊 SB,那么哈登下一动作就是扣篮。
最后画出回形线使得该网络变成循环神经网络,这样哈登就可以一直根据本轮的出招和观众的喝彩和决定下轮的出招了。
总结
图画得太好了,任何文字的总结都是废话。觉得好就帮我传播这个看不懂算我输系列咯,谢谢大家 & 国庆快乐!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:小孩都看得懂的循环神经网络 - Python技术站