介绍
我们将会用一个非常简单非实际的问题来帮助理解机器学习和tensorflow(TF)。我们使用一个feature(变量)房屋面积来预测房屋价格。这样将避免讨论高维数据,让我们可以集中理解TF中定义模型,应用模型和训练模型。
(原文中都写的是machine learning,机器学习。尽管现在大家都管TF为深度学习框架,我仍然翻译成机器学习。)
机器学习简介
我们从下面收集的一组数据开始。下图每一个点表示两个值--一个outcome(房屋价格)和一个影响feature(房屋面积)。
然而,我们不知道那些不在图上的features点对应的价格。
我们可以使用机器学习来发现两个之间的关系,这样的话给定一个feature点,我们可以精确的预测出结果。
第一步,选择模型
模型类型
要进行预测,我们需要选择一个模拟可以最好的拟合我们上面收集的数据。
我们可以选择一个线性模型,然后通过调整斜率和截距来拟合那些点。
我们也可以选择一个指数模型,然后通过调整曲率和位置来拟合那些点。
损失函数
要比较哪个模型拟合更好,我们定义最佳拟合为损失函数,我们要最小化这个损失函数。一个损失函数的例子是真实值和预测值的差的绝对值的和(数学上也叫L1)。也就是下图中那些蓝色线的和就是。
注意:更通常的损失函数是距离的平方和,也就是最小二乘。
线性模型简介
为了简单化问题,我们用线性模型来拟合数据。一个线性模型何以数学的表达为
y = W.x + b
Where:
x: house size, in sqm
y: predicted house price, in $
要调整参数来拟合数据,我们可以
-
调整
W
来改变线性模型的梯度 -
调整
b
来改变位置
通过选择不同的W
和b
,我们可以最终选者一个最合适的模型来最小化损失函数。除了随机的选择W
和b
,我们有没有更好的办法来尝试W
和b
?
梯度下降
如果你在山上的一个平台上,当你想下降到最低点的时候,你的视野是这样的
下降的方向是不明了的!这样最好的办法就是梯度下降(gradient descent):
- 在当前位置找到最陡峭的方向最为梯度方向
- 沿着选择的方向走一步,步长为
X
- 重复上面的办法,这就是training
最小化损失函数也相似。下图中,损失函数就像那个山一样起伏,我们的目的是找到最低点。通过梯度下降,我们可以做到这一点。
有了线性模型,损失函数,和梯度下降这些概念,我们可以进一步学习TF了。
第二步:TF中建模
TF中线性模型
TF的两个基本概念是:
1. placeholder: 表示进行梯度下降算法的时候,输入模型中的实际值。在上面的例子中,也就是房屋面积(x)和房屋价格(y_)。
2. variable:表示损失函数中我们要寻找最佳值的那些变量,也就是上例中的W
和b
。
在TF中线性模型y = W.x + b
表示为
TF中的损失函数
类似于把真实房屋价格输入到模型中,我们建立一个placeholder:
我们的最小二乘损失函数可以表示为
数据
因为我们没有实际的房屋价格(y_)和房屋面积(x),我们模拟出它们的值
模拟的时候,我们假设房屋价格是房屋面积的2倍。
梯度下降
有了线性模型,损失函数,数据,我们就可以用梯度下降来最小化损失函数,寻找到最优的W和b。
0.00001
就是梯度下降中的沿着最陡峭方向的步长,也叫learning rate。
第三步:训练模型
训练模型包括按照预先设置的迭代次数进行梯度下降,或者直到损失函数小于一个预先给定的值。
TF Quirks
所有的variable都要给定初始值,否则的话他们可能保持上次迭代的值
TF Session
尽管TF是一个python库,python是一个解释型的语言,但是因为性能原因,TF默认却不能执行解释运算。所以上面的init
并没有执行。TF在session里面执行,建立一个session(sess)然后执行的话使用sess.run()
类似的,我们通过调用sess.run()
里的循环来执行train_step.
你需要把实际值输入到x,y_组成的feed里面去,这是因为TF把解出来的train_step放入他的dependencies里:
dependencies的底部就是x, y_的placeholders.我们已经知道,tf.placeholders是用来输入实际的房屋价格(y_)和房屋面积(x)的。
结果
我们打印出循环里的值来显示TF怎么找到最佳的W
和b
的。
总结
我们学习了机器学习的最简单的模型,用一个feature来预测结果。为了简化问题,我们使用了线性模型来拟合数据。然后定义一个损失函数来找到最佳拟合。最后通过梯度下降来找到variableW
和b
的最佳估计。
下一步
在下一篇文章,我们将会
-
设置Tensor Board来可视化TF的执行,这样可以检测到我们模型,损失函数和梯度下降的问题
-
分批(batches)输入数据来训练模型(而不是每次输入一个数据点),并且展示这样会怎么影响结果