【pythonでニューラルネットワーク#4】単回帰分析(誤差逆伝播法)

記事の目的

pythonで単回帰分析を、誤差逆伝播法を使用して実装していきます。ここにある全てのコードは、コピペで再現することが可能です。

 

目次

  1. 合成関数の微分
  2. 単回帰分析の誤差逆伝播法

 

1 合成関数の微分

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

# In[2]
class Square:
    
    def forward(self, x):
        self.x = x
        y = x**2
        return y
    
    def backward(self, dy):
        self.dx = dy * 2 * self.x
        return self.dx

# In[3]
class Log:
    
    def forward(self, x):
        self.x = x
        y = np.log(x)
        return y
    
    def backward(self, dy):
        self.dx = dy * 1/self.x
        return self.dx

# In[4]
square1 = Square()
log = Log()
square2 = Square()

# In[5]
x = 2

# In[6]
y1 = square1.forward(x)
y2 = log.forward(y1)
y3 = square2.forward(y2)
print(y1, y2, y3)
print(x**2, np.log(x**2), (np.log(x**2))**2)

# In[7]
dy2 = square2.backward(1)
dy1 = log.backward(dy2)
dx = square1.backward(dy1)
print(dy2, dy1, dx)
print(2*y2, 2*y2 * 1/y1, 2*y2 * 1/y1 * 2*x )

 

2 単回帰分析の誤差逆伝播法

# In[8]
class Linear:

  def __init__(self):
    self.w = 2
    self.b = 1

  def forward(self,x):
    self.x = x
    y = self.w*x + self.b
    return y

def backward(self, dy):

  self.dw = np.dot(dy, self.x)
  self.db = dy.sum()

# In[9]
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[10]
model = Linear()
loss = Loss()

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

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

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