近端策略优化(Proximal Policy Optimization, PPO)详解

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:机器学习分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:近端策略优化(Proximal Policy Optimization, PPO)详解

文章目录

    • 引言
    • 一、基本原理
      • 1. 策略优化的背景
      • 2. 剪切机制
      • 3. 优势函数的使用
      • 4. 经验回放与多步更新
      • 5. 适应性与灵活性
    • 二、数学模型
      • 1. 目标函数
      • 2. 优势函数的计算
      • 3. 策略比率的定义
      • 4. 优化过程
      • 5. 经验回放与多步更新
    • 三、实现步骤
      • 1. 环境交互
      • 2. 计算优势函数
      • 3. 更新策略
      • 4. 更新价值函数
      • 5. 重复训练过程
      • 6. 超参数调整
    • 四、应用场景
      • 1. 游戏AI
      • 2. 机器人控制
      • 3. 自动驾驶
      • 4. 推荐系统
    • 总结

在这里插入图片描述

引言

  在人工智能的快速发展中,强化学习作为一种重要的学习范式,逐渐引起了广泛的关注。它通过与环境的交互,学习如何在复杂的决策问题中做出最佳选择。随着深度学习技术的进步,强化学习的应用场景也不断扩展,从游戏AI到机器人控制,再到自动驾驶和推荐系统,强化学习正在改变我们与技术的互动方式。

  在众多强化学习算法中,近端策略优化(Proximal Policy Optimization, PPO)因其优越的性能和稳定性而脱颖而出。PPO结合了策略梯度方法的灵活性和价值函数方法的稳定性,成为了当前强化学习领域的热门选择。它通过引入“剪切”机制,有效地限制了策略更新的幅度,从而避免了训练过程中的不稳定性。

  本文将深入探讨PPO的基本原理、数学模型、实现步骤以及应用场景,帮助读者更好地理解这一强大的强化学习算法,并为实际应用提供指导。无论您是强化学习的初学者还是有经验的研究者,PPO都将为您提供新的视角和思路。

一、基本原理

  近端策略优化(Proximal Policy Optimization, PPO)是一种强化学习算法,旨在通过优化策略来提高智能体在环境中的表现。PPO的设计理念是结合策略梯度方法的灵活性和稳定性,解决传统策略优化方法中的不稳定性问题。

1. 策略优化的背景

  在强化学习中,智能体通过与环境的交互来学习最优策略。传统的策略梯度方法通过直接优化策略函数来学习,但在实际应用中,策略的更新可能会导致性能的剧烈波动,影响训练的稳定性和收敛速度。为了解决这一问题,PPO引入了新的策略更新机制。

2. 剪切机制

  PPO的核心创新在于其剪切目标函数的设计。通过限制新旧策略之间的差异,PPO能够有效地控制策略更新的幅度。这种剪切机制确保了在每次更新中,策略不会偏离当前策略太远,从而避免了策略崩溃的风险。具体来说,PPO通过引入一个超参数 ϵ \epsilon ϵ,来控制策略比率的变化范围,使得策略更新更加稳健。

3. 优势函数的使用

  PPO利用优势函数来评估当前动作的相对价值。优势函数不仅能够提高策略更新的效率,还能减少方差,使得训练过程更加稳定。通过结合优势函数,PPO能够更好地指导策略的优化,确保智能体在学习过程中能够快速收敛到较优的策略。

4. 经验回放与多步更新

  PPO通常结合经验回放机制,通过收集多个时间步的经验进行批量更新。这种方法不仅提高了样本的利用效率,还能够进一步增强训练的稳定性。此外,PPO支持多步更新,即在每次更新中使用多个时间步的经验,这样可以更全面地反映环境的动态变化。

5. 适应性与灵活性

  PPO的设计使其在不同的任务和环境中表现出较强的适应性和灵活性。无论是在离散动作空间还是连续动作空间中,PPO都能够有效地进行策略优化。此外,PPO的超参数设置相对简单,通常只需要调整几个关键参数(如学习率和剪切范围),使得其在实际应用中更易于调优。

二、数学模型

  近端策略优化(Proximal Policy Optimization, PPO)的数学模型主要围绕其目标函数的设计和策略更新的机制展开。

