[DL]深度学习_基础

深度学习知识点

一文看懂深度学习

目录

一、什么是深度学习

二、计算机视觉任务

1、计算机视觉任务

2、视觉任务中遇到的问题

3、KNN的代码实现

三、线性函数    

1、得分函数

2、举例说明

四、损失函数(Loss Function)

1、定义

2、Loss Function和Cost Function的区别

3、损失函数的种类

4、损失函数的正则化项

五、激活函数(Activation Function)

1、定义

2、类别

3、激活函数的梯度问题


一、什么是深度学习

        深度学习(Deep Learning)源于神经网络领域,是一种基于多层神经网络的机器学习方法。相较于传统的浅层神经网络,深度学习模型具有更高的神经网络层数,因此能够处理更为复杂的数据,包括图像、语音、自然语言等。

        深度学习的基本构建模块是神经网络,其基本思想是将大量数据输入到神经网络中进行训练,通过不断调整神经元之间的连接权重,学习到数据中的特征,然后用这些学习到的特征来进行预测和分类。神经网络中的每一个神经元都拥有权重和偏置,权重确定了神经元之间的连接强度,偏置则是用于调整神经元的输出值。

        深度学习可以使用不同的网络结构来实现不同的任务,如卷积神经网络(CNN)用于图像处理、循环神经网络(RNN)用于语音和自然语言处理等。此外,深度学习还可以通过预训练和微调的方式来优化神经网络模型,以进一步提高预测和分类的准确性和效率。

        深度学习在许多领域都得到了广泛的应用,如计算机视觉、语音识别、自然语言处理等。例如,在计算机视觉领域,深度学习已经在图像分类、目标检测、图像生成等任务中取得了巨大的成功。在语音识别方面,深度学习已经被应用于自动语音识别、说话人识别和语音合成等任务。随着深度学习技术的不断发展,相信它在未来的应用领域还将继续扩展。

深度学习中特征工程的作用:

        数据特征决定了模型的上限;

        预处理和特征提取是最核心的;

        算法与参数选择决定了如何逼近这个上限。

神经网络像黑盒操作,神经网络可以将输入的数据进行自动提取特征,使得计算机识别最合适的特征。深度学习解决的核心是怎么去提取特征。

        深度学习最大的问题是运算速度。

二、计算机视觉任务

1、计算机视觉任务

  1. 图像分类:将图像分为预定义的类别之一。

  2. 目标检测:在图像或视频中找出目标对象,并用边框或轮廓框起来。

  3. 图像分割:将图像分成多个区域或分割出物体的轮廓。

  4. 实例分割:在图像中分割出多个物体的轮廓。

  5. 姿态估计:估计图像中物体的姿态和位置。

  6. 光流估计:检测视频中相邻帧之间物体的运动。

  7. 三维重建:从多张图像中重建出三维场景。

  8. 人脸识别:识别人脸并将其与数据库中的人脸匹配。

  9. 行为分析:分析视频中人或动物的行为。

  10. 物体追踪:追踪运动中的物体在视频中的位置。

  11. 视频摘要:从长视频中提取关键帧或摘要。

  12. 视频理解:对视频内容进行理解和分析。

notes:

        图像的表示:一张图片被表示成按照RGB通道排列的三维数组的形式,每个8bit像素的值从0到255。这张图象在计算机中存储和表示为三维数组的格式,如:300\ast 100\ast 3,其中300为水平方向上有300个像素、100为垂直方向上有100个像素,而3表示图像的色彩通道数,一般光学图像都只包含RGB三通道。

2、视觉任务中遇到的问题

        计算机视觉中,照射角度、形状改变、部分遮蔽、背景混入都是较为常见的问题。

在计算机视觉中,可能会遇到下列问题:

  1. 照射角度:光照角度或强度的不同可能会影响图像中物体的表现,或者导致阴影的出现。

  2. 物体形状改变:物体的形状可能会受到多种因素的影响,如视角、形态变形等,导致物体在图像中表现出不同的形状。

  3. 部分遮蔽:物体的一部分可能被其他物体或遮挡物遮蔽,导致图像中只有物体的部分可见。

  4. 光照条件:不同的光照条件可能会导致图像的亮度、对比度和颜色有所不同。

  5. 噪声:图像可能受到噪声的影响,如图像模糊、干扰、伪像等现象。

  6. 分辨率:不同的图像分辨率可能导致图像中物体表现精度不同。

  7. 色彩和对比度:图像的色彩和对比度也可能会因为光照条件、摄像机参数等因素不同而有所变化。

监督分类算法-k近邻算法

        k近邻算法(k-Nearest Neighbor,k-NN)是一种基本的监督学习算法,主要用于分类和回归问题。其基本思想是根据相邻数据点的标签预测新数据点的标签。k近邻算法假设相似的数据往往具有相似的标签,因此通过比较数据点之间的距离,找到距离最近的k个点,并将它们的标签进行统计,选择出现次数最多的标签作为新数据点的标签。

        k近邻算法包含两个关键步骤:距离度量和k值选择。其中距离度量指计算数据点之间的距离和相似度度量方法,常用的距离度量包括欧氏距离、曼哈顿距离、余弦相似度等;k值选择指的是在计算新数据点与训练集数据点的距离时,需要选择k个最近的邻居点。k值的选择一般需要通过交叉验证等方法进行选择,通常选择一个适当的k值能提高算法的准确率。

        k近邻算法具有简单易懂、应用广泛等优点,但也存在一些缺点,如计算量大、预测时间长、对异常值敏感等。

举例说明:

         已知数据中有两类标签,蓝色方块和红色三角,预测绿色圆点应该为什么类型。

        通过假设相似的数据通常具有相似的标签,通过比较数据点间的距离,找到距离新数据点最近的k个点,并统计相近k个点的标签,将最多的标签作为新数据点的标签,通过设定距离度量和k值,首先以图中实心小圈为距离度量,设定k=3,统计距离相近3个点的标签,可以得出红色三角的标签比较多,将新数据点标签标记为红色三角;之后又选择外部虚线大圈为距离度量,其中设定k=5,统计距离相近的5个点的标签之后,得出蓝色方块标签比较多,那么设定新数据点标签为蓝色方块。可以看出不同的距离度量和k值选择得出的结论可能会不一样。

k近邻计算流程:

  1. 计算已知类别数据集中的点于当前点的距离
  2. 按照距离依次排序
  3. 选取与当前距离最小的k个点
  4. 确定前k个点所在类别的出现概率
  5. 返回前k个点出现频率最高的类别作为当前点预测分类

notes:

        KNN算法本身简单有效,是一种lazy-learning算法。

        分类器不需要使用训练集进行训练,训练时间复杂度为0。

        KNN分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档总数为n,那么KNN的分类时间复杂度为O(n)

        k值的选择,距离度量和分类决策规则是该算法的三个基本要素。

        根据实际情况得出,K近邻算法并不适合做图像分类任务。因为背景主导是一个最大的问题,做分类任务所需要关注的是图像中的主体(主要成分)。而K近邻算法没有一个学习的过程,无法得知图象主体所在的位置,这就是神经网络通过学习能做到的。

3、KNN的代码实现

        使用一组训练集,包含汽车的轮毂直径、汽车长度、汽车宽度的数据,训练集中带有标签y,代表了该示例是小轿车还是SUV,通过KNN算法预测新的不带标签的示例是什么车型。

import numpy as np  # 导入NumPy库,并使用别名np表示,NumPy是一个用于数值计算的库
import matplotlib.pyplot as plt  # 导入matplotlib库中的pyplot模块,并使用别名plt表示,pyplot模块提供了绘图API
from mpl_toolkits.mplot3d import Axes3D  # 从mpl_toolkits.mplot3d中导入Axes3D模块
from sklearn.neighbors import KNeighborsClassifier  # 从scikit-learn库中的neighbors模块导入KNeighborsClassifier类,用于KNN分类器

plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为SimHei

# 示例数据
X = np.array([[20, 1.8, 4.5],
              [22, 2.0, 4.8],
              [18, 1.6, 4.2],
              [19, 1.7, 4.4],
              [21, 1.9, 4.7]])
y = np.array(['SUV', 'SUV', '小轿车', '小轿车', 'SUV'])  # 对应示例数据的类别标签

# 创建KNN分类器,这里设定K=3
knn = KNeighborsClassifier(n_neighbors=3)  # 创建一个KNN分类器实例,设置邻居数(K=3)
knn.fit(X, y)  # 使用示例数据拟合KNN分类器

X_pred = np.array([[19, 1.7, 4.3]])  # 待预测的轮毂直径、宽度、长度

# 计算每个示例与新示例之间的距离值,并按距离从小到大排序输出
distances, indices = knn.kneighbors(X_pred, n_neighbors=len(X))
distances_sorted, indices_sorted = zip(*sorted(zip(distances[0], indices[0])))
print("每个示例与新示例之间的距离值:")
for i in range(len(distances_sorted)):
    print("示例", indices_sorted[i] + 1, "与新示例的距离:", distances_sorted[i])

# 进行预测
pred = knn.predict(X_pred)  # 使用训练好的KNN模型对新样本进行预测
print("预测结果:", pred[0])  # 输出预测结果

# 可视化示例数据和待预测数据
fig = plt.figure()  # 创建新的Figure对象
ax = fig.add_subplot(111, projection='3d')  # 在Figure对象上添加一个3D子图

# 绘制示例数据点
ax.scatter(X[y == 'SUV', 0], X[y == 'SUV', 1], X[y == 'SUV', 2], c='b', label='SUV')  # 绘制示例数据中属于'SUV'类别的数据点,使用蓝色标识
ax.scatter(X[y == '小轿车', 0], X[y == '小轿车', 1], X[y == '小轿车', 2], c='r', label='小轿车')  # 绘制示例数据中属于'小轿车'类别的数据点,使用红色标识

# 绘制预测数据点
ax.scatter(X_pred[:, 0], X_pred[:, 1], X_pred[:, 2], c='k', marker='x', label='Prediction')  # 绘制待预测数据点,使用黑色叉标识

# 添加预测结果标签
ax.text(X_pred[0, 0], X_pred[0, 1], X_pred[0, 2], '预测结果:' + pred[0], color='blue')  # 添加预测结果的文本标签

ax.set_xlabel('轮毂直径')  # 设置X轴标签
ax.set_ylabel('宽度')  # 设置Y轴标签
ax.set_zlabel('长度')  # 设置Z轴标签
ax.set_title('KNN Example')  # 设置图表标题
ax.legend()  # 显示图例
plt.show()  # 显示图表

 设置了k=3,运行结果:

三、线性函数    

        深度学习中的线性函数通常指的是线性变换,即通过矩阵乘法将输入数据映射到输出数据的过程。线性变换可以表示为:

y = Wx + b

        其中,W是一个权重矩阵,b是偏置向量,x是输入向量,y是输出向量。这个线性函数可以被描述为对输入向量进行加权和,并将偏置添加到结果中。

        在深度学习中,线性函数通常用于定义神经网络层的操作,例如全连接层和卷积层。在这些层中,权重矩阵和偏置向量是需要学习的参数,通过反向传播算法来更新它们,以使网络能够更好地适应训练数据。

1、得分函数

        深度学习中的得分函数通常指的是对输入数据进行分类或回归预测的函数。在分类问题中,得分函数通常被定义为一个softmax函数,可以将输入向量转换为一个概率分布,从而表示每个类别的概率。在回归问题中,得分函数通常被定义为一个线性函数,可以将输入向量映射到目标值。

        具体来说,在分类问题中,给定一个输入向量x,得分函数可以定义为:

s = Wx + b

        其中,W是一个权重矩阵,b是一个偏置向量。然后,我们可以通过softmax函数将s转换为一个概率分布,得到每个类别的概率。softmax函数的公式为:

p_i = e^{s_i} / \sum_j e^{s_j}

        其中,p_i是第i个类别的概率,s_i是输入向量x对应的第i个元素的分数。

        在回归问题中,得分函数可以定义为一个简单的线性函数:

y = Wx + b

        其中,y是输出值,W是一个权重矩阵,b是一个偏置向量。通过学习W和b的值,我们可以使用得分函数将输入向量x映射到目标值y上。

        从输入到输出的映射,每个特征甚至每个像素点都有各自对应的重要性,比如图像中主体的像素点的重要性要比背景的像素点重要,则每个特征或每个像素点都有对应的权重,代表对图像内主题识别的不同作用大小。

2、举例说明

        此时有一个图像是[32X32X3]大小则有3072个像素点,将该图像输入到一个十分类任务的模型中,数学表示:

f(x,W)=Wx+b

        因为模型是十分类模型,则功能是判别图像并输出图像属于十种类别中的哪一种,则数学层面来说,将图像输入模型,模型输出的则是一个[10X1]的f(x,W)向量,每一行的数值则代表该图像在每一种类别里的可能性大小,选取向量值最大的行号则为该图像可能属于的类别。

        其中因为模型有十个分类结果,则有对应的十个W权重,则模型中W是一个[10X3072]的权重矩阵,x为输入的图像,为[3072X1]的向量,b则是[10X1]的偏置向量。b是对于得到的十个类别得分分别进行微调。

notes:

        权重矩阵W中,w_{ij}的值代表图像向量中第j个像元对第i个类别的重要性,重要性越大则w_{ij}数值越大。

        权重矩阵W是梯度下降或其他优化算法得出的,可以在模型训练之前构建一个初始权重矩阵W(构建初始权重矩阵,即初始参数的合适与否会影响模型训练效率),通过训练模型,反向传播优化参数,得到合适的权重矩阵W。

        多组权重参数与偏置构成了决策边界。

四、损失函数(Loss Function)

1、定义

        损失函数是深度学习中用来衡量模型预测结果与实际结果差距的函数。在深度学习中,我们的目标是训练一个模型,使得它能够在给定的数据集上获得最佳的预测结果。为了达到这个目标,我们需要定义一个损失函数来衡量模型的学习效果,以便我们可以通过优化损失函数来训练模型。

        在分类问题中,损失函数通常是交叉熵损失函数。交叉熵损失函数是基于概率分布的测量,它用于衡量模型预测与实际标签之间的差异。具体来说,对于一个训练样本,假设它有L个类别,y_i表示实际标签的one-hot向量,\hat{y_i}表示模型预测得到的概率向量,则交叉熵损失函数的公式为:

J(\hat{y},y) = -\sum_{i=1}^{L}{y_{i}log\hat{y_i}}

        在回归问题中,损失函数通常是均方误差损失函数。均方误差损失函数是基于实际标签和模型预测结果之间的差异的测量。具体来说,对于一个训练样本,假设它的实际标签为y,模型预测得到的结果是\hat{y},则均方误差损失函数的公式为:

J(\hat{y},y) = \frac{1}{2}(y-\hat{y})^2

对于其他类型的问题,可以根据问题的特点和需求来设计、选择适当的损失函数。

2、Loss Function和Cost Function的区别

        在深度学习中,通常使用损失函数(loss function)来表示模型预测结果与实际结果之间的差距,而使用代价函数(cost function)表示整个训练集上的平均损失。

        因此,损失函数是针对单个样本的函数,而代价函数是针对整个训练集的函数。在训练模型时,我们要最小化每个样本的损失,以使模型预测结果更加准确;同时也要最小化整个训练集的代价函数,以获得在整个训练集上的较好预测结果。

        在实际应用中,通常将损失函数和代价函数视为同一个概念,因为求解的都是模型的最小化损失或代价。但从概念上讲,损失函数着重于单个样本的预测结果,而代价函数则强调整个训练集的平均损失。

3、损失函数的种类

        损失函数是评估模型预测值与真实值之间差异的函数。通常用于监督学习中的模型训练,通过最小化损失函数来使得模型的预测结果尽可能地接近真实值。

常用的损失函数有:

  • 均方误差(MSE)

        均方误差衡量预测值与真实值之间的平均偏差的平方,是回归模型中最常用的损失函数。

MSE = \frac{1}{n} \sum_{i=1}^n(y_i - \hat{y_i})^2

