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

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

Как работает полуконтролируемое обучение?

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

При полуконтролируемом обучении небольшая часть данных помечается, а остальные не помечаются. Размеченные данные используются для обучения модели машинного обучения, а неразмеченные данные используются для повышения точности модели. Это делается путем использования модели для создания прогнозов для немаркированных данных, а затем использования этих прогнозов для обновления параметров модели. Этот процесс повторяется итеративно, пока модель не достигнет удовлетворительного уровня точности.

Выполнение

Позвольте мне привести вам пример полуконтролируемого обучения с использованием набора данных.

Рассмотрим популярный набор данных MNIST, который состоит из 70 000 изображений рукописных цифр, каждое из которых помечено соответствующей цифрой (0–9). В типичном подходе к обучению с учителем мы будем использовать только размеченные данные (т. е. изображения с известными цифровыми метками) для обучения модели машинного обучения классификации новых изображений.

Вы можете узнать больше о наборе данных MNIST здесь.

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

Вот как будет работать этот процесс:

  1. Обучите генеративную модель, такую ​​как вариационный автоэнкодер (VAE), на немаркированных изображениях MNIST, чтобы изучить базовое распределение данных.
  2. Используйте обученный VAE для создания дополнительных помеченных данных путем выборки из изученного распределения. Каждому сгенерированному изображению мы можем присвоить метку цифры, которую VAE удалось реконструировать лучше всего.
  3. Объедините сгенерированные размеченные данные с исходными размеченными данными и обучите контролируемую модель обучения, такую ​​как сверточная нейронная сеть (CNN), на комбинированном размеченном наборе данных.
  4. Оцените производительность обученной модели на отдельном тестовом наборе помеченных данных.

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

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

Вот подход кода;

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms

# Load and preprocess the data
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5,), (0.5,))])

