Участвуйте в 24-м дне Ноябрьского испытания обновлений, узнайте подробности события:Вызов последнего обновления 2021 г.
-
Эта статья представляет собой примечания к чтению версии pytorch «Обучение глубокому обучению вручную». Другие статьи из этой серии можно найти здесь:Колонка «Практическое глубокое обучение» (juejin.cn)
-
Примечания Адрес Github:DeepLearningNotes/d2l(github.com)
Все еще в процессе обновления......
Слово последовательность переводится с Sequence.Что такое последовательность,то есть моя стопка последовательных чисел.Последнее родственно первому. Например, голосовые данные, текстовые данные, видеоданные и ряд данных с непрерывной взаимосвязью.
Возьмем еще один каштан, например, акции, моя цена акций завтра, безусловно, будет зависеть от цен на акции сегодня и в предыдущие дни. использоватьПредставляет цену акции в день i. Если вы хотите предсказать цену акции в день i, вы суммируете
Но по мере увеличения входных данных результат, который мы хотим вычислить, становится все труднее вычислить по мере увеличения количества данных, поэтому для облегчения этого расчета необходим метод приближения.
Есть две идеи:
Авторегрессионные модели Марковские модели
Просто возьмите длину какпромежуток времени.
Подумайте о цене акции.Завтрашняя цена акции может быть связана с сегодняшней ценой акции, она может быть связана со вчерашней ценой акции, она может быть связана с позавчерашней ценой акции, но она имеет мало общего с ценой акции. год назад. Поэтому при прогнозировании цены акции нам не нужно включать в сферу влияния цену акции прошлого года. Так что просто иди впереддней.
использовать последовательностьДля обучения такие модели называются авторегрессионными моделями, потому что они регрессируют на своих собственных данных.
использоватьвместочтобы оценить. Пока это приближение является точным, мы говорим, что последовательность удовлетворяет условию Маркова, которое также можно назвать марковской моделью.
модель авторегрессии со скрытой переменной
Сохраняйте некоторые сводки прошлых наблюдений, и одновременно обновлять прогнози резюме. Это производит на основеоценить, а формулаОбновленная модель. Этот подход известен как модели скрытой авторегрессии.
Реализуйте марковскую модель с помощью кода
import torch
from torch import nn
from d2l import torch as d2l
T = 1000 # 总共产生1000个点
# 生成数据集,一个正弦函数加入一些噪音
time = torch.arange(1, T + 1, dtype=d2l.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))
d2l.plot(time, [x], 'time', 'x', xlim=[1, 1000], figsize=(5, 3))
Сгенерируйте набор данных, используя здесь sin(x) и добавив к нему шум.
Необработанные данные визуализируются следующим образом:
То есть набор данных
tau = 4
features = torch.zeros((T - tau, tau))
for i in range(tau):
features[:, i] = x[i: T - tau + i]
labels = x[tau:].reshape((-1, 1))
-
установить здесь, то есть данные по умолчанию i относятся только к его первым 4 элементам.
-
функции — это наш предыдущий x, а метки — это наш y.
Здесь помещаем x в функции. набор данныхэлементы. Затем метки относятся к текущему значению.
-
Вы можете не понять это в пустых словах, но вы поймете, если я запишу это.
T = 10 x = torch.arange(T) tau = 4 features = torch.zeros((T - tau, tau)) for i in range(tau): features[:, i] = x[i: T - tau + i] labels = x[tau:].reshape((-1, 1)) print(x) print(features) print(x[tau:])
>> tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) tensor([[0., 1., 2., 3.], [1., 2., 3., 4.], [2., 3., 4., 5.], [3., 4., 5., 6.], [4., 5., 6., 7.], [5., 6., 7., 8.]]) tensor([4, 5, 6, 7, 8, 9])
Создайте список, где x равен 0-9,, метки начинаются с 4-й позиции. Другими словами, его значение зависит от четырех цифр перед ним, которые являются соответствующим вектором-строкой в функциях.
batch_size, n_train = 16, 600
# 只有前`n_train`个样本用于训练
train_iter = d2l.load_array((features[:n_train], labels[:n_train]),batch_size, is_train=True)
Представьте, что первые 600 чисел — это тренировочный набор.
# 初始化网络权重的函数
def init_weights(m):
if type(m) == nn.Linear:
nn.init.xavier_uniform_(m.weight)
# 一个简单的多层感知机
def get_net():
net = nn.Sequential(nn.Linear(4, 10),
nn.ReLU(),
nn.Linear(10, 1))
net.apply(init_weights)
return net
# 平方损失
loss = nn.MSELoss()
В процессе обучения можно использовать простой многослойный персептрон.
def train(net, train_iter, loss, epochs, lr):
trainer = torch.optim.Adam(net.parameters(), lr)
for epoch in range(epochs):
for X, y in train_iter:
trainer.zero_grad()
l = loss(net(X), y)
l.backward()
trainer.step()
print(f'epoch {epoch + 1}, '
f'loss: {d2l.evaluate_loss(net, train_iter, loss):f}')
net = get_net()
train(net, train_iter, loss, 5, 0.01)
print(train)
>>
epoch 1, loss: 0.069232
epoch 2, loss: 0.056763
epoch 3, loss: 0.054675
epoch 4, loss: 0.050940
epoch 5, loss: 0.048722
<function train at 0x0000017DFBD29F70>
Результат тот же, не очень низкий.