直观理解法向量,梯度,梯度下降

空间曲线的切线和法平面

空间曲线:

本质是线, 一般用参数方程来描述, 这一条线一共有三个维度信息

空间曲线的切线:空间曲线的切线本质上是一条空间直线。

空间直线的表示:

对比平面上直线的表示:

y=kx+b

上述的直线点斜式是由斜率描述方向, 截距确定位置的

空间中有三个维度, 所以需要x, y, z的两个组合平面的方向信息才能确定空间直线的方向即构建

Z=ax

Z=by

两个式子联立表示一条直线(点向式方程)

切向量

对于位矢 ( x ( t ) , y ( t ) , z ( t ) ) (x(t),y(t),z(t)) (x(t),y(t),z(t))

它的导向量 [当t趋于0] 描述各个方向变化率, 所构成的是一个切向量, 在这里没有位置信息, 只有方向信息。

切线:

所以空间曲线的切线方程就为参数方程的x,y,z分别求导作为分母构成方向,切点信息修正大小;切向量为x,y,z分别求导所构成的向量。

法平面

法平面就是由与法向量点乘为0的全部向量的集合,相对于点 ( x 0 , y 0 , z 0 ) (x0,y0,z0) x0,y0,z0,法平面的表示就是 ( x − x 0 , y − y 0 , z − z 0 ) (x-x0,y-y0,z-z0) (xx0,yy0,zz0)点乘切向量 = 0

曲面的切平面和法线

法线

  • 曲面法线的几何意义:沿着空间曲线法线运行远离曲线得最快。

方向导数

某点朝着某个方向的导数叫做这个点在这个方向的方向导数。

梯度

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
百度百科上面的定义:
在这里插入图片描述

  • 梯度和法向量的联系是什么
    对于 z ( x , y ) z(x,y) z(x,y)而言,z对x的偏导和z对y的偏导记作 z x , z y z_x,z_y zx,zy描述的是在自变量空间中(x,y平面)沿着x轴z的变化率和沿着y轴z的变化率,注意因为一定要沿着曲线的方向进行变化,所以问题转变为了要让z变化,x和y要怎么进行变化,在x,y平面变化哪个方向会让z的值变化是最大的,这个问题保留。
    假定我们已经已知了梯度的方向就是变化最大的方向,在这个模型中就是朝着梯度的方向,z变化最大,所以梯度方向是垂直于起始点出 ( x , y ) (x,y) (x,y)的等高线(等值面)。
    对于空间曲面来讨论法向量,可以以看做是离开空间曲面这个等值面最快的一个方向。我们可以类别上面的,把空间曲面方程写成标准形式 g ( x , y , z ) = 0 g(x,y,z) = 0 g(x,y,z)=0所对应于的函数 g ( x , y , z ) g(x,y,z) g(x,y,z),得到这个函数的梯度方程 ( g x , g y , g z ) (g_x,g_y,g_z) (gx,gy,gz)。对于等值面,这个方程的方向会远离得最快,这个解释的直观理解已经到达了四维,难以可视化,应该勉强可以会意。
    综上:
  • 二维曲线在某点的法向量(垂直于等值线)等于二维曲线在某点的梯度。 z = f ( x , y ) z = f(x,y) z=f(x,y)
  • 三维曲面在某点的法向量(垂直于等值面)会等于三维函数的梯度。 z = g ( x , y , z ) z = g(x,y,z) z=g(x,y,z)

保留下来尚未解决的问题
问题一:偏导组成的为什么是变化最快的方向
问题二:并且各个偏导的组成的向量的合向量为什么恰好垂直于曲面
问题三:方向导数是梯度方向的关于方向向量投影

梯度下降算法

做法

以简单的bp神经网络为例子:
每个神经元有一个权重w和一个斜率b,假定有n个神经元,那么一共有
2 ∗ n 个未知数 2*n个未知数 2n个未知数
所以损失函数可以认为是一个2*n维的函数,他的目标值是0(损失值越小,模型的泛化能力越好(忽视过拟合))
所以对于损失函数 L ( W , B ) L(W,B) L(W,B),目标值为0进行梯度下降的做法。

可行做法1:

  1. 算出梯度向量(矩阵)A的单位向量
  2. 乘步长step
  3. 让原来的矩阵加上A*step
  4. 进行下一个迭代

实际做法2:

  1. 对于每个系数w
  2. 只对这个w使用梯度下降进行微调
  3. 当这个变量的函数值收敛了再进行下一个变量直到所有变量下降至收敛

种类(解决效率问题)

批量梯度下降法(Batch Gradient Descent, BGD);

随机梯度下降法(Stochastic Gradient Descent, SGD);

小批量梯度下降法(Mini-Batch Gradient Descent, MBGD)。

Adagrad(考虑历史梯度和)

Adagrad是一种自适应学习率算法,它可以根据每个参数的历史梯度大小来调整学习率,从而使得不同参数的学习率不同。Adagrad的核心思想是,对于频繁出现的参数,其学习率应该较小,而对于不经常出现的参数,其学习率应该较大。

具体来说,Adagrad会维护每个参数的历史梯度平方和,并将其作为学习率的分母。这样,对于频繁出现的参数,其历史梯度平方和会比较大,从而使得学习率较小;而对于不经常出现的参数,其历史梯度平方和会比较小,从而使得学习率较大。

Adagrad的更新公式如下:

θ t + 1 = θ t − η G t + ϵ ⊙ g t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \odot g_t θt+1=θtGt+ϵ ηgt

其中, θ t \theta_t θt表示第 t t t个时刻的参数, g t g_t gt表示第 t t t个时刻的梯度, η \eta η表示学习率, G t G_t Gt表示前 t t t个时刻的梯度平方和的累加, ϵ \epsilon ϵ是一个很小的常数,用来避免分母为0的情况。

Adagrad的优点是可以自适应地调整学习率,从而更好地适应不同参数的特点。但是,由于梯度平方和的累加会导致学习率不断减小,因此在训练后期可能会出现学习率过小的问题,从而导致收敛速度变慢。为了解决这个问题,后续的算法如RMSProp和Adam都对Adagrad进行了改进。

记忆每一个参数,通过每个历史梯度平方和作为分母,学习率作为分子来确定每个参数该次的学习率,由于梯度平方和的累加会导致学习率不断减小,因此在训练后期可能会出现学习率过小的问题,从而导致收敛速度变慢。
(改进)RMSProp
因为Adagrad算法会出现提前停止的现象,所以在RMSProp算法中解决了这个问题,它采用指数加权平均的思想,只将最近的梯度进行累加计算平方

Momentum(考虑之前梯度)

Momentum梯度下降是一种优化算法,它的核心思想是在梯度下降的基础上引入动量的概念,以加速收敛并减少震荡。动量可以理解为物理学中的动量,即物体在运动过程中的惯性。在Momentum梯度下降中,动量表示为之前梯度的加权平均值,用来保留之前的梯度信息。
具体来说,Momentum梯度下降中的动量取值一般为0.9左右,这个值可以根据实际情况进行调整。动量越大,之前的梯度信息对当前梯度的影响就越大,加速了收敛的过程,但也可能会导致过度拟合。相反,动量越小,之前的梯度信息对当前梯度的影响就越小,减缓了收敛的过程,但也可能会导致收敛速度过慢。
在Momentum梯度下降中,之前的梯度信息通过加权平均的方式进行保留。具体来说,每次更新参数时,都会将之前的梯度信息乘以一个动量因子,然后再加上当前的梯度信息,得到一个新的梯度信息。这个新的梯度信息就是用来更新参数的。这种方式可以使之前的梯度信息在更新参数时起到一定的作用,从而减少震荡,加速收敛。
可以避免在梯度方向变化较大时出现震荡的情况,同时也可以加速收敛。

Momentum梯度下降算法的更新公式如下:

v t = β v t − 1 + ( 1 − β ) ∇ J ( θ t ) v_t = \beta v_{t-1} + (1-\beta) \nabla J(\theta_t) vt=βvt1+(1β)J(θt)

θ t + 1 = θ t − α v t \theta_{t+1} = \theta_t - \alpha v_t θt+1=θtαvt

其中, v t v_t vt表示动量向量, β \beta β是动量系数, ∇ J ( θ t ) \nabla J(\theta_t) J(θt)是当前的梯度方向, α \alpha α是学习率, θ t \theta_t θt表示当前的参数值。

前一次的动量向量和此次梯度通过动量信息加权得到此次动量向量梯度更新方向为 此次梯度减去步长乘动量系数

adam

Adam算法是一种基于梯度下降的优化算法,它结合了动量法和自适应学习率的思想,能够在处理大规模数据和高维参数空间时表现出色

Adam算法的核心思想是根据梯度的一阶矩估计和二阶矩估计来更新参数。具体来说,Adam算法维护了两个变量:动量变量m和二阶矩变量v。在每次迭代中,Adam算法首先计算梯度g,然后更新动量变量m和二阶矩变量v:

m = β1 * m + (1 - β1) * g
v = β2 * v + (1 - β2) * g^2

其中,β1和β2是衰减率,通常取值为0.9和0.999。接下来,Adam算法使用修正后的动量变量m和二阶矩变量v来更新参数θ:

θ = θ - α * m / (sqrt(v) + ε)

其中,α是学习率,ε是一个很小的常数,用于避免除以0的情况。

梯度消失

以层为单位
在上面的示例中,如果我们尝试使用标准的随机梯度下降算法来训练深度神经网络,可能会出现梯度消失的问题。为了避免这种情况,我们可以使用其他类型的激活函数(例如ReLU),或者使用一些特殊技巧(如批量归一化)来帮助网络更好地处理梯度消失问题。

梯度消失问题通常是以层为单位出现的,特别是在深度神经网络中,由于多层堆叠,每一层都会减弱梯度信号。因此,尤其是当网络深度增加时,梯度消失问题往往更加明显
以下是一个示例,说明在深度神经网络中如何出现梯度消失的情况:

考虑一个具有10个隐藏层的神经网络,每个隐藏层有1000个神经元,使用sigmoid作为激活函数,最后输出一个二元分类结果。我们将使用反向传播算法来计算损失函数对于所有权重的偏导数。

假设当前的输入样本是x,并且深度神经网络的权重和偏置已经初始化好了。我们从第一层开始向前传递信号,直到最后一层输出结果。然后,我们计算预测值与真实值之间的误差,并计算每个权重和偏置的偏导数。接着,我们使用反向传播算法将这些偏导数传递回去,更新所有权重和偏置。

在反向传播期间,我们需要计算每个神经元的梯度。由于我们使用sigmoid作为激活函数,sigmoid函数的导数形式为:

d d x σ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \frac{d}{dx} \sigma(x) = \sigma(x)(1-\sigma(x)) dxdσ(x)=σ(x)(1σ(x))

因此,在反向传播时,每个神经元的梯度都会乘以 σ ( x ) ( 1 − σ ( x ) ) \sigma(x)(1-\sigma(x)) σ(x)(1σ(x))。也就是说,如果 s i g m o i d ( x ) sigmoid(x) sigmoid(x)接近于0或1,那么导数将非常小。当我们计算越来越深的隐藏层的梯度时,由于每个神经元都需要乘以这个导数,梯度值将逐渐变得非常小,甚至可以达到接近于0的程度。

就是说不改变或者无法改变了

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值