

chainerのNStepBiLSTMにはdropout率の引数があると思いますが、

0 → 全くdropoutしない  
1 → 全て0になる  
になるのでしょうか？

dropout=0としたところうまく動かなかったので、もしかして逆なのでは？と思って質問しました。

下のコードのdropout=args.dropoutのところです。

[code]

    L.NStepBiLSTM(n_layers=args.layers, in_size=100,\
                      out_size=args.hidden_size,dropout=args.dropout)
    
[/code]

よろしくお願いします。


CC BY-SA 4.0
2018-06-27T08:59:31.400
45100
2018-09-01T07:11:03.553
29087
question
python3 chainer
chainerのNStepBiLSTMのdropoutについて


<https://github.com/chainer/chainer/blob/master/chainer/functions/noise/dropout.py>

上記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

どちらの行からも「棄てる割合」であることが読み取れます。  
（読み取れませんか？ いえ、前後も含めれば読み取れますよね……？）

<https://github.com/chainer/chainer/blob/master/chainer/functions/connection/n_step_rnn.py>

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はベターだと思いますが、  
色々変えてみると良いかと思います。


CC BY-SA 4.0
2018-09-01T07:11:03.553
48004
2018-09-01T07:11:03.553
29946
45100
answer