0

バックプロパゲーションを実行しようとしているニューラル ネットワーク (ディープ オートエンコーダー) を実装しました。ネットワークは、シグモイド活性化関数と出力層のソフトマックス活性化関数で構成されます。エラーを計算するには、クロス エントロピー エラー関数を使用します。データ入力は単語行列のバッグであり、単語をドキュメントの長さで割ってデータを正規化します。

極小値を見つけるために共役勾配法を使用しています。私の問題は基本的に、バックプロパゲーション中にエラーが発生していることです。勾配の計算が間違っていることと関係があると思いますか?

エラーと勾配を計算するコードを以下に示します。

def get_grad_and_error(self,weights,weight_sizes,x):

    weights = self.__convert__(weights, weight_sizes)
    x = append(x,ones((len(x),1),dtype = float64),axis = 1)
    xout, z_values = self.__generate_output_data__(x, weights)        

    f = -sum(x[:,:-1]*log(xout)) # Cross-entropy error function

    # Gradient
    number_of_weights = len(weights)
    gradients = []
    delta_k = None
    for i in range(len(weights)-1,-1,-1):
        if i == number_of_weights-1:
            delta = (xout-x[:,:-1])
            grad = dot(z_values[i-1].T,delta)
        elif i == 0:
            delta = dot(delta_k,weights[i+1].T)*z_values[i]*(1-z_values[i])
            delta = delta[:,:-1]
            grad = dot(x.T,delta)
        else:
            delta = dot(delta_k,weights[i+1].T)*z_values[i]*(1-z_values[i])
            delta = delta[:,:-1]
            grad = dot(z_values[i-1].T,delta)                
        delta_k = delta
        gradients.append(grad)

    gradients.reverse()
    gradients_formatted = []
    for g in gradients:
        gradients_formatted = append(gradients_formatted,reshape(g,(1,len(g)*len(g[0])))[0])

    return f,gradients_formatted

ネットワークの出力を計算するには、次の方法を使用します。

def __generate_output_data__(self, x, weight_matrices_added_biases):
    z_values = []

    for i in range(len(weight_matrices_added_biases)-1):
        if i == 0:
            z = dbn.sigmoid(dot(x,weight_matrices_added_biases[i]))
        else:
            z = dbn.sigmoid(dot(z_values[i-1],weight_matrices_added_biases[i]))    

        z = append(z,ones((len(x),1),dtype = float64),axis = 1)
        z_values.append(z)

    xout = dbn.softmax(dot(z_values[-1],weight_matrices_added_biases[-1]))
    return xout, z_values

シグモイド値とソフトマックス値を次のように計算します。

def sigmoid(x):
    return 1./(1+exp(-x))

def softmax(x):
    numerator = exp(x)
    denominator = numerator.sum(axis = 1)
    denominator = denominator.reshape((x.shape[0],1))
    softmax = numerator/denominator
    return softmax

どなたかお役に立てれば幸いです。上記の情報について詳しく説明する必要がある場合はお知らせください。ありがとう。

4

0 に答える 0