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

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

Цели

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

Векторные слова

Поиск похожих слов, словесных аналогий, средних значений между двумя разными типами слов и т. Д.

Генеративный текст

Генерация слов в стиле обученного набора слов, таких как Гарри Поттер Дж. К. Роулинг. Обучение модели на собственном корпусе слов.

Текущее состояние машинного обучения в языке

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

РНС

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

Чем он отличается от других нейронных сетей?

В отличие от нейронных сетей прямого распространения, RNN могут использовать свое внутреннее состояние (память) для обработки последовательностей входных данных.

WORD2VEC

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

Основная предпосылка:

Слова, встречающиеся в одном и том же контексте / близости, имеют семантическое значение.

«быстрая коричневая лисица перепрыгнула через ленивого пса»

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

([the, brown], quick), ([quick, fox], brown), ([brown, jumped], fox), ...

Затем мы оптимизируем все с помощью чего-то вроде стохастического градиентного спуска (SGD) или T-SNE.

SGD

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

T-SNE

Метод сокращения набора данных с множеством измерений до двух измерений.

История

Разработан Google и используется в Нейролингвистическом программировании (НЛП).

Общие проблемы

Одна из опасностей векторизации слов - чрезмерное упрощение множества контекстов, которые слова могут иметь в зависимости от их контекста. Это хитрое искусство!

Что нам доступно в ML5?

В ML5 мы можем выполнять следующие операции:

  • Добавить или вычесть
  • В среднем
  • Ближайший
  • Получить случайное слово

Пример Word2Vec

HTML Файл: 06-word2vec.html

Javascript Файл: assets / js / 06-word2vec.js

Глядя на HTML, у нас есть 3 различных реализации word2vec.

Первый берет слово от пользователя и пытается найти свое место среди похожих слов от обученной модели, отображая 10 лучших результатов.

Второй пытается найти среднее значение между двумя словами.

Последний пытается провести аналогию. Вы указываете одну конкретную аналогию и даете другое слово, из которого ml5 должна завершить свою аналогию.

Глядя на javascript:

noLoop();

noCanvas();

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

// Create the Word2Vec model with pre-trained file of 10,000 words

word2Vec = ml5.word2vec('/assets/data/wordvecs10000.json', modelLoaded);

ML5 поставляется с предварительно обученной моделью встраивания 10 000 слов. Мы укажем здесь, что word2vec должно использовать эти вложения при оценке слов, введенных пользователем. Когда он загрузит этот файл (расположенный в assets / data / wordvecs10000.json), он вызовет функцию modelLoaded.

// Select all the DOM elements

let nearWordInput = select('#nearword');

let nearButton = select('#submit');

let nearResults = select('#results');

let betweenWordInput1 = select("#between1");

let betweenWordInput2 = select("#between2");

let betweenButton = select("#submit2");

let betweenResults = select("#results2");

let addInput1 = select("#isto1");

let addInput2 = select("#isto2");

let addInput3 = select("#isto3");

let addButton = select("#submit3");

let addResults = select("#results3");

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

// Finding the nearest words

nearButton.mousePressed(() => {

let word = nearWordInput.value();

word2Vec.nearest(word, (err, result) => {

let output = '';

if (result) {

for (let i = 0; i < result.length; i++) {

output += result[i].word + '<br/>';

}

} else {

output = 'No word vector found';

}

nearResults.html(output);

});

});

Выше показан первый пример - поиск слов, наиболее похожих на слово, введенное пользователем. Мы берем это слово (nearWordInput.value ()) и вызываем функцию near () word2vec, а затем передаем результат на html-страницу.

betweenButton.mousePressed(() => {

let word1 = betweenWordInput1.value();

let word2 = betweenWordInput2.value();

word2Vec.average([word1, word2], 4, (err, average) => {

betweenResults.html(average[0].word);

})

});

Это второе значение - нахождение среднего между двумя словами: word2Vec.average ([word1, word2], 4, (err, average) = ›{…}) . Если мы посмотрим на документацию, то увидим, что word2vec принимает несколько параметров:

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

average[0].word

Здесь мы берем первый из 4 результатов, возвращенных word2vec, и отображаем его на нашей странице.

// Adding two words together to "solve" an analogy

addButton.mousePressed(() => {

let is1 = addInput1.value();

let to1 = addInput2.value();

let is2 = addInput3.value();

word2Vec.subtract([to1, is1])

.then(difference => word2Vec.add([is2, difference[0].word]))

.then(result => addResults.html(result[0].word))

});

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

LSTM

LSTM расшифровывается как Long Short Term Memory. Архитектура нейронной сети, основанная на RNN, полезна для работы с последовательными данными, когда порядок последовательности имеет значение.

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

Google использовал LSTM в своих алгоритмах распознавания речи, начиная с 2015 года, и показал скачок точности на 49%.

Как это работает

Горизонтальная линия вверху диаграммы - это состояние ячейки. Это похоже на ленту конвейера - она ​​способна перемещать информацию в неизменном виде через каждый уровень нейронной сети.

Вертикальные стрелки - ворота. Они позволяют передавать информацию на конвейерную ленту. Их выход находится в диапазоне от 0 до 1, где 0 означает, что информация не проходит, а 1 означает, что пропускается все! Есть 3 таких шлюза для 4 основных операций оценки LSTM:

  • Решите, что выбросить
  • Решите, что обновить
  • Решите, какую новую информацию разрешить
  • Решите, что выводить

LSTM в ML5

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

Файл HTML: 07-lstm.html

Файл Javascript: assets / js / 07-lstm.js

В нашем HTML-коде есть выпадающий список с различными предварительно подготовленными фрагментами текста. Цель состоит в том, чтобы отобразить новый текст в стиле текста, на котором была обучена наша модель.

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

В нашем javascript:

lstm = ml5.LSTMGenerator('assets/models/jkrowling/', modelReady);

У нас будет часть Гарри Поттера в очереди в качестве основной работы по умолчанию, но если мы изменим раскрывающийся список, мы передадим этот выбор методу LSTMGenerator.

textInput = select('#textInput');

lengthSlider = select('#lenSlider');

tempSlider = select('#tempSlider');

corpus = select('#corpus');

button = select('#generate');

Мы выполняем стандартное назначение кнопок и полей HTML выше…

// DOM element events

button.mousePressed(generate);

corpus.input(updateCorpus);

lengthSlider.input(updateSliders);

tempSlider.input(updateSliders);

… И укажите, какие функции вызывать при взаимодействии с ними пользователя.

function updateCorpus(){

const corpusVal = corpus.value();

select('#status').html('Loading Model');

lstm = ml5.LSTMGenerator(`assets/models/${corpusVal}/`, modelReady);

}

Как упоминалось ранее, здесь мы назначаем новую модель нашему генератору LSTM, когда выбор делается из раскрывающегося списка.

// Update the slider values

function updateSliders() {

select('#length').html(lengthSlider.value());

select('#temperature').html(tempSlider.value());

}

Эти функции гарантируют, что всякий раз, когда мы меняем ползунок, мы фиксируем его новое значение.

function generate() {

// Update the status log

select('#status').html('Generating...');

// Grab the original text

let original = textInput.value();

// Make it to lower case

let txt = original.toLowerCase();

// Check if there's something to send

if (txt.length > 0) {

// This is what the LSTM generator needs

// Seed text, temperature, length to outputs

// TODO: What are the defaults?

let data = {

seed: txt,

temperature: tempSlider.value(),

length: lengthSlider.value()

};

// Generate text with the lstm

lstm.generate(data, gotData);

// When it's done

function gotData(err, result) {

// Update the status log

select('#status').html('Ready!');

select('#result').html(txt + result);

}

}

Вот где и делается вся работа. Когда мы отправляем наши слова и значения ползунка, мы отображаем статус и создаем объект данных со всеми нашими входными значениями: начальным числом, температурой и длиной. Затем мы передаем этот объект методу l stm.generate () ML5 и отображаем результаты.

/ Media / insert-embed / dropbox

Обучение собственной модели

Вы можете обучить свою собственную модель, установив тензорный поток, но это может быть очень сложно, особенно на Mac, и, если у вас нет видеокарты с поддержкой CUDA, это также будет очень медленным. тренировать.

Для этого класса на помощь снова приходит Paperspace. Чтобы обучить вашу модель с помощью бумажного пространства:

  • Создайте каталог на своем компьютере для проекта и откройте окно терминала. Затем введите cd и перетащите папку из окна поиска в окно терминала (или введите полный путь к папке).
  • Введите имя пользователя в пространстве документов и введите имя пользователя и пароль, которые вы установили ранее.
  • Откройте окно терминала в папке 08 / lstm-training.
  • Получите исходный материал для обучения вашей модели. Чем больше контента, тем лучше. Я использую короткую и ужасную книгу, которую написал, когда был подростком. Скопируйте весь текст, поместите его в файл (вы можете использовать TextEdit или Блокнот, если хотите, просто убедитесь, что вы сохранили его как обычный текст (формат ›сделайте обычный текст в TextEdit).
  • Видите этот каталог с именем data в каталоге, в который вы только что перешли? У него есть папка с названием zora_neale_hurston. Мы создадим рядом с ней папку и сохраним в ней наш собственный материал. Назовите свою папку как хотите, и внутри нее сохраните файл исходного текстового материала как input.txt.
  • Отредактируйте файл run.sh с помощью редактора кода и измените - data_dir =. / Data / zora_neale_hurston \ bit так, чтобы он ссылался на каталог, который вы создали для своего собственного материала (например, - data_dir =. / Data / my_dir \.
  • Теперь запустим процесс с папками. Тип: paperpace jobs create - контейнер tenorflow / tensorflow: 1.5.1-gpu-py3 - machineType P5000 - команда «bash run.sh» - проект «Обучение LSTM».
  • Терпеливо ждите… В конце концов ваша модель будет обучена. Вы можете войти в консоль пространства документов и щелкнуть имя проекта в столбце «Проект», щелкнуть журналы, чтобы просмотреть результаты, или проверить показатели, чтобы увидеть, как ваша модель улучшилась с течением времени.
  • Получите свои вещи. Из каталога моделей папки ml5js_example запустите задания в пространстве документов artifactsGet - jobId [YOUR_JOB_ID], где [YOUR_JOB_ID] можно найти в консоли пространства документов в разделе Градиент ›Задания в столбце Тип машины / ИД задания.

  • В файле sketch.js в папке с примером измените const lstm = ml5.LSTMGenerator (‘models / hemingway /’, modelReady); Линия от Хемингуэя к имени только что созданной папки.
  • Запустите сервер! С Python 2:

python -m SimpleHTTPServer 8001

или с Python 3:

python -m http.server 8001

  • Посетите http: // localhost: 8001 в своем браузере - на этот раз пример будет извлекать из вашей собственной работы, чтобы делать свои прогнозы.

Код за кодом

Если мы посмотрим на исходный код ML5 в файле LSTM ›index.js, то увидим, возможно, незнакомую терминологию. Что это значит?

Softmax - присутствует на последнем уровне нейронной сети, он сжимает или сводит векторы к единому распределению вероятностей.

Забудьте о смещении - какой объем информации от предыдущего нейрона пропускать или отбрасывать.

One-Hot Encoding - преобразование данных в формат, который может использоваться алгоритмом машинного обучения (в данном случае Tensorflow), путем преобразования категориальных меток в двоичные кодировки - true или false.

ТЕКУЩИЕ ПРИМЕРЫ ML НА ЯЗЫКЕ

Predictive Writer Keyboard от Botnik

Лучшая реализация LSTM, клавиатура Botnik's Predictive Writer обучается на корпусе текста, но позволяет вам выбирать предлагаемые слова из этого корпуса, заменять их новыми, случайно выбранными словами или заменять их собственным текстом. Вы также можете загрузить свой собственный корпус текста или объединить существующие корпуса для получения каких-то странных результатов.

Ботник анализирует корпус текста, используя алгоритм для определения общих шаблонов слов. Затем он просматривает последние три слова вашего текста, чтобы выяснить, какие новые слова следует использовать. Объединение корпусов пересчитывает частоту слов и общие шаблоны слов для обоих текстов.

Авторы, использующие ИИ для написания романов

Автор Робин Слоан использует специально обученный ИИ для подсказок текста.

ДЛЯ СЛЕДУЮЩЕГО КЛАССА

  • Обучите Ботника на корпусе текста по вашему выбору. Используйте это, чтобы написать рассказ. Пару абзацев можно.
  • Изучите несколько примеров использования машинного обучения в тексте / языке. Мы поделимся тем, что нашли в классе. Будьте готовы с одним примером проекта, который вы могли бы реализовать с использованием машинного обучения в тексте / речи.
  • Мы будем изучать новые среды программирования. Если вы планируете использовать собственный компьютер, убедитесь, что у вас установлено следующее:
  • Python 2.7+
  • PIP
  • Узел / NPM
  • Кроме того, следующие необязательны (но приветствуются)
  • Git
  • "Мужество"
  • Полифон