這幾天一直在介紹進入最佳化演算法之前的種種,經過這幾天的鋪墊終於要進入主題了,今天要先介紹幾個常用的最佳化演算法的模組,這些模組都已經將功能包裝的很完整了,所以使用起來很方便。這些模組常常被用來進行各種類型的最佳化、線性規劃等等。而且上手難度不高,官方文檔的教學也很完整,所以學會使用這些模組對各位在調整參數或者其他應用時會有很大的幫助喔。
目前有許多最佳化的模組可以使用,我自己也用過許多模組,但是目前來說蠻多模組都有一些小瑕疵導致程式寫起來有點難度。目前在不同應用中我用過且認為比較好用的模組有以下幾個:
Niapy是一個統合各種最佳化演算法的函式庫,它整理了很多受自然啟發的演算法並進行統整。該團隊在各種不同領域中不同的問題進行測試,經過測試後就完成了這個函式庫。NiaPy的意旨在可以簡單快速使用,避免我們需要重新開始時做那些演算法。
NiaPy Logo(來源為NiaPy官方文檔)
NiaPy在使用上有一些小缺點對於模型最佳化有些問題需要克服,例如在設定上它是一次設定解空間中所有解還有它們的範圍。所以例如今天要找最佳的學習率(0.0001~0.001)、中間隱藏層網路層數(1層~10層)、神經元數量(2、4、8、16、32、64...)。
在設定上會設定解空間為3、範圍為1~10,此時演算法生成的解會是一個長度為3的向量x=[x0, x1, x2]
,三個元素範圍都是1~10,此時就要在程式中先自行換算,例如學習率的轉換就是x[0] *= 0.001
;網路層數量就不用轉換;神經元數量為2^n次方,所以轉換就是x[2] = 2**x[2]
,轉換完成再帶入程式中。
因為設定要帶入的值還需要經過轉換所以在使用上也挺麻煩的,有時候或許有從幾個類別中選擇的變數要處理就要寫一堆if...else,會非常麻煩。這個模組在其他最佳化的問題中確實很好用,但是在模型最佳化的使用上我覺得NiaPy並不是最優秀的選擇,所以未來應用中我就不會對NiaPy有更多的介紹了~
Optuna 是一個專門為機器學習中各種應用(包括深度學習、強化學習)等設計的超參數最佳化函式庫,與NiaPy不同的是Optuna是專門用於最佳化機器學習的API,使用這個模組進行開發的話在程式的撰寫上會非常容易,之後幾天我會帶各位進行程式的實作,使用Optuna也可以更有彈性的定義各種要最佳化變數的搜索空間。
Optuna Logo(來源為Optuna官方中文文檔)
Optuna的幾個特點有:
MealPy是我最近發現的發現的函式庫,用起來也很順手,它也包括非常大量的啟發式演算法,也實現了很多功能,包含視覺化、高級設定(提早結束最佳化、有約束條件的最佳化、多目標最佳化等),甚至可以使用MealPy的功能代替傳統梯度下降來進行模型的訓練參數更新,非常強大。
這個模組建立的目的為
MealPy在未來我也會向各位進行程式上的實作,MealPy可以實作的東西很多,各位也可以去官方文檔挖寶喔。
今天介紹了幾個不同的函式庫,除了NiaPy與GuRoBipy以外其他兩個函式庫用於模型最佳化都非常方便(GuRoBipy我比較不熟悉就先暫時不介紹了),也很好上手。往後幾天我會詳細介紹這兩個模組,希望可以快速幫助各位理解這些演算法的應用以及造成的影響!不過在這之前我想先介紹一些經典的最佳化演算法,希望各位可以更理解這些基礎算法的思路以及最佳化的原理。