chainer.Link と chainer.Chain

Chainerにおいて、ニューラルネットワークを柔軟に構築するための重要な構成要素が chainer.Linkchainer.Chain です。これらはChainerのモデル定義における基本単位であり、階層的にニューラルネットワークを組み立てることを可能にします。


1. chainer.Linkとは

chainer.Link学習可能なパラメータ(重みやバイアス)を持つレイヤーや関数の基本クラスです。

特徴:

  • パラメータの保持と登録が可能です。

  • __init__() 内で self.add_persistent()self.add_param() を使用してパラメータを登録します。

  • 通常、forward()(または __call__())をオーバーライドして、入力から出力を計算します。

例:

python
import chainer import chainer.functions as F import chainer.links as L class MyLinear(chainer.Link): def __init__(self, in_size, out_size): super(MyLinear, self).__init__() with self.init_scope(): self.W = chainer.Parameter(initializer=chainer.initializers.Normal(), shape=(out_size, in_size)) self.b = chainer.Parameter(initializer=0, shape=(out_size,)) def __call__(self, x): return F.linear(x, self.W, self.b)

2. chainer.Chainとは

chainer.Chain は複数の Link を**まとめて構造化(階層化)**するためのクラスです。すなわち、ネットワーク全体(またはサブネット)を構成するためのコンテナのような役割を果たします。

特徴:

  • Link オブジェクトを self.add_link() または with self.init_scope(): ブロックで登録します。

  • __call__() メソッドを定義し、複数のリンクを順に適用する形でネットワークの計算を記述します。

  • 再帰的に Chain を入れ子にすることも可能です(Chain の中に別の Chain を入れる)。

例:

python
class MyMLP(chainer.Chain): def __init__(self, n_input, n_hidden, n_output): super(MyMLP, self).__init__() with self.init_scope(): self.l1 = L.Linear(n_input, n_hidden) self.l2 = L.Linear(n_hidden, n_output) def __call__(self, x): h = F.relu(self.l1(x)) return self.l2(h)

この MyMLP クラスは、入力層、隠れ層、出力層からなるシンプルな2層MLPを定義しています。


補足: ChainList との違い

Chainerには chainer.ChainList というクラスもあり、これは同種の複数の Link を順に保持するのに適しています(たとえばCNNのフィルタ層など)。一方、Chain は名前付きの複数の異なるリンクを保持する場合に向いています。


まとめ

機能 Link Chain
パラメータの保持 あり 子Linkとして間接的に保持
再利用性 単一レイヤーなどで使用される 複数のレイヤーを組み合わせて使用
用途 単体の学習可能なレイヤーの定義 複数のレイヤーの構成と制御
使用例 カスタムLinear, Conv2Dなど MLP, CNN, Encoder-Decoderなど

chainer.Linkchainer.Chain を理解し使いこなすことで、Chainerで柔軟かつ強力なニューラルネットワークモデルを構築できます。

生成日:2025/05/23