Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Chainer で Hello World!

More than 3 years have passed since last update.

概要

Chainer は、Preferred Networks が提供するニューラルネットワーク向けの機械学習フレームワークです。実際には、機械学習一般に汎用的に使うことができます。ネットで見かけるサンプルは複雑なニューラルネットワークを使ったものが多いので、まず Hello World! 的なプログラムを書いてみました。

Chainer のインストール

お試し程度であれば GPU は要らないので、

$ pip install --install-option="--cupy-no-cuda" chainer

とすると良いと思います。バージョン 1.22 の場合、いきなり GPU を使おうとして「GPU の環境がないよ!」とエラーになりました。上のようにして Chainer を再インストールしたところうまく行きました。

対象読者

  • Chainer を機械学習に利用することに興味がある
  • Python について基礎知識がある
  • 関数の最小化手法について基礎知識がある

二次関数の最小化問題

image

y = x^2

という二次関数の最小化問題を考えてみます。答えは、$ x=0 $ のとき $ y $ は最小になる、ですね。これを Chainer に解かせてみましょう。

quadratic.py
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 の知識も当然必要となります。ただ、どちらもインターネット上にいろいろ文献がありますので、プログラミングの知識のある方なら大きな問題はないかと思います。

elm200
ソフトウェアエンジニア。Python と機械学習。
http://elm200.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away