ニューラルネットワークのユースケースの中には、2つの連続する層の間にすべてのニューロンが接続されているわけではありません。私のニューラルネットワークアーキテクチャでは、各ニューロンは、前の層のいくつかの予め指定されたニューロン(畳み込み層のようなパターンではなく、やや恣意的な場所)にのみ接続する層を持つ必要があります。これは、特定のグラフ上のデータをモデル化するために必要です。私はTheanoにこの "Sparse"レイヤーを実装する必要がありますが、私はTheanoのプログラミング方法に慣れていません。ニューラルネットワーク(Theano)で疎結合を実装する
Theanoでスパース接続をプログラミングする最も効率的な方法は、theano.tensor.nnet.blocksparse.SparseBlockGemvを使用することです。代わりに、多くの重みが0(=接続なし)に設定されているマトリクス乗算を行うことがありますが、各ニューロンが〜100000のうちの前のレイヤの2-6ニューロンにのみ接続されるため、SparseBlockGemv
と比べて非常に非効率的ですニューロン。さらに、100000x100000の重み行列は私のRAM/GPUには適合しません。したがって、誰かがSparseBlockGemv
メソッドまたは別の計算効率の良いメソッドを使用してスパース接続を実装する方法の例を提供できますか?
完全な例は、隠れ層の後(かつsoftmaxの前)に余分な層を拡張することであり、各ニューロンは前の層のニューロンのサブセットにしか接続していない。しかし、他の例も大歓迎です!
編集:大規模なアーキテクチャのほんの一部であるため、レイヤーはTheanoで実装する必要があります。
私は、SparseBlockGemvは一般的なスパースブロックマトリックス(BSRなど)ではなく、入力/出力の組み合わせが制限された大きなWマトリックスでのドット操作を意味することに気付きました。 – tdihp