【问题标题】:Why is my convolutional Neural Network stuck in a local minimum?为什么我的卷积神经网络陷入局部最小值?
【发布时间】:2019-01-15 17:24:17
【问题描述】:

我听说机器学习算法很少陷入局部最小值,但我的 CNN(在 tensorflow 中)预测所有值的输出都是恒定的,而且我使用的是均方误差损失函数,所以我认为这一定是给定 MSE 属性的局部最小值。我有一个具有 2 个卷积层和 1 个密集层(+1 个密集输出层用于回归)的网络,分别有 24、32 和 100 个神经元,但我尝试更改层数/神经元的数量,但问题没有解决。我对隐藏层和输出层的绝对值进行了 relu 激活(我知道这并不常见,但它比仍然存在相同问题的 softplus 函数收敛到更低的 MSE 更快,我需要严格的正输出)。我在密集层和输出层之间还有一个 50% 的 dropout 层,以及两个卷积之间的一个池化层。我也尝试过改变学习率(目前为 0.0001)和批量大小。我正在使用 Adam 优化器。

我看到它建议更改/添加偏差,但我不确定如何在 tf.layers.conv2d/tf.layers.dense 中初始化它(为此我有偏差=True),我不能查看我用于第一层的 tf.nn.conv2d 的任何偏差选项,以便我可以轻松地初始化内核。

任何建议将不胜感激,谢谢。

这是我的网络代码部分:

filter_shape = [3,3,12,24]
def nn_model(input):
    weights = tf.Variable(tf.truncated_normal(filter_shape, mean=10, 
stddev=3), name='weights')    
    conv1 = tf.nn.conv2d(input, weights, [1,1,1,1], padding='SAME')
    conv2 = tf.layers.conv2d(inputs=conv1, filters=32, kernel_size=[3,3], 
padding="same", activation=tf.nn.relu)
    pool = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2, 
padding='same')
    flat = tf.reshape(pool, [-1, 32*3*3])
    dense_3 = tf.layers.dense(flat, neurons, activation = tf.nn.relu)
    dropout_2 = tf.layers.dropout(dense_3, rate = rate)
    prediction = tf.layers.dense(dropout_2, 1, activation=tf.nn.softplus)    
    return prediction

我的输入是包含 12 个环境数据通道的 5x5 图像,我有大约 100,000 个训练样本。我当前的 MSE 为 ~90,值约为 25。

【问题讨论】:

  • 你能分享更多关于你的架构的细节吗?你的图片尺寸是多少?你有多少训练样本?你目前的准确度是多少?你使用什么超参数(准确的学习率,学习率衰减,优化器,...)?您是否在 Conv 层之间使用了批量标准化?另外,你为什么对两个卷积使用不同的操作? filter_shape 的大小是多少?
  • 另外,我不确定您从哪里得到 ML 算法“很少陷入局部最小值”的想法。从字面上看,每个神经网络都“陷入”局部最小值;只是大多数局部最小值都足够好。我认为您将损失函数的凸性与神经网络的非凸性混淆了。
  • @dennlinger 我的输入只有 5x5,但我可以将它们提高到 7x7,我想这可能会有所帮助吗?我有大约 100, 000 个训练样本,我当前的平均 square 误差在大约 25 的值上大约是 90。我没有使用批量规范,主要是因为我从来没有真正理解它的用途。我使用不同的操作只是因为我起初使用的是 tf.layers 但后来我不知道如何初始化权重所以我将第一层(这是我初始化的唯一一层)切换到 tf.nn(虽然想想看,我可能应该同时初始化两者),filter_shape=[3,3,12,24] :)
  • @ 是的,谢谢我知道你通常只会达到一个“足够好”的最小值,但我被告知你通常不会陷入一个似乎很远的地方发生在这里。
  • 请将此信息添加到您的帖子中,而不是在 cmets 中,以便其他用户可以轻松找到它。此外,我不是 100% 确定,但我认为 tf.layers 会进行一些自动初始化,或者至少应该这样做。您还没有包含有关重要超参数和优化器的任何信息。

标签: optimization machine-learning neural-network conv-neural-network mean-square-error


【解决方案1】:

我曾经在使用更大的图像时遇到同样的问题。我增加了卷积层的数量来解决它。也许你应该尝试添加更多的卷积层。

在我看来,问题在于您没有足够的参数,因此陷入了局部最小值。如果增加参数数量,它可以帮助更新收敛到更好的最小值。

另外,我看不到您正在使用的优化器。是亚当吗?您可以尝试从更大的学习率开始,并使用衰减来逐个迭代地减小它。

【讨论】:

  • “添加更多层”只是在你确定你有足够的训练数据时才说的,而参数集不足以覆盖任务的复杂性。在许多情况下,我看到人们将类似 ResNet 大小的网络扔到一个可以用单个卷积层解决的问题上,并且由于它的 太多 参数,因此过拟合更重。
  • 谢谢!我添加了一些卷积层和另一个密集层,但它似乎没有解决它(我已经尝试了每个的 3/4)。我之前使用普通的神经网络也遇到过类似的问题,并通过权重初始化解决了这个问题,但这一次似乎没有帮助。添加正则化器可能会有所帮助吗?
  • 抱歉刚刚意识到我没有说...是的,我正在使用 Adam 优化器
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多