---
# System prepended metadata

title: 'Preclass Session 5: Optimization'
tags: [Machine Learning]

---

# **Preclass Session 5: Optimization**
[toc]
## **TEFPA Pipeline**
### **Definition**
```mermaid
graph LR

Task --> Experience --> Function_Space --> Performance_measure --> Algorithm
```

- **Task ($\mathcal{T}$)**: is defined of what is the pair of input/output $(x,y)$.

- **Experience (${\mathcal E}$)**: the training dataset $\bf D$ to become experience ${\mathcal E}$ to train the model.
    - In supervised learning: $\bf D = (X,y)$ with $\bf x^t$ is each sample.
    - In unsupervised learning: $\bf D = (X)$ với $\bf x^t$ is each sample.

- **Function Space ($\mathcal{F}$)**: Is a set of parameterized functions (or parametric functions) $f_\theta = ({\boldsymbol \phi}_\alpha, p_w)$ kwhen given the common parameter $\theta$ the change is called the function space $\mathcal{F}$.

- **Performance ($\mathcal{P}$)**: Call $\hat{\theta}$ is the optimized parameters and $\theta^k$ is the current dataset.
    - To deteremine whether $\theta^k$ is optimized or not we need to use Performance Measure $\mathcal{P}$ to evaluate the parametrized function $f_{\theta^k}$ 
    - $\mathcal{P}(\theta): {\theta}^k \xrightarrow{(f_{\theta^k},D)} \text{a score}\in\mathbb{R}$. If $\mathcal{P}$ is a Loss Function $\rightarrow$  $\bf \hat{\theta} = \arg \min \space \mathcal{P}(\theta, X,y)$ with $\bf (X,y)$ are constants from $\bf {\mathcal E}$

- **Algorithm ${\mathcal A}$**: Once there is performance, apply a search algorithm or optimize ${\mathcal A}$ to update from $\theta^k$ to $\theta^{k+1}$ (through iterations) and finally achieve the optimal $\hat{\theta}$. 


### **Example: Dog and Cat Classification**
- **Task ($\mathcal{T}$)**: input $\bf x$ is an image that contains any photo of a dog or cat $\rightarrow$ output $\bf y$ is the prediction of a cat or a dog.

- **Experience (${\mathcal E}$)**: The self-scraping dataset $\bf D$ in the Session 2 Lab (after splitting) $\bf D = \{\{x^t, y^t\}\}_{t=1}^{2984} = (X,y)$

- **Function Space ($\mathcal{F}$)**: is all functions (models) generated through the training process below.

- **Performance ($\mathcal{P}$)**: We evaluate performance of the function $f_{\theta^k}$ when using the parameters set $\theta^k$ with loss function: **Binary Crossentropy (BE)** $\rightarrow$ optimal $\hat{\theta} = \arg \min \space BE(\theta, \bf{X}, y)$

- **Algorithm ${\mathcal A}$**: We use optimizer **Adam** (or SGD) to update the parameters set $\theta$ based on the loss value (performance). For instance, intial loss is **0.4822** with random $\theta^k$ and after 100 epochs (iterations) we achieve the loss of **0.0386** with optimal $\hat{\theta}$


## **Metrics**
Note: $\bf X \in \mathbb{R}^{N \times d}$ $\rightarrow$ $\bf N$ samples and $\bf d$ features
### **Q1: If Logistic Regression is considered, what is the $\theta^k$?**
- $\theta^k$ is the set of $\bf (w, b)$ in which: 
    - $\bf w$ is a weight vector $\bf {w} = (w_1, w_2,..., w_d)$ with $d$ is the dimension of data (or features) of $\bf X$
    - $\bf b$ (bias) if a number added after performing dot product $\bf w^TX$

### **Q2: If Softmax Regression is considered, What is the $\theta^k$?**
- $\theta^k$ is the set of $\bf (W, b)$ in which: 
    - $\bf W$ is a matrix $\in \mathbb{R}^{c \times d}$ with $c$ is the number of classes (labels). Or $\bf W = [w_1,...w_t,...,w_c]^T$ with $\bf w_t$ is a row vector with $d$ dimensions.
    - Bias $\bf b \in \mathbb{R}^c$ is a **vector** with $C$ dimension, added after performing dot product $\bf W^TX$


## **Tensorflow advanced**
### **Initialize weights for layers**
The weights are randomly generated at an early stage and then gradually optimized during training.

Current models mostly use `relu` with the weight-initialization formula associated `He Initialization`
    
```python
model.add(LayerName(...., kernel_initializer="he_normal"))
```

### **Change the learning rate of optimizer**
```python
from tensorflow.keras.optimizers import Adam, AdamW

adam = Adam(learning_rate=0.0003)
model.compile(optimizer=adam, ...)
```

### **Early Stopping**
The EarlyStopping technique allows us to stop training when the loss or metric does not decrease after n_epoch.


```python
from tensorflow.keras.callbacks import EarlyStopping

cb_early_stopping = EarlyStopping(monitor='val_loss', patience=15, restore_best_weights=True)
history = model.fit(..., callbacks=[cb_early_stop])
```