上一篇讲到了用户作妖,想要让程序员给他推荐他感兴趣的东西,推荐不准用户还闹,这应该怎么办?
有人为了解决这个问题,绞尽脑汁想出了这么一个办法。虽然我没办法明确的说明一些需求,比如给用户到底推荐什么东西。但是我可以先把这个需求的架子搭起来。这个程序的功能就是为这个用户生成一个程序里的虚拟用户,然后把所有的商品也变成虚拟的商品,拿过来假装给这个虚拟用户看,然后这个虚拟用户就会说这个商品好,那个不好。假如虚拟的用户和虚拟的商品模拟的都很真实,其真实的衡量标准就是能够复现过去用户的偏好历史。那么这个虚拟用户就能替代当前的用户帮他挑选东西。
但是生成虚拟用户和虚拟商品,并且让虚拟的用户商品的兴趣关系符合真实用户的历史行为,这又让人犯了难。架子搭好了,具体怎么实施呢。比如一个叫做王二的汉子,年龄45,喜欢研究费马大定理,调戏中年妇女,怎么生成一个虚拟的王二呢。其实方法可以简单一点,我把年龄,他自己的收入阶层等等个人信息收集起来,每个信息我们称之为一个特征。我们把这些特征各自乘以一个系数进行加权求和,这个系数先不管具体是多少,而这个和就被称为虚拟王二。每个商品我们也用类似的方法来做。虚拟王二喜不喜欢这个商品就用虚拟王二和虚拟商品这两个数值之间的差的绝对值替代。我们最后想要得到的就是虚拟王二和虚拟商品之间的喜好关系和真实王二的历史行为一致。到了这一步,基本上这个需求已经可以用高级语言去实现了,因为似乎只需要加减乘除就可以描述一个人是不是喜欢一个商品。但是真的是这样吗?
上面我们说到了一个问题,王二每个特征的加权是随便加的,那个系数是乱出的,想要这个随机的系数能帮助我们生成一个真实的王二简直不敢想象,就像是乱涂机读卡考上清华北大一样不可能。如果让程序员自己去慢慢手动调整,神州大地又会出现万里秃瓢。还好,有个办法是可以让程序自动调整这个参数的,我们叫他梯度下降。原理就是找到这些参数附近的一个参数,如果这个附近的参数让虚拟王二离真实的王二更近了一步,我们就用新的参数替换原来的参数。不断的重复上面的过程,程序就能够自动的找到一个虚拟王二了。
上面的这一系列构造虚拟王二的流程实际上就是现在淘宝,今日头条等公司给大伙推荐信息的基本过程。但实际上这只是用一种特殊语言写的一种新的程序。这种语言比原本程序员写的语言更加高级。之前程序员需要明确指定一些数字,好让这些数字被翻译到那个“长长的纸带上”让cpu屁颠屁颠的去执行。但是这种新的语言允许程序员把一些参数空出来,这个程序写完之后实际上只是一个架子,是一个啥都不会的小朋友。但是使用梯度下降慢慢学习之后,这个小朋友可以完成很多意想不到的事情。用比较流行的说法,大家管这个叫人工智能,深度学习。