趙 宏,郭萬鵬
(1. 蘭州理工大學(xué)計(jì)算機(jī)與通信學(xué)院,甘肅 蘭州 730050;2. 蘭州理工大學(xué)信息中心,甘肅 蘭州 730050)
人工神經(jīng)網(wǎng)絡(luò)ANN(Artificial Neural Networks)的研究是人工智能領(lǐng)域的一個(gè)重要分支,在對(duì)生物神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)及其機(jī)制研究的基礎(chǔ)上所構(gòu)建的人工神經(jīng)網(wǎng)絡(luò),使得機(jī)器能夠直接從數(shù)據(jù)中提取特征和學(xué)習(xí)規(guī)律,從而使機(jī)器具有一定的智能。ANN的研究最早可以追溯到1957年Frank Rosenblatt提出的感知機(jī)模型,后來出現(xiàn)的反向傳播 BP(Back Propagation)算法推動(dòng) ANN進(jìn)入實(shí)用階段[1],但由于當(dāng)時(shí)的ANN訓(xùn)練數(shù)據(jù)缺乏、訓(xùn)練方法及技巧不成熟、計(jì)算機(jī)運(yùn)算能力不夠強(qiáng)大等原因,使得這個(gè)時(shí)期的ANN結(jié)構(gòu)較為簡(jiǎn)單,可等價(jià)為主要用來進(jìn)行淺層學(xué)習(xí)的單隱層神經(jīng)網(wǎng)絡(luò)。2006年深度學(xué)習(xí)領(lǐng)域奠基人Hinton教授,根據(jù)人腦認(rèn)知過程的分層特性,提出構(gòu)建深度神經(jīng)網(wǎng)絡(luò)DNN(Deep Neural Networks),并取得成功[2]。
近年來,深度神經(jīng)網(wǎng)絡(luò)在圖像識(shí)別、語音交互、自然語言處理等領(lǐng)域取得突破,進(jìn)入實(shí)用階段。與淺層神經(jīng)網(wǎng)絡(luò)相比,深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練難度更大,其主要原因是梯度下降算法的殘差值在網(wǎng)絡(luò)中逐層傳播時(shí)變得越來越小,出現(xiàn)梯度消失的問題,使得底層網(wǎng)絡(luò)由于殘差值過小而無法得到有效的訓(xùn)練。從模型訓(xùn)練經(jīng)驗(yàn)可知,選擇合適的代價(jià)函數(shù)并配合相應(yīng)的激活函數(shù)能夠明顯改善梯度消失的問題,從而加快網(wǎng)絡(luò)的訓(xùn)練速度。文獻(xiàn)[3]對(duì)如何提高深度神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)速率做了大量的研究,并指出交叉熵代價(jià)函數(shù)能夠避免深度神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)速率緩慢的問題,但忽視了激活函數(shù)對(duì)代價(jià)函數(shù)性能的影響。文獻(xiàn)[4]給出了一種改善深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練效果的方法,指出改進(jìn)激活函數(shù)能夠提高深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練效果,但結(jié)果表明,僅對(duì)激活函數(shù)的改進(jìn),對(duì)于提高深度神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)速率效果并不明顯。
利用概率論對(duì)模型訓(xùn)練中常用的二次代價(jià)函數(shù)和交叉熵函數(shù)進(jìn)行理論推導(dǎo),揭示兩者在模型訓(xùn)練過程中對(duì)梯度下降算法參數(shù)的影響,研究代價(jià)函數(shù)與激活函數(shù)的組合效果,對(duì)模型訓(xùn)練過程中的經(jīng)驗(yàn)進(jìn)行理論解析并通過實(shí)驗(yàn)平臺(tái)進(jìn)行驗(yàn)證。
定理1[5]設(shè)隨機(jī)變量X1,X2,…,Xn相互獨(dú)立,服從同一分布,且有 E (Xi) = μ , D (Xi) = σ2>0,(i=1,2,…,n),其中E(Xi)為隨機(jī)變量 Xi的數(shù)學(xué)期望,D(Xi)為隨機(jī)變量Xi的方差,則隨機(jī)變量X1,X2,…,Xn之和Xi的標(biāo)準(zhǔn)化變量 Yn如式(1)所示。
其中,對(duì)于任意的x,Yn的分布函數(shù) Fn(x)滿足式(2)。
當(dāng)n充分大時(shí),若隨機(jī)變量X1,X2,…,Xn服從獨(dú)立同分布,期望為μ,方差為2σ ,則其和似地服從高斯分布N,如式(3)所示。
定義 1[6]如果隨機(jī)變量x的概率密度函數(shù)如式(4)所示,則 x服從高斯分布 N ( μ,σ2),記為x ~ N ( μ,σ2),稱x為高斯隨機(jī)變量。其中,μ和σ為常數(shù),且σ>0。
定義2[7]樣本x1,…,xn的聯(lián)合概率函數(shù)可看作θ的函數(shù),用 L (θ; x1, x2,… ,xn)表示,稱L(θ)為樣本的似然函數(shù),簡(jiǎn)記為L(zhǎng)(θ),如式(5)所示。
二次代價(jià)函數(shù)[8]的定義如式(6)所示。
其中, (,)CWb表示神經(jīng)網(wǎng)絡(luò)的代價(jià)函數(shù);n表示訓(xùn)練樣本的大小;W和b分別表示由神經(jīng)網(wǎng)絡(luò)權(quán)重和偏置構(gòu)成的矩陣。x表示由神經(jīng)網(wǎng)絡(luò)的輸入構(gòu)成的矩陣; ()yx表示由神經(jīng)網(wǎng)絡(luò)的預(yù)期輸出構(gòu)成的矩陣;?()yx表示由神經(jīng)網(wǎng)絡(luò)的實(shí)際輸出構(gòu)成的矩陣。其中,?()yx的表達(dá)式如式(7)所示。
其中,()δz表示激活函數(shù)。
由式(6)知,訓(xùn)練神經(jīng)網(wǎng)絡(luò)的最終目的是獲得代價(jià)函數(shù) (,)CWb最小時(shí)的權(quán)重和偏置,即神經(jīng)網(wǎng)絡(luò)的實(shí)際輸出 ?()yx與預(yù)期輸出 ()yx的誤差最小時(shí)的權(quán)重和偏置。這是因?yàn)榧僭O(shè)第i個(gè)神經(jīng)元的實(shí)際輸出為輸入特征的線性函數(shù)與誤差項(xiàng)之和,如式(9)所示。
其中,θ為給定的參數(shù),ξ(i)為誤差項(xiàng),由定理1得由式(4)得高斯分布的概率密度函數(shù)如式(11)所示。
利用似然函數(shù)對(duì)參數(shù)θ進(jìn)行估計(jì)。當(dāng)θ為一定值時(shí),以θ為參數(shù)的概率P取得最大值。由式(5)得
令 ?(θ) = log L (θ),由式(13)得 ?(θ)
令
當(dāng)函數(shù)()θ?取得最大值時(shí)函數(shù)C取得最小值。對(duì)式(15)進(jìn)行變換,令
則由式(15)、式(16)可得:
對(duì)式(6)進(jìn)行鏈?zhǔn)角髮?dǎo)得:
其中,假設(shè)神經(jīng)網(wǎng)絡(luò)的輸入 x = 1,目標(biāo)輸出y(x) =0,則由式(17)、式(18)知,激活函數(shù)的導(dǎo)函數(shù)δ′(z)是影響權(quán)重和偏置學(xué)習(xí)速率的重要因素。
引入交叉熵代價(jià)函數(shù)能夠消除δ′(z)對(duì)權(quán)重和偏置學(xué)習(xí)速率的影響。
假設(shè) y = y1, y2,…yn是神經(jīng)元上預(yù)期輸出值,,, …是神經(jīng)元上實(shí)際輸出值,定義多元神經(jīng) 元上交叉熵代價(jià)函數(shù)如式(19)所示。
j的偏置;x表示神經(jīng)元的輸入。n表示訓(xùn)練樣本的大小。引入交叉熵代價(jià)函數(shù)可以避免δ′(z)導(dǎo)致的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)速率緩慢的問題,這是因?yàn)樵诮徊骒卮鷥r(jià)函數(shù)中消除了參數(shù)δ′(z)的影響。由式(17)、式(18)得:
由式(7)得:
由式(6)得:
由式(21)、式(22)、式(23)得:
對(duì)式(24)求積分得:
令 c = c1-yjc2,由式(25)化簡(jiǎn)得:
為了得到多元神經(jīng)網(wǎng)絡(luò)上整個(gè)交叉熵代價(jià)函數(shù),對(duì)所有訓(xùn)練樣本求平均,得式(19)。同時(shí)進(jìn)一步證明了交叉熵能夠解決多元神經(jīng)元上δ′(z)導(dǎo)致學(xué)習(xí)速率緩慢的真正原因。式(19)中對(duì)參數(shù)進(jìn)
行鏈?zhǔn)角髮?dǎo)得:
由式(19)得:
由式(28)、式(29)、式(30)得:
由式(22)、式(31)得:
式(19)中對(duì)參數(shù)Ljb進(jìn)行鏈?zhǔn)角髮?dǎo)得
同理可得:
由式(32)、式(34)知,交叉熵代價(jià)函數(shù)消除了參數(shù)()δ′z,解決了多元神經(jīng)元上()δ′z導(dǎo)致學(xué)習(xí)速率緩慢的問題。
通過對(duì)二次代價(jià)函數(shù)和交叉熵代價(jià)函數(shù)的推導(dǎo)可知,二次代價(jià)函數(shù)與非線性激活函數(shù)結(jié)合會(huì)導(dǎo)致權(quán)重和偏置的學(xué)習(xí)速率減慢,其真正原因是當(dāng)()δ′z的值趨于0時(shí),權(quán)重和偏置的學(xué)習(xí)速率受到抑制。引入交叉熵代價(jià)函數(shù)后,消除了()δ′z導(dǎo)致學(xué)習(xí)速率緩慢的問題,從而提高了權(quán)重和偏置的學(xué)習(xí)效率。另外,由式(20)、式(21)知,當(dāng)神經(jīng)網(wǎng)絡(luò)的輸入為一定值時(shí),參數(shù)的學(xué)習(xí)速率會(huì)隨輸出誤差的變化而變化,當(dāng)輸出誤差較大時(shí)權(quán)重和偏置的學(xué)習(xí)速率也越快,這也是引入交叉熵代價(jià)函數(shù)后能夠提高神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)速率的重要原因。
由式(17)、式(18)知,不同激活函數(shù)導(dǎo)致代價(jià)函數(shù)學(xué)習(xí)速率的不同。因此,需要進(jìn)一步分析代價(jià)函數(shù)和激活函數(shù)組合后的神經(jīng)網(wǎng)絡(luò)性能。
神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù)分別為 Sigmoid、Tanh、ReLu和 PReLu。
2.3.1 Sigmoid 激活函數(shù)
Sigmoid函數(shù)表達(dá)式如式(35)所示,函數(shù)值在0到1之間,如圖1所示。Sigmoid激活函數(shù)具有雙向飽和的特性,當(dāng)x→∞時(shí),σ′(x) =0,具有這種性質(zhì)的激活函數(shù)稱為軟飽和激活函數(shù)[9],Sigmoid激活函數(shù)的軟飽和性是導(dǎo)致神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)速率緩慢的重要原因。
圖1 Sigmoid函數(shù)Fig.1 Sigmoid function
2.3.2 Tanh激活函數(shù)
Tanh函數(shù)與Sigmoid函數(shù)具有相似的性質(zhì),是典型的S型函數(shù),表達(dá)式如式(36)所示,函數(shù)值在-1到1之間,如圖2所示。相比Sigmoid函數(shù),Tanh函數(shù)延遲了飽和期。對(duì)比圖1和如圖2可知,Tanh函數(shù)與Sigmoid函數(shù)一樣具有軟飽和的特性,同樣會(huì)陷入局部最優(yōu)解,使神經(jīng)網(wǎng)絡(luò)訓(xùn)練難度加大,但Tanh函數(shù)性能優(yōu)于Sigmoid函數(shù)。
圖2 Tanh函數(shù)Fig.2 Tanh function
2.3.3 ReLu激活函數(shù)
Relu函數(shù)表達(dá)式如式(37)所示,函數(shù)值為 0或x,如圖3所示。Relu激活函數(shù)避免了S型激活函數(shù)飽和區(qū)對(duì)神經(jīng)網(wǎng)絡(luò)收斂速度的限制[10],但是Relu激活函數(shù)在訓(xùn)練時(shí)非常脆弱,流經(jīng)ReLu神經(jīng)元的一個(gè)大梯度導(dǎo)致權(quán)重更新后該神經(jīng)元接收到的任何數(shù)據(jù)點(diǎn)都不會(huì)再被激活。
圖3 ReLu函數(shù)Fig.3 ReLu function
2.3.4 PReLu激活函數(shù)
PReLu(Parametric ReLu)函數(shù)表達(dá)式如式(38)所示,函數(shù)值根據(jù)x的不同為斜率不同的直線,如圖4所示。PReLu激活函數(shù)在ReLu激活函數(shù)的基礎(chǔ)上作了進(jìn)一步改進(jìn),當(dāng)x為負(fù)值時(shí)其導(dǎo)數(shù)不再為0。
圖4 PReLu函數(shù)Fig.4 PReLu function
卷積神經(jīng)網(wǎng)絡(luò) CNN(Convolutional Neural Network)作為神經(jīng)網(wǎng)絡(luò)最常見的形式,使用代價(jià)函數(shù)和激活函數(shù)的組合來提高網(wǎng)絡(luò)的訓(xùn)練效率和精度。CNN通過激活函數(shù)映射網(wǎng)絡(luò)的輸出,利用代價(jià)函數(shù)對(duì)網(wǎng)絡(luò)的輸出誤差進(jìn)行評(píng)價(jià),進(jìn)而使用反向傳播算法和隨機(jī)梯度下降算法不斷提高網(wǎng)絡(luò)的精度。同時(shí)CNN的局部感知域、權(quán)值共享和池化層等三個(gè)主要特征[11]對(duì)大型圖像的處理具有出色的表現(xiàn)?;贖ubel和Wiesel早期對(duì)貓初級(jí)視覺皮層(V1)的研究,CNN基本結(jié)構(gòu)[12]如圖5所示,由輸入層、卷積層、池化層、全連接層和輸出層組成。其中,卷積層和池化層是卷積神經(jīng)網(wǎng)絡(luò)特有的屬性。卷積層通過卷積操作提取輸入的不同特征,池化層對(duì)卷積層提取的特征進(jìn)行池化處理,保留最有用特征,減少神經(jīng)元數(shù)量,避免網(wǎng)絡(luò)發(fā)生過擬合,最后利用softmax分類器進(jìn)行分類,并通過全連接層輸出結(jié)果。
圖5 卷積神經(jīng)網(wǎng)絡(luò)的模型圖[13]Fig.5 The model of convolution neural network
卷積層是CNN核心網(wǎng)絡(luò)層,卷積層基于圖像空間的局部相關(guān)性,利用卷積提取圖像的局部特征,如圖6所示。
圖6 多通道卷積網(wǎng)絡(luò)結(jié)構(gòu)[14]Fig.6 The network structure of multi-channel convolutional
第L層特征的計(jì)算公式如式(39)所示。
其中,z表示第L層特征的輸入;WjLk-1表示第L- 1層的第j個(gè)神經(jīng)元與第k個(gè)神經(jīng)元之間的權(quán)重;bLj-1表示第L- 1層上第j個(gè)神經(jīng)元的偏置;x表示第L- 1層的輸入。
輸出圖像特征的計(jì)算如式(40)所示[14]。
其中,L×H表示輸出圖像尺寸;Lj×Hj表示第j個(gè)神經(jīng)元上輸入圖像尺寸;l×h表示濾波器尺寸;s表示滑動(dòng)步長(zhǎng)。
池化操作是對(duì)卷積層提取的特征進(jìn)行處理,其目的是降低卷積層輸出的特征向量,避免網(wǎng)絡(luò)發(fā)生過擬合,同時(shí)改善網(wǎng)絡(luò)訓(xùn)練效果。理論上,可以用所有提取到的特征去訓(xùn)練分類器,但這樣做面臨計(jì)算量的挑戰(zhàn)。例如,對(duì)于一個(gè)96×96像素的圖像,假設(shè)已經(jīng)學(xué)習(xí)得到了400個(gè)定義在8×8輸入上的特征,每一個(gè)特征和圖像卷積都會(huì)得到(96 - 8 + 1 )×(96 - 8+ 1 ) = 7 921維的卷積特征,由于有400個(gè)特征,所以每個(gè)樣例都會(huì)得到7921×400=3168400維的卷積特征向量,訓(xùn)練這樣一個(gè)超過3000000特征輸入的分類器容易出現(xiàn)過擬合。根據(jù)圖像的“靜態(tài)性”屬性,池化操作對(duì)卷積層進(jìn)行如圖7所示的處理,可以有效防止特征過多造成過擬合的問題,其池化的主要策略有mean-pooling、max-pooling、stochasticpooling等。
圖7 池化過程Fig.7 Pooling process
通過對(duì)CNN模型原理的分析,利用Google深度學(xué)習(xí)平臺(tái)TensorFlow構(gòu)建了以CNN模型為基礎(chǔ)的深度神經(jīng)網(wǎng)絡(luò),其中,網(wǎng)絡(luò)的構(gòu)建采用了代價(jià)函數(shù)和激活函數(shù)不同組合的方式,并利用 notMNIST數(shù)據(jù)作為實(shí)驗(yàn)數(shù)據(jù)集。notMNIST數(shù)據(jù)集是一組按字符分類的圖像文件夾,有A、B、C、D、E、F、G、H、I、J共10個(gè)文件夾,其可視化后的效果如圖8、圖9所示,其中,訓(xùn)練數(shù)據(jù)集中含有部分非字符的噪聲圖像,如圖9所示。
表1、表2、表3、表4分別為 Sigmoid、Tanh、Relu和PReLu為激活函數(shù)時(shí)與二次代價(jià)函數(shù)和交叉熵代價(jià)函數(shù)的組合效果,表5為實(shí)驗(yàn)中采用的超參數(shù)值。
圖8 notMNIST測(cè)試數(shù)據(jù)集Fig.8 Test dataset of notMNIST
圖9 notMNIST訓(xùn)練數(shù)據(jù)集Fig.9 Training dataset of notMNIST
表1 Sigmoid作為激活函數(shù)時(shí)性能對(duì)比Tab.1 Performance comparison while Sigmoid as the activation function
表2 Tanh作為激活函數(shù)時(shí)性能對(duì)比Tab.2 Performance comparison while Tanh as the activation function
表3 ReLu作為激活函數(shù)時(shí)性能對(duì)比Tab.3 Performance comparison while ReLu as the activation function
表4 PReLu ReLu作為激活函數(shù)時(shí)性能對(duì)比Tab.4 Performance comparison while PReLu as the activation function
表5 實(shí)驗(yàn)中超參數(shù)的具體值Tab.5 The specific value of the over-parameter in the experiment
實(shí)驗(yàn)探索了不同代價(jià)函數(shù)和激活函數(shù)組合下模型訓(xùn)練的性能,發(fā)現(xiàn)代價(jià)函數(shù)和激活函數(shù)的優(yōu)選會(huì)影響模型的訓(xùn)練效率。通過實(shí)驗(yàn)結(jié)果的對(duì)比發(fā)現(xiàn),線性激活函和非線性激活函數(shù)對(duì)二次代價(jià)函數(shù)的性能有不同的效果,究其原因,線性激活函數(shù)的導(dǎo)函數(shù)是一個(gè)常數(shù),對(duì)二次代價(jià)函數(shù)的性能并不產(chǎn)生影響,而Sigmoid和Tanh等非線性函數(shù)容易達(dá)到飽和導(dǎo)致梯度消失,所以導(dǎo)致學(xué)習(xí)速率緩慢。實(shí)驗(yàn)也表明系統(tǒng)采用 ReLu函數(shù)以及 ReLu函數(shù)的變體函數(shù)PReLu與代價(jià)函數(shù)結(jié)合使用,會(huì)明顯改善訓(xùn)練的效果,這是因?yàn)镽elu函數(shù)可以通過簡(jiǎn)單的零閾值矩陣進(jìn)行激活,并且不受飽和的影響,但是,Relu函數(shù)在訓(xùn)練時(shí)非常脆弱,流經(jīng) ReLu神經(jīng)元的一個(gè)大梯度導(dǎo)致權(quán)重更新后該神經(jīng)元接收到的任何數(shù)據(jù)點(diǎn)都不會(huì)再激活。為了解決這個(gè)問題,研究者們發(fā)現(xiàn)了ReLu函數(shù)的一些變體函數(shù),如PReLu,與交叉熵代價(jià)函數(shù)結(jié)合具有良好的訓(xùn)練效果。最后,實(shí)驗(yàn)對(duì)超參數(shù)的設(shè)置也進(jìn)行了探究,并給出了針對(duì)該實(shí)驗(yàn)具有良好效果的超參數(shù)值。
本文利用概率論對(duì)模型訓(xùn)練中常用的二次代價(jià)函數(shù)和交叉熵代價(jià)函數(shù)進(jìn)行推導(dǎo),揭示了兩者在模型訓(xùn)練過程中對(duì)參數(shù)尋優(yōu)的影響,并給出了它們與不同激活函數(shù)組合的效果。實(shí)驗(yàn)表明,代價(jià)函數(shù)與激活函數(shù)的優(yōu)選能夠減少訓(xùn)練的迭代次數(shù),從而提高深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練的效率。并且發(fā)現(xiàn)交叉熵代價(jià)函數(shù)與PReLU激活函數(shù)結(jié)合具有優(yōu)秀的效果。
[1] 龐榮. 深度神經(jīng)網(wǎng)絡(luò)算法研究及應(yīng)用[D]. 西南交通大學(xué),2016.
[2] Hinton G E, Salakhutdinov R R. Reducing the dimensionality of data with neural networks[J]. Science, 2006, 313(5786):504-507.
[3] Michael A. Nielsen. Neural Networks and Deep Learning[M].Determination Press, 2015.
[4] 葉小舟, 陶飛飛, 戚榮志, 等. 循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)中激活函數(shù)的改進(jìn)[J]. 計(jì)算機(jī)與現(xiàn)代化, 2016(12): 29-33.
[5] 鄒廣玉. 混合隨機(jī)變量序列的幾乎處處中心極限定理[D].吉林大學(xué), 2013.
[6] Zhao L, Mi D, Sun Y. A novel multitarget model of radiationinduced cell killing based on the Gaussian distribution[J].Journal of Theoretical Biology, 2017, 420: 135-143.
[7] 王曉紅, 李宇翔, 余闖等. 基于β似然函數(shù)的參數(shù)估計(jì)方法[J]. 北京航空航天大學(xué)學(xué)報(bào), 2016, 42(1): 41-46.
[8] 徐先峰, 馮大政. 一種充分利用變量結(jié)構(gòu)的解卷積混合盲源分離新方法[J]. 電子學(xué)報(bào), 2009, 37(1): 112-117.
[9] Bao G, Zeng Z. Analysis and design of associative memories based on recurrent neural network with discontinuous activation functions. Neurocomputing[J]. Neurocomputing, 2012,77(1): 101-107.
[10] 張堯. 激活函數(shù)導(dǎo)向的RNN算法優(yōu)化[D]. 浙江大學(xué), 2017.
[11] 卷積神經(jīng)網(wǎng)絡(luò)在圖像分類中的應(yīng)用研究[D]. 電子科技大學(xué), 2015.
[12] 何鵬程. 改進(jìn)的卷積神經(jīng)網(wǎng)絡(luò)模型及其應(yīng)用研究[D]. 大連理工大學(xué), 2015吳正文.
[13] 李彥冬, 郝宗波, 雷航. 卷積神經(jīng)網(wǎng)絡(luò)研究綜述[J]. 計(jì)算機(jī)應(yīng)用, 2016, 36(9): 2508-2515.
[14] 張重生 深度學(xué)習(xí): 原理與應(yīng)用實(shí)踐[M]. 電子工業(yè)出版社,2016.