【发布时间】:2019-12-23 03:02:04
【问题描述】:
如果我们有一个具有 20 个节点 + 2 个隐藏层(大小为 10 和 5)的输入层的神经网络,我们如何计算这样一个网络中的参数总数?
此外,我们如何知道哪些激活函数适合这样的网络?重量是什么形状?
【问题讨论】:
标签: machine-learning neural-network nodes data-science activation-function
如果我们有一个具有 20 个节点 + 2 个隐藏层(大小为 10 和 5)的输入层的神经网络,我们如何计算这样一个网络中的参数总数?
此外,我们如何知道哪些激活函数适合这样的网络?重量是什么形状?
【问题讨论】:
标签: machine-learning neural-network nodes data-science activation-function
首先,让我们谈谈不考虑激活函数的网络的结构。我们知道,对于任何激活y_i = I(w_i,x),参数本身都表示为向量w_i和x的点积> 在考虑函数本身之前。因此,一种方便的思考方式是,网络中的每一层都只是输入向量本身的线性变换:Wx。因此,要从 20 维特征向量 x 到 10 维输出,然后是 5 维,我们需要使用两个矩阵:一个 10x20(我们称其为隐藏层 1 W_1)和一个 5x10(我们称之为隐藏层 2W_2。因此输入层 (W_0) 将只是一个对角矩阵20x20,对角线是应用于每个单独输入的权重。因此,从某种意义上说,Y 作为 5x1 向量可以被认为是 Y = W_2 W_1 W_0 x . 这么想的时候,马上就可以看到需要的参数个数(在这个例子中,一共是270个)。
关于哪些激活函数更优越,或者至少在我刚开始研究 ANN 时存在很多争论。要记住的一件事是每个激活函数都有权衡。考虑到输入向量的某些条件,这些函数具有优势,但也以整体计算复杂性和面对大权重时降低的灵敏度为代价。例如,如果使用tanh() 作为激活函数,如果单个权重的大小超过其他权重的 100 倍,则反向传播误差增量将大幅移动该节点的所有其他权重,但几乎没有影响那奇异的重量。这可能会带来很大的问题,因为您很容易受到局部最小值的训练。此外,在考虑 GPGPU 加速时,d/dx[tanh(x)] 的计算效率不高。但是(就我所提到的这个函数而言),它在处理频域或指数相关的特征时实际上非常有效。
那么,权重是什么形状的?这不是一个容易回答的问题,因为它基于:
最后一个是最重要的,但在训练之前很容易确定权重是否存在潜在的形状/结构。作为最佳实践,请考虑首先在您的训练集上使用主成分分析 (PCA)。如果您发现您的大部分集合可以用非常小的主成分子集来合理表示,那么训练有素的网络很可能在最早的隐藏层中显得稀疏(甚至是带状)。
【讨论】:
argmax(y),因此不需要加权或偏差。但严格来说,您将始终调节输入特征向量。因为您没有提到输出条件,我的印象是你的第二个隐藏层只是输出(当你考虑后续层时这是真的)。
如果您使用的是 Tensorflow Keras,请尝试 model.summary()。它告诉类型、输出形状和每层参数的数量以及参数的总数。您可以使用 tf.keras.utils 中的 plot_function 可视化您的网络。
阅读这里的文档https://www.tensorflow.org/api_docs/python/tf/keras/utils/plot_model?version=stable & https://www.tensorflow.org/api_docs/python/tf/keras/Model?version=stable
输出层激活函数的选择取决于您需要的输出类型。例如概率的 sigmoid,正值的 ReLU 等。对于隐藏层的激活函数的选择没有一般规则。需要考虑的因素太多了。但是,有一些建议在大多数情况下都有效。见https://www.coursera.org/lecture/ai/how-to-choose-the-correct-activation-function-foyh8
【讨论】: