Theano-trivial-training-example

提供:Dev Guides
移動先:案内検索

Theano-簡単なトレーニングの例

Theanoは、最適な結果を得るためにコストと勾配を繰り返し計算する必要があるニューラルネットワークのトレーニングに非常に役立ちます。 大規模なデータセットでは、これは計算集約的になります。 Theanoは、先ほど見た計算グラフの内部最適化により、これを効率的に行います。

問題文

次に、Theanoライブラリを使用してネットワークをトレーニングする方法を学習します。 4つのフィーチャデータセットから開始する簡単なケースを取り上げます。 特定の重み(重要度)を各機能に適用した後、これらの機能の合計を計算します。

トレーニングの目標は、合計が目標値100に達するように、各機能に割り当てられた重みを変更することです。

sum = f1 *w1 + f2* w2 + f3 *w3 + f4* w4

ここで、 f1f2 、…​ はフィーチャー値であり、 w1w2 、…​ 重みです。

問題ステートメントをよりよく理解するために例を量子化します。 各機能の初期値を1.0とし、w1は 0.1w20.25w30.15w40.3 に等しいと仮定します。 重み値を割り当てる明確なロジックはありません。それは単なる直感です。 したがって、初期合計は次のようになります-

sum = 1.0 *0.1 + 1.0* 0.25 + 1.0 *0.15 + 1.0* 0.3

合計は 0.8 です。 ここで、この合計が100に近づくように重みの割り当てを変更し続けます。 現在の結果値 0.8 は、目標値である100からはかけ離れています。 機械学習の用語では、*コスト*を、目標値から現在の出力値を引いた差として定義します。通常は、誤差を大きくするために2乗します。 勾配を計算し、重みベクトルを更新することにより、各反復でこのコストを削減します。

このロジック全体がTheanoでどのように実装されているかを見てみましょう。

変数を宣言する

まず、入力ベクトルxを次のように宣言します-

x = tensor.fvector('x')

ここで、 x はfloat値の単一次元配列です。

以下に示すように、スカラー target 変数を定義します-

target = tensor.fscalar('target')

次に、上記の初期値で重みテンソル W を作成します-

W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')

Theano式の定義

今、次の式を使用して出力を計算します-

y = (x * W).sum()

上記のステートメントの x および W はベクトルであり、単純なスカラー変数ではないことに注意してください。 私たちは今、次の式でエラー(コスト)を計算します-

cost = tensor.sqr(target - y)

コストは、目標値と現在の出力の差を2乗したものです。

ターゲットからの距離を示す勾配を計算するには、次のように組み込みの grad メソッドを使用します-

gradients = tensor.grad(cost, [W])

次のように 0.1 の学習率をとることにより、 weights ベクトルを更新します-

W_updated = W - (0.1 * gradients[0])

次に、上記の値を使用して重みベクトルを更新する必要があります。 私たちは次の文でこれを行います-

updates = [(W, W_updated)]

Theano関数の定義/呼び出し

最後に、Theanoで*関数*を定義して合計を計算します。

f = function([x, target], y, updates=updates)

上記の関数を特定の回数呼び出すには、次のように for ループを作成します-

for i in range(10):
output = f([1.0, 1.0, 1.0, 1.0], 100.0)

前に述べたように、関数への入力は4つの特徴の初期値を含むベクトルです-特定の理由なしに各特徴に 1.0 の値を割り当てます。 選択した異なる値を割り当て、関数が最終的に収束するかどうかを確認できます。 各反復で重みベクトルの値と対応する出力を出力します。 それは以下のコードに示されています-

print ("iteration: ", i)
print ("Modified Weights: ", W.get_value())
print ("Output: ", output)

完全なプログラムリスト

完全なプログラムリストは、クイックリファレンス用にここに再現されています-

from theano import *
import numpy

x = tensor.fvector('x')
target = tensor.fscalar('target')

W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
print ("Weights: ", W.get_value())

y = (x *W).sum()
cost = tensor.sqr(target - y)
gradients = tensor.grad(cost, [W])
W_updated = W - (0.1* gradients[0])
updates = [(W, W_updated)]

f = function([x, target], y, updates=updates)
for i in range(10):
   output = f([1.0, 1.0, 1.0, 1.0], 100.0)
   print ("iteration: ", i)
   print ("Modified Weights: ", W.get_value())
   print ("Output: ", output)

あなたがプログラムを実行すると、次の出力が表示されます-

Weights: [0.1 0.25 0.15 0.3 ]
iteration: 0
Modified Weights: [19.94 20.09 19.99 20.14]
Output: 0.8
iteration: 1
Modified Weights: [23.908 24.058 23.958 24.108]
Output: 80.16000000000001
iteration: 2
Modified Weights: [24.7016 24.8516 24.7516 24.9016]
Output: 96.03200000000001
iteration: 3
Modified Weights: [24.86032 25.01032 24.91032 25.06032]
Output: 99.2064
iteration: 4
Modified Weights: [24.892064 25.042064 24.942064 25.092064]
Output: 99.84128
iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]
Output: 99.968256
iteration: 6
Modified Weights: [24.89968256 25.04968256 24.94968256 25.09968256]
Output: 99.9936512
iteration: 7
Modified Weights: [24.89993651 25.04993651 24.94993651 25.09993651]
Output: 99.99873024
iteration: 8
Modified Weights: [24.8999873 25.0499873 24.9499873 25.0999873]
Output: 99.99974604799999
iteration: 9
Modified Weights: [24.89999746 25.04999746 24.94999746 25.09999746]
Output: 99.99994920960002

4回の反復後の出力は 99.96 であり、5回の反復後の出力は 99.99 であり、目標の 100.0 に近いことに注意してください。

目的の精度に応じて、ネットワークは4〜5回の反復でトレーニングされていると安全に結論付けることができます。 トレーニングが完了した後、重みベクトルを検索します。5回の反復後、次の値を取ります-

iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]

これで、ネットワークでこれらの値を使用してモデルを展開できます。