1. 程式人生 > >機器學習推導合集01-霍夫丁不等式的推導 Hoeffding Inequality

機器學習推導合集01-霍夫丁不等式的推導 Hoeffding Inequality

1.0 引言

筆者第一次接觸霍夫丁不等式(Hoeffding Inequality)是在林軒田先生的機器學習基石課程(還是在b站上看的hh)上。可以說,當時沒有系統學過概率論與數理統計(probability and statistics)的我,對於不等式的推導是感到相當頭疼。後來,我本科課程優化與機器學習課程引用了倫斯勒理工學院(RPI)的slide。乍看之下,發現竟與林軒田先生的課十分相似。後來,我才發現該課程參考書目Learning from data中作者之一就是林軒田先生。我在這一次成功理解了霍夫丁不等式的推導。接下來,我將詳細基礎介紹一下霍夫丁不等式,希望對概率論基礎較為薄弱的自學讀者們有所幫助。

1.1 需要補充的概率論知識

以下知識是需要讀者自學的:

  • 隨機變數(random variable)的概念
  •  期望(expectation)的概念與定義
  • 伯努利分佈(bernouli distribution)
  • 二項式分佈(binomial distribution)
  • 泰勒展開(Talyor expansion)

介紹一下Indicator,指示隨機變數。國內教材對其介紹甚少:

2 霍夫丁不等式理解

2.1霍夫丁不等式與機器學習的關係

我們數學定義的經驗風險的期望和分類器錯誤率相等。這一定義符合直覺。注意到,實際抽樣過程後,經驗風險具現(crystalized)成資料

(data)後與錯誤率是極大概率不同的(在連續情況下,二者相同的準確概率應為0)。例如:我扔三次骰子之後,取的平均數不一定為3。雖然我們理論建模分析後,其期望應該是3。

在實際機器學習的情況裡,當我們無法通過解析方式準確判斷分類器的錯誤率時,我們必須考慮通過上述定義的經驗風險來進行估計。例如:我們有一基於MNIST資料集的手寫數字CNN分類器,計算確定分類器準確率是不切實際的。我們實際評估其效能的做法是:輸入數字影象,進行重複試驗n次,獲得如上述定義的經驗風險。現在出現新的問題,我們企圖知曉期望風險和實際模型錯誤率是否接近。這個時候,霍夫丁不等式揭示了二者是如何隨著樣本容量N的增加而相互接近的。

2.2 霍夫丁不等式數學公式

接下來展示一些霍夫丁不等式的結論,證明過程在第三部分。首先展示其特殊形式,是承接2.1中所闡述的問題的

這個式子是更一般霍夫丁不等式的推論,其一般形式為:

3 霍夫丁不等式的推導

有了前面的瞭解,現在大致清楚霍夫丁不等式的作用,接下來我們通過“三駕馬車”(馬爾科夫、切比雪夫、切爾諾夫)三位的工作,逐步通過數理推出我們的重頭戲,霍夫丁不等式。

3.1 馬爾科夫不等式的推導

3.2 切比雪夫不等式的推導

為了建立起切比雪夫不等式給定的上限和霍夫丁不等式給定上限的聯絡,我用蒙特卡洛方法獲得左邊概率近似值(算是間接用了不等式的結論),同時繪製出兩個上限以做比較:

我們可以看出,這個兩個上限在n不夠大和e太小的情況下,實際上發揮不了作用。但無論如何,他們給了我們定性的直覺:更多的取樣帶來更好的精度。模擬程式語言是python,在附錄5.A中

3.3 切爾諾夫界的推導

3.4 霍夫丁不等式的推導

我們在這裡重提一遍霍夫丁不等式的一般形式

接下來開始證明,首先證明引理

證明定理:

4 參考文獻

5 附錄

5.A 模擬程式(python)

概率隨N變化:

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt

if __name__ == "__main__":
    N = np.array(np.power(10, np.arange(3, 8, 0.02)), dtype=np.int32)
    p = 0.3
    epsilon = 0.001
    Pr = np.zeros(N.shape)
    size = 80000
    i = 0
    for n in N:
        print(n)
        X = stats.binom.rvs(n, p, size=size)
        Pr[i] = np.count_nonzero(np.abs(X / n - p) > epsilon) / size
        i += 1


    chebysheve_bounding = 1 / (4 * N * epsilon * epsilon)
    hoeffding_bounding = 2 * np.exp(-2 * N * epsilon * epsilon)
    fig = plt.figure()
    ax = fig.add_subplot(111)

    ax.plot(N, Pr, label="Monte-Carlo simulation")
    ax.plot(N, chebysheve_bounding, label="chebysheve bounding")
    ax.plot(N, hoeffding_bounding, label="hoeffding_bounding")
    handles, labels = ax.get_legend_handles_labels()
    ax.legend(handles[::-1], labels[::-1])
    plt.xscale('log')
    plt.xlim(10 ** 3, 10 ** 8)
    plt.ylim(0, 1)

    plt.xlabel("N")
    plt.ylabel("Pr")

    plt.show()

概率隨精度(e)變化

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt

if __name__ == "__main__":
    n = 10000
    p = 0.4
    epsilon = np.power(10, np.arange(-3, -1, 0.001))
    Pr = np.zeros(epsilon.shape)
    size = 5000
    i = 0
    for e in epsilon:
        print(e)
        X = stats.binom.rvs(n, p, size=size)
        Pr[i] = np.count_nonzero(np.abs(X / n - p) > e) / size
        i += 1


    chebysheve_bounding = 1 / (4 * n * epsilon * epsilon)
    hoeffding_bounding = 2 * np.exp(-2 * n * epsilon * epsilon)
    fig = plt.figure()
    ax = fig.add_subplot(111)

    ax.plot(epsilon, Pr, label="Monte-Carlo simulation")
    ax.plot(epsilon, chebysheve_bounding, label="chebysheve bounding")
    ax.plot(epsilon, hoeffding_bounding, label="hoeffding_bounding")
    handles, labels = ax.get_legend_handles_labels()
    ax.legend(handles[::-1], labels[::-1])
    plt.xscale('log')
    plt.xlim(10 ** -1, 10 ** -3)
    plt.ylim(0, 1)

    plt.xlabel("epsilon")
    plt.ylabel("Pr")

    plt.show()