Theano-簡単なトレーニング例
Theanoは、最適化を達成するためにコストと勾配を繰り返し計算する必要があるニューラルネットワークのトレーニングに非常に役立ちます。大規模なデータセットでは、これは計算集約的になります。Theanoは、以前に見た計算グラフの内部最適化により、これを効率的に実行します。
問題文
次に、Theanoライブラリを使用してネットワークをトレーニングする方法を学習します。4つの特徴データセットから始める簡単なケースを取り上げます。各特徴に特定の重み(重要度)を適用した後、これらの特徴の合計を計算します。
トレーニングの目標は、合計が100の目標値に達するように、各機能に割り当てられた重みを変更することです。
sum = f1 * w1 + f2 * w2 + f3 * w3 + f4 * w4
どこ f1、 f2、...は機能値であり、 w1、 w2、...は重みです。
問題の説明をよりよく理解するために、例を量子化してみましょう。各機能の初期値を1.0と想定し、w1は次のようになります。0.1、 w2 等しい 0.25、 w3 等しい 0.15、および w4 等しい 0.3。重み値の割り当てに明確なロジックはありません。それは私たちの直感にすぎません。したがって、初期合計は次のようになります。
sum = 1.0 * 0.1 + 1.0 * 0.25 + 1.0 * 0.15 + 1.0 * 0.3
合計すると 0.8。ここで、この合計が100に近づくように、重みの割り当てを変更し続けます。0.8 目標値である100からはほど遠いです。機械学習の用語では、次のように定義します。 cost目標値から現在の出力値を引いた差として、通常はエラーを爆発させるために2乗されます。勾配を計算し、重みベクトルを更新することで、各反復でこのコストを削減します。
このロジック全体がTheanoでどのように実装されているかを見てみましょう。
変数の宣言
まず、入力ベクトルxを次のように宣言します。
x = tensor.fvector('x')
どこ x float値の1次元配列です。
スカラーを定義します 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])
更新します weights の学習率を取ることによるベクトル 0.1 次のように-
W_updated = W - (0.1 * gradients[0])
次に、上記の値を使用して重みベクトルを更新する必要があります。これは次のステートメントで行います-
updates = [(W, W_updated)]
Theano関数の定義/呼び出し
最後に、 function 合計を計算するために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]
これで、モデルを展開するためにネットワークでこれらの値を使用できます。