they are actually all the same underneath, just a trainable matrix (linear comes with an extra bias tensor). however, they have wrappers that allow them to behave differently when you give it an input.

nn.Embedding selects the rows of the given matrix, given a list of integers

nn.Linear does the einsum operation ...d, d e -> ...e

nn.Parameter basically just makes a tensor trainable (receive gradients and updates on step). this is the lowest level you can go, so actually, you can define your entire deep neural network with just nn.Parameters and manually do all the above with gathers and matrix multiplies or einsums