老虎机是赌场里最常见的一个设备,一家赌场里有那么多机器,每次摇动都可能后悔或者获得一定额度的奖励,你通过选择不同的老虎机臂最大化自己的利益。这个问题看似非常简单,让很多人都忘了他其实是一个reinforcement learning的问题。

问题描述

(Bernoulli Bandit)假设我们有一个K臂老虎机,每一个臂(action)的回报率(reward_i)都是固定的,但是agent并不知道这个回报率是多少,agent如何在T回合内最大化自己的回报(注意,这里的T通常是远远大于K的)。

在互联网行业,多臂老虎机问题之所以非常流行,是因为这些action可以被看做不同的广告投放,当用户来到网站上看到广告,对每一个广告有固定的点击率,那么平台就需要寻找一种最优策略来显示广告,最大化自己的利益。

最简单的做法就是贪心,模型想办法计算每一个action的回报,然后选择回报最大的action进行操作。这种贪心的做法问题就是没有完全探索其它奖励概率的可能性,很容易丢掉最优解。

有一种高级贪心的策略就是按照概率epsilon进行探索,按照uniform distribution选择一个臂进行尝试,按照1-epsilon的概率选择当前情况下回报率最大的action。尽管这种做法比纯贪心的情况好,但是对于下面这种情况,我们通过探索知道action 2的概率远远小于action 1,但还是会以一定的概率反复测试action 2,加大了损失。

A Tutorial on Thompson Sampling

根据对每一个action的回报概率计算置信度,我们可以有效地减少无用的探索,这就引出了今天要讲主题一,Thompson Sampling。

Thompson Sampling

Thompson Sampling将多臂赌博机每一个action的回报概率看做一个Beta分布,我们给分布先验概率参数alpha和beta,那么action的回报分布可以被描述成以下函数:

wikipedia — Beta distribution

这里我们利用gamma函数对分布就行归一化处理,当我们收集到越来越多的实验结果后,我们可以对分布的参数alpha和beta进行更新:

A Tutorial on Thompson Sampling

Beta分布有很多与生俱来的性质,随着我们观测到的结果越多,分布的置信区间就越窄,比方说最开始alpha=1, beta=1,当我们观测到3次正回报,5次负回报后,(alpha, beta)=(4, 6),就产生了上图中action 3的概率分布。当我们观测到599次回报和399次零回报的动作后,(alpha, beta)=(600, 400),就产生了上图中action 1的概率分布。

我们可以在K=10的多臂赌博机上对比一下Epsilon-Greedy和Thompson Sampling的实验效果,当轮数较少时,Thompson Sampling可能会以比较大的概率进行探索,较少的情况使用最佳动作,产生比较高的regret,但是轮数上升后,Thompson Sampling的尝试收敛了,总regret数也随着收敛。

The Multi-Armed Bandit Problem and Its Solutions

实战调整

上面描述的Thompson Sampling主要针对比较理想的情况,忽略了很多现实中可能遇到的问题,在这里我就针对三个小问题讨论一下Thompson Sampling可以做的变形。

先验估计: 多臂赌博机最常见的一个问题就是广告投放,对于一个新的广告,我们既可以假设之前不知道这个广告的任何信息,先验概率为Beta(1,1),然后运用Thompson Sampling进行测试,也可以试图通过广告主历史信息,文字历史信息对先验概率进行一定的估计,再利用Thompson Sampling进行测试,后者会用更少的时间得到一个相对准确的估计。

比方说下面这个例子,我们有10个广告,他们的点击率都不高。方法1采用Beta(1,1)的先验知识,方法2采用Beta(1,100)的先验知识,广告点击率在0.005左右,由于方法2更贴近真实情况,经过有限的尝试对广告的点击率估计要比方法1有效很多。

非平稳过程: 考虑到电商这个场景,冬天展示冬季衣服,用户购买率高,夏天展示夏季衣服,购买率高,每一个展示产品的购买率是随着时间推移,变化的。抽象一下,我们的action回报率并不是一个定的参数a,而是随着时间变化的一系列参数a1,a2,…,这样来看,我们需要一直进行探索,才能够得到最优的回报。

这一类非平稳过程并不总适合Thompson Sampling,但如果参数在每一个时间段的改变很少,我们能进行比较多的测试,仍然可以有效解决该问题。最简单的方法就是只采取最近的一些数据进行建模,比方说我们可以对每一个产品计算过去一周的表现情况,来适应时间的改变。

另一种常见的做法则是进行Time Decay,方法如下图所示:

A Tutorial on Thompson Sampling

下图是多臂赌博机有两个臂的情况下,一个臂逐渐由0.1上升到0.6,另一个臂逐渐由0.9下降到0.4时候,不同的Thompson Sampling方法得到的不同结果。前期变化慢时,Time Decay的版本并没有差太多,一旦发生剧烈变化,没有适应的版本就会后悔。

上下文特征: 最后想讲的一类是利用上下文特征对Thompson Sampling进行优化,这个和我们日常使用的推荐系统就非常的像了。上下文特征就是我们拥有的用户信息,环境信息以及产品信息,基于这些特征我们可以对先验进行估计,然后结合Thompson Sampling进行实验。鉴于这一部分非常重要,我们下一篇文章单独写。

增强学习版老虎机

回到一个更大的主题,我们可以用另一种增强学习的算法来解决多臂赌博机问题,那就是把每一个臂看做一个二分类问题。我们设计一个非常简单的神经网络,有K个输出节点,每一个节点的权重是选择该臂的的回报,初始时每一个臂的回报都是0。

每当我们对一个臂实施动作后,根据反馈对该臂的权重进行更新,可以应用最经典的分类loss:

我们还要引入概率epislon,进行探索,才能保证不会错过最优值:

兜兜转转,我们从Epsilon-Greedy算法深入到了最优的Thompson Sampling算法,最后又通过Policy Gradient回到了Epsilon-Greedy,对于背后概率固定的老虎机,又输给了传统做法。

这次的主题就写到这里,下次我会讲Contextual Bandits,这一与推荐系统最相关的主题。

-------------------------------------

  1. 强化学习介绍
    1.1 学习模式
    1.2 形式化为MDP问题
  2. 多臂老虎机问题(Multi-Armed Bandit,MAB)
  3. 探索利用困境(Exploration-exploitation dilemma)
  4. 使用四种策略解决MAB问题
    4.1 随机策略
    4.2 ε-greedy
    4.3 Boltzmann
    4.4 UCB
  5. 各策略的稳定性对比
  6. 总结

1.强化学习介绍

1.1 学习模式

试想这样一个问题:一只狗如何学会叼住飞盘?

人类的训练过程:当飞盘抛向空中后,如果狗叼住飞盘,此时给予狗一块肉作为奖励;如果狗没有叼住飞盘,就不给肉;狗的目标是希望自己得到更多的肉,于是当飞盘飞出后狗越来越展现叼住飞盘的动作以得到更多的肉;通过这样的过程,狗便学会了叼飞盘的动作

在人工智能领域中强化学习就是这样的学习模式,它是一种用于智能体在与环境交互过程中进行学习的方法,强化学习过程主要包含五个元素:智能体(agent)、环境(environment)、状态(state)、动作(action)、奖励(reward)。某一时刻下,智能体处于某一状态,执行一个动作后,环境接收到动作,促使智能体进入下一个状态,同时反馈奖励,智能体的目的是为了最大化累积奖励,根据奖励的多少调整动作以获得更大的奖励。

1.2 形式化为MDP问题

已经了解了强化学习模型的基本元素和模式,在计算机中通常使用马尔可夫决策过程(Markov Decision Process,MDP)将其转化为数学问题,然后进行求解,MDP通常定义为四元组( , , , ):

2.多臂老虎机问题(Multi-Armed Bandit,MAB)

多臂老虎机问题(Multi-Armed Bandit,MAB)是强化学习的经典问题之一,常作为强化学习领域的入门问题,多臂老虎机(Multi-Armed Bandit)问题描述如下:

  • 老虎机有K个摇臂,每个摇臂以一定的概率吐出金币,且概率是未知的
  • 玩家每次只能从K个摇臂中选择其中一个,且相邻两次选择或奖励没有任何关系
  • 玩家的目的是通过一定的策略使自己的奖励最大,即得到更多的金币

强化学习的核心要点是将待解决的问题转化为MDP(马尔可夫决策过程)问题,MAB问题是一个退化的MDP问题,它的MDP四元组( , , , )表示如下:

通过怎样的策略能够使玩家在一定时间内得到的金币更多呢,这样的问题可以通过强化学习的方法解决,强化学习的重点之一是如何与环境交互、产生有足够价值的数据,MAB问题可以帮助我们更好地理解产生数据的方法,下边介绍四种强化学习策略实现多臂老虎机问题。

首先,设置本案例中摇臂个数为5,并规定每个摇臂的真实奖励概率。

# 设摇臂个数为5,编号为0到4
k = 5
# 每个摇臂的真实奖励概率
real_reward = [0.2, 0.4, 0.7, 0.5, 0.3]

其中2号摇臂的奖励概率最高,若我们一直操作这个摇臂进行1000次游戏,则最终期望奖励是700,我们可以将这个数值作为我们心目中最理想的累积奖励。

3.探索利用困境(Exploration-exploitation dilemma)

在上述多臂老虎机问题中,玩家怎样知道每个摇臂获得奖励的概率呢?

  • 在强化学习中如果每个动作对应的奖励是一个确定的值,那每个动作只需尝试一次就可以知道奖励最大的动作;
  • 但现实中每个动作的奖励不是确定的,每个动作的奖励通常是一个概率分布,仅一次尝试并不能真实的了解动作的奖励;
  • 因此合理的做法是需要对每个动作进行多次的尝试,最终得出每个动作平均的奖励。

但是在现实环境中,游戏的次数往往是有限的,那么在有限的尝试次数内,如何使奖励最大化?

  • 仅探索策略:所有尝试机会平均分配给每个动作,得到每个动作奖励的近似估计。
  • 仅利用策略:只考虑目前奖励最大的动作。

探索策略能很好估计每个动作的奖励,但较难使奖励最大,但是利用策略又仅考虑当前已知的动作,并没有很好地估计每个动作的奖励,因此如何在探索和利用中进行平衡是强化学习面临的一个问题,这边是强化学习中的“探索利用困境”。

这样的问题就好比平时吃饭,假设你家附近有10家餐馆,每天只有一次在餐馆吃饭的机会,你已经去过其中的3家。现在你要去餐馆就餐,你为了让自己吃到最好的美食,你需要选出最好的餐馆。可问题是你只知道去过的三家餐馆中哪家最好,那剩下的7家餐馆呢?

选择剩下7家餐馆的其中一个,可能还不如自己去过的餐馆好,但是也有可能比自己去过的好,那该如何选择呢?你有两种做法

  • 探索:在自己没去过的餐馆中选择一家进行就餐,这就是探索策略
  • 利用:去自己去过的三家中最好的那家餐馆,这便是利用策略

下边我们通过具体的算法了解强化学习如何在多臂老虎机中解决这样的问题

4.使用四种策略解决MAB问题

我们将使用四种策略并对比四种策略的效果,这四种策略分别是:随机选择、ε-greedy、Boltzmann、UCB。

4.1 随机选择

随机选择策略是解决强化学习较为简单的策略,它的核心思想是对每个摇臂操作一定的次数,然后收集每个摇臂奖励的期望,基于此选择期望最大的摇臂作为最佳摇臂,每次游戏都选择最佳摇臂进行操作,接下来实现随机选择策略,并进行1000次游戏。

import numpy as np
import pandas as pddef random_select(N):# N为游戏次数# 初始化各摇臂期望奖励估计expect_reward_estimate = [0] * k# 初始化各摇臂操作次数operation = [0] * k# 初始化总奖励total_reward = 0for i in range(N):# 随机选择一个摇臂进行操作arm = np.random.choice(k , size=1)[0]# 收集反馈的奖励数据arm_reward = np.random.binomial(1, real_reward[arm], size=1)[0]# 更新期望奖励估计expect_reward_estimate[arm] = (expect_reward_estimate[arm] * operation[arm] + arm_reward)/(operation[arm] + 1)# 更新摇臂操作次数operation[arm] += 1# 更新累积奖励total_reward += arm_rewardreturn total_reward, expect_reward_estimate, operation

