* самооценка употребления наркотиков

Авторы: Гаррет Кауфманн и Виктор Келемен

Введение

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

Но откуда мы можем взять данные для использования? С 1950-х годов исследователи собирают отчеты о поездках на горстку веществ, включая, помимо прочего, ЛСД, МДМА, псилоцибин и каннабис. Таких опытов немного, и они редко оцифровываются. Нам не удалось найти сжатый набор данных, в котором были бы организованы эти опыты для облегчения доступа специалистов по данным. Хотя это разочаровало, мы нашли один источник, который выглядел многообещающим.

Данные: Erowid

База данных Erowid содержит информацию почти обо всех химических веществах, которые когда-либо проглатывал человек. На этом веб-сайте (www.erowid.org) имеется множество информации, которая постоянно обновляется с 1985 г. по сегодняшний день. Мы были рады обнаружить, что для каждого препарата, указанного в базе данных, есть страница, на которой люди могут анонимно самостоятельно сообщить о своем опыте употребления наркотиков. Затем мы решили, что нашим первым шагом будет создание скребка, который мог бы использовать название лекарства в качестве входных данных и выдавать нам текст от каждого пользователя, который в свою очередь не смешивал вещества. Затем мы организовали наши данные в каталоги для некоторых классических психоактивных веществ: Каннабис, Псилоцибин (грибы), МДМА и ЛСД.

Поездка моделей: создание текста

Нашим следующим шагом было создание модели текстового генератора для каждого из препаратов, которые мы хотели изучить. Для этого мы обучили один слой, 128 узлов LSTM с кодировкой горячих символов для 50 эпох для каждой модели. Наши обучающие наборы содержали 4000–20000 символов каждый. Мы решили, что начнем с относительно простой модели, учитывая, что обучение каждой из четырех моделей, которые мы использовали, занимало более двух часов. Мы были вознаграждены средней потерей 1,2 и точностью ~ 60%. Несмотря на то, что нашим моделям не требовалось много форматирования текста, каждая нейронная сеть создавала словарный запас, уникальный для опыта употребления наркотиков Erowid. Вывод текста был столь же проницательным, сколь и веселым (см. Ниже). Теперь, когда у нас был выходной текст, нам нужно было решить, что делать с нашими новыми данными. Хотя данные, возможно, не были грамматически эстетичными, мы думали, что модель классификатора может количественно оценить производительность генерации текста. Если бы классификатор мог точно сгруппировать тексты в соответствии с лекарством, которое они описывают, то язык, изучаемый нашими текстовыми моделями, был бы уникальным для этого лекарства и, таким образом, предполагал, что наши модели усвоили обобщенные функции.

model = Sequential()
model.add(LSTM(128, input_shape=(seqlen, len(chars)),      
    return_sequences=True))
model.add(Dense(len(chars), activation='softmax'))
#################################################################
#step from training
----- Generating text after Epoch: 25
----- diversity: 0.5
----- Generating with seed: "ad in a long time. This feeling lasted f"
ad in a long time. This feeling lasted for the fact that I was all the people was a strong started to see the morning I was taken so continued and we started to get up and some of the concept and constant I was about to see the trees and the woods of the trip, that was a small or so fully and the similar mind perhaps that was so straight that seemed to a parents was still so decided to do the shrooms that was only a small briefly seeing
Epoch 27/50
62585/62585 [==============================] - 97s 2ms/step - loss: 1.2711 - categorical_crossentropy: 1.2711 - accuracy: 0.6151

Характеристики генеративной модели

Вот статистика производительности наших четырех моделей после 50 эпох.

Грибы

Потеря: 1,2581 , категориальная кросс-энтропия: 1,2581 , точность: 61,84%

МДМА

Потеря: 1,2435, Категориальная кросс-энтропия: 1,2435 , точность: 62,55%

ЛСД

Потеря: 1,2760, Категориальная кросс-энтропия: 1,2760 , точность: 61,33%

Каннабис

Потеря: 1,2318, Категориальная кросс-энтропия: 1,2318 , точность: 62,78%

Классификация НЛП с помощью BERT

Учитывая сложность НЛП, которая требуется для такого типа классификации текста, мы были рады использовать модель обучения с переносом BERT. Мы хотели воспользоваться преимуществом того, насколько хорошо BERT может токенизировать текстовые данные по контексту. Эта модель была разработана исследователями Google и показала невероятные результаты в таких задачах, как «прогнозирование следующего предложения» и «вопросы и ответы». Мы думали, что использование такой мощной модели для классификации данных о нашем опыте употребления наркотиков может дать некоторые интересные результаты. Мы ожидали, что обученная модель будет достаточно хорошо предсказывать, для какого препарата был написан исходный опыт, но плохо справлялась с созданными LSTM учетными записями лекарств.

