Hengyuan Cloud_Child Tuning: отсев для обратного распространения ошибки

глубокое обучение
Hengyuan Cloud_Child Tuning: отсев для обратного распространения ошибки

Источник статьи | Облачное сообщество Hengyuan (сосредоточение внимания на обучающей платформе облачного GPU-сервера с искусственным интеллектом/глубоким обучением, официальный веб-сайт опыта: gpushare.com/)

Исходный адрес |Не совсем. GPU share.com/topic/693/… from…

Оригинальный автор | Матор


У1С1, 1 год 1 степеньКонференция по планированию облака графических процессоровСкоро, десять лучших наборов событий ждут, когда вы придете и получите их~

Эта статья предназначена в основном для статей о EMNLP2021.Raise a Child in Large Language Model: Towards Effective and Generalizable Fine-tuningОбъяснять. Название статьи несколько абстрактно, но, по словам авторов, суть статьи можно свести к двум словам:Child Tuning

Хотя эта статья в основном нацелена на задачи НЛП и модели, связанные с НЛП, на самом деле, прочитав ее, я чувствую, что это общий метод, который также можно использовать в области CV. Конкретно параметры текущей предобученной модели очень большие.В нисходящих задачах мы можем использовать только ограниченный обучающий набор для тонкой настройки модели.Ощущение что рука это машина,поэтому автор предлагает новый метод тонкой настройки - Child Tuning. Если бы я мог подытожить это одним предложением, это было бы:В процессе обратного распространения нам не нужно обновлять все параметры, только некоторые параметры, и структура сети, соответствующая этим обновленным параметрам, называется Child Network (подсеть)

image.png

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

image.png

Нижний индекс 0 не относится к определенному параметру, а относится к 0-му итерационному процессу,н\etaэто скорость обучения. Для следующей строкиΔw0\Дельта\mathbf{w}_0​Часть его была удалена с помощью MASK, что привело к градиенту 0.

image.png

Среди них элементы в матрице МММ либо 0, либо 1,\odotЭто умножение соответствующих позиций элементов в матрице. Мы можем суммировать процесс дочерней настройки в два этапа:

  1. Откройте и подтвердите дочернюю сеть в предварительно обученной модели и сгенерируйте 0-1 MASK, соответствующую весам.
  2. После того, как обратное распространение вычисляет градиент, обновляются только параметры в дочерней сети.

Итак, теперь вопрос в том, как подтвердить дочернюю сеть?

HOW TO FIND CHILD NETWORK?

На самом деле нам не нужно искать Дочернюю Сеть, достаточно определить матрицу МММ. В статье представлены два алгоритма построения матрицMM, которые являются независимым от задачи алгоритмом Child_Tuning_F (F для Task-Free) и алгоритм Child_Tuning_D (D для Task-Drivern)

Child_Tuning_F

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

image.png

вpFе[0,1]p_F∈[0,1]— это гиперпараметр, управляющий размером дочерней сети, еслиpF=1p_F=1, Дочерняя сеть — это исходная сеть, а Дочерняя настройка — это Точная настройка; еслиpF=0p_F=0, никакие параметры не будут обновлены. Ниже приведен простой код моделирования, который я написал, чтобы помочь вам понять

import torch
from torch.distributions.bernoulli import Bernoulli

gradient = torch.randn((3, 4)) # 这里用一个随机生成的矩阵来代表梯度
p_F = 0.2
gradient_mask = Bernoulli(gradient.new_full(size=gradien.size(), fill_value=p_F))
gradient_mask = gradient_mask.sample() / p_F # 除以p_F是为了保证梯度的期望不变
print(gradient_mask)

gradient *= gradient_mask
print(gradient)

Bernoulliэто класс, который генерируетgradient_maskявляется объектом, нам нужно вызвать этот объектsample()метод получения матрицы. Одним из наиболее важных моментов является то, что хотя мы получили МАСКУ 0-1, нам нужно расширить все единицы в этой МАСКЕ.1/pF1/p_Fраз, чтобы сохранить ожидаемое значение градиента

Другие градиенты исчезли, а живой градиент должен быть размножен с помощью сильного желания других!

Child_Tuning_D

Учитывая существование различных последующих задач, автор предлагает алгоритм Child_Tuning_D для конкретной задачи, который может определять наиболее важные подсети (или параметры) для целевой задачи. В частности, авторы используютИнформационная оценка Фишерачтобы найти параметры, которые очень важны для конкретной последующей задачи. Формально информационная матрица Фишера (FIM) параметра модели w\mathbf{w}w определяется следующим образом:

image.png

в,x,yx,yявляются входом и выходом, соответственно, из которых мы можем получить первоеiiИнформация Фишера для каждого параметра выглядит следующим образом:

image.png

в,D|D|- количество всех выборок. Автор считает, что чем важнее параметры для целевой задачи, тем больше информация Фишера.Поэтому дочерняя настройка состоит из тех параметров с самой высокой информацией Фишера.В настоящее время доля дочерней сети составляет

image.png

вCˉ| \bar{\mathcal{C}}|представляет собой не подсеть, когдаpD=1p_D=1В то время Child Tuning выродился в Fine Tuning. На самом деле вычисление информации Фишера довольно трудоемко.Если мы вычисляем информацию Фишера всех параметров после каждого обратного распространения, а затем находим самые большие первые несколько, это очень хлопотно, поэтому автор предлагаетПрежде чем приступить к обучению, мы сначала выполняем полное (одну эпоху) прямое распространение и обратное распространение для всех образцов.В это время рассчитываются параметры с самой высокой информацией Фишера, и определенная в это время дочерняя сеть не изменится в будущее. , то, что будет выбрано на этот раз, будет иметь преимущественную силу.

