人工智能最早的模型之一
模型定义
给一个输入 X X X 权重 W W W 偏移量 b b b 有
o = σ ( < W , X > + b ) o = \sigma(
其中 σ \sigma σ函数的选择很多,举例一个二分类问题
σ ( x ) = { 1 ( x > 0 ) − 1 ( x ≤ 0 ) \sigma(x) = \begin{cases} 1 &(x > 0)\\ -1 &(x \leq 0)\\ \end{cases} σ(x)={1−1(x>0)(x≤0)
区别于之前两种
收敛定理(完全不懂这里先照抄原文了)
如果数据在半径 r r r内,余量 ρ \rho ρ分割为两类
y ( X T W + b ) ≥ ρ y(X^TW + b) \geq \rho y(XTW+b)≥ρ
那么对于
∣ ∣ W ∣ ∣ 2 + b 2 ≤ 1 ||W||^2 + b^2 \leq 1 ∣∣W∣∣2+b2≤1
感知机可以保证在 r 2 + 1 ρ 2 \frac {r^2 + 1} {\rho^2} ρ2r2+1步后收敛
XOR问题
感知机不能拟合XOR函数,只能产生线性分割面
XOR – 亦或问题
输入相同输出0
输入不同输出1
过于简单不能处理XOR问题,导致第一次AI寒冬
五个隐藏层的多层感知机如图
softmax操作 将所有的输出变换到(0,1)区间内且所有输出的和为1
y 1 , y 2 , y 3 , . . . , y k = s o f t m a x ( o 1 , o 2 , o 3 , . . . , o k ) y_1,y_2,y_3,...,y_k = softmax(o_1,o_2,o_3,...,o_k) y1,y2,y3,...,yk=softmax(o1,o2,o3,...,ok)
1.输入 x x x n维列向量
2.隐藏层一个 W 1 W_1 W1 mn的矩阵 b 1 b_1 b1 m维列向量
3.输出层 W 2 W_2 W2 mk的矩阵 b 2 b_2 b2 k维列向量(k类输出罢了)
和softmax回归相同, σ \sigma σ函数是激活函数
h = σ ( W 1 x + b 1 ) h = \sigma(W_1x + b_1) h=σ(W1x+b1)
输出
o = W 2 T h + b 2 o = W_2^Th + b_2 o=W2Th+b2
最终softmax处理
y = s o f t m a x ( o ) y = softmax(o) y=softmax(o)
激活函数通过计算加权和并加上偏置来确定神经元是否应该被激活
激活函数一定要使用非线性函数
如果使用线性函数可以发现结果和一个单层的感知机是一样的,没有意义
sigmoid函数(考研数学张宇强调过)
将输入投影到(0,1)区间
s i g m o i d ( x ) = 1 1 + e − x sigmoid(x) = \frac 1 {1 + e^{-x}} sigmoid(x)=1+e−x1
与0x00中的 σ \sigma σ函数相比,比较soft,因为不包含不可导区间
函数图像如下
Tanh函数
将输入投影到(-1,1)区间
T a n h ( x ) = 1 − e − 2 x 1 + e − 2 x Tanh(x) = \frac {1-e^{-2x}} {1+e^{-2x}} Tanh(x)=1+e−2x1−e−2x
函数图像如下
ReLU函数(最常用的)
max函数换名 计算很快
R e L U ( x ) = m a x ( x , 0 ) ReLU(x) = max(x,0) ReLU(x)=max(x,0)
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 = 784
num_outputs = 10
num_hiddens = 256 # 隐藏层个数
# 隐藏层
W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_grad=True)) # 784行 256列
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True)) # 256
# 输出层
W2 = nn.Parameter(torch.randn(num_hiddens, num_outputs, requires_grad=True)) # 256 * 10
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True)) # 10
params = [W1, b1, W2, b2]
# ReLU函数
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 = 10
lr = 0.1
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
import torch
from torch import nn
from d2l import torch as d2l
# 多层感知机简洁实现,和softmax没有什么太大区别
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)
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)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)