代码之家  ›  专栏  ›  技术社区  ›  user1834153

matlab中的神经网络在0个时代后停止并切断层连接

  •  1
  • user1834153  · 技术社区  · 7 年前

    我在Matlab中使用NN工具箱时遇到了一个非常奇怪的行为。

    我正在构建一个基于神经网络的RL模拟,因此我必须反复训练我的网络/多次调用训练功能(想想一个游戏:每次“移动”后,我都会看到一个奖励,因此我有一个新的输入-输出对,我想在其上训练我的网络)。

    每次我用一对输入输出耦合训练我的网络时,我的网络将不再训练,这意味着当我打电话时 net=train(net,newinput,newtarget) 它的重量根本没有变化。

    我仔细研究了一下,发现在第一次培训后,我的网络切断了输入层和隐藏层以及其他层之间的连接。请参见下图。

    enter image description here

    下面是一个能够重现这种行为的简单代码。

    nnetwork=feedforwardnet([5,5]);
    nnetwork.trainFcn = 'traingd';
    nnetwork.trainParam.epochs=1; %one episode in RL means one update
    nnetwork.trainParam.lr=0.0001;
    nnetwork.trainParam.goal=0.1;
    nnetwork=train(nnetwork,zeros(43,1),[0]);
    view(nnetwork)
    

    在此之后,例如再次调用

    nnetwork=train(nnetwork,zeros(43,1),[0]);
    

    一点也不会改变网络。 发生了什么事?如果我打开NN GUI,它会告诉我“在0次迭代后已达到目标”。

    我想做的就是这样:

    for i=1:100
        x=take_turn()
        t=observe_t()
        network=train(network,x,t)%"update the weights like in Q learning
    end
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Ander Biguri    7 年前

    有什么问题?NN正在做您想要的事情。

    您正在训练一个神经网络,使其任何输入的输出都为“0”,因此不需要将输出连接到输入即可给出正确答案。该算法从NNs权重的所有零开始(所有零==无连接),然后完成,当它以100%的精度达到其目标时,您可以 完美神经网络 .

    真正发生的是内部权重等于零,如前所述,这意味着路径断开。GUI是智能的,它向您显示一条断开连接的路径,而不是一条线。如果输出始终为“4”或任何其他值,则情况相同。NN不需要输入来确定输出,因此它会将其断开。

    当你用不同的数据训练神经网络时,你会得到不同的权重,你只是碰巧用 weights=0 .


    所以问题来了:你知道你在做什么吗? 特别是在这一行代码中: nnetwork=train(nnetwork,zeros(43,1),[0]);

    你说的是“请用MATLAB训练一个结构为 nnetwork 因此,其表现如下:

    • 当我输入43个零时,我希望输出精确为零
    • A就这样,我不想要更多了。

    您的网络在做什么?正是这样。它输出的是零,因为你没有告诉它当输入不是43个零时该怎么做,所以它会做任何它想做的事情。在这种情况下,也输出零,因为这是最简单的解决方案。

    然而,您的所有问题都暗示您不想“训练”您的网络!你想 adapt 你的网络,有一些在线学习! 所以请检查功能 适应 !

    如下所示(可能需要更改输入的传递方式 x=[x take_turn()] ...).

    for i=1:100
        x=take_turn();
        t=observe_t();
        network=adapt(network,x,t);
    end
    
        2
  •  0
  •   rayryeng    7 年前

    我相信当我将数据集更改为Matlab默认数据集时,您对训练数据集的问题就出现了 building_dataset NN节点连接再次返回,没有任何问题。

    [X,T] = building_dataset;
    nnetwork=feedforwardnet([5,5]);
    nnetwork.trainFcn = 'traingd';
    nnetwork.trainParam.epochs=1; %one episode in RL means one update
    nnetwork.trainParam.lr=0.0001;
    nnetwork.trainParam.goal=0.1;
    nnetwork=train(nnetwork,X,T);
    view(nnetwork)
    

    enter image description here 底线是:尝试找到一个合适的数据集来训练神经网络,否则将一无所获。此外,您希望通过使用零训练NN得到什么!我指的是以下代码 nnetwork=train(nnetwork,zeros(43,1),[0]);