代码之家  ›  专栏  ›  技术社区  ›  Joseph Garnier

责任链模式在机器学习中的应用

  •  1
  • Joseph Garnier  · 技术社区  · 7 年前

    我读过很多C++和Java机器学习代码,其中每个隐藏层都在for循环中调用。为什么是这种模式 责任链 从未使用过?它的缺点是什么?

    -经典方法:

    std::vector<Layer> layers(10);
    for(Layer& hidden : layers)
      hidden.activation();
    

    -责任链:

    std::vector<Layer*> layers();
    // ... init layers vector ...
    layers[0]->nextLayer(layers[1]);
    layers[1]->nextLayer(layers[2]);
    layers[2]->nextLayer(layers[3]);
    // and so on...
    layers[0]->activation();
    

    在层中:

    Layer::activation()
    {
      // do something
      nextLayer->activation();
    }
    

    非常感谢。

    3 回复  |  直到 7 年前
        1
  •  2
  •   quamrana Ryuzaki L    7 年前

    for循环的优点是 layers 每次调用for循环时,集合可能不同。“缺点”是for循环保证调用上的成员函数 每一个 集合的项目。

    责任链模式可以在集合中“迭代”,但很难更改集合,必须更新项目之间的所有链接。此外,由于这是递归,因此可能会出现堆栈溢出!

    然而,当涉及到终止循环时,责任链真的很重要:任何成员都可以决定自己处理调用并立即返回,或者直接转发到下一项。

        2
  •  0
  •   Eduard Rostomyan    7 年前

    为什么要通过创建列表并将其称为“责任链”来使简单的代码复杂化?

    std::vector<Layer> layers(10);
    for(Layer& hidden : layers)
    {
      // prepare for activation aka do something
      hidden.activation();
    }
    

    您不喜欢这种方法的哪些方面?

        3
  •  0
  •   UKMonkey    7 年前

    第一个示例;每一层完全独立于下一层。这意味着他们对其他层一无所知——它们可能存在,也可能不存在;只需要专注于一项责任。

    第二种;这些层现在不仅知道还有其他层,而且还知道它是一个链表。如果第2层和第3层彼此独立,但仅依赖于第1层,该怎么办?表现这一点的能力已经丧失。最终,控制图层的项目不再能够按照自己的意愿存储图层,这导致它的设计很差,因为它正朝着一个上帝的对象工作。