Привет! Добро пожаловать в начало прекрасного обучающего путешествия, мы отправимся в область глубокого обучения.

Пойдем.

Глубокое обучение найдет применение практически во всех автоматизированных и компьютерных задачах в 2023 году. Начиная с виртуального помощника в вашем телефоне и заканчивая системой рекомендаций фильмов на вашем телевизоре, системами целевой рекламы в социальных сетях и на веб-сайтах… знаете ли вы это или нет, это везде.

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

Надеюсь, теперь у вас есть фундаментальное понимание. Если нет, не волнуйтесь! Глубокое обучение — это постоянно развивающаяся область, и иногда она может показаться сложной. Мы будем перемещаться по многим приложениям и понимать концепции с нуля.

История глубокого обучения:

Британский математик и ученый-компьютерщик Алан Тьюринг предсказал, что в будущем появится суперкомпьютер с интеллектом, подобным человеческому, и ученые начали пытаться смоделировать человеческий мозг простыми способами.

Истоки глубокого обучения можно найти в 1940-х и 1950-х годах, когда были созданы первые искусственные нейронные сети (ИНС). Биологический мозг послужил моделью для развития идеи нейронных сетей. Первые шаги к созданию искусственной нейронной сети были предприняты в 1943 году, когда нейрофизиолог Уоррен МакКаллох и математик Уолтер Питтс опубликовали статью с изложением упрощенной модели нейрона.

Обратное распространение, метод обучения нейронных сетей, был разработан в 1960-х и 1970-х годах и стал важной вехой в области нейронных сетей. Однако полезность нейронных сетей ограничивалась ограничениями на вычислительные ресурсы и доступность данных.

Глубокое обучение — это метод, который был разработан в 1980-х и 1990-х годах посредством обучения нейронных сетей с несколькими слоями (отсюда и название «глубокое»). Основная идея разработки нескольких слоев заключалась в том, чтобы имитировать работу человеческого мозга, состоящего из нескольких взаимосвязанных нейронов. Это открыло путь к более сложным представлениям и более высоким уровням абстракции при обработке данных. Из-за трудностей, присущих обучению глубоких сетей, глубокое обучение в основном использовалось в академических условиях.

В середине 2000-х годов глубокое обучение совершило большой скачок вперед благодаря внедрению алгоритма «неконтролируемого предварительного обучения», разработанного Джеффом Хинтоном и его командой. Используя этот метод, глубина ранее существовавшей глубокой нейронной сети постепенно увеличивалась за счет обучения дополнительных слоев. Предыдущая трудность в обучении глубоких сетей была уменьшена благодаря способности этого метода обойти проблему исчезающих градиентов.

В 2012 году глубокое обучение приобрело известность после того, как глубокая сверточная нейронная сеть под названием AlexNet решительно победила другие методы и заняла первое место в конкурсе ImageNet Large Scale Visual Recognition Challenge. Этот прорыв подчеркнул потенциал глубокого обучения в задачах компьютерного зрения.

С тех пор глубокое обучение процветало и нашло широкое применение в таких разнообразных областях, как НЛП, распознавание речи, робототехника, здравоохранение и многое другое. Разработка специализированных чипов глубокого обучения и других аппаратных ускорителей, таких как графические процессоры (GPU), также способствовала стремительному росту популярности глубокого обучения.

Мы подробно обсудим эти алгоритмы в последующих главах.

Что такое нейрон?

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

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

  1. Активация. Выход нейрона или слоя в ответ на набор входных данных называется активацией. Он показывает, насколько нейрон активирован или срабатывает, или насколько сильно он реагирует на заданные входные данные. Значение, полученное после сложения взвешенной суммы входов и функции активации, является активацией нейрона. Функция активации обеспечивает нелинейность и помогает нейронной сети моделировать сложные отношения в данных.
    Зачем нужна нелинейность? Что ж, по мере нашего продвижения вы увидите, что не каждая проблема представляет собой простое сопоставление входных и выходных данных. Некоторые проблемы требуют, чтобы модели изучали сложные закономерности.
  2. Смещение: Bias похоже на пороговое значение, которое помогает нейрону решить, когда «активировать» или сделать вывод. Изменяя смещение, мы можем контролировать чувствительность нейрона и определять точку, в которой он должен начать выдавать полезные данные. Это дает нейрону возможность делать точные прогнозы и эволюционировать к различным закономерностям в данных.

