1. 感知机
1.1 什么是感知机
![](https://i-blog.csdnimg.cn/blog_migrate/1391df7142b246cd2a27b2ddf9fa271c.png)
1.2 w与b的作用
1.3 数据集的线性可分性
![](https://i-blog.csdnimg.cn/blog_migrate/5b1179c1fd167f73e558c067f6ccec4a.png)
1.4 损失函数
损失函数的一个自然选择是误分类点的总数,但是这样损失函数与w和b无关,不是参数w和b的连续可导函数,不易优化。
于是,感知机采用误分类点到超平面S的总距离,如下图
超平面S:—用向量/矩阵表示—WX + b=0
单个样本到超平面S的距离如下公式
其中
对于每个误分类样本来说,都有成立,其中yi是xi样本对应的真实标签值。原因如下:
1.当yi=1,而wxi + b<=0,此时会错误的预测标签值为-1,上述式子成立。而且有下式:
2.当yi=-1,而wxi + b>0,此时会错误的预测标签值为-1,上述式子成立。而且有下式:
于是误分类点到超平面S的总距离可以表示为下式:
此外,1/||w||用来归一化超平面法向量,得到几何间隔,也就是点到超平面的距离,但超平面只要能够将两类样本分类开即可,下图中两条线都是正确的
于是忽略掉1/||w||,最终感知机的损失函数为:
1.5. 感知机的优化器
对于感知机来说,极小化过程中不是一次使M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降,因此感知机的优化器使用的是随机梯度下降(SGD)。
对于一个误分类点,计算该点损失函数的梯度:
更新w,b
代码实现
# 训练参数
epochs = 100
η = 0.1
# 感知机
def perceptron(X, y, η, epochs):
n_samples, n_features = X.shape
# 初始化权重参数
w = np.zeros(n_features)
b = 0
for epoch in range(epochs):
for i in range(n_samples):
# 预测值
y_pred = 1 if (np.dot(X[i], w) + b) > 0 else -1
# 随机梯度下降法随机选择一个误分点进行参数更新
if -y[i]*(np.dot(X[i], w) + b)>=0:
w = w + η * X[i] * y[i]
b = b + η * y[i]
loss += 1
return w, b
# 预测函数
def predict(X,w):
y_pred = np.where(np.dot(X,w)+b>0,1,-1)
return y_pred
w,b = perceptron(trainx,trainy,η,epochs)
5.多层感知机
5.1使用多层感知机解决非线性问题
使用多层感知机解决异或问题:
5.2 多层感知机的基本结构
通过在结构中加入一个或多个隐藏层来克服线性模型的限制, 使其能处理更普遍的函数关系类型。 要做到这一点,最简单的方法是将许多全连接层堆叠在一起,(全连接的意思就是:上一层的任何一个神经元与下一层的所有神经元都有连接)。 3层感知机的示例下所示:
5.3 前向传播
假设有m个样本n个特征的X作为输入层,一个隐藏层的神经元个数为h,则隐藏层的权重矩阵W_h的大小为n×h(每个特征与每个神经元对应一个权重),偏置矩阵b_h大小为1×h。
则隐藏层的输入H为:
H_m×h =XW_h + b_h
假设输出的标签值有q个,则输出层的权重矩阵W_o的大小为h×q,偏置矩阵b_h大小为1×q
隐藏层的输出O为:
O_m×q = HW_o + b_o(每个输入x都对应一个输出值)
5.4 激活函数
如果不加上激活函数,上式仅仅是对数据进行了线性变换,仍然是单层网络
H = XW_h + b_h (线性函数)
O = HW_o + b_o=(XW_h + b_h)W_o + b_o=XW_hW_o + b_hW_o + b_o
将上式子b=b_hW_o + b_o,W=W_hW_o,所以结果仍然是仍然是一个XW + b
引入激活函数对结果进行非线性变换,计算式为:
H = σ(XW_h + b_h) (σ为激活函数)
引入非线性后,使网络可以逼近任意非线性函数
常见的激活函数有:Relu函数、sigmoid函数以及tanh函数。
1. Relu函数
Relu(x) = max(x,0),计算非常简单
其导函数图像为:
不存在梯度消失现象
2. Sigmoid函数
Sigmoid函数可以将输入的任何值映射到(0,1)。注意,当输入接近0时,sigmoid函数接近线性变换
导函数图像如下:
当输入为0时,sigmoid函数的导数达到最大值0.25; 而输入在任一方向上越远离0点时,导数越接近0(饱和区梯度消失现象),此时不利于参数更新。
3. tanh函数(双曲正切函数)
tanh函数可以将输入的任何值映射到(-1,1)
注意,当输入在0附近时,tanh函数接近线性变换。 函数的形状类似于sigmoid函数, 不同的是tanh函数关于坐标系原点中心对称
导函数图像如下图所示:
当输入接近0时,tanh函数的导数接近最大值1。同样存在饱和区梯度消失现象。