Prevent overfitting

Get more data

Getting more data than the number of effective parameters in the model is clearly an option to fight overfitting, although not always an easy one.

Reduce the complexity of the model

This can be accomplished by reducing the number of layers and/or reducing the number of hidden units in each layer.

Add weight regularization

In Keras, weight regularization is added by passing weight regularizer instances to layers as keyword arguments.

Adding L2 weight regularization to the model

  • regularizer_l2(0.001) means every coefficient in the weight matrix of the layer will add 0.001 * weight_coefficient_value to the total loss of the network.

  • Note that because this penalty is only added at training time, the loss for this network will be much higher at training time than at test time.

As an alternative to L2 regularization, you can use one of the following Keras weight regularizers

  • regularizer_l1(0.001)
  • regularizer_l1_l2(l1 = 0.001, l2 = 0.001)

Add dropout

  • Dropout, applied to a layer, consists of randomly dropping out (setting to zero) a number of output features of the layer during training.

  • The dropout rate is the fraction of the features that are zeroed out; it’s usually set between 0.2 and 0.5.

  • At test time, no units are dropped out; instead, the layer’s output values are scaled down by a factor equal to the dropout rate, to balance for the fact that more units are active than at training time.

  • The core idea is that introducing noise in the output values of a layer can break up happenstance patterns that aren’t significant, which the network will start memorizing if no noise is present.

Example

Drop random units at training time (50% in this case):

layer_output <- layer_output * sample(0:1, length(layer_output),
                                      replace = TRUE)

At test time, use all units but scale their values down by 50%:

layer_output <- layer_output * 0.5

In practice, both operations can be implemented during training, leaving the output unchanged:

layer_output <- layer_output * sample(0:1, length(layer_output), replace = TRUE)
layer_output <- layer_output / 0.5

Note that at training time we are scaling up instead of scaling down.

Dropout in Keras

In Keras, you can introduce dropout in a network via layer_dropout, which is applied to the output of the layer immediately before it:

layer_dropout(rate = 0.5)

Reference material

This lecture note is based on (Chollet and Allaire 2018).

References

Chollet, F., and J. Allaire. 2018. Deep Learning with R. Manning Publications. https://books.google.no/books?id=xnIRtAEACAAJ.