Давайте создадим простой нейрон на языке программирования Python, чтобы понять концепцию с точки зрения программиста.

Шаг 1. Импортируйте библиотеку «NumPy», которая упрощает выполнение числовых операций. Следовательно, нам не нужно определять пользовательские функции для каждой операции.

Шаг 2.Определите класс под названием «Наш нейрон». Мы используем конструктор «__init__» и берем в качестве параметров количество входных данных, веса и смещение нейрона. Мы инициализируем веса и смещения.

Шаг 3:мы определяем метод «activate_neuron», который принимает вектор в качестве входных данных и вычисляет скалярное произведение между вектором и весами; затем добавьте термин смещения.

Шаг 4.Используем функцию активации; примерами являются ReLU, Linear, Tanh, Sigmoid и т. д. Для простоты рассмотрим линейную функцию f(x)=x.

import numpy as np

class OurNeuron:
    def __init__(self, number_of_inputs, weights, bias):
        self.weights = np.array(weights)
        self.bias = bias
    
    def activate_neuron(self, x):
        weighted_sum = np.dot(self.weights, x) + self.bias
        activation = self.linear(weighted_sum)  # Use linear activation function
        return activation
    
    # Simple linear activation function f(x) = x 
    def linear(self, x):
        return x

# Define the weights and bias
weights = [0.8, 0.3, 0.4, 0.9, 0.1]
bias = 0.3

# Create your first neuron with 5 inputs and the defined weights and bias
first_neuron = OurNeuron(5, weights, bias)

# Input values
neuron_inputs = np.array([0.1, 0.7, 0.1, 0.6, 0.5])

# Activate your neuron
neuron_output = first_neuron.activate_neuron(neuron_inputs)

print("Output of your first neuron is:", neuron_output)

#Output of your first neuron is: 1.2200000000000002

Поздравляем! Вы на шаг ближе к созданию собственной нейронной сети!

Теперь давайте улучшим ситуацию, сформировав простую нейронную сеть из 3 взаимосвязанных нейронов. Нам просто нужно определить два новых нейрона. Передайте вход первого нейрона в качестве входа для второго нейрона. Точно так же передайте вход второго нейрона в качестве входа для третьего нейрона.

import numpy as np

class OurNeuron:
    def __init__(self, number_of_inputs, weights, bias):
        self.weights = np.array(weights)
        self.bias = bias
    
    def activate_neuron(self, x):
        weighted_sum = np.dot(self.weights, x) + self.bias
        activation = self.linear(weighted_sum)  # Use linear activation function
        return activation
    
    # Simple linear activation function f(x) = x 
    def linear(self, x):
        return x

# Define the weights and bias for each neuron
weights1 = [0.8, 0.3, 0.4, 0.9, 0.1]
bias1 = 0.3

weights2 = [0.2, 0.7, 0.6, 0.4, 0.8]
bias2 = 0.5

weights3 = [0.6, 0.9, 0.2, 0.3, 0.7]
bias3 = 0.2

# Create three neurons with their respective weights and biases
neuron1 = OurNeuron(5, weights1, bias1)
neuron2 = OurNeuron(5, weights2, bias2)
neuron3 = OurNeuron(5, weights3, bias3)

# Input values
neuron_inputs = np.array([0.1, 0.7, 0.1, 0.6, 0.5])

# Activate the first neuron
neuron1_output = neuron1.activate_neuron(neuron_inputs)

# Use the output of the first neuron as input for the second neuron
neuron2_output = neuron2.activate_neuron(neuron1_output)

# Use the output of the second neuron as input for the third neuron
neuron3_output = neuron3.activate_neuron(neuron2_output)

print("Output of your first neural network:", neuron3_output)
# Output of your first neural network: 3.441

И вот оно! Мы успешно сформировали примитивную сеть, которая выполняет некоторые базовые вычисления. Большинство алгоритмов глубокого обучения основаны на этой простой концепции и представляют собой перестановку нейронов, организованных определенным образом для получения оптимального результата.

Это подводит нас к концу Эпизода 1 «От нейронов к сетям»! Оставайтесь с нами для следующего эпизода, где мы подробно обсудим основные функции активации.

Если у вас есть какие-либо сомнения относительно этой главы, не стесняйтесь комментировать в блоге!