穆翔宇, 范 鈺, 李蘇吉,2, 張 鵬, 劉 磊
(1. 吉林大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院, 長(zhǎng)春 130012; 2. 吉林大學(xué) 口腔醫(yī)院, 長(zhǎng)春 130021)
文獻(xiàn)[1]提出的蛻變測(cè)試方法解決了傳統(tǒng)測(cè)試中的Oracle問(wèn)題. 蛻變測(cè)試的思想是根據(jù)待測(cè)程序中的某些性質(zhì), 尋找程序不同輸入之間存在的關(guān)系以及這些輸入對(duì)應(yīng)輸出之間存在的關(guān)系, 這種輸入之間的關(guān)系和輸出之間的關(guān)系稱為蛻變關(guān)系. 蛻變測(cè)試?yán)猛懽冴P(guān)系在現(xiàn)有成功測(cè)試用例的基礎(chǔ)上構(gòu)造新的測(cè)試用例, 通過(guò)判斷這些測(cè)試用例對(duì)應(yīng)的輸出之間是否滿足相應(yīng)的蛻變關(guān)系判定程序中是否存在錯(cuò)誤. 目前, 蛻變測(cè)試的研究主要分為蛻變測(cè)試技術(shù)的應(yīng)用和改進(jìn)兩類, 蛻變測(cè)試技術(shù)的改進(jìn)又分為原始測(cè)試用例的生成和有效蛻變關(guān)系的獲取兩類.
在蛻變測(cè)試技術(shù)應(yīng)用方面, Lindvall等[2]將蛻變測(cè)試和基于模型的測(cè)試相結(jié)合, 開發(fā)了自動(dòng)化的NASA DAT系統(tǒng)測(cè)試框架; Sun等[3]設(shè)計(jì)了一種利于蛻變測(cè)試過(guò)程規(guī)范化的基于XML的語(yǔ)言表示, 并開發(fā)了一種支持Web服務(wù)應(yīng)用程序的自動(dòng)化測(cè)試工具M(jìn)T4WS, 將其應(yīng)用于Web服務(wù)測(cè)試中; Yan等[4]針對(duì)一個(gè)無(wú)測(cè)試預(yù)言的現(xiàn)實(shí)世界中科學(xué)計(jì)算程序提取該程序的蛻變關(guān)系, 并證明了蛻變測(cè)試探測(cè)錯(cuò)誤的有效性; 文獻(xiàn)[5]對(duì)比了錯(cuò)誤捕獲和蛻變測(cè)試在電子表格測(cè)試中的故障檢測(cè)功能, 并發(fā)現(xiàn)兩者存在互補(bǔ)關(guān)系, 因此提倡同時(shí)使用; Saha等[6]將蛻變測(cè)試運(yùn)用到強(qiáng)化學(xué)習(xí)中, 為強(qiáng)化學(xué)習(xí)的監(jiān)督分類器測(cè)試提供了一種新方法; Nakajima[7]將蛻變測(cè)試和機(jī)器學(xué)習(xí)相結(jié)合, 提出了一種適用于神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)模型的新蛻變測(cè)試方法, 數(shù)據(jù)集多樣性考慮了訓(xùn)練結(jié)果對(duì)數(shù)據(jù)集的依賴性, 并提供了一種生成后續(xù)測(cè)試輸入的新方法. 對(duì)于測(cè)試用例生成, Barus等[8]比較了隨機(jī)測(cè)試和自適應(yīng)隨機(jī)測(cè)試作為原始測(cè)試用例選擇策略對(duì)蛻變測(cè)試有效性的影響, 實(shí)驗(yàn)結(jié)果表明, 自適應(yīng)隨機(jī)測(cè)試在提高蛻變測(cè)試的有效性方面優(yōu)于隨機(jī)測(cè)試; Batra等[9]提出了一種使選取原始測(cè)試用例對(duì)應(yīng)路徑最大差異化的遺傳算法; Chen等[10]提出了一種將程序的輸入域劃分為等價(jià)類的思想, 減少了原始測(cè)試用例數(shù)目, 但錯(cuò)誤探測(cè)率仍較高; Murphy等[11]為蛻變測(cè)試的自動(dòng)化應(yīng)用提出了啟發(fā)式測(cè)試預(yù)言和Amsterdam框架; Bluemke等[12]開發(fā)了一種蛻變測(cè)試的工具, 使蛻變測(cè)試的研究更簡(jiǎn)便. 對(duì)于有效蛻變關(guān)系的獲取, Just等[13]研究表明, 根據(jù)系統(tǒng)組件推出的蛻變關(guān)系在錯(cuò)誤探測(cè)方面通常優(yōu)于從整個(gè)系統(tǒng)得到的蛻變關(guān)系; Liu等[14]提出了一種通過(guò)組合現(xiàn)有的蛻變關(guān)系構(gòu)建新蛻變關(guān)系的方法, 驗(yàn)證了組合蛻變關(guān)系具有更高的錯(cuò)誤探測(cè)效率和成本效益; Segura等[15]為探測(cè)可變性分析工具中的錯(cuò)誤, 提出了一種基于蛻變關(guān)系集合的迭代蛻變測(cè)試方法; Zhang等[16]為解決面向?qū)ο筌浖y(cè)試中方法序列的Oracle問(wèn)題, 提出了一種基于代數(shù)規(guī)范的面向?qū)ο筌浖y(cè)試構(gòu)建蛻變關(guān)系的方法, 顯著降低了蛻變關(guān)系的冗余; Lü等[17]提出了一種基于蛻變關(guān)系和粒子群優(yōu)化算法相結(jié)合的測(cè)試用例生成方法, 顯著提高了時(shí)間消耗和實(shí)用性評(píng)估方面的效率.
蛻變測(cè)試的本質(zhì)是驗(yàn)證程序多組輸入和輸出之間是否滿足蛻變關(guān)系, 因此蛻變關(guān)系是蛻變測(cè)試的核心, 決定了蛻變測(cè)試的能力和效果. 由上述分析可見(jiàn), 目前關(guān)于蛻變關(guān)系的研究多數(shù)都集中于如何在已知的蛻變關(guān)系集合中選取、 生成更有效的蛻變關(guān)系或蛻變關(guān)系組合方案, 但都有一個(gè)前提條件, 即需預(yù)先構(gòu)造一個(gè)蛻變關(guān)系集合, 而目前該蛻變關(guān)系集合均依賴測(cè)試人員的領(lǐng)域知識(shí)構(gòu)建, 從而限制了蛻變測(cè)試的進(jìn)一步發(fā)展, 增加了蛻變測(cè)試的使用成本. 科學(xué)計(jì)算的蛻變關(guān)系存在多種形式, 但50%以上的蛻變關(guān)系可使用多項(xiàng)式的形式表示[18]. 因此本文研究蛻變關(guān)系的多項(xiàng)式形式, 先用基于機(jī)器學(xué)習(xí)基本原理的梯度下降法對(duì)多項(xiàng)式系數(shù)進(jìn)行求解, 再通過(guò)所得多項(xiàng)式自動(dòng)提取所測(cè)程序的蛻變關(guān)系.
在軟件測(cè)試中, Oracle表示當(dāng)程序正確運(yùn)行時(shí)輸入的測(cè)試用例應(yīng)該對(duì)應(yīng)的輸出結(jié)果. 通常情況下, 獲取合適的Oracle將花費(fèi)較大的代價(jià), 且多數(shù)情形下, 由于待測(cè)程序復(fù)雜度等原因, 所以很難或完全不能得到每個(gè)測(cè)試用例對(duì)應(yīng)的Oracle. 此時(shí), 由于測(cè)試用例作為輸入所得結(jié)果無(wú)法判斷其是否正確, 因此無(wú)法測(cè)試程序是否存在問(wèn)題.
蛻變測(cè)試基本原理是通過(guò)檢測(cè)兩個(gè)或兩個(gè)以上輸出結(jié)果之間是否滿足程序中包含的某種關(guān)系(蛻變關(guān)系)檢測(cè)程序中的錯(cuò)誤. 蛻變測(cè)試不同于傳統(tǒng)軟件測(cè)試之處是傳統(tǒng)軟件測(cè)試將關(guān)注點(diǎn)聚焦于出現(xiàn)錯(cuò)誤的測(cè)試用例中, 而蛻變測(cè)試則認(rèn)為正確的測(cè)試用例也包含重要信息. 由于蛻變測(cè)試不依賴于測(cè)試用例產(chǎn)生輸出的正確性, 所以對(duì)于多個(gè)測(cè)試用例, 在未知Oracle的情況下仍可進(jìn)行程序測(cè)試. 蛻變測(cè)試一般由以下4步構(gòu)成:
1) 根據(jù)合適的測(cè)試用例生成策略生成一個(gè)或多個(gè)測(cè)試用例;
2) 分析待測(cè)程序的性質(zhì), 生成蛻變關(guān)系;
3) 根據(jù)原始測(cè)試用例和蛻變關(guān)系生成衍生的蛻變測(cè)試用例集;
4) 依次檢查每個(gè)原始測(cè)試用例和對(duì)應(yīng)衍生測(cè)試用例的輸出是否滿足蛻變關(guān)系.
在蛻變測(cè)試中, 蛻變關(guān)系的生成是關(guān)鍵. 蛻變關(guān)系表示待測(cè)函數(shù)或軟件的一些特殊性質(zhì), 這些性質(zhì)對(duì)程序的不同輸入產(chǎn)生影響, 從而檢測(cè)出一部分錯(cuò)誤. 例如, 對(duì)于最大值函數(shù)max{X}, 只要X中元素值不變, 則無(wú)論X值的順序如何變化, 最大值函數(shù)max{X}的最終輸出一定不變. 通過(guò)該性質(zhì)可檢測(cè)出函數(shù)的部分正確性. 又例如, 計(jì)算sin(x)的程序, 對(duì)于大部分x, sin(x)的具體數(shù)值無(wú)法確定, 但根據(jù)相關(guān)數(shù)學(xué)知識(shí)可知sin(x)與sin(x+2kπ)的值相同, sin(x)與-sin(-x)的值相同, 所以只要在相同的輸入下“sin(x)-sin(x+2kπ)=0”與“sin(x)+sin(-x)=0”都成立, 即可證明程序部分正確. 當(dāng)然, 對(duì)于蛻變關(guān)系, 不一定都與“=”相關(guān). 例如, 對(duì)于f(x)=x程序, “若x1>x2, 則f(x1)>f(x2)成立”可作為程序的一條蛻變關(guān)系. 但蛻變關(guān)系的提取依賴于測(cè)試人員的人工推算, 從而要求測(cè)試人員對(duì)測(cè)試程序所在的領(lǐng)域必須深入了解, 且對(duì)于一些復(fù)雜的問(wèn)題很難推算出合適的蛻變關(guān)系. 為解決該問(wèn)題, Kanewala等[19]提出了在缺少Oracle的情形下用機(jī)器學(xué)習(xí)的方法發(fā)掘是否一些程序含有某些形式的蛻變關(guān)系. 本文將科學(xué)計(jì)算蛻變關(guān)系的提取和機(jī)器學(xué)習(xí)相結(jié)合, 通過(guò)大量的數(shù)據(jù)尋找兩個(gè)或兩個(gè)以上不同參數(shù)的函數(shù)之間存在的數(shù)值關(guān)系.
蛻變關(guān)系表示軟件輸入變化對(duì)輸出的影響, 即在一定取值范圍內(nèi), 程序的輸入變化和程序輸出變化存在關(guān)系. 在進(jìn)行蛻變測(cè)試時(shí), 如果原始用例和衍生用例之間的關(guān)系不滿足所選擇的蛻變關(guān)系, 則表明這一對(duì)測(cè)試用例發(fā)現(xiàn)了程序中的錯(cuò)誤. 蛻變關(guān)系可用下列公式表示:
R1(x1,x2)→R2(P[x1],P[x2]),
(1)
其中:P[x]表示輸入x在執(zhí)行完程序P后的輸出;R1表示輸入x1與x2之間存在的關(guān)系;R2表示輸出P[x1]與P[x2]之間存在的關(guān)系. 即當(dāng)輸入x1與x2滿足關(guān)系表達(dá)式R1時(shí), 若輸出P[x1]與P[x2]滿足關(guān)系表達(dá)式R2, 則該程序在此蛻變關(guān)系下成立, 否則程序錯(cuò)誤. 在蛻變測(cè)試中, 如何找到合適的R1與R2是測(cè)試的關(guān)鍵.
在蛻變關(guān)系生成過(guò)程中, 如何確定兩個(gè)或多個(gè)相關(guān)聯(lián)的輸入對(duì)相應(yīng)輸出的影響是確定蛻變關(guān)系的關(guān)鍵. 本文采用對(duì)于確定關(guān)系的兩個(gè)或多個(gè)輸入, 通過(guò)大量數(shù)據(jù)多次迭代的方式確定不同輸入對(duì)輸出的影響, 即使用機(jī)器學(xué)習(xí)方法進(jìn)行蛻變關(guān)系的獲取. 梯度下降算法作為機(jī)器學(xué)習(xí)中的基本算法之一, 具有大樣本下標(biāo)準(zhǔn)差低、 學(xué)習(xí)效率不會(huì)下降等優(yōu)點(diǎn). 梯度表示函數(shù)中上升最快的方向, 即f(x,y,z)=(?f/?x,?f/dy,?f/?z). 梯度下降算法的基本思想是按照函數(shù)梯度下降的方向求解函數(shù)的極小值, 本文使用梯度下降算法作為基本算法獲取科學(xué)計(jì)算程序中存在的蛻變關(guān)系.
科學(xué)計(jì)算程序中50%以上的蛻變關(guān)系可用多項(xiàng)式形式表示, 為簡(jiǎn)便, 本文中對(duì)輸入x1與x2之間存在的關(guān)系r1和輸出P[x1]與P[x2]之間存在的關(guān)系r2都作為線性方程的情形. 當(dāng)r1為線性方程時(shí),x和r1(x)之間的關(guān)系可表示為r1(x)=ax+b, 其中a,b均為系數(shù). 當(dāng)r2為線性方程時(shí),P(x)和P(r1(x))之間的關(guān)系可表示為θ1P(x)+θ2P(r1(x))+θ3=0, 其中θ1,θ2,θ3均為系數(shù). 因此, 蛻變關(guān)系可表示為
θ1P(x)+θ2P(ax+b)+θ3=0.
(2)
由于在系數(shù)θ1,θ2,θ3都確定的情形下, 自變量x在任何取值下蛻變關(guān)系(2)都成立, 所以蛻變關(guān)系的損失函數(shù)可表示為
L(θ)=|θ1P(x)+θ2P(r1(x))+θ3|.
(3)
多項(xiàng)式蛻變關(guān)系作為最小化損失函數(shù), 可通過(guò)梯度下降法迭代, 使多項(xiàng)式蛻變關(guān)系最小化并得到模型參數(shù)值. 下面給出梯度下降法原理, 設(shè)目標(biāo)函數(shù)為L(zhǎng)(θ),L(θ)關(guān)于參數(shù)θ1的梯度是損失函數(shù)上升最快的方向. 對(duì)于最小化優(yōu)化問(wèn)題, 只需將參數(shù)沿梯度相反方向前進(jìn)一個(gè)步長(zhǎng), 即可實(shí)現(xiàn)目標(biāo)函數(shù)的下降(步長(zhǎng)又稱為學(xué)習(xí)率). 則參數(shù)更新公式如下:
θ=θ-αθL(θ),
(4)
算法1蛻變關(guān)系梯度下降算法.
步驟1) 初始化θ(參數(shù)向量) ,α(步長(zhǎng)),r1(x)=ax+b,θ1P(x)+θ2P(r1(x))+θ3=0(蛻變關(guān)系);
步驟2)L(θ)=|θ1P(x)+θ2P(r1(x))+θ3|(損失函數(shù)),hθ(x)=θ1P(x)+θ2P(r1(x))+θ3;
步驟3) whileL(θ)收斂 do
步驟5) end while
步驟6) 返回θt.
算法1中, 梯度下降算法根據(jù)函數(shù)下降最快的方向進(jìn)行損失函數(shù)的最小值求解, 通過(guò)多次迭代最終實(shí)現(xiàn)假設(shè)函數(shù)hθ(x)和樣本點(diǎn)的擬合. 在梯度下降算法中, 由于損失函數(shù)的復(fù)雜性, 使得到的極值點(diǎn)不一定是損失函數(shù)的最小值點(diǎn), 可能是函數(shù)局部的極值點(diǎn), 但由于科學(xué)計(jì)算中多數(shù)程序的蛻變關(guān)系可用多項(xiàng)式形式表示, 因此本文采用梯度下降法得到的一定是損失函數(shù)的最小值. 由于選取參數(shù)θ的初始值不同, 因此得到的極小值也可能不同. 對(duì)于下降步長(zhǎng)α也需選取合適的值, 若步長(zhǎng)α偏小, 則函數(shù)下降得較慢, 需消耗大量的資源; 若步長(zhǎng)α選取較大, 則可能會(huì)出現(xiàn)無(wú)法收斂的情形.
算法學(xué)習(xí)率(即步長(zhǎng)α)的取值大小對(duì)梯度下降算法的效率影響較大. 如果學(xué)習(xí)率過(guò)高則會(huì)增加損失函數(shù)的波動(dòng)性, 而學(xué)習(xí)率過(guò)低則會(huì)降低算法效率, 增加收斂所需時(shí)間. 隨機(jī)梯度下降算法使用固定的學(xué)習(xí)率進(jìn)行參數(shù)更新, 已成為限制算法性能的一個(gè)重要因素. 此外, 隨機(jī)梯度下降算法的固定步長(zhǎng)使算法在每次迭代后對(duì)參數(shù)的更新都有可能會(huì)引起損失函數(shù)數(shù)值的劇烈變化, 很難獲取理想的目標(biāo)參數(shù). 例如, 對(duì)于函數(shù)tanx, 由于該函數(shù)擁有無(wú)窮大和無(wú)窮小, 且參數(shù)的更新和損失函數(shù)的變化互相影響, 故函數(shù)tanx的損失函數(shù)值將劇烈波動(dòng), 很難選擇合適的參數(shù).
理論上, 如果數(shù)據(jù)集不密集, 則使用自適應(yīng)學(xué)習(xí)速率的優(yōu)化方法(如Adagrad, RMSprop, Adam)可提高隨機(jī)梯度下降算法效率. 本文使用Adam算法解決該問(wèn)題, 該算法通過(guò)計(jì)算一階矩估計(jì)和二階矩估計(jì)設(shè)計(jì)獨(dú)立的自適應(yīng)學(xué)習(xí)率, 算法描述如下.
算法2隨機(jī)Adam算法.
步驟1) 初始化α(步長(zhǎng)),β1,β2(超參數(shù)),θ0(參數(shù)向量),m0=0,v0=0,t=0(時(shí)間步);
步驟2) whileθt不收斂 do
步驟3)t=t+1;
步驟4)gt=θf(wàn)t(θt-1);
步驟5)mt=β1×vt-1+(1-β1)×gt;
步驟10) end while
步驟11) 返回θt.
算法2計(jì)算了梯度的指數(shù)移動(dòng)均值, 而超參數(shù)β1和β2控制移動(dòng)均值的衰減率. 在給定學(xué)習(xí)率、 超參數(shù)和損失函數(shù)及初始化各參數(shù)后, 算法2對(duì)時(shí)間步+1, 并計(jì)算該時(shí)間步下的梯度, 更新偏差的一階估計(jì)和原始二階估計(jì), 然后再計(jì)算偏差修正的一階矩估計(jì)和偏差修正的二階矩估計(jì), 最后根據(jù)計(jì)算值更新參數(shù)θ直至收斂.
由于Adam算法在進(jìn)行迭代時(shí)通過(guò)計(jì)算一階矩估計(jì)和二階矩估計(jì)動(dòng)態(tài)的調(diào)節(jié)學(xué)習(xí)率, 所以可較好地解決由隨機(jī)梯度下降算法學(xué)習(xí)率固定導(dǎo)致的一系列問(wèn)題.
本文實(shí)驗(yàn)以sin函數(shù)作為研究對(duì)象, 隨機(jī)梯度下降算法中所有參數(shù)每次更新都使用相同的學(xué)習(xí)率. 由于sin函數(shù)的損失函數(shù)梯度較大, 若采用較大的學(xué)習(xí)率則會(huì)出現(xiàn)收斂緩慢甚至無(wú)法收斂的情形, 因此本文將學(xué)習(xí)率取較小值0.000 1. 此外, 由于式(2)在梯度下降求解中可能會(huì)出現(xiàn)θ1,θ2,θ3均為0的情形(特別地, 經(jīng)過(guò)實(shí)驗(yàn)證明若不采取措施參數(shù)將會(huì)直接下降到0), 因此可將參數(shù)θ1去除, 去除參數(shù)θ1能完全杜絕參數(shù)歸零的情形, 所以可將式(2)表示為
(5)
令m=θ2/θ1,n=θ3/θ1, 則損失函數(shù)可表示為
L(m,n)=|P(x)+mP(ax+b)+n|.
(6)
該方法不僅能解決參數(shù)歸零問(wèn)題, 且不會(huì)對(duì)蛻變關(guān)系的推斷有影響. 此外, 多數(shù)線性多項(xiàng)式的系數(shù)主要集中在1和2上, 并且若初始值和真實(shí)值較接近時(shí)可減少迭代次數(shù), 故本文實(shí)驗(yàn)中將m,a,n的初始化值局限在[-2,2]內(nèi),b值局限在[-10,10]內(nèi).
圖1 一次隨機(jī)梯度下降算法的損失函數(shù)Fig.1 Loss function of a stochastic gradient descent algorithm
將式(6)作為損失函數(shù), 通過(guò)Pytorch框架可實(shí)現(xiàn)隨機(jī)梯度下降算法. 實(shí)驗(yàn)成功的標(biāo)準(zhǔn): 在進(jìn)行足夠多次迭代后, 若損失函數(shù)能降為零, 且參數(shù)值也穩(wěn)定在某值, 驗(yàn)證參數(shù)值(代入式(3))符合所測(cè)科學(xué)計(jì)算函數(shù)的規(guī)律, 則可判斷成功推出了蛻變關(guān)系. 對(duì)于每個(gè)科學(xué)計(jì)算函數(shù), 重復(fù)執(zhí)行程序若干次, 并用Tensorboard記錄數(shù)據(jù), 觀察實(shí)驗(yàn)結(jié)果. 本文選取一個(gè)具有代表性的典型特征結(jié)果為例, 圖1為進(jìn)行某次實(shí)驗(yàn)損失函數(shù)每次迭代的數(shù)值結(jié)果. 由圖1可見(jiàn), 損失函數(shù)在5萬(wàn)次迭代內(nèi)呈現(xiàn)了高波動(dòng)性, 這是因?yàn)殡S機(jī)梯度下降每個(gè)樣本更新一次梯度, 損失函數(shù)值都會(huì)進(jìn)行頻繁地更新. 損失函數(shù)在前期迭代時(shí)波動(dòng)幅度較大并非完全無(wú)益, 其可能有益于挖掘新的及更優(yōu)的局部最小值. 后期波動(dòng)相對(duì)前期逐漸減小, 但也在波動(dòng)中收斂, 多次迭代后損失函數(shù)在波動(dòng)中降為零. 根據(jù)實(shí)驗(yàn)得到此次運(yùn)行梯度下降算法的參數(shù)值為:m=1,a=1,b=π,n=0, 代入到多項(xiàng)式蛻變關(guān)系式為sin(x)+sin(x+π)=0. 通過(guò)查閱三角函數(shù)的相關(guān)定理可知, 該多項(xiàng)式蛻變關(guān)系成立. 本文進(jìn)行了大量重復(fù)性實(shí)驗(yàn), 按同樣流程進(jìn)行數(shù)據(jù)記錄和驗(yàn)證, 結(jié)果表明, 隨機(jī)梯度下降算法可對(duì)有多項(xiàng)式蛻變關(guān)系的科學(xué)計(jì)算函數(shù)進(jìn)行蛻變關(guān)系推導(dǎo).
理論上, RMSprop算法是Adagrad算法的一種優(yōu)化, 而Adam算法是在RMSprop算法的基礎(chǔ)上進(jìn)行優(yōu)化, 引入了動(dòng)量和偏差修正. 在類似情形下, RMSprop算法與Adam算法的性能相差較小, 但Adam算法收益于偏差修正, 因此略優(yōu)于RMSprop算法, 因?yàn)锳dam算法在其接近收斂時(shí)梯度變得更稀疏[20]. 本文進(jìn)行多次實(shí)驗(yàn)的結(jié)果表明, Adam算法在自動(dòng)推導(dǎo)蛻變關(guān)系程序的效率最高, 性能最好.
圖2 三種算法的損失值對(duì)比Fig.2 Comparison of loss values of three algorithms
圖2為在完全相同的數(shù)據(jù)訓(xùn)練集下, 同一程序中創(chuàng)建三種優(yōu)化器, 隨機(jī)梯度下降算法(A)、 RMSprop算法(B)和Adam算法(C)的損失值對(duì)比結(jié)果. 由圖2可見(jiàn), 在相同數(shù)據(jù)及相同迭代次數(shù)的條件下, 隨機(jī)梯度下降算法和RMSprop算法無(wú)法將損失值降低到零, 即推導(dǎo)蛻變關(guān)系失敗. 而Adam算法卻能在約5 000次迭代時(shí)即擺脫高波動(dòng)的損失值, 將損失值逐漸減低到零, 求出蛻變關(guān)系. 表明Adam算法即使初始化參數(shù)時(shí), 參數(shù)距離最優(yōu)解較遠(yuǎn), 但能克服隨機(jī)梯度下降算法的缺陷, 用更精巧的算法將損失函數(shù)降低至零, 證明了在解決該問(wèn)題中Adam算法比另外兩種算法性能更優(yōu). 多次運(yùn)行程序后結(jié)果表明, 在求解科學(xué)計(jì)算函數(shù)的多項(xiàng)式蛻變關(guān)系問(wèn)題中, Adam算法的效果最好.
由上述實(shí)驗(yàn)可知, 使用隨機(jī)梯度下降算法的損失函數(shù)平均迭代次數(shù)約5萬(wàn)次呈現(xiàn)高波動(dòng)性, 在10萬(wàn)次迭代后開始收斂. 為與隨機(jī)梯度下降算法進(jìn)行對(duì)比, 本文在實(shí)現(xiàn)過(guò)程中將Adam算法的初始學(xué)習(xí)率設(shè)為0.001, 與隨機(jī)梯度下降算法相同使用式(3)作為損失函數(shù), 用Pytorch框架構(gòu)造Adam優(yōu)化器進(jìn)行實(shí)現(xiàn). 多次實(shí)驗(yàn)結(jié)果表明, 在多數(shù)情形下初始值為α=0.001,β1=0.9,β2=0.999,ε=1×10-8時(shí)算法性能優(yōu)異.
圖3 Adam算法損失值示例Fig.3 Example of loss values of Adam algorithm
圖3為Adam算法損失值示例. 由圖3可見(jiàn), Adam算法優(yōu)化后程序推導(dǎo)出蛻變關(guān)系所需的迭代次數(shù)極大降低, 多次實(shí)驗(yàn)結(jié)果表明, 使用Adam算法損失值降為零的次數(shù)約為2 000(不排除存在少量迭代次數(shù)遠(yuǎn)大于2 000的情形), 相比于隨機(jī)梯度下降法的迭代次數(shù)性能明顯提升, 因此Adam算法比隨機(jī)梯度下降法收斂的更快且更穩(wěn)定.
Adam算法比隨機(jī)梯度下降算法效率高的一個(gè)重要原因是其可以修正偏差. 對(duì)于tan函數(shù), 如嘗試用隨機(jī)梯度下降算法推導(dǎo)其蛻變關(guān)系式, 梯度計(jì)算將十分困難, 因?yàn)閠an函數(shù)具有無(wú)窮大和無(wú)窮小, 高梯度將會(huì)導(dǎo)致?lián)p失函數(shù)大幅度波動(dòng), 如圖4所示. 而Adam算法可很好地解決該問(wèn)題, 圖5是用Adam算法計(jì)算tan函數(shù)蛻變關(guān)系式的一個(gè)示例, 損失函數(shù)在波動(dòng)中降為零, 此時(shí)對(duì)于優(yōu)化后的蛻變關(guān)系式(4), 對(duì)應(yīng)的參數(shù)為m=1,a=-1,b=π,n=0,代入到多項(xiàng)式蛻變關(guān)系式為tan(x)+tan(-x+π)=0. 經(jīng)過(guò)驗(yàn)證, 該組系數(shù)代入tan函數(shù)的蛻變關(guān)系式成立.
圖4 tan損失函數(shù)波動(dòng)Fig.4 Fluctuations of tan loss function
圖5 Adam算法對(duì)于tan函數(shù)的損失值Fig.5 Loss values of Adam algorithm for tan function
盡管Adam算法可求出tan函數(shù)的蛻變關(guān)系式, 但tan函數(shù)易導(dǎo)致?lián)p失函數(shù)高波動(dòng)的特征, 使執(zhí)行Adam算法失敗率也較高. 但相比隨機(jī)梯度下降法無(wú)法求解tan函數(shù)的蛻變關(guān)系式, Adam算法已有很大優(yōu)勢(shì).
綜上所述, 本文將科學(xué)計(jì)算程序的蛻變關(guān)系推導(dǎo)問(wèn)題視為一個(gè)多項(xiàng)式系數(shù)搜索問(wèn)題, 用經(jīng)典的機(jī)器學(xué)習(xí)算法----梯度下降法解決該問(wèn)題, 并使用Adam算法對(duì)梯隊(duì)下降法進(jìn)行優(yōu)化, 取得了較好的效果.