Deep Learning① 回顾

基本问题

Inspired by Lex Fridman’s MIT lecture(5 years ago!)-

https://www.youtube.com/watch?v=O5xeyoRL95U

深度学习是什么?

从数据中提取有用的模式,深度学习模型通过多层神经网络结构,从大量的输入数据中自动学习和提取复杂的特征和模式。这种方式避免了传统机器学习中大量手工设计特征的工作。例如,在图像识别中,深度学习模型可以从像素数据中提取边缘、形状和物体等特征,实现自动化的图像分类。底层网络可能提取边缘信息,中层提取纹理信息,高层提取复杂的物体特征。

设计方法

神经网络和优化:

神经网络是深度学习的核心结构,通过层与层之间的权重连接和非线性激活函数来模拟人脑的工作方式。

优化方法(如梯度下降)用于调整网络中的权重,以最小化预测误差,从而提高模型的准确性。

实际应用

Pytorch、Tensorflow和HuggingFace:

这些是当前常用的深度学习框架和库,提供了构建、训练和部署深度学习模型的工具和接口。例如,Pytorch和Tensorflow是两个流行的开源深度学习框架,而HuggingFace则提供了预训练的自然语言处理模型和工具,方便研究人员和开发者使用。

难点:

需要好的问题、好的数据和好的计算能力:

深度学习的成功依赖于明确的问题定义、丰富且高质量的数据集以及强大的计算资源。好的问题定义能够明确模型的目标,好的数据能够提供足够的信息来训练模型,而强大的计算能力则能够支持大规模数据的处理和复杂模型的训练。这也是当前深度学习的问题,极其依赖硬件资源。

近年来,数据的爆炸性增长、硬件(如GPU和TPU)的性能提升、活跃的研究社区和开源工具的涌现,以及资本市场对AI的巨大投入,使得深度学习在许多领域取得了突破性进展。此外,媒体和公众对AI的高度关注也推动了该领域的快速发展。

而大多数关于智能的重大问题尚未得到解答或提出,但我们再次开始讨论通用人工智能(AGI),当然进年来也有很大的突破,比如GPT-4 AlphaFold等

The Perceptron – Rosenblatt 1958

感知器,perceptron,是由Frank Rosenblatt在1958年提出的一种二分类线性分类器。它是神经网络的基本构建块,也是深度学习的基础

问题背景:

如何理解生物系统感知世界、存储信息和行为反应的机制。这涉及感知、记忆和行为三大核心问题。

感知器模型:

输入 (Input x): 一组特征向量 ​x1,x2,......xD.

权重 (Weights w): 每个输入特征对应一个权重 w1.w2,......wD​

线性组合 (Linearly combine): 将所有输入特征按权重进行线性组合,即 w⋅x。

输出 (Output): 使用符号函数(sgn)处理线性组合的结果,如果结果大于0,输出1,否则输出-1,即 f(x)=sgn(w⋅x+b)。

偏置 (Bias b): 一个常数,用于调整分类决策边界。

感知器的工作原理:

输入特征通过加权求和,然后经过一个激活函数(如符号函数)得到输出。这种结构模拟了生物神经元的行为。

简单来说,传统模型无法拟合出非线性或者不可分问题,因为传统机器学习依赖于手工设计特征,这需要领域专家的知识和大量的实验。线性模型的表达能力有限,无法逼近复杂的函数关系。为了提升模型的表达能力,通常需要使用核方法(如支持向量机中的核技巧)或组合多个模型(如集成学习)

目标是预测,方法是通过一些优化机制比如梯度下降,来更新权重参数,使损失函数最小化{梯度下降可以简单用二次函数理解就是找到开口向上的二次函数的最低点(即最小值),而该点梯度为0}。

即最小化损失函数,找到最佳预测函数

Stochastic Gradient Descent (SGD)

使用小批量样本更新权重,多次遍历训练样本。

SGD需要更多步数才能收敛,但每一步更快。

(1)权重初始化:

