Дочерняя настройка: отсев для обратного распространения

искусственный интеллект алгоритм

Это 9-й день моего участия в ноябрьском испытании обновлений, подробности о событии:Вызов последнего обновления 2021 г.

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

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

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

Δw0=ηLw0(1)\Delta w_0 = -\eta \frac{\partial \mathcal{L}}{\partial \mathbf{w}_0}\tag{1}

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

Δw0=ηLw0M(2)\Delta w_0 = -\eta \frac{\partial \mathcal{L}}{\partial \mathbf{w}_0} \odot M\tag{2}

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

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

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

How to find Child Network?

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

Child_Tuning_F

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

wt+1=wtηL(wt)wtMtMtBernoulli(pF)(3)\begin{aligned} \mathbf{w}_{t+1}&=\mathbf{w}_{t}-\eta \frac{\partial \mathcal{L}\left(\mathbf{w}_{t}\right)}{\partial \mathbf{w}_{t}} \odot M_{t}\\ M_{t} &\sim \text{Bernoulli}(p_F) \end{aligned}\tag{3}

вpFе[0,1]p_F\in [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 для конкретной задачи, который может определять наиболее важные подсети (или параметры) для целевой задачи. В частности, авторы используютИнформационная оценка Фишерачтобы найти параметры, которые очень важны для конкретной последующей задачи. Формально параметры моделиw\mathbf{w}Информационная матрица Фишера (FIM) определяется следующим образом:

F(w)=E[(logp(yx;w)w)(logp(yx;w)w)](4)\mathbf{F}(\mathbf{w})=\mathbb{E}\left[\left(\frac{\partial \log p(y \mid \mathbf{x} ; \mathbf{w})}{\partial \mathbf{w}}\right)\left(\frac{\partial \log p(y \mid \mathbf{x} ; \mathbf{w})}{\partial \mathbf{w}}\right)^{\top}\right]\tag{4}

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

F(i)(w)=1Dj=1D(logp(yjxj;w)w(i))2(5)\mathbf{F}^{(i)}(\mathbf{w})=\frac{1}{|D|} \sum_{j=1}^{|D|}\left(\frac{\partial \log p\left(y_{j} \mid \mathbf{x}_{j} ; \mathbf{w}\right)}{\partial \mathbf{w}^{(i)}}\right)^{2}\tag{5}

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

pD=CC+Cˉе(0,1](6)p_D = \frac{\mathcal{\mid C\mid}}{\mid \mathcal{C} \mid + \mid \bar{\mathcal{C}}\mid} \in (0,1]\tag{6}

в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)\mathbf{g}^{(i)}\sim N(\frac{\partial \mathcal{L}}{\partial \mathbf{w}}, \sigma^2_\mathbf{g}\mathbf{I}_k),определениеg=i=1Bg(i)B\mathbf{g}=\sum\limits_{i=1}^{|\mathcal{B}|}\frac{\mathbf{g}^{(i)}}{|\mathcal{B}|}, то есть

Δw=ηi=1Bg(i)BM=ηgM(7)\Delta \mathbf{w} =-\eta \sum\limits_{i=1}^{|\mathcal{B}|}\frac{\mathbf{g}^{(i)}}{|\mathcal{B}|}\odot M = -\eta \mathbf{g}\odot M\tag{7}

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

E[g]=Lw,Σ[g]=оg2IkB(8)\mathbb{E}[\mathbf{g}]=\frac{\partial \mathcal{L}}{\partial \mathbf{w}}, \Sigma[\mathbf{g}]=\frac{\sigma^2_{\mathbf{g}}\mathbf{I}_k}{|\mathcal{B}|}\tag{8}

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

