本文是书籍《TensorFlow深度学习》的学习笔记之一
已知真实的模型,
y
=
1.477
x
+
0.089
y=1.477x+0.089
y=1.477x+0.089
我们通过模拟数据作为数据集来训练这个模型。
采样数据
给模型加点误差后,进行采样
y
=
1.477
x
+
0.089
+
e
,
e
服
从
N
(
0
,
0.01
)
y=1.477x+0.089+e,e 服从N(0,0.01)
y=1.477x+0.089+e,e服从N(0,0.01)
通过随机采样100次,得到100个样本组成的训练集
D
t
r
a
i
n
D^{train}
Dtrain
data = []
for i in range(100):
x = np.random.uniform(-10., 10.)
# 采样高斯噪声
eps = np.random.normal(0.,0.01)
y = 1.477*x+0.089+eps
data.append([x,y])
#转换为2D numpy数组
data = np.array(data)
计算误差
每个样本点都与真实值之间有偏差,加在一起求得训练集上的均方误差(MSE)损失值:
def mse(b, w, points):
# 根据当前的w,b计算均方差损失
totalError = 0
for i in range(0, len(points)):
x = points[i, 0] # 获得i号点的输入x
y = points[i, 1] # 获得i号点的输出y
#连加误差
totalError += (y - (w * x + b)) ** 2
#取平均
return totalError / float(len(points))
计算梯度
误差公式对w和b分别求导,很容易算出梯度:
def step_gradient(b_current, w_current, points, lr):
b_gradient = 0
w_gradient = 0
M = float(len(points)) # 总样本数
for i in range(0, len(points)):
# 累加样本的所有梯度
x = points[i, 0]
y = points[i, 1]
b_gradient += (2 / M) * ((w_current * x + b_current) - y)
w_gradient += (2 / M) * ((w_current * x + b_current) - y) * x
new_b = b_current - (lr * b_gradient)
new_w = w_current - (lr * w_gradient)
return [new_b, new_w]
梯度更新
迭代若干个epoch
def gradient_descent(points, starting_b, starting_w, lr, num_iterations):
b = starting_b
w = starting_w
for step in range(num_iterations):
#迭代很多个epoch
b, w = step_gradient(b, w, np.array(points), lr)
# 计算当前的损失值,用于监控训练进度
loss = mse(b, w, points)
if step % 50 == 0:
print(f"iteration:{step},loss:{loss},w:{w},b:{b}")
# 返回计算结果
return [b, w]
主函数
def main():
# 加载数据
lr = 0.01
initial_b = 0
initial_w = 0
num_iterations = 1000
[b, w] = gradient_descent(data, initial_b, initial_w, lr, num_iterations)
loss = mse(b, w, data)
print(f'final loss:{loss},w{w},b:{b}')
运行结果
可以看出已经逼近了我们之前设定的函数。梯度下降有个问题就是求解得到的值可能是局部极小值而非全局最小值,但是在实践中往往都能求得最小值。
总结
如果我们换一个角度来看待这个问题,它其实可以理解为一组连续值(向量)的预测问
题。给定数据集𝔻,我们需要从𝔻中学习到数据的真实模型,从而预测未见过的样本的输出值。在假定模型的类型后,学习过程就变成了搜索模型参数的问题,比如我们假设神经元为线性模型,那么训练过程即为搜索线性模型v的𝒘和𝑏参数的过程。训练完成后,利用学到的模型,对于任意的新输入𝒙,我们就可以使用学习模型输出值作为真实值的近似。
对于预测值是连续的实数范围,或者属于某一段连续的实数区间,我们把这种问题称为回归(Regression)问题。特别地,如果使用线性模型去逼近真实模型,那么我们把这一类方法叫做线性回归(Linear Regression,简称LR),线性回归是回归问题中的一种具体的实现。