Change History

version 2.0.0 ⇒ version 2.0.1

Trainerクラスを追加.

version 1.2 ⇒ version 2.0.0

version 1.2 から2.0への変更点は以下のとおりです.

Changes version 1.2 version 2.0

1- Modelクラス名の変更

Model Sequential

2- Inputレイヤ削除

Inputレイヤが必要

Inputレイヤが不必要

3- 重みパラメータ初期化のタイミング

モデルのインスタンス化時

最初の順伝播時

4- 重みパラメータの属性名

parameters params

5- 学習ループ内における”with block”の必要性

必要なし

必要

6- 誤差関数の定義場所を変更

Modelの内部

Modelの外部

7- 誤差逆伝播を実行するメソッドの名前

backward grad

8- updateメソッドを持っているクラス

Model Node

9- Optimizerクラスの使い方

Modelクラスをラップして使用

updateメソッドと共に使用

1- Modelクラス名の変更

Version 1.2においてニューラルネットワークを定義するために使用していたModelクラスは、version 2.0においてSequentialという名前に変更されました.

Example

# Version.2
model = Model([
        Input(10),
        Dense(100),
        Relu(),
        Dense(10),
        MeanSquaredError()
     ])
# Version.0
model = Sequential([
        # Input(10), Input layer has deleted.
        Dense(100),
        Relu(),
        Dense(10),
        # MeanSquaredError() Loss function will be defined at train loop.
     ])

2-Inputレイヤ削除

上の例で示しているようにversion 2.0ではInputレイヤが必要なくなりました.

3- 重みパラメータの初期化タイミング

Inputレイヤの削除に伴い、重みパラメータを初期化するタイミングが変更されました.version 1.2では下の例で示すようにニューラルネットワークModelをインスタンス化するときに重みパラメータが初期化されていましたが、version 2.0 では一回目の順伝播が実行されるときに重みの初期化が行われます.

Example

# Version 1.2
model = Model([
        Input(10),
        Dense(100),
        Relu(),
        Dense(10),
        MeanSquaredError()
     ])
# You can access the weight parameters because weights are already initialized.
print(model[1].parameters["w"])
# Version 2.0
model = Sequential([
        Dense(100),
        Relu(),
        Dense(10),
     ])
# Weight parameters have not been initialized yet.
z = model(x)   # Execute forward propagation
print(model[0].params["w"])  # After execution, parameters can be accessed.

4- 重みパラメータの属性名

version 2.0では重みパラメータの属性名が parameters から params へ変更されました.

5- 学習ループ内における”with block”の必要性

version 2.0 では自動微分が実装されたことから、計算グラフが必要以上に生成され続けることを避けるため、計算グラフを作成可能な範囲をwithブロックを用いて制御する必要があります.

ReNom version 2.0 では “with train block” のブロック内で実行された演算について計算グラフが作成され、逆伝播による勾配の計算が可能になります.withブロックの外で行われた計算は、計算グラフが作られないので勾配の計算には考慮されません.

Example

# Version 1.2
loss = model.forward(x, y)
# Version 2.0
with model.train():
   z = model(x)
   loss = mean_squared_error(z, y)

6- 誤差関数の定義場所を変更

誤差関数は上の例のようにニューラルネットワークモデルの外に定義するよう変更されました.

7- 誤差逆伝播を実行するメソッドの名前

誤差逆伝播を実行するメソッド名が変更されました.さらに逆伝播メソッドを持つクラスも変更されました.version 1.2 では下の例のように、ニューラルネットワークModelクラスが順伝播、逆伝播、更新メソッドを持っています.version 2.0ではNodeクラスが逆伝播、更新メソッドを持つように変更されました.

バージョンの違いにより逆伝播計算の実行に使用するメソッド名とそのメソッドを持つクラスが変更されたことに注意してください.

Example

# Version 1.2
loss = model.forward(x, y)
model.backward()
model.update()
# Version 2.0
with model.train():
   z = model(x)
   loss = mean_squared_error(z, y)
gradients = loss.grad()
gradients.update()

8- updateメソッドを持っているクラス

上の例で示す通り、重みパラメータの更新に使用するupdateメソッドについてもメソッドの属するクラスが変更されました.

9- Optimizerクラスの使い方

version 1.2では勾配降下アルゴリズムを提供するoptimizerオブジェクトは以下の例の様にモデルオブジェクトをラップする様に使用していました.version 2.0では、optimizerオブジェクトは、updateメソッドの引数に与えて使用するよう変更されました.

Example

# Version 1.2
# Optimizer object wraps model object.
model = Sgd(Model([
        Input(10),
        Dense(100),
        Relu(),
        Dense(10),
        MeanSquaredError()
     ]), lr=0.1)
loss = model.forward(x, y)
model.backward()
model.update()
# Version 2.0
optimizer = Sgd(lr=0.1)
with model.train():
   z = model(x)
   loss = mean_squared_error(z, y)
gradients = loss.grad()
# Optimizer object is passed to update method.
gradients.update(optimizer)