Обмен технологиями

Курс «Инженер по алгоритмам искусственного интеллекта (средний уровень)» 8-PyTorch Нейронная сеть Основы нейронной сети и подробное объяснение кода

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Привет всем, я Вэй Сюэ AI. Сегодня я представлю вам подробное объяснение основы нейронной сети и кода курса «Инженер по алгоритмам искусственного интеллекта (средний уровень)» 8-PyTorch Neural Network. Нейронная сеть — это вычислительная модель, которая имитирует соединение нейронов в человеческом мозге и широко используется в распознавании изображений, обработке естественного языка и других областях. В этой статье будут представлены концепция, структура, образцы, обучение и оценка нейронных сетей, а также полный работоспособный код.

Подробное объяснение основ и кода нейронной сети.

1. Понятие нейронной сети.

Нейронная сеть состоит из большого количества узлов (или нейронов) и ребер, соединяющих эти узлы. Каждый узел представляет нейрон, а каждое ребро представляет собой связь между нейронами. Основная функция нейронной сети — извлечение полезной информации из данных посредством взвешенного суммирования и нелинейного преобразования входных данных.

2. Структура нейронной сети.

Нейронные сети обычно делятся на входной слой, скрытый слой и выходной слой. Входной слой получает внешние данные, скрытый слой обрабатывает данные, а выходной слой выводит конечный результат. Узлы каждого уровня соединены с узлами следующего уровня, и каждое соединение имеет соответствующий вес.

2.1 Формула расчета нейронной сети

Выходные данные нейронной сети можно рассчитать по следующей формуле:
а ( л ) = ф ( z ( л ) ) а^{(л)} = ф(z^{(л)})а(л)=ф(з(л))
z ( l ) = w ( l ) a ( l − 1 ) + b ( l ) z^{(l)} = w^{(l)}a^{(l-1)} + b^{(l)}з(л)=ж(л)а(л1)+б(л)
в, а ( л ) а^{(л)}а(л) Указывает на первый ллл Выход слоя, z ( л ) z^{(л)}з(л) Указывает на первый ллл Взвешенный результат суммирования слоев, ш ( л ) ш^{(л)}ж(л) и б ( л ) б^{(л)}б(л) Соответственно представляют ллл веса и смещения слоев, f ( ⋅ ) f(cdot)ф() представляет собой функцию активации.
Вставьте сюда описание изображения

2.2 Работоспособный код

Вот пример простой структуры нейронной сети:

import numpy as np
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
def feedforward(X, weights, biases):
    a = X
    for w, b in zip(weights, biases):
        z = np.dot(a, w) + b
        a = sigmoid(z)
    return a
# 定义输入数据
X = np.array([[1, 2], [3, 4]])
# 定义权重和偏置
weights = [np.array([[0.1, 0.2], [0.3, 0.4]]), np.array([[0.5], [0.6]])]
biases = [np.array([0.1, 0.2]), np.array([0.3])]
# 计算输出
output = feedforward(X, weights, biases)
print(output)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3. Образец нейронной сети

Образец нейронной сети включает входные данные и соответствующие метки. В процессе обучения нейронная сеть постоянно корректирует веса и смещения, чтобы выходные данные были как можно ближе к метке.

3.1 Функция потерь

Целью обучения нейронных сетей является минимизация функции потерь. Обычно используемые функции потерь включают среднеквадратическую ошибку (MSE) и перекрестную энтропийную потерю. Формула среднеквадратической ошибки выглядит следующим образом:
J ( w , b ) = 1 2 m ∑ i = 1 m ( y ( i ) − a ( i ) ) 2 J(w, b) = frac{1}{2m}sum_{i=1}^{m}(y^{(i)} - a^{(i)})^2Дж.(ж,б)=2м1я=1м(у(я)а(я))2
в, ммм представляет количество образцов, у ( я ) у^{(я)}у(я) и а ( я ) а^{(я)}а(я) Соответственно представляют iiя метки и прогнозируемые значения образцов.

3.2 Работоспособный код

Вот простой пример генерации выборки и расчета потерь:

import numpy as np
def mse_loss(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)
# 定义标签
y_true = np.array([[1], [0]])
# 计算损失
loss = mse_loss(y_true, output)
print(loss)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4. Обучение нейронных сетей

