本章我們将學習以下内容:
l 什麼是微基準測試
l 如何将它應用到代碼中
l 什麼是激活函數
l 如何繪制和基準測試激活函數
每個開發人員都需要有一個好的基準測試工具。品質基準無處不在;你們每天都能聽到,這個減少了10%那個增加了25%還記得那句老話嗎,當你聽到一個數字被抛出時,98.4%的情況下這個數字是假的。順便說一下,這個數字也是我編的。當你聽到這樣的話,讓那個人證明一下,你會得到什麼?我們不需要定性的結果;我們需要能夠被證明和持續複制的量化結果。可重複的結果是非常重要的,不僅對一緻性,而且對可信度和準确性。這就是微基準測試發揮作用的地方。
我們将使用BenchmarkDotNet庫,您可以在這裡找到:https://github.com/dotnet/BenchmarkDotNet。我認為它是您可以使用的最不可替代的架構之一,我認為它的重要性不亞于單元測試和內建測試
為了展示這個工具的價值,我們将繪制幾個激活函數并比較它們的運作時。作為其中的一部分,我們将考慮預熱、遺留和RyuJIT、冷啟動以及程式執行的更多方面。最後,我們會得到一組定量的結果來證明函數的精确度量。如果在2.0版本中,我們看到某些東西運作得比較慢,我們可以重新運作基準并進行比較。
我強烈建議将其內建到您的持續內建/持續建構過程中,以便在每個版本中都可以比較基準資料。
在本章中,我們将有兩個樣本。第一個是激活函數檢視器;它将繪制每個激活函數,以便我們可以看到它的外觀。可以在Colin Green的SharpNEAT中找到它,它是開源的。這個包絕對是不可思議的。我在它的基礎上建立了新的ui以及進階版本來滿足我的需求,它是目前能找到的最靈活的工具。第一個示例應用程式帶有最新的SharpNEAT包,可以在https://github.com/colgreen/sharpneat找到它。
下面是一個局部和全局最小值的圖,它是由SharpNEAT的自定義版本繪制的。

如前所述,我們将繪制并測試幾個激活函數。我們到處都聽到激活函數這個詞,但我們真的知道它的意思嗎?讓我們從一個快速的解釋開始。
一個激活函數用來決定一個神經元是否被激活。有些人喜歡用fired來代替activated。不管怎樣,它最終決定了某個東西是開還是關,是被觸發還是沒有,是被激活還是沒有。
.讓我們首先看一個單個激活函數的圖:
這是邏輯陡峭近似和Swish激活函數單獨繪制時的樣子,因為有很多類型的激活函數,這是我們所有的激活函數一起繪制時的樣子:
在這一點上,你可能會想,我們為什麼還要關心情節是什麼樣的呢?好問題。我們關心這些,因為一旦你進入神經網絡或其他領域,你會經常用到這些。這是非常友善的,能夠知道你的激活函數是否将你的神經元的值在開或關的狀态,以及它将保持或需要的值在什麼範圍内。毫無疑問,你将在作為機器學習開發人員的職業生涯中遇到和/或使用激活函數,了解TanH和LeakyReLU激活函數之間的差別非常重要。
所有激活函數的繪圖都是在一個函數内完成的,這個函數名為PlotAllFunctions:
在背景,Plot函數負責執行和繪制每個函數:
這是執行我們傳入的激活函數的地方,它的值用于y軸标繪值。著名的ZedGraph開源繪圖包用于所有圖形繪制。一旦執行了每個函數,就會生成相應的圖。
BenchmarkDotNet生成了幾個報告,其中一個是HTML報告,類似于在這裡看到的:
Excel報告提供了運作程式時使用的每個參數的詳細資訊,是最廣泛的資訊來源。在很多情況下,這些參數中的大多數都使用預設值,超出了我們的需要,但至少我們可以選擇删除我們需要删除的内容:
我們将在下一節中描述其中的一些參數,當我們回顧建立之前看到的内容的源代碼時:
讓我們進一步分析這段代碼:
首先,我們将建立一個手動配置對象,其中包含用于基準測試的配置參數:
接下來,我們将設定一個導出器來儲存用于導出結果的參數。我們将使用微秒計時和千位元組大小将結果導出到.csv檔案:
接下來,我們将建立一個基準作業,它将處理x64體系結構上LegacyJitX64的度量。您可以随意更改此參數和任何其他參數,以進行實驗,或者包含測試場景所需或需要的任何結果。在我們的例子中,我們将使用x64平台;啟動計數、預熱計數和目标計數為1;以及吞吐量的運作政策。我們也會對RyuJIT做同樣的事情,但是我們不會在這裡顯示代碼:
最後,我們将運作BenchmarkRunner來執行我們的測試:
BenchmarkDotNet将作為DOS指令行應用程式運作,下面是執行上述代碼的一個例子:
讓我們來看一個被繪制的激活函數的例子:
此處使用了[Benchmark]屬性。這向BenchmarkDotNet表明,這将是一個需要進行基準測試的測試。在内部調用如下函數:
對于logisticfunction陡峭函數,其實作與大多數激活函數一樣簡單(假設你知道公式)。在這種情況下不是繪制激活函數,而是對其進行基準測試。
你将注意到函數接受并傳回double。我們也通過使用和傳回浮點變量對相同的函數進行基準測試,是以我們使用double對函數之間的差異進行基準測試和浮動。是以,人們可以看到,有時性能影響比他們想象的要大:
在本章中,我們學習了如何将微基準測試應用到代碼中。我們還了解了如何繪制和基準測試激活函數,以及如何使用微基準測試。現在,您有了一個最強大的基準測試庫,可以将其添加到所有代碼中。在下一章中,我們将深入探讨直覺的深度學習,并向您展示c#開發人員可以使用的最強大的機器學習測試架構之一。
“老天爺給你的任何機會,你也不會珍惜,更不會深入下去,你認為自己就是窮命,最喜歡通過脈脈閱讀免費的職場技巧。如果你還是杠精思維,任何事情,跑上來先論證困難,給自己一個不幹不參與的充分理由,那你完了。人生不過是短短十五年的機會,到了四十歲,你還在屌絲堆裡,啥也不幹,那你沒希望了。”