• pytorch 梯度反传详细说明： import torch w = torch.tensor([1.], requires_grad=True) x = torch.tensor([2.], requires_grad=True) a = torch.add(w, x) b = torch.add(w, 1) y = torch.mul(a, b) print(w) ...
pytorch 梯度反传详细说明：
import torch
y = torch.mul(a, b)

print(w)
print(x)
print(a)
print(b)
print(y)

y.backward(retain_graph=True)
y.backward()

结果是：

import torch

y0 = torch.mul(a, b)

loss = torch.cat([y0, y1], dim=0)

结果：

转载自：https://blog.csdn.net/weixin_42154841/article/details/108503148
展开全文
• 深度学习在计算梯度回传的时候，经常需要对矩阵求导。这里是详细的数学知识。 深度学习在计算梯度回传的时候，经常需要对矩阵求导。这里是详细的数学知识。 深度学习在计算梯度回传的时候，经常需要对矩阵求导。...
• 梯度反传Among many of its challenges, multi-agent reinforcement learning has one obstacle that is overlooked: “credit assignment.” To explain this concept, let’s first take a look at an example… ...

梯度反传

Among many of its challenges, multi-agent reinforcement learning has one obstacle that is overlooked: “credit assignment.” To explain this concept, let’s first take a look at an example…
在许多挑战中，多主体强化学习有一个被忽略的障碍：“学分分配”。 为了解释这个概念，让我们首先看一个例子……
Say we have two robots, robot A and robot B. They are trying to collaboratively push a box into a hole. In addition, they both receive a reward of 1 if they push it in and 0 otherwise. In the ideal case, the two robots would both push the box towards the hole at the same time, maximizing the speed and efficiency of the task.
假设我们有两个机器人，即机器人A和机器人B。他们正在尝试将盒子推入一个洞中。 此外，如果他们都将其推入，他们都将获得1的奖励，否则将获得0。 在理想情况下，两个机器人都将盒子同时推向Kong，从而最大程度地提高了任务的速度和效率。
However, suppose that robot A does all the heavy lifting, meaning robot A pushes the box into the hole while robot B stands idly on the sidelines. Even though robot B simply loitered around, both robot A and robot B would receive a reward of 1. In other words, the same behavior is encouraged later on even though robot B executed a suboptimal policy. This is when the issue of “credit assignment” comes in. In multi-agent systems, we need to find a way to give “credit” or reward to agents who contribute to the overall goal, not to those who let others do the work.
但是，假设机器人A完成了所有繁重的工作，这意味着机器人A将箱子推入Kong中，而机器人B空着站在边线上。 即使机器人B只是闲逛， 机器人A 和 机器人B都将获得1的奖励。换句话说， 即使机器人B执行了次优策略，以后也会鼓励相同的行为。 这就是“信用分配”问题出现的时候。在多主体系统中，我们需要找到一种方法，向为总体目标做出贡献的代理人而不是让他人完成工作的代理人给予“信用”或奖励。 。
Okay so what’s the solution? Maybe we only give rewards to agents who contribute to the task itself.
好的，那有什么解决方案？ 也许我们只奖励那些为任务本身做出贡献的特工。

Photo by
Kira auf der Heide on
Unsplash

图片由
Kira auf der Heide
摄于
Unsplash

比看起来难 (It’s Harder than It Seems)
It seems like this easy solution may just work, but we have to keep several things in mind.
似乎这个简单的解决方案可能会奏效，但我们必须牢记几件事。
First, state representation in reinforcement learning might not be expressive enough to properly tailor rewards like this. In other words, we can’t always easily quantify whether an agent contributed to a given task and dole out rewards accordingly.
首先，强化学习中的状态表示可能不足以适当地调整这样的奖励。 换句话说，我们不能总是轻松地量化代理商是否为给定任务做出贡献并相应地发放奖励。
Secondly, we don’t want to handcraft these rewards, because it defeats the purpose of designing multi-agent algorithms. There’s a fine line between telling agents how to collaborate and encouraging them to learn how to do so.
其次，我们不想手工获得这些奖励，因为它违背了设计多主体算法的目的。 在告诉代理人如何合作与鼓励他们学习如何做之间有一条很好的界限。
Counterfactual policy gradients address this issue of credit assignment without explicitly giving away the answer to its agents.
反事实的政策梯度解决了这一信用分配问题，而没有向其代理商明确给出答案。
The main idea behind the approach? Let’s train agent policies by comparing its actions to other actions it could’ve taken. In other words, an agent will ask itself:
该方法背后的主要思想是什么？ 让我们通过将代理的操作与它可能采取的其他操作进行比较来训练代理策略。 换句话说，座席会问自己：

“ Would we have gotten more reward if I had chosen a different action?”
“如果我选择其他动作， 我们会得到更多的回报吗？”

By putting this thinking process into mathematics, counterfactual multi-agent (COMA) policy gradients tackle the issue of credit assignment by quantifying how much an agent contributes to completing a task.
通过将这种思维过程纳入数学，反事实多主体(COMA)策略梯度通过量化代理对完成任务的贡献来解决信用分配问题。

Photo by
Brandon Mowinkel on
Unsplash

照片由
Brandon Mowinkel在
Unsplash上
拍摄

组成部分 (The Components)
COMA is an actor-critic method that uses centralized learning with decentralized execution. This means we train two networks:
COMA是一种参与者批评方法，它使用集中式学习和分散式执行。 这意味着我们训练两个网络：
An actor: given a state, outputs an action 演员 ：给定状态，输出动作 A critic: given a state, estimates a value function 评论家 ：给定状态，估计价值函数
In addition, the critic is only used during training and is removed during testing. We can think of the critic as the algorithm’s “training wheels.” We use the critic to guide the actor throughout training and give it advice on how to update and learn its policies. However, we remove the critic when it’s time to execute the actor’s learned policies.
此外，注释器仅在训练期间使用，而在测试期间被删除 。 我们可以将批评者视为算法的“训练轮”。 我们使用评论家在整个培训过程中指导演员，并为演员提供有关如何更新和学习其政策的建议。 但是，在执行演员的学习策略时，我们会删除批评者。
For more background on actor-critic methods in general, take a look at Chris Yoon’s in-depth article here:
要获得有关演员批评方法的更多背景知识，请在此处查看Chris Yoon的深入文章：

Let’s start by taking a look at the critic. In this algorithm, we train a network to estimate the joint Q-value across all agents. We’ll discuss the critic’s nuances and how it’s specifically designed later in this article. However, all we need to know now is that we have two copies of the critic network. One is the network we are trying to train and the other is our target network, used for training stability. The target network’s parameters are copied from the training network periodically.
让我们先看一下评论家。 在此算法中，我们训练网络以估计所有代理之间的联合Q值 。 我们将在本文后面讨论评论家的细微差别以及它是如何专门设计的。 但是，我们现在需要知道的是，我们有批评者网络的两个副本。 一个是我们正在尝试训练的网络，另一个是我们用于训练稳定性的目标网络。 定期从训练网络复制目标网络的参数。
To train the networks, we use on-policy training. Instead of using one-step or n-step lookahead to determine our target Q-values, we use TD(lambda), which uses a mixture of n-step returns.
为了训练网络，我们使用了策略训练。 我们使用TD(lambda)而不是使用单步或n步前瞻来确定目标Q值，而是使用n步返回值的混合。

n-step returns and target value using TD (lambda)

使用TD(λ)的n步返回和目标值

where gamma is the discount factor, r denotes a reward at a specific time step, f is our target value function, and lambda is a hyper-parameter. This seemingly infinite horizon value is calculated using bootstrapped estimates by a target network.
其中gamma是折现因子，r表示在特定时间步长的奖励，f是我们的目标值函数，lambda是超参数。 这个看似无限的地平线值是由目标网络使用自举估计来计算的。
For more information on TD(lambda), Andre Violante’s article provides a fantastic explanation:
有关TD(lambda)的更多信息， Andre Violante的文章提供了一个奇妙的解释：

Finally, we update the critic’s parameters by minimizing this function:
最后，我们通过最小化此函数来更新评论者的参数：

Loss function

损失函数

Photo by
Jose Morales on
Unsplash

Jose Morales在
Unsplash上
拍摄的照片

