Chainer의 Hello World!

개요



Chainer은 Preferred Networks에서 제공하는 신경망을 위한 기계 학습 프레임워크입니다. 실제로는 기계 학습 일반적으로 범용적으로 사용할 수 있습니다. 넷에서 보이는 샘플은 복잡한 신경망을 사용한 것이 많기 때문에, 우선 Hello World! 적인 프로그램을 써 보았습니다.

Chainer 설치



시험 정도라면 GPU가 필요 없기 때문에,
$ pip install --install-option="--cupy-no-cuda" chainer

그렇다면 좋다고 생각합니다. 버젼 1.22 의 경우, 갑자기 GPU 를 사용하려고 하면 「GPU 의 환경이 없어!」라고 에러가 되었습니다. 위와 같이 Chainer를 다시 설치했는데 잘 갔습니다.

대상 독자


  • Chainer를 기계 학습에 사용하는 것에 관심이 있습니다
  • Python에 대한 기본 지식이 있습니다
  • 함수 최소화 기법에 대한 기초 지식이 있습니다

  • 2차 함수 최소화 문제




    y = x^2
    

    라는 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 메소드는 찻잔 r. 인 k 클래스의 인스턴스를 취합니다.
    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에 대한 지식도 당연히 필요합니다. 다만, 어느쪽이나 인터넷상에 여러가지 문헌이 있기 때문에, 프로그래밍의 지식이 있는 분이라면 큰 문제는 없을까 생각합니다.
  • 좋은 웹페이지 즐겨찾기