将权重  w  随机初始化为均值为0、标准差为0.05的高斯分布,即  w ~ Gaussian(μ=0, std=0.05)

   - 随机初始化权重可以打破对称性,避免所有权重更新相同。选择高斯分布是为了使权重值在初始阶段有较小的随机偏差,从而使模型有一个好的起点。

(2)分批处理数据:

   - 将数据分成小批次处理可以减少每次更新的计算量,提高训练效率。批次处理(mini-batch)在梯度计算时能够提供更稳定的更新方向,避免单次样本更新带来的噪声。

学习率 η = 0.1 /t,随着迭代次数的增加,学习率逐渐减小,有助于在训练后期进行细致调整,防止错过最优解。

   - 学习率随着迭代次数的增加逐渐减小,有助于在训练后期进行细致调整,防止错过最优解。

(3)权重更新公式:

   - 对每个权重 wi  的更新基于当前批次中所有样本的预测误差与对应特征的乘积之和。公式中的 1/ |Xb| 是批次大小的倒数,用于求平均值,使得每次更新的幅度不受批次大小的影响。

 f(x_n) - y_n 表示预测值与真实标签之间的误差。如果预测值大于真实值,更新公式会减少权重;反之,则增加权重。

   - 通过逐步减少学习率,模型能够在初期快速收敛,在后期进行微调,从而找到更好的全局最优解。

其他优化器:如动量、AdaGrad、RMSProp、Adam等。

use another type of loss function

在逻辑回归中,我们使用逻辑损失函数,因为它更适合处理二分类问题。逻辑损失函数通过对数似然估计,能够更好地处理分类问题中的概率输出

解释和扩展:

1.线性模型和非线性模型:

感知器是一个线性模型,只能解决线性可分的分类问题。但许多实际问题是非线性的,因此需要多层感知器(MLP)等更复杂的模型来处理。基本感知器使用符号函数非线性函数作为激活函数,该函数只根据线性组合的结果是否大于0来决定输出。符号函数并不会引入非线性变换,因此感知器的决策边界仍然是线性的

2.决策边界是指分类模型用来分隔不同类别的那条线或平面。在单层感知器中,决策边界由线性变换 z=w⋅x+b 确定,因为这是决定输出结果的唯一一步。

即使激活函数改变了 z 的值,但其作用只是将线性组合结果进行单一变换,不能引入新的特征组合或非线性关系

3.梯度下降 (Gradient Descent):

梯度下降是优化算法的基础,通过沿着误差最大的方向更新权重,逐步减小损失函数值。这种方法在许多机器学习和深度学习算法中广泛应用。

4.学习率 (Learning Rate):

学习率 η 控制权重更新的步长。学习率过大可能导致模型不收敛,过小则收敛速度慢。因此,选择合适的学习率非常重要。

MultiLayer Perceptron

可以处理非线性不可分问题

包括:

·输入层:主要是输入的变量,特征会被传递到下一层

·隐藏层(hidden layer):含若干神经元(节点),每个神经元都与输入层的所有节点相连,并通过权重进行加权求和

隐藏层的节点编码了输入特征之间的隐含关系(latent relationships),这些关系不是显式定义的,而是通过训练过程自动学习的。

例如,图中展示了三个输入特征分别通过不同的权重连接到两个隐藏层神经元。

·输出层(Output):

输出层接收隐藏层的输出,进行进一步的加权求和,并通过激活函数得到最终的预测结果。

例如图中展示了输出结果为“存活的概率”(Probability of beingAlive),值为0.6。

网络结构(Network Structure):

独立变量(Independent variables): 输入层的特征。

权重(Weights): 连接各层节点的权重参数。

隐藏层(Hidden Layer): 进行特征提取和变换。

依赖变量(Dependent variable): 输出层的预测结果。

多层感知器也称为前馈神经网络,因为信息在网络中从输入层通过隐藏层传递到输出层,没有反馈连接。网络结构确定后,权重通常通过反向传播(back-propagation)算法进行学习。反向传播算法通过计算预测误差的梯度,并沿梯度方向更新权重,逐步减少预测误差。