赶上 (The Catch)
Now, you may be wondering: this is nothing new! What makes this algorithm special? The beauty behind this algorithm comes with how we update the actor networks’ parameters.
现在，您可能想知道：这不是什么新鲜事！ 是什么使该算法与众不同？ 该算法背后的美在于我们如何更新角色网络的参数。
In COMA, we train a probabilistic policy, meaning each action in a given state is chosen with a specific probability that is changed throughout training. In typical actor-critic scenarios, we update the policy by using a policy gradient, typically using the value function as a baseline to create advantage actor-critic:
在COMA中，我们训练概率策略，这意味着在给定状态下的每个动作都以特定概率选择，该概率在整个训练过程中都会改变。 在典型的参与者批评者场景中，我们通过使用策略梯度来更新策略，通常使用价值函数作为基准来创建优势参与者批评者：

Naive advantage actor critic policy update

天真优势演员评论家政策更新

However, there’s a problem here. This fails to address the original issue we were trying to solve: “credit assignment.” We have no notion of “how much any one agent contributes to the task.” Instead, all agents are being given the same amount of “credit,” considering our value function estimates joint value functions. As a result, COMA proposes using a different term as our baseline.
但是，这里有一个问题。 这无法解决我们试图解决的原始问题：“信用分配”。 我们没有“任何一个特工为这项任务做出多少贡献”的概念。 取而代之的是，考虑到我们的价值函数估算联合价值函数 ，所有代理商都会获得相同数量的“信用”。 因此，COMA建议使用其他术语作为我们的基准。
To calculate this counterfactual baseline for each agent, we calculate an expected value over all actions that agent can take while keeping the actions of all other agents fixed.
为了计算每个业务代表的反事实基准 ， 我们在保持所有其他业务代表的动作不变的情况下 ， 计算了该业务代表可以采取的所有行动的期望值。

将反事实基准添加到优势函数估计中

Let’s take a step back here and dissect this equation. The first term is just the Q-value associated with the joint state and joint action (all agents). The second term is an expected value. Looking at each individual term in that summation, there are two values being multiplied together. The first is the probability this agent would’ve chosen a specific action. The second is the Q-value of taking that action while all other agents kept their actions fixed.
让我们退后一步，剖析这个方程。 第一项只是与关节状态和关节动作(所有主体)相关的Q值。 第二项是期望值。 看一下该求和中的每个单独的项，有两个值相乘在一起。 首先是该特工选择特定动作的可能性。 第二个是在所有其他代理保持其动作固定的同时执行该动作的Q值。
Now, why does this work? Intuitively, by using this baseline, the agent knows how much reward this action contributes relative to all other actions it could’ve taken. In doing so, it can better distinguish which actions will better contribute to the overall reward across all agents.
现在，为什么这样做呢？ 凭直觉，通过使用此基准，代理可以知道此操作相对于它可能已经执行的所有其他操作有多少奖励。 这样，它可以更好地区分哪些行为将更好地为所有代理提供总体奖励。
COMA proposes using a specific network architecture helps make computing the baseline more efficient [1]. Furthermore, the algorithm can be extended to continuous action spaces by estimating the expected value using Monte Carlo Samples.
COMA提出使用特定的网络体系结构有助于使基准线的计算效率更高[1]。 此外，通过使用蒙特卡洛样本估计期望值，可以将该算法扩展到连续动作空间。

Photo by
JESHOOTS.COM on
Unsplash

JESHOOTS.COM在
Unsplash上的
照片

结果 (Results)
COMA was tested on StarCraft unit micromanagement, pitted against various central and independent actor critic variations, estimating both Q-values and value functions. It was shown that the approach outperformed others significantly. For official reported results and analysis, check out the original paper [1].
COMA已在StarCraft单位的微观管理上进行了测试，与各种中央和独立演员评论家的变化进行了对比，从而估算了Q值和值函数。 结果表明，该方法明显优于其他方法。 有关官方报告的结果和分析，请查看原始论文[1]。

结论 (Conclusion)
Nobody likes slackers. Neither do robots.
没有人喜欢懒人。 机器人也没有。
Properly allowing agents to recognize their personal contribution to a task and optimizing their policies to best use this information is an essential part of making robots collaborate. In the future, better decentralized approaches may be explored, effectively lowering the learning space exponentially. However, this is easier said than done, as with all problems of these sorts. But of course, this is a strong milestone to letting multi-agents function at a far higher, more complex level.
适当地允许代理识别他们对任务的个人贡献并优化其策略以最佳地利用此信息，这是使机器人进行协作的重要组成部分。 将来，可能会探索更好的分散方法，从而有效地减少学习空间。 但是，对于所有这些问题，说起来容易做起来难。 但是，当然，这是使多代理在更高，更复杂的级别上起作用的重要里程碑。

From the classic to state-of-the-art, here are related articles discussing both multi-agent and single-agent reinforcement learning:
从经典到最新，以下是讨论多主体和单主体增强学习的相关文章：

梯度反传

展开全文
import tensorflow as tf

print(unused_op.inputs)
print(unused_op.inputs[0])
print(unused_op.inputs[1])#对应存在两个输入
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(unused_op.inputs[0]))#对应variable
print(sess.run(unused_op.inputs[1]))#对应tensor的Mul:0就是13
#这个地方的原因是有两个输入 必须对应两个梯度才行，所以必须加一个None 对应因为常数不需要梯度(乘法因子) 因为求导是对应每一个都求

input = tf.Variable([3.0], dtype=tf.float32, name='w1')

g = tf.get_default_graph()
output_clip = tf.multiply(input,13)
#output_clip = tf.identity(input,name='Identity')
output_2 = output_clip*2.0

# output without gradient clipping in the backwards pass for comparison:
output = tf.identity(input)
print(output_clip)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("without clipping:", sess.run(grad)[0])

展开全文
• 本人一直对AI背后的数学原理非常感兴趣，今天做了一个“利用梯度反传来拟合函数”的小实验，此实验十分有利于深度学习初学者来了解梯度反向传播的计算步骤，所以顺便也分享一下。 文章内容、公式推导和代码均为本人...
本人一直对AI背后的数学原理非常感兴趣，今天做了一个“利用梯度反传来拟合函数”的小实验，此实验十分有利于深度学习初学者来了解梯度反向传播的计算步骤，所以顺便也分享一下。 文章内容、公式推导和代码均为本人原创。有问题可以评论区交流。

实验开始：
首先，定义实验的目标函数（我们不知道它的公式，它揭示着自然规律，你只能输入然后看到输出结果，收集有限的样本对）。我们需要用梯度方向传播的方法来拟合这个目标函数。拟合的方法就是通过样本对来斧正咱们的原始函数。大概定义如下：
目标函数：

y

ˉ

=

5

x

+

3

\bar{y} = 5x+3

(random)初始化函数：

y

=

8

x

+

8

y=8x+8

损失函数：

L

=

(

y

−

y

ˉ

)

2

L=(y-\bar{y})^2

现有样本对：

(

0

,

3

)

,

(

1

,

8

)

,

(

2

,

13

)

,

(

3

,

18

)

(0,3), (1,8), (2, 13), (3, 18)

首先是数学部分，其次是代码部分。 我们要优化的参数只有2个：w和b。所以我们需要用数学公式推导出每一轮训练之后，可训练参数w和b的更新公式。梯度反传的参数更新公式的核心就是：求偏导。将偏导乘以学习率再乘以-1就可以得到要更新的量，这就是梯度下降算法。
对初始函数为

y

=

w

x

+

b

y=wx+b

而言，开始训练：
求

w

w

梯度：

∂

L

∂

w

=

∂

L

∂

y

∗

∂

y

∂

w

=

2

(

y

−

y

ˉ

)

∂

y

∂

w

=

2

(

y

−

y

ˉ

)

x

{\partial{L}\over \partial{w}}={\partial{L}\over \partial{y}}*{\partial{y}\over \partial{w}}=2(y-\bar{y}) {\partial{y} \over \partial{w}}=2(y-\bar{y})x

Δ

w

=

−

η

∂

L

∂

w

=

−

2

η

(

y

−

y

ˉ

)

x

\Delta{w}=-\eta {\partial{L}\over \partial{w}}=-2\eta(y-\bar{y})x

更新

w

w

：

w

=

w

+

Δ

w

=

w

−

2

η

(

y

−

y

ˉ

)

x

w=w+\Delta{w}=w-2\eta(y-\bar{y})x

同理，获得

b

b

的梯度：

∂

L

∂

b

=

2

(

y

−

y

ˉ

)

∂

y

∂

b

=

2

(

y

−

y

ˉ

)

{\partial{L}\over \partial{b}}=2(y-\bar{y}) {\partial{y} \over \partial{b}}=2(y-\bar{y})

Δ

b

=

−

η

∂

L

∂

b

=

−

2

η

(

y

−

y

ˉ

)

\Delta{b}=-\eta {\partial{L}\over \partial{b}}=-2\eta(y-\bar{y})

更新

b

b

：

b

=

b

+

Δ

b

=

b

−

2

η

(

y

−

y

ˉ

)

b=b+\Delta{b}=b-2\eta(y-\bar{y})

根据上面公式，咱们得到了w和b的更新公式，跟着编写代码就可以了：
# goal: y = 5*x + 3
# training data:
samples = [[0,3],[1,8],[2,13],[3,18]]

# config
lr = .1
epochs = 100

# initialize: y = wx + b
w = 8
b = 8

# training
for i in range(epochs):
for s in samples:
x, y_ = s
y = w * x + b
loss = pow(y - y_, 2)
if i % 50 == 0:
print(loss, end=' ')
w = w - 2 * lr * (y - y_) * x
b = b - 2 * lr * (y - y_)
print()
print('final curve is: y = '+str(w)+' * x + ' + '' + str(b))


查看输出：

25 49.0 33.639999999999965 0.5183999999999932 9.590102211677487e-14 3.6648456030054036e-14 4.1086839514625225e-16 1.0547451191423865e-14 final curve is: y = 4.999999999999991 * x + 3.0000000000000453

我们发现，结果已经拟合得非常好了，离目标函数y=5x+3已经几乎相同。
总结
这就是梯度下降反向传播算法的最简单的实例了。神经网络的训练亦是如此，扩展到多层和存在激活函数等情况都可以用链式法则来解决。 本文只给出了计算步骤和操作方法，但没给出为何梯度下降能拟合函数的数学解释，不过我会在后面的文章以比较通俗的讲法来做出这一解释。
展开全文
• 我们可以通过指定参数reuqires_grad=True来建立一个反向传播图，从而能够计算梯度。在pytorch中一般叫做dynamic computation graph(DCG)——即动态计算图。 import torch import numpy as np # 方式一 x = torch....
• 1 卷积层梯度反向传播 卷积的前向传播，相对简单Ouput=(Input+2p−k)/s+1Ouput = (Input +2p- k)/s + 1Ouput=(Input+2p−k)/s+1，具体实现，可以参考https://zhuanlan.zhihu.com/p/40951745 卷积运算也是转化成矩阵...
• tensor中拷贝的函数有两个，一个是clone()，另外一个是copy_(),clone()相当于完全复制了之前的tensor，他的梯度也会复制，而且在反向传播时，克隆的样本和结果是等价的，可以简单的理解为clone只是给了同一个tensor...
• 1.手写更新权重 ...def grad(x,y): #计算梯度 # (y^ - y)^2 =（wx -y)^2 grad:2w(wx-y) return 2 * x * (w * x - y) def loss(x,y): return (y - (w * x)) * (y - (w * x)) for i in range(30)
• CS231n课程笔记翻译：反向传播笔记 - 杜客的文章 - 知乎 译者注：本文智能单元首发，译自斯坦福CS231n课程笔记Backprop ... 简单表达式和理解梯度 复合表达式，链式法则，反向传播 直观理解反向传播 模块：Sig...
• 梯度是什么？ 梯度：是一个向量，指的是学习（参数更新）的方向 计算图和反向传播 计算图：通过图的方式来描述函数的图形 J(a,b,c)=3(a+bc)J(a,b,c)=3(a+bc)J(a,b,c)=3(a+bc)，令u=a+v，v=bcu=a+v，v=bcu=a+v，v=bc...
• 目录连接 (1) 数据处理 ...(6) 梯度反向传递(BackPropogate)的理解 (总) PyTorch遇到令人迷人的BUG PyTorch的学习和使用（六） 多个网络交替情况 最近使用PyTorch搭一个对抗网络，由于对抗...
• CNN网络中另外一个不可导的环节就是Pooling池化操作，因为Pooling操作使得feature map的尺寸变化，假如做2×2的池化，假设那么第l+1层的feature map有16个梯度，那么第l层就会有64个梯度，这使得梯度无法对位的进行...
• 在PyTorch中，传入网络计算的数据类型必须是Variable类型， Variable包装了一个Tensor，并且保存着梯度和创建这个Variablefunction的引用，换句话说，就是记录网络每层的梯度和网络图，可以实现梯度的反向传递，网络...
•   当训练时loss下降效果不理想或自定义损失函数时，需要检查反向回传梯度是否正常，网络权重是否在更新。 打印网络中的层的梯度   参考pytorch 打印网络回传梯度，在loss.backward()后，取出网络各层属性，并...
• 一、梯度的传播反向传播什么时候停止 1.为叶子节点时【反向时前面没有与之相连的节点】 常见的叶子节点【输入】 2.该节点唯一相连的节点的require_grads=False 3.该节点唯一相连的节点使用detach函数时 该...
• 三层神经网络的 BP 公式
• 一 实例描述在反向传播过程中某种特殊情况需要停止梯度的运算时，在TensorFlow中提供了一个tf.stop_gradient函数，被它定义过的节点将没有梯度运算功能。二 代码import tensorflow as tf tf.reset_default_graph() ...
• 在最近的项目中用到了自定义loss函数，代码一切都准备就绪后，在训练时遇到了梯度爆炸的问题，每次训练几个iterations后，梯度和loss都会变为nan。一般情况下，梯度中间部分值存在0情况，梯度就会产生nan，导致该层...
• 我们知道一定是DxC的（和W一样大），而是NxC的，哦那你瞬间就发现了一定是DxN的，因为（DxN）x（NxC）=>（DxC），并且你还发现你随手写的这个式子右边两项写了，应该是。 那好，我们已经知道了是DxN的，那就好办了...
• ∂ym​∂l​]=∂y∂l​ 这样过来 l = y v T = ∑ i = 1 m v i y i l = \mathbf{y} \mathbf{v}^\text{T}=\sum_{i=1}^mv_iy_i l=yvT=∑i=1m​vi​yi​ 所以说 l l l是向量 y \mathbf{y} y的加权和。 向backward()...
• 在各种机器学习的课上明明听得非常明白，神经网络无非就是正向算一遍Loss，反向算一下每个参数的梯度，然后大家按照梯度更新就好了。问题是梯度到底怎么求呢？课上往往举的是标量的例子，可是一到你做作业的时候就...
• 梯度爆炸 学习率太大 数据本身有问题 backward时，某些方法造成0在分母上， 如：使用方法sqrt() 定位造成nan的代码： import torch # 异常检测开启 torch.autograd.set_detect_anomaly(True) # 反向传播时检测是否...
• 有个想法，为什么gan不用梯度反转呢，而是给定一个相反标签，其实梯度反转也是可以的，但是在同样的输出情况下，我们会发现直接给相反标签会更快地指导网络往相反方向学习，也就是梯度更大，这个可以根据公式推导...
• 文章目录 方法 验证 data属性 与 detach()函数 clone()函数验证 参考资料 方法 调用tensor的data属性 调用tensor...所以并不能切断梯度 参考资料 pytorch.data属性和.detach属性相同与不同之处 如何切断梯度的反向传播
• 另外，很多连接的权值是共享的，因此，对于一个给定的权值，我们需要对所有与该权值有联系（权值共享的连接）的连接对该点求梯度，然后对这些梯度进行求和，就像上面对 bias 基的梯度计算一样：  这里， ...
• 该篇论文中最关键的 idea：对右端的模型停止梯度传播（Stop-Gradient） 就如结构图里表示的一样，而反应在公式则会成为 这就是 SimSiam 的大致结构和整个过程了。 非常简单明了是吧。 模型细节：平凡产生不平凡 关于...

...