錢 豐,梅劍平,潘榮勝
(上汽大眾汽車有限公司 計劃物流部,上海 201805)
近年來,建立在大數據基礎上的人工智能取得了爆發(fā)式的發(fā)展,其影響已經迅速滲透到了我們日常生活中。而此輪發(fā)展的核心則是基于神經網絡的深度學習在理論和實踐上的突破,深度學習的方法具有較強的通用性。本文將結合汽車制造業(yè)物流規(guī)劃中的一個案例,介紹一條將這種方法應用于日常工作的路徑。
多倫多大學教授Hinton于2006年提出深度學習神經網絡,使得神經網絡訓練性能取得突破性發(fā)展。2012年Hinton團隊在ImageNet比賽中完勝對手,基于神經網絡的深度學習開始被工業(yè)界重視,結合工業(yè)界的大數據,在各領域特別是在視覺和語音識別上準確率大幅提高,并以此為基礎應用于人類日常生活與工作,顯著提高了效率。
神經網絡的工作原理是模擬人腦神經元的活動過程,在輸入的大量數據中自發(fā)提取特征、總結規(guī)律,自我訓練各神經元權重,調整神經網絡結構,最終可以對未獲取過的信息做出正確判別。其與傳統(tǒng)人工智能的本質區(qū)別就在于,自發(fā)提取特征,調整結構,而不需要人工構建特征,設計算法。
一個神經網絡的基本結構如圖1,最基本有三層結構。輸入層接受數據,其維度由輸入數據的結構決定,一般由x表示。輸出層為輸出結果,其維度由需要獲得結果的結構決定,一般由y表示。中間皆為隱藏層,至少有一層隱藏層,當有多個隱藏層時即為深度神經網絡。

圖1 深度神經網絡結構示意

圖2 單個神經元基本結構
單個神經元的基本結構如圖2。一個神經元有多個輸入,但只有一個輸出。這與人腦神經元有多個樹突、一個軸突是一致的。W為各輸入的權重,加上偏置b,即為一個神經元獲得的總輸入g=再經過激活函數得到輸出yk=Φ(g).激活函數的意義在于使神經元輸出非線性。
所謂深度學習,即對深度神經輸入大量樣本x,以訓練隱藏層的各神經元的輸入權重。最終達到輸出y與理想輸出y'的誤差最小。這樣訓練好的神經網絡即可用于對未知的樣本x0計算可靠輸出y0。
工業(yè)實踐中積累有大量數據,非常適合神經網絡的訓練。如汽車業(yè)的自動駕駛技術,就是基于大量司機實際的駕駛數據訓練駕駛模型的神經網絡,最終由車載計算機輸出在不同場景下的正確駕駛反應。
獲取大量規(guī)范化數據的成本很大,而且構建與訓練神經網絡的難度也較高。那么在物流規(guī)劃的日常工作中是否也能利用深度學習來解決問題呢?本文將以一個實踐的案例對此進行探討。
在汽車制造業(yè)物流規(guī)劃工作中,最基本的一個參數就是流量,而流量是由零件數量與零件包裝體積構成的。規(guī)劃工作始于項目的早期階段,零件的數量有較成熟的體系進行輸出,輸出偏差有良好控制。而零件包裝體積則只能根據工作人員的經驗進行預估。一般有以下方法:
(1)參考現有近似零件的包裝。在大多數情況下,兩個名稱相同,零件號差異很小的零件,其外形不會有較大差異。參照類似零件的現有包裝可以獲得較準確的包裝數據。但其中管狀零件則較特殊,這些零件有較大的外形差異,即使在名稱、零件號、功能與裝配位置等基本一致的情況下,其包裝體積也存在很大的不同。特別在當今從傳動燃油車向混合動力與純電動車轉變的大趨勢下,近似零件號、零件名稱的零件外形差異很大,經常無法找到可參照的零件。
(2)根據零件三維圖紙,使用包裝軟件模擬包裝結果。該方法準確度通常較高,但是同樣對于管狀零件模擬誤差很大。主要原因在于模擬時的限制條件是剛性的,而實際裝箱與依靠零件外形的模擬有很大差異。
以下列舉用上述方法估計的幾個管狀零件的結果比較,總體偏差很大,見表1。
用上述方法進行估計輸出在一般情況下能滿足整體規(guī)劃的要求,如總體的資源配置等。但實際規(guī)劃工作中,很多時候需要對個體零件物流體積有一個較準確的估計,如單個零件采購價格中物流成本的估計,生產線邊某工位的首輪規(guī)劃等。在涉及到管狀零件時,由于存在估計偏差較大的問題,會對后續(xù)規(guī)劃造成困擾。以下我們將采用深度學習的方法,構造一個估計零件包裝體積的神經網絡并進行訓練。

