0

私は、スカラー入力に基づく数学的演算選択nnモデルを生成しようとしています。操作は、nnによって生成されるsoftmaxの結果に基づいて選択されます。次に、最終出力を生成するためにこの演算をスカラ入力に適用しなければならない。これまでは、softmax出力にargmaxとonehotを適用してマスクを作成しました。このマスクは、実行可能なすべての操作から連結値マトリックスに適用されます(以下の疑似コードに示されています)。問題は、argmaxもonehotも区別できないように見えるということです。私はこれに新しいので、いずれかが高く評価されるだろう。前もって感謝します。TensorFlowで微分可能な演算の選択はどのようにして行いますか?

#perform softmax  
    logits = tf.matmul(current_input, W) + b 
    softmax = tf.nn.softmax(logits) 

    #perform all possible operations on the input 
    op_1_val = tf_op_1(current_input) 
    op_2_val = tf_op_2(current_input) 
    op_3_val = tf_op_2(current_input) 
    values = tf.concat([op_1_val, op_2_val, op_3_val], 1) 

    #create a mask 
    argmax = tf.argmax(softmax, 1) 
    mask = tf.one_hot(argmax, num_of_operations) 

    #produce the input, by masking out those operation results which have not been selected 
    output = values * mask 

答えて

0

私はこれが不可能だと信じています。これは、このpaperに記載されているハードアテンションに似ています。 Image captioningでは、各ステップでモデルが画像の特定の部分にのみフォーカスするようにするため、ハードアテンションが使用されています。難しい注意は区別できませんが、これを回避するには2つの方法があります。

1-強化学習(RL)の使用:RLは、意思決定を行うモデルを訓練するために行われます。損失関数は決定に使用されるsoftmaxに任意の勾配を逆伝播しませんが、RL技法を使用して決定を最適化することができます。簡略化した例では、損失をペナルティと見なして、ソフト・マックス・レイヤの最大値、ペナルティに比例したポリシー・グラディエントをノードに送信して、それが悪い場合に判定のスコアを下げることができます高損失で)。

2-ソフトアテンションのようなものを使用します:1つの操作のみを選択するのではなく、ソフトマックスに基づいて重み付けをしてください。その代わりに:

output = values * mask 

用途:

output = values * softmax 

さて、操作はソフトマックスはそれらを選択しないどのくらいに基づいてゼロにまで収束します。これはRLに比べて訓練が容易ですが、最終的な結果から選択されていない操作を完全に削除する必要がある場合は機能しません(完全にゼロに設定)。

これが役に立つかもしれないハードとソフトの注意について語っ別の答えです:https://stackoverflow.com/a/35852153/6938290

+0

は、あなたの答えをありがとうございました。私はソフトマックスそのものを試してみたところ、最大値は1に近く、小さな値は0になります。直ちにロジットの大きな違いを生み出すために、 'softmax = tf.nn.softmax(10000 * logits)'のようなものを使ってマスクを生成するのが妥当ですか、それとも重みを使ってnnを訓練するべきですか? – user59271

+0

私はあなたが重量を介してそれを選ぶためにnnを訓練するべきだと思います。 1000のような大きな数字を乗算する唯一の問題は、トレーニングプロセスの早い段階でソフトマックスを飽和させることです。大きなロジット値のsoftmaxのグラジエントはほぼ0なので、softmaxの背後の重みはトレーニングプロセスの開始時でさえも更新が少なくなります。 1000を乗算すると勾配が増加するはずですが、ソフトマックスの勾配の指数関数的な低下とは一致しません。 –

関連する問題