Участник:Anton goy/Самоорганизующиеся карты Кохонена: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 31: Строка 31:
 
'''Алгоритм обучения (online version):'''
 
'''Алгоритм обучения (online version):'''
  
1. Задать начальные приближение весов <math>\mathbf{w}_{j}</math>, <math>\forall j=1, \dots, L</math>.
+
# Задать начальные приближение весов <math>\mathbf{w}_{j}</math>, <math>\forall j=1, \dots, L</math>.
 
+
# Выбрать случайно номер объекта <math>i \sim Unif[1, N]</math>.
2. Выбрать случайно номер объекта <math>i \sim Unif[1, N]</math>.
+
# Найти расстояние между объектом <math>\mathbf{x}_i</math> и всеми векторами весов <math>\mathbf{w}_{j}</math>: <math>\rho(\mathbf{x}_i, \mathbf{w}_{j}) = \left\| \mathbf{x}_i - \mathbf{w}_{j} \right\|^2, \quad \forall j=1, \dots, L</math>
 
+
# Найти нейрон-победитель <math>n_b</math>, <math> b = \arg \min_{\forall j \in \{1, \dots, L\}} \rho(\mathbf{x}_i, \mathbf{w}_{j})</math>, наиболее близкий к текущему объекту <math>\mathbf{x}_i</math>.
3. Найти расстояние между объектом <math>\mathbf{x}_i</math> и всеми векторами весов <math>\mathbf{w}_{j}</math>
+
# Для всех неронов <math>n_j</math> пересчитать их веса по следующей формуле: <math>\mathbf{w}_{j} \leftarrow \mathbf{w}_{j} + \alpha(t)h_{b, j}(t)(\mathbf{x}_i - \mathbf{w}_{j})</math>, где <math>\alpha(t)</math> - темп обучения (learning rate), монотонно убывающая функция от номера итерации <math>t</math>, <math>h_{b, j}(t)</math> - функция определяющая "меру соседства" нейронов <math>n_b</math> и <math>n_j</math>.
 
+
# Проверить критерий останова. При необходмости перейти на шаг 2.
:<math>\rho(\mathbf{x}_i, \mathbf{w}_{j}) = \left\| \mathbf{x}_i - \mathbf{w}_{j} \right\|^2, \quad \forall j=1, \dots, L</math>
 
 
 
4. Найти нейрон-победитель <math>n_b</math>, <math> b = \arg \min_{\forall j \in \{1, \dots, L\}} \rho(\mathbf{x}_i, \mathbf{w}_{j})</math>, наиболее близкий к текущему объекту <math>\mathbf{x}_i</math>.
 
 
 
5. Для всех неронов <math>n_j</math> пересчитать их веса по следующей формуле:
 
:<math>\mathbf{w}_{j} \leftarrow \mathbf{w}_{j} + \alpha(t)h_{b, j}(t)(\mathbf{x}_i - \mathbf{w}_{j})</math>,
 
где <math>\alpha(t)</math> - темп обучения (learning rate), монотонно убывающая функция от номера итерации <math>t</math>;
 
 
 
<math>h_{b, j}(t)</math> - функция определяющая "меру соседства" нейронов <math>n_b</math> и <math>n_j</math>.
 
 
 
6. Проверить условие останова. При необходмости перейти на шаг 2.
 
  
 
Данное выше описание является довольно общим и не раскрывает некоторых деталей:
 
Данное выше описание является довольно общим и не раскрывает некоторых деталей:
Строка 55: Строка 44:
 
** '' Инициализация при помощи PCA. '' При помощи PCA находятся первые две главные компоненты <math>e_1, e_2</math>. Затем в плоскости натянутой на ветора <math>e_1, e_2</math> выбирается регулярная сетка точек, которыми и инициализируются вектора <math>\mathbf{w}_j</math>. Этот способ является наиболее предпочтительным и на практике показывает хорошие результаты.
 
** '' Инициализация при помощи PCA. '' При помощи PCA находятся первые две главные компоненты <math>e_1, e_2</math>. Затем в плоскости натянутой на ветора <math>e_1, e_2</math> выбирается регулярная сетка точек, которыми и инициализируются вектора <math>\mathbf{w}_j</math>. Этот способ является наиболее предпочтительным и на практике показывает хорошие результаты.
 
* ''' Задание <math>\alpha(t)</math> '''
 
* ''' Задание <math>\alpha(t)</math> '''
**
+
** <math>\alpha(t) = \alpha_0 \exp \left\{ -\frac{t}{\lambda} \right\}</math>
 +
