錢 豐,梅劍平,潘榮勝
(上汽大眾汽車有限公司 計劃物流部,上海 201805)
近年來,建立在大數(shù)據(jù)基礎(chǔ)上的人工智能取得了爆發(fā)式的發(fā)展,其影響已經(jīng)迅速滲透到了我們?nèi)粘I钪?。而此輪發(fā)展的核心則是基于神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)在理論和實踐上的突破,深度學(xué)習(xí)的方法具有較強的通用性。本文將結(jié)合汽車制造業(yè)物流規(guī)劃中的一個案例,介紹一條將這種方法應(yīng)用于日常工作的路徑。
多倫多大學(xué)教授Hinton于2006年提出深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò),使得神經(jīng)網(wǎng)絡(luò)訓(xùn)練性能取得突破性發(fā)展。2012年Hinton團隊在ImageNet比賽中完勝對手,基于神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)開始被工業(yè)界重視,結(jié)合工業(yè)界的大數(shù)據(jù),在各領(lǐng)域特別是在視覺和語音識別上準(zhǔn)確率大幅提高,并以此為基礎(chǔ)應(yīng)用于人類日常生活與工作,顯著提高了效率。
神經(jīng)網(wǎng)絡(luò)的工作原理是模擬人腦神經(jīng)元的活動過程,在輸入的大量數(shù)據(jù)中自發(fā)提取特征、總結(jié)規(guī)律,自我訓(xùn)練各神經(jīng)元權(quán)重,調(diào)整神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),最終可以對未獲取過的信息做出正確判別。其與傳統(tǒng)人工智能的本質(zhì)區(qū)別就在于,自發(fā)提取特征,調(diào)整結(jié)構(gòu),而不需要人工構(gòu)建特征,設(shè)計算法。
一個神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)如圖1,最基本有三層結(jié)構(gòu)。輸入層接受數(shù)據(jù),其維度由輸入數(shù)據(jù)的結(jié)構(gòu)決定,一般由x表示。輸出層為輸出結(jié)果,其維度由需要獲得結(jié)果的結(jié)構(gòu)決定,一般由y表示。中間皆為隱藏層,至少有一層隱藏層,當(dāng)有多個隱藏層時即為深度神經(jīng)網(wǎng)絡(luò)。
圖1 深度神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)示意
圖2 單個神經(jīng)元基本結(jié)構(gòu)
單個神經(jīng)元的基本結(jié)構(gòu)如圖2。一個神經(jīng)元有多個輸入,但只有一個輸出。這與人腦神經(jīng)元有多個樹突、一個軸突是一致的。W為各輸入的權(quán)重,加上偏置b,即為一個神經(jīng)元獲得的總輸入g=再經(jīng)過激活函數(shù)得到輸出yk=Φ(g).激活函數(shù)的意義在于使神經(jīng)元輸出非線性。
所謂深度學(xué)習(xí),即對深度神經(jīng)輸入大量樣本x,以訓(xùn)練隱藏層的各神經(jīng)元的輸入權(quán)重。最終達到輸出y與理想輸出y'的誤差最小。這樣訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)即可用于對未知的樣本x0計算可靠輸出y0。
工業(yè)實踐中積累有大量數(shù)據(jù),非常適合神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。如汽車業(yè)的自動駕駛技術(shù),就是基于大量司機實際的駕駛數(shù)據(jù)訓(xùn)練駕駛模型的神經(jīng)網(wǎng)絡(luò),最終由車載計算機輸出在不同場景下的正確駕駛反應(yīng)。
獲取大量規(guī)范化數(shù)據(jù)的成本很大,而且構(gòu)建與訓(xùn)練神經(jīng)網(wǎng)絡(luò)的難度也較高。那么在物流規(guī)劃的日常工作中是否也能利用深度學(xué)習(xí)來解決問題呢?本文將以一個實踐的案例對此進行探討。
在汽車制造業(yè)物流規(guī)劃工作中,最基本的一個參數(shù)就是流量,而流量是由零件數(shù)量與零件包裝體積構(gòu)成的。規(guī)劃工作始于項目的早期階段,零件的數(shù)量有較成熟的體系進行輸出,輸出偏差有良好控制。而零件包裝體積則只能根據(jù)工作人員的經(jīng)驗進行預(yù)估。一般有以下方法:
(1)參考現(xiàn)有近似零件的包裝。在大多數(shù)情況下,兩個名稱相同,零件號差異很小的零件,其外形不會有較大差異。參照類似零件的現(xiàn)有包裝可以獲得較準(zhǔn)確的包裝數(shù)據(jù)。但其中管狀零件則較特殊,這些零件有較大的外形差異,即使在名稱、零件號、功能與裝配位置等基本一致的情況下,其包裝體積也存在很大的不同。特別在當(dāng)今從傳動燃油車向混合動力與純電動車轉(zhuǎn)變的大趨勢下,近似零件號、零件名稱的零件外形差異很大,經(jīng)常無法找到可參照的零件。
(2)根據(jù)零件三維圖紙,使用包裝軟件模擬包裝結(jié)果。該方法準(zhǔn)確度通常較高,但是同樣對于管狀零件模擬誤差很大。主要原因在于模擬時的限制條件是剛性的,而實際裝箱與依靠零件外形的模擬有很大差異。
以下列舉用上述方法估計的幾個管狀零件的結(jié)果比較,總體偏差很大,見表1。
用上述方法進行估計輸出在一般情況下能滿足整體規(guī)劃的要求,如總體的資源配置等。但實際規(guī)劃工作中,很多時候需要對個體零件物流體積有一個較準(zhǔn)確的估計,如單個零件采購價格中物流成本的估計,生產(chǎn)線邊某工位的首輪規(guī)劃等。在涉及到管狀零件時,由于存在估計偏差較大的問題,會對后續(xù)規(guī)劃造成困擾。以下我們將采用深度學(xué)習(xí)的方法,構(gòu)造一個估計零件包裝體積的神經(jīng)網(wǎng)絡(luò)并進行訓(xùn)練。
表1 傳統(tǒng)管狀零件包裝體積估計
我們將依次對深度神經(jīng)網(wǎng)絡(luò)的輸出層,輸入層與隱藏層進行分析與構(gòu)建
從我們所希望得到的結(jié)果出發(fā),首先構(gòu)筑輸出層,可以為之后的工作提供一個明確的目標(biāo)。而損失函數(shù)是訓(xùn)練過程中引導(dǎo)訓(xùn)練向最優(yōu)化進行的關(guān)鍵函數(shù)。在本文的研究過程中,嘗試過三種不同的輸出結(jié)構(gòu)與損失函數(shù)。
(1)直接輸出體積。這是我們最直觀的需求,即對一個具體樣本神經(jīng)網(wǎng)絡(luò)輸出計算的體積數(shù)值。損失函數(shù)即為所有參與訓(xùn)練的樣本輸出相對于標(biāo)準(zhǔn)值的偏差平均值。
雖然這種輸出比較直觀,但是神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)機制決定了這種輸出并不合適。在后續(xù)的訓(xùn)練過程中,極易造成BP計算中的梯度消失。
(2)輸出簡單的分類。考慮到神經(jīng)網(wǎng)絡(luò)最適合進行分類輸出,按我們得到的樣本數(shù)據(jù),將輸出依體積分成十類,見表2。
以上是根據(jù)已經(jīng)獲取的樣本數(shù)據(jù)的平均分布進行的分類。例如表1中列舉的三個零件分別屬于6,2,1類。對于每一個樣本,輸出是一個十維的one-hot向量。如表1中第一個零件屬于類6,則輸出的onehot向量為y'=(0,0,0,0,0,0,1,0,0,0)。損失函數(shù)則是輸出向量與樣本準(zhǔn)確向量的交叉熵Cross-entropy
表2 輸出結(jié)果分類
這種輸出結(jié)構(gòu)與損失函數(shù)雖然較易訓(xùn)練,但是由于我們的目標(biāo)是獲取一個體積數(shù)值,而非分類,所以這種輸出無法滿足需求的準(zhǔn)確性。而且在訓(xùn)練中只要沒有進入分類區(qū),逐步接近準(zhǔn)確數(shù)值的狀態(tài)并不會比那些遠(yuǎn)離的狀態(tài)更有優(yōu)勢。而一旦進入了分類,也就失去動力進一步靠近準(zhǔn)確數(shù)值。
(3)輸出逼近數(shù)值概率的分類。沿用方法(2)的分類。但輸出不是one-hot的向量,而是一個考慮鄰分類與本分類中數(shù)值逼近程度的向量。
v'-準(zhǔn)確的體積數(shù)值;v'm-準(zhǔn)確體積所在分類的中間數(shù)值;
v'max-準(zhǔn)確體積所在分類的最大值;v'min-準(zhǔn)確體積所在分類的最小值;
P1-準(zhǔn)確體積所在分類的概率;P2-最鄰近分類的概率。
其它分類的輸出則仍然是0。
仍以表1中第一個零件為例,輸出y'=(0,0,0,0,0,0,0.58,0.42,0,0),對應(yīng) 0.002 7m3。
這種方式在訓(xùn)練落入分類與分類鄰近區(qū)域時仍有動力逼近準(zhǔn)確值,同時還能在獲得輸出后,通過對公式(1)的逆運算獲得體積數(shù)值。這種輸出的缺陷在于,與直接輸出體積相比,目標(biāo)還是存在一些偏差,但比常用的one-hot分類有了大幅度優(yōu)化。損失函數(shù)同樣是輸出向量與樣本準(zhǔn)確向量的交叉熵
這種輸出結(jié)構(gòu)是筆者結(jié)合此問題的特殊性創(chuàng)造的,實驗中也取得了不錯的效果。
輸入層為我們能獲取到的實際樣本的參數(shù)結(jié)構(gòu)。與目標(biāo)有關(guān)的參數(shù)越多,訓(xùn)練效果越好,但也會造成計算負(fù)荷指數(shù)級的上升。同時也需要大量的樣本數(shù)量,樣本稀少極易造成過擬合。
具體到本文的問題,考慮與零件包裝體積相關(guān)的參數(shù)主要是零件的外形,雖然零件的各部分材質(zhì)等也會影響到實際包裝,但此類參數(shù)較難獲取并格式化。所以在本文中我們只取零件外形數(shù)據(jù)。
將獲取的零件3D圖紙先轉(zhuǎn)為STL標(biāo)準(zhǔn)格式后再轉(zhuǎn)化為11*11*11的體素圖(如圖3所示)。同時,大小不同的零件標(biāo)準(zhǔn)化為相同大小的體素圖,則必然存在一個大小變化的比例值s,這個值將填入體素矩陣中有實物點的位置中。
圖3 單個零件體素矩陣
最終輸入x為m*1 331的列表(m為參與訓(xùn)練的樣本數(shù)量)。
本文的實驗中轉(zhuǎn)化了156個管狀零件樣本的體素矩陣,并以此為基礎(chǔ)進行訓(xùn)練。但相比于神經(jīng)網(wǎng)絡(luò)的要求,這個數(shù)據(jù)量還是非常小的。結(jié)合本文采用的卷積神經(jīng)網(wǎng)絡(luò)框架,筆者使用了數(shù)據(jù)增強技術(shù)(Data Augmentation)。在卷積神經(jīng)網(wǎng)絡(luò)中,通過卷積與池化可以實現(xiàn)平移不變性與小幅度旋轉(zhuǎn)的不變性。但對于同一個樣本的大幅度旋轉(zhuǎn)或視角變化則會存在結(jié)果差異。我們對每一個樣本從6個視角分別進行鏡像和90度旋轉(zhuǎn),這樣就能產(chǎn)生48個樣本,總的樣本數(shù)量即可增加到7 488個。圖4是列舉9個衍生樣本的示例。
另外,還需要準(zhǔn)備一批測試集數(shù)據(jù),驗證模型訓(xùn)練的效果與精度。測試集數(shù)據(jù)完全獨立于訓(xùn)練樣本,不參加訓(xùn)練。在本文中取了10個零件樣本做測試集。
整個神經(jīng)網(wǎng)絡(luò)構(gòu)建如圖5所示。
輸入層獲得的數(shù)據(jù)為樣本的列表數(shù)據(jù)m*1 331。變形還原為三階矩陣數(shù)據(jù),對應(yīng)零件的體素圖,以供后續(xù)卷積處理。
隱藏層分兩次卷積,兩次池化,一次全連接層和一次Dropout,最終輸出體積預(yù)測。
圖4 單個零件體素矩陣衍生示例
圖5 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)總圖
卷積層(Convolutional Layer)本質(zhì)上是一個濾波器。樣本的每一部分與卷積窗口進行點積。通過對共享參數(shù)進行訓(xùn)練,最終形成一個能提取到樣本區(qū)域特征的卷積窗口。每個通道提取一種特征。在復(fù)雜的模型中有多層卷積,以提取復(fù)雜而隱藏的特征。卷積層輸出后將經(jīng)過激活函數(shù),以實現(xiàn)非線性化。本模型所用為Leakyrelu激活函數(shù)。
池化層(Pooling Layer)主要用來降維,將卷積層提取的特征中可能重復(fù)的部分剔除。同時實現(xiàn)特征的平移不變性,小旋轉(zhuǎn)不變性。從模型中可以看到,每次池化后維度下降了一半。
全連接層(Densely Connected Layer)起到分類器的作用。卷積層、池化層和激活函數(shù)將原始數(shù)據(jù)映射到隱藏特征空間,全連接層重新將訓(xùn)練學(xué)習(xí)到的分布式特征映射到樣本標(biāo)記空間。
Dropout層在訓(xùn)練中按50%的概率隨機丟棄一些全連接層的神經(jīng)元。在本文模型中,由于數(shù)據(jù)樣本較少,而模型有一定復(fù)雜度,很容易造成訓(xùn)練過擬合。Dropout的方法在實際訓(xùn)練中可以有效降低過擬合概率。
輸出層在對Dropout層輸出做Softmax操作后,即可得到樣本屬于各分類的概率。通過對損失函數(shù)的不斷迭代優(yōu)化以訓(xùn)練模型中所有參數(shù)。
本文采用開源人工智能庫Tensorflow構(gòu)造了上述神經(jīng)網(wǎng)絡(luò)。訓(xùn)練與測試結(jié)果如圖6。
Traingning Set Loss指訓(xùn)練過程中損失函數(shù)值的變化趨勢,該指標(biāo)用來跟蹤神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程,理論上隨著訓(xùn)練次數(shù)不斷降低,最終達到穩(wěn)定。
Testing Set Loss指訓(xùn)練好的模型用于測試集的損失函數(shù)值。實驗中每隔100次優(yōu)化即用測試集測試。從結(jié)果看趨勢與訓(xùn)練集基本一致,說明不存在過擬合。
Testing Set Value Deviation指測試集在神經(jīng)網(wǎng)絡(luò)輸出的概率矩陣轉(zhuǎn)化為體積數(shù)值之后,與準(zhǔn)確的體積數(shù)值的偏差率。由于本問題中損失函數(shù)與最終輸出并不嚴(yán)格對應(yīng),偏差率才是最終驗證輸出質(zhì)量的指標(biāo)。從結(jié)果看,偏差率與損失函數(shù)趨勢一致。最終穩(wěn)定在0.32,即32%的偏差(其中最大偏差為44%,最小為7%)。
圖6 訓(xùn)練與測試結(jié)果
對照表1中的幾個例子,深度學(xué)習(xí)后的平均偏差率遠(yuǎn)小于傳統(tǒng)方法,并且偏差波動較小,取得了相當(dāng)明顯的效果,具體見表3。
表3 深度學(xué)習(xí)結(jié)果對照
本文對深度學(xué)習(xí)方法在物流規(guī)劃日常工作中的應(yīng)用進行了有效地嘗試,積累了經(jīng)驗,并已在實踐中得到了應(yīng)用,對工作有明顯幫助。基于現(xiàn)有的結(jié)果,筆者認(rèn)為還可以從以下方面進行優(yōu)化。
(1)提高零件體素化像素精度。本文采用的分辨率為11*11*11,是考慮在不太高的運算負(fù)荷下能盡快測試多種建構(gòu)模型。參考目前流行的手寫數(shù)字?jǐn)?shù)據(jù)集像素為28*28,可以將像素提高到20以上,在此基礎(chǔ)上增加卷積層通道,可以進一步提高輸出精度。
(2)獲取更多的實驗樣本。本文僅獲取了管狀零件原始樣本156個,后續(xù)可以建立完整的零件體素化數(shù)據(jù)庫,范圍擴大到所有零件。這樣可以將輸出結(jié)果的適用對象擴大到所有零件。雖然對于規(guī)則零件而言,由于參數(shù)與結(jié)果的映射關(guān)系比較簡單,深度學(xué)習(xí)預(yù)估的精度不會比人工估計高,但可以為此環(huán)節(jié)自動化、智能化處理建立基礎(chǔ)。
(3)多神經(jīng)網(wǎng)絡(luò)聯(lián)結(jié)。零件包裝基本參數(shù)應(yīng)為包裝箱型與裝箱數(shù),通過箱型尺寸計算單件包裝體積??梢允紫葹橄湫皖悇e構(gòu)筑神經(jīng)網(wǎng)絡(luò),而這種分類問題也更適合深度學(xué)習(xí)方法。然后將零件圖與箱型作為下一個神經(jīng)網(wǎng)絡(luò)的輸入,裝箱數(shù)作為輸出。
深度學(xué)習(xí)技術(shù)在近幾年中的發(fā)展極其迅猛,不斷有適合不同場景的新網(wǎng)絡(luò)模式和訓(xùn)練方法出現(xiàn)。在習(xí)以為常的物流工作中也可以抓住前沿科技的發(fā)展,促進物流效率不斷提升。