当前位置:网站首页>4.深度学习的几何解释与梯度的优化
4.深度学习的几何解释与梯度的优化
2022-08-03 04:05:00 【好名字能更容易让朋友记住】
深度学习的几何解释与梯度优化
深度学习的几何解释
神经网络完全由一系列张量运算组成,而这些张量运算都只是输入数据的几何变换。神经网络可以解释为高维空间中非常复杂的几何变换,这种变换可以通过许多简单的步骤来实现。
可以用以下来举例:
一张红纸,一张蓝纸。将其中一张放在另一张上。将两张绘制一起揉成小球。这个纸球就是你输入的一个数据,每张纸对应于分类问题中的一个类别。神经网络(或者任何机器学习模型)要做的就是找到可以让纸球恢复平整的变换,从而能够再次让两个类别明确可分。通过深度学习,这一过程可以用三维空间中一系列简单的变换来实现,比如你用手指对纸球做的变换,每次做一个动作。
让纸球恢复平整就是机器学习的内容:为复杂的、高度折叠的数据流行找到简洁的表示。机器学习将复杂的几何变换逐步分解为一长串基本的集合变化,这与人类展开纸球所采取的策略大致相同。深度网络的每一层都通过变换使数据解开一点点——许多层堆叠在一起,可以实现非常复杂的解开过程。
基于梯度的优化
再第一个神经网络示例中,每个神经层都用下述方法对输入数据进行变换
output = relu(dot(W, input) + b )
再表达式中,W和b都是张量,均为该层的属性。**它们被称为该层的权重或可训练参数,**分别对应 kernel 和 bias 属性。
- 一开始,这些权重矩阵取较小的随机值,这一步叫做随机初始化。当然,W 和 b 都是随机的,relu(dot(W, input)+ b)肯定不会得到任何有用的表示。虽然得到的表示是没有意义的,但这是一个起点。
- 下一步则是根据反馈信号逐渐调节这些权重。这个逐渐调节的过程叫做训练,也就是机器学习中的学习。
上述过程发生在一个**训练循环(training loop)**中,具体过程如下(必要时一直重复这些步骤):
- 抽取训练样本 x 和对应目标 y 组成的数据批量。
- 在 x 上运行网络 [ 这一步叫作前向传播(forward pass)],得到预估值 y_pared。
- 计算网络在这批数据上的损失,用于衡量 y_pred 和 y 之间的距离。
- 更新网络的所有权重,使网络在这批数据上的损失略微下降。
最终得到的网络在训练数据上的损失非常小,即预测值 y_pred 和预期目标y之间的距离非常小。网络“学会”将输入映射到正确的目标。
如何判断网络中的权重系数是否为增大还是减小?
保持网络中的其他权重不变,只考虑某个标量系数,让其尝试不同的取值。假设 这个系数的初始值为0.3。对一批数据做完前向传播后,网络在这批数据上的损失是0.5。如果将这个系数的值改为0.35并重新运行前向传播后,损失会增大到0.6。但如果修改系数为0.25,损失会减少到0.4。
在这个例子里,系数减小0.05有利于损失最小化。对于网络中的所有系数都要重复这个过程。以上这种方法是低效的,有一种更好的方法:
利用网络中所有运算都是可微的这一事实,计算损失相对于网络系数的梯度,然后向梯度的反方向改变系数,从而使损失降低。
张量运算的导数——梯度
梯度(gradient)是张量运算的导数。它是倒数这一概念向多元函数导数的推广。多元函数是以张量作为输入的函数。
假设有一个输入向量 x、一个矩阵 W、一个目标y和一个损失函数 loss。你可以用 W来计算预测值 y_pred,然后计算损失,或者说预测值 y_pred 和目标 y 之间的距离。
y_pred = dot(W, x) loss_value = loss(y_pred, y) 如果输入数据 x 和 y 保持不变,那么这可以看作将W映射到损失值的函数。 loss_value = f(W)
假设 W 的当前值为 W0。f 在 W0 点的导数是一个张量 gradient(f)(W0) ,其形状为W相同,每个系数gradient(f)(W0)[i, j] 表示改变 W0[i, j] 时 loss_value 变化的方向和大小。张量gradient(f) (W0)是函数 f(W) = loss_value 在 W0 的导数。
gradient(f)(W0) 也可以看作表示f(W) 在 W0 附近曲率的张量。
随机梯度下降
给定一个可微函数,理论上可以使用解析法找到它的最小值:函数的最小值是导数为0的点,因此只需要找到所有导数为0的点,然后计算函数在其中哪个点具有最小值。
这一方法同样适用于神经网络,就是用解析法求出最小损失函数对应的所有权重值。可以通过方程 gradient(f)(W) = 0 求解W来实现这一方法。这是包含N个变量的多项式方程,其中N表示网络中系数的个数。实际中神经网络是无法求解的,因为参数的个数不会少于几千个,而且经常有上千万个。
此时,可以使用训练循环:基于当前在随机数据批量上的损失,一点点的对参数进行调节。由于处理的是一个可微函数,可以计算出它的梯度,从而有效地实现第四步。沿着梯度反方向更新权重,损失每次都会变小一点。
- 抽取训练样本 x 和对应目标 y 组成的数据批量。
- 在 x 上运行网络,得到预测值 y_pred。
- 计算网络在这批数据上的损失,用于衡量 y_pred 和 y 之间的距离。
- 计算损失相对于网络参数的梯度 [ 一次反向传播(backward pass) ]。
- 将参数沿着梯度的单方向移动一点,比如 W -= step * gradient,从而使这批数据上损失减小一点。
以上方法叫做 **小批量随机梯度下降(mini-batch stochastic gradient descent,又称为小批量SGD)。**值得注意的是 step(步长,也叫做学习率(learning rate)因子选取合适的值也是很重要的。
小批量SGD算法的一个变体是每次迭代时只抽取一个样本和目标,而不是抽取一批数据。这叫作真SGD(有别于小批量SGD)。还有另一种极端,每一次迭代都在所有数据上运行,这叫做批量SGD。这样做的话,每次更新都更加准确,但计算代价也高得多。这两个极端之间的有效折中则是选择合理的批量大小。
此外,SGD还有多种变体,其区别在于计算下一次权重更新还要考虑上一次权重更新,而不是仅仅考虑当前梯度,比如带动量的SGD、Adagrad、RMSProp等变体。这些变体被称为优化方法和优化器。其中动量的概念在许多变体中都有应用。动量解决了SGD的两个问题:收敛速度和局部极小点
如上图所示,如果位于局部极小点:在这个位置无论向左移动还是向右移动都会导致损失值增大。如果使用小学习率的SGD进行优化,那么优化过程可能会陷入局部极小点,而无法找到全局最小点。
使用动量方法可以解决这个问题
想象一个小球从损失函数曲线上滚下来。如果小球的动量足够大,那么他不会卡在局部极小点,最终会达到全局最小点。
动量方法的实现:每一步都移动小球,不仅考虑当前的卸率(加速度),还考虑当前的速度(来自于加速度)。类比于神经网络,更新参数 w 不仅要考虑当前的梯度值,还要考虑上一次的参数更新,其简单实现如下:
past_velocity = 0 # 不变的动量因子 momentum = 0.1 # 优化循环 while loss > 0.01: w, loss, gradient = get_current_parameters() # learning_rate 学习率,即步长 velocity = past_velocity * momentum - learning_rate * gradient w = w + momentum * velocity - learning_rate * gradient past_velocity = velocity update_parameter(w)
链式求导:反向传播算法
在实践中,神经网络函数包含许多连接在一起的张量运算,每个运算都有简单的、一致的导数。例如,下面这个网络 f 包含3个张量运算 a、b 和 c,还有3个权重矩阵 W1、W2 和 W3。
f(W1,W2,W3) = a(W1,b(W2,c(W3)))
、b 和 c,还有3个权重矩阵 W1、W2 和 W3。
f(W1,W2,W3) = a(W1,b(W2,c(W3)))
这种函数链可以利用链式法则: (f(g(x)))’ = f’(g(x)) * g’(x) 。将链式法则应用于神经网络梯度值的计算,得到的算法叫做反向传播(有时也叫做反式积分)。反向传播从最终损失值开始,从最顶层反向作用至最底层,利用链式法则计算每个参数对损失值的贡献大小。
边栏推荐
猜你喜欢
随机推荐
DC-5靶场下载及渗透实战详细过程(DC靶场系列)
单元测试是什么?怎么写?主要测试什么?
MySQL【约束】
StarRocks 7 月社区动态
道通转债,微芯转债,博22转债上市价格预测
基于flowable的upp(统一流程平台)运行性能优化(3)
Auto. Js scripts run time calculated Pro
积分商城可设置的四种兑换商品类型
ESP8266-Arduino编程实例-MCP3008-ADC转换器驱动
ESP8266-Arduino编程实例-MAX6675冷端补偿K热电偶数字转换器驱动
电子设备行业智能供应链系统:打破传统供应链壁垒,提升电子设备企业管理效能
我将GuiLite移植到了STM32F4开发板上
OpenFOAM提取等职面并计算面积
ESP8266-Arduino编程实例-LED点阵驱动(基于Max7219)
shell之条件语句(条件测试、if语句,case语句)
v-text指令:设置标签内容
Linux-Docker-Redis安装
ScanNet数据集讲解与点云数据下载
【动态规划--01背包】HJ16 购物单
Pro * C Jin Cang database migration guide (4) KingbaseES Pro * C migration guide)