簡體   English   中英

在機器學習中使用責任鏈模式

[英]Using Chain of Responsibility pattern in machine learning

我已經閱讀了很多機器學習的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();
}

謝謝。

for循環的優點在於,每次調用for循環時, layers集合可能會有所不同。 “缺點”是確保for循環可以在集合的每個項目上調用成員函數。

可以使“責任鏈”模式在整個集合中“迭代”,但是很難更改集合並必須更新項目之間的所有鏈接。 另外,由於這是遞歸,因此可能會導致堆棧溢出!

但是,當終止循環時,“責任鏈”確實很出色:任何成員都可以決定自己處理呼叫並立即返回,或者直接轉發到下一個項目。

為什么通過創建列表並將其稱為“責任鏈”來使簡單代碼復雜化?

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

您不喜歡這種方法嗎?

第一個例子; 每層完全獨立於下一層。 這意味着它們對其他層一無所知-它們可能存在或可能不存在; 並且只需要專注於單一責任。

第二; 這些圖層現在不僅知道還有其他圖層,而且還知道這是一個鏈表。 如果第2層和第3層彼此獨立但僅依賴1層怎么辦? 表達這種能力的能力已經喪失。 最終,控制圖層的項目不再具有存儲所需功能的能力,這導致設計不佳,因為它正朝着上帝的目標努力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM