前言
由于在硕士期间的研究内容是深度学习相关,因此用博客来记录pytorch和神经网络的学习过程,同时也欢迎大家来讨论交流
一、深度学习的一般流程
1.数据获取
数据获取是整个任务的开始,无论训练什么模型、完成什么样的需求 都需要先得到相关数据以及标签,在学习期间的数据与标签可以从很多数据网站轻松得到,但是在实际项目中则需要自己去收集提取。
2.特征工程
特征工程简单来理解就是提取你所获得数据的特征,所以数据的预处理和特征提取也是最核心的步骤,后续文章也将会针对每个任务写出数据预处理的过程。
数据的特征决定了模型的上限,而我们选择的算法和各种参数的定义是努力逼近这个上限
3.建立模型
我在初学阶段选择自己建立网络结构来训练数据,但是后期将介绍迁移学习,使用一些经典网络结构进行微调来适配自己的任务,经典的网络结构设计更合理,模型拟合效果也更好。
4.评估应用
这部分就是对自己训练的模型进行评价,评价依据也很多:准确率、误差函数、F1值、查全率、查准率,至于选择哪种方式评估模型需要根据实际任务需求来做,我至今记得本科期间老师举的例子,在癌症判断模型中,我们更希望查出全部的癌症患者,因此我们会更加关注查全率,此时对准确率的要求就相对较低。
二、神经网络的整体架构与基本流程
1.整体架构
可以看到,传统神经网络有三层:输入层(input layer)、隐藏层(hidden layer)以及输出层(output layer)。每层的基本单元即神经元(图中白色圆圈),每层的神经元之间均采用全连接方式,神经网络是非线性的,而这个非线性过程是由激活函数完成。
2.前向传播
神经网络的前向传播,我理解为计算预测结果的过程,可以分为两步
第一步先进行矩阵乘法,即 f=W*X ,W是各层之间的权重矩阵,在训练之前随机初始化,并在以后的训练过程中不断更新,X就是输入数据/上一层输出。
第二步就是通过激活函数,常用的激活函数有sigmoid、relu、tanh等,通过激活函数后的结果就是该层神经元的最终输出也是下一层的输入。
实际传播过程就是反复进行上述两个步骤直至到达输出层
3.反向传播
如前文所述,前向传播使用的权重矩阵是随机初始化的,因为输出结果肯定与真实标签相差甚远,因此我们需要对权重矩阵进行优化,在pytorch中有很多优化器可供选择,均在后续文章中介绍。
如果想要更新权重,需要先计算梯度,这个过程就是反向传播。我自己记忆口诀就是 :反向传播算梯度、优化器执行更新。
那么这个要算的梯度是谁的梯度呢,首先要明确一个事情,我们更新权重的目的是什么,当然是为了让训练误差尽可能地低,只有这样才能获得更好的预测结果。因此我们要沿着误差的梯度下降的方向更新权重。
既然是计算误差的梯度,那就要先求出误差,针对不同的任务需要选择不同的误差函数,在pytorch中均有提供,具体使用也将在后续进行介绍
三、DROP-OUT
我们知道,在神经网络中过拟合是一个非常头疼的问题,为了改善过拟合状态,我们引入了DROP-OUT,其逻辑很简单,就是随机“杀死”网络中的部分神经元以防止特征过多导致过拟合,在pytorch中也提供了相应的函数可以调用。
总结
本文对神经网络的基本原理和过程进行了概要说明,在下一篇文章中将以实际案例来演示各个步骤的实现以及如何使用pytorch的内置方法来搭建一个简单的神经网络