一、单层感知机
1、感知机是二分类问题
2、虽然都是一个输出,但线性回归输出是一个实数;与softmax相比,softmax有多少类就有多少输出元素,是一个多分类问题;而感知机输出的是一个离散的类,是一个二分类问题,可以0、1,也可以1、-1。
3、yi是标号,[<w,xi>+b]是预测,只有这两个同号才说明分类是对的;如果不对,标号乘以样本加权重做权重更新,偏差也做更新;循环直至所有类分类正确。
4、对损失函数,如果分类正确y<w,x>大于0,损失函数值取0,就没有梯度不用更新;若分类错误,就进入上面的if循环,进行权重及偏差更新。
5、收敛定理
||w||^2+b^2<=1是线性分割面,相当于划一根线将二分类分隔开。
6、但单层感知机不能解决XOR问题,因为只能产生线性分割面,不能通过一根线将其分开。
7、总结
二、多层感知机
1、XOR引入
通过蓝色的线和黄色的线将其分隔,将1234分类正负,再进行一次product运算将其分开,就相当于多了一层的计算,最终将其分类。
2、单隐藏层单分类
(1)隐藏层大小是超参数
(2)输出的o为标量
(3)如果没有激活函数,西格玛是线性,最终的o依旧是线性函数,相当于单层感知机,激活函数防止层数坍塌。
3、常见激活函数
原来的只有0,1两种情况,太硬了,交界点不好求导,我们要用软一点的激活函数
(1)Sigmoid激活函数,将投影输出到(0,1)
(2)Tanh激活函数,将投影输出到(-1,1)
(3)ReLU激活函数,这个最简单,因为前面的激活函数要算e的指数,需要不小的代价
三、多类分类问题
1、将softmax中间加上隐藏层
2、多隐藏层问题
层数大小我们需要设定,最好慢慢压缩。
3、总结
四、多层感知机从零实现
1、导包
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)
2、初始化模型参数
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]
3、激活函数
def relu(X): a = torch.zeros_like(X) return torch.max(X, a)
4、模型
def net(X): #将x改变形状为1*784的二维矩阵 X = X.reshape((-1, num_inputs)) H = relu(X@W1 + b1) # 这里“@”代表矩阵乘法 return (H@W2 + b2)
5、损失函数
loss = nn.CrossEntropyLoss(reduction='none')
6、训练
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)
五、快速实现
1、导包
import torch from torch import nn from d2l import torch as d2l
2、模型
net = nn.Sequential(nn.Flatten(),nn.Linear(784, 256),nn.ReLU(),nn.Linear(256, 10)) def init_weights(m): if type(m) == nn.Linear: nn.init.normal_(m.weight, std=0.01) net.apply(init_weights);
3、反正直接用模块的东西
batch_size, lr, num_epochs = 256, 0.1, 10 loss = nn.CrossEntropyLoss(reduction='none') trainer = torch.optim.SGD(net.parameters(), lr=lr)
4、训练
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size) d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)