软工第二周作业-深度学习和pytorch基础

1.视频感悟

绪论

人工智能(Artificial Intelligence):使一部机器像人一样进行感知、认知、决策、执行的人工程序或系统。

1.1 人工智能的三个层面

计算智能:能进行存储和计算

感知智能:具备类似于人的视觉、听觉、触觉等感知能力,能听会说,能看会认

认知智能:实现类似于人的认知能力,能理解、会思考、能产生对策,概念、意识、观念都是认知智能的表现

1.2 人工智能+

人工智能+金融:风控、征信、辅助交易等

人工智能+内容创作:自然语言处理、语音合成等

人工智能+机器人:视觉处理、语音识别、动作控制等

1.3 逻辑演绎vs归纳总结

 

1.4 知识工程vs机器学习

知识工程/专家系统:根据专家定义的知识和经验来进行推理和推断,从而模拟人类专家的决策过程,并解决问题

机器学习:机器基于有标注的数据进行自动训练

两者对比

知识工程的规则是手工设计的,可以人为控制,结果具有可解释性,但构建过程费时费力,并且无法消除专家主观经验带来的影响;

机器学习基于给出的数据进行自动学习,减少了人力消耗,提高了信息处理的效率,结果往往不易解释,但能有效减少主观因素的影响,具有较高的可信度

1.5 机器学习的定义

最常用定义:计算机系统能够利用经验提高自身的性能

可操作定义:机器学习本质是一个基于经验数据的函数估计问题

统计学定义:提取重要模式、趋势,并理解数据,即从数据中学习

总而言之,机器学习就是从数据中自动提取知识的过程

1.6 机器学习的三个要素:

模型:对要学习问题映射的假设,即对问题建模并确定假设空间 策略:从假设空间中学习或选择最优模型的准则,即确定目标函数 算法:根据目标函数求解最优模型的具体计算方法,即确定模型参数

深度学习概述

2.1 传统机器学习vs深度学习

传统机器学习主要依靠人工设计特征,包括数据预处理、特征提取、特征转换等步骤,再基于特征训练得到分类器

深度学习对简单特征进行组合,得到更复杂的特征,从特征到输出的映射没有那么重要,因此深度学习又叫表示学习

2.2 深度学习的“不能”

稳定性低:算法输出不稳定,容易被“攻击”(对抗样本,单像素攻击) 可调试性差:模型复杂度高,难以纠错和调试 参数不透明:模型层级复合程度高,参数不透明 增量性差:端到端训练方式对数据依赖性强,模型增量性差(小样本问题) 推理能力差:专注直观感知类问题,对开放性推理问题无能为力 机器偏见:人类知识无法有效引入进行监督,机器偏见难以避免

 

2.3 连接主义+符号主义

  • 把知识图谱作为先验知识应用于深度学习

  • 基于深度学习来辅助知识图谱的构建

2.4 激活函数

可以使用激活函数实现非线性拟合

sigmoid函数存在的问题:①容易饱和;②输出不对称

 

2.5 感知器和神经网络

单层感知器:首个可以学习的人工神经网络

多层感知器的输出:g(W*x),其中g是激活函数,W是权重,x是输入

单层感知器无法实现异或

万有逼近定理:如果一个隐层包含足够多的神经元,三层(单隐层)前馈神经网络(输入-隐层-输出)能以任意精度逼近任意预定的连续函数

第一层感知器:空间变换 第二层感知器:线性分类 双隐层感知器逼近非连续函数:当隐层足够宽时,双隐层感知器(输入-隐层1-隐层2-输出)可以逼近任意非连续函数,可以解决任何复杂的分类问题

神经网络的每一层都可以完成输入→输出空间变换,增加节点数可以增加线性转换能力,增加层数可以增加非线性转换次数

2.6 神经网络的参数学习:误差反向传播

将多层神经网络看作一个复合的非线性多元函数,给定训练数据和对应的标签,训练过程就是让损失尽可能小的过程

参数沿负梯度方向更新可以使函数值下降

还涉及到了:前馈神经网络的BP算法:这里我略去,太难了

2.7 梯度消失

前向传播和反向传播

 

以sigmoid激活函数为例,该函数在0处梯度最大,越往两边梯度越小,最后在饱和区趋近于0,当值落在饱和区时,梯度趋近于0,而反向传播时需要与梯度相乘,当梯度接近0时,反向传播得到的梯度也会接近0,此时梯度不会有明显变化,这就造成了梯度消失,不利于参数更新

增加深度更容易产生梯度消失,造成误差无法传播,并且多层网络容易陷入局部极值,难以找到更优解,难以训练,因此,在很长一段时间内,三层神经网络是主流,要想实现更深的神经网络,需要采取措施来抑制梯度消失,比如预训练、更改激活函数等

神经网络的问题

  • 增加深度会造成梯度消失,误差无法传播

  • 多层网络容易陷入局部极值,难以训练

问题

1、神经网络的算法不理解,还有神经元模型

2、为什么增加深度会导致梯度消失

