損失関数を用いた最適化の例
ある行列$ Wに対してベクトル$ \boldsymbol{x}を左から掛けたときの結果が$ \boldsymbol{t}となるように、$ Wの値を調整する問題を考える。
$ W = \left[\begin{array}{cc} 1& 2 \\ 2&3 \end{array}\right], $ \boldsymbol{x} = \left[\begin{array}{cc} 1 & 2\end{array}\right], $ \boldsymbol{t} = \left[\begin{array}{cc} 5 & 5\end{array}\right]
方針
1. 損失関数を用いて、誤差$ loss(\boldsymbol{x}W - \boldsymbol{t})を求める
2. 自動微分を用いて$ Wに対する誤差の勾配を求める
3. optim.SGDを用いて誤差の値が少なくなるように$ Wを更新する
以上の手続きを十分な回数繰り返すことにより、$ Wの値を最適化する。
code:optim_loss1.py
import torch as pt
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
loss_func = nn.MSELoss()
alpha = 0.1
x = pt.tensor(1, 2, dtype=pt.float) # 入力
W = pt.tensor(1, 2], [2, 3, dtype=pt.float, requires_grad=True) # 重み
t = pt.tensor(5, 5, dtype=pt.float) # 目標
optimizer = optim.SGD(W, lr=alpha) loss_list =[]
print('# 初期値----------------')
print('重みW:', W)
print('入力x:', x)
for i in range(20):
optimizer.zero_grad()
y = x@W
loss = loss_func(y, t)
loss_list.append(loss.item())
loss.backward()
optimizer.step() # リーフの更新
print('# 結果----------------')
print('重みW:', W)
print('検算x@W:', x@W)
print('目標t:', t)
plt.title('loss function')
plt.grid()
plt.plot(loss_list)
plt.show()