Процесс обучения нейронной сети включает в себя прямое и обратное распространение. Прямое распространение вычисляет выходные данные нейронной сети, а обратное распространение вычисляет градиент функции потерь относительно весов и смещений и обновляет веса и смещения.

4.1 Обратное распространение ошибки

Алгоритм обратного распространения ошибки вычисляет градиенты с помощью правила цепочки.Во-первых ллл вес слоя ш ( л ) ш^{(л)}ж(л), его градиент можно выразить как:
∂ J ∂ w ( l ) = a ( l − 1 ) ⋅ ( f ′ ( z ( l ) ) ⋅ δ ( l ) ) frac{partial J}{partial w^{(l)}} = a^{(l-1)} cdot (f'(z^{(l)}) cdot delta^{(l)})ж(л)Дж.=а(л1)(ф(з(л))δ(л))
в, δ ( л ) дельта^{(л)}δ(л) Указывает на первый ллл ошибка слоя, f ′ ( ⋅ ) f'(cdot)ф() представляет собой производную функции активации.

4.2 Код для обучения нейронной сети

Вот простой пример обучения нейронной сети:

import numpy as np
def sigmoid_derivative(x):
    return sigmoid(x) * (1 - sigmoid(x))
def backpropagation(X, y_true, weights, biases):
    gradients_w = [np.zeros(w.shape) for w in weights]
    gradients_b = [np.zeros(b.shape) for b in biases]
    # 前向传播
    a = X
    activations = [a]
    zs = []
    for w, b in zip(weights, biases):
        z = np.dot(a, w) + b
        zs.append(z)
        a = sigmoid(z)
        activations.append(a)
    # 计算输出层误差
    delta = activations[-1] - y_true
    gradients_b[-1] = delta
    gradients_w[-1] = np.dot(activations[-2].T, delta)
    # 反向传播
    for l in range(2, len(weights) + 1):
        z = zs[-l]
        sp = sigmoid_derivative(z)
        delta = np.dot(delta, weights[-l + 1].T) * sp
        gradients_b[-l] = delta
        gradients_w[-l] = np.dot(activations[-l - 1].T, delta)
    return gradients_w, gradients_b
# 定义学习率
learning_rate = 0.1
# 进行一次梯度下降
gradients_w, gradients_b = backpropagation(X, y_true, weights, biases)
# 更新权重和偏置
for w, grad_w in zip(weights, gradients_w):
    w -= learning_rate * grad_w
for b, grad_b in zip(biases, gradients_b):
    b -= learning_rate * grad_b
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

5. Оценка нейронных сетей

Оценка нейронных сетей обычно выполняется путем расчета точности или значения функции потерь на тестовом наборе. Точность относится к отношению количества выборок, правильно предсказанных моделью, к общему количеству выборок.

5.1 Точность

Формула расчета точности следующая:
Точность = Количество правильных предсказаний Общее количество предсказаний text{Точность} = frac{text{Количество правильных предсказаний}}{text{Общее количество предсказаний}}Точность=Общее количество прогнозовКоличество правильных прогнозов

5.2 Реализация кода

Вот простой пример оценки нейронной сети:

def predict(X, weights, biases):
    a = X
    for w, b in zip(weights, biases):
        z = np.dot(a, w) + b
        a = sigmoid(z)
    return np.round(a)
# 定义测试数据
X_test = np.array([[2, 3], [4, 5]])
# 进行预测
predictions = predict(X_test, weights, biases)
print(predictions)
# 计算准确率
y_test = np.array([[1], [0]])
accuracy = np.mean(predictions == y_test)
print("Accuracy:", accuracy)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Подведем итог

В этой статье мы реализовали простую нейронную сеть, включая прямое распространение, обратное распространение, градиентный спуск и процесс оценки. Хотя эта сеть проста, она демонстрирует основные принципы и методы реализации нейронных сетей. В практических приложениях структура нейронных сетей будет более сложной, включающей больше слоев и узлов, а также более совершенные алгоритмы оптимизации и методы регуляризации. Кроме того, современные фреймворки глубокого обучения (такие как TensorFlow и PyTorch) обеспечивают более эффективную реализацию и функции автоматического дифференцирования, что делает построение и обучение нейронных сетей более удобным.