7

我计划将 Nguyen-Widrow 算法用于具有多个隐藏层的 NN 。在研究过程中,我发现了很多模棱两可的地方,我希望澄清它们。

以下是 Nguyen-Widrow 算法的伪代码

      Initialize all weight of hidden layers with random values
      For each hidden layer{
          beta = 0.7 * Math.pow(hiddenNeurons, 1.0 / number of inputs);
          For each synapse{
             For each weight{
              Adjust weight by dividing by norm of weight for neuron and * multiplying by beta value
            }
          } 
      }

只是想澄清 hiddenNeurons 的值是特定隐藏层的大小,还是网络中所有隐藏层的大小。我通过查看各种来源混淆了。

换句话说,如果我有一个网络 (3-2-2-2-3) (索引 0 是输入层,索引 4 是输出层),那么 hiddenNeurons 的值会是:

NumberOfNeuronsInLayer(1) + NumberOfNeuronsInLayer(2) + NumberOfNeuronsInLaer(3)

要不就

NumberOfNeuronsInLayer(i) ,其中 i 是我所在的当前层

编辑:

那么,hiddenNeurons 值将是当前隐藏层的大小,而输入值将是前一个隐藏层的大小?

4

2 回答 2

3

Nguyen-Widrow初始化算法如下:

  1. 使用(范围)随机值初始化隐藏层的所有权重
  2. 对于每个隐藏层
    2.1 计算 beta 值,0.7 * Nth(#neurons of input layer)
    每个突触的当前层 2.2 #neurons 的根
    2.1.1 每个权重
    2.1.2 通过除以神经元的权重范数来调整权重和乘以贝塔值

Encog Java 框架

于 2012-12-09T01:46:37.060 回答
2

听起来你想要更精确的代码。以下是我参与的项目中的一些实际代码行。希望您阅读 C。它有点抽象和简化。有一个struct nn, 保存神经网络数据。您可能有自己的抽象数据类型。

我的项目中的代码行(有些简化):

float *w = nn->the_weight_array;
float factor = 0.7f * powf( (float) nn->n_hidden, 1.0f / nn->n_input);

for( w in all weight )
    *w++ = random_range( -factor, factor );

/* Nguyen/Widrow */
w = nn->the_weight_array;
for( i = nn->n_input; i; i-- ){
    _scale_nguyen_widrow( factor, w, nn->n_hidden );
    w += nn->n_hidden;
}

调用的函数:

static void _scale_nguyen_widrow( float factor, float *vec, unsigned int size )
{
    unsigned int i;
    float magnitude = 0.0f;
    for ( i = 0; i < size; i++ )
        magnitude += vec[i] * vec[i];

    magnitude = sqrtf( magnitude );

    for ( i = 0; i < size; i++ )
         vec[i] *= factor / magnitude;
}

static inline float random_range( float min, float max)
{
    float range = fabs(max - min);
    return ((float)rand()/(float)RAND_MAX) * range + min;
}

提示:
在您实现了 Nguyen/Widrow 权重初始化之后,您实际上可以在前向计算中添加一个小代码行,将每个激活转储到一个文件中。然后你可以检查这组神经元对激活函数的影响程度。求均值和标准差。您甚至可以使用绘图工具绘制它,即。gnuplot。(无论如何,您都需要一个像 gnuplot 这样的绘图工具来绘制错误率等。)我为我的实现这样做了。情节很不错,在我的项目中使用 Nguyen/Widrow 使最初的学习变得更快。

PS:根据 Nguyen 和 Widrows 的意图,我不确定我的实施是否正确。我什至认为我不在乎,只要它确实改善了最初的学习。

祝你好运,
-Øystein

于 2012-12-12T15:11:05.397 回答