深度学习--入门
可供学习,具体章节也有对应推荐文章
dive into deep learning
从反向传播推导到梯度消失and爆炸的原因及解决方案
最全面的 深度学习 笔记
Activation Functions — All You Need To Know!
因为时间有限且水平不够,搜集优秀文章链接加速学习进度
特征缩放
归一化 (Normalization)、标准化 (Standardization)和中心/零均值化 (Zero-centered)
欠拟合和过拟合
权重衰减(weight decay)
在训练神经网络时,对模型参数(权重)施加惩罚,使参数趋向于较小的数值,防止过拟合。
通常使用L2正则化:
$$
\mathcal{L}{total} = \mathcal{L}{原始} + \lambda \sum_{i} w_i^2
$$
岭回归(ridge regression)算法:
$$
\min_w \sum_{j=1}^n (y_j - x_j^T w)^2 + \lambda |w|_2^2
$$
- 这里,(\sum (y_j - x_j^T w)^2) 是普通最小二乘误差,
- (\lambda |w|_2^2) 是L2正则项,控制参数大小。
L1正则化线性回归是统计学中类似的基本模型,
$$
\mathcal{L}{total} = \mathcal{L}{原始} + \lambda \sum_i |w_i|
$$
套索回归(lasso regression):
$$
\min_w \sum_{j=1}^n (y_j - x_j^T w)^2 + \lambda |w|_1
$$
暂退法(Dropout)
前提概要
线性模型泛化的可靠性是有代价的。 对于每个特征,线性模型必须指定正的或负的权重,而忽略其他特征。
泛化性和灵活性之间的这种基本权衡被描述为偏差-方差权衡(bias-variance tradeoff)。 线性模型有很高的偏差:它们只能表示一小类函数。
与线性模型不同,神经网络并不局限于单独查看每个特征,而是学习特征之间的交互。
定义
暂退法是正则化的一种,正则化防止模型过拟合。以一定概率随机“丢弃”(即暂时关闭)神经网络中的部分神经元降低神经元之间的复杂共适应关系。
什么是一个“好”的预测模型
能在未知的数据上有很好的表现。
平滑性,即函数不应该对其输入的微小变化敏感。
在计算后续层之前向网络的每一层注入噪声。因为当训练一个有多层的深层网络时,注入噪声只会在输入-输出映射上增强平滑性。
这个想法被称为暂退法(dropout)。
暂退法在前向传播过程中,计算每一内部层的同时注入噪声。
根据此模型的设计,其期望值保持不变。
在标准暂退法(Dropout)中,设丢弃概率为 $p$,则对于每个中间激活值 $h_i$,定义随机变量:
$$
h_i’ = \begin{cases}
0, & \text{概率为 } p \
\frac{h_i}{1 - p}, & \text{概率为 } 1 - p
\end{cases}
$$
其中,$h_i’$ 表示经过 Dropout 处理后的激活值。
这样设计的目的是保证 期望保持不变:
$$
\begin{aligned}
E[h_i’] &= E[h_i \times Z] = h_i \times E[Z] = h_i \times \left(0 \times p + \frac{1}{1-p} \times (1-p)\right) \
&= h_i
\end{aligned}
$$
因此,训练过程中通过随机丢弃节点,并对保留的节点按比例放大,消除了 Dropout 带来的偏差,测试时则直接使用完整的网络输出,无需缩放。
前向传播
前向传播(forward propagation或forward pass) 指的是:按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。
本人早期的错误理解字多不想删
有人可能疑惑前向传播留下的记录点为什么能对反向传播进行指导,一旦根据记录点进行梯度下降那么必然会偏离原有路径个人理解:正向传播的路径点记录了最大梯度处,哪怕反向传播路径变了也必须往对应方向变化这是必须的,哪怕这个方向实际梯度上升也要前进,必须遵守前向传播梯度方向的约束,因为是追求一个全局趋势,(其实这样真的就对吗我也无法确认,因为可能对应的不是同一个局部最小点),总之保证训练稳定性和最终收敛,避免失去梯度指导造成训练失败一个模糊的举例,我们要修一条栈道,沿着指定路径登珠穆朗玛峰并在每一定高度处留下全景摄像头作标记,抵达山顶后(即终点),由于物资匮乏原路返回消耗太大了,我们的需求不是回到原点而是早日到达地面(总所周知珠穆朗玛峰山脚都是村庄而且都栈道了入口哪里无所谓了越短越省钱),于是我们一步步查看等高的摄像头附件的景色,发现沿着西北方是向下的,虽然我们里摄像头很远,但是我们知道往那个方向走最终下降,说好听是趋势,说难听就是别的地方没办法看实在不知道怎么走了,自己管自己走没东西背锅,只好往那边去,哪怕要爬坡也只能安慰自己起码终点是比摄像头海拔低(虽然可能就局部最优骗人的,但是也只能被骗了没地图)即使这条信息最终引导我们误入歧途,它仍然是我们当前所能依赖的、唯一的方向指引。
正确理解
有人可能疑惑前向传播留下的记录点为什么能对反向传播进行指导,一旦根据记录点进行梯度下降那么必然会偏离原有路径。
个人理解(修正后):前向传播过程中保存的是每层的输入值、线性变换结果(如 $z = Wx + b$)和激活值(如 $a = \text{ReLU}(z)$),而非“路径点”或“方向标记”。这些中间变量是反向传播计算梯度时必需的数据支持。
反向传播结合链式法则,利用前向传播保存的中间变量,动态计算当前参数下损失函数的梯度方向。参数更新后,下一次前向传播会重新计算所有中间变量,旧的“路径”被覆盖,因此不存在“偏离原有路径”的问题。
梯度代表当前参数和输入下的局部最速下降方向,前向传播本身不预设优化方向。即使梯度更新导致损失短期上升,也多因学习率设置或优化算法问题,而非前向传播“误导”。
我们修一条栈道登珠穆朗玛峰,每隔一定高度放置一个摄像头,记录当时地形和环境(类似前向传播保存的中间变量)。登顶后,由于资源有限不能原路返回,只能根据各摄像头记录的地形信息,结合数学工具(对应反向传播的链式法则)实时计算下山最陡方向。
这方向是动态计算的,非固定不变。即使最终可能通向局部低谷,也不是摄像头“预设”的误导,而是我们依据当前信息做出的最佳判断。每走一步,地形和情况都会变化,需要重新观察和计算,旧路径信息随之更新。
总结:前向传播提供的是计算梯度的“地形数据”,反向传播用这些数据动态计算“下山方向”。训练过程中,模型根据最新参数和数据,实时调整方向,从而保证训练稳定和最终收敛。
反向传播
该方法根据微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络。
梯度消失和梯度爆炸
不稳定梯度带来的风险不止在于数值表示; 不稳定梯度也威胁到我们优化算法的稳定性。 我们可能面临一些问题。 要么是梯度爆炸(gradient exploding)问题: 参数更新过大,破坏了模型的稳定收敛; 要么是梯度消失(gradient vanishing)问题: 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。
当sigmoid函数的输入很大或是很小时,它的梯度都会消失。 此外,当反向传播通过许多层时,除非我们在刚刚好的地方, 这些地方sigmoid函数的输入接近于零,否则整个乘积的梯度可能会消失。
初始化
Xavier初始化
Xavier初始化是一种权重初始化方法,旨在解决深层神经网络训练中梯度消失或爆炸的问题。它通过合理设置每层权重的初始分布,保证信号在前向传播和反向传播过程中不会被放大或缩小过多,从而帮助训练更稳定、更快收敛。