强化学习编程实战-2马尔可夫决策过程

2.1 从多臂赌博机到马尔可夫决策过程

        如图2-1,图中A为多臂赌博机,B为一堆鸳鸯,其中左上角为雄性鸳鸯,右上角为雌性鸳鸯,B展示的任务是雄性鸳鸯绕过障碍物找到词性鸳鸯。跟多臂赌博机不同的是,雄性鸳鸯经过一次运动后会运动到另外一个位置,即系统B的状态发生了变化,而多臂赌博机经过一次动作后,其状态仍然是原来的状态。(这里假设每次运动后,多臂赌博机所有的元素都不会发生变化)

        多臂学习机通过强化学习算法学到了在固定不变的状态下最优的动作。那么,对于动作后状态发生变化的系统,如何学习到最优的动作呢?

        我们仔细分析这类问题。如图2-2.

        我们将鸳鸯系统的整个状态空间离散为只包含100各状态的状态空间,雄性鸳鸯在每个状态都有四个可行的动作,即向东、南、西、北四个方向移动。跟多臂赌博机不同的是,雄性鸳鸯需要做一系列的最优动作才能找到雌性鸳鸯。所以,雄性鸳鸯找到雌性鸳鸯是一个序贯决策问题。

        然后,强化学习不是万能的,他不能解决所有的序贯决策问题,只能解决建模为马尔可夫决策过程(MDP)过程的序贯决策问题。

        马尔可夫决策可以用一个五元组(S,A,P,R,\gamma)来描述。其中S为状态空间,A为动作空间,P为状态转移概率,R为回报函数,\gamma为折扣因子。

        (1)状态S

        在解决实际问题时,最关键的是如何表示要解决问题的状态。一个准则是,状态的表示因该使得状态满足马尔可夫性。(系统的下一个状态只与当前状态有关,与之前的状态无关)

        例1:如图2-3为经典的基于DQN解决雅达利游戏Breakthrough的例子。在该例子中,状态的表示为连续的4帧图像s_t{}=[i_t{},i_{t-1},i_{t-2},i_{t-3}],其中i_t{}为t时刻的游戏画面帧。这样表示,是为了让其满足马尔可夫性。

        例2:在图2-2中,我们将鸳鸯的整个运动空间离散成拥有100个状态的状态空间,每个状态表示一个位置。状态空间S={0,1,...,99}.

        对于许多实际问题,我们往往并不能精确地或者人为地表示出状态s_t{},而仅仅能得到观测历史和动作历史,即h_t{}=a_0,o_1,a_1,o_2,...,a_{t-1},o_{t},这个时候,我们往往可以用机器学习的方法将状态空间的学习表示出来。即

        对于有些问题,我们无法知道整个系统的真实状态s,只能知道部分信息。比如游戏地图,我们只知道当前的地图,而不是全部地图。此类问题,称之为部分可观马尔可夫决策。

(2)动作空间A

        动作空间是指智能空间可以采取的所有动作的集合。动作空间可以是离散也可以是连续空间。比如雅丽达游戏,动作可以分为17个离散动作;19x19的围棋动作空间为362个离散动作;32自由度机器人的动作空间为32维的连续空间。

        智能体的策略定义在动作集上。策略==在给定状态处可行动作空间的动作分布==在状态s_t处,智能体选择每个可行动作的概率或者概率密度。

        常用的策略分离散策略和连续策略。

        ①   离散策略

其中q_*{}(s,a)为行为值函数。

        ②\varepsilon-greedy策略:

        ③玻尔兹曼策略:

        ④连续策略:

        (3)状态转移概率P

        状态转移概率是指给定当前状态St和动作a_t{},转移到状态s_{t+1}的概率分布,即

        这里的状态转移概率P==系统模型,强化学习算法常常分为无模型和有模型,其中的模型是指状态转移概率P.

        (4)回报函数R

        R是给定状态s_{t} ,采取动作a_{t}后,智能体得到的回报,即 r=R(s_{t},a_{t}).

        一般来讲,回报是人为设定的回报。比如,雅达利游戏中,回报R来自游戏的得分。R也可以来自某些得分函数。

        强化学习算法往往对回报函数R非常敏感,不同的回报函数对于收敛性和学习速度影响非常大。稀疏回报的问题,强化学习算法的效率很低。因此,实际中常用Reward Shaping技术将稀疏回报变为稠密回报

        当拥有专家数据,并且回报函数R未知时,可以通过逆向强化学习的方法从专家数据中学习回报函数。当回报无法人为给出时,可以利用机器学习的方法利用数据进行学习。

        (5)折扣因子\gamma

        折扣因子\gamma是衰减未来的回报对当前状态值的贡献,取值常为0~1。一般,完成一次任务需要的步数越多,折扣因子\gamma的取值越接近1.

        那么,如何用马尔可夫决策过程来描述一个序贯决策?

        如图2-4所示为机器人找金币的例子。在该例子中,机器人并不知道金币在哪里,只能通过与网络环境进行交互找到最优策略。

        下面用马尔可夫决策过程的5个元素来描述机器人找金币问题。

(1)状态空间S

        S={1,2,3,4,5,6,7,8}

(2)动作空间A

        A={'e','s','w','n'}

(3)状态转移概率P

       机器人的运动规则,即碰到网格边界仍然保持原来的位置,否则按照运动学更新位置。

(4)回报函数R

         机器人每走一格回报为0;遇到金币的回报为1,游戏结束;进入死亡区6或者8的回报为-1,游戏结束。

(5)折扣因子\gamma

        可以取0-1,这里取0.85

        

那么,如何利用马尔可夫决策过程进行学习得到最优策略呢?

        所有的学习算法都从数据中进行学习,强化学习也不例外。强化学习从马尔可夫链数据中进行学习。马尔可夫链数据==一个马尔可夫决策过程序列数据。比如在图2-4给出的机器人找金币的例子中,马尔可夫链数据为:

        该数据链是机器人在状态1时采取往东的动作,得到回报0,并进入状态2;在状态2时采取往东的动作,得到回报0,进入状态3;在状态3时采取往南的动作,得到回报1,并进入终止状态,游戏结束。

        那如何从这个数据链中学习?

        强化学习的目标==找到每个状态s处的最优策略。

        \pi(s_{t})来表示策略,那如何说一个策略 \pi_{1}(s_{t})比另一个策略\pi_{2}(s_{t})更优?--->值函数的定义。在相同的状态s_t下,比较两个策略的值函数\nu _\pi (s_t),值函数大的策略更优。该值函数反映了整个序贯决策。

        最常用的值函数的定义为折扣累积回报的期望

其中折扣累积回报为

        用同样的方法可以定义行为值函数

        ①行为值函数q_\pi(s,a):衡量的是在状态s处,采取动作a后转移到状态s',并从状态s'开始执行策略\pi所得到的折扣累积回报的期望。可以评估在后继状态策略为\pi的情况下,当前状态处每个动作的好坏。

        ②值函数\nu _\pi(s_t):衡量的是在状态s处便开始执行策略\pi所得到的折扣累积回报的期望。可以评估在当前状态下直接采取策略\pi的好坏

        如果我们定义一个量 :动作a的优势函数A(s,a)=q_\pi(s,a)-\nu _\pi(s_t),那么它的物理意义是当智能体在状态s采取动作a所得到的折扣累计回报的期望比采取策略\pi所得到的折扣累积回报的期望高多少;差值>0,说明在该状态处采取动作a比执行策略\pi好。

        如何从马尔可夫决策链数据中学习最优的策略?(给出值函数和行为值函数之后)-->如何从马尔可夫决策链数据中学习值函数最大的策略

        ①最优值函数的定义:\nu ^{*}(s)为所有策略中值最大的状态值函数

        ②最优行为值函数:q^{*}(s,a)为所有策略中行为值函数最大的。

         智能体决策系统可以利用马尔科夫决策过程(S,A,P,R,\gamma)来描述,智能体在策略Π下产生的马尔可夫决策数据链表示为

        对应折扣累积回报G(St),在随机策略Π下,马尔可夫决策数据链\tau产生的概率为p(\tau)强化学习如何通过学习的方法找到最优的策略并使得如下值函数最大?

         对于(2-10)有很多种强化学习方法,最主要的分为两类:①利用值函数②利用直接策略搜索,两者可以融合,形成表演家-评论家(AC)的方法。

        强化学习中的典型问题:

        ①状态表示问题

        复杂时,利用深度神经网络进行自动特征提取是目前长常用的方法之一。

        ②置信分配问题

        ③探索与利用平衡问题

        ④策略梯度的方差与偏差平衡问题

        在直接策略搜索算法中,最常用的是策略梯度的方法。然而,由于无模型,策略的梯度只能从数据中通过估计得到,这便涉及到策略梯度估计方法的偏差和方差问题。偏差和方差。

        ⑤on-policy和off-policy问题当然越小越好,但有时两者确实矛盾的。

        on-policy:同策略==指智能体从当前策略产生的数据中进行学习,可以使智能体的学习稳定。缺点:只向当前策略产生的数据进行学习,因此学习效率和样本利用率低。

        off-policy:异策略=指智能体从其他策略产生的数据进行学习。可以向任何策略产生的数据进行学习,也可以向智能体过去已经产生的数据进行学习,因此学习效率和样本利用率高。缺点:容易产生误差,学习不稳定。

2.2 马尔科夫决策过程代码实现

        在本节中,要实现的是下图的鸳鸯系统。

         ①为了渲染出图2-5的图像,使用pygame包。

        pip install pygame

        加载pygame库后,引入pygame库中的函数,同时在程序中用到的包还有包random、数值计算包numpy。

        ②加载完必要的包后,声明一个鸳鸯类YuanYangEnv来构建鸳鸯环境。包括成员函数:

        初始化__init__()、重置环境reset、状态转换为像素坐标state_to_position、像素坐标转换为状态position_to_state、状态转移transform、游戏结束控制gameover、游戏渲染render、雄鸟碰撞检测collide和雄鸟是否找到雌鸟find。

__init__中定义马尔可夫决策过程的几个元素(S,A,P,R,\gamma),其中状态空间S由一个元组states来表示,元组中的元素为0,1,2,...,99,表示雄鸟的100个状态。动作空间A由元组actions组成,折扣因子为gamma,可设为0.8。由值函数的定义,每个状态处都有一个对应的值函数,因此值函数v可以用一个10x10的表格value来表示,由于开始并不知道值函数的大小,因此初始值都为0.马尔可夫决策过程中的状态转移概率P由子函数transforn来描述。

       类YuanYangEnv初始化函数下面的代码主要设置渲染属性。用viewer来表示一个渲染窗口,screen_size表示窗口大小,bird_position表示雄鸟当前的位置坐标,雄鸟在x方向每动作一次行走的像素距离为120,在y方向每动作一次行走的像素为90;每个障碍物的大小为120*90。在该环境中,一共有两堵障碍物墙,分别用obstacle1和obstacle2来表示,每堵障碍物墙由8个小的障碍物构成。雄鸟的初始位置bird_male_ini_position,和当前位置bird_male_position都为【0,0】,雌鸟的初始位置为bird_female_position=[1080,0].

        ③碰撞检测函数collide()

        用标志flag、flag1、flag2分别表示是否与障碍物、障碍物墙1、障碍物墙2进行碰撞。

        先检测雄鸟是否与第1堵障碍物墙发生碰撞,检测的算法为找到雄鸟与第1堵墙所有障碍物x方向和y方向最近的障碍物的坐标差,并判断最近的坐标差是否大于一个最小运动距离,如果>=,那么就不会发生碰撞。再检测第2堵墙,最后检测雄鸟是否超出了边界,如果超出了,也判定为碰撞。最后返回碰撞标志位。

        ④雄鸟找到雌鸟的判断子函数 find()

        设置标志flag,判断雄鸟当前位置和雌鸟位置的坐标差,当该值<最小运动距离时判断为找到。

        ⑤状态到像素坐标变换的函数state_to_position()

        在马尔可夫决策过程中用的是状态描述,因此需要转换。

        ⑥像素坐标到状态转换的函数position_to_state()

        环境重置函数reset()

        随机产生一个合法的初始位置,该位置不能再障碍物处,也不能在此雌鸟的位置,因此用一个while循环来产生一个符合条件的初始位置。

        ⑧状态转移概率模型P和回报函数 transform

        在transform()函数中,首先判断当前坐标是否与障碍物碰撞或者是否是终点,如果是,那么结束本次转换。如果当前没有与障碍物碰撞或者没有在雌鸟的位置,那么根据运动学进行像素位置坐标的转换。最后判断下一个状态是否与障碍物发生碰撞,以及是否找到雌鸟。

        回报函数的设置为如果没找到雌鸟,立即回报为0;如果与障碍物碰撞,回报为-1;如果找到雌鸟立即回报为1。

        ⑨游戏结束函数gameover()和环境渲染函数render()

        为了将游戏很直观地呈现出来,我们调用pygame包进行游戏的控制。

        里面的图像下载如何用load.py来进行下载

        ⑩主函数

        声明一个鸳鸯环境的实例yy,然后调用渲染函数将系统绘制出来,最后调用循环语句检查是否要结束游戏渲染。

        如下图

        生成的太大,电脑上没有完整显示。需要后面调整一下。

        有了仿真训练环境,后面章节将会介绍如何通过强化学习使得雄鸟找到雌鸟。

        代码如下:

        mdp.py

# 导入必要的包
import pygame
from load import *
import random
import numpy as np# 鸳鸯环境类
class YuanYangEnv:def __init__(self):# 初始化self.states=[]for i in range(0,100):self.states.append(i)self.actions=['e','s','w','n']self.gamma=0.8self.value=np.zeros((10,10))#设置渲染属性self.viewer=Noneself.FPSCLOCK=pygame.time.Clock()#屏幕大小self.screen_size=(1200,900)self.bird_position=(0,0)self.limit_distance_x=120self.limit_distance_y=90self.obstacle_size=[120,90]self.obstacle1_x=[]self.obstacle1_y=[]self.obstacle2_x=[]self.obstacle2_y=[]for i in range(8):#第一个障碍物self.obstacle1_x.append(360)if i<=3:self.obstacle1_y.append(90*i)else:self.obstacle1_y.append(90*(i+2))#第二个障碍物self.obstacle2_x.append(720)if i<=4:self.obstacle2_y.append(90*i)else:self.obstacle2_y.append(90*(i+2))self.bird_male_init_position=[0.0,0.0]  #雄鸟初始位置self.bird_male_position=[0,0]           #雄鸟当前位置self.bird_female_init_position=[1080,0] #雌鸟初始位置#碰撞检测函数def collide(self,state_position):flag=1 flag1=1flag2=2#判断第1个障碍物dx=[]dy=[]for i in range(8):dx1=abs(self.obstacle1_x[i]-state_position[0])dx.append()dy1=abs(self.obstacle1_y[i]-state_position[1])dy.append()mindx=min(dx)mindy=min(dy)if mindx>=self.limit_distance_x or mindy>=self.limit_distance_y:flag1=0#判断第2个障碍物second_dx=[]second_dy=[]for i in range(8):dx2=abs(self.obstacle2_x[i]-state_position[0])second_dx.append(dx2)dy2=abs(self.obstacle2_y[i]-state_position[1])second_dy.append(dy2)mindx=min(second_dx)mindy=min(second_dy)if mindx>=self.limit_distance_x or mindy>=self.limit_distance_y:flag2=0if flag1==0 and flag2==0:flag=0#判断是否边界碰撞if state_position[0]>1080 or state_position[0]<0 or state_position[1]>810 or state_position[1]<0:flag=1return flag#雄鸟找到雌鸟的判断def find(self,state_position):flag=0if abs(state_position[0]-self.bird_female_init_position[0])<self.limit_distance_x and abs(state_position[1]-self.bird_female_init_position[1])<self.limit_distance_y:flag=1return flag#状态转换为坐标def state_to_position(self,state):i=int(state/10)j=state%10position=[0,0]position[0]=120*jposition[1]=90*jreturn position#坐标转换为状态def position_to_state(self,position):i=position[0]/120j=position[1]/90return int(i+10*j)#环境重置函数def reset(self):#随机产生初始状态flag1=1flag2=1while flag1 or flag2==1:state=self.states[int(random.random()*len(self.states))]state_position=self.state_to_position(state)flag1=self.collide(state_position)flag2=self.find(state_position)return state#状态转移概率模型Pdef transform(self,state,action):#将当前状态转换为坐标current_position=self.state_to_position(state)next_position=[0,0]flag_collide=0flag_find=0flag_collide=self.collide(current_position)    #判断当前坐标是否与障碍物碰撞flag_find=self.find(current_position)          if flag_collide==1 or flag_find==1:return state,0,True#状态转移if action=='e':next_position[0]=current_position[0]+120next_position[1]=current_position[1]if action=='s':next_position[0]=current_position[0]next_position[1]=current_position[1]+90if action=='w':next_position[0]=current_position[0]-120next_position[1]=current_position[1]if action=='n':next_position[0]=current_position[0]next_position[1]=current_position[1]-90#判断next_state是否与状态碰撞flag_collide=self.collide(next_position)#如果碰撞,回报为-1,并结束if flag_collide==1:return self.position_to_state(next_position),-1,True#判断是否是终点flag_find=self.find(next_position)if flag_find==1:return self.position_to_state(next_position),1,Truereturn self.position_to_state(next_position),0,False#游戏结束控制def gameover(self):for event in pygame.event.get():if event.type==quit:exit()#渲染游戏def render(self):if self.viewer is None:pygame.init()#画一个窗口self.viewer=pygame.display.set_mode(self.screen_size,0,32)pygame.display.set_caption('yuanyang')#下载图片self.bird_male=load_bird_male()self.bird_female=load_bird_female()self.background= load_background()self.obstacle=load_obstacle()self.viewer.blit(self.bird_male,self.bird_male_init_position)self.viewer.blit(self.bird_female,self.bird_female_init_position)self.viewer.blit(self.background,(0,0))self.font=pygame.font.SysFont('times',15)self.viewer.blit(self.background,(0,0))#画直线for i in range(11):pygame.draw.lines(self.viewer,(255,255,255),True,((120*i,0),(120*i,900)),1)pygame.draw.lines(self.viewer,(255,255,255),True,((0,90*i),(1200,90*i)),1)self.viewer.blit(self.bird_female,self.bird_female_init_position)#画障碍物for i in range(8):self.viewer.blit(self.obstacle,(self.obstacle1_x[i],self.obstacle1_y[i]))self.viewer.blit(self.obstacle,(self.obstacle2_x[i],self.obstacle2_y[i]))#画小鸟self.viewer.blit(self.bird_male,self.bird_male_position)#画值函数for i in range(10):for j in range(10):surface=self.font.render(str(round(float(self.value[i,j]),3)),True,(0,0,0))self.viewer.blit(surface,(120*i+5,90*j+70))pygame.display.update()self.gameover()self.FPSCLOCK.tick(30)#主函数进行测试
if __name__=='__main__':yy=YuanYangEnv()yy.render()while True:for event in pygame.event.get():if event.type==quit:exit()

        里面用的图片需要下载,存在resources文件夹中。

        load.py

import pygame
import os
from pygame.locals import *
from sys import  exit
#得到当前工程目录
current_dir = os.path.split(os.path.realpath(__file__))[0]
print(current_dir)
#得到文件名
bird_file = current_dir+"/resources/bird.png"
obstacle_file = current_dir+"/resources/obstacle.png"
background_file = current_dir+"/resources/background.png"
#创建小鸟,
def load_bird_male():bird = pygame.image.load(bird_file).convert_alpha()return bird
def load_bird_female():bird = pygame.image.load(bird_file).convert_alpha()return bird
#得到背景
def load_background():background = pygame.image.load(background_file).convert()return background
#得到障碍物
def load_obstacle():obstacle = pygame.image.load(obstacle_file).convert()return obstacle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

019-GeoGebra中级篇-GeoGebra的坐标系

GeoGebra作为一款强大的数学软件&#xff0c;支持多种坐标系的使用&#xff0c;包括但不限于&#xff1a;笛卡尔坐标系&#xff08;Cartesian Coordinate System&#xff09;、极坐标系&#xff08;Polar Coordinate System&#xff09;、参数坐标系&#xff08;Parametric Coo…

虚拟机使用

1、安装 如何安装虚拟机&#xff1f;保姆级安装教程&#xff01; - 知乎 (zhihu.com) 2、使用 2.1 快照 作用&#xff1a;保留当前系统信息为快照&#xff0c;随时可以恢复&#xff0c;以防未来系统被你玩坏&#xff0c;就好比游戏中的归档&#xff01;每配置好一个就可以保…

Linux dig命令常见用法

Linux dig命令常见用法 一、dig安装二、dig用法 DIG命令(Domain Information Groper命令)是常用的域名查询工具&#xff0c;通过此命令&#xff0c;你可以实现域名查询和域名问题的定位&#xff0c;对于网络管理员和在域名系统(DNS)领域工作的小伙伴来说&#xff0c;它是一个非…

昇思MindSpore学习笔记6-01LLM原理和实践--FCN图像语义分割

摘要&#xff1a; 记录MindSpore AI框架使用FCN全卷积网络理解图像进行图像语议分割的过程、步骤和方法。包括环境准备、下载数据集、数据集加载和预处理、构建网络、训练准备、模型训练、模型评估、模型推理等。 一、概念 1.语义分割 图像语义分割 semantic segmentation …

【计算机毕业设计】018基于weixin小程序实习记录

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【Java系列】深入解析 Lambda表达式

简化这个代码 这个就是Lambda表达式,可以简化匿名内部类的写法 package lambda;public class demo2 {public static void main(String[] args) {//第二个参数是一个接口,所以我们在调用方法的时候,需要传递这个接口的实现类对象--接口多态// 但是这个实现类,我只要用一次,所以我…

@Builder注解详解:巧妙避开常见的陷阱

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 Builder注解详解&#xff1a;巧妙避开常见的陷阱 前言1. Builder的基本使用使用示例示例类创建对…

极客时间:使用Autogen Builder和本地LLM(Microsoft Phi3模型)在Mac上创建本地AI代理

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

运维系列.Nginx:自定义错误页面

运维系列 Nginx&#xff1a;自定义错误页面 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/…

本地部署秘塔开源搜索引擎

秘塔AI搜索是由秘塔科技于2024年初推出的一款新型搜索引擎&#xff0c;被业界誉为“中国版的Perplexity”。秘塔科技成立于2018年4月&#xff0c;其核心团队包括CEO闵可锐、技术专家唐悦和首席运营官王益为等。秘塔AI搜索以其高效简洁的特点受到关注&#xff0c;其搜索结果直接…

LeetCode——第 405 场周赛

题目 找出加密后的字符串 给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串&#xff1a; 对于字符串 s 中的每个字符 c&#xff0c;用字符串中 c 后面的第 k 个字符替换 c&#xff08;以循环方式&#xff09;。 返回加密后的字符串。 示例 1&#xff1a; 输入&…

谷粒商城学习笔记-16-人人开源搭建后台管理系统

文章目录 一&#xff0c;克隆前/后端代码1&#xff0c;克隆前端工程renren-fast-value2&#xff0c;克隆后端工程renren-fast 二&#xff0c;集成后台管理系统的后端代码三&#xff0c;启动后台管理系统四&#xff0c;前端系统的安装和运行1&#xff0c;下载安装VSCode2&#x…

为什么KV Cache只需缓存K矩阵和V矩阵,无需缓存Q矩阵?

大家都知道大模型是通过语言序列预测下一个词的概率。假定{ x 1 x_1 x1​&#xff0c; x 2 x_2 x2​&#xff0c; x 3 x_3 x3​&#xff0c;…&#xff0c; x n − 1 x_{n-1} xn−1​}为已知序列&#xff0c;其中 x 1 x_1 x1​&#xff0c; x 2 x_2 x2​&#xff0c; x 3 x_3 x…

STM32对数码管显示的控制

1、在项目开发过程中会遇到STM32控制的数码管显示应用&#xff0c;这里以四位共阴极数码管显示控制为例讲解&#xff1b;这里采用的控制芯片为STM32F103RCT6。 2、首先要确定数码管的段选的8个引脚连接的单片机的引脚是哪8个&#xff0c;然后确认位选的4个引脚连接的单片机的4…

京东技术团队撰写的整整986页《漫画学Python》到底有什么魅力?

这是一本Python入门书。无论您是想学习编程的小学生&#xff0c;还是想参加计算机竞赛的中学生&#xff0c;抑或是计算机相关专业的大学生&#xff0c;甚至是正在从事软件开发的职场人&#xff0c;本书都适合您阅读和学习。但您若想更深入地学习Python并进行深层次应用&#xf…

通过 Parallels Desktop 虚拟机安装运行 macOS 15 Sequoia

在 Apple 的 WWDC 24 大会上&#xff0c;macOS Sequoia 15 成为全场热议的焦点。 作为科技爱好者和开发者&#xff0c;我们都迫不及待想要体验这些最新功能。但如果直接把整个 Mac 升级到测试版&#xff0c;可能不太现实&#xff0c;特别是当你需要保持主系统稳定的时候。 幸…

Unity--射线检测--RayCast

Unity–射线检测–RayCast 1.射线检测的含义 射线检测,根据名称而言,使用一条射线来检测是击中了某个物体/多个物体 射线检测的包含两个部分: 射线和检测 2.射线检测可以用在哪些地方 射击游戏&#xff1a; 玩家的瞄准和射击&#xff1a;检测玩家视线是否与敌人或其他目标…

阶段三:项目开发---大数据开发运行环境搭建:任务5:安装配置Kafka

任务描述 知识点&#xff1a;安装配置Kafka 重 点&#xff1a; 安装配置Kafka 难 点&#xff1a;无 内 容&#xff1a; Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;…

用起来超爽的4个宝藏软件工具

记得带 “记得带”是一款专为繁忙的都市人设计的生活服务软件&#xff0c;旨在帮助用户轻松管理日常生活中的各种事务。该应用程序集成了多种实用功能&#xff0c;包括购物清单、待办事项、日程安排和健康追踪等。它还具有智能提醒功能&#xff0c;可以根据用户的日常习惯和偏好…