). Попробуйте добавить второй слой и посмотрите, что получится.

мы обучаем нейронные сети, мы обычно используем градиентный спуск, который опирается на непрерывную, дифференцируемую функцию реальной стоимости. Функция конечной стоимости может, например, принимать среднеквадратичную ошибку. Или, другими словами, градиентный спуск подразумевает, что конечная цельрегрессия - минимизировать меру действительной ошибки.

Иногда мы хотим, чтобы нейронная сеть выполнялаклассификация - учитывая данные, классифицируйте их на две или более дискретные категории. В этом случае конечной целью пользователя является точность классификации - процент правильно классифицированных дел.

Но когда мы используем нейронную сеть для классификации, хотянаш цель - точность классификации,это не то, что нейронная сеть пытается оптимизировать, Нейронная сеть все еще пытается оптимизировать функцию реальной стоимости. Иногда они указывают в одном направлении, но иногда нет. В частности, я сталкивался со случаями, когда нейронная сеть, обученная правильно минимизировать функцию стоимости, имеет точность классификации хуже, чем простое сравнение порогов с ручным кодированием.

Я свел это к минимальному тестовому случаю, используя 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))

Ответы на вопрос(2)

Ваш ответ на вопрос