其中,y_i为真实值,\hat{y_i}为模型预测值,n为样本数。

  • 平均绝对误差(MAE)

        平均绝对误差衡量预测值与真实值之间的平均偏差的绝对值,与MSE相比更加鲁棒,但容易受到噪声数据的影响。

MAE = \frac{1}{n} \sum_{i=1}^n |y_i - \hat{y_i}|

其中,y_i为真实值,\hat{y_i}为模型预测值,n为样本数。

  • 交叉熵(Cross-Entropy)

        交叉熵是分类模型中最常用的损失函数之一,它衡量模型预测的概率分布与真实概率分布之间的差异。

L(y, \hat{y}) = -\sum_{i=1}^n y_i \log(\hat{y_i})

其中,n是类别数量,y是真实标签的概率分布,\hat{y} 是模型输出的概率分布。

        交叉熵损失函数的优点是能够对错误分类的惩罚更严厉,因为它会为错误的分类分配更高的损失,从而使模型更加关注难以分类的样本。因此,交叉熵损失函数通常是分类模型中使用的标准损失函数之一。

  • 感知器损失(Perceptron Loss)

        感知器损失适用于二分类问题,它以正确分类的样本为目标,使得模型预测值与真实值之间的差异最小。

L(y,z) = max(0, -y * z)

其中,y为真实值,z为模型预测值。当 y * z > 0 时,损失为0;当 y * z < 0 时,损失为   -y * z

  • 对数损失(Logistic Loss)

        对数损失也适用于二分类问题,它是一种连续性的函数,使得正确分类的样本的损失越小越好。

L(y, \hat{y}) = -y \log(\hat{y}) - (1-y) \log(1-\hat{y})

其中,y为真实值(0或1),\hat{y}为模型预测值(在0到1之间),\log为自然对数函数。

  • Hinge损失

        Hinge损失是支持向量机中常用的损失函数,适用于二分类问题,它使得模型预测值与真实值之间的差异在一定范围内时损失为0,超出这个范围时随着差异的增加而不断增加。

L(y, z) = max(0, 1- y * z)

其中,y为真实值,z为模型预测值。当y * z \geq 1时,损失为0;当y * z < 1时,损失为1 - y * z

4、损失函数的正则化项

        如果两个模型在输入数据相同的情况下,使用相同的损失函数计算得出的值相同。

        如上图所示,虽然两个模型的损失函数计算结果相同,但是由模型A的参数向量看出,模型A注重局部,而模型B注重全局。模型A对于模型B来说,模型A容易产生过拟合现象。

        正则化损失函数在传统的损失函数上添加了正则化项,目的是为了控制模型的复杂度,从而避免过拟合。正则化项可以是L1正则化项、L2正则化项或者其他正则化项,其形式可以表示为:

Regularized\ Loss = Loss + \lambda\cdot Regularization\ Term

        其中,Loss表示原始的损失函数,Regularization\ Term表示正则化项,\lambda表示正则化系数,用来控制正则化项在损失函数中的权重。

例如,一个线性回归模型的损失函数可以表示为均方误差(MSE):

