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

Определение цели

Интерпретация входных градиентов, представленная в сообщении Deep NLP Explanations, утверждает, что в важности функции есть два компонента: для каждого слова есть величина (насколько «важно» это слово), а также направление в отношении оптимизации. цель. В цели анализа настроений положительные и отрицательные направления важности характеристик коррелируют с положительными и отрицательными оценками обзора.

Например, учитывая этот обзор фильма:

Sentiment: 0.10220414400100708+
This is a ridiculous movie and you should never see it

мы получаем следующие объяснения функций:

This (0.202) is (0.569) a (0.262) ridiculous (-3.093) movie (-0.136) and (0.720) you (0.426) should (0.427) never (0.156) see (0.156) it (0.156) . (0.156)

Из этого объяснения мы видим, что слово «смешно» имеет наибольшее значение, а также отрицательно влияет на настроение.

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

Предположим, мы хотим превратить приведенный выше обзор из отрицательного в положительный. Конечно, мы знаем, что нам нужно заменить слово «смешной» на более позитивное. Мы знаем это, потому что, зная английский, мы понимаем, что «смешно» - прилагательное с отрицательной коннотацией. Какое слово мы должны выбрать, чтобы заменить его? Мы, безусловно, выбрали бы положительное прилагательное, чтобы сохранить общий синтаксис фразы последовательным.

Можем ли мы создать процедуру для этого автоматически на основе интерпретации информации о градиенте? Оказывается, можем.

Входной градиент как преобразование

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

Что бы это значило, если бы мы применили градиентный спуск к входным данным? Шаг оптимизации градиента SGD требует, чтобы мы обновили параметры следующим образом:

param = param - lr * grad

Где lr - константа скорости обучения, а grad - информация о градиенте, вычисленная при обратном проходе.

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

Визуализация предоставлена: проектором .tensorflow.org

На приведенном выше рисунке показана двухмерная проекция некоторых векторов слов в непосредственной близости от слова «смешно». Исходное пространство имеет 300 измерений, поэтому эта проекция является приблизительной. Синяя стрелка показывает направление, указанное входным градиентом для слова «смешно». Ясно, что в этом случае следование направлению градиента приблизит этот вектор слова к представлению более положительных прилагательных.

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

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

given: phrase to improve (f)
       neural network that classifies f (m)
       desired classification target (t)
returns: a new phrase (f') constructed by replacing a single
         word from f so that f' is closer to the target than f
         
1. let grads =  gradients for each word in f with regard to target t
2. let w = the word in f that has the largest importance magnitude in the negative direction
3. let wvec= word vector representation of w
4. let wgrad = gradient of word w with regard to target t
3. Repeat:
   3.1 let new_vec= wvec - wgrad
   3.2 let new_word = nearest neighbor of new_vec in the vector space
   3.3 if new_word is different from w:
       3.4 exit repeat
4. let f' = f with the replacement of w by new_word
5. return f'

Этот алгоритм реализован в моей оригинальной совместной записной книжке, в функции predict_and_make_it_better

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

Вы можете поиграть с этим алгоритмом, запустив записную книжку. Ниже приведены некоторые демонстрации этого алгоритма в действии:

Маленькая фраза, от нейтрального к положительному

Маленькая фраза, от нейтрального к отрицательному

Полный обзор фильма, положительный или отрицательный

Полный обзор фильма, от отрицательного к положительному

Будущие направления

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

Однако, если вы внимательно посмотрите на сгенерированные предложения, вы заметите, что они не всегда синтаксически или семантически правильны. Это естественно, поскольку реализованная здесь эвристика не принимает во внимание такие лингвистические ограничения.

Можно ли было бы объединить эту технику с языковой моделью (возможно, даже с мощной моделью gpt-2), чтобы генерировать действительные предложения, которые по-прежнему представляют преобразование в желаемом направлении? Возможно, это будет тема одного из моих будущих постов :).

Написано 16 мая 2019 г.