Chainerにおいて、ニューラルネットワークを柔軟に構築するための重要な構成要素が chainer.Link と chainer.Chain です。これらはChainerのモデル定義における基本単位であり、階層的にニューラルネットワークを組み立てることを可能にします。
1. chainer.Linkとは
chainer.Linkとはchainer.Link は学習可能なパラメータ(重みやバイアス)を持つレイヤーや関数の基本クラスです。
特徴:
-
パラメータの保持と登録が可能です。
-
__init__()内でself.add_persistent()やself.add_param()を使用してパラメータを登録します。 -
通常、
forward()(または__call__())をオーバーライドして、入力から出力を計算します。
例:
2. chainer.Chainとは
chainer.Chainとはchainer.Chain は複数の Link を**まとめて構造化(階層化)**するためのクラスです。すなわち、ネットワーク全体(またはサブネット)を構成するためのコンテナのような役割を果たします。
特徴:
-
Linkオブジェクトをself.add_link()またはwith self.init_scope():ブロックで登録します。 -
__call__()メソッドを定義し、複数のリンクを順に適用する形でネットワークの計算を記述します。 -
再帰的に
Chainを入れ子にすることも可能です(Chainの中に別のChainを入れる)。
例:
この MyMLP クラスは、入力層、隠れ層、出力層からなるシンプルな2層MLPを定義しています。
補足: ChainList との違い
ChainList との違いChainerには chainer.ChainList というクラスもあり、これは同種の複数の Link を順に保持するのに適しています(たとえばCNNのフィルタ層など)。一方、Chain は名前付きの複数の異なるリンクを保持する場合に向いています。
まとめ
| 機能 | Link |
Chain |
|---|---|---|
| パラメータの保持 | あり | 子Linkとして間接的に保持 |
| 再利用性 | 単一レイヤーなどで使用される | 複数のレイヤーを組み合わせて使用 |
| 用途 | 単体の学習可能なレイヤーの定義 | 複数のレイヤーの構成と制御 |
| 使用例 | カスタムLinear, Conv2Dなど | MLP, CNN, Encoder-Decoderなど |
chainer.Link と chainer.Chain を理解し使いこなすことで、Chainerで柔軟かつ強力なニューラルネットワークモデルを構築できます。
生成日:2025/05/23