机器不学习系列-机器学习VS超级马里奥
为了更好的阅读体验请移步于:https://mp.weixin.qq.com/s/MQ8Wf12LVXHIFO7K6aVuZQ
在这一篇中,让我们来玩一个更加有趣的!相信大家都玩过超级马里奥吧!这简直就是童年的记忆有木有!但是你有想过,你可以制作一个超级马里奥的关卡不!
这个过程看似很复杂,让我们一步一步的简化它!!!
假如你有超能力系列☞回到上一篇:
上篇说道,你作为某楼盘的销售经理,教下属怎么合理的售楼。并给了他们一个测试题:
咱们呐,通过“机器学习”的手段,一步一步得到了“神奇”的售楼公式!
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): price = 0
# a little pinch of this price += num_of_bedrooms * 0.123
# and a big pinch of that price += sqft * 0.41
# maybe a handful of this price += neighborhood * 0.57
return price
我们只要通过“机器学习”出来的参数与我们的真实数据进行算数运算,就可以得到房屋的售价!
继续将这个过程形式化,我们可以得到如下的表示:
很多人就说了,这个问题哪有这么简单!那个销售经理这么呆,买卖房产都不带一点儿套路的,可能大房子有大房子的销售模式,小房子有小房子的销售模式,肯定不是简简单单一个公式就可以满足的!
说的好有道理,我竟无言以对
那么,咱们就多整几套这样的参数看看呗!
嗒嗒嗒嗒!
变出来4套不同的参数序列(当然都是通过机器学习算法训练出来的)
既然你说,上述的单纯只使用一套参数的方式不合理,那我们就整多套参数,参数多了,拟合的应该更好吧,这样你就无话可说了吧!
当然,中间的参数也是学习出来的,我们将每一个小的价格决策器学习出来之后,然后以每个小的价格决策器的输出作为这个大的价格决策器的输入,大的价格决策器的输出还是房屋的售价!然后学习该方程中各个参数的解!这样我们的自动销售客服可以出师了吧!
当然,这种组合的方式在机器学习当中也是十分常见的!可以有效的提升模型的性能!
再高级点儿,什么是神经网络!
如何我们把上面的两个过程进行组合,你猜猜会变成什么样子!
叮叮叮当!
好像有点儿复杂了噢!
说的高级点儿,这就是神经网络,每个节点接受一组输入,并且节点与节点之间有着不同的连边权重,通过计算得到最终的输出结果!
上述的网络结构越复杂,能够解决的问题也就越多!
当然对于神经网络而言,还有很多细节!(激活函数,dropout,不同类型的网络模型等等)后续我们一一讲解!
神经网络的核心:
-
神经元的概念,接受输入,并乘以连边权重得到最后输出!
-
通过将简单的神经元进行组合,我们可以建模更加复杂的问题!
该过程就与乐高一样,单独一块儿积木可能并做不了什么,但是如果给你很多的话,你可以构建出各种各样复杂的事物!
在上述过程中,咱们的算法一直都很稳定是不,只要输入数据相同,输出的结果就一定一样!(无状态算法stateless algorithm)这样的算法好不好呐,可能对于有些情况来说是好的,因为它稳定,就比如上面预测售价的问题,但是对于有些问题,你可能就不希望它这么稳定了!就比如咱们的打字吧,如果我打出“我”这个字,我可不希望后面一直都是“愿意”两个字(我很喜欢复联,马上复联就要上映了,如果要我去看复联,我会说?)
你可以根据我上下文的口吻,大致的可以推断出我的回答是:我愿意!
(o゜▽゜)o☆[BINGO!]
记得我们上篇文章说过哦,如果你做一件事情有道理,并且结果可解释!那么机器学习也可以做到!
所以,我可以把我的上下文信息输入到机器学习算法中,让它推断出我对上述问题的答复!
哎呀,因为咱们只学习过无状态算法模型,所以得出来的结果,好像差强人意!
我们仔细分析一下大脑理解问题的过程,将其加入到咱们的算法中试试!
咱们把问题简化一下,假设咱们要预测正在输入的一句英文句子的下一个字母是啥!
Robert Cohn was once middleweight boxi...
下个字母应该是啥呐,你可能猜测的是‘‘n’’吧,你并且可以继续预测应该是boxing !你之所以这样预测,毕竟学习了这么长时间的英语是不!还有就是你可能认识boxing这个单词,并且理解上面那句话的意思!
大脑的理解过程:考虑字母的顺序,并且结合英语语法结构,以及对句子的理解!
那好,我们将大脑的这个过程加入到我们的神经网络当中去,这就需要我们在网络结构加入状态的概念,每次通过神经网络计算完输出之后,需要将结果保存并且用于下一次的计算,这样神经网络就可以不断地学习到前面的信息用于下一个状态的预测!
通过这样的过程,我们就可以预测到你要输入的下一个字母是啥了!
上面的思想就是循环神经网络的思想!Recurrent Neural Network
网络会对前面的信息进行记忆并应用于当前输出的计算中!
你可能觉得预测一个字母好像没啥意义噢,但是你想一想你打字的时候,键盘输入法给你的推荐候选词,嘿嘿嘿,是不是有点儿意思!(中文也是类似哈)
如果我们不停歇的让他一直这样预测下去的话,是不是这件事情变得更加有趣了!
我们就可以让这个模型自动生成一个故事了!
搞起来!!!
hjCTCnhoofeoxelif edElobe negnk e iohehasenoldndAmdaI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe. Ddelnss.eelaishaner” cot AAfhB ht ltny ehbih a”on bhnte ectrsnae abeahngy amo k ns aeo?cdse nh a taei.rairrhelardr er deffijha
emmm...
好像生成的没啥卵用!!!
hing soor ither. And the caraos, and the crowebel for figttier and ale the room of me? Streat was not to him Bill-stook of the momansbed mig out ust on the bull, out here. I been soms inick stalling that aid. “Hon’t me and acrained on .Hw’s don’t you for the roed,” In’s pair.” “Alough marith him.”
这样好像有点儿意思了呐!!!好像可以进行简单的造句了,并且标点符号加的好像是那么个意思!但是好像还是读不通,废话连篇。===
He went over to the gate of the café. It was like a country bed. “Do you know it’s been me.” “Damned us,” Bill said. “I was dangerous,” I said. “You were she did it and think I would a fine cape you,” I said. “I can’t look strange in the cab.” “You know I was this is though,” Brett said.
哎呀妈呀,这次,不禁的发表感慨,好诗好诗!!!
是不是很神奇,我们的模型竟然可以做到这种地步,竟有点儿网红诗人的风范!
当然不仅限于此咯!
让我们再生成一个全新的海报试试!左边真实右边虚拟(首字母相同)
想一想,我们通过这种手段,只要有语料,可以模拟出任何人的口吻来赋诗造句!甚至还可以造食谱呐,哈哈哈!
这时候不放代码,估计要被打了!!!
代码地址:
https://github.com/karpathy/char-rnn
https://gist.github.com/nylki/1efbaa36635956d35bcc
https://github.com/samim23/obama-rnn/
说好的马里奥呐!!!
假如我有超能力系列-传送门走你┏ (゜ω゜)=☞
先说前提哦,如果你真的想造一个马里奥的关卡,可能需要花点儿钱哈$_$,但是,咱们模拟模拟总是不用花钱就成的!!!
这是2015年任天堂发布的 Super Mario Maker™ for the Wii U gaming system.(感兴趣并且有钱的主可以去看看)
言归正传,咱们可不可以用上面的模型生成超级马里奥的关卡呐?
首先,机器学习的前提是啥,数据,训练数据,大量的训练数据!
超级马里奥的32关的原始训练数据可以从这里得到:
https://github.com/ppaquette/gym-super-mario
如图是超级马里奥第一关的全部内容,你应该记得吧!;-)
让我们看仔细一点儿!
关卡是由一个个的网格构成的!如果我们将这些网络由字符来替代怎么样!
-------------------------- -------------------------- -------------------------- #??#---------------------- -------------------------- -------------------------- -------------------------- -##------=--=----------==- --------==--==--------===- -------===--===------====- ------====--====----=====- =========================-
是不是突然有点儿意思了!同时也简单了很多!将关卡中不同的对象用不同的字符来表示!
那么第一关的关卡就可以表示为如上图所示咯!
你横向的阅读好像没有啥规模可寻!一行一行的乱七八糟,!
但是如果你横向的阅读呐!
这样好像就有点儿规律噢,因为毕竟是要玩游戏,总是要通关的,这一列当中必须要有可以让马里奥可以通过的地方,并且先后的两列也不能太离谱,虽然要阻止些手残党,但是还是要在操作空间内!
这样我们通过我们的慧眼,好像找到了一些可循的规律(这就是特征选择,这不你也可以撒!)
这样我们将每一列看成一个输入,我们旋转上述的符号化关卡得到如下内容:
-----------= -------#---= -------#---= -------?---= -------#---= -----------= -----------= ----------@= ----------@= -----------= -----------= -----------= ---------PP= ---------PP= ----------== ---------=== --------==== -------===== ------====== -----======= ---========= ---=========
就跟我们上面的过程一样,来训练咱们的模型,看看有啥效果!
-------------------------- LL+<&=------P------------- -------- ---------------------T--#-- ----- -=--=-=------------=-&--T-------------- -------------------- --=------$-=#-=-_ --------------=----=<---- -------b -
这是训练几百次的结果!乱七八糟,这咋玩嘛!没有任何的规律可循!
-- -----------= ----------= --------PP= --------PP= -----------= -----------= -----------= -------?---= -----------= -----------=
这是训练几千次的结果!好像有点儿逻辑咯,至少知道列应该等长,并且PP总是两个两个出现,(大家可以看看对应图就知道咯,PP其实代表的是管道,^_^)
--------PP= --------PP= ----------= ----------= ----------= ---PPP=---= ---PPP=---= ----------=
在多一点儿训练迭代,好像很不错了呐,好像有点儿道理,已经可以玩了!
我们将生成的整个序列翻转过来看看!
再对应上实际的关卡!
简直nice呀,兄弟!!!
再仔细察觉发现:
-
好像云朵的确有点儿意思,飞在天上
-
关卡设计合理,可以通过
-
应该在地上的物体都在地上,应该在天上的物体都在天上,合情合理
马里奥的世界,就告一段落咯===
As machine learning becomes more important in more industries, the difference between a good program and a bad program will be how much data you have to train your models. That’s why companies like Google and Facebook need your data so badly!
@ageitgey