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 

編集: 問題は正常化の欠如だったとのデータが非ゼロを中心としているようです。

Piecewise linear approximation to $y=\sqrt(x)$

私がゼロの場合:私は、区分的線形近似の並べ替えを生成するために、あなたのコードを取得することができますnoisy sqrt2

答えて

1

:訓練にデータをこれらの変換を適用した後、私は次のような結果を得るために管理しています-centreと正規化あなたの入力および出力レンジ:

# normalise range and domain 
x_train -= x_train.mean() 
x_train /= x_train.std() 
y_train -= y_train.mean() 
y_train /= y_train.std() 

プロットはそうのように生成されます

x = np.linspace(x_train.min(),x_train.max(),3000) 
y = np.dot(np.maximum(0, np.dot(x[:,None], Wxh) + bh), Why) + by 
import matplotlib.pyplot as plt 
plt.plot(x,y) 
plt.show() 
+0

正規化が含まれており、現在は本当にありがとうございます。私たちのデータセットを正規化してゼロ中心にすることが非常に重要である理由をいくつか直感できますか? – dlpyth

+1

私の推測では、あなたのReLUsがあなたのデータセット全体でつまづいていると思います。入力パターンに関係なく、非表示アクティベーションが常に同じ場合、出力は線形関数になります。あなたの入力の一部が否定的であることを確認することで、いくつかの隠されたユニットがあるかもしれないし、あるものがあるかもしれないので、隠れユニットの異なるセットはsqrt関数のさまざまな部分を学ぶことができます。 – wildwilhelm

関連する問題