INFLUENCE OF NEURAL NETWORK ARCHITECTURE AND INITIAL DATA ON THE NEURAL NETWORK FUNCTIONING IN CLASSIFICATION TASKS
Аннотация
В данный момент программы, основанные на нейросетях, все шире и чаще применяются в различных областях человеческой жизни. Понимание основных принципов работы таких систем является одним из необходимых навыков для современного специалиста широкого профиля в IT-индустрии. Цель работы – установить зависимость между архитектурой нейронной сети и исходных данных на работу нейронной сети для задачи классификации. Результаты исследований, описанный в данной статье могут применяться при создании программ-классификаторов, основанных на искусственных нейронных сетях.
Abstract
At the moment, programs based on neural networks are increasingly used in various areas of human life. Understanding the basic principles of such systems is one of the necessary skills for a modern generalist in the IT industry. The aim of the work is to establish the relationship between the architecture of the neural network and the initial data on the operation of the neural network for the classification problem. The results of the research described in this article can be used in the creation of classifier programs based on artificial neural networks.
Ключевые слова:
нейронные сети, классификация, обучающая выборка, архитектура сети
Keywords:
neural networks, classification, training sample, network architecture
В статье рассматривается зависимость качества работы нейросетей от заранее проведенной обработки информации и от архитектуры сети.
Требуется установить, как зависит работа нейронной сети от заранее проведенной обработки информации, установить зависимость качества работа от архитектуры сети. Попытаться разработать нейросеть, предсказывающую возможную архитектуру для желаемой точности работы.
Классификация – задача, в которой заданный объект нужно отнести к одной из заранее заданных групп, опираясь на его отличительные признаки. Это одна из основных задач, которые на сегодняшний день ставятся перед нейросетями.
При создании такой нейросети, как и любой другой нейросети, встают две основные задачи – проектирование архитектуры сети и сбор обучающих и тестовых данных. В обучении нейросетей существует много различных подходов [1], в этой статье будет рассмотрен один из самых простых – обучение с учителем. Обучение с учителем – это вид обучения, при котором обучающие примеры имеют вид «вход-выход», то есть для каждого входа нам заранее известен правильный результат [1]. Обучаясь на таких примерах, нейросеть анализирует каждый массив входных данных и сопоставляет его с заданным ей для этого входа выход. С программной стороны это значит, что когда через сеть пройдет достаточное количество различных массивов данных, для которых выходное значение является одним и тем же (разные представители одного и того же класса), сеть выделит в них общие признаки, которые, при этом, характеры только представителям данного класса и отсутствуют у других классов. Когда на вход такая сеть получить массив, отсутствующий в обучающей выборке, она сможет дать ответ, к какому классу принадлежат данные. В основе работы нейросети лежит создание математической модели. Когда работа с обучающей выборкой завершена, в каждом нейроне сети хранится один весовой коэффициент модели, который после используется для работы с уже незнакомыми данными. При этом, если сеть является многослойной, то входами нейронов n-го слоя, являются выходы n-1-го слоя. Таким образом данные проходят несколько уровней аппроксимации для составления математической модели, по которой может быть предсказан ответ, в таком случае значения, рассчитанные на нейронах последнего слоя, и будут являться результатом работы всей сети. Нейросеть не дает точного ответа на вопрос, к какому классу принадлежат данные, она лишь рассчитывает вероятность, с которой данные принадлежат к каждому классу, поэтому даже у самых хорошо обученных нейросетей остается вероятность ошибки. Частично точность работы зависит от архитектуры сети. Под архитектурой обычно понимают количество слоев, количество нейронов на каждом слое, тип связи между слоями, наличие или отсутствие свертки, т.е. программное устройство сети. Иногда лучший результат дает расширение сети вширь, а не углубление её путем создания новых внутренних слоев. В данный момент существует ряд общепринятых архитектур для решения определенных задач, но если программист сталкивается с нетривиальной задачей, то архитектуру придется подбирать опытным путем. Рассчитать хотя бы примерную архитектуру чрезвычайно важно, потому что ошибки разработчика не будут аннулированы работой самой сети. Все слои и все нейроны будут работать, если они предусмотрены, даже если они ухудшают работу.
Сбор данных для обучения нейросети представляет собой еще более сложную, чем разработка её архитектуры, так как для качественной тренировки может потребоваться несколько десятков тысяч наблюдений, включающих себя замеры по всем необходимым признакам. Данный процесс сопряжен с другими трудными задачами, вроде очистки данных, восстановления пропущенных данных и т.д.
В случае подготовки данных для обучения с учителем, исследователь должен не только собраться большое количество наблюдений, но и вручную классифицировать их, поэтому необходимо знать взаимосвязь между тем, как подготовлены данные, и результатом работы нейросети. Рассмотрим практические примеры.
Для создания практических примеров была использована библиотека языка Python TensorFlow, для симуляции статистических данных – библиотека Scikit-learn.
В первую очередь исследуем зависимость работы классификатора от массива входных данных.
Пример кода:
import tensorflow as tf
import numpy as np
from sklearn.datasets import make_classification as mk
import math
features, labels = mk(n_samples = 70000,
n_features = 70,
n_informative = 70,
n_redundant = 0,
n_classes = 4,
weights = [0.3, 0.4, 0.15, 0.15],
random_state = 1)
train_features = features[:60000,:]
train_labels = labels[:60000]
test_features = features[60000:,:]
test_labels = labels[60000:]
num_train = train_features.shape[0]
num_test = test_features.shape[0]
BATCH = 32
model = tf.keras.Sequential([tf.keras.layers.Dense(units = 20, input_shape = [70]),
tf.keras.layers.Dense(units = 128, activation = tf.nn.relu),
tf.keras.layers.Dense(units = 4, activation = tf.nn.softmax)])
model.compile(loss = "sparse_categorical_crossentropy",
optimizer = 'adam',
metrics = ['accuracy'])
train_dataset = tf.data.Dataset.from_tensor_slices((train_features, train_labels))
test_dataset = tf.data.Dataset.from_tensor_slices((test_features, test_labels))
train_dataset = train_dataset.repeat().shuffle(num_train).batch(BATCH)
test_dataset = test_dataset.batch(BATCH)
model.fit(train_dataset,
epochs = 5,
steps_per_epoch = math.ceil(60000/BATCH),
verbose = True)
model.evaluate(test_dataset,
steps = math.ceil(10000/BATCH))
В представленной выше программе случайным образом создается 70000 наблюдений по 70 признакам, из которых важную информацию несут все 70 и отсутствуют взаимовлияющие друг на друга, и бесполезные признаки. Все 70000 наблюдений разделены на 4 класса, в каждый с заданной вероятностью – 0.3, 0.4, 0.15 и 0.15. В сумме все вероятности должны давать единицу. Данная функция библиотеки помимо матрицы данных еще формирует и вектор меток, то есть определяет к какому классу относится сгенерированные данные. После данные распределяются на две выборки – обучающую и тестовую. Первая нам нужна для того, чтобы обучить модель, вторая – для проверки её работы. В тестовой выборке содержаться примеры, которые нейросеть ещё не видела, но для которых мы знаем правильный ответ. Следовательно, мы можем сравнить ответ, которые дает нам нейросеть с правильным. В нашем случае мы отвели под обучающую выборку 60000 примеров, а под тестовую – оставшиеся 10000.
Далее необходимо определить размер так называемого батча. Так как на вход нейросеть получает достаточно большой массив данных, она не может обработать его сразу, поэтому обработка идет пошагово и за каждый шаг обрабатывается только небольшая часть данных, которая и называется батчем.
Следующий этап – это инициализация модели. Здесь необходимо указать вид модели и конфигурацию каждого слоя. В данной статье будут использоваться модели типа Sequential – слои объединяются между собой в порядке, указанным программистом, и слои типа Dense – в этом случае каждый нейрон слоя связан со всеми другими нейронами предыдущего слоя.
В самом первом слое, как и в любом другом, нужно указать количество нейронов, а его отличительной особенностью является указание размерности входных данных. На последующих слоях указывается функция активации. Эта функция, в зависимости от своих значений определяет, должен ли нейрон изменить свое значение после нового «круга» обучения. На последнем слое сети, который и показывает результат работы модели, будет использоваться функция SoftMax, которая приводит выходы к виду вероятностей, которые в сумме дают единицу.
После подготовки данных и архитектуры следует этап компиляции, на котором выбираются функции для замера отклонения результата работы модели от правильного ответа, то есть определения ошибки, потерь, и для исправления этого.
Представленная в статье модель на данной обучающей выборке данных за 5 кругов обучения (их принято называть эпохами) показывает точность 0.9423. Это значит что на последней эпохе обучения вероятность правильного определения класса объекта равнялась 0.9423. Но данное значение не пригодно для оценки качества работы, для этого производится замер на тестовой выборке, где сеть показала точность уже чуть более низкую - 0.9351. Это и будет показатель качества работы.
Попробуем теперь изменить структуру входных данных. Количество признаков и наблюдений пока оставим тем же, но изменим их качество. Предположим, что при определении признаков была допущена ошибка и некая часть из них является линейной комбинацией друг друга. Всего признаков в используемой выборке 70.
| Количество независимых признаков | Количество линейных комбинаций | Точность на обучающей выборке | Точность на тестовой выборке |
|---|---|---|---|
| 70 | 0 | 0.9426 | 0.9315 |
| 50 | 20 | 0.9378 | 0.9336 |
| 25 | 15 | 0.9547 | 0.9517 |
| 5 | 10 | 0.8690 | 0.8696 |
| 4 | 4 | 0.8476 | 0.8 |
В случаях, когда количество независимых и линейно-комбинированных признаков в сумме не было равно 70, остальные признаки просто не несли информации, влияющей на результат.
По первым двум примерам видно, что количество независимых и комбинированных признаков слабо влияет на результат, если остается соизмеримым, однако наивысшая точность была получена, когда количество всех важных для определения результата признаков уменьшилось более, чем в половину от первоначального, но при дальнейшем уменьшении признаков точность стала снижаться.
При неправильном подборе начальных данных может возникнуть серьёзнейшая проблема, называемая оверфиттингом. Оверфиттинг – это случай, при котором нейросеть после обучения получает аппроксимирующую функцию, слишком точно описывающую данные обучающей выборке, из-за этого данная функция становится невозможной для правильного предсказания ответа при незнакомых входных данных. Например, если оставить количество признаков тем же (70), а количество наблюдений снизить до куда меньшего, мы уже на второй эпохе обучения получаем точность, равную единице. Можно подумать, что это хороший исход, но на тестовой выборке точность равняется всего лишь 0.4. Увеличив количество признаков до 700, тестовая точность упадет до 0.2, а на обучающей так и останется единицей. Так происходит, потому что количество наблюдений в этом случае, намного меньше, чем число признаков, поэтому наблюдения просто не могут покрыть всю информацию, которая влияет на результат, из-за чего нейросеть делать неверные выводы и природе данных и совершает ошибки. Попробуем обучить нейросеть с примерно равным количеством признаков и наблюдений и будем постепенно повышать количество вторых. Количество признаков во всех экспериментах – 150.
| Количество наблюдений | Точность на обучающей выборке | Точность на тестовой выборке |
|---|---|---|
| 130 | 0.6094 | 0.2 |
| 250 | 0.7321 | 0.32 |
| 1000 | 0.7015 | 0.51 |
| 3000 | 0.7781 | 0.606 |
| 30000 | 0.911 | 0.8704 |
Приемлемый по точности результат был получен, когда количество наблюдений превосходит количество признаков примерно в 200 раз. Очень важно правильно подготовить данные для обучений нейросети, так как обучение их крупных современных экземпляров может занимать очень долгое время и потреблять огромное количество ресурсов, из-за чего дорого стоить.
Помимо входных данных важную роль играет сама архитектура сети. Часто подбирать архитектуру приходится опытным путем. В данной статье будет приведена попытка автоматизировать алгоритм поиска архитектуры классифицирующей нейросети с помощью нейросети другого типа.
Самым простым типом нейросети является аппроксимирующая нейросеть. На вход ей подаются два массива, условный «X» и «Y», а нейросеть ищет функцию, чтобы по ней рассчитать новые игреки, когда на вход будет подан новый икс.
Таким образом, если перед нами стоит задача создать нейросеть, которая будет создавать другие нейросети, в первую очередь необходимо понять, что такой нейросети будет подаваться на вход и что будет являться её выходом.
Пользователь, желающий создать для себя классифицирующую нейросеть, будет заинтересован в том, чтобы его модель работа качественно и совершала как можно меньше ошибок. Показателем качества работы нейросети является её точность на тестовой выборке, поэтому это значение и будет входом, а выходом будет являться массив данных, содержащий в себе необходимые данные.
Для обучения такой нейросети потребуется большое количество данных об архитектуре и качестве работы нейросетей, поэтому необходимо спроектировать и обучить много классифицирующих нейросетей, где каждая нейросеть – это одно наблюдение, а признаки – количество эпох, количество нейронов на слое. У каждой нейросети в таком наблюдении будет 5 слоев – входной, три внутренних и выходной. Следовательно, в каждом наблюдении будет 4 признака. Пользуясь выводом о соотношении количества наблюдений и признаков, возьмем наблюдений в 250 раз больше, чем признаков. Суммарно мы обучили 1000 нейросетей.
В данной программе на первом этапе полученный файл разбивает на массивы входных и выходных данных, после на них обучается регрессионная нейросеть, которая ищет числовую зависимость между точностью на тестовой выборке и архитектурой, после пользователь вводит желаемую точность, нейросеть предсказывает архитектуру, по которой учится и тестируется создаваемая после нейросеть. В данном примере для обучения и проверки тестируемой нейросети был использован набор данных Fashion MNIST, где каждый элемент – изображение того или иного элемента одежды.
После обучения нейросеть создала архитектуру, дающую точность 0.88 на тестовой выборке при заданной ей 0.9. При этом, регрессионная нейросеть имеет точность близкую лишь к 0.5.
Эксперименты, описанные в статье, показали, что работа нейронной сети чувствительна к начальной обработке данных, на которой ей предстоит учиться, и к архитектуре сети. Было установлено, что регрессионная нейросеть слабо подходит для предсказания архитектуры классифицирующей нейросети.
Таким образом в ходе работы удалось доказать, что качество работы нейросети зависит от качества предварительной обработки данных, архитектуры нейросети, а также была изучена возможность использования регрессионной нейросети для разработки архитектуры классифицирующей.