其中正方形表示变量,圆圈表示操作符。数据流的方向是从左到右依次计算。
backward propagation,简称 BP)指的是计算神经网络参数梯度的方法。其原理是基于微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络,依次计算每个中间变量和参数的梯度。
梯度的自动计算(自动微分)大大简化了深度学习算法的实现。注意,反向传播算法会重复利用前向传播中存储的中间值,以避免重复计算,因此,需要保留前向传播的中间结果,这也会导致模型训练比单纯的预测需要更多的内存(显存)。同时这些中间结果占用内存(显存)大小与网络层的数量和批量(
batch_size)大小成正比,因此使用大 batch_size 训练更深层次的网络更容易导致内存不足(out of memory)的错误!
Adam 等其他优化算法)来更新模型参数。local minimum): 对于任何目标函数 $f(x)$,如果在 $x$ 处对应的 $f(x)$ 值小于在 $x$ 附近任何其他点的 $f(x)$ 值,那么 $f(x)$ 可能是局部最小值。如果 $f(x)$ 在 $x$ 处的值是整个域上目标函数的最小值,那么 $f(x)$ 是全局最小值。saddle point): 指函数的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。vanishing gradient): 因为某些原因导致目标函数 $f$ 的梯度接近零(即梯度消失问题),是在引入 ReLU 激活函数和 ResNet 之前训练深度学习模型相当棘手的原因之一。SGD 和 Adam 都属于此类别。
gradient descent, GD)算法是神经网络模型训练中最为常见的优化器。尽管梯度下降(gradient descent)很少直接用于深度学习,但理解它是理解随机梯度下降和小批量随机梯度下降算法的基础。
大多数文章都是以“一个人被困在山上,需要迅速下到谷底”来举例理解梯度下降法,但这并不完全准确。在自然界中,梯度下降的最好例子,就是泉水下山的过程:
示例参考 AI-EDU: 梯度下降。
下面我通过一个简单的双变量凸函数 $J(x, y) = x^2 + 2y^2$ 为例,来描述梯度下降的优化过程。
通过梯度下降法寻找函数的最小值,首先得计算其函数梯度:
$$
{\partial{J(x,y)} \over \partial{x}} = 2x \
{\partial{J(x,y)} \over \partial{y}} = 4y
$$
设初始点为 $(x_0, y_0) = (-3, -3)$,学习率 $\eta = 0.1$,根据梯度下降公式(1),可得参数迭代过程的计算公式:
$$
\begin{aligned}
(x_{n+1}, y_{n+1}) &= (x_n, y_n) - \eta \cdot \nabla J(x, y) \
&= (x_n, y_n) - \eta \cdot (2x, 4y) \tag{2}
\end{aligned}
$$
这里手动计算下下一个迭代点的值:
$$
\begin{aligned}
(x_1, y_1) &= (-3, -3) - 0.1*(2*-3, 4*-3) \
&= (-3 + 0.6, -3 + 1.2) \
&= (-2.4, -1.8) \
\end{aligned}
$$
根据上述公式(2),假设终止条件为 $J(x,y) < 0. 005$,迭代过程如下表1所示。
表1 双变量函数梯度下降的迭代过程
| 迭代次数 | $x$ | $y$ | $J(x,y)$ |
|---|---|---|---|
| 1 | -3 | -3 | 27 |
| 2 | -2.4 | y=-1.8 | 12.24 |
| ... | ... | ... | ... |
| 16 | -0.084442 | -0.000846 | 0.007132 |
| 17 | -0.067554 | y=-0.000508 | 0.004564 |
| 观察角度1 | 观察角度2 |
|---|---|
![]() |
![]() |
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def target_function(x,y):
J = pow(x, 2) + 2*pow(y, 2)
return J
def derivative_function(theta):
x = theta[0]
y = theta[1]
return np.array([2*x, 4*y])
def show_3d_surface(x, y, z):
fig = plt.figure()
ax = Axes3D(fig)
u = np.linspace(-3, 3, 100)
v = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(u, v)
R = np.zeros((len(u), len(v)))
for i in range(len(u)):
for j in range(len(v)):
R[i, j] = pow(X[i, j], 2)+ 4*pow(Y[i, j], 2)
ax.plot_surface(X, Y, R, cmap='rainbow')
plt.plot(x, y, z, c='black', linewidth=1.5, marker='o', linestyle='solid')
plt.show()
if __name__ == '__main__':
theta = np.array([-3, -3]) # 输入为双变量
eta = 0.1 # 学习率
error = 5e-3 # 迭代终止条件,目标函数值 < error
X = []
Y = []
Z = []
for i in range(50):
print(theta)
x = theta[0]
y = theta[1]
z = target_function(x,y)
X.append(x)
Y.append(y)
Z.append(z)
print("%d: x=%f, y=%f, z=%f" % (i,x,y,z))
d_theta = derivative_function(theta)
print(" ", d_theta)
theta = theta - eta * d_theta
if z < error:
break
show_3d_surface(X,Y,Z)
注意!总结下,不同的步长 $\eta$ ,随着迭代次数的增加,会导致被优化函数 $J$ 的值有不同的变化:
图片来源如何理解梯度下降法?。
SGD)可降低每次迭代时的计算代价。在随机梯度下降的每次迭代中,我们对数据样本随机均匀采样一个索引 $i$,其中 $i \in {1, . . . , n}$,并计算梯度 $\nabla J(\theta)$ 以更新权重参数 $\theta$:
$$
\theta_{n+1} = \theta_{n} - \eta \cdot \nabla J_i(\theta) \tag{3}
$$
每次迭代的计算代价从梯度下降的 $O(n)$ 降至常数 $O(1)$。另外,值得强调的是,随机梯度 $\nabla J_i(\theta)$ 是对完整梯度 $\nabla J(\theta)$ 的无偏估计。
无偏估计是用样本统计量来估计总体参数时的一种无偏推断。在实际应用中,随机梯度下降 SGD 法必须和动态学习率方法结合起来使用,否则使用固定学习率 + SGD的组合会使得模型收敛过程变得更复杂。学习率的调整策略可参考我之前写的文章-深度学习炼丹-超参数设定和模型训练。
GD)和随机梯度下降(SGD)方法都过于极端,要么使用完整数据集来计算梯度并更新参数,要么一次只处理一个训练样本来更新参数。在实际项目中,会对两者取折中,即小批量随机梯度下降(minibatch gradient descent),使用小批量随机梯度下降还可以提高计算效率。
小批量的所有样本数据元素都是从训练集中随机抽出的,样本数目个数为 batch_size(缩写 bs)
$$
\theta_{n+1} = \theta_{n} - \eta \cdot \nabla \frac{1}{bs}\sum_{i}^{bs}J_i(\textrm{x},\theta) \tag{3}
$$
另外,一般项目中使用 SGD 优化算法都默认会使用小批量随机梯度下降,即 batch_size > 1,除非显卡显存不够了,才会设置 batch_size = 1。
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
给定一个最小整数和最大整数,我想创建一个数组,它从最小值到最大值以二为单位计数,然后倒退(再次以二为单位,重复最大数)。例如,如果最小数是1,最大数是9,我想要[1,3,5,7,9,9,7,5,3,1].我试图尽可能简洁,这就是我使用单行代码的原因。在Python中,我会这样做:range(1,10,2)+range(9,0,-2)在我刚刚开始学习的Ruby中,到目前为止我所想到的是:(1..9).inject([]){|r,num|num%2==1?r这行得通,但我知道必须有更好的方法。这是什么? 最佳答案 (1..9).step
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就
HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca
如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1. 创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1. 创建SpringBoot项目 打开IDEA,选择NewProject创建项目。 填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。 选择springboot版本以及需要的包,此处只选择了springweb。 此处需特别注意,若你使用的是jdk1
前言上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指正。目录前言本系列提要一、粒子系统主模块1.阅读前注意事项2.参考图3.参数讲解DurationLoopingPrewarmStartDelayStartLifetimeStartSpeed3DStartSizeStartSize3DStartRotationStartRotationFlipRotationStartColorGravityModif