重量初始化

时间:2012-12-03 18:53:59

标签: artificial-intelligence neural-network

我计划将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的值是否是特定隐藏层的大小,或者网络中所有隐藏层的大小。我通过查看各种来源混淆了。< / p>

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

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

或者只是

  

NumberOfNeuronsInLayer(i),其中i是我目前的第一层

编辑:

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

2 个答案:

答案 0 :(得分:3)

Nguyen-Widrow 初始化算法如下:

  1. 使用(范围)随机值初始化隐藏图层的所有权重
  2. 对于每个隐藏层
    2.1计算β值,0.7 * Nth(输入层的#neurons)根 #neurons of current layer
    2.2每个突触
    2.1.1每个重量
    2.1.2通过除以神经元和神经元的重量范数来调整体重 乘以β值
  3. Encog Java Framework

答案 1 :(得分: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