Based on the error message some parameters of self.value_net didn’t receive a gradient and thus their .grad attribute is set to None.
This could happen, e.g. if you’ve (accidentally) detached the computation graph or if these parameters were not used in the forward pass (and would thus not receive a gradient).
AttributeError means that there was an Error that had to do with an Attribute request. In general, when you write x.y, y is the purported attribute of x. NoneType means that instead of an instance of whatever Class or Object you think you’re working with, you’ve actually got None. That usually means that an assignment or function call up failed or returned an unexpected result.
mylist = mylist.sort()
The sort() method of a list sorts the list in-place, that is, mylist is modified. But the actual return value of the method is None and not the list sorted. So you’ve just assigned None to mylist. If you next try to do, say, mylist.append(1) Python will give you this error.