Task1中总共分为3个部分:线性回归softmax多层感知机

因为之前有些基础,所以3个部分原理部分都大致比较清楚,由于对pytorch不是那么熟悉,所以下面主要对之前不熟悉的一些函数方法进行总结,并对部分算法细节进行补充。

1. 线性回归

线性回归相当于一个两层的神经网络,只有输入层与输出层,且输出层的神经元个数为1,无激活函数,损失函数为MSE。

我的问题主要集中在mini-batch随机梯度下降
多层感知机 作用 多层感知机的特点_算法
上式中,多层感知机 作用 多层感知机的特点_python_02

其实现代码如下所示:

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
# 调用sgd
sgd([w, b], lr, batch_size)

上面代码中有两个点需要注意:

  1. param.data
    以x指代param,对x.data, x.detach(), x.item()进行区分:
    x.data 与 x.detach() 返回的 tensor 有相同的地方, 也有不同的地方:
    相同:
  • 都和 x 共享同一块数据
  • 都和 x 的 计算历史无关
  • requires_grad = False

不同:

  • y=x.detach()返回一个新的Variable,从当前计算图中分离下来的,但是仍指向原变量的存放位置,不同之处只是requires_grad为false,得到的这个Variable永远不需要计算其梯度,不具有grad。
    即使之后重新将它的requires_grad置为true,它也不会具有梯度grad
    这样我们就会继续使用这个新的Variable进行计算,后面当我们进行反向传播时,到该调用detach()的Variable就会停止,不能再继续向前进行传播
  • y=x.data 在某些情况下不安全。.data的修改不会被autograd追踪,这样当进行backward()时它不会报错,回得到一个错误的backward值。

关于x.item()用法:

一个元素张量可以用item得到元素值,请注意这里的print(x)和print(x.item())值是不一样的,一个是打印张量,一个是打印元素:

x = torch.randn(1)
print(x)
print(x.item())

#结果是
tensor([-0.4464])
-0.44643348455429077
  1. param.grad/ batch_size
    这里除了batch_size,因为计算loss后调用了.sum()。

2. Softmax

softmax本来是指输出层的激活函数,现在一般也指代两层的神经网络,在输出层实用softmax()对输出结果进行归一化。

Why?

假设输出层有3个神经元,对某个样本可以得到输出多层感知机 作用 多层感知机的特点_多层感知机 作用_03 =多层感知机 作用 多层感知机的特点_线性回归_04, 直接使用输出层的输出有两个问题:

  1. 一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。例如,刚才举的例子中的输出值10表示“很置信”图像类别为猫,因为该输出值是其他两类的输出值的100倍。但如果多层感知机 作用 多层感知机的特点_多层感知机 作用_05,那么输出值10却又表示图像类别为猫的概率很低。
  2. 另一方面,softmax函数是hardmax函数的近似函数,也是对hardmax函数的优化。解决了hardmax函数不可导的问题。因此被广泛的应用在神经网络中。

参考:


3. 多层感知机

多层感知机就是多层神经网络,无非就是层数多一些,且相比前面所说的线性回归softmax,中间层传递的时候加入了激活函数,如sigmoid、tanh、relu等等。