溫后珍 王浩宇 欒儀廣 于雙鍇 陳德斌
(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張圖片組成的,每張圖片都是隨機選擇,然后與另一張隨機選擇的圖片組成樣本對,這樣就能形成很多個數據樣本,變相地擴充了整個數據集,所以即使功圖樣本很少,該方法也能在深度網絡訓練中展現出不錯的效果。