1. ReNomの構成

../../_images/structure.png

このセクションではReNomの構成と動作環境について説明します。ReNomはPythonによってコーディングされており、Python2.7系上で動作します。 また基本的にReNomは種々のクラウドサービス環境を通して提供されています。ReNomの実行環境は、次のようになっております。

  • OS : Ubuntu 16.04.4 LTS
  • Python:2.7.12 (Anaconda 4.2.0)
  • Numpy:1.11.1

ユーザはクラウド環境に学習したいデータをアップロードし、ReNomを使用することになります。

  • 全結合型ニューラルネットワーク
  • 畳み込みニューラルネットワーク (GPU対応)
  • 再起型ニューラルネットワーク
  • 制限ボルツマンマシン

これらの関数を組み合わせることにより、様々な問題に対してディープニューラルネットワークを構築することができます。


1.1. プログラミングモデル

ReNomではニューラルネットワークオブジェクトをブロックのように積み重ねることで、 ディープなニューラルネットワークを簡単に定義することができます。ディープニューラルネットを構築、 学習させるには、次の三つの要素が必要になります。

  • Layer オブジェクト
  • Model オブジェクト
  • Optimizer オブジェクト

Layerオブジェクトには、重みパラメータやバイアスパラメータ、さらにそれらパラメータと入力されたデータに基づいて順伝播、 逆伝播計算を行う関数が定義されております。

Modelオブジェクトは、Layer オブジェクト同士のつながり方を保持するクラスになります。 Modelオブジェクトには、ニューラルネットワーク全体の順伝播計算や逆伝播計算を実行する関数が実装されています。

Optimizerオブジェクトは、様々な勾配降下アルゴリズムによって、各Layerオブジェクトのパラメータ更新量を計算します。 Modelオブジェクトのみでも学習は行えますが、Optimizerオブジェクトを使用することで、 AdaGradやAdamといった勾配降下アルゴリズムを使用することができます。

ここからは、ReNomを使ったコーディングのイメージを見ていきましょう。Modelオブジェクトによって定義されたニューラルネットワークを、 Optimizerオブジェクトを使用して、勾配降下法により学習を行います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
train_data, label_data, test_data = load_some_data()

# ニューラルネットワークモデル
model = Model(
    layers = [
        L.Input(unit = 784),            # 入力層
        L.Dense(unit = 100),            # 中間層
        L.Sigmoid(),                    # 活性化関数
        L.Dense(unit = 10),             # 出力層
        L.Soft_max_cross_entropy()      # 誤差関数
    ])
opt = O.Sgd(model)                      # 勾配降下法の定義

# 学習ループ
for i in range(epoch):
    opt.forward(train_data, label_data) # 順伝播計算
    opt.backward()                      # 逆伝播計算
    opt.update()                        # 重みの更新
# 推論/予測
opt.predict(test_data)                  # テストデータの予測

1行目では、データのロードを行っています。学習データ、教師データ、テスト用データはそれぞれ、ユーザが用意する必要があります。 ここでは、疑似的にデータをロードしているとします。 3行目から11行目までで、ニューラルネットワークを定義しております。ここで定義したネットワークは次のような3層ニューラルネットワークです。

ReNomでは活性化関数やドロップアウトなどの処理を、全結合層や畳み込み層と同様にLayerオブジェクトとして定義しています。 そのため、層を積み重ねるだけで、様々なネットワークを構築できます。 14行目では学習を行うためのOptimizerを定義しております。Optimizerには、確率的勾配法やAdaGradなどの手法が用意されております。 Optimizerのコンストラクタは、引数としてModelオブジェクトをとります。 ModelオブジェクトはLayerオブジェクトのリストを引数にとり、インスタンス化されます。 学習ループでは、epoch回数分の順伝播、逆伝播、重み、バイアスパラメータの更新を行っています。 学習されたネットワークを実際に使用するには、predict関数を使用します。


1.2. データ表現方法

../../_images/mat1.png

Figure 1: データ表現

ReNomでは、データを32bit浮動小数点型で扱います。ReNomでは、一次元データを扱う場合、バッチサイズをN、データの次元数をDとすると、 データはN×Dの行列として扱われます。また、画像データを扱う場合は、画像の縦サイズをH、横サイズをW、チャネル数をCとした場合、 N×C×H×Wのテンソルデータとして取り扱われます。

同様に、各ネットワーク内の重みパラメータも行列を用いて定義されます。 行列のサイズは第L-1層のユニット数をJ、第L層のユニット数をIとすると、J×Iとなります。 そのため、第L-1層のj番目のユニットから第L層のi番目のユニットへの入力にかける重みWjiを取得する場合、 重み行列の第j,i成分を取得すればよいことになります。各層の重みはparameter関数によって得られる辞書オブジェクトからキーを指定して取得します。 また、順伝播時の各層の出力はz関数を用いて、取得することができます。


1.3. GPU

機械学習では、より複雑で、多層なネットワーク構造が求められるようになってきております。 複雑なネットワーク構造になると、畳み込み層で行われる演算処理が膨大になり、メモリの最適化と、 計算速度を上げる事が望まれます。

ReNomでは、NVIDIA社が提供するDeep Learning SDKである、cuDNN 5.0 をサポートしております。 これにより画像認識など、高速な演算処理が望まれる場合において威力を発揮します。

*畳み込みニューラルネットワークをGPUでご使用になる場合は、下記のライブラリが追加で必要となります。

  • pycuda (githubからダウンロードしGCC4.9でビルド)
  • scikit-cuda