为什么tensorflow在计算Sigmod的梯度时会再次计算Sigmoid的输出?

时间:2017-07-09 14:07:02

标签: tensorflow

读取张量流的源代码我发现Sigmoid Gradient Computation定义如下。

Status SigmoidGrad(const AttrSlice& attrs, FunctionDef* g) {
// clang-format off
return GradForUnaryCwise(g, {
  {{"y"}, "Sigmoid", {"x"}},
  FDH::Const("const", 1.0f),
  {{"one"}, "Cast", {"const"}, {{"SrcT", DT_FLOAT}, {"DstT", "$T"}}},
  {{"a"}, "Sub", {"one", "y"}, {}, {"dy"}},
  {{"b"}, "Mul", {"y", "a"}},             // y * (1 - y)
  {{"dx"}, "Mul", {"dy", "b"}},           // dy * y * (1 - y)
});
// clang-format on
}

我的问题是,为什么tensorflow会重新计算Sigmoid的输出以计算它的渐变。它不是存储在op的上下文中吗?

代码片段来自github

2 个答案:

答案 0 :(得分:1)

sigmoid的导数可以用sigmoid计算:

enter image description here

因此,TF可以重复使用之前的一些注释来计算结果。

答案 1 :(得分:0)

  

为什么tensorflow重新计算Sigmoid的渐变输出?

它没有 - 这就是tensorflow等框架之美。 Tensorflow will reuse nodes that can be reused.因此,渐变中的sigmoid节点将自动重用sigmoid计算。

请注意,节点重用比每操作优化要强大得多,因为优化可以在图中的任何位置,不同操作之间进行。