Это седьмой день моего участия в августовском испытании обновлений, подробности о мероприятии:Испытание августовского обновления
Введение
В последнее время глубокое обучение стало модным словом, и все сферы жизни заявляют, что используют методы глубокого обучения. Теперь слово «глубокое обучение» похоже на «Мода» и «Спорт», напечатанные на кроссовках. Так что же такое глубокое обучение?
Глубокое обучение — это ветвь машинного обучения, когда мы используем алгоритм «глубокой нейронной сети» для машинного обучения, мы можем сказать, что занимаемся глубоким обучением. И этот «нейросетевой» алгоритм — наша сегодняшняя тема.
Для содержания машинного обучения читатели могут обратиться кPython быстро строит нейронные сети.
В этой статье я все же начну с линейной регрессии. В предыдущей статье я лишь вкратце рассказал о нейронной сети, но не стал подробно останавливаться на сути нейронной сети. В этой статье автор подробно расскажет вам всю картину нейросети.
2. Линейная регрессия
2.1, уравнение прямой
Если линейная регрессия — это то, о чем многие читатели не слышали, то я полагаю, что вы должны были слышать об уравнении прямой. В средней школе мы обычно представляем прямую линию следующим уравнением:
На самом деле, линейная регрессия — это тоже такое простое уравнение или функция. Давайте вернемся в среднюю школу, чтобы решить следующую задачу.
Прямая l проходит через точку А (1, 4) и точку В (3, 7), найдите уравнение прямой l.
Задача проста, нам нужно только свести точки А и Б вy = kx + b
Можно получить следующие уравнения:
Из приведенной выше системы уравнений мы можем решить:
Получаем уравнение прямой:
После того, как мы получим уравнение прямой, для любого заданного x мы знаем соответствующий ему y. Теперь нам нужно скорректировать задачу.
2.2 Линейная регрессия
Теперь у нас есть следующий набор данных:
(1, 12)
(2, 16)
(3, 22)
(4, 26)
(5, 29)
(6, 33)
(7, 37)
(8, 41)
(9, 45)
(10, 48)
Мы по-прежнему предполагаем, что все вышеуказанные точки находятся на прямой линии, в этот раз мы берем точку первой(1,12)
и точка(4,26)
, мы можем рассчитать уравнение прямой линии следующим образом:
Теперь давайте выберем точку(2,16)
и точка(6,33)
, мы можем вычислить следующее уравнение прямой линии:
Видно, что эти четыре точки не лежат на одной прямой. Однако, сравнивая наклон и пересечение, обнаруживается, что они очень похожи. Таким образом, мы можем найти скомпрометированную линию, соответствующую всем точкам.
Процесс нахождения этой оптимальной (лучшей) прямой линии по данным называется линейной регрессией.
3. Нелинейные задачи
3.1, кусочная функция
Ранее все данные, которые мы обсуждали, были сгенерированы из прямой линии. Но иногда распределение наших данных может быть не таким простым, и наше распределение данных может быть ближе к кусочной функции, как, например, на следующем рисунке:
В настоящее время распределение наших данных не может быть представлено линейным уравнением. Итак, как мы можем выразить приведенное выше уравнение?
Мы можем видеть приведенную выше функцию как сериюспециальная функция, график этой конкретной функции выглядит следующим образом:
Как видно из изображения, эта функция имеет наклон только в определенном диапазоне. Значение в левой части диапазона равно 0, и значение не меняется за пределами правой части диапазона. Мы можем получить различные функции, регулируя наклон этой функции и диапазон, в котором наклон действует, например:
Все функции с 1 по 4 генерируются путем настройки наклона специальной функции и эффективного диапазона наклона. Только первая функция особенная, ее допустимый диапазон наклона пуст.
Итак, как мы можем использовать эти специальные функции для составления кусочной функции? На самом деле, если вы посмотрите внимательно, вы обнаружите, что добавление этих четырех функций является нашей первой кусочной функцией. Как показано на рисунке ниже, положение специальной функции перемещено для удобства просмотра.
Теперь мы можем сократить приведенную выше функцию как:
Для того, чтобы увидеть эффект более интуитивно. Давайте воспользуемся программой для синтеза этой кусочной функции.
3.2 Синтетические кусочные функции
Давайте сначала напишем функцию, которая создает специальную функцию, код выглядит следующим образом:
def create_special(x, start, end, k):
f = []
temp = 0
for i in x:
# 当小于起始值函数值为0
if i <= start:
f.append(0)
# 当在一定范围,为一个截距为0,斜率为k的直线
elif start < i <= end:
# 这里start不为0,所以我们需要减去它,保证函数截距为0,然后乘k
f.append((i - start) * k)
# 记录最后的值
temp = (i - start) * k
# 当超出范围则值保持不变
else:
f.append(temp)
return np.array(f)
Давайте используем приведенную выше функцию, чтобы нарисовать несколько изображений:
import numpy as np
import matplotlib.pyplot as plt
def create_special(x, start, end, k):
pass
if __name__ == '__main__':
x = np.linspace(0, 20, 200)
y1 = create_special(x, 10, 20, 2)
y2 = create_special(x, 5, 10, 3)
y3 = create_special(x, 0, 15, -4)
y4 = create_special(x, 0, 12, 1)
plt.subplot(221)
plt.plot(x, y1)
plt.title("k = 2")
plt.subplot(222)
plt.plot(x, y2)
plt.title("k = 3")
plt.subplot(223)
plt.plot(x, y3)
plt.title("k = -4")
plt.subplot(224)
plt.plot(x, y4)
plt.title("k = 1")
plt.show()
Нарисованное изображение выглядит следующим образом:
Как видите, нужная нам специальная функция сгенерирована. Таким образом, мы можем использовать эти специальные функции для подбора некоторых кусочных функций, вот пример:
import numpy as np
import matplotlib.pyplot as plt
def create_special(x, start, end, k):
pass
if __name__ == '__main__':
x = np.linspace(0, 20, 200)
y1 = create_special(x, 0, 10, 2)
y2 = create_special(x, 10, 15, -3)
y3 = create_special(x, 15, 20, 1)
y = 3 + y1 + y2 + y3
plt.plot(x, y, c='r')
plt.show()
Образы, которые мы генерируем, следующие:
Мы можем подогнать все кусочные функции только подходящей специальной функцией.
3.3 Непрерывная работа
Мы обсуждали кусочные функции выше, но в жизни есть много ситуаций, когда наши данные генерируются непрерывной функцией. Например, наше распределение данных может быть следующим:
В настоящее время, как мы используем специальные функции, чтобы выразить это?
На самом деле это тоже очень просто.Нам нужно только разбить непрерывную функцию на кусочную функцию, которая делится на множество разрывов.Мы можем разбить ее на следующий рисунок:
Когда мы разделим его достаточно точно, эта кусочная функция может хорошо соответствовать непрерывной функции. Теперь, когда мы преобразовали непрерывные функции в кусочные функции, мы можем использовать специальные функции для составления наших кусочных функций. Таким образом, мы можем добиться подгонки непрерывных функций через специальные функции.
В-четвертых, нейронная сеть
4.1 Функция активации
Далее мы рассмотрим специальную функцию, математическая формула которой выглядит следующим образом:
вc、b、w
являются тремя параметрами. Посмотримc=1,b=0,w=1
Изображение, когда:
С точки зрения внешнего вида она очень похожа на специальную функцию, о которой мы упоминали ранее. На самом деле это знаменитыйsigmoidФункция, то, что можно сделать с помощью специальных функций, можно сделать и сигмовидную. Мы можем попробовать использовать разные параметры для сравнения:
Когда мы корректируем значение k, наклон сигмовидной функции (если аппроксимация видит специальную функцию) меняется. При настройке b функция перемещается влево и вправо. При настройке c функция колеблется вверх и вниз.
Следовательно, нам нужно только настроить эти параметры, чтобы построить любую специальную функцию и подогнать любую функцию.
4.2 Нейронная сеть
Когда у нас есть сигмовидная функция, наша унарная составная функция может быть записана как:
Нижние индексы используются для различения различных параметров сигмоиды. Графически представим приведенную выше функцию:
Мы берем x в качестве входных данных, затем проходим несколько сигмовидных функций, затем добавляем их и вводим y. Как видно из рисунка, наша сигмовидная функция на самом деле является нейроном, а составная функция, составленная из сигмоидной функции, представляет собой слой сети.
Рассмотрим многомерный случай.Многомерная составная функция имеет следующий вид:
Диаграмма многомерной составной функции выглядит следующим образом:
Эту картину мы часто называем полностью связанной нейронной сетью, но эта нейронная сеть имеет только один слой. Теперь мы приоткрыли завесу однослойной нейронной сети. Теоретически, пока у нас достаточно нейронов, мы можем реализовать любую сложную функцию. Но на самом деле проблем много.
Теперь мы все знаем, что сегодня хорошие сети обычно не являются однослойными. На некоторые из причин этого будет дан ответ в следующий раз. Спасибо за чтение~