
【pythonでニューラルネットワーク#4】単回帰分析(誤差逆伝播法)
記事の目的
pythonで単回帰分析を、誤差逆伝播法を使用して実装していきます。ここにある全てのコードは、コピペで再現することが可能です。
目次
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)