第六周:深度学习基础(残差网络+RNN基础)

摘要

本文对残差网络结构做了详细的解释,残差网络的特点是特别容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。本文通过一个引例,对循环网络的正向传播过程做了详细的分析,以及对单向循环神经网络的结构进行了介绍,以及对循环神经网络的计算过程进行手推。循环神经网络的来源就是为了刻画一个序列当前的输出与之前信息的关系。从网络结构上,循环神经网络会记忆之前的信息,并利用之前的信息影响后面结点的输出。也就是说,循环神经网络的隐藏层之间的结点是有连接的,隐藏层的输入不仅包括输入层的输出,还包括上时刻隐藏层的输出。

Abstract

This paper provides a detailed explanation of the structure of residual networks, which are characterized by being particularly easy to optimize and able to improve accuracy by adding considerable depth. Its internal residual blocks use jump connections that mitigate the problem of vanishing gradients associated with increasing depth in deep neural networks. This paper provides a detailed analysis of the forward propagation process of recurrent networks through a cited example, as well as an introduction to the structure of unidirectional recurrent neural networks, as well as a hands-on computational procedure for recurrent neural networks. The source of recurrent neural networks is to portray the relationship between the current output of a sequence and the previous information. From the network structure, the recurrent neural network remembers the previous information and uses the previous information to influence the output of the nodes behind. In other words, the nodes between the hidden layers of a recurrent neural network are connected, and the input to the hidden layer includes not only the output of the input layer, but also the output of the hidden layer at the previous moment.

1. 残差网络

上周我们了解了LeNet - 5和AlexNet网络结构,这两个网络结构尽管看起来比较复杂,但对于更庞大的网络结构,这两个网络结构训练起来并不难。太深的神经网络训练起来十分困难,因为有梯度消失 (鞍点和局部最小点)和梯度爆炸这类的问题出现,而神经网络的 跳跃连接(skip connection),它能让我们从一层中得到激活,并 “突然” 把它传递到下一层,甚至传递到更深的神经网络层。利用它,我们就可以训练出网络层很深很深的残差网络(ResNet),有时甚至可以超过100层的网络。

残差网络又称为深度残差网络(Deep Residual Network),是一种用于解决深度神经网络训练过程中的退化问题的架构。退化问题指的是当神经网络变得越深时,模型的准确度反而开始下降的现象。

残差网络的核心思想是引入了"残差块"(Residual Block),它允许神经网络直接学习残差的变换,而不是需要完整地学习特征的变换。该结构通过引入跳跃连接(Skip Connection)来实现,即在网络中间的某一层将输入直接与输出相加。

接下来我们将用一个具体的例子来解释残差网络:

这里有两层神经网络, a I a^{I} aI代表第 I I I 层中的激活函数,然后到了 a I + 1 a^{I+1} aI+1,经过这两层后,输出为 a I + 2 a^{I+2} aI+2。在接下来的计算步骤中,我们首先有一个 a I a^{I} aI,即 a I → L i n e a r → R e L U → a I + 1 → L i n e a r → R e L U → a I + 2 a^{I}\to Linear \to ReLU \to a^{I+1} \to Linear \to ReLU \to a^{I+2} aILinearReLUaI+1LinearReLUaI+2
在这里插入图片描述
使用残差块可以训练更深层的神经网络,而我们建立一个残差网络的方法,就是通过大量的这些残差块,如下图
在这里插入图片描述
把他们堆叠起来,形成一个深层网络。

例如有一个普通网络,我们要把它变成残差网路,我们只需要添加所有这些快捷路径连接,划分成一个个残差块,如下图,这个网络显示了5个残差块堆积在一起,这就是一个残差网络。
在这里插入图片描述
事实证明,如果我们使用标准的优化算法,如梯度下降法,来训练普通神经网络 (没有额外的残差块),我们会发现当增加层数时,训练误差会在下降一段时间后,达到有一个最小值后,随后误差会逐步升高,这是由于网络层数过多,训练出现过拟合,如果我们选择的网络太深,则训练误差会更糟糕。但是有了残差网络的情况是,即使层数越来越深,我们仍可以让训练误差继续下降,即使我们训练一个超过100层的网络,将上图中残差块的输入端通过激活函数激活后,跳跃连接到更后面的层数去,这确实对解决梯度消失和梯度爆炸问题非常有帮助。使得我们可以训练深得多的神经元网络而不会看到性能倒退的现象。

那么为什么残差网络这么好用呢?

接下来我们通过一个例子来说明为什么残差网络工作得那么好,在上述我们了解到,如果我们设计了更深层得网络,它会使得我们用训练集训练神经网络的能力下降,这也是为什么有时我们并不希望有太深层的神经网络。但是当我们训练残差网络的时候就不一样了,我们来看下面这个例子:
在这里插入图片描述
在这里插入图片描述
残差网络的特点是特别容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。

