신경망을 학습 할 때 우리는 일반적으로 연속적이며 차별화 할 수있는 실수 값 비용 함수에 의존하는 그라디언트 디센트를 사용합니다. 최종 비용 함수는 예를 들어 평균 제곱 오차를 취할 수 있습니다. 또는 다른 방법으로, 그래디언트 디센트는 최종 목표가 회귀 인 것으로 암묵적으로 가정합니다. 실수 값을 최소화합니다.비용 기능 훈련 대상 대 정확성 목표 원하는 목표
때로는 신경망에서 수행하고자하는 것은 분류입니다. 입력이 주어지면 두 개 이상의 이산 카테고리로 분류됩니다. 이 경우 사용자가 신경 쓰는 최종 목표는 분류 정확성 - 올바르게 분류 된 사례의 비율입니다.
그러나 우리 목표는 신경 네트워크가을 최적화하기 위해 노력하고있다되지 않은 것을 분류 정확성, 는하지만 우리는 분류에 신경 네트워크를 사용하는 경우. 신경망은 여전히 실제 가치가있는 비용 함수를 최적화하려고합니다. 때때로 이들은 같은 방향을 가리키고 있지만 때로는 그렇지 않습니다. 특히, 나는 비용 함수를 정확하게 최소화하도록 훈련 된 신경 네트워크가 간단한 손으로 코딩 된 문턱 값 비교보다 나쁜 분류 정확도를 갖는 경우로 뛰어 들었다.
TensorFlow를 사용하여 최소한의 테스트 케이스로 마무리했습니다. 그것은 퍼셉트론 (숨겨진 레이어가없는 신경망)을 설정하고, 절대적으로 최소의 데이터 세트 (하나의 입력 변수, 하나의 바이너리 출력 변수)에서 결과의 분류 정확도를 평가 한 후 간단한 손의 분류 정확도와 비교합니다 코딩 된 임계 값 비교; 결과는 각각 60 %와 80 %입니다. 직관적으로 이것은 큰 입력 값을 가진 단일 특이 값이 이에 상응하는 큰 출력 값을 생성하기 때문에 비용 함수를 최소화하는 방법은 두 개의 더 일반적인 경우를 잘못 분류하는 과정에서 그 한 사례를 수용하기 위해 특별히 노력하는 것입니다. 퍼셉트론은 정확히 무엇을하도록 지시 받았 는가? 이것이 우리가 실제로 분류자를 원한 것과 일치하지 않는다는 것입니다. 그러나 분류 정확도는 연속 차등 함수가 아니므로 그라디언트 디센트의 대상으로 사용할 수 없습니다.
신경망을 훈련시켜 분류 정확도를 극대화 할 수있는 방법은 무엇입니까?
import numpy as np
import tensorflow as tf
sess = tf.InteractiveSession()
tf.set_random_seed(1)
# Parameters
epochs = 10000
learning_rate = 0.01
# Data
train_X = [
[0],
[0],
[2],
[2],
[9],
]
train_Y = [
0,
0,
1,
1,
0,
]
rows = np.shape(train_X)[0]
cols = np.shape(train_X)[1]
# Inputs and outputs
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
# Weights
W = tf.Variable(tf.random_normal([cols]))
b = tf.Variable(tf.random_normal([]))
# Model
pred = tf.tensordot(X, W, 1) + b
cost = tf.reduce_sum((pred-Y)**2/rows)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
tf.global_variables_initializer().run()
# Train
for epoch in range(epochs):
# Print update at successive doublings of time
if epoch&(epoch-1) == 0 or epoch == epochs-1:
print('{} {} {} {}'.format(
epoch,
cost.eval({X: train_X, Y: train_Y}),
W.eval(),
b.eval(),
))
optimizer.run({X: train_X, Y: train_Y})
# Classification accuracy of perceptron
classifications = [pred.eval({X: x}) > 0.5 for x in train_X]
correct = sum([p == y for (p, y) in zip(classifications, train_Y)])
print('{}/{} = perceptron accuracy'.format(correct, rows))
# Classification accuracy of hand-coded threshold comparison
classifications = [x[0] > 1.0 for x in train_X]
correct = sum([p == y for (p, y) in zip(classifications, train_Y)])
print('{}/{} = threshold accuracy'.format(correct, rows))
정확도가 낮을수록 오류가 적습니다. 그것은 유효한 진술이 아닌가? –
@AlexeyR. 요점은 용어가 아니기 때문에 그라디언트 디센트는 * 실수 값 * 오류 함수를 최소화하려고하지만 사용자가 신경 쓰는 것은 잘못 분류 된 오류의 비율 *과 두 가지입니다. – rwallace
[right proxy-function] (https://datascience.stackexchange.com/questions/13663/neural-networks-loss-and-accuracy-correlation)을 사용하십시오. 제곱 오류는 여기서 확실하게 실패합니다. – sascha