当前位置:网站首页>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) 。将链式法则应用于神经网络梯度值的计算,得到的算法叫做反向传播(有时也叫做反式积分)。反向传播从最终损失值开始,从最顶层反向作用至最底层,利用链式法则计算每个参数对损失值的贡献大小。
边栏推荐
猜你喜欢
随机推荐
online test paper concept
How many moments have you experienced the collapse of electronic engineers?
工程水文学知识点
ESP8266-Arduino编程实例-MAX6675冷端补偿K热电偶数字转换器驱动
寄存器(内存访问)
C# WPF设备监控软件(经典)-上篇
这个困扰程序员50年的问题,终于要被解决了?
正则表达式与绕过案例
(一)Nacos注册中心集群环境搭建
vscode hide activity bar
Jincang Database Pro*C Migration Guide (3. KingbaseES Pr*oc Compatibility with Oracle Pro*c)
AF-DNAT
Pro * C Jin Cang database migration guide (4) KingbaseES Pro * C migration guide)
Auto.js Pro write the first script hello world
Have bosses know date field flinksql is synchronized to the use of the null on how to deal with
多线程使用哈希表
OpenFOAM提取等职面并计算面积
中原银行实时风控体系建设实践
Chapter 8 Character Input Output and Input Validation
Mysql如何建立索引实现语句优化