一种基于双向循环神经网络的储层预测方法与流程

文档序号:17758509发布日期:2019-05-24 21:29阅读:529来源:国知局
一种基于双向循环神经网络的储层预测方法与流程

本发明属于地球物理勘探地震资料解释技术领域,主要是涉及一种基于双向循环神经网络的储层预测方法。



背景技术:

石油勘探手段主要分为地质法、地球物理法、地球化学法以及钻探法,其中各油气田主要使用地球物理法中的地震物理勘探。地震勘探方法是应用人工的方法使地壳产生振动,如利用炸药产生的人工地震。然后使用精密的仪器记录地震波在地面上各个点的振动情况,通过对这些地震波和其衍生数据的分析,来判断地层下方是否存在油田。

储层地震描述是油气勘探开发中的重要技术,影响着地下储层的描述精度。我国东部的陆相沉积储层厚度一般小于1/4地震波长,储层的地震反射波具有干涉现象,对储层的反映具有明显的不确定性。这种不确定性表现在相同物性的储层随厚度的变化,其地震反射波的振幅、频率、相位均发生变化,影响了对储层几何特征的描述。

使用多地震属性对储层进行预测,产生了很多有价值的技术成果,比如聚类分析、支持向量机、bp神经网络等算法对储层进行预测,并取得了一定效果。也出现了使用深度学习中的卷积神经网络进行多地震属性分析,但只是对同井或者临井的孔隙度进行预测。

综上所述,之前的方法均未考虑地震波在地层传播过程中的深度(时间)信息,没能将多地震属性作为模型输入,并把储层和非储层信息作为标记,使两者之间建立一个映射关系,这样就对于其他区域地下储层的预测,依然存在局限性。



技术实现要素:

本发明就是针对现有技术存在的问题,提出一种基于双向循环神经网络的储层预测方法,将多维地震属性作为模型输入,建立了地震数据与储层之间的映射关系,在储层预测上达到更好的效果,可以得到地下储层的预测。

本发明的技术方案是:

一种基于双向循环神经网络的储层预测方法,包括以下步骤:

步骤1,井震数据的生成:

步骤1.1,地震数据的生成:地震数据包括原始地震数据、振幅类数据、流体检测类数据、频率类数据、相位类数据、构造类数据,每个地震数据对应相同的地理空间分布;

步骤1.2,井标记数据的生成:根据探井的各层位的岩性数据和油性数据得到储层与非储层;

步骤2,标记数据集的生成:

步骤2.1,生成井震标记数据:将地震数据和标记数据组合起来,构成模型输入;

步骤2.2,数据预处理,对输入地震数据进行归一化;

步骤3,双向循环神经网络的搭建和训练:

步骤3.1,根据输入数据形态,搭建双向循环神经网络,选择最佳参数,并将其中的关键参数设置成变量,手动调整寻找最优参数组合;

步骤3.2,最佳参数和模型关键组件的选择,将数据划分成训练集、验证集、测试集三个部分,通过训练得到在验证集上表现最好的参数和组件组合;

步骤3.3,选择最佳参数,训练模型,并测试在测试数据集上的模型表现,作为模型效果的最终评价;

步骤4,将训练好的模型保存下来,提取区域内所有地理位置对应的地震数据,并对其进行预测,得到整个区域下储层概率分布。

上述方案进一步包括:

步骤1.2中岩性数据里面砂岩、砾岩对应为储层,其余为非储层;油性数据里面油层、水层对应为储层,其余为非储层;

步骤2.1,生成井震标记数据:首先对地震数据体进行属性选择,选出表征能力强的地震体,然后与岩性数据和油性数据确定的标记数据组合起来,按照输入数据和标记数据的时间对应关系构成模型的输入;

步骤3.1,搭建双向循环神经网络的关键参数,即超参数,包括学习率、batchsize、epoch设置成变量;

