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