强化学习评估-Doubly robust

对于基于神经网络的, 如DQN,Q(s,a)没法穷举,policy iteration-value iteration这样的方法不能用,强化学习的评估通常是用与训练样本不同的数据评测,这里就涉及一个概念,测试数据能否代表训练数据的分布,有偏bias还是无偏unbiased?

举个例子,要计算一个班学生的平均身高,如果学生随机缺席几个,计算出来的平均身高也能代表总体,这就是无偏,但是如果缺席的是篮球队员(都是高个子),就是有偏

如果不论数据是何种分布,都用均值来算,这种方法称为Direct Method(DM),对于有偏分布,是不准确的

如果能找到容易缺失的是哪类数据,假设班级里有5个学生身高>=180,3人缺失,这么说,任意身高>=180的学生都有40%的概率缺失。然后其他学生都在场,这样平均身高为:
H I P S = ∑ i = 1 n h i / p i n H_{IPS}=\frac{\sum^{n}_{i=1}h_i/p_i}{n} HIPS=ni=1nhi/pi
p i p_i pi是在场学生身高为 h i h_i hi的概率,按照设定,由于身高<180的学生都在场, h i < 180 , p i = 1 h_i<180,p_i=1 hi<180,pi=1 h i > = 180 , p i = 0.4 h_i>=180,p_i=0.4 hi>=180,pi=0.4
这样,对于身高>=180的学生,每个在场样本的 p i p_i pi较小,计算后代表的身高数较大,弥补了缺失数据带来的总体身高偏小的影响

这种方法称为Inverse Propensity Score (IPS),上述方法也可写成:
H I P S = ∑ i = 1 N o i h i / p i n H_{IPS}=\frac{\sum^{N}_{i=1}o_ih_i/p_i}{n} HIPS=ni=1Noihi/pi

这里统计的是所有学生(包括未缺席的),上面的方法只统计了在场的学生。 o i o_i oi表示学生是否缺席,如果学生缺席了, o i o_i oi是0。 p i p_i pi h i h_i hi的计算方式不变,对结果没影响。注意N和n

但是实际中,往往无法找到容易缺失的数据类型,而且如果缺失数据的p比较小,会导致计算出来的值很大,方差也很大,为了保证用的是无偏数据,这里有一个新的方法:Doubly robust(DR),公式为:

( 1 ) H ^ D R = 1 n ∑ i = 1 N [ o i h i p i − o i − p i p i h ^ i , m e a n ] (1)\hat{H}_{DR}=\frac{1}{n}\sum^{N}_{i=1}[\frac{o_ih_i}{p_i}-\frac{o_i-p_i}{p_i}\hat{h}_{i,mean}] (1)H^DR=n1i=1N[pioihipioipih^i,mean]
也可以表示为:
o i h i p i − o i − p i p i h ^ i , m e a n = o i h i p i − o i h ^ i , m e a n p i + h ^ i , m e a n \frac{o_ih_i}{p_i}-\frac{o_i-p_i}{p_i}\hat{h}_{i,mean}=\frac{o_ih_i}{p_i}-\frac{o_i\hat{h}_{i,mean}}{p_i}+\hat{h}_{i,mean} pioihipioipih^i,mean=pioihipioih^i,mean+h^i,mean
( 2 ) = o i ( h i − h i , m e a n ) p i + h i , m e a n (2)=\frac{o_i(h_i-h_{i,mean)}}{p_i}+h_{i,mean} (2)=pioi(hihi,mean)+hi,mean
h i , m e a n h_{i,mean} hi,mean可以当做一个模型

  • 如果IPS是对的,(1)中o-p是0,左半部是IPS
  • 如果模型是对的,(2)中 h i − h i , m e a n h_i-h_{i,mean} hihi,mean是0,也就是说模型能预测出真实的h,公式还剩下模型,也是对的
    参考视频