E[g^]=E[1pgM]=1pE[gM]=ppE[g]=Lw(9)\begin{aligned} \mathbb{E}[\hat{\mathbf{g}}] &= \mathbb{E}[\frac{1}{p}{\mathbf{g}}\odot M]\\ &= \frac{1}{p}\mathbb{E}[\mathbf{g}\odot M]\\ &=\frac{p}{p}\mathbb{E}[\mathbf{g}]\\ &= \frac{\partial \mathcal{L}}{\partial \mathbf{w}} \end{aligned}\tag{9}

Вывод приведенной выше формулы не является строгим, например, молекулярная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

D[gi^]=E[gi^2](E[gi^])2=pE[(gip)2](E[gi^])2=E[gi2]p(E[gi^])2=(E[gi])2+D[gi]p(E[gi^])2=(E[gi])2+D[gi]p(E[gipMi])2=(E[gi])2+D[gi]p(E[gi])2=D[gi]p+(1p)(E[gi^])2p(10)\begin{aligned} \mathbf{D}[\hat{g_i}] &= \mathbb{E}[\hat{g_i}^2] - (\mathbb{E}[\hat{g_i}])^2\\ &=p\mathbb{E}[(\frac{g_i}{p})^2] - (\mathbb{E}[\hat{g_i}])^2\\ &=\frac{\mathbb{E}[g_i^2]}{p} - (\mathbb{E}[\hat{g_i}])^2\\ &=\frac{(\mathbb{E}[g_i])^2 + \mathbf{D}[g_i]}{p} - (\mathbb{E}[\hat{g_i}])^2\\ &=\frac{(\mathbb{E}[g_i])^2 + \mathbf{D}[g_i]}{p} - (\mathbb{E}[\frac{g_i}{p}\odot M_i])^2\\ &=\frac{(\mathbb{E}[g_i])^2 + \mathbf{D}[g_i]}{p} - (\mathbb{E}[{g_i}])^2\\ &=\frac{\mathbf{D}[g_i]}{p} + \frac{(1-p)(\mathbb{E}[\hat{g_i}])^2}{p} \end{aligned}\tag{10}

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

Σ[g^]=Σ[g]p+(1p)diag{E[g]}2p=оg2IkpB+(1p)diag{E[g]}2p(11)\begin{aligned} \Sigma[\hat{\mathbf{g}}] &= \frac{\Sigma[\mathbf{g}]}{p} + \frac{(1-p)\text{diag}\{\mathbb{E}[\mathbf{g}]\}^2}{p}\\ &=\frac{\sigma^2_{\mathbf{g}}\mathbf{I}_k}{p|\mathcal{B}|} + \frac{(1-p)\text{diag}\{\mathbb{E}[\mathbf{g}]\}^2}{p} \end{aligned}\tag{11}

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

E[Δw]=ηLwΣ[Δw]=η2оg2IkpB+(1p)η2diag{Lw}2p(12)\begin{aligned} \mathbb{E}[\boldsymbol{\Delta} \mathbf{w}] &=-\eta \frac{\partial \mathcal{L}}{\partial \mathbf{w}} \\ \Sigma[\boldsymbol{\Delta} \mathbf{w}] &=\frac{\eta^{2} \sigma_{\mathbf{g}}^{2} \mathbf{I}_{k}}{p|\mathcal{B}|}+\frac{(1-p) \eta^{2} \operatorname{diag}\left\{\frac{\partial \mathcal{L}}{\partial \mathbf{w}}\right\}^{2}}{p} \end{aligned}\tag{12}

В частности, когда параметрw\mathbf{w}При тренировке до точки локального минимума,Lw=0\frac{\partial{\mathcal{L}}}{\partial \mathbf{w}}=0,В настоящее времяE[Δw]=0,Σ[Δw]=η2оg2IkpB\mathbb{E}[\Delta \mathbf{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 балла. Наконец, я хочу поговорить о части этой статьи, посвященной доказательству формулы.Я лично думаю, что доказательство этой статьи не очень строгое, например, почему математическое ожидание становится числом. В общем, этот способ можно использовать как Уловку при игре в игры.