当前位置:   article > 正文

PyTorch基础(二)深度学习及数学原理_深度学习 pytorch 数学基础

深度学习 pytorch 数学基础

1. 机器学习方法:

  • 监督学习:通过已有的训练样本去训练得到一个最优模型,再利用这个模型将所有的输入映射为相应的输出。
  • 无监督学习:与监督学习不同的是,我们事先没有任何训练样本,而需要直接对书籍进行建模。
  • 半监督学习:在训练阶段结合了大量未标记数据和少量标签数据。与使用所有标签数据的模型相比,使用训练集的训练模型在训练时可以更加准确。
  • 强化学习:我们设定一个回报函数,通过这个函数来确认是否越来越接近目标,类似我们训练宠物,如果作对了就给他奖励,做错了就给惩罚,最后达到我们的训练目的。

这里只着重介绍监督学习。

2. 线性回归:

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛,其表达形式为:y=w`x+e(e为误差服从均值为0 的正态分布)。

import torch
from torch.nn import Linear, Module, MSELoss
from torch.optim import SGD
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt 
import seaborn as sns
torch.__version__


x = np.linspace(0,20,500)
#array = numpy.linspace(start, end, num=num_points)
#将在start和end之间生成一个统一的序列,共有num_points个元素。
y = 5 * x + 7
plt.plot(x,y)
#plt.plot(x, y, "格式控制字符串", 关键字=参数),格式控制有颜色,线型,点型,关键字有边缘,填充等


x = np.random.rand(256) #生成256个点
noise = np.random.randn(256) / 4  #噪声
y = x * 5 + 7 + noise  
df = pd.DataFrame()
#DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。==
#DataFrame的单元格可以存放数值、字符串等,这和excel表很像,同时DataFrame可以设置列名columns与行名index。
df['x'] = x
df['y'] = y
sns.lmplot(x='x', y='y', data=df)
#seaborn.lmplot()方法用于将散点图绘制到FacetGrid上。,xy轴

model = Linear(1,1)
#其中参数(1, 1)代表输入输出的特征(feature)数量都是1. 
criterion = MSELoss()
optim = SGD(model.parameters(), lr=0.01)
epochs = 3000
x_train = x.reshape(-1,1).astype('float32')
y_train = y.reshape(-1,1).astype('float32')

for i in range(epochs):
    # 整理输入和输出的数据,这里输入和输出一定要是torch的Tensor类型
    inputs = torch.from_numpy(x_train)
    labels = torch.from_numpy(y_train)
     #使用模型进行预测
    outputs = model(inputs)
    #梯度置0,否则会累加
    optim.zero_grad()
    #计算损失
    loss = criterion(outputs, labels)
    #反向传播
    loss.backward()
    #使用优化器默认方法优化
    optim.step()
    if (i % 100 ==0):
        #每 100次打印一下损失函数,看看效果
        print('epoch {}, loss {:1.4f}'.format(i,loss.data.item()))  

[w,b] = model.parameters()
print(w.item(), b.item())

predicted = model.forward(torch.from_numpy(x_train)).data.numpy()
plt.plot(x_train, y_train, 'go', label='data', alpha=0.3)
plt.plot(x_train, predicted, label = 'predicted', alpha=1)
plt.legend()
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

3. 损失函数:

损失函数(loss function)是用来估量模型的预测值(我们例子中的output)与真实值(例子中的y_train)的不一致程度,它是一个非负实值函数,损失函数越小,模型的鲁棒性就越好。 我们训练模型的过程,就是通过不断的迭代计算,使用梯度下降的优化算法,使得损失函数越来越小。损失函数越小就表示算法达到意义上的最优。

因为PyTorch是使用mini-batch来进行计算的,所以损失函数的计算出来的结果已经对mini-batch取了平均

常见的损失函数:

  • nn.L1loss
    输入x和目标y之间差的绝对值,要求 x 和 y 的维度要一样(可以是向量或者矩阵),得到的 loss 维度也是对应一样的
  • nn.NLLLoss:
    用于多分类的负对数似然损失函数
  • nn.MSELoss:
    均方损失函数 ,输入x和目标y之间均方差
  • nn.CrossEntropyLoss:
    多分类用的交叉熵损失函数,LogSoftMax和NLLLoss集成到一个类中,会调用nn.NLLLoss函数,我们可以理解为CrossEntropyLoss()=log_softmax() + NLLLoss()
  • nn.BCELoss:
    计算x与y之间的二进制交叉熵

4. 梯度下降:

对于普通的梯度下降法,一个epoch只能进行一次梯度下降;而对于Mini-batch梯度下降法,一个epoch可以进行Mini-batch的个数次梯度下降

  • 如果训练样本的大小比较小时,能够一次性的读取到内存中,那我们就不需要使用Mini-batch,
  • 如果训练样本的大小比较大时,一次读入不到内存或者现存中,那我们必须要使用 Mini-batch来分批的计算

torch.optim 是一个实现了各种优化算法的库。

  • torch.optim.SGD
    随机梯度下降法,带有动量(momentum)的算法作为一个可选参数可以进行设置
    如:
#lr参数为学习率,对于SGD来说一般选择0.1 0.01.0.001
##如果设置了momentum,就是带有动量的SGD,可以不设置
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
  • 1
  • 2
  • 3
  • torch.optim.RMSprop
    RMSprop(root mean square prop)也是一种可以加快梯度下降的算法,利用RMSprop算法,可以减小某些维度梯度更新波动较大的情况,使其梯度下降的速度变得更快
#我们的课程基本不会使用到RMSprop所以这里只给一个实例
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99)
  • 1
  • 2
  • torch.optim.Adam
    Adam 优化算法的基本思想就是将 Momentum 和 RMSprop 结合起来形成的一种适用于不同深度学习结构的优化算法
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08)
  • 1

5. 方差/偏差:

  • 偏差度量了学习算法的期望预测与真实结果的偏离程序,即刻画了学习算法本身的拟合能力
  • 方差度量了同样大小的训练集的变动所导致的学习性能的变化,即模型的泛化能力

高偏差的情况一般为欠拟合,即模型没有很好的去适配现有的数据,拟合度不够
高方差的情况一般称作过拟合,即模型对于训练数据的拟合度太高了,失去了泛化能力

如何解决欠拟合和过拟合:
欠拟合:

  • 增加网络结构,如增加隐藏层的数目
  • 训练更长的时间
  • 寻找合适的网络架构,使用更大的NN结构

过拟合:

  • 使用更多的数据
  • 正则化
  • 寻找合适的网络结构

6.正则化 :

利用正则化来解决高方差的问题,正则化是在Cost function 中加入一项正则化项,惩罚模型的复杂度

  • L1正则化
    损失函数基础上加上权重参数的绝对值
  • L2正则化
    损失函数基础上加上权重参数的平方和
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/979952
推荐阅读
相关标签
  

闽ICP备14008679号