进行1000次游戏

N = 1000
total_reward,expect_reward,operation_times = random_select(N)

输出累积奖励和期望奖励估计表

print("随机选择的累积奖励:", total_reward)

随机选择的累积奖励: 442

# 期望奖励估计表
expect_reward_table = pd.DataFrame({'期望奖励':expect_reward,'操作次数':operation_times   })
expect_reward_table

通过上述结果可以看到,随机选择策略较为平均地分配操作次数给每个摇臂,累积奖励较低,距离我们理想的累积奖励相差较远。

4.2 ε-greedy

在之前的随机选择策略中并没有很好的均衡探索和利用的问题,为了解决探索利用的问题(exploration-exploitation dilemma),下边我们尝试ε-greedy策略,它的核心思想是在游戏中设置一个探索率ε,以ε为概率进行探索,随机选择一个摇臂;以概率1−ε 进行利用,即选择当前平均奖励最高的摇臂,其算法流程如下:

# 设定探索率
explorate_rate = 0.1
def epsilon_greedy(N, explorate_rate): # N为游戏次数# 初始化各摇臂期望奖励估计expect_reward_estimate = [0] * k# 初始化各摇臂操作次数operation = [0] * k# 初始化总奖励total_reward = 0for i in range(N):# 产生一个服从0到1之间均匀分布的随机数r = np.random.uniform(size=1)[0]# 选择“利用”if r > explorate_rate: # 选择当前最大期望奖励所对应的摇臂进行操作best_arm =  expect_reward_estimate.index(max(expect_reward_estimate))# 选择“探索”  else:      # 随机选择摇臂进行操作best_arm = np.random.choice(k, size=1)[0]# 收集反馈的奖励数据best_arm_reward = np.random.binomial(1, real_reward[best_arm], size=1)[0]# 更新期望奖励估计expect_reward_estimate[best_arm] = (expect_reward_estimate[best_arm] * operation[best_arm] + best_arm_reward)/(operation[best_arm] + 1)# 更新摇臂操作次数operation[best_arm] += 1# 更新累积奖励total_reward += best_arm_reward    return total_reward, expect_reward_estimate, operation

使用ε-greedy策略进行1000次游戏

N = 1000
total_reward,expect_reward,operation_times = epsilon_greedy(N, explorate_rate)
print("ε-greedy策略的累积奖励:", total_reward)

ε-greedy策略的累积奖励: 620

# 期望奖励估计表
expect_reward_table = pd.DataFrame({'期望奖励':expect_reward,'操作次数':operation_times   })
expect_reward_table

上述结果可以看到,累积奖励有了明显提升,并且在1000次游戏中,80%的操作都集中在最好的2号摇臂上。下面我们设置不同的探索率,来观察累积奖是如何变化的。

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# 在0到1之间生成100个探索率
explore_grad = np.arange(0.01, 1.01, 0.01)
# 在不同探索率下,ε-greedy策略的累积奖励
reward_result = [epsilon_greedy(N, i)[0] for i in explore_grad]
# 绘制折线图
plt.figure(figsize=(8, 6))
plt.plot(explore_grad,reward_result,c='deepskyblue')
plt.xlabel('探索率',fontsize=12)
plt.ylabel('累积奖励',fontsize=12)
plt.xlim(0,1)
plt.show()

由上图可以看到,累积奖励会随着探索率的增加而逐渐降低,趋近于1时变为“仅探索”。

4.3 Boltzmann

# sigma是Boltzmann的参数
sigma = 0.1def boltzmann(N, sigma):# 初始化各摇臂期望奖励估计expect_reward_estimate = [0] * k# 初始化各摇臂操作次数operation = [0] * k# 初始化总奖励total_reward = 0for i in range(N):# 通过Boltzmann分布计算摇臂的奖励概率reward_prob = np.exp(np.array(expect_reward_estimate)/sigma)/np.exp(np.array(expect_reward_estimate)/sigma).sum()# 通过奖励概率的分布进行抽样,选择摇臂best_arm = np.random.choice(k, size=1, p=reward_prob)[0] # 收集反馈的奖励数据    best_arm_reward = np.random.binomial(1, real_reward[best_arm], size=1)[0]# 更新期望奖励估计expect_reward_estimate[best_arm] = (expect_reward_estimate[best_arm] * operation[best_arm] + best_arm_reward)/(operation[best_arm] + 1)# 更新摇臂操作次数operation[best_arm] += 1   # 更新累积奖励total_reward += best_arm_reward    return total_reward, expect_reward_estimate, operation

