Interesting. So I printed that out after each epoch to get this:
EPOCH: 0 loss 2.3234457969665527
None
EPOCH: 1 loss 2.202385425567627
None
EPOCH: 2 loss 2.2719340324401855
None
EPOCH: 3 loss 2.2589669227600098
None
EPOCH: 4 loss 2.2334115505218506
None
EPOCH: 5 loss 2.183642864227295
None
EPOCH: 6 loss 2.1640632152557373
None
EPOCH: 7 loss 2.1206531524658203
None
EPOCH: 8 loss 2.122248649597168
None

The “weight_hh_l0” definitely has the grad & grad_fn parameters, but they show up as None.
If I just print out model.char_LSTM_embedding.lstm.weight_hh_l0 , I get :
Parameter containing:
tensor([[-0.1937, -0.0163,  0.0048,  0.4731],
        [ 0.4806, -0.1530,  0.1574,  0.2356],
        [ 0.4753, -0.3674, -0.0729, -0.4358],
        [-0.0319,  0.1454, -0.2711,  0.0383],
        [-0.3419, -0.3858,  0.4250, -0.4939],
        [ 0.0769, -0.2238,  0.3595,  0.1102],
        [-0.2952,  0.3039, -0.4631, -0.0418],
        [-0.1510,  0.2949,  0.4648,  0.1492],
        [ 0.2527,  0.0864, -0.1488, -0.1762],
        [ 0.3032, -0.1722,  0.0164, -0.2508],
        [ 0.0289,  0.1599, -0.1730, -0.3345],
        [ 0.2081, -0.4771,  0.2442, -0.1871],
        [-0.3381, -0.4893, -0.3698,  0.1031],
        [-0.1091,  0.4548,  0.1539, -0.2196],
        [-0.0788,  0.0639,  0.3586, -0.1388],
        [ 0.2838, -0.1048, -0.2579,  0.1436]], requires_grad=True)

I wonder why the loss doesn’t backprop through to the char_LSTM module. 
Thanks so much for replying btw!