深度学习
---- 初学时的一些困惑之处,以及个人认为的一些重点,都以大问题的角度列了出来,有错误之处还请各位观者多多包涵
1. 深度学习的核心在于权重,不断进行权重的更新,BP算法(反向传播)
-
如何进行更新——梯度下降
-
收敛太慢——随机梯度下降,mini-batch SGD
-
梯度弥散,梯度消失——更换激活函数,增加残差连接
-
过拟合怎么办——L1,L2正则化,直接dropout
(下面我将就我的理解逐条分别解释梯度下降算法及其发展 ,梯度消失问题,激活函数,残差连接(可能会放到CNN板块中),过拟合问题以及解决方案)
2. 使用梯度下降法进行优化的流程,神经网络训练的一般流程
-
初始化网络参数:权重和偏置,可以采用随机初始化的方法,均匀分布或者高斯分布,但是需要保证权重不能相同或者过于接近零(后面解释为什么不能进行权重相同或为零)
-
确定损失函数,分类问题还是回归问题,回归问题一般采用最小二乘法,均方差损失,分类问题则是交叉熵损失,极大似然估计(后面将会详细解释两种loss的区别联系)(这里推荐王木头学科学的讲解,从上述三个角度推导了损失函数的表达形式)
-
选择优化算法,GD,SGD,mini batch SGD,动量法,Adam ,RMSprop,并设置相关的超参数,如学习率或者动量
-
设置超参数:除了优化算法的超参数外,还需要设置其他超参数,如学习率、正则化参数、批处理大小等。这些超参数的选择可能需要进行实验和调整
-
开始训练循环:随机抽取样本,前向传播,计算损失,反向传播,梯度下降更新参数。
重复以上步骤
3. 简单介绍不同优化算法的特点
梯度下降法的变体和发展是为了解决原始梯度下降方法的一些问题,并提高训练神经网络等复杂模型的效率和性能。以下是一些常见的梯度下降法的变体和发展
3.1 随机梯度下降(SGD):
基本思想:SGD每次只使用训练集中的一个样本来估计梯度,而不是使用整个训练集。这导致参数更新具有更大的随机性,但也使训练更快。
特点:SGD通常收敛速度更快,但参数更新具有噪声性质。因此,SGD可能会在训练过程中震荡,但最终会收敛到一个局部极小值。
3.2小批量随机梯度下降(Mini-batch SGD):
基本思想:Mini-batch SGD介于批量梯度下降和SGD之间,它在每个训练迭代中使用一小部分(小批量)训练样本来估计梯度。这在理论和实际中通常是最常用的优化算法。
特点:Mini-batch SGD结合了SGD的速度和批量梯度下降的稳定性,通常能够在训练中获得较好的性能。
3.3批量梯度下降:
基本思想:批量梯度下降使用整个训练集来估计梯度,然后进行参数更新。这在计算上通常是最昂贵的,特别是对于大型数据集。
特点:批量梯度下降的梯度估计最准确,但收敛速度可能较慢,特别是在大数据集上。
3.4 动量梯度下降(Momentum):
基本思想:动量法引入了动量项,用于加速梯度下降过程。它积累了之前梯度的方向和速度,并根据这些信息来更新参数。
特点:动量法能够帮助克服局部极小值问题,通常在训练中加速收敛。
3.5 自适应学习率方法:
基本思想:这些方法(如Adagrad、RMSprop等)根据每个参数的历史梯度信息来自动调整学习率。它们通常可以在不需要手动调整学习率的情况下获得很好的性能。
特点:自适应学习率方法在实践中表现良好,但需要小心超参数的选择。
3.6 Adaptive Moment Estimation(Adam):
基本思想:Adam是一种自适应学习率方法,结合了动量项和自适应学习率调整。它通常在深度学习中表现出色。(现在一般被广泛使用的都是Adam)
特点:Adam通常具有良好的性能,对于各种类型的数据和网络架构都很有效。
4.深度神经网络为什么会出现梯度消失,如何解决?
- 原因:深度神经网络的链式法则,会因为多次相乘而导致梯度消失。
没使用非线性激活函数,或者使用的Sigmoid函数,tanh函数远离零,图像饱和, 导数接近于零,也会导致梯度消失。
- 解决方法:使用Relu激活函数
采用batch normalization ,批量标准化,可以规范数据输入,减少梯度的消失
使用残差连接,Resnet也可以防止梯度消失(残差网络,CNN模型的发展,后面会谈到)
5. 激活函数各种分类
-
激活函数的作用: 引入非线性性质,使神经网络能够捕捉和表示复杂的模式和关系。激活函数通常被应用于每个神经元的输出,以便将其转换为非线性的形式。
也就是说通过引入激活函数使神经网络可以拟合各种函数,如果只有线性函数,不管进行多少层相乘,始终仍为线性变换,通过激活函数才使神经网络可以引入非线性变换
-
Sigmoid函数:
f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e−x1
主要用于二元分类问题,在输出层通常用于将输出映射到概率值 范围为(0,1) -
Tanh函数(双曲正切函数):
f ( x ) = e x − e − x e x + e − x f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=ex+e−xex−e−x
类似于Sigmoid,但输出范围在(-1, 1)之间,常用于隐藏层
-
ReLU函数(重点介绍):
f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)优点:
-
计算效率:ReLU的计算非常简单,只涉及一个阈值比较和一个乘法操作,因此在训练和推理过程中速度很快。
-
稀疏激活:在训练过程中,ReLU激活函数能够产生稀疏激活,即只有一部分神经元会被激活,这有助于减少模型的计算负担。
-
解决梯度消失问题:相对于一些传统的激活函数,如Sigmoid和Tanh,ReLU对于梯度的传播更加稳定,有助于缓解梯度消失问题,使得训练深度神经网络更加容易。
缺点:
-
神经元死亡问题:ReLU的主要问题是在训练过程中,一些神经元可能会变得"死亡",也就是永远不会被激活,导致这些神经元不再更新权重。这通常发生在输入的值小于零的情况下,相关神经元的梯度将永远为零,从而导致权重不再更新。
-
不适合所有情况:ReLU对于某些类型的数据和任务可能不够有效,特别是对于处理负数输入时可能会出现问题。Leaky ReLU和其他变体可以用来缓解这个问题。
-
不是零均值中心化:ReLU不是零均值中心化的,这可能会导致某些优化问题。
-
-
Leaky ReLU函数:
f ( x ) = { x , if x > 0 a x , otherwise f(x) = \begin{cases} x, & \text{if } x > 0 \\ ax, & \text{otherwise} \end{cases} f(x)={x,ax,if x>0otherwise
Leaky ReLU解决了ReLU在负数范围内可能出现的“死神经元”问题,通过引入一个小的斜率a来保持一定的梯度 -
softmax函数:
f ( x ) i = e x i ∑ j = 1 n e x j f(x)i = \frac{e^{x_i}}{\sum{j=1}^{n}e^{x_j}} f(x)i=∑j=1nexjexi
激活函数,用于多类别分类问题,将模型的原始输出转化为概率分布,将一组实数映射到0到1的值,并且值的总和为1,在多分类问题中,通常将模型输出用softmax函数进行归一化,将概率最大的值作为结果输出(后面transformer中注意力机制部分还会重点提及)
6. 两个比较抽象的概念 归一化和正则化
- 归一化:
目的:归一化旨在将数据缩放或变换到一定的范围或标准,以确保不同特征之间或不同数据 之间的尺度一致,从而提高模型训练的稳定性和性能。
适用情况:主要用于数据预处理(数据增强我们后序会谈到)阶段,以确保数据在输入模型 之前具有一致的尺度和分布。
示例:常见的归一化方法包括Min-Max归一化(将数据缩放到特定的范围)、Z-Score归一 化(将数据标准化为均值为0,标准差为1的正态分布)等。
-
正则化:
作用目的:正则化是一种用于防止过拟合的技术,通过向损失函数中添加额外的项,来限制模型参数的大小,从而减少模型的复杂性。
适用情况:主要用于训练阶段,以减少模型对训练数据的过度拟合。
示例:常见的正则化方法包括L1正则化(通过添加参数绝对值的和来限制参数大小)、L2正则化(通过添加参数平方的和来限制参数大小)、Dropout(随机关闭神经元以减少参数之间的依赖)等。
-
不同点:
目的不同:归一化的主要目的是确保数据具有一致的尺度和分布,以便模型训练更加稳定。正则化的主要目的是减少模型的复杂性,防止过拟合。
应用阶段不同:归一化通常在数据预处理阶段进行,而正则化通常在模型训练阶段进行。
操作方式不同:归一化是通过数据的变换和缩放来实现的,而正则化是通过在损失函数中添加附加项来实现的。
7. 归一化的一些分类:
-
Min-Max归一化:也称为线性归一化,它将数据缩放到一个特定的范围,通常是[0, 1]或[-1, 1]。这种方法的公式如下:
X norm = X − X min X max − X min X_{\text{norm}} = \frac{X - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}} Xnorm=Xmax−XminX−Xmin
这种归一化方法保留了数据的相对大小关系。 -
Z-Score归一化:也称为标准化,它通过将数据转换为均值为0,标准差为1的标准正态分布来归一化数据。这种方法的公式如下:
X norm = X − μ σ X_{\text{norm}} = \frac{X - \mu}{\sigma} Xnorm=σX−μ
其中, μ \mu μ是数据的均值, σ \sigma σ是标准差。 -
特征缩放:在机器学习中,特征缩放是对特征进行归一化的过程,以确保所有特征具有相似的尺度。这有助于梯度下降等优化算法更快地收敛,并且避免某些特征对模型的训练产生过大的影响。
-
归一化到单位长度:在向量空间中,常常需要将向量归一化为单位长度,这是通过除以向量的范数(模)来实现的。
8. CNN和RNN 以及 Transformer中常用的两种归一化方式的区别联系
Batch Normalization(批标准化)和 Layer Normalization(层标准化)都是用于神经网络的正则化技术,它们的目标是减少训练过程中的内部协变量偏移(Internal Covariate Shift)并帮助网络更快地收敛。它们在某些方面有相似之处,但也存在一些重要的区别。
联系:
-
都是归一化技术:Batch Normalization和Layer Normalization都是通过归一化输入数据的方法来减少训练中的内部协变量偏移。它们可以应用于深度神经网络的每一层。
-
都包括平均值和方差:两者都计算每个输入特征的平均值和方差,并使用它们来重新缩放输入。这有助于保持输入特征的零均值和单位方差,以改善训练过程。
区别:
-
归一化的范围:
- Batch Normalization:Batch Normalization是基于每个小批次数据的统计信息进行归一化的。对于每个小批次,它计算该批次中每个特征的平均值和方差,并使用这些值来归一化该批次的数据。这意味着它在训练时需要考虑批次的大小,并且通常应用在卷积神经网络(CNN)和全连接层中。
- Layer Normalization:Layer Normalization是基于每一层的统计信息进行归一化的。对于每一层,它计算该层中每个样本的特征的平均值和方差,并使用这些值来归一化该层的数据。它不依赖于批次的大小,通常应用在循环神经网络(RNN)等情况下。
-
归一化的方式:
- Batch Normalization:Batch Normalization归一化每个特征维度上的数据 ,使得每个特征的分布在训练时保持稳定。它包括缩放和平移参数,允许网络自由地学习适合每个特征的缩放和平移因子。
- Layer Normalization:Layer Normalization归一化每个样本的所有特征,使得每个样本的特征在训练时保持稳定。它不包括可学习的缩放和平移参数。
-
适用场景:
- Batch Normalization:Batch Normalization在卷积神经网络和全连接层中效果较好,通常用于图像处理和传统神经网络结构中。
- Layer Normalization:Layer Normalization更适合用于RNN等循环结构,以及一维输入数据的情况。它对于不同长度的序列输入更具鲁棒性(Transformer架构中应用也比较多)
9. 过拟合 以及过拟合的一些解决方式
-
过拟合 是机器学习和深度学习中常见的问题,它指的是模型在训练数据上表现很好,但在测试数据上表现差的情况。过拟合的根本原因是模型过于复杂,以至于可以拟合训练数据中的噪声和细微差异,导致模型对新数据的泛化性能下降。
- 过多的参数:过拟合通常发生在模型拥有过多参数或复杂度过高的情况下,例如深度神经网络中的大型模型。
- 训练数据噪声:如果训练数据包含噪声或异常值,模型可能会试图适应这些噪声,而不是真正的数据模式。
- 不足的训练数据:如果训练数据太少,模型可能无法捕捉到数据的真实分布,容易过拟合。
解决方式:
- 增加更多的数据:收集更多的训练数据是减轻过拟合的有效方法,因为更多的数据可以使模型更好地捕获数据的真实分布。
- 简化模型:
- 减少模型复杂度:减少模型的层数、神经元数量或特征数量,以降低模型的复杂度。
- 特征选择:选择最相关的特征并删除不必要的特征,以减少模型的复杂性。
- 正则化:
- L1和L2正则化:通过向损失函数添加L1或L2正则化项,限制模型参数的大小,防止过拟合。
- Dropout:在训练过程中随机关闭一些神经元,以减少参数之间的依赖性,降低过拟合风险。
- 交叉验证:使用交叉验证来评估模型性能,有助于检测和诊断过拟合问题,选择适当的模型和超参数。
- 早停法:在训练过程中监视验证集的性能,并在性能不再改善时停止训练,以避免过拟合。
- 数据增强:在训练过程中对数据进行随机变换或增强,以生成更多的训练样本,有助于模型更好地泛化。
10. L1,L2正则化的理解:
-
L1正则化,也称为L1范数正则化或Lasso正则化:
L1正则化通过向损失函数添加权重的绝对值之和来限制模型参数的大小。它的公式如下:
L 1 正则化项 = λ ∑ i = 1 n ∣ w i ∣ L1\text{ 正则化项} = \lambda \sum_{i=1}^{n} |w_i| L1 正则化项=λi=1∑n∣wi∣
L1正则化可以使参数更加稀疏(某些参数变为零),降低维度。L2正则化,也称为L2范数正则化或Ridge正则化:
L2正则化通过向损失函数添加权重的平方之和来限制模型参数的大小。它的公式如下:
L 2 正则化项 = λ ∑ i = 1 n w i 2 L2\text{ 正则化项} = \lambda \sum_{i=1}^{n} w_i^2 L2 正则化项=λi=1∑nwi2
L2正则化参数更加平滑,避免参数过大。(本质上可以理解为通过添加正则化项来约束权重的大小,防止参数过大,造成过拟合)
-
从拉格朗日乘数法角度理解
-
从权重衰减角度理解
-
从贝叶斯角度理解
-
从模型复杂度角度理解
11. 学习率的理解:
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传]
(https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C%E9%9D%B3%E4%BA%AC%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20230918181814338.png&pos_id=img-phkEfwwB-1695047923580)