[ML] 機器學習技法:第十三講 Deep Learning

ML:基礎技法學習
Package:scikit-learn
課程:機器學習技法
簡介:第十三講 Deep Learning

比較

  • Shallow NNet
    • 較少的 hidden layers
    • 較有效率訓練
    • 較簡單的架構
    • 理論上足夠強大
  • Deep NNet
    • 非常多的 hidden layers
    • 難以訓練
    • 難以決定架構
    • 非常強大,理論上可做到任何想做的事
    • layer 較有意義
      • 因很多層,每層可只做簡單的事
        從簡單的 features 慢慢組合成 複雜的 features
        像是辨識數字,從 pixels -> 簡單筆畫 -> 部分區塊 -> 數字

Deep NNet Challenges

  • 如何決定架構
    • validation
    • 對問題的了解,例如: convolutional NNet 在影像上的運用
  • model 複雜度高
    • 通常不是問題,資料量通常夠多
    • regularization
      • dropout
        • 當一些神經元壞掉時,仍可正常工作
      • denoising
        • 輸入資料壞掉時,仍可正常工作
      • 架構加上 constraints ,例 CNN(convolutional NNet)
      • weight elimination
      • early stopping
  • 最佳化困難
    • pre-training
      • 小心地決定初始值,防止 local minimum
  • 計算複雜,特別是資料量太多
    • 更進步的硬體與計算架構,例如:平行處理 mini-batch with GPU

Autoencoder

  • 可用在 pre-training,
  • unsupervised learning technique
  • dd~d NNetgi(x)xi
  • d~<d:壓縮資料維度
  • 近似 identity function
  • error function i=1d(gi(x)xi)2
  • wij(1):encoding weights
    wji(2):dencoding weights
  • 通常令 wij(1)=wji(2) for regularization
weights 表示如何做特徵轉換,也算是一種 encoding,將之編碼成另一種表現方式
pre-training 時,並不希望 weights 會讓資料失真,導致下一層只能針對更少的特徵做處理
所以好的 weights 應當保留資料訊息,只是將之換個方式表達
故可訓練一個 dd~d NNetg(x)x,也就是 identity function
而 error function 為 i=1d(gi(x)xi)2
因希望壓縮資料,所以令 d~<d
因為資料並不需要 y,所以 Autoencoder 被歸類在 unsupervised learning technique
並設定 regularization 為 wij(1)=wji(2),但計算 backprop 務必考慮進去
利用這些特性
  • supervised learning
    • wij(1) 可運用在 pre-traning
  • unsupervised learning
    • g(x)x 的相似度
      • density estimation
      • outlier detection
    • d~ 的輸出結果可用來分類
若訓練一個 dd~d autoencoder 需 cdd~
然後在 dd(1)d(2)d(3)1 deep NNet 執行 pre-training
時間共需要 c(dd(1)+d(1)d(2)+d(2)d(3)+d(3))

denoising autoencoder

資料為 {(x~1,y1=x1),(x~2,y2=x2),,(x~N,yN=xN)} 在 autoencoder 上訓練
x~n=xn+noise
noise 也是 overfitting 的主因之一
可參考 [ML] 機器學習基石:第十三講 Hazard of Overfitting
那麼有沒有辦法減少 noise 呢?
比較直覺的想法是,移除有 noise 的資料不就好了
如果反其道而行,加入 noise 呢?聽起來很瘋狂
但也許可以利用 autoencoder 來做到這件事
將 autoencoder 訓練成非常 robust
不只可以 g(x)x,還可以 g(x~)xx~ 只是跟 x 略有不同而已
故加入資料並訓練之 {(x~1,y1=x1),(x~2,y2=x2),,(x~N,yN=xN)}
x~n=xn+noise,noise 來自人造的 noise
而這正是一種 regularization:data hinting

Principal Component Analysis

Linear Autoencoder or PCA
紅色表示兩者的差異
  1. x=1Nn=1Nxn
    且修正 xnxnx
  2. 計算 XTXd~ 個 top eigenvectors w1,w2,,wd~
  3. 回傳特徵轉換 Φ(x)=W(xx)
