Created by: guoshengCS
中文文档见 https://github.com/PaddlePaddle/FluidDoc/pull/1713
Add support for dynamic_decode(while) training. 使用示例见单测
修改assign_op的原因是:while_op要求cond在CPU上,暂时为assign加了force_cpu以保证经过计算后的bool tensor(大部分OP会在计算时将其转到GPU上)能够assign到CPU上。看到while_op最新的代码已经加了拷贝,不过感觉assign还是可以支持下,避免assign的拷贝后在while_op再次拷贝。
修改array_read_write_op的原因是:与StaticRNN/recurrent_op类似 https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/rnn_memory_helper_op.cc#L102 ,while_op中最后一步的内容需要有梯度来源。若while block中的内容如下:
input = layers.array_read(input_array, i)
state = layers.array_read(state_array, i)
output, next_state, next_input = step(input, state)
layers.increment(x=i, value=1.0, in_place=True)
layers.array_write(next_input, input_array, i)
layers.array_write(next_state, state_array, i)
layers.array_write(output, output_array, i)
其他时间步的next_state能从下一步获取梯度,最后一步的next_state可能无来源(若state_array在while外被使用则有来源),若无来源则梯度初始为0(通过增强array_write的反向ReadFromArrayOp实现)。