东莞营销网站开发,裙晖wordpress,青岛开发区人才网,镇江本地网站一、简介
循环神经网络#xff08;Recurrent Neural Network#xff09;是深度学习领域中一种非常经典的网络结构#xff0c;在现实生活中有着广泛的应用。以槽填充#xff08;slot filling#xff09;为例#xff0c;如下图所示#xff0c;假设订票系统听到用户说Recurrent Neural Network是深度学习领域中一种非常经典的网络结构在现实生活中有着广泛的应用。以槽填充slot filling为例如下图所示假设订票系统听到用户说“我想在 6 月 1 日抵达上海。”系统有一些槽slot目的地和到达时间系统要自动知道这边的每一个单词是属于哪一个槽比如“上海”属于目的地槽“6 月 1 号”属于到达时间槽。 这个问题可以用一个前馈神经网络feedforward neural network解决如下图所示输入是一个单词把“上海”变成一个向量“丢”到这个神经网络里面。要把一个单词丢到一个神经网络里面去就必须把它变成一个向量。 把单词变成一个向量我们又需要用到我们之前介绍过很多次的独热编码向量的大小是词 典大小。每一个维度对应词典的一个单词。对应单词的维度为 1其他为 0。 这里会有一个问题因为很多单词可能都没有见过所以需要在独热编码里面多加维度用一个维度代表 other如下图所示。如果不是在词表中有的单词就归类到 other 里面去。
我们可以用每一个单词的字母来表示它的向量比如单词是 appleapple 里面有出现 app、ple、ppl在这个向量里面对应到 app、ple、ppl 的维度就是 1其他都为 0。
假设把单词表示为向量把这个向量丢到前馈神经网络里面去在该任务里面输出是一个概率分布该概率分布代表着输入单词属于每一个槽的概率比如“上海”属于目的地的概率和“上海”属于出发地的概率。
但是前馈网络会有问题如下图所示假设用户 1 说“在 6 月 1 号抵达上海”。用户 2 说“在 6 月 1 号离开上海”这时候“上海”就变成了出发地。
但是对于神经网络输入一样的东西输出就应该是一样的东西。在例子中输入“上海”输出要么让目的地概率最高要么让出发地概率最高。不能一会让出发地的概率最高一会让目的地概率最高。
如果神经网络有记忆力的它记得它看过“抵达”在看到“上海”之前或者它记得它已经看过“离开”在看到“上海”之前。通过记忆力它可以根据上下文产生不同的输出。如果让神经网络是有记忆力其就可以解决输入不同的单词输出不同的问题。
二、循环神经网络RNN
这种有记忆的神经网络称为循环神经网络。在 RNN 里面每一次隐藏层的神经元产生输出的时候该输出会被存到记忆元memory cell可简称为单元图中的蓝色方块表示记忆元。 下一次有输入时这些神经元不仅会考虑输入 x1, x2还会考虑存到记忆元里的值。x1, x2以及存在记忆元里的值 a1, a2 都会影响神经网络的输出。
举个例子假设下图中的神经网络所有的权重都是 1w1所有的神经元没有任何的偏置biasb0。假设所有的激活函数都是线性的yx输入是序列 [1, 1]T, [1, 1]T, [2, 2]T, · · · 所有的权重都是 1。 把这个序列输入到神经网络里面去会发生什么事呢要使用这个循环神经网络的时候必须要给记忆元初始值设初始值都为是 0。输入第一个 [1, 1]T对左边的神经元第一个隐藏层其除了接到输入的 [1, 1]T还接到了记忆元 (0 跟 0)输出就是 2。 简单解释一下计算过程激活函数全是yx左边的神经元的输出等于两个输入经过激活函数得到的y再加上两个记忆元中记录的值。 同理右边神经元的输出为 2第二层隐藏层输出第一个隐藏层通过激活函数也是yx两个y相加为 4。 接下来循环神经网络会将绿色神经元的输出存在记忆元里去所以记忆元里面的值被更新为2。
如下图所示接下来再输入 [1, 1]T接下来绿色的神经元输入为 [1, 1]T、[2, 2]T输出为 [6, 6]T第二层的神经元输出为 [12, 12]T。所以因为循环神经网络有记忆元就算输入相同输出也可能不一样。
同样的过程[6, 6]T 存到记忆元里去接下来输入是 [2, 2]T输出为 [16, 16]T第二层隐藏层为 [32, 32]T。在做循环神经网络时它会考虑序列的顺序输入序列调换顺序之后输出不同。
三、RNN架构
还是用之前的例子用户说“我想在 6 月 1 日抵达上海”“抵达”就变成了一个向量“丢”到神经网络里面去神经网络的隐藏层的输出为向量 a1a1产生“抵达”属于每一个槽填充的概率 y1。
接下来 a1 会被存到记忆元里面去“上海”会变为输入这个隐藏层会同时考虑“上海”这个输入和存在记忆元里面的 a1得到 a2。根据 a2 得到y2y2 是属于每一个槽填充的概率。三次使用的相同的神经网络
有了记忆元以后输入同一个单词希望输出不同的问题就有可能被解决。 如下图所示同样是输入“上海”这个单词但是因为红色“上海”前接了“离开”绿色“上海”前接了“抵达”“离开”和“抵达”的向量不一样隐藏层的输出会不同所以存在记忆元里面的值会不同。 虽然 x2的值是一样的因为存在记忆元里面的值不同所以隐藏层的输出会不同所以最后的输出也就会不一样。