1. ReNomの構成

_images/structure.png

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

  • OS : Ubuntu 14.04.13 LTS
  • Python:2.7.11
  • Numpy:1.11.0

ユーザはクラウド環境に学習したいデータをアップロードし、ReNomを使用することになります。 ReNom バージョン 0.1 ではGPUを用いた計算は行っておらず、今後のアップデートで逐次機能の拡張を行っていきます。現状では以下のディープニューラルネットワークを構築するための関数が定義されております。

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

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

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

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

  • ニューラルネットワークレイヤ オブジェクト
  • モデル オブジェクト
  • オプティマイザ オブジェクト

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

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

オプティマイザオブジェクトは、様々な勾配降下アルゴリズムによって、各ニューラルネットワークレイヤオブジェクトのパラメータ更新量を計算します。モデルオブジェクトのみでも学習は行えますが、オプティマイザオブジェクトを使用することで、AdaGradやAdamといった勾配降下アルゴリズムを使用することができます。

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
train_data, label_data, test_data = load_some_data()    # データのロード

input_layer = Dense(unit = 784) # 入力層
middle_layer = Dense(layer = input_layer, unit = 100)   # 中間層
activation = Sigmoid(layer = middle_layer)      # 中間層の活性化関数
dropout = Dropout(layer = activation, dropout_ratio = 0.5)      # 中間層のドロップアウト
output_layer = Dense(layer = dropout, unit = 10)        # 出力層
loss = Soft_Max_Cross_Entropy(layer = output_layer)     # 出力層の誤差関数

opt = Sgd(input_layer, loss)    # 勾配降下法の定義

for i in range(epoch):  # 学習ループ
    opt.forward(train_data, label_data) # 順伝播計算
    opt.backward()      # 逆伝播計算
    opt.update()        # 重みの更新

opt.predict(test_data)  # テストデータの予測

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

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

1.2. データ表現方法

_images/mat1.png

ReNomでは、データを32bit浮動小数点型で扱います。ReNomでは、一次元データを扱う場合、バッチサイズをN、データの次元数をDとすると、データはN×Dの行列として扱われます。また、画像データを扱う場合は、画像の縦サイズをH、横サイズをW、チャネル数をCとした場合、N×H×W×Cのテンソルデータとして取り扱われます。 同様に、各ネットワーク内の重みパラメータも行列を用いて定義されます。行列のサイズは第L-1層のユニット数をJ、第L層のユニット数をIとすると、J×Iとなります。そのため、第L-1層のj番目のユニットから第L層のi番目のユニットへの入力にかける重みWjiを取得する場合、重み行列の第j,i成分を取得すればよいことになります。各層の重みはparameter関数によって得られる辞書オブジェクトからキーを指定して取得します。また、順伝播時の各層の出力はz関数を用いて、取得することができます。