残差网络的另一个值得讨论的细节,如下手推叙述:
在这里插入图片描述
在这里插入图片描述
如果残差块内的结构是池化层,显然经过池化层压缩特征后维度与输入前的维度不同,我们便可采用上述的方法,增加维度,从而能更方便运算。

2. 循环神经网络 (RNN)

在语言辨别中,我们获得音频片段 x x x 作为输入项,并将其映射至一段文本 y y y ,在此,输入与输出皆为序列资料。因为 x x x 为一段随时间推移的音频,而输出 y y y 为一组文字序列。音乐生成是序列资料问题的另一个例子,在这种情况下,只有输出 y y y 为序列,输入可以是空集合,或者是一个整数
,以代表我们想要产生的音乐类型;在情感分类中,输入 x x x 是一个序列,假设输入的短语为: T h e r e There There i s is is n o t h i n g nothing nothing t o to to l i k e like like i n in in t h i s this this m o v i e . movie. movie.,那么则会根据用户发出的这个评论,进行预测用户的情绪以及满意度等。序列模型对于DNA序列分析也非常有用,假设DAN是通过四个字母A, C, G, 以及T来表示的,所以给定一DNA序列,我们可以标定蛋白质对应在这DNA序列的何处。在机器翻译中,我们会给定一个输入的句子,输出其不同语言的翻译。在影像辨识中,我们会得到一系列影片的画面,并被要求辨别出其中的活动。

所有这些问题都可以由标记过的数据资料 x x x y y y 为训练集,以监督式学习来解决。但是从这个例子清单中可以看出,有很多不同类型的序列问题,甚至在某些情况下,输入 x x x 和输出 y y y 皆为序列,有时 x x x y y y 可以有不同的长度,或者在情感分类中, x x x y y y 具有相同的长度。因此,在这周,我们将了解序列模型适用于这些不同的设置情况。

2.1 引例

我们用下列句子作为序列模型的输入数据,我们想让序列模型自动识别出句中哪些单词是人名,这是个名字识别的例子,常用在搜索引擎中。输出变量 y y y 对应每一个输入的单词,目标输出 y y y 的值标出哪些输入单词是人名。当然这种输出方式并非最佳,还有一些更复杂的输出形式,不仅告诉我们哪个是人名,还能够指出人名在句子中的起始位置。那么,作为输入的序列数据只有9个单词,所以我们最终会有9组特征来代表9个单词,并指出位置和序列。我们用 x < i > x^{<i>} x<i> 来表示句子中单词的位置,用 y i y^{i} yi 表示位置,用 T x T_{x} Tx 表示输入数据的长度,由于这个句子中共有9个词,因此 T x = 9 T_{x} = 9 Tx=9,然后我们用 T y T_y Ty表示输出序列的长度,这个引例中, T x T_x Tx 等于 T y T_y Ty
在这里插入图片描述
那么,我们在一个序列中如何表示一个单词呢?例如,如何表示 Harry 这个词? x < 1 > x^{<1>} x<1>的值应该是什么呢?

对于表示句子中某个单词,首先我们要准备好一个词汇表 (将用到的单词放到一起做一个清单),我们用的是词汇量为10000的字典,对于现代的自然语言处理应用而言,这种规模属于非常小的了。我们可以将这些词汇中的每个都表示成一位 one-hot 形式。
在这里插入图片描述
所以,这种表示方法中,句子里的任意一个词 x < t > x^{<t>} x<t>,都将表示为一个 one-hot 向量,one-hot 的意思是指只有一位为1,其余位全是0 。引例中这句话有9个单词,也就需要9个 one-hot 向量来表示。这样做的目的是,根据 x 的表示,使用序列模型的映射,然后目标输出 y,作为监督式学习,用到的数据表中包括 x 和 y。我们将会在之后探讨,如果遇到的单词不在词汇表中的解决办法。

2.2 循环神经网络模型

在 2.1 中,我们了解了将要用来定义序列学习问题的符号。这小节,我们来一起探讨如何建立一个模型,如何构建一个神经网络来学习从x到y的映射。我们可以尝试用一个标准的神经网络来完成。在我们 2.1 中的引例,我们有9个输入单词,将这9个输入词用 one-hot 向量表示,将它们放入标准神经网络中,神经网络可能由几层隐藏层构成,最终通过每一层的全连接,会输出9个包括0和1的值。这个结果会告诉我们每一个单词是否是人名的一部分。
在这里插入图片描述
但是这样做效果并不好,有两个主要问题:

  • 输入和输出对于不同的例子会有不同的长度,可能有些例子输入和输出的长度不同。针对输入输出长度不同的问题,也许可以通过填充或用零填充每一个输入到最大长度,但是,这似乎始终不是一个好的表示方法。
  • 像一般的朴素神经网络结构,它并不会共享那些从不同文本位置学到的特征,尤其是神经网络学到了经常出现的词汇。在标准神经网络中,这些输入端的 x x x 均为长度为10000的 one-hot 向量。这是一个非常大的输入层,整个输入的长度是单词数量上限,再乘以10000,那么第一层的权重矩阵最终会包含大量参数,计算效率很低。

