- 24.02.2024
- 15
- 1
- 28
- Награды
- 4
- 25
Репутация:
- Автор темы
- #1
Создание нейросети с нуля — это отличный способ глубоко понять принципы машинного обучения. В этом гайде мы разберём:
Основы нейросетей
Математику для реализации
Написание кода на Python без библиотек
Обучение и тестирование модели
Оптимизация и улучшение
Нейросеть — это математическая модель, вдохновленная биологическими нейронами. Она состоит из:
Каждый нейрон вычисляет:
Copy
output = activation_function(w1*x1 + w2*x2 + ... + wn*xn + bias)
Где:
Обновление весов:
Copy
w_new = w_old - learning_rate * gradient
python
Copy
import numpy as np
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
# Инициализация весов случайными значениями
self.weights1 = np.random.randn(input_size, hidden_size)
self.weights2 = np.random.randn(hidden_size, output_size)
self.bias1 = np.zeros((1, hidden_size))
self.bias2 = np.zeros((1, output_size))
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
return x * (1 - x)
def forward(self, X):
# Прямое распространение
self.hidden = self.sigmoid(np.dot(X, self.weights1) + self.bias1)
self.output = self.sigmoid(np.dot(self.hidden, self.weights2) + self.bias2)
return self.output
def backward(self, X, y, output, learning_rate):
# Обратное распространение
error = y - output
d_output = error * self.sigmoid_derivative(output)
error_hidden = d_output.dot(self.weights2.T)
d_hidden = error_hidden * self.sigmoid_derivative(self.hidden)
# Обновляем веса
self.weights2 += self.hidden.T.dot(d_output) * learning_rate
self.weights1 += X.T.dot(d_hidden) * learning_rate
self.bias2 += np.sum(d_output, axis=0) * learning_rate
self.bias1 += np.sum(d_hidden, axis=0) * learning_rate
def train(self, X, y, epochs, learning_rate):
for epoch in range(epochs):
output = self.forward(X)
self.backward(X, y, output, learning_rate)
if epoch % 1000 == 0:
loss = np.mean(np.square(y - output))
print(f"Epoch {epoch}, Loss: {loss}")
python
Copy
# Данные XOR (исключающее ИЛИ)
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# Создаём и обучаем сеть
nn = NeuralNetwork(input_size=2, hidden_size=4, output_size=1)
nn.train(X, y, epochs=10000, learning_rate=0.1)
# Тестируем
print("Predictions:")
for x in X:
print(f"{x} -> {nn.forward(x.reshape(1, -1))}")
Вывод:
Copy
Epoch 0, Loss: 0.256
Epoch 1000, Loss: 0.0001
...
Predictions:
[0 0] -> [0.001]
[0 1] -> [0.99]
[1 0] -> [0.99]
[1 1] -> [0.001]
python
Copy
def relu(self, x):
return np.maximum(0, x)
def relu_derivative(self, x):
return (x > 0).astype(float)
def softmax(self, x):
exps = np.exp(x - np.max(x))
return exps / np.sum(exps, axis=1, keepdims=True)
python
Copy
def train_batch(self, X, y, epochs, learning_rate, batch_size=32):
for epoch in range(epochs):
for i in range(0, len(X), batch_size):
X_batch = X[i:i+batch_size]
y_batch = y[i:i+batch_size]
output = self.forward(X_batch)
self.backward(X_batch, y_batch, output, learning_rate)
Добавьте больше слоёв (глубокая сеть → лучше точность).
Используйте Dropout (борьба с переобучением).
Реализуйте свёрточные (CNN) или рекуррентные (RNN) сети.
Теперь вы знаете, как написать нейросеть с нуля!
Ключевые моменты:






1. Основы нейросетей
Что такое нейросеть?
Нейросеть — это математическая модель, вдохновленная биологическими нейронами. Она состоит из:- Входного слоя (данные)
- Скрытых слоёв (обработка)
- Выходного слоя (результат)
Как она учится?
- Прямое распространение (Forward Pass) – данные проходят через сеть.
- Расчёт ошибки – сравнение с правильным ответом.
- Обратное распространение (Backpropagation) – корректировка весов.
2. Математика нейросетей
Нейрон и его активация
Каждый нейрон вычисляет:Copy
output = activation_function(w1*x1 + w2*x2 + ... + wn*xn + bias)
Где:
- w — веса
- x — входные данные
- bias — смещение
Функции активации
Функция | Формула | Когда использовать? |
---|---|---|
Sigmoid | 1 / (1 + exp(-x)) | Бинарная классификация |
ReLU | max(0, x) | Скрытые слои |
Softmax | exp(x) / sum(exp(x)) | Многоклассовая классификация |
Функция потерь (Loss)
- MSE (Mean Squared Error) – для регрессии.
- Cross-Entropy – для классификации.
Градиентный спуск
Обновление весов:Copy
w_new = w_old - learning_rate * gradient
3. Написание нейросети на Python (с нуля!)
Шаг 1: Создаём класс нейросети
pythonCopy
import numpy as np
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
# Инициализация весов случайными значениями
self.weights1 = np.random.randn(input_size, hidden_size)
self.weights2 = np.random.randn(hidden_size, output_size)
self.bias1 = np.zeros((1, hidden_size))
self.bias2 = np.zeros((1, output_size))
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
return x * (1 - x)
def forward(self, X):
# Прямое распространение
self.hidden = self.sigmoid(np.dot(X, self.weights1) + self.bias1)
self.output = self.sigmoid(np.dot(self.hidden, self.weights2) + self.bias2)
return self.output
def backward(self, X, y, output, learning_rate):
# Обратное распространение
error = y - output
d_output = error * self.sigmoid_derivative(output)
error_hidden = d_output.dot(self.weights2.T)
d_hidden = error_hidden * self.sigmoid_derivative(self.hidden)
# Обновляем веса
self.weights2 += self.hidden.T.dot(d_output) * learning_rate
self.weights1 += X.T.dot(d_hidden) * learning_rate
self.bias2 += np.sum(d_output, axis=0) * learning_rate
self.bias1 += np.sum(d_hidden, axis=0) * learning_rate
def train(self, X, y, epochs, learning_rate):
for epoch in range(epochs):
output = self.forward(X)
self.backward(X, y, output, learning_rate)
if epoch % 1000 == 0:
loss = np.mean(np.square(y - output))
print(f"Epoch {epoch}, Loss: {loss}")
Шаг 2: Обучаем нейросеть (пример с XOR)
pythonCopy
# Данные XOR (исключающее ИЛИ)
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# Создаём и обучаем сеть
nn = NeuralNetwork(input_size=2, hidden_size=4, output_size=1)
nn.train(X, y, epochs=10000, learning_rate=0.1)
# Тестируем
print("Predictions:")
for x in X:
print(f"{x} -> {nn.forward(x.reshape(1, -1))}")
Вывод:
Copy
Epoch 0, Loss: 0.256
Epoch 1000, Loss: 0.0001
...
Predictions:
[0 0] -> [0.001]
[0 1] -> [0.99]
[1 0] -> [0.99]
[1 1] -> [0.001]
4. Улучшение нейросети
Добавляем ReLU и Softmax
pythonCopy
def relu(self, x):
return np.maximum(0, x)
def relu_derivative(self, x):
return (x > 0).astype(float)
def softmax(self, x):
exps = np.exp(x - np.max(x))
return exps / np.sum(exps, axis=1, keepdims=True)
Реализуем мини-пакетный градиентный спуск
pythonCopy
def train_batch(self, X, y, epochs, learning_rate, batch_size=32):
for epoch in range(epochs):
for i in range(0, len(X), batch_size):
X_batch = X[i:i+batch_size]
y_batch = y[i:i+batch_size]
output = self.forward(X_batch)
self.backward(X_batch, y_batch, output, learning_rate)
5. Что дальше?



Вывод
Теперь вы знаете, как написать нейросеть с нуля!
- Forward Pass – вычисление выхода.
- Backpropagation – обучение весов.
- Градиентный спуск – минимизация ошибки.
- (книга)
- (видео)

Последние темы в этом разделе:
- 🚀4 приложения, которые помогут написать научную статью или сделать хорошую аналитику
- Как легально открыть оружейный бизнес в России
- Как заработать на перепродаже техники с Авито
- Как заработать на перепродаже техники из Китая
- Создание простого Discord-бота с нуля
- Создание простого Telegram-бота с нуля
- Как создать майнинг ферму из б/у комплектующих
- 🎮 Как создать свою игру-платформер (с нуля до релиза)
- Как быстро раскрутить свой ютуб канал
- Полный гайд: Как правильно инвестировать в 2024 году