如何处理神经网络的参数空间?

数据挖掘 神经网络 超参数 可解释的ai
2022-02-23 21:51:25

这个问题非常广泛(甚至可能被关闭为“太宽泛”)。它可以被认为是一个初学者的问题,因为它主要是关于朝着一个“有希望”的方向开始。在这方面,我希望有人能给出一般性的提示和建议,即使肯定不会有一个单一的、完美的答案。

我目前被分配了一个相当模糊的研究任务,大致是“这里有一些数据,把它扔到一些神经网络上,看看你能弄清楚什么”。而我目前面临的主要问题是参数空间

作为一个特定(但有些随意)的示例,请考虑 Python/Keras 环境,特别是keras 文档中的堆叠 LSTM 示例

这里的自由度,广义地说,

  • 层数
  • 层的类型,可能是
    • 核心层,......
    • 卷积层,...
    • 池化层,...
    • 本地连接层,...
    • 嵌入层,...
    • 合并图层, ...
    • 高级激活层,...
    • 归一化层,...
    • 噪声层,...
    • 层包装,...
    • 自定义图层,...
    • 循环层,可能是
      • 循环神经网络,...
      • 简单RNN,...
      • 格鲁,...
      • 卷积LSTM2D,...
      • 卷积LSTM2DCell,...
      • 简单RNN细胞,...
      • 卷积LSTM2DCell,...
      • 格鲁塞尔,...
      • LSTM细胞,...
      • 库登鲁,...
      • CuDNNLSTM, ...
      • LSTM,它有参数
        • 单位, ...
        • 循环激活,...
        • 使用_bias,...
        • kernel_initializer, ...
        • 循环初始化器,...
        • 偏置初始化器,...
        • unit_forget_bias, ...
        • kernel_regularizer, ...
        • 经常性正则化器,...
        • 偏置正则化器,...
        • 活动正则化器,...
        • 内核约束,...
        • 经常性约束,...
        • 偏差约束,...
        • 辍学, ...
        • 经常性辍学,...
        • 执行, ...
        • 返回序列,...
        • 返回状态,...
        • 向后退,...
        • 有状态的,...
        • 展开,...
        • 激活,可以是其中之一
          • 软最大,...
          • 埃卢,...
          • 瑟鲁,...
          • 软加,...
          • 软签,...
          • 谭...
          • 乙状结肠,...
          • hard_sigmoid, ...
          • 指数,...
          • 线性,...
          • 乙状结肠,...
          • relu,有参数
            • α
            • 最大值
            • 临界点
  • 编译步骤,有参数
    • 指标:...
    • 损失权重:...
    • 样品重量模式:...
    • 加权指标:...
    • 目标张量:...
    • loss,可能是 14 个函数之一,每个函数都有几个参数
    • 优化器,它可能是其中之一
      • 新元, ...
      • RMSprop,...
      • 阿达格拉德...
      • 阿达德尔塔,...
      • 阿达玛斯,...
      • 那达慕...
      • Adam,其参数为
        • lr,默认值为 0.002
        • beta_1,默认值为 0.9
        • beta_2,默认值为 0.999
        • epsilon,默认值为 None
        • schedule_decay,默认值为 0.004
  • 拟合/训练步骤,有参数
    • 训练/目标数据:...
    • 验证拆分/验证数据:...
    • 洗牌:...
    • 类重量:...
    • 样品重量:...
    • 初始时代:...
    • step_per_epoch: ...
    • 验证步骤:...
    • 验证频率:...
    • 时代:...
    • 批量大小,...

或者这么说:文档中的示例基于无限参数空间内的一个点,而该点的选择似乎令人不安。


我知道以某种方式 开始是“简单”的,因为只需复制+粘贴示例,更改输入 dat 和 google 错误消息,直到它“运行”,然后希望默认参数值是明智的,开始调整其余参数以查看结果如何变化。但这不是研究,也不是科学,也绝不是富有成效的。

当然,人们可以争论每一点。可以在一篇20 页、大量数学的研究论文中查找训练过程优化器beta_2参数的含义。adam更一般地说,有一些关于超参数调整的资源,当然还有一些stackexchange 网络 Q/As,它们要么试图解释参数,要么链接到解释它们的论文。

但是没有办法真正理解这些参数的影响。即使是单个看似简单的参数(如上面链接中的批量大小)的影响也涉及无法理解的数学模型,而只能“检查”,即使这样,也只能针对改变一个(或几个)参数得出结论并保留数百个其他参数。


最近,可解释人工智能的想法引起了一些关注——可能也是因为将此类系统的复杂性确定为一个严重问题。但到目前为止,我们有 Keras 和其他高级 API,它们提出了以下一些核心问题:

如何决定(几乎无限)参数空间中的哪些参数值得调整?

在最高级别,可能有经验法则。一方面,输入数据有特点。例如,数据的维度或结构(例如是点数据还是时间序列)。另一方面,有一定的分析目标(例如预测或异常检测)。这些将在“可能有意义”或“通常应用于此类问题”的层数或层类型方面缩小参数空间。但这对我来说仍然像是猜测。

一个人怎么能深刻地争论某个参数不需要调整呢?

如果有人发现对于某个数据集和挖掘任务“运行良好”的网络布局或参数组合,那么一切都很好。但是假设结果不如预期,人们如何反驳“如果你调整这个和那个参数可能会起作用”的论点?同样,反驳这种论点的唯一方法可能是凭经验检查这个单一参数(同时保持所有其他参数不变),然后从观察到的效果中得出一些挥手的结论(考虑到潜在的复杂性,这几乎必须是不合理的)系统)。


(用更简短、更具挑衅性的方式来表达这个问题可能是:使用神经网络的数据科学只是反复试验对吗?但恐怕我已经知道答案了……)

1个回答

恐怕你的问题没有真正的答案。但是仍然要回答它,我只能建议您寻找与您的具体问题相关的实用文章。我是否可以建议您从 LeCun 的这篇非常笼统的文章开始:http: //yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf直接引用介绍:

“使用反向传播设计和训练网络需要做出许多看似任意的选择 [...] 这些选择可能很关键,但没有万无一失的方法来决定它们,因为它们在很大程度上取决于问题和数据。然而,有启发式和一些可以帮助指导从业者做出更好选择的基本理论。”