神经网络:线性回归和softmax函数回归(结合mxnet框架)

13 篇文章 0 订阅
7 篇文章 0 订阅

线性回归输出的是一个连续值,因此适用于回归问题;而softmax回归则适用于分类问题。

线性回归的基本要素:

模型: {y}^{(i)} = x_{1}^{(i)}w_{1} + x_{2}^{(i)}w_{2} + b,   其中x1, x2是影响输出结果的各个样本的特征值, w1, w2是对应特征的权重,b是偏差值。

模型训练:训练的过程,通过训练样本的数据寻找接近正确的各参数,使模型在测试数据集上的误差尽可能小。

训练数据:在机器属于中,用来训练模型的数据集称为训练数据集训练集,数据中的每一条数据包含若干个特征,以及这个这条数据的正确输出称为标签

假设我们采集的样本数为n,索引为i的样本的特征为x(i) 1 和x(i) 2 ,标签为y(i)。对于索引为i的房屋, 线性回归模型的房屋价格预测表达式为:
                                               \hat{}{y}^{(i)} = x_{1}^{(i)}w_{1} + x_{2}^{(i)}w_{2} + b

损失函数:在机器学习中,将衡量误差的函数称为损失函数。

常用的损失函数是平方函数:

计算每个样本的误差:        l^{(i)}(w1, w2, b) = (\hat{y}^{(i)} - y^{(i)})^{2} / 2

所有样本的数据集总误差:        l(w_{1}, w_{2}, b) = \sum_{i=1}^{n}l^{(i)}(w_{1}, w_{2}, b) / n = \sum_{i=1}^{n}(x_{1}^{(i)}w_{1} + x_{2}^{(i)}w_{2} + b - y^{(i)})^{2} / 2n

优化算法:当模型和损失函数形式较为简单时,上⾯的误差最小化问题的解可以直接⽤公式表达出来。这类 解叫作解析解。能通过优化算法有限次迭代模型参数来尽可能降低损失函 数的值。这类解叫作数值解。

算法的原理很简单,先随机选取一组模型参数的初始值;接下来对 参数进⾏多次迭代,使每次迭代都可能降低损失函数的值。

在优化的过程中,上述的简单模型(只有俩个权重)的每个参数将做如下迭代:
w_{1} = w_{1} - \frac{\eta }{\left | \beta \right |} \sum\frac{\partial l^{(i)}(w_{1}, w_{2}, b)}{\partial w_{1}} = w_{1} - \frac{\eta }{\left | \beta \right |}\sum x_{1}^{(i)}(x_{1}^{(i)}w_{1} + x_{2}^{(i)}w_{2} + b - y^{(i)})

w_{2} = w_{2} - \frac{\eta }{\left | \beta \right |} \sum\frac{\partial l^{(i)}(w_{1}, w_{2}, b)}{\partial w_{2}} = w_{2} - \frac{\eta }{\left | \beta \right |}\sum x_{2}^{(i)}(x_{1}^{(i)}w_{1} + x_{2}^{(i)}w_{2} + b - y^{(i)})

       b = b - \frac{\eta }{\left | \beta \right |} \sum\frac{\partial l^{(i)}(w_{1}, w_{2}, b)}{\partial b} = b - \frac{\eta }{\left | \beta \right |}\sum (x_{1}^{(i)}w_{1} + x_{2}^{(i)}w_{2} + b - y^{(i)})

|B|代表每个小批量数据集中样本数目,η称作学习率

模型预测:训练好的模型就可以用来预测。

 

线性回归和神经网络的联系

以上面的模型函数(只有俩个特征)为例子,输入层的俩个神经元相当于函数中的俩个权重系数,当我们输入特征值后输出一个结果。o依赖于x1和x2。

这里先说一下全连接层,全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到特征综合起来。在上述的输出层依赖于俩个特征(全部),所以这个输出层是一个简单的全连接层。

 

用mxnet实现线性回归模型:

生成数据集:

from mxnet import autograd, nd  # 从mxnet到入自动求梯度的包autograd,向量运算包nd

num_inputs = 2   # 样本的特征数量是2
num_examples = 1000   # 一共有1000个训练样本
true_w = [2, -3.4]   # 设置正确的权重参数
true_b = 4.2     #  设置正确的偏重参数
features = nd.random.normal(scale=1, shape=(num_examples, num_inputs))  # 生成一个1000x2的特征样本
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b  # 生成1000个样本的标签
labels += nd.random.normal(scale=0.01, shape=labels.shape)  # 加入无意义的干扰

读取数据:

from mxnet.gluon import data as gdata   # Gluon提供了data包来读取数据
batch_size = 10 # 将训练数据的特征和标签组合 
dataset = gdata.ArrayDataset(features, labels) # 随机读取⼩批量 
data_iter = gdata.DataLoader(dataset, batch_size, shuffle=True) # 读取小数据集

定义模型:

from mxnet.gluon import nn  
# 导⼊nn模块。实际上,“nn”是neuralnetworks(神经⽹络)的缩写。顾名思义,该模块定 义了⼤量神经⽹络的层。
net = nn.Sequential() # 定义⼀个模型变量net,它是⼀个Sequential实例。
net.add(nn.Dense(1)) # Dense是一个全连接层实例

初始化模型参数:

from mxnet import init  # 从MXNet导 ⼊init模块。该模块提供了模型参数初始化的各种⽅法。
net.initialize(init.Normal(sigma=0.01)) 

定义损失函数:

from mxnet.gluon import loss as gloss # loss模块定义了各种损失函数
loss = gloss.L2Loss() # 平⽅损失⼜称L2范数损失 