1. 目标函数

PPO的目标函数是其核心部分,旨在通过限制策略更新的幅度来提高训练的稳定性。PPO的目标函数定义为:

L C L I P ( θ ) = E t [ min ⁡ ( r t ( θ ) A ^ t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ t ) ] L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A}_t \right) \right] LCLIP(θ)=Et[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]

其中:

  • r t ( θ ) = π θ ( a t ∣ s t ) π θ o l d ( a t ∣ s t ) r_t(\theta) = \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{old}}(a_t | s_t)} rt(θ)=πθold(atst)πθ(atst) 是新旧策略的比率,表示在当前策略下采取某个动作的概率与旧策略下采取同一动作的概率之比。
  • A ^ t \hat{A}_t A^t 是优势函数的估计值,反映了当前动作相对于基线的优劣。
  • ϵ \epsilon ϵ 是一个超参数,控制剪切的范围。

目标函数的解释

  • 剪切机制:目标函数中的clip操作确保了当策略比率 r t ( θ ) r_t(\theta) rt(θ)超出 ( 1 − ϵ , 1 + ϵ ) (1 - \epsilon, 1 + \epsilon) (1ϵ,1+ϵ)范围时,目标函数的值不会随之增加。这种设计有效地限制了策略的更新幅度,避免了策略的剧烈波动。
  • 优势函数的作用:优势函数 A ^ t \hat{A}_t A^t用于衡量当前动作的相对价值,结合策略比率,可以更好地指导策略的优化。

2. 优势函数的计算

优势函数 A ^ t \hat{A}_t A^t的计算是PPO中的一个重要步骤。常用的计算方法是广义优势估计(Generalized Advantage Estimation, GAE),其定义为:

A ^ t = δ t + ( γ λ ) δ t + 1 + ( γ λ ) 2 δ t + 2 + … \hat{A}_t = \delta_t + (\gamma \lambda) \delta_{t+1} + (\gamma \lambda)^2 \delta_{t+2} + \ldots A^t=δt+(γλ)δt+1+(γλ)2δt+2+

其中, δ t \delta_t δt是时刻 t t t的时间差分(Temporal Difference)误差,定义为:

δ t = r t + γ V θ o l d ( s t + 1 ) − V θ o l d ( s t ) \delta_t = r_t + \gamma V_{\theta_{old}}(s_{t+1}) - V_{\theta_{old}}(s_t) δt=rt+γVθold(st+1)Vθold(st)

  • r t r_t rt是即时奖励。
  • γ \gamma γ是折扣因子,控制未来奖励的影响。
  • V θ o l d ( s ) V_{\theta_{old}}(s) Vθold(s)是旧策略下的状态值函数。

GAE通过结合多个时间步的TD误差,能够有效地减少方差,提高优势函数的估计精度。

3. 策略比率的定义

策略比率 r t ( θ ) r_t(\theta) rt(θ)是PPO中的一个关键概念,用于衡量新旧策略之间的差异。其定义为:

r t ( θ ) = π θ ( a t ∣ s t ) π θ o l d ( a t ∣ s t ) r_t(\theta) = \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{old}}(a_t | s_t)} rt(θ)=πθold(atst)πθ(atst)

  • π θ ( a t ∣ s t ) \pi_\theta(a_t | s_t) πθ(atst)是当前策略在状态 s t s_t st下选择动作 a t a_t at的概率。
  • π θ o l d ( a t ∣ s t ) \pi_{\theta_{old}}(a_t | s_t) πθold(atst)是旧策略在相同状态下选择相同动作的概率。

策略比率的引入使得PPO能够在更新策略时,考虑到新旧策略之间的相对变化,从而有效地控制更新的幅度。

4. 优化过程

PPO的优化过程通常采用小批量随机梯度上升(Stochastic Gradient Ascent)的方法。具体步骤如下:

  1. 收集经验:智能体与环境交互,收集状态、动作、奖励和下一状态的数据。

  2. 计算优势函数:使用GAE计算每个时间步的优势函数 A ^ t \hat{A}_t A^t

  3. 更新策略

    • 计算目标函数 L C L I P ( θ ) L^{CLIP}(\theta) LCLIP(θ)
    • 使用梯度上升法更新策略参数 θ \theta θ,通过以下公式进行更新:

    θ ← θ + α ∇ θ L C L I P ( θ ) \theta \leftarrow \theta + \alpha \nabla_\theta L^{CLIP}(\theta) θθ+αθLCLIP(θ)

    其中, α \alpha α是学习率。

  4. 更新价值函数:如果使用了价值函数来估计状态值,需同时更新价值函数的参数,通常使用均方误差损失函数进行优化。

5. 经验回放与多步更新

  PPO通常结合经验回放机制,通过收集多个时间步的经验进行批量更新。这种方法不仅提高了样本的利用效率,还能够进一步增强训练的稳定性。此外,PPO支持多步更新,即在每次更新中使用多个时间步的经验,这样可以更全面地反映环境的动态变化。

三、实现步骤

  近端策略优化(Proximal Policy Optimization, PPO)算法的实现可以分为多个步骤,从环境交互到策略更新,每个步骤都至关重要。以下是PPO的详细实现步骤:

1. 环境交互

在PPO的训练过程中,智能体需要与环境进行交互,以收集状态、动作、奖励和下一状态的数据。具体步骤如下:

  • 初始化环境:选择一个适合的环境(如OpenAI Gym中的环境),并重置环境以获得初始状态 s 0 s_0 s0

  • 收集数据:在每个时间步 t t t,智能体根据当前策略 π θ \pi_\theta πθ选择动作 a t a_t at,并与环境交互,获得即时奖励 r t r_t rt和下一个状态 s t + 1 s_{t+1} st+1。这个过程可以用以下伪代码表示:

    for episode in range(num_episodes):state = env.reset()for t in range(max_timesteps):action = policy(state)  # 根据当前策略选择动作next_state, reward, done, _ = env.step(action)  # 与环境交互store_transition(state, action, reward, next_state)  # 存储经验state = next_stateif done:break
    

2. 计算优势函数

在收集到足够的经验后,下一步是计算每个时间步的优势函数 A ^ t \hat{A}_t A^t。通常使用广义优势估计(GAE)来计算优势函数,步骤如下:

  • 计算时间差分误差:首先计算每个时间步的时间差分(TD)误差 δ t \delta_t δt

    δ t = r t + γ V θ o l d ( s t + 1 ) − V θ o l d ( s t ) \delta_t = r_t + \gamma V_{\theta_{old}}(s_{t+1}) - V_{\theta_{old}}(s_t) δt=rt+γVθold(st+1)Vθold(st)

  • 计算优势函数:使用GAE公式计算优势函数:

    A ^ t = δ t + ( γ λ ) δ t + 1 + ( γ λ ) 2 δ t + 2 + … \hat{A}_t = \delta_t + (\gamma \lambda) \delta_{t+1} + (\gamma \lambda)^2 \delta_{t+2} + \ldots A^t=δt+(γλ)δt+1+(γλ)2δt+2+

    这里, γ \gamma γ是折扣因子, λ \lambda λ是GAE的超参数,用于控制估计的平滑程度。

3. 更新策略

在计算完优势函数后,接下来是更新策略。PPO的策略更新过程如下:

  • 计算目标函数:根据收集到的经验和计算出的优势函数,计算PPO的目标函数 L C L I P ( θ ) L^{CLIP}(\theta) LCLIP(θ)

    L C L I P ( θ ) = E t [ min ⁡ ( r t ( θ ) A ^ t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ t ) ] L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A}_t \right) \right] LCLIP(θ)=Et[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]

  • 梯度上升:使用小批量随机梯度上升(Stochastic Gradient Ascent)的方法来更新策略参数 θ \theta θ。具体步骤如下:

    1. 将收集到的经验分成多个小批量。
    2. 对于每个小批量,计算目标函数的梯度,并更新参数:

    θ ← θ + α ∇ θ L C L I P ( θ ) \theta \leftarrow \theta + \alpha \nabla_\theta L^{CLIP}(\theta) θθ+αθLCLIP(θ)

    其中, α \alpha α是学习率。

4. 更新价值函数

