随机游走和强化学习

假期里做了这么两件事情,写了个图书推荐程序+看了下强化学习

关于随机游走,这里是一个大体介绍:

随机游走这一名称由KarlPearson在1905年提出[Pearson, K.(1905). The problem of the Random Walk. Nature. 72, 294.],本来是基于物理中"布朗运动"相关的微观粒子的运动形成的一个模型,后来这一模型作为数理金融中的重要的假设,指的是证券价格的时间序列将呈现随机状态,不会表现出某种可观测或统计的确定趋势,即证券价格的变动是不可预测的。在计算机领域,随机游走则主要用来进行一种关系的传递分析。

这里,可以把随机游走用在了图书推荐,

       大体上讲,随机游走算法基于读者-文章-读者-文章 这么一个基础路径来发现感兴趣的文章。也就是说,一个读者极有可能和与他有相同爱好的人对同样的书感兴趣。同时,我们整理出了图书的共同读者,并增加了另外一条基础路径:读者-图书-图书。这意味着,一个读者可能对于具有和他之前所借图书相同读者的图书感兴趣。

       我们的算法从源点(目标读者)出发,我们在一个读者图书图图里面进行随机游走,在到达一个节点x后,我们以a的概率进行下一步的随机游走,并且有T(x,y)的概率游走到y节点,其中T是我们实现求好的转换矩阵,以1-a的概率回到源节点。下面这段代码展示了随机游走过程,游走结束后,根据需求,评分在前N个的图书将被推荐出去。

#care算法的实现,gra:图,rap:转换的可能性,tar:目标点,maxstep:最大的步数
def care(gra,rap,tar,maxstep):
    score_all = ([0.0])*(gra.len_book+gra.len_user)
    score_all[tar] = 1.0
    for i in range(maxstep):
        score_tmp = ([0.0])*(gra.len_book+gra.len_user)
        for j in range(gra.len_book+gra.len_user):
            for k in range(gra.len_book+gra.len_user):
                score_tmp[k] += rap*score_all[j]*gra.T[j][k]
            if tar == j:
                score_tmp[k] += (1-rap)
        score_all = score_tmp 
    score_article = score_all[gra.len_user:]
    book_dict = {}
    for index,book in enumerate(score_article):
        book_dict[gra.books_list[index].b_id] = book 
    book_ranking = sorted(book_dict.iteritems(),key=lambda x:x[1],reverse=True)
    recommend = []
    j = 0
    for i in range(8):
        while book_ranking[j][0] in gra.users[tar].test_books:
            j += 1
        recommend.append((book_ranking[j][0],book_ranking[j][1]))
        j += 1
    y = len(recommend)
    x = 0
    for item in recommend:
        if item[0] in gra.users[tar].verfy_books:
            x += 1
    return float(x)/float(y)


Ok,下面开始说下强化学习

强化学习(reinforcement learning)是一种人工智能的通用框架,他是针对一个拥有行动能力的agent而言的,每个行动影响了agent的未来状态,使用标量值回报信号来度量成果。一言以蔽之:选择行动来最大化未来回报。我们最终的目标是寻求得到可以解决所有人类层级的任务的单一的 agent,这也是智能 agent 的本质。

       上一段涉及到了这么几个比较重要的概念:

•       Agent       含义类似于大脑,能够独立作出一些动作

•       State        当前的状态,

•       Action      agent 根据当前的state采取的行动

•       Reward     采取action获取的回报

•       Policy        agent根据state得到action的策略

Agent的任务就是不断通过学习来得到一个比较好的policy,能够在一个state下采取额能够最终获得最大收益的action。就如下图所示:

 

下面是介绍下Q-learning,这里只简要介绍下强化学习的原理,接下来内容会逐渐完善起来

Utiliy(价值,或效用)

U是一连串行动的rewards的总和。例如说,行一步棋的效用,不单是那步棋当前的利益,还包括走那步棋之后带来的后果。例如,当下贪吃一只卒,但10步后可能会被将死。又或者,眼前有美味的食物,但有些人会选择不吃,因为吃了之后会变肥。

一个state的效用U就是:假定方案固定,考虑到未来所有可能的transitions,从这个state开始的平均期望的total reward是多少:

其中E[ ]代表期望值,r是discount factor

Bellman condition

它是动态规划的中心思想,又叫bellmanoptimality condition

基本内容:如果从最佳选择的路径末端截除一小部分,余下的路径仍然是最优路径

换句话说,如果一系列的A、B、C、D、E……是最优的,则除去A之后的这个选择也是最优的即 B、C、D、E……

用数学表示:

随机游走和强化学习_第1张图片

Delta rule

这是一个逐步逼近理想状态的常用方式:

当前状态 := 当前状态 + α(理想状态-当前状态)

其中α为学习速度,即每一轮学习向理想状态的跨度,Delta rule的微分形式即梯度下降算法:

Temporal difference learning

将delta rule应用到Bellmancondition上,即temporal difference learning

现在,假设方案固定,我们的目标是学习每一个state的utility

应用Bellman condition,那么,每一个state的U值即当前状态的回馈加上其所有可能的后继的state的U值,取平均值,再乘上r:

其中P是取state S’的几率

TD learn的思想是:假设其他U(S’)的值都正确,就用delta rule来调整当前状态下的

U(S),使U(S)逐渐向理想状态靠拢:

α是learning rate,即学习速度,括号里面的是理想的U(S)和估值之间的差别,在每一个timestep,我们都在用α来调整这个差别

Q value

Q值是U值的一个变种,U是对每一个state而言的,Q把U拆成了对于每一个state中每一个action的分量,可以用下面的等式来表示

可以这样理解,Q值即在S状态下,取动作A得到的回报的均值,而U正是在S状态下,取不同的A的Q中,取值最大的那个

Active learning

经过之前的过程,我们已经能够计算出每个S的U值,或者是在每个S下的Q值

这样,如果有多个方案,我们只需要计算每一个方案的Q值,然后在每个state S 中选取使得Q值最大的动作A

实际上这样的执行结果很差,因为我们之前认为所有的U(S’)都是理想的,但事实并非如此,根据这样的U(S’)值运算,结果自然不会好

这样agent就需要尝试一些未知的状态,才能够学到optimal policy,这就是所谓的exploration vsexploitation(好奇心 vs 短暂贪欲),我们可以人工的将未知状态的价值增加一点,如下:

其中N(A,S)代表A、S这对组合出现的次数,F是exploration函数,正常情况下,它直接返回U的估计值,但当N很小的时候,即之前很少出现过这种情况,好奇心起作用,F会返回一个比较大的值

Ok,到这里,一个简单的Q-learning也就完成了,这只是开始,路还很远,但我并不孤单,come on

本文简要的介绍了随机游走和强化学习,有关实例以及各种文本分类算法的对比详见ppt

 

 

编者:SGW

你可能感兴趣的:(强化学习)