Self (resource like time or memory on a specific device) indicates the resource spent on that device on the specified routine excluding the resource spent in the functions it calls. For example,

------------- ------------   ------------  ------------  ------------  
   Name        Self CPU       CPU total      CPU Mem      Self CPU Mem   
-------------- ------------  ------------  ------------  ------------ 
   aten::mm    1.883s          1.883s         9.81 Gb           0 b 

Here, aten:mm spends all of its time within that function and it does not spend anytime in calling other functions.(self CPU = CPU total). However, Self CPU Mem is 0b meaning, it does not allocate any new memory apart from the ones given to it as arguments 9.81Gb.

Negative memory (mostly found in self) indicate deallocation. As far as I understand, it is the total extra memory used by that function. The negative sign indicates that the memory is allocated and deallocated by the time the function terminates. In your case, Forward G0 allocates extra 770Kb which then deallocated before it terminates.
It is better to identify the max memory consumed by a function rather than the total memory as that forms the bottleneck.