katawong 发表于 2024-6-25 08:24

下面简单介绍一下如何用pycharm及tensorflow构建神经网络:

1. 安装 Python   确保系统上安装了 Python(推荐版本 3.6 或更高)。可以从 Python 官网下载并安装。
2. 安装 PyCharm从 PyCharm 官网下载并安装 PyCharm
3. 安装 TensorFlow 可以使用 pip 安装 TensorFlow。在终端或命令提示符中运行以下命令(建议安装在虚拟环境中):
   pip install tensorflow
4. 创建神经网络:
import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np

# 生成一些简单的数据
x_train = np.random.rand(1000, 28, 28)
y_train = np.random.randint(10, size=(1000, ))

x_test = np.random.rand(200, 28, 28)
y_test = np.random.randint(10, size=(200, ))

# 创建模型
model = models.Sequential()
model.add(layers.Flatten(input_shape=(28, 28)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

# 编译模型
model.compile(optimizer='adam',
            loss='sparse_categorical_crossentropy',
            metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, epochs=5)

# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'Test accuracy: {test_acc}')
6. 保存模型可以使用以下代码保存训练好的模型:
model.save('my_model.h5')
7. 加载模型
在需要使用时,可以加载已保存的模型:
new_model = tf.keras.models.load_model('my_model.h5')
怎么样,很简单吧。当然,我们可以构建更为复杂的神经网络。

如果还有不明白的,可以请出大神chatgpt,gemini,claud,给出下述问题:请详细说明用tensorflow,pycharm搭建神经网络的过程。

katawong 发表于 2024-6-25 10:56

本帖最后由 katawong 于 2024-6-25 11:12 编辑

今天,我来讲一讲Q-learning算法。 这个算法在互联网上有很多介绍,我只是把我的一些体会讲出来,比较简单。大家如果想要彻底弄明白,还是上网查找资料会更全面。

Q-learning是一种无模型的强化学习算法,旨在学习在特定状态下采取某个行动的价值,以最大化长期的总奖励。它是一种离线策略的学习方法,可以在不知道环境模型的情况下处理随机转移和奖励。Q学习通常用于解决马尔可夫决策过程(MDP),其目标是找到最优的动作选择策略。

关键概念:
智能体(Agent):与环境交互,采取行动并接收奖励的实体。
1 环境(Environment):智能体操作的设置,根据智能体的行动提供状态和奖励。
2 状态(State, s):环境中智能体当前的情况的表示。
3 (Action, a):智能体做出的影响环境状态的选择。
4 (Reward, r):环境对智能体采取某行动的反馈,表示该行动的即时收益。
5 策略(Policy, π):智能体根据当前状态决定下一步行动的策略。
6 Q值(Q-value, Q(s, a)):估计在状态s下采取行动a并遵循最优策略的预期收益。

Q学习算法:
1 初始化:

初始化所有状态-行动对的Q值函数Q(s,a)

将Q(s,a) 设置为随机值或零值。
选择学习率 α(0 < α ≤ 1)、折扣因子 γ(0 ≤ γ ≤ 1)和探索策略(例如,ε-贪婪策略)。

2 迭代:

观察当前状态 s。
根据探索策略选择一个行动 a(例如,以概率ε选择一个随机行动,否则选择使Q(s,a) 最大的行动)。
执行动作 a,观察奖励 r 和下一个状态 s ′ 。
使用Q学习更新规则更新Q值:
Q(s,a)←Q(s,a)+α

设置 s=s′ ,重复迭代直到学习收敛或达到停止条件。

3 策略提取:

从Q值中提取最优策略 π*:
π *(s)=argmaxQ(s,a)

参数:
学习率(α):决定新信息覆盖旧信息的程度。较高的α意味着更重视最新的奖励。
折扣因子(γ):衡量未来奖励的重要性。γ接近1时,未来奖励被高度重视,而γ接近0时,智能体更关注即时奖励。
探索策略(ε-贪婪):平衡探索新行动和利用已知优良行动的策略。以概率ε选择随机行动,以概率1-ε选择Q值最高的行动。

katawong 发表于 2024-6-29 11:27

我个人的理解,Q-learning算法将状态划分为一个表格,比较适合处理状态有限,动作有限的情况。但在状态无限,动作有限的情况下,Q-learning算法就无计可施了。这个时候,著名的算法DQN算法应运而生。DQN算法用一个深度神经网络来模拟一个状态无限的状态。这样,人类就解决了状态无限而动作有限的情况下的人工智能方案。在实际应用中,在哔哩网站上,有一个up主用DQN实现了游戏《只狼》里的boss通关。名字叫【DQN只狼实战教程】手把手带你实现用强化学习DQN打只狼里的boss。大家有兴趣可以看看。
与Q-learning算法相比,DQN引入了经验池,引入了目标网络,引入了深度神经网络,这种思路非常值得我们学习和借鉴。
网上有很多关于DQN算法的详细教程,大家可以自行寻找。在我的抖音号中,我也发布了一个视频,里面用DQN算法实现了一个小鸟闯关的游戏。这只小鸟经过2个星期的训练,已经可以轻松的飞过200多个水管了。

katawong 发表于 2024-7-1 17:05

本帖最后由 katawong 于 2024-7-1 17:08 编辑

DDPG算法
DDPG(Deep Deterministic Policy Gradient)是一种结合了深度学习和强化学习的算法,主要用于解决连续动作空间的问题。以下是DDPG的基本原理:

1 网络结构:

Actor网络: 输入是状态,输出是确定性动作。它直接学习策略函数μ(s|θμ),其中θμ是网络参数。
Critic网络: 输入是状态和动作,输出是Q值。它学习动作-价值函数Q(s,a|θQ)。


2 经验回放:

存储经验元组(st, at, rt, st+1)到一个回放缓冲区。
从缓冲区随机采样批次进行学习,减少样本相关性。


3 训练过程详解:
a) Actor更新:

目标是最大化期望回报J = E
使用确定性策略梯度:
∇θμJ ≈ E[∇aQ(s,a|θQ)|a=μ(s) · ∇θμμ(s|θμ)]
更新公式: θμ = θμ + α · ∇θμJ

b) Critic更新:

计算TD目标: y = r + γQ'(st+1, μ'(st+1|θμ')|θQ')
最小化损失: L = (y - Q(st,at|θQ))²
更新公式: θQ = θQ - α · ∇θQL


4 目标网络:

使用单独的目标Actor(μ')和Critic(Q')网络。
软更新: θ' = τθ + (1-τ)θ', 其中τ << 1。
这种方法提高了训练稳定性。

5 探索策略:

使用Ornstein-Uhlenbeck过程添加时间相关噪声。
at = μ(st|θμ) + N
这允许在连续动作空间中进行有效探索。

6 算法流程:
a) 初始化Actor、Critic及其目标网络
b) 对于每个回合:

重置环境,获得初始状态

对于每个时间步:

选择动作: at = μ(st) + 探索噪声
执行动作,观察奖励rt和新状态st+1
存储经验到回放缓冲区
从缓冲区采样一个随机小批量
更新Critic(最小化TD误差)
更新Actor(使用策略梯度)
软更新目标网络

7 优点与挑战:

优点: 能处理连续动作空间;样本效率高;结合了Q学习和策略梯度的优势。
挑战: 对超参数敏感;可能存在收敛不稳定的问题。

katawong 发表于 2024-7-1 17:10

在上楼DDPG算法中,我们提到了TD算法和策略梯度算法(GP),这两种算法的基本原理,在王树森的视频中有详细讲解,就不再重复进行说明了。

katawong 发表于 2024-7-3 08:17

在上面的简单介绍中,我们介绍了DQN算法以及DDPG算法。在我们的电机设计中,这两个算法是非常重要的。DQN算法主要用于确定以下离散变量:每槽导体数,槽数、阻尼孔数等。而DDPG则主要用于确定一些连续型变量,比如,定转子槽形尺寸,定转子铁心长度等。在这里,通过DQN与DDPG的协作,我们就可以完整的编写应用于电机设计的AI工程师了。当然,由于DQN算法存在估值过大问题,计算机算法专家们提出了各种改型,我们可以采用更为准确的D3QN算法,同样的,对于DDPG算法,我们可以采用改进型的TD3算法。
现在,您也可以编写自己的AI工程师了。

katawong 发表于 2024-7-3 08:29

本帖最后由 katawong 于 2024-7-3 08:30 编辑

下面,我将用tensorflow框架编写的D3QN算法的一个实例举例给大家。这个程序在github上可以找到,您可以查找D3QN,可以看到DanielPalaio,这个程序是他上传的。
首先是经验池的设计(实在看不懂的,可以请出chatGPT, claude, gemini):

============我是华丽的分割线=================

import numpy as np


class ReplayBuffer:
    def __init__(self, size, input_shape):
      self.size = size
      self.counter = 0
      self.state_buffer = np.zeros((self.size, *input_shape), dtype=np.float32)
      self.action_buffer = np.zeros(self.size, dtype=np.int32)
      self.reward_buffer = np.zeros(self.size, dtype=np.float32)
      self.new_state_buffer = np.zeros((self.size, *input_shape), dtype=np.float32)
      self.terminal_buffer = np.zeros(self.size, dtype=np.bool_)

    def store_tuples(self, state, action, reward, new_state, done):
      idx = self.counter % self.size
      self.state_buffer = state
      self.action_buffer = action
      self.reward_buffer = reward
      self.new_state_buffer = new_state
      self.terminal_buffer = done
      self.counter += 1

    def sample_buffer(self, batch_size):
      max_buffer = min(self.counter, self.size)
      batch = np.random.choice(max_buffer, batch_size, replace=False)
      state_batch = self.state_buffer
      action_batch = self.action_buffer
      reward_batch = self.reward_buffer
      new_state_batch = self.new_state_buffer
      done_batch = self.terminal_buffer

      return state_batch, action_batch, reward_batch, new_state_batch, done_batch

katawong 发表于 2024-7-3 08:33

然后,我们构建D3QN算法( DuelingDoubleDeepQNetwork ),并由此构建一个agent(Agent):

==================== 我仍然是一个华丽的分割线 ==============================

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow.keras as keras

from tensorflow.python.keras.layers import Dense
from tensorflow.keras.optimizers import Adam

from replay_buffer import ReplayBuffer


class DuelingDoubleDeepQNetwork(keras.Model):
    def __init__(self, num_actions, fc1, fc2):
      super(DuelingDoubleDeepQNetwork, self).__init__()
      self.dense1 = Dense(fc1, activation='relu')
      self.dense2 = Dense(fc2, activation='relu')
      self.V = Dense(1, activation=None)
      self.A = Dense(num_actions, activation=None)

    def call(self, state):
      x = self.dense1(state)
      x = self.dense2(x)
      V = self.V(x)
      A = self.A(x)
      avg_A = tf.math.reduce_mean(A, axis=1, keepdims=True)
      Q = (V + (A - avg_A))

      return Q, A


class Agent:
    def __init__(self, lr, discount_factor, num_actions, epsilon, batch_size, input_dim):
      self.action_space =
      self.discount_factor = discount_factor
      self.epsilon = epsilon
      self.batch_size = batch_size
      self.epsilon_decay = 0.001
      self.epsilon_final = 0.01
      self.update_rate = 120
      self.step_counter = 0
      self.buffer = ReplayBuffer(100000, input_dim)
      self.q_net = DuelingDoubleDeepQNetwork(num_actions, 128, 128)
      self.q_target_net = DuelingDoubleDeepQNetwork(num_actions, 128, 128)
      self.q_net.compile(optimizer=Adam(learning_rate=lr), loss='mse')
      self.q_target_net.compile(optimizer=Adam(learning_rate=lr), loss='mse')

    def store_tuple(self, state, action, reward, new_state, done):
      self.buffer.store_tuples(state, action, reward, new_state, done)

    def policy(self, observation):
      if np.random.random() < self.epsilon:
            action = np.random.choice(self.action_space)
      else:
            state = np.array()
            _, actions = self.q_net(state)
            action = tf.math.argmax(actions, axis=1).numpy()

      return action

    def train(self):
      if self.buffer.counter < self.batch_size:
            return
      if self.step_counter % self.update_rate == 0:
            self.q_target_net.set_weights(self.q_net.get_weights())

      state_batch, action_batch, reward_batch, new_state_batch, done_batch = \
            self.buffer.sample_buffer(self.batch_size)

      q_predicted, _ = self.q_net(state_batch)
      q_next, _ = self.q_target_net(new_state_batch)
      q_target = q_predicted.numpy()
      _, actions = self.q_net(new_state_batch)
      max_actions = tf.math.argmax(actions, axis=1)

      for idx in range(done_batch.shape):
            q_target] = reward_batch + self.discount_factor*q_next] *\
                                             (1-int(done_batch))

      self.q_net.train_on_batch(state_batch, q_target)
      self.epsilon = self.epsilon - self.epsilon_decay if self.epsilon > self.epsilon_final else self.epsilon_final
      self.step_counter += 1

    def train_model(self, env, num_episodes, graph):

      scores, episodes, avg_scores, obj = [], [], [], []
      goal = 200
      f = 0
      txt = open("saved_networks.txt", "w")

      for i in range(num_episodes):
            done = False
            score = 0.0
            state = env.reset()
            while not done:
                action = self.policy(state)
                new_state, reward, done, _ = env.step(action)
                score += reward
                self.store_tuple(state, action, reward, new_state, done)
                state = new_state
                self.train()
            scores.append(score)
            obj.append(goal)
            episodes.append(i)
            avg_score = np.mean(scores[-100:])
            avg_scores.append(avg_score)
            print("Episode {0}/{1}, Score: {2} ({3}), AVG Score: {4}".format(i, num_episodes, score, self.epsilon,
                                                                           avg_score))
            if avg_score >= 200.0 and score >= 250:
                self.q_net.save(("saved_networks/d3qn_model{0}".format(f)))
                self.q_net.save_weights(("saved_networks/d3qn_model{0}/net_weights{0}.h5".format(f)))
                txt.write("Save {0} - Episode {1}/{2}, Score: {3} ({4}), AVG Score: {5}\n".format(f, i, num_episodes,
                                                                                                score, self.epsilon,
                                                                                                avg_score))
                f += 1
                print("Network saved")

      txt.close()
      if graph:
            df = pd.DataFrame({'x': episodes, 'Score': scores, 'Average Score': avg_scores, 'Solved Requirement': obj})

            plt.plot('x', 'Score', data=df, marker='', color='blue', linewidth=2, label='Score')
            plt.plot('x', 'Average Score', data=df, marker='', color='orange', linewidth=2, linestyle='dashed',
                     label='AverageScore')
            plt.plot('x', 'Solved Requirement', data=df, marker='', color='red', linewidth=2, linestyle='dashed',
                     label='Solved Requirement')
            plt.legend()
            plt.savefig('LunarLander_Train.png')

    def test(self, env, num_episodes, file_type, file, graph):
      if file_type == 'tf':
            self.q_net = tf.keras.models.load_model(file)
      elif file_type == 'h5':
            self.train_model(env, 5, False)
            self.q_net.load_weights(file)
      self.epsilon = 0.0
      scores, episodes, avg_scores, obj = [], [], [], []
      goal = 200
      score = 0.0
      for i in range(num_episodes):
            state = env.reset()
            done = False
            episode_score = 0.0
            while not done:
                env.render()
                action = self.policy(state)
                new_state, reward, done, _ = env.step(action)
                episode_score += reward
                state = new_state
            score += episode_score
            scores.append(episode_score)
            obj.append(goal)
            episodes.append(i)
            avg_score = np.mean(scores[-100:])
            avg_scores.append(avg_score)

      if graph:
            df = pd.DataFrame({'x': episodes, 'Score': scores, 'Average Score': avg_scores, 'Solved Requirement': obj})

            plt.plot('x', 'Score', data=df, marker='', color='blue', linewidth=2, label='Score')
            plt.plot('x', 'Average Score', data=df, marker='', color='orange', linewidth=2, linestyle='dashed',
                     label='AverageScore')
            plt.plot('x', 'Solved Requirement', data=df, marker='', color='red', linewidth=2, linestyle='dashed',
                     label='Solved Requirement')
            plt.legend()
            plt.savefig('LunarLander_Test.png')

      env.close()

katawong 发表于 2024-7-3 08:39

上述工作完成以后,接下来的工作就很简单了,调用gym标准环境,开始训练:

