Серия «Основы технологии больших моделей искусственного интеллекта»: автоматизированный поиск моделей

Автор: Дзен и искусство компьютерного программирования

1. Введение

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

2. Объяснение основных понятий и терминов

2.1 Модель

В искусственном интеллекте модель относится к серии вычислительной логики и ее параметров, используемых для прогнозирования или принятия решений о реальном мире. Модели могут быть абстрактными или конкретными. Например, модели дерева решений, модели опорных векторов (SVM) и модели нейронных сетей — все это модели искусственного интеллекта.

2.2 Набор данных

Набор данных — это набор данных, используемых для обучения модели. Вообще говоря, набор данных состоит из входных данных (Вход) и выходных данных (Выход). Каждая выборка представляет собой фрагмент данных. Входные данные включают в себя функции (Функция), а выходные данные соответствуют прогнозируемому целевому значению (Метка). Обычно используемые наборы классификационных данных включают IRIS, MNIST, CIFAR-10 и т. д.

2.3 Функция стоимости

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

2.4 Параметры

Параметры модели (Параметры) относятся к параметрам, используемым для управления поведением модели. Обычно используемые параметры модели включают вес, смещение, гиперпараметр и т. д.

2.5 Гиперпараметры

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

2.6 Автоматический поиск модели

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

  1. В процессе обучения разные модели должны иметь разные стратегии обучения;
  2. При развертывании разные модели должны иметь разные стратегии прогнозирования.

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

3. Объяснение основных принципов алгоритма, конкретных рабочих этапов и математических формул.

3.1 Концепция

Генетический алгоритм (ГА) — это генетический алгоритм, основанный на функции приспособленности популяции (функция приспособленности).

3.2 Концепция

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

3.3 Концепция

Индивидуум относится к одной или нескольким комбинациям переменных, которые решают определенную проблему, то есть к хромосоме.

3.4 Концепция

Хромосома означает, что каждая особь состоит из нескольких генов (Gene), а число генов может быть 0 или 1.

3.5 Концепция

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

3.6 Концепция

Мутация относится к процессу мутации особей перед размножением.

3.7 Концепция

Кроссовер — это процесс скрещивания особей после размножения с целью получения нового потомства.

3.8 Концепция

Фитнес-функция — это функция, которая оценивает качество текущего решения на основе его качества.

3.9 Конкретные этапы работы

  1. Инициализация популяции: случайным образом сгенерируйте начальную популяцию и привяжите хромосомы к значениям приспособленности. Начальная длина популяции обычно устанавливается от 100 до 500.

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

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

  4. Условие завершения: остановить работу, когда алгоритм достигнет сходимости или количество итераций достигнет определенного значения.

3.10 Математические формулы

Определение хромосомы: $x \in {0,1}^n$
Определение значения пригодности: $\phi(x) = f(\theta^T x)$
Определение индивидуальной вероятности: $P_c(x) = P_{cr} ( x) P_{fit}(x)$, $P_{cr} (x_i, x_j)$ — вероятность пересечения, $P_{fit}$ — плотность вероятности значения приспособленности.
Определение вероятности пересечения: $P_{cr}(x_i, x_j) = \frac{1}{N} \sum_{k=1}^{N}\left{[k!= i & k!= j]~p_ {cross}(X_i^{a}, X_j^{a}, X_k^{b})\right}$, $X^{a}$ — собственная хромосома, $X^{b}$ — другая отдельная хромосома , $N$ — общее количество популяций.
Определение плотности вероятности значения приспособленности: $p_{fit}(x) = \frac{\exp(-\frac{(\theta^Tx - y)^2}{2\sigma_y^2})}{\sqrt{ 2\pi\sigma_y^2}}$.
Определение популяции $m$-го поколения: $X_m = [x_1^{m},...,x_{M_m}^{m}]$, $M_m$ — количество популяций в каждом поколении.

4. Конкретные примеры кода и пояснения

4.1 Примеры кода

import numpy as np

class GeneticAlgorithm:
    def __init__(self, MU, LAMBDA, NGEN, sigma):
        self.MU = MU # 种群大小
        self.LAMBDA = LAMBDA # 小种群大小
        self.NGEN = NGEN # 迭代次数
        self.sigma = sigma

    def init_population(self, dim):
        pop = []
        for _ in range(self.MU):
            chromosome = np.random.randint(2, size=(dim)) # 生成染色体
            fitness = function(chromosome) # 计算适应度值
            pop.append((chromosome, fitness)) # 将染色体与适应度值绑定起来
        return pop

    def select_parents(self, population):
        parents = []
        while len(parents) < 2:
            idx = np.random.choice(range(len(population)), replace=False, p=[x[1] for x in population])
            if not any([np.array_equal(idx, x[0]) for x in parents]):
                parents.append(population[idx])
        return parents

    def crossover(self, parent1, parent2):
        if np.random.rand() < 0.8:
            point = np.random.randint(low=0, high=len(parent1)-1)
            child1 = np.concatenate((parent1[:point], parent2[point:]))
            child2 = np.concatenate((parent2[:point], parent1[point:]))
            return child1, child2
        else:
            return parent1, parent2

    def mutation(self, chrom):
        mask = np.random.binomial(size=chrom.shape, n=1, p=0.2)[0] # 设置突变概率为0.2
        chrom[mask==1] = abs(chrom[mask==1]-1) # 对变异基因进行变异
        return chrom

    def run(self, data):
        dim = len(data[0][0]) # 获取维度
        population = self.init_population(dim) # 初始化种群

        for generation in range(self.NGEN):
            offspring = []

            # 生殖子代
            while len(offspring)<self.LAMBDA:
                parent1, parent2 = self.select_parents(population)
                child1, child2 = self.crossover(parent1[0], parent2[0])
                offspring += [(child1, None), (child2, None)]

            # 变异
            for i in range(int(self.LAMBDA/2)):
                rand_index = np.random.randint(len(offspring))
                mutated_chrom = self.mutation(offspring[rand_index][0])
                offspring[rand_index] = (mutated_chrom, None)

            # 更新种群
            new_population = []
            new_population += sorted(population+offspring, key=lambda x:-x[1])[0:self.MU] # 插入父代和子代
            population = new_population

            print("Generation:", generation+1, "Best Fitness", max([x[1] for x in population])) # 打印当前结果

        best_individual = sorted(population, key=lambda x:-x[1])[0] # 获取最优个体
        return best_individual

def function(chromosome):
    '''
    根据染色体求适应度值
    '''
    pass

if __name__ == '__main__':
    ga = GeneticAlgorithm(MU=50, LAMBDA=20, NGEN=50, sigma=1) # 初始化遗传算法
    data = load_data() # 加载数据
    result = ga.run(data) # 执行遗传算法
    print("Best Chromosome:", "".join(map(str,result[0]))) # 打印最优染色体
    print("Best Fitness Value:", result[1]) # 打印最优适应度值

4.2 Объяснение

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

Функции-члены класса следующие:

  1. __init__: Конструктор для инициализации экземпляра генетического алгоритма.
  2. init_population: Инициализировать популяцию и вернуть список населения.
  3. select_parents: выберите двух особей из популяции в качестве родителей и верните двух родительских особей.
  4. crossover: Процесс размножения, генерирующий двух особей и возвращающий двух потомков.
  5. mutation: Процесс генной мутации, возвращающий мутировавшую хромосому.
  6. run: выполнить генетический алгоритм и вернуть оптимальную особь.

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

На этом мы завершили реализацию кода генетического алгоритма.

5. Будущие тенденции и проблемы развития

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

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

рекомендация

отblog.csdn.net/universsky2015/article/details/133446761