1.4.感知机

感知机

​ 给定输入xxx,权重www,和偏移bbb,感知机输出:
在这里插入图片描述

在这里插入图片描述

或者是二分类:-1或1
在这里插入图片描述

伪代码

在这里插入图片描述

yiy_iyi表示真实类,与预测类相乘小于等于0,则说明不相等,预测错了,则更新模型。

​ 等价于使用批量大小为1的梯度下降

使用的损失函数

l(y,x,w)=max(0,−y<w,x>) l(y,x,w)=max(0,-y<w,x>) l(y,x,w)=max(0,y<w,x>)

​ 如果分类正确,则−y<w,x>-y<w,x>y<w,x>小于0,则损失为0,即if语句不成立。

​ 如果分类错误,则有梯度,需要计算梯度,这里的w,xw,xw,x是增广过的,含有b,未增广应该为<w,x>+b<w,x>+b<w,x>+b

在这里插入图片描述

​ 每出现一只狗(红色),则朝下推一些,每出现一只猫(蓝色),则朝上推一些

收敛定理

​ 感知机是一个很简单的

假设

  • 数据在半径rrr

  • 存在余量ρ\rhoρ分类两类

    y(xTw+b)≥ρy(x^Tw+b)\ge\rhoy(xTw+b)ρ

对于∣∣w∣∣2+b2≤1,||w||^2+b^2\le 1,∣∣w2+b21,感知机保证在r2+1ρ2\frac{r^2+1}{\rho^2}ρ2r2+1步后收敛

XOR问题

​ 感知机不能拟合XOR函数,它只能产生线性分割面,导致第一次AI寒冬

在这里插入图片描述

多层感知机

XOR问题

在这里插入图片描述

​ 使用两个感知机,做两次,则变为了多层

单隐藏层

在这里插入图片描述

单分类

输入x∈Rnx\in \R^nxRn

隐藏层W1∈Rm×n,b1∈RmW_1\in \R^{m\times n},b_1\in\R ^mW1Rm×n,b1Rm

输出层w2∈Rm,b2∈Rw_2\in \R^m,b_2\in \Rw2Rm,b2R(单分类,只输出一个)

假设有m个隐藏层,
h=σ(W1x+b1)o=w2Th+b2 h=\sigma(W_1x+b_1)\\ o=w_2^Th+b_2 h=σ(W1x+b1)o=w2Th+b2
σ\sigmaσ是按元素的激活函数(非线性的)

如果激活函数是线性的,假设是本身,即σ(x)=x\sigma(x)=xσ(x)=x


h=W1x+b1o=w2TW1x+b′ h=W_1x+b_1\\ o=w_2^TW_1x+b' h=W1x+b1o=w2TW1x+b
输出仍然是一个线性函数,依旧等价于一个单层的感知机

Sigmoid激活函数

将输入投影到(0,1),速率变化比较好,非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移(BiasShift,并进一步使得梯度下降的收敛速度变慢.
sigmoid(x)=11+exp(−x) sigmoid(x)=\frac{1}{1+exp(-x)} sigmoid(x)=1+exp(x)1

Tanh激活函数

将输入投影到(-1,1),
tanh(x)=ex−e−xex+e−x=2×sigmoid(2x)−1 tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}=2\times sigmoid(2x)-1 tanh(x)=ex+exexex=2×sigmoid(2x)1
在这里插入图片描述

ReLU激活函数

ReLU:rectified linear unit
ReLU(x)=max(x,0) ReLU(x)=max(x,0) ReLU(x)=max(x,0)
在这里插入图片描述

多类分类


y1,y2,⋯ ,yk=softmax(o1,o2,⋯ ,ok) y_1,y_2,\cdots,y_k=softmax(o_1,o_2,\cdots,o_k) y1,y2,,yk=softmax(o1,o2,,ok)
输入x∈Rnx\in \R^nxRn

隐藏层W1∈Rm×n,b1∈RmW_1\in \R^{m\times n},b_1\in\R ^mW1Rm×n,b1Rm

输出层w2∈Rm×k,b2∈Rkw_2\in \R^{m\times k},b_2\in \R^kw2Rm×k,b2Rk(k分类,输出k个)

假设有m个隐藏层,
h=σ(W1x+b1)o=w2Th+b2y=softmax(o) h=\sigma(W_1x+b_1)\\ o=w_2^Th+b_2\\ y=softmax(o) h=σ(W1x+b1)o=w2Th+b2y=softmax(o)
σ\sigmaσ是按元素的激活函数(非线性的)

多隐藏层

h1=σ(W1x+b1)h2=σ(W2x+b2)h3=σ(W3x+b3)o=W4h3+b4 h_1=\sigma(W_1x+b_1)\\ h_2=\sigma(W_2x+b_2)\\ h_3=\sigma(W_3x+b_3)\\ o = W_4h_3+b_4 h1=σ(W1x+b1)h2=σ(W2x+b2)h3=σ(W3x+b3)o=W4h3+b4

超参数:

  • 隐藏层数
  • 每层隐藏层的大小

在这里插入图片描述

代码实现

import torch
from torch import nn
from d2l import torch as d2l
import util

d2l.use_svg_display()  # 使用svg来显示图片
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

# 输入的维度,输出的维度,隐藏层的个数在输入和输出的维度之间
num_inputs, num_outputs, num_hiddens = 784, 10, 256

# randn初始为随机的(输入维度,输出维度,需要更新,则需要梯度)
W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_grad=True))
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))

W2 = nn.Parameter(torch.randn(num_hiddens, num_outputs, requires_grad=True))
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()

num_epochs, lr = 10, 0.1
updater = torch.optim.SGD(params, lr=lr)
util.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
d2l.plt.show()

'''简洁实现'''
net = nn.Sequential(nn.Flatten(), nn.Linear(num_inputs, 256), nn.ReLU(), nn.Linear(256, num_outputs))


def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)


net.apply(init_weights)

batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss()
trainer = torch.optim.SGD(net.parameters(), lr=lr)

train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
util.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值