Для начинающих: обзор нейронных сетей (1)

машинное обучение
Для начинающих: обзор нейронных сетей (1)

Недавно я увидел в Интернете очень хороший перевод «Учебное пособие по нейронной сети, которое может понять Xiaobai: от принципа до оптимизации — это так просто», которое является сокровищем. Внимательно прочитав, я обнаружил, что некоторые переводы не на месте. Потом я обратился к исходному тексту и перечитал его еще раз, и мне показалось, что исходный текст несколько разочаровывает.Первая половина объяснения была проста и проста, а вторая половина объяснения была недостаточно подробной и заканчивалась Спешите Автор, кажется, торопится лечь спать. Поэтому я решил снова перевести оригинальный текст для читателей.

Перевод выглядит следующим образом:

Краткое введение в то, как работают нейронные сети и как реализовать их с нуля на Python.

Вас может удивить, если «нейронная сеть» на самом деле не сложна. На самом деле «нейронные сети» зачастую проще, чем вы думаете.

Эта статья предназначена для начинающих и предполагает, что у вас нет основы машинного обучения.Мы с самого начала научимся пользоватьсяPythonРеализовать нейронную сеть.

1. Основные строительные блоки: нейроны

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

Здесь происходят три вещи: Во-первых, каждыйвходить(вход) оба умножаются на одинВеса w (weight):

x1x1*w1x2x2*w2\begin{array}{l} x_{1} \rightarrow x_{1} * w_{1} \\ x_{2} \rightarrow x_{2} * w_{2} \end{array}

Затем все взвешенные входные данные суммируются и добавляются скомпенсировать b (bias):

(x1*w1)+(x2*w2)+b\left(x_{1} * w_{1}\right)+\left(x_{2} * w_{2}\right)+b

Наконец, добавьте ихипройти кфункция активации(функция активации):

y=f(x1*w1+x2*w2+b)y=f\left(x_{1} * w_{1}+x_{2} * w_{2}+b\right)

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

11+ex\begin{aligned} \frac{1}{1+e^{-x}} \end{aligned}

image.png

Выходное значение функции активации будет попадать только в интервал (0,1). Вы можете думать об этом как(,+)(−∞, +∞)сжатый в(0,1)(0,1):

  • Преобразование бесконечно малых отрицательных чисел в бесконечно близкие к 0
  • Преобразование бесконечных положительных чисел в бесконечно близкие к 1

простой пример

Предположим, у нас есть применениеsigmoidsigmoidНейрон функции активации, он может получать два входа, ниже егоВесаикомпенсировать:

w=[0,1]b=4w = [0,1] \\ b = 4

w = [0, 1]w1=0,w2=1w_{1} = 0, w_{2} = 1

векторное представление .

Теперь мы входимx=[2,3]x = [2, 3]. мы будем использоватьскалярное произведениеКратко поясню:

(wx)+b=((w1*x1)+(w2*x2))+b=0*2+1*3+4=7\begin{aligned} (w \cdot x)+b &=\left(\left(w_{1} * x_{1}\right)+\left(w_{2} * x_{2}\right)\right)+b \\ &=0 * 2+1 * 3+4 \\ &=7 \end{aligned}
y=f(wx+b)=f(7)=0.999y=f(w \cdot x+b)=f(7)=\bm{0.999}

Этот нейрон получает вход[2,3][2,3], учитывая вывод0.9990.999. Вот и все! Этот процесс передачи ввода вперед для получения вывода становитсяпрямая связь.

написать нейрон

Время реализовать нейрон! мы будем использоватьNumpy(популярная и мощная научная библиотека для подсчета), чтобы помочь нам реализовать математические формулы:

import numpy as np

def sigmoid(x):
  # Our activation function: f(x) = 1 / (1 + e^(-x))
  return 1 / (1 + np.exp(-x))

class Neuron:
  def __init__(self, weights, bias):
    self.weights = weights
    self.bias = bias

  def feedforward(self, inputs):
    # Weight inputs, add bias, then use the activation function
    total = np.dot(self.weights, inputs) + self.bias
    return sigmoid(total)

weights = np.array([0, 1]) # w1 = 0, w2 = 1
bias = 4                   # b = 4
n = Neuron(weights, bias)

x = np.array([2, 3])       # x1 = 2, x2 = 3
print(n.feedforward(x))    # 0.9990889488055994

Знаете этот номер? мы получили тот же результат0.9990.999

2. Объединение нейронов в нейронную сеть

Нейронные сетичто это? По сути, это не что иное, как пучок нейронов, соединенных между собой. Вот как выглядит простая нейронная сеть:image.png

Сеть имеет 2 входа, скрытый слой с 2 ​​нейронами (h1h_1иh2h_2​), и выходной слой с 1 нейроном (o1o_1​). Пожалуйста, обрати внимание,o1o_1Вход поступает изh1h_1иh2h_2Выход — это нейронная сеть.

Возьми каштан: прямая связь

Возьмите нейронную сеть на рисунке выше в качестве примера и предположите, что все нейроны имеют одинаковые веса.w=[0,1]w=[0,1], такое же смещениеb=0b=0, и то же самоеsigmoidsigmoidфункция активации. использоватьh1,h2,o1h_1,h_2,o_1представляют нейронные выходы, которые они представляют.

Если мы войдемx=[2,3]x = [2,3],Что случится?

h1=h2=f(wx+b)=f((0*2)+(1*3)+0)=f(3)=0.9526\begin{aligned} h_{1}=h_{2} &=f(w \cdot x+b) \\ &=f((0 * 2)+(1 * 3)+0) \\ &=f(3) \\ &=0.9526 \end{aligned}
o1=f(w[h1,h2]+b)=f((0*h1)+(1*h2)+0)=f(0.9526)=0.7216\begin{aligned} o_{1} &=f\left(w \cdot\left[h_{1}, h_{2}\right]+b\right) \\ &=f\left(\left(0 * h_{1}\right)+\left(1 * h_{2}\right)+0\right) \\ &=f(0.9526) \\ &=\bm{0.7216} \end{aligned}

когда входx=[2,3]x = [2,3], выход этой нейронной сети0.72160.7216, не правда ли просто?

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

Для удобства в остальной части этой статьи будет использоваться нейронная сеть, показанная выше.

Написание нейронной сети: прямая связь

Давайте реализуем нейронную сеть с прямой связью. Вот изображение этой сети, просто для справки:

image.png

import numpy as np

# ... code from previous section here

class OurNeuralNetwork:
  '''
  A neural network with:
    - 2 inputs
    - a hidden layer with 2 neurons (h1, h2)
    - an output layer with 1 neuron (o1)
  Each neuron has the same weights and bias:
    - w = [0, 1]
    - b = 0
  '''
  def __init__(self):
    weights = np.array([0, 1])
    bias = 0

    # The Neuron class here is from the previous section
    self.h1 = Neuron(weights, bias)
    self.h2 = Neuron(weights, bias)
    self.o1 = Neuron(weights, bias)

  def feedforward(self, x):
    out_h1 = self.h1.feedforward(x)
    out_h2 = self.h2.feedforward(x)

    # The inputs for o1 are the outputs from h1 and h2
    out_o1 = self.o1.feedforward(np.array([out_h1, out_h2]))

    return out_o1

network = OurNeuralNetwork()
x = np.array([2, 3])
print(network.feedforward(x)) # 0.7216325609518421

Мы снова получаем0.72160.7216,Идеально!