2.线性回归-理解TensorFlow中wb参数的含义

  • A+
所属分类:深度学习

刚开始入门的时候,我们经常遇到单层神经网络模型如下:

b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 1], -1.0, 1.0))
y = tf.matmul(W, x) + b

 

我们如何去理解它。

输入数据x 可以理解,输出数据y也是可以理解的。

如何去理解w 和b的含义。今天我们来深度的解刨一下。

一、从简单训练简单理解

x_data = np.float32(np.random.rand(1, 100)) # 随机输入
y_data = np.dot([0.100], x_data) + 0.300

b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 1], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

init = tf.global_variables_initializer()

sess = tf.Session()
sess.run(init)

for step in range(0, 201):
    sess.run(train)
    if step % 20 == 0:
        print(step)
        print(sess.run(W))
        print(sess.run(b))

 

如上图和代码。

如果我们我一条简单的离散数据,y_data = np.dot([0.100], x_data) + 0.300
我离散了这个数据在一条直线的左右两边。当然这个还不是真正的rand,我们只是举例。

我们通过最小均方差的梯度训练,最后我们能得到一条最合理的直线,y = wx + b 使得这些数据离我们训练出来的举例最小化。

这个就是最小均方差的概念

最后我们训练的结果(如下)也是非常的接近我们离散之前的函数。0.1 和 0.3.

[0.09999951]
[0.30000028]

 

ok,这就是说训练得到了好的结果。那么,这个训练的结果是如何来的。

当然是通过每一次的迭代的次数,使得w 和 b 更接近0.1 和0.3

那么每一次迭代是瞎猜的吗?也是可以的,你只要瞎猜然后,发现离自己的目标远了就返回来。

但是科学是严谨的,这里通过梯度下降法,得到合理的w 和 b的更新。接下来,讲述梯度下降法的原理。需要一点数学基础。

二、梯度下降法

1、梯度下降原理

简单的来说应该说是梯度下降的迭代原理,

这边三个变量,a(k+1) 和 a(k) 和 pT(k) 。

a(k+1) 是 a(k)的下一个系数,pT(K)是迭代变量。

梯度下降原理讲的是你的系数a 怎么最快达到极值,就是最大值最小值。

假设是上面一个曲线,没有规则的曲线,你要通过最快的办法,到达顶点,你只能靠瞎猜,指定一个迭代变量pT(k)为 -1

然后一直迭代,很快你就会发现最小的点大概在 (0,0)左右。

但是这个瞎猜的一个pT(K)不接近科学,接下来我们用数学模型的方式去表达这个迭代变量应该怎么去定义。

2、迭代系数的更新原理

a、均方差的定义

F 表示均方误差:

d表示我的理想,y表示你猜测出来的也就你迭代预测的结果。

这个公式意思就是两个做平方差这个就是均方差的定义

很F明显表示的是两个轨迹之间每一次迭代迭代的差距,对吧。你也可以看成是两个 函数的差距,那么我们的任务就是要让这两个差距最小----这个是我们的历史使命。

b、什么做才会最快到达最小值

我们已经知道,如果d = y的话那就完全一样了,我们怎么做才能使F这个函数尽量快的达到最小呢F = 0 也就是 d = y 。

我们来看这个函数

一个函数什么时候下降的最快,我们看到这也是一个关于w的二元一次函数。

科学家告诉你导数的负方向下降迭代最快。

我们对F函数求导数 得到

c、w系数更新的概述

我们根据梯度下降原理我们知道w序数的更新应该是这样的 w(n+1)= w(n) + pT(n)

而我们通过期望函数d 和 实际函数 y做均方误差最小化得到我们的这个T(n) 应该是等于 -2(d-y)x

另外p是迭代参数步长,在代码中我们采用固定步长 0.5:optimizer = tf.train.GradientDescentOptimizer(0.5)

其实这个迭代步长可以不固定,可以通过迭代进行更新,一般的现在使用函数下降,但是更加科学的是通过数学推导,提出一个动态步长迭代模型。

三、根据代码总结

我们总结一下一个单神经网络wb的模型是怎么工作的。

x_data = np.float32(np.random.rand(1, 100))
y_data = np.dot([0.100], x_data) + 0.300

b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 1], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

 

如代码,

首先它又一个 期望 y_data 和 我们预测的y 还有W 参数和 b参数。

loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

 

然后我们规定我们的损失函数loss 是一个均方差,当然你也可以定义交叉熵或者其他的损失函数,关于交叉熵的理解《1.交叉熵 - loss函数在Tensorflow中的定义》

然后在模型里面GradientDescentOptimizer 是用这个梯度下降算法 对w参数和b参数进行迭代更新
参数的更新和推导我们前面已经了解了(推导还没有验证)。

for step in range(0, 201):
    sess.run(train)

 

最后我们通过迭代,完成训练的模型。

欢迎大家批评指正

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: