Джеймс Дэвис – Нейросети: создание и оптимизация будущего (страница 6)
```python
# Новая модель
model = nn.Linear(1, 1)
optimizer = optim.SGD(model.parameters(), lr=0.01)
# Обучение с использованием стохастического градиентного спуска
losses = []
for epoch in range(epochs):
for x, y in zip(X_tensor, Y_tensor):
optimizer.zero_grad()
prediction = model(x.view(-1, 1))
loss = criterion(prediction, y.view(-1, 1))
loss.backward()
optimizer.step()
losses.append(loss.item())
# График ошибки
plt.plot(losses)
plt.xlabel("Step")
plt.ylabel("Loss")
plt.title("Stochastic Gradient Descent")
plt.show()
```
Пояснение: В этом случае на каждом шаге градиентный спуск обновляет веса после каждого отдельного примера. Этот метод быстрее для больших данных, но ошибки "шумные" – кривая потерь будет менее сглаженной по сравнению с batch градиентным спуском.
3. Мини-Batch Градиентный Спуск
Данные разбиваются на небольшие группы (мини-батчи). Это компромисс между двумя подходами: сеть обновляется быстрее, чем в обычном batch, но при этом обновления более устойчивы, чем в SGD.
```python
# Новая модель
model = nn.Linear(1, 1)
optimizer = optim.SGD(model.parameters(), lr=0.01)
batch_size = 10 # Размер мини-батча
# Обучение с использованием мини-batch градиентного спуска
losses = []
for epoch in range(epochs):
permutation = torch.randperm(X_tensor.size()[0])
for i in range(0, X_tensor.size()[0], batch_size):
indices = permutation[i:i + batch_size]
batch_x, batch_y = X_tensor[indices], Y_tensor[indices]
optimizer.zero_grad()
predictions = model(batch_x)
loss = criterion(predictions, batch_y)
loss.backward()
optimizer.step()
losses.append(loss.item())
# График ошибки
plt.plot(losses)
plt.xlabel("Step")
plt.ylabel("Loss")
plt.title("Mini-Batch Gradient Descent")
plt.show()
```
Пояснение: Мини-batch градиентный спуск делит данные на небольшие части, например, по 10 примеров на батч. Это позволяет получить более сглаженный процесс обучения с эффективностью близкой к SGD.
Сравнение методов
Каждый метод имеет свои плюсы и минусы:
– Batch Gradient Descent: высокая точность, но требует много вычислительных ресурсов и неэффективен для больших данных.
– Stochastic Gradient Descent: быстрое обновление весов, но кривая ошибки "шумная".
– Mini-Batch Gradient Descent: компромисс между точностью и скоростью, подходит для больших данных.
Для больших наборов данных чаще используется Mini-Batch Gradient Descent, так как он обеспечивает хорошее соотношение точности и скорости.
Глубокое обучение – это мощная область машинного обучения, которая активно развивается благодаря росту вычислительных мощностей и улучшению алгоритмов оптимизации. Его основная идея состоит в построении моделей, которые могут анализировать и обучаться на сложных данных с множеством параметров, выявляя закономерности и взаимосвязи.
Рассмотрим ключевые аспекты глубокого обучения и то, что делает его уникальным.
Понятие глубины: что делает сеть глубокой?
Когда мы говорим о «глубине» нейронной сети, мы имеем в виду количество слоев в ней:
– Малые (неглубокие) сети: Обычно содержат один или два скрытых слоя. Это сети, которые используются для простых задач с ограниченными по сложности данными, например, распознавание чисел на картинках.
– Глубокие сети: Это сети с несколькими слоями, часто от десятков до сотен. Каждый слой извлекает новые уровни абстракций из данных: начальные слои могут находить простые признаки (например, края на изображении), а более глубокие слои – сложные паттерны (например, лица или предметы).
Пример: В задаче классификации изображений сеть с одним слоем может найти простейшие линии и формы. А глубокая сеть может постепенно выделить на изображении ключевые объекты, такие как лица или машины, и, в конечном итоге, классифицировать изображение на основе этих сложных признаков.
Глубокие сети благодаря своему многослойному характеру лучше подходят для решения сложных задач, где требуется выявление сложных зависимостей между признаками данных.