人工智慧中最核心的數學環節是求出一個目標函數(object function)的最小值/最大值。求出一個函數最小是/最大值的方法很多,在這裡我們介紹一個最經典的方法之一:直接求出極值點。這些極值點的共同特點是在這些點上的梯度為0, 如下圖所示。這個圖裡面,有8個極值點,而且這些極值點中必然會存在最小值或者最大值(除去函數的左右最端點)。所以在這種方式下,我們通常x先求出函數的導數,然後設置成為0。之後從找出的極值點中選擇使得結果為最小值/最大值的極值點。
A. 無約束條件的優化
例1:求 的最小值
對於這樣的一個問題,其實我們都知道這個問題的答案是 ,基本上不需要計算就能看出來。接下來我們通過求導的方式來求一下最小值。首先對 求導並把導數設置成0。
從而得到 , 求出來的是唯一的極值點,所以最後得出來的函數的最小值是
的最小值
求導之後
即可以得到 。 把這三個值分別帶入到 即可以得到 。所以, 兩個點都可以作為函數的最小值點,這時候函數值為 。
*請注意:並不一定所有函數的極值都可以通過設置導數為0的方式求出。也就是說,有些問題中當我們設定導數為0時,未必能直接計算出滿足導數為0的點(比如邏輯回歸模型),這時候就需要利用數值計算相關的技術(最典型為梯度下降法,牛頓法..)
B. 帶約束條件的優化 - 拉格朗日乘法項(Lagrangian Multiplier)
對於某些求極值問題,函數通常帶有一些條件。如下面的例子:
例3:求 的最大值,但有個條件是 。那這時候怎麼求出最大值呢?
拉格朗日乘法項就是用來解決這類問題。我們可以把限制條件通過簡單的轉變加到目標函數中,這時候問題就變成了
剩下的過程就跟上面的類似了。設定導數為0,即可以得到以下三個方程:
解完之後即可以得到 。 針對於每一個$lambda$我們得到的解為 。把兩個解帶入到原來函數里並做比較即可以確定最優解。
【視頻1】優化問題介紹
【視頻2】無約束條件優化
【視頻3】有約束條件優化
練習題:
import numpy as np coeff = [3,4,1] np.roots(coeff)
2. 【難】假設我們有N對數據 ,其中每個 的取值為0或者1, 是一個長度為 的向量, 我們可以把每一對的 當做是已知的。 則對於函數, 求解使得它取得最大值的參數 。其中 函數的定義為 。 試著使用把導數設置為0的方法來求解,並判斷是否這個方法行得通? 如果不行,這個問題怎麼求解呢?
對於練習題,鼓勵大家互相討論。