Недавно я начал заниматься нейронными сетями. Я пытался реализовать затворы AND
с Tensorflow. У меня возникли проблемы с пониманием того, когда использовать разные функции затрат и активации. Это базовая нейронная сеть с только входными и выходными уровнями, без скрытых слоев.
Сначала я попытался реализовать его таким образом. Как вы видите, это плохая реализация, но я думаю, что она выполняет свою работу, по крайней мере, в некотором роде. Итак, я пробовал только реальные выходы, ни одного горячего истинного выхода. Для функций активации я использовал сигмоидную функцию, а для функции стоимости я использовал функцию вычисления квадратов ошибок (я думаю, ее называли так, исправьте меня, если я ошибаюсь).
Я пытался использовать ReLU и Softmax в качестве функций активации (с той же функцией стоимости), и это не работает. Я понял, почему они не работают. Я также попробовал сигмоидную функцию с функцией стоимости Cross Entropy, она также не работает.
import tensorflow as tf
import numpy
train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]])
train_Y = numpy.asarray([[0],[0],[0],[1]])
x = tf.placeholder("float",[None, 2])
y = tf.placeholder("float",[None, 1])
W = tf.Variable(tf.zeros([2, 1]))
b = tf.Variable(tf.zeros([1, 1]))
activation = tf.nn.sigmoid(tf.matmul(x, W)+b)
cost = tf.reduce_sum(tf.square(activation - y))/4
optimizer = tf.train.GradientDescentOptimizer(.1).minimize(cost)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for i in range(5000):
train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y})
result = sess.run(activation, feed_dict={x:train_X})
print(result)
после 5000 итераций:
[[ 0.0031316 ]
[ 0.12012422]
[ 0.12012422]
[ 0.85576665]]
Вопрос 1. Есть ли какая-либо другая функция активации и функция стоимости, которая может работать (учиться) для вышеуказанной сети, не изменяя параметры (что означает без изменения W, x, b).
Вопрос 2 - я прочитал из сообщения StackOverflow здесь:
[Функция активации] зависит от проблемы.
Таким образом, нет никаких функций затрат, которые можно использовать где угодно? Я имею в виду, что нет стандартной функции стоимости, которая может использоваться в любой нейронной сети. Правильно? Пожалуйста, поправьте меня на это.
Я также реализовал ворота AND
с другим подходом, причем выход был как один горячий. Как видите, train_Y
[1,0]
означает, что 0-й индекс равен 1, поэтому ответ равен 0. Надеюсь, вы его получите.
Здесь я использовал функцию активации softmax, с кросс-энтропией как функцию стоимости. Сигмоидная функция как функция активации терпит неудачу.
import tensorflow as tf
import numpy
train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]])
train_Y = numpy.asarray([[1,0],[1,0],[1,0],[0,1]])
x = tf.placeholder("float",[None, 2])
y = tf.placeholder("float",[None, 2])
W = tf.Variable(tf.zeros([2, 2]))
b = tf.Variable(tf.zeros([2]))
activation = tf.nn.softmax(tf.matmul(x, W)+b)
cost = -tf.reduce_sum(y*tf.log(activation))
optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(cost)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for i in range(5000):
train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y})
result = sess.run(activation, feed_dict={x:train_X})
print(result)
после 5000 итераций
[[ 1.00000000e+00 1.41971401e-09]
[ 9.98996437e-01 1.00352429e-03]
[ 9.98996437e-01 1.00352429e-03]
[ 1.40495342e-03 9.98595059e-01]]
Вопрос 3. В этом случае, какую функцию затрат и функцию активации я могу использовать? Как я понимаю, какой тип затрат и функций активации я должен использовать? Есть ли стандартный способ или правило или просто опыт? Должен ли я попытаться выполнить все затраты и активировать функцию в грубой форме? Я нашел ответ здесь. Но я надеюсь на более подробное объяснение.
Вопрос 4 Я заметил, что для сближения с почти точным предсказанием требуется много итераций. Я думаю, что скорость конвергенции зависит от скорости обучения (с использованием слишком большого количества пропущенных решений) и функции стоимости (исправьте меня, если я ошибаюсь). Итак, есть ли оптимальный способ (что означает самая быстрая) или функция стоимости для перехода к правильному решению?