A method of encoding data for transmission over a communication channel, the method comprising training an encoding device using a machine learning computing system, the computing system comprising: at least one processor; and at least one tangible, non-transitory computer-readable medium that stores instructions that, when executed by the at least one processor, cause the computing system to perform the training, wherein the training comprises: obtaining data descriptive of a model that comprises an encoder model (112; 202), a channel model (114; 208) and a decoder model (116; 212), wherein the encoder model is configured to receive a first set of inputs and, in response to receipt of the first set of inputs, generate a first set of outputs, wherein the channel model is configured to receive the first set of outputs and, in response to receipt of the first set of outputs, generate a second set of outputs, and wherein the decoder model is configured to receive the second set of outputs and, in response to receipt of the second set of outputs, 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, continue 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, continue to backpropagate the first loss function through the encoder model while modifying the encoder model to train the encoder model; and using the trained encoder device comprising the trained encoder model to encode data for transmission over the communication channel. at least one processor; and at least one tangible, non-transitory computer-readable medium that stores instructions that, when executed by the at least one processor, cause the computing system to perform the training, wherein the training comprises: obtaining data descriptive of a model that comprises an encoder model (112; 202), a channel model (114; 208) and a decoder model (116; 212), wherein the encoder model is configured to receive a first set of inputs and, in response to receipt of the first set of inputs, generate a first set of outputs, wherein the channel model is configured to receive the first set of outputs and, in response to receipt of the first set of outputs, generate a second set of outputs, and wherein the decoder model is configured to receive the second set of outputs and, in response to receipt of the second set of outputs, 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, continue 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, continue to backpropagate the first loss function through the encoder model while modifying the encoder model to train the encoder model; and using the trained encoder device comprising the trained encoder model to encode data for transmission over the communication channel. obtaining data descriptive of a model that comprises an encoder model (112; 202), a channel model (114; 208) and a decoder model (116; 212), wherein the encoder model is configured to receive a first set of inputs and, in response to receipt of the first set of inputs, generate a first set of outputs, wherein the channel model is configured to receive the first set of outputs and, in response to receipt of the first set of outputs, generate a second set of outputs, and wherein the decoder model is configured to receive the second set of outputs and, in response to receipt of the second set of outputs, 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, continue 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, continue to backpropagate the first loss function through the encoder model while modifying the encoder model to train the encoder model; and using the trained encoder device comprising the trained encoder model to encode data for transmission over the communication channel.