【pythonでニューラルネットワーク#2】単回帰分析(勾配降下法)

記事の目的

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

 

目次

  1. 勾配降下法の概要
  2. ライブラリとデータの作成
  3. モデル
  4. モデルの学習
  5. 結果の可視化

 

1 勾配降下法の概要

 

2 ライブラリとデータの作成

# In[1]
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)

# In[2]
x_train = np.random.normal(5, 1, 10)
t_train = 3*x_train + 2 + np.random.randn(10)
# x_train = (x_train - x_train.mean())/x_train.std()
# t_train = (t_train - t_train.mean())/t_train.std()

# In[3]
plt.scatter(x_train,t_train)

 

3 モデル

# In[4]
def model(x ,w, b):
  y = w*x + b
  return y

# In[5]
def loss(y, t):
  L = sum((y-t)**2) / len(t)
  return L

# In[6]
def optimizer(x, y, t, w, b, lr):

  dy = 2*(y-t) / len(t)
  dw = np.dot(dy, x)
  db = dy.sum()

  w = w - lr*dw
  b = b - lr*db

  return (w,b)

 

4 モデルの学習

# In[7]
w,b = 0.5, 0.5

for epoch in range(1, 10 + 1):
    
    y = model(x_train, w, b)
    loss_train = loss(y, t_train)
        
    w,b = optimizer(x_train, y, t_train, w, b, lr=1e-2)

    print(f"Epoch {epoch}, Loss {loss_train:.4f}")

 

5 結果の可視化

# In[8]
x = np.arange(2,8)
y = model(x, w, b)
plt.plot(x, y)
plt.scatter(x_train, t_train)