当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。
在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)β,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。
读取数据时的一段代码理解
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)
测试
In [1]: num_examples = 20
In [2]: indices = list(range(num_examples))
In [3]: indices
Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
In [4]: random.shuffle(indices)
In [5]: import random
In [6]: random.shuffle(indices)
In [7]: indices
Out[7]: [8, 16, 15, 18, 14, 10, 0, 7, 2, 3, 4, 9, 12, 6, 17, 13, 5, 11, 19, 1]
In [9]: batch_size = 4
In [10]: for i in range(0, num_examples, batch_size):
...: print(i)
...:
0
4
8
12
16
一个图片解释
In [12]: import numpy as np
In [13]: y = np.array([1,2,3,4,5,7,8])
In [14]: y.shape
Out[14]: (7,)
In [16]: import torch
In [17]: y = torch.Tensor(y)
In [18]: y.view(-1)
Out[18]: tensor([1., 2., 3., 4., 5., 7., 8.])
In [19]: y.view((-1,1))
Out[19]:
tensor([[1.],
[2.],
[3.],
[4.],
[5.],
[7.],
[8.]])
In [20]: y.view((7,1))
Out[20]:
tensor([[1.],
[2.],
[3.],
[4.],
[5.],
[7.],
[8.]])
In [22]: 0.5* (1/3)*((2.33-3.14)**2 + (1.07 - 0.98)**2 + (1.23 - 1.32)**2)
Out[22]: 0.11205000000000001
def accuracy(y_hat, y):
return (y_hat.argmax(dim=1) == y).float().mean().item()
In [23]: y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])^M
...: y = torch.LongTensor([0, 2]) # 真实的标签值
In [24]: y.view(-1, 1)
Out[24]:
tensor([[0],
[2]])
In [25]: y_hat.gather(1, y.view(-1, 1))
Out[25]:
tensor([[0.1000],
[0.5000]])
In [26]: y_hat.argmax(dim=1)
Out[26]: tensor([2, 2])
In [27]: (y_hat.argmax(dim=1) == y)
Out[27]: tensor([0, 1], dtype=torch.uint8) # 第一个预测错误,所以值为0,第二个预测正确,所以值为1
In [28]: (y_hat.argmax(dim=1) == y).float()
Out[28]: tensor([0., 1.])
In [29]: (y_hat.argmax(dim=1) == y).float().mean()
Out[29]: tensor(0.5000)
In [30]: (y_hat.argmax(dim=1) == y).float().mean().item()
Out[30]: 0.5
2个样本里面只对了一个样本(即最后一个),第一个真实值为标签0,但是y_hat将其预测为标签2。
softmax知识点回顾
多层感知机基本知识
关于激活函数的选择
本文链接:http://task.lmcjl.com/news/12165.html