【pythonでニューラルネットワーク#5】単回帰分析(パラメータ更新)

記事の目的

pythonで単回帰分析のパラメータ更新を実装していきます。ここにある全てのコードは、コピペで再現することが可能です。

 

目次

  1. パラメータ更新の概要
  2. ライブラリと関数のクラス
  3. 順伝播
  4. 逆伝播
  5. パラメータ更新

 

1 パラメータ更新の概要

 

2 ライブラリと関数のクラス

# In[1]
import numpy as np
import matplotlib.pyplot as plt

# In[2]
class Optimizer:
    def step(self, lr):
        self.w -= lr * self.dw
        self.b -= lr * self.db

# In[3]
class Linear(Optimizer):
    
    def __init__(self):
        self.w = 2
        self.b = 1
        
    def forward(self,x):
        self.x = x
        self.y = self.w*x + self.b
        return self.y
        
    def backward(self, dy):
        
        self.dw = np.dot(dy, self.x)
        self.db = dy.sum()

# In[4]
class Loss:
    
    def forward(self, y, t):
        self.y = y
        self.t = t
        L = sum((y-t)**2)/len(t)
        return L
        
    def backward(self):
        dy = 2*(self.y - self.t) / len(self.t)
        return dy

# In[5]
model = Linear()
loss = Loss()

 

3 順伝播

# In[6]
x = np.array([1,2])
t = np.array([5,8])

# In[7]
y = model.forward(x)
L = loss.forward(y,t)
print(y, L)

 

4 逆伝播

# In[8]
dy = loss.backward()
model.backward(dy)
print(dy, model.dw, model.db)

 

5 パラメータ更新

# In[9] 
model.step(lr=1e-2)
print(model.w, model.b)

# In[10] 
for i in range(100):

  y = model.forward(x)
  L = loss.forward(y,t)

  dy = loss.backward()
  model.backward(dy)

  model.step(lr=1e-2)

print(model.w, model.b)