watch: PyTorch - 刘二 02 | Linear Model

Source video: 《PyTorch深度学习实践》完结合集-02

刘洪普 Blog

监督学习过程:

  1. 准备数据集
  2. 模型设计
  3. 训练
  4. inferring

数据集:

x(hours) y(grades)
1 2
2 4
3 6
4 ?

1-3 training, 4 testing 预测

监督学习:输出值已知

数据分成 Training set 和 Testing set 两部分(不能偷看测试集的label)

Training set 接近 数据的真实联合分布 D(x,y),根据大数定律需要大量数据

Training Set 中分出一部分做开发集,验证模型性能

模型设计:

模型:y = f(x)

先用线性模型是否有效,再换其他的模型。

线性模型:$\hat{y}=f(x) = x*w +b$

预测值 $\hat{y} = x * w$ (先不考虑b)

找到最优的权重,先随机数,计算与数据集的误差(平方和最小),

损失函数,针对一个样本:$loss = (\hat(y)-y)^2 = (x*w-y)^2$,必须是一个标量,才能让他变得更小,不断优化。

x(Hours) y(grades) y_predict(w=3) Loss(w=3)
1 2 3 1
2 4 6 4
3 6 9 9
mean = 14/3

选取w,让平均损失降到最低

Cost function, 对于整个training set, 平均平方误差(Mean Square Error): $cost = \frac{1}{N} \sum_{n=1}{N}(\hat{y}_n - y_n)^2$

x(Hours) Loss(w=0) Loss(w=1) Loss(w=2) Loss(w=3) Loss(w=4)
1 4 3 0 1 4
2 16 6 0 4 16
3 36 9 0 9 36
MSE 18.7 4.7 0 4.7 18.7

不保证能找到0,在真实最小值附近穷举。经过测试最优w存在于0-4之间,对之间所有可能取值(对实数域采样)都计算一下损失,绘制曲线,找最低点。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import numpy as np
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]    #数据用两个列表表示
y_data = [2.0, 4.0, 6.0]

# 定义模型
def forward(x):     #前馈
    return x*w

def loss(x,y):
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)

w_list = []
mse_list = []

for w in np.arange(0.0, 4.1, 0.1): #间隔0.1
    print('w=', w)
    l_sum = 0
    for x_val, y_val in zip(x_data, y_data): #拼成training pair
        y_pred_val = forward(x_val)
        loss_val = loss(x_val, y_val)   #每个样本的loss
        l_sum += loss_val   #cost function是loss function 的平均
        print('\t',x_val, y_val, y_pred_val, loss_val)
    print('MSE=', l_sum/3)
    w_list.append(w)
    mse_list.append(l_sum/3)

plt.plot(w_list, mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()

用训练的轮数 epoch 做横坐标,检查超参数,判别是否收敛.

打印日志输出,实时画图,Visdom

要存盘,避免崩溃,计算白费

模型:$\hat{y} = x*w +b$ 有两个参数,损失函数是曲面,找最低点

3d图绘制使用 np.meshgrid()

Built with Hugo
Theme Stack designed by Jimmy