第1周学习:深度学习和pytorch基础

目录

一、人工智能(Artificial Intelligence)

1.概念

2.人工智能的三个层面

3.人工智能>机器学习>深度学习

4.知识工程/专家系统与机器学习

二、机器学习

1.定义

2.模型分类

2.1 数据标记 

2.2 数据分布

2.3 建模对象

三、深度学习

1.概述

2.深度学习的“不能”

3.深度学习的“不能”与解释性

四、神经网络基础

1.浅层神经网络

1.1 M-P神经元

1.2 激活函数

1.3  感知器

1.4 万有逼近定理

1.5 神经网络每一层的作用

1.6 深度和宽度的选择

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

1.8 梯度下降

1.9 梯度消失

2. 神经网络基础

2.1 逐层预训练

2.2 解决梯度消失

五、 代码练习

1. Pytorch基础

1.1 定义数据

1.2 定义操作

 2. 螺旋数据分类

线性模型分类

构建两层神经网络分类

一、人工智能(Artificial Intelligence)

1.概念

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

2.人工智能的三个层面

计算智能:能存能算;感知智能:能听会说、能看会认;认知智能:能理解、思考、决策。

3.人工智能>机器学习>深度学习

人工智能是一种科技领域,机器学习是一种方法,深度学习则是应用了深度神经网络的机器学习分支。

4.知识工程/专家系统与机器学习

知识工程/专家系统是人工定义规则,机器学习则是机器基于数据自动学习训练。

二、机器学习

1.定义

  1. 最常用定义:计算机系统能够利用经验提高自身性能。
  2. 可操作定义:一个基于经验数据的函数估计问题。
  3. 统计学定义:提取重要模式、趋势,并理解数据,即从数据中学习。

总结:从数据中自动提取知识。

2.模型分类

2.1 数据标记 

  • 监督学习模型

        监督学习模型的样本具有标记,从数据中学习标记分界面 (输入-输出的映射函数),适用于预测数据标记

  • 无监督学习模型

        无监督学习模型的样本没有标记,从数据中学习模式,适用于描述数据

  • 半监督学习模型       

        半监督学习模型是监督学习模型和无监督学习模型的混合,部分数据标记已知

  • 强化学习模型

        数据标记未知,但知道与输出目标相关的反馈

2.2 数据分布

  • 参数模型

        对数据分布进行假设,待求解的数据模型/映射可以用一组有限且固定数目的参数进行刻画。数据需求少,训练快速,但模型复杂度有限,与真实目标函数拟合度小。

  • 非参数模型

        不对数据分布进行假设,数据的所有统计特性都来源于数据本身。对数据适应性强,可以拟合不同的函数形式,但数据需求大,容易过拟合。

2.3 建模对象

  • 判别模型

        对已知输入X条件下输出Y的条件分布P(Y|X)建模

  • 生成模型

        对输入X和输出Y的联合分布P(X,Y)建模

三、深度学习

1.概述

应用研究:视觉+语言

理论研究:”能“做什么→“不能”做什么

2.深度学习的“不能”

  1. 算法输出不稳定,容易被“攻击”
  2. 模型复杂度高,难以纠错和调试
  3. 模型层次复合程度高,参数不透明
  4. 端到端训练方式对数据依赖性强,模型增量型差
  5. 专注直观感知类问题,对开放性推理问题无能为力
  6. 人类知识无法有效引入进行监督,机器偏见难以避免

3.深度学习的“不能”与解释性

四、神经网络基础

1.浅层神经网络

1.1 M-P神经元

M-P神经元多输入信号进行累加\sum_{i}x_{i}对应生物神经元的多输入单输出空间整合的特

点;

M-P神经元权值w_{i}正负模拟兴奋/抑制,大小模拟强度对应生物神经元的兴奋性/抑制性输入的特点;

M-P神经元输入和超过阈值时被激活,对应生物神经元的阈值特性

1.2 激活函数

概述

神经元继续传递信息、产生新连接的概率(超过阈值被激活,但不一定传递)。

没有激活函数相当于矩阵相乘,只能拟合线性函数。

举例

Sigmoid函数会把输出限定在0~1之间,如果是非常大的负数,输出就是0,如果是非常大的正数,输出就是1,这样使得数据在传递过程中不容易发散。但Sigmoid函数有两个缺点,一是容易过饱和,丢失梯度,二是Sigmoid不对称,输出均值不是0。针对这两个缺点,分别有双极S性函数和ReLU修正线性单元的变形函数。

1.3  感知器

感知器是首个可以学习的人工网络。单层感知器可以实现逻辑与、逻辑或和逻辑非;多层感知器是单层感知器逻辑组合实现,如三层感知器可以实现同或门。

单隐层神经网络可视化网站:http://playground.tensorflow.org.

1.4 万有逼近定理

  • 定义

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

  • 双隐层感知器逼近非连续函数

1.5 神经网络每一层的作用

每一层的数学公式如下

\vec{y} = a(W \cdot \vec{x} +b)

在输入→输出的空间转换过程中,W \cdot \vec{x的作用是升维/降维和放大/缩小以及旋转,+b的作用是平移,a(\cdot)的作用是弯曲。

神经网络学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投影到线性可分的空间去分类/回归。增加节点数会增加维度,即增加线性转换能力;增加层数则是增加激活函数的次数,即增加非线性转换次数。

1.6 深度和宽度的选择

神经元总数相当时,增加网络深度可以比增加宽度带来更强的网络表示能力:产生更多的线性区域。

深度和宽度对函数复杂度的贡献不同,深度的贡献是指数增长的,而宽度的贡献是线性的。

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

多层神经网络可以看作一个复合的非线性多元函数 F(\cdot ):X\rightarrow Y

F(x) = f_{n}(\cdots f_{3}(f_{2}(f_{1}(x)\ast \Theta _{1} + b)\ast \Theta _{2} +b)\cdots )

给定训练数据\left \{ x^{i},y^{i} \right \}_{i =1:N},希望损失\sum_{i}loss(F(x^{i}),y^{i})尽可能小。

1.8 梯度下降

多元函数f(x,y)在每个点可以有多个方向。每个方向都可以计算导数,称为方向导数。梯度为一个向量,方向是最大方向导数的方向,模为方向导数的最大值。

无约束优化:梯度下降,参数沿负梯度方向更新可以使函数值下降。

1.9 梯度消失

2. 神经网络基础

2.1 逐层预训练

 

2.2 解决梯度消失

Layer-wise Pre-train(DBN,2006):2006年Hinton等提出的训练深度网路的方法,用无监督数据作分层预训练,再用有监督数据fine-tune。

ReLU(AlexNet,2012):新的激活函数解析性质更好,克服了sigmoid函数和tanh函数的梯度消失问题。

辅助损失函数(Inception V1,2013):e.g. GoogLeNet中的两个辅助损失函数,对浅层神经元直接传递梯度。

Batch Normalization(Inception V2, 2014):逐层的尺度归一。

LSTM:通过选择记忆和遗忘机制克服RNN的梯度消失问题,从而可以建模长时序列。

五、 代码练习

1. Pytorch基础

PyTorch是一个python库,它主要提供了两个高级功能:

  • GPU加速的张量计算
  • 构建在反向自动求导系统上的深度神经网络

1.1 定义数据

一般定义数据使用torch.Tensor , tensor的意思是张量,是数字各种形式的总称。torch可以是数、一维数组(向量)、二维数组(矩阵)和任意难度的数组(张量)。

1.2 定义操作

  • 基本运算,加减乘除,求幂求余
  • 布尔运算,大于小于,最大最小
  • 线性运算,矩阵乘法,求模,求行列式

  matplotlib展示生成随机数的直方图

from matplotlib import pyplot as plt

# matlabplotlib 只能显示numpy类型的数据,下面展示了转换数据类型,然后显示
# 注意 randn 是生成均值为 0, 方差为 1 的随机数
plt.hist(torch.randn(1000).numpy(), 100);
生成 1000 个随机数,并按照 100 个 bin 统计直方图
plt.hist(torch.randn(10**6).numpy(), 100);

 当数据非常非常多的时候,正态分布会体现的非常明显

 2. 螺旋数据分类

  • 线性模型分类

learning_rate = 1e-3
lambda_l2 = 1e-5

# nn 包用来创建线性模型
# 每一个线性模型都包含 weight 和 bias
model = nn.Sequential(
    nn.Linear(D, H),
    nn.Linear(H, C)
)
model.to(device) # 把模型放到GPU上

# nn 包含多种不同的损失函数,这里使用的是交叉熵(cross entropy loss)损失函数
criterion = torch.nn.CrossEntropyLoss()

# 这里使用 optim 包进行随机梯度下降(stochastic gradient descent)优化
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=lambda_l2)

# 开始训练
for t in range(1000):
    # 把数据输入模型,得到预测结果
    y_pred = model(X)
    # 计算损失和准确率
    loss = criterion(y_pred, Y)
    score, predicted = torch.max(y_pred, 1)
    acc = (Y == predicted).sum().float() / len(Y)
    print('[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f' % (t, loss.item(), acc))
    display.clear_output(wait=True)

    # 反向传播前把梯度置 0 
    optimizer.zero_grad()
    # 反向传播优化 
    loss.backward()
    # 更新全部参数
    optimizer.step()
# Plot trained model
print(model)
plot_model(X, Y, model)

Sequential(
  (0): Linear(in_features=2, out_features=100, bias=True)
  (1): Linear(in_features=100, out_features=3, bias=True)
)

  • 构建两层神经网络分类

和上面模型不同的是,在两层之间加入了一个 ReLU 激活函数。

learning_rate = 1e-3
lambda_l2 = 1e-5

model = nn.Sequential(
    nn.Linear(D, H),
    nn.ReLU(),
    nn.Linear(H, C)
)
model.to(device)

# 下面的代码和之前是完全一样的,这里不过多叙述
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=lambda_l2) # built-in L2

# 训练模型,和之前的代码是完全一样的
for t in range(1000):
    y_pred = model(X)
    loss = criterion(y_pred, Y)
    score, predicted = torch.max(y_pred, 1)
    acc = ((Y == predicted).sum().float() / len(Y))
    print("[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f" % (t, loss.item(), acc))
    display.clear_output(wait=True)
    
    # zero the gradients before running the backward pass.
    optimizer.zero_grad()
    # Backward pass to compute the gradient
    loss.backward()
    # Update params
    optimizer.step()
# Plot trained model
print(model)
plot_model(X, Y, model)
Sequential(
  (0): Linear(in_features=2, out_features=100, bias=True)
  (1): ReLU()
  (2): Linear(in_features=100, out_features=3, bias=True)
)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值