Spark 和 Tensorflow 线性回归问题

S
SwiftDove
楼主 (未名空间)
刚开始看一些Spark ML和Tensorflow的基本东西,看到下便两个程序的结果很糊涂:
为什么这么大的差异?
https://github.com/backstopmedia/tensorflowbook/blob/master/chapters/04_
machine_learning_basics/linear_regression.py

在以上程序加一行 print("w=", W.eval(), "b=", b.eval()), 得到结果是
w= [[ 3.5245235 ]
[ 1.50171268]] b= 1.14499

所以 y=3.5245235x1 + 1.50171268x2 +1.14499

我用同样的数据 (格式附后)https://github.com/apache/spark/blob/master/examples/src/main/java/org/
apache/spark/examples/ml/JavaLinearRegressionWithElasticNetExample.java

结果是:
Coefficients: [0.3827266230806965,5.1690760222564425] Intercept: 82.
22008153614573
numIterations: 6
objectiveHistory: [0.5,0.41583549697777683,0.15548328325638935,0.
15439025905767773,0.15432368309706285,0.15432368309449543]
所以
y=0.3827266230806965x1+5.1690760222564425x2 + 82.22008153614573

两者差这么大,比较糊涂。请大牛指点迷津。

Spark inputfile 数据格式
354 1:84 2:46
190 1:73 2:20
405 1:65 2:52
263 1:70 2:30
451 1:76 2:57
302 1:69 2:25
288 1:63 2:28
385 1:72 2:36
402 1:79 2:57
365 1:75 2:44
209 1:27 2:24
290 1:89 2:31
346 1:65 2:52
254 1:57 2:23
395 1:59 2:60
434 1:69 2:48
220 1:60 2:34
374 1:79 2:51
308 1:75 2:50
220 1:82 2:34
311 1:59 2:46
181 1:67 2:23
274 1:85 2:37
303 1:55 2:40
244 1:63 2:30
l
lightroom
2 楼
老弟,应该学学ml ABC. 你那个spark的,第一iterations 太少,第二,加iterations也不会算对,因为你用的是elastic net regularization. 你改应该改的参数了吗。第三,估计你没normalize data, 会导致收敛不好的

【 在 SwiftDove (Swift Dove) 的大作中提到: 】
: 刚开始看一些Spark ML和Tensorflow的基本东西,看到下便两个程序的结果很糊涂:
: 为什么这么大的差异?
: https://github.com/backstopmedia/tensorflowbook/blob/master/chapters/04_
: machine_learning_basics/linear_regression.py
: 在以上程序加一行 print("w=", W.eval(), "b=", b.eval()), 得到结果是
: w= [[ 3.5245235 ]
: [ 1.50171268]] b= 1.14499
: 所以 y=3.5245235x1 + 1.50171268x2 +1.14499
: 我用同样的数据 (格式附后)
: https://github.com/apache/spark/blob/master/examples/src/main/java/org/
: ...................
l
lightroom
3 楼
我看了看tf code, 这个作者水平太差,误人子弟! 还thread, 根本没有用 thread,
写法也不好,还旧。而且也没有normalize data。你最好找一些真正专家的code.

【 在 lightroom (吃一条鱼,思考一个问题,法号三丰) 的大作中提到: 】
: 老弟,应该学学ml ABC. 你那个spark的,第一iterations 太少,第二,加
iterations
: 也不会算对,因为你用的是elastic net regularization. 你改应该改的参数了吗。第
: 三,估计你没normalize data, 会导致收敛不好的
w
wdong
4 楼
笑死 刚刚还有人说小白特别喜欢写教程

【 在 lightroom (吃一条鱼,思考一个问题,法号三丰) 的大作中提到: 】
: 我看了看tf code, 这个作者水平太差,误人子弟! 还thread, 根本没有用 thread,
: 写法也不好,还旧。而且也没有normalize data。你最好找一些真正专家的code.
: iterations
S
SwiftDove
5 楼
大牛笑完之后,也要提携我们这些门外汉呀 :-).

