關於感知器規則、梯度下降和隨機梯度下降實現的說明
我對不同的感知器實現進行了一些試驗,並想確保我是否正確理解了“迭代”。
Rosenblatt 的原始感知器規則
據我了解,在 Rosenblatt 的經典感知器算法中,權重會在每個訓練示例之後同時更新
在哪裡是這裡的學習規則。目標和實際都是閾值(-1 或 1)。我將其實現為 1 次迭代 = 1 次遍歷訓練樣本,但權重向量在每個訓練樣本後更新。
我將“實際”值計算為
隨機梯度下降
然而,
target
與感知器規則相同,actual
不是閾值而是真實值。此外,我將“迭代”視為訓練樣本的路徑。SGD 和經典感知器規則都在這種線性可分的情況下收斂,但是,我在梯度下降實現方面遇到了麻煩。
梯度下降
在這裡,我檢查了訓練樣本並總結了 1 次訓練樣本的權重變化,然後更新了權重,例如,
對於每個訓練樣本:
…
在 1 次通過訓練集後:
我想知道,如果這個假設是正確的,或者我是否遺漏了什麼。我嘗試了各種(最多無限小)學習率,但從來沒有讓它顯示出任何收斂的跡象。所以,我想知道我是否誤解了某事。這裡。
謝謝,塞巴斯蒂安
您的更新中有幾個錯誤。我認為通常您會將當前權重的值與當前權重與先前權重之間的*差異混淆。*你有符號散落在不應該有的地方,而 += 你應該有 = 的地方。
感知器:
,
在哪裡是模型對訓練示例。
這可以被視為以下“感知器損失”函數*的隨機次梯度下降方法:
感知器損失:
.
.
由於感知器已經是SGD 的一種形式,我不確定為什麼 SGD 更新應該與感知器更新不同。使用非閾值編寫 SGD 步驟的方式,如果您預測的答案太正確,您將蒙受損失。那很糟。
您的批處理梯度步驟是錯誤的,因為您在應該使用“=”時使用了“+=”。為每個訓練實例添加當前權重。換句話說,你寫它的方式,
.
它應該是:
.
此外,為了使算法收斂於每個數據集,您應該按計劃降低學習率,例如.
- 感知器算法在感知器損失上與 SSGD並不完全相同。通常在 SSGD 中,在平局的情況下 (),, 所以,因此您將被允許不採取任何措施。因此,感知器損失可以最小化,這是沒用的。但是在感知器算法中,你需要打破平局,並使用次梯度方向如果你選擇了錯誤的答案。
所以它們並不完全相同,但是如果你假設感知器算法是一些損失函數的 SGD,並對損失函數進行逆向工程,那麼你最終會得到感知器損失。