循环神经网络不存在上述的缺点。

让我们建立一个循环神经网络,如果我们从左到右读一个句子,所读的第一个句子我们将其表示为 x < 1 > x^{<1>} x<1>,我们将要做的是,取出第一个单词,并输入到神经网络层,在这里,神经网络有一个隐藏层。我们可以用这个神经网络来预测输出,判断这是否是一个人名的一部分,这里循环神经网络所做的是当其继续读取句子中的第二个词语时,比如 x < 2 > x^{<2>} x<2> ,不仅仅只是通过 x < 2 > x^{<2>} x<2> 去预测 y ^ < 2 > \hat y^{<2>} y^<2>,它会把第一步的计算结果作为输入信息的一部分,特别是第一步的激活数值会传递到第二步。在下个步骤中,循环神经网络输入第三个词 x < 3 > x^{<3>} x<3>,并试图输出一些预测结果,得到 y ^ < 3 > \hat y^{<3>} y^<3>,同理,前两步的计算结果也作为第三步输入信息的一部分。以此类推,直到最后一步,输入 x T x x^{T_{x}} xTx,然后输出 y ^ T y \hat y^{T_y} y^Ty。在这个例子中, T x T_x Tx T y T_y Ty相等,如果二者不同,这样的结构就会发生一点变化。在每一次步骤中,循环神经网络会传递上一步的激活数值,而当前步骤结束后,也会将当前的激活数值传递给下一步。要开始整个计算过程,我们会在第0步的时候使用一些人为制造的激活数值,通常为一个全零的向量。

循环神经网络从左向右扫描数据,这期间的每一步所用的参数都是共享的。是一组参数,我们用 U 来表示它们,这一组 U 参数同时也会被用于每一个步骤。激活函数,隐藏层上一次的值作为这一次的输入的权重矩阵为 W ,同样 W 也被用于每个步骤。同理,V是隐藏层到输出层的权重矩阵。 如下图所示:

在这里插入图片描述

我们可以将上述的循环神经网络简单表示为输入层、隐藏层、输出层。与上述展开的步骤一致,U是输入层到隐藏层的权重矩阵,o也是一个向量,它表示输出层的值,上述展开的是 y ^ < i > \hat y^{<i>} y^<i>;V是隐藏层到输出层的权重矩阵。那么,现在我们来看看W是什么。循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。
在这里插入图片描述
RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练,RNN的一个缺点是它只是用序列中早期的信息来预测,并不用后期的信息来预测,就比如我们预测 y ^ < 3 > \hat y^{<3>} y^<3> 时,仅仅用到了 x < 1 > x^{<1>} x<1> x < 2 > x^{<2>} x<2> x < 3 > x^{<3>} x<3>的数据信息,并未用 x < 4 > x^{<4>} x<4> x < 5 > x^{<5>} x<5>、… 、的,所以这是一个问题,假如如果我们有一个句子:He said, “Teddy Roosevelt was a great President.”,为了决定 Teddy 这个词是否是人名的一部分,真正有用的信息不只是知道前两个词 (He, said这两个词),还要知道句子中后面的单词的信息,因为这句话也可以这么说:He said, “Teddy bears are on sale”,如果只知道前三个词的话,是不能确信 Teddy 是否是人名的一部分,有时候也是无法分辨出区别。所以这种神经网络结构的一个限制,那就是在一确定的时间内预测,只使用输入或使用输入序列中之前的数据信息,但不能使用序列中后面的数据信息,这也是单向循环神经网络的局限性。

接下来,我们将手推循环神经网络的计算过程:
在这里插入图片描述
在这里插入图片描述
所以这些公式定义了循环神经网络的前向传播,开始计算时将 a < 0 > a^{<0>} a<0>的初始值设为全零向量,然后使用 a < 0 > a^{<0>} a<0> x < 1 > x^{<1>} x<1>计算 a < 1 > a^{<1>} a<1>,最后用 a < 1 > a^{<1>} a<1>计算 y ^ < 1 > \hat y^{<1>} y^<1>,后续以此类推。为了帮助我们建立更加复杂的神经网络,我们将简化一些表示方法:

在这里插入图片描述

总结

通过上周以及这周学习CNN网络,让我明白了CNN基础网络的大致结构,本周学习完循环神经网络的结构与原理后,也明白了CNN与RNN的区别,卷积神经网络中的数据需要经过输入层、卷积层、池化层、全连接层、输出层,经过卷积池化,再卷积再池化,将原有的图像数据一步步压缩,最终通过全连接层,输出层Softmax归一化处理,然后输出。而RNN则是分为输入层、隐藏层、输出层,RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练,RNN的一个缺点是它只是用序列中早期的信息来预测,并不用后期的信息来预测,这样容易出现误差,在本文都举有例子来说明。总体来说,我现在仍有很多不足之处,在之后的学习我会逐步进行代码实现。

本文有很多个人理解的部分,如果有错误,请大家多多指正,谢谢~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@默然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值