A computer-implemented encoder for encoding data for transmission over a communication channel, the encoder comprising: a trained encoder model configured to encode data for transmission over the communication channel, wherein the encoder model has been trained by performance of training operations, the training operations comprising: obtaining data descriptive of the encoder model, a channel model, and a decoder model, training the channel model to emulate the communication channel; and after training the channel model to emulate the communication channel, training the encoder model and the decoder model based on the channel model, wherein training the encoder model and the decoder model comprises: processing a first set of inputs with the encoder model to generate a first set of outputs; processing the first set of outputs with the channel model to generate a second set of outputs; processing the second set of outputs with the decoder model to generate a third set of outputs; determining a first loss function that describes a difference between the first set of inputs and the third set of outputs; backpropagating the first loss function through the decoder model while modifying the decoder model to train the decoder model; after backpropagating the first loss function through the decoder model, continuing to backpropagate the first loss function through the channel model without modifying the channel model; and after backpropagating the first loss function through the channel model, continuing to backpropagate the first loss function through the encoder model while modifying the encoder model to train the encoder model. obtaining data descriptive of the encoder model, a channel model, and a decoder model, training the channel model to emulate the communication channel; and after training the channel model to emulate the communication channel, training the encoder model and the decoder model based on the channel model, wherein training the encoder model and the decoder model comprises: processing a first set of inputs with the encoder model to generate a first set of outputs; processing the first set of outputs with the channel model to generate a second set of outputs; processing the second set of outputs with the decoder model to generate a third set of outputs; determining a first loss function that describes a difference between the first set of inputs and the third set of outputs; backpropagating the first loss function through the decoder model while modifying the decoder model to train the decoder model; after backpropagating the first loss function through the decoder model, continuing to backpropagate the first loss function through the channel model without modifying the channel model; and after backpropagating the first loss function through the channel model, continuing to backpropagate the first loss function through the encoder model while modifying the encoder model to train the encoder model. processing a first set of inputs with the encoder model to generate a first set of outputs; processing the first set of outputs with the channel model to generate a second set of outputs; processing the second set of outputs with the decoder model to generate a third set of outputs; determining a first loss function that describes a difference between the first set of inputs and the third set of outputs; backpropagating the first loss function through the decoder model while modifying the decoder model to train the decoder model; after backpropagating the first loss function through the decoder model, continuing to backpropagate the first loss function through the channel model without modifying the channel model; and after backpropagating the first loss function through the channel model, continuing to backpropagate the first loss function through the encoder model while modifying the encoder model to train the encoder model.