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목표 값에서 현재 출력 값을 뺀 차이로, 일반적으로 오류를 날려 버리기 위해 제곱합니다. 그라디언트를 계산하고 가중치 벡터를 업데이트하여 각 반복에서이 비용을 줄입니다.
이 전체 로직이 Theano에서 어떻게 구현되는지 살펴 보겠습니다.
변수 선언
먼저 입력 벡터 x를 다음과 같이 선언합니다.
x = tensor.fvector('x')
어디 x 부동 소수점 값의 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)
비용은 목표 값과 현재 출력 간의 차이를 제곱 한 것입니다.
목표물에서 얼마나 멀리 떨어져 있는지 알려주는 기울기를 계산하기 위해 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)
앞서 말했듯이 함수에 대한 입력은 네 가지 특징에 대한 초기 값을 포함하는 벡터입니다. 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
네 번의 반복 후 출력은 다음과 같습니다. 99.96 다섯 번 반복하면 99.99, 우리가 원하는 목표 인 100.0.
원하는 정확도에 따라 네트워크가 4 ~ 5 회 반복으로 훈련되었다고 안전하게 결론을 내릴 수 있습니다. 훈련이 완료된 후, 5 회 반복 후 다음 값을 취하는 가중치 벡터를 찾습니다.
iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]
이제 모델 배포를 위해 네트워크에서 이러한 값을 사용할 수 있습니다.