在前面内容中,笔者和大家一起学习了深度神经网络 DNN 和卷积神经网络 CNN,其中我们在 CNN 上花了大量时间和精力对其基本原理和应用以及在计算机视觉领域的应用进行了详细的介绍。从本节开始,笔者将和大家一起学习一种新的神经网络结构——循环神经网络(Recurrent Neural Networks)。
相较于 CNN 在图像识别和检测方面的广泛应用,基于序列模型的 RNN 的应用方面则是语音识别、文本翻译和自然语言处理等其他更为激动人心的领域。所以,正如 CNN 在计算机视觉中的应用一样,在 RNN 中笔者将重点关注其在自然语言处理的应用与研究。
在前面内容中,笔者和大家一起学习了深度神经网络 DNN 和卷积神经网络 CNN,其中我们在 CNN 上花了大量时间和精力对其基本原理和应用以及在计算机视觉领域的应用进行了详细的介绍。从本节开始,笔者将和大家一起学习一种新的神经网络结构——循环神经网络(Recurrent Neural Networks)。
相较于 CNN 在图像识别和检测方面的广泛应用,基于序列模型的 RNN 的应用方面则是语音识别、文本翻译和自然语言处理等其他更为激动人心的领域。所以,正如 CNN 在计算机视觉中的应用一样,在 RNN 中笔者将重点关注其在自然语言处理的应用与研究。
RNN 使用场景
相较于 DNN 和 CNN,RNN 网络结构有什么特别之处?它与前两者又有哪些不一样的结构设计?在对 RNN 的结构进行深入了解之前,我们必须对使用 RNN 面临的问题场景进行梳理。假设我们在进行语音识别时,给定了一个输入音频片段 x,要求我们输出一个文本片段 y,其中输入 x 是一个按照时间播放的音频片段,y 是一个按照顺序排列的单词组成的一句话,所以在 RNN 中我们的输入输出都是序列性质的。针对这样的输入输出(x,y)的有监督学习,最适合的神经网络结构就是循环神经网络。为什么循环神经网络就最适用这种场景?在正式介绍 RNN 前,我们先来看下对于序列问题使用常规的神经网络看看会有什么问题。
假设我们现在需要对输入的一段话识别其中每个单词是否是人名,即输入是一段文本序列,输出是一个每个单词是否是人名的序列。假设这段话有9个单词,我们将其转化为 9 个 one-hot 向量输入到标准神经网络中去,经过一些隐藏层和激活函数得到最终 9 个值为 0/1 的输出。但这样做的问题有两个:
一是输入输出的长度是否相等以及输入大小不固定的问题。在语音识别问题中,输入音频序列和输出文本序列很少情况下是长度相等的,普通网络难以处理这种问题。
二是普通神经网络结构不能共享从文本不同位置上学到的特征,简单来说就是如果神经网络已经从位置 1 学到了 louwill 是一个人名,那么如果 louwill 出现在其他位置,神经网络就可以自动识别到它就是已经学习过的人名,这种共享可以减少训练参数和提高网络效率,普通网络不能达到这样的目的。
所以直观上看,普通神经网络和循环神经网络的区别如下图所示:
那么 RNN 到底长什么样子呢?
RNN 结构
假设我们将一个句子输入 RNN,第一个输入的单词就是 x1, 我们将 x1 输入到神经网络,经过隐藏层得到输出判断其是否为人名,即输出为 y1。同时网络初始化隐藏层激活值,并在隐藏层中结合输入 x1 进行激活计算传入到下一个时间步。当输入第二个单词 x2 的时候,除了使用 x2 预测输出 y2 之外,当前时间步的激活函数会基于上一个时间步的进行激活计算,即第二个时间步利用了第一个时间步的信息。这便是循环(Recurrent)的含义。如此下去,一直到网络在最后一个时间步输出 yn 和 激活值 an。所以在每一个时间步中,RNN 传递一个激活值到下一个时间步中用于计算。
上图便是循环神经网络的基本结构。左边是一个统一的表现形式,右边则是左边的展开图解。在这样的循环神经网络中,当我们在预测 yt 时,不仅要使用 xt 的信息,还要使用 xt-1 的信息,因为在横轴路径上的隐藏层激活信息得以帮助我们预测 yt。
所以, RNN 单元结构通常需要两次计算,一次是隐藏层隐变量激活函数的计算,一个是结合隐变量和输入的计算。一个 RNN 单元和两次计算如下图所示:
其中隐藏层的激活函数一般采用,而输入输出的激活函数一半使用或者函数。
当多个 RNN 单元组合到一起便是 RNN 结构:
RNN 结构的 numpy 实现
定义和函数:
定义 RNN 单元结构:
计算示例:
基于 RNN 单元构建 RNN 网络结构:
计算示例:
这样一个简单的 RNN 结构就搭建起来了。至于 RNN 的反向传播和更为复杂的结构模式我们将在下一讲继续探讨学习。
参考资料:
deeplearningai.com
https://zhuanlan.zhihu.com/p/22930328
领取专属 10元无门槛券
私享最新 技术干货