由多个激活函数组成的神经网络
Neural Network composed of multiple activation functions
我正在使用 sknn 包构建神经网络。为了优化我正在使用的数据集的神经网络参数,我使用了进化算法。由于该包允许我构建一个神经网络,其中每一层都有不同的激活函数,我想知道这是否是一个实际的选择,或者我是否应该只为每个网络使用一个激活函数?在神经网络中使用多个激活函数对神经网络有害、无害还是有益?
还有我应该拥有的每层神经元的最大数量是多少,我应该拥有的每个网络的最大层数是多少?
神经网络只是一个(大)数学函数。您甚至可以对同一层中的不同神经元使用不同的激活函数。不同的激活函数允许不同的非线性,这可能更适合解决特定的函数。使用 sigmoid 而不是 tanh 只会产生微小的差异。更重要的是激活有一个很好的导数。通常使用 tanh 和 sigmoid 的原因是,对于接近 0 的值,它们的行为类似于线性函数,而对于大的绝对值,它们的行为更像符号函数((-1 或 0)或 1),并且它们具有很好的导数。一个相对较新的引入是 ReLU (max(x,0)),它有一个非常简单的导数(x=0 除外),是非线性的,但重要的是计算速度很快,非常适合训练量大的深度网络次。
归根结底,对于全局性能而言,这方面的选择并不是很重要,非线性和上限范围很重要。但是,要挤出最后一个百分点,此选择很重要,但主要取决于您的具体数据。这个选择就像隐藏层的数量和这些层内的神经元数量一样必须通过交叉验证找到,尽管你可以调整你的遗传算子以包括这些。
I was wondering if [having different activation functions on each layer] is a practical choice, or whether I should just use one activation function per net?
简答:视情况而定
更长的答案:我在想为什么你会想要有多个激活函数。你的问题里没有说,所以我会在更理论的层面上回答。
一般Advice/Guidance
神经网络只是数学函数的近似值,正确的设计将基于回答以下问题 questions/answers
- 近似需要多近,你可以训练你的网络多近来近似函数?
- 网络对未训练的数据集的泛化能力如何?它需要泛化到什么程度?
这是我认为与您的问题相关的额外内容
- 网络需要多快的性能?您选择的激活函数如何影响性能?
如果您回答了这些问题,您将对您的具体案例有更好的了解。
我的意见
构建具有多个激活函数的神经网络确实是在搅浑水,使系统变得比它需要的更复杂。当我想到构建好的软件时,我首先想到的事情之一就是内聚设计。换句话说,这个系统作为一个整体有意义还是做得太多了?
专业提示:不要构建软件 Rube Goldburg Machines。
如果你想在同一个网络中使用多个激活函数,我认为这不是内聚的。如果您的问题出于某种原因确实需要这样做,那么请重新考虑该问题并设计一个具有多个独立神经网络的系统,并且这些网络将各自以各自的架构(包括激活函数的选择)服务于各自的目的。
我正在使用 sknn 包构建神经网络。为了优化我正在使用的数据集的神经网络参数,我使用了进化算法。由于该包允许我构建一个神经网络,其中每一层都有不同的激活函数,我想知道这是否是一个实际的选择,或者我是否应该只为每个网络使用一个激活函数?在神经网络中使用多个激活函数对神经网络有害、无害还是有益?
还有我应该拥有的每层神经元的最大数量是多少,我应该拥有的每个网络的最大层数是多少?
神经网络只是一个(大)数学函数。您甚至可以对同一层中的不同神经元使用不同的激活函数。不同的激活函数允许不同的非线性,这可能更适合解决特定的函数。使用 sigmoid 而不是 tanh 只会产生微小的差异。更重要的是激活有一个很好的导数。通常使用 tanh 和 sigmoid 的原因是,对于接近 0 的值,它们的行为类似于线性函数,而对于大的绝对值,它们的行为更像符号函数((-1 或 0)或 1),并且它们具有很好的导数。一个相对较新的引入是 ReLU (max(x,0)),它有一个非常简单的导数(x=0 除外),是非线性的,但重要的是计算速度很快,非常适合训练量大的深度网络次。
归根结底,对于全局性能而言,这方面的选择并不是很重要,非线性和上限范围很重要。但是,要挤出最后一个百分点,此选择很重要,但主要取决于您的具体数据。这个选择就像隐藏层的数量和这些层内的神经元数量一样必须通过交叉验证找到,尽管你可以调整你的遗传算子以包括这些。
I was wondering if [having different activation functions on each layer] is a practical choice, or whether I should just use one activation function per net?
简答:视情况而定
更长的答案:我在想为什么你会想要有多个激活函数。你的问题里没有说,所以我会在更理论的层面上回答。
一般Advice/Guidance
神经网络只是数学函数的近似值,正确的设计将基于回答以下问题 questions/answers
- 近似需要多近,你可以训练你的网络多近来近似函数?
- 网络对未训练的数据集的泛化能力如何?它需要泛化到什么程度?
这是我认为与您的问题相关的额外内容
- 网络需要多快的性能?您选择的激活函数如何影响性能?
如果您回答了这些问题,您将对您的具体案例有更好的了解。
我的意见
构建具有多个激活函数的神经网络确实是在搅浑水,使系统变得比它需要的更复杂。当我想到构建好的软件时,我首先想到的事情之一就是内聚设计。换句话说,这个系统作为一个整体有意义还是做得太多了?
专业提示:不要构建软件 Rube Goldburg Machines。
如果你想在同一个网络中使用多个激活函数,我认为这不是内聚的。如果您的问题出于某种原因确实需要这样做,那么请重新考虑该问题并设计一个具有多个独立神经网络的系统,并且这些网络将各自以各自的架构(包括激活函数的选择)服务于各自的目的。