Loss = \frac{1}{2n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2

        添加L2正则化项后,其正则化损失函数变为:

Regularized\ Loss = Loss + \lambda\cdot \sum_{j=1}^{m}w_j^2

        其中,n表示样本数量,\hat{y_i}表示模型预测的值,y_i表示真实值,w_j表示模型中的权重。

        正则化损失函数可以通过优化算法(如随机梯度下降)进行最小化,以寻找最佳的模型参数。在实际应用中,正则化损失函数可以缓解过拟合问题,提高模型的泛化能力。

正则化项的常用种类:

  • L1正则化项:

        L1正则化项(L1 regularization)又被称为Lasso正则化,它通过对权重向量中的每一个元素的绝对值求和来实现对权重向量的压缩,促进权重向量中的元素趋于0,从而实现特征选择的效果。L1正则化项的公式如下:

\lambda \sum_{i=1}^{n}|w_i|

其中,\lambda为正则化系数,n为权重向量的长度。

  • L2正则化项:

        L2正则化项(L2 regularization)又被称为Ridge正则化,它通过对权重向量中的每一个元素的平方和求和来实现对权重向量的压缩,从而实现权重向量中元素的缩小,抑制过拟合。L2正则化项的公式如下:

\lambda \sum_{i=1}^{n}w_i^2

其中,\lambda为正则化系数,n为权重向量的长度。

  • Elastic Net正则化项:

        Elastic Net正则化项(Elastic Net regularization)综合了L1和L2正则化的优点,既可以实现特征选择,又可以缓解L1正则化在某些情况下出现的稀疏性过强的问题。Elastic Net正则化项的公式如下:

\lambda_1 \sum_{i=1}^{n}|w_i| + \frac{1}{2}\lambda_2 \sum_{i=1}^{n}w_i^2

其中,\lambda_1\lambda_2分别是L1正则化项和L2正则化项的正则化系数。

  • Dropout正则化方法:

        Dropout正则化方法是一种在神经网络中广泛应用的正则化方法,可以有效地抑制过拟合。Dropout正则化方法在前向传播过程中,随机丢弃一部分神经元,将剩余神经元的输出值乘以一个比例因子k,公式如下:

y = \frac{x}{k}

其中,x为输入值,y为输出值,k为比例因子。

        Dropout正则化方法是一种比较有效的正则化方法,因为它在神经网络中引入了随机性,减少了神经元之间的强依赖关系,从而增加了神经网络的鲁棒性。

五、激活函数(Activation Function)

激活函数​​​​​​

常用激活函数 

1、定义

        深度学习中的激活函数(Activation Function)是一种非线性映射,它将神经网络的输入信号转换成一个输出信号,从而决定了神经元的输出值。激活函数的主要作用是引入非线性因素,从而增加神经网络的表达能力,使神经网络能够更好地建模复杂的非线性关系。

        激活函数是深度学习中非常重要的组成部分之一,它的作用包括以下几个方面:

  1. 增强网络的非线性能力:神经网络中的每一层都是线性变换,如果不经过激活函数的非线性变换,每一层的输出都只是输入的线性组合,多层线性组合后仍然是线性的,无法学习和表示非线性关系,而激活函数的非线性变换能够使得神经网络具有更强的拟合能力。

  2. 实现正则化:激活函数可以对网络输出进行限制,防止网络过拟合。例如,Sigmoid激活函数的输出范围为(0,1),ReLU激活函数的输出范围为[0, +∞),这些范围可以使得输出值在一定范围内集中,从而对网络的泛化能力产生正则化作用。

  3. 改善梯度传递:激活函数的选择可以对梯度传递产生影响,因为在反向传播时需要进行梯度计算,有些激活函数梯度消失或梯度爆炸(如Sigmoid),而有些激活函数(如ReLU)不会产生这样的问题,可以有效地传播梯度。

  4. 去除输入中的负值:某些激活函数如ReLU能够把输入中的负值变成0,这对于图像处理任务中的边缘检测和特征提取非常有用,可以有效地去除噪声。

        总之,激活函数在深度学习中扮演着十分重要的角色,它能够增强神经网络的模型能力,提高模型的泛化能力,改善梯度传递,去除输入中的负值等。

2、类别

深度学习中常用的激活函数有以下几种:

  • Sigmoid函数:

        Sigmoid函数是一种常用的激活函数,它将输入信号压缩到[0,1]的区间内,可以用来表示概率值。Sigmoid函数的公式如下:

\sigma (x) = \frac{1}{1+e^{-x}}

其中,x为输入值。

  • ReLU函数:

        ReLU函数是一种非常简单的激活函数,它在x\ge0的区间内输出x,在x<0的区间内输出0。ReLU函数的公式如下:

f(x) = \max(0, x)

其中,x为输入值。

  • Leaky ReLU函数:

        Leaky ReLU函数是ReLU函数的改进版本,它在$x<0$的区间内输出一个小的斜率,从而避免了ReLU函数在$x<0$的区间内的死亡问题。Leaky ReLU函数的公式如下:

f(x)=\left\{\begin{matrix} x,x\geq 0 & \\ ax,x< 0 & \end{matrix}\right.\in R

其中,x为输入值,a为一个小的斜率常数。通常情况下,a的取值为0.01。

  • Tanh函数:

        Tanh函数是一种类似于Sigmoid函数的激活函数,它将输入信号压缩到[-1,1]的区间内。Tanh函数的公式如下:

\text{tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

其中,x为输入值。

  • Softmax函数:

        Softmax函数是一种用于多分类任务的激活函数,它将神经网络的输出转换成一个概率分布,使得每个类别的概率值总和为1。Softmax函数的公式如下:

\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^K e^{x_j}}

其中,x_i为第i个神经元的输出值,K为类别数。

notes:

        当输入cat🐱时,首先将输入向量与参数w矩阵点乘再加上偏置b,f(x)=W\cdot x+b,得到每个类别的得分;之后将得分经过exp处理, exp(x) = e^x,放大得分值之间的差异,得分值是负数时,负数值代表不可能是这个类别,进行exp处理,概率约等于0;之后进行归一化处理,将得分值转换成概率值;最后计算损失,交叉熵损失函数,只关注当前输入属于正确类别的概率值,因为对数函数特征,当正确概率越接近于1时,对数函数的值越接近于0,即损失值越接近于0;当正确概率越小时,对数函数的值越大(损失函数中log前有负号),即损失值越大。

3、激活函数的梯度问题

梯度爆炸:

        激活函数的梯度爆炸问题指的是在反向传播过程中,梯度值变得非常大,导致权重矩阵更新值变得非常大,使得网络难以收敛,从而无法进行训练。

        梯度爆炸的原因是神经网络中的梯度是由各层之间的乘积组成的,当层数增加时,梯度的值也会以指数级别增加。如果梯度的值变得非常大,那么在反向传播过程中,权重矩阵的更新值也会变得非常大,导致网络难以收敛。

解决梯度爆炸问题的方法有以下几种:

  1. 梯度修剪:对梯度进行修剪,使得梯度的范围在一个合适的范围内,例如将梯度限制在一个小的范围内,例如[-1, 1],这样可以有效地避免梯度爆炸。

  2. 权重初始化:采用一些合适的权重初始化方法,例如Xavier初始化或He初始化,可以降低梯度爆炸的风险。

  3. 使用适当的激活函数:避免使用具有饱和性的激活函数,例如Sigmoid函数和Tanh函数,这些函数会导致梯度爆炸。相应的,可以选择具有线性性或具有ReLU形式的激活函数,例如ReLU函数。

  4. 增加批量归一化:批量归一化能够在每个批次中规范化数据,使得网络更容易训练,并且可以减少梯度爆炸的风险。

梯度消失:

        激活函数梯度消失问题是指在神经网络反向传播过程中,梯度会被多个激活函数乘积所缩小,导致梯度逐渐趋近于0,使得神经网络无法进行有效的学习,从而无法进行训练。

        梯度消失问题的主要原因是由于使用了一些具有饱和性的激活函数,例如Sigmoid函数和Tanh函数,在这些函数的饱和区域内,函数的斜率非常小,导致梯度无法进行有效的传播。这些激活函数的导数在0附近会变得极小,导致反向传播时传回的梯度也会变得非常小。

解决梯度消失问题的方法有以下几种:

  1. 使用ReLU函数代替Sigmoid和Tanh函数:ReLU函数具有线性性和非饱和性,使得神经网络更容易训练。

  2. 使用Leaky ReLU函数:与ReLU函数相比,Leaky ReLU函数具有更小的梯度消失问题。

  3. 使用ELU函数:ELU函数具有与ReLU函数相同的非饱和性质,并且能够减少梯度消失问题。

  4. 使用残差连接(Residual Connection):在层数非常深的神经网络中,引入残差连接可以使得梯度更容易传播。

  5. 批量归一化:批量归一化可以加速模型的训练,减少梯度消失问题。

notes:

        在参数后向传播过程中,由于采用的是链式求导法则,各参数偏导通过乘法传播,一旦某个参数传播过程中值变得非常小,甚至于零,那么之后的参数传播就都变为零不进行传播了。

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IAz-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值