首先,先定義以下條件
移除常數項 x0=1 和 +1 那項,因不方便定義 Ein,如下,無法一連貫寫出式子
xd~×1=Wd~×(d+1)(1)x(d+1)×1x^d×1=Wd×(d~+1)(2)[1xd~×1] 並令兩邊的權重一樣,也就是 regularization 的作用
d~<d,不然會失去壓縮的本意
xd~×1=Wd~×d(1)xd×1x^d×1=Wd×d~(2)xd~×1=Wd×d~(2)Wd~×d(1)xd×1[wij(1)=wij(2)=wji]=Wd×d~(Wd×d~)Txd×1 故可得
Ein(W)=1Nn=1NxnWd×d~Wd~×dTxn2 又因為 SVD,其實 SVD 可被視為變換矩陣 A 的三個分解步驟:旋轉 VT,伸縮 Σ,再旋轉 U
可參考 奇異值分解 (SVD)
Wd×d~=Ud×dΣd×d~(Vd~×d~)TWd×d~Wd~×dT=Ud×dΣd×d~Vd~×d~T(Ud×dΣd×d~(Vd~×d~)T)T=Ud×dΣd×d~Vd~×d~TVd~×d~(Σd×d~)T(Ud×d)T[Vd~×d~TVd~×d~=I]=Ud×dΣd×d~(Σd×d~)T(Ud×d)T=Ud×dΓd×d(Ud×d)T 重新定義 Ein
Ein(W)=1Nn=1NxnWd×d~Wd~×dTxn2=1Nn=1NxnUd×dΓd×d(Ud×d)Txn2=1Nn=1NUIUTxnUΓUTxn2=1Nn=1NU(IΓ)UTxn2minW Ein=minU minΓ 1Nn=1NU(IΓ)UTxn2Γ 有關的,只有 (IΓ),然後該如何最小化呢?
U 是單位向量的集合,所以前面的 U 不影響最後結果的距離
所以可以簡化來看
minΓ 1Nn=1N(IΓ)(some vector)2 可以發現,當 (IΓ) 相減時,越多 0 超好
但因為 Γ 是對角線矩陣,且 rank d~
所以可得
Γ=[Id~×d~0(dd~)×(dd~)0(dd~)×(dd~)0(dd~)×(dd~)]d×d 重新寫下 Ein
minW Ein=minU minΓ 1Nn=1NU(IΓ)UTxn2=minU 1Nn=1NU(Id×d[Id~×d~0(dd~)×(dd~)0(dd~)×(dd~)0(dd~)×(dd~)]d×d)UTxn2=minU 1Nn=1NU[0d~×d~0(dd~)×(dd~)0(dd~)×(dd~)I(dd~)×(dd~)]d×dUTxn2=maxU 1Nn=1NU[Id~×d~0(dd~)×(dd~)0(dd~)×(dd~)0(dd~)×(dd~)]d×dUTxn2subject to unTun=1 利用 Lagrange 乘數法,且同之前,前面的 U 不影響最後結果的距離
L(U,λ1,λ2,,λd)=1Nn=1N[Id~×d~0(dd~)×(dd~)0(dd~)×(dd~)0(dd~)×(dd~)]d×dUTxn2+λ1(1u1Tu1)+λ2(1u2Tu2=1)++λd(1udTud)L(U,λ1,λ2,,λd)un=0=um(1Nn=1N[Id~×d~0(dd~)×(dd~)0(dd~)×(dd~)0(dd~)×(dd~)]d×dUTxn2+λ1(1u1Tu1)+λ2(1u2Tu2=1)++λd(1udTud))[only consider um]=um(1Nn=1NumTxn2+λm(1umTum))=um(1Nn=1NumTxnxnTum+λm(1umTum))=um(1NumT(n=1NxnxnT)um+λm(1umTum))=um(1NumTXXTum+λm(1umTum))=1N2XXTum2λmum=0
1N2XXTum=2λmum1NXXTum=λmumumXXT 的 eigenvector
基於最大化要挑選前 d~ 大的 λm,也就是 top eigenvectors
Wd×d~=Ud×dΣd×d~(Vd~×d~)T
V 任意,過程中可發現並不影響最佳值,故選擇 I
Σd×d~(Σd×d~)T=Γd×d 實際 12=1
所以 Σ 也只是看 Γ 有幾個 1 就有多少個 1
故得 W
Wd×d~=Ud×dΣd×d~(Vd~×d~)T=[eigenVXXT(1)eigenVXXT(d~)01×(dd~)]d×d[Id~×d~0(dd~)×d~]d×d~(Id~×d~)T=[eigenVXXT(1)eigenVXXT(d~)]d×d~ 事實上,這與 PCA 很類似
PCA 求的是最大化 Σ(variance after projection)
而 linear autoencoder 求的是最大化 Σ(maginitude after projection)2
所以若將輸入資料先扣掉平均 xnxnx
丟進 linear autoencoder 不就是 PCA 了
即然如此,干脆就回傳特徵轉換 Φ(x)=W(xx)
記得 linear autoencoder 為了跟 PCA 一致,有做了一些處理,像是移掉常數項之類的
所以兩者還是有點差異
而實務上 PCA 比較好一點,因有統計上的背景

程式碼

PCA Demo
  1. 1import matplotlib.pyplot as plt
  2. from mpl_toolkits.mplot3d import Axes3D
  3. from sklearn import datasets
  4. from sklearn.decomposition import PCA
  5.  
  6. # import some data to play with
  7. iris = datasets.load_iris()
  8. X = iris.data[:, :2] # we only take the first two features.
  9. y = iris.target
  10.  
  11. x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
  12. y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
  13.  
  14. plt.figure(2, figsize=(8, 6))
  15. plt.clf()
  16.  
  17. # 畫出原始資料
  18. plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1, edgecolor='k')
  19. plt.xlabel('Sepal length')
  20. plt.ylabel('Sepal width')
  21.  
  22. plt.xlim(x_min, x_max)
  23. plt.ylim(y_min, y_max)
  24. plt.xticks(())
  25. plt.yticks(())
  26.  
  27. fig = plt.figure(1, figsize=(8, 6))
  28. # 設定 3D 圖
  29. # elev 為看向 z plane 的仰角,此為 45度
  30. # azim 為 xy 平面轉的角度,此為 80度
  31. ax = Axes3D(fig, elev=45, azim=80)
  32. # 訓練並回傳 reduction 後的結果
  33. X_reduced = PCA(n_components=3).fit_transform(iris.data)
  34. ax.scatter(X_reduced[:, 0], X_reduced[:, 1], X_reduced[:, 2], c=y,
  35. cmap=plt.cm.Set1, edgecolor='k', s=40)
  36. ax.set_title("First three PCA directions")
  37. ax.set_xlabel("1st eigenvector")
  38. ax.w_xaxis.set_ticklabels([])
  39. ax.set_ylabel("2nd eigenvector")
  40. ax.w_yaxis.set_ticklabels([])
  41. ax.set_zlabel("3rd eigenvector")
  42. ax.w_zaxis.set_ticklabels([])
  43.  
  44. plt.show()1

參考

PCA and linear autoencoders: a better proof
Neural networks [6.4] : Autoencoder - linear autoencoder
主成分分析與低秩矩陣近似
Singular value decomposition
sklearn.decomposition.PCA

留言