步骤3.2,最佳参数和模型关键组件主要是rnn模型的层数的选择;

步骤3.3,使用随机梯度下降的方法对模型进行训练,得到最佳参数。

上述方案还包括:

步骤3中,循环神经网络由一个输入层、一个隐藏层和一个输出层组成;循环神经网络按照时间展开,其在t时刻接收到输入xt之后,隐藏层的值是st,输出值是ot,关于st的值不仅仅取决于xt,还取决于st-1,用下面的公式来表示循环神经网络的计算方法:

ot=g(vst)(式1)

st=f(uxt+wst-1)(式2)

其中:

xt:是一个向量,表示输入层的值;

st:是一个向量,表示隐藏层的值;

u:输入层到隐藏层的权重矩阵;

ot:是一个向量,表示输出层的值;

v:隐藏层到输出层的权重矩阵;

w:循环神经网络的隐藏层s不仅取决于这次的输入x,还取决于上一次的隐藏层的值s,权重矩阵w就是隐藏层上一次的值作为这一次的输入的权重;

f:激活函数;

g:激活函数;

如果反复把式2带入到式1,将得到:

ot=g(vst)

=vf(uxt+wst-1)

=vf(uxt+wf(uxt-1+wst-2))

=vf(uxt+wf(uxt-1+wf(uxt-2+wst-3)))

=vf(uxt+wf(uxt-1+wf(uxt-2+wf(uxt-3+...))))

循环神经网络的输出值ot,是受前面历次输入值xt,xt-1,xt-2,xt-3,...影响的。

所述步骤3.1具体包括:

1)双向循环神经网络bi-rnn与简单的循环神经网络rnn的区别在于由单向传播变成了前后两个方向,设序列输入长度为t,其中xt表示第t个时刻的前向输入和第t-t个时刻的后向输入,双向循环神经网络将输入进行了反转,并将其输入了另外一个循环神经网络,然后将两个循环神经网络的输出串联起来得到对应时刻的输出ot,用下面的公式来表示这个串联关系:

ot=f(w2st,w6st-t,b)

其中w2st表示前向rnn的输出权重乘以隐藏单元的向量,w6st-t表示反向rnn的输出权重乘以隐藏单元向量,b为偏置,f是激活函数;

在储层预测中,把一个地理坐标对应的特征矩阵a*l×r作为输入,其中l为目标层段的长度,即序列长度t,r为特征维度,这里取76,对应的label标记记为yl×1,即每个时刻t的输入xt(0<t≤t),都有一个标记yt与之对应;

所述步骤3.2具体包括:深度学习模型中的超参数包括rnncell、神经网络单元rnn层数、神经网络单元类型rnncell中的隐层节点个数、优化方法、dropout,其中优化方法,随机梯度下降sgd在第k个训练迭代的更新;

学习率εk,初试参数θ,while停止准则未满足do

从训练集中采包含m个样本{x(1),...,x(m)}的小批量,其中x(i)对应目标为y(i)

计算梯度估计

应用更新:

2)动量方法旨在加速学习,特别是处理高曲率,小但一致的梯度,或是带噪声的梯度;动量算法积累了之前梯度指数级衰减的移动平均,并且沿该方向移动;

动量算法引入了变量v充当速度角色,它代表参数在参数空间移动的方向和速率,速度被设为负梯度的指数衰减平均;在动量学习算法中,假设是单位质量,因此速度向量v也看作是粒子的动量;超参数α∈[0,1)决定了之前梯度的贡献衰减得有多快;更新规则如下:

θ←θ+v

速度v累积了梯度元素相对于∈,α越大,之对现在方向的影响也越大;

3)adagrad算法:

定义:全局学习率ε

定义:初始参数θ

定义:小常数δ,为了数值稳定设为10-7

初始化梯度累积变量r=0

从训练集中采包含m个样本{x(1),...,x(m)}的小批量,其中x(i)对应目标为y(i)