表1 傳統(tǒng)管狀零件包裝體積估計
我們將依次對深度神經網絡的輸出層,輸入層與隱藏層進行分析與構建
從我們所希望得到的結果出發(fā),首先構筑輸出層,可以為之后的工作提供一個明確的目標。而損失函數是訓練過程中引導訓練向最優(yōu)化進行的關鍵函數。在本文的研究過程中,嘗試過三種不同的輸出結構與損失函數。
(1)直接輸出體積。這是我們最直觀的需求,即對一個具體樣本神經網絡輸出計算的體積數值。損失函數即為所有參與訓練的樣本輸出相對于標準值的偏差平均值。

雖然這種輸出比較直觀,但是神經網絡的學習機制決定了這種輸出并不合適。在后續(xù)的訓練過程中,極易造成BP計算中的梯度消失。
(2)輸出簡單的分類。考慮到神經網絡最適合進行分類輸出,按我們得到的樣本數據,將輸出依體積分成十類,見表2。
以上是根據已經獲取的樣本數據的平均分布進行的分類。例如表1中列舉的三個零件分別屬于6,2,1類。對于每一個樣本,輸出是一個十維的one-hot向量。如表1中第一個零件屬于類6,則輸出的onehot向量為y'=(0,0,0,0,0,0,1,0,0,0)。損失函數則是輸出向量與樣本準確向量的交叉熵Cross-entropy

表2 輸出結果分類
這種輸出結構與損失函數雖然較易訓練,但是由于我們的目標是獲取一個體積數值,而非分類,所以這種輸出無法滿足需求的準確性。而且在訓練中只要沒有進入分類區(qū),逐步接近準確數值的狀態(tài)并不會比那些遠離的狀態(tài)更有優(yōu)勢。而一旦進入了分類,也就失去動力進一步靠近準確數值。
(3)輸出逼近數值概率的分類。沿用方法(2)的分類。但輸出不是one-hot的向量,而是一個考慮鄰分類與本分類中數值逼近程度的向量。
v'-準確的體積數值;v'm-準確體積所在分類的中間數值;
v'max-準確體積所在分類的最大值;v'min-準確體積所在分類的最小值;
P1-準確體積所在分類的概率;P2-最鄰近分類的概率。

其它分類的輸出則仍然是0。
仍以表1中第一個零件為例,輸出y'=(0,0,0,0,0,0,0.58,0.42,0,0),對應 0.002 7m3。
這種方式在訓練落入分類與分類鄰近區(qū)域時仍有動力逼近準確值,同時還能在獲得輸出后,通過對公式(1)的逆運算獲得體積數值。這種輸出的缺陷在于,與直接輸出體積相比,目標還是存在一些偏差,但比常用的one-hot分類有了大幅度優(yōu)化。損失函數同樣是輸出向量與樣本準確向量的交叉熵
這種輸出結構是筆者結合此問題的特殊性創(chuàng)造的,實驗中也取得了不錯的效果。
輸入層為我們能獲取到的實際樣本的參數結構。與目標有關的參數越多,訓練效果越好,但也會造成計算負荷指數級的上升。同時也需要大量的樣本數量,樣本稀少極易造成過擬合。
具體到本文的問題,考慮與零件包裝體積相關的參數主要是零件的外形,雖然零件的各部分材質等也會影響到實際包裝,但此類參數較難獲取并格式化。所以在本文中我們只取零件外形數據。
將獲取的零件3D圖紙先轉為STL標準格式后再轉化為11*11*11的體素圖(如圖3所示)。同時,大小不同的零件標準化為相同大小的體素圖,則必然存在一個大小變化的比例值s,這個值將填入體素矩陣中有實物點的位置中。

圖3 單個零件體素矩陣
最終輸入x為m*1 331的列表(m為參與訓練的樣本數量)。
本文的實驗中轉化了156個管狀零件樣本的體素矩陣,并以此為基礎進行訓練。但相比于神經網絡的要求,這個數據量還是非常小的。結合本文采用的卷積神經網絡框架,筆者使用了數據增強技術(Data Augmentation)。在卷積神經網絡中,通過卷積與池化可以實現平移不變性與小幅度旋轉的不變性。但對于同一個樣本的大幅度旋轉或視角變化則會存在結果差異。我們對每一個樣本從6個視角分別進行鏡像和90度旋轉,這樣就能產生48個樣本,總的樣本數量即可增加到7 488個。圖4是列舉9個衍生樣本的示例。
另外,還需要準備一批測試集數據,驗證模型訓練的效果與精度。測試集數據完全獨立于訓練樣本,不參加訓練。在本文中取了10個零件樣本做測試集。
整個神經網絡構建如圖5所示。
輸入層獲得的數據為樣本的列表數據m*1 331。變形還原為三階矩陣數據,對應零件的體素圖,以供后續(xù)卷積處理。
隱藏層分兩次卷積,兩次池化,一次全連接層和一次Dropout,最終輸出體積預測。

