具体的なアルゴリズムとしては、元文書とAdversarial Exampleのノルムを閾値以下である・Watermarkの中に含まれるピクセルをのみを変更する、という制約の下でCTC loss functionと呼ばれる最終層で出力される値から正解のデータ列になりうる確率を元に計算する損失関数を最小化するように最適化問題を解いていく。論文では、再急降下法+モーメンタムのようにして文書ベクトルを更新していくと述べられている。
Squeeze: 各特徴マップはフィルタがかけられた局所的な部分の情報の集まりであり、大局的な情報を持っていない。そのためSqueeze処理でチャネルごとの統計情報を取得する。具体的にはGlobal Average Poolingをかける。もっと複雑な処理を使っても良いかもしれないと著者らは述べている。
SEブロックの役割を現実的なレベルで理解するための考察が述べられている。Global Average Poolingを行わないNoSqueezeというモジュールを構成し、精度を見るとSEブロックよりも下がる。これはSEブロックが特徴マップ全体の情報を活用していることを示している。また、Excitationの理解のために、ImageNetの異なるクラスの画像に対して特徴マップが各層でどのように反応しているかを見ている。
APIとしては単純にKMeansをMiniBatchKMeansに置き換えれば動きます。理論的な背景としては、論文 “Web Scale K-Means clustering” D. Sculley, Proceedings of the 19th international conference on World wide web (2010)に書かれており、ざっと読んだところランダムサンプリングしてクラスタの中心を計算していくのですが、KMeansとは異なり、各点ごとに中心を逐次的にアップデートしていくことで計算量を減らしています。
Recurrent dropout is not implemented in cuDNN RNN ops. At the cuDNN level. So we can’t have it in Keras.
The dropout option in the cuDNN API is not recurrent dropout (unlike what is in Keras), so it is basically useless (regular dropout doesn’t work with RNNs).
Actually using such dropout in a stacked RNN will wreck training.
その後、少し調べてみるとタイトルにある論文「Where to Apply Dropout in Recurrent Neural Networks for Handwriting Recognition?」を見つけたので読んでみました。この論文では、手書き文字認識タスクにRNNを使用して、DropoutをRNNの前、中、後に入れてみて汎化性能を試しています。何種類かのデータセットで実験を行っていますが、結果はまちまちで、傾向としてはRNNの前にDropoutを使うのが性能が良いことが多いが、中、後に入れる場合も性能が良くなることがあり何とも言えない感じの結論となっています。ただ、著者らは複数層のRNNモデルに対しても実験を行っており、その場合にはネットワークの最初と最後にDropoutを入れるのが良い性能の傾向があると結論付けています。