独家连载 | 单层感知器与线性神经网络(续)!

前言:让我们基于上次没有讲完的单层感知器与线性神经网络继续。

3.2.6学习率

学习率是人为设定的一个值,主要是在训练阶段用来控制模型参数调整的快慢。关于学习率主要有3个要点需要注意:
1.η取值一般取0-1之间;
2.太大容易造成权值调整不稳定;
3.学习率太小,模型参数调整太慢,迭代次数太多。

你可以想象一下在洗热水澡的时候:如果每次调节的幅度很大,那水温要不就是太热,要不就是太冷,很难得到一个合适的水温;如果一开始的时候水很冷,每次调节的幅度都非常小,那么需要调节很多次,花很长时间才能得到一个合适的水温。学习率的调整也是这样一个道理。

图3.5表示不同大小的学习率对模型训练的影响:

独家连载 | 单层感知器与线性神经网络(续)!_第1张图片

图中的纵坐标loss代表代价函数,在后面的章节中有更详细的介绍,这里我们可以把它近似理解为模型的预测值与真实值之间的误差,我们训练模型的主要目的就是为了降低loss值,减少模型预测值与真实值之间的误差。横坐标Epoch代表模型的迭代周期,把所有训练数据都训练一遍可以称为迭代了一个周期。

从图中我们可以看到,如果使用非常大的学习率来训练模型,loss会一直处于一个比较大的位置,模型不能收敛,这肯定不是我们想要的结果。如果使用比较大的学习率来训练模型,loss会下降很快,但是最后loss最终不能得到比较比较小的值,所以结果也不理想。如果使用比较小的学习率来训练模型,模型收敛的速度会很慢,需要等待很长时间模型才能收敛。最理想的结果是使用合适的学习率来训练模型,使用合适的学习率,模型的loss值下降得比较快,并且最后的loss也能够下降到一个比较小的位置,结果最理想。

看到这里大家可能会有一个疑问,学习率的值到底取多少比较合适?这个问题其实是没有明确答案的,需要根据建模的经验以及测试才能找到合适的学习率。不过学习率的选择也有一些小的trick可以使用,比如说最开始我们设置一个学习率为0.01,经过测试我们发现学习率太小了需要调大一点,那么我们可以改成0.03。如果0.03还需要调大,我们可以调到0.1。同理,如果0.01太大了,需要调小,那么我们可以调到0.003。如果0.003还需要调小,我们可以调到0.001。所以常用的学习率可以选择:

1,0.3,0.1,0.03,0.01,0.003,0.001,0.0003,0.0001 …

当然这也不是绝对的,其他的学习率的取值你也可以去尝试。

####3.2.7模型的收敛条件

通常模型的收敛条件可以有以下3个:

  1. loss小于某个预先设定的较小的值;

  2. 两次迭代之间权值的变化已经很小了;

  3. 设定最大迭代次数,当迭代超过最大次数就停止。

第一种很容易理解,模型的训练目的就是为了减少loss值,那么我们可以设定一个比较小的数值,每一次训练的时候我们都同时计算一下loss值的大小,当loss值小于某个预先设定的阈值,就可以认为模型收敛了。那么就可以结束训练。

第二种的意思是,每一次训练我们可以记录模型权值的变化,如果我们发现两次迭代之间模型的权值变化已经很小,那么说明模型已经几乎不需要做权值地调整了,那么就可以认为模型收敛,可以结束训练。

第三种是用得最多的方式。我们可以预先设定一个比较大的模型迭代周期,比如迭代100次,或者10000次,或者1000000次等(需要根据实际情况来选择)。模型完成规定次数的训练之后我们就可以认为模型训练完毕。

####3.2.8超参数(hyperparameters)和参数(parameters)的区别

超参数是机器学习或者深度学习中经常用到的一个概念,我们可以认为是根据经验来人为设置的一些模型的参数。比如说前面提到的学习率,学习率需要根据经验来人为设置。比如模型的迭代次数,也是需要在模型训练之前预先进行人为设置。

而前面提到的权值和偏置值则是参数,一般我们会给权值和偏置值进行随机初始化赋值。模型在训练过程中根据训练数量会不断调节这些参数,进行自动学习。

####3.2.9单层感知器分类案例

题目:假设我们有4个数据2维的数据,数据的特征分别是(3,3),(4,3),(1,1),(2,1)。(3,3),(4,3)这两个数据的标签为1,(1,1),(2,1)这两个数据的标签为-1。构建神经网络来进行分类。

思路:我们要分类的数据是2维数据,所以只需要2个输入节点,我们可以把神经元的偏置值也设置成一个输入节点,使用3.2.3中的方式。这样我们需要3个输入节点。

输入数据有4个(1,3,3),(1,4,3),(1,1,1),(1,2,1)

数据对应的标签为(1,1,-1,-1)

初始化权值w1,w2,w3取0到1的随机数

学习率lr(learning rate)设置为0.1

激活函数为sign函数

我们可以构建一个单层感知器如图3.6所示:

独家连载 | 单层感知器与线性神经网络(续)!_第2张图片

代码3-3:单层感知器案例

import numpy as np
import matplotlib.pyplot as plt
# 定义输入,我们习惯上用一行代表一个数据
X = np.array([[1,3,3],[1,4,3], [1,1,1],[1,2,1]]
# 定义标签,我们习惯上用一行表示一个数据的标签
T = np.array([[1],[1],[-1],[-1]])
# 权值初始化,3行1列
# np.random.random可以生成0-1的随机数
W = np.random.random([3,1])
# 学习率设置
lr = 0.1
# 神经网络输出
Y = 0
# 更新一次权值
def train():
    # 使用全局变量X,Y,W,lr
    global X,Y,W,lr
    # 同时计算4个数据的预测值
    # Y的形状为(4,1)-4行1列
    Y = np.sign(np.dot(X,W))
    # T - Y得到4个的标签值与预测值的误差E。形状为(4,1)
    E = T - Y
    # X.T表示X的装置矩阵,形状为(3,4)
    # 我们一共有4个数据,每个数据3个值。定义第i个数据的第j个特征值为xij
    # 如第1个数据,第2个值为x12
    # X.T.dot(T - Y)为一个3行1列的数据:
    # 第1行等于:x00×e0+x10×e1+x20×e2+x30×e3,它会调整第1个神经元对应的权值
    # 第2行等于:x01×e0+x11×e1+x21×e2+x31×e3,它会调整第2个神经元对应的权值
    # 第3行等于:x02×e0+x12×e1+x22×e2+x32×e3,它会影调整3个神经元对应的权值
   # X.shape表示X的形状X.shape[0]得到X的行数,表示有多少个数据
   # X.shape[1]得到列数,表示每个数据有多少个特征值。
   # 除以X.shape[0]相当于是求所有样本权值调整的累加结果的平均值
    delta_W = lr  (X.T.dot(E)) / X.shape[0]
    W = W + delta_W
# 训练100次
for i in range(100):
    # 更新一次权值
    train()
    # 打印当前训练次数
    print('epoch:',i + 1)
    # 打印当前权值
    print('weights:',W)
    # 计算当前输出
    Y = np.sign(np.dot(X,W))
    # .all()表示Y中的所有值跟T中所有值都对应相等,结果才为真
    if(Y == T).all():
        print('Finished')
        # 跳出循环
        break
#————————以下为画图部分————————#
# 正样本的xy坐标
x1 = [3,4]
y1 = [3,3]
# 负样本的xy坐标
x2 = [1,2]
y2 = [1,1]
# 计算分界线的斜率以及截距
# 因为正负样本的分界是0,所以分界线的表达式可以写成:
# w0 × x0 + w1 × x1 + w2 × x2 = 0
# 其中x0为1,我们可以把x1,x2分别看成是平面坐标系中的x和y
# 可以得到:w0 + w1×x + w2 × y = 0
# 从而推导出:y = -w0/w2 - w1×x/w2,因此可以得到
k = -W[1]/W[2]
d = -W[0]/W[2]
# 设定两个点
xdata = (0,5)
# 通过两个点来确定一条直线,用红色的线来画出分界线
plt.plot(xdata,xdata k+d,'r')
# 用蓝色的点画出正样本
plt.scatter(x1,y1,c='b')
# 用黄色的点来画出负样本
plt.scatter(x2,y2,c='y')
# 显示图案
plt.show()

程序的输出结果为:

epoch: 1
weights: [[-0.06390143]
 [ 0.58589308]
 [ 0.25649672]]
epoch: 2
weights: [[-0.16390143]
 [ 0.43589308]
 [ 0.15649672]]
epoch: 3
weights: [[-0.26390143]
 [ 0.28589308]
 [ 0.05649672]]
epoch: 4
weights: [[-0.36390143]
 [ 0.13589308]
 [-0.04350328]]
epoch: 5
weights: [[-0.31390143]
 [ 0.28589308]
 [ 0.10649672]]
epoch: 6
weights: [[-0.41390143]
 [ 0.13589308]
 [ 0.00649672]]
Finished

独家连载 | 单层感知器与线性神经网络(续)!_第3张图片

因为权值的初始化使用的是随机的初始化方式,所以每一次训练的周期以及画出来的图可能都是不一样的。这里我们可以看到单层感知器的一个问题,虽然单层感知器可以顺利地完成分类任务,但是使用单层感知器来做分类的时候,最后得到的分类边界距离蓝色的边界点比较近,而距离黄色的边界点比较远,并不是一个特别理想的分类效果。

图3.7中的分类效果应该才是比较理想的分类效果,分界线距离黄色和蓝色两个类别边界点的距离是差不多的。

独家连载 | 单层感知器与线性神经网络(续)!_第4张图片

作者介绍

独家连载 | 单层感知器与线性神经网络(续)!_第5张图片

你可能感兴趣的:(独家连载 | 单层感知器与线性神经网络(续)!)