心得

  • 通过绪论对人工智能的三大层面——计算智能、感知智能、认知智能,了解了人工智能+对生活的广泛用途。还学习到了机器学习的内容、相关算法以及应用,对比了传统机器学习和深度学习的知识工程与机器学习关系的相关内容,了解到深度学习相较于传统机器学习的优点,最后还介绍了深度学习的实际应用,如Google无人自行车等内容。。

  • 认识到了深度学习的发展和应用领域,也认识到了深度学习的一些不足,比如算法输出不稳定,容易被攻击,模型复杂,难以纠错,模型层级复合程度高,对数据依赖非常强等等问题,后面还介绍了神经网络的算法,在加上数学方面的知识,更混乱了,看不明白。

2.代码练习

2.1 pytorch基础练习

1.pytorch中定义数据一般需要先导入torch这个库,然后用torch.tensor来定义数据。我们可以利用torch.tensor来创建一个数或者是任意维度的数组(张量)。

如创建一个数:

 

创建一维数组:

 

创建多维数组:

 

当然python中也提供了一些创建多维数组(tensor)的方法,如ones, zeros, eye, arange, linspace, rand, randn, normal, uniform, randperm.

如创建一个全零张量:

 

如创建一个1到2之间的等差数组,长度为10:

 

我们也可以利用之前tensor的大小,重新定义它的dtype:

 

2.定义操作:

用tensor可以进行以下计算:

基本运算:加减乘除,求幂取余,包括abs/sqrt/div/exp/fmod/pow,及一些三角函数cos/sin/asin/atan2/cosh,及ceil/round/floor/trunc等 布尔运算:大于小于,最大最小,包括gt/lt/ge/le/eq/ne,topk,sort,max/min等 线性计算:矩阵乘法,求模,求行列式,包括trace,diag,mm/bmm,t,dot/cross,inverse,svd等

如创建一个2x4的tensor,并输出它的行列数以及大小:

另外想获取某一列或者是某一行的元素,我们可以根据索引来获取,它这里的索引也是从0开始的:

 

最后我们若是要想看看某一张量它里面的数据是如何分布的,我们可以用python里面的plt画图函数来显示:

 

2.2 螺旋数据分类

1.下载绘图函数到本地:

2.引入基本的库并初始化一些重要参数:

import random
import torch
from torch import nn, optim
import math
from IPython import display
from plot_lib import plot_data, plot_model, set_default
​
###### 因为colab是支持GPU的,torch 将在 GPU 上运行
​
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('device: ', device)
​
###### 初始化随机数种子。神经网络的参数都是随机初始化的,
​
###### 不同的初始化参数往往会导致不同的结果,当得到比较好的结果时我们通常希望这个结果是可以复现的,
​
###### 因此,在pytorch中,通过设置随机数种子也可以达到这个目的
​
seed = 12345
random.seed(seed)
torch.manual_seed(seed)
​
N = 1000  # 每类样本的数量
D = 2  # 每个样本的特征维度
C = 3  # 样本的类别
H = 100  # 神经网络里隐层单元的数量

 

初始化X和Y,X可以理解为特征矩阵,Y可以理解为样本标签,X是一个N*C行D列的矩阵 在python中,调用zeros等类似函数时,第一个参数是矩阵的行,y方向,第二个参数是矩阵的列,x方向;并输出X和Y的形状大小。

 然后根据X和Y的里面的数据画图,最终显示为一个螺旋形状。

 

3.构造线性模型分类:

 

 

可以看到用线性模型很难达到准确地分类,1000轮训练完了之后准确率也只在50%左右。

感悟:在这个模型中,优化器中学习率不能太大,防止错过最优解,优化方法中的动量大小应适度,防止陷入局部最优。

4.构造两层神经网络分类:

4.1.前面没有加Relu激活函数并且优化器选择的是SGD优化器,下面我们加入Relu函数并且还是选择SGD优化器,学习率保持不变,训练轮数还是1000轮,看看这个模型出来的准确率。

 

可以看到,虽然加入了Relu函数,但是这个模型出来的准确率没有提升多少,就提升了5%左右,查看分类之后的结果:

 

4.2.下面我们选择Adam优化器,并且不加入Relu函数,看看这个线性模型的准确率。

 

可以看到,当我们选择了Adam优化器并且不加入Relu函数时,模型出来的准确率依旧不是很高,在50%左右,查看分类之后的结果:

 

4.3.下面我们再加入Relu函数并且优化器选择Adam优化器,学习率和训练轮数保持不变,看看准确率:

看看这次分类结果:

可以看到这次模型出来的准确率搞了很多,达到了95%左右,说明这个优化器很有效,使模型具有了一定的非线性拟合能力。

2.3 感悟

第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。

第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现 梯度消失 的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。

第三,ReLu激活函数会使一部分神经元的输出为0,这样就造成了 网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

因此有了以上认识,我们知道了如何从哪些方面入手来提高模型的准确率?

第一,激活函数的选取。

螺旋数据分类的四个实验可以看到,在选择Adam优化器之后,没有加入Relu函数,影响很大,最后训练完无法达到满意的结果。

第二,优化器的选择,以及里面的学习率等参数的选取。

在使用SGD优化器的情况下,加入激活函数后见效缓慢,在其他参数不变的情况下,在1000轮内无法达到比较满意的准确率,而选择了Adam优化器之后,准确率瞬间就上来了。

在本次实验中,Adam优化器比SGD优化器更容易取得更好的训练效果,SGD优化器需要更长的训练周期,比如训练上千轮才能看到SGD优化器的成效。

总之,不同的优化器或激活函数会带来不一样的训练效果,需要多尝试和探索,根据实际问题使用合适的函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值