定义优化算法:

from mxnet import gluon
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.03})
# 创建⼀个Trainer实例,并 指定学习率为0.03的小批量随机梯度下降(sgd)为优化算法

训练模型:

num_epochs = 3 
for epoch in range(1, num_epochs + 1): 
    for X, y in data_iter: 
        with autograd.record(): 
            l = loss(net(X), y) 
        l.backward() 
        trainer.step(batch_size) 
    l = loss(net(features), labels) 
    print('epoch %d, loss: %f' % (epoch, l.mean().asnumpy())) 

softmax函数回归

前面已经说过softmax函数适用于分类问题

现在先假设我们有一个四个特征权重和三个分类的模型,神经网络图如下

与线性回归相比较:
来看看线性回归和softmax函数回归的神经网络图区别,线性回归的神经网络中的输出层只有一个神经元o,它是一个连续值。而softmax的输出层是三个神经元,每个神经元代表了一个分类,这上面的数值是分为该类的概率值。这俩个神经网络的输出层都是一个全连接层。

由上面的模型我们可以看出,输出的值为:

o_{1} = x_{1}w_{11} + x_{2}w_{21} + x_{3}w_{31} + x_{4}w_{41} + b_{1}

o_{2} = x_{1}w_{12} + x_{2}w_{22} + x_{3}w_{32} + x_{4}w_{42} + b_{2}

o_{3} = x_{1}w_{13} + x_{2}w_{23} + x_{3}w_{33} + x_{4}w_{43} + b_{3}

如果我们以现在的三个输出中最大的数相对应的分类作为结果,存在以下问题,

1.  由于输出层的输出值的范围不确定,我们难 以直观上判断这些值的意义。例如,刚才举的例⼦中的输出值10表⽰“很置信”图像类别为猫, 因为该输出值是其他两类的输出值的100倍。但如果o1 = o3 = 103,那么输出值10却⼜表⽰图像类别为猫的概率很低。

2.  由于真实标签是离散值,这些离散值与不确定范围的输出值之 间的误差难以衡量。 

softmax运算:

softmax运算解决了上面存在的问题。

我们对o1, o2, o3 做以下运算 :

\hat{y}_{1},\hat{y}_{2},\hat{y}_{3} = softmax(o_{1}, o_{2}, o_{3})      其中:

\hat{y}_{1} = \frac{exp(o_{1})}{\sum_{i=1}^{3}exp(o_{i})}, \hat{y}_{2} = \frac{exp(o_{2})}{\sum_{i=1}^{3}exp(o_{i})}, \hat{y}_{3} = \frac{exp(o_{3})}{\sum_{i=1}^{3}exp(o_{i})}      可以看出三个值都处于0到1之间,并且三个值相加为1.

现在来理一下样本分类的矢量计算:

假设有n个样本,每个样本有k个特征,有d个分类结果。则样本矢量 是一个 nxk 的举证,权重矢量是一个 kXq 的矩阵,俩个相乘的矩阵是一个nxq的举证,此时每一行的代表每一个样本,每一列代表每一个分类,其中的每一个元素代表每一个样本被分在所在列类别的概率。

交叉熵损失函数:

交叉熵是一个信息论中的概念,它原来是用来估算平均编码长度的。给定两个概率分布p和q,通过q来表示p的交叉熵为:

                                     H(p, q) = -\sum_{x}^{ } p(x)logq(x)

计算每一个样本的交叉熵函数: H(y^{(i)}, \hat{y}^{(i)}) = -\sum_{j=1}^{q} y_{j}^{(i)}log \hat{y}_{j}^{(i)}  其中带下标的y(i) j 是向量y(i)中⾮0即1的元素,需要注意将它与样本i类别的离散数值,即不 带下标的y(i)区分。在上式中,我们知道向量y(i)中只有第y(i)个元素y(i) y(i)为1,其余全为0,于 是H(y(i), ˆ y(i)) = −log ˆ y(i) y(i)。也就是说,交叉熵只关⼼对正确类别的预测概率,因为只要其值⾜ 够⼤,就可以确保分类结果正确。

当训练数据集有n个样本时,交叉熵函数定义为:l(\Theta ) = \frac{1}{n}\sum_{i=1}^{n}H(y^{(i)}, \hat{y}^{(i)}) 其中Θ代表模型参数。同样地,如果每个样本只有⼀个标签,那么交叉熵损失可以简写成ℓ(Θ) = −(1/n)∑n i=1 log ˆ y(i) y(i)。从另⼀个⻆度来看,我们知道最小化ℓ(Θ)等价于最⼤化exp(−nℓ(Θ)) = ∏n i=1 ˆ y(i) y(i),即最小化交叉熵损失函数等价于最⼤化训练数据集所有标签类别的联合预测概率。 

我们来举一个小例子,使交叉熵函数的效果更清晰:

举个例子,假设有一个3分类问题,某个样例的正确答案是(1,0,0),这个模型经过softmax回归之后的预测答案是(0.5,0.4,0.1),那么预测和正确答案之间的交叉熵为:

如果另一个模型的预测是(0.8,0.1,0.1),那么这个预测值和真实值之间的交叉熵是:

显然我们看到第二个预测要优于第一个。这里的(1,0,0)就是正确答案p,(0.5,0.4,0.1)和(0.8,0.1,0.1)就是预测值q,显然用(0.8,0.1,0.1)表达(1,0,0)的困难程度更小。

 

参考文献,博客:

《动手学深度学习》

https://blog.csdn.net/weixin_37567451/article/details/80895309

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值