task 01 线性回归 softmax 多层感知机

线性回归的基本要素

模型

输出与各个输入之间是线性关系,以房价为例:
在这里插入图片描述
初始化模型参数:

w = torch.tensor(np.random.normal(0, 0.01, (num_inputs, 1)), dtype=torch.float32)
b = torch.zeros(1, dtype=torch.float32)

w.requires_grad_(requires_grad=True)
b.requires_grad_(requires_grad=True)

定义模型:

def linreg(X, w, b):
    return torch.mm(X, w) + b

数据集

在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set),一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。特征用来表征样本的特点。

读取数据集
def data_iter(batch_size, features, labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    random.shuffle(indices)  # random read 10 samples
    for i in range(0, num_examples, batch_size):
        j = torch.LongTensor(indices[i: min(i + batch_size, num_examples)]) # the last time may be not enough for a whole batch
        yield  features.index_select(0, j), labels.index_select(0, j)

yield关键字使用参考博客如下:
https://blog.csdn.net/mieleizhi0522/article/details/82142856

损失函数

在模型训练中,我们需要衡量预测值与真实值之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。 它在评估索引为 i 的样本误差的表达式为:
在这里插入图片描述
定义均方误差损失函数:

def squared_loss(y_hat, y): 
    return (y_hat - y.view(y_hat.size())) ** 2 / 2

预测值和真实值维度应保持一致,以如下代码示例:

import torch
x = torch.arange(3)
y = torch.arange(3).view(3, 1)
print(x)
print(y)
print(x + y)

运行结果:

tensor([[0],
        [1],
        [2]])
tensor([[0, 1, 2],
        [1, 2, 3],
        [2, 3, 4]])

优化函数 - 随机梯度下降

当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。

在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法如下:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)β,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。
在这里插入图片描述
学习率: η代表在每次优化中,能够学习的步长的大小
批量大小: β是小批量计算中的批量大小batch size

定义优化函数:

def sgd(params, lr, batch_size): 
    for param in params:
        param.data -= lr * param.grad / batch_size # ues .data to operate param without gradient track

详细算法可参考博客:
https://blog.csdn.net/qq_41800366/article/details/86583789

优化函数的两个步骤:

(i)初始化模型参数,一般来说使用随机初始化;
(ii)我们在数据上迭代多次,通过在负梯度方向移动参数来更新每个参数。

softmax

softmax的基本概念

权重矢量
在这里插入图片描述
神经网络图
在这里插入图片描述
在这里插入图片描述
softmax运算符(softmax operator)它通过下式将输出值变换成值为正且和为1的概率分布:
在这里插入图片描述
其中
在这里插入图片描述定义softmax操作:

def softmax(X):
    X_exp = X.exp()
    partition = X_exp.sum(dim=1, keepdim=True)
    # print("X size is ", X_exp.size())
    # print("partition size is ", partition, partition.size())
    return X_exp / partition  # 这里应用了广播机制

softmax回归对样本i分类的矢量计算表达式为
在这里插入图片描述
小批量矢量计算表达式
在这里插入图片描述

交叉熵损失函数

交叉熵(cross entropy)
在这里插入图片描述
假设训练数据集的样本数为,交叉熵损失函数定义为
在这里插入图片描述
其中Ѳ代表模型参数。q为输出个数(类别数)

多层感知机

隐藏层

在这里插入图片描述

表达公式

在这里插入图片描述

激活函数

全连接层只是对数据做仿射变换(affine transformation),而多个仿射变换的叠加仍然是一个仿射变换。解决问题的一个方法是引入非线性变换,例如对隐藏变量使用按元素运算的非线性函数进行变换,然后再作为下一个全连接层的输入。这个非线性函数被称为激活函数(activation function)。

ReLU函数

ReLU(rectified linear unit)函数提供了一个很简单的非线性变换。给定元素x,该函数定义为
在这里插入图片描述

激活函数选择

ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。

用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。

在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。

在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。
多层感知机就是含有至少一个隐藏层的由全连接层组成的神经网络,且每个隐藏层的输出通过激活函数进行变换。多层感知机的层数和各隐藏层中隐藏单元个数都是超参数。以单隐藏层为例并沿用本节之前定义的符号,多层感知机按以下方式计算输出:
在这里插入图片描述

发布了2 篇原创文章 · 获赞 0 · 访问量 28

猜你喜欢

转载自blog.csdn.net/qq_41101436/article/details/104291647
今日推荐