Stanford UFLDL教程 矢量化编程
矢量化編程
當使用學習算法時,一段更快的代碼通常意味著項目進展更快。例如,如果你的學習算法需要花費20分鐘運行完成,這意味著你每個小時能“嘗試”3個新主意。但是假如你的程序需要20個小時來運行,這意味著你一天只能“嘗試”一個新主意,因為你需要花費這么長時間來等待程序的反饋。對于后者,假如你可以提升代碼的效率讓其只需要運行10個小時,那么你的效率差不多提升一倍。
矢量化編程是提高算法速度的一種有效方法。為了提升特定數值運算操作(如矩陣相乘、矩陣相加、矩陣-向量乘法等)的速度,數值計算和并行計算的研究人員已經努力了幾十年。矢量化編程的思想就是盡量使用這些被高度優化的數值運算操作來實現我們的學習算法。
例如,假設 和 為向量,需要計算 ,那么可以按以下方式實現(使用Matlab):
或者可以更加簡單的寫為:
第二段程序代碼不僅簡單,而且運行速度更快。
通常,一個編寫Matlab/Octave程序的訣竅是:
上面的第一段代碼使用了一個顯式的for循環。通過不使用for循環實現相同功能,可以顯著提升運行速度。對Matlab/Octave代碼進行矢量化的工作很大一部分集中在避免使用for循環上,因為這可以使得Matlab/Octave更多地利用代碼中的并行性,同時其解釋器的計算開銷更小。
關于編寫代碼的策略,開始時你會覺得矢量化代碼更難編寫、閱讀和調試,但你需要在編碼和調試的便捷性與運行時間之間做個權衡。因此,剛開始編寫程序的時候,你可能會選擇不使用太多矢量化技巧來實現你的算法,并驗證它是否正確(可能只在一個小問題上驗證)。在確定它正確后,你可以每次只矢量化一小段代碼,并在這段代碼之后暫停,以驗證矢量化后的代碼計算結果和之前是否相同。最后,你會有望得到一份正確的、經過調試的、矢量化且有效率的代碼。
一旦對矢量化常見的方法和技巧熟悉后,你將會發現對代碼進行矢量化通常并不太費勁。矢量化可以使你的代碼運行的更快,而且在某些情況下,還簡化了你的代碼。
中英文對照
矢量化 vectorization
from: http://ufldl.stanford.edu/wiki/index.php/%E7%9F%A2%E9%87%8F%E5%8C%96%E7%BC%96%E7%A8%8B
總結
以上是生活随笔為你收集整理的Stanford UFLDL教程 矢量化编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Stanford UFLDL教程 稀疏自
- 下一篇: Stanford UFLDL教程 逻辑回