Статьи

Создание простой нейронной сети с Eclipse Deeplearning4j

Введение в нейронные сети

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

Хотя нейронные сети были изобретены в прошлом веке, только недавно они вызвали больше волнений. Теперь, когда вычислительная способность использовать в своих интересах идею нейронных сетей существует, они были использованы для установки новых, самых современных результатов в таких областях, как компьютерное зрение, обработка естественного языка и обучение с подкреплением. Одно из известных достижений глубокого обучения было достигнуто учеными из DeepMind, которые создали компьютерную программу под названием AlphaGo, которая побила как бывшего чемпиона мира по Го, так и действующего чемпиона в 2016 и 2017 годах соответственно. Многие эксперты предсказывали, что это достижение не придет еще на десятилетие.

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

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

Где Eclipse DeepLearning4j подходит

Eclipse Deeplearning4j (DL4J) — это основанный на JVM инструментарий с открытым исходным кодом для построения, обучения и развертывания нейронных сетей. Он был создан для обслуживания сообществ Java и Scala и является удобным, стабильным и хорошо интегрированным с такими технологиями, как Spark, CUDA и cuDNN. Deeplearning4j также интегрируется с инструментами Python, такими как Keras и TensorFlow, для развертывания их моделей в производственной среде на JVM. Он также поставляется с группой библиотек с открытым исходным кодом, которые Skymind объединяет в корпоративный дистрибутив, называемый Skymind Intelligence Layer (SKIL) . Эти библиотеки:

  • Deeplearning4j : нейронная сеть DSL (облегчает построение нейронных сетей, интегрированных с конвейерами данных и Spark)
  • ND4J : N-мерные массивы для Java, тензорная библиотека: «Затмение января с кодом C и более широкой областью применения». Цель состоит в том, чтобы обеспечить тензорные операции и оптимизированную поддержку для различных аппаратных платформ.
  • DataVec : библиотека ETL, которая векторизует и «тензорирует» данные. Извлечение нагрузки преобразования с поддержкой подключения к различным источникам данных и вывода n-мерных массивов через серию преобразований данных
  • libnd4j : Pure C ++ библиотека для тензорных операций, которая тесно работает с библиотекой открытого кода JavaCPP (JavaCPP была создана и поддерживается инженером Skymind, но она не является частью этого проекта).
  • RL4J : обучение усилению на JVM, интегрированное с Deeplearning4j. Включает глубокое обучение, используемое в AlphaGo и A3C.
  • Jumpy : интерфейс Python для библиотеки ND4J, интегрирующийся с Numpy
  • Арбитр : Автоматическая настройка нейронных сетей с помощью поиска гиперпараметров. Оптимизация гиперпараметров с использованием поиска по сетке, случайного поиска и байесовских методов.
  • ScalNet : Scala API для Deeplearning4j, похожий на Torch или Keras по внешнему виду.
  • ND4S : N-мерные массивы для Scala, основанные на ND4J.

Вот несколько причин использовать DeepLearning4j.

Вы являетесь специалистом по данным в этой области или студентом проекта Java, Scala или Python, и вам необходимо интегрироваться со стеком JVM (Hadoop, Spark, Kafka, ElasticSearch, Cassandra); Например, вы хотите масштабировать обучение нейронной сети на Spark через несколько графических процессоров . Вам необходимо исследовать данные, проводить и контролировать эксперименты, которые применяют к данным различные алгоритмы, и проводить обучение на кластерах, чтобы быстро получить точную модель для этих данных.

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

Пример: построение сети прямой связи

Сеть прямой связи является самой простой формой нейронных сетей, а также одной из первых в мире. Здесь мы опишем пример нейронной сети с прямой связью на основе примера, расположенного здесь, с использованием данных Луны . Данные находятся здесь .