我看这书,还觉得不错,觉得一些概念讲得蛮清楚的 (比烙印写的什么Packt
Publishing的书好很多), 没想到也是半瓶水。

还是不懂这个问题啊。在http://stackoverflow.com/questions/41884411/puzzled-by-linear-regression-results-from-spark-ml-and-tensorflow 问了,那儿说SPARK的线性回归模型不是线性回归(这真奇芭),去掉

.setRegParam(0.3)
.setElasticNetParam(0.8);

又 .setMaxIter(1000), 结果1iteration, 结果就出来了,也和原先的结果差不多啊:
Coefficients: [0.4173620987945001,5.21659080879135] Intercept: 77.
98253861487616
numIterations: 1
objectiveHistory: [0.0]

【 在 wdong (万事休) 的大作中提到: 】
: 笑死 刚刚还有人说小白特别喜欢写教程
g
guvest
6 楼
1.
Let x=1,2,3,4,。。。
你自己用方程z=100*x+2
造一列z。

对这组( x,z)用spark试验一下,
算出来是100和2,那就是线性回归,不然就不是呗。

2.

Linear regression就跟个操作系统类似,无数坑。

【 在 SwiftDove (Swift Dove) 的大作中提到: 】
: 大牛笑完之后,也要提携我们这些门外汉呀 :-).
: 我看这书,还觉得不错,觉得一些概念讲得蛮清楚的 (比烙印写的什么Packt
: Publishing的书好很多), 没想到也是半瓶水。
: 还是不懂这个问题啊。在http://stackoverflow.com/questions/41884411/puzzled-by-linear-regression-results-from-spark-ml-and-tensorflow 问了,那儿说SPARK的线性回归模型不是线性回归(这真奇芭),去掉
: .setRegParam(0.3)
: .setElasticNetParam(0.8);
: 又 .setMaxIter(1000), 结果1iteration, 结果就出来了,也和原先的结果差不多啊:
: Coefficients: [0.4173620987945001,5.21659080879135] Intercept: 77.
: 98253861487616
: numIterations: 1
: ...................
S
SwiftDove
7 楼
谢谢大牛们的慧眼。结果极可能TensorFlow 的code错了。这儿是一个结果分析:http://tempforum.neas-seminars.com/Attachment4373.aspx 结果和Spark ML 的(改正后)一致 。现在请大牛们看看怎么修改那个TensorFlow的code。谢谢。
l
lightroom
8 楼
你spark用的是什么solver?这个你要搞清楚。

TF是GD。我昨天说了,这code没有normalize data。这样会出现很多问题。最好的方法是作normalization。比较形象说,这两维数据还是比较均匀的,主要是bi a s比较大
,learning rate太小,循环太少,它爬不上去

当然,你这个数据很简单。有几个方法都行
- 初始化 b = tf.Variable(80.0)
- 增加iteration
- 加大 learning_rate = 0.001

【 在 SwiftDove (Swift Dove) 的大作中提到: 】
: 谢谢大牛们的慧眼。结果极可能TensorFlow 的code错了。这儿是一个结果分析:http://tempforum.neas-seminars.com/Attachment4373.aspx 结果和Spark ML 的(改正后)一致 。现在请大牛们看看怎么修改那个TensorFlow的code。谢谢。
S
SwiftDove
9 楼
那个SparkML 例子 的算法是最小二乘法。 看来梯度法比较需要技巧和“deep
understanding”。 试了试这几个方法,还不行。现在知道这个东西坑又多又大(估计暂时不像有些人说的ML已是大白菜), 不再纠结这个了。

多多感谢。

【 在 lightroom (吃一条鱼,思考一个问题,法号三丰) 的大作中提到: 】
: 你spark用的是什么solver?这个你要搞清楚。
: TF是GD。我昨天说了,这code没有normalize data。这样会出现很多问题。最好的方法
: 是作normalization。比较形象说,这两维数据还是比较均匀的,主要是bi a s比较大
: ,learning rate太小,循环太少,它爬不上去
: 当然,你这个数据很简单。有几个方法都行
: - 初始化 b = tf.Variable(80.0)
: - 增加iteration
: - 加大 learning_rate = 0.001
w
wdong
10 楼
这么快就放弃了? 你那个tensorflow的例子我已經调通了。
实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。
想听的发包子过来,半个钟头后我给你们分析。

Update:
这个竟然是一本书的配套代码,书要卖$23。突然我就觉得
job security暴涨了。这种书卖越多越好。大家不要给它
提交补丁,最好初学者都死在这书上,我们老司机就安全了。

【 在 SwiftDove (Swift Dove) 的大作中提到: 】
: 那个SparkML 例子 的算法是最小二乘法。 看来梯度法比较需要技巧和“deep
: understanding”。 试了试这几个方法,还不行。现在知道这个东西坑又多又大(估计
: 暂时不像有些人说的ML已是大白菜), 不再纠结这个了。
: 多多感谢。
l
lightroom
11 楼
我看看这本书的排行榜,估计人家一年能卖500-1000本。一年也能小一万刀

【 在 wdong (万事休) 的大作中提到: 】
这么快就放弃了? 你那个tensorflow的例子我已經调通了。
实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。
想听的发包子过来,半个钟头后我给你们分析。
Update:
这个竟然是一本书的配套代码,书要卖$23。突然我就觉得
job security暴涨了。这种书卖越多越好。大家不要给它
提交补丁,最好初学者都死在这书上,我们老司机就安全了。
S
SwiftDove
12 楼
我很穷,就只转一个吧。 多谢大牛

【 在 wdong (万事休) 的大作中提到: 】
这么快就放弃了? 你那个tensorflow的例子我已經调通了。
实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。
想听的发包子过来,半个钟头后我给你们分析。
Update:
这个竟然是一本书的配套代码,书要卖$23。突然我就觉得
job security暴涨了。这种书卖越多越好。大家不要给它
提交补丁,最好初学者都死在这书上,我们老司机就安全了。
w
wdong
13 楼
只有你发了,我估计别人没有真的去看代码。我给你一些提示,
你再改改看。

1. 注意Y和Y_predicted的形状。如果Y和Y_predicted的
形状不一样,tf.squared_difference会发生什么?

2. 为什么傻逼作者要把learning_rate設得这么异乎寻常
地低? 如果设成0.01会发生什么问题?
把learning_rate降低是正确的fix吗? 还能怎么解决
这个问题?
(再提示:Spark的loss function有啥区别?)

还有一些罗嗦的错就不说了, 不影响这个程序运行。
书的作者对tensorflow完全没有概念。这书的tensorflow
代码最好完全不要看。

我其实也调了一个钟头。虽然自己写代码没问题,
要找别人代码里的坑还是很难。

【 在 SwiftDove (Swift Dove) 的大作中提到: 】
我很穷,就只转一个吧。 多谢大牛
d
danielfeng
14 楼
这个现象最好的例子:谭浩强 :)

【 在 wdong (万事休) 的大作中提到: 】
这么快就放弃了? 你那个tensorflow的例子我已經调通了。
实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。
想听的发包子过来,半个钟头后我给你们分析。
Update:
这个竟然是一本书的配套代码,书要卖$23。突然我就觉得
job security暴涨了。这种书卖越多越好。大家不要给它
提交补丁,最好初学者都死在这书上,我们老司机就安全了。
l
lightroom
15 楼
看来支持广播的ops都是坑。

所以什么事物都是又两面性的,TF比较抽象,不好学。这本是个缺点,但是又是机会。比如keras都要进TF的repo了。keras一些high-level APIs有错误很久了(不是bug),直到最近才fix。那个作者也是自以为是SB一个.

【 在 wdong (万事休) 的大作中提到: 】
只有你发了,我估计别人没有真的去看代码。我给你一些提示,
你再改改看。
1. 注意Y和Y_predicted的形状。如果Y和Y_predicted的
形状不一样,tf.squared_difference会发生什么?
2. 为什么傻逼作者要把learning_rate設得这么异乎寻常
地低? 如果设成0.01会发生什么问题?
把learning_rate降低是正确的fix吗? 还能怎么解决
这个问题?
(再提示:Spark的loss function有啥区别?)
还有一些罗嗦的错就不说了, 不影响这个程序运行。
...................
S
SwiftDove
16 楼
多谢大牛。 是的, Y 是Tensor("ToFloat_1:0", shape=(25,), dtype=float32)。
Y_predicted 是Tensor("add:0", shape=(25, 1), dtype=float32)。 我用
Y_predicted = tf.reshape(Y_predicted, [25])
好像loss overflow了。不知怎么改Cost 函数

我刚看这些东西, Java比较熟。 Python仅初级水平。

【 在 wdong (万事休) 的大作中提到: 】
只有你发了,我估计别人没有真的去看代码。我给你一些提示,
你再改改看。
1. 注意Y和Y_predicted的形状。如果Y和Y_predicted的
形状不一样,tf.squared_difference会发生什么?
2. 为什么傻逼作者要把learning_rate設得这么异乎寻常
地低? 如果设成0.01会发生什么问题?
把learning_rate降低是正确的fix吗? 还能怎么解决
这个问题?
(再提示:Spark的loss function有啥区别?)
还有一些罗嗦的错就不说了, 不影响这个程序运行。
...................
w
wdong
17 楼
1. reduce_sum vs reduce_mean:
reduce_sum会导致你的gradient和minibatch size相关,以至于
需要根据不同的minibatch size调整learning_rate。
用reduce_mean没这个问题。

2. mean(sqr(error)) vs sqrt(mean(sqr(error)))
和上面的相似,前者的问题是需要根据error绝对值调整learning_rate。
error太大甚至会溢出。

上面这两个都是数学上等价,但是实现上的坑。

你把这两个改了, 用learning_rate = 0.01,隔1000个
iteration打印状态,就能看到正常收敛了。

【 在 SwiftDove (Swift Dove) 的大作中提到: 】
多谢大牛。 是的, Y 是Tensor("ToFloat_1:0", shape=(25,), dtype=float32)。
Y_predicted 是Tensor("add:0", shape=(25, 1), dtype=float32)。 我用
Y_predicted = tf.reshape(Y_predicted, [25])
好像loss overflow了。不知怎么改Cost 函数
我刚看这些东西, Java比较熟。 Python仅初级水平。
S
SwiftDove
18 楼
Getting closer:

def loss(X, Y):

Y_predicted = inference(X)
print(Y_predicted)
Y_predicted = tf.reshape(Y_predicted, [25])
print(Y)
print(Y_predicted)
print (Y-Y_predicted)
return tf.sqrt(tf.reduce_mean(tf.squared_difference(Y, Y_predicted)))

training_steps = 100000

结果是:
w= [[ 0.40486234]
[ 5.21126223]] b= 79.0806

我还得仔细琢磨一下这是怎么“数学等价”的。 还有一点觉得糊涂,这怎么需要这么
多steps 啊。

不过, 我觉得自己当时只是好奇看看Spark ML能不能很好地做线性回归。结果这一试
, 学了好多。多谢大牛们。。。你们真的很厉害。

【 在 wdong (万事休) 的大作中提到: 】
1. reduce_sum vs reduce_mean:
reduce_sum会导致你的gradient和minibatch size相关,以至于
需要根据不同的minibatch size调整learning_rate。
用reduce_mean没这个问题。
2. mean(sqr(error)) vs sqrt(mean(sqr(error)))
和上面的相似,前者的问题是需要根据error绝对值调整learning_rate。
error太大甚至会溢出。
上面这两个都是数学上等价,但是实现上的坑。
你把这两个改了, 用learning_rate = 0.01,隔1000个
iteration打印状态,就能看到正常收敛了。
w
wdong
19 楼
我用gnuplot拟合出来就差不多是这个结果。spark那个应该是因为非标准扩展导致结果
有点偏差。

数学等价就是一个的最优解也是另一个的最优解。

【 在 SwiftDove (Swift Dove) 的大作中提到: 】
Getting closer:
def loss(X, Y):
Y_predicted = inference(X)
print(Y_predicted)
Y_predicted = tf.reshape(Y_predicted, [25])
print(Y)
print(Y_predicted)
print (Y-Y_predicted)
return tf.sqrt(tf.reduce_mean(tf.squared_difference(Y, Y_predicted)))
training_steps = 100000
...................
g
guvest
20 楼
应该就是一个是精确的最小二乘法。另一个是梯度或者别的办法近似求解?

精确的最小二乘法不应该有什么大问题。前面就是叠加。最后一步
3*3矩阵求逆那步用一下cholesky就够了。他的数很少。

若是近似方法,这个作者给的数据集太小。估计iid什么的也没测。
所以可能会对参数敏感。

【 在 wdong(万事休) 的大作中提到: 】
<br>: 这么快就放弃了? 你那个tensorflow的例子我已經调通了。
<br>: 实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。
<br>: 想听的发包子过来,半个钟头后我给你们分析。
<br>: Update:
<br>: 这个竟然是一本书的配套代码,书要卖$23。突然我就觉得
<br>: job security暴涨了。这种书卖越多越好。大家不要给它
<br>: 提交补丁,最好初学者都死在这书上,我们老司机就安全了。
<br>
w
wdong
21 楼
spark那个加了elastic net regularization,就是精确解数值上也会不一样.
而且有可能是sgd. 可能还没收敛。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 应该就是一个是精确的最小二乘法。另一个是梯度或者别的办法近似求解?
: 精确的最小二乘法不应该有什么大问题。前面就是叠加。最后一步
: 3*3矩阵求逆那步用一下cholesky就够了。他的数很少。
: 若是近似方法,这个作者给的数据集太小。估计iid什么的也没测。
: 所以可能会对参数敏感。
: : 这么快就放弃了? 你那个tensorflow的例子我已經调通了。
: : 实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。
: : 想听的发包子过来,半个钟头后我给你们分析。
: : Update:
: : 这个竟然是一本书的配套代码,书要卖$23。突然我就觉得
: ...................
d
dracodoc
22 楼
我觉得github的星就是fashion而已,多少人是真的看过code试过之后再加星,又有多
少人是看了两眼就加星?
还有fork,有多少fork的实际从来没碰过?
应该写个程序统计一下

【 在 wdong (万事休) 的大作中提到: 】
: 这么快就放弃了? 你那个tensorflow的例子我已經调通了。
: 实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。
: 想听的发包子过来,半个钟头后我给你们分析。
: Update:
: 这个竟然是一本书的配套代码,书要卖$23。突然我就觉得
: job security暴涨了。这种书卖越多越好。大家不要给它
: 提交补丁,最好初学者都死在这书上,我们老司机就安全了。
S
SwiftDove
23 楼
我变了learing_rate=.0001, 又增加了train_steps 到100000, 结果还是有较大的误
差(w= [[ 0.39436]
[ 5.20597]] b= 80.0349)(比较SparkML和Excel的一个包)。

我又试了AdamOptimizer (原来是GDOptimizer), 结果和上面的SparkML(最小二乘法,我没试它的GD法)和Excel的一致w= [[ 0.41736]
[ 5.2165]] b= 79.98。这么看来, GD方法是不是对这个问题不太好?