1

relu activation関数に派生関数が含まれていないということはどのような影響を与えますか?勾配降下にreluを使用した場合の影響

How to implement the ReLU function in Numpyは、最大(0、行列ベクトル要素)としてreluを実装します。

勾配降下では、relu関数の派生を取っていませんか?

更新:Neural network backpropagation with RELU

から

この理解のテキストAIDS:

としてReLU関数が定義される:X> 0の出力はXである、すなわちf(x)が = max(0、x)

したがって、導関数f '(x)は実際には

x <の場合、出力は0であり、x> 0の場合、出力は1です。

微分f '(0)は定義されていません。したがって、通常は0に設定されているか、 は小さなeに対してf(x)= max(e、x)になるように活性化関数を変更します。

一般的に、ReLUは、整流器のアクティブ化 機能を使用するユニットです。つまり、他の隠しレイヤーと同じように動作しますが、tanh(x)、sigmoid(x)、または使用しているアクティブ化を除いて 以外は、 では代わりにf(x)= max(0、x)を使用します。

シグモイド が有効なマルチレイヤネットワークのコードを記述している場合、それは文字通り1行の変更です。 forward-または のバックプロパゲーションの変更はアルゴリズム的には何もありません。 の単純なモデルがまだ動作していない場合は、最初に戻ってから始めてください。 そうでなければ、ReLUsについての質問ではなく、NN全体を実装する についてです。

しかし、ニューラルネットワークのコスト関数は通常、活性化関数の派生を取るため、これはまだ混乱しています。

+0

これは、GD(wikiは*定義されていない*と呼ばれます)に関するすべての保証を失う可能性があることを意味します。 – sascha

+0

更新プログラム内のテキストは、質問に対処しません。(1):これはサブグラディエントです。 (2):サブグラディエントをSGDで使用することができます。プレーンなGDではない。 – sascha

答えて

1

標準的な答えは、ReLUへの入力がまったくゼロになることはめったにありません。たとえば、see hereです。したがって、大きな違いはありません。

具体的には、ReLUがゼロ入力を得るためには、層の重み行列の列全体が1つの層への入力の1行全体のドット積は正確にゼロでなければなりません。入力サンプルがすべてゼロの場合でも、最後の位置にバイアス項があるはずですので、これは起こっていません。

しかし、あなた自身でテストしたい場合は、ゼロでの導関数を0,0.5、として実装し、変更があるかどうか確認してください。

PyTorchのドキュメントは、1つの隠れたレイヤーとreluのアクティブ化を持つsimple neural network with numpy exampleを提供します。 ReLUのグラディエントの振る舞いを0に設定するための固定乱数シードと3つのオプションを使って下に再現しました。バイアス項も追加しました。

N, D_in, H, D_out = 4, 2, 30, 1 

# Create random input and output data 
x = x = np.random.randn(N, D_in) 
x = np.c_(x, no.ones(x.shape[0])) 
y = x = np.random.randn(N, D_in) 

np.random.seed(1) 

# Randomly initialize weights 
w1 = np.random.randn(D_in+1, H) 
w2 = np.random.randn(H, D_out) 

learning_rate = 0.002 
loss_col = [] 
for t in range(200): 
    # Forward pass: compute predicted y 
    h = x.dot(w1) 
    h_relu = np.maximum(h, 0) # using ReLU as activate function 
    y_pred = h_relu.dot(w2) 

    # Compute and print loss 
    loss = np.square(y_pred - y).sum() # loss function 
    loss_col.append(loss) 
    print(t, loss, y_pred) 

    # Backprop to compute gradients of w1 and w2 with respect to loss 
    grad_y_pred = 2.0 * (y_pred - y) # the last layer's error 
    grad_w2 = h_relu.T.dot(grad_y_pred) 
    grad_h_relu = grad_y_pred.dot(w2.T) # the second laye's error 
    grad_h = grad_h_relu.copy()   
    grad_h[h < 0] = 0 # grad at zero = 1 
    # grad[h <= 0] = 0 # grad at zero = 0 
    # grad_h[h < 0] = 0; grad_h[h == 0] = 0.5 # grad at zero = 0.5 
    grad_w1 = x.T.dot(grad_h) 

    # Update weights 
    w1 -= learning_rate * grad_w1 
    w2 -= learning_rate * grad_w2 
関連する問題