質問: chainerのNStepBiLSTMにはdropout率の引数があると思いますが、 0 → 全くdropoutしない 1 → 全て0になる になるのでしょうか? dropout=0としたところうまく動かなかったので、もしかして逆なのでは?と思って質問しました。 下のコードのdropout=args.dropoutのところです。 ``` L.NStepBiLSTM(n_layers=args.layers, in_size=100,\ out_size=args.hidden_size,dropout=args.dropout) ``` よろしくお願いします。
回答: 上記chainerのgithubソースコード上のdropout関数の引数であるratioは デフォルト値0.5なので、「残る」のが50%と捉えても、「棄てる」のが50%と捉えても 矛盾がないため、私もしばしばどちらの意味だったのか忘れてしまいますが...... 同ソースコード上のDropoutクラスのコンストラクタ引数にあたるdropout_ratioは、 名前からして、「棄てる割合」であると覚えると、覚えやすいです。 (そしてdropout関数のratioは、そのままDropoutクラスのdropout_ratioへと渡されます) 実際、以下の2行がありまして、 scale = x[0].dtype.type(1. / (1 - self.dropout_ratio)) flag = numpy.random.rand(*x[0].shape) >= self.dropout_ratio どちらの行からも「棄てる割合」であることが読み取れます。 (読み取れませんか? いえ、前後も含めれば読み取れますよね......?) NStepBiLSTMのコンストラクタ引数であるdropoutは辿っていくと NStepRNNBaseのコンストラクタ引数を経て、 上記chainerのgithubソースコード上のn_step_rnn関数上にて dropout_ratioという引数にそのまま渡され、 その先では前述のdropout関数へとそのまま渡されます。 通りかかっただけではありますし、2ヶ月も前のご質問ではある様ですが、 他に回答している方もいなかったため、ご回答しておきました。 > > dropout=0としたところうまく動かなかったので、もしかして逆なのでは?と思って質問しました。 > > > なお、逆にdropout=1としてしまうと全て棄てることになり、むしろ動かないはずです。 ドロップアウト率は通常0.5が一般的とされますが、入り口付近では0.2だとか、 ある程度深い層では0.7付近でもよかったりします。 (ただ、n_step_rnn系の場合、設定箇所が1箇所しかない様ではありますが......) 何も見ずに無難なところで設定するなら0.5はベターだと思いますが、 色々変えてみると良いかと思います。