BackPropagation 101.

2021-04-02 13:52:52

想象一下你是一个项目经理,在广阔的公司内部。你留下了收件箱,发件箱和你团队中的三个人:亚历克斯,博和凯西。工作组合到您的收件箱中,您将其分配给团队中的某人,他们执行工作并将结果寄回给您,然后将这些结果移动到您的Outoutbox。一段时间后,潜在的超出订单,您将收到您提交的工作的Feedbackon。当然,当你收到反馈时,它不会根据这样做的人来标记 - 你不到的官僚机构都知道,也不关心亚历克斯,博和凯西。所有任务都将具有idAttached,并且当您将结果前进时,您将通过该ID。稍后会使用ID来弄清楚如何处理反馈。

def handle_work(团队,收件箱,发件箱,Feedback_from_above):。 。 。虽然真实:如果not_empty(收件箱):task_id,task = next(收件箱)worker = spey_wayer(team)结果= worker(任务)发件箱.send(task_id,结果)如果not_empty(feedback_from_above):task_id,反馈= next(feedback_from_above )。 。 。

因为你不知道你什么时候得到反馈,你有一些州totrack。您需要跟踪谁做了什么任务,因此您可以将FeedBack路由到合适的人。如果亚历克斯做了任务并且你给出了反馈的Tobo,你的团队将不会改善。您的团队成员对TrackToo有一些状态:他们需要了解它与特定ask的每条反馈都涉及。您希望他们能够获得反馈,“这不够”,注意到他们的提案是预算的,看看在那种特定情景中应该不同的事情。

Alex,Bo和Casey应该每个人都保留他们的项目的笔记,并且确实究竟他们应该不同地做出不同的事情应该取决于他们 - 你不想微笑。你有一个伟大的团队。如果你只是围绕信息,他们会照顾其余的。因此,让您的RoutingJob更轻松,您可以在准备就绪时向大家返回给您沿着FEDBACK的回调。回调是由团队的工作人员创建的,它应该包裹在何时/如果ITCOMS的反馈时所需的任何状态。通过此系统,您需要做的就是正确地文件所有回调,当您传递到前进时,然后在进入FED进出时检索右句柄。

def handle_work(团队,收件箱,发件箱,exputback_from_above):虽然true ] = handle_feedback发出框.send(task_id,结果)如果not_empty(feedback_from_above):task_id,反馈= next(feedback_from_above)handle_feedback = pending_feedback [task_id] supple_feedback(反馈)

这个系统肯定会使您的工作简单,所有信息都已正确归因于。但是有些东西仍然缺失。 Alex,Bo和Casey HasfedBack也是:关于他们的投入。他们正在反馈他们的工作,并尽力融入它并改善。但他们的OwperFormance也取决于他们给出的具体输入。它是一种情况,如果给定任务的输入已经有点比特,输出也会不同。纳入他们的工作时,您团队中的工人将有关于他们所提供的理解投入的反馈,以及这些投入如何更好地提出更好的放弃输出,这将更接近您的人真实的人。目前,所有这些反馈都迷路了,而且没有办法生产这些投入的人,以了解你的团队对他们的想法。所以你是另一个向另一个方向指出的发件箱,将你的工人传播给准备他们投入的人员。

当然,您需要明确区分您的输出中收到的反馈以及您的团队产生的反馈意见,并确保正确的反馈部分最终与Theright人员结束。

想象一下,如果亚历克斯创建了一个可能会运行过预算的提案,你已经向上通过了这一提议。后来你传递给亚历克斯列斯的反馈:“不够雄心勃勃;客户要求大胆“。这是亚历克斯的反馈,关于亚历克斯的工作。作出了输入提案的团队,然后听到亚历克斯关于原始投入的反馈:“客户上下文更加令人含糊地描述为”风险批准“,这是模棱两可的措辞。在指定要求时,请更清楚。“如果您将它们传递给亚历克斯的倒带,下面的团队将被误导。他们会移动错误的方向。所以你需要小心一切都是胜利的。反馈亚历克斯和亚历克斯的反馈是通行的。

