logo
Loading...

林軒田 機器學習基石作業的PLA與PLA Pocket - Cupoy

https://github.com/Gaprs/Machine-Learning-Foundati...

林軒田 機器學習基石作業的PLA與PLA Pocket

2020/03/14 下午 06:14
機器學習共學討論版
Gaprs
觀看數:165
回答數:2
收藏數:1

https://github.com/Gaprs/Machine-Learning-Foundations/blob/master/PLA_Pocket.py


嗨~想請教關於PLA與PLA pocket的一些問題,附上我的程式碼

對於演算法的部分我沒有問題,只是在實現的時候遇到了一些困難以及在debug的時候有一些問題想問,如果有人有做過該題目是否能夠幫助我解惑呢?

[問題有點長,不好意思><]


1. 為什麼必須將X的資料集中第一行均設為1才能將PLA執行正確?

例如原本給的X資料可能是 X = [ [2,3,4,5],

                                                      [5,6,7,8],

                                                      [3,4,5,6] ]

但必須將每個資料前面設為1,X = [ [1,2,3,4,5],

                                                             [1,5,6,7,8],

                                                             [1,3,4,5,6] ]


2. 我的答案在PLA的部分都有正確跑出0.4的答案,但我不確定這個答案是否是正確的,畢竟題目的選項是0.3-0.5之間?


3. 在PLA pocket的部分我在debug很多天之後跑出自己最佳的解答0.23但正確答案是<0.2...我始終跑不出這麼精確的數字,想請問我的程式是否在哪個環節出錯了呢?


4. 在PLA 更新W的部分,我如果再遇到wx != y的資料時就立刻更新w,跟我如果跑完全部的X,發現有錯才更新的話,似乎結果會完全不同?但根據PLA演算法的想法是有錯才修正,所以似乎是只要遇到wx != y就直接更新W(t+1) = W(t) +XY,而且對於準確性來說應該也是直接更新才會比較精確?

5. 在PLA pocket更新W的部分,大概問題同(4)差不多,都是在更新w遇到的困惑,

我目前的做法是有兩個W分別是w, w_test,當每次遇到錯誤就去更新w_test,檢查完全部的X資料集後,再去比較目前最佳w與w_test對於X資料集的錯誤次數,若w_test表現比較好就取代目前最佳的w。

但在更新w_test的過程中,我發現:

(1)在檢查完全部的X資料集,若遇到有錯就立刻更新並且break迴圈去與目前最佳w比較錯誤次數若是表現比較好就取代,若不是則反之。

(2)在檢查完全部的X資料集,每次遇到錯誤就更新一次w_test,檢查完後再用最後的w_test去跟目前最佳w比較錯誤次數若是表現比較好就取代,若不是則反之。

跑出來的答案就會不一樣,我比較直觀的想法是,能夠更新越多次,對於模型來說就能取得更好的結果,因此我最後選擇(2)的方式,只是我最後跑出來的結果還是跟該題目的解答不一樣...

6.請問執行PLA跟PLA pocket是否都需要花費較長時間呢? 我知道取決於repeat跟train的次數,train的次數越高會得到一個較好的模型,repeat的次數較多次會得到一個較客觀的結果,畢竟每次都是隨機打亂資料集在去更新w,若是以這個題目來說的話,是否有用更少迴圈就能將PLA跑完的方式呢,我的意思是說...以我的程式碼來說的話,是否還有能讓執行速度更快的方式呢?

像我跑repeat 2000次 trian model 50次就花了兩三個小時,所以我想說是不是我的coding太差所以才會跑這麼久...


謝謝撥冗看完的各位><

回答列表

  • 2020/03/15 上午 08:04
    Allen
    贊同數:1
    不贊同數:0
    留言數:6

    1. 為什麼必須將X的資料集中第一行均設為1才能將PLA執行正確?

    從X的觀點看這樣只是水平移動是沒影響的。

    所以沒有設為1也是可以正確的。

    然後你x0設為1後並沒有像老師所說的,Xi 遠大於 1,所以你更新的W0會每一次變動都會變動太大。



    你的程式每一次運行都重新下載資料(主因)、重新打亂(次要)自然執行就比較慢了。

  • 2020/03/17 上午 07:35
    Jeffrey
    贊同數:0
    不贊同數:0
    留言數:2

    1. 先回答item4/item5:

    網路參數的更新, 碰到有變化再更新是通常的作法, 每次更新在記憶體需求與CPU操作會頻繁


    2. 關於 item6:

    建議圖示化, 看看曲線是否已經趨近某一數值