使用Boltzmann策略进行1000次游戏

N = 1000
total_reward,expect_reward,operation_times = boltzmann(N,sigma)
print("Boltzmann策略的累积奖励:", total_reward)

Boltzmann策略的累积奖励: 690

# 期望奖励估计表
expect_reward_table = pd.DataFrame({'期望奖励':expect_reward,'操作次数':operation_times   })
expect_reward_table

上述结果可以看到,累积奖励已经十分接近我们的预期,并且在游戏中,操作基本都集中在最好的2号摇臂上,但由于对0、3、4号摇臂的操作次数较少,导致对其期望概率估计存在较大偏差。下面我们设置不同的参数sigma,来观察累积奖是如何变化的。

# 在0到1之间生成100个sigma
sigma_grad = np.arange(0.01, 1.01, 0.01)
# 得到在这100个sigma下,Boltzmann策略的累积奖励
reward_result = [boltzmann(N, i)[0] for i in sigma_grad]
# 绘制折线图
plt.figure(figsize=(8, 6))
plt.plot(sigma_grad, reward_result, c='firebrick')
plt.xlabel('探索率', fontsize=12)
plt.ylabel('累积奖励', fontsize=12)
plt.xlim(0, 1)
plt.show()

由上图可以看到,累积奖励会随着sigma的增加而逐渐降低,趋近于1时变为“仅探索”。

4.4 UCB

def ucb(N):# 初始化各摇臂期望奖励估计expect_reward_estimate = [0] * k# 初始化各摇臂操作次数operation = [0] * k# 初始化总奖励total_reward = 0for i in range(N):# 初始化最大置信区间上限max_upper_bound = 0# 遍历所有摇臂,根据UCB值选择最佳摇臂for j in range(k):if (operation[j] > 0): # 计算探索程度的大小delta_i = np.sqrt(2 * np.log(i + 1)/operation[j])# 计算UCB值upper_bound = expect_reward_estimate[j] + delta_ielse:# 初始化UCB值upper_bound = 1e400if upper_bound > max_upper_bound:# 更新UCB值max_upper_bound = upper_bound# 选择最佳摇臂best_arm = j   # 收集反馈的奖励数据    best_arm_reward = np.random.binomial(1, real_reward[best_arm], size=1)[0]# 更新期望奖励估计expect_reward_estimate[best_arm] = (expect_reward_estimate[best_arm] * operation[best_arm] + best_arm_reward)/(operation[best_arm] + 1)# 更新摇臂操作次数operation[best_arm] += 1    # 更新累积奖励total_reward += best_arm_reward    return total_reward, expect_reward_estimate, operation

进行1000次游戏

N = 1000
total_reward,expect_reward,operation_times = ucb(N)
print("UCB策略的累积奖励:", total_reward)

UCB策略的累积奖励: 623

# 期望奖励估计表
expect_reward_table = pd.DataFrame({'期望奖励':expect_reward,'操作次数':operation_times   })
expect_reward_table

上述结果可以看到,在1000次游戏中,70%的操作集中在最好的2号摇臂上,并且可以明显看到操作次数的多少是按照期望奖励估计的大小分配的。UCB策略在保证累积奖励的情况下,可以对每个摇臂的期望奖励进行更加准确的估计。

5. 各策略的稳定性对比

最后为了对比四种策略的效果,我们将四种策略各模拟100次,然后输出平均累积奖励,绘制出折线图,查看哪种策略是最稳定的。

# 进行模拟
random_select_simulate = [random_select(N)[0] for i in range(100)]
epsilon_greedy_simulate = [epsilon_greedy(N, 0.1)[0] for i in range(100)]
boltzmann_simulate = [boltzmann(N, 0.1)[0] for i in range(100)]
ucb_simulate = [ucb(N)[0] for i in range(100)]# 计算平均累积奖励
print('随机选择策略的平均累积奖励:', np.array(random_select_simulate).mean())
print('ε-greedy策略的平均累积奖励:', np.array(epsilon_greedy_simulate).mean())
print('Boltzmann策略的平均累积奖励:', np.array(boltzmann_simulate).mean())
print('UCB策略的平均累积奖励:', np.array(ucb_simulate).mean())

随机选择策略的平均累积奖励: 420.36
ε-greedy策略的平均累积奖励: 638.3
Boltzmann策略的平均累积奖励: 647.25
UCB策略的平均累积奖励: 617.39

# 绘制折线图
plt.figure(figsize=(10, 6))
plt.title('四种策略的对比',fontsize=18)
plt.plot(range(100), random_select_simulate, c='royalblue', label='random select') # 随机策略
plt.plot(range(100), epsilon_greedy_simulate, c='red', label='ε-greedy') # ε-greedy策略
plt.plot(range(100), boltzmann_simulate, c='teal', label='Boltzmann') # Boltzmann策略
plt.plot(range(100), ucb_simulate, c='g', label='UCB') # UCB策略
plt.xlabel('模拟次数', fontsize=18)
plt.ylabel('累积奖励', fontsize=18)
plt.grid(True)
plt.ylim(300, 750)
plt.legend(loc='lower right',fontsize=12)
plt.show()

从上述的折线图可以看到,随机选择策略的累积奖励最低,其它三种策略累积奖励变化相差不大,但UCB策略累积奖励波动较小,最为稳定。

在本案例中,先介绍了强化学习和多臂老虎机问题,并通过四种不同的策略,实现了强化学习算法模拟多臂老虎机。

6.总结

首先使用最简单的随机选择策略,这种方法较为平均地分配操作次数给每个摇臂,最终的效果并不理想;然后尝试使用ε-greedy策略,通过设置探索率均衡探索和利用的问题,结果发现效果明显提升,并且在1000次游戏中,80%的操作都集中在最好的2号摇臂上。

接下来使用Boltzmann策略,它是根据Boltzmann分布进行摇臂的选择,结果发现最终的奖励已经非常接近理想的效果,而且在游戏中操作基本都集中在最好的摇臂上;最后使用UCB策略,结果显示操作次数是根据各摇臂奖励期望的估计分配的,这样的策略不仅能保证累计奖励,还可以对每个摇臂真实的奖励做准确的估计。

在使用四种策略后,对这四种策略的稳定性进行对比,结果发现随机选择策略的效果最差,其它三种策略的累积奖励差距不大,但是UCB策略的波动更小,非常稳定。通过多臂老虎机的学习了解到强化学习的基本算法并了解不同算法的差异,为后续强化学习的实践做好基础。

转载自:

https://yaoyaowd.medium.com/%E4%BB%8Ethompson-sampling%E5%88%B0%E5%A2%9E%E5%BC%BA%E5%AD%A6%E4%B9%A0-%E5%86%8D%E8%B0%88%E5%A4%9A%E8%87%82%E8%80%81%E8%99%8E%E6%9C%BA%E9%97%AE%E9%A2%98-23a48953bd30

https://zhuanlan.zhihu.com/p/112970426