def handle_work(团队,收件箱,发件箱,Fexback_from_above):pending_feedback = {}虽然true:如果not_empty(收件箱):task_id,task = next(收件箱)工作者=选择_worker(团队)结果,hander_feedback = worker(任务)pending_feedback [task_id] = handle_feedback发件箱.send(task_id,结果)如果not_empty(feedback_from_above):task_id,反馈= next(feedback_from_above)handle_feedback = pending_feedback [task_id] evedback_to_below .send(task_id,handle_feedback(task_id)

通过转发的工作,并送回更正,您的团队和饲养您工作的人正在顺利运作。你询问的更正,博和凯西让越来越小;反过来,通过背部的正门情况也越来越小。生活是好的,工作很容易......豆腐开始有一段时间在你手上。

有一天,你正在观看关于管理的TED谈论,你听到了“人群的智慧”:如果你结合了几个独立的估计,你可以获得Amore准确的结果。你只有三个人群,但你得到了一个预算预算估计任务,所以为什么不给它试试?

对于下一个预算估算任务,而不是将其交给一个工人,而是您决定将它们分别用于处理它。你没有告诉他们关于其他人的工作,因为你不想要groupthink - 你希望他们用一个单独的估计来实现。然后,您将它们全部添加,并发送OFF。

alex_eStimate,get_alex_feedback = alex(任务)bo_estimate,get_bo_feedback = bo(task)casey_eStimate,get_ceasy_feedback = casey(任务)estimate = alex_eStimate + bo_estimate + casey_emity

回顾你现在所知道的,只是加入它们会感到友好......但其余的谈话是关于Jellybeans的奇怪的东西,以及你停止了注意力。所以这就是你所做的。无论如何,你估计的估计是太高的,所以现在你最好给每个人的反馈困扰可以在下次调整。由于这是一个数字估计值,这是一个非常简单的反馈:这只是一个数字。您实际上并不是非常了解Thingnumber以及它真正代表的东西,但如果您的团队输出措施,则获得奖金,这样较小的数字返回。反馈变得越靠到0,奖金越大。你相应地激励你的团队。

您第一次总结其估计,估计的估计多样镜头,以及您的反馈远非零。你应该如何在亚历克斯,博和凯西之间分开进军,而当他们反过来反馈时,你会怎样通过它?

考虑这一点的一种方法是有三个人,而且一件脱钩。所以我们应该在所有三个估计之间划分它。但是你更多的是更多的,并决定你真的不感到憎恨这个:你只想综合得分出来。所以你只需给每个人提供所有反馈,看看这是如何解决的。当然,你的团队起初可能有点混乱,但他们会迅速调整他们的电子表格或其他什么,并且综合估计将越来越近于标记。

还有关于如何传递Alex,Bo和Casey关于对他人的反馈的问题。事实证明,这些成本估计,一切都以易于结构化的格式:“输入”只是一个数字表,来自另一个团队的Wereall估计,他们将信息传递到您的收件箱中。 Soalex,Bo和Casey都产生了相同格式的反馈 - 它是与输入相同大小和形状的数量(因为这是涉及的)。

亚历克斯,博和凯西认真对待他们的奖金,因此他们非常具体地对他们的反馈应该被解释。他们每个人都会给你他们的反馈并告诉你,“看看,告诉人们产生这个数据,如果他们提出了我们的输入,这样这些数字为零,我们自己的反馈将归零,我们都会产生奖金。现在,我知道我们不应该跳转到这个样本的所有东西。而且我知道我也需要掌控调整。如果我做出一些改变,他们每天做一些改变,我们会在一些迭代之后到达那里。“

所以现在你有三个反馈表,都与Sameexample相关。你应该如何传播它?唯一合理的事情是蟾蜍全力以赴并将它们传递,所以这就是你所做的。更多这些练习程序进来,你一直通过你的组合团队,并向下反馈。虽然跟踪所有内部,但它有点麻烦 - 它搞砸了你的整洁系统。所以你有一个明亮的想法:你为自己创造了一个小文件系统,所以你可以跟踪大量组织,就像另一个团队成员一样。

亚历克斯,博和凯西都表现出一个很简单的界面,达到估计,因为数据都很好,常规。我们可以使用Python 3的类型注释语法指定接口,因此我们可以了解我们更好地传递的时间。输入是表,因此将重写为Array2D - 即,二维数组。输出将是asingle number,所以浮动。每个工人还返回一个回调,以处理其输出的反馈,并提供有关其输入的反馈。

如果我们可以引用类型注释中的eStisms_ProjectSapi的对象,它会有所帮助。对此的类型 - 注释解决方案是“协议”。细节有点奇怪,但它看起来像这样:

这为我们提供了一种新型,估算器,我们可以用来描述我们的工作功能。当我们开始组合工人时,我们将通过功能传递功能 - 所以有一些注释会有所帮助,看看更容易出现的问题。

要制作我们的组合工作者,我们只需要返回一个具有Chesame签名的函数。在加法估算器内,我们将致电Alex,Bo和Casey Inturn,添加输出,并将其与回调一起返回。为有关的信任,我们将向RE_前缀为某些数量的反馈,就像它一样对该变量很大。

def combine_by_addition(alex:估算器,bo:估算器,casey:估算器) - >估算器:def run_addition_estimate(输入:array2d) - > float:a_estimate,get_a_feedback = alex(输入)b_eStimate,get_b_feedback = bo(输入)c_estimate,get_c_feedback = casey(输入)summed = a_estimate + b_eStimate + c_estimate def handle_feedback(re_summed:float) - > Array2D:#通过反馈RE输出' SUMBED'对每个工人,并添加它们的#feckback refin re_input =(get_a_feedback(re_summed)+ get_b_feedback(re_summed)+ get_c_feedback(re_summed))返回re_input return sumped,suppl_feedback return run_addition_eStimate

我们现在可以像我们团队中的任何其他人一样使用我们的“加法”工人。和Infact,如果我们明天了解到“凯西”实际上是一个庞大的系统组合的前面......好吧,它是什么?我们仍然通过输入,传递输出,提供输出反馈,并确保incut反馈得到传播。没有什么会改变。

在几个迭代的修正之后,副作用的“工人”你被精心的开始产生了伟大的结果 - 这也很好,即使你周围的倒来普通橡胶印迹也会通知。除了一个伟大的奖金,你得到了一些新的成员:丹尼,伊利和费。您开始思考结合它们的新方法。您还对您的加法系统进行了一些快速更改。现在你有更多的工作者,你想让它更一般。

def combine_by_addition(workers:list [估算器]) - >估算器:def附加_combination(输入:array2d) - > float:callbacks = []求和= 0,适用于工人的工作人员:结果,回调=工作者(输入)求和+ =结果回调.append(worker)def handle_feedback(re_summed:float) - > array2d:re_input =回调中的回调[0](re_summed)在回调中[1:]:re_input + =回调(re_summed)return re_input return sumped,suppl_feedback return附加_combination

至于新的组合,一个明显的主意背心回到你原来的“人群的智慧”的灵感。您可以毫不犹跟添加输出,而不是加上输出。简单。但如何处理反馈?我们应该直接通过那个,就像我们这样做的那样,或者我们应该划分工人数量的反馈吗?

它实际上并不重要:团队成员都了解反馈突钝,“稍微改变模型,以便此数字变得更接近零.ALSO,给我们有关输入的类似反馈。”如果您给他们的反馈,那就太大了,它们会使更改推动零零,它们也将将“真实”的反馈分数推向零。只要你做到这一点,你就无法真正地稳住他们错了。仍然,弄乱幅度让事情凌乱:如果你不当,它可以很容易地在以后导致更相关的错误。如此最好始终如一地处理,并制定适当的划分。

def combine_by_average(workers:list [估算器]) - >估算器:def componal_worker_averaging(输入:array2d) - > float:callbacks = []求和= 0,适用于工人的工作人员:结果,回调=工作者(输入)求和+ =结果回调.Append(工人)普通=总结/ Len(Worker)Def Handle_feedback(re_average:float) - > re_result = re_average / len(workers)re_input =回调回调中的回调[1:]:re_input + =回调(re_result)返回re_input返回平均值,handle_feedback返回componal_worker_averaging

看了这一点,添加了很多明显的复制品。我们将其与其完全相同的事情,作为平均过程的一部分。为什么不遵守加法工作者,只实施平均步骤?

def combine_by_average(workers:list [估算器]) - >估算器:Accopt_Worker = Combine_By_Addition(Workers)Def Comby_Worker_Averaging(输入:Array2D) - > float:summed,handle_summed_feedback =附加_worker(输入)平均= summed / len(workers)def handle_feedback(re_average:float) - > array2d:re_summed = re_average / len(workers)re_input = supple_summed_feedback(re_summed)return re_input返回平均值,suppl_feedback返回comby_worker_averaging

如果您只使用一个团队中的每个工人,并且您将团队尺寸固定,则缩小和平均方法最终表现相同。额外的部门不会最终辞职。这实际上是很有意义的,考虑到我们实现了对平均的反馈意识:在这两种方法中,Workers将最终提出类似的更新,刚刚重新安装 - 加班,他们将轻松地将其输出重新校准到缩放术语,无论哪种方式。

求和和平均是有点相同的,但肯定还有其他方式可以合作?所以你回去阅读更多管理书籍,似乎似乎说你应该听听谁说话。没有一本书都说这样的,但如果你实际上跟进了这个建议,那就是你最终做的事情。这似乎真的很棒,但呃......好吧,让我们试试吧?你的团队真的没有录音,所以“最响亮”不能被剥削。让我们接受它来识别最高估计。

def combine_by_maximum(workers:list [估算器]) - >估算器:def componal_worker_maximum(输入:array2d) - > float:max_estimate = none suppl_for_max = none是否有工人的工作者:估计,handle_feedback =如果max_estimate是none或estimate&gt的工人(输入)。 max_estimate:max_estimate = estimate handle_for_max = handle_feedback return max_estimate,handle_for_max返回modam_worker_maximum

你将两个工人丹尼结合起来,进入一个新的团队,使用基于这个基于amaximp的方法,你几乎可以让你的奖金滑落,因为你进入动作,肯定是我们总是获得最大值,我们的估计是为了攀登和起来,对吧?但是为了你的惊喜,那不是Whathappens。提交高估计的工人是获得FEDBACK的人,所以他们会学会不产生这种INPUTNEXT时间的如此高的估计。丹尼并没有竞争他们的产出所选的 - 从他们的角度来看,他们完全独立工作。他们只是在试图进行调整,以便他们的反馈分数更接近零。

只有最高估计的工人才会获得任何反馈意见吗?我们是否应该尝试根据我们从外申学中学到的东西来训练所有这些?我们实际上不能这样做,因为我们没有反馈到所有输出中的反馈:我们只提交了一个输出,所以我们只留下了一个输出。反馈代表更改的请求:ITTELSS Workers我们在下次相同的情况下,我们希望其输出不同,Giventhe相同的输入。我们不知道关于其他工人的估计,因为我们没有提交他们。

你的combine_by_maximum(dani,丹尼)团队令人惊讶地令人惊讶地工作,所以你解救了你平常的脱离政策,实际上看着一些数据,以弄清楚正在发生的事情,即使是建立一个combine_by_average( Alex,Bo)团队进行比较。经过一点筛分,youdiscover一些有趣的模式,特别是关于两个inputColumns。

基于估计和反馈,您可以看到,如果输入在TheColumn标记为“位于加利福尼亚州”中,则通常意味着估计值得更高。还有一个标有“可再生能源”的专栏,一般也导致估计更高。但是,当两个科学家来说,估计值应该比你预期的价格低得分,这是一系列单独的两列。

combine_by_average(alex,bo)团队真的在努力解决这个问题:无论有什么单独做的,它都没有将这种组合因素置于账户 - 他们都在加州+可再生例子的过度处理,而且他们的普遍存在的情况仅仅在那些只是加利福尼亚州或只是可再生的例子上开始强壮。平均来没有帮助。

虽然平均没有帮助,但Combine_By_Maximum(Da​​ni,Iely)TeamManages遵循他们的个人反馈到一个有趣的“协作”解决方案。有效地,最大操作允许工人“专注”:Dani不用担心加利福尼亚州以外的例子,而且不会担心不符合可再生能源的项目。这意味着对“加利福尼亚”的加权是一个w

......