| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 二、循环神经网络(RNN与LSTM) -> 正文阅读 |
|
[人工智能]二、循环神经网络(RNN与LSTM) |
一、常用的神经网络模型在做深度学习或者是人工智能相关的任务中。一般来讲,我们常用的网络模型有三种,第一种卷积神经网络。实际上也是前馈神经网络的一种,它主要包括这个点。地上。那么一般来讲呢,我们是拿这个准地心的网络来做一些跟图像相关的一些事情,比如说我们来做一个图像上市,比如说有一个说给一张老张片。 1.1 卷积神经网络(Convolutional Neural Network,CNN) 是一种前馈神经网络, 它包括卷积层(convolutional layer) 和池化层(pooling layer) 。 一般我们是拿卷积神经网络来做一些跟图像相关的一些事情,比如图像上色,比如说有一个说给一张老张片修复成一个彩色的照片可以用CNN来做。我们也可以用CNN来做灰度图像处理,图像识别,图像分类,或者一些分类模型 1.2 循环神经网络(Recurrent Neural Network,RNN)也叫RNN,神经网络是一种节点定向连接成环的人工神经网络。这种网络的内部状态可以展示动态时序行为。 一般我们在处理一些跟文本相关的,跟这个自然语言相关的,跟语音相关的,我们都会用到这个循环神经网络来操作,比如说我们要做一个在线翻译或者聊天机器人,也会用到这个循环神经网络来操作这个模型,或者说利用这个循环神经网络来建立模型。 1.3 长短期记忆网络(Long Short-Term Memory) LSTM是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。 循化神经网络的一种变型,它是在循环网络的基础上增加了一个时间定义的概念,在循环神经网络中,只会针对于短文本进行操作,而长文本操作,比如一篇文章,或者说一大段话这种操作,一般就会用这个。他也是一种时间地位的神经网络。他相比循化神经网络而言增加了时间,或者说增加了记忆的这么一个概念。LSTM特别适合是处理预测时间,或者说预测时间序列中间隔和延迟相对较长的一些重要的事件。比如。我们要做这个聊天机器人的模型,长文本翻译,语音识别,自动写歌,自动写诗这类的我们就会用到LSTM? 所以说卷积神经网络,循环神经网络和长短期记忆网络。共同组建成了我们常用的这个神经网络模型,还会有一些其他类的,比如说双向循环神经网络等等,实际上,他们都是基于这个循环神经网络来构建的。 1、循环神经网络1.1?传统感知机模型 传统感知机模型,输入x1,x2...xn,一个内容输入的值,这个w是一个权重。我用输入的值乘以一个权重,最后得到了一个值。这个直进行判断之后输出。就一个传统感知机模型,也最简单的一种神经网络。 1.2 BP神经网络 在传统感知机模型的基础上,后来又出了一种BP神经网络,实际上它又叫做前馈神经网络,也叫反向传播算法。BP神经网络其实已经是现代神经网络的基础。 一共分成三层,第一层输入层,第二层隐藏层,第三层输出层。
二、BP神经网络BP神经网络的处理过程,可以从下往上看,或者说从左往右看,在BP神经网络的处理过程中,主要经过几个步骤。 1、正向传播也叫做向前传播。就是说从输入层到隐藏层到输出层。 (1)网络初始化:对网络的权重、偏置量等做一些定义 (2)隐藏层的输出:主要是对隐藏层的权重进行求和,之后利用一些激活函数,在将这个最后的结果进行输出 (3)输出层的输出:将隐藏层所求的输出求和。加上相应的偏置量,最后得到正向传播。 在经历正向传播之后,接下来我们还要经立一个误差计算。 2、误差计算就是这个传播的过程中肯定会出现一定的偏差,那么我们在出现一定的偏差之后,我们就要进行一个偏差的计算。这个计算的整个一套过程,叫做误差计算。在经过这个误差计算之后,接下来要做的事情的就是反向传播,它也叫误差反向传播。 那么在经过这个正向传播和误差计算之后,这个时候会有两种情况。第一种情况,如果说我没能得到所希望的输出值,把这个误差信号按照这个原来正相传播路径,对原路进行返回,这样就是反向传播。这个返回就是要对每一个隐藏层中的各个神经元的一些权重,就是w,或者v进行修改使这个误差信号变得趋向于最小。 3、反向传播在反向传播的过程中,会让误差一步一步的往回传,传回来之后,就可以知道这个误差大概有多少,那么有了误差,接下来就可以进行误差的偏置的更新。更新误差的偏差。 反向传播过程中,为了使误差更小。一般会使用求导的方式,或者降低维度的方式来去做。我们的这个深度学习过程中,我们使用的就是梯度下降算法。 一般有2个步骤 (2)更新输入层到隐藏层的权重、误差。 是类似的,求得隐藏层到输出层误差之后,可以通过这个反正播进行误差的更新,同时我们求得输入层到隐藏层,它也是有一个误差。求得这个误差之后,也需要进行一个偏置的更新。这是反射传播。实际上,反向传播的最终的目的就是一个权重的更新,就是一个误差的更新。 ?4、偏置更新各个层更新各个层的权值。是利用神经元之间的梯度和他的微分来进行修正,修正连接的权值。在偏置更新一般也分为两个步骤 (2)更新输入层到隐藏层的偏置,也是类似的,最后的目的就是将整个BP神经网络在运行的过程中,从头到尾,从尾到头。得到了一个最后的结果,是我们最想要的的结果。 特点?(1)可以通过逐层信息传递到最后的输出 三、循环神经网络RNN1、循环神经网络我们可以用下面这张网络结构图来表示 我们可以把它拆成左,右两部分来看。左边这个部分,我们可以看作为这个循环神经网络的一个整体结构,右面这个部分,可以看作是循环神经网络的一个分解图。 我们先看左边那个图,可以发现实际上循环神经网络如果没有这个圆环的话是一个很简单的BP神经网络。那他包括输入层,隐藏层,和输出层。值得注意的是,这个循环神经网络与这个普通的神经网络最大的区别就在于他多了这么一个环。那么这个环,也是这个循环神经网络的特别之处,我们把这个环称之为循环神经网络的一个递归环,也叫循环递归。这个递归环上面的一个w叫做递归参数。也就是说,循环神经网络特别之处就是在于它有一个循环递归和一个递归参数w。 右面这半部分的实际上是这个左面这半部分的一个展开图。通过这个右面这个部分呢,我们可以发现它有一个箭头,这个箭头是从左向右的。也就是说循环神经网络是具有一定的时间发展顺序的,从左到右的一个过程,我们可以看作为是循环神经网络的发展模式。在这个发展过程中,x代表输入,t是当前的时刻,那这个t-1上一时刻,这个t+1就下一时刻。o代表输出 。 因为他有上一个时刻的内容,也去输出到了下一个时刻,所以说我们利用这个循环神经网络。可以非常容易的去解决一些与时间序列相关的问题。 我们平时在进行开发的时候,也会用到这个循环这个概念。那么我们可以通过循环来进行一些规律性的操作。循环神经网络也因此得名。我们还看到,循环神经网络中有一个参数w,每一个时刻的这个w是相同的,U是相同的V是相同的。这个就是说在循环神经网络中,它的参数是相同的,这也是循环神经网络中的一大特性,就是参数共享。 总的来说,循环神经网络有三个特性 (1)记忆特性(上一时刻的输出可以作为下一时刻的输入) 2、循环神经网络和经典网络的对比循环神经网络实际上在这个三层的基础上。增加了一个环,以及这个环里面的一个共享参数w。 他的一大特性就是这个w,是共享的,无论时间顺序是如何去发生的,如何去改变的,这个权重实际上都没有变化,这个和经典的网络的一个最大的一个区别。 3、?循环神经网络的结构(1)一对一:最简单,就是同样维度的一个输入,对应同样维度的一个输出,一些分类问题,我们可以用这个。比如说给你一句话,判断这句话是好是坏 (3)多对一:应用于句子的处理,或者说一些多分类的问题,比如说。多分类,在做模型训练的时候,我们可以训练这种多个类别的样本最后对应一个输出 (3)多对多:一般有两种,一种是这个输入和输出具有不同维度的。另外一种,就是输入和输出具有相同维度的。就是这样的,那么针对于这个输入和输出是有不同维度的,一般来讲比如说这种翻译这种比如说谷歌翻译,百度翻译可以用这种。那么对于一些这个句子中的人名区别,是具有相同维度的。比如说,我说的是一个句子,输出的是这个句子中的一些人名或者一些地名,或者说一些机构名。 4、双向循环神经网络我们来看这么一句话, 明天早上第一节课是英语课。所以呢明天早上我们要带一本——书? 如果说是正常人的思维,那么我们很容易的就知道这个后应该填入这个英语两个字。但是对于计算机来讲,那想让他准确的去填对这个空,这是非常难的。因为对于这个传统机器学习的方法来讲,我们会先把它进行一个切分,比如说明天早上什么?第一节课是英语课。然后切完了之后,它会分别去计算于这个每个词出现的概率。然后呢,在通过循环神经网络,因为我们循环神经网络是在每一个循环的节点上会有一个那个权重。那么这个权重是共享的,但是他在循环从左着右的这么一个循环的过程中,实际上,这个词的这个时间是一步一步的累加的,那么这个权重我们一般是相乘比如说这个字的权重成为这个字的权重,一步一步一步的去相乘。然后呢,最后我们来找到,在这个一本后面可能出现的字是一个什么样的字 ?是一个很典型的循环神经网络的结构。他有当前时刻的输入,有上一时刻的输出,是从左到右是有顺序的。我们把每一个字进行编码,变成x123。在前面加了一个开始标记,最后加了一个结束标记,就是是块神经网络的一个简单的结构。然后,我们在预测这两个空里填的是什么的时候。我们得需要拿到每一个时刻的权重值。因为在这个循环神经网络中,他的权重值实际上是一个共享的。因为他有一个参数共享的这么一个特性,所以说呢,每一个权重值,它都是一样的。根据这个权重值,第一个沉重值乘以第二的沉重值,通过这个沉重值的相乘。加上上一个状态的一个输出,以及本时刻的一个输入。我们通过一步一步的预测,最后我们可以预测出在这两个横线处,可能是要偏这个英语这两个字。这个是使用循环神经网络做网络预测,需要做的工作。最后得到英语书的结果。 在这个循环神经网络中,我们会发现这么一个问题,我们所有的预测这么一个时间,它都是从左向右的。比如说,这个顺序是从左向右的。但是,这里只要填英语这两个字后面加了一本书。如果说这个空变成早上的话。那么这又不一样了,就是说我如果这个空不是英语,而是早上。他除了前面的这么一些内容,他还有后面的一些内容也是需要我知道的。因为我要预测的是早上的话,那这有一本英语书。我可以根据英语和这个明天早上第一节课是英语课,才能知道这填的是早上。也就是说,循环神经网络有一个缺点,他只能够知道通过前面进行预测后面的,但是,他不能通过后面来预测前面的。如果说我们想通过后面来预测前面的,这个时候,我们应该去使用这种叫做循环神经网络。 双向循环神经网络和这个循环神经网络,它最大的区别在于方向是双向的。在这个双向循环神经网络中。我们不仅可以使用前面一个词或者说前面一个时间点的这么一个输出。而且,我们还可以使用后面一个时间点的输出。比如说他从左到右和从右到左是同时进行的。 也遵循着这个循环神经网络的基本思路,就是参数共享,但是不同的是在双向循环神经网络中。从前到后,或者说从左到右,他的参数是共享的。从右到左,他的参数是共享的,但是单独分开他的参数是不共享的,是独立的。 这张图是在时间序列上的展开图。根据这个图我们看到,在每一个时间点上都有六个权值。w123456,并且那这六个权值,在每一个时间点,它都是保持一致的。每一个时间点的对分成的四个层,第一层是输入层,第二层是向前传播层。第三是反向传播层。第四个是这个输出层。并且,这个向前传过程我们可以看到,向前传播和这个向后传播层,实际上是独立的,就是分开的两个层之间是没有任何交流的。之所以这么做是为了保证双向循环神经网络的展开图是一个循环图。 这张图,是双向循环神经网络它每一个节点的。我们可以看到,就像他从左到右是分开的,方向是分开来计算的。分开来计算过程中,这个w123他们的权重是相同的。w456他们的权重是相同的,但是说他们两个权重是不同的。 在双向循环神经网络中,它的特点是: 这个图是循环神经网络,双向循环神经网络都有的一个特点。它是沿着时间序列来去展开的。那么,我们在做预测的时候。无论是填词,还是做翻译,它都会使用到相同的w权重。那么每次在做这么一个预测的时候,我们是从这个第一个输出开始。往后每一次,这个w都会被相乘,也就说w1×w2×w3×w4一直×到最后的这个wn。这个时候,它会有一个问题,当w很小的时候。非常小,那最后成到后面,比如说每个w都是0.1,那么乘到后面这个w,就会变成一个非常小,非常小非常小的一个数。最后输出的结果,这个w可能会接近于零,那这样就会导致输出的给我付出。如果说这个w非常大的情况,最后的输出会变成一个无限大的情况。那这个时候呢,无限大,那就会成一个指数性的一种爆炸。那么,针对于非常小的这种情况,它叫做梯度消失,也叫做这个梯度消散。对于非常大的这种情况,也叫做这个梯度爆炸。 梯度消失和梯度爆炸,在做循环神经网络的过程中是非常要注意的,一定要去克服的一点。只有解决这个梯度消失和梯度爆炸。才能够使循环神经网络最后计算出的结果更加准确。 不可以让w等于1吗?实际上,在循环神经网络计算过程中。w等于1的情况也有,但是微乎其微,如果w全都等于1的话,他可能也会产生一些其他的问题。所以说,一般来讲我们在循环神经网络中没有说我们使用w正好等1的。即使有,也是非常理想的状态。所以说,那遇到这样的问题,我们并不是需要去找,如何让这个w=1?而是要想办法去解决梯度消失和这个梯度爆炸问题。 ?四、梯度消失和梯度爆炸的解决1、选择合适的激活函数因为在误差反片传播的过程中,要对激活函数多次求导。这个时候激活函数的导数的大小,可以直接影响梯度下降的效果。过小了可能会导致这个梯度消散,过大了呢,可能会产生梯度爆炸。如果激活导数是1,是最理想的状态。但是呢,这个仅仅是理想,是比较难的。所以应该选择什么样的计划函数呢?一般来讲,我们在做解决这个梯度消失和梯度爆炸的问题,选择的激活函数一般用ReLu函数 那么我们可以看到这个激活函数的导数,它是不是可以一直为1?这是一个最理想的这么一种情况。一般来讲,在做激活函数的选择可以使用一个系列激活函数 ?一般来讲,不建议大家使用Sigmoid和Tanh函数。他们的导数在大部分区域是非常小的。Sigmoid,你看他的导数,这个区域定在y轴上。它是这个0-0.5之间,也就是在0.25的位置上,非常小。非常小的话,它就会容易导致这个梯度消散。Sigmoid函数实际上也是,在这个0-1之间,也是一个非常小的。那所以说他也是容易导致梯度消散问题。所以说,不建议使用这个Sigmoid和Tanh函数。原因是区域小,容易产生梯度消散。 2、选择合适的参数初始化方法在误差反向传播的过程中,对这个当前层的输入求偏导的时候,当前层的这个权重参数把误差或一层一层的传播下去,那么这个时候参数的大小,实际上会影响到梯度下降的效果。在进行那个参数初始化的时候,是不可以把所有的参数都初始化为零的。因为如果初始化为零的话,这个参数永远都不会发生改变,这样也无法打破这种模型的对称性。就是说,一般来讲,我们可以使用一种公式来去做这个参数的初始化。 乘以0.01那是对它进行一个尺度的一个变化。这样就可以得到很多很小的随机参数。用这种方法是比较适用于一些较小的工程,或者说小规模的运算。他可以打破参数对称的问题。但是这种方式在结构比较深一点的网络中会出现问题。因为他一直乘以这个0.01容易发生梯度消散,使得一些比较浅层的网络上得不到训练,是不合理的 这一种是适用于ReLu系列的激活函数的一种参数初始化方式。我们使用这种方式初始化参数可以将这种参数的反差,它可以限定在一个合理的范围内。就说不用乘以这个0.01导致梯度消散,来用它可以将反差限定在合适的范围内,能够缓解梯度消散问题。 3、使用BatchNormalization
4、使用残差结构极大的提高了神经网络的深度,很大程度上解决了梯度消散的问题,可以训练很深层的神经网络,可以充分利用神经网络里面的每一个神经源。使这个模型变得更大,更加复杂,可看作解决梯度消散的最有效方法。 之前,我们在去做神经网络的时候,比如说用CNN,RNN,一般来讲也都是几层,或者说几十层的深度。在残差网络这个面前,实际上根本不值得一提。因为在残差网络上。他可以很轻松的就去构建一个几百层甚至上千层的神经理网络。并且利用这种方式,不需要去担心梯度消散的问题。那原因是什么呢?残差网络还有一个叫做highway部分。残差网络中多了许多这种跨层的连接。比如从第一层可以直接去跨越到第三层或者第四层,使用残差网络有这个优点。这样的结构在反向传播的过程中会有很大的好处。 特点
5、使用梯度剪裁我们在防止这个梯度下降问题时,主要是要控制这个悬崖处位置梯度的大小。应该使用一个尽量小一点的梯度,避免穿越这种向上的曲面导致它直接下来。所以参数应该保持在一个合理的范围内。 我们可以使用这种梯度裁剪的方法,使悬崖的这种局面的反应更加温和而导致它直接去滑下来,而不是直接通过这种这样的方式直接穿越过去。所以说梯度裁剪,可以用来限制这个梯度的大小,如果说我们的这个梯度的大小超过了梯度的范围,那么我们就可以去强制的去限制梯度大小,使这个梯度变得越来越小,就可以避免这个梯度过大的情况,就可以去防止这个梯度爆炸的产生。 ?其中v是梯度范数的上界,g用来更新参数的梯度。? 使用这种方式,可以使梯度在局部达到鞍点,或者说达到一个最优解。通过这种方式,可以找到一个梯度的范数上限。这样的话就会使梯度不会去更新到特别特别力大。从而使这个权重,保持在一个合理的这么一个范围之内。最后导致这个梯度能够进行正常的传递,防止梯度爆炸情况。 五、LSTM先看这句话 “今天早上小明的妈妈教小明叠被子,首先要将它铺开,1再从两个长边向中间叠形成了一个长方形,最后把长方形的两个短边分别取三分之一处折叠,形成了一个更小的长方形,最后将长方形从中间对折,最终就完成了叠被子” 现在我们要用RNN的方法来得到叠被子这三个字。我们需要从第一个到最后一个字,我们需要去建立一个序列,再去计算每一个字的概率,最后得到叠被子这三个字的概率。但是我们要找的这个叠被子这三个字只在第一句话中出现了,后面全都没有出现,如果使用RNN来做的话,那这就会出现这么一个问题。这个叠被子后面没有出现,他就不会认为叠被子这三个字是一个关键字。如果说他不认为这个叠被子的这三个字是一个关键字的话,到最后,他很难在这里填入叠被子的这三个字。所以说,这个也是RNN针对于这种长文本或者较长的这种序列最头疼的一个问题,也就是一个长期依赖的问题。那么针对于这个长期依赖的问题,我们的解决方法就是使用LSTM来进行操作。 LSTM又叫做长短期记忆网络。它实际上就是RNN的一种特殊的变种,就像他的名字一样,他不仅能够对短期的文本预测和记忆。他还能对比较长远的内容进行存储来达到一个长期记忆的这么一个效果。 LSTM和RNN相比就多了一个c。是 LSTM特有的叫做状态队,他是用来存储记忆的这么一个功能,一个专门用来存储记忆的一个状态。 我们把它展开就得到了这么一种形式。从这个图我们可以看到LSTM在t这一个时刻,他接收到的是三个值,是当前时刻的一个输入,上一个时刻的输出和上一个时刻的单元状态c,实际上这个c。它是另外的一种状态,它的目的就是用来存储长期的记忆,这个状态被称之为这个单元状态。根据这个图,我们可以看到,实际上LSTM的输出,也是两个,一个是状态,一个是在这个时间点的输出。LSTM利用一个叫做门的方式来控制的变化。有三种门,一种叫输入门,一种叫输出门,一种遗忘门,每一个循环单元使用的是这样结构。 在这个循环单元结构中,可以这么来看。在这里面的输入是一个x。那在输入进去之后,要经过一系列的判断。这个判断一般是用一个tanh函数和一个σ函数来组成的。每一个小方块,可以看做是一个门。当这个门的输出为一时,在任何一个向量与其相乘都是向量本身,向量传什么都通过。在LSTM这一个单元中,还有一个遗忘门,际上就是进入在上一个时刻,就这个时刻的这个状态位。遗忘门可以用来控制状态的留存。在整个LSTM运行的过程中,状态虽然是持续的,但它是有选择性的。所谓的这个选择性的,是指他用的时候,我给他拿出来,他不用的时候呢,我们就不给他拿出来。在LSTM中,除了这种带有这个控制门的结构之外,还有一种GRU的形式 GRU和LSTM是很类似的网络结构,它同样是由各种各样的门产生的。但在GRU中主要用到的是一个更新门和一个重置门。更新门是用来去更新这一些参数,更新这一些权重的信息。重置门是用来是重置一些参数信息。GRU和LSTM功能也是非常相似的,一个不同的地方都在于,在GRU里面,只有两个门,像隐藏层之类的在GRU是没有的。这个重置门,主要是用来考虑了之前输出对当前输入的影响。 循环神经网络,只是考虑这个时序的相互关系。比如说NLP中,当我们输出成输出是一个不字,那么输入层输出的是一个是,他们的关系就很明显,他可以形成一个不是这么两个字。当前这个候选的输出层,就可以表达出一个不同的意思了。把两个定性这么一个结合,这个是重置门。更新门相对于重置门来讲,他会更加考虑全局的信息。因为在这个做循环神经网络RNN,LSTM中需要对参数对偏差进行一些更新,那更新门就是用来考虑一些全局的信息,进行一些全局的偏差来。 在LSTM中我们有一个叫做highway是说法。LSTM是由多个单元进行控制的。相当于通过以往我们打开了一条高速公路将误差通过反向传播回去,不需要经过一些非线性的函数。这样的话,他也能够去避免一些梯度消失或者说梯度爆炸的这些问题,从而保持了一个比较完好的一种长期依赖的功能,也就是说,它可以保持一个比较良好的一种记忆力。所以说,用LSTM进行这种误差的更新,进行记忆的保存呢,也是一个非常好的方式。? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 1:36:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |