«Ключом к искусственному интеллекту всегда было представление». — Джефф Хокинс

В этом посте я опираюсь на идеи Эндрю Нг и Толги Болукбаси и использую их

Задний план

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

Рассмотрим чат-бота Microsoft Twitter (по имени Tay), представленного несколько лет назад. Инженеры показали Тэю множество примеров того, как выглядели разговоры в Твиттере, а затем выложили его в сеть, где он публиковал расистские замечания и предвзятые комментарии (возможно, предвосхищая нынешнее руководство США?) (1). Но виноват ли в этих высказываниях бот, которого тут же отключили инженеры Microsoft? Или, может быть, виноваты инженеры, разработавшие Tay? Конечно, создатели Tay не хотели, чтобы бот демонстрировал такое оскорбительное поведение, и Tay был просто компьютерной программой, не чем иным, как набором единиц и нулей. Я думаю, что ни один из них напрямую не виноват, а виновником были данные, с которыми обучался Тэй. Эти данные Твиттера были созданы не какой-то одной организацией или группой, а обществом в целом (где под «обществом» я подразумеваю сотни миллионов пользователей Твиттера по всему миру, приличную выборку всего населения мира).

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

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

Представления слов

Меня давно интересовала область ИИ — обработка естественного языка (NLP), которая пытается дать компьютерам возможность обрабатывать и в некотором смысле понимать язык людей. Это поле имеет приложения для анализа настроений, обнаружения спама и чат-ботов. Возможно, самым захватывающим аспектом НЛП является то, как слова и предложения представляются машинам, которые понимают только числа. Это представление — идеальное место для изучения структуры лингвистических данных, того, как мы представляем их машине и как мы можем смягчить социальные предубеждения в данных, прежде чем они окажут негативное влияние. Но прежде чем мы поймем предубеждения, мы должны обсудить процесс преобразования слов в числа.

Простой подход состоит в том, чтобы взять предложение и присвоить каждому уникальному слову в этом предложении целое число. Например, рассмотрим следующее предложение из книги доктора Сьюза Horton Hears a Who!:

«Я имел в виду то, что сказал, и сказал то, что имел в виду».

Мы могли бы сопоставить каждое слово с числом следующим образом:

“I” =1

«Имеется в виду» = 2

«Что» =3

«Сказал» =4

«И» = 5

“.” = 6

Используя эту технику, числовое представление предложения становится:

1 2 3 1 4 5 1 4 3 1 2 6

Теперь нам удалось создать представление исходного предложения, которое машина могла бы обработать. Но есть две проблемы с таким типом представления: во-первых, в английском языке сотни тысяч слов, и для каждого из них нам понадобилось бы уникальное целое число, что было бы довольно обременительно, во-вторых, и что более важно, мы потеряли всякий смысл значения слова при таком представлении. Слова «Эспрессо» и «Латте» могут быть представлены числами 42 и 105 723 соответственно. Хотя эти слова довольно близки по значению, их представления не указывают на эту связь. А такие слова, как «Трамп» и «Компетентный», могут быть представлены последовательными целыми числами 3 и 4, хотя значения этих слов никак не связаны друг с другом.

Очевидно, нам нужна лучшая система для представления слов. Обычный подход заключается в использовании векторов чисел, а не отдельных чисел. Этот метод позволяет нам снабдить репрезентации некоторым базовым понятием значения. Чтобы проиллюстрировать эту концепцию, подумайте о следующих напитках, которые вы можете найти в кофейне: «Латте», «Капучино», «Эспрессо», «Чай» и «Горячий шоколад». В каждом из этих напитков содержится разное количество кофеина и молока, и мы можем представить эти качества визуально с помощью «словарных векторов».

Теперь, вместо того, чтобы присваивать каждому слову число, мы назначаем вектор, который содержит информацию об этом слове, где каждый вектор имеет форму: [Уровень кофеина, Уровень молока], и каждый уровень представлен числом, где -10 означает низкий, а +10 высокий. Таким образом, наши представления о напитках могут быть следующими:

Латте = [8, 8]

Капучино = [8, 3]

Эспрессо = [10, -7]

Чай = [-4, -6]

Горячий шоколад = [-5, 8]

