概要
Chainer は、Preferred Networks が提供するニューラルネットワーク向けの機械学習フレームワークです。実際には、機械学習一般に汎用的に使うことができます。ネットで見かけるサンプルは複雑なニューラルネットワークを使ったものが多いので、まず Hello World! 的なプログラムを書いてみました。
Chainer のインストール
お試し程度であれば GPU は要らないので、
$ pip install --install-option="--cupy-no-cuda" chainer
とすると良いと思います。バージョン 1.22 の場合、いきなり GPU を使おうとして「GPU の環境がないよ!」とエラーになりました。上のようにして Chainer を再インストールしたところうまく行きました。
対象読者
- Chainer を機械学習に利用することに興味がある
- Python について基礎知識がある
- 関数の最小化手法について基礎知識がある
二次関数の最小化問題
y = x^2
という二次関数の最小化問題を考えてみます。答えは、$ x=0 $ のとき $ y $ は最小になる、ですね。これを Chainer に解かせてみましょう。
import numpy as np
import chainer
class Quadratic(chainer.Link):
def __init__(self):
super().__init__(
x=(1)
)
self.x.data = np.array([2], dtype = np.float32)
def fwd(self):
return (self.x * self.x)
model = Quadratic()
optimizer = chainer.optimizers.SGD(lr = 0.1)
optimizer.use_cleargrads()
optimizer.setup(model)
for i in range(80):
model.cleargrads()
y = model.fwd()
y.backward()
print("=== Epoch %d ===" % (i + 1))
print("model.x.data = %f" % model.x.data)
print("y.data = %f" % y.data)
print("model.x.grad = %f" % model.x.grad)
print()
optimizer.update()
このコードの肝は、optimizer.setup(model)
です。ここではchainer.optimizers.SGD
(確率的勾配降下法)を利用して関数の最小化を試みています。chainer.Optimizer クラスの setup メソッドは chainer.Link クラスのインスタンスを取ります。
chainer.Link
クラスを継承して Quadratic
クラスを作っています。
def __init__(self):
super().__init__(
x=(1)
)
self.x.data = np.array([2], dtype = np.float32)
この部分で、x=(1)
というのは、x が1次元ベクトル、つまりスカラーであることを伝えています。その後、x を2
(32ビット浮動小数点型)で初期化しています。Chainer では主に32ビット浮動小数点型を使用するようです。この 2
という数字はランダムな初期値で、他の数字でもかまいません。
y = model.fwd()
y.backward()
...
optimizer.update()
この部分では、
- y = model.fwd() で $ x ^ 2 $ の計算
- y.backward() で、$ x $ の傾き(grad)の計算
- optimizer.update() で、$ x $ の傾きに基づいて、$ x $ を更新
しています。
実行すると、
=== Epoch 1 ===
model.x.data = 2.000000
y.data = 4.000000
model.x.grad = 4.000000
=== Epoch 2 ===
model.x.data = 1.600000
y.data = 2.560000
model.x.grad = 3.200000
=== Epoch 3 ===
model.x.data = 1.280000
y.data = 1.638400
model.x.grad = 2.560000
...
=== Epoch 80 ===
model.x.data = 0.000000
y.data = 0.000000
model.x.grad = 0.000000
と、$ x = 0 $ (model.x.data = 0.000000
)に解が収束しているのがわかります。
Chainer の学び方
Chainer を始めるなら、まずは本家のチュートリアルがとてもわかりやすいです。
Introduction to Chainer
有志の方による和訳もあります(ただし、若干内容が古いようです)。
Chainer は本家のドキュメントも充実していますし、ソースコードも簡潔で読みやすいと感じました。チュートリアル→レファレンスマニュアル→ソースコードと読み進めていけばよいのではないでしょうか?
Python 言語自体や、Python の数値計算ライブラリ Numpy の知識も当然必要となります。ただ、どちらもインターネット上にいろいろ文献がありますので、プログラミングの知識のある方なら大きな問題はないかと思います。