计算梯度估计:

累积平方梯度:r←r+g⊙g

计算更新:

应用更新:θ←θ+δθ

4)rmsprop算法,rmsprop使用指数衰减平均以丢弃遥远去的历史,使其能够在找到凸碗状结构后快速收敛,就像一个初始化于该碗状的adagrad算法实例,相比于adagrad,使用移动平均引入了一个新的超参数ρ,用来控制移动平均的长度范围;

5)自适应动量法adam,动量直接并入了梯度一阶矩指数加权的估计,将动量加入rmsprop最直观的方法是将动量应用于缩放后的梯度;其次,adam包括偏置修正,修正从原点初始化的一阶矩动量项和非中心的二阶矩的估计;

随着时间的推移逐渐降低学习率,因此我们将第k步迭代的学习率记作εk,一般会线性衰减学习率直到第τ次迭代:

εk=(1-α)ε0+αετ

其中在τ次迭代之后,一般使ε保持常数。

6)dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络;

7)损失函数

a)均方误差损失

b)交叉熵损失所述步骤3.3具体包括:

双向循环神经网络使用bptt随时间进行反向传播算法进行参数的更新,主要包含三个步骤:

1)前向计算每个神经元的输出值;

2)反向计算每个神经元的误差项值δj,它是误差函数e对神经元j的加权输入netj的偏导数;

3)计算每个权重的梯度;rnn在训练中很容易发生梯度爆炸和梯度消失;

针对梯度爆炸,设置一个梯度阈值,当梯度超过这个阈值的时候直接截取;

针对梯度消失有三种方法应对梯度消失问题:

一是合理的初始化权重值,初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域;

二是使用整流线性单元代替逻辑回归函数和双曲正切函数作为激活函数;

三是使用其他结构的rnn,比如长短时记忆网络和门限循环单元;

在训练模型过程中,训练集、验证集和测试集三部分的比例分别为60%,20%和20%,然后使用训练集训练,设置的训练策略如下所示:

训练策略:

定义:样本迭代次数nb_epoch

定义:每次训练用的样本数batchsize,

定义:模型定义,

定义:设置超参数组合paras_com,

模型权重初始化,训练集打乱,从训练集中采包含batchsize个样本{x(1),...,x(m)}的小批量,

其中x(i)对应目标为y(i),训练模型,使用梯度下降算法更新参数,

样本集遍历一遍:

对每一组参数组合,每经过一个每次迭代训练的样本数的训练,在验证集上进行测试一下,得到当前模型在验证集上的误差,当样本迭代次数达到epoch次或者误差在验证集上不再下降之后,停止训练;最后,取在验证集上误差最小的超参数组合,得到最优模型m,然后在测试集上对模型的效果进行测试。

本发明根据采集的人工地震数据生成n个衍生地震数据,这样每个采样点(inline,cdp,time)就对应一个n维的地震向量。对于过井的地震数据,根据井上的油性数据和岩性数据将其分为储层和非储层,这样就可以建立起每个采样点与储层和非储层的一一对应关系。其中每个时间步的输入为每个采样点的n维地震数据,输出为对应的储层(label=1)或非储层(label=0)标记。通过对标记样本的训练和超参数调整,得到最优模型,这样对无标记数据就可以就行预测,最终生成一个同样维度的预测地震体,其中每个采样点的值为0~1之间的预测概率。

本发明的方法关注地层下方的储层和非储层的分类,使用双向循环神经网络(bi-rnn),建立了地震数据与储层之间的映射关系,在储层预测上达到了很好的效果,这样就对于其他区域,仅利用去多地震属性信息,就可以得到地下储层的预测。

附图说明

图1为本发明一种实例的流程图;

图2为本发明一种实例的双向循环神经网络模型实例;

图3为地震体某条线对应的纵向剖面图;

图4为过井的地震波与储层和非储层的对应关系图;

图5为浅层机器学习方法对应的属性输入图;

图6为循环神经网络(rnn)结构展开图;

图7为双向循环神经网络(bi-rnn)结构展开图;

图8为循环神经网络(rnn)通过bptt(随时间的梯度反向传播)算法优化的时候,误差的逐层传递示意图;

图9为lstm(长短时记忆神经网络)结构单元示意图;

图10为gru(门限循环单元)结构单元示意图;

图11为bi-lstm(双向长短时记忆神经网络)模型的模型选择过程,表示不同的参数组合对f_measure值(一种统计量)的影响;

图12为bi-lstm(双向长短时记忆神经网络)模型的预测剖面图,表示预测结果地震体某条线对应的纵向剖面图;

图13为bi-lstm(双向长短时记忆神经网络)模型的预测平面图,表示预测结果某层位的横向平面图;

图14为预测地震体的过井剖面与录井图的对比图;

具体实施方式

以下结合附图和实施例详细说明本发明技术方案。

实施例以附图2tensorflow(谷歌开发的采用数据流图,用于数值计算的开源软件库)提供的api(编程接口)定义多层双向循环神经网络。

基于上述的源程序,本发明设计的基于双向循环神经网络的储层预测方法流程见附图1,

所有步骤可由本领域技术人员采用计算机软件技术实现流程自动运行。实施例具体实现过程如下:

步骤1,井震数据的生成。

步骤1.1,地震数据体的生成。地震数据体包括原始地震数据和衍生数据体,主要包括原始地震数据、振幅类数据、流体检测类数据、频率类数据、相位类数据、构造类数据。每个地震体对应相同的地理空间分布。附图3表示地震数据体的一个切面。

步骤1.2,井标注数据的生成,根据探井得到的各层位的岩性数据和油性数据得到储层与非储层。在岩性数据中,砂岩和砾岩被认为是储层,其他为非储层,含油和含水层也作为储层。如附图4所示,通过探井的岩性和油性将其划分为储层和非储层。

步骤2,标记数据集d的生成,将地震数据和井标记数据结合起来,生成模型的输入。

步骤2.1,生成井震标记数据,将地震数据和标记数据组合起来,构成模型输入。不同地震体与储层之间存在不同的相关关系,首先选取了76个具有高相关关系的地震体,这样对于每一个地理坐标(x,y),都可以得到76条地震道数据。如附图5所示:这样对每一个地理坐标(x,y),都可以得到一个反映该位置地震物理特性的特征矩阵a,因为仪器采样等原因,每个地理坐标对应着不同的目标层段,在目标层段内,采样的地震波有更高的准确性和可信度,因此对其进行截取,得到目标层段内的特征矩阵a*,同样,因为根据探井下得到的岩性数据和油性数据,得到了每个深度上对应的标记,其中1表示是储层,0表示非储层。这样,就得到一个标记样本。

步骤2.2,数据预处理,对输入数据进行归一化。构造完成标记数据集之后,为了能够得到可以用来作为模型训练的输入,需要对数据进行归一化操作,归一化方法主要包括高斯归一化和线性归一化,需要注意,不同数据体有着不同的数据分布,因此在进行归一化的时候需要在同一个地震体中进行,即不同的地震体有不同的归一化参数。主要方法包括线性归一化和高斯归一化:

其中x表示原始振幅数据,min(x)表示最小振幅,max(x)表示最大振幅,μ(x)表示平均振幅,σ(x)表示振幅的方差,x*表示归一化之后的数据。

步骤3,双向循环神经网络的搭建和训练,根据输入数据形态,使用tensorflow(谷歌开发的采用数据流图,用于数值计算的开源软件库)搭建双向循环神经网络,并选择最佳参数。循环神经网络有很多种类,最简单的由输入层、一个隐藏层和一个输出层组成。附图6表示将循环神经网络按照时间展开。附图6表示的网络在t时刻接收到输入xt之后,隐藏层的值是st,输出值是ot。关键一点是,st的值不仅仅取决于xt,还取决于st-1。用下面的公式来表示循环神经网络的计算方法:

ot=g(vst)(式1)

st=f(uxt+wst-1)(式2)

其中:

xt:是一个向量,表示输入层的值;

st:是一个向量,表示隐藏层的值;

u:输入层到隐藏层的权重矩阵;

ot:是一个向量,表示输出层的值;

v:隐藏层到输出层的权重矩阵;

w:循环神经网络的隐藏层s不仅取决于这次的输入x,还取决于上一次的隐藏层的值s。权重矩阵w就是隐藏层上一次的值作为这一次的输入的权重。

f:激活函数

g:激活函数

如果反复把式2带入到式1,我们将得到:

ot=g(vst)

=vf(uxt+wst-1)

=vf(uxt+wf(uxt-1+wst-2))

=vf(uxt+wf(uxt-1+wf(uxt-2+wst-3)))

=vf(uxt+wf(uxt-1+wf(uxt-2+wf(uxt-3+...))))

从上面可以看出,循环神经网络的输出值ot,是受前面历次输入值xt,xt-1,xt-2,xt-3,...影响的。

步骤3.1,搭建双向循环神经网络,并将其中的关键参数设置成变量,方便未来手动调整寻找最优参数组合。

本发明实例中,循环神经网络(recurrentneuralnetwork以下简称rnn),使用双向循环神经网络rnn(下文用bi-rnn表示)结构,其在手写识别和语音识别中大获成功,其主要结构如附图7所示。

bi-rnn(双向循环神经网络)与简单rnn(循环神经网络)的区别在于由单向传播变成了前后两个方向。假设序列输入长度为t,其中xt表示第t个时刻的前向输入和第t-t个时刻的后向输入,bi-rnn(双向循环神经网络)的主要意义在于将输入进行了反转,并将其输入了另外一个rnn(循环神经网络),然后将两个rnn(循环神经网络)的输出串联起来得到对应时刻的输出ot,可以用下面的公式来表示这个串联关系:

ot=f(w2st,w6st-t,b)

其中w2st表示前向rnn(循环神经网络)的输出权重乘以隐藏单元的向量,w6st-t表示反向rnn(循环神经网络)的输出权重乘以隐藏单元向量,b为偏置,f是激活函数。在储层预测中,把一个地理坐标对应的特征矩阵a*l×r作为输入,其中l为目标层段的长度,即序列长度t,r为特征维度,这里取76,对应的label标记记为yl×1,即每个时刻t的输入xt(0<t≤t),都有一个标记yt与之对应。

步骤3.2,最佳参数和模型关键组件的选择。深度学习模型中有非常大量的超参数,而模型的训练学习过程并不能自适应的调整这些参数,需要人工的手动调整,这些参数主要包括:rnncell(循环神经网络单元)类型、rnn(循环神经网络)层数、rnncell(循环神经网络单元)中的隐层节点个数、优化方法、dropout(神经元随机丢弃比率)等,同时还需要配置合适的数据归一化方法和损失函数,需要通过大量实验来确定最优超参数。下面分别对这些超参数和关键组件进行介绍:

(1)rnncell类型

1)rnncell(循环神经网络单元)

2)lstmcell(长短时记忆神经网络单元)

3)grucell(门限循环单元)

(2)rnn(循环神经网络)层数

(3)rnncell(循环神经网络单元)中隐层节点个数

(4)优化方法

1)stochasticgradientdecent(随机梯度下降,sgd)

其主要步骤如下:

随机梯度下降(sgd)在第k个训练迭代的更新:

require:学习率εk

require:初试参数θ

while停止准则未满足do

从训练集中采包含m个样本{x(1),...,x(m)}的小批量,其中x(i)对应目标为y(i)

计算梯度估计:

应用更新:

endwhile

