Подтвердить что ты не робот

Обучение TensorFlow

Предполагая, что у меня очень простая нейронная сеть, такая как многослойный персептрон. Для каждого уровня функция активации является сигмоидной, и сеть полностью подключена.

В TensorFlow это может быть определено следующим образом:

    sess = tf.InteractiveSession()

    # Training Tensor
    x = tf.placeholder(tf.float32, shape = [None, n_fft])
    # Label Tensor
    y_ = tf.placeholder(tf.float32, shape = [None, n_fft])

    # Declaring variable buffer for weights W and bias b
    # Layer structure [n_fft, n_fft, n_fft, n_fft]
    # Input -> Layer 1
    struct_w = [n_fft, n_fft]
    struct_b = [n_fft]
    W1 = weight_variable(struct_w, 'W1')
    b1 = bias_variable(struct_b, 'b1')
    h1 = tf.nn.sigmoid(tf.matmul(x, W1) + b1)

    # Layer1 -> Layer 2
    W2 = weight_variable(struct_w, 'W2')
    b2 = bias_variable(struct_b, 'b2')
    h2 = tf.nn.sigmoid(tf.matmul(h1, W2) + b2)

    # Layer2 -> output
    W3 = weight_variable(struct_w, 'W3')
    b3 = bias_variable(struct_b, 'b3')
    y = tf.nn.sigmoid(tf.matmul(h2, W3) + b3)

    # Calculating difference between label and output using mean square error
    mse = tf.reduce_mean(tf.square(y - y_))

    # Train the Model
    # Gradient Descent
    train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)

Цель проекта для этой модели состоит в том, чтобы отобразить a n_fft points fft spectrogram на другую целевую спектрограмму n_fft. Предположим, что данные обучения и целевые данные имеют размер [3000, n_fft]. Они сохраняются в переменных spec_train и spec_target.

Теперь вот вопрос. Для TensorFlow существует ли разница между этими двумя тренировками?

Обучение 1:

for i in xrange(200):
        train_step.run(feed_dict = {x: spec_train, y_: spec_target})

Обучение 2:

for i in xrange(200):
        for j in xrange(3000):
            train = spec_train[j, :].reshape(1, n_fft)
            label = spec_target[j, :].reshape(1, n_fft)
            train_step.run(feed_dict = {x: train, y_: label})

Большое спасибо!

4b9b3361

Ответ 1

В первой учебной версии вы одновременно обучаете всю партию обучающих данных, а это означает, что первый и 3000-й элемент spec_train будут обрабатываться с использованием одних и тех же параметров модели за один шаг. Это называется (Batch) Gradient Descent.

Во второй учебной версии вы тренируете один пример из данных обучения сразу, что означает, что 3000-й элемент spec_train будет обрабатываться с использованием параметров модели, которые были обновлены 2999 раз, поскольку первый элемент был наиболее недавно обработано. Это называется Stochastic Gradient Descent (или это было бы, если бы элемент был выбран случайным образом).

В общем случае TensorFlow используется с наборами данных, которые слишком велики для обработки в одной партии, поэтому предпочтение отдается мини-пакетному SGD (где подмножество примеров обрабатывается за один шаг). Теоретически желательно обрабатывать один элемент за раз, но по своей сути является последовательным и имеет высокие фиксированные затраты, потому что матричные умножения и другие операции не такие, как вычислительно плотные. Поэтому обработка небольшой партии (например, 32 или 128) примеров одновременно является обычным подходом, при этом параллельно проводится несколько тренировок реплик на разных партиях.

См. этот вопрос о статике StackExchange для более теоретического обсуждения того, когда вы должны использовать один подход по сравнению с другим.

Ответ 2

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

Пожалуйста, перейдите по этой ссылке https://stats.stackexchange.com/info/49528/batch-gradient-descent-versus-stochastic-gradient-descent Первый ответ действительно хорош в этой ссылке