谷歌机器学习速成课程:https://developers.google.cn/machine-learning/crash-course/

监督式机器学习
通过学习如何组合输入信息,来对未见过的数据,做出有用的预测

简单的线性回归案例比如y=w*x+b
标签是要预测的东西,即上面简单案例中的y
特征是描述数据的输入变量,{x1,x2,x3…xn}
样本数据的特定实例,即x
有标签样本{特征,标签}:{x,y}用于训练模型
无标签样本{特征,?}:{x,?}用于预测数据

在监督式学习中,训练模型的过程就是不断尝试尽可能减小损失的过程,通过有标签样本来学习(确定)所有权重和偏差的理想值
L1损失:yi与实际值y的差的绝对值
L2损失(平方损失)
均方误差 (MSE): 每个样本的平均平方损失

对于y=w*x+b,首先对w和b进行初始猜测,然后不断调整直至收敛

对于凸形问题存在一个斜率正好为 0 的位置, 这个最小值就是损失函数收敛之处

梯度:一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大

简而言之,梯度越大意味着导数的绝对值越大,变化率越大
梯度是矢量,具有方向和大小

学习率梯度下降算法的 步长 ,低学习率会花费较长的时间,而学习率过高可能导致永远无法收敛或模型训练结果不准确

超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据
超参数是编程人员在机器学习算法中用于调整的旋钮
典型超参数:学习率、神经网络的隐含层数量……

实战练习

由于没有现有的样本,所以自己用一个线性方程来产生样本,并加入一些噪声,让样本看起来随机一些,不那么有规律。
方程:y=2*x+1
噪声0.4

1
2
3
4
5
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#在网页中使用matplotlib显示图像需要设置inline模式
%matplotlib inline
1
2
3
4
5
6
7
8
x_data=np.linspace(-1,1,100)  # 等差数列生成100个在-1与1之间的点
np.random.seed(5)
y_data=2*x_data+1.0+np.random.randn(*x_data.shape)*0.4

#画出随机生成的样本的散点图
plt.scatter(x_data,y_data)
#画出想要通过学习得到的目标函数
plt.plot (x_data,1.0+2*x_data,'r',linewidth=3)

image.png

1
2
3
4
5
6
def model(x,w,b):
return tf.multiply(x,w)+b
def loss(x,y,w,b):
err = model(x,w,b)-y # 求差
squared_err = tf.square(err) # 求平方得出方差
return tf.reduce_mean(squared_err) # 求均方差
1
2
3
4
5
w = tf.Variable(np.random.randn(),tf.float32)
b = tf.Variable(0.0,tf.float32)

training_epochs = 10 # 训练轮数
learning_rate = 0.01 # 学习率
1
2
3
4
5
#计算梯度函数
def grad(x,y,w,b):
with tf.GradientTape() as tape:
loss_ = loss(x,y,w,b)
return tape.gradient(loss_,[w,b])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 执行训练
step = 0
loss_list = []
display_step = 10
for epoch in range(training_epochs):
for xs,ys in zip(x_data,y_data):
loss_=loss(xs,ys,w,b)
loss_list.append(loss_)

delta_w,delta_b = grad(xs,ys,w,b)
change_w = delta_w*learning_rate
change_b = delta_b*learning_rate
w.assign_sub(change_w)
b.assign_sub(change_b)

step=step+1
if step % display_step == 0:
print("Training Eporch:",'%02d' % (epoch+1),"step:%03d" % (step),
"loss=%.6f" % (loss_))
plt.plot(x_data,w.numpy()*x_data+b.numpy())

image.png

print(“w:”,w.numpy(),”b:”,b.numpy())
打印:w: 1.9897072 b: 1.0370641,看起来还是比较接近的

#图形化查看损失变化情况
plt.plot(loss_list)
plt.plot(loss_list,’r+’)

1
2
3
4
5
6
7
x_test=3.21

predict=model(x_test,w.numpy(),b.numpy())
print("预测值:%f" % predict)

target = 2*x_test + 1.0
print("实际目标值:%f" % target)

执行结果

1
2
预测值:7.426406
实际目标值:7.420000

随机梯度下降法 (SGD)

每次迭代只使用一个样本(批量大小为 1),各个批量的一个样本都是随机选择的

批量梯度下降优化(BGD)

每一次迭代时使用所有样本来进行梯度的更新

总结步骤

生成人工数据集及其可视化
构建线性模型
定义损失函数
(梯度下降)优化过程
训练结果的可视化
利用学习到的模型进行预测


本文总访问