从Thompson Sampling到增强学习, 再谈多臂老虎机问题相关推荐

  1. 强化学习笔记:多臂老虎机问题(2)--Python仿真

    目录 0. 前言 1. k_armed_bandit function 2. The first trial 2.1 Optimal selection ratio along the time 2. ...

  2. 强化学习笔记:多臂老虎机问题(4)--跟踪非平稳环境

    目录 0. 前言 1. 问题描述 2. 练习1 3. 练习2 3.1 k_armed_bandit_one_run()接口扩张 3.2 Comparison in stationary environ ...

  3. 强化学习笔记:多臂老虎机问题(1)

    目录 1. 前言 2. 多臂老虎机问题描述 3. Conlict between exploitation and exploring 4. Action-Value method, 行动-价值方法 ...

  4. 强化学习笔记:多臂老虎机问题(7)--Gradient Bandit Algorithm

    目录 0. 前言 1. 算法原理 2. Python仿真 2.1 函数改造 2.2 softmax() 2.3 改造后的k_armed_bandit_one_run() 2.4 对比仿真 2.5 一点 ...

  5. 强化学习笔记:多臂老虎机问题(6)--Upper Confidence Bound

    目录 0. 前言 1. 算法原理 2. Python仿真 2.1 k_armed_bandit_one_run()改造 2.2  仿真对比Epsilon-greedy方法和UCB方法 3. 习题 0. ...

  6. 【强化学习】强化学习/增强学习/再励学习介绍

    Deepmind团队在17年12月5日发布的最新Alpha Zero中,非常重要的一种方法就是强化学习(reinforcement learning),又称再励学习.评价学习,是一种重要的机器学习方法 ...

  7. 从多臂老虎机开始学习强化学习中的探索与利用

    从多臂老虎机开始学习强化学习中的探索与利用 \quad 目录 从多臂老虎机开始学习强化学习中的探索与利用 多臂老虎机问题 形式化描述 估计期望奖励 代码实现 策略中的探索与利用 ϵ\epsilonϵ- ...

  8. 再谈如何学习Linux,一线Linux专家学习经验谈

    →点击领取阿里云限量红包 记得最早接触linux是在2000年,那个时候,还在上大学,一个同学从荷兰回来,带回来了一个Linux的拷贝版,记得版本还是Redhat6.2.曾经为安装一个系统让我们忘记疲 ...

  9. tensorflow和python先学哪个-前辈说先学会了这些Python知识点,再谈学习人工智能!...

    原标题:前辈说先学会了这些Python知识点,再谈学习人工智能! 首先我们看一看Python的优势: 开源,跨平台. 社区.不要小看这一点.社区意味着有很多教程.书籍,出了问题很容易google到,乃 ...

  10. 网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解

    目录 前文链接(系列助学, 也为后文学习做铺垫, 可按需读取) 一. 再谈HTTP再理解 二. HTTP对比学习HTTPS HTTP和HTTPS的区别如下: 三.TCP协议  (三次握手四次挥手细节过 ...

最新文章

  1. btc勒索病毒文件恢复及数据库恢复方案
  2. C++引用不能绑定到临时数据
  3. 文献记录(part35)--Mixed pooling and richer attention feature fusion for crack detection
  4. 【微机原理与接口技术】具体芯片(1)并行接口8255A(1):全局观
  5. php 观察者模式怎么用,php怎么实现观察者模式
  6. switch case里的变量生命周期
  7. Javascript对象扩展 - JsPoint类
  8. 怎么设置java内存_如何修改jvm内存 内存设置过大
  9. python儿童入门视频-老男孩Python视频教程全套完整版!无偿分享~
  10. ajax:dataType
  11. JavaScript编写的《人生不纠结模拟器》
  12. 汇编dos系统调用(输入输出篇)
  13. JAVA跑步计时器app_锻炼计时器app
  14. Invalid component name: “_Ctor“. Component names should conform to valid cus
  15. 京东百万年薪大佬用JAVA绘制“五子棋棋盘”(附代码)
  16. 元宇宙到底是什么?让我们来看看科技达人们是怎么讲的。
  17. 函数 单片机glint_单片机数字化资源库
  18. 深度学习:利用神经网络在少量数据情况下预测房价走势
  19. diary在matlab,在MATLAB中,命令“diary on/diary off”表示()
  20. 非参数估计—Parzen窗与K-nearest-neighbor

热门文章

  1. GitHub Error: API rate limit exceeded
  2. 苹果 watchOS 3.2 首个测试版:剧场模式、SiriKit
  3. mac 文字识别软件ocr_树洞OCR文字识别软件for mac-树洞OCR文字识别mac版v1.2.0 最新版-腾牛苹果网...
  4. 感受Java的魅力——基于Java二维数组和if语句编制的税后工资计算方法
  5. 计算机调用计算器快捷键,电脑计算器快捷键 电脑计算器快捷键如何设置
  6. oracle怎么建立物化视图,Oracle 建立物化视图步骤
  7. project项目管理软件の版本区别?
  8. python header函数_Header函数
  9. 【PCL】NDT点云配准(Registration)
  10. lh服务器注册,登不进去的人请看这里:LH服无法登录问题官方解释