前幾個月因為自主防疫多出幾天空閒,時間沒拿來追劇倒是追了幾天 AI 線上課程。這個年頭,線上免費資源之多,讓你除了人懶毅力不夠,已無學不會的藉口。(鳴... 人生好難)

意外發現許多大學有所謂「磨課師」課程。磨課師課程是 MOOCs 的音譯,MOOCs 是 Massive Open Online Courses 縮寫,意指大規模開放式線上課程,磨課師強調互動,比大學課堂錄影形式的開放式課程(Open CourseWare,OCW)更精緻生動,對求學意志力已不夠堅定,看線上課堂影片會線上打瞌睡的老人來說,更容易消化吸收。

政大磨課師平台找到一門蔡炎龍老師的 Python 實現人工智慧 ,課程內容還算淺顯易懂,數學部分點到為止(但人工智慧背後是滿滿的數學,想深入要有心理準備),讓本來對 AI 幾乎一無所知的我,對於神經網路、深度學習是怎麼一回事有了基本概念,甚至有能力自己訂個題目玩玩機器學習。

以下是看影片時抄的筆記,主要在記重點跟關鍵字,當作未來要深入學習的傳送點,分享給大家加減參考。

  • 神經網路:主要分為 NN、CNN、RNN。其他:強化學習、生成對抗模式
  • 人工智慧:問個好問題
  • 將問題化成函數(解答本),輸入 X 得到 Y。給一堆已知 X 對映已知答案 Y (訓練資料),機器學習具備遇到未知輸入值也能猜出答案的能力。
  • 訓練時將資料(考古題)分成兩組:訓練資料跟測試資料,一個用來調參數,一組用來驗證(Lost Function,差距愈小愈好)
  • 讓差距愈小愈好的方法:Gradient Descent (梯度下降) (在神經網路叫 Backpropagation)
  • 可以用 AI 解的問題:
    • 某天的股價?用前一週資料預測下一期
    • 某 MLB 選手在 2022 可以打幾支全壘打?用 t-1 年打擊資料測 t 年全壘打數 (RNN 會自動多看幾年)
    • 對話機器人 => 輸入目前的字,得到回答 (RNN 會自動找出規律)
    • AI 玩遊戲(自動駕駛、泡咖啡)
      遊戲畫面用 CNN+NN 找出最好動作
      強化學習: 畫面+動作 -> 函數 -> 評分
  • 字型缺字:用現存的字型生出不存在的字型 (CNN、VAE、GAN)
  • 標準 NN (Feedforward Fully-Connected Neural Network), input layer -> f (hidden layer) -> output layer
    一堆神經元構成網路,隱藏層有三層以上就叫深度學習,設計時決定要有幾層,每層幾個神經元
    每個神經元的動作都一樣,收到多個權重不同的輸入,送出一個輸出(傳給多個神經元)。 輸入乘權重(Weight)加總再加偏值(Bias),經激活函數(Activation Function)決定輸出,激活函數有三種:ReLU、Sigmoid、Gaussian
  • 學習方法:Backpropagation,θ 為 w 跟 b 集合,每個 θ 定義一個函數 Fθ,找出讓 Lost Function 最小的 θ
  • Lost Function = 所有誤差值的平方和 (MSE)
  • 假設權重只有一個 w 比較好想像,再推成多 w,原理相同。數學上用切線斜率(微分)決定該向左還是向右移:

    調整方向 w - η (Learning Rate,避免調過頭) * dL / dw 推導出 [w1,w2,b1] - η * [∂L/∂w1,∂L/∂w2,∂L/∂b1] (∂=偏微分) = [w1,w2,b1] - η * ▽L (Gridient 梯度)
  • NN 練習:手寫字 0 - 9 辦識,掃瞄手寫內容像素成為 28x28=784 陣列當成輸入,輸出 float[] r = new float[10], r[3] == 1 表示數字 3 機率為 100% (One-Hot Encoding) 784 維轉 10 維,10 維陣列加總要等於 1 (用 Soft Max,r[i] / Sum(r[0..9])
  • 資料來源:Modified National Institute of Standard and Technology (MNIST) 的手寫資料庫。(深度學習大師 Hinton 稱它為「機器學習的果蠅」) 訓練資料 6 萬筆、測試資料 1 萬筆
  • 兩個隱藏層,神經元數目隨便(例如 500 個)
  • Stochastic Grandient Descent: SGD, 用打亂順序資料去訓練,以免背答案
  • 使用 Keras
  • CNN Convolutional Neural Network,捲積雲神經網路。讓機器學習紅起來的關鍵,圖形辦識的超級天王
  • LeCun (FB 首席 AI 科學家)-Bengio-Hinton, Deep Learning 三巨頭 (2015 期刊發表文章)
  • 圖形識別 - 建立 Filter,每個 Filter 看一種特徵 (直線、橫線...)
  • Convolutional Layer - 做 Filter,8x8 圖片,3x3 像素矩陣乘 3x3 權重矩陣,內積取一個數字,得到一個相同大小矩陣(用一些技巧 6x6 升 8x8)
    Filter 一多,資料變很大
  • Max-Pooling Layer - 用投票減少資料量,2x2 取最大的(Max-Pooling),6x6 變 3x3, Convolution -> Max-Pooling -> Convolution -> Max-Pooling...
  • RNN Recurrent Neural Network - 有記憶的神經網路,把上次輸出資料當成本次輸入
  • 有名應用:對話機器人,f(目前的字) = 下個字 (前後文)

    翻譯、影片描述、生成一段文字、完成畫一半的圖
  • RNN 常見問題 - 前面部分調不到,改良:Long Short Term Memory (LSTM)、Gated Recurrent Unit (GRU)
  • 練習:IMDB 分析評論是好評或負評。IMDB 資料庫,訓練 25000 筆、測試 25000 筆
    1 萬個常用字 One-Hot Encoding -> Embedding 層 -> RNN 層:150 個 RNN Cell (LSTM) -> Desnse
    前置處理,前 100 個字,太短補 0,
  • Word Embedding 將 10000 維(1 萬常用字)變成 128 維
  • Loss 用 binary_crossentropy, Optimizer 用 adam
  • Sequential 傳統做法,線性堆疊,有一層錯,所有層都要重新定義
    md = Sequential()
    md.add(Dense(3, input_shape=(2,)))
    md.summary()
    md.add(Dense(2))
    md.add(Dense(3))
    md.summary()
    
  • 轉移學習:將訓練好模型的一部分搬到新模型
  • 資料不平均(Imbalance),例如:糖尿病資料來源,有病的佔多數,因為健康的人不會主動檢查
  • 不同設定 Sequential 的做法
    first_layer = [Dense(500, input_dim=784), 
                   Activation('sigmoid')]
    model = Sequential(fist_layer + second_layer + output_layer)
    # ....
    for layer in all_except_last:
        layer.trainable = False
    
    模型定義跟權重資料可分開儲存,重新組裝利用,已訓練過的參數直接用。例子:識別 0-9 模型改成識別 0 或 1,速度快 N 倍。
  • Keras 上一些 Pre-Trained 模型:
    • Xception
    • VGG16
    • VGG19
    • ResNet50
    • InceptionV3
    • InceptionResNetV2
    • MobileNet
    • DenseNet
    • NASNet
  • 用 Model 指令建立線性堆疊模型
    R^784 --f1--> R^500 --f2--> R^500 --f3-> R^10
    f_1 = Dense(500, activation='sigmoid')
    f_2 = Dense(500, activation='sigmoid')
    f_3 = Dense(10, activation='softmax')
    x = Input(shape=(784,))
    h_1 = f_1(x)
    h_2 = f_2(h_1)
    y = f_3(h_2)
    model = Model(x, y)
    model.summary()
    model.compile(loss='mse', optimizer=SGD(lr=0.1), metrics=['accuracy'])
    model.fix(x_train, y_train, batch_size=100, epochs=5)
    
  • 分歧再合併(Branch-and-Merge)
  • 自訂不具訓練權重的神經網路層
    TensorFlow 與 Python 類別撰寫,範例:計算平均值、抽樣功能
  • Varitional Autoencoder (VAE) 非監督式學習模型:會用到分歧-合併、抽樣函數
  • AutoEncoder Rn --Encoder-> Rm --Decoder-> Rn 先降維再升維
    x --Encoder-> h --Decoder-> x
    (h 稱為 Latent 變數、Latent 表示)
  • VAE 比 AutoEncoder 提供更好的視覺化表現(降維後的分群較符合預期)

    Loss 函數會用到訊息理論(Information Theory)


Comments

# by 小黑

黑哥真是多產 ~ 隨時都在學習或是在學習的路上,遠目

# by 小威

錯字: AutoEcnoder -> AutoEncoder

# by Jeffrey

to 小威,感謝指正。

# by Leo

黑大,這些都是免費課程嗎?

# by Jeffrey

to Leo, 我目前看到的開放課程都是免費的,但有些需要註冊登入。

Post a comment