这里对《ElitesAI·动手学深度学习PyTorch版》Task1的学习做个简短的总结。
Task1中总共分为3个部分:线性回归、softmax、多层感知机。
因为之前有些基础,所以3个部分原理部分都大致比较清楚,由于对pytorch不是那么熟悉,所以下面主要对之前不熟悉的一些函数方法进行总结,并对部分算法细节进行补充。
1. 线性回归
线性回归相当于一个两层的神经网络,只有输入层与输出层,且输出层的神经元个数为1,无激活函数,损失函数为MSE。
我的问题主要集中在mini-batch随机梯度下降:
(
w
,
b
)
←
(
w
,
b
)
−
η
∣
B
∣
∑
i
∈
B
∂
(
w
,
b
)
l
(
i
)
(
w
,
b
)
(\mathbf{w},b) \leftarrow (\mathbf{w},b) - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w},b)} l^{(i)}(\mathbf{w},b)
(w,b)←(w,b)−∣B∣ηi∈B∑∂(w,b)l(i)(w,b)
上式中,
B
=
b
a
t
c
h
s
i
z
e
\mathcal{B}=batchsize
B=batchsize
其实现代码如下所示:
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)
上面代码中有两个点需要注意:
-
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
-
param.grad/ batch_size
这里除了batch_size,因为计算loss后调用了.sum()。
参考:
[1] 关于 pytorch inplace operation, 需要知道的几件事
[2] pytorch学习经验(一) detach, requires_grad和volatile
[3] pytorch .detach() .detach_() 和 .data用于切断反向传播
2. Softmax
softmax本来是指输出层的激活函数,现在一般也指代两层的神经网络,在输出层实用softmax()对输出结果进行归一化。
Why?
假设输出层有3个神经元,对某个样本可以得到输出 ( o 1 , o 2 , o 3 ) ({o_1}, o_2, o_3) (o1,o2,o3) = ( 0.1 , 0.1 , 10 ) (0.1,0.1,10) (0.1,0.1,10), 直接使用输出层的输出有两个问题:
- 一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。例如,刚才举的例子中的输出值10表示“很置信”图像类别为猫,因为该输出值是其他两类的输出值的100倍。但如果 o 1 = o 2 = 1 0 3 o_1=o_2=10^3 o1=o2=103,那么输出值10却又表示图像类别为猫的概率很低。
- 另一方面,softmax函数是hardmax函数的近似函数,也是对hardmax函数的优化。解决了hardmax函数不可导的问题。因此被广泛的应用在神经网络中。
参考:
[1] softmax函数名字的由来(代数&几何原理)——softmax前世今生系列(2)
3. 多层感知机
多层感知机就是多层神经网络,无非就是层数多一些,且相比前面所说的线性回归与softmax,中间层传递的时候加入了激活函数,如sigmoid、tanh、relu等等。