(1.中國人民解放軍66294部隊,北京 100042; 2.中國人民解放軍陸軍裝備部信息保障室三室,北京 100042)
在武器裝備維修與技術(shù)保障領(lǐng)域中,普遍存在故障模式復(fù)雜、分析定位繁瑣等問題。以陸軍某型便攜式防空導(dǎo)彈為例,通過FMEA分析可知,故障現(xiàn)象與故障模式大量交錯,尤其對于電氣性能故障,現(xiàn)象與模式一對多、多對一的情況非常普遍。目前,對于裝備在維修過程中的故障分析及定位,仍然以人工為主,人的經(jīng)驗水平對分析和定位的準(zhǔn)確性影響很大。遇到經(jīng)驗不足的維修人員,無法準(zhǔn)確定位故障部位,只能以分步代換的方法進行故障排除,導(dǎo)致工作效率低下、資源大量浪費。
目前,隨著人工智能的發(fā)展進步,人工神經(jīng)網(wǎng)絡(luò)等方法大量應(yīng)用在模式識別、自動控制、測試估計等多個領(lǐng)域。本文針對上述問題,以某型便攜防空導(dǎo)彈發(fā)射機構(gòu)為典型研究對象,以近五年的維修歷史數(shù)據(jù)制作了訓(xùn)練和測試數(shù)據(jù)集,引入BP神經(jīng)網(wǎng)絡(luò)算法進行故障分析及定位,探討神經(jīng)網(wǎng)絡(luò)在裝備故障分析中的應(yīng)用。
BP神經(jīng)網(wǎng)絡(luò)(back propagation neural network)是一種按誤差反向傳播訓(xùn)練的多層前饋網(wǎng)絡(luò),其基本思想是利用梯度搜索,使網(wǎng)絡(luò)的實際輸出和期望輸出的誤差均方差最小。
基本的BP網(wǎng)絡(luò)包括信號的前向傳播和誤差的反向傳播兩個過程。在信號前向傳播過程中,輸入信號通過中間層作用于輸出層,經(jīng)過非線性變換,產(chǎn)生輸出信號,若實際輸出與期望輸出不相符,則轉(zhuǎn)入誤差反向傳播過程,逐層獲取誤差信號以更新每個節(jié)點的聯(lián)接強度以及閾值,以上即為神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程。經(jīng)過大量樣本的多次迭代,傳播矩陣被不斷修正,各節(jié)點間的權(quán)值進一步趨于合理,最終對數(shù)據(jù)歸類的準(zhǔn)確率也不斷提高[1]。在訓(xùn)練結(jié)束后,以最終確定的各節(jié)點權(quán)值構(gòu)建完整網(wǎng)絡(luò)。
Python是一種解釋型、面向?qū)ο?、動態(tài)數(shù)據(jù)類型的高級程序設(shè)計語言,由于其簡潔、易讀的特性,有著大規(guī)模的用戶群體。同時,Python支持眾多開源的科學(xué)計算庫,如著名的OpenCV、VTK等等,得益于此,Python大量應(yīng)用于科學(xué)計算以及人工智能領(lǐng)域[2]。
2.1.1 地面設(shè)備的主要電氣組成及性能參數(shù)
該型地面設(shè)備內(nèi)部主要由3塊線路板組成,根據(jù)具體功能,可分為主要有以下9個功能模塊:
1)供電電路:對系統(tǒng)主電源進行變換,為裝備各部分提供二次電源。常見的故障模式主要是二次電源失效,所表現(xiàn)出的現(xiàn)象主要為相關(guān)部分的電源最大消耗電流以及穩(wěn)定工作電流異常,出現(xiàn)故障后會對全局造成影響。
2)單片機核心及外圍接口電路:系統(tǒng)的核心部分,接收各類外部信號,計算導(dǎo)彈發(fā)射條件,輸出各種控制指令,出現(xiàn)故障后會對全局造成影響。
3)起轉(zhuǎn)控制電路:控制導(dǎo)引頭陀螺部分起轉(zhuǎn)與停止,常見的故障模式主要是導(dǎo)引頭起轉(zhuǎn)失敗或轉(zhuǎn)速異常,表現(xiàn)出的現(xiàn)象主要為導(dǎo)引頭不起轉(zhuǎn)、起轉(zhuǎn)斷開時間或斷開頻率異常,出現(xiàn)故障后會對全局造成影響。
4)聲音信號控制電路:控制輸出聲音信號,主要用于在截獲目標(biāo)以及分析目標(biāo)角速度時給出聲音指示,故障模式和現(xiàn)象比較簡單,主要是有聲(正常)/無聲(異常),出現(xiàn)故障后不會對系統(tǒng)主體功能產(chǎn)生影響。
5)光信號控制電路:和聲音信號控制電路類似,主要用于在截獲目標(biāo)以及分析目標(biāo)角速度時給出燈光指示,故障模式和現(xiàn)象比較簡單,主要是有光(正常)/無光(異常),出現(xiàn)故障后不會對系統(tǒng)主體功能產(chǎn)生影響。
6)解鎖電路:控制導(dǎo)引頭陀螺部分偏移的鎖定以及解鎖,常見的故障模式主要是導(dǎo)引頭陀螺部分不解鎖,無法正常跟蹤目標(biāo),表現(xiàn)出的故障現(xiàn)象主要是對目標(biāo)角飛行狀態(tài)分析異常,無法給出正確的發(fā)射條件。其故障現(xiàn)象不直觀,需要依據(jù)發(fā)射條件以及分析時間等多個量綜合判斷,該部分出現(xiàn)故障后會對全局造成影響。
7)電源轉(zhuǎn)換電路:在導(dǎo)彈進入發(fā)射程序后,激活彈上電源,同時將工作電源從地面電源轉(zhuǎn)換為彈上電源,常見的故障模式主要是彈上電源無法激活以及電源轉(zhuǎn)換失敗,表現(xiàn)出的故障現(xiàn)象主要是導(dǎo)彈起飛后姿態(tài)異常。其故障現(xiàn)象不直觀,需要根據(jù)測試結(jié)果綜合判斷,該部分出現(xiàn)故障后會對全局造成影響。
8)氣源激活電路:與電源轉(zhuǎn)換電路類似,主要是激活彈上致冷氣源。
9)點火電路:用于輸出導(dǎo)彈發(fā)動機點火信號,常見的故障模式和現(xiàn)象主要是導(dǎo)彈進入發(fā)射程序后發(fā)射失敗,該部分出現(xiàn)故障后會對全局造成影響。
10)IFF電路:敵我識別功能電路,主要用于對目標(biāo)進行敵我識別,在判定目標(biāo)為友機時,及時停止發(fā)射程序。主要的故障模式和現(xiàn)象是無法進行敵我判定,該部分出現(xiàn)故障后不會影響系統(tǒng)主體功能。
對應(yīng)各功能模塊電路,主要的電氣性能測試項目表1所列。
表1 發(fā)射機構(gòu)主要電氣性能測試項目
2.1.2 神經(jīng)網(wǎng)絡(luò)模型
發(fā)射機構(gòu)故障分析相對簡單,為減少計算量及計算時間,在構(gòu)建神經(jīng)網(wǎng)絡(luò)時采用常見的3層架構(gòu),即除輸入層及輸出層外,只建立1層中間層。
對于每層的節(jié)點數(shù),根據(jù)以下規(guī)則確定:
1)輸入層節(jié)點數(shù)由發(fā)射機構(gòu)需要測試的性能參數(shù)決定,即14個節(jié)點;
2)輸出層節(jié)點數(shù)由需要定位故障的發(fā)射機構(gòu)功能模塊電路數(shù)量確定,即9個節(jié)點;
確定了以上參數(shù),在程序中建立neuralNetwork類,該類主要對輸入層、中間層、輸出層的節(jié)點數(shù)量和各層間的權(quán)重矩陣以及梯度下降算法的學(xué)習(xí)率進行初始化,其代碼如下:
classneuralNetwork:
初始化
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
根據(jù)初始化參數(shù)設(shè)置輸入、隱藏、輸出節(jié)點數(shù)量
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
設(shè)置學(xué)習(xí)率
self.lr = learningrate
以隨機正態(tài)分布的方式確定兩個權(quán)重矩陣
self.wih = numpy.random.normal(0.0, pow(self.hnodes,
0.5),(self.hnodes,self.inodes))
self.who = numpy.random.normal(0.0, pow(self.onodes,
-0.5),(self.onodes,self.hnodes))
以lambda表達式的方式引用Sigmoid函數(shù),expit()即為S函數(shù)
self.activation_function = lambda x: scipy.special.expit(x)
在信號前饋過程中,重點需要關(guān)注由每個節(jié)點的權(quán)重組成的權(quán)重矩陣以及信號在中間層傳播時應(yīng)用的激活函數(shù)。在本項目中,權(quán)重矩陣的初始化以隨機數(shù)的方式生成。同時,如果沒有激活函數(shù),每一層的輸出和輸入都為線性關(guān)系,無論中間有多少層,都沒有意義[2]。在激活函數(shù)的選擇上,采用了類似階躍函數(shù)但比階躍函數(shù)更加平滑、更接近現(xiàn)實的S函數(shù)(Sigmoid Function):
(1)
在本神經(jīng)網(wǎng)絡(luò)中,中間層的輸入信號符合:
(2)
式中,I為輸入矩陣,Wih為輸入層和中間層之間的權(quán)重矩陣。
中間層的輸出為:
(3)
輸出層的信號符合:
(4)
式中,I為輸入矩陣,Wih、Who分別為輸入層至中間層以及中間層至輸出層的權(quán)重矩陣,Xh為中間層輸出矩陣,Xo為輸出層輸出矩陣)
誤差的反向傳播過程可以用矩陣乘法表示:
(5)
考慮到神經(jīng)網(wǎng)絡(luò)的規(guī)模,在權(quán)重更新過程中采用了梯度下降法,該方法計算效率高,但存在兩個風(fēng)險。一是有可能停止于局部極小值而不是全局最小值,導(dǎo)致分類不準(zhǔn)確;二是超調(diào)越過最小值,系統(tǒng)不斷振蕩,導(dǎo)致無法有效收斂。為了盡量減少上述風(fēng)險,需要選擇適當(dāng)?shù)恼`差函數(shù)。在網(wǎng)絡(luò)中,對于第k個節(jié)點,確定誤差函數(shù)為:
ek=(tk-ok)2
(6)
選擇這一誤差函數(shù),主要基于兩點原因[4]:
1)使用該函數(shù),可以比較方便的計算出梯度下降的斜率;
2)誤差函數(shù)平滑連續(xù),不會出現(xiàn)下降過程中突然跳躍的情況;
3)誤差越接近最小值,梯度越小,超調(diào)風(fēng)險相應(yīng)減小。
相應(yīng)的,在該處的斜率為:?e/?w。
設(shè)輸入層某一節(jié)點為i,中間層某一節(jié)點為j,輸出層某一節(jié)點為k,期望值為t,實際輸出值為o。則對于任意j-k鏈路,可計算斜率為:
(7)
由于t為常數(shù),則有:
(8)
最終,中間層與輸出層間誤差函數(shù)斜率為:
(1-sigmoid(∑jWj,k·oj))·oj
(9)
輸入層與中間層誤差函數(shù)斜率為:
(1-sigmoid(∑jWj,k·oj))·oj
(10)
最終的權(quán)重更新函數(shù)為:
(11)
式中,α為學(xué)習(xí)率。在梯度下降算法中,學(xué)習(xí)率決定了參數(shù)每次更新的幅度,即下降過程中每一步的步長。
誤差計算與權(quán)重更新源代碼如下:
計算誤差
output_errors = targets - final_outputs
hidden_errors = numpy.dot(self.who.T, output_errors)
更新權(quán)重
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs))
self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs))
以隨機正態(tài)分布的方式確定兩個權(quán)重矩陣
self.wih = numpy.random.normal(0.0, pow(self.hnodes,
-0.5),(self.hnodes,self.inodes))
self.who = numpy.random.normal(0.0, pow(self.onodes,
-0.5),(self.onodes,self.hnodes))
考慮到激活函數(shù)以及整個神經(jīng)網(wǎng)絡(luò)的使用范圍,需要輸入數(shù)據(jù)進行預(yù)處理。由于網(wǎng)絡(luò)特征所限,輸入數(shù)據(jù)必須在0.0~1.0范圍內(nèi),因此需要對輸入數(shù)據(jù)進行歸一化。同時,當(dāng)輸入數(shù)據(jù)為0時,權(quán)重更新函數(shù)會輸出0,導(dǎo)致網(wǎng)絡(luò)喪失學(xué)習(xí)能力,因此在遇到輸入為0時,需要加入一個微量的偏移0.001。特別的,對于聲音信號、光信號這類只存在正常和異常(非0即1)兩種狀態(tài)的測試結(jié)果數(shù)據(jù),為了使網(wǎng)絡(luò)能正常進行判斷,同樣需要加入微量偏移,使其正常狀態(tài)輸出0.99、異常狀態(tài)輸出0.001。
為了使神經(jīng)網(wǎng)絡(luò)能正常工作,需要對其進行訓(xùn)練。訓(xùn)練數(shù)據(jù)由歷史測試數(shù)據(jù)經(jīng)預(yù)處理后綜合而成,共15位,其中第2~15位為測試數(shù)據(jù),第1位為故障判定結(jié)果。部分訓(xùn)練數(shù)據(jù)如圖1所示。
圖1 部分訓(xùn)練數(shù)據(jù)
網(wǎng)絡(luò)訓(xùn)練的實現(xiàn)過程中,需要先將輸入矩陣轉(zhuǎn)化為二維數(shù)組,之后通過激活函數(shù),進行正向計算,在計算完成后,根據(jù)與目標(biāo)的誤差,反向更新權(quán)重矩陣,完整方法代碼如下[5-7]:
def train(self, inputs_list, targets_list):
將輸入轉(zhuǎn)換成2D數(shù)組
inputs = numpy.array(inputs_list, ndmin =2).T
targets = numpy.array(targets_list, ndmin =2).T
hidden_inputs = numpy.dot(self.wih, inputs)
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = numpy.dot(self.who, hidden_outputs)
final_outputs = self.activation_function(final_inputs)
計算誤差
output_errors = targets - final_outputs
hidden_errors = numpy.dot(self.who.T, output_errors)
更新權(quán)重
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0
- final_outputs)), numpy.transpose(hidden_outputs))
self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0
- hidden_outputs)), numpy.transpose(inputs))
利用訓(xùn)練數(shù)據(jù)集以及測試數(shù)據(jù)集對訓(xùn)練完畢的網(wǎng)絡(luò)進行訓(xùn)練、測試。收集五年的歷史測試數(shù)據(jù),其中80%用于制作訓(xùn)練數(shù)據(jù)集,剩余20%用于制作測試數(shù)據(jù)集。訓(xùn)練數(shù)據(jù)集總量為520條,測試數(shù)據(jù)集總量為130條。在學(xué)習(xí)率為0.2、中間層節(jié)點數(shù)量為11的條件下,得到預(yù)測準(zhǔn)確率約為94.7%,程序總執(zhí)行時間約為8.18秒。
在網(wǎng)絡(luò)中,如果學(xué)習(xí)率較小,則訓(xùn)練時間會增加,相應(yīng)達到收斂所需要迭代的次數(shù)就高,反之,雖然效率提高,但有可能超過局部最小值,造成系統(tǒng)振蕩不停,使其無法收斂[8]。對于目前網(wǎng)絡(luò),經(jīng)過多次實驗,發(fā)現(xiàn)在其他條件不變的情況下,當(dāng)學(xué)習(xí)率低于0.05以下時,預(yù)測準(zhǔn)確率明顯下降,可知網(wǎng)絡(luò)有可能在非全局最小值出現(xiàn)收斂;當(dāng)學(xué)習(xí)率高于0.2時,程序執(zhí)行時間明顯增加,并且預(yù)測準(zhǔn)確率出現(xiàn)下降趨勢,可知網(wǎng)絡(luò)出現(xiàn)超調(diào)振蕩現(xiàn)象,分類效率受到影響;當(dāng)學(xué)習(xí)率高于0.4時,預(yù)測準(zhǔn)確率下降顯著,可知網(wǎng)絡(luò)在部分?jǐn)?shù)據(jù)訓(xùn)練中有可能出現(xiàn)無法收斂的情況;在學(xué)習(xí)率設(shè)置為0.1左右時,得到最佳預(yù)測準(zhǔn)確率約為95.2%,用時約7.36 s。整體結(jié)果如圖2所示。
圖2 不同學(xué)習(xí)率下的準(zhǔn)確率曲線(橫軸為學(xué)習(xí)率,縱軸為準(zhǔn)確率)
網(wǎng)絡(luò)中間層是執(zhí)行學(xué)習(xí)過程的主要層次,如果節(jié)點過少,則沒有足夠的空間使網(wǎng)絡(luò)完成學(xué)習(xí)[9]。經(jīng)過實驗,發(fā)現(xiàn)對于目前網(wǎng)絡(luò),在其他條件不變的情況下,當(dāng)中間層節(jié)點數(shù)量減少為7個時,學(xué)習(xí)率約為70%左右,當(dāng)中間層數(shù)量為100時,預(yù)測準(zhǔn)確率約為95.6%,用時約8.86秒,當(dāng)中間層節(jié)點數(shù)量設(shè)置為200時,得到預(yù)測準(zhǔn)確率約為96.2%,用時約12.41秒。此后,隨著節(jié)點數(shù)量增加,程序執(zhí)行時間增加明顯,但準(zhǔn)確率未發(fā)現(xiàn)明顯提升,結(jié)果如圖3所示。
圖3 不同中間層節(jié)點下的準(zhǔn)確率曲線(橫軸為中間層節(jié)點數(shù),縱軸為準(zhǔn)確率)
通過分析結(jié)果,在最初的網(wǎng)絡(luò)結(jié)構(gòu)中,預(yù)測準(zhǔn)確率約為94.7%;在其他條件不變的情況下,預(yù)測準(zhǔn)確率在學(xué)習(xí)率為0.1左右時達到最高,約95.2%,同時學(xué)習(xí)率過高或過低時,準(zhǔn)確率會出現(xiàn)明顯下降;進一步將中間層節(jié)點增加至200個時,識別準(zhǔn)確率又提升約1%,達到96.2%,而后隨著節(jié)點數(shù)量增加,訓(xùn)練及預(yù)測時間成倍增長,但預(yù)測準(zhǔn)確率并無明顯變化。由此可知,對于簡單的三層BP神經(jīng)網(wǎng)絡(luò),設(shè)置適當(dāng)?shù)膶W(xué)習(xí)率以及中間層節(jié)點數(shù)量,可以有效提升最終結(jié)果的準(zhǔn)確程度,反之,則有可能面臨梯度消失或超調(diào)的風(fēng)險。同時,在武器裝備的維修及技術(shù)保障工作中,超過95%的準(zhǔn)確率已經(jīng)可以滿足基本的故障分析和定位。
本文中,選擇S函數(shù)作為神經(jīng)網(wǎng)絡(luò)的激活函數(shù)。該函數(shù)連續(xù)、并且在整個定義域間單調(diào),是常見的激活函數(shù)。但是,在實際運用中仍然存在兩個問題,一是S函數(shù)輸出均值不為0,存在偏移現(xiàn)象,在多層神經(jīng)網(wǎng)絡(luò)中,下層的輸入會受到上層輸出的影響;二是對該函數(shù)求導(dǎo)后發(fā)現(xiàn),在變量x取值非常大或非常小的時候,其斜率會趨近于0,使梯度更新緩慢,有可能導(dǎo)致梯度消失,即如果初始值很大的話,神經(jīng)元會出現(xiàn)飽和現(xiàn)象,整個網(wǎng)絡(luò)學(xué)習(xí)困難。
在人工神經(jīng)網(wǎng)絡(luò)中,常見的激活函數(shù)還可以選擇tanh函數(shù)、ReLU函數(shù)以及Leaky-ReLU函數(shù)。
tanh函數(shù)原型如下:
(12)
與S函數(shù)相比,tanh函數(shù)的最大優(yōu)點是輸出均值為0,但依然存在軟飽和性,對于某些初始值,有梯度消失的風(fēng)險。
ReLU函數(shù)(線性整流函數(shù))是斜坡函數(shù)的變種函數(shù),原型如下:
f(x)=max(0,x)
(13)
其在x小于0時,存在硬飽和現(xiàn)象,在x大于0時,不存在飽和問題,可以避免梯度消失現(xiàn)象。同時,若梯度過大,會導(dǎo)致“神經(jīng)元死亡”的現(xiàn)象。因此,在使用時需要適當(dāng)控制學(xué)習(xí)率。
Leaky-ReLU函數(shù)是對ReLU函數(shù)的改進,原型如下:
(14)
函數(shù)中,α為一較小常數(shù),可以比較有效的解決變量小于0時,函數(shù)存在硬飽和區(qū)的問題,是比較理想的激活函數(shù)。同時,無論ReLU或Leaky-ReLU函數(shù),都存在輸出均值不為0的情況。
對于輸入與輸出節(jié)點數(shù)量多、對應(yīng)關(guān)系復(fù)雜的系統(tǒng),適當(dāng)增加中間層數(shù)量,可以提升網(wǎng)絡(luò)預(yù)測準(zhǔn)確率。但是,對于簡單系統(tǒng),中間層數(shù)量增加不但對改進預(yù)測準(zhǔn)確率貢獻不大,而且還會使分析時間大量增加。
根據(jù)以上兩點,對于以文中提到的某型便攜防空導(dǎo)彈發(fā)射機構(gòu)這類結(jié)構(gòu)較為簡單,故障現(xiàn)象、故障模式以及故障部位對應(yīng)較為單一的裝備,不存在極端的輸入數(shù)據(jù),選擇單一中間層網(wǎng)絡(luò)并且以S函數(shù)作為激活函數(shù),在實現(xiàn)中較為簡單,準(zhǔn)確率和網(wǎng)絡(luò)工作效率較高,同時不會出現(xiàn)梯度消失或者偏移量過大的問題。如果將此神經(jīng)網(wǎng)絡(luò)應(yīng)用于故障模式復(fù)雜的大型裝備,則要考慮根據(jù)輸入輸出的復(fù)雜程度,選擇效率高、工作中冗余度大的激活函數(shù),適當(dāng)設(shè)置中間層數(shù)量,以達到整個網(wǎng)絡(luò)的最優(yōu)配置。
本文以某型便攜防空導(dǎo)彈發(fā)射機構(gòu)為研究平臺,研究了BP神經(jīng)網(wǎng)絡(luò)在裝備故障分析中的應(yīng)用,構(gòu)建了基于神經(jīng)網(wǎng)絡(luò)的故障分析方法,并在Python環(huán)境下進行了實現(xiàn),同時探討了網(wǎng)絡(luò)方法的進一步改進策略。通過實驗驗證,可知該方法具有速度快、應(yīng)用簡單、準(zhǔn)確率高的特點,可以滿足典型目標(biāo)的故障分析及定位,并且可以快速擴展應(yīng)用于其他裝備的技術(shù)保障工作中。