0
私の目標は、単変量平方根関数を近似できる単一の隠れ層(ReLU活性化あり)を持つニューラルネットワークを作成することです。 私はnumpyのでネットワークを実装している、また、勾配のチェックをした、すべてが結果を除き、罰金のようだ:何らかの理由で私は、線形近似を得ることができ、このように:noisy sqrt approx単変量回帰のためのニューラルネットワークnumpyでの線形結果のみを与える
はせずに、ハイパーを変更しようとしました任意の成功。何か案は?
import numpy as np
step_size = 1e-6
input_size, output_size = 1, 1
h_size = 10
train_size = 500
x_train = np.abs(np.random.randn(train_size, 1) * 1000)
y_train = np.sqrt(x_train) + np.random.randn(train_size, 1) * 0.5
#initialize weights and biases
Wxh = np.random.randn(input_size, h_size) * 0.01
bh = np.zeros((1, h_size))
Why = np.random.randn(h_size, output_size) * 0.01
by = np.zeros((1, output_size))
for i in range(300000):
#forward pass
h = np.maximum(0, np.dot(x_train, Wxh) + bh1)
y_est = np.dot(h, Why) + by
loss = np.sum((y_est - y_train)**2)/train_size
dy = 2 * (y_est - y_train)/train_size
print("loss: ",loss)
#backprop at output
dWhy = np.dot(h.T, dy)
dby = np.sum(dy, axis=0, keepdims=True)
dh = np.dot(dy, Why.T)
#backprop ReLU non-linearity
dh[h <= 0] = 0
#backprop Wxh, and bh
dWxh = np.dot(x_train.T, dh)
dbh = np.sum(dh1, axis=0, keepdims=True)
Wxh += -step_size * dWxh
bh += -step_size * dbh
Why += -step_size * dWhy
by += -step_size * dby
編集: 問題は正常化の欠如だったとのデータが非ゼロを中心としているようです。
私がゼロの場合:私は、区分的線形近似の並べ替えを生成するために、あなたのコードを取得することができますnoisy sqrt2
正規化が含まれており、現在は本当にありがとうございます。私たちのデータセットを正規化してゼロ中心にすることが非常に重要である理由をいくつか直感できますか? – dlpyth
私の推測では、あなたのReLUsがあなたのデータセット全体でつまづいていると思います。入力パターンに関係なく、非表示アクティベーションが常に同じ場合、出力は線形関数になります。あなたの入力の一部が否定的であることを確認することで、いくつかの隠されたユニットがあるかもしれないし、あるものがあるかもしれないので、隠れユニットの異なるセットはsqrt関数のさまざまな部分を学ぶことができます。 – wildwilhelm