** <math>\alpha(t) = \frac{1}{t}</math>
 +
** <math>\alpha(t) = \lambda^{\frac{t}{T}}, \lambda \in (0, 1)</math>
 +
* ''' Задание <math>h_{b,j}(t)</math> '''
 +
** Наиболее популярный способ: <math>h_{b,j}(t) = \exp \left\{ - \frac{\| \mathbf{r}_b -\mathbf{r}_j \|^2}{2\sigma(t)^2} \right\}</math>, где <math>\sigma(t)</math> - убывающая функция.
 +
 
 +
Кроме онлайн алгоритма обучения часто на практике применяют более эффективную с точки зрения вычислений batch-версию:
 +
 
 +
'''Алгоритм обучения (batch version):'''
 +
 
 +
# Задать начальные приближение весов <math>\mathbf{w}_{j}</math>, <math>\forall j=1, \dots, L</math>.
 +
# Для каждого объекта <math>\mathbf{x}_i</math> найти нейрон-победитель <math>n_{b(i)}</math>, где <math> b(i) = \arg \min_{\forall j \in \{1, \dots, L\}} \rho(\mathbf{x}_i, \mathbf{w}_{j})</math>
 +
# Пересчитать веса для всех нейронов <math>\mathbf{w}_j \leftarrow \frac{\sum_{i=1}^{N}h_{b(i),i}\mathbf{x}_i}{\sum_{i=1}^{N}h_{b(i),i}}</math>, <math>\forall j=1, \dots, L</math>.
 +
# Проверить критерий останова. При необходимости перейти на шаг 2.
 +
 
 +
Шаг 2 можно модифицировать: делать проход не по всем объектам выборки, а только по некоторой ее части фиксированого размера.

Версия 23:19, 9 октября 2016


Автор: Гой Антон, 617 группа.

1 Свойства и структура алгоритмов

1.1 Общее описание алгоритма

Рисунок 1. Структура самоогранизующейся карты Кохонена с шестиугольной решеткой

Самоорганизующаяся карта Кохонена (англ. Self-Organizing Map или сокращено SOM) - это разновидность нейронных сетей, относящаяся к алгоритмам обучения без учителя. Основная цель - найти скрытые закономерности в данных по средством снижения размерности исходного пространства. Важным свойством карт Кохонена является то, что они строят отображение в пространство низкой размерности (обычно двумерное) таким образом, что топология исходного пространства сохраняется. Результат данного отображения - правильная решетка из обученных нейронов - называется "картой" исходного пространства. Алгоритм был разработан известным финским учёным, заслуженным академиком Финской Академии Наук Теуво Кохоненом в 1984(2) году. Карты Кохенана находят успешное применение в задачах кластеризации и визуализации, а также для снижения размерности и детектирования аномалий в данных.

Карты Кохонена и по своей архитектуре, и по методу обучения отличаются от обычных нейронных сетей прямого распространения. C точки зрения метода обучения, карты Кохонена не используют градиентные методы для минимизации ошибки (как это делается в сетях прямого распространения), поскольку являются алгоритмом обучения без учителя и никак не могут учитывать информацию и метках классов. Поэтому нейронная сеть обучается через соревнование между нейронами: на каждом шаге алгоритма для случайного объекта из обучающей выборки выбирается нейрон-победитель (best matching unit, BMU), который в определенном смысле наиболее похож на данный объект.

Рисунок 2б. Топология слоя Кохонена с прямоугольными ячейками
Рисунок 2а. Топология слоя Кохонена с шестиугольными ячейками

А архитектура карты Кохонена (Рис. 1) представляет два слоя: первый слой состоит из входных нейронов (их количество равно размерности исходного пространства), второй слой (его называют слоем Кохонена) представляет собой строго упорядоченную решетку, в узлах которой расположены нейроны-сумматоры, соедененные со всеми входами сети. Для визуализации топологии слоя Кохонена (Рис. 2) используют либо шестиугольные (Рис. 2а), либо прямоугольные (Рис. 2б) ячейки, в которых распологаются нейроны. Шестиугольные ячейки часто являются более предпочтительными, так как расстояние от центра выбранной ячейки до ее соседей одинаково.

Каждый нейрон n_j слоя Кохонена описывается вектором весов \mathbf{w}_j, размерность которого совпадает с размерностью исходного пространства, и координатами нейрона на двумерной плоскости - \mathbf{r}_j.

Процесс обучения состоит в настройке векторов весов \mathbf{w}_j.

1.2 Математическое описание алгоритма

