线性回归
定义:利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
假设有一个房屋销售的数据如下:
最简单的曲线是直线:
线性回归要素:
房屋销售记录表:训练集(training set)或者训练数据(training
data), 是我们流程中的输入数据,一般称为𝑥
房屋销售价钱:输出数据,一般称为𝑦
拟合的函数(或者称为假设或者模型):一般写做𝑦 = ℎ(𝑥);
如果是直线,则为𝑦 = 𝑘𝑥 + 𝑏
训练数据的条目数(#training set):一条训练数据是由一对输入
数据和输出数据组成的,输入数据的维度𝑛 (特征的个数,
#features)
线性分类
定义:线性分类器则透过特征的线性组合来做出分类决定,以达到此种目的。简言之,样本通过直线(或超平面)可分v
线性分类与线性回归差别:
输出意义不同:属于某类的概率<->回归具体值
参数意义不同:最佳分类直线<->最佳拟合直线
维度不同:前面的例子中,一个是一维的回归,一个是二维
的分类
Sigmoid函数
最终需要概率,结果在0-1之间,因此需要对值
做一个变换:
多分类回归:
神经元模型
多层感知机
XOR问题
线性不可分问题:无法进行线性分类。Minsky 1969年提出XOR问题
解决方法:使用多层感知机
• 在输入和输出层间加一或多层隐单元,构成多层感知器(多层
前馈神经网络)。
• 加一层隐节点(单元)为三层网络,可解决异或(XOR)问题
多层感知器网络,有如下定理:
定理1 若隐层节点(单元)可任意设置,用三层阈值节点的
网络,可以实现任意的二值逻辑函数。
定理2 若隐层节点(单元)可任意设置,用三层S型非线性特
性节点的网络,可以一致逼近紧集上的连续函数或按范数逼近紧
集上的平方可积函数。
BP算法
多层前馈网络
多层前馈网络的反向传播(BP)学习算法,简称BP算法,是有导师的学习,它是梯度下降法在多层前馈网中的应用。
BP算法简述
BP学习算法由正向传播和反向传播组成:
① 正向传播是输入信号从输入层经隐层,传向输出层,若输出层得到了期望的输出,则学习算法结束;否则,转至反向传播。
② 反向传播是将误差(样本输出与网络输出之差)按原联接通路反向计算,由梯度下降法调整各层节点的权值和阈值,使误差减小。
BP算法基本思想
假设网络共有层, (输入层为第0层,输出为第L层)
层:用上标表示,共层;
网络最终输出:
如果是单输出:(输出层可省略层数上标)
多输出:
网络输入:
网络中第1 层输出:为该层线性输出
选取作用函数为Sigmoid 函数,则可记为:
第层第个节点线性输出:
权值连接:,表示连接第l层(本层)第i个节点和第/-1层(上层)第j个节点的权
值
网络中第1 层线性输出: ,W为权值矩阵,列数为上层神经元
数目,行数为本层神经元数目
网络训练的目的,是使对每一个输入样本,调整网络权值参数,使输
出均方误差最小化。这是一个最优化问题。
选取:
为求解上述最小化问题,考虑迭代算法设初始权值为w0,时刻权值为则使用泰勒级数展开,有:
计算过程:
设置初始权系数W0为较小的随机非零值;
@给定输入/输出样本对,计算网络输出,完成前向传播
@计算目标函数J。如J<,训练成功,退出;否则转入@
@反向传播计算由输出层,按梯度下降法将误差反向传播,逐
层调整权值。
BP算法推导
前向传导
考虑二层神经网络(有一层隐含层)。
对于当前样本, 隐含层输出:
对于第层第个神经元,其输出:
(注意:)
f可选取为Log Sigmoid函数:
前向传播:在输出端计算误差
误差反传一一输出层
首先考虑输出层权值。根据链式求导法则,
注意到仅和
有关,(看神经网络图),因此
多层感知机的从零开始实现程序示例
import torch
from torch import nn
from d2l import torch as d2l
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
初始化模型参数
num_inputs, num_outputs, num_hiddens = 784, 10, 256
W1 = nn.Parameter(torch.randn(
num_inputs, num_hiddens, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(torch.randn(
num_hiddens, num_outputs, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
params = [W1, b1, W2, b2]
激活函数
def relu(X):
a = torch.zeros_like(X)
return torch.max(X, a)
模型
def net(X):
X = X.reshape((-1, num_inputs))
H = relu(X@W1 + b1) # 这里“@”代表矩阵乘法
return (H@W2 + b2)
损失函数
loss = nn.CrossEntropyLoss(reduction='none')
训练
num_epochs, lr = 10, 0.1
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
声明:以上来自屈桢深老师课件及多层感知机的从零开始实现 — 动手学深度学习 2.0.0 documentation (d2l.ai)