深度学习笔记(三)-----------多层感知机(multilayer perceptron,MLP)
一线性回归
线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。
线性回归的基本要素
(一)模型
线性回归假设输出与各个输入之间是线性关系,
例如,我们假设房屋的价格与房子的面积和房龄有关 ,则房价与面积和房龄的关系可以用如下公式表示:
只有一个自变量的情况称为单变量回归,大于一个自变量情况的叫做多元回归
通用公式:
其中w,x可以理解为矩阵: ,
(二)数据集
机器学习一般的数据集会划分为两个部分:训练集和测试集。
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
(三)损失函数
真实结果与我们预测的结果之间存在一定的误差,通过损失函数将这个误差给衡量出来,通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。
(四)优化函数
线性回归经常使用的两种优化算法:正规方程和梯度下降(Gradient Descent)。
大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)BB,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。
学习率: ηη代表在每次优化中,能够学习的步长的大小
批量大小: BB是小批量计算中的批量大小batch size
梯度下降是一个用来求函数最小值的算法。
优化函数的有以下两个步骤:
- 初始化模型参数,一般来说使用随机初始化;
- 我们在数据上迭代多次,通过在负梯度方向移动参数来更新每个参数。
二 SoftMax
模型
softmax函数的本质就是将一个K 维的任意实数向量压缩(映射)成另一个K维的实数向量,其中向量中的每个元素取值都介于(0,1)之间,并且压缩后的K个值相加等于1(变成了概率分布)。在选用Softmax做多分类时,可以根据值的大小来进行多分类的任务,如取权重最大的一维。Softmax回归模型是logistic回归模型在多分类问题上的推广,当分类数为2的时候会退化为Logistic分类。.在多分类问题中,类标签 可以取两个以上的值。 Softmax回归模型对于诸如MNIST手写数字分类等问题是很有用的,该问题的目的是辨识10个不同的单个数字。Softmax回归是有监督的。
交叉熵损失函数
交叉熵损失函数:最小化交叉熵损失函数等价于最大化训练数据集所有标签类别的联合预测概率。
交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。
获取Fashion-MNIST训练集和读取数据
import torchvision
#torchvision.datasets: 一些加载数据的函数及常用的数据集接口;
#torchvision.models: 包含常用的模型结构(含预训练模型),例如AlexNet、VGG、ResNet等;
#torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;
#torchvision.utils: 其他的一些有用的方法。
#其中:
#train-images-idx3-ubyte.gz (训练数据集图片)
#train-labels-idx1-ubyte.gz (训练数据集标记类别)
#t10k-images-idx3-ubyte.gz: (测试数据集)
#t10k-labels-idx1-ubyte.gz(测试数据集标记类别)
mnist_train = torchvision.datasets.FashionMNIST(root='C:/Users/ztc/01My/FashionMNIST2065', train=True, download=True, transform=transforms.ToTensor())
mnist_test = torchvision.datasets.FashionMNIST(root='C:/Users/ztc/01My/FashionMNIST2065', train=False, download=True, transform=transforms.ToTensor())
print(type(mnist_train))
print(len(mnist_train), len(mnist_test))
三 多层感知机:MLP
多层感知机的一个重要特点就是多层,我们将第一层称之为输入层,最后一层称之有输出层,中间的层称之为隐层。MLP并没有规定隐层的数量,因此可以根据各自的需求选择合适的隐层层数。且对于输出层神经元的个数也没有限制。
激活函数
在多层感知机中引入激活函数的原因是,将多个无激活函数的线性层叠加起来,其表达能力与单个线性层相同。
解决问题的一个方法是引入非线性变换,这个非线性函数被称为激活函数(activation function)。
几个常用的激活函数:
ReLU函数
ReLU(rectified linear unit)函数提供了一个很简单的非线性变换。给定元素xx,该函数定义为:
ReLU函数只保留正数元素,并将负数元素清零。
ReLU函数的导数:
Sigmoid函数
sigmoid函数可以将元素的值变换到0和1之间:
sigmoid函数的导数:
当输入为0时,sigmoid函数的导数达到最大值0.25;当输入越偏离0时,sigmoid函数的导数越接近0。
tanh函数
tanh(双曲正切)函数可以将元素的值变换到-1和1之间:
tanh函数的导数:
当输入为0时,tanh函数的导数达到最大值1;当输入越偏离0时,tanh函数的导数越接近0。
关于激活函数的选择
ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。
用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。
在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。
在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。
深度学习笔记(三)-----------多层感知机(multilayer perceptron,MLP)