trainset = torchvision.datasets.MNIST(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.MNIST(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64,
                                         shuffle=False, num_workers=2)

# Define the model architecture
class VAE(nn.Module):
    def __init__(self):
        super(VAE, self).__init__()

        self.encoder = nn.Sequential(
            nn.Linear(784, 256),
            nn.ReLU(),
            nn.Linear(256, 64),
            nn.ReLU(),
            nn.Linear(64, 20),
            nn.ReLU(),
            nn.Linear(20, 10),
            nn.ReLU()
        )

        self.decoder = nn.Sequential(
            nn.Linear(10, 20),
            nn.ReLU(),
            nn.Linear(20, 64),
            nn.ReLU(),
            nn.Linear(64, 256),
            nn.ReLU(),
            nn.Linear(256, 784),
            nn.Tanh()
        )

    def forward(self, x):
        encoded = self.encoder(x)
        mean = encoded[:, :5]
        log_var = encoded[:, 5:]
        std = torch.exp(0.5 * log_var)
        eps = torch.randn_like(std)
        z = mean + eps * std
        decoded = self.decoder(z)
        return decoded, mean, log_var

# Define the loss function
def loss_function(recon_x, x, mu, logvar):
    BCE = nn.functional.binary_cross_entropy(recon_x, x.view(-1, 784), reduction='sum')
    KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
    return BCE + KLD

# Define the optimizer
vae = VAE()
optimizer = optim.Adam(vae.parameters(), lr=0.001)

# Train the model
vae.train()
for epoch in range(10):
    for i, (data, labels) in enumerate(trainloader):
        data = data.view(-1, 784)
        recon_batch, mu, logvar = vae(data)
        labeled_loss = loss_function(recon_batch, data, mu, logvar)
        optimizer.zero_grad()
        labeled_loss.backward()
        optimizer.step()

        # Unlabeled loss
        for j, (data, _) in enumerate(trainloader):
            if j == i:
                continue
            data = data.view(-1, 784)
            _, mu, logvar = vae(data)
            unlabeled_loss = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
            optimizer.zero_grad()
            unlabeled_loss.backward()
            optimizer.step()

    print('Epoch: {}  Labeled Loss: {:.4f}  Unlabeled Loss: {:.4f}'.format(epoch+1, labeled_loss.item(), unlabeled_loss.item()))

# Evaluate the model
vae.eval()
correct = 0
total = 0
with torch.no_grad():
    for data, labels in testloader:
        data = data.view(-1, 784)
        recon_batch, mu, logvar = model(data)
        test_loss += loss_function(recon_batch, data, mu, logvar).item()
        _, predicted = torch.max(recon_batch.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Test set loss: {:.4f}, Accuracy: {:.2f}%'.format(test_loss / len(testloader.dataset),100 * correct / total))

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

  1. Загрузить и предварительно обработать данные. Первый шаг — загрузить и предварительно обработать данные. В этом примере мы используем набор данных MNIST, который содержит изображения рукописных цифр. Библиотека torchvision используется для загрузки набора данных, и мы применяем некоторые преобразования к изображениям, чтобы нормализовать их и преобразовать в тензоры.
  2. Определение архитектуры модели. Следующим шагом является определение архитектуры модели VAE. Модель VAE состоит из кодировщика и декодера, которые представляют собой нейронные сети, которые вместе обучаются для изучения низкоразмерного представления данных. В этом примере мы используем простую архитектуру с двумя полностью связанными слоями для кодера и декодера.
  3. Определите функцию потерь. Функция потерь для модели VAE состоит из двух составляющих: потери при реконструкции и потери из-за расхождения KL. Потери при реконструкции измеряют, насколько хорошо модель может восстановить входное изображение, а потери на расхождение KL измеряют, насколько близко изученное распределение к стандартному нормальному распределению.
  4. Определите оптимизатор. Оптимизатор используется для обновления параметров модели VAE во время обучения. В этом примере мы используем оптимизатор Adam со скоростью обучения 0,001.
  5. Обучение модели. Модель обучается с использованием комбинации размеченных и неразмеченных данных. Во время каждой итерации обучения мы случайным образом выбираем пакет помеченных данных и пакет неразмеченных данных. Мы вычисляем потери реконструкции и потери расхождения KL для размеченных данных и только потери расхождения KL для неразмеченных данных. Затем мы применяем обратное распространение градиентов и обновляем веса модели с помощью оптимизатора.
  6. Оценка модели. После завершения обучения мы можем оценить производительность модели на отдельном тестовом наборе размеченных данных. В этом примере мы используем показатель точности для оценки производительности модели на тестовом наборе.

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

Реальная реализация полууправляемого машинного обучения

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

  1. Обнаружение аномалий в производстве. Полуконтролируемое обучение можно использовать для выявления аномалий в производственных процессах, таких как дефекты продукции или отказ оборудования. Обучая модель как на помеченных данных (например, известные дефекты), так и на немаркированных данных (например, нормальные рабочие условия), модель может научиться выявлять аномалии с высокой точностью.
  2. Обработка естественного языка (NLP). Полуконтролируемое обучение широко используется в приложениях NLP, таких как анализ настроений и классификация текстов. При наличии больших объемов неаннотированных текстовых данных часто сложно и дорого маркировать все данные. Используя немаркированные данные в сочетании с небольшим количеством размеченных данных, полууправляемое обучение может повысить точность моделей НЛП.
  3. Компьютерное зрение. Полууправляемое обучение используется в приложениях компьютерного зрения, таких как обнаружение объектов, сегментация изображений и оценка глубины. В этих приложениях может быть доступно небольшое количество помеченных изображений, но огромное количество немаркированных данных. Используя немаркированные данные, полууправляемое обучение может повысить точность модели.
  4. Обнаружение мошенничества. Полуконтролируемое обучение также используется в финансовой индустрии для обнаружения мошенничества. Обучая модель как на помеченных данных (например, известных случаях мошенничества), так и на немаркированных данных (например, обычных транзакциях), модель может научиться выявлять подозрительное поведение и помечать его для дальнейшего расследования.

Вот как компании используют эти методы в реальном мире.

  1. Google. Google использует частично контролируемое обучение для своей поисковой системы, чтобы повысить релевантность результатов поиска. Они используют большие объемы немаркированных данных вместе с небольшим объемом размеченных данных для повышения производительности своих поисковых алгоритмов.
  2. Facebook. Facebook использует полуконтролируемое обучение для модерации контента. Они используют комбинацию размеченных и неразмеченных данных для обучения моделей машинного обучения, которые могут выявлять и удалять вредоносный контент.
  3. Uber: компания Uber использовала полуконтролируемое обучение для улучшения своих карт и навигационных систем. Они используют немаркированные данные своих водителей для обучения моделей машинного обучения, которые могут точно предсказывать схемы движения и предоставлять водителям более точное время в пути.
  4. Amazon: Amazon использует частично контролируемое обучение для систем рекомендаций по продуктам. Они используют комбинацию размеченных и неразмеченных данных для обучения моделей машинного обучения, которые могут давать персонализированные рекомендации по продуктам клиентам на основе их прошлой истории покупок.
  5. IBM: IBM использовала частично контролируемое обучение для обнаружения мошенничества в финансовых транзакциях. Они используют большие объемы немаркированных данных вместе с небольшим объемом размеченных данных для обучения моделей машинного обучения, которые могут точно обнаруживать мошеннические транзакции.

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

Рекомендации

  1. https://ai.googleblog.com/2021/07/from-vision-to-language-semi-supervised.html
  2. https://ai.facebook.com/blog/self-supervised-learning-the-dark-matter-of-intelligence/
  3. https://www.uber.com/blog/research/meta-learning-for-semi-supervised-few-shot-classification
  4. https://www.geeksforgeeks.org/how-amazon-uses-machine-learning/