В этой статье обсуждаются концепции вычислительной теории обучения (COLT) и статистической теории обучения (SLT) в машинном обучении. Он охватывает основные идеи и принципы этих теорий, включая модель PAC, сложность выборки и границы обобщения. В статье также приводятся примеры того, как эти концепции могут применяться в реальных задачах машинного обучения и демонстрации кода с использованием Python.

Машинное обучение стало одной из самых востребованных областей исследования и работы в современном мире. Это междисциплинарная область, объединяющая информатику, математику, статистику и другие смежные области, позволяющая машинам учиться на данных, выявлять закономерности и принимать решения на их основе. Однако остается вопрос: как машины учатся? На этот вопрос отвечают две основные теории: вычислительная теория обучения (CLT) и статистическая теория обучения (SLT). В этой статье подробно обсуждаются обе теории и подчеркиваются их сходства и различия.

Что такое вычислительная теория обучения?

Теория вычислительного обучения (CLT) занимается разработкой и анализом алгоритмов, которые позволяют машинам учиться на данных. Другими словами, это изучение того, как машины могут учиться на примерах и улучшать свою производительность с течением времени. CLT фокусируется на выявлении вычислительной сложности задач обучения и определении минимального объема данных, необходимых для эффективного обучения машин.

Обучение ПКК

Структура обучения «Возможно приблизительно правильно» (PAC) является центральной концепцией CLT. При наличии достаточного количества данных он определяет класс задач, которые можно изучить с высокой вероятностью. Структура обучения PAC считает алгоритм обучения эффективным, если он может изучить гипотезу, которая приблизительно правильна в пределах определенного предела погрешности и с высоким уровнем достоверности.

import numpy as np

# Define the quadratic function class
def quadratic_function(x, a, b, c):
    return a*x**2 + b*x + c

# Define the PAC learning algorithm
def pac_learning_algorithm(X, y, h_class, eps, delta):
    n = len(X)
    m = len(h_class)
    h_star = None
    for i in range(m):
        h = h_class[i]
        error_sum = 0
        for j in range(n):
            if h(X[j]) != y[j]:
                error_sum += 1
        error_prob = error_sum / n
        if error_prob <= eps/m:
            h_star = h
            break
    return h_star

# Define the example case parameters
X = np.array([1, 2, 3])
y = np.array([2, 5, 10])
h_class = []
for a in np.linspace(-1, 1, num=21):
    for b in np.linspace(-1, 1, num=21):
        for c in np.linspace(-1, 1, num=21):
            h_class.append(lambda x, a=a, b=b, c=c: quadratic_function(x, a, b, c))
eps = 0.1
delta = 0.1

# Run the PAC learning algorithm and print the learned hypothesis
h_star = pac_learning_algorithm(X, y, h_class, eps, delta)
print("Learned hypothesis: h(x) = {}x^2 + {}x + {}".format(round(h_star(1), 2), round(h_star(1), 2), round(h_star(1), 2)))

# Test the learned hypothesis on input set X and round off the outputs
print("h_star(X) = ", np.round(h_star(X)))
Learned hypothesis: h(x) = 2.0x^2 + 2.0x + 2.0
h_star(X) =  [ 2.  5. 10.]

Этот код определяет класс квадратичных функций и алгоритм обучения PAC как функции, устанавливает параметры примера примера, запускает алгоритм и печатает изученную гипотезу и ее выходные данные на входном наборе X, округленные с помощью функции np.round().

Бритва Оккама

Бритва Оккама — это принцип CLT, который утверждает, что более простое объяснение с большей вероятностью будет правильным, учитывая два объяснения одного и того же явления. В контексте машинного обучения бритва Оккама подразумевает, что самая простая гипотеза, которая соответствует данным, скорее всего, будет лучшей.

Размер ВК

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

Что такое статистическая теория обучения?

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

Компромисс смещения и дисперсии

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

import numpy as np
import matplotlib.pyplot as plt

# Generate some random data
x = np.random.uniform(low=-5, high=5, size=(100,))
y = x ** 2 + np.random.normal(loc=0, scale=5, size=(100,))

# Define a polynomial function class with varying degrees
class PolyFunc:
    def __init__(self, degree):
        self.degree = degree
        
    def fit(self, X, y):
        X_poly = np.vander(X, N=self.degree+1, increasing=True)
        self.coef_ = np.linalg.inv(X_poly.T @ X_poly) @ X_poly.T @ y
        
    def predict(self, X):
        X_poly = np.vander(X, N=self.degree+1, increasing=True)
        return X_poly @ self.coef_

# Create a range of polynomial degrees to test
degrees = [1, 2, 3]

# Plot the data and fitted curves for each degree
plt.figure(figsize=(12, 8))
plt.scatter(x, y, label='Data')
for degree in degrees:
    model = PolyFunc(degree=degree)
    model.fit(x, y)
    y_pred = model.predict(x)
    plt.plot(x, y_pred, label=f'Degree {degree}')
plt.legend()
plt.title('Bias-Variance Tradeoff')
plt.xlabel('X')
plt.ylabel('y')
plt.show()

Регуляризация

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

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import learning_curve
from sklearn.linear_model import Ridge

# Generate some random data
X = np.random.uniform(low=-5, high=5, size=(100, 10))
y = X[:, 0] ** 2 + np.random.normal(loc=0, scale=5, size=(100,))

# Create a Ridge regression model
model = Ridge(alpha=1.0)

# Compute the learning curve
train_sizes, train_scores, test_scores = learning_curve(
    estimator=model,
    X=X,
    y=y,
    train_sizes=np.linspace(0.1, 1.0, num=10),
    cv=5
)

# Compute the mean and standard deviation of the scores
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)

# Plot the learning curve
plt.figure(figsize=(8, 6))
plt.plot(train_sizes, train_mean, label='Training score')
plt.fill_between(train_sizes, train_mean - train_std, train_mean + train_std, alpha=0.2)
plt.plot(train_sizes, test_mean, label='Validation score')
plt.fill_between(train_sizes, test_mean - test_std, test_mean + test_std, alpha=0.2)
plt.legend()
plt.title('Learning Curve')
plt.xlabel('Training Examples')
plt.ylabel('Score')
plt.show()

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split

# Generate some random classification data
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5,
                           n_redundant=0, n_clusters_per_class=2, random_state=42)

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Fit a logistic regression model to the training data
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)

# Predict the probabilities for the testing data
y_pred_proba = model.predict_proba(X_test)[:, 1]

# Compute the ROC curve and AUC
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)

# Plot the ROC curve
plt.plot(fpr, tpr, lw=2, label='AUC = %0.2f' % roc_auc)
plt.plot([0, 1], [0, 1], 'k--', lw=2)
plt.xlim([-0.05, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()

Эмпирическая минимизация риска

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

import numpy as np

# Define the loss function
def squared_loss(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

# Generate some synthetic data
X = np.random.rand(100, 10)
w_true = np.random.rand(10)
y = X.dot(w_true) + np.random.randn(100)

# Split the data into training and validation sets
X_train, y_train = X[:80], y[:80]
X_val, y_val = X[80:], y[80:]

# Implement ERM to find the best model
best_loss = np.inf
for i in range(1000):
    # Generate a random set of weights
    w = np.random.rand(10)
    
    # Compute the loss on the training set
    train_loss = squared_loss(y_train, X_train.dot(w))
    
    # Update the best model if the current model is better
    if train_loss < best_loss:
        best_loss = train_loss
        best_w = w
    
# Compute the final loss on the validation set using the best model
val_loss = squared_loss(y_val, X_val.dot(best_w))
print("Best weights:", best_w)
print("Validation loss:", val_loss)
Best weights: [0.40758174 0.38630624 0.349759   0.04666266 0.49253125 0.17929597
 0.99101634 0.11545893 0.5622836  0.94106405]
Validation loss: 1.0434214925308551

Сначала мы определяем функцию потерь (квадрат потерь), которую хотим минимизировать. Затем мы генерируем некоторые синтетические данные и разделяем их на наборы для обучения и проверки. Мы используем ERM, чтобы найти лучшую модель, генерируя случайный набор весов и вычисляя потери в обучающем наборе. Мы обновляем лучшую модель, если текущая модель лучше. Наконец, мы вычисляем окончательные потери в проверочном наборе, используя лучшую модель.

Сравнение вычислительной и статистической теории обучения

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

Фокус

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

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

Предположения

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

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

Цели

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

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

Приложения

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

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

Заключение

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

Повышение уровня кодирования

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

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу