Advanced Learning Algorithms
week1
1.1 神經元和大腦
1.2 需求預測
構建自己神經網路的時候:需要決定隱藏層的個數和每個隱藏層的神經元個數
1.3 影像感知
畫素的亮度值從0~255變化
人臉識別:訓練一個神經網路,以一個特徵向量作為輸入,輸出圖片中人的身份
2.1 神經網路中的網路層
如何構建神經元層
2.2 更復雜的神經網路
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]}\)的一個函式
...
3.1 使用程式碼實現推理 tensorflow
特徵向量x:溫度和持續時間
輸出:是否是好咖啡
3.2 tensorflow的資料形式
在處理線性迴歸和邏輯迴歸的課程裡,我們使用一維向量來表示輸入特徵x,對於tensorflow使用矩陣來表示資料
tensorflow處理資料集較大,使用矩陣可以讓計算效率高一些
tensor是tensorflow團隊為了更加有效的儲存和執行矩陣計算建立的一種資料型別
從技術上來說,tensor比矩陣更通用,但是本課程會將tensor視為矩陣的一種表示方式
- 表示矩陣的tensorflow形式
- 表示矩陣的numpy形式
[!TIP]
如果想要獲取張量a1並將其轉換回numpy陣列可以使用函式a1.numpy來實現
3.3 搭建一個神經網路
這裡並沒有對第一層和第二層的變數進行顯式分配,透過sequential函式中。
下載tensorflow慢的話使用:
pip install --no-cache-dir tensorflow -i https://pypi.mirrors.ustc.edu.cn/simple/
4.1 單個神經網路上的前向傳播
4.2 前向傳播的一般實現
編寫一個函式來實現dense layer,即神經網路的單層
將前一層啟用和給定層的神經元的引數w和b作為輸入
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 強人工智慧
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 矩陣乘法及其實現
使用 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])
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
week2
1.1 Tensorflow實現
1.2 模型訓練細節
2.1 Sigmoid 啟用函式的替代方式
2.2 如何選擇啟用函式
2.3 為什麼模型需要啟用函式
3.1 多分類問題
3.2 softmax
3.3 神經網路的Softmax輸出
3.4 Softmax的改進實現
3.5 多個輸出的分類
4.1 高階最佳化方法
4.2 其他的網路層型別
5.1 什麼是導數(選修)
5.2 計算圖
5.3 大型神經網路案例
week3
1.1 決定下一步做什麼
1.2 模型評估
1.3 模型選擇和交叉驗證測試集的訓練方法
因為選擇d的過程是依賴於測試集資料的,這個d值可能恰好只是對於測試集來說的最優,但如果再用這個模型在測試集上評估效能,就不準確了
用驗證集確定最優權重和閾值,用測試集確定最優模型型別
也就是,在訓練集訓練出d1到d10,十個模型;在交叉驗證集上根據j值選擇最小的那個模型;然後再測試集考察他的泛化能力;
測試集用過之後你不能去改模型,測試集本來就是評估模型的泛化能力的
訓練集用於模型的學習和引數 w j調整;交叉驗證集用於模型選擇,例如調整超引數,(如決策樹的樹深)選擇最佳模型;測試集用於最終評估模型效能
2.1 透過偏差和方法進行判斷
J_train不高說明沒有高偏差問題,J_cv不比J_train差,說明沒有高方差問題。
2.2 正則化、偏差、方差
如何選擇λ
最小化成本函式得到w1 b1,然後可以計算交叉驗證誤差
2.3 制定一個用於效能評估的基準
2.4 學習曲線
高偏差是欠擬合,模型能力不夠,所以增加再多資料也沒有用
高方差理解為過擬合,也就是模型能力強,資料少 所以增加資料量有用
簡單來說就是增加training樣本量可以減少variance,但對減少bias沒作用
2.5下一步
high bias:獲取儘量多的特徵,新增儘量多的多項式特徵,降低λ
high variance:獲得儘量多的訓練資料、儘量少的特徵集合,提高λ
增加λ會迫使演算法適應更加平滑的函式
2.6 方差和偏差
3.1 機器學習開發的迭代
3.2 誤差分析
3.3 新增更多資料
3.4 遷移學習-使用其他任務中的資料
因為兩個網路的本質都是影像分類,所以在隱藏層的大部分工作都是相似甚至一樣的,所以直接把第一個網路的隱藏層拿過來用,對輸出層重新訓練就能實現新的功能。相當於螺絲刀的刀柄都是一樣的,但把十字刀刀頭換成一字刀作用就不一樣了
如果訓練集小,option1
如果訓練集稍大,option2
影像處理的早期是有一些共性的,所以可以借用引數
3.5 機器學習專案的完整週期
3.6 公平 偏見與倫理
4.1傾斜資料集的誤差指標
準確率(Precision
精確率:在預測結果中有多少是正類
透過誤差率可能並不能選擇出最好的演算法,因為這個誤差小的可能不是特別有用的預測。
在這種量(比如某種疾病的患病率1%)比較少的資料集上,我們不僅用err rate來判斷這個演算法的表現如何
召回率 Recall
召回率:在所有正類中有多少是沒被遺漏的
召回率可以幫助檢測學習演算法是否始終預測為0,如果你的演算法只列印y=0,那麼true positive將永遠為0,因為永遠不會預測positive
precision 一個預測pos裡真的pos佔比
recall 一個真的pos裡預測pos佔比
如果一直預測為0,沒有true positive ,那麼兩者的分子都將為0
如果一個演算法為0 precision或者0 recall都不是一個有用的演算法,如果一個演算法總是預測為0,那麼他的precision 是undefined,因為是0/0
4.2 精確率和召回率的權衡
在理想情況下我們喜歡具有高精度和高召回率的演算法,但在實際上,我們需要權衡準確率和召回率
高threshold :高準確率, 低召回率
低threshold:低準確率,高召回率
繪製不同閾值的精確率和召回率,可以讓我們選擇所需要的點
如果想自動權衡精確度和召回率,使用F1 score
將召回率和準確度合併為一個分數,F1只需檢視哪個分數最高
F1 score是一種強調 precision and recall中比較低的值,因為事實證明,如果演算法的精度和召回率非常低,說明二者沒有那麼有用。F1 score是一種計算平均分數的方法,更加關注較低的分數
F1 score是一種均值,調和均值是一種更強調較小值的平均值
week 4
1.1 決策樹模型
1.2 學習過程
floppy 下垂的耳朵
pointy 尖耳朵
構建決策樹的第一個關鍵點:選擇哪一個特徵來劃分每個節點
構建決策樹的第二個關鍵點:什麼時候停止劃分
- 當節點獲得了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)
如圖,p1指代一組分類結果中貓的佔比(剩下的是狗);H(p1)是熵;圖中為熵與p1的關係;可見熵隨著純度的增大呈現先增大後減小的趨勢;在p1=0.5時(如,3個貓3個狗)熵達到最大值1,在p1分別為0(6個狗)和1(6個貓)兩個端點時,熵最小,值為0。
圖中熵函式的公式:
首先定義集合中除了貓之外的小動物佔比:
熵函式:
也可以記為:
為了計算,這裡設定:
\[0log_{2}(0) = 0 \]選用2為底數而非e或者10,是為了讓極大值為1,換成其它底數相當於現有函式影像上下等比例伸縮。
Gini函式也可以用作熵函式,但本課簡單起見使用這裡介紹的entropy criteria函式。
2.2 選擇拆分資訊增益
資訊增益(information gain):衡量從上一節點分裂出兩個節點後,這種分裂方法對應的熵的減少量(the reduction in entropy that you get in your tree resulting from making a split)。
如果一個節點中有比較多的例項並且具有高熵,這比有一個節點中只有幾個例項具有高熵更加糟糕。因為熵作為雜質的度量,如果你有一個非常大而且不純的資料集,那麼比只有幾個例子和不純的樹的一個分支相比,熵會更加糟糕
在根節點的使用上,在這三種可能的特徵選擇上,我們需要使用哪一種?
使用加權平均,在左右兩個子分支中,低熵還需要取決於這裡左右節點的例項。我們這裡計算的是熵的減少,而不知是左右子分支的熵。
熵最初在根節點處是 1,透過拆分得到比較低的熵值,這兩個值之間的差異是熵的減少。決定何時不再進行分裂的停止標準之一是熵的減少是否太小。這裡我們選擇用ear shape作為根節點來劃分,因為根節點這裡的熵減少的最多。
資訊增益的計算公式:
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
2.4 獨熱編碼 One-hot
現在構建了三個新特徵,而不是一個特徵採用三個可能的值。這裡每個特徵智慧採用兩個可能值中的一個1或者0
如果一個特徵可以取k個可能的值,那麼在我的例子中k是三個,那麼我們將透過建立k個只能取值0或者1的二進位制變數來取代他
在這三個特徵中,一定有一個恰好為1,這就是為什麼稱為one-hot的原因。
採用one-hot編碼,可以讓決策樹採用兩個以上的離散值特徵,也可以將其應用於新的網路或者線性迴歸或者邏輯迴歸訓練。
2.5 連續有價值的功能
當對權重特徵進行約束拆分的時候,我們應該考慮這個閾值的不同的值,選擇能夠帶來最好的資訊增益的那個。
2.6 迴歸樹
這裡的加權平均方差和我們決定使用什麼分割時候用的加權平均熵,有著非常相似的作用
選擇最小的加權方差
3.1 使用多個決策樹
使用單一決策樹可能會對資料中的微小變化高度敏感。
僅改變一個訓練例項就會導致演算法的決策樹不同
3.2 有放回取樣
構建多個隨機訓練集,這些訓練集都與我們原始的訓練集略有不同
意義就是 好幾個 決策樹使用的訓練樣本都不太一樣 但是又都是屬於原來的訓練樣本
3.3 隨機森林
where does a machine learning engineer go camping? In a random forest
3.4 XGBoost
決策樹最常用的一種方式
抽樣的時候不是從m個等機率樣本中選擇1/m的機率,而是讓我們更有可能選擇先前訓練的樹表現不佳的錯誤分類樣本
第四列是預測,根據分類是否正確進行打勾
第二次迴圈需要做的是,把這些錯誤的放到十個例項中,當每次選擇的時候,都有更高的機會從這三個仍然錯誤的分類例項中選擇一個。
今天使用最廣泛的一種實現Boost的就是XGBoost
- 開源
- 高效
- 很好的預設拆分標準和何時選擇停止拆分的標準
- 內建了正則化防止過度擬合
3.5 何時使用決策樹
決策樹和神經網路都是非常強大的學習演算法,如何選擇
Tree ensembles:
優點:
- 表格(結構化)資料
- Fast
- 小型的決策樹可以是人類可以解釋的,可以方便列印檢視
缺點:
- 比單個決策樹更加昂貴,計算預算有限,可能會使用單個決策樹
Neural Networks:
優點:
- 所有種類的資料,包括結構的和非結構化資料(照片,影片,文字)等
- 可以和遷移學習一起使用
缺點:
- 慢,需要很長時間來訓練
- 可以和遷移演算法一起
- 可以和多個模型一起工作,這可能很容易將多個神經網路串起來
如果你的模型 需要很多小時來訓練會限制完成迴圈並提升演算法效能的速度,但由於決策樹的訓練速度往往非常快,因此可以更快的進入此迴圈,並且可能更有效的提升學習演算法 的效能。
May the force be with you