MNIST Digits

输入层:每个像素一个特征。对于MNIST数据集,每张图像为28x28像素,总共784个特征(像素值),展平为784*1大小的向量输入 所以输入层需要784个神经元

              ↓

隐藏层:设置隐藏层神经元个数为256(经验且因为手写数字并不复杂),每个神经元与输入层的所有784个神经元相连,即784->256的全连接层。

输入信号通过权重和偏置项进行加权求和,并通过激活函数(如ReLU)得到输出

全连接层Fully Connected Layer (256->10)

输出层:要求从输入的图片中识别出不同的数字,0-9十个数字,所以输出层为十个神经元

Softmax函数输出每个数字概率

对应代码就是:

class Networl(nn.Module):
    def __init__(self):
        super(Networl,self).__init__()
        self.layer1=nn.Linear(784,256)#线性层1,输入与隐藏层之间
        self.layer2=nn.Linear(256,10)#线性层2
    def forward(self,x):
        #x=x.view(-1,28,28)
        x=x.view(-1,784)#将x展平
        x=self.layer1(x)#将x输入layer1
        x=torch.relu(x)
        x=self.layer2(x)
        return x

注意:在MLP中,隐藏层通常就是全连接层(也称为密集层或Dense层),"全连接"意味着该层的每个神经元都与上一层的所有神经元相连。

一些激活函数:

Sigmoid:原点开始的s形

Tanh:被原点截断的s形

ReLU:上端倾斜的L

Leaky ReLU:上下段都倾斜的L,改进ReLU输入小于零时,输出为零,导致神经元“死亡”的问题。允许小于零的输入有一个小的斜率(如0.01),从而使得神经元在负输入时仍然有微小的梯度更新

反向传播

原理大致是省去正向求导迭代的复杂过程,它利用链式法则从输出层开始,逐层向后计算误差梯度,并根据这些梯度更新权重,从而最小化损失函数。反向传播使得神经网络能够自动调整权重,以提高模型的预测准确性。

在TensorFlow或Keras中,反向传播是自动处理的。只需要定义模型和损失函数,然后调用model.fit()方法来训练模型

权重初始化

权重初始化步骤对于模型的最终学习和性能至关重要。初始化不当会导致训练困难,甚至无法收敛

权重初始化的几种错误选项

使用同一常数值初始化权重:

可能导致隐藏单元对损失的影响相同,进而产生相同的梯度。这样会使模型导致模型无法学习到多样化的特征,所有神经元都在做相同的更新。

使用不同的大值初始化权重(过大)

可能导致梯度爆炸(exploding gradients),即激活值随着层数的增加呈指数级增长,导致损失函数的值非常大并在训练过程中震荡。diversify/wide落在激活函数的饱和区域,可能导致在使用Sigmoid或tanh激活函数时饱和(导致梯度消失),或者在使用ReLU激活函数时导致梯度爆炸

使用不同的小值初始化权重(过小)

可能导致梯度消失(vanishing gradients),即反向传播时梯度值变得越来越小,导致损失函数的值很快变得非常小,使模型学习变得非常缓慢甚至停滞。

比如如果用sigmoid做激活函数,它在0周围是近似线性的,如果我们的参数都初始化为0附近,那么可能数据经过神经元之后,大部分都落在线性区,那么我激活函数引入非线性的作用将被削减。

经验法则

激活值的均值应为零:

确保激活值在正负值之间平衡,避免激活值偏向一侧导致梯度不平衡。

激活值的方差应在每层保持一致:

维持各层激活值的方差一致,可以避免梯度爆炸和梯度消失的问题。

a)Xavier((Gloriot)初始化:这种方法考虑了前一层神经元的数量来规范化权重的尺度,是为了在激活函数是Sigmoid或tanh时保持激活值的方差。

b)He初始化:这种方法考虑了ReLU激活函数的特性,通常用于ReLU激活函数的网络,以确保在网络的初期阶段,激活值的方差不会消失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值