Мы использовали эту статью о мультиклассовой классификации текста с помощью BERT в качестве руководства. Перед загрузкой предварительно обученной модели нам пришлось отформатировать данные, чтобы сделать их более удобными для BERT. Для этого мы использовали библиотеку pandas. Все учетные записи были прочитаны и записаны в .tsv построчно. train.tsv должен иметь 4 столбца: индекс, класс, разное и строка. Для тестирования tsv нужны только столбцы 1 и 4. Мы записали 80% данных в файл train.tsv, а оставшиеся 20% были поровну разделены на test.tsv и dev.tsv для проверки. Теперь мы были готовы внедрить BERT.

BERT Устранение неполадок

Мы остановились на базовой версии в корпусе с «всего» 110 миллионами параметров. После клонирования репозитория и скачивания модели начались наши неприятности. Следующие два дня мы потратили на то, чтобы подробно ознакомиться с файлами в репозитории BERT, чтобы исправить наши ошибки (к сожалению, не было сделано скриншотов сообщений об ошибках). Одна из проблем, с которой мы столкнулись, заключалась в ошибке отсутствия такого файла или каталога в файле bert_config. Интересно, что все используемые файлы находились в одном каталоге, и скрипт мог получить доступ к другим, прежде чем выдать ошибку, поэтому мы были весьма сбиты с толку. В конце концов ошибка была устранена путем присвоения BERT_BASE_DIR относительного пути вместо абсолютного. Другая ошибка, которая выскочила, жаловалась на количество классов, которые были у наших данных. Проблема заключалась в том, что BERT был настроен только для 2 классов, а в наших данных было 4. Чтобы исправить это, мы изменили метод get_labels () в run_classifier.py включить 2 дополнительных занятия. Еще одна загадочная ошибка заключалась в том, что не удалось найти Tensorflow. Оказалось, что BERT требует Tensorflow 1.15 и не будет работать с 2.0 *. К сожалению, вопросы, касающиеся ошибок BERT, и особенно их решения, редко встречаются в Интернете, поэтому их гораздо труднее преодолеть.

def get_labels(self):
"""See base class."""
    return ["0", "1", "2", "3"]. <-- one digit for each class
  • выше: метод, содержащий классы BERT. Возвращаемое значение по умолчанию - «[‘ 0 ’,‘ 1 ’]» для двоичной классификации.

Обучение BERT

Наконец, BERT приступил к обучению. По пути он не предоставил много информации, только global_step / sec и example / sec. Это дало нам представление о скорости, с которой проходило обучение, но не показало прогресса. С помощью грубых расчетов мы оценили время обучения в 5 часов, что было много, но вполне приемлемо. BERT закончил тренировку в течение 20 часов, что было неожиданно. Еще более неожиданным было то, насколько плохо он был оценен на наших тестовых данных. Убыток был выше 5,0 с точностью ~ 10%. В этот момент мы были разочарованы и разочарованы. Могли ли мы сделать что-то не так до начала обучения или наши данные были настолько «неклассифицируемыми»? Даже если бы последнее было правдой, мы должны были бы получить точность около 50%. Мы подозревали, что с BERT что-то пошло не так.

#eval_results.txt
eval_accuracy = 0.14463277
eval_loss = 5.6167216
global_step = 1994  #number of batches
loss = 5.61461

Примерка перчаток, буквально…

После неудачи с BERT нам нужно было определиться с нашими дальнейшими шагами. Один из вариантов заключался в том, чтобы диагностировать, что пошло не так, и повторно обучить последний слой модели. Мы быстро отказались от этого варианта, поскольку 20-часовое обучение на нашей машине (Macbook 8 ГБ ОЗУ) сделало его невозможным в рамках данного проекта. Вместо этого мы решили использовать (гораздо) менее мощную модель классификации: одномерную сверточную сеть. Мы бы добавили к этой модели слой внедрения, предварительно обученный на 100-мерном внедрении перчатки. Это позволяет нашему классификатору идентифицировать каждое слово по позиции в 100-мерном пространстве встраивания. Слова с более высокой степенью контекстного сходства присваиваются близко друг к другу в пространстве вложения. Например, король и королева будут иметь меньшие расстояния между собой, чем скут и яблоко. Опять же, смысл использования контекстно-зависимого внедрения коренится в надеждах на получение более совершенной схемы классификации. Данные, на которых мы обучили эту модель, были разделены на несколько файлов, каждая по две строки. Это было сделано для увеличения количества образцов, которые мы могли классифицировать, что, как мы надеемся, улучшило результаты.

sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
x = Conv1D(128, 5, activation='relu')(embedded_sequences)
x = MaxPooling1D(5)(x)
x = Conv1D(128, 5, activation='relu')(x)
x = MaxPooling1D(5)(x)
x = Conv1D(128, 5, activation='relu')(x)
x = GlobalMaxPooling1D()(x)
x = Dense(128, activation='relu')(x)
preds = Dense(len(labels_index), activation='softmax')(x)
model = Model(sequence_input, preds)
model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])

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

Epoch 10/10
11856/11856 [==============================] - 476s 40ms/sample - loss: 0.4500 - acc: 0.8249 - val_loss: 1.4107 - val_acc: 0.5386

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

Тем не менее, мы применили наш обученный классификатор к тексту, сгенерированному нашими моделями, чтобы получить более впечатляющие результаты: точность классификации 25%.

Несмотря на далеко не впечатляющие результаты по классификации, мы считаем этот проект успешным. Данные, которые мы нашли на Erowid, отлично подходят для простого анализа, однако стиль отчетов был непоследовательным. Некоторые учетные записи гораздо более информативны, чем другие, они часто содержат опечатки (в конце концов, это собственные отчеты о наркотическом опыте), и в обсуждаемых темах есть несоответствия. Тем не менее, наши простые текстовые генераторы создавали тексты с приличным пониманием тона и лексики, предполагая, что каждая модель усваивала полу-отличные черты письменных отчетов для конкретной субстанции. После уточнения этих результатов мы можем применить наш классификатор к улучшенному сгенерированному тексту, уникальному для каждого вещества. Это покажет, что существуют заметные различия в языке, используемом в самоотчетах. Если вы доверяете нашим методам, есть возможность применить эти методы анализа к более крупным и согласованным наборам данных отчетов о наркотиках. Создавая текст, основанный на обобщении описаний наркотиков, мы надеемся укрепить наше понимание феноменологии этих загадочных и могущественных веществ. Если мы сможем нарисовать ясную картину на языке малой размерности того, как наркотик вызывает у человека чувства, тогда мы сможем лучше сообщить об этих эффектах для более безопасного использования и большего понимания общественностью психоактивных веществ и расширенных состояний, которые они вызывают.

Теперь, пожалуйста, насладитесь этими отрывками стихов, написанных нашими текстовыми генераторами:

«Я повел его посмотреть тропы, и следующий, казалось, имел особую концепцию восприятия и кровать к звуку, собирался попробовать это для предотвращения, и я начал разбираться во всех ситуациях и начал получать петлю наверху разговора и еще до того, как все тяжело дышит живой дорогой и дано мне, и мы больше повторяли то же самое время, что и остальная часть первого… »-LSD

«Я потратил несколько минут и подумал о своих друзьях, и я сказал, что мое тело и полностью почти кровать.» -Гриб

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

«Есть пара самых светлых, которые, казалось, держали меня, мы могли видеть, что я начинал спать и был близок к тому, чтобы волноваться, и это было маленькой реальностью, и просто сказали:« Я не мог сказать, что мы были все чувства »- Грибы

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

«Я не смог сделать это с моей головой, и она хотела пойти в самый любимый, и я взял меня, чтобы пойти на все время» -MDMA

«У меня был друг, который вошел мне в рот, и когда я почувствовал себя очень туманным и исчез в МДМА, я получил удовольствие от мысли о деснах, и мне пришлось погрузиться в ощущение музыки, и это почти что происходило, и я был серфинг моих друзей и идеал был больше похож на пилюлю для парня для довольного товарища, и музыка была в целом для музыки, чем для некоторых людей, у которых был кайф, они были хорошим временем для большей уверенности в нескольких вечеринках и весь доу. ”-MDMA

«Это был мир, я ванная комната, которую я думал, что они были невероятно рядом с моим прошлым контролем, одним из ее спины и чувствовал, что солнце будет одним из них, а затем я начал думать, что ванная и там кстати шли на концерт. ”-LSD

«Я взял это за руку, за которую я был с друзьями, это было неожиданное чувство, и я хочу поговорить об этом с сюрпризом, я почувствовал себя расширенным в этот момент…» -MDMA

* в редакции от 16/12/19 доступна реализация BERT, построенная с помощью tensorflow 2.0.

Этот проект был выполнен для нашего курса по искусственным нейронным сетям и глубокому обучению. Наш код можно найти на GitHub здесь.