阅读大概需要8分钟 跟随小博主,每天进步一丢丢
作者 刘博 链接 https://zhuanlan.zhihu.com/p/32755043
昨天的是理论篇,想看的小伙伴点击这里啦。
导读
用Excel实现循环神经元的前向传播
我们先来看看输入。
我们对输入进行one-hot编码。这是因为我们的整个词汇表只有四个字母{h,e,l,o}。
接下来我们将利用
把输入转换为隐藏状态,这里我们采取随机的方式将权重初始化为3x4的矩阵。
(注:这里矩阵的大小为什么是3x4?因为我们想计算
其中
是4x1的one-hot矩阵,根据矩阵乘法运算的法则,
大小必须是nx4,n一般取比4小的值,因此
的矩阵维度取3x4)
步骤1:
输入网络的第一个字母是“h”, 我们想要得到隐藏层状态,那么首先我们需要计算
。通过矩阵相乘,我们得到
步骤2:
现在我们看一下循环神经元, 权重
是一个1x1的矩阵,值为0.427043,偏差也是1x1的矩阵,值为0.56700.
对于字母“h”,没有前一个状态,所以我们也可以认为前一个状态是[0,0,0,0]。
接下来计算
(译者注:读者一定注意到了,1x1的矩阵与一个4x1的矩阵相乘再加上一个1x1的矩阵,根据矩阵乘法的规则,是无法运算的。因此这里应该是使用了矩阵广播运算,而得到的结果应该是4x1的矩阵,而不是3x1的矩阵,但是被强制转换为了3x1的矩阵,原因是步骤1的输出结果是3x1的矩阵,接下来的步骤3将计算步骤1和步骤2的相加,所以步骤2的输出必须是3x1)
步骤3:
Ok,有了前两步,我们就可以计算当前循环神经元的状态了,根据以下公式
将前两步的结果代入公式即可得到当前步的状态,计算如下
步骤4:
现在我们继续关注下一个字母“e”被传入网络。上一步计算得到的
现在变成了这一步的
,而e的one-hot向量是
.现在我们来计算以下这一步的
.
首先计算
再计算
(译者注:注意观察,计算上一步的状态与计算此步骤的状态使用的权重是一样的,也就是说使用的是同样的
和
,所以说循环神经元的特点是**权重共享)
步骤5:
有了步骤4的结果,代入公式可得输入字母“e”后的状态
同样,这一步得到的状态将变成下一步的
,而循环神经元将使用这个状态和新输入字母来计算下一个状态.
步骤6:
在每一个状态,循环神经元还会计算输出. 现在我们来计算一下字母e的输出
(译者注:注意,一个循环神经元根据输入和前一时间步的状态计算当前时间步的状态,然后根据当前时间步的状态计算输出。另外需要注意的是,这里的
的维度大小是4x3,这是因为我们想得到4x1的输出,因为one-hot的维度是4x1,而通过下一步的计算每一个维度可以代表该维度的字母出现的概率)
步骤7:
通过应用softmax函数,我们可以得到词汇表中一个特定字母的出现的概率,所以我们现在计算
我们来理解一下得到的概率值。我们看到,这个模型认为字母e后面将出现的字母是h,因为概率最高的是代表字母h的那一维。可是实际上下一个字母应该是l,我们哪里做错了吗?并没有,只是我们还没有训练我们的网络。
好,我们面对的下一个大问题就是:RNN网络中如何实现后向传播?如何通过反馈循环来升级我们的权重?
循环神经网络的后向传播(BPTT)
很难凭想象理解一个递归神经网络的权重是如何更新的。因此,为了理解和可视化反向传播,让我们按照时间步展开网络。在其中我们可以计算也可以不计算每一个时间步的输出。
在向前传播的情况下,输入随着每一个时间步前进。在反向传播的情况下,我们“回到过去”改变权重,因此我们叫它通过时间的反向传播(BPTT)。
如果
是预测值,
是对应的实际值,那么,误差通过交叉熵损失来计算:
我们通常把整个序列(单词)看作一个训练样本,所以总的误差是每个时间步(字符)中误差的和。权重在每一个时间步长是相同的(所以可以计算总误差后一起更新)。让我们总结一下反向传播的步骤。
展开的网络看起来像一个普通的神经网络。反向传播也类似于普通的神经网络,只不过我们一次得到所有时间步的梯度。我知道你在担心什么,现在如果有100个时间步,那么网络展开后将变得非常巨大(这是个挑战性的问题,我们后面讲介绍如何克服)。
如果你不想深入了解这背后的数学,所有你需要知道的是,按照时间步展开后的反向传播类似于常规神经网络的反向传播。