这俩天天天陷入自我怀疑,为啥我写的程序bug频出?
为啥老纸写的 agent 输出的 action 会带有 NaN?
Surprise Motherf***er!!!
就爱情/学业/工作总得有一个顺的吧? F**K!!!
给 np.arccos 输入不在定义域的值,这天经地义的事儿,必须返回 NaN
但是,你在调用的时候,是希望算出角度的,也就是说,你已经有了 cos 值,希望反推出角度
θ
\theta
θ
正常情况下,你的cos值显然也是, [ − 1 , 1 ] [-1, 1] [−1,1]这个范围的
但是,总会遇到非正常情况
# 计算向量 self2obj_v 和 self_angle_v 的内积
inner_product = (self2obj_v * self_angle_v).sum()
# 内积除以二者的模长,就是夹角的 cos 值,self_angle_v 是个单位向量
cos = inner_product / np.linalg.norm(self2obj_v) # <----------------- 问题出在这里
# 反推导 arccos 值就是你的角度
obj_angle = np.arccos(cos)
看下出问题的那行,由于他是个分数,所以可能产生异常值,而我就好巧不巧的得到了:
c
o
s
=
1.000001
cos = 1.000001
cos=1.000001
然后,
n
p
.
a
r
c
c
o
s
(
c
o
s
)
=
N
a
N
np.arccos(cos)=NaN
np.arccos(cos)=NaN
。。。。。。
我以为是激活函数的,问题,或者是什么梯度爆炸的问题,结果是这里出的错…
就,挺秃然的
所以,以后在输出的 cos 值后(如果你是通过内积计算的cos值),最好 clip 一下:
inner_product = (self2obj_v * self_angle_v).sum()
cos = inner_product / np.linalg.norm(self2obj_v)
cos = np.clip(cos, -1, 1) # <---------------------- 这里 clip 一下
obj_angle = np.arccos(cos)
好吧,That’s all.
这么个小bug,折腾我好几天,太过分了
单今天一下午调试的log: