«Глубокое обучение» Ли Хунъи (2)

искусственный интеллект
«Глубокое обучение» Ли Хунъи (2)

Волна искусственного интеллекта захлестывает мир, и многие слова всегда звучат у нас в ушах: искусственный интеллект (Artificial Intelligence), машинное обучение (Machine Learning), глубокое обучение (Deep Learning). Эта статья предназначена в основном для того, чтобы разобраться в примечаниях к содержанию курса Ли Хунъи, и в конце статьи дана справочная ссылка.

3-регрессия

监督学习.png

Определение линейной регрессии

Линейная регрессия определяется как: ожидается, что целевое значение будет линейной комбинацией входных переменных.Проще говоря, это выбор линейной функции, которая хорошо соответствует известным данным и предсказывает неизвестные данные.

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

Примеры применения

  • Прогноз фондового рынка
    • Исходные данные: движение акций за последние 10 лет, запросы новостей, запросы о слияниях и поглощениях компаний и т. д.
    • Результат: предсказать среднее значение фондового рынка завтра.
  • Беспилотный автомобиль
    • Вход: данные каждого датчика на беспилотном транспортном средстве, такие как дорожные условия, измеренное расстояние и т. д.
    • Выход: Угол поворота руля
  • Рекомендация продукта (рекомендация)
    • Вход: атрибуты элемента A, атрибуты элемента B.
    • Выход: вероятность покупки товара B.
  • Боевая мощь покемона:
    • Входные данные: значение CP до эволюции, вид (бульбазавр), объем крови (HP), вес (Weight), рост (Height).
    • Результат: значение развитого СР.

Объяснение шагов модели

  • шаг 1: предположения модели, выбор основы модели (линейная модель)
  • Шаг 2: Оценка модели, как оценить качество многих моделей (функция потерь)
  • шаг 3: оптимизация модели, как отфильтровать оптимальную модель (градиентный спуск)

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

  1. Сбор данных: этот шаг имеет решающее значение, поскольку качество и количество собранных данных помогут повысить точность прогностической модели.
  2. Подготовка данных: после того, как данные собраны, их необходимо загрузить в систему и подготовить к обучению машинному обучению, но иногда данные, которые мы собираем, могут иметь более бесполезные функции или элементы помех, которые мы в соответствии с реальной ситуацией и потребностями, характеристики или объем данных должны быть соответственно добавлены или удалены.
  3. Выберите правильную модель: выберите правильную модель обучения, исходя из нашего понимания и опыта задачи.
  4. Обучите модель. Обучите модель, используя данные для дальнейшего повышения производительности модели.
  5. Оцените модель: в процессе оценки необходимо проверить, эффективно ли обучена модель и может ли она выполнить поставленную задачу. Таким образом, вы можете легко протестировать свою модель на данных, которых не было во время обучения. Это делается для проверки того, как модель реагирует на данные, с которыми она еще не сталкивалась, а оценка заключается в анализе способности модели адаптироваться.
  6. Настройка гиперпараметров: это проверка того, есть ли возможности для улучшения обучаемой модели. Этого можно добиться, настроив определенные параметры (скорость обучения или количество запусков обучающей модели во время обучения). Во время обучения у вас есть несколько параметров для рассмотрения. Для каждого параметра вам необходимо знать роль, которую они играют в обучении модели, иначе вы можете потерять время или потратить больше времени на настройку.
  7. Прогноз: последний шаг, когда вышеуказанные параметры соблюдены, модель можно протестировать.

Шаг 1: предположения модели — линейная модель

Одномерная линейная модель (один признак)

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

Предположения линейной моделиy=b+w*xcpy=b+w*x_{cp}Итак, w и b могут угадать множество моделей

Многомерная линейная модель (множество признаков)

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

В практических приложениях входные функции должны быть больше, чемxcp x_{cp}Вот этот. Например, значение CP, вид (Bulbasaur), объем крови (HP), вес (Weight), рост (Height) и т. д. покемонов до эволюции, упомянутых в курсе, будут иметь множество характеристик.

image.pngИтак, мы предполагаем линейную модель:y=b+wixiy = b + \sum w_ix_i

  • XiX_i: это множество функций (feature)Xcp,Xhp,Xw,XhX_{cp},X_{hp},X_w,X_h.....
  • WiW_i: вес каждой функцииWcp,Whp,Ww,WhW_{cp},W_{hp},W_w,W_h....
  • bb:Компенсировать

Шаг 2: Оценка модели — функция потерь

определение:Функцию потерь (Loss Function) также можно назвать функцией стоимости (Cost Function) или функцией ошибок (Error Function),Используется для измерения того, насколько прогнозируемое значение отклоняется от фактического значения.. Вообще говоря, когда мы выполняем задачи машинного обучения, каждый используемый нами алгоритм имеет целевую функцию, и алгоритм для оптимизации этой целевой функции, особенно в задачах классификации или регрессии, заключается в использовании функции потерь (функции потерь) в качестве ее целевой функции. . Цель машинного обучения состоит в том, чтобы надеяться, что отклонение прогнозируемого значения от фактического значения мало, то есть надеяться, что функция потерь мала, что является так называемой минимизацией функции потерь.

Функция потерь используется для оценки прогнозируемого значения модели.y^=f(X)\widehat{y}=f(X)с истинной стоимостьюYYСтепень противоречивости , которая является неотрицательной функцией с действительным знаком. обычно используетсяL(Y,f(x))L(Y,f(x))Представлять,Чем меньше функция потерь, тем лучше производительность модели.

Роль функции потерь:Измерьте, насколько хорошо модель предсказывает

Функции потерь, обычно используемые в статистическом обучении, следующие:

  1. Функция потерь 0-1 (функция потерь 0-1):

L(Y,f(X))={1,Yf(X)0,Y=f(X)L(Y,f(X))=\left\{ \begin{aligned}&1,\quad Y\ne f(X)\\& 0,\quad Y=f(X) \end{aligned} \right.

Смысл функции потерь заключается в том, что при неверном прогнозе значение функции потерь равно 1, а при правильном прогнозе значение функции потерь равно 0. Функция потерь не учитывает степень ошибки между прогнозируемым значением и истинным значением, то есть, пока прогноз неверен, ошибка прогноза такая же, как и ошибка прогноза, намного хуже.

  1. квадратичная функция потерь

L(Y,f(X))=(Yf(X))2L(Y,f(X))=(Y-f(X))^2

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

  1. абсолютная функция потерь

L(Y,f(X))=Yf(X)L(Y,f(X))=|Y-f(X)|

Смысл функции потерь аналогичен приведенному выше, за исключением того, что вместо абсолютного значения берется абсолютное значение, и разрыв не будет усиливаться квадратом.

  1. функция логарифмических потерь или функция потерь логарифмического правдоподобия

L(Y,P(YX))=logP(YX)L(Y,P(Y|X))=-logP(Y|X)

Эту функцию потерь труднее понять. По сути, функция потерь использует идею оценки максимального правдоподобия.P(YX)P(Y|X)Популярное объяснение таково: на основе текущей модели для выборки X прогнозируемое значение равно Y, то есть вероятность правильного прогноза. Так как одновременное удовлетворение между вероятностями требует использования умножения, то для того, чтобы преобразовать его в сложение, возьмем логарифм. Наконец, поскольку это функция потерь, чем выше вероятность правильного прогноза, тем меньше должно быть значение потерь, поэтому добавьте отрицательный знак и возьмите противоположное значение.

Шаг 3: Лучшая модель — градиентный спуск.

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

Метод его расчета можно выразить просто:an+1=anη*ana_{n+1}=a_n-\eta*\overrightarrow{a_n}

η\eta: представляет размер шага или скорость обучения lr. То есть пропорция расстояния, пройденного каждым шагом.

Один из вопросов: зачем умножать -k

Ответ: Мы хотим найти минимальный градиент, другими словами, найти низшую точку функции.Если это можно объяснить математическим мышлением, продифференцировать текущую точку.Если производная меньше 0, значит, низшая точка точка находится справа от точки, а производная равна Если производная больше 0, это означает, что самая нижняя точка находится слева от точки, производная положительна, и умножение на -k является значением уменьшения w.

image.png

  • Шаг 1: выберите случайным образомw0w^0
  • Шаг 2: Рассчитайте дифференциал, который является текущим уклоном, и определите направление движения в соответствии с уклоном.
    • больше 0 двигаться влево (уменьшать w)
    • меньше 0 двигаться вправо (увеличить w)
  • Шаг 3: Двигайтесь в соответствии со скоростью обучения
  • Повторяйте шаги 2 и 3, пока не будет найдена самая нижняя точка.

image.png

Разумный случай для настройки скорости обучения или размера шага

image.png

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

image.png

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

Фактически в процессе обучения мы должны менять значение скорости обучения с увеличением количества итераций.постепенно уменьшаться

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

image.pngВ реальных задачах люди часто используют следующие стратегии, чтобы попытаться «выпрыгнуть» из локального минимума, чтобы достичь глобального минимума:

  • Инициализируйте несколько нейронных сетей с несколькими наборами различных значений параметров.После обучения по стандартной методике возьмите решение с наименьшей ошибкой в ​​качестве конечного параметра, что эквивалентно запуску поиска из нескольких разных точек инициализации, чтобы найти глобальный оптимум.
  • Используя технику имитации деградации, имитация отжига принимает худший результат, чем текущее решение, с определенной вероятностью на каждом шаге, тем самым помогая «выпрыгнуть» из локальных минимумов. На каждой итерации вероятность принятия «субоптимального решения» постепенно уменьшается с течением времени, что обеспечивает устойчивость алгоритма.
  • Используя стохастический градиентный спуск, в отличие от стандартного градиентного спуска, который точно вычисляет градиент, стохастический градиентный спуск добавляет случайные факторы к вычислению градиента. Поэтому, даже если он попадает в локальный минимум, к вычисляемому им градиенту добавляются случайные факторы, поэтому, даже если он попадает в локальный минимум, расчетный градиент может быть не равен 0, поэтому есть шанс выскочить из локальный минимум и продолжить поиск.

Как проверить модель хорошая или плохая

  1. Разделите тренировочный набор и тестовый набор
  2. Оцените результаты классификации: точность, матрицу путаницы, показатель точности, показатель отзыва, показатель F1, кривую ROC и т. д.
  3. Оценка результатов регрессии: MSE, RMSE, MAE, R Squared

Возникает проблема переобучения

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

Результаты частоты ошибок отображаются графически, и обнаружено, что модели с более чем 3-мя степенями имеют переоснащение:

image.png

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

В алгоритмах машинного обучения мы часто делим исходный набор данных на три части: данные обучения, данные проверки и данные тестирования.

Вопрос: Что такое проверочный набор?

Это на самом деле используется, чтобы избежать переобучения. Во время обучения мы часто используем его для определения некоторых гиперпараметров (например, определяем размер эпохи ранней остановки на основе точности проверочных данных, определяем скорость обучения на основе проверочных данных и т. д.). Так почему бы не сделать это непосредственно на тестовых данных? Поскольку предполагается, что это делается на данных тестирования, по мере обучения наша сеть фактически мало-помалу переоснащает наши данные тестирования, в результате чего окончательная точность тестирования становится бессмысленной. Следовательно, роль обучающих данных заключается в вычислении веса обновления градиента, а тестовые данные дают точность для вывода о качестве сети.

Основными методами предотвращения переобучения являются:

  1. Регуляризация (L1 и L2)
  2. Увеличение данных, то есть добавление обучающих выборок данных
  3. Dropout
  4. early stopping

Для получения подробной информации см.:blog.CSDN.net/U010899985/…

пошаговая оптимизация

Шаг 1. Оптимизация: четыре линейные модели с двумя входами объединяются в одну линейную модель.

image.png

image.png

Шаг 2 Оптимизация: если вы хотите, чтобы модель была более мощной и работала лучше (больше параметров, больше входных данных)

В начале у нас было много функций, функций графического анализа, и мы добавили в модель объем крови (HP), вес (Weight) и рост (Height).

Шаг 3. Оптимизация: добавьте регуляризацию

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

  • Чем меньше w, тем более гладкой является функция, и выходное значение функции не сильно отличается от входного значения.
  • Во многих сценариях применения дело не в том, что чем меньше w, тем более сглажена модель, но эмпирическое значение говорит нам о том, что чем меньше w, тем лучше в большинстве случаев.
  • Значение b близко к 0 и не влияет на сглаживание кривой.

4 - Демонстрация регрессии

import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl

# matplotlib没有中文字体,动态解决
plt.rcParams['font.sans-serif'] = ['Simhei']  # 显示中文
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

x_data = [338., 333., 328., 207., 226., 25., 179., 60., 208., 606.]
y_data = [640., 633., 619., 393., 428., 27., 193., 66., 226., 1591.]
x_d = np.asarray(x_data)
y_d = np.asarray(y_data)

x = np.arange(-200, -100, 1)
y = np.arange(-5, 5, 0.1)
Z = np.zeros((len(x), len(y)))
X, Y = np.meshgrid(x, y)

# loss
for i in range(len(x)):
    for j in range(len(y)):
        b = x[i]
        w = y[j]
        Z[j][i] = 0  # meshgrid吐出结果:y为行,x为列
        for n in range(len(x_data)):
            Z[j][i] += (y_data[n] - b - w * x_data[n]) ** 2
        Z[j][i] /= len(x_data)

# linear regression
# b = -120
# w = -4
b = -2
w = 0.01
lr = 0.000005
iteration = 1400000

b_history = [b]
w_history = [w]
loss_history = []
import time

start = time.time()
for i in range(iteration):
    m = float(len(x_d))
    y_hat = w * x_d + b
    loss = np.dot(y_d - y_hat, y_d - y_hat) / m
    grad_b = -2.0 * np.sum(y_d - y_hat) / m
    grad_w = -2.0 * np.dot(y_d - y_hat, x_d) / m
    # update param
    b -= lr * grad_b
    w -= lr * grad_w

    b_history.append(b)
    w_history.append(w)
    loss_history.append(loss)
    if i % 10000 == 0:
        print("Step %i, w: %0.4f, b: %.4f, Loss: %.4f" % (i, w, b, loss))
end = time.time()
print("大约需要时间:", end - start)

# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))  # 填充等高线
plt.plot([-188.4], [2.67], 'x', ms=12, mew=3, color="orange")
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$')
plt.ylabel(r'$w$')
plt.title("线性回归")
plt.show()

# linear regression
b = -120
w = -4
lr = 1
iteration = 100000

b_history = [b]
w_history = [w]

lr_b = 0
lr_w = 0
import time

start = time.time()
for i in range(iteration):
    b_grad = 0.0
    w_grad = 0.0
    for n in range(len(x_data)):
        b_grad = b_grad - 2.0 * (y_data[n] - n - w * x_data[n]) * 1.0
        w_grad = w_grad - 2.0 * (y_data[n] - n - w * x_data[n]) * x_data[n]

    lr_b = lr_b + b_grad ** 2
    lr_w = lr_w + w_grad ** 2
    # update param
    b -= lr / np.sqrt(lr_b) * b_grad
    w -= lr / np.sqrt(lr_w) * w_grad

    b_history.append(b)
    w_history.append(w)
# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))  # 填充等高线
plt.plot([-188.4], [2.67], 'x', ms=12, mew=3, color="orange")
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$')
plt.ylabel(r'$w$')
plt.title("线性回归")
plt.show()

Ссылка на ссылку: