【 梯度下降算法 Gradient-Descend 数学推导与源码详解 深度学习 Pytorch笔记 B站刘二大人(2/10)】

14 篇文章 0 订阅
11 篇文章 0 订阅

梯度下降算法 Gradient-Descend 数学推导与源码详解 深度学习 Pytorch笔记 B站刘二大人(2/10)

数学原理分析

在第一节中我们定义并构建了线性模型,即最简单的深度学习模型,但是深度学习通常是由四个环节构成,准备数据,构建模型,定义损失与优化函数,循环迭代训练。其中非常重要的就是让模型在每次的循环中进行自我优化,并将模型逐渐优化为理想中的高准确率模型。

即我们要找到一种方法,使得模型的参数w不停逼近理想化的值w0,使得整体模型的训练损失loss最小,在(1/10)中可以具体体现为让权重参数w对应模型的loss停留在损失曲线谷底,使得训练结束后w尽可能靠近w=2.0
在这里插入图片描述
梯度下降法
梯度下降法是在寻优过程中最简单也是最普遍的应用方法,目的是沿着梯度的方向找到一个函数的局部最小值
通过梯度的概念我们知道,梯度表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向变化最快,变化率最大。

显然我们知道如果按照一定的移动步长,沿梯度减小的方向,不断的进行更新。在越“陡峭”的地方,一次下降的距离越大;在越平缓,越接近谷底的位置,则一次下降的距离越小。这样在足够多此的迭代后,将接近该函数的局部最小值,这一方法也被称梯度下降法,是迭代法的一种,可以用于求解线性和非线性的最小二乘问题。
在这里插入图片描述
在上图中alpha即为每次的迭代步长,这样进行多次迭代,w的取值最终将趋于曲线谷底。
加上forward函数后的推导如图
在这里插入图片描述
其中xn×w-yn是之前定义的损失函数,最终将梯度公式求解得到只于x,w,y有关表达式

源码解读与实现

import numpy as np
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]  # 定义原始数据集
y_data = [2.0, 4.0, 6.0]

w = 1.0

def forward(x):
    return w * x

def loss(xs, ys):
    y_pred = forward(xs)	# 定义损失函数
    return (y_pred - ys) ** 2	# 返回损失平方

def gradient(xs,ys):
    return 2 * x * (x * w - y)     # 对单个数据取梯度,即上文推导表达式结果


print('Predict before training', 4, forward(4))

for epoch in range(100):
    for x,y in zip(x_data, y_data):
        grad = gradient(x, y)	
        w = w - 0.01 * grad		# 取步长alpha为0.01,即每一次训练梯度grad*0.01进行优化更新
        print('\t grad: ', x, y, grad)
        l = loss(x,y)
    print('progress', epoch, 'w= ', w, 'loss= ', l)
print('Predict after training', 4, forward(4))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个基于策略梯度下降的深度强化学习算法PyTorch实现。 首先我们需要导入相关的包和定义一些超参数: ```python import gym import torch import torch.nn as nn import torch.optim as optim import numpy as np # 超参数 learning_rate = 0.01 gamma = 0.99 hidden_layer = 128 batch_size = 32 episodes = 1000 render = False ``` 接下来,我们需要定义一个神经网络来估计策略。这里我们使用一个简单的全连接神经网络,输入是状态向量,输出是动作的概率分布。 ```python class Policy(nn.Module): def __init__(self, input_dim, output_dim, hidden_layer=128): super(Policy, self).__init__() self.fc1 = nn.Linear(input_dim, hidden_layer) self.fc2 = nn.Linear(hidden_layer, output_dim) def forward(self, x): x = torch.relu(self.fc1(x)) x = torch.softmax(self.fc2(x), dim=1) return x ``` 接下来,我们定义一些函数来计算策略梯度和更新策略。 ```python def compute_policy_gradient(policy, rewards, states, actions): # 计算策略梯度 R = 0 policy_gradient = [] for r in rewards[::-1]: R = r + gamma * R policy_gradient.insert(0, -R) policy_gradient = torch.tensor(policy_gradient) policy_gradient = (policy_gradient - policy_gradient.mean()) / (policy_gradient.std() + 1e-9) # 计算动作概率分布 states = torch.tensor(states, dtype=torch.float32) action_probs = policy(states) dist = torch.distributions.Categorical(action_probs) # 计算策略梯度乘以动作概率 actions = torch.tensor(actions) log_probs = dist.log_prob(actions) policy_gradient *= log_probs.exp() return policy_gradient def update_policy(policy, optimizer, policy_gradient): # 更新策略 optimizer.zero_grad() policy_gradient.mean().backward() optimizer.step() ``` 最后,我们定义主函数来运行整个强化学习算法。在每个回合结束后,我们先计算策略梯度,然后用策略梯度更新策略。 ```python if __name__ == '__main__': # 初始化环境和策略 env = gym.make('CartPole-v0') policy = Policy(env.observation_space.shape[0], env.action_space.n, hidden_layer=hidden_layer) optimizer = optim.Adam(policy.parameters(), lr=learning_rate) # 训练策略 for episode in range(episodes): # 初始化回合 state = env.reset() done = False rewards = [] states = [] actions = [] # 运行回合 while not done: if render: env.render() # 选择动作 state = torch.tensor(state, dtype=torch.float32).unsqueeze(0) action_probs = policy(state) dist = torch.distributions.Categorical(action_probs) action = dist.sample().item() # 执行动作 next_state, reward, done, _ = env.step(action) # 存储数据 states.append(state) actions.append(action) rewards.append(reward) # 更新状态 state = next_state # 计算策略梯度并更新策略 policy_gradient = compute_policy_gradient(policy, rewards, states, actions) update_policy(policy, optimizer, policy_gradient) # 打印训练进度 if episode % 10 == 0: print(f'Episode {episode}/{episodes}') env.close() ``` 这样我们就完成了基于策略梯度下降的深度强化学习算法PyTorch实现。您可以根据实际情况调整超参数和神经网络结构来获得更好的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗头狗不狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值