使用随机梯度下降无法正确预测:总是预测 1

数据挖掘 机器学习 r 梯度下降
2022-02-27 14:44:33

我有一个包含 20 列和 785 行的 CSV 文件。每列的第 785 行是描述编码图像的标签。编码图像是35所以 1-784 行是编码图像,第 785 行是命名图像的标签。

我加载了 CSV 文件3_5_small.csv并将标签与编码数据分离。

如您所见,这是数字3的图像。

现在,我决定使用逻辑回归从编码数据中预测图像。正如Andrew NG 在机器学习课程中所解释的那样,我使用了随机梯度下降法但我不认为,我做对了。在遵循代码之前,这是我执行的步骤:

  • Transformedtrain_labels_3_5分别只包含3and 5to1和to 0所以我想预测3. 如果输出概率 < 0.5,则为 5,> 0.5 为 3。
  • 随机洗牌train_data_3_5train_labels_3_5到相同的程度。
  • 随机生成theta向量
  • theta将向量和X向量传递到hypothesis函数中
  • 更新了theta向量。

这就是我所做的一切。这是我所做的代码。

train <- function(data, labels, alpha = 0.001) {
  #browser()

  #Initialize the theta vector
  theta <- seq(from = 0, to = 1, length.out = nrow(data))

  number_of_iterations = 10
  for(noi in 1:number_of_iterations) {
    for(i in seq(1:ncol(data))) {
      x = as.vector(data[,i]) #Create a x vector
      h = hypothesis(x, theta) #Call the hypothesis function to get the probability
      y = labels[1,i]
      theta <- theta - (alpha * ((h - y) * x))
    }
  }
  return(theta)
}

但是在测试数据甚至训练数据上,这根本不能预测正确。我不知道我哪里出错了。我重新审视了算法,讲座,但无法弄清楚,我做错了什么。1无论我传递3还是5的向量,它总是预测

1个回答

我的网络确实总是预测同一类。问题是什么?

我有过几次。虽然我目前懒得看你的代码,但我想我可以给出一些一般性的提示,这也可能对其他有相同症状但可能存在不同潜在问题的人有所帮助。

调试神经网络

拟合一项数据集

对于网络应该能够预测的每个类别,请尝试以下操作:

  1. 创建一个只有一个 i 类数据点的数据集。
  2. 使网络适合此数据集。
  3. 网络是否学会预测“第 i 类”?

如果这不起作用,则有四个可能的错误来源:

  1. 错误的训练算法:尝试一个较小的模型,打印很多在两者之间计算的值,看看它们是否符合您的期望。
    1. 除以 0:在分母上加一个小数
    2. 0 的对数/负数:如除以 0
  2. 数据:您的数据可能有错误的类型。例如,您的数据可能必须是类型float32,但实际上是整数。
  3. 模型:也有可能您刚刚创建了一个无法预测您想要什么的模型。当您尝试更简单的模型时,应该会发现这一点。
  4. 初始化/优化:根据模型,您的初始化和优化算法可能会发挥至关重要的作用。对于使用标准随机梯度下降的初学者,我会说随机初始化权重非常重要(每个权重都有不同的值)。- 另见:这个问题/答案

学习曲线

有关详细信息,请参阅sklearn

在此处输入图像描述

这个想法是从一个很小的训练数据集(可能只有一个项目)开始。那么模型应该能够完美地拟合数据。如果这可行,您将制作一个稍大的数据集。你的训练误差应该会在某个时候略微上升。这揭示了您的模型对数据建模的能力。

数据分析

检查其他类出现的频率。如果一个类别支配其他类别(例如,一个类别占数据的 99.9%),这是一个问题。寻找“异常值检测”技术。

更多的

  • 学习率:如果您的网络没有改善并且仅比随机机会稍微好一点,请尝试降低学习率。0.001对于计算机视觉,经常使用/工作的学习率。如果您使用 Adam 作为优化器,这也是相关的。
  • 预处理:确保对训练和测试使用相同的预处理。您可能会看到混淆矩阵的差异(请参阅此问题

常见错误

这是由reddit启发的

  • 你忘了应用预处理
  • 垂死的 ReLU
  • 到小/到大的学习率
  • 最后一层的激活函数错误:
    • 你的目标不是总和吗?-> 不要使用 softmax
    • 目标的单个元素是否定的 -> 不要使用 Softmax、ReLU、Sigmoid。tanh 可能是一个选择
  • 网络太深:你没有训练。首先尝试一个更简单的神经网络。