## 2 Materials and Methods
### Generative Adversarial Networks  
A GAN is a Deep Learning (DL) architecture used for the synthesis of data via a generator model. GANs are fit to data using an unsupervised approach, where the generator is trained by competing with a discriminator that evaluates the authenticity of the synthetic data produced [41, 24]. While the basic concept behind a GAN is relatively straightforward, the theory behind their configuration and training can be incredibly challenging [48, 49, 50, 51, 25]. To generate new data, the generator samples from a random Gaussian distribution (e.g., \(\mu\) = 0, \(\sigma\) = 1), finding the best means of mapping this data out onto the real sample domain. A fixed-length random vector is used as input, triggering the generative process. Once trained, this vector space can essentially be considered a compressed representation of the real data's distribution. This multidimensional vector space is most commonly referred to in DL literature as _latent space_[21; 48]. The discriminator model takes as input the output of the generator. This discriminator can then be used to predict a class label (real or fake) for the generated data. In some cases, this model is referred to as a _critic model_[52; 53]. For the purpose of this study, multiple experiments were performed to define an optimal GAN architecture. These experiments followed standard DL protocol, finding the optimal neural network configurations by evaluating the effects of each hyperparameter on model performance. Summaries of the hyperparameters tested are included in Table 1.  
In addition to this, the extensive literature on the \"best-practices\" in GAN research and different heuristics in GAN hyperparameter selection were considered [48; 49; 51; 54]. Among these, common \"GAN-Hacks\" were evaluated, including:  
* Use of the [PERSON] optimization algorithm (\(\alpha\) = 0.0002, \(\beta\)1 = 0.5)
* Use of dropout in the generator with a probability threshold of 0.3
* Use of Leaky ReLU (slope = 0.2)
* Stack hidden layers with increasing size in the generator and decreasing size in the discriminator. For training, trials experimenting with the number of epochs and batch sizes were performed. The final values were chosen in accordance with the requirements of the model in order to reach an acceptable stability. While binary cross-entropy is typically a recommended loss function for training, this study experimented with alternatives, such as the Least Squares loss function (_LSGAN_) and two versions of Wasserstein loss (_WGAN_). _LSGAN_ was originally proposed as a means of overcoming small or vanishing gradients, which are frequently observed when using binary cross-entropy [50; 52]. In _LSGAN_, the discriminator (\(D\)) attempts to minimize the loss (\(L\)), using the sum squared difference between the predicted and expected values for real and fake data (Equation (1)), while the generator (\(G\)) attempts to minimize this difference assuming data is real (Equation (2)):  
\[L_{D}^{LSGAN}=-\mathrm{E}_{x\sim p_{d}}\big{[}(D(x)-1)^{2}\big{]}+\mathrm{E}_{ x\sim p_{d}}\big{[}D(\hat{x})^{2}\big{]} \tag{1}\]  
\[L_{G}^{SGAN}=-\mathrm{E}_{\hat{x}\sim p_{d}}\big{[}(D(\hat{x}-1))^{2}\big{]} \tag{2}\]