Обучение нейрона на Python

Пример обучения нейрона для классификации ирисов Фишера
 

Обучение нейрона на Python. Простейший пример

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

Так, для распознавания речевых поисковых запросов (ок!-гугл...), компания Google использует нейронную сеть. Также нейронные сети могут использоваться для автоматического распознавания рукописного текста.  Что представляют собой нейронные сети, и чего общего во всех этих задачах, которые они способны решать?!

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

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

Обучение нейрона в Scipy, Python

Функционирование нейрона можно представлять на абстрактном уровне: 1) сигналы от других нейронов поступают на дендриты данного нейрона; 2) каждый из сигналов усиливается или ослабляется индивидуальным образом; 3) в теле нейрона определяется суммарный сигнал в отношении которого применяется какое-либо нелинейное скалярное преобразование; 4) результат этого преобразования передается по аксону другим нейронам.

Если интенсивность сигналов представлять числовыми значениями, то функционирование нейрона будет выглядеть следующим образом. Исходный вектор сигналов \((x_1, x_2, \ldots, x_n)\) поступает по дендритам и претерпевает индивидуальные изменения (усиления, ослабления). Усиления и ослабления сигналов можно моделировать как умножение на какие-либо коэффициенты — значения индивидуальные для каждого нейрона.  Обозначим эти коэффициенты \((\omega_1, \omega_2, \ldots, \omega_n)\). Тогда работу нейрона математически можно записать в виде выполнения некоторого преобразования над входными сигналами $$z = f\left(\sum_{i=0}^{n} \omega_i\cdot x_i\right), $$ где \(f\) — некоторое нелинейное преобразование (функция активации нейрона). Результат этого преобразования \(z\) передается другим нейронам в сети (либо используется по назначению).

Функционирование такого математического нейрона определяется набором коэффициентов \(\omega_i\) и функцией активации.  Если мы хотим получить какой-либо определенный сигнал на выходе, при определенном сигнале на входе, можно попытаться подстроить коэффициенты нейрона так, чтобы получить желаемое.

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

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

Что, собственно, представляют задачи распознавания изображений или речи. В случае цифровых изображений, каждое из которых может быть представлено в виде матриц интенсивности цветов (например, красный (R), зеленый (G), синий (B)), задача распознавания, например, человеческого лица,  может быть трактована как задача восстановления некоторого сложного отображения, входными данными которого являются набор интенсивностей цветов каждой точки изображения, а выходными, например, лишь возможные два значения: 1 – лицо присутствует, 0 – лицо отсутствует. При распознавании речи — входными данными могут служить частотно-амплитудное представление звукового сигнала, а выходными — наличие или отсутствие определенного слова.

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

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

Рассмотрим "классическую" задачу классификации — определение вида ириса по параметрам его цветка (см. Ирисы Фишера). Для решения задачи построим элементарную искусственную нейронную сеть, состоящую из одного нейрона, которая будет определять является ли проверяемый экземпляр Iris setosa или нет. Таким образом, задачей нейросети будет оценка вероятности принадлежности объекта виду Iris setosa по набору параметров цветка. Если нейросеть будет способна оценивать подобного рода вероятности, то построить на ее базе классификационную схему будет оцень просто: достаточно ограничиться порогом вероятности, начиная с которого данные можно классифицировать как принадлежащие Iris setosa.

Обучаемый нейрон будет иметь четыре входа (по числу измеряемых параметров цветка) и один выход. Выходные значения будут интерпретироваться как вероятности принадлежности объектов виду I. setosa.

Если в качестве функции активации этого нейрона выбрать \(f=\dfrac{1}{1+\exp^{-x^T\omega}}\), то получаемая модель в точности совпадет с моделью логистической регрессии. Если в качестве функции активации выбрать функцию распределения вероятностей (cummulative distribution function, cdf) нормального распределения с параметрами (0, 1) от скалярного произведения \(x^T\omega\), то придем к так называемой пробит-регрессии. Таким образом, простейшая нейросеть из одного нейрона может описывать вполне известные модели, используемые для решения классификационных задач.

Обучение нейрона будет проходить следующим образом. Для наборов параметров цветка, соответствующих Iris setosa, нейрон должен на выходе давать вероятность 1, в любом другом случае 0. При этом, данное условие по возможности должно выполняться для всех данных одновременно.  Требование одновременности может быть переформулировано в терминах задачи наименьших квадратов, когда требуется минимизировать сумму квадратов невязок вероятностей для Iris setosa. Соответствующий код на Python тогда будет выглядеть следующим образом:

import numpy as np 
from scipy.optimize import leastsq
from sklearn import datasets
from sklearn.metrics import accuracy_score
from sklearn import cross_validation
from scipy.stats import norm

iris = datasets.load_iris()

def neuron_logit(x, w):
    '''Logit activation function '''
    return 1.0/(1 + np.exp(-np.dot(x, w)))

def neuron_probit(x, w):
    '''Probit activation function'''
    return norm.cdf(np.dot(x, w))


# Change it, if needed
neuron = neuron_logit

X = iris.data 
y = iris.target

y[y==0] = 0
y[y!=0] = 1


def ftomin(w, X, y):
    a = [neuron(x_, w) - (1.0 if y_==0 else 0.0) for x_, y_ in zip(X, y)]
    return a

loo = cross_validation.LeavePOut(len(y), 1)
for train_index, test_index in loo:
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    trained_w = leastsq(ftomin, np.random.rand(4), args=(X_train, y_train), maxfev=10**5, full_output=True)
    probabilities = [neuron(x, trained_w[0]) for x in X_test]
    y_pred = [0 if x >= 0.5 else 1 for x in probabilities]
    print 'Accuracy (LOO estimation): ', accuracy_score(y_test, y_pred)

Для проверки правильности классификации в данном примере использован метод скользящего экзамена (описан у С.А. Айвазяна в томе "Классификация и снижение размерности; зарубежный термин leave-one-out или leave-P-out). Согласно методу скользящего экзамена из исходных данных на каждом шаге в качестве тестовой выборки выделяется 1 набор, остальные данные составляют тренировочную выборку. Таким образом, в качестве тестовой выборки выбираются последовательно все записи данных. Если исходный массив состоит из N записей, то метод скользящего экзамена приводит к необходимости обучать нейрон (или нейросеть) N-раз.

Функция минимизации суммы квадратов (leastsq) из пакета SciPy хорошо справлялась с поставленными задачами оптимизации, при этом начальное приближение для искомых весов нейрона выбиралось случайным образом. Если посчитать отношение числа ошибочных классификаций к общему числу экспериментов в рамках метода скользящего экзамена, то получится точность порядка 97.3% (для определения Iris setosa при использовании logit в роли функции активации нейрна). В то же время, использование в качестве функции активации пробит-функции  приводит к несколько худшим результатам 96.6%.

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

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

 


 

blog comments powered by Disqus