「Chainerによる実践深層学習」を読みながら Chainer に入門した話

はじめに

「Chainerによる実践深層学習」という本を読みながら実際に chainer を触ってみました.

実際に書いたコードはこちらです.

翻訳モデルの実験で使用するデータはこちらを参考に取得しました.

書籍について

上記の本では Chainer の基本的な使い方から始まって,徐々に複雑なネットワークの構築方法へと解説が進んでいきます. Chainer は名前を知っている程度の状態から読み始めましたが,問題なく読みすすめられました.

出てくるモデルは自然言語処理に特化しています. 「実践」ということで理論面の解説は多少省略されていますが,実際に作る上で必要な説明は丁寧にされています. word2vec,RNN,LSTM,翻訳モデルが紹介されており,論文は見たことがあるけど実際に作ったことがなかったということもあって,個人的には楽しみながらコードを書くことができました.

コードの記述ミスや説明文との不一致もあります*1が,読みながら自分で修正していけるレベルです.

また出版後に入った (と思われる) Chainer の更新は当然反映されていませんので,新しい機能については公式のドキュメントChainer の examples を見ると良いです. training と evaluation をサポートする機能があったりして便利だなと思いました (上記の本を読みながらコードを書いた後だとなおさらそう感じます).

Chainer について

Chainer はモデル定義がわかりやすくてすごく使いやすいですね.正直驚きました.これは便利だ……

以下は本の解説に従って書いたコードですが,

class MyChain(Chain):

    def __init__(self):
        super(MyChain, self).__init__(
            l1=L.Linear(4, 3),
            l2=L.Linear(3, 3),
        )

    def __call__(self, x, y):
        fv = self.fwd(x)
        loss = F.mean_squared_error(fv, y)
        return loss

    def fwd(self, x):
        return self.l2(F.sigmoid(self.l1(x)))

あとは optimizer に setup して,

model = MyChain()
optimizer = optimizers.SGD()
optimizer.setup(model)

# training loop
    ...
    model.zerograds()       # 1.15 から cleargrads に変わったようです
    loss = model(x, y)
    loss.backward()
    optimizer.update()

すればパラメータが更新されます.更新処理を自分でゴリゴリ書かなくてもいいのか……

本を読み終わった後で Chainer Tutorial の方を見たのですが,学習や評価のフェーズをサポートする機能もあるみたいです.

あと Caffe のモデルデータをそのまま使うことができるため,既存のモデルを活用することもできます.

おわりに

この手のフレームワークを触るのはこれが初めてだった*2ので,まさかここまで便利なものだとは思っておらず驚きました.

これを機に他のフレームワークを調べつついろいろと試してみようと思います.

*1:正誤表はこちらですが,自分の勘違いや読み違いでなければ,ここに載っていないものもあります

*2:多変量解析がメインだったので Neural Network 系は本を読んだくらいだった