Пусть \mathcal{L} = \left\{ \mathbf{x}_i \right\}_{i=1}^{N} - некоторое подмножество точек пространства \mathbb{R}^D, \mathbf{x}_i = \left( x_{i}^{(1)}, \dots, x_{i}^{(D)} \right) \in \mathbb{R}^D. В машинном обучении множество \mathcal{L} называют обучающей выборкой.

Пусть задано L = X \times Y общее количество нейронов в слое Кохонена. И каждому нейрону n_j поствлен в соответствие вектор весов \mathbf{w}_{j} = \left( w_{j}^{(1)}, \dots, w_{j}^{(D)} \right) \in \mathbb{R}^D и вектор \mathbf{r}_j \in \mathbb{R}^2, определющий его положение на двумерной плоскости.

Алгоритм обучения (online version):

  1. Задать начальные приближение весов \mathbf{w}_{j}, \forall j=1, \dots, L.
  2. Выбрать случайно номер объекта i \sim Unif[1, N].
  3. Найти расстояние между объектом \mathbf{x}_i и всеми векторами весов \mathbf{w}_{j}: \rho(\mathbf{x}_i, \mathbf{w}_{j}) = \left\| \mathbf{x}_i - \mathbf{w}_{j} \right\|^2, \quad \forall j=1, \dots, L
  4. Найти нейрон-победитель n_b, b = \arg \min_{\forall j \in \{1, \dots, L\}} \rho(\mathbf{x}_i, \mathbf{w}_{j}), наиболее близкий к текущему объекту \mathbf{x}_i.
  5. Для всех неронов n_j пересчитать их веса по следующей формуле: \mathbf{w}_{j} \leftarrow \mathbf{w}_{j} + \alpha(t)h_{b, j}(t)(\mathbf{x}_i - \mathbf{w}_{j}), где \alpha(t) - темп обучения (learning rate), монотонно убывающая функция от номера итерации t, h_{b, j}(t) - функция определяющая "меру соседства" нейронов n_b и n_j.
  6. Проверить критерий останова. При необходмости перейти на шаг 2.

Данное выше описание является довольно общим и не раскрывает некоторых деталей:

  • Начальное приближение для \mathbf{w}_j
    • Инициализация случайными значениями. Самый простой способ - w_j^{(d)} \sim Unif[0, 1]. Данный подход может потребовать большое количество итераций, так как вектора весов неупорядочены и могут находится на значительном расстоянии от точек обучающей выборки.
    • Инициализация объектами обучающей выборки. Данный способ может позволить уменьшить количество итераций, так как вектора весов будут изначально находятся в области пространства, в которой расположены объекты выборки. Но проблема с неупорядоченностью остается.
    • Инициализация при помощи PCA. При помощи PCA находятся первые две главные компоненты e_1, e_2. Затем в плоскости натянутой на ветора e_1, e_2 выбирается регулярная сетка точек, которыми и инициализируются вектора \mathbf{w}_j. Этот способ является наиболее предпочтительным и на практике показывает хорошие результаты.
  • Задание \alpha(t)
    • \alpha(t) = \alpha_0 \exp \left\{ -\frac{t}{\lambda} \right\}
    • \alpha(t) = \frac{1}{t}
    • \alpha(t) = \lambda^{\frac{t}{T}}, \lambda \in (0, 1)
  • Задание h_{b,j}(t)
    • Наиболее популярный способ: h_{b,j}(t) = \exp \left\{ - \frac{\| \mathbf{r}_b -\mathbf{r}_j \|^2}{2\sigma(t)^2} \right\}, где \sigma(t) - убывающая функция.

Кроме онлайн алгоритма обучения часто на практике применяют более эффективную с точки зрения вычислений batch-версию:

Алгоритм обучения (batch version):

  1. Задать начальные приближение весов \mathbf{w}_{j}, \forall j=1, \dots, L.
  2. Для каждого объекта \mathbf{x}_i найти нейрон-победитель n_{b(i)}, где b(i) = \arg \min_{\forall j \in \{1, \dots, L\}} \rho(\mathbf{x}_i, \mathbf{w}_{j})
  3. Пересчитать веса для всех нейронов \mathbf{w}_j \leftarrow \frac{\sum_{i=1}^{N}h_{b(i),i}\mathbf{x}_i}{\sum_{i=1}^{N}h_{b(i),i}}, \forall j=1, \dots, L.
  4. Проверить критерий останова. При необходимости перейти на шаг 2.

Шаг 2 можно модифицировать: делать проход не по всем объектам выборки, а только по некоторой ее части фиксированого размера.