神经网络训练:超参数、优化算法与梯度计算
立即解锁
发布时间: 2025-08-31 00:05:10 阅读量: 10 订阅数: 21 AIGC 

### 神经网络训练:超参数、优化算法与梯度计算
#### 1. 训练算法超参数
训练算法的超参数包括学习算法、批量大小、学习率调度和动量系数等。这些超参数直接影响最终模型的性能,但与模型参数不同。选择这些超参数更多是一门艺术而非科学,常见的做法是使用不同的超参数训练多个模型,然后选择性能最好的那个,这被称为超参数搜索。
#### 2. 模型训练概述
模型训练的目标是找到使损失函数 $L[\phi]$ 最小的参数 $\phi$。梯度下降法通过测量当前参数下损失函数的梯度(即参数微小变化时损失的变化情况),然后朝着损失下降最快的方向移动参数,重复这个过程直到收敛。
对于非线性函数,损失函数可能存在局部最小值(梯度下降可能会陷入其中)和鞍点(梯度下降可能看似收敛但实际上没有)。随机梯度下降(SGD)有助于缓解这些问题,它在每次迭代时使用不同的随机数据子集(批量)来计算梯度,增加了过程的噪声,防止算法陷入参数空间的次优区域,同时每次迭代的计算成本也更低。添加动量项可以使收敛更高效,此外还介绍了 Adam 算法。
#### 3. 优化算法
- **梯度下降**:由 Cauchy 在 1847 年发明,固定步长的梯度下降效率较低,因为移动距离完全取决于梯度的大小。在函数变化快时移动距离长(可能需要更谨慎),在函数变化慢时移动距离短(可能需要进一步探索)。因此,梯度下降方法通常与线搜索过程结合使用,例如括号法。
- **随机梯度下降**:至少可以追溯到 Robbins & Monro 在 1951 年的工作。SGD 的学习率趋于零时的极限是一个随机微分方程,学习率与批量大小的比率与找到的最小值的宽度有关,较宽的最小值更可取。
- **随机方差减少下降**:是梯度下降和随机梯度下降的现代折中方法,由 Johnson & Zhang 在 2013 年提出,定期计算完整梯度,并穿插随机更新。
| 算法名称 | 发明时间 | 特点 |
| ---- | ---- | ---- |
| 梯度下降 | 1847 年 | 固定步长效率低,常结合线搜索 |
| 随机梯度下降 | 至少 1951 年 | 每次迭代使用随机子集,缓解局部最小和鞍点问题 |
| 随机方差减少下降 | 2013 年 | 定期计算完整梯度,穿插随机更新 |
#### 4. 凸性、最小值和鞍点
一个函数是凸的,如果连接曲面上任意两点的弦都位于函数上方且不相交。可以通过考虑 Hessian 矩阵(二阶导数矩阵)来代数测试:
\[
H[\phi] =
\begin{bmatrix}
\frac{\partial^2 L}{\partial \phi_0^2} & \frac{\partial^2 L}{\partial \phi_0 \partial \phi_1} & \cdots & \frac{\partial^2 L}{\partial \phi_0 \partial \phi_N} \\
\frac{\partial^2 L}{\partial \phi_1 \partial \phi_0} & \frac{\partial^2 L}{\partial \phi_1^2} & \cdots & \frac{\partial^2 L}{\partial \phi_1 \partial \phi_N} \\
\vdots & \vdots & \ddots & \vdots \\
\frac{\partial^2 L}{\partial \phi_N \partial \phi_0} & \frac{\partial^2 L}{\partial \phi_N \partial \phi_1} & \cdots & \frac{\partial^2 L}{\partial \phi_N^2}
\end{bmatrix}
\]
如果 Hessian 矩阵对于所有可能的参数值都是正定的(具有正特征值),则函数是凸的,损失函数看起来像一个光滑的碗,训练相对容易,只有一个全局最小值,没有局部最小值或鞍点。
在梯度为零的地方,Hessian 矩阵的特征值可以将该位置分类为:
- 最小值:所有特征值为正。
- 最大值:所有特征值为负。
- 鞍点:正特征值对应局部最小方向,负特征值对应局部最大方向。
#### 5. 线搜索
固定步长的梯度下降效率低下,因此通常与线搜索过程结合使用,以尝试找到最优步长。一种方法是括号法,其流程如下:
```mermaid
graph TD;
A[当前解位于位置 a,搜索区域 [a, d]] --> B[定义内部点 b, c 并评估损失函数];
B --> C{L[b] > L[c]?};
C -- 是 --> D[消除范围 [a, b]];
C -- 否 --> E[消除范围 [c, d]];
D --> F[重复上述过程直到最小值被紧密
```
0
0
复制全文
相关推荐