= o i h i p i − h i − o i h ^ i , m e a n p i + h ^ i , m e a n + h i =\frac{o_ih_i}{p_i}-h_i-\frac{o_i\hat{h}_{i,mean}}{p_i}+\hat{h}_{i,mean}+h_i =pioihihipioih^i,mean+h^i,mean+hi
= o i h i p i − p i h i p i − o i h ^ i , m e a n − p i h ^ i , m e a n p i + h i =\frac{o_ih_i}{p_i}-\frac{p_ih_i}{p_i}-\frac{o_i\hat{h}_{i,mean}-p_i\hat{h}_{i,mean}}{p_i}+h_i =pioihipipihipioih^i,meanpih^i,mean+hi
= h i + o i − p i p i h i − o i − p i p i h ^ i , m e a n =h_i+\frac{o_i-p_i}{p_i}h_i-\frac{o_i-p_i}{p_i}\hat{h}_{i,mean} =hi+pioipihipioipih^i,mean
= h i + o i − p i p i ( h i − h ^ i , m e a n ) =h_i+\frac{o_i-p_i}{p_i}(h_i-\hat{h}_{i,mean}) =hi+pioipi(hih^i,mean)
得到:
( 3 ) H ^ D R = 1 n ∑ i = 1 N h i + 1 n ∑ i = 1 N o i − p i p i ( h i − h ^ i , m e a n ) (3)\hat{H}_{DR}=\frac{1}{n}\sum^{N}_{i=1}h_i+\frac{1}{n}\sum^{N}_{i=1}\frac{o_i-p_i}{p_i}(h_i-\hat{h}_{i,mean}) (3)H^DR=n1i=1Nhi+n1i=1Npioipi(hih^i,mean)

  • 如果学生随机缺席,样本的均值能代表整体的均值,(3)中右半部的 1 n ∑ i = 1 N h i − h m e a n \frac{1}{n}\sum^{N}_{i=1}h_i-h_{mean} n1i=1Nhihmean就可以近似为0,因此右半部也近似为0,随机缺席的情况下,左半部是无偏的
  • 如果个子高的缺席,按照前面的设定, p i = 1 , o i = 1 p_i=1, o_i=1 pi=1,oi=1 ∑ i = 1 N o i − p i = 0 \sum^{N}_{i=1}o_i-p_i=0 i=1Noipi=0,右半部是0 ; o i = 0 o_i=0 oi=0时,从(1)来看,就剩 h i , m e a n h_{i,mean} hi,mean了,这样也是无偏的

也就是说,DM和IPS满足一个,DR就是无偏的,这也解释了Doubly Robust-双重稳健

h ^ i , m e a n \hat{h}_{i,mean} h^i,mean p i p_i pi都可以用函数表示

在强化学习中,根据论文,DM思想表示为:
V ^ D M π = 1 ∣ S ∣ ∑ ρ π ( x ) ( x ) \hat{V}^π_{DM}=\frac{1}{|S|}\sum{ρ_{π(x)}(x)} V^DMπ=S1ρπ(x)(x)
ρ是expect reward,DM也就是求平均期望

上述IPS思想表示为:
V ^ I P S π = 1 ∣ S ∣ ∑ r a I ( π ( x ) = a ) p ^ ( a ∣ x , h ) \hat{V}^π_{IPS}=\frac{1}{|S|}\sum{\frac{r_aI(π(x)=a)}{\hat{p}(a|x,h)}} V^IPSπ=S1p^(ax,h)raI(π(x)=a)
除法下面是比较old policy和new policy的the shift in action proportions,I()是0或1,是否发生,r是reward

DM:
V ^ D M π = 1 ∣ S ∣ ∑ [ ( r a − ρ ^ a ( x ) ) I ( π ( x ) = a ) p ^ ( a ∣ x , h ) + ρ π ( x ) ( x ) ] \hat{V}^π_{DM}=\frac{1}{|S|}\sum{[\frac{(r_a-\hat{ρ}_a(x))I(π(x)=a)}{\hat{p}(a|x,h)}}+ρ_{π(x)}(x)] V^DMπ=S1[p^(ax,h)(raρ^a(x))I(π(x)=a)+ρπ(x)(x)]

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。以下是创建一个DoublyLinkedList对象的示例代码: ```python class Node: def __init__(self, data): self.data = data self.next = None self.prev = None class DoublyLinkedList: def __init__(self): self.head = None self.tail = None def append(self, data): new_node = Node(data) if self.head is None: self.head = new_node self.tail = new_node else: new_node.prev = self.tail self.tail.next = new_node self.tail = new_node def prepend(self, data): new_node = Node(data) if self.head is None: self.head = new_node self.tail = new_node else: new_node.next = self.head self.head.prev = new_node self.head = new_node def delete(self, data): current_node = self.head while current_node: if current_node.data == data: if current_node == self.head and current_node == self.tail: self.head = None self.tail = None elif current_node == self.head: self.head = current_node.next self.head.prev = None elif current_node == self.tail: self.tail = current_node.prev self.tail.next = None else: current_node.prev.next = current_node.next current_node.next.prev = current_node.prev current_node = current_node.next def print_list(self): current_node = self.head while current_node: print(current_node.data) current_node = current_node.next ``` 这里我们创建了一个DoublyLinkedList类和一个Node类,用于创建双向链表中的节点。DoublyLinkedList类包含了几个方法,比如append(用于在链表末尾添加节点)、prepend(用于在链表开头添加节点)、delete(用于删除链表中的节点)和print_list(用于打印链表中的所有节点)。 现在我们可以创建一个DoublyLinkedList对象并使用它的方法来操作链表。例如: ```python # 创建一个DoublyLinkedList对象 my_list = DoublyLinkedList() # 在链表末尾添加节点 my_list.append(1) my_list.append(2) my_list.append(3) # 在链表开头添加节点 my_list.prepend(0) # 打印链表中的所有节点 my_list.print_list() # 删除链表中的一个节点 my_list.delete(2) # 再次打印链表中的所有节点 my_list.print_list() ``` 这样,我们就可以创建、操作和打印一个DoublyLinkedList对象了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值