2)momentum(动量法)

随机梯度下降算法学习过程有时候会很慢,动量方法旨在加速学习,特别是处理高曲率,小但一致的梯度,或是带噪声的梯度。动量算法积累了之前梯度指数级衰减的移动平均,并且沿该方向移动。

动量算法引入了变量v充当速度角色,它代表参数在参数空间移动的方向和速率。速度被设为负梯度的指数衰减平均。名称动量(momentum)来自物理类比,根据牛顿运动定律,负梯度是移动参数空间中粒子的力。动量在物理学上定义为质量乘以速度。在动量学习算法中,我们假设是单位质量,因此速度向量v也可以看作是粒子的动量。超参数α∈[0,1)决定了之前梯度的贡献衰减得有多快。更新规则如下:

θ←θ+v

速度v累积了梯度元素相对于∈,α越大,之对现在方向的影响也越大。

3)adagrad(自适应梯度下降算法)

adagrad算法,如算法8.4所示,独立地适应所有模型参数的学习率,缩放每反比于其所有梯度历史平方值总和的平方根。具有损失导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上较小的下降。净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。

adagrad算法:

require:全局学习率ε

require:初始参数θ

require:小常数δ,为了数值稳定大约设为10-7

初始化梯度累积变量r=0

while停止准则未满足do

从训练集中采包含m个样本{x(1),...,x(m)}的小批量,其中x(i)对应目标为y(i)

计算梯度估计:

累积平方梯度:r←r+g⊙g

计算更新:

应用更新:θ←θ+δθ

endwhile

4)rmsprop(根平方距离梯度下降)

rmsprop算法(hinton,2012)修改adagrad以在非凸设定下效果更好,改度积累为指数加权的移动平均。adagrad旨在应用于凸问题时快速收敛。当应于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一部是凸碗的区域。adagrad根据平方梯度的整个历史收缩学习率,可能使得学率在达到这样的凸结构前就变得太小了。rmsprop使用指数衰减平均以丢弃遥远去的历史,使其能够在找到凸碗状结构后快速收敛,它就像一个初始化于该碗状的adagrad算法实例。相比于adagrad,使用移动平均引入了一个新的超参数ρ,用来控制移动平均的长度范围。

5)adam(带动量的自适应梯度下降法)

在adam中,动量直接并入了梯度一阶矩(指数加权)的估计。将动量加入rmsprop最直观的方法是将动量应用于缩放后的梯度。结合缩放的动量使用没有明确的理论动机。其次,adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩的估计。

(5)学习率

学习率表示在梯度下降算法中,每次参数更新所用的步长,在实践中,有必要随着时间的推移逐渐降低学习率,因此我们将第k步迭代的学习率记作εk,一般会线性衰减学习率直到第τ次迭代:

εk=(1-α)ε0+αετ

其中在τ次迭代之后,一般使ε保持常数。

(6)dropout(神经元随机丢弃比率)

dropout(神经元随机丢弃比率)是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch(每次迭代训练的批次样本数)都在训练不同的网络。dropout(神经元随机丢弃比率)可以在一定程度上加快训练速度和增强泛化能力,一般来讲隐层节点的dropout(神经元随机丢弃比率)设置为0.5的时候效果最好,因为这样生成的子网络最多。但是具体设置需要根据实验结果进行。

(7)损失函数

1)均方误差损失

2)交叉熵损失步骤3.3,循环神经网络的优化过程

双向循环神经网络使用bptt(backpropagationthroughtime)算法进行参数的更新。

bptt算法是针对循环层的训练算法,主要包含三个步骤:

·前向计算每个神经元的输出值;

·反向计算每个神经元的误差项值δj,它是误差函数e对神经元j的加权输入netj的偏导数;

·计算每个权重的梯度。

最后再用随机梯度下降算法更新权重。下面对这三个步骤进行详细的介绍:

(1)前向计算