Необработанные данные состоят из файлов CSV с двумя числовыми характеристиками и двумя метками. Обучающие и тестовые наборы находятся в разных файлах CSV с 2000 наблюдениями в обучающем наборе и 1000 наблюдениями в тестовом наборе. Цель задачи — предсказать метку с учетом двух входных функций. Таким образом, мы заинтересованы в классификации.

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

01
02
03
04
05
06
07
08
09
10
11
int seed = 123;
double learningRate = 0.005;
int batchSize = 50;
int nEpochs = 100;
 
int numInputs = 2;
int numOutputs = 2;
int numHiddenNodes = 20;
 
final String filenameTrain  = new ClassPathResource("/classification/moon_data_train.csv").getFile().getPath();
final String filenameTest  = new ClassPathResource("/classification/moon_data_eval.csv").getFile().getPath();

Поскольку данные находятся в двух файлах CSV, мы инициализируем всего два CSVRecordReaders и два DataSetIterators . RecordReaders проанализирует данные в формате записи, а DataSetIterator направит данные в нейронную сеть в формате, который он может прочитать.

1
2
3
4
5
6
7
RecordReader rr = new CSVRecordReader();
rr.initialize(new FileSplit(new File(filenameTrain)));
DataSetIterator trainIter = new RecordReaderDataSetIterator(rr,batchSize,0,2);
 
RecordReader rrTest = new CSVRecordReader();
rrTest.initialize(new FileSplit(new File(filenameTest)));
DataSetIterator testIter = new RecordReaderDataSetIterator(rrTest,batchSize,0,2);

Построение сети прямой пересылки

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
    .seed(seed)
    .iterations(1)
    .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
    .learningRate(learningRate)
    .updater(Updater.NESTEROVS)
    .list()
    .layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(numHiddenNodes)
        .weightInit(WeightInit.XAVIER)
        .activation(Activation.RELU)
        .build())
    .layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD)
        .weightInit(WeightInit.XAVIER)
        .activation(Activation.SOFTMAX)
        .nIn(numHiddenNodes).nOut(numOutputs).build())
    .pretrain(false).backprop(true).build();

Существует один скрытый слой с 20 узлами и выходной слой с двумя узлами, использующий функцию активации softmax и функцию потери отрицательного логарифмического правдоподобия. Мы также устанавливаем, как инициализируются веса нейронной сети и как нейронная сеть будет оптимизировать веса. Чтобы результаты были воспроизводимыми, мы также устанавливаем его начальное значение; то есть мы используем случайно инициализированные веса, но мы сохраняем их случайную инициализацию на тот случай, если нам потребуется начать обучение с той же точки позже, чтобы подтвердить наши результаты.

Обучение и оценка нейронной сети прямой связи

Чтобы фактически создать модель, MultiLayerNetwork инициализируется с использованием ранее установленной конфигурации. Затем мы можем подогнать данные, используя цикл обучения; в качестве альтернативы, если используется MultipleEpochsIterator , тогда функцию подбора нужно вызывать только один раз, чтобы обучить данные с заданным количеством эпох.

1
2
3
4
5
6
7
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
model.setListeners(new ScoreIterationListener(100));
 
for ( int n = 0; n < nEpochs; n++) {
    model.fit( trainIter );
}

Как только данные закончат обучение, мы будем использовать набор тестов для оценки нашей модели. Обратите внимание, что testIter создает testIter соответствии с ранее установленным размером пакета 50. Класс Evaluation будет обрабатывать точность вычислений с использованием правильных меток и прогнозов. В конце мы можем распечатать результаты.

01
02
03
04
05
06
07
08
09
10
Evaluation eval = new Evaluation(numOutputs);
while(testIter.hasNext()){
    DataSet t = testIter.next();
    INDArray features = t.getFeatureMatrix();
    INDArray labels = t.getLabels();
    INDArray predicted = model.output(features,false);
    eval.eval(labels, predicted);
}
 
System.out.println(eval.stats());

Этот пример охватывает основы использования MultiLayerNetwork для создания простой нейронной сети с MultiLayerNetwork .