Neural structured learning is a framework used for training neural networks with structured signals. This can be applied to NLP, vision or any prediction problem in general(classification, Regression).

The structure can be explicitly given (**like knowledge graphs in NLP**) or structure can be generated on the fly while training (like creating adversarial examples with perturbations in the data).

Why is this helpful?

- This helps to achieve better accuracy when labeled data samples are really small
- More robust models(because the goal of adversarial examples generated is to confuse the model to predict wrong.)
- The models will be invariant to slight variations in input data

**The high-Level idea of NSL**

- Create any Neural network model
- for each batch of data
- calculate the regular loss (cross-entropy or mean squared error)
- perturb the batch based on the gradient direction(called adversarial examples of original data)
- calculate the adversarial loss passing the perturbed examples to the same model
- loss = regular loss + adversarial loss
- optimize the overall loss

**Applying NSL to Regression Models**

Create a simple Regression model

Regular loss

Generate adversarial examples by making perturbations based on current gradient value

Calculate adversarial loss

Training

While combing both losses it's better to take a weighted sum of losses(regular_loss + 0.2*adverserail_loss)

The adversarial loss is not very different from regular loss as the rate of perturbation is less(play around with adv_step_size in the config)

If you have categorical variables in your data and don't want the perturb them use feature mask .(https://github.com/tensorflow/neural-structured-learning/issues/50)