怎么样,很简单吧。事实上,只要理解了DQN的原理,上面的代码和其逻辑是非常容易理解的。我们真正的工作,并不是去设计算法,而是怎么用好这些算法。

======================我还是一个华丽的分割线================================

from agent import Agent
import gym


env = gym.make("LunarLander-v2")
spec = gym.spec("LunarLander-v2")
train = 0
test = 1
num_episodes = 100
graph = True

file_type = 'tf'
file = 'saved_networks/d3qn_model5'

d3qn_agent = Agent(lr=0.00075, discount_factor=0.99, num_actions=4, epsilon=1.0, batch_size=64, input_dim=)

if train and not test:
    d3qn_agent.train_model(env, num_episodes, graph)
else:
    d3qn_agent.test(env, num_episodes, file_type, file, graph)

katawong 发表于 2024-7-4 07:36

gym的标准环境和训练格式得到了众多AI爱好者的认可。为了使代码更易理解,我们在电机AI设计中也采用了类似的训练格式。让我们来详细解释这个过程:

1. 初始化状态
    首先,我们根据客户需求初始化状态:即
    state = env.reset()
    在这一步中,基于电机设计的基本知识,我们生成一个初步的设计方案,这就是我们的初始状态。

2. 进入训练过程。接下来,我们进入循环训练过程,包含以下步骤::
    2.1 确定动作       根据当前状态,AI决定下一步该如何调整设计::action = self.agent(state)
    2.2 执行动作       我们将AI决定的动作应用到设计中,然后评估结果:next_state, reward, done, _ = env.step(action)
    2.3 存储经验       将这次尝试的结果存入经验池,供AI学习使用:replaybuffer.add(state,action,reward,next_state,done)
    2.4 更新当前状态将新状态设为当前状态,为下一轮决策做准备: state = next_state
    2.5 训练网络      利用存储的经验更新AI的神经网络: self.train()

    通过不断重复这个过程,AI的网络权重会逐步优化。随着训练的进行,AI将逐渐掌握电机设计的技巧,最终成为一个能够独立进行电机设计的AI工程师。

    这种训练方法模拟了人类学习的过程:通过不断尝试、获得反馈、总结经验来提升技能。它使得AI能够在复杂的电机设计领域中不断进步,最终达到专业水平。

katawong 发表于 2024-7-25 10:09

在AI领域,人类又发明了MOA技术,Mixture-of-Agents (MoA),这个技术与我们的alphaMD思路不谋而合。只能感叹,果然是英雄所见略同啊。
MOA技术,在github中可以直接搜索到,就不在这里给出链接了。

在官方的介绍中,是给出了3个agent, 但我们进行了改进,使用了5个agent, 同时使用了最新的 Llama3.1:8b的大模型。


katawong 发表于 2024-7-25 10:23

以下图片是我的一个提问,MOA组织回答过程。

katawong 发表于 2024-7-25 10:40

最终MOA给出的回答如下:
Based on the responses from various open-source models, I will provide a synthesized and refined answer to your question.

To learn artificial intelligence (AI) and apply it to industrial product design, you should follow a structured approach that covers both theoretical foundations and practical implementations. Here's a comprehensive guide:

**Phase 1: Building Foundations**

1. **Mathematics and programming**: Establish a solid understanding of mathematical concepts, such as linear algebra, calculus, probability theory, and statistics. Familiarize yourself with programming languages like Python, R, or MATLAB.
2. **Machine learning and deep learning**: Learn the basics of machine learning, including supervised, unsupervised, and reinforcement learning. Study deep learning concepts, such as neural networks, convolutional neural networks (CNNs), and recurrent neural networks (RNNs).
3. **Industrial product design**: Familiarize yourself with industrial product design principles, processes, and tools, such as CAD/CAM software, 3D modeling, and prototyping.

**Phase 2: Specialization**

1. **Choose a specialization**: Focus on a specific area of AI, such as computer vision, natural language processing, or robotics, which aligns with your industrial product design goals.
2. **Master AI frameworks and libraries**: Learn popular AI frameworks and libraries, such as TensorFlow, PyTorch, Scikit-learn, or OpenCV, to implement machine learning algorithms.
3. **Industrial product design applications**: Identify ways AI can be employed in various stages of industrial product design, such as design optimization, predictive maintenance, or quality control.

