神经网络收敛速度(Levenberg-Marquardt)(MATLAB)

时间:2014-08-26 22:59:10

标签: matlab neural-network

我试图用ANN来近似函数(单输入和单输出)。使用MATLAB工具箱我可以看到隐藏层中有5个或更多神经元,我可以获得非常好的结果。所以我试图手动完成。

计算: 由于网络只有一个输入和一个输出,误差的偏导数(e = do,其中'd'是所需输出,'o'是实际输出)相对于连接隐藏神经元j的权重输出神经元,将是-hj(其中hj是隐藏神经元j的输出); 关于输出偏差的误差的偏导数将为-1; 关于将输入连接到隐藏神经元j的权重的误差的偏导数将是-woj * f'* i,其中woj是隐藏的神经元j输出权重,f'是tanh()导数和'我是输入值; 最后,关于隐藏层偏差的误差的偏导数将与上面相同(关于输入权重),除了这里我们没有输入: -woj * F'

问题是: MATLAB算法总是更快更好地收敛。我可以实现与MATLAB相同的曲线,但我的算法需要更多的时代。 我试图从MATLAB算法中删除前处理和后处理功能。它仍然更快收敛。 我还尝试创建和配置网络,并在训练之前提取权重/偏差值,这样我就可以将它们复制到我的算法中,看它是否收敛得更快但没有改变(是创建/配置或训练中的权重/偏差初始化)函数?)。

MATLAB算法在代码中是否有某种优化? 或者可能只是在训练集的组织和权重/偏差初始化方面存在差异?

如果有人想查看我的代码,这里是进行培训的主循环:

Err2 = N;
epochs = 0;
%compare MSE of error2
while ((Err2/N > 0.0003) && (u < 10000000) && (epochs < 100))
    epochs = epochs+1;
    Err = 0;
    %input->hidden weight vector
    wh = w(1:hidden_layer_len);
    %hidden->output weigth vector
    wo = w((hidden_layer_len+1):(2*hidden_layer_len));
    %hidden bias
    bi = w((2*hidden_layer_len+1):(3*hidden_layer_len));
    %output bias
    bo = w(length(w));
    %start forward propagation
    for i=1:N
        %take next input value
        x = t(i);
        %propagate to hidden layer
        neth = x*wh + bi;
        %propagate through neurons
        ij = tanh(neth)';
        %propagate to output layer
        neto = ij*wo + bo;
        %propagate to output (purelin)
        output(i) = neto;
        %calculate difference from target (error)
        error(i) = yp(i) - output(i);

        %Backpropagation:

        %tanh derivative
        fhd = 1 - tanh(neth').*tanh(neth');
        %jacobian matrix
        J(i,:) = [-x*wo'.*fhd -ij -wo'.*fhd -1];

        %SSE (sum square error)
        Err = Err + 0.5*error(i)*error(i);
    end

    %calculate next error with updated weights and compare with old error

    %start error2 from error1 + 1 to enter while loop
    Err2 = Err+1;
    %while error2 is > than old error and Mu (u) is not too large
    while ((Err2 > Err) && (u < 10000000))
        %Weight update
        w2 = w - (((J'*J + u*eye(3*hidden_layer_len+1))^-1)*J')*error';
        %New Error calculation

        %New weights to propagate
        wh = w2(1:hidden_layer_len);
        wo = w2((hidden_layer_len+1):(2*hidden_layer_len));
        %new bias to propagate
        bi = w2((2*hidden_layer_len+1):(3*hidden_layer_len));
        bo = w2(length(w));
        %calculate error2
        Err2 = 0;
        for i=1:N
            %forward propagation again
            x = t(i);
            neth = x*wh + bi;
            ij = tanh(neth)';
            neto = ij*wo + bo;
            output(i) = neto;
            error2(i) = yp(i) - output(i);

            %Error2 (SSE)
            Err2 = Err2 + 0.5*error2(i)*error2(i);
        end

        %compare MSE from error2 with a minimum
        %if greater still runing
        if (Err2/N > 0.0003)
            %compare with old error
            if (Err2 <= Err)
                %if less, update weights and decrease Mu (u)
                w = w2;
                u = u/10;
            else
                %if greater, increment Mu (u)
                u = u*10;
            end
        end
    end
end

1 个答案:

答案 0 :(得分:0)

在Matlab中了解Levenberg Marquardt算法的确切实现并不容易。您可以尝试一次运行一次迭代算法,看看它是否与您的算法完全相同。您还可以尝试其他实现,例如http://www.mathworks.com/matlabcentral/fileexchange/16063-lmfsolve-m--levenberg-marquardt-fletcher-algorithm-for-nonlinear-least-squares-problems,以查看性能是否可以提高。对于简单的学习问题,收敛速度可能是学习率的问题。您可以简单地提高学习率以加快收敛速度​​。