目录
2.2.1 定义一组函数(define a set of function)
2.2.2 评估函数的好坏(goodness of function)
2.2.2 选择最佳的函数(pick the best function)
摘要
本周开始学习李宏毅深度学习的课程。首先对机器学习做了一些回顾复习,关于机器学习的设计、优化以及激活函数的选择。然后学习了深度学习相关的一些基本概念以及参数更新需要用到的反向传播的相关知识。最后完成了对PyTorch配置安装,为后续的使用做准备。
Abstract
This week, I started to study Li Hongyi's deep learning course. First, I did a bit of a review of machine learning, about the design, optimization, and selection of activation functions for machine learning. Then, I learned some basic concepts related to deep learning and the knowledge of backpropagation that needs to be used for parameter updates. Finally, the PyTorch configuration was installed to prepare for subsequent use.
1 机器学习(复习)
1.1 训练过程
机器学习就是寻找一个函数。函数的输入是现实世界的信息,输出是一个抽象结果。而具体这个函数的好坏是训练数据通过监督学习得到的。
机器学习的训练过程分为三个阶段:
- 设计含有未知参数的函数,例如线性回归: ,为权重,为偏置;
- 定义损失函数,根据训练集来训练设计的函数,从而根据损失函数来不断减小与真实值之间的差异,尽可能最小化损失函数,例如: ,常见的损失函数有、 以及交叉熵等;
- 优化过程,使用梯度下降算法来进行优化,通过设定超参数(,也叫学习率)来找到局部最小值以及全局最小值。
1.2 非线性模型
当然,简单的线性回归函数存在局限性,容易造成模型偏差,为例避免模型偏差,需要更复杂的含有未知参数的函数。则这种复杂的线性函数线性函数都可以用一段一段的函数组成,即可用常数加上若干个函数表示,如下图:
由此引入S形函数,即sigmoid函数: ,从而根据调整参数 来拟合不同的函数:
从而有:
当 时,有 ,最终能转换成如下图所示:
可以看出,这和神经网络中隐藏层的计算如出一辙。
1.3 新模型优化
在进行梯度下降训练模型时候,很多时候要将数据集进行分组,每一个组叫做一个batch。而根据这个batch更新我们的未知数,叫做一次update。当把这一个数据集训练完后更新出来的未知数,叫做epoch:
1.4 激活函数
Hard Sigmiod可以由两个ReLU(Rectified Linear Unit)叠加组成:
Sigmoid:
ReLU:
2i表示两条ReLU函数,其中sigmoid和ReLU都统称为激活函数。
2 深度学习基本概念
2.1 深度学习的本质
将每一个激活函数称为神经元,很多层很多个神经元叠加串起来则称为神经网络,同样换个说法,同层一次的激活函数运算称之为一个隐藏层,很多隐藏层叠加起来就产生深度,因此也将这个过程叫做深度学习:
此后,神经网络的层数越来越多,神经网络的误差也越来越小:
但是并非深度学习的深度越深越好,当训练数据过少时,太过于追求深度学习的深度,会造成深度学习的过拟合情况,过拟合就是在训练数据表现更好,在未见的数据却表现更差。
2.2 训练过程
对照机器学习的三个过程,深度学习同样也是三个过程:
-
定义一组函数(define a set of function)
-
评估函数的好坏(goodness of function)
-
选择最优的函数(pick the best function)
2.2.1 定义一组函数(define a set of function)
定义一组函数实际上是要找到一个神经网络。神经网络是由一个个神经元或逻辑回归通过不同的方式连接串连起来的,每个神经元都有自己的偏置 和权重 ,而所有神经元的和也被叫作神经网络参数(parameter):
最常见的连接方式是全连接层前馈网络(Fully Connect Feedforward Network)。
当给定一个输入,并且已知 和 的值时,就可以通过全连接进行运算,每一层的输入都来自上一层的输出。
在已知神经网络里面的未知数 和 的值时,这个神经网络都相当于一个函数,输入的是一个向量,输出的也为一个向量。
当不知道神经网络里面的未知数 和 的值时,仅仅把神经元按照设定的方式连接起来,即设置好连接的结构,就称这个为定义一组函数。
在全连接层前馈网络中,接收输入数据的第0层称为输入层,中间由很多n神经元组成的层称为隐藏层,输出结果的第L层称为输出层:
在神经网络中一般采用矩阵运算,不仅方便表示,还能加速运算。将各层的参数都进行向量化,神经网络的前向传播做的其实就是很多的矩阵运算,则可以嵌套表示为:
2.2.2 评估函数的好坏(goodness of function)
函数模型结构设计完成后,就要对其进行评估。如下图:
假设输入一张手写的数字1,看看预测效果,首先通过神经网络计算激活函数输出 ,然后与标签值 计算交叉熵损失函数 ,最后得到结果。
然后将数据集中所有的手写数字进行如上方式的计算,然后计算出总的损失值 :
2.2.2 选择最佳的函数(pick the best function)
通过找到最佳的 ,使总的损失值最小,从而选择到最佳的函数,也叫做梯度下降算法。
之后使用初始值以及学习率和偏导值,通过以下运算公式,不断更新 ,:
2.3 反向传播(Backpropagation)
由上一小节的梯度下降算法可知, 向量是非常长的,可能是一个上百万维的量,为了有效率地计算这么多参数,就需要使用反向传播算法去高效的完成对 的计算了。
首先要知道什么是链式法则,链式法则是在学习高等数学中求复合函数导数非常常用的一种方法。完成链式求导主要需要掌握两个步骤,列出各个变量之间的关系和根据关系写出链式,同一条路径相乘、不同路径相加:
然后,定义预测结果 (理想模型)与实际结果 (现实模型)之间的距离为 ,即第 单个样本的交叉熵损失函数值是 。
总体样本损失函数值表达式为:
对损失函数 左右两边同时对 求偏导:
可以看出,仅需要对一个样本数据进行讨论,再将一个样本讨论的结论覆盖到整体样本上进行求和即可。所以下面的讨论都是基于一个样本的。反向传播可以分为正向传播部分和反向传播部分。
2.3.1 正向传播(Forward pass)
前向传播的目标是求出偏导 ,由于 是经过整个神经网络得出结果后得出预测值 与真实值 计算出来的,所以是一个整体的性的值,要求偏导,就要一层一层的计算。
将下图三角形部分的神经元拿出来单独讨论,先处理这个部分的计算从而以小见大,理解整个个过程的计算:
观察下面的图片,通过链式求导法则可以将 展开为:
的表达式在前向传播中给出来了, 的计算会很容易:
可以看出 对 的偏导等于与 相联系的输入值。将这个结论扩展到网络的其他部分,如下图:
所以通过前向传播,计算每个神经节点的输入就能计算所有的 了。
2.3.2 反向传播(Backward pass)
中的 通过正向传播就能够计算出来了。接下来则要通过反向传播来计算 部分,根据链式法则:
就是对激活函数求导,假设使用的激活函数是Sigmoid,那么
所以主要问题在于对 的计算,观察上图, 可以按照链式法则继续展开为:
根据 和 的表达式可以计算 、 ,则带回前面的式子中有:
如下图,上面表达式的的含义就像从后面向前面传播:
接下来则求出 和 ,就能计算出 ,这时,需要分两种情况考虑:
假设 和 是连接的是输出层:
链式法则展开:
求导可以通过损失函数表达式计算,求偏导其实就是激活函数的求导,这时候 就计算完成了。
假设 和 是连接的不是输出层:
则是一个套娃递归的过程,要找其下一层再推导,直到找到输出层为止。所以,一开始从输出层往前推导快一点,因为都是已知结果:
计算梯度 ,通过正向传播计算 和通过反向传播计算 :
3 PyTorch配置及安装
PyTorch是一个开源的深度学习框架,由Facebook人工智能研究院(FAIR)开发。它提供了一套动态张量计算库,具有易于使用、高效性能和强大的扩展性等特点。PyTorch支持在GPU上运行,能够大大加速深度学习模型的训练和推理过程。
安装PyTorch-GPU版本首先需要安装CUDA和cuDNN。
3.1 安装CUDA
查看显卡驱动:
从官网下载对应的CUDA版本:
安装:
选择自定义模式:
选择安装位置:
安装完成。
查看添加环境变量:
3.2 安装cuDNN
通过官网选择安装对于版本的cuDNN:
安装并解压完后,将三个文件夹复制到CUDA安装路径下:
查看是否安装成功,在命令行输入nvcc -V 进行检查:
验证安装是否成功:
3.3 安装PyTorch-GPU版本
创建虚拟环境pytorch_gpu:
pytorch官网提供的安装连接:
安装完成,cu121为gpu版本:
总结
通过本周的学习,首先复习了机器学习的相关知识,机器学习的训练过程分为三个步骤:设计含有未知参数的函数、定义损失函数和优化过程,更深入了解了如何通过激活函数拟合非线性模型,和分批次计算进行模型优化,对机器学习的了解更加深入了。
然后学习了深度学习的基本概念,了解了深度学习的本质是多层次的神经网络。深度学习的训练同样也分为三个步骤:定义一组函数、评估函数的好坏和选择最佳的函数,通过对这三个步骤更深入的学习,了解了如何对神经网络进行设计、评估和选择。其次是学习到了如何使用反向传播算法高效计算参数,将偏导使用链式法则进行拆分,然后使用正向传播和反向传播结合的方式,简化计算,最后求出偏导,高效计算参数。
最后完成了对PyTorch的配置和安装操作,包括对CUDA、cuDNN和PyTorch-gpu版本的下载和安装,最终成功完成安装操作,为后续的代码运行做准备。
标签:10.21,函数,10.27,传播,学习,神经网络,计算,安装,周报 From: https://blog.csdn.net/qq_60040306/article/details/143114712