1. 程式人生 > >自己如何實現一個全連線網路

自己如何實現一個全連線網路

自己如何實現一個全連線網路?

1. 目標

  1. 自己實現一個全連線網路(即,MLP(多層感知機)),並最終能在 MNIST 資料集上取得 95% 左右的準確率;
  2. 熟悉 BP(反向傳播的過程);
  3. 熟悉 BGD mini-BatchSGD 過程;

2. 難點

  1. 上述的 2 3 處有小坑(如果不細心的話);
  2. 機器學習的除錯不是程式碼的除錯!(後面再解釋);

3. How to do?

  • Are you ok? code 之前你真的準備好了嗎?
    • MLP
      • 此處假設你對它已經有所瞭解。如果你之前沒有接觸過,建議先從 Perceptron
        (感知機)入手
      • 這裡只規範一下表示
        MLP
    • BP
      • 提起 BP,不得不說下面的四個公式(建議自己推導一遍)
        BP
    • OK,理論就這麼多,是不是很簡單!
  • 既然使用 java,那就來點面向物件的思想
    • 這次 面向物件 ,應該考慮什麼呢?
      1. 整個 mlp 中有幾個物件?
      2. 什麼實體是可以擴充套件的?
    • 我是這麼設計的
      1. 先看一下類圖(idea自動生成的,組合關係沒有顯示出來)
        類圖
      2. Layer.class
        ,描述的是層的概念,mlp 是由它搭建的
        Layer.class
      3. Net.class,描述的整個全連線網路,其實它就是 mlp
        Net.class
      4. CostFunction.clss,是個介面,它是 代價函式 的抽象,新增新的代價函式只需要實現它
        CostFunction.clss
      5. ActivationFunction.class,是個介面,它是 啟用函式 的抽象,嘗試其他的啟用函式只需要實現它
        ActivationFunction.class
  • 是不是已經迫不及待的想 coding 了?OK Start!
  • 測試
    • 首先要確定測試方案。其實,在一開始就應該確定了,現在才確定有點違背 軟工
      。畢竟 just one, just paly 無所謂了
      1. 前面已經提到此處使用 MNIST 資料集,至於如何讀取可以看看我的上一篇,這裡不再贅述。
      2. 這裡的測試有兩個目標:1)程式能跑通~~;2)能達到 95% 左右的準確率。
    • 我的除錯過程
      1. 邏輯中涉及太多運算了,整個過程認認真真地,最終還是寫錯了一處下標。導致準確率為 9%(隨機)。1st failed
      2. 糾正後,準確率仍沒很大變化,難道還有錯誤?開始質疑自己!然而也發現了新需求:如何快速查錯?於是加入了 日誌邏輯(實現的有點生硬,沒有視為橫切邏輯)。
      3. 通過分析 日誌檔案,發現權重、偏置的改變過於規則化。於是,讓它們進行隨機初始化。然而,效果一般。2nd failed
      4. 幾近崩潰!崩潰!幾近要放棄!放棄!Why 靜下心來,查了許多資料。最終在使用 mini-BatchSGD 訓練方式後達到預期效果。++機器學習的除錯不是程式碼的除錯。。。++
  • 還需要點什麼(補充設計時遺漏的功能)
    • 模型的持久化
      1. 使用 javaSerializable 就可以輕而易舉地實現
    • 其他的暫時還沒想到。。。

4. END

What's the life?
What's the love?
Just do what you like.
Just do it
However, Some things don't just depend on you.