神经网络可以在其大小发生变化时进行训练吗?

Can a neural network be trained while it changes in size?

是否有已知的方法可以在神经网络缩小或扩大规模(按节点数、连接数等)时进行持续训练和优雅退化?

据我所知,我所读到的有关神经网络的所有内容都是从静态角度来看的。您定义网络然后对其进行训练。

如果有 一些 具有 N 个节点(神经元,随便什么)的神经网络 X,是否可以训练网络 (X) 以便在 N 增加或减少时,网络是否仍然有用并且能够执行?

这是我在这个视频中看到的...

https://youtu.be/qv6UVOQ0F44

视频说明中有更多资源的链接。

并且基于名为 NEAT 的流程。增强拓扑的神经进化。

它使用遗传算法和进化过程从头开始设计和进化神经网络,而无需事先假设神经网络的结构或复杂性。

我相信这就是您要找的。

一般来说,一旦网络已经训练好,改变网络架构(添加新层,向现有层添加更多神经元)是有意义的,并且在深度学习领域中是一种相当常见的操作。一个例子是辍学——在训练过程中,一半的神经元随机地完全关闭,只有剩下的一半在特定的迭代中参与训练(每次迭代或 'epoch' 因为它通常被命名为具有不同的随机关闭神经元列表) .另一个例子是迁移学习——你在一组输入数据上学习网络,切断部分输出层,用新层替换它们,然后在另一个数据集上重新学习模型。

为了更好地解释为什么它有意义,让我们退后一步。在深度网络中,你有很多隐藏层,每一层都从输入数据中学习一些抽象。每个附加层都使用前一层学习的抽象表示,并在它们的基础上构建,组合这种抽象以形成更高级别的数据表示。例如,您可能会尝试使用 DNN 对图像进行分类。第一层将从图像中学习相当简单的概念——比如数据中的边缘或点。下一层可以结合这些简单的概念来学习原语——比如三角形或正方形的圆圈。下一层可以进一步驱动它并组合这些基元来表示您可以在图像中找到的一些对象,例如 'a car' 或“房子”,并使用 softmax 计算您正在寻找的答案的概率(实际上是什么输出)。我需要指出的是,这些事实和学习到的表征是可以实际检查的。您可以可视化隐藏层的激活并查看它学到了什么。例如,这是通过 google 的项目 'inceptionism' 完成的。考虑到这一点,让我们回到我之前提到的内容。

Dropout用于提高网络的泛化能力。它迫使每个神经元 'not be so sure' 前一层的一些信息片段将可用,并使其尝试学习依赖于前一层不太有利和信息丰富的抽象片段的表示。它迫使它考虑来自前一层的所有表示来做出决定,而不是将它的所有权重都放在几个神经元上 'likes most of all'。通过这样做,网络通常可以更好地准备输入与训练集不同的新数据。

问:"As far as you're aware is the quality of the stored knowledge (whatever training has done to the net) still usable following the dropout? Maybe random halves could be substituted by random 10ths with a single 10th dropping, that might result in less knowledge loss during the transition period."

A:很遗憾,我无法正确回答为什么恰好有一半的神经元被关闭,而不是 10%(或任何其他数字)。也许有一个解释,但我还没有看到。一般来说,它只是有效,仅此而已。 另外我需要提到的是,dropout 的任务是确保每个神经元不只考虑前一层的几个神经元,并且准备好做出一些决定,即使通常帮助它做出正确决定的神经元不可用。这仅用于泛化,帮助网络更好地处理它以前没有看到的数据,dropout 没有其他效果。

现在让我们再次考虑迁移学习。假设您有一个 4 层的网络。你训练它识别图片中的特定物体(猫、狗、table、汽车等)。比起你切断最后一层,用三个额外的层替换它,现在你在一个数据集上训练生成的 6 层网络,例如,wrights 关于此图像上显示的内容的简短句子('a cat is on the car','house with windows and tree nearby' 等)。我们用这样的操作做了什么?我们最初的 4 层网络能够理解我们提供给它的图像中是否存在某些特定对象。它的前 3 层学习了图像的良好表示——第一层学习了图像中可能的边缘或点或一些极其原始的几何形状。第二层学习了一些更精细的几何图形,如 'circle' 或 'square'。最后一层知道如何将它们组合起来形成一些更高层次的对象——'car'、'cat'、'house'。现在,我们可以重新使用我们在不同领域学到的这个好的表示,并添加更多层。他们每个人都将使用原始网络最后(第 3)层的抽象,并学习如何将它们组合起来以创建有意义的图像描述。虽然您将使用图像作为输入和句子作为输出对新数据集进行学习,但它会调整我们从原始网络获得的前 3 层,但这些调整大多很小,而 3 个新层将通过显着学习进行调整。我们通过迁移学习实现的是:

1) 我们可以学习更好的数据表示。我们可以创建一个非常擅长特定任务的网络,而不是在该网络上构建以执行不同的事情。

2) 我们可以节省训练时间 - 网络的第一层已经训练得足够好,因此更接近输出的层已经获得了相当好的数据表示。所以训练应该使用预训练的第一层更快地完成。

所以最重要的是,预先训练一些网络而不是在另一个网络中重新使用部分或整个网络是非常有意义的,而且并不罕见。