一、术语
- 标签是我们要预测的真实事物:y;线性回归中的y变量
- 特征是指用于描述数据的输入变量:xi;线性回归中的{x1 ,x2 ,…,xn}变量
- 样本是指数据的特定实例:x
- 有标签样本具有{特征,标签}:{x,y} 用于训练模型
- 无标签样本具有{特征,?}:{x,?} 用于对新数据做出预测
- 模型可将样本映射到预测标签:y’由模型的内部参数定义,这些内部参数值是通过学习得到的
- 训练模型表示通过有标签样本来学习(确定)所有权重和偏差的理想值。在监督式学习中,机器学习算法通过以下方式构建模型: 检查多个样本并尝试找出可最大限度地减少损失的模型,损失是对糟糕预测的惩罚
- 损失是一个数值,表示对于单个样本而言模型预测的准确程度。如果模型的预测完全准确,则损失为零,否则损失会较大。训练模型的目标是从所有样本中找到一组平均损失“较小”的权重和偏差
- 损失函数:创建一个数学函数(损失函数),以有意义的方式汇总各个损失。线性回归模型使用的是一种称为平方损失(又称为 L2 损失)的损失函数。单个样本的平方损失: 预测值和标签值之差的平方= (y - y')²。均方误差 (MSE) 指的是每个样本的平均平方损失。要计算 MSE,请求出各个样本的所有平方损失之和,然后除以样本数量:
虽然 MSE 常用于机器学习,但它既不是唯一实用的损失函数,也不是适用于所有情形的
最佳损失函数
二、训练模型与损失降低
1.训练模型的迭代方法
首先对权重w和偏差b进行初始猜测,然后反复调整这些猜测。直到获得损失可能最低的权重和偏差为止。
2.收敛
在学习优化过程中,机器学习系统将根据所有标签去重新评估所有特征,为损失函数生成一个新值,
而该值又产生新的参数值。
通常,可以不断迭代,直到总体损失不再变化戒至少变化极其缓慢为止。这时候,我们可以说该模
型已
收敛。
3.梯度下降法
梯度:一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,
即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大。
梯度下降法(gradient descent):
一种通过计算并且减小梯度将损失降至最低的技术,它以训练数据为条
件,来计算损失相对于模型参数的梯度。
通俗来说,梯度下降法以迭代方式调整参数,逐渐找到权重和偏差的最佳组合,从而将损失降至最低 。
梯度
是矢量:具有
方向
和
大小。
沿着
负梯度方向
进行下一步探索
用梯度乘以一个称为
学习速率
(有时也称为
步长
)的标量,以确定下一个点的位置
4.学习率的设置
每个回归问题都存在一个合适的学习速率,不损失函数的平坦程度相关。如果损失函数的梯度较小,
则可以放心地试着采用更大的学习速率,以补偿较小的梯度并获得更大的步长。
5.超参数
在机器学习中,超参数是在开始学习过程之前设置值的参数,而丌是通过训练得到的参数数据
通常情况下,需要对超参数进行优化,选择一组好的超参数,可以提高学习的性能和效果
超参
数
是编程人员在机器学习算法中用于调整的旋钮
典型超参数:
学习率、神经网络的隐含层数
量....
三、线性回归代码实现
#在Jupyter中,用matplotlib显示图像需要设置为inline模式,否则不会出现图像
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
# 设置随机种子
np.random.seed(5)
# 直接采用np生成等差数列的方法,生成100个点,每个点的取值在-1~1之间
x_data=np.linspace(-1,1,100)
# y=2x+1+噪声,其中,噪声的维度与x_data一致
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,2*x_data+1.0,color='red',linewidth=3)
# 定义训练数据的占位符,x是特征值,y是标签值
x=tf.placeholder("float",name='x')
y=tf.placeholder('float',name='y')
def model(x,w,b):
return tf.multiply(x,w)+b
# 创建变量,斜率w,截距b,pred预测值
w=tf.Variable(1.0,name='w0')
b=tf.Variable(0.0,name='b0')
pred=model(x,w,b)
# 设置训练参数
# 迭代次数(训练轮数)
train_epochs=10
#学习率
learning_rate=0.05
# 定义损失函数
# 采用均方差作为损失函数
loss_function = tf.reduce_mean(tf.pow((y-pred),2))
# 梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
# 创建会话和初始化
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
# 训练
step=0
loss_list=[] #用于保存loss的列表,之后显示loss
for epoch in range(train_epochs):
for xs,ys in zip(x_data, y_data):
_, loss=sess.run([optimizer,loss_function], feed_dict={x: xs, y: ys})
# display_step:控制报告的粒度,即每训练几次输出一次损失值
# 与超参数不同,修改display_step不会改变模型所学习的规律
loss_list.append(loss)
step=step+1
display_step=10
if step%display_step==0:
print("Train Epoch:",'%02d'% (epoch+1),"Step:%03d"%(step),"loss=",\
"{:.9f}".format(loss))
b0temp=b.eval(session=sess)
w0temp=w.eval(session=sess)
plt.plot (x_data, b0temp + w0temp * x_data )# 画图
print ("w:", sess.run(w)) # w的值应该在2附近
print ("b:", sess.run(b)) # b的值应该在1附近
# 从上图可以看出,由于本案例所拟合的模型较简单,训练3次之后已经接近收敛。
# 对于复杂模型,需要更多次训练才能收敛。
# 模型可视化
plt.scatter(x_data,y_data,label='Original data')
plt.plot (x_data, x_data * sess.run(w) + sess.run(b),label='Fitted line')
plt.legend(loc=2)# 通过参数loc指定图例位置
# 预测
x_test = 12.0
output = sess.run(w) * x_test + sess.run(b)
print("预测值:%f" % output)
target = 2 * x_test + 1.0
print("目标值:%f" % target)
# 图形化显示损失值
plt.subplot(1,2,1)
plt.plot(loss_list)
plt.subplot(1,2,2)
plt.plot(loss_list,'r+')