【问题标题】:Feed Forward - Neural Networks Keras前馈 - 神经网络 Keras
【发布时间】:2016-09-08 13:18:57
【问题描述】:

对于我在 Keras 中实现的前馈神经网络中的输入,我只是想检查一下我的理解是否正确。

[[ 25.26000023  26.37000084  24.67000008  23.30999947]
[ 26.37000084  24.67000008  23.30999947  21.36000061]
[ 24.67000008  23.30999947  21.36000061  19.77000046]...]

所以在上面的数据中,它是一个数组中 4 个输入的时间窗口。我的输入层是

model.add(Dense(4, input_dim=4, activation='sigmoid')) 

model.fit(trainX, trainY, nb_epoch=10000,verbose=2,batch_size=4)

batch_size 为 4,理论上当我调用 fit 函数时,该函数会遍历每个 nb_epoch 中的所有这些输入吗? batch_size 是否需要为 4 才能使这个时间窗口起作用?

谢谢约翰

【问题讨论】:

    标签: neural-network artificial-intelligence feed-forward


    【解决方案1】:

    batch_size 为 4,理论上当我调用 fit 函数时,该函数会遍历每个 nb_epoch 中的所有这些输入吗?

    是的,每个时期都是对所有训练样本的迭代

    batch_size 是否需要为 4 才能使这个时间窗口起作用?

    不,这些是完全不相关的事情。 Batch 只是训练数据的一个子集,用于计算成本函数真实梯度的近似。更大的批次 - 更接近真正的梯度(以及原始的梯度下降),但训练变得更慢。更接近 1 - 它变得越来越随机、嘈杂的近似(并且更接近 随机梯度下降)。您匹配 batch_size 和数据维度的事实只是一个奇怪的巧合,没有任何意义。

    让我把它放在更一般的设置中,你在使用加性损失函数(神经网络通常使用)的梯度下降中所做的事情与梯度相反

    grad_theta 1/N SUM_i=1^N loss(x_i, pred(x_i), y_i|theta) =  
     = 1/N SUM_i=1^N grad_theta loss(x_i, pred(x_i), y_i|theta)
    

    其中loss 是您的pred(预测)与y_i 相比的一些损失函数。

    在基于批处理的场景中(粗略的想法)是您不需要遍历所有示例,而是需要一些严格的子集,例如 batch = {(x_1, y_1), (x_5, y_5), (x_89, y_89) ... } 并使用形式梯度的近似值

    1/|batch| SUM_(x_i, y_i) in batch: grad_theta loss(x_i, pred(x_i), y_i|theta)
    

    如您所见,这与x_i 所在的空间没有任何关系,因此与您的数据的维度无关。

    【讨论】:

      【解决方案2】:

      让我用一个例子来解释一下:

      当您有 32 个训练示例并且您调用 model.fit 并使用 4 的 batch_size 时,神经网络将一次显示 4 个示例,但一个 epoch 仍将定义为一次完整地遍历所有 32例子。所以在这种情况下,网络将一次通过 4 个示例,并且至少在理论上会调用前向传递(和后向传递)32 / 4 = 8 次。

      在极端情况下,当您的 batch_size 为 1 时,这就是普通的旧随机梯度下降。当您的batch_size 大于 1 时,称为批量梯度下降。

      【讨论】: