吳恩達機器學習第二課 Advanced Learning Algorithms

记录学习Blog發表於2024-06-10

Advanced Learning Algorithms

week1

1.1 神經元和大腦

image-20240525202721224

image-20240525203041902

image-20240525203628262

1.2 需求預測

image-20240525204801716

構建自己神經網路的時候:需要決定隱藏層的個數和每個隱藏層的神經元個數

image-20240602115622410

1.3 影像感知

畫素的亮度值從0~255變化

人臉識別:訓練一個神經網路,以一個特徵向量作為輸入,輸出圖片中人的身份

image-20240602120040307

image-20240602120812637

2.1 神經網路中的網路層

如何構建神經元層

image-20240602121815342

image-20240602122254611

image-20240602122503260

2.2 更復雜的神經網路

image-20240602123437830

image-20240602123631532

image-20240602123844290

2.3 神經網路前向傳播

舉例:手寫數字識別

只區分手寫數字0和1,二進位制分類問題

8*8矩陣,255表示明亮的白色畫素,0表示黑色畫素

64個輸入特徵,使用兩個隱藏層的神經網路

第一個隱藏層有25個神經元

第二個隱藏層有15個神經元

輸出層是數字1的機率

第一次計算:\(\vec{x}\)(\(\vec{a}^{[0]}\))到\(\vec{a}^{[1]}\)

第二次計算:\(\vec{a}^{[1]}\)\(\vec{a}^{[2]}\),這裡\(\vec{a}^{[2]}\)\(\vec{a}^{[1]}\)​的一個函式

...

image-20240602132400413

3.1 使用程式碼實現推理 tensorflow

image-20240602132643545

image-20240602132845233

特徵向量x:溫度和持續時間

輸出:是否是好咖啡

image-20240602133556263

image-20240602133706716

image-20240602134743630

3.2 tensorflow的資料形式

在處理線性迴歸和邏輯迴歸的課程裡,我們使用一維向量來表示輸入特徵x,對於tensorflow使用矩陣來表示資料

tensorflow處理資料集較大,使用矩陣可以讓計算效率高一些

image-20240602145645367

tensor是tensorflow團隊為了更加有效的儲存和執行矩陣計算建立的一種資料型別

從技術上來說,tensor比矩陣更通用,但是本課程會將tensor視為矩陣的一種表示方式

  • 表示矩陣的tensorflow形式
  • 表示矩陣的numpy形式

image-20240602150104150

[!TIP]

如果想要獲取張量a1並將其轉換回numpy陣列可以使用函式a1.numpy來實現

3.3 搭建一個神經網路

image-20240602152631508

這裡並沒有對第一層和第二層的變數進行顯式分配,透過sequential函式中。

image-20240602152707178

下載tensorflow慢的話使用:

pip install --no-cache-dir tensorflow -i  https://pypi.mirrors.ustc.edu.cn/simple/

4.1 單個神經網路上的前向傳播

image-20240602155014674

4.2 前向傳播的一般實現

編寫一個函式來實現dense layer,即神經網路的單層

將前一層啟用和給定層的神經元的引數w和b作為輸入

image-20240604121421129

W = np.array([
    [1,-3,5],
    [2,4,-6]
]) #w1是第一列,w2是第二列
b = np.array([-1,1,2])
a_in = np.array([-2,4])
def g(z):
    return 1.0/(1.0+np.exp(-z))
def dense(a_in, W, b, g):
    # 將前一個層的activation和給定神經元中的引數w和b作為輸入
    #給出本層的activation
    units = W.shape[1] #有多少列 w.shape:(2,3) 有多少列就是有多少個單元
    a_out = np.zeros(units) # [0,0,0]
    for j in range(units):
        w = W[:j] #依次把每一列取出來 0 :[1 2]   1 :[-3  4]  2 :[ 5 -6]
        z = np.dot(w,a_in)+b[j]
        a_out[j] = g(z)
    return a_out
def sequential(x):
    a1 = dense(x,W1,b1)
    a2 = dense(a1,W2,b2)
    a3 = dense(a2,W3,b3)
    a4 = dense(a2,W4,b4)
    f_x = a4
    return f_x

5.1 強人工智慧

image-20240604121720609

image-20240604121933931

6.1 神經網路

np.dot:這個函式既可以用於計算兩個陣列的點積(內積),也可以用於執行矩陣乘法。

np.matmul:此函式主要用於矩陣乘法。它要求參與計算的陣列滿足矩陣乘法的規則,即第一個陣列的列數必須等於第二個陣列的行數

def dense2(a_in, W, b):
    z = np.matmul(a_in,W)+b #主要用於矩陣乘法
    a_out = g(z)
    return a_out

6.2 矩陣乘法及其實現

image-20240604124340736

使用 vectorization

a = np.array([1,2]) #生成陣列 (2,)
b = np.array([3,4])
z = np.dot(a,b) # 1*3+2*4
z # 11
a = np.array([1,2]).reshape(1,-1)
b = np.array([3,4])
z = np.dot(a,b)
z # array([11])

image-20240604125549527

image-20240604125948321

image-20240604131242186

A = np.array([[1,-1,0.1],[2,-2,0.2]])
AT = A.T
W = np.array([[3,5,7,9],[4,6,8,0]])
Z = np.matmul(AT,W)
#Z = AT @ W
Z

image-20240604131448183

week2

1.1 Tensorflow實現

image-20240605181502062

1.2 模型訓練細節

image-20240605182028280

image-20240605182150587

image-20240605182709966

image-20240605183035010

2.1 Sigmoid 啟用函式的替代方式

image-20240605183531303

image-20240605183704293

2.2 如何選擇啟用函式

image-20240605184743749

image-20240605184824622

image-20240605185258523

image-20240605185411870

2.3 為什麼模型需要啟用函式

image-20240605185719561

image-20240605185826538

image-20240605190157001

image-20240605190338408

3.1 多分類問題

image-20240605191020332

3.2 softmax

image-20240605191753034

image-20240605192214334

3.3 神經網路的Softmax輸出

image-20240605192758982

3.4 Softmax的改進實現

image-20240605193403386

image-20240606093417704

image-20240606165959950

3.5 多個輸出的分類

image-20240606182210406

image-20240606182635830

4.1 高階最佳化方法

image-20240606183644137

image-20240606183747922

image-20240606183851363

image-20240606184123780

4.2 其他的網路層型別

image-20240606184424546

image-20240606185530275

image-20240606185930073

5.1 什麼是導數(選修)

image-20240606190710365

image-20240606190929798

image-20240606191621816

image-20240606194130180

image-20240606194041810

image-20240606194714950

image-20240606194851612

5.2 計算圖

image-20240606195440562

image-20240606200148408

image-20240606200253601

image-20240606200504260

5.3 大型神經網路案例

image-20240606201317305

week3

1.1 決定下一步做什麼

image-20240607202734647

1.2 模型評估

image-20240607203118238

image-20240607203332670

image-20240607203738132

image-20240607203905206

1.3 模型選擇和交叉驗證測試集的訓練方法

image-20240607204250930

image-20240607204451153

image-20240607204843495

image-20240607204957770

image-20240607205025216

因為選擇d的過程是依賴於測試集資料的,這個d值可能恰好只是對於測試集來說的最優,但如果再用這個模型在測試集上評估效能,就不準確了

用驗證集確定最優權重和閾值,用測試集確定最優模型型別

也就是,在訓練集訓練出d1到d10,十個模型;在交叉驗證集上根據j值選擇最小的那個模型;然後再測試集考察他的泛化能力;

測試集用過之後你不能去改模型,測試集本來就是評估模型的泛化能力的

訓練集用於模型的學習和引數 w j調整;交叉驗證集用於模型選擇,例如調整超引數,(如決策樹的樹深)選擇最佳模型;測試集用於最終評估模型效能

image-20240608104820101

2.1 透過偏差和方法進行判斷

image-20240608105616283

J_train不高說明沒有高偏差問題,J_cv不比J_train差,說明沒有高方差問題。

image-20240608110204403

2.2 正則化、偏差、方差

image-20240608112605152

如何選擇λ

最小化成本函式得到w1 b1,然後可以計算交叉驗證誤差

image-20240608113141305

image-20240608114611693

2.3 制定一個用於效能評估的基準

image-20240608115322758

image-20240608115503826

image-20240608115927327

2.4 學習曲線

image-20240608121219024

高偏差是欠擬合,模型能力不夠,所以增加再多資料也沒有用

高方差理解為過擬合,也就是模型能力強,資料少 所以增加資料量有用

簡單來說就是增加training樣本量可以減少variance,但對減少bias沒作用

2.5下一步

high bias:獲取儘量多的特徵,新增儘量多的多項式特徵,降低λ

high variance:獲得儘量多的訓練資料、儘量少的特徵集合,提高λ

增加λ會迫使演算法適應更加平滑的函式

2.6 方差和偏差

image-20240608143925058

image-20240608144359527

3.1 機器學習開發的迭代

image-20240608144859113

image-20240608145502424

image-20240608145635073

3.2 誤差分析

image-20240608150558019

3.3 新增更多資料

image-20240608200258113

image-20240608200457597

image-20240608200720772

image-20240608200956930

image-20240608201223759

3.4 遷移學習-使用其他任務中的資料

image-20240608202709343

因為兩個網路的本質都是影像分類,所以在隱藏層的大部分工作都是相似甚至一樣的,所以直接把第一個網路的隱藏層拿過來用,對輸出層重新訓練就能實現新的功能。相當於螺絲刀的刀柄都是一樣的,但把十字刀刀頭換成一字刀作用就不一樣了

如果訓練集小,option1

如果訓練集稍大,option2

影像處理的早期是有一些共性的,所以可以借用引數

image-20240608203138570

image-20240608203443364

3.5 機器學習專案的完整週期

image-20240608204243056

3.6 公平 偏見與倫理

image-20240609100231856

4.1傾斜資料集的誤差指標

image-20240609100818898

image-20240609101653999

準確率(Precision

精確率:在預測結果中有多少是正類

透過誤差率可能並不能選擇出最好的演算法,因為這個誤差小的可能不是特別有用的預測。

在這種量(比如某種疾病的患病率1%)比較少的資料集上,我們不僅用err rate來判斷這個演算法的表現如何

召回率 Recall

召回率:在所有正類中有多少是沒被遺漏的

召回率可以幫助檢測學習演算法是否始終預測為0,如果你的演算法只列印y=0,那麼true positive將永遠為0,因為永遠不會預測positive

precision 一個預測pos裡真的pos佔比

recall 一個真的pos裡預測pos佔比

image-20240609102033050

如果一直預測為0,沒有true positive ,那麼兩者的分子都將為0

如果一個演算法為0 precision或者0 recall都不是一個有用的演算法,如果一個演算法總是預測為0,那麼他的precision 是undefined,因為是0/0

4.2 精確率和召回率的權衡

在理想情況下我們喜歡具有高精度和高召回率的演算法,但在實際上,我們需要權衡準確率和召回率

高threshold :高準確率, 低召回率

低threshold:低準確率,高召回率

繪製不同閾值的精確率和召回率,可以讓我們選擇所需要的點

image-20240609103837994

如果想自動權衡精確度和召回率,使用F1 score

將召回率和準確度合併為一個分數,F1只需檢視哪個分數最高

image-20240609104807778

F1 score是一種強調 precision and recall中比較低的值,因為事實證明,如果演算法的精度和召回率非常低,說明二者沒有那麼有用。F1 score是一種計算平均分數的方法,更加關注較低的分數

F1 score是一種均值,調和均值是一種更強調較小值的平均值

week 4

1.1 決策樹模型

image-20240609141206443

image-20240609141538939

image-20240609141635973

1.2 學習過程

image-20240609142309090

floppy 下垂的耳朵

pointy 尖耳朵

構建決策樹的第一個關鍵點:選擇哪一個特徵來劃分每個節點

image-20240609142554123

構建決策樹的第二個關鍵點:什麼時候停止劃分

  • 當節點獲得了100%的分類結果(When a node is 100% one class);
  • 當劃分節點會導致超過樹的最大深度(When splitting a node will result in the tree exceeding a maximum depth);
  • 當純度值的增長低於一定閾值(When improvements in purity score are below a threshold);
  • 當節點中案例數量低於一定閾值(When number of examples in a node is below a threshold)。

2.1 純度

熵:衡量一組資料不純程度的指標(Entropy as a measure of impurity)

image-20240609144055534

如圖,p1指代一組分類結果中貓的佔比(剩下的是狗);H(p1)是熵;圖中為熵與p1的關係;可見熵隨著純度的增大呈現先增大後減小的趨勢;在p1=0.5時(如,3個貓3個狗)熵達到最大值1,在p1分別為0(6個狗)和1(6個貓)兩個端點時,熵最小,值為0。
圖中熵函式的公式:

image-20240609145324463

首先定義集合中除了貓之外的小動物佔比:

\[p_{0} = 1 - p_{1} \]

熵函式:

\[H(p_{1}) = -p_{1}log_{2}(p1)-p_{0}log_{2}(p_{0}) \]

也可以記為:

\[H(p_{1}) = -p_{1}log_{2}(p_{1})-(1-p_{1})log_{2}(1-p_{1}) \]

  1. 為了計算,這裡設定:

    \[0log_{2}(0) = 0 \]

  2. 選用2為底數而非e或者10,是為了讓極大值為1,換成其它底數相當於現有函式影像上下等比例伸縮。

  3. Gini函式也可以用作熵函式,但本課簡單起見使用這裡介紹的entropy criteria函式

2.2 選擇拆分資訊增益

資訊增益(information gain):衡量從上一節點分裂出兩個節點後,這種分裂方法對應的熵的減少量(the reduction in entropy that you get in your tree resulting from making a split)。

image-20240609145748579

如果一個節點中有比較多的例項並且具有高熵,這比有一個節點中只有幾個例項具有高熵更加糟糕。因為熵作為雜質的度量,如果你有一個非常大而且不純的資料集,那麼比只有幾個例子和不純的樹的一個分支相比,熵會更加糟糕

image-20240609150807195

在根節點的使用上,在這三種可能的特徵選擇上,我們需要使用哪一種?

使用加權平均,在左右兩個子分支中,低熵還需要取決於這裡左右節點的例項。我們這裡計算的是熵的減少,而不知是左右子分支的熵。

熵最初在根節點處是 1,透過拆分得到比較低的熵值,這兩個值之間的差異是熵的減少。決定何時不再進行分裂的停止標準之一是熵的減少是否太小。這裡我們選擇用ear shape作為根節點來劃分,因為根節點這裡的熵減少的最多。

image-20240609151609317

資訊增益的計算公式:

\[Information = H(p_{1}^{root})-(w^{left}H(p_{1}^{left})+w^{right}H(p_{1}^{right})) \]

w_left 和 w_right:這兩個分別是左子節點和右子節點的權重,通常等於它們各自包含的樣本數量佔總樣本數量的比例。

2.3 整合

決策樹的計算過程:

  • 從樹的根節點的所有訓練例項開始
  • 計算所有特徵的資訊增益,選擇要拆分的特徵,提供最高的資訊增益
  • 根據所選擇的特徵將資料集拆分為兩個子集,並建立樹的左右分支,並將訓練例項分到左右兩側
  • 重複劃分直至達到了停止分裂的準則
    • When a node is 100% one class
    • When splitting a node will result in the tree exceeding a maximum depth
    • Information gain from additional splits is less than threshold
    • When number of examples in a node is below a threshold

image-20240609153244008

2.4 獨熱編碼 One-hot

現在構建了三個新特徵,而不是一個特徵採用三個可能的值。這裡每個特徵智慧採用兩個可能值中的一個1或者0

image-20240609153931508

如果一個特徵可以取k個可能的值,那麼在我的例子中k是三個,那麼我們將透過建立k個只能取值0或者1的二進位制變數來取代他

在這三個特徵中,一定有一個恰好為1,這就是為什麼稱為one-hot的原因。

採用one-hot編碼,可以讓決策樹採用兩個以上的離散值特徵,也可以將其應用於新的網路或者線性迴歸或者邏輯迴歸訓練。

2.5 連續有價值的功能

image-20240609180049266

當對權重特徵進行約束拆分的時候,我們應該考慮這個閾值的不同的值,選擇能夠帶來最好的資訊增益的那個。

image-20240609180651650

2.6 迴歸樹

image-20240609181014074

image-20240609181230989

這裡的加權平均方差和我們決定使用什麼分割時候用的加權平均熵,有著非常相似的作用

image-20240609181859253

選擇最小的加權方差

3.1 使用多個決策樹

使用單一決策樹可能會對資料中的微小變化高度敏感。

image-20240610094336831僅改變一個訓練例項就會導致演算法的決策樹不同

image-20240610094559484

3.2 有放回取樣

image-20240610095323634

構建多個隨機訓練集,這些訓練集都與我們原始的訓練集略有不同

image-20240610095715869

意義就是 好幾個 決策樹使用的訓練樣本都不太一樣 但是又都是屬於原來的訓練樣本

3.3 隨機森林

image-20240610100230360

image-20240610100659157

image-20240610100925976

where does a machine learning engineer go camping? In a random forest

3.4 XGBoost

決策樹最常用的一種方式

抽樣的時候不是從m個等機率樣本中選擇1/m的機率,而是讓我們更有可能選擇先前訓練的樹表現不佳的錯誤分類樣本

image-20240610102713122

第四列是預測,根據分類是否正確進行打勾

第二次迴圈需要做的是,把這些錯誤的放到十個例項中,當每次選擇的時候,都有更高的機會從這三個仍然錯誤的分類例項中選擇一個。

今天使用最廣泛的一種實現Boost的就是XGBoost

  • 開源
  • 高效
  • 很好的預設拆分標準和何時選擇停止拆分的標準
  • 內建了正則化防止過度擬合

image-20240610103424565

3.5 何時使用決策樹

決策樹和神經網路都是非常強大的學習演算法,如何選擇

Tree ensembles:

優點:

  • 表格(結構化)資料
  • Fast
  • 小型的決策樹可以是人類可以解釋的,可以方便列印檢視

缺點:

  • 比單個決策樹更加昂貴,計算預算有限,可能會使用單個決策樹

Neural Networks:

優點:

  • 所有種類的資料,包括結構的和非結構化資料(照片,影片,文字)等
  • 可以和遷移學習一起使用

缺點:

  • 慢,需要很長時間來訓練
  • 可以和遷移演算法一起
  • 可以和多個模型一起工作,這可能很容易將多個神經網路串起來

image-20240610104852616

如果你的模型 需要很多小時來訓練會限制完成迴圈並提升演算法效能的速度,但由於決策樹的訓練速度往往非常快,因此可以更快的進入此迴圈,並且可能更有效的提升學習演算法 的效能。

May the force be with you

相關文章