【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)