温后珍 王浩宇 栾仪广 于双锴 陈德斌
(1.东北石油大学机械科学与工程学院 2.山东裕龙石化产业园发展有限公司 3.大庆高新技术产业开发区汽车和高端装备产业促进中心)
当下,有杆抽油机是采油工业中必不可少的装备,在国内外机械采油中,有杆泵抽油机采油方式占有相当大的比例。油井中的原油通过井下抽油泵的抽汲后再通过管道被输送到地面。然而,抽油泵的工作环境十分苛刻,其在工作过程中出现故障在所难免[1-4]。对于抽油系统的维护工作,现场的大部分人力都耗费在数据资料的获取、抽油设备的质检及故障的解决等方面,使得人均管理的油井数量不多,且不能够及时发现设备的故障[5]。为此,怎样才能够准确、及时地判断抽油系统的故障是采油工业中的一大难题。常用的故障诊断技术有人工诊断、专家系统及人工智能。人工诊断方法容易受到个人专业水平的限制且诊断效率较低,不能够实时快速地给出诊断结果。专家系统依赖于最新、完整的数据,并且难以处理复杂问题,同时缺乏一定的灵活性,如果出现新的情况或问题,可能需要重新编写和重新训练系统,需要大量的时间和资源[6-7]。随着现代技术的快速发展,油田已经逐渐走向自动化、数字化及智能化方向。目前人工智能技术逐渐成为采油设备故障诊断的主力。相对于传统的人工诊断方法,人工智能技术大大提高了诊断效率。该技术可以在不同的数据和环境下进行自适应调整,适应各种复杂的工况和环境变化。通过人工智能技术对采油系统实时监控,可以减少不必要的维修时间,大大提高生产效率[8-10]。
目前,采用神经网络技术对抽油系统的故障诊断主要是通过对油井示功图[11]的智能识别。然而对于功图识别任务,直接将数据集送入深度卷积神经网络去训练并不能达到很好的预期效果;诊断精度受到数据量的限制,模型泛化能力不强。对于过于简单的模型,它可能缺乏足够的层数和参数来学习图像的高层次特征,往往只能学习到简单的特征,这些特征不足以很好地区分不同类别的图像。
孪生神经网络[12-17]的结构采用了参数共享的策略,即2个子网络共享相同的权重。这种参数共享策略可以大大减少网络的参数数量,使得在训练过程中需要优化的参数数量大大减少,从而降低了过拟合的风险。同时,参数共享还可以增强网络的泛化能力,使得网络能够更好地适应小样本任务。孪生神经网络通常被用于度量学习任务[18],即学习一个映射,将输入的数据映射到一个低维度的空间中,并且在这个低维度的空间中保持相似的数据靠近,不相似的数据远离。在小样本任务中,数据的数量非常有限,很难对数据进行分类或者回归等任务。但是,通过度量学习可以将数据映射到低维度的空间中,并且根据数据在这个空间中的相对位置进行分类或者回归等任务,可以大大减少数据量的要求。同时,孪生神经网络可以学习一些数据的共性,即使在小样本任务中也可以得到很好的效果。
笔者利用大型公开数据集(Omniglot)构建了训练神经网络所需的图像样本库,基于百度飞桨深度学习框架平台搭建了孪生神经网络模型,利用公开数据集预训练好孪生神经网络模型后,再在功图数据集微调几步。试验结果证明,预训练的孪生神经网络结构模型能显著提高功图识别的准确率,特别适应于功图识别任务。
孪生神经网络是由2个结构相同的神经网络组成的模型,2个神经网络模型结构共享权值参数。它通过对2个输入图片进行相似度比较,从而进行分类、识别及匹配等任务。而在实际训练过程中,由于权值共享,通常是往一个神经网络里送入图像数据,网络会将输入映射到新的空间,依次得到每张图像的特征向量。图1为特征提取网络图。
图1 特征提取网络Fig.1 Feature extraction network
每个图像数据样本呈现形式是2张图像加上类别标签,来自同一类别则标签为1,不同类别标签为0。数据样本通过特征提取网络后展平得到2张图片的特征向量;然后求取它们插值的L1范数[19],相当于度量了这2个特征向量距离,得到一个特征向量;再进行3次全连接得到一个输出结果。图2为比较网络结构图。
图2 比较网络结构Fig.2 Structure of comparison network
f(x1)与f(x2)为图片展平后的特征向量,将2个特征向量相减取绝对值,就可以求取2个特征向量插值的L1范数。理论上来说,预训练好神经网络后便可以应用于小样本图像分类任务[20-21],因为训练好的模型已经拥有了判断图像之间相似度的能力。但试验结果证明,如果将训练好的神经网络模型直接用在功图识别任务上,其表现的效果并不是很理想。这可能是因为在训练过程中,网络过度适应了公开数据集。但是通过在大规模数据集上的训练,该网络已经学习到了通用的图像特征,尤其是边缘特征,学习到这些特征之后,神经网络便能够更快地适应新任务,在新的分类任务上只需要较少的迭代次数便可以使模型很快地收敛。因此本文利用孪生神经网络对特征进行提取,然后在功图识别任务中进行微调。这样一来,该神经网络模型更好地利用了少样本量的功图数据集,模型能够更快收敛,精度得到很大提升,降低了过拟合的风险。
笔者使用百度飞桨深度学习框架的Paddle.nn.BCEWithLogitsLoss()作为损失函数。Paddle.nn.BCEWithLogitsLoss结合了二元交叉熵和sigmoid函数,通常用于度量2个输入样本的相似度或者差异度。它可以直接接收模型的输出值,不需要sigmoid激活函数进行处理。Paddle.nn.BCEWithLogitsLoss将模型的输出值(也就是 logits)传递给sigmoid函数,将其映射到[0,1]之间的概率值,然后计算预测概率与真实标签之间的二元交叉熵损失。由于sigmoid函数的导数可以在反向传播时使用,所以可以有效地训练神经网络模型。Paddle.nn.BCEWithLogitsLoss的计算公式如下:
log[1-σ(Zi)]}
(1)
式中:yi表示样本i的真实标签(取值为0或1);Zi表示样本i的预测值;σ表示sigmoid函数;N表示样本数量。
在训练过程中,将BCEWithLogitsLoss作为损失函数传递给优化器,通过反向传播更新模型参数,以最小化损失函数,使得模型更好地拟合训练数据。
首先准备数据集,将各个类别下的图像数据放在一个Python列表中;然后随机选取一张图片,接着随机选取另一张图片,如果选取的2张图片是相同类别则打上标签1,不同类别则打上标签0。2张图片组成一个数据样本,将组织好的数据集样本根据batchsize大小送进神经网络模型。此时需要先对数据样本进行预处理,以减少计算资源的利用,加快网络的训练速度。在特征提取网络中对数据进行特征提取,特征提取网络基于Vgg16深度卷积网络模型,得到2张图像数据的特征向量,最后在比较网络中对特征向量进行度量,输出2张图片的相似度。前文提到过,根据试验结果,模型会对公开数据集过度适应,所以想要提高训练的精度,需要在功图数据集上进行微调。功图数据组织步骤只需重复以上操作,预训练好的神经网络模型已经具备通用特征学习能力,只需将组织好的功图数据集再送进神经网络进行训练。原则上说,在大规模数据集上训练好的模型已经提取出了通用特征。因此底层的卷积层已经学习到了很多的可重用特征,而这些特征对于新任务也有用。但考虑到功图任务与预训练网络模型输入、输出空间有所不同,所以这里微调全部参数,使神经网络模型在功图识别任务上更加精确可靠。
算法流程图如图3所示。
图3 算法流程图Fig.3 Algorithm flowchart
本试验的数据集包括10类故障工况:抽油杆断、固定阀卡、固定阀漏、供液不足、活塞脱出工作筒、连油带喷、碰泵、气影响、游动阀漏、正常,总共收录功图1 606幅。抽油系统不会频繁出现故障,所以实际收集到的故障工况数据样本有限,且不同故障工况出现的频率也不同,导致收集到的数据样本分布也不均衡。选用的试验数据来自10个典型工况下的故障数据样本。
考虑到功图数据集样本量非常少,同时为了提高模型的鲁棒性和泛化能力,需要对数据集采用数据增强技术。该技术可以帮助模型更好地学习数据不变性,从而减少过拟合风险,提高模型性能。对于少数类别,数据增强技术可以通过扩充数据集来平衡类别间的样本数量,从而提高模型对少数类别的识别能力。数据增强技术可以增加数据集的多样性,从而使模型更好地学习数据的变化和复杂性,提高模型的性能。部分数据增强操作前、后对比如图4和图5所示。
图4 水平翻转Fig.4 Horizontal flip
图5 镜像翻转Fig.5 Mirror flip
功图特征提取CNN模型包括13个卷积层和5个最大池化层,结构如图1所示。输入的功图尺寸为105×105,通道数为1,所用卷积核大小为3×3。卷积层步长为1,池化层步长为2,网络结构参数设置如表1所示。
表1 孪生网络结构参数Table 1 Structural parameters of siamese network
前面的卷积层用于图像特征的提取,所用的激活函数为ReLU,使得神经网络在优化过程中更加容易。因为其具有线性可分性和非饱和性,所用的梯度下降算法更容易找到全局最优解。池化层采用最大池化,尽可能地保留图像的主要特征,同时具有一定的平移不变性和旋转不变性,使神经网络模型更加稳定。后面的网络层全连接+Dropout(在神经网络中应用的正则化技术)层可以降低模型的复杂度和过拟合风险,全连接层需要大量的参数来描述网络的结构,而dropout层可以有效减少参数量,从而减小模型的复杂度,缩短训练时间。对于损失函数的选取,考虑到Paddle.nn.BCEWithLogitsLoss()是二元交叉熵损失和Sigmoid函数的结合。该损失函数的计算只与预测值和真实值有关,而与数据集中各类别的数量无关,即使标签分布不均衡,损失函数的计算也不会受到影响。
由于该神经网络模型已经在公开数据集预训练完成,从理论上来讲,网络模型在功图数据集上训练较少的轮数便可收敛,本试验仅训练了50轮次,模型便有了很好的收敛性能,网络模型的损失曲线趋于稳定,且震荡幅度越来越小。图6为模型训练过程中的训练集与测试集的损失变化曲线。
图6 模型训练过程中训练损失曲线Fig.6 Training loss curve during model training
本试验的模型输出结果是2张图片的相似度,而不是直接输出示功图的故障类别。图7是预测结果的可视化展示。
图7 预测结果可视化展示Fig.7 Visualization of prediction results
需要预测的功图应与已有数据集逐一对比。数据集一共有10个类别,每个类别下选出一张图像样本作为支撑集,然后模型会输出10个相似度值,最后故障类别的判定是选出需要预测的功图与支撑集中功图相似度值最大的那一个。但是这样做存在2个问题:一是支撑集如果每个类别只选一张与预测图片做对比,会存在比较大的误差,结果不具说服力,毕竟原始数据相同类别内的样本或多或少有一定的差距,而类间样本有的也具有一定的相似性;二是不能直接输出类别标签,在实际应用过程中效率也不是很高,比较繁琐。
针对以上问题,对模型预测作出改进。首先建立支撑集数据样本库,每个类别选出多个具有代表性的样本数据,将10个类别样本集打上固定的标签(0~9);然后将需要预测的功图样本依次与支撑集每个类别内的功图样本做对比,这样每个类别下模型会预测出多个相似度值,假设第一个类别下预测出了20个相似度值,将这20个值相加再取平均,得到预测功图样本与该类别功图样本的平均相似度值,接着预测其余的类别;最后得到10个平均相似度值,将这10个值放入Python列表中,然后用特定功能库函数找出列表中最大值对应的索引,进而找出支撑集数据库中与该索引值相等的固定标签值,由此便可以判断预测的故障类型。图8是预测流程的直观展示。
图8 预测流程展示图Fig.8 Prediction flowchart
将训练好的模型用于10类不同故障工况功图识别任务,测试结果如表2所示。
表2 模型测试准确率Table 2 Model test accuracy
由测试结果可以看出,预训练孪生神经网络方法在功图识别任务上效果很可观,尽管功图样本量很少,但在深度神经网络上训练并没有过拟合,在现有数据量的情况下,网络对个别故障工况类型识别甚至可以达到零误差。
理论上来说,对于小样本图像分类任务,孪生网络模型的表现要优于传统卷积神经网络模型,主要原因是功图数据量太少,传统单一卷积网络通常需要大量样本进行训练才能达到较好的性能。本文搭建了单一的经典卷积神经网络用于对比试验,使用相同的功图数据集对网络进行训练,得到训练损失曲线如图9所示。
图9 卷积神经网格训练损失曲线Fig.9 Training loss curve of convolutional neural network
选取训练过程中的最优模型对测试数据集的每一类别进行准确率检验,结果如表3所示。
表3 卷积神经网格模型准确率测试Table3 Model accuracy test
通过训练损失曲线可以看出,模型在测试集上的表现并不是很理想,测试集上的损失曲线一直处于大幅度的波动状态。主要原因在于样本量过少,且样本的类间不平衡也会导致大幅震荡现象。与孪生神经网络不同,由于数据量较少,单一卷积神经网络则需要更多的迭代次数才能使模型尽可能的收敛,所以说训练难度相对也较大,而孪生网络需要较少的迭代次数便可以很好地收敛。通过对准确率的检验可以看出,模型对于不同类别的学习程度是不一样的,而且整体上的预测表现要逊色于孪生神经网络。
本文采用的孪生网络结构是CNN卷积网络结构加对比网络结构的组合,并利用了迁移学习原理,先在大型数据集上预训练,然后在功图样本集上微调。该模型在小样本量功图数据集上表现出了很好的收敛性,且没有过拟合。在功图识别领域,该训练方法优于单纯的深度卷积网络模型分类方法。搭建的网络模型能够淡化标签,而且对于没有被网络训练的任务能够快速适应。预训练神经网络方法在很大程度上缓解了数据稀缺问题,在小数据集分类任务上相比于其他算法更具优势,因为一个数据样本是由2张图片组成的,每张图片都是随机选择,然后与另一张随机选择的图片组成样本对,这样就能形成很多个数据样本,变相地扩充了整个数据集,所以即使功图样本很少,该方法也能在深度网络训练中展现出不错的效果。