Теперь наши представления этих слов имеют какое-то значение для них. Примечательной особенностью этой системы является то, что слова, похожие по значению, похожи в представлении. Обратите внимание, как векторы для «Латте» и «Капучино» и близки друг к другу на приведенной выше диаграмме. Это приятный результат дизайна представления, так как эти напитки больше похожи друг на друга, чем, скажем, «Эспрессо» и «Горячий шоколад». Кроме того, позиции каждого представления немного говорят нам о слове, которое оно представляет: в эспрессо много кофеина, в латте много молока и так далее.

Конечно, есть еще атрибуты, которые мы можем использовать для описания слов, кроме кофеина и молока, и на самом деле существует слишком много способов описать слова, чем я могу описать! Я решил использовать только два атрибута, чтобы легко отображать, как выглядят представления. На практике могут быть сотни атрибутов, и эти атрибуты могут не иметь простого соответствия простым прилагательным, а могут представлять более сложные отношения. Этот тип представления называется «встраивание слов», и практикующие НЛП обычно используют существующее представление слов, называемое Word2Vec.

Технические детали того, как создаются представления слов Word2Vec, выходят за рамки этого поста, но вы можете узнать больше из отличного поста Шубхама Агарвала на Medium под названием Word to Vectors — Natural Language Processing (https://towardsdatascience.com/word). -в-векторы-обработка-естественного-языка-b253dd0b0817»). По сути, эти векторы формируются путем просмотра слов, которые часто встречаются в предложениях вместе. Важно знать, что Word2Vec был создан путем сканирования тысяч написанных человеком документов и выявления слов, которые часто встречаются в одном и том же контексте.

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

Математика слов

Что делает векторные представления слов интересными, так это то, что мы можем выполнять над ними математические операции. Прежде чем продолжить, мы должны рассмотреть две важные операции: косинусное сходство и векторную арифметику.

Косинусное сходство — это метрика для измерения сходства между векторами и просто косинус угла Θ между двумя векторами. Чем ближе два вектора, тем больше косинусное сходство между ними. Поскольку по мере того, как Θ становится все ближе и ближе к 0, косинус Θ приближается к 1, два одинаковых вектора имеют косинусное сходство, близкое к 1, а два сильно различающихся вектора имеют косинусное расстояние, близкое к -1. Используя наш пример кофейни из предыдущего:

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

Для склонности к кодированию вот та же формула, написанная как функция Python:

def cosine_similarity(u, v):
    return np.dot(u,v) / (np.linalg.norm(u) * np.linalg.norm(v))

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

Сходство (латте, капучино) = 0,910366

Сходство (горячий шоколад, эспрессо) = -0,920487

Сходство (эспрессо, чай) = 0,0227214

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

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

В нашей векторной диаграмме слов мы добавляем вектор, представляющий приличное количество молока, «лишнее молоко» (которое лежит строго по оси относительно уровня молока) к слову «Капучино», и в результате получается «Латте»! Другими словами, «Капучино» + «дополнительное молоко» = «Латте».

Обратите внимание, что количество кофеина в напитке не изменилось, изменилось только количество молока. Мы определили атрибут, который хотели изменить, или, в данном случае, ось Y, а остальные атрибуты оставили прежними. Мы также можем, очевидно, вычитать векторы, и, составив уравнение выше, мы увидим, что «Латте» - «дополнительное молоко» = «Латте». Эта арифметика позволяет нам «задавать» системе векторов слов вопросы: «какой напиток похож на капучино, но с дополнительным молоком?» Какой напиток больше всего похож на эспрессо, но без большого количества кофеина?» «В каком напитке больше всего молока?» В общем, мы можем задавать вопросы в форме «А относится к В так же, как С к чему?»

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

Изучение социальных предубеждений в представлениях слов

Наконец, мы можем приступить к изучению того, какие социальные предубеждения могли проявиться в наших представлениях. Как вы уже могли догадаться, мы можем получить несколько неудачных ответов на наши вопросы о векторах слов. В этом разделе мы начнем рассматривать, какие типы предубеждений возникают. Но сначала нам понадобятся некоторые данные. Если вы хотите кодировать, нам нужно настроить набор данных Word2Vec, который можно найти здесь: https://code.google.com/archive/p/word2vec/

Это довольно большой файл, поэтому убедитесь, что у вас достаточно памяти! Вот код для настройки модели:

from gensim.models import KeyedVectors
from tempfile import TemporaryFile
import numpy as np
filename = 'GoogleNews-vectors-negative300.bin'
model = KeyedVectors.load_word2vec_format(filename, binary=True)

Для начала давайте получим векторное представление из модели.

apple = model.get_vector("apple")
# Output: [-0.06445312 , -0.16015625, -0.01208496, 0.13476562, -0.22949219, 0.16210938, 0.3046875, -0.1796875, -0.12109375, 0.25390625, …

Векторы для представления слов в Word2Vec содержат 300 чисел, но для ясности я покажу только первые несколько.

Давайте получим еще несколько векторов слов из модели.

man = model.get_vector(“man”)
woman = model.get_vector(“woman”)
engineer = model.get_vector(“engineer”)
homemaker = model.get_vector(“homemaker)

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

cosine_similarity( man, engineer ) # Output: 0.1512893
cosine_similarity( woman, engineer ) # Output: 0.0943538

О, о. Это совсем не выглядит хорошо! Слово «вектор» для инженера ближе к слову «вектор» для мужчины, чем для женщины. Имейте в виду, что максимальное абсолютное косинусное сходство двух векторов равно 1,0, а наименьшее -1,0. Разница в сходстве косинусов кажется довольно большой — мы обнаружили в данных нашу первую социальную предвзятость. Почему оценки сходства такие разные? Вспомните, как был создан Word2Vec путем сканирования документов, написанных людьми. В этих документах слово «инженер» скорее ассоциировалось со словом «мужчина», чем со словом «женщина», и, таким образом, модель подхватила ту же предвзятость. Давайте попробуем другое профессиональное слово:

cosine_similarity(man, homemaker) # Output: 0.215946
cosine_similarity(woman, homemaker) # Output: 0.403262

Мы наблюдаем еще большую разницу между двумя сходствами косинусов!

Дополнительные выводы о предвзятости

Очевидно, что Word2Vec содержит поразительные гендерные предубеждения. Но как насчет других типов предубеждений? Ниже я представляю некоторые из своих выводов относительно некоторых расовых и предубеждений, присутствующих в Word2Vec, но я уверен, что есть бесчисленное множество других. Для краткости я не привел все свои выводы, но включил некоторые из наиболее ярких (в этом смысле мои выводы относительно предубеждений сами по себе предвзяты, и за это я извиняюсь), но, используя предоставленный код, читатель готов исследовать и найти много других. Большинство из этих выводов весьма серьезны, хотя есть несколько предубеждений, которые несколько забавны.

print cosine_similarity(doctor, african_american) # Output: 0.100316
print cosine_similarity(doctor, caucasian)        # Output: 0.135922

(Слово «доктор» ближе к слову «кавказец», чем к «афроамериканец»)

print cosine_similarity(africa, poverty) # Output:  0.17915
print cosine_similarity(europe, poverty) # Output: -0.01156

(Слово «Бедность» ближе к слову «Африка», чем к «Европе»)

print cosine_similarity(smart, mexican)   # Output: 0.081478
print cosine_similarity(smart, caucasian) # Output: 0.108909
print cosine_similarity(smart, chinese)   # Output: 0.166632

(Слово «Умный» ближе к словам для одних рас, чем для других)

print cosine_similarity(canadian, soccer) # Output: 0.002358
print cosine_similarity(canadian, hockey) # Output: 0.189496

(Как канадец, я могу с этим согласиться!)

print cosine_similarity(winner, kobe_bryant)  # Output:  0.114254
print cosine_similarity(winner, lebron_james) # Output: -0.038474

(Извини, Леброн)

Исправление необъективных данных

Теперь, когда мы выявили несколько погрешностей в данных, мы можем приступить к их устранению. Первый шаг — определить «ось смещения», которую мы хотим скорректировать. Вспомните пример, в котором мы исследовали векторы слов для «Инженер», «Женщина» и «Мужчина». В этом случае пол будет осью смещения, которую мы хотим учесть. Имейте в виду, что эти векторы существуют в 300-мерном пространстве, но мы можем проиллюстрировать точку в 2-х измерениях с показанной осью смещения, а остальные сгруппированы вместе на «ортогональной оси»:

Опять же, мы видим, что очень разные косинусные сходства между векторами слов. В конечном счете, именно это косинусное сходство мы хотим отрегулировать так, чтобы «Женщина» и «Мужчина» имели одинаковое отношение к «Инженеру», с единственной разницей между векторами слов в гендерной оси. После исправления мы хотим, чтобы векторы слов выглядели так:

После исправления косинусное расстояние между «Инженером» и «Женщиной» такое же, как между «Инженером» и «Мужчиной».

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

Чтобы математически определить ось смещения, нам понадобится некоторая векторная арифметика. Обратите внимание, как в исправленном примере вычитание вектора слов «Женщина» из вектора слов для «Мужчины» приводит к вектору, лежащему вдоль оси пола.

Этот вектор является важной частью расчетов, которые нам в конечном итоге понадобятся. Проблема, однако, в том, что у нас пока нет доступа к исправленным векторам. Таким образом, если мы выполнили операцию «Мужчина» — «Женщина» до того, как скорректировали векторы, мы можем получить вектор, который не лежит идеально на нужной оси.

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

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

Когда у нас есть вектор, параллельный желаемой оси смещения, мы можем использовать его для настройки векторов слов. Предположим, что векторы слов, которые мы хотим исправить, называются e_w1 и e_w2, а вектор оси смещения называетсяbias_axis. Уравнения для расчета, разработанные Bolukbasi et al., следующие:

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

В Python (извините, если код здесь выглядит сжатым):

def correct(e_w1, e_w2, bias_axis):
# Step 1: Compute the mean of e_w1 and e_w2 
mu = (e_w1 + e_w2)/2.0
# Step 2: Compute the projections of mu over the bias axis and the orthogonal axis 
mu_B = np.dot(mu , bias_axis)/np.square(np.linalg.norm(bias_axis))*bias_axis
    mu_orth = mu - mu_B
    
# Step 3: Compute e_w1B and e_w2B 
e_w1B = np.dot(e_w1 , bias_axis)/np.square(np.linalg.norm(bias_axis))*bias_axis
   
e_w2B = np.dot(e_w2 , bias_axis)/np.square(np.linalg.norm(bias_axis))*bias_axis
# Step 5: Adjust the Bias part of e_w1B and e_w2B 
corrected_e_w1B = np.sqrt(np.abs(1- np.square(np.linalg.norm(mu_orth)))) * (e_w1B - mu_B)/np.abs((e_w1 - mu_orth) - mu_B)
    
corrected_e_w2B = np.sqrt(np.abs(1- np.square(np.linalg.norm(mu_orth)))) * (e_w2B - mu_B)/np.abs((e_w2 - mu_orth) - mu_B)
# Step 6: Debias by equalizing e1 and e2 to the sum of their corrected projections
e1 = corrected_e_w1B + mu_orth
e2 = corrected_e_w2B + mu_orth
                                              

И это все! Давайте посмотрим, как это работает на практике.

gender_axis = (man - woman)
woman_corrected, man_corrected = correct(woman, man, gender_axis)
print np.abs(cosine_similarity(woman_corrected, engineer)) 
# Output: 0.0687301
print np.abs(cosine_similarity(man_corrected, engineer))
# Output: 0.0863937

Обратите внимание, что в этом случае мы должны рассматривать только абсолютное значение косинусного сходства, поскольку допустимо отражение по осям без смещения. Не слишком потрепанный! Косинусное сходство не слишком далеко друг от друга, но все же есть некоторая разница. Можем ли мы сделать лучше? Давайте попробуем трюк, который я описал выше. На этот раз давайте вычислим гендерную ось как:

gender_axis_2 = (man-woman) + (boy-girl)

Повторение нашего эксперимента с новым вектором гендерной оси (который должен быть более точным приближением истинной оси, которую мы хотим учесть) дает следующие результаты:

woman_corrected, man_corrected = correct(woman, man, gender_axis_2)
print np.abs(cosine_similarity(woman_corrected, engineer)) 
# Output: 0.0975296
print np.abs(cosine_similarity(man_corrected, engineer))
# Output: 0.0975296

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

Конец

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

То, как мы представляем данные, имеет значение.

Спасибо за чтение!

Источники

  1. https://www.bbc.com/news/technology-35902104
  2. https://www.nytimes.com/2018/02/09/technology/facial-recognition-race-artificial-intelligence.html
  3. Bolukbasi et al 2016, «Мужчина для программиста, как женщина для домохозяйки? Устранение предвзятости встраивания слов»
  4. Coursera Эндрю Нг (конечно)
  5. М.К. Эшера «Узы союза».
  6. Gensim: https://radimrehurek.com/gensim/models/word2vec.html