shobhit
shobhit

Reputation: 11

Model Overfits after adding bias

Implementation of 4bit up counter. First, I have implemented the model without using the bias term. the model seems to have worked correctly but after adding the bias term the model overfits at the very initial stage and the loss becomes zero. Even for the unseen data, the model predicts the same output as of training data. Below is the implementation of the same. What is the problem...

import numpy as np
import matplotlib.pyplot as plt
#Batch training
#input & output
x = np.array([[0,0,1,0],[0,0,0,0],[0,0,0,1],[0,0,1,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1],[1,0,0,0],[1,0,0,1]]) # 10*4
y = np.array([[0,0,1,1],[0,0,0,1],[0,0,1,0],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1],[1,0,0,0],[1,0,0,1],[1,0,1,0]]) # 10*4

def sigmoid(x):
  return 1/(1+np.exp(-x))

def sigmoid_prime(x):
  return sigmoid(x)*(1-sigmoid(x))

Input_Size = 4
Output_Size = 4
Hidden_Layer_Neurons = 8
Learning_Rate = 0.01

weight1 = np.random.uniform( size = ( Input_Size, Hidden_Layer_Neurons ) ) # 4*8
weight2 = np.random.uniform( size = ( Hidden_Layer_Neurons, Output_Size ) ) # 8*4
loss = []
iteration = []
bias1 = np.random.uniform( size = ( x.shape[0], Hidden_Layer_Neurons ) )
bias2 = np.random.uniform( size = ( x.shape[0], Output_Size ) )

for i in range(30000):
  a1 = x #10*4
  z2 = np.dot( a1, weight1 ) + bias1 # 10*4 ** 4*8 = 10*8
  a2 = sigmoid(z2) # 10*8
  z3 = np.dot( a2, weight2 ) + bias2 # 10*8 ** 8*4 = 10*4
  val = 0
  err1 = 0
  if i > 100:
    for j in range(10):
      for k in range(4):
        val += (y[j][k]-z3[j][k])*(y[j][k]-z3[j][k])
    val = val/(2*10)
    loss.append(val);
    iteration.append(i) 
  del_out = ( z3 - y )  # 10*4 - 10*4 = 10*4
  weight2 -= Learning_Rate*np.dot( a2.T, del_out )#8*10 ** 10*4= 8*4
  bias2 -= Learning_Rate*del_out 
  err = np.dot(del_out, weight2.T)*sigmoid_prime(z2) #10*4 ** 4*8 = 10*8 * 10*8= 10*8
  weight1 -= Learning_Rate*np.dot( a1.T, err ) #4*10 ** 10*8 = 4*8
  bias1 -= Learning_Rate*err


print(z3) 
plt.plot( iteration, loss )
plt.show() 

def model():
    q = np.array([[1,0,1,0],[1,0,1,1],[1,1,0,0], [1,1,0,1], [1,1,1,0], [1,0,0,0],[1,1,1,1],[0,0,1,1],[0,0,0,1],[0,0,1,0]])
    z = np.dot(q, weight1) + bias1 
    act_hidden = sigmoid(z)  
    output = np.dot(act_hidden, weight2) + bias2
    print(output)

model()

Why bias adding creates a problem here and when we should add bias?

Upvotes: 1

Views: 47

Answers (0)

Related Questions