Код для расчета информации Фишера приведен ниже.

def calculate_fisher():
    gradient_mask, p_F = {}, 0.2
    train_loader = torch.utils.data.DataLoader(train_dataset, batch_size, shuffle=True)
    N = len(train_dataloader) # N = |D|
    for name, params in model.named_parameters():
        if 'layer' in name:
            gradient_mask[params] = params.new_zeros(params.size())
    for batch in train_loader:
        outpus = model(**batch)
        loss = outpus['loss'] if isinstance(outpus, dict) else outputs[0]
        loss.backward()

        for name, params in model.named_parameters():
            if 'layer' in name:
                torch.nn.utils.clip_grad_norm(params, 1)
                gradient_mask[params] += (params.grad ** 2) / N
        model.zero_grad()
    
    r = None
    for k, v in gradient_mask.items():
        v = v.view(-1).cpu().numpy() # flatten
        if r is None:
            r = v
        else:
            r = np.append(r, v)
    
    # polar = np.percentile(a, q) # a中有q%的元素小于polar
    polar = np.percentile(r, (1-p_F)*100)
    for k in gradient_mask:
        gradient_mask[k] = gradient_mask[k] >= polar
    print('Polar => {}'.format(polar))

    return gradient_mask

PROOF

Если в этой статье говорится об этих вещах, есть большая вероятность, что вы не сможете выиграть EMNLP.Я лично думаю, что это связано с большим количеством доказательств в этой статье.Автор доказывает, что использование Child Tuning может помогите модели избежать локальных экстремумов Небольшое значение, затем я попытаюсь уточнить часть доказательства статьи

Сначала мы предполагаемg(i)\mathbf{g}^{(i)}заданный образецx(i)\mathbf{x}^{(i)}параметр времениw\mathbf{w}градиент , и он следует нормальному распределениюg(i)N(Lw,оg2Ik),определениеg^{(i)}∼N(\frac{∂L}{∂w},σ_g^2I_k), определение
gg=i=1B\sum\limits_{i=1}^{|\mathcal{B}|} g(i)B\frac{\mathbf{g}^{(i)}}{|\mathcal{B}|}, то есть

image.png

заg\mathbf{g},У нас есть

image.png

Предполагатьg^=gpM\hat{\mathbf{g}} = \frac{\mathbf{g}}{p}\odot MppдаpDp_DилиpFp_F(в зависимости от того, какой алгоритм вы используете), то

image.png

Вывод приведенной выше формулы не является строгим, например, молекулярнаяppНевозможно объяснить, откуда он взялся, молекулярныйppтолько возможноE[M]\mathbb{E}[M]результат, ноMMЭто матрица, как ожидание матрицы может стать числом? Но принуждать к объяснению нормально, потому чтоMMсложите все единицы и разделите наMMВсе элементы внутри также кажутся равнымиppиз

Предполагатьgi^,gi\hat{g_i}, g_iсоответственноg^,g\hat{\mathbf{g}}, \mathbf{g}первоеiiзначение в измерении, то естьgi^=gipMi\hat{g_i} = \frac{g_i}{p}\odot M_i

image.png

следовательно

image.png

В итоге мы получаем

image.png

В частности, когда параметрw\mathbf{w}При тренировке до точки локального минимума,Lw=0\ гидроразрыва {∂L}{∂w}=0,В настоящее времяE[Δw]=0,Σ[Δw]=н2оg2IkpBE[Δw]=0,\Sigma[\Delta\mathbf{w}] = \frac{\eta^{2} \sigma_{\mathbf{g}}^{2} \mathbf{I}_{k} }{p|\mathcal{B}|}, мы заметилиΣ[Δw]\Sigma[\Delta \mathbf{w}]это оppубывающая функция ,ppчем большеΣ[Δw]\Sigma[\Delta \mathbf{w}]меньше, крайний случайp=1p=1, в это время Детская настройка вырождается в Точную настройку, иΣ[Δw]\Sigma[\Delta \mathbf{w}]Минимальное значение эквивалентно тому, что сумма его изменения каждый раз невелика, поэтому выпрыгнуть из точки локального минимума сложно;ppчем меньшеΣ[Δw]\Sigma[\Delta \mathbf{w}]Чем больше значение, тем больше количество изменений каждый раз, поэтому легче выпрыгнуть из точки локального минимума.

Персональное резюме

Когда я впервые прочитал эту статью, я подумал, что она очень мощная, но на самом деле, после того, как я понял ее, я почувствовал, что на самом деле это версия Dropout с обратным распространением, Фактическое новшество не было особенно большим, и упомянутая в нем информация Фишера не было этой бумаги. Тогда в статье действительно много экспериментов.Результаты экспериментов показывают, что по сравнению с Fine Tuning его можно улучшить примерно на 1,5–8,6 балла. Наконец, я хочу поговорить о части этой статьи, посвященной доказательству формулы.Я лично думаю, что доказательство этой статьи не очень строгое, например, почему математическое ожидание становится числом. В общем, этот способ можно использовать как Уловку при игре в игры.