在指定环境下训练模型的过程中,当遇到输入或者从RL模型中返回的NaN或inf时,RL模型有完全崩溃的可能。
-
原因和方式
问题出现后,NaNs和infs不会崩溃,而是简单的通过训练传递,直到所有的浮点数收敛到NaN或inf。这符合IEEE浮点运算标准(IEEE754),标准指出:
可能出现的物种异常:
- 无效的操作符( − 1 \sqrt{-1} −1, inf$*$1, NaN mod 1, …)返回NaN
- 除以0:
- 如果运算对象非零(1/0, -2/0, …)返回 ± i n f \pm inf ±inf
- 如果运算对象是零(0/0)返回NaN
- 上溢(指数太高而无法表示)返回 ± i n f \pm inf ±inf
- 下溢(指数太低而无法表示)返回 0 0 0
- 不精确(以2为底时不能准确表示,例如1/5)返回四舍五入值(例如:
assert (1/5) * 3 == 0.6000000000000001
)
只有除以0会报错,其他方式只会静静传递。
在Python中,除以0会报如下错:
ZeroDivisionError: float division by zero
,其他会忽略。Numpy中默认警告:
RuntimeWarning: invalid value encountered
但不会停止代码。最差的情况,Tensorflow不会提示任何信息
import tensorflow as tf import numpy as np print("tensorflow test:") a = tf.constant(1.0) b = tf.constant(