Training starts when you call “Run Training”. If you look at the code inside of “RunTraining”, you’ll see it’s composed of functions like “BeginTraining” etc.
You could add some kind of event to be able to see when Begin Training is called, or you could simply call another function after BeginTraining. I would join the Unreal GitHub and take a look at all the functions we have exposed to Blueprints on the Interactor and the Trainer etc. I think you can create what you want if you use the lower level API.
If you need to change the communications between the C++/Python, then you’ll need to upgrade to 5.5 and/or compile from source on 5.3 and add some extensions.
5.5. adds a primitive “bring your own algorithm” support which makes custom PPO extensions much more feasible.
Good luck!