何が起きていたか
ブルームフィルタでは非常に少ない部分しか 1 にならないので、サイズを極端に大きくした場合に訓練セットでは1回も 1 にならない入力層が出てくることが考えられます。(下図: 濃い色が1になったことがある入力層、薄い色が1になったことがない入力層)
学習時に1になったことがある入力だけが使用されているうちはいいのですが...
1回も 1にならなかった入力層がテストセットで 1になった場合、調整されていない重みが使用されることになるので、ニューラルネットからの出力は予測できないものになります。(下図)
解決のためのアイデア
生物学的なニューロンはたまにランダムに発火しているのだそうです。これをヒントにたまにランダムに1をとるようにすると重みが 0 に近い方に調整されて、予測可能な出力が得られるようになるのではないかと思われます。
それとは別にヘッブの法則などというのもあるので、使用されなかった重みを 0に近づけるような機構があると同様に問題の解決ができるかと思いますが、こちらは実装していません。(Weight decay をうまく使うといいかもしれません)
実装
Chainer を使って実装してみました。入力層を random_fireでラップすると、ランダムな位置に入力の最大値を加えた層が作られます。データオーギュメンテーションの一種だという説もありますが。