如果使用了价值函数来估计状态值,需同时更新价值函数的参数。通常使用均方误差损失函数进行优化,步骤如下:

  • 计算价值函数的损失

    L V F ( ϕ ) = 1 N ∑ t = 0 N ( V ϕ ( s t ) − V ^ t ) 2 L^{VF}(\phi) = \frac{1}{N} \sum_{t=0}^{N} \left( V_\phi(s_t) - \hat{V}_t \right)^2 LVF(ϕ)=N1t=0N(Vϕ(st)V^t)2

    其中, V ϕ ( s t ) V_\phi(s_t) Vϕ(st)是当前价值函数的估计, V ^ t \hat{V}_t V^t是通过优势函数和奖励计算的目标值。

  • 更新价值函数参数

    使用梯度下降法更新价值函数的参数 ϕ \phi ϕ

    ϕ ← ϕ − β ∇ ϕ L V F ( ϕ ) \phi \leftarrow \phi - \beta \nabla_\phi L^{VF}(\phi) ϕϕβϕLVF(ϕ)

    其中, β \beta β是价值函数的学习率。

5. 重复训练过程

完成一次策略和价值函数的更新后,重复以上步骤,直到达到预定的训练轮数或性能标准。具体流程如下:

  • 循环训练:在每个训练周期中,重复以下步骤:
    1. 与环境交互,收集新的经验。
    2. 计算优势函数。
    3. 更新策略和价值函数。

6. 超参数调整

  在整个训练过程中,适当调整超参数(如学习率、剪切范围 ϵ \epsilon ϵ、GAE参数 λ \lambda λ等)以优化训练效果。PPO的超参数设置相对简单,但仍需根据具体任务进行调优。

四、应用场景

  近端策略优化(Proximal Policy Optimization, PPO)因其高效性和稳定性,广泛应用于多个领域。以下将结合具体代码示例,详细阐述PPO在不同应用场景中的实现。

1. 游戏AI

  PPO在游戏AI中的应用非常广泛,尤其是在复杂的环境中,如Atari游戏。以下是一个使用PPO训练智能体玩Atari游戏的示例代码,基于OpenAI Gym库。

import gym
import numpy as np
import tensorflow as tf# 创建环境
env = gym.make('Pong-v0')# 定义策略网络
class PolicyNetwork(tf.keras.Model):def __init__(self):super(PolicyNetwork, self).__init__()self.dense1 = tf.keras.layers.Dense(128, activation='relu')self.dense2 = tf.keras.layers.Dense(env.action_space.n, activation='softmax')def call(self, x):x = self.dense1(x)return self.dense2(x)# 初始化策略网络
policy_net = PolicyNetwork()# PPO训练过程
def train_ppo(env, policy_net, num_episodes=1000, gamma=0.99, epsilon=0.2, learning_rate=0.001):optimizer = tf.keras.optimizers.Adam(learning_rate)for episode in range(num_episodes):state = env.reset()done = Falsestates, actions, rewards = [], [], []while not done:state = np.reshape(state, [1, -1])action_probs = policy_net(state)action = np.random.choice(env.action_space.n, p=action_probs.numpy()[0])next_state, reward, done, _ = env.step(action)states.append(state)actions.append(action)rewards.append(reward)state = next_state# 计算优势函数和目标函数# 这里省略了优势函数的计算和目标函数的实现# 需要根据收集的经验进行更新# 更新策略with tf.GradientTape() as tape:# 计算损失loss = compute_loss(states, actions, rewards, policy_net, epsilon)grads = tape.gradient(loss, policy_net.trainable_variables)optimizer.apply_gradients(zip(grads, policy_net.trainable_variables))# 训练模型
train_ppo(env, policy_net)

2. 机器人控制

  PPO在机器人控制领域的应用也非常成功,尤其是在复杂的运动任务中。以下是一个使用PPO训练机器人进行行走的示例代码,基于OpenAI Gym中的MuJoCo环境。

import gym
import numpy as np
import tensorflow as tf# 创建环境
env = gym.make('Humanoid-v2')# 定义策略网络
class PolicyNetwork(tf.keras.Model):def __init__(self):super(PolicyNetwork, self).__init__()self.dense1 = tf.keras.layers.Dense(256, activation='relu')self.dense2 = tf.keras.layers.Dense(env.action_space.shape[0], activation='tanh')def call(self, x):x = self.dense1(x)return self.dense2(x)# 初始化策略网络
policy_net = PolicyNetwork()# PPO训练过程
def train_ppo(env, policy_net, num_episodes=1000, gamma=0.99, epsilon=0.2, learning_rate=0.001):optimizer = tf.keras.optimizers.Adam(learning_rate)for episode in range(num_episodes):state = env.reset()done = Falsestates, actions, rewards = [], [], []while not done:state = np.reshape(state, [1, -1])action = policy_net(state)next_state, reward, done, _ = env.step(action.numpy()[0])states.append(state)actions.append(action)rewards.append(reward)state = next_state# 计算优势函数和目标函数# 这里省略了优势函数的计算和目标函数的实现# 需要根据收集的经验进行更新# 更新策略with tf.GradientTape() as tape:# 计算损失loss = compute_loss(states, actions, rewards, policy_net, epsilon)grads = tape.gradient(loss, policy_net.trainable_variables)optimizer.apply_gradients(zip(grads, policy_net.trainable_variables))# 训练模型
train_ppo(env, policy_net)

3. 自动驾驶

  在自动驾驶领域,PPO可以用于决策和控制,帮助车辆在动态环境中做出实时反应。以下是一个简化的示例,展示如何使用PPO进行自动驾驶决策。

import numpy as np
import tensorflow as tf# 假设我们有一个自动驾驶环境
class DrivingEnv:def reset(self):# 重置环境passdef step(self, action):# 根据动作返回下一个状态、奖励和是否完成pass# 定义策略网络
class PolicyNetwork(tf.keras.Model):def __init__(self):super(PolicyNetwork, self).__init__()self.dense1 = tf.keras.layers.Dense(128, activation='relu')self.dense2 = tf.keras.layers.Dense(3, activation='softmax')  # 假设有3个动作def call(self, x):x = self.dense1(x)return self.dense2(x)# PPO训练过程
def train_ppo(env, policy_net, num_episodes=1000, gamma=0.99, epsilon=0.2, learning_rate=0.001):optimizer = tf.keras.optimizers.Adam(learning_rate)for episode in range(num_episodes):state = env.reset()done = Falsestates, actions, rewards = [], [], []while not done:state = np.reshape(state, [1, -1])action_probs = policy_net(state)action = np.random.choice(3, p=action_probs.numpy()[0])next_state, reward, done = env.step(action)states.append(state)actions.append(action)rewards.append(reward)state = next_state# 计算优势函数和目标函数# 这里省略了优势函数的计算和目标函数的实现# 需要根据收集的经验进行更新# 更新策略with tf.GradientTape() as tape:# 计算损失loss = compute_loss(states, actions, rewards, policy_net, epsilon)grads = tape.gradient(loss, policy_net.trainable_variables)optimizer.apply_gradients(zip(grads, policy_net.trainable_variables))# 创建环境和训练模型
env = DrivingEnv()
policy_net = PolicyNetwork()
train_ppo(env, policy_net)

4. 推荐系统

  在个性化推荐中,PPO可以用于优化用户的点击率和转化率。通过不断学习用户的偏好,PPO能够调整推荐策略。以下是一个简化的示例,展示如何使用PPO进行推荐系统的策略优化。

import numpy as np
import tensorflow as tf# 假设我们有一个推荐环境
class RecommendationEnv:def reset(self):# 重置环境passdef step(self, action):# 根据动作返回下一个状态、奖励和是否完成pass# 定义策略网络
class PolicyNetwork(tf.keras.Model):def __init__(self):super(PolicyNetwork, self).__init__()self.dense1 = tf.keras.layers.Dense(128, activation='relu')self.dense2 = tf.keras.layers.Dense(10, activation='softmax')  # 假设有10个推荐选项def call(self, x):x = self.dense1(x)return self.dense2(x)# PPO训练过程
def train_ppo(env, policy_net, num_episodes=1000, gamma=0.99, epsilon=0.2, learning_rate=0.001):optimizer = tf.keras.optimizers.Adam(learning_rate)for episode in range(num_episodes):state = env.reset()done = Falsestates, actions, rewards = [], [], []while not done:state = np.reshape(state, [1, -1])action_probs = policy_net(state)action = np.random.choice(10, p=action_probs.numpy()[0])next_state, reward, done = env.step(action)states.append(state)actions.append(action)rewards.append(reward)state = next_state# 计算优势函数和目标函数# 这里省略了优势函数的计算和目标函数的实现# 需要根据收集的经验进行更新# 更新策略with tf.GradientTape() as tape:# 计算损失loss = compute_loss(states, actions, rewards, policy_net, epsilon)grads = tape.gradient(loss, policy_net.trainable_variables)optimizer.apply_gradients(zip(grads, policy_net.trainable_variables))# 创建环境和训练模型
env = RecommendationEnv()
policy_net = PolicyNetwork()
train_ppo(env, policy_net)

总结

  近端策略优化(PPO)作为一种先进的强化学习算法,以其高效性和稳定性在多个领域得到了广泛应用。从游戏AI到机器人控制,再到自动驾驶和推荐系统,PPO展现了其强大的灵活性和适应性。通过引入剪切机制和优势函数的计算,PPO有效地解决了传统策略梯度方法中的不稳定性问题,使得策略更新过程更加稳健。

  在实现过程中,PPO的步骤清晰且易于理解,从环境交互到策略和价值函数的更新,每个环节都至关重要。结合具体的代码示例,本文展示了PPO在实际应用中的有效性和可操作性。随着强化学习研究的不断深入,PPO无疑将继续在更多复杂任务中发挥重要作用,推动智能体在动态环境中的决策能力不断提升。未来,PPO的进一步优化和应用将为人工智能的发展带来更多可能性。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

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

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

相关文章

Windows 系统如何高效搭建 Linux 开发环境,一步步解锁内核源码

每日禅语 人闲桂花落,夜静春山空。月出惊山鸟,时鸣春涧中。人人皆以为王维只是在写自然界景物的美丽,其实这首诗不只体现了自然界的美丽,更是诗人内心的写照,体现了诗人心中禅心与禅境的完美结合。这首诗的境界之所以如…

C++循环斐波那契数列

1.斐波那契数列,又称黄金分割数列、因数学家莱昂纳多斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。如果每对兔子(一雄一雌)每月能生殖一对小兔子(一雄一雌&…

2024年A特种设备相关管理证考试题库及A特种设备相关管理试题解析

为了确保特种设备的安全运行,提高特种设备管理人员的专业素质,2024年A特种设备相关管理证考试题库已经更新,并配备了详细的试题解析。以下是从题库中精选的10道试题,每道试题都附有答案和解析,帮助考生更好地理解考试内…

“视觉革命:走进可视化AI识别系统的智能世界

嘿,各位朋友!今天咱们来聊聊一个特别酷炫的技术——可视化AI识别系统。想象一下,如果你的手机能够像你一样“看”懂周围的世界,并且还能告诉你它看到了什么,是不是很神奇?没错,这就是可视化AI识…

Kubernetes 生态揭秘:深度剖析服务与流量管理、Pod 创建,以及外部请求的响应之旅

kubernetes,简称为k8s(k12345678s)。用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群&#xf…

职场上,如何做好自我保护?

今天我们讨论一个话题:在职场上,如何保护好自己?废话不多说,我们直接上干货。 (一) 1.时刻准备一点零食或代餐,如果遇到长时间的会议,就补充点能量。代餐最好选流体,这…

【Lua热更新】下篇 -- 更新中

上篇链接:【Lua热更新】上篇 文章目录 三、xLua热更新📖1.概述📚︎2.导入xLua框架🔖3. C#调用Lua3.1Lua解析器3.2Lua文件夹的重定向3.3Lua解析器管理器3.4全局变量获取3.5全局函数获取3.6映射到List和Dictionary3.7映射到类3.8映…

Gin-vue-admin(1):环境配置和安装

目录 环境配置如果443网络连接问题,需要添加代理服务器 后端运行前端运行 环境配置 git clone https://gitcode.com/gh_mirrors/gi/gin-vue-admin.git到server文件目录下 go mod tidygo mod tidy 是 Go 语言模块系统中的一个命令,用于维护 go.mod 文件…

C# 中的闭包

文章目录 前言一、闭包的基本概念二、匿名函数中的闭包1、定义和使用匿名函数2、匿名函数捕获外部变量3、闭包的生命周期 三、Lambda 表达式中的闭包1、定义和使用 Lambda 表达式2、Lambda 表达式捕获外部变量3、闭包的作用域 四、闭包的应用场景1、事件处理2、异步编程3、迭代…

视阅口译与其他口译的不同点

与其他口译不同 译员在进行视阅口译时可以看到书面材料,这与交替口译和同声口译有所不同。译员能够提前浏览文本内容,对主题、结构和专业词汇等有初步的了解。 压力相对较小 视阅口译相较于同声传译而言,时间压力没有那么紧迫。译员有一定…

功能篇:JAVA8实现数据去重

在Java 8中,有多种方法可以实现集合的去重。下面我将介绍几种常见的方法: ### 使用Set接口 最简单的方法是使用Set接口,因为根据定义,Set不允许重复元素。如果你有一个List并且想要去除其中的重复项,你可以将其转换为…

初学stm32 --- NVIC中断

目录 STM32 NVIC 中断优先级管理 NVIC_Type: ISER[8]: ICER[8]: ISPR[8]: ICPR[8]: IABR[8]: IP[240]: STM32 的中断分组: 中断优先级分组函数 NVIC_PriorityGroupConfig 中断初始化函…

网卡 TSO(提示发送端性能), LRO, GRO (提升接收端性能)功能

功能核心要点工作原理相关层级TSO (TCP Segmentation Offload)通过硬件完成TCP分段,减少CPU负担将大块数据分段为多个较小的TCP包,在网卡处进行分段处理网卡驱动,内核态LRO (Large Receive Offload)在网卡处合并多个TCP包,减少中断…

Dot Foods EDI 需求分析及对接流程

Dot Foods 是一家美国领先的食品和非食品产品的中间批发分销商,主要为食品服务、零售和分销行业的客户提供服务,是北美大型食品中间分销商之一。Dot Foods (以下简称 Dot)的业务模式是通过整合多个供应商的产品,为客户…

ic电路与mos管

最近调试步进电机发现不同的需求的情况下,使用是电路设计会不同,所以做个小结, 感叹现在的ai汇总真的厉害,目前daisy也经常使用,从之前的文言一心到现在的通义灵马和腾讯云ai,随着用户的增多可以明显感觉到…

MyBatis-Plus(一)

一、 MyBatis-Plus简介 1、简介 MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生。Mybatis-Plus提供了通用的Mapper和Service,可以在不编写任何SQ…

跟着AI 学AI开发二,本地部署自己的Chat GPT

这里要安装的是Open Web UI ,用一张架构图说明AI 前端与后端的关系。 之前的Python 的方法已经做过多次介绍,这里不做赘述。 顺序:1,Ollama。 2,Docker。 3,Open WebUI。 Ollama 安装下载地址&#xff1…

204页PPT金税四期监管要求与最新政策及风险防范-培训课件

这份资料是关于金税四期监管要求、最新政策及风险防范的培训课件,包含204页PPT内容。核心内容涉及金税四期的发展历程、与金税三期的主要变化、指挥决策系统、税务风险预警指标、重点监控行为、税务稽查重点领域、避税方法及处罚、以及企业自查和税务风险管控原理。…

超声波流量计的原理及应用简介

一 概念 超声波流量计是利用超声波测量管道或导管中流体流速的装置。 它们由放置在管道或管道相对两侧的两个超声波换能器组成,它们发射和接收超声波。 二 技术路径 1.时差 (TT) 超声波技术 最常见的技术是传输时间测量。超声波穿过流体返回到相反的传感器&#…

线性规划中的几种逻辑表达式

线性规划中的几种逻辑表达式 注意: 摘录字刘博士的《数学建模与数学规划》, 以便用时可查。 实际上Gurobi API 中自身放啊变的逻辑表达式函数,下面列出自定义的实现方式。 1 逻辑与 如果 x 1 1 x_1 1 x1​1, x 2 1 x_2 1 x2​1, 那…