2017-08-11 9 views
1

テキスト分類を行うバニラフィードフォワードニューラルネットワーク(2つの隠れレイヤーとソフトマックス出力レイヤー)があります。これはtflearnで実装されています。softmax出力レイヤーを持たないニューラルネットワークを使用したTflearnランキングドキュメント

softmaxの機能は、出力インスタンスを密度確率分布に変換して、入力インスタンスのうち最も確からしいクラスがどれであるかを判断することです。

分類の代わりに、ドキュメントをランク付けしたい(各クラスは確率ではなく「スコア」を持つ)。ですから、私のアプローチは出力レイヤーを正規化するのではなく、通常のレイヤー(シグモイド活性化機能付き)のみを使用しています。これにより、各文書のこのスコア(0と1の間)が得られます。

tf.reset_default_graph() 
    # Build neural network 
    net = tflearn.input_data(shape=[None, x_size]) 
    net = tflearn.fully_connected(net, self.HIDDEN_LAYER_SIZE) 
    net = tflearn.fully_connected(net, self.HIDDEN_LAYER_SIZE) 
    net = tflearn.fully_connected(net, y_size, activation='sigmoid') 
    net = tflearn.regression(net) 

    # Define model and setup tensorboard 
    model = tflearn.DNN(net) 
    return model 

私はソフトマックスの出力でモデルを訓練した場合、モデルはかなり正確である:

私が定義されたモデルは、このようなものです。しかし、私がS字状の出力活性化関数を変更した場合、私の得点は私が期待するほど正確ではありません(正しいクラスの得点が最高です)。場合によっては、スコアは完全に間違っています。

私の質問です:このアプローチは、ニューラルネットワークでテキストのランキングを行うには正しいですか? (なぜ、トレーニング中に何かが欠落しているか、いくつかのハイパーパラメータにチューニングが必要なのでしょうか、この方法でさらにトレーニングデータが必要なのですか?または、tflearnで何かがありますか?)

ありがとうございます! Ivan

答えて

1

あなたが解決しようとしている問題は、回帰の問題です。ネットワークの結果を、異なるカテゴリ(分類と呼ばれる)にマッピングするのではなく、(あなたの場合は0から1までの)連続的な値にしたいと考えています。一般的なルールとして

、説明変数のためにあなたは、出力層の活性化のために線形活性化(tflearnでリニア)またはReLU(0から∞までの範囲tflearnでrelu)を使用することをお勧めします。

vanishing gradient problemが原因で、ネットワークが出力レイヤーでSigmoidを有効に実行できない理由があります。 出力が1に近づくにつれて、シグモイドは非常に平坦になり、グラデーションは0に近くなり、バックプロパゲーションの学習速度は非常に遅くなります。

TL; DR:これは正常です。これは、勾配の消失の問題によるものです。リグレッションの代わりにlinearまたはReLUを使用してください。

関連する問題