Chainerで中間層を分岐させて学習してみる

Chainerでは、畳み込み層や全結合層、LSTM層など、様々な層が関数として利用できるようになっているため、誰でも簡単に自分でネットワークをカスタマイズすることが可能になっている。通常の深層学習(ディープラーニング)では、入力から中間層、出力の順に直列でネットワークが結合されているが、場合によっては中間層でネットワークを分岐させたいこともありうる。

具体的にどのような時かと言うことについては、詳しくは触れないが、こういう書き方もできるということを知っておくだけでも役立つかもしれない。

中間層で分岐して学習するためには

中間層の出力が、2つ以上の別の層の入力になるようにネットワークを形成すれば良いので、例を挙げると以下のように書ける。

例)

・・・
    def __init__(self, train=True):
        super(DNN, self).__init__(
            l11=L.Linear(none, 1024),
            l12=L.Linear(1024, 1024),
            l13=L.Linear(1024, 512),
            l23=L.Linear(1024, 512),
            l14=L.Linear(1024, 256),
            l15=L.Linear(256, 2),
        )
        self.train = train

    def __call__(self, x):

        h11 = F.relu(self.l11(x))
        h12 = F.relu(self.l12(h11))
        h13 = F.relu(self.l13(h12))
        h23 = F.relu(self.l23(h12))
        H_link=[]
        H_link.append(h13)
        H_link.append(h23)
        h14 = F.relu(self.l4(H_link))
        return self.l15(h14)
・・・

ここで例示したネットワークは、わかりやすくするために全て全結合層で構成したが、本来は複数の別の層を組み合わせることも可能だと思う。上のネットワークは、入力→1層目l11→2層目l12と進み、2層目の出力が2つの別の3層目l13とl23に入力されている。注目しなければいけないのが、4層目の入力で、通常の直列ネットワークならばそのまま手前の層の出力を入力として与えれば良いのに対し、今回は分岐した2つの層を考慮する必要がある。今回は、H_linkという配列に2つの3層目の出力を直列結合して、それを4層目の入力として与えているが、ここの処理は適宜変える必要があるかもしれない。

まとめ

今回はChainerで分岐したニューラルネットを構成するための基本的な考え方を解説してみた。実際は今回のような単純なネットワークにはならないことが多いため、あくまで理解の段階での参考資料として読んでいただけるとありがたい。

分岐したネットワークが結果にどのような影響を及ぼすのかは未だあまりはっきり論じられていないが、何らかの効果をもたらすことがあると個人的には思っている。ぜひ挑戦してみてほしい。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です