使用前面的式2对循环层进行前向计算:

st=f(uxt+wst-1)

其中x和s是向量,u和w是矩阵,将其展开可以得到:

假设输入向量x的维度是m,输出向量s的维度是n,矩阵u的维度是n*m,矩阵w的维度是n*n。在这里我们用手写体字母表示向量的一个元素,它的下标表示它是这个向量的第几个元素,它的上标表示第几个时刻。例如,表示向量s的第j个元素在t时刻的值。uji表示输入层第i个神经元到循环层第j个神经元的权重。wji表示循环层第t-1时刻的第i个神经元到循环层第t个时刻的第j个神经元的权重。

(2)误差项的计算

bptt(backpropagationthroughtime)算法将第l层t时刻的误差项值沿两个方向传播,一个方向是其传递到上一层网络,得到这部分只和权重矩阵u有关;另一个是方向是将其沿时间线传递到初始时刻t1,得到这部分只和权重矩阵w有关。

我们用向量nett表示神经元在t时刻的加权输入,因为:

nett=uxt+wst-1

st-1=f(nett-1)

因此:

我们用a表示列向量,用at表示行向量。上式的第一项是向量函数对向量求导,其结果为jacobian矩阵:

同理,上式第二项也是一个jacobian矩阵:

最后,将两项合在一起,可得:

上式描述了将沿时间往前传递一个时刻的规律,有了这个规律,我们就可以求得任意时刻k的误差项δk:

上式就是将误差项沿时间反向传播的算法。

循环层的加权输入netl与上一层的加权输入netl-1关系如下:

上式中是第l层神经元的加权输入(假设第l层是循环层);是第l-1层神经元的加权输入;是第l-1层神经元的输出;fl-1是第l-1层的激活函数。

所以,

式4就是将误差项传递到上一层算法。

(4)权重梯度的计算

首先,我们计算误差函数e对权重矩阵w的梯度

附图8展示了到目前为止,在前两步中已经计算得到的量,包括每个时刻t循环层的输出值st,以及误差项δt。只要知道了任意一个时刻的误差项δt,以及上一个时刻循环层的输出值st-1,就可以按照下面的公式求出权重矩阵在t时刻的梯度

上式中,表示t时刻误差项向量的第i个分量;表示t-1时刻循环层第i个神经元的输出值。

我们已经求得了权重矩阵w在t时刻的梯度,最终的梯度是各个时刻的梯度之和:

同权重矩阵w类似,我们可以得到权重矩阵u的计算方法。

上式是误差函数在t时刻对权重矩阵u的梯度。和权重矩阵w一样,最终的梯度也是各个时刻的梯度之和:

(5)rnn(循环神经网络)的梯度爆炸和消失问题

上述的rnn(循环神经网络)并不能很好的处理较长的序列,一个主要的原因是,rnn(循环神经网络)在训练中很容易发生梯度爆炸和梯度消失,这导致训练时梯度不能在较长序列中一直传递下去,从而使rnn(循环神经网络)无法捕捉到长距离的影响。我们根据式可得:

上式的β定义为矩阵的模的上界。因为上式是一个指数函数,如果t-k很大的话(也就是向前看很远的时候),会导致对应的误差项的值增长或缩小的非常快,这样就会导致相应的梯度爆炸和梯度消失问题(取决于大于1还是小于1)。通常来说,梯度爆炸更容易处理一些。因为梯度爆炸的时候,我们的程序会收到nan(空值)错误。我们也可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。

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

·合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。

·使用relu(正流线型单元)代替sigmoid(逻辑回归函数)和tanh(双曲正切函数)作为激活函数。

·使用其他结构的rnn(循环神经网络),比如长短时记忆网络(lstm)和gatedrecurrentunit(gru).

长短时记忆网络的思路比较简单。原始rnn(循环神经网络)的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。lstm(长短时记忆神经网络)实际上增加了一个状态,即c,让它来保存长期的状态。lstm(长短时记忆神经网络)的关键,就是怎样控制长期状态c。在这里,lstm(长短时记忆神经网络)的思路是使用三个控制开关。第一个开关ft,负责控制继续保存长期状态c;第二个开关it,负责控制把即时状态输入到长期状态c;第三个开关ot,负责控制是否把长期状态c作为当前的lstm的输出。三个开关的作用如附图9所示:

其中:

ft=σ(wf·[ht-1,xt]+bt)

it=σ(wi·[ht-1,xt]+bi)

ot=σ(wo·[ht-1,xt]+bo)

门的使用,就是用门的输出向量按元素乘以我们需要控制的那个向量。因为门的输出是0到1之间的实数向量,那么,当门输出为0时,任何向量与之相乘都会得到0向量;输出为1时,任何向量与之相乘都不会有任何改变。因为σ(也就是sigmoid函数)的值域是(0,1),所以门的状态都是半开半闭的。

lstm(长短时记忆神经网络)用两个门来控制单元状态c的内容,一个是遗忘门(forgetgate)ft,它决定了上一时刻的单元状态ct-1有多少保留到当前时刻;另一个是输入门(inputgate)it,它决定了当前时刻网络的输入xt有多少保存到单元状态lstm(长短时记忆神经网络)用输出门(outputgate)ot来控制单元状态ct有多少输出到lstm(长短时记忆神经网络)的当前输出值ht。

gru(门限循环单元)对lstm(长短时记忆神经网络)做了两个大改动,其结构如附图10所示。

1)将输入门、遗忘门、输出门变为两个门:更新门(updategate)zt和重置门(resetgate)rt。2)将单元状态与输出合并为一个状态:。其中:

zt=σ(wz·[ht-1,xt])

rt=σ(wr·[ht-1,xt])

在实际使用过程中,我们在经过权重初始化之后,使用relu(整流线性单元)作为激活函数,同时经过实验验证lstmcell(长短时记忆神经网络单元)和grucell(门限循环单元)哪个能够达到最大的准确性。

步骤3.3,将数据划分成train(训练集),validation(验证集),test(测试集)三个部分,通过训练得到在validation(验证集)数据集上表现最好的参数和组件组合。训练集(traindataset)、验证集(validationdataset)和测试集(testdataset)三部分的比例分别为60%,20%和20%,然后使用训练集训练,设置的训练策略如下所示:

训练策略:

require:样本迭代次数nb_epoch

require:每次训练用的样本数batchsize

require:模型定义

require:设置超参数组合paras_com

forparametersinparas_com:

模型权重初始化

训练集打乱

while迭代次数未到do

从训练集中采包含batchsize个样本{x(1),...,x(m)}的小批量,其中x(i)对应目标为y(i)

训练模型,使用梯度下降算法更新参数。

if样本集遍历一遍:

训练集打乱

endwhile

得到当前超参数对应的验证集误差

endfor

这样对每一组参数组合,每经过一个batch(每次迭代训练的批次样本数)的训练,我们都在验证集上进行测试一下,得到当前模型在验证集上的误差,当样本迭代次数达到epoch(整个样本集迭代轮数)次或者误差在验证集上不再下降之后,停止训练。最后,取在验证集上误差最小的超参数组合,得到最优模型m,然后在测试集上对模型的效果进行测试。不同参数组合对应的误差曲线如附图11所示。

步骤3.4,选择最佳参数,训练模型,并测试在test(测试集)数据集上的模型表现,作为模型效果的最终评价。

步骤4,将训练好的模型模型保存下来,提取区域内所有地理位置对应的地震数据,并对其进行预测,得到整个区域储层的概率。预测地震体的一个纵向剖面和横向切面如附图12和附图13所示。

步骤5,将输出的地震数据体交付生产部门,并进行查看验证,其分析对比图如附图14所示。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1