深度学习基础(编写ing)
本篇主要参考了李牧的dive into deep learning和其他一些零散资料。
内容为思路梳理,并于一些细节处补充想法,或有和机器学习重复的地方为了连贯决定保留
线性神经网络
线性回归
回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。
线性回归模型的数学定义
设有 $n$ 个观测样本,每个样本有 $p$ 个特征,自变量矩阵记为 $X \in \mathbb{R}^{n \times p}$,响应变量为 $y \in \mathbb{R}^n$。
线性回归模型的形式为:
$$
y = X \mathbf{w} + \varepsilon
$$
其中:
- $y = [y_1, y_2, \dots, y_n]^\top$:因变量(目标变量)
- $X$:自变量矩阵,每行 $x_i \in \mathbb{R}^p$ 是一个样本的特征向量
- $\mathbf{w} \in \mathbb{R}^p$:模型参数(权重向量)
- $\varepsilon \in \mathbb{R}^n$:随机误差项
线性回归的经典假设(Gauss–Markov 假设)
线性性(Linearity)
模型在参数 $\mathbf{w}$ 上是线性的:
$$
y_i = w_0 + w_1 x_{i1} + \cdots + w_p x_{ip} + \varepsilon_i
$$独立性(Independence)
所有误差项 $\varepsilon_i$ 相互独立。
对时间序列尤需注意,不能有自相关。同方差性(Homoscedasticity)
不论样本值大小、位置如何,模型预测的误差波动程度是一样的。保证模型的参数估计是最小方差无偏估计(BLUE)。所有误差项具有相同方差:
$$
\operatorname{Var}(\varepsilon_i) = \sigma^2, \quad \forall i
$$
假设“同方差”是为了让最小二乘法的推导成立,简化数学模型,“暂时假设” 所有观测的误差波动一致。
正因为所有点的误差方差都一样,可以视作具有相同可信度的观测,故损失函数就是最小二乘法的平方误差,它的最优解可以直接通过正规方程一次求解(解析解)。误差期望为零(Unbiased Errors)
模型在平均意义上没有系统偏差,残差左右波动是“平衡的”,确保模型预测不会“整体偏高”或“整体偏低”,且参数 $\mathbf{w}$ 的估计是无偏的:
$$
\mathbb{E}[\varepsilon_i] = 0, \quad \forall i
$$无完全多重共线性(No Perfect Multicollinearity)
自变量矩阵 $X$ 的列向量线性无关,即:
$$
X^\top X \text{ 可逆(即满秩)}
$$误差正态分布(Normality of Errors)
若希望进行置信区间、$t$ 检验等统计推断,需假设误差项服从正态分布:
$$
\varepsilon_i \sim \mathcal{N}(0, \sigma^2)
$$注意:这不是最小二乘解存在的必要条件,但用于计算置信区间、$p$ 值等推断指标时是前提条件。
损失函数
由于平方误差函数中的二次方项,估计值和观测值之间较大的差异将导致更大的损失。为了度量模型在整个数据集上的质量,我们需计算在训练集 $n$ 个样本上的损失均值(也等价于求和)。
$$
L(\mathbf{w}, b) = \frac{1}{n} \sum_{i=1}^n l^{(i)}(\mathbf{w}, b)
= \frac{1}{n} \sum_{i=1}^n \frac{1}{2} \left( \mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)} \right)^2.
$$
正态分布(normal distribution),即高斯分布(Gaussian distribution)
通过对噪声分布的假设来解读平方损失目标函数。
均方误差损失函数(简称均方损失)可以用于线性回归的一个假设是:观测中包含噪声,且噪声服从正态分布。
标准正态分布(均值为 0,方差为 1)密度函数:
$$
f(x) = \frac{1}{\sqrt{2 \pi}} e^{-\frac{x^2}{2}}
$$
一般形式,正态分布概率密度函数(均值为 $\mu$,方差为 $\sigma^2$)的密度函数:
$$
f(x) = \frac{1}{\sqrt{2 \pi \sigma^2}} e^{-\frac{(x - \mu)^2}{2 \sigma^2}}
$$
均方误差损失函数(简称均方损失)
神经网络图
对于线性回归,每个输入都与每个输出相连,这种变换称为全连接层(fully-connected layer)或称为稠密层(dense layer)
softmax 回归(softmax regression)
logistic 回归的一般形式,用于多分类。softmax回归是一个单层神经网络,只有输入到输出的直接映射。
[
\text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^N e^{z_j}}
]
- ( z_i ):第 ( i ) 个类别的 logit(未归一化的分数)。
- ( e^{z_i} ):对 logit 取指数,放大差异并确保非负。
- ( \sum_{j=1}^N e^{z_j} ):归一化因子,确保输出概率和为 1。
多层感知机(MLP, Multi-Layer Perceptron)
隐藏层
线性意味着单调假设: 任何特征的线性变化都会导致模型输出对应的线性变化,难以通过简单的预处理来解决个问题。
可以通过在网络中加入一个或多个隐藏层来克服线性模型的限制, 使其能处理更普遍的函数关系类型。
如果隐藏层只做仿射变换,且没有任何非线性激活函数,模型的表现并不会比简单的线性模型好。因为仿射函数的组合本质上还是一个仿射函数,多个仿射函数相叠加依然是仿射函数。因此,如果模型只用仿射函数,实际上不会增加模型的表达能力,效果和简单的线性模型没有区别。
隐藏层的作用在于添加非线性激活函数。只有在每个层使用非线性激活函数(如 ReLU、Sigmoid 等)后,神经网络才能变得更复杂,能够表示复杂的映射关系。否则,即使有多层,神经网络也只能表示线性变换。
通用近似定理
一个含有至少一个隐藏层的前馈神经网络(如 MLP),只要有足够多的神经元和适当的激活函数(如 Sigmoid 或 ReLU),它就能够近似任意连续的函数。
激活函数(activation function)
ReLU函数/修正线性单元(Rectified Linear Unit)
只需要比较输入是否小于 0,非常高效。
[
\text{ReLU}(x) = \max(0, x)
]
分段线性也是非线性。
当输入为负时,ReLU函数的导数为0,而当输入为正时,ReLU函数的导数为1。使用ReLU的原因是,它求导表现得特别好:要么让参数消失,要么让参数通过。 这使得优化表现得更好,并且ReLU减轻了困扰以往神经网络的梯度消失问题。
sigmoid函数/挤压函数(squashing function)
当输入接近0时,sigmoid函数接近线性变换。
[
\text{sigmoid}(x) = \frac{1}{1 + e^{-x}}
]
将输出视作二元分类问题的概率时, sigmoid仍然被广泛用作输出单元上的激活函数。
tanh函数/双曲正切
输入在0附近时,tanh函数接近线性变换。形状类似于sigmoid函数, 不同的是tanh函数关于坐标系原点中心对称。
原始公式:
[
\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
]
等价变形:
[
\tanh(x) = \frac{1 - e^{-2x}}{1 + e^{-2x}}
]
两种形式完全等价,后者常用于数值计算中,更稳定。
欠拟合和过拟合
权重衰减(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)
\end{aligned}=h_i
]
因此,训练过程中通过随机丢弃节点,并对保留的节点按比例放大,消除了 Dropout 带来的偏差,测试时则直接使用完整的网络输出,无需缩放。
前向传播
前向传播(forward propagation或forward pass) 指的是:按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。
本人早期的错误理解字多不想删
有人可能疑惑前向传播留下的记录点为什么能对反向传播进行指导,一旦根据记录点进行梯度下降那么必然会偏离原有路径个人理解:正向传播的路径点记录了最大梯度处,哪怕反向传播路径变了也必须往对应方向变化这是必须的,哪怕这个方向实际梯度上升也要前进,必须遵守前向传播梯度方向的约束,因为是追求一个全局趋势,(其实这样真的就对吗我也无法确认,因为可能对应的不是同一个局部最小点),总之保证训练稳定性和最终收敛,避免失去梯度指导造成训练失败一个模糊的举例,我们要修一条栈道,沿着指定路径登珠穆朗玛峰并在每一定高度处留下全景摄像头作标记,抵达山顶后(即终点),由于物资匮乏原路返回消耗太大了,我们的需求不是回到原点而是早日到达地面(总所周知珠穆朗玛峰山脚都是村庄而且都栈道了入口哪里无所谓了越短越省钱),于是我们一步步查看等高的摄像头附件的景色,发现沿着西北方是向下的,虽然我们里摄像头很远,但是我们知道往那个方向走最终下降,说好听是趋势,说难听就是别的地方没办法看实在不知道怎么走了,自己管自己走没东西背锅,只好往那边去,哪怕要爬坡也只能安慰自己起码终点是比摄像头海拔低(虽然可能就局部最优骗人的,但是也只能被骗了没地图)即使这条信息最终引导我们误入歧途,它仍然是我们当前所能依赖的、唯一的方向指引。
正确理解
有人可能疑惑前向传播留下的记录点为什么能对反向传播进行指导,一旦根据记录点进行梯度下降那么必然会偏离原有路径。
个人理解(修正后):前向传播过程中保存的是每层的输入值、线性变换结果(如 ( z = Wx + b ))和激活值(如 ( a = \text{ReLU}(z) )),而非“路径点”或“方向标记”。这些中间变量是反向传播计算梯度时必需的数据支持。
反向传播结合链式法则,利用前向传播保存的中间变量,动态计算当前参数下损失函数的梯度方向。参数更新后,下一次前向传播会重新计算所有中间变量,旧的“路径”被覆盖,因此不存在“偏离原有路径”的问题。
梯度代表当前参数和输入下的局部最速下降方向,前向传播本身不预设优化方向。即使梯度更新导致损失短期上升,也多因学习率设置或优化算法问题,而非前向传播“误导”。
我们修一条栈道登珠穆朗玛峰,每隔一定高度放置一个摄像头,记录当时地形和环境(类似前向传播保存的中间变量)。登顶后,由于资源有限不能原路返回,只能根据各摄像头记录的地形信息,结合数学工具(对应反向传播的链式法则)实时计算下山最陡方向。
这方向是动态计算的,非固定不变。即使最终可能通向局部低谷,也不是摄像头“预设”的误导,而是我们依据当前信息做出的最佳判断。每走一步,地形和情况都会变化,需要重新观察和计算,旧路径信息随之更新。
总结:前向传播提供的是计算梯度的“地形数据”,反向传播用这些数据动态计算“下山方向”。训练过程中,模型根据最新参数和数据,实时调整方向,从而保证训练稳定和最终收敛。
反向传播
该方法根据微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络。
梯度消失和梯度爆炸
不稳定梯度带来的风险不止在于数值表示; 不稳定梯度也威胁到我们优化算法的稳定性。 我们可能面临一些问题。 要么是梯度爆炸(gradient exploding)问题: 参数更新过大,破坏了模型的稳定收敛; 要么是梯度消失(gradient vanishing)问题: 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。
当sigmoid函数的输入很大或是很小时,它的梯度都会消失。 此外,当反向传播通过许多层时,除非我们在刚刚好的地方, 这些地方sigmoid函数的输入接近于零,否则整个乘积的梯度可能会消失。
初始化
Xavier初始化
Xavier初始化是一种权重初始化方法,旨在解决深层神经网络训练中梯度消失或爆炸的问题。它通过合理设置每层权重的初始分布,保证信号在前向传播和反向传播过程中不会被放大或缩小过多,从而帮助训练更稳定、更快收敛。
深度学习计算(公式居多先放着)
块(block)可以描述单个层、由多个层组成的组件或整个模型本身。
卷积神经网络(convolutional neural network,CNN)
将空间不变性(spatial invariance)的这一概念系统化,从而基于这个模型使用较少的参数来学习有用的表示。
- 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。
- 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。
平移不变性(translation invariance)
现在引用上述的第一个原则:平移不变性。
这意味着检测对象在输入 (\mathbf{X}) 中的平移,应该仅导致隐藏表示 (\mathbf{H}) 中的平移。
也就是说,(\mathbf{V}) 和 (\mathbf{U}) 实际上不依赖于 (X(i,j)) 的位置,即
[
V_{i,j,a,b} = V_{a,b}.
]
并且 (\mathbf{U}) 是一个常数,比如 (u)。
因此,我们可以简化 (\mathbf{H}) 定义为:
[
[H]{i,j} = u + \sum_a \sum_b [V]{a,b} [X]_{i+a, j+b}.
]
这就是卷积(convolution)。
我们使用系数 ([V]{a,b}) 对位置 ((i,j)) 附近的像素 ([X]{i+a,j+b}) 进行加权得到 ([H]_{i,j})。
注意,([V]{a,b}) 的系数比 ([V]{i,j,a,b}) 少很多,因为前者不再依赖于图像中的位置。这是显著的进步!
局部性(locality)
引用上述的第二个原则:局部性。
如上所述,为了收集用来训练参数 ([H]_{i,j}) 的相关信息,我们不应偏离到距 ((i,j)) 很远的地方。这意味着在
[
|a| > \Delta \quad \text{或} \quad |b| > \Delta
]
的范围之外,我们可以设置
[
[V]_{a,b} = 0.
]
因此,我们可以将 ([H]_{i,j}) 重写为:
[
[H]{i,j} = u + \sum{a=-\Delta}^{\Delta} \sum_{b=-\Delta}^{\Delta} [V]{a,b} [X]{i+a, j+b}.
]
简而言之, 是一个卷积层(convolutional layer),而卷积神经网络是包含卷积层的一类特殊神经网络。在深度学习研究社区中,(V) 被称为卷积核(convolution kernel)或者滤波器(filter),亦或简单称为该卷积层的权重,通常是可学习的参数。
当图像处理的局部区域很小时,卷积神经网络与多层感知机的训练差异可能巨大:以前多层感知机可能需要数十亿个参数来表示网络中的一层,而现在卷积神经网络通常只需几百个参数,而且不需要改变输入或隐藏表示的维数。
参数大幅减少的代价是,我们的特征现在是平移不变的,并且每个隐藏活性值确定时,每层只包含局部信息。以上所有权重学习都依赖归纳偏置。当偏置与现实相符时,我们能得到样本有效的模型,并能很好泛化;若偏置与现实不符(比如图像不满足平移不变性),模型可能难以拟合训练数据。
卷积
在进一步讨论前,先简要回顾为什么该操作称为卷积。
数学中,两个函数(比如 (f, g: \mathbb{R}^d \to \mathbb{R}))的卷积定义为:
[
(f * g)(\mathbf{x}) = \int f(\mathbf{z}) , g(\mathbf{x} - \mathbf{z}) , d\mathbf{z}.
]
也就是说,卷积是在把一个函数“翻转”并平移 (\mathbf{x}) 时,测量 (f) 和 (g) 之间的重叠。
离散情况下,积分变成求和。例如,对于索引为 (\mathbb{Z}) 的平方可和无限维向量,我们有:
[
(f * g)(i) = \sum_a f(a) , g(i - a).
]
二维张量的卷积定义为:
[
(f * g)(i,j) = \sum_a \sum_b f(a,b) , g(i - a, j - b).
]
这看起来类似于
[
Y_{i,j} = \sum_{a,b} W_{a,b} , X_{i+a, j+b},
]
但有个主要区别:这里用的是索引差值 ((i - a, j - b)),而不是 ((i + a, j + b))。
这种区别是表面的。
我们在 中的定义更准确地描述了互相关(cross-correlation)
通道
这种方法有一个问题:我们忽略了图像一般包含三个通道(红、绿、蓝)。
实际上,图像是一个三维张量,比如尺寸为 (1024 \times 1024 \times 3),其中前两个轴是空间位置,第三个轴是颜色通道。
因此,将张量 (X) 索引为:
[
X[i,j,k].
]
对应地,卷积权重张量扩展为四维:
[
V[a,b,c,d].
]
此外,输入图像是三维的,隐藏表示 (H) 也最好用三维张量表示:对每个空间位置采用一组隐藏表示(多个通道)。可以把隐藏表示想象为多个二维张量堆叠而成的通道(channel),也称为特征映射(feature maps)。
直观上,底层通道可能专注于边缘检测,其他通道检测纹理等。
多通道卷积层可表示为:
[
H[i,j,d] = \sum_{a=-\Delta}^\Delta \sum_{b=-\Delta}^\Delta \sum_c V[a,b,c,d] \cdot X[i+a,j+b,c].
]
其中隐藏表示 (H) 中的索引 (d) 是输出通道,输出继续作为三维张量输入下一卷积层。
定义了多通道卷积层,(V) 是该层权重。
互相关运算
严格来说,卷积层是个错误的叫法,因为它所表达的运算其实是互相关运算(cross-correlation),而不是卷积运算。
循环神经网络(recurrent neural network,RNN)
到目前为止我们默认数据都来自于某种分布, 并且所有样本都是独立同分布的 (independently and identically distributed,i.i.d.)。 然而,大多数的数据并非如此。
如果说卷积神经网络可以有效地处理空间信息,那么循环神经网络则可以更好地处理序列信息。 循环神经网络通过引入状态变量存储过去的信息和当前的输入,从而可以确定当前的输出。
自回归模型
维度 | 自回归模型(AR) | 隐变量自回归模型(Latent AR) |
---|---|---|
是否含隐变量 | 否 | 是,隐变量为概率意义上的状态 |
数据依赖 | 仅自身历史数据 | 依赖历史观测 + 推断出的隐状态 |
趋势建模能力 | 线性、平稳趋势 | 可建模非线性、状态切换、多模态序列 |
推断方式 | 参数估计(如最小二乘) | 概率推断(如EM、变分推断) |
表达能力 | 有限,主要适用于简单结构序列 | 表达力强,适用于复杂动态系统 |
自回归模型(autoregressive models,AR)
使用时间序列自身的过去值的线性组合来预测未来值
$$
X_t = c + \sum_{i=1}^p \phi_i X_{t-i} + \epsilon_t
$$
- $p$:滞后阶数;
- $\phi_i$:模型参数;
- $\epsilon_t$:白噪声项。
缺陷:仅依赖自身历史观测值;假设数据平稳,趋势是线性的;无需建模潜在状态;适用于简单趋势建模,不擅长处理状态切换或复杂行为。
隐变量自回归模型(latent autoregressive models)
引入不可观测的隐状态变量(latent variable),作为对历史信息的压缩总结,通过该状态驱动观测值的生成。
$$
\begin{cases}
z_t = f(z_{t-1}, x_{t-1}) & \text{(隐状态递归更新)} \\
x_t \sim p(x_t \mid z_t) & \text{(观测值生成)}
\end{cases}
$$
- $z_t$:隐状态(通常为概率分布);
- $f$:状态转移函数(可为神经网络或状态空间模型);
- $p(x_t \mid z_t)$:条件生成分布。
特点:能建模状态转换、周期性、非线性结构;适用于多模态、复杂序列;需要通过统计方法(如 EM 算法、变分推断)估计隐变量的分布;隐状态是软分配的,不是硬选择。
马尔可夫模型
时间序列的当前状态 ( X_t ) 理论上依赖于全部过去:
[
P(X_t \mid X_{t-1}, X_{t-2}, \ldots)
]
马尔可夫条件假设此依赖可简化为有限阶:
[
P(X_t \mid X_{t-1}, \ldots, X_{t-p})
]
当 ( p=1 ) 时,即为一阶马尔可夫性质,当前状态只依赖前一状态:
[
P(X_t \mid X_{t-1}, X_{t-2}, \ldots) = P(X_t \mid X_{t-1})
]
特点对比 | 马尔可夫模型 | 自回归模型 |
---|---|---|
状态类型 | 离散(如晴天、雨天、雪天) | 连续数值(如体重) |
依赖对象 | 前一时刻的状态 | 前几个时刻的观测值 |
预测方式 | 状态转移概率 | 线性组合(加权求和)加白噪声 |