当前位置: 首页 > article >正文

浅谈——深度学习和马尔可夫决策过程

        深度学习是一种机器学习方法,它通过模拟大脑的神经网络来进行数据分析和预测。它由多层“神经元”组成,每一层从数据中提取出不同的特征。多层次的结构使得深度学习模型可以捕捉到数据中的复杂关系,特别适合处理图片、语音等复杂数据。

        马尔可夫决策过程(MDP)是一种数学框架,用于描述决策过程,特别是在环境中存在不确定性的情况下。在MDP中,一个智能体(比如机器人)在一个状态下执行某个动作,进而移动到另一个状态,并获得相应的奖励。它有一个很重要的特性,叫做“马尔可夫性”,意思是智能体当前的决定只取决于当前的状态,而与之前的状态无关。MDP常用于强化学习中,帮助智能体通过试错学习最优策略。


深度学习的原理

        深度学习的核心是神经网络。神经网络可以看成一组“神经元”组成的网络结构,每个神经元模拟人脑中的神经细胞。神经网络通过层层计算,将输入数据(如图像、文本)转化为可以预测输出的特征。

        每层神经网络通常包含多个神经元,这些神经元通过特定的权重和偏置来影响输入数据的特征提取过程。通过反向传播算法,网络的权重不断调整,以便在输出端实现最小的预测误差

        示例应用:图像分类,如用神经网络区分猫和狗的图片。下方是一个简单的示例代码,通过深度学习模型来分类手写数字:

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms

# 数据预处理
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
train_data = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)

# 定义神经网络模型
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(28*28, 128)  # 输入层到隐藏层
        self.fc2 = nn.Linear(128, 64)     # 隐藏层
        self.fc3 = nn.Linear(64, 10)      # 输出层
        
    def forward(self, x):
        x = x.view(-1, 28*28)
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 训练模型
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

for epoch in range(10):  # 训练10个周期
    for images, labels in train_loader:
        optimizer.zero_grad()
        output = model(images)
        loss = criterion(output, labels)
        loss.backward()
        optimizer.step()
print("训练完成")

马尔可夫决策过程(MDP)的原理

        马尔可夫决策过程是描述决策环境的一种框架,特别适合那些具有随机性和连续状态的环境。一个典型的MDP包括:

  • 状态(S):表示环境的当前情况。
  • 动作(A):智能体可以执行的动作。
  • 奖励(R):每次执行动作后得到的反馈。
  • 转移概率(P):从一个状态转移到另一个状态的概率。

        MDP的“马尔可夫性”意味着下一个状态只依赖于当前状态和动作,而与之前的状态无关。这个性质使得我们可以用动态规划或强化学习来求解最优策略。

        示例应用:简单的迷宫游戏。假设有一个机器人要在迷宫中找到出口,迷宫的每个位置都是一个状态,机器人可以选择上、下、左、右四个方向作为动作,每次移动获得相应的奖励值。

        以下代码是一个简单的基于MDP的迷宫寻路示例,用Q学习算法来实现。

import numpy as np

# 定义迷宫的奖励矩阵(5x5网格),终点为(4,4)位置
rewards = np.zeros((5, 5))
rewards[4, 4] = 10  # 给终点设置一个较高的奖励

# 初始化Q值表
Q = np.zeros((5, 5, 4))  # 4个动作:上、下、左、右

# Q学习参数
alpha = 0.1       # 学习率
gamma = 0.9       # 折扣因子
epsilon = 0.1     # 探索率

# 获取当前状态的可能动作
def get_possible_actions(state):
    actions = []
    row, col = state
    if row > 0: actions.append(0)  # 上
    if row < 4: actions.append(1)  # 下
    if col > 0: actions.append(2)  # 左
    if col < 4: actions.append(3)  # 右
    return actions

# 通过动作更新状态
def take_action(state, action):
    row, col = state
    if action == 0 and row > 0: row -= 1
    elif action == 1 and row < 4: row += 1
    elif action == 2 and col > 0: col -= 1
    elif action == 3 and col < 4: col += 1
    return (row, col)

# Q学习主循环
for episode in range(1000):
    state = (0, 0)
    while state != (4, 4):  # 当状态不是终点时
        if np.random.rand() < epsilon:  # 探索
            action = np.random.choice(get_possible_actions(state))
        else:  # 利用
            action = np.argmax(Q[state[0], state[1], :])
        
        # 更新Q值
        new_state = take_action(state, action)
        reward = rewards[new_state]
        best_next_action = np.argmax(Q[new_state[0], new_state[1], :])
        Q[state[0], state[1], action] += alpha * (reward + gamma * Q[new_state[0], new_state[1], best_next_action] - Q[state[0], state[1], action])
        state = new_state

print("训练完成的Q值表:")
print(Q)

        在这个示例中,Q表即为迷宫中每个状态在不同动作下的奖励累积值。通过1000个回合的训练,Q值表逐步逼近最优策略。


http://www.kler.cn/a/380713.html

相关文章:

  • CSS系列(27)- 图形与滤镜详解
  • 蓝牙协议——音量控制
  • Mysql高级部分总结(二)
  • 服务器证书原理
  • C++ OpenGL学习笔记(4、绘制贴图纹理)
  • systemverilog中task的disable用法
  • bert-base-chinese模型使用教程
  • Linux系统-日志轮询(logrotate)
  • 【Java语言】继承和多态(一)
  • FPGA实现图像处理算法的创新点
  • Handler源码和流程分析
  • 算法: 链表题目练习
  • 前端用docker部署
  • 总是忘记CSS中的transform 和transition的区别
  • 楼梯区域分割系统:Web效果惊艳
  • 【图书管理与推荐系统】Python+Django网页界面+协同过滤推荐算法+网站系统
  • nginx cors配置
  • 【驱动】地平线X3交叉编译工具搭建、源码下载
  • 基于航片的玉米异常情况识别赛题正在报名中 | CCF BDCI进行时
  • element-plus按需引入报错Components is not a function
  • 什么是AOP面向切面编程?怎么简单理解?
  • npm入门教程11:npm私有包和模块
  • 基于Spring Boot的志愿服务管理系统设计与实现,LW+源码+讲解
  • Chrome 130 版本开发者工具(DevTools)更新内容
  • Python学习笔记-生成器的应用与原理
  • CentOS 7 安装 ntp,自动校准系统时间