林軒田 機器學習基石作業的PLA與PLA Pocket
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:04Allen贊同數:1不贊同數:0留言數:6
1. 為什麼必須將X的資料集中第一行均設為1才能將PLA執行正確?
從X的觀點看這樣只是水平移動是沒影響的。
所以沒有設為1也是可以正確的。
然後你x0設為1後並沒有像老師所說的,Xi 遠大於 1,所以你更新的W0會每一次變動都會變動太大。
你的程式每一次運行都重新下載資料(主因)、重新打亂(次要)自然執行就比較慢了。
-
2020/03/17 上午 07:35Jeffrey贊同數:0不贊同數:0留言數:2
1. 先回答item4/item5:
網路參數的更新, 碰到有變化再更新是通常的作法, 每次更新在記憶體需求與CPU操作會頻繁
2. 關於 item6:
建議圖示化, 看看曲線是否已經趨近某一數值