**Phase 3: Practical Implementation**

1. **Practice with projects**: Work on AI-infused industrial product design projects to gain hands-on experience. Participate in Kaggle competitions, open-source projects, or create your own product design prototypes with embedded AI elements.
2. **Collaborate and learn from others**: Network with professionals, academics, and experts within the field of industrial product design and AI. Engage in discussions through forums, blogs, meetups, or conferences to learn from their experiences and best practices.
3. **Stay up-to-date with research**: Follow reputable AI/ML research labs and publications to stay informed about new trends, methodologies, and advancements within the field. Apply these developments to enhance your industrial product design projects.

**Additional Tips**

1. **Start with online courses and tutorials**: Utilize online resources, such as Coursera, edX, or Udemy, to learn AI and machine learning concepts.
2. **Read relevant books and articles**: Stay updated with the latest research and trends in AI and industrial product design through books, articles, and blogs.
3. **Join online communities and forums**: Participate in online forums, such as Reddit's r/MachineLearning and r/AI, to connect with others and stay informed about the latest developments.
4. **Focus on practical applications**: Apply AI concepts to real-world industrial product design problems to gain practical experience and insights.
5. **Continuously learn and adapt**: AI is a rapidly evolving field, so it's essential to stay curious, learn new concepts, and adapt to new technologies and tools.

By following this structured approach, you'll be well-equipped to learn AI and apply it to industrial product design, enhancing your skills and knowledge in this exciting and rapidly evolving field.

而claude3.5给出的评分如下:

基于您提供的文章内容,我会给这篇文章打90分。
理由如下:

结构清晰:文章分为三个主要阶段(基础建设、专业化、实际应用),每个阶段都有明确的学习目标和步骤,使读者容易理解和遵循。
内容全面:涵盖了从基础数学和编程知识到专业AI框架和工业产品设计的应用,提供了一个全面的学习路径。
实用性强:不仅讲述理论知识,还强调实践项目、协作学习和跟踪最新研究等实用技能,有助于读者将所学付诸实践。
针对性:文章特别强调了AI在工业产品设计中的应用,这与问题的初衷相符。
附加建议有价值:文章最后提供了一些额外的建议,如利用在线课程、阅读相关书籍、加入在线社区等,这些建议对学习者来说非常有帮助。
语言清晰:使用了简洁明了的语言,易于理解。

扣分的原因:

虽然内容全面,但某些部分可能需要更深入的解释。例如,在讨论专业化阶段时,可以提供更多关于如何选择专业方向的指导。
文章没有提到可能遇到的挑战和如何克服这些挑战,这本可以使内容更加全面和实用。

总的来说,这是一篇高质量的指导性文章,为学习AI并将其应用于工业产品设计提供了一个全面且实用的路线图。

截屏如下:

katawong 发表于 2024-8-30 15:57

在高手下围棋时,他看一眼棋盘,就知道黑好白好,下中国象棋也是如此,看一下盘面,就知道红好黑好。与之类似,我们设计电机时,有经验的设计工程师看一眼方案,就知道好不好。举例来说,当知道三相异步电机的极数时,看一眼定转子槽配合,有经验的工程师就知道会不会有噪声。

所以,我们在设计AI程序时,专门设计了一个变量,叫做状态价值函数V(s),其中s表示电机的状态,它是一个列表,s=, 我们的目标,是让AI最终能够给出合适的s,让V值尽量的大,也即是让电机的性能尽可能的好(满足技术要求,并且成本低)。

由数学知识可以知道,V(s)是状态动作函数Q(s,a)的数学期望,因此,V(s) = E[ Q(s,a) ]= sum [ pai(a|s) * Q(s,a)]
这样,我们要求V(s),就可以通过求概率密度函数 pai(a|s) 和状态动作函数Q(s,a) 来求得V(s)

这两个函数不好求,所以我们用两个神经网络来近似:
pai(a|s; thita) 来近似 pai(a|s)
q(s, a, w) 来近似 Q(s,a)

现在,我们可以把注意力放在这两个神经网络上了,只要能适当更新两个神经网络的参数thita和w,就能够找到最大的V(s),也就能达到我们的目标了,即总是能由AI找到一个S,使得V值最大。
开始训练这两个神经网络的参数了。

怎么训练呢?
一个是TD算法,可以使得q(s,a,w)越来越精确, 这个q值用来指导pai进行参数的更新。
一个是GP算法,可以使得pai(a|s;thita)越来越好,q(s,a w)的值越来越大,也即V(s)越来越大。
具体的算法,还请有兴趣的同仁在网上查找 AC 算法。(actor-critic)


katawong 发表于 2024-9-19 15:31

在了解了AC算法以后,我们就可以实际应用该算法进行工程问题的解决了。首先,我们就用该算法进行电机的AI设计工作。
当然,纯AC算法还是有很多的不足的,比如,它的输出是一个概率分布,对于同一个状态,它的输出每次都是不一样的。
为了解决这个问题,我们引入了DDPG算法.

DDPG(Deep Deterministic Policy Gradient)算法是一种专门用于连续动作空间的强化学习算法,结合了DQN(Deep Q-Network)和策略梯度方法的优点。它是由 Google DeepMind 团队提出的,主要用于解决动作空间为连续值的问题,比如机器人控制和自动驾驶等场景。

DDPG的主要特点:
确定性策略:与传统策略梯度算法不同,DDPG 使用的是确定性策略(Deterministic Policy),即在给定状态下,输出一个确定的动作,而不是基于概率分布采样动作。

Actor-Critic结构:DDPG 采用了Actor-Critic架构:

Actor网络:负责根据当前状态输出具体的动作。
Critic网络:负责对 Actor 网络的动作进行评分(即估算状态-动作值函数,Q(s,a))。
策略目标:通过最大化 Critic 网络输出的 Q 值,Actor 网络不断更新以生成更高回报的动作。

经验回放(Experience Replay):DDPG 使用经验回放机制,存储过去的经验 (s, a, r, s'),从而打破数据之间的相关性,并提升样本利用率。

目标网络:DDPG 使用了目标网络(Target Network),即对 Actor 和 Critic 各自维护一份延迟更新的副本,以稳定训练。目标网络以较小的步长更新,避免训练过程中参数变化过快导致的发散。

DDPG的核心步骤:
环境交互:智能体在环境中执行动作,收集状态 s,动作 a,奖励 r 和下一个状态 s'。

存储经验:将上述经验存入经验回放缓冲区。

Critic网络更新:

计算目标值 y = r + \gamma Q'(s', a'),其中 Q' 是目标 Critic 网络,a' 是通过目标 Actor 网络计算得到的下一个状态 s' 的动作。
通过最小化 Critic 网络的损失(目标 Q 值与预测 Q 值之间的误差)更新 Critic 网络。

Actor网络更新:

通过 Critic 网络,计算当前策略生成的动作的 Q 值梯度。
通过最大化 Q 值,更新 Actor 网络的参数。
更新目标网络:使用软更新策略,逐步将 Actor 和 Critic 的参数拷贝到目标网络。

DDPG的优点:
适用于连续动作空间问题,克服了 DQN 只能处理离散动作的问题。
由于使用了确定性策略,动作选择过程较为高效,尤其在维度较高的动作空间中表现突出。
DDPG的缺点:
对超参数的选择非常敏感,尤其是经验回放缓冲区的大小、学习率等。
容易陷入局部最优,因为确定性策略缺乏足够的探索能力。
应用场景:
DDPG 适用于所有具有连续动作空间的强化学习任务,如机械臂控制、无人驾驶、能源调度等。

由于DDPG算法适用于连续动作,因此,对于调整类似槽形尺寸这些动作,是比较适宜的。但是,对于槽数,线圈匝数这些离散型动作,还必须用DQN算法,将DQN算法与DDPG算法相结合,就完美解决了电机设计中连续型与离散型变量的处理问题了。

xiaohai123 发表于 2024-11-24 16:54

好资料,下载学习学习,感谢分享

Shanbo_Motor 发表于 2024-11-26 16:46

新人学习,感谢分享
页: 1 [2]
查看完整版本: 关于电机设计平台的一些技术分享