圖4 單個零件體素矩陣衍生示例

圖5 神經網絡結構總圖
卷積層(Convolutional Layer)本質上是一個濾波器。樣本的每一部分與卷積窗口進行點積。通過對共享參數進行訓練,最終形成一個能提取到樣本區(qū)域特征的卷積窗口。每個通道提取一種特征。在復雜的模型中有多層卷積,以提取復雜而隱藏的特征。卷積層輸出后將經過激活函數,以實現非線性化。本模型所用為Leakyrelu激活函數。
池化層(Pooling Layer)主要用來降維,將卷積層提取的特征中可能重復的部分剔除。同時實現特征的平移不變性,小旋轉不變性。從模型中可以看到,每次池化后維度下降了一半。
全連接層(Densely Connected Layer)起到分類器的作用。卷積層、池化層和激活函數將原始數據映射到隱藏特征空間,全連接層重新將訓練學習到的分布式特征映射到樣本標記空間。
Dropout層在訓練中按50%的概率隨機丟棄一些全連接層的神經元。在本文模型中,由于數據樣本較少,而模型有一定復雜度,很容易造成訓練過擬合。Dropout的方法在實際訓練中可以有效降低過擬合概率。
輸出層在對Dropout層輸出做Softmax操作后,即可得到樣本屬于各分類的概率。通過對損失函數的不斷迭代優(yōu)化以訓練模型中所有參數。
本文采用開源人工智能庫Tensorflow構造了上述神經網絡。訓練與測試結果如圖6。
Traingning Set Loss指訓練過程中損失函數值的變化趨勢,該指標用來跟蹤神經網絡的訓練過程,理論上隨著訓練次數不斷降低,最終達到穩(wěn)定。
Testing Set Loss指訓練好的模型用于測試集的損失函數值。實驗中每隔100次優(yōu)化即用測試集測試。從結果看趨勢與訓練集基本一致,說明不存在過擬合。
Testing Set Value Deviation指測試集在神經網絡輸出的概率矩陣轉化為體積數值之后,與準確的體積數值的偏差率。由于本問題中損失函數與最終輸出并不嚴格對應,偏差率才是最終驗證輸出質量的指標。從結果看,偏差率與損失函數趨勢一致。最終穩(wěn)定在0.32,即32%的偏差(其中最大偏差為44%,最小為7%)。

圖6 訓練與測試結果
對照表1中的幾個例子,深度學習后的平均偏差率遠小于傳統(tǒng)方法,并且偏差波動較小,取得了相當明顯的效果,具體見表3。

表3 深度學習結果對照
本文對深度學習方法在物流規(guī)劃日常工作中的應用進行了有效地嘗試,積累了經驗,并已在實踐中得到了應用,對工作有明顯幫助。基于現有的結果,筆者認為還可以從以下方面進行優(yōu)化。
(1)提高零件體素化像素精度。本文采用的分辨率為11*11*11,是考慮在不太高的運算負荷下能盡快測試多種建構模型。參考目前流行的手寫數字數據集像素為28*28,可以將像素提高到20以上,在此基礎上增加卷積層通道,可以進一步提高輸出精度。
(2)獲取更多的實驗樣本。本文僅獲取了管狀零件原始樣本156個,后續(xù)可以建立完整的零件體素化數據庫,范圍擴大到所有零件。這樣可以將輸出結果的適用對象擴大到所有零件。雖然對于規(guī)則零件而言,由于參數與結果的映射關系比較簡單,深度學習預估的精度不會比人工估計高,但可以為此環(huán)節(jié)自動化、智能化處理建立基礎。
(3)多神經網絡聯(lián)結。零件包裝基本參數應為包裝箱型與裝箱數,通過箱型尺寸計算單件包裝體積。可以首先為箱型類別構筑神經網絡,而這種分類問題也更適合深度學習方法。然后將零件圖與箱型作為下一個神經網絡的輸入,裝箱數作為輸出。
深度學習技術在近幾年中的發(fā)展極其迅猛,不斷有適合不同場景的新網絡模式和訓練方法出現。在習以為常的物流工作中也可以抓住前沿科技的發(fā)展,促進物流效率不斷提升。