深度学习入门系列之doc

这篇具有很好参考价值的文章主要介绍了深度学习入门系列之doc。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这周老师让把深度学习的名词过一遍,小玛同学准备在过一遍Deep Learning名词的同时把基本的模型也过一遍。
感谢杰哥发我深度学习入门系列能让我有机会快速入门。
下面就来doc一些学到的东西

线性感知器

感知器(线性单元)有个问题就是当面对的数据集不是线性可分的时候,“感知器规则”可能无法收敛,这意味着我们永远无法完成一个感知器的训练。(即如果我们需要用感知器(神经元)拟合的映射不是线性的,那么需要用在拟合中添加非线性的函数)
深度学习入门系列之doc

SGD vs BGD

SGD: Stochastic Gradient Descent
BGD: Batch Gradient Descent
SGD 和 BGD 之间的主要区别在于每次迭代的更新步骤。BGD 在每一步都使用整个数据集计算梯度,而 SGD 在每一步都使用单个样本或一小批样本计算梯度。这使得 SGD 比 BGD 更快,计算成本更低。
然而,在凸集中,由于其随机性质,SGD 可能永远无法达到全局最小值,而是不断在接近全局最小值的区域内游荡。另一方面,BGD 只要有足够的时间和合适的学习率,就能保证找到全局最小值。
但是在非凸集中,随机性有助于我们逃离一些糟糕的局部最小值。

感知器 vs 神经元

一般情况下,说感知器的时候,它的激活函数是阶跃函数;当我们说神经元的时候,激活函数往往选择为sigmoid函数或者是tanh函数。

sigmoid函数

sigmoid函数的导数非常有趣,它可以用sigmoid函数自身来表示。这样,一旦计算出sigmoid函数的值,计算它的导数的值就非常方便。
\(y = sigmoid(x)\) , 则 \(y^{\prime} = y(1 − y)\)

梯度检查

下面是梯度检查的代码。如果我们想检查参数 的梯度是否正确,我们需要以下几个步骤:

  1. 首先使用一个样本 \(d\) 对神经网络进行训练,这样就能获得每个权重的梯度。
  2. \(w_{ji}\) 加上一个很小的值( \(10^{-4}\) ),重新计算神经网络在这个样本 \(d\) 下的 \(E_{d+}\)
  3. \(w_{ji}\) 减上一个很小的值( \(10^{-4}\) ),重新计算神经网络在这个样本 \(d\) 下的 \(E_{d-}\)
  4. 根据下面的公式计算出期望的梯度值,和第一步获得的梯度值进行比较,它们应该几乎想等(至少4位有效数字相同)。
\[\frac{\partial E_d(w_{ji})}{\partial w_{ji}} \approx \frac{f(w_{ji} + \epsilon) - f(w_{ji} - \epsilon)}{2\epsilon} \]

当然,我们可以重复上面的过程,对每个权重 \(w_{ji}\) 都进行检查。也可以使用多个样本重复检查。

卷积神经网络

CNN 更适合图像,语音识别任务,它儿孙辈的人才包括谷歌的GoogleNet、微软的ResNet。

梯度消失问题

减轻梯度消失问题 回忆一下计算梯度的公式 \(\nabla = \sigma^{\prime}\delta x\) 。其中,\(\sigma^{\prime}\) 是sigmoid函数的导数。在使用反向传播算法进行梯度计算时,每经过一层
sigmoid神经元,梯度就要乘上一个 \(\sigma^{\prime}\) 。从下图可以看出,\(\sigma^{\prime}\) 函数最大值是1/4。因此,乘一个 \(\sigma^{\prime}\) 会导致梯度越来越小,这对于深层网络的训练是个很大的问题。

深度学习入门系列之doc

ReLU 函数的优势

Relu函数作为激活函数,有下面几大优势:

  1. 速度快 和sigmoid函数需要计算指数和倒数相比,relu函数其实就是一个max(0,x),计算代价小很多。
  2. 减轻梯度消失问题 而relu函数的导数是1,不会导致梯度变小。当然,激活函数仅仅是导致梯度减小的一个因素,但无论如何在这方面relu的表现强于sigmoid。使用relu激活函数可以让你训练更深的网络。
  3. 稀疏性 通过对大脑的研究发现,大脑在工作的时候只有大约5%的神经元是激活的,而采用sigmoid激活函数的人工神经网络,其激活率大约是50%。有论文声称人工神经网络在15%-30%的激活率时是比较理想的。因为relu函数在输入小于0时是完全不激活的,因此可以获得一个更低的激活率。
卷积神经网络的实现

三大要点:

  1. 局部连接
  2. 权值共享
  3. 下采样 可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。

深度学习入门系列之doc
如图所示,一个卷积神经网络由若干卷积层、Pooling 层、全连接层组成。你可以构建各种不同的卷积神经网络,它的常用架构模式为:

\[INPUT -> [[CONV]*N -> POOL ] * M -> [FC] * K \]

也就是N个卷积层叠加,然后(可选)叠加一个Pooling层,重复这个结构M次,最后叠加K个全连接层。
对于图展示的卷积神经网络:

\[INPUT -> CONV -> POOL -> CONV -> POOL -> FC -> FC \]

按照上述模式可以表示为:

\[INPUT -> [[CONV]*1 -> POOL]*2 -> [FC]*2 \]

也就是:$$N=1, M=2, K=2$$。

从图1我们可以发现卷积神经网络的层结构和全连接神经网络的层结构有很大不同。全连接神经网络每层的神经元是按照一维排列的,也就是排成一条线的样子;而卷积神经网络每层的神经元是按照三维排列的,也就是排成一个长方体的样子,有宽度、高度和深度。

对于图1展示的神经网络,我们看到输入层的宽度和高度对应于输入图像的宽度和高度,而它的深度为1。接着,第一个卷积层对这幅图像进行了卷积操作(后面我们会讲如何计算卷积),得到了三个Feature Map。这里的"3"可能是让很多初学者迷惑的地方,实际上,就是这个卷积层包含三个Filter,也就是三套参数,每个Filter都可以把原始输入图像卷积得到一个Feature Map,三个Filter就可以得到三个Feature Map。至于一个卷积层可以有多少个Filter,那是可以自由设定的。也就是说,卷积层的Filter个数也是一个超参数。我们可以把Feature Map可以看做是通过卷积变换提取到的图像特征,三个Filter就对原始图像提取出三组不同的特征,也就是得到了三个Feature Map,也称做三个通道(channel) 。

普通NN的反向传播算法

我们先回忆一下上一篇文章零基础入门深度学习(3) - 神经网络和反向传播算法介绍的反向传播算法,整个算法分为三个步骤:

  1. 前向计算每个神经元的输出值 \(a_j\)\(j\) 表示网络的第 \(j\) 个神经元,以下同);
  2. 反向计算每个神经元的误差项 \(\delta_j\) , 在有的文献中也叫做敏感度(sensitivity)。它实际上是网络的损失函数 \(E_d\) 对神经元加权输入 \(net_j\) 的偏导数,即 \(\delta_j = \frac{\partial E_d}{\partial net_j}\)
  3. 计算每个神经元连接权重 \(w_{ji}\) 的梯度( \(w_{ji}\) 表示从神经元 \(i\) 连接到神经元 \(j\) 的权重),公式为 \(\frac{\partial E_d}{\partial w_{ji}} = a_i \delta_j\),其中,\(a_i\) 表示神经元 \(i\) 的输出。
    最后,根据梯度下降法则更新每个权重即可。

对于卷积神经网络,由于涉及到局部连接、下采样等操作,影响到了第二步误差项 \(\delta\) 的具体计算方法,而权值共享影响了第三步权重 \(w\) 的梯度的计算方法。 说白了就是涉及到反向传播时,在各层究竟应该怎么传递的问题

第二步误差项 \(\delta\) 的具体计算方法

为了描述方便,我们用 \(\delta_{i, j}^{l-1}\) 表示第 \(l-1\) 层第 \(i\) 行第 \(j\) 列的误差项;用 \(w_{m, n}\) 表示filter第 \(m\) 行第 \(n\) 列权重,用 \(a_{i,j}^{l-1}\)表示\(l - 1\)层第 \(i\) 行第 \(j\) 列的神经元的输出;用\(net_{i,j}^{l-1}\) 表示 \(l - 1\)层第\(i\)行第\(j\)列神经元的加权输入;用 \(\sigma_{i,j}^l\) 表示第l层第i行第j列的误差项;用\(f^{l-1}\) 表示第 \(l-1\) 层的激活函数. 它们之间的关系如下:

\[\begin{aligned} & n e t^l=\operatorname{conv}\left(W^l, a^{l-1}\right)+w_b \\ & a_{i, j}^{l-1}=f^{l-1}\left(n e t_{i, j}^{l-1}\right) \end{aligned} \]

上式中,\(net^1 、 W^l 、 a^{1-1}\) 都是数组, \(W^l\) 是由 \(w_{m, n}\) 组成的数组,conv表示卷积操作。

卷积层误差项传递的算法

\[\delta^{l-1}=\sum_{d=0}^D \delta_d^l * W_d^l \circ f^{\prime}\left(n e t^{l-1}\right) \]
CNN在反向传播时,在各层究竟应该怎么传递的问题

留个坑在这里,看后面需要再说吧,感觉这个是成熟的算法,就是不知道跟我做的应用有没有什么关系

循环神经网络 Recurrent Neural Netwok (RNN)

我们介绍了全连接神经网络和卷积神经网络,以及它们的训练和使用。他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列;当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。

深度学习入门系列之doc

"循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。" 给我的感觉就是加了个时间轴。。。

深度学习入门系列之doc

虽然老板跟我说RNN可以放放,但是我还是把基本的种类粘在这里吧。

双向循环神经网络 Bidirectional Recurrent Neural Network (BRNN)

深度学习入门系列之doc

深度循环神经网络 Deep Recurrent Neural Network (DRNN)

深度学习入门系列之doc

循环神经网络的训练算法 BPTT

BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的三个步骤:

  1. 前向计算每个神经元的输出值;
  2. 反向计算每个神经元的误差项 \(\delta_j\) 值,它是误差函数E对神经元j的加权输入 \(net_{j}\) 的偏导数;
  3. 计算每个权重的梯度。
RNN的梯度爆炸和消失问题

不幸的是,实践中前面介绍的几种RNNs并不能很好的处理较长的序列。一个主要的原因是,RNN在训练中很容易发生梯度爆炸和梯度消失,这导致训练时梯度不能在较长序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。

梯度消失问题

梯度消失更难检测,而且也更难处理一些。总的来说,我们有三种方法应对梯度消失问题:

  1. 合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
  2. 使用relu代替sigmoid和tanh作为激活函数。原理请参考上一篇文章零基础入门深度学习(4) - 卷积神经网络的激活函数一节。
  3. 使用其他结构的RNNs,比如长短时记忆网络(LTSM)和Gated Recurrent Unit(GRU),这是最流行的做法。
LSTM (Long Short-Term Memory)

长短时记忆网络的思路比较简单。原始RNN的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。那么,假如我们再增加一个状态,即c,让它来保存长期的状态,那么问题不就解决了么?
新增加的状态c,称为单元状态(cell state) 。我们把上图按照时间维度展开:
深度学习入门系列之doc

我们可以看出,在 \(t\) 时刻,LSTM的输入有三个:当前时刻网络的输入值 \(x_t\) 、上一时刻LSTM的输出值 \(h_{t-1}\)、以及上一时刻的单元状态 \(c_{t-1}\) ;LSTM的输出有两个:当前时刻LSTM输出值 \(h_t\) 、和当前时刻的单元状态 \(c_t\) 。注意 \(x\)\(h\)\(c\) 都是向量。
LSTM的关键,就是怎样控制长期状态 \(c\)。在这里,LSTM的思路是使用三个控制开关。第一个开关,负责控制继续保存长期状态 \(c\);第二个开关,负责控制把即时状态输入到长期状态 \(c\);第三个开关,负责控制是否把长期状态 \(c\) 作为当前的LSTM的输出。
LSTM用两个门来控制单元状态 \(c\) 的内容,一个是遗忘门(forget gate),它决定了上一时刻的单元状态 \(c_{t-1}\) 有多少保留到当前时刻 \(c_t\);另一个是输入门(input gate),它决定了当前时刻网络的输入 \(x_t\) 有多少保存到单元状态 \(c_t\) 。LSTM用输出门(output gate)来控制单元状态 \(c_t\) 有多少输出到LSTM的当前输出值 \(h_t\)

GRU (Gated Recurrent Unit)

前面我们讲了一种普通的LSTM,事实上LSTM存在很多变体,许多论文中的LSTM都或多或少的不太一样。在众多的LSTM变体中,GRU (Gated Recurrent Unit) 也许是最成功的一种。它对LSTM做了很多简化,同时却保持着和LSTM相同的效果。因此,GRU最近变得越来越流行。
GRU对LSTM做了两个大改动:

  1. 将输入门、遗忘门、输出门变为两个门:更新门(Update Gate)\(z_t\) 和重置门(Reset Gate)\(r_t\)
  2. 将单元状态与输出合并为一个状态:\(h\)
递归神经网络(Recursive Neural Network)

仅仅拥有处理序列的能力还不够,还需要处理比序列更为复杂的结构(比如树结构),这时候就需要用到另外一类网络:递归神经网络(Recursive Neural Network)
因为神经网络的输入层单元个数是固定的,因此必须用循环或者递归的方式来处理长度可变的输入。循环神经网络实现了前者,通过将长度不定的输入分割为等长度的小块,然后再依次的输入到网络中,从而实现了神经网络对变长输入的处理。
递归神经网络可以把一个树/图结构信息编码为一个向量,也就是把信息映射到一个语义向量空间中。这个语义向量空间满足某类性质,比如语义相似的向量距离更近。也就是说,如果两句话(尽管内容不同)它的意思是相似的,那么把它们分别编码后的两个向量的距离也相近;反之,如果两句话的意思截然不同,那么编码后向量的距离则很远。

哈哈哈哈哈终于把零基础入门深度学习的文档叨完了。准备写点作业之后继续去看the deep learning书。文章来源地址https://www.toymoban.com/news/detail-421725.html

到了这里,关于深度学习入门系列之doc的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包