algorithm - 为什么我得到一个充满 NaN 的权重矩阵?

标签 algorithm matlab neural-network pca

(赫布学习)

我的任务是在 Matlab 中编写 Oja 学习规则和 Sanger 学习规则,以训练神经网络。这个神经网络有 6 个输入和 4 个输出,我的训练集来自一个多元均匀分布,例如 Xi ~ U(-ai,ai) 和 ai≠aj,对于所有 i≠j

这些是最相关的文件(不包括大多数评论和 oja.m)


主.m

TS = generarVectoresUnif(6, [1, 4, 9, 36, 25, 16], 512);
TS = TS';
W = unifrnd(0,1,[4,6]);
% it not very fast. That's why I put 500 iterations
W_sanger = sanger(W,TS,500, 0.05)


generarVectoresUnif.m

function [ TS ] = generarVectoresUnif( dim, rangos, n )
dimensiones = int8(dim);
tamanio = int32(n);
TS = [];

for i = 1:dimensiones
   TS = [TS, unifrnd(-rangos(i), rangos(i), [tamanio, 1]) ];
end


桑格.m

( 注意: W 是一个 4 x 6 大小的矩阵。 Wi 是第 i 个输出的权重向量。 Wij = (Wi)j。 在示例中,TS 是一个 6 x 512 大小的矩阵 )

function [ W ] = sanger( W_init, trainingset, iteraciones , eta)

W = W_init;

% obtiene los tamaños desde los parametros de entrada
size_input = size(W,2);
size_output = size(W,1);
n_patterns = size(trainingset, 2);


% one-tenth part
diezmo = iteraciones/10;


for it = 1:iteraciones

   if 0 == mod(it, diezmo)
      disp(horzcat('Iteracion numero ', num2str(it), ' de ',num2str(iteraciones)));
   end

   % for each pattern
   for u = 1:n_patrones

      DeltaW = zeros(size(W));

      % Vi = sum{j=1...N} Wij * Xj
      V = W * trainingset(:,u);

      % sumatorias(i,j) is going to replace sum{k=1..i} Vk*Wkj
      sumatorias = zeros(size_output,size_input);
      for j = 1:size_input
         for k = 1:size_output
             % sumar de 1 hasta i, sin hacer otro ciclo
             sumatorias(k,j) = (V' .* [ones(1,k), zeros(1,size_output-k)]) * W(:,j);
         end
      end

       % calcula la variacion
       for i = 1:size_output
          for j=1:size_input
             % Delta Wij = eta * Vi * ( xj - sum{k=1..i} Vk*Wkj )
              DeltaW(i,j) = eta * V(i,1) * (trainingset(j,u) - sumatorias(i,j));
          end
       end

       W = W + DeltaW;      
       %W = 1/norm(W) * W; %<---is it necessary? [Hertz] doesn't mention it

  end

end

你能告诉我我做错了什么吗?矩阵的值增长得非常快。 我对 oja.m 有同样的问题

我试过:

  • eta 替换为 1/it --->NaN
  • 用迭代次数的指数函数替换 eta --->好的,但这不是我所期望的
  • 取消注释 W = 1/norm(W) * W;。这确实有效,但没有必要,或者应该这样做?

最佳答案

您需要较小的 eta 值。考虑您的更新规则:

DeltaW(i,j) = eta * V(i,1) * (trainingset(j,u) - sumatorias(i,j));

如果 eta 很大,DeltaW 可能具有很大的绝对值(即非常大,例如 100000,或非常小,例如 -111111)。下一次循环 sumatorias(i,j) 将非常大,因为它是权重的函数。迭代次数越多,权重就会变得越大,最终导致溢出。

关于algorithm - 为什么我得到一个充满 NaN 的权重矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868984/

相关文章:

python - Keras 为多层感知器正确输入形状

algorithm - 逆时针排列凹多边形顶点

c++ - 以下递归解决方案的大O

matlab - 在字符串数组中查找重复的条目?

MATLAB:将结构字段名称的一部分传递给函数

python - Keras 自动编码器

java - 随机选择算法

c - 请解释一下这个排列算法是如何工作的以及这个回文算法是如何工作的

matlab - 如何给出向量中每个元素的顺序

machine-learning - HDF5中文件数量小于batch时会发生什么