建立模型与设计算法

      不知道从什么时候开始出现的现象,每当我遇到一个问题,第一件事就是要先把问题抽象一下,抽象成数学问题,猜测是属于哪个类别的数学问题,然后再考虑从这类数学问题中拿出数学方法尝试解决问题,我在想,这是不是思维定式?不知道这个习惯是好还是坏……

       前几天想了一下关于模型和算法的问题,想把这两者弄清楚,便于以后对问题的抽象。

        首先,个人觉得模型的建立和算法的设计是不一样的,当我们面对一个问题想要解决它,要先分析问题。拿计算广告学这个应用领域来说,作为publisher(比如一些门户网站Yahoo!网易等等)想要提高收益怎么办?开始分析问题,想提高收益就要有广告住在我们这里投放广告,怎样使得Advertiser(广告主)愿意投放广告呢?要使得Advertiser投放的广告有效,即有user愿意点击广告或者进一步购买广告中的商品,所以,第一步就是要提高广告的点击率,就可以简单的转化为一个CTR预估的问题。

        第一阶段分析完毕,已经定位了问题。

        其次,如何做CTR预估呢?我认为这就是一个如何建模的问题了,即为定位到的问题建立一个模型,使得其公式化,比如,我们已知Ad(广告)的一些属性,比如广告创意,大小,等等;用户的一些属性U,比如年龄,性别;用户浏览的C(网页内容)信息;可以为之建立一个模型,可以分别为ad,u,c建模p(ad),p(u),p(c),然后得到p(click|ad,u,c)=P(ad)p(u)p(c)。然后要确定点击概率的目标函数f(x)=p(ad)p(u)p(c),约束条件,例如:ad>0,u>0,c>0;至此,建模过程结束。

        现在要针对模型的学习过程设计算法,前面通过建模得到了模型具体公式,确定了目标函数,约束条件等等,现在要用算法来学习模型的参数,例如,当目标函数是max f(x),可以使用梯度下降法或者牛顿法,算法设计的目的是使得参数学习的又快又好。

        最后,是编程实现阶段,通过代码将具体算法细节变为可执行的程序在工业界应用,其中又涉及到很多技术,比如并行,多线程等等。

    建模过程中,是由思想转化为公式的过程,将实际的问题抽象为数学问题,数学公式;模型学习的过程是通过算法来学习模型参数;编程实现是将算法转化为可运行代码。