Regression

Keras 中的簡單線性回歸

  • June 8, 2017

在查看了這個問題:嘗試使用 Keras 模擬線性回歸之後,我嘗試推出自己的示例,僅用於學習目的並培養我的直覺。

我下載了一個簡單的數據集並使用一列來預測另一列。數據如下所示:

電視數據

現在我剛剛創建了一個帶有單個單節點線性層的簡單 keras 模型,並繼續在其上運行梯度下降:

from keras.layers import Input, Dense
from keras.models import Model

inputs = Input(shape=(1,))
preds = Dense(1,activation='linear')(inputs)

model = Model(inputs=inputs,outputs=preds)
sgd=keras.optimizers.SGD()
model.compile(optimizer=sgd ,loss='mse',metrics=['mse'])
model.fit(x,y, batch_size=1, epochs=30, shuffle=False)

像這樣運行模型會讓我nan在每個時期都有損失。

鏈接到 jupyter 筆記本

所以我決定開始嘗試一些東西,如果我使用一個非常小的學習率 sgd=keras.optimizers.SGD(lr=0.0000001),我只會得到一個像樣的模型:

電視數據擬合

現在為什麼會這樣?對於我面臨的每個問題,我是否必須像這樣手動調整學習率?我在這裡做錯了嗎?這應該是最簡單的問題,對吧?

謝謝!

這可能是因為沒有進行標準化。神經網絡對非標準化數據非常敏感。

一些直覺:當我們試圖找到我們的多維全局最小值時(如在隨機梯度下降模型中),在每次迭代中,每個特徵都會以某種力(向量的長度)“拉”到它的維度(向量方向)中)。當數據未標準化時,A 列值的一小步可能會導致 B 列發生巨大變化。

您的代碼使用您非常低的學習率來解決這個問題,這“標準化”了每一列的效果,儘管導致學習過程延遲,需要更多的時期才能完成。

添加此規範化代碼:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
x = sc.fit_transform(x)
y = sc.fit_transform(y)

並且只需刪除學習率參數 (lr) - 讓它為您明智地選擇一個自動值。我現在得到了和你一樣想要的圖表:)

引用自:https://stats.stackexchange.com/questions/284189

comments powered by Disqus