<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=5.18.218.179&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=5.18.218.179&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/5.18.218.179"/>
		<updated>2026-05-19T16:38:16Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69403</id>
		<title>Мета-обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69403"/>
				<updated>2019-01-25T23:16:30Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: Замена еще одного -&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;b&amp;gt;Мета-обучение&amp;lt;/b&amp;gt; {{---}} подход, позволяющий определять оптимальный алгоритм (иногда, вместе с параметрами к нему) для конкретной задачи. Основная идея мета-обучения {{---}} свести задачу выбора алгоритма к задаче обучения с учителем: задачи описываются мета-фичами. Мета-фича описывает свойство задачи {{---}} например, разрежен ли датасет или нет.&lt;br /&gt;
&lt;br /&gt;
От хорошей модели ожидается хорошая адаптируемость или генерализуемость новых задач и окружений, с которыми модель не сталкивалась во время обучения.&lt;br /&gt;
&lt;br /&gt;
Такими задачами являются:&lt;br /&gt;
* Классификатор, тренированный на изображениях собак и велосипедов, после некоторых показанных ему кошек, смог определить, есть ли на новой картинке кошка&lt;br /&gt;
* Игровой бот, способный быстро обучиться новой игре&lt;br /&gt;
* Робот, выполняющий задачу на пригорке во время теста даже если он тренировался на ровной поверхности&lt;br /&gt;
&lt;br /&gt;
Ограничения {{---}} No free lunch teorem&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221997149_No_Free_Lunch_Theorems_for_Search Wolpert and Macready, 1996]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/228671734_Toward_a_justification_of_meta-learning_Is_the_no_free_lunch_theorem_a_show-stopper Giraud-Carrier and Provost, 2005]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Simple view&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошая модель мета-обучения должна быть обучена на множестве задач и оптимизирована для лучшей производительности на нескольких задачах,&lt;br /&gt;
включая такие, с которыми модель не сталкивалась ранее. Каждой задаче соответствует датасет $\mathcal{D}$, содержащий и векторы фичей и правильную разметку.&lt;br /&gt;
Оптимальные параметры модели:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* = \arg\min_\theta \mathbb{E}_{\mathcal{D}\sim p(\mathcal{D})} [\mathcal{L}_\theta(\mathcal{D})]&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Очень похоже на обычную задачу машинного обучения, только один датасет принимается за один сэмпл данных.&lt;br /&gt;
&lt;br /&gt;
Few-shot классификатор конкретизация мета-обучения в области обучения с учителем. Датасет $\mathcal{D}$ делится на две части: $\mathcal{D}=\langle S, B\rangle$,&lt;br /&gt;
train set $S$ и test set $B$. Часто принимается k-shot N-class задача - train set содержит $k$ размеченных примеров для каждого из $N$ классов.&lt;br /&gt;
Датасет $\mathcal{D}$ содержит пары фичей и меток, $\mathcal{D} = \{(\mathbf{x}_i, y_i)\}$ и каждая метка принадлежит известному множеству меток $\mathcal{L}$. Скажем, наш классификатор $f_θ$ с параметром $θ$ показывает вероятность принадлежности точки из данных к классу $y$ при векторе фичей $x$, $Pθ(y|x)$&lt;br /&gt;
Оптимальные параметры должны максимизировать вероятность верных меток среди нескольких training sets $B⊂\mathcal{D}$:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{(\mathbf{x}, y)\in \mathcal{D}}[P_\theta(y \vert \mathbf{x})] &amp;amp;\\&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{B\subset \mathcal{D}}[\sum_{(\mathbf{x}, y)\in B}P_\theta(y \vert \mathbf{x})] &amp;amp; \scriptstyle{\text{; trained with mini-batches.}}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
В few-shot классификации цель {{---}} уменьшить ошибку предсказания на неразмеченных данных с данным train set для &amp;quot;быстрого обучения&amp;quot;. Чтобы ускорить процесс обучения, сделаем следующее:&lt;br /&gt;
# возьмем подмножество меток, $L\subset\mathcal{L}$&lt;br /&gt;
# возьмем train set $S^L⊂D$ и train batch $B^L⊂D$. Оба содержат только данные с метками из подмножества с пункта 1:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
L, y \in L, \forall (x, y) \in S^L, B^L&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
# Множество $S^L$ подается на вход модели.&lt;br /&gt;
# Конечная оптимизация использует множество $B^L$ чтобы посчитать loss и обновить параметры модели через обратное распространение, так же, как это делается в обучении с учителем.&lt;br /&gt;
&lt;br /&gt;
Можно представить каждую пару сэмплированного датасета $(S^L,B^L)$ как одну точку. Модель обучается таким образом, чтобы она могла обобщиться до других датасетов.&lt;br /&gt;
Красным выделен дифф между обучением с учителем и мета-обучением.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta = \arg\max_\theta \color{red}{E_{L\subset\mathcal{L}}[} E_{\color{red}{S^L \subset\mathcal{D}, }B^L \subset\mathcal{D}} [\sum_{(x, y)\in B^L} P_\theta(x, y\color{red}{, S^L})] \color{red}{]}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Идея в некоторой степени аналогична использованию предварительно обученной модели в классификации изображений (ImageNet) или в языковом моделировании (большие текстовые корпуса), когда доступен только ограниченный набор образцов данных для конкретной задачи. Мета-обучение идет еще  на один шаг вперед, вместо того, чтобы подстраивать ее под одну задачу, она оптимизирует модель, чтобы она была хороша для многих задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Основанные на оптимизации&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Модели глубокого обучения (deep learning) обучаются через обратное распространение градиентов. Тем не менее, оптимизация, основанная на градиентах не разрабатывалась для работы с небольшим количеством обучающих семплов, и не сходится за малое число оптимизационных шагов. Подход в мета-обучении, основанный на оптимизации как раз про это.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;LSTM-meta-learner&amp;lt;/h3&amp;gt;&lt;br /&gt;
Оптимизационный алгоритм может быть явно смоделирован. Ravi &amp;amp; Larochelle (2017) это и сделали и назвали его &amp;quot;meta-learner&amp;quot;. Цель meta-learner'а - эффективно обновлять параметры learner'a используя небольшой train set так, чтобы learner мог быстро адаптироваться к новым задачам.&lt;br /&gt;
&lt;br /&gt;
Пусть модель ученика будет $M_θ$, параметризованной $θ$, и meta-learner как $R_Θ$ с параметром $θ$, и функция потерь $\mathcal{L}$.&lt;br /&gt;
&lt;br /&gt;
Обновление параметров learner'a во время $t$ c learning rate $\alpha_t$ (шаг градиентного спуска):&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta_t = \theta_{t-1} - \alpha_t \nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Обновление памяти ячейки LSTM выглядит так:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t = \theta_{t-1} - \alpha_t\nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
$c_t$ {{---}} параметры сети $\theta_t$, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ при $f_t$ = 1.&lt;br /&gt;
&lt;br /&gt;
$f_t$ = 1, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ - не оптимальные значения, их изменение может оказаться полезным, если вы попали в неудачный локальный минимум.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
f_t &amp;amp;= \sigma(\mathbf{W}_f \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, f_{t-1}] + \mathbf{b}_f) &amp;amp; \scriptstyle{\text{; как сильно мы забываем старые значения параметров.}}\\&lt;br /&gt;
i_t &amp;amp;= \sigma(\mathbf{W}_i \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, i_{t-1}] + \mathbf{b}_i) &amp;amp; \scriptstyle{\text{; соответствует рейту обучения на шаге t.}}\\&lt;br /&gt;
\tilde{\theta}_t &amp;amp;= -\nabla_{\theta_{t-1}}\mathcal{L}_t &amp;amp;\\&lt;br /&gt;
\theta_t &amp;amp;= f_t \odot \theta_{t-1} + i_t \odot \tilde{\theta}_t &amp;amp;\\&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
я ничего не понял..&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;REPTILE&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reptile {{---}} относительно простой алгоритм мета-обучения, похожий на MAML, например, тем, что оба используют мета-оптимизацию через градиентный спуск и оба не чувствительны к модели.&lt;br /&gt;
&lt;br /&gt;
# сэмплируем задачу&lt;br /&gt;
# тренируемся на ней несколькими шагами градиентного спуска&lt;br /&gt;
# сдвигаем веса модели к новым параметрам.&lt;br /&gt;
&lt;br /&gt;
$\text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$ выполняет стохастический градиентный спуск на $k$ шагов на лоссе $\mathcal{L}_{\tau_i}$, начиная с параметра $\theta$ и возвращает конечный вектор параметров. Градиент reptile определяется как $(\theta - W)/\alpha$, где $\alpha$ {{---}} размер шага, используемый функцией $SGD$.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// Algorithm REPTILE, batched version&amp;lt;/font&amp;gt;&lt;br /&gt;
  Initialize $\theta$&lt;br /&gt;
  '''for''' $iteration = 1, 2,...$ '''do'''&lt;br /&gt;
    Sample tasks $\tau_1, \tau_2, ..., \tau_n$&lt;br /&gt;
    '''for''' $i = 1, 2, ..., n$ '''do'''&lt;br /&gt;
      Compute $W_i = \text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$&lt;br /&gt;
    '''end for'''&lt;br /&gt;
    Update $\theta \leftarrow \theta + \beta 1/n \sum (W_i - \theta)$&lt;br /&gt;
  '''end for'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Определение множества конфигураций&amp;lt;/h2&amp;gt;&lt;br /&gt;
Предшествующие вычисления могут быть также использованы для изучения пространства более успешных конфигураций \theta\star. Более подходящие под задачу конфигурации могут серьезно ускорить поиск оптимальных моделей, это важно при ограниченных вычислительных рессурсах.&lt;br /&gt;
&lt;br /&gt;
Альтернативный подход сперва узнать оптимальные гиперпараметры, а потом через приращение производительности определить важность каждого из гиперпараметров. Это и было сделано в лабе OpenML, провели около 500 000 экспериментов на 6 алгоритмах и 38 датасетах. Стандартные значения изучались вместе для всех гиперпараметров алгоритма посредством обучения суррогатных моделей для этого алгоритма на большом числе задач. После того, как уже проверены многие варианты конфигураций, выбирается такая, которая минимизирует ??? для всех задач, становится стандартной.Далее определяется важность каждого из гиперпараметров. Чем больше меняется приращение производительности, тем более важный гиперпараметр мы изменяем.&lt;br /&gt;
&lt;br /&gt;
Если мы хотим предоставить рекомендации для конкретной задачи $t_{new}$, нам нужна дополнительная информация о том, насколько $t_{new}$ похожа на предыдущие задачи $t_j$. Первый способ {{---}} посчитать число рекомендованных конфигураций для $t_new$, yielding новый эвиденс $\mathbf{P}_{new}$. Если позже мы будем наблюдать, что вычисления $P_{i,new}$ соответствуют $P_{i, j}$, то $t_{j}$ и $t_{new}$ могут быть очень похожими. Мы можем применить это знания для обучения meta-learner'a который предсказывает множество рекомендуемых конфигураций $\Theta^{*}_{new}$ for $t_{new}$.&lt;br /&gt;
Более того, можно пойти дальше и добавить $\Theta^{*}_{new}$ в $P_new$ и перейти к следующей итерации и выяснять какие еще задачи схожи друг с другом.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Relative landmarks&amp;lt;/h3&amp;gt;&lt;br /&gt;
Первая мера для вычисления &amp;quot;похожести&amp;quot; задач вычисляла попарно разницу в производительности, так же называемую &amp;quot;relative landmarks&amp;quot; $RL_{a,b,j} = P_{a,j} - P_{b,j}$ между двумя конфигурациями $\theta_{a}$ и $\theta_{b}$ на конкретной задаче $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Суррогатные модели&amp;lt;/h3&amp;gt;&lt;br /&gt;
Более гибкий способ передать информацию {{---}} построить суррогатную модель $s_{j}(\theta_{i}) = P_{i,j}$ для всех предшествующих задач $t_{j}$, обученную с использованием всех доступных $\mathbf{P}$. Можно определить &amp;quot;похожесть&amp;quot; задач в терминах ошибок между $s_{j}(\theta_{i})$ и $P_{i,new}$: если суррогатная модель для $t_{j}$ может генерировать точные предсказания для $t_{new}$, тогда такие задачи весьма похожи. Обычно это делается в комбинации с Байесовской оптимизацией для определения следующей $\theta_{i}$.&lt;br /&gt;
&lt;br /&gt;
Так же можно обучать суррогатные модели на Гауссовских процессах (GP) для каждой предыдущей задачи и еще одну для $t_{new}$ и объединить их во взвешенную и нормализованную сумму, с медианой $\mu$ определенной как взвшенная сумма $\mu_{j}$ полученных из задач $t_{j}$. Веса $\mu_{j}$ считаются через Nadaraya-Watson kernel-weighted average, где каждая задача представлена вектором relative landmarks и Epanechnikov quadratic kernel используется для определения похожести между векторами relative landmarks для $t_{j}$ и $t_{new}$. Чем больше $t_{j}$ похожа на  $t_{new}$, тем больше получится вес $s_{j}$, увеличивающий влияние суррогатной модели для $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
Суррогатные модели обучаются только на $P_{i, new}$, а следующий $\theta_{i}$ получается путем нахождения средневзвешенного expected improvement $P_{i, new}$ и предсказанных улучшений на всех предшествующих $P_{i, j}$.&lt;br /&gt;
Веса предшествующих задач могут быть переопределены через точность суррогатной модели или через relative landmarks.&lt;br /&gt;
Вес ожидаемого улучшения (expected improvement) постепенно возрастает с каждой итерацией (с увеличением собранного эвиденса $P_{i, new}$).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Обучение на свойствах задачи (learning on task properties)&amp;lt;/h3&amp;gt;&lt;br /&gt;
Каждая задача $t_{j} \in T$ может быть описана вектором $m(t_j) = (m_{j,1}, ...,m_{j,K})$ из $K$ мета-фичей $m_{j, k} \in M$ $M$ {{---}} множество мета-фичей. Можно определить меру &amp;quot;похожести&amp;quot; задач, основанную, например, на Евклидовом расстоянии между $m(t_i)$ и $m(t_j)$, тогда можно будет использовать информацию из наиболее похожей задачи на новую задачу $t_{new}$. Более того, используя предшествующие вычисления $\textbf{P}$ можно обучить meta-learner'a $L$ предсказывать производительность $P_{i, new}$ конфигураций $\theta_{i}$ на новых задачах $t_{new}$.&lt;br /&gt;
&lt;br /&gt;
$L: \Theta \times M \rightarrow \textbf{P}$&lt;br /&gt;
&lt;br /&gt;
В таблице представлен обзор наиболее используемых мета-фичей.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Meta-feature&lt;br /&gt;
|-&lt;br /&gt;
! '''Name''' !! '''Formula''' !! '''Rationale''' !! '''Variants'''&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''simple'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr instances || $n$ || Speed, Scalability \citep{Michie1994} || $p/n$, $log(n)$, log(n/p)&lt;br /&gt;
|-&lt;br /&gt;
| Nr features || $p$ || Curse of dimensionality \citep{Michie1994} || $log(p)$, % categorical&lt;br /&gt;
|-&lt;br /&gt;
| Nr classes || $c$ || Complexity, imbalance \citep{Michie1994} || ratio min/maj class&lt;br /&gt;
|-&lt;br /&gt;
| Nr missing values || $m$ || Imputation effects \citep{kalousis02} || % missing&lt;br /&gt;
|-&lt;br /&gt;
| Nr outliers || $o$ || Data noisiness \citep{Rousseeuw2011} || $o/n$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''statistical'''&lt;br /&gt;
|-&lt;br /&gt;
| Skewness || $\frac{E(X-\mu_{X})^{3}}{\sigma_{X}^{3}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Kurtosis || $\frac{E(X-\mu_{X})^{4}}{\sigma_{X}^{4}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Correlation || $\rho_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$\rho_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Covariance || $cov_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$cov_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Concentration || $\tau_{X_{1}X_{2}}$ || Feature interdependence \citep{Kalousis2001a} || min,max,$\mu$,$\sigma$,$\tau_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Sparsity || sparsity(X) || Degree of discreteness \citep{Salama2013} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Gravity || gravity(X) || Inter-class dispersion \citep{Ali2006} ||&lt;br /&gt;
|-&lt;br /&gt;
| ANOVA p-value || $p_{val_{\texttt{X}_{1}X_{2}}}$ || Feature redundancy \citep{kalousis02} || $p_{val_{XY}}$\citep{soares+04}&lt;br /&gt;
|-&lt;br /&gt;
| Coeff. of variation || $\frac{\sigma_{Y}}{\mu_{Y}}$ || Variation in target \citep{soares+04} ||&lt;br /&gt;
|-&lt;br /&gt;
| PCA $\rho_{\lambda_{1}}$ || $\sqrt{\frac{\lambda_{1}}{1+\lambda_{1}}}$ || Variance in first PC \citep{Michie1994} || $\frac{\lambda_{1}}{\sum_{i} \lambda_{i}}$\citep{Michie1994}&lt;br /&gt;
|-&lt;br /&gt;
| PCA skewness || || Skewness of first PC \citep{feurer2014using} || PCA kurtosis&lt;br /&gt;
|-&lt;br /&gt;
| PCA 95\% || $\frac{dim_{95\% var}}{p}$ || Intrinsic dimensionality \citep{bardenet2013collaborative} ||&lt;br /&gt;
|-&lt;br /&gt;
| Class probability || $P(\texttt{C})$ || Class distribution \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''informational-theoretic'''&lt;br /&gt;
|-&lt;br /&gt;
| Class entropy  || $H(\texttt{C})$ || Class imbalance \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Norm. entropy || $\frac{H(\texttt{X})}{log_{2}n}$ || Feature informativeness \citep{Castiello2005} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Mutual inform. || $MI(\texttt{C},\texttt{X})$ || Feature importance \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Uncertainty coeff. || $\frac{MI(\texttt{C},\texttt{X})}{H(\texttt{C})}$ || Feature importance \citep{Agresti:2002p7509} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Equiv. nr. feats || $\frac{H(C)}{\overline{MI(C,X)}}$ || Intrinsic dimensionality \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Noise-signal ratio || $\frac{\overline{H(X)}-\overline{MI(C,X)}}{\overline{MI(C,X)}}$ || Noisiness of data \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''complexity'''&lt;br /&gt;
|-&lt;br /&gt;
| Fisher's discrimin. || $\frac{(\mu_{c1}-\mu_{c2})^{2}}{\sigma_{c1}^{2}-\sigma_{c2}^{2}}$ || Separability classes $c_{1},c_{2}$ \citep{Ho:2002} || See \citet{}{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Volume of overlap || || Class distribution overlap \citep{Ho:2002} || See \citet{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Concept variation || || Task complexity \citep{Vilalta:2002p5805} || See \citet{Vilalta:1999p5745}&lt;br /&gt;
|-&lt;br /&gt;
| Data consistency || || Data quality \citep{Kopf:2002p5864} || See \citet{Kopf:2002p5864}&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''model-based'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr nodes, leaves || &amp;lt;tex&amp;gt;|\eta|,|\psi|&amp;lt;/tex&amp;gt; || Concept complexity \citep{Peng:2002p705} || Tree depth&lt;br /&gt;
|-&lt;br /&gt;
| Branch length || || Concept complexity \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Nodes per feature || &amp;lt;tex&amp;gt;|\eta_{X}|&amp;lt;/tex&amp;gt; || Feature importance \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves per class || &amp;lt;tex&amp;gt;\frac{|\psi_{c}|}{|\psi|}&amp;lt;/tex&amp;gt; ||  Class complexity \citep{Filchenkov2015} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves agreement || &amp;lt;tex&amp;gt;\frac{n_{\psi_{i}}}{n}&amp;lt;/tex&amp;gt; ||  Class separability \citep{Bensusan2000} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Information gain || || Feature importance \citep{Bensusan2000} || min,max,$\mu$,$\sigma$, gini&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''landmarks'''&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(1NN) || $P(\theta_{1NN},t_{j})$ || Data sparsity \citep{Pfahringer:2000p553} || See \citet{Pfahringer:2000p553}&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Tree) || $P(\theta_{Tree},t_{j})$ || Data separability \citep{Pfahringer:2000p553} || Stump,RandomTree&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Lin) || $P(\theta_{Lin},t_{j})$ || Linear separability \citep{Pfahringer:2000p553} || Lin.Disciminant&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(NB) || $P(\theta_{NB},t_{j})$ || Feature independence \citep{Pfahringer:2000p553} || See \citet{Ler:2005p1680}&lt;br /&gt;
|-&lt;br /&gt;
| Relative LM || $P_{a,j} - P_{b,j}$ || Probing performance \citep{Furnkranz:2001p1278} ||&lt;br /&gt;
|-&lt;br /&gt;
| Subsample LM || $P(\theta_{i},t_{j},s_{t})$ || Probing performance \citep{Soares:2001p708} ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Непрерывные фичи $X$ и таргет $Y$ имеют медиану $\mu_{X}$, stdev $\sigma_{X}$, variance $\sigma^{2}_{X}$. Категориальные фичи $\texttt{X}$ и класс $\texttt{C}$ имеют категориальные значения  $\pi_{i}$, условные вероятности $\pi_{i|j}$, совместные вероятности $\pi_{i,j}$, предельные вероятности $\pi_{i+}=\sum_{j}\pi_{ij}$, энтропию $H(\texttt{X})=-\sum_{i}\pi_{i+}log_{2}(\pi_{i+})$.&lt;br /&gt;
&lt;br /&gt;
Многие мета-фичи вычисляются по одиночным фичам или комбинации фичей, и должны быть агрегированы через min,max,$\mu$,$\sigma$,quartiles или гистограммами [kalousis]&lt;br /&gt;
&lt;br /&gt;
Во время вычисления похожести задач важно нормализовать все мета-фичи [bardnet], использовать feature selection [todorovski] или использовать dimensionality reduction (PCA, например).&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html#define-the-meta-learning-problem&lt;br /&gt;
* https://arxiv.org/pdf/1810.03548.pdf&lt;br /&gt;
* https://www.ml4aad.org/wp-content/uploads/2018/09/chapter2-metalearning.pdf&lt;br /&gt;
* https://openreview.net/pdf?id=rJY0-Kcll&lt;br /&gt;
* https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf&lt;br /&gt;
* Alexandros Kalousis and Melanie Hilario. Model selection via meta-learning: a comparative study. Intl Journ. on Artificial Intelligence Tools, 10(4):525–554, 2001.&lt;br /&gt;
* R ́emi Bardenet, M ́aty ́as Brendel, Bal ́azs K ́egl, and Michele Sebag. Collaborative hyperparameter tuning. In Proceedings of ICML 2013, pages 199–207, 2013&lt;br /&gt;
* L Todorovski and S Dzeroski. Experiments in meta-level learning with ILP. Lecture Notes in Computer Science, 1704:98–106, 1999.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69402</id>
		<title>Мета-обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69402"/>
				<updated>2019-01-25T23:13:56Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: Добавление категории&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;b&amp;gt;Мета-обучение&amp;lt;/b&amp;gt; {{---}} подход, позволяющий определять оптимальный алгоритм (иногда, вместе с параметрами к нему) для конкретной задачи. Основная идея мета-обучения {{---}} свести задачу выбора алгоритма к задаче обучения с учителем: задачи описываются мета-фичами. Мета-фича описывает свойство задачи {{---}} например, разрежен ли датасет или нет.&lt;br /&gt;
&lt;br /&gt;
От хорошей модели ожидается хорошая адаптируемость или генерализуемость новых задач и окружений, с которыми модель не сталкивалась во время обучения.&lt;br /&gt;
&lt;br /&gt;
Такими задачами являются:&lt;br /&gt;
* Классификатор, тренированный на изображениях собак и велосипедов, после некоторых показанных ему кошек, смог определить, есть ли на новой картинке кошка&lt;br /&gt;
* Игровой бот, способный быстро обучиться новой игре&lt;br /&gt;
* Робот, выполняющий задачу на пригорке во время теста даже если он тренировался на ровной поверхности&lt;br /&gt;
&lt;br /&gt;
Ограничения&lt;br /&gt;
- No free lunch teorem&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221997149_No_Free_Lunch_Theorems_for_Search Wolpert and Macready, 1996]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/228671734_Toward_a_justification_of_meta-learning_Is_the_no_free_lunch_theorem_a_show-stopper Giraud-Carrier and Provost, 2005]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Simple view&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошая модель мета-обучения должна быть обучена на множестве задач и оптимизирована для лучшей производительности на нескольких задачах,&lt;br /&gt;
включая такие, с которыми модель не сталкивалась ранее. Каждой задаче соответствует датасет $\mathcal{D}$, содержащий и векторы фичей и правильную разметку.&lt;br /&gt;
Оптимальные параметры модели:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* = \arg\min_\theta \mathbb{E}_{\mathcal{D}\sim p(\mathcal{D})} [\mathcal{L}_\theta(\mathcal{D})]&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Очень похоже на обычную задачу машинного обучения, только один датасет принимается за один сэмпл данных.&lt;br /&gt;
&lt;br /&gt;
Few-shot классификатор конкретизация мета-обучения в области обучения с учителем. Датасет $\mathcal{D}$ делится на две части: $\mathcal{D}=\langle S, B\rangle$,&lt;br /&gt;
train set $S$ и test set $B$. Часто принимается k-shot N-class задача - train set содержит $k$ размеченных примеров для каждого из $N$ классов.&lt;br /&gt;
Датасет $\mathcal{D}$ содержит пары фичей и меток, $\mathcal{D} = \{(\mathbf{x}_i, y_i)\}$ и каждая метка принадлежит известному множеству меток $\mathcal{L}$. Скажем, наш классификатор $f_θ$ с параметром $θ$ показывает вероятность принадлежности точки из данных к классу $y$ при векторе фичей $x$, $Pθ(y|x)$&lt;br /&gt;
Оптимальные параметры должны максимизировать вероятность верных меток среди нескольких training sets $B⊂\mathcal{D}$:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{(\mathbf{x}, y)\in \mathcal{D}}[P_\theta(y \vert \mathbf{x})] &amp;amp;\\&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{B\subset \mathcal{D}}[\sum_{(\mathbf{x}, y)\in B}P_\theta(y \vert \mathbf{x})] &amp;amp; \scriptstyle{\text{; trained with mini-batches.}}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
В few-shot классификации цель {{---}} уменьшить ошибку предсказания на неразмеченных данных с данным train set для &amp;quot;быстрого обучения&amp;quot;. Чтобы ускорить процесс обучения, сделаем следующее:&lt;br /&gt;
# возьмем подмножество меток, $L\subset\mathcal{L}$&lt;br /&gt;
# возьмем train set $S^L⊂D$ и train batch $B^L⊂D$. Оба содержат только данные с метками из подмножества с пункта 1:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
L, y \in L, \forall (x, y) \in S^L, B^L&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
# Множество $S^L$ подается на вход модели.&lt;br /&gt;
# Конечная оптимизация использует множество $B^L$ чтобы посчитать loss и обновить параметры модели через обратное распространение, так же, как это делается в обучении с учителем.&lt;br /&gt;
&lt;br /&gt;
Можно представить каждую пару сэмплированного датасета $(S^L,B^L)$ как одну точку. Модель обучается таким образом, чтобы она могла обобщиться до других датасетов.&lt;br /&gt;
Красным выделен дифф между обучением с учителем и мета-обучением.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta = \arg\max_\theta \color{red}{E_{L\subset\mathcal{L}}[} E_{\color{red}{S^L \subset\mathcal{D}, }B^L \subset\mathcal{D}} [\sum_{(x, y)\in B^L} P_\theta(x, y\color{red}{, S^L})] \color{red}{]}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Идея в некоторой степени аналогична использованию предварительно обученной модели в классификации изображений (ImageNet) или в языковом моделировании (большие текстовые корпуса), когда доступен только ограниченный набор образцов данных для конкретной задачи. Мета-обучение идет еще  на один шаг вперед, вместо того, чтобы подстраивать ее под одну задачу, она оптимизирует модель, чтобы она была хороша для многих задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Основанные на оптимизации&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Модели глубокого обучения (deep learning) обучаются через обратное распространение градиентов. Тем не менее, оптимизация, основанная на градиентах не разрабатывалась для работы с небольшим количеством обучающих семплов, и не сходится за малое число оптимизационных шагов. Подход в мета-обучении, основанный на оптимизации как раз про это.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;LSTM-meta-learner&amp;lt;/h3&amp;gt;&lt;br /&gt;
Оптимизационный алгоритм может быть явно смоделирован. Ravi &amp;amp; Larochelle (2017) это и сделали и назвали его &amp;quot;meta-learner&amp;quot;. Цель meta-learner'а - эффективно обновлять параметры learner'a используя небольшой train set так, чтобы learner мог быстро адаптироваться к новым задачам.&lt;br /&gt;
&lt;br /&gt;
Пусть модель ученика будет $M_θ$, параметризованной $θ$, и meta-learner как $R_Θ$ с параметром $θ$, и функция потерь $\mathcal{L}$.&lt;br /&gt;
&lt;br /&gt;
Обновление параметров learner'a во время $t$ c learning rate $\alpha_t$ (шаг градиентного спуска):&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta_t = \theta_{t-1} - \alpha_t \nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Обновление памяти ячейки LSTM выглядит так:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t = \theta_{t-1} - \alpha_t\nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
$c_t$ {{---}} параметры сети $\theta_t$, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ при $f_t$ = 1.&lt;br /&gt;
&lt;br /&gt;
$f_t$ = 1, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ - не оптимальные значения, их изменение может оказаться полезным, если вы попали в неудачный локальный минимум.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
f_t &amp;amp;= \sigma(\mathbf{W}_f \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, f_{t-1}] + \mathbf{b}_f) &amp;amp; \scriptstyle{\text{; как сильно мы забываем старые значения параметров.}}\\&lt;br /&gt;
i_t &amp;amp;= \sigma(\mathbf{W}_i \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, i_{t-1}] + \mathbf{b}_i) &amp;amp; \scriptstyle{\text{; соответствует рейту обучения на шаге t.}}\\&lt;br /&gt;
\tilde{\theta}_t &amp;amp;= -\nabla_{\theta_{t-1}}\mathcal{L}_t &amp;amp;\\&lt;br /&gt;
\theta_t &amp;amp;= f_t \odot \theta_{t-1} + i_t \odot \tilde{\theta}_t &amp;amp;\\&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
я ничего не понял..&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;REPTILE&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reptile {{---}} относительно простой алгоритм мета-обучения, похожий на MAML, например, тем, что оба используют мета-оптимизацию через градиентный спуск и оба не чувствительны к модели.&lt;br /&gt;
&lt;br /&gt;
# сэмплируем задачу&lt;br /&gt;
# тренируемся на ней несколькими шагами градиентного спуска&lt;br /&gt;
# сдвигаем веса модели к новым параметрам.&lt;br /&gt;
&lt;br /&gt;
$\text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$ выполняет стохастический градиентный спуск на $k$ шагов на лоссе $\mathcal{L}_{\tau_i}$, начиная с параметра $\theta$ и возвращает конечный вектор параметров. Градиент reptile определяется как $(\theta - W)/\alpha$, где $\alpha$ {{---}} размер шага, используемый функцией $SGD$.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// Algorithm REPTILE, batched version&amp;lt;/font&amp;gt;&lt;br /&gt;
  Initialize $\theta$&lt;br /&gt;
  '''for''' $iteration = 1, 2,...$ '''do'''&lt;br /&gt;
    Sample tasks $\tau_1, \tau_2, ..., \tau_n$&lt;br /&gt;
    '''for''' $i = 1, 2, ..., n$ '''do'''&lt;br /&gt;
      Compute $W_i = \text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$&lt;br /&gt;
    '''end for'''&lt;br /&gt;
    Update $\theta \leftarrow \theta + \beta 1/n \sum (W_i - \theta)$&lt;br /&gt;
  '''end for'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Определение множества конфигураций&amp;lt;/h2&amp;gt;&lt;br /&gt;
Предшествующие вычисления могут быть также использованы для изучения пространства более успешных конфигураций \theta\star. Более подходящие под задачу конфигурации могут серьезно ускорить поиск оптимальных моделей, это важно при ограниченных вычислительных рессурсах.&lt;br /&gt;
&lt;br /&gt;
Альтернативный подход сперва узнать оптимальные гиперпараметры, а потом через приращение производительности определить важность каждого из гиперпараметров. Это и было сделано в лабе OpenML, провели около 500 000 экспериментов на 6 алгоритмах и 38 датасетах. Стандартные значения изучались вместе для всех гиперпараметров алгоритма посредством обучения суррогатных моделей для этого алгоритма на большом числе задач. После того, как уже проверены многие варианты конфигураций, выбирается такая, которая минимизирует ??? для всех задач, становится стандартной.Далее определяется важность каждого из гиперпараметров. Чем больше меняется приращение производительности, тем более важный гиперпараметр мы изменяем.&lt;br /&gt;
&lt;br /&gt;
Если мы хотим предоставить рекомендации для конкретной задачи $t_{new}$, нам нужна дополнительная информация о том, насколько $t_{new}$ похожа на предыдущие задачи $t_j$. Первый способ {{---}} посчитать число рекомендованных конфигураций для $t_new$, yielding новый эвиденс $\mathbf{P}_{new}$. Если позже мы будем наблюдать, что вычисления $P_{i,new}$ соответствуют $P_{i, j}$, то $t_{j}$ и $t_{new}$ могут быть очень похожими. Мы можем применить это знания для обучения meta-learner'a который предсказывает множество рекомендуемых конфигураций $\Theta^{*}_{new}$ for $t_{new}$.&lt;br /&gt;
Более того, можно пойти дальше и добавить $\Theta^{*}_{new}$ в $P_new$ и перейти к следующей итерации и выяснять какие еще задачи схожи друг с другом.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Relative landmarks&amp;lt;/h3&amp;gt;&lt;br /&gt;
Первая мера для вычисления &amp;quot;похожести&amp;quot; задач вычисляла попарно разницу в производительности, так же называемую &amp;quot;relative landmarks&amp;quot; $RL_{a,b,j} = P_{a,j} - P_{b,j}$ между двумя конфигурациями $\theta_{a}$ и $\theta_{b}$ на конкретной задаче $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Суррогатные модели&amp;lt;/h3&amp;gt;&lt;br /&gt;
Более гибкий способ передать информацию {{---}} построить суррогатную модель $s_{j}(\theta_{i}) = P_{i,j}$ для всех предшествующих задач $t_{j}$, обученную с использованием всех доступных $\mathbf{P}$. Можно определить &amp;quot;похожесть&amp;quot; задач в терминах ошибок между $s_{j}(\theta_{i})$ и $P_{i,new}$: если суррогатная модель для $t_{j}$ может генерировать точные предсказания для $t_{new}$, тогда такие задачи весьма похожи. Обычно это делается в комбинации с Байесовской оптимизацией для определения следующей $\theta_{i}$.&lt;br /&gt;
&lt;br /&gt;
Так же можно обучать суррогатные модели на Гауссовских процессах (GP) для каждой предыдущей задачи и еще одну для $t_{new}$ и объединить их во взвешенную и нормализованную сумму, с медианой $\mu$ определенной как взвшенная сумма $\mu_{j}$ полученных из задач $t_{j}$. Веса $\mu_{j}$ считаются через Nadaraya-Watson kernel-weighted average, где каждая задача представлена вектором relative landmarks и Epanechnikov quadratic kernel используется для определения похожести между векторами relative landmarks для $t_{j}$ и $t_{new}$. Чем больше $t_{j}$ похожа на  $t_{new}$, тем больше получится вес $s_{j}$, увеличивающий влияние суррогатной модели для $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
Суррогатные модели обучаются только на $P_{i, new}$, а следующий $\theta_{i}$ получается путем нахождения средневзвешенного expected improvement $P_{i, new}$ и предсказанных улучшений на всех предшествующих $P_{i, j}$.&lt;br /&gt;
Веса предшествующих задач могут быть переопределены через точность суррогатной модели или через relative landmarks.&lt;br /&gt;
Вес ожидаемого улучшения (expected improvement) постепенно возрастает с каждой итерацией (с увеличением собранного эвиденса $P_{i, new}$).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Обучение на свойствах задачи (learning on task properties)&amp;lt;/h3&amp;gt;&lt;br /&gt;
Каждая задача $t_{j} \in T$ может быть описана вектором $m(t_j) = (m_{j,1}, ...,m_{j,K})$ из $K$ мета-фичей $m_{j, k} \in M$ $M$ {{---}} множество мета-фичей. Можно определить меру &amp;quot;похожести&amp;quot; задач, основанную, например, на Евклидовом расстоянии между $m(t_i)$ и $m(t_j)$, тогда можно будет использовать информацию из наиболее похожей задачи на новую задачу $t_{new}$. Более того, используя предшествующие вычисления $\textbf{P}$ можно обучить meta-learner'a $L$ предсказывать производительность $P_{i, new}$ конфигураций $\theta_{i}$ на новых задачах $t_{new}$.&lt;br /&gt;
&lt;br /&gt;
$L: \Theta \times M \rightarrow \textbf{P}$&lt;br /&gt;
&lt;br /&gt;
В таблице представлен обзор наиболее используемых мета-фичей.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Meta-feature&lt;br /&gt;
|-&lt;br /&gt;
! '''Name''' !! '''Formula''' !! '''Rationale''' !! '''Variants'''&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''simple'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr instances || $n$ || Speed, Scalability \citep{Michie1994} || $p/n$, $log(n)$, log(n/p)&lt;br /&gt;
|-&lt;br /&gt;
| Nr features || $p$ || Curse of dimensionality \citep{Michie1994} || $log(p)$, % categorical&lt;br /&gt;
|-&lt;br /&gt;
| Nr classes || $c$ || Complexity, imbalance \citep{Michie1994} || ratio min/maj class&lt;br /&gt;
|-&lt;br /&gt;
| Nr missing values || $m$ || Imputation effects \citep{kalousis02} || % missing&lt;br /&gt;
|-&lt;br /&gt;
| Nr outliers || $o$ || Data noisiness \citep{Rousseeuw2011} || $o/n$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''statistical'''&lt;br /&gt;
|-&lt;br /&gt;
| Skewness || $\frac{E(X-\mu_{X})^{3}}{\sigma_{X}^{3}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Kurtosis || $\frac{E(X-\mu_{X})^{4}}{\sigma_{X}^{4}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Correlation || $\rho_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$\rho_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Covariance || $cov_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$cov_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Concentration || $\tau_{X_{1}X_{2}}$ || Feature interdependence \citep{Kalousis2001a} || min,max,$\mu$,$\sigma$,$\tau_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Sparsity || sparsity(X) || Degree of discreteness \citep{Salama2013} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Gravity || gravity(X) || Inter-class dispersion \citep{Ali2006} ||&lt;br /&gt;
|-&lt;br /&gt;
| ANOVA p-value || $p_{val_{\texttt{X}_{1}X_{2}}}$ || Feature redundancy \citep{kalousis02} || $p_{val_{XY}}$\citep{soares+04}&lt;br /&gt;
|-&lt;br /&gt;
| Coeff. of variation || $\frac{\sigma_{Y}}{\mu_{Y}}$ || Variation in target \citep{soares+04} ||&lt;br /&gt;
|-&lt;br /&gt;
| PCA $\rho_{\lambda_{1}}$ || $\sqrt{\frac{\lambda_{1}}{1+\lambda_{1}}}$ || Variance in first PC \citep{Michie1994} || $\frac{\lambda_{1}}{\sum_{i} \lambda_{i}}$\citep{Michie1994}&lt;br /&gt;
|-&lt;br /&gt;
| PCA skewness || || Skewness of first PC \citep{feurer2014using} || PCA kurtosis&lt;br /&gt;
|-&lt;br /&gt;
| PCA 95\% || $\frac{dim_{95\% var}}{p}$ || Intrinsic dimensionality \citep{bardenet2013collaborative} ||&lt;br /&gt;
|-&lt;br /&gt;
| Class probability || $P(\texttt{C})$ || Class distribution \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''informational-theoretic'''&lt;br /&gt;
|-&lt;br /&gt;
| Class entropy  || $H(\texttt{C})$ || Class imbalance \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Norm. entropy || $\frac{H(\texttt{X})}{log_{2}n}$ || Feature informativeness \citep{Castiello2005} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Mutual inform. || $MI(\texttt{C},\texttt{X})$ || Feature importance \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Uncertainty coeff. || $\frac{MI(\texttt{C},\texttt{X})}{H(\texttt{C})}$ || Feature importance \citep{Agresti:2002p7509} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Equiv. nr. feats || $\frac{H(C)}{\overline{MI(C,X)}}$ || Intrinsic dimensionality \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Noise-signal ratio || $\frac{\overline{H(X)}-\overline{MI(C,X)}}{\overline{MI(C,X)}}$ || Noisiness of data \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''complexity'''&lt;br /&gt;
|-&lt;br /&gt;
| Fisher's discrimin. || $\frac{(\mu_{c1}-\mu_{c2})^{2}}{\sigma_{c1}^{2}-\sigma_{c2}^{2}}$ || Separability classes $c_{1},c_{2}$ \citep{Ho:2002} || See \citet{}{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Volume of overlap || || Class distribution overlap \citep{Ho:2002} || See \citet{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Concept variation || || Task complexity \citep{Vilalta:2002p5805} || See \citet{Vilalta:1999p5745}&lt;br /&gt;
|-&lt;br /&gt;
| Data consistency || || Data quality \citep{Kopf:2002p5864} || See \citet{Kopf:2002p5864}&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''model-based'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr nodes, leaves || &amp;lt;tex&amp;gt;|\eta|,|\psi|&amp;lt;/tex&amp;gt; || Concept complexity \citep{Peng:2002p705} || Tree depth&lt;br /&gt;
|-&lt;br /&gt;
| Branch length || || Concept complexity \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Nodes per feature || &amp;lt;tex&amp;gt;|\eta_{X}|&amp;lt;/tex&amp;gt; || Feature importance \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves per class || &amp;lt;tex&amp;gt;\frac{|\psi_{c}|}{|\psi|}&amp;lt;/tex&amp;gt; ||  Class complexity \citep{Filchenkov2015} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves agreement || &amp;lt;tex&amp;gt;\frac{n_{\psi_{i}}}{n}&amp;lt;/tex&amp;gt; ||  Class separability \citep{Bensusan2000} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Information gain || || Feature importance \citep{Bensusan2000} || min,max,$\mu$,$\sigma$, gini&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''landmarks'''&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(1NN) || $P(\theta_{1NN},t_{j})$ || Data sparsity \citep{Pfahringer:2000p553} || See \citet{Pfahringer:2000p553}&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Tree) || $P(\theta_{Tree},t_{j})$ || Data separability \citep{Pfahringer:2000p553} || Stump,RandomTree&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Lin) || $P(\theta_{Lin},t_{j})$ || Linear separability \citep{Pfahringer:2000p553} || Lin.Disciminant&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(NB) || $P(\theta_{NB},t_{j})$ || Feature independence \citep{Pfahringer:2000p553} || See \citet{Ler:2005p1680}&lt;br /&gt;
|-&lt;br /&gt;
| Relative LM || $P_{a,j} - P_{b,j}$ || Probing performance \citep{Furnkranz:2001p1278} ||&lt;br /&gt;
|-&lt;br /&gt;
| Subsample LM || $P(\theta_{i},t_{j},s_{t})$ || Probing performance \citep{Soares:2001p708} ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Непрерывные фичи $X$ и таргет $Y$ имеют медиану $\mu_{X}$, stdev $\sigma_{X}$, variance $\sigma^{2}_{X}$. Категориальные фичи $\texttt{X}$ и класс $\texttt{C}$ имеют категориальные значения  $\pi_{i}$, условные вероятности $\pi_{i|j}$, совместные вероятности $\pi_{i,j}$, предельные вероятности $\pi_{i+}=\sum_{j}\pi_{ij}$, энтропию $H(\texttt{X})=-\sum_{i}\pi_{i+}log_{2}(\pi_{i+})$.&lt;br /&gt;
&lt;br /&gt;
Многие мета-фичи вычисляются по одиночным фичам или комбинации фичей, и должны быть агрегированы через min,max,$\mu$,$\sigma$,quartiles или гистограммами [kalousis]&lt;br /&gt;
&lt;br /&gt;
Во время вычисления похожести задач важно нормализовать все мета-фичи [bardnet], использовать feature selection [todorovski] или использовать dimensionality reduction (PCA, например).&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html#define-the-meta-learning-problem&lt;br /&gt;
* https://arxiv.org/pdf/1810.03548.pdf&lt;br /&gt;
* https://www.ml4aad.org/wp-content/uploads/2018/09/chapter2-metalearning.pdf&lt;br /&gt;
* https://openreview.net/pdf?id=rJY0-Kcll&lt;br /&gt;
* https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf&lt;br /&gt;
* Alexandros Kalousis and Melanie Hilario. Model selection via meta-learning: a comparative study. Intl Journ. on Artificial Intelligence Tools, 10(4):525–554, 2001.&lt;br /&gt;
* R ́emi Bardenet, M ́aty ́as Brendel, Bal ́azs K ́egl, and Michele Sebag. Collaborative hyperparameter tuning. In Proceedings of ICML 2013, pages 199–207, 2013&lt;br /&gt;
* L Todorovski and S Dzeroski. Experiments in meta-level learning with ILP. Lecture Notes in Computer Science, 1704:98–106, 1999.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69400</id>
		<title>Мета-обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69400"/>
				<updated>2019-01-25T23:13:18Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: Замена текстовых ссылок на сноски&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;b&amp;gt;Мета-обучение&amp;lt;/b&amp;gt; {{---}} подход, позволяющий определять оптимальный алгоритм (иногда, вместе с параметрами к нему) для конкретной задачи. Основная идея мета-обучения {{---}} свести задачу выбора алгоритма к задаче обучения с учителем: задачи описываются мета-фичами. Мета-фича описывает свойство задачи {{---}} например, разрежен ли датасет или нет.&lt;br /&gt;
&lt;br /&gt;
От хорошей модели ожидается хорошая адаптируемость или генерализуемость новых задач и окружений, с которыми модель не сталкивалась во время обучения.&lt;br /&gt;
&lt;br /&gt;
Такими задачами являются:&lt;br /&gt;
* Классификатор, тренированный на изображениях собак и велосипедов, после некоторых показанных ему кошек, смог определить, есть ли на новой картинке кошка&lt;br /&gt;
* Игровой бот, способный быстро обучиться новой игре&lt;br /&gt;
* Робот, выполняющий задачу на пригорке во время теста даже если он тренировался на ровной поверхности&lt;br /&gt;
&lt;br /&gt;
Ограничения&lt;br /&gt;
- No free lunch teorem&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/221997149_No_Free_Lunch_Theorems_for_Search Wolpert and Macready, 1996]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://www.researchgate.net/publication/228671734_Toward_a_justification_of_meta-learning_Is_the_no_free_lunch_theorem_a_show-stopper Giraud-Carrier and Provost, 2005]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Simple view&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошая модель мета-обучения должна быть обучена на множестве задач и оптимизирована для лучшей производительности на нескольких задачах,&lt;br /&gt;
включая такие, с которыми модель не сталкивалась ранее. Каждой задаче соответствует датасет $\mathcal{D}$, содержащий и векторы фичей и правильную разметку.&lt;br /&gt;
Оптимальные параметры модели:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* = \arg\min_\theta \mathbb{E}_{\mathcal{D}\sim p(\mathcal{D})} [\mathcal{L}_\theta(\mathcal{D})]&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Очень похоже на обычную задачу машинного обучения, только один датасет принимается за один сэмпл данных.&lt;br /&gt;
&lt;br /&gt;
Few-shot классификатор конкретизация мета-обучения в области обучения с учителем. Датасет $\mathcal{D}$ делится на две части: $\mathcal{D}=\langle S, B\rangle$,&lt;br /&gt;
train set $S$ и test set $B$. Часто принимается k-shot N-class задача - train set содержит $k$ размеченных примеров для каждого из $N$ классов.&lt;br /&gt;
Датасет $\mathcal{D}$ содержит пары фичей и меток, $\mathcal{D} = \{(\mathbf{x}_i, y_i)\}$ и каждая метка принадлежит известному множеству меток $\mathcal{L}$. Скажем, наш классификатор $f_θ$ с параметром $θ$ показывает вероятность принадлежности точки из данных к классу $y$ при векторе фичей $x$, $Pθ(y|x)$&lt;br /&gt;
Оптимальные параметры должны максимизировать вероятность верных меток среди нескольких training sets $B⊂\mathcal{D}$:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{(\mathbf{x}, y)\in \mathcal{D}}[P_\theta(y \vert \mathbf{x})] &amp;amp;\\&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{B\subset \mathcal{D}}[\sum_{(\mathbf{x}, y)\in B}P_\theta(y \vert \mathbf{x})] &amp;amp; \scriptstyle{\text{; trained with mini-batches.}}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
В few-shot классификации цель {{---}} уменьшить ошибку предсказания на неразмеченных данных с данным train set для &amp;quot;быстрого обучения&amp;quot;. Чтобы ускорить процесс обучения, сделаем следующее:&lt;br /&gt;
# возьмем подмножество меток, $L\subset\mathcal{L}$&lt;br /&gt;
# возьмем train set $S^L⊂D$ и train batch $B^L⊂D$. Оба содержат только данные с метками из подмножества с пункта 1:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
L, y \in L, \forall (x, y) \in S^L, B^L&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
# Множество $S^L$ подается на вход модели.&lt;br /&gt;
# Конечная оптимизация использует множество $B^L$ чтобы посчитать loss и обновить параметры модели через обратное распространение, так же, как это делается в обучении с учителем.&lt;br /&gt;
&lt;br /&gt;
Можно представить каждую пару сэмплированного датасета $(S^L,B^L)$ как одну точку. Модель обучается таким образом, чтобы она могла обобщиться до других датасетов.&lt;br /&gt;
Красным выделен дифф между обучением с учителем и мета-обучением.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta = \arg\max_\theta \color{red}{E_{L\subset\mathcal{L}}[} E_{\color{red}{S^L \subset\mathcal{D}, }B^L \subset\mathcal{D}} [\sum_{(x, y)\in B^L} P_\theta(x, y\color{red}{, S^L})] \color{red}{]}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Идея в некоторой степени аналогична использованию предварительно обученной модели в классификации изображений (ImageNet) или в языковом моделировании (большие текстовые корпуса), когда доступен только ограниченный набор образцов данных для конкретной задачи. Мета-обучение идет еще  на один шаг вперед, вместо того, чтобы подстраивать ее под одну задачу, она оптимизирует модель, чтобы она была хороша для многих задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Основанные на оптимизации&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Модели глубокого обучения (deep learning) обучаются через обратное распространение градиентов. Тем не менее, оптимизация, основанная на градиентах не разрабатывалась для работы с небольшим количеством обучающих семплов, и не сходится за малое число оптимизационных шагов. Подход в мета-обучении, основанный на оптимизации как раз про это.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;LSTM-meta-learner&amp;lt;/h3&amp;gt;&lt;br /&gt;
Оптимизационный алгоритм может быть явно смоделирован. Ravi &amp;amp; Larochelle (2017) это и сделали и назвали его &amp;quot;meta-learner&amp;quot;. Цель meta-learner'а - эффективно обновлять параметры learner'a используя небольшой train set так, чтобы learner мог быстро адаптироваться к новым задачам.&lt;br /&gt;
&lt;br /&gt;
Пусть модель ученика будет $M_θ$, параметризованной $θ$, и meta-learner как $R_Θ$ с параметром $θ$, и функция потерь $\mathcal{L}$.&lt;br /&gt;
&lt;br /&gt;
Обновление параметров learner'a во время $t$ c learning rate $\alpha_t$ (шаг градиентного спуска):&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta_t = \theta_{t-1} - \alpha_t \nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Обновление памяти ячейки LSTM выглядит так:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t = \theta_{t-1} - \alpha_t\nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
$c_t$ {{---}} параметры сети $\theta_t$, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ при $f_t$ = 1.&lt;br /&gt;
&lt;br /&gt;
$f_t$ = 1, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ - не оптимальные значения, их изменение может оказаться полезным, если вы попали в неудачный локальный минимум.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
f_t &amp;amp;= \sigma(\mathbf{W}_f \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, f_{t-1}] + \mathbf{b}_f) &amp;amp; \scriptstyle{\text{; как сильно мы забываем старые значения параметров.}}\\&lt;br /&gt;
i_t &amp;amp;= \sigma(\mathbf{W}_i \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, i_{t-1}] + \mathbf{b}_i) &amp;amp; \scriptstyle{\text{; соответствует рейту обучения на шаге t.}}\\&lt;br /&gt;
\tilde{\theta}_t &amp;amp;= -\nabla_{\theta_{t-1}}\mathcal{L}_t &amp;amp;\\&lt;br /&gt;
\theta_t &amp;amp;= f_t \odot \theta_{t-1} + i_t \odot \tilde{\theta}_t &amp;amp;\\&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
я ничего не понял..&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;REPTILE&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reptile {{---}} относительно простой алгоритм мета-обучения, похожий на MAML, например, тем, что оба используют мета-оптимизацию через градиентный спуск и оба не чувствительны к модели.&lt;br /&gt;
&lt;br /&gt;
# сэмплируем задачу&lt;br /&gt;
# тренируемся на ней несколькими шагами градиентного спуска&lt;br /&gt;
# сдвигаем веса модели к новым параметрам.&lt;br /&gt;
&lt;br /&gt;
$\text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$ выполняет стохастический градиентный спуск на $k$ шагов на лоссе $\mathcal{L}_{\tau_i}$, начиная с параметра $\theta$ и возвращает конечный вектор параметров. Градиент reptile определяется как $(\theta - W)/\alpha$, где $\alpha$ {{---}} размер шага, используемый функцией $SGD$.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// Algorithm REPTILE, batched version&amp;lt;/font&amp;gt;&lt;br /&gt;
  Initialize $\theta$&lt;br /&gt;
  '''for''' $iteration = 1, 2,...$ '''do'''&lt;br /&gt;
    Sample tasks $\tau_1, \tau_2, ..., \tau_n$&lt;br /&gt;
    '''for''' $i = 1, 2, ..., n$ '''do'''&lt;br /&gt;
      Compute $W_i = \text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$&lt;br /&gt;
    '''end for'''&lt;br /&gt;
    Update $\theta \leftarrow \theta + \beta 1/n \sum (W_i - \theta)$&lt;br /&gt;
  '''end for'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Определение множества конфигураций&amp;lt;/h2&amp;gt;&lt;br /&gt;
Предшествующие вычисления могут быть также использованы для изучения пространства более успешных конфигураций \theta\star. Более подходящие под задачу конфигурации могут серьезно ускорить поиск оптимальных моделей, это важно при ограниченных вычислительных рессурсах.&lt;br /&gt;
&lt;br /&gt;
Альтернативный подход сперва узнать оптимальные гиперпараметры, а потом через приращение производительности определить важность каждого из гиперпараметров. Это и было сделано в лабе OpenML, провели около 500 000 экспериментов на 6 алгоритмах и 38 датасетах. Стандартные значения изучались вместе для всех гиперпараметров алгоритма посредством обучения суррогатных моделей для этого алгоритма на большом числе задач. После того, как уже проверены многие варианты конфигураций, выбирается такая, которая минимизирует ??? для всех задач, становится стандартной.Далее определяется важность каждого из гиперпараметров. Чем больше меняется приращение производительности, тем более важный гиперпараметр мы изменяем.&lt;br /&gt;
&lt;br /&gt;
Если мы хотим предоставить рекомендации для конкретной задачи $t_{new}$, нам нужна дополнительная информация о том, насколько $t_{new}$ похожа на предыдущие задачи $t_j$. Первый способ {{---}} посчитать число рекомендованных конфигураций для $t_new$, yielding новый эвиденс $\mathbf{P}_{new}$. Если позже мы будем наблюдать, что вычисления $P_{i,new}$ соответствуют $P_{i, j}$, то $t_{j}$ и $t_{new}$ могут быть очень похожими. Мы можем применить это знания для обучения meta-learner'a который предсказывает множество рекомендуемых конфигураций $\Theta^{*}_{new}$ for $t_{new}$.&lt;br /&gt;
Более того, можно пойти дальше и добавить $\Theta^{*}_{new}$ в $P_new$ и перейти к следующей итерации и выяснять какие еще задачи схожи друг с другом.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Relative landmarks&amp;lt;/h3&amp;gt;&lt;br /&gt;
Первая мера для вычисления &amp;quot;похожести&amp;quot; задач вычисляла попарно разницу в производительности, так же называемую &amp;quot;relative landmarks&amp;quot; $RL_{a,b,j} = P_{a,j} - P_{b,j}$ между двумя конфигурациями $\theta_{a}$ и $\theta_{b}$ на конкретной задаче $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Суррогатные модели&amp;lt;/h3&amp;gt;&lt;br /&gt;
Более гибкий способ передать информацию {{---}} построить суррогатную модель $s_{j}(\theta_{i}) = P_{i,j}$ для всех предшествующих задач $t_{j}$, обученную с использованием всех доступных $\mathbf{P}$. Можно определить &amp;quot;похожесть&amp;quot; задач в терминах ошибок между $s_{j}(\theta_{i})$ и $P_{i,new}$: если суррогатная модель для $t_{j}$ может генерировать точные предсказания для $t_{new}$, тогда такие задачи весьма похожи. Обычно это делается в комбинации с Байесовской оптимизацией для определения следующей $\theta_{i}$.&lt;br /&gt;
&lt;br /&gt;
Так же можно обучать суррогатные модели на Гауссовских процессах (GP) для каждой предыдущей задачи и еще одну для $t_{new}$ и объединить их во взвешенную и нормализованную сумму, с медианой $\mu$ определенной как взвшенная сумма $\mu_{j}$ полученных из задач $t_{j}$. Веса $\mu_{j}$ считаются через Nadaraya-Watson kernel-weighted average, где каждая задача представлена вектором relative landmarks и Epanechnikov quadratic kernel используется для определения похожести между векторами relative landmarks для $t_{j}$ и $t_{new}$. Чем больше $t_{j}$ похожа на  $t_{new}$, тем больше получится вес $s_{j}$, увеличивающий влияние суррогатной модели для $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
Суррогатные модели обучаются только на $P_{i, new}$, а следующий $\theta_{i}$ получается путем нахождения средневзвешенного expected improvement $P_{i, new}$ и предсказанных улучшений на всех предшествующих $P_{i, j}$.&lt;br /&gt;
Веса предшествующих задач могут быть переопределены через точность суррогатной модели или через relative landmarks.&lt;br /&gt;
Вес ожидаемого улучшения (expected improvement) постепенно возрастает с каждой итерацией (с увеличением собранного эвиденса $P_{i, new}$).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Обучение на свойствах задачи (learning on task properties)&amp;lt;/h3&amp;gt;&lt;br /&gt;
Каждая задача $t_{j} \in T$ может быть описана вектором $m(t_j) = (m_{j,1}, ...,m_{j,K})$ из $K$ мета-фичей $m_{j, k} \in M$ $M$ {{---}} множество мета-фичей. Можно определить меру &amp;quot;похожести&amp;quot; задач, основанную, например, на Евклидовом расстоянии между $m(t_i)$ и $m(t_j)$, тогда можно будет использовать информацию из наиболее похожей задачи на новую задачу $t_{new}$. Более того, используя предшествующие вычисления $\textbf{P}$ можно обучить meta-learner'a $L$ предсказывать производительность $P_{i, new}$ конфигураций $\theta_{i}$ на новых задачах $t_{new}$.&lt;br /&gt;
&lt;br /&gt;
$L: \Theta \times M \rightarrow \textbf{P}$&lt;br /&gt;
&lt;br /&gt;
В таблице представлен обзор наиболее используемых мета-фичей.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Meta-feature&lt;br /&gt;
|-&lt;br /&gt;
! '''Name''' !! '''Formula''' !! '''Rationale''' !! '''Variants'''&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''simple'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr instances || $n$ || Speed, Scalability \citep{Michie1994} || $p/n$, $log(n)$, log(n/p)&lt;br /&gt;
|-&lt;br /&gt;
| Nr features || $p$ || Curse of dimensionality \citep{Michie1994} || $log(p)$, % categorical&lt;br /&gt;
|-&lt;br /&gt;
| Nr classes || $c$ || Complexity, imbalance \citep{Michie1994} || ratio min/maj class&lt;br /&gt;
|-&lt;br /&gt;
| Nr missing values || $m$ || Imputation effects \citep{kalousis02} || % missing&lt;br /&gt;
|-&lt;br /&gt;
| Nr outliers || $o$ || Data noisiness \citep{Rousseeuw2011} || $o/n$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''statistical'''&lt;br /&gt;
|-&lt;br /&gt;
| Skewness || $\frac{E(X-\mu_{X})^{3}}{\sigma_{X}^{3}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Kurtosis || $\frac{E(X-\mu_{X})^{4}}{\sigma_{X}^{4}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Correlation || $\rho_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$\rho_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Covariance || $cov_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$cov_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Concentration || $\tau_{X_{1}X_{2}}$ || Feature interdependence \citep{Kalousis2001a} || min,max,$\mu$,$\sigma$,$\tau_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Sparsity || sparsity(X) || Degree of discreteness \citep{Salama2013} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Gravity || gravity(X) || Inter-class dispersion \citep{Ali2006} ||&lt;br /&gt;
|-&lt;br /&gt;
| ANOVA p-value || $p_{val_{\texttt{X}_{1}X_{2}}}$ || Feature redundancy \citep{kalousis02} || $p_{val_{XY}}$\citep{soares+04}&lt;br /&gt;
|-&lt;br /&gt;
| Coeff. of variation || $\frac{\sigma_{Y}}{\mu_{Y}}$ || Variation in target \citep{soares+04} ||&lt;br /&gt;
|-&lt;br /&gt;
| PCA $\rho_{\lambda_{1}}$ || $\sqrt{\frac{\lambda_{1}}{1+\lambda_{1}}}$ || Variance in first PC \citep{Michie1994} || $\frac{\lambda_{1}}{\sum_{i} \lambda_{i}}$\citep{Michie1994}&lt;br /&gt;
|-&lt;br /&gt;
| PCA skewness || || Skewness of first PC \citep{feurer2014using} || PCA kurtosis&lt;br /&gt;
|-&lt;br /&gt;
| PCA 95\% || $\frac{dim_{95\% var}}{p}$ || Intrinsic dimensionality \citep{bardenet2013collaborative} ||&lt;br /&gt;
|-&lt;br /&gt;
| Class probability || $P(\texttt{C})$ || Class distribution \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''informational-theoretic'''&lt;br /&gt;
|-&lt;br /&gt;
| Class entropy  || $H(\texttt{C})$ || Class imbalance \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Norm. entropy || $\frac{H(\texttt{X})}{log_{2}n}$ || Feature informativeness \citep{Castiello2005} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Mutual inform. || $MI(\texttt{C},\texttt{X})$ || Feature importance \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Uncertainty coeff. || $\frac{MI(\texttt{C},\texttt{X})}{H(\texttt{C})}$ || Feature importance \citep{Agresti:2002p7509} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Equiv. nr. feats || $\frac{H(C)}{\overline{MI(C,X)}}$ || Intrinsic dimensionality \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Noise-signal ratio || $\frac{\overline{H(X)}-\overline{MI(C,X)}}{\overline{MI(C,X)}}$ || Noisiness of data \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''complexity'''&lt;br /&gt;
|-&lt;br /&gt;
| Fisher's discrimin. || $\frac{(\mu_{c1}-\mu_{c2})^{2}}{\sigma_{c1}^{2}-\sigma_{c2}^{2}}$ || Separability classes $c_{1},c_{2}$ \citep{Ho:2002} || See \citet{}{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Volume of overlap || || Class distribution overlap \citep{Ho:2002} || See \citet{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Concept variation || || Task complexity \citep{Vilalta:2002p5805} || See \citet{Vilalta:1999p5745}&lt;br /&gt;
|-&lt;br /&gt;
| Data consistency || || Data quality \citep{Kopf:2002p5864} || See \citet{Kopf:2002p5864}&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''model-based'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr nodes, leaves || &amp;lt;tex&amp;gt;|\eta|,|\psi|&amp;lt;/tex&amp;gt; || Concept complexity \citep{Peng:2002p705} || Tree depth&lt;br /&gt;
|-&lt;br /&gt;
| Branch length || || Concept complexity \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Nodes per feature || &amp;lt;tex&amp;gt;|\eta_{X}|&amp;lt;/tex&amp;gt; || Feature importance \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves per class || &amp;lt;tex&amp;gt;\frac{|\psi_{c}|}{|\psi|}&amp;lt;/tex&amp;gt; ||  Class complexity \citep{Filchenkov2015} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves agreement || &amp;lt;tex&amp;gt;\frac{n_{\psi_{i}}}{n}&amp;lt;/tex&amp;gt; ||  Class separability \citep{Bensusan2000} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Information gain || || Feature importance \citep{Bensusan2000} || min,max,$\mu$,$\sigma$, gini&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''landmarks'''&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(1NN) || $P(\theta_{1NN},t_{j})$ || Data sparsity \citep{Pfahringer:2000p553} || See \citet{Pfahringer:2000p553}&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Tree) || $P(\theta_{Tree},t_{j})$ || Data separability \citep{Pfahringer:2000p553} || Stump,RandomTree&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Lin) || $P(\theta_{Lin},t_{j})$ || Linear separability \citep{Pfahringer:2000p553} || Lin.Disciminant&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(NB) || $P(\theta_{NB},t_{j})$ || Feature independence \citep{Pfahringer:2000p553} || See \citet{Ler:2005p1680}&lt;br /&gt;
|-&lt;br /&gt;
| Relative LM || $P_{a,j} - P_{b,j}$ || Probing performance \citep{Furnkranz:2001p1278} ||&lt;br /&gt;
|-&lt;br /&gt;
| Subsample LM || $P(\theta_{i},t_{j},s_{t})$ || Probing performance \citep{Soares:2001p708} ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Непрерывные фичи $X$ и таргет $Y$ имеют медиану $\mu_{X}$, stdev $\sigma_{X}$, variance $\sigma^{2}_{X}$. Категориальные фичи $\texttt{X}$ и класс $\texttt{C}$ имеют категориальные значения  $\pi_{i}$, условные вероятности $\pi_{i|j}$, совместные вероятности $\pi_{i,j}$, предельные вероятности $\pi_{i+}=\sum_{j}\pi_{ij}$, энтропию $H(\texttt{X})=-\sum_{i}\pi_{i+}log_{2}(\pi_{i+})$.&lt;br /&gt;
&lt;br /&gt;
Многие мета-фичи вычисляются по одиночным фичам или комбинации фичей, и должны быть агрегированы через min,max,$\mu$,$\sigma$,quartiles или гистограммами [kalousis]&lt;br /&gt;
&lt;br /&gt;
Во время вычисления похожести задач важно нормализовать все мета-фичи [bardnet], использовать feature selection [todorovski] или использовать dimensionality reduction (PCA, например).&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html#define-the-meta-learning-problem&lt;br /&gt;
* https://arxiv.org/pdf/1810.03548.pdf&lt;br /&gt;
* https://www.ml4aad.org/wp-content/uploads/2018/09/chapter2-metalearning.pdf&lt;br /&gt;
* https://openreview.net/pdf?id=rJY0-Kcll&lt;br /&gt;
* https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf&lt;br /&gt;
* Alexandros Kalousis and Melanie Hilario. Model selection via meta-learning: a comparative study. Intl Journ. on Artificial Intelligence Tools, 10(4):525–554, 2001.&lt;br /&gt;
* R ́emi Bardenet, M ́aty ́as Brendel, Bal ́azs K ́egl, and Michele Sebag. Collaborative hyperparameter tuning. In Proceedings of ICML 2013, pages 199–207, 2013&lt;br /&gt;
* L Todorovski and S Dzeroski. Experiments in meta-level learning with ILP. Lecture Notes in Computer Science, 1704:98–106, 1999.&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69398</id>
		<title>Мета-обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69398"/>
				<updated>2019-01-25T23:08:16Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: Исправление опечаток&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;b&amp;gt;Мета-обучение&amp;lt;/b&amp;gt; {{---}} подход, позволяющий определять оптимальный алгоритм (иногда, вместе с параметрами к нему) для конкретной задачи. Основная идея мета-обучения {{---}} свести задачу выбора алгоритма к задаче обучения с учителем: задачи описываются мета-фичами. Мета-фича описывает свойство задачи {{---}} например, разрежен ли датасет или нет.&lt;br /&gt;
&lt;br /&gt;
От хорошей модели ожидается хорошая адаптируемость или генерализуемость новых задач и окружений, с которыми модель не сталкивалась во время обучения.&lt;br /&gt;
&lt;br /&gt;
Такими задачами являются:&lt;br /&gt;
* Классификатор, тренированный на изображениях собак и велосипедов, после некоторых показанных ему кошек, смог определить, есть ли на новой картинке кошка&lt;br /&gt;
* Игровой бот, способный быстро обучиться новой игре&lt;br /&gt;
* Робот, выполняющий задачу на пригорке во время теста даже если он тренировался на ровной поверхности&lt;br /&gt;
&lt;br /&gt;
Ограничения&lt;br /&gt;
- No free lunch teorem [Wolpert and Macready, 1996; Giraud-Carrier and Provost, 2005]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Simple view&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошая модель мета-обучения должна быть обучена на множестве задач и оптимизирована для лучшей производительности на нескольких задачах,&lt;br /&gt;
включая такие, с которыми модель не сталкивалась ранее. Каждой задаче соответствует датасет $\mathcal{D}$, содержащий и векторы фичей и правильную разметку.&lt;br /&gt;
Оптимальные параметры модели:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* = \arg\min_\theta \mathbb{E}_{\mathcal{D}\sim p(\mathcal{D})} [\mathcal{L}_\theta(\mathcal{D})]&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Очень похоже на обычную задачу машинного обучения, только один датасет принимается за один сэмпл данных.&lt;br /&gt;
&lt;br /&gt;
Few-shot классификатор конкретизация мета-обучения в области обучения с учителем. Датасет $\mathcal{D}$ делится на две части: $\mathcal{D}=\langle S, B\rangle$,&lt;br /&gt;
train set $S$ и test set $B$. Часто принимается k-shot N-class задача - train set содержит $k$ размеченных примеров для каждого из $N$ классов.&lt;br /&gt;
Датасет $\mathcal{D}$ содержит пары фичей и меток, $\mathcal{D} = \{(\mathbf{x}_i, y_i)\}$ и каждая метка принадлежит известному множеству меток $\mathcal{L}$. Скажем, наш классификатор $f_θ$ с параметром $θ$ показывает вероятность принадлежности точки из данных к классу $y$ при векторе фичей $x$, $Pθ(y|x)$&lt;br /&gt;
Оптимальные параметры должны максимизировать вероятность верных меток среди нескольких training sets $B⊂\mathcal{D}$:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{(\mathbf{x}, y)\in \mathcal{D}}[P_\theta(y \vert \mathbf{x})] &amp;amp;\\&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{B\subset \mathcal{D}}[\sum_{(\mathbf{x}, y)\in B}P_\theta(y \vert \mathbf{x})] &amp;amp; \scriptstyle{\text{; trained with mini-batches.}}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
В few-shot классификации цель {{---}} уменьшить ошибку предсказания на неразмеченных данных с данным train set для &amp;quot;быстрого обучения&amp;quot;. Чтобы ускорить процесс обучения, сделаем следующее:&lt;br /&gt;
# возьмем подмножество меток, $L\subset\mathcal{L}$&lt;br /&gt;
# возьмем train set $S^L⊂D$ и train batch $B^L⊂D$. Оба содержат только данные с метками из подмножества с пункта 1:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
L, y \in L, \forall (x, y) \in S^L, B^L&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
# Множество $S^L$ подается на вход модели.&lt;br /&gt;
# Конечная оптимизация использует множество $B^L$ чтобы посчитать loss и обновить параметры модели через обратное распространение, так же, как это делается в обучении с учителем.&lt;br /&gt;
&lt;br /&gt;
Можно представить каждую пару сэмплированного датасета $(S^L,B^L)$ как одну точку. Модель обучается таким образом, чтобы она могла обобщиться до других датасетов.&lt;br /&gt;
Красным выделен дифф между обучением с учителем и мета-обучением.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta = \arg\max_\theta \color{red}{E_{L\subset\mathcal{L}}[} E_{\color{red}{S^L \subset\mathcal{D}, }B^L \subset\mathcal{D}} [\sum_{(x, y)\in B^L} P_\theta(x, y\color{red}{, S^L})] \color{red}{]}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Идея в некоторой степени аналогична использованию предварительно обученной модели в классификации изображений (ImageNet) или в языковом моделировании (большие текстовые корпуса), когда доступен только ограниченный набор образцов данных для конкретной задачи. Мета-обучение идет еще  на один шаг вперед, вместо того, чтобы подстраивать ее под одну задачу, она оптимизирует модель, чтобы она была хороша для многих задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Основанные на оптимизации&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Модели глубокого обучения (deep learning) обучаются через обратное распространение градиентов. Тем не менее, оптимизация, основанная на градиентах не разрабатывалась для работы с небольшим количеством обучающих семплов, и не сходится за малое число оптимизационных шагов. Подход в мета-обучении, основанный на оптимизации как раз про это.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;LSTM-meta-learner&amp;lt;/h3&amp;gt;&lt;br /&gt;
Оптимизационный алгоритм может быть явно смоделирован. Ravi &amp;amp; Larochelle (2017) это и сделали и назвали его &amp;quot;meta-learner&amp;quot;. Цель meta-learner'а - эффективно обновлять параметры learner'a используя небольшой train set так, чтобы learner мог быстро адаптироваться к новым задачам.&lt;br /&gt;
&lt;br /&gt;
Пусть модель ученика будет $M_θ$, параметризованной $θ$, и meta-learner как $R_Θ$ с параметром $θ$, и функция потерь $\mathcal{L}$.&lt;br /&gt;
&lt;br /&gt;
Обновление параметров learner'a во время $t$ c learning rate $\alpha_t$ (шаг градиентного спуска):&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta_t = \theta_{t-1} - \alpha_t \nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Обновление памяти ячейки LSTM выглядит так:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t = \theta_{t-1} - \alpha_t\nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
$c_t$ {{---}} параметры сети $\theta_t$, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ при $f_t$ = 1.&lt;br /&gt;
&lt;br /&gt;
$f_t$ = 1, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ - не оптимальные значения, их изменение может оказаться полезным, если вы попали в неудачный локальный минимум.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
f_t &amp;amp;= \sigma(\mathbf{W}_f \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, f_{t-1}] + \mathbf{b}_f) &amp;amp; \scriptstyle{\text{; как сильно мы забываем старые значения параметров.}}\\&lt;br /&gt;
i_t &amp;amp;= \sigma(\mathbf{W}_i \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, i_{t-1}] + \mathbf{b}_i) &amp;amp; \scriptstyle{\text{; соответствует рейту обучения на шаге t.}}\\&lt;br /&gt;
\tilde{\theta}_t &amp;amp;= -\nabla_{\theta_{t-1}}\mathcal{L}_t &amp;amp;\\&lt;br /&gt;
\theta_t &amp;amp;= f_t \odot \theta_{t-1} + i_t \odot \tilde{\theta}_t &amp;amp;\\&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
я ничего не понял..&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;REPTILE&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reptile {{---}} относительно простой алгоритм мета-обучения, похожий на MAML, например, тем, что оба используют мета-оптимизацию через градиентный спуск и оба не чувствительны к модели.&lt;br /&gt;
&lt;br /&gt;
# сэмплируем задачу&lt;br /&gt;
# тренируемся на ней несколькими шагами градиентного спуска&lt;br /&gt;
# сдвигаем веса модели к новым параметрам.&lt;br /&gt;
&lt;br /&gt;
$\text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$ выполняет стохастический градиентный спуск на $k$ шагов на лоссе $\mathcal{L}_{\tau_i}$, начиная с параметра $\theta$ и возвращает конечный вектор параметров. Градиент reptile определяется как $(\theta - W)/\alpha$, где $\alpha$ {{---}} размер шага, используемый функцией $SGD$.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// Algorithm REPTILE, batched version&amp;lt;/font&amp;gt;&lt;br /&gt;
  Initialize $\theta$&lt;br /&gt;
  '''for''' $iteration = 1, 2,...$ '''do'''&lt;br /&gt;
    Sample tasks $\tau_1, \tau_2, ..., \tau_n$&lt;br /&gt;
    '''for''' $i = 1, 2, ..., n$ '''do'''&lt;br /&gt;
      Compute $W_i = \text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$&lt;br /&gt;
    '''end for'''&lt;br /&gt;
    Update $\theta \leftarrow \theta + \beta 1/n \sum (W_i - \theta)$&lt;br /&gt;
  '''end for'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Определение множества конфигураций&amp;lt;/h2&amp;gt;&lt;br /&gt;
Предшествующие вычисления могут быть также использованы для изучения пространства более успешных конфигураций \theta\star. Более подходящие под задачу конфигурации могут серьезно ускорить поиск оптимальных моделей, это важно при ограниченных вычислительных рессурсах.&lt;br /&gt;
&lt;br /&gt;
Альтернативный подход сперва узнать оптимальные гиперпараметры, а потом через приращение производительности определить важность каждого из гиперпараметров. Это и было сделано в лабе OpenML, провели около 500 000 экспериментов на 6 алгоритмах и 38 датасетах. Стандартные значения изучались вместе для всех гиперпараметров алгоритма посредством обучения суррогатных моделей для этого алгоритма на большом числе задач. После того, как уже проверены многие варианты конфигураций, выбирается такая, которая минимизирует ??? для всех задач, становится стандартной.Далее определяется важность каждого из гиперпараметров. Чем больше меняется приращение производительности, тем более важный гиперпараметр мы изменяем.&lt;br /&gt;
&lt;br /&gt;
Если мы хотим предоставить рекомендации для конкретной задачи $t_{new}$, нам нужна дополнительная информация о том, насколько $t_{new}$ похожа на предыдущие задачи $t_j$. Первый способ {{---}} посчитать число рекомендованных конфигураций для $t_new$, yielding новый эвиденс $\mathbf{P}_{new}$. Если позже мы будем наблюдать, что вычисления $P_{i,new}$ соответствуют $P_{i, j}$, то $t_{j}$ и $t_{new}$ могут быть очень похожими. Мы можем применить это знания для обучения meta-learner'a который предсказывает множество рекомендуемых конфигураций $\Theta^{*}_{new}$ for $t_{new}$.&lt;br /&gt;
Более того, можно пойти дальше и добавить $\Theta^{*}_{new}$ в $P_new$ и перейти к следующей итерации и выяснять какие еще задачи схожи друг с другом.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Relative landmarks&amp;lt;/h3&amp;gt;&lt;br /&gt;
Первая мера для вычисления &amp;quot;похожести&amp;quot; задач вычисляла попарно разницу в производительности, так же называемую &amp;quot;relative landmarks&amp;quot; $RL_{a,b,j} = P_{a,j} - P_{b,j}$ между двумя конфигурациями $\theta_{a}$ и $\theta_{b}$ на конкретной задаче $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Суррогатные модели&amp;lt;/h3&amp;gt;&lt;br /&gt;
Более гибкий способ передать информацию {{---}} построить суррогатную модель $s_{j}(\theta_{i}) = P_{i,j}$ для всех предшествующих задач $t_{j}$, обученную с использованием всех доступных $\mathbf{P}$. Можно определить &amp;quot;похожесть&amp;quot; задач в терминах ошибок между $s_{j}(\theta_{i})$ и $P_{i,new}$: если суррогатная модель для $t_{j}$ может генерировать точные предсказания для $t_{new}$, тогда такие задачи весьма похожи. Обычно это делается в комбинации с Байесовской оптимизацией для определения следующей $\theta_{i}$.&lt;br /&gt;
&lt;br /&gt;
Так же можно обучать суррогатные модели на Гауссовских процессах (GP) для каждой предыдущей задачи и еще одну для $t_{new}$ и объединить их во взвешенную и нормализованную сумму, с медианой $\mu$ определенной как взвшенная сумма $\mu_{j}$ полученных из задач $t_{j}$. Веса $\mu_{j}$ считаются через Nadaraya-Watson kernel-weighted average, где каждая задача представлена вектором relative landmarks и Epanechnikov quadratic kernel используется для определения похожести между векторами relative landmarks для $t_{j}$ и $t_{new}$. Чем больше $t_{j}$ похожа на  $t_{new}$, тем больше получится вес $s_{j}$, увеличивающий влияние суррогатной модели для $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
Суррогатные модели обучаются только на $P_{i, new}$, а следующий $\theta_{i}$ получается путем нахождения средневзвешенного expected improvement $P_{i, new}$ и предсказанных улучшений на всех предшествующих $P_{i, j}$.&lt;br /&gt;
Веса предшествующих задач могут быть переопределены через точность суррогатной модели или через relative landmarks.&lt;br /&gt;
Вес ожидаемого улучшения (expected improvement) постепенно возрастает с каждой итерацией (с увеличением собранного эвиденса $P_{i, new}$).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Обучение на свойствах задачи (learning on task properties)&amp;lt;/h3&amp;gt;&lt;br /&gt;
Каждая задача $t_{j} \in T$ может быть описана вектором $m(t_j) = (m_{j,1}, ...,m_{j,K})$ из $K$ мета-фичей $m_{j, k} \in M$ $M$ {{---}} множество мета-фичей. Можно определить меру &amp;quot;похожести&amp;quot; задач, основанную, например, на Евклидовом расстоянии между $m(t_i)$ и $m(t_j)$, тогда можно будет использовать информацию из наиболее похожей задачи на новую задачу $t_{new}$. Более того, используя предшествующие вычисления $\textbf{P}$ можно обучить meta-learner'a $L$ предсказывать производительность $P_{i, new}$ конфигураций $\theta_{i}$ на новых задачах $t_{new}$.&lt;br /&gt;
&lt;br /&gt;
$L: \Theta \times M \rightarrow \textbf{P}$&lt;br /&gt;
&lt;br /&gt;
В таблице представлен обзор наиболее используемых мета-фичей.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Meta-feature&lt;br /&gt;
|-&lt;br /&gt;
! '''Name''' !! '''Formula''' !! '''Rationale''' !! '''Variants'''&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''simple'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr instances || $n$ || Speed, Scalability \citep{Michie1994} || $p/n$, $log(n)$, log(n/p)&lt;br /&gt;
|-&lt;br /&gt;
| Nr features || $p$ || Curse of dimensionality \citep{Michie1994} || $log(p)$, % categorical&lt;br /&gt;
|-&lt;br /&gt;
| Nr classes || $c$ || Complexity, imbalance \citep{Michie1994} || ratio min/maj class&lt;br /&gt;
|-&lt;br /&gt;
| Nr missing values || $m$ || Imputation effects \citep{kalousis02} || % missing&lt;br /&gt;
|-&lt;br /&gt;
| Nr outliers || $o$ || Data noisiness \citep{Rousseeuw2011} || $o/n$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''statistical'''&lt;br /&gt;
|-&lt;br /&gt;
| Skewness || $\frac{E(X-\mu_{X})^{3}}{\sigma_{X}^{3}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Kurtosis || $\frac{E(X-\mu_{X})^{4}}{\sigma_{X}^{4}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Correlation || $\rho_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$\rho_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Covariance || $cov_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$cov_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Concentration || $\tau_{X_{1}X_{2}}$ || Feature interdependence \citep{Kalousis2001a} || min,max,$\mu$,$\sigma$,$\tau_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Sparsity || sparsity(X) || Degree of discreteness \citep{Salama2013} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Gravity || gravity(X) || Inter-class dispersion \citep{Ali2006} ||&lt;br /&gt;
|-&lt;br /&gt;
| ANOVA p-value || $p_{val_{\texttt{X}_{1}X_{2}}}$ || Feature redundancy \citep{kalousis02} || $p_{val_{XY}}$\citep{soares+04}&lt;br /&gt;
|-&lt;br /&gt;
| Coeff. of variation || $\frac{\sigma_{Y}}{\mu_{Y}}$ || Variation in target \citep{soares+04} ||&lt;br /&gt;
|-&lt;br /&gt;
| PCA $\rho_{\lambda_{1}}$ || $\sqrt{\frac{\lambda_{1}}{1+\lambda_{1}}}$ || Variance in first PC \citep{Michie1994} || $\frac{\lambda_{1}}{\sum_{i} \lambda_{i}}$\citep{Michie1994}&lt;br /&gt;
|-&lt;br /&gt;
| PCA skewness || || Skewness of first PC \citep{feurer2014using} || PCA kurtosis&lt;br /&gt;
|-&lt;br /&gt;
| PCA 95\% || $\frac{dim_{95\% var}}{p}$ || Intrinsic dimensionality \citep{bardenet2013collaborative} ||&lt;br /&gt;
|-&lt;br /&gt;
| Class probability || $P(\texttt{C})$ || Class distribution \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''informational-theoretic'''&lt;br /&gt;
|-&lt;br /&gt;
| Class entropy  || $H(\texttt{C})$ || Class imbalance \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Norm. entropy || $\frac{H(\texttt{X})}{log_{2}n}$ || Feature informativeness \citep{Castiello2005} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Mutual inform. || $MI(\texttt{C},\texttt{X})$ || Feature importance \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Uncertainty coeff. || $\frac{MI(\texttt{C},\texttt{X})}{H(\texttt{C})}$ || Feature importance \citep{Agresti:2002p7509} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Equiv. nr. feats || $\frac{H(C)}{\overline{MI(C,X)}}$ || Intrinsic dimensionality \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Noise-signal ratio || $\frac{\overline{H(X)}-\overline{MI(C,X)}}{\overline{MI(C,X)}}$ || Noisiness of data \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''complexity'''&lt;br /&gt;
|-&lt;br /&gt;
| Fisher's discrimin. || $\frac{(\mu_{c1}-\mu_{c2})^{2}}{\sigma_{c1}^{2}-\sigma_{c2}^{2}}$ || Separability classes $c_{1},c_{2}$ \citep{Ho:2002} || See \citet{}{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Volume of overlap || || Class distribution overlap \citep{Ho:2002} || See \citet{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Concept variation || || Task complexity \citep{Vilalta:2002p5805} || See \citet{Vilalta:1999p5745}&lt;br /&gt;
|-&lt;br /&gt;
| Data consistency || || Data quality \citep{Kopf:2002p5864} || See \citet{Kopf:2002p5864}&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''model-based'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr nodes, leaves || &amp;lt;tex&amp;gt;|\eta|,|\psi|&amp;lt;/tex&amp;gt; || Concept complexity \citep{Peng:2002p705} || Tree depth&lt;br /&gt;
|-&lt;br /&gt;
| Branch length || || Concept complexity \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Nodes per feature || &amp;lt;tex&amp;gt;|\eta_{X}|&amp;lt;/tex&amp;gt; || Feature importance \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves per class || &amp;lt;tex&amp;gt;\frac{|\psi_{c}|}{|\psi|}&amp;lt;/tex&amp;gt; ||  Class complexity \citep{Filchenkov2015} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves agreement || &amp;lt;tex&amp;gt;\frac{n_{\psi_{i}}}{n}&amp;lt;/tex&amp;gt; ||  Class separability \citep{Bensusan2000} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Information gain || || Feature importance \citep{Bensusan2000} || min,max,$\mu$,$\sigma$, gini&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''landmarks'''&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(1NN) || $P(\theta_{1NN},t_{j})$ || Data sparsity \citep{Pfahringer:2000p553} || See \citet{Pfahringer:2000p553}&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Tree) || $P(\theta_{Tree},t_{j})$ || Data separability \citep{Pfahringer:2000p553} || Stump,RandomTree&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Lin) || $P(\theta_{Lin},t_{j})$ || Linear separability \citep{Pfahringer:2000p553} || Lin.Disciminant&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(NB) || $P(\theta_{NB},t_{j})$ || Feature independence \citep{Pfahringer:2000p553} || See \citet{Ler:2005p1680}&lt;br /&gt;
|-&lt;br /&gt;
| Relative LM || $P_{a,j} - P_{b,j}$ || Probing performance \citep{Furnkranz:2001p1278} ||&lt;br /&gt;
|-&lt;br /&gt;
| Subsample LM || $P(\theta_{i},t_{j},s_{t})$ || Probing performance \citep{Soares:2001p708} ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Непрерывные фичи $X$ и таргет $Y$ имеют медиану $\mu_{X}$, stdev $\sigma_{X}$, variance $\sigma^{2}_{X}$. Категориальные фичи $\texttt{X}$ и класс $\texttt{C}$ имеют категориальные значения  $\pi_{i}$, условные вероятности $\pi_{i|j}$, совместные вероятности $\pi_{i,j}$, предельные вероятности $\pi_{i+}=\sum_{j}\pi_{ij}$, энтропию $H(\texttt{X})=-\sum_{i}\pi_{i+}log_{2}(\pi_{i+})$.&lt;br /&gt;
&lt;br /&gt;
Многие мета-фичи вычисляются по одиночным фичам или комбинации фичей, и должны быть агрегированы через min,max,$\mu$,$\sigma$,quartiles или гистограммами [kalousis]&lt;br /&gt;
&lt;br /&gt;
Во время вычисления похожести задач важно нормализовать все мета-фичи [bardnet], использовать feature selection [todorovski] или использовать dimensionality reduction (PCA, например).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Примечания&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html#define-the-meta-learning-problem&lt;br /&gt;
https://arxiv.org/pdf/1810.03548.pdf&lt;br /&gt;
https://www.ml4aad.org/wp-content/uploads/2018/09/chapter2-metalearning.pdf&lt;br /&gt;
https://openreview.net/pdf?id=rJY0-Kcll&lt;br /&gt;
https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf&lt;br /&gt;
Alexandros Kalousis and Melanie Hilario. Model selection v&lt;br /&gt;
ia meta-learning: a comparative&lt;br /&gt;
study.&lt;br /&gt;
Intl Journ. on Artificial Intelligence Tools&lt;br /&gt;
, 10(4):525–554, 2001.&lt;br /&gt;
R ́emi Bardenet, M ́aty ́as Brendel, Bal ́azs K ́egl, and Michele Sebag. Collaborative hyperparameter tuning. In Proceedings of ICML 2013, pages 199–207, 2013&lt;br /&gt;
L Todorovski and S Dzeroski. Experiments in meta-level learning with ILP.&lt;br /&gt;
Lecture Notes in Computer Science, 1704:98–106, 1999.&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69393</id>
		<title>Мета-обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69393"/>
				<updated>2019-01-25T23:06:01Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: Исправление опечатки&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;b&amp;gt;Мета-обучение&amp;lt;/b&amp;gt; {{---}} подход, повзоляющий определять оптимальный алгоритм (иногда, вместе с параметрами к нему) для конкретной задачи. Основная идея мета-обучения {{---}} свести задачу выбора алгоритма к задаче обучения с учителем: задачи описываются мета-фичами. Мета-фича описывает свойство задачи {{---}} напмример, разрежен ли датасет или нет.&lt;br /&gt;
&lt;br /&gt;
От хорошей модели ожидается хорошая адаптируемость или генерализуемость новых задач и окружений, с которыми модель не сталкивалась во время обучения.&lt;br /&gt;
&lt;br /&gt;
Такими задачами являются:&lt;br /&gt;
* Классификатор, тренированный на изображениях собак и велосипедов, после некоторых показанных ему кошек, смог определить, есть ли на новой картинке кошка&lt;br /&gt;
* Игровой бот, способный быстро обучиться новой игре&lt;br /&gt;
* Робот, выполняющий задачу на пригорке во время теста даже если он тренировался на ровной поверхности&lt;br /&gt;
&lt;br /&gt;
Ограничения&lt;br /&gt;
- No free lunch teorem [Wolpert and Macready, 1996; Giraud-Carrier and Provost, 2005]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Simple view&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошая модель мета-обучения должна быть обучена на множестве задач и оптимизирована для лучшей производительности на нескольких задачах,&lt;br /&gt;
включая такие, с которыми модель не сталкивалась ранее. Каждой задаче соответствует датасет $\mathcal{D}$, содержащий и векторы фичей и правильную разметку.&lt;br /&gt;
Оптимальные параметры модели:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* = \arg\min_\theta \mathbb{E}_{\mathcal{D}\sim p(\mathcal{D})} [\mathcal{L}_\theta(\mathcal{D})]&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Очень похоже на обычную задачу машинного обучения, только один датасет принимается за один сэмпл данных.&lt;br /&gt;
&lt;br /&gt;
Few-shot классификатор конкретизация мета-обучения в области обучения с учителем. Датасет $\mathcal{D}$ делится на две части: $\mathcal{D}=\langle S, B\rangle$,&lt;br /&gt;
train set $S$ и test set $B$. Часто принимается k-shot N-class задача - train set содержит $k$ размеченных примеров для каждого из $N$ классов.&lt;br /&gt;
Датасет $\mathcal{D}$ содержит пары фичей и меток, $\mathcal{D} = \{(\mathbf{x}_i, y_i)\}$ и каждая метка принадлежит известному множеству меток $\mathcal{L}$. Скажем, наш классификатор $f_θ$ с параметром $θ$ показывает вероятность принадлежности точки из данных к классу $y$ при векторе фичей $x$, $Pθ(y|x)$&lt;br /&gt;
Оптимальные параметры должны максимизировать вероятность верных меток среди нескольких training sets $B⊂\mathcal{D}$:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{(\mathbf{x}, y)\in \mathcal{D}}[P_\theta(y \vert \mathbf{x})] &amp;amp;\\&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{B\subset \mathcal{D}}[\sum_{(\mathbf{x}, y)\in B}P_\theta(y \vert \mathbf{x})] &amp;amp; \scriptstyle{\text{; trained with mini-batches.}}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
В few-shot классификации цель {{---}} уменьшить ошибку предсказания на неразмеченных данных с данным train set для &amp;quot;быстрого обучения&amp;quot;. Чтобы ускорить процесс обучения, сделаем следующее:&lt;br /&gt;
# возьмем подмножество меток, $L\subset\mathcal{L}$&lt;br /&gt;
# возьмем train set $S^L⊂D$ и train batch $B^L⊂D$. Оба содержат только данные с метками из подмножества с пункта 1:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
L, y \in L, \forall (x, y) \in S^L, B^L&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
# Множество $S^L$ подается на вход модели.&lt;br /&gt;
# Конечная оптимизация использует множество $B^L$ чтобы посчитать loss и обновить параметры модели через обратное распространение, так же, как это делается в обучении с учителем.&lt;br /&gt;
&lt;br /&gt;
Можно представить каждую пару сэмплированного датасета $(S^L,B^L)$ как одну точку. Модель обучается таким образом, чтобыона могла обобщиться до других датасетов.&lt;br /&gt;
Красным выделен дифф между обучением с учителем и мета-обучением.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta = \arg\max_\theta \color{red}{E_{L\subset\mathcal{L}}[} E_{\color{red}{S^L \subset\mathcal{D}, }B^L \subset\mathcal{D}} [\sum_{(x, y)\in B^L} P_\theta(x, y\color{red}{, S^L})] \color{red}{]}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Идея в некоторой степени аналогична использованию предварительно обученной модели в классификации изображений (ImageNet) или в языковом моделировании (большие текстовые корпуса), когда доступен только ограниченный набор образцов данных для конкретной задачи. Мета-обучение идет еще  на один шаг вперед, вместо того, чтобы подстраивать ее под одну задачу, она оптимизирует модель, чтобы она была хороша для многих задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Основанные на оптимизации&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Модели глубокого обучения (deep learning) обучаются через обратное распространение градиентов. Тем не менее, оптимизация, основанная на градиентах не разрабатывалась для работы с небольшим количеством обучающих семплов, и не сходится за малое число оптимизационных шагов. Подход в мета-обучении, основанный на оптимизации как раз про это.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;LSTM-meta-learner&amp;lt;/h3&amp;gt;&lt;br /&gt;
Оптимизационный алгоитм может быть явно смоделирован. Ravi &amp;amp; Larochelle (2017) это и сделали и назвали его &amp;quot;meta-learner&amp;quot;. Цель meta-learner'а - эффективно обновлять параметры learner'a используя небольшой train set так, чтобы learner мог быстро адаптироваться к новым задачам.&lt;br /&gt;
&lt;br /&gt;
Пусть модель ученика будет $M_θ$, параметризованной $θ$, и meta-learner как $R_Θ$ с параметром $θ$, и функция потерь $\mathcal{L}$.&lt;br /&gt;
&lt;br /&gt;
Обновление параметров learner'a во время $t$ c learning rate $\alpha_t$ (шаг градиентного спуска):&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta_t = \theta_{t-1} - \alpha_t \nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Обновление памяти ячейки LSTM выглядит так:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t = \theta_{t-1} - \alpha_t\nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
$c_t$ {{---}} параметры сети $\theta_t$, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ при $f_t$ = 1.&lt;br /&gt;
&lt;br /&gt;
$f_t$ = 1, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ - не оптимальные значения, их изменение может оказаться полезным, если вы попали в неудачный локальный минимум.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
f_t &amp;amp;= \sigma(\mathbf{W}_f \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, f_{t-1}] + \mathbf{b}_f) &amp;amp; \scriptstyle{\text{; как сильно мы забываем старые значения параметров.}}\\&lt;br /&gt;
i_t &amp;amp;= \sigma(\mathbf{W}_i \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, i_{t-1}] + \mathbf{b}_i) &amp;amp; \scriptstyle{\text{; соответствует рейту обучения на шаге t.}}\\&lt;br /&gt;
\tilde{\theta}_t &amp;amp;= -\nabla_{\theta_{t-1}}\mathcal{L}_t &amp;amp;\\&lt;br /&gt;
\theta_t &amp;amp;= f_t \odot \theta_{t-1} + i_t \odot \tilde{\theta}_t &amp;amp;\\&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
я ничего не понял..&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;REPTILE&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reptile {{---}} относительно простой алгоритм мета-обучения, похожий на MAML, например, тем, что оба используют мета-оптимизацию через градиентый спуск и оба не чувствительны к модели.&lt;br /&gt;
&lt;br /&gt;
# сэмплируем задачу&lt;br /&gt;
# тренируемся на ней несколькими шагами градиентного спуска&lt;br /&gt;
# сдвигаем веса модели к новым параметрам.&lt;br /&gt;
&lt;br /&gt;
$\text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$ выполняет стохастический градиентный спуск на $k$ шагов на лоссе $\mathcal{L}_{\tau_i}$, начиная с параметра $\theta$ и возвращает конечный вектор параметров. Градиент reptile определяется как $(\theta - W)/\alpha$, где $\alpha$ {{---}} размер шага, используемый функцией $SGD$.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// Algorithm REPTILE, batched version&amp;lt;/font&amp;gt;&lt;br /&gt;
  Initialize $\theta$&lt;br /&gt;
  '''for''' $iteration = 1, 2,...$ '''do'''&lt;br /&gt;
    Sample tasks $\tau_1, \tau_2, ..., \tau_n$&lt;br /&gt;
    '''for''' $i = 1, 2, ..., n$ '''do'''&lt;br /&gt;
      Compute $W_i = \text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$&lt;br /&gt;
    '''end for'''&lt;br /&gt;
    Update $\theta \leftarrow \theta + \beta 1/n \sum (W_i - \theta)$&lt;br /&gt;
  '''end for'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Определение множества конфигураций&amp;lt;/h2&amp;gt;&lt;br /&gt;
Предшествующие выисления могут быть также использованы для изучения пространства более успешных конфигураций \theta\star. Более подходящие под задачу конфигурации могут серьезно ускорить поиск оптимальных моделей, это важно при ограниченных вычислительных рессурсах.&lt;br /&gt;
&lt;br /&gt;
Альтернативный подход сперва узнать оптимальные гипермараметры, а потом через приращение производительности определить важность каждого из гиперпараметров. Это и было сделано в лабе OpenML, провели около 500 000 экспериментов на 6 алгоритмах и 38 датасетах. Стандартные значения изучались вместе для всех гиперпараметров алгоритма посредством обучения суррогатных моделей для этого алгоритма на большом числе задач. После того, как уже проверены многие варинаты конфигураций, выбирается такая, которая минимизирует ??? для всех задач, становится стандартной.Далее определяется важность каждого из гиперпараметров. Чем больше меняется приращение производительности, тем более важный гиперпараметр мы изменяем.&lt;br /&gt;
&lt;br /&gt;
Если мы хотим предоставить рекомендации для конкретной задачи $t_{new}$, нам нужна дополнительная информация о том, насколько $t_{new}$ похожа на предыдущие задачи $t_j$. Первый способ {{---}} посчитать число рекомендованных конфигураций для $t_new$, yielding новый эвиденс $\mathbf{P}_{new}$. Если позже мы будем наблюдать, что вычисления $P_{i,new}$ соответствуют $P_{i, j}$, то $t_{j}$ и $t_{new}$ могут быть очень похожими. Мы можем применить это знания для обучения meta-learner'a который предскаывает множество рекомендуемых конфигураций $\Theta^{*}_{new}$ for $t_{new}$.&lt;br /&gt;
Более того, можно пойти дальше и добавить $\Theta^{*}_{new}$ в $P_new$ и перейти к следующей итерации и выяснять какие еще задачи схожи друг с другом.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Relative landmarks&amp;lt;/h3&amp;gt;&lt;br /&gt;
Первая мера для вычисления &amp;quot;похожести&amp;quot; задач вычисляла попарно разницу в производительности, так же называемую &amp;quot;relative landmarks&amp;quot; $RL_{a,b,j} = P_{a,j} - P_{b,j}$ между двумя конфигурациями $\theta_{a}$ и $\theta_{b}$ на конкретной задаче $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Суррогатные модели&amp;lt;/h3&amp;gt;&lt;br /&gt;
Более гибкий способ передать информацию {{---}} построить суррогатную модель $s_{j}(\theta_{i}) = P_{i,j}$ для всех предшествующих задач $t_{j}$, обученную с использованием всех доступных $\mathbf{P}$. Можно определить &amp;quot;похожесть&amp;quot; задач в терминах ошибок между $s_{j}(\theta_{i})$ и $P_{i,new}$: если суррогатная модель для $t_{j}$ может генерировать точные предсказания для $t_{new}$, тогда такие задачи весьма похожи. Обычно это делается в комбинации с Байесовской оптимизацией для определения следующей $\theta_{i}$.&lt;br /&gt;
&lt;br /&gt;
Так же можно обучать суррогатные модли на Гауссовских процессах (GP) для каждой предыдущей задачи и еще одну для $t_{new}$ и объединить их во взвешенную и нормализованную сумму, с медианой $\mu$ определенной как взвшенная сумма $\mu_{j}$ полученных из задач $t_{j}$. Веса $\mu_{j}$ считаются через Nadaraya-Watson kernel-weighted average, где каждая задача представлена вектором relative landmarks и Epanechnikov quadratic kernel используется для определения похожести между векторами relative landmarks для $t_{j}$ и $t_{new}$. Чем больше $t_{j}$ похожа на  $t_{new}$, тем больше получится вес $s_{j}$, увеличивающий влияние суррогатной модели для $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
Суррогатные модели обучаются только на $P_{i, new}$, а следующий $\theta_{i}$ поулчается путем нахождения средневзвешенного expected improvement $P_{i, new}$ и предсказанных улучшений на всех предшествующих $P_{i, j}$.&lt;br /&gt;
Веса предшествующих задач могут быть переопределены через точность суррогатной модели или через relative landmarks.&lt;br /&gt;
Вес ожидаемого улучшения (expected improvement) постепенно возрастает с каждой итерацией (с увеличением собранного эвиденса $P_{i, new}$).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Обучение на свойствах задачи (learning on task properties)&amp;lt;/h3&amp;gt;&lt;br /&gt;
Каждая задача $t_{j} \in T$ может быть описана вектором $m(t_j) = (m_{j,1}, ...,m_{j,K})$ из $K$ мета-фичей $m_{j, k} \in M$ $M$ {{---}} множество мета-фичей. Можно определить меру &amp;quot;похожести&amp;quot; задач, основанную, например, на Евклидовом расстоянии между $m(t_i)$ и $m(t_j)$, тогда можно будет использовать информацию из наиболее похожей задачи на новую задачу $t_{new}$. Более того, используя предшествующие вычисления $\textbf{P}$ можно обучить meta-learner'a $L$ предсказывать производительность $P_{i, new}$ конфигураций $\theta_{i}$ на новых задачах $t_{new}$.&lt;br /&gt;
&lt;br /&gt;
$L: \Theta \times M \rightarrow \textbf{P}$&lt;br /&gt;
&lt;br /&gt;
В таблице представлен обзор наиболее используемых мета-фичей.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Meta-feature&lt;br /&gt;
|-&lt;br /&gt;
! '''Name''' !! '''Formula''' !! '''Rationale''' !! '''Variants'''&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''simple'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr instances || $n$ || Speed, Scalability \citep{Michie1994} || $p/n$, $log(n)$, log(n/p)&lt;br /&gt;
|-&lt;br /&gt;
| Nr features || $p$ || Curse of dimensionality \citep{Michie1994} || $log(p)$, % categorical&lt;br /&gt;
|-&lt;br /&gt;
| Nr classes || $c$ || Complexity, imbalance \citep{Michie1994} || ratio min/maj class&lt;br /&gt;
|-&lt;br /&gt;
| Nr missing values || $m$ || Imputation effects \citep{kalousis02} || % missing&lt;br /&gt;
|-&lt;br /&gt;
| Nr outliers || $o$ || Data noisiness \citep{Rousseeuw2011} || $o/n$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''statistical'''&lt;br /&gt;
|-&lt;br /&gt;
| Skewness || $\frac{E(X-\mu_{X})^{3}}{\sigma_{X}^{3}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Kurtosis || $\frac{E(X-\mu_{X})^{4}}{\sigma_{X}^{4}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Correlation || $\rho_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$\rho_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Covariance || $cov_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$cov_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Concentration || $\tau_{X_{1}X_{2}}$ || Feature interdependence \citep{Kalousis2001a} || min,max,$\mu$,$\sigma$,$\tau_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Sparsity || sparsity(X) || Degree of discreteness \citep{Salama2013} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Gravity || gravity(X) || Inter-class dispersion \citep{Ali2006} ||&lt;br /&gt;
|-&lt;br /&gt;
| ANOVA p-value || $p_{val_{\texttt{X}_{1}X_{2}}}$ || Feature redundancy \citep{kalousis02} || $p_{val_{XY}}$\citep{soares+04}&lt;br /&gt;
|-&lt;br /&gt;
| Coeff. of variation || $\frac{\sigma_{Y}}{\mu_{Y}}$ || Variation in target \citep{soares+04} ||&lt;br /&gt;
|-&lt;br /&gt;
| PCA $\rho_{\lambda_{1}}$ || $\sqrt{\frac{\lambda_{1}}{1+\lambda_{1}}}$ || Variance in first PC \citep{Michie1994} || $\frac{\lambda_{1}}{\sum_{i} \lambda_{i}}$\citep{Michie1994}&lt;br /&gt;
|-&lt;br /&gt;
| PCA skewness || || Skewness of first PC \citep{feurer2014using} || PCA kurtosis&lt;br /&gt;
|-&lt;br /&gt;
| PCA 95\% || $\frac{dim_{95\% var}}{p}$ || Intrinsic dimensionality \citep{bardenet2013collaborative} ||&lt;br /&gt;
|-&lt;br /&gt;
| Class probability || $P(\texttt{C})$ || Class distribution \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''informational-theoretic'''&lt;br /&gt;
|-&lt;br /&gt;
| Class entropy  || $H(\texttt{C})$ || Class imbalance \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Norm. entropy || $\frac{H(\texttt{X})}{log_{2}n}$ || Feature informativeness \citep{Castiello2005} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Mutual inform. || $MI(\texttt{C},\texttt{X})$ || Feature importance \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Uncertainty coeff. || $\frac{MI(\texttt{C},\texttt{X})}{H(\texttt{C})}$ || Feature importance \citep{Agresti:2002p7509} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Equiv. nr. feats || $\frac{H(C)}{\overline{MI(C,X)}}$ || Intrinsic dimensionality \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Noise-signal ratio || $\frac{\overline{H(X)}-\overline{MI(C,X)}}{\overline{MI(C,X)}}$ || Noisiness of data \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''complexity'''&lt;br /&gt;
|-&lt;br /&gt;
| Fisher's discrimin. || $\frac{(\mu_{c1}-\mu_{c2})^{2}}{\sigma_{c1}^{2}-\sigma_{c2}^{2}}$ || Separability classes $c_{1},c_{2}$ \citep{Ho:2002} || See \citet{}{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Volume of overlap || || Class distribution overlap \citep{Ho:2002} || See \citet{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Concept variation || || Task complexity \citep{Vilalta:2002p5805} || See \citet{Vilalta:1999p5745}&lt;br /&gt;
|-&lt;br /&gt;
| Data consistency || || Data quality \citep{Kopf:2002p5864} || See \citet{Kopf:2002p5864}&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''model-based'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr nodes, leaves || &amp;lt;tex&amp;gt;|\eta|,|\psi|&amp;lt;/tex&amp;gt; || Concept complexity \citep{Peng:2002p705} || Tree depth&lt;br /&gt;
|-&lt;br /&gt;
| Branch length || || Concept complexity \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Nodes per feature || &amp;lt;tex&amp;gt;|\eta_{X}|&amp;lt;/tex&amp;gt; || Feature importance \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves per class || &amp;lt;tex&amp;gt;\frac{|\psi_{c}|}{|\psi|}&amp;lt;/tex&amp;gt; ||  Class complexity \citep{Filchenkov2015} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves agreement || &amp;lt;tex&amp;gt;\frac{n_{\psi_{i}}}{n}&amp;lt;/tex&amp;gt; ||  Class separability \citep{Bensusan2000} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Information gain || || Feature importance \citep{Bensusan2000} || min,max,$\mu$,$\sigma$, gini&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''landmarks'''&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(1NN) || $P(\theta_{1NN},t_{j})$ || Data sparsity \citep{Pfahringer:2000p553} || See \citet{Pfahringer:2000p553}&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Tree) || $P(\theta_{Tree},t_{j})$ || Data separability \citep{Pfahringer:2000p553} || Stump,RandomTree&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Lin) || $P(\theta_{Lin},t_{j})$ || Linear separability \citep{Pfahringer:2000p553} || Lin.Disciminant&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(NB) || $P(\theta_{NB},t_{j})$ || Feature independence \citep{Pfahringer:2000p553} || See \citet{Ler:2005p1680}&lt;br /&gt;
|-&lt;br /&gt;
| Relative LM || $P_{a,j} - P_{b,j}$ || Probing performance \citep{Furnkranz:2001p1278} ||&lt;br /&gt;
|-&lt;br /&gt;
| Subsample LM || $P(\theta_{i},t_{j},s_{t})$ || Probing performance \citep{Soares:2001p708} ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Непрерывные фичи $X$ и таргет $Y$ имеют медиану $\mu_{X}$, stdev $\sigma_{X}$, variance $\sigma^{2}_{X}$. Категориальные фичи $\texttt{X}$ и класс $\texttt{C}$ имеют категориальные значения  $\pi_{i}$, условные вероятности $\pi_{i|j}$, совместные вероятности $\pi_{i,j}$, предельные вероятности $\pi_{i+}=\sum_{j}\pi_{ij}$, энтропию $H(\texttt{X})=-\sum_{i}\pi_{i+}log_{2}(\pi_{i+})$.&lt;br /&gt;
&lt;br /&gt;
Многие мета-фичи вычисляются по одиночным фичам или комбинации фичей, и должны быть агрегированы через min,max,$\mu$,$\sigma$,quartiles или гистограммами [kalousis]&lt;br /&gt;
&lt;br /&gt;
Во время вычисления похожести задач важно нормализовывать все мета-фичи [bardnet], использовать feature selection [todorovski] или использовать dimensionality reduction (PCA, например).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Примечания&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html#define-the-meta-learning-problem&lt;br /&gt;
https://arxiv.org/pdf/1810.03548.pdf&lt;br /&gt;
https://www.ml4aad.org/wp-content/uploads/2018/09/chapter2-metalearning.pdf&lt;br /&gt;
https://openreview.net/pdf?id=rJY0-Kcll&lt;br /&gt;
https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf&lt;br /&gt;
Alexandros Kalousis and Melanie Hilario. Model selection v&lt;br /&gt;
ia meta-learning: a comparative&lt;br /&gt;
study.&lt;br /&gt;
Intl Journ. on Artificial Intelligence Tools&lt;br /&gt;
, 10(4):525–554, 2001.&lt;br /&gt;
R ́emi Bardenet, M ́aty ́as Brendel, Bal ́azs K ́egl, and Michele Sebag. Collaborative hyperparameter tuning. In Proceedings of ICML 2013, pages 199–207, 2013&lt;br /&gt;
L Todorovski and S Dzeroski. Experiments in meta-level learning with ILP.&lt;br /&gt;
Lecture Notes in Computer Science, 1704:98–106, 1999.&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69391</id>
		<title>Мета-обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69391"/>
				<updated>2019-01-25T23:05:13Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: Пропущен один -, еще одна замена&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;b&amp;gt;Мета-обучение&amp;lt;/b&amp;gt; {{---}} подход, повзоляющий определять оптимальный алгоритм (иногда, вместе с параметрами к нему) для конкретной задачи. Основная идея мета-обучения {{---}} свети задачу выбора алгоритма к задаче обучения с учителем: задачи описываются мета-фичами. Мета-фича описывает свойство задачи {{---}} напмример, разрежен ли датасет или нет.&lt;br /&gt;
&lt;br /&gt;
От хорошей модели ожидается хорошая адаптируемость или генерализуемость новых задач и окружений, с которыми модель не сталкивалась во время обучения.&lt;br /&gt;
&lt;br /&gt;
Такими задачами являются:&lt;br /&gt;
* Классификатор, тренированный на изображениях собак и велосипедов, после некоторых показанных ему кошек, смог определить, есть ли на новой картинке кошка&lt;br /&gt;
* Игровой бот, способный быстро обучиться новой игре&lt;br /&gt;
* Робот, выполняющий задачу на пригорке во время теста даже если он тренировался на ровной поверхности&lt;br /&gt;
&lt;br /&gt;
Ограничения&lt;br /&gt;
- No free lunch teorem [Wolpert and Macready, 1996; Giraud-Carrier and Provost, 2005]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Simple view&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошая модель мета-обучения должна быть обучена на множестве задач и оптимизирована для лучшей производительности на нескольких задачах,&lt;br /&gt;
включая такие, с которыми модель не сталкивалась ранее. Каждой задаче соответствует датасет $\mathcal{D}$, содержащий и векторы фичей и правильную разметку.&lt;br /&gt;
Оптимальные параметры модели:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* = \arg\min_\theta \mathbb{E}_{\mathcal{D}\sim p(\mathcal{D})} [\mathcal{L}_\theta(\mathcal{D})]&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Очень похоже на обычную задачу машинного обучения, только один датасет принимается за один сэмпл данных.&lt;br /&gt;
&lt;br /&gt;
Few-shot классификатор конкретизация мета-обучения в области обучения с учителем. Датасет $\mathcal{D}$ делится на две части: $\mathcal{D}=\langle S, B\rangle$,&lt;br /&gt;
train set $S$ и test set $B$. Часто принимается k-shot N-class задача - train set содержит $k$ размеченных примеров для каждого из $N$ классов.&lt;br /&gt;
Датасет $\mathcal{D}$ содержит пары фичей и меток, $\mathcal{D} = \{(\mathbf{x}_i, y_i)\}$ и каждая метка принадлежит известному множеству меток $\mathcal{L}$. Скажем, наш классификатор $f_θ$ с параметром $θ$ показывает вероятность принадлежности точки из данных к классу $y$ при векторе фичей $x$, $Pθ(y|x)$&lt;br /&gt;
Оптимальные параметры должны максимизировать вероятность верных меток среди нескольких training sets $B⊂\mathcal{D}$:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{(\mathbf{x}, y)\in \mathcal{D}}[P_\theta(y \vert \mathbf{x})] &amp;amp;\\&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{B\subset \mathcal{D}}[\sum_{(\mathbf{x}, y)\in B}P_\theta(y \vert \mathbf{x})] &amp;amp; \scriptstyle{\text{; trained with mini-batches.}}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
В few-shot классификации цель {{---}} уменьшить ошибку предсказания на неразмеченных данных с данным train set для &amp;quot;быстрого обучения&amp;quot;. Чтобы ускорить процесс обучения, сделаем следующее:&lt;br /&gt;
# возьмем подмножество меток, $L\subset\mathcal{L}$&lt;br /&gt;
# возьмем train set $S^L⊂D$ и train batch $B^L⊂D$. Оба содержат только данные с метками из подмножества с пункта 1:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
L, y \in L, \forall (x, y) \in S^L, B^L&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
# Множество $S^L$ подается на вход модели.&lt;br /&gt;
# Конечная оптимизация использует множество $B^L$ чтобы посчитать loss и обновить параметры модели через обратное распространение, так же, как это делается в обучении с учителем.&lt;br /&gt;
&lt;br /&gt;
Можно представить каждую пару сэмплированного датасета $(S^L,B^L)$ как одну точку. Модель обучается таким образом, чтобыона могла обобщиться до других датасетов.&lt;br /&gt;
Красным выделен дифф между обучением с учителем и мета-обучением.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta = \arg\max_\theta \color{red}{E_{L\subset\mathcal{L}}[} E_{\color{red}{S^L \subset\mathcal{D}, }B^L \subset\mathcal{D}} [\sum_{(x, y)\in B^L} P_\theta(x, y\color{red}{, S^L})] \color{red}{]}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Идея в некоторой степени аналогична использованию предварительно обученной модели в классификации изображений (ImageNet) или в языковом моделировании (большие текстовые корпуса), когда доступен только ограниченный набор образцов данных для конкретной задачи. Мета-обучение идет еще  на один шаг вперед, вместо того, чтобы подстраивать ее под одну задачу, она оптимизирует модель, чтобы она была хороша для многих задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Основанные на оптимизации&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Модели глубокого обучения (deep learning) обучаются через обратное распространение градиентов. Тем не менее, оптимизация, основанная на градиентах не разрабатывалась для работы с небольшим количеством обучающих семплов, и не сходится за малое число оптимизационных шагов. Подход в мета-обучении, основанный на оптимизации как раз про это.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;LSTM-meta-learner&amp;lt;/h3&amp;gt;&lt;br /&gt;
Оптимизационный алгоитм может быть явно смоделирован. Ravi &amp;amp; Larochelle (2017) это и сделали и назвали его &amp;quot;meta-learner&amp;quot;. Цель meta-learner'а - эффективно обновлять параметры learner'a используя небольшой train set так, чтобы learner мог быстро адаптироваться к новым задачам.&lt;br /&gt;
&lt;br /&gt;
Пусть модель ученика будет $M_θ$, параметризованной $θ$, и meta-learner как $R_Θ$ с параметром $θ$, и функция потерь $\mathcal{L}$.&lt;br /&gt;
&lt;br /&gt;
Обновление параметров learner'a во время $t$ c learning rate $\alpha_t$ (шаг градиентного спуска):&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta_t = \theta_{t-1} - \alpha_t \nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Обновление памяти ячейки LSTM выглядит так:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t = \theta_{t-1} - \alpha_t\nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
$c_t$ {{---}} параметры сети $\theta_t$, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ при $f_t$ = 1.&lt;br /&gt;
&lt;br /&gt;
$f_t$ = 1, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ - не оптимальные значения, их изменение может оказаться полезным, если вы попали в неудачный локальный минимум.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
f_t &amp;amp;= \sigma(\mathbf{W}_f \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, f_{t-1}] + \mathbf{b}_f) &amp;amp; \scriptstyle{\text{; как сильно мы забываем старые значения параметров.}}\\&lt;br /&gt;
i_t &amp;amp;= \sigma(\mathbf{W}_i \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, i_{t-1}] + \mathbf{b}_i) &amp;amp; \scriptstyle{\text{; соответствует рейту обучения на шаге t.}}\\&lt;br /&gt;
\tilde{\theta}_t &amp;amp;= -\nabla_{\theta_{t-1}}\mathcal{L}_t &amp;amp;\\&lt;br /&gt;
\theta_t &amp;amp;= f_t \odot \theta_{t-1} + i_t \odot \tilde{\theta}_t &amp;amp;\\&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
я ничего не понял..&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;REPTILE&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reptile {{---}} относительно простой алгоритм мета-обучения, похожий на MAML, например, тем, что оба используют мета-оптимизацию через градиентый спуск и оба не чувствительны к модели.&lt;br /&gt;
&lt;br /&gt;
# сэмплируем задачу&lt;br /&gt;
# тренируемся на ней несколькими шагами градиентного спуска&lt;br /&gt;
# сдвигаем веса модели к новым параметрам.&lt;br /&gt;
&lt;br /&gt;
$\text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$ выполняет стохастический градиентный спуск на $k$ шагов на лоссе $\mathcal{L}_{\tau_i}$, начиная с параметра $\theta$ и возвращает конечный вектор параметров. Градиент reptile определяется как $(\theta - W)/\alpha$, где $\alpha$ {{---}} размер шага, используемый функцией $SGD$.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// Algorithm REPTILE, batched version&amp;lt;/font&amp;gt;&lt;br /&gt;
  Initialize $\theta$&lt;br /&gt;
  '''for''' $iteration = 1, 2,...$ '''do'''&lt;br /&gt;
    Sample tasks $\tau_1, \tau_2, ..., \tau_n$&lt;br /&gt;
    '''for''' $i = 1, 2, ..., n$ '''do'''&lt;br /&gt;
      Compute $W_i = \text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$&lt;br /&gt;
    '''end for'''&lt;br /&gt;
    Update $\theta \leftarrow \theta + \beta 1/n \sum (W_i - \theta)$&lt;br /&gt;
  '''end for'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Определение множества конфигураций&amp;lt;/h2&amp;gt;&lt;br /&gt;
Предшествующие выисления могут быть также использованы для изучения пространства более успешных конфигураций \theta\star. Более подходящие под задачу конфигурации могут серьезно ускорить поиск оптимальных моделей, это важно при ограниченных вычислительных рессурсах.&lt;br /&gt;
&lt;br /&gt;
Альтернативный подход сперва узнать оптимальные гипермараметры, а потом через приращение производительности определить важность каждого из гиперпараметров. Это и было сделано в лабе OpenML, провели около 500 000 экспериментов на 6 алгоритмах и 38 датасетах. Стандартные значения изучались вместе для всех гиперпараметров алгоритма посредством обучения суррогатных моделей для этого алгоритма на большом числе задач. После того, как уже проверены многие варинаты конфигураций, выбирается такая, которая минимизирует ??? для всех задач, становится стандартной.Далее определяется важность каждого из гиперпараметров. Чем больше меняется приращение производительности, тем более важный гиперпараметр мы изменяем.&lt;br /&gt;
&lt;br /&gt;
Если мы хотим предоставить рекомендации для конкретной задачи $t_{new}$, нам нужна дополнительная информация о том, насколько $t_{new}$ похожа на предыдущие задачи $t_j$. Первый способ {{---}} посчитать число рекомендованных конфигураций для $t_new$, yielding новый эвиденс $\mathbf{P}_{new}$. Если позже мы будем наблюдать, что вычисления $P_{i,new}$ соответствуют $P_{i, j}$, то $t_{j}$ и $t_{new}$ могут быть очень похожими. Мы можем применить это знания для обучения meta-learner'a который предскаывает множество рекомендуемых конфигураций $\Theta^{*}_{new}$ for $t_{new}$.&lt;br /&gt;
Более того, можно пойти дальше и добавить $\Theta^{*}_{new}$ в $P_new$ и перейти к следующей итерации и выяснять какие еще задачи схожи друг с другом.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Relative landmarks&amp;lt;/h3&amp;gt;&lt;br /&gt;
Первая мера для вычисления &amp;quot;похожести&amp;quot; задач вычисляла попарно разницу в производительности, так же называемую &amp;quot;relative landmarks&amp;quot; $RL_{a,b,j} = P_{a,j} - P_{b,j}$ между двумя конфигурациями $\theta_{a}$ и $\theta_{b}$ на конкретной задаче $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Суррогатные модели&amp;lt;/h3&amp;gt;&lt;br /&gt;
Более гибкий способ передать информацию {{---}} построить суррогатную модель $s_{j}(\theta_{i}) = P_{i,j}$ для всех предшествующих задач $t_{j}$, обученную с использованием всех доступных $\mathbf{P}$. Можно определить &amp;quot;похожесть&amp;quot; задач в терминах ошибок между $s_{j}(\theta_{i})$ и $P_{i,new}$: если суррогатная модель для $t_{j}$ может генерировать точные предсказания для $t_{new}$, тогда такие задачи весьма похожи. Обычно это делается в комбинации с Байесовской оптимизацией для определения следующей $\theta_{i}$.&lt;br /&gt;
&lt;br /&gt;
Так же можно обучать суррогатные модли на Гауссовских процессах (GP) для каждой предыдущей задачи и еще одну для $t_{new}$ и объединить их во взвешенную и нормализованную сумму, с медианой $\mu$ определенной как взвшенная сумма $\mu_{j}$ полученных из задач $t_{j}$. Веса $\mu_{j}$ считаются через Nadaraya-Watson kernel-weighted average, где каждая задача представлена вектором relative landmarks и Epanechnikov quadratic kernel используется для определения похожести между векторами relative landmarks для $t_{j}$ и $t_{new}$. Чем больше $t_{j}$ похожа на  $t_{new}$, тем больше получится вес $s_{j}$, увеличивающий влияние суррогатной модели для $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
Суррогатные модели обучаются только на $P_{i, new}$, а следующий $\theta_{i}$ поулчается путем нахождения средневзвешенного expected improvement $P_{i, new}$ и предсказанных улучшений на всех предшествующих $P_{i, j}$.&lt;br /&gt;
Веса предшествующих задач могут быть переопределены через точность суррогатной модели или через relative landmarks.&lt;br /&gt;
Вес ожидаемого улучшения (expected improvement) постепенно возрастает с каждой итерацией (с увеличением собранного эвиденса $P_{i, new}$).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Обучение на свойствах задачи (learning on task properties)&amp;lt;/h3&amp;gt;&lt;br /&gt;
Каждая задача $t_{j} \in T$ может быть описана вектором $m(t_j) = (m_{j,1}, ...,m_{j,K})$ из $K$ мета-фичей $m_{j, k} \in M$ $M$ {{---}} множество мета-фичей. Можно определить меру &amp;quot;похожести&amp;quot; задач, основанную, например, на Евклидовом расстоянии между $m(t_i)$ и $m(t_j)$, тогда можно будет использовать информацию из наиболее похожей задачи на новую задачу $t_{new}$. Более того, используя предшествующие вычисления $\textbf{P}$ можно обучить meta-learner'a $L$ предсказывать производительность $P_{i, new}$ конфигураций $\theta_{i}$ на новых задачах $t_{new}$.&lt;br /&gt;
&lt;br /&gt;
$L: \Theta \times M \rightarrow \textbf{P}$&lt;br /&gt;
&lt;br /&gt;
В таблице представлен обзор наиболее используемых мета-фичей.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Meta-feature&lt;br /&gt;
|-&lt;br /&gt;
! '''Name''' !! '''Formula''' !! '''Rationale''' !! '''Variants'''&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''simple'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr instances || $n$ || Speed, Scalability \citep{Michie1994} || $p/n$, $log(n)$, log(n/p)&lt;br /&gt;
|-&lt;br /&gt;
| Nr features || $p$ || Curse of dimensionality \citep{Michie1994} || $log(p)$, % categorical&lt;br /&gt;
|-&lt;br /&gt;
| Nr classes || $c$ || Complexity, imbalance \citep{Michie1994} || ratio min/maj class&lt;br /&gt;
|-&lt;br /&gt;
| Nr missing values || $m$ || Imputation effects \citep{kalousis02} || % missing&lt;br /&gt;
|-&lt;br /&gt;
| Nr outliers || $o$ || Data noisiness \citep{Rousseeuw2011} || $o/n$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''statistical'''&lt;br /&gt;
|-&lt;br /&gt;
| Skewness || $\frac{E(X-\mu_{X})^{3}}{\sigma_{X}^{3}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Kurtosis || $\frac{E(X-\mu_{X})^{4}}{\sigma_{X}^{4}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Correlation || $\rho_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$\rho_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Covariance || $cov_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$cov_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Concentration || $\tau_{X_{1}X_{2}}$ || Feature interdependence \citep{Kalousis2001a} || min,max,$\mu$,$\sigma$,$\tau_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Sparsity || sparsity(X) || Degree of discreteness \citep{Salama2013} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Gravity || gravity(X) || Inter-class dispersion \citep{Ali2006} ||&lt;br /&gt;
|-&lt;br /&gt;
| ANOVA p-value || $p_{val_{\texttt{X}_{1}X_{2}}}$ || Feature redundancy \citep{kalousis02} || $p_{val_{XY}}$\citep{soares+04}&lt;br /&gt;
|-&lt;br /&gt;
| Coeff. of variation || $\frac{\sigma_{Y}}{\mu_{Y}}$ || Variation in target \citep{soares+04} ||&lt;br /&gt;
|-&lt;br /&gt;
| PCA $\rho_{\lambda_{1}}$ || $\sqrt{\frac{\lambda_{1}}{1+\lambda_{1}}}$ || Variance in first PC \citep{Michie1994} || $\frac{\lambda_{1}}{\sum_{i} \lambda_{i}}$\citep{Michie1994}&lt;br /&gt;
|-&lt;br /&gt;
| PCA skewness || || Skewness of first PC \citep{feurer2014using} || PCA kurtosis&lt;br /&gt;
|-&lt;br /&gt;
| PCA 95\% || $\frac{dim_{95\% var}}{p}$ || Intrinsic dimensionality \citep{bardenet2013collaborative} ||&lt;br /&gt;
|-&lt;br /&gt;
| Class probability || $P(\texttt{C})$ || Class distribution \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''informational-theoretic'''&lt;br /&gt;
|-&lt;br /&gt;
| Class entropy  || $H(\texttt{C})$ || Class imbalance \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Norm. entropy || $\frac{H(\texttt{X})}{log_{2}n}$ || Feature informativeness \citep{Castiello2005} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Mutual inform. || $MI(\texttt{C},\texttt{X})$ || Feature importance \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Uncertainty coeff. || $\frac{MI(\texttt{C},\texttt{X})}{H(\texttt{C})}$ || Feature importance \citep{Agresti:2002p7509} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Equiv. nr. feats || $\frac{H(C)}{\overline{MI(C,X)}}$ || Intrinsic dimensionality \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Noise-signal ratio || $\frac{\overline{H(X)}-\overline{MI(C,X)}}{\overline{MI(C,X)}}$ || Noisiness of data \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''complexity'''&lt;br /&gt;
|-&lt;br /&gt;
| Fisher's discrimin. || $\frac{(\mu_{c1}-\mu_{c2})^{2}}{\sigma_{c1}^{2}-\sigma_{c2}^{2}}$ || Separability classes $c_{1},c_{2}$ \citep{Ho:2002} || See \citet{}{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Volume of overlap || || Class distribution overlap \citep{Ho:2002} || See \citet{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Concept variation || || Task complexity \citep{Vilalta:2002p5805} || See \citet{Vilalta:1999p5745}&lt;br /&gt;
|-&lt;br /&gt;
| Data consistency || || Data quality \citep{Kopf:2002p5864} || See \citet{Kopf:2002p5864}&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''model-based'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr nodes, leaves || &amp;lt;tex&amp;gt;|\eta|,|\psi|&amp;lt;/tex&amp;gt; || Concept complexity \citep{Peng:2002p705} || Tree depth&lt;br /&gt;
|-&lt;br /&gt;
| Branch length || || Concept complexity \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Nodes per feature || &amp;lt;tex&amp;gt;|\eta_{X}|&amp;lt;/tex&amp;gt; || Feature importance \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves per class || &amp;lt;tex&amp;gt;\frac{|\psi_{c}|}{|\psi|}&amp;lt;/tex&amp;gt; ||  Class complexity \citep{Filchenkov2015} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves agreement || &amp;lt;tex&amp;gt;\frac{n_{\psi_{i}}}{n}&amp;lt;/tex&amp;gt; ||  Class separability \citep{Bensusan2000} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Information gain || || Feature importance \citep{Bensusan2000} || min,max,$\mu$,$\sigma$, gini&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''landmarks'''&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(1NN) || $P(\theta_{1NN},t_{j})$ || Data sparsity \citep{Pfahringer:2000p553} || See \citet{Pfahringer:2000p553}&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Tree) || $P(\theta_{Tree},t_{j})$ || Data separability \citep{Pfahringer:2000p553} || Stump,RandomTree&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Lin) || $P(\theta_{Lin},t_{j})$ || Linear separability \citep{Pfahringer:2000p553} || Lin.Disciminant&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(NB) || $P(\theta_{NB},t_{j})$ || Feature independence \citep{Pfahringer:2000p553} || See \citet{Ler:2005p1680}&lt;br /&gt;
|-&lt;br /&gt;
| Relative LM || $P_{a,j} - P_{b,j}$ || Probing performance \citep{Furnkranz:2001p1278} ||&lt;br /&gt;
|-&lt;br /&gt;
| Subsample LM || $P(\theta_{i},t_{j},s_{t})$ || Probing performance \citep{Soares:2001p708} ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Непрерывные фичи $X$ и таргет $Y$ имеют медиану $\mu_{X}$, stdev $\sigma_{X}$, variance $\sigma^{2}_{X}$. Категориальные фичи $\texttt{X}$ и класс $\texttt{C}$ имеют категориальные значения  $\pi_{i}$, условные вероятности $\pi_{i|j}$, совместные вероятности $\pi_{i,j}$, предельные вероятности $\pi_{i+}=\sum_{j}\pi_{ij}$, энтропию $H(\texttt{X})=-\sum_{i}\pi_{i+}log_{2}(\pi_{i+})$.&lt;br /&gt;
&lt;br /&gt;
Многие мета-фичи вычисляются по одиночным фичам или комбинации фичей, и должны быть агрегированы через min,max,$\mu$,$\sigma$,quartiles или гистограммами [kalousis]&lt;br /&gt;
&lt;br /&gt;
Во время вычисления похожести задач важно нормализовывать все мета-фичи [bardnet], использовать feature selection [todorovski] или использовать dimensionality reduction (PCA, например).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Примечания&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html#define-the-meta-learning-problem&lt;br /&gt;
https://arxiv.org/pdf/1810.03548.pdf&lt;br /&gt;
https://www.ml4aad.org/wp-content/uploads/2018/09/chapter2-metalearning.pdf&lt;br /&gt;
https://openreview.net/pdf?id=rJY0-Kcll&lt;br /&gt;
https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf&lt;br /&gt;
Alexandros Kalousis and Melanie Hilario. Model selection v&lt;br /&gt;
ia meta-learning: a comparative&lt;br /&gt;
study.&lt;br /&gt;
Intl Journ. on Artificial Intelligence Tools&lt;br /&gt;
, 10(4):525–554, 2001.&lt;br /&gt;
R ́emi Bardenet, M ́aty ́as Brendel, Bal ́azs K ́egl, and Michele Sebag. Collaborative hyperparameter tuning. In Proceedings of ICML 2013, pages 199–207, 2013&lt;br /&gt;
L Todorovski and S Dzeroski. Experiments in meta-level learning with ILP.&lt;br /&gt;
Lecture Notes in Computer Science, 1704:98–106, 1999.&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69389</id>
		<title>Мета-обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0-%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69389"/>
				<updated>2019-01-25T23:03:13Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: Замена - на {{---}}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;b&amp;gt;Мета-обучение&amp;lt;/b&amp;gt; {{---}} подход, повзоляющий определять оптимальный алгоритм (иногда, вместе с параметрами к нему) для конкретной задачи. Основная идея мета-обучения {{---}} свети задачу выбора алгоритма к задаче обучения с учителем: задачи описываются мета-фичами. Мета-фича описывает свойство задачи - напмример, разрежен ли датасет или нет.&lt;br /&gt;
&lt;br /&gt;
От хорошей модели ожидается хорошая адаптируемость или генерализуемость новых задач и окружений, с которыми модель не сталкивалась во время обучения.&lt;br /&gt;
&lt;br /&gt;
Такими задачами являются:&lt;br /&gt;
* Классификатор, тренированный на изображениях собак и велосипедов, после некоторых показанных ему кошек, смог определить, есть ли на новой картинке кошка&lt;br /&gt;
* Игровой бот, способный быстро обучиться новой игре&lt;br /&gt;
* Робот, выполняющий задачу на пригорке во время теста даже если он тренировался на ровной поверхности&lt;br /&gt;
&lt;br /&gt;
Ограничения&lt;br /&gt;
- No free lunch teorem [Wolpert and Macready, 1996; Giraud-Carrier and Provost, 2005]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Simple view&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошая модель мета-обучения должна быть обучена на множестве задач и оптимизирована для лучшей производительности на нескольких задачах,&lt;br /&gt;
включая такие, с которыми модель не сталкивалась ранее. Каждой задаче соответствует датасет $\mathcal{D}$, содержащий и векторы фичей и правильную разметку.&lt;br /&gt;
Оптимальные параметры модели:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* = \arg\min_\theta \mathbb{E}_{\mathcal{D}\sim p(\mathcal{D})} [\mathcal{L}_\theta(\mathcal{D})]&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Очень похоже на обычную задачу машинного обучения, только один датасет принимается за один сэмпл данных.&lt;br /&gt;
&lt;br /&gt;
Few-shot классификатор конкретизация мета-обучения в области обучения с учителем. Датасет $\mathcal{D}$ делится на две части: $\mathcal{D}=\langle S, B\rangle$,&lt;br /&gt;
train set $S$ и test set $B$. Часто принимается k-shot N-class задача - train set содержит $k$ размеченных примеров для каждого из $N$ классов.&lt;br /&gt;
Датасет $\mathcal{D}$ содержит пары фичей и меток, $\mathcal{D} = \{(\mathbf{x}_i, y_i)\}$ и каждая метка принадлежит известному множеству меток $\mathcal{L}$. Скажем, наш классификатор $f_θ$ с параметром $θ$ показывает вероятность принадлежности точки из данных к классу $y$ при векторе фичей $x$, $Pθ(y|x)$&lt;br /&gt;
Оптимальные параметры должны максимизировать вероятность верных меток среди нескольких training sets $B⊂\mathcal{D}$:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{(\mathbf{x}, y)\in \mathcal{D}}[P_\theta(y \vert \mathbf{x})] &amp;amp;\\&lt;br /&gt;
\theta^* &amp;amp;= {\arg\max}_{\theta} \mathbb{E}_{B\subset \mathcal{D}}[\sum_{(\mathbf{x}, y)\in B}P_\theta(y \vert \mathbf{x})] &amp;amp; \scriptstyle{\text{; trained with mini-batches.}}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
В few-shot классификации цель {{---}} уменьшить ошибку предсказания на неразмеченных данных с данным train set для &amp;quot;быстрого обучения&amp;quot;. Чтобы ускорить процесс обучения, сделаем следующее:&lt;br /&gt;
# возьмем подмножество меток, $L\subset\mathcal{L}$&lt;br /&gt;
# возьмем train set $S^L⊂D$ и train batch $B^L⊂D$. Оба содержат только данные с метками из подмножества с пункта 1:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
L, y \in L, \forall (x, y) \in S^L, B^L&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
# Множество $S^L$ подается на вход модели.&lt;br /&gt;
# Конечная оптимизация использует множество $B^L$ чтобы посчитать loss и обновить параметры модели через обратное распространение, так же, как это делается в обучении с учителем.&lt;br /&gt;
&lt;br /&gt;
Можно представить каждую пару сэмплированного датасета $(S^L,B^L)$ как одну точку. Модель обучается таким образом, чтобыона могла обобщиться до других датасетов.&lt;br /&gt;
Красным выделен дифф между обучением с учителем и мета-обучением.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta = \arg\max_\theta \color{red}{E_{L\subset\mathcal{L}}[} E_{\color{red}{S^L \subset\mathcal{D}, }B^L \subset\mathcal{D}} [\sum_{(x, y)\in B^L} P_\theta(x, y\color{red}{, S^L})] \color{red}{]}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Идея в некоторой степени аналогична использованию предварительно обученной модели в классификации изображений (ImageNet) или в языковом моделировании (большие текстовые корпуса), когда доступен только ограниченный набор образцов данных для конкретной задачи. Мета-обучение идет еще  на один шаг вперед, вместо того, чтобы подстраивать ее под одну задачу, она оптимизирует модель, чтобы она была хороша для многих задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Основанные на оптимизации&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Модели глубокого обучения (deep learning) обучаются через обратное распространение градиентов. Тем не менее, оптимизация, основанная на градиентах не разрабатывалась для работы с небольшим количеством обучающих семплов, и не сходится за малое число оптимизационных шагов. Подход в мета-обучении, основанный на оптимизации как раз про это.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;LSTM-meta-learner&amp;lt;/h3&amp;gt;&lt;br /&gt;
Оптимизационный алгоитм может быть явно смоделирован. Ravi &amp;amp; Larochelle (2017) это и сделали и назвали его &amp;quot;meta-learner&amp;quot;. Цель meta-learner'а - эффективно обновлять параметры learner'a используя небольшой train set так, чтобы learner мог быстро адаптироваться к новым задачам.&lt;br /&gt;
&lt;br /&gt;
Пусть модель ученика будет $M_θ$, параметризованной $θ$, и meta-learner как $R_Θ$ с параметром $θ$, и функция потерь $\mathcal{L}$.&lt;br /&gt;
&lt;br /&gt;
Обновление параметров learner'a во время $t$ c learning rate $\alpha_t$ (шаг градиентного спуска):&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\theta_t = \theta_{t-1} - \alpha_t \nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
Обновление памяти ячейки LSTM выглядит так:&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t = \theta_{t-1} - \alpha_t\nabla_{\theta_{t-1}}\mathcal{L}_t&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
$c_t$ {{---}} параметры сети $\theta_t$, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ при $f_t$ = 1.&lt;br /&gt;
&lt;br /&gt;
$f_t$ = 1, $\tilde{c}_t = -\nabla_{\theta_{t-1}}\mathcal{L}_t$ - не оптимальные значения, их изменение может оказаться полезным, если вы попали в неудачный локальный минимум.&lt;br /&gt;
&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
f_t &amp;amp;= \sigma(\mathbf{W}_f \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, f_{t-1}] + \mathbf{b}_f) &amp;amp; \scriptstyle{\text{; как сильно мы забываем старые значения параметров.}}\\&lt;br /&gt;
i_t &amp;amp;= \sigma(\mathbf{W}_i \cdot [\nabla_{\theta_{t-1}}\mathcal{L}_t, \mathcal{L}_t, \theta_{t-1}, i_{t-1}] + \mathbf{b}_i) &amp;amp; \scriptstyle{\text{; соответствует рейту обучения на шаге t.}}\\&lt;br /&gt;
\tilde{\theta}_t &amp;amp;= -\nabla_{\theta_{t-1}}\mathcal{L}_t &amp;amp;\\&lt;br /&gt;
\theta_t &amp;amp;= f_t \odot \theta_{t-1} + i_t \odot \tilde{\theta}_t &amp;amp;\\&lt;br /&gt;
\end{aligned}&lt;br /&gt;
&lt;br /&gt;
я ничего не понял..&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;REPTILE&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reptile {{---}} относительно простой алгоритм мета-обучения, похожий на MAML, например, тем, что оба используют мета-оптимизацию через градиентый спуск и оба не чувствительны к модели.&lt;br /&gt;
&lt;br /&gt;
# сэмплируем задачу&lt;br /&gt;
# тренируемся на ней несколькими шагами градиентного спуска&lt;br /&gt;
# сдвигаем веса модели к новым параметрам.&lt;br /&gt;
&lt;br /&gt;
$\text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$ выполняет стохастический градиентный спуск на $k$ шагов на лоссе $\mathcal{L}_{\tau_i}$, начиная с параметра $\theta$ и возвращает конечный вектор параметров. Градиент reptile определяется как $(\theta - W)/\alpha$, где $\alpha$ {{---}} размер шага, используемый функцией $SGD$.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// Algorithm REPTILE, batched version&amp;lt;/font&amp;gt;&lt;br /&gt;
  Initialize $\theta$&lt;br /&gt;
  '''for''' $iteration = 1, 2,...$ '''do'''&lt;br /&gt;
    Sample tasks $\tau_1, \tau_2, ..., \tau_n$&lt;br /&gt;
    '''for''' $i = 1, 2, ..., n$ '''do'''&lt;br /&gt;
      Compute $W_i = \text{SGD}(\mathcal{L}_{\tau_i}, \theta, k)$&lt;br /&gt;
    '''end for'''&lt;br /&gt;
    Update $\theta \leftarrow \theta + \beta 1/n \sum (W_i - \theta)$&lt;br /&gt;
  '''end for'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Определение множества конфигураций&amp;lt;/h2&amp;gt;&lt;br /&gt;
Предшествующие выисления могут быть также использованы для изучения пространства более успешных конфигураций \theta\star. Более подходящие под задачу конфигурации могут серьезно ускорить поиск оптимальных моделей, это важно при ограниченных вычислительных рессурсах.&lt;br /&gt;
&lt;br /&gt;
Альтернативный подход сперва узнать оптимальные гипермараметры, а потом через приращение производительности определить важность каждого из гиперпараметров. Это и было сделано в лабе OpenML, провели около 500 000 экспериментов на 6 алгоритмах и 38 датасетах. Стандартные значения изучались вместе для всех гиперпараметров алгоритма посредством обучения суррогатных моделей для этого алгоритма на большом числе задач. После того, как уже проверены многие варинаты конфигураций, выбирается такая, которая минимизирует ??? для всех задач, становится стандартной.Далее определяется важность каждого из гиперпараметров. Чем больше меняется приращение производительности, тем более важный гиперпараметр мы изменяем.&lt;br /&gt;
&lt;br /&gt;
Если мы хотим предоставить рекомендации для конкретной задачи $t_{new}$, нам нужна дополнительная информация о том, насколько $t_{new}$ похожа на предыдущие задачи $t_j$. Первый способ {{---}} посчитать число рекомендованных конфигураций для $t_new$, yielding новый эвиденс $\mathbf{P}_{new}$. Если позже мы будем наблюдать, что вычисления $P_{i,new}$ соответствуют $P_{i, j}$, то $t_{j}$ и $t_{new}$ могут быть очень похожими. Мы можем применить это знания для обучения meta-learner'a который предскаывает множество рекомендуемых конфигураций $\Theta^{*}_{new}$ for $t_{new}$.&lt;br /&gt;
Более того, можно пойти дальше и добавить $\Theta^{*}_{new}$ в $P_new$ и перейти к следующей итерации и выяснять какие еще задачи схожи друг с другом.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Relative landmarks&amp;lt;/h3&amp;gt;&lt;br /&gt;
Первая мера для вычисления &amp;quot;похожести&amp;quot; задач вычисляла попарно разницу в производительности, так же называемую &amp;quot;relative landmarks&amp;quot; $RL_{a,b,j} = P_{a,j} - P_{b,j}$ между двумя конфигурациями $\theta_{a}$ и $\theta_{b}$ на конкретной задаче $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Суррогатные модели&amp;lt;/h3&amp;gt;&lt;br /&gt;
Более гибкий способ передать информацию {{---}} построить суррогатную модель $s_{j}(\theta_{i}) = P_{i,j}$ для всех предшествующих задач $t_{j}$, обученную с использованием всех доступных $\mathbf{P}$. Можно определить &amp;quot;похожесть&amp;quot; задач в терминах ошибок между $s_{j}(\theta_{i})$ и $P_{i,new}$: если суррогатная модель для $t_{j}$ может генерировать точные предсказания для $t_{new}$, тогда такие задачи весьма похожи. Обычно это делается в комбинации с Байесовской оптимизацией для определения следующей $\theta_{i}$.&lt;br /&gt;
&lt;br /&gt;
Так же можно обучать суррогатные модли на Гауссовских процессах (GP) для каждой предыдущей задачи и еще одну для $t_{new}$ и объединить их во взвешенную и нормализованную сумму, с медианой $\mu$ определенной как взвшенная сумма $\mu_{j}$ полученных из задач $t_{j}$. Веса $\mu_{j}$ считаются через Nadaraya-Watson kernel-weighted average, где каждая задача представлена вектором relative landmarks и Epanechnikov quadratic kernel используется для определения похожести между векторами relative landmarks для $t_{j}$ и $t_{new}$. Чем больше $t_{j}$ похожа на  $t_{new}$, тем больше получится вес $s_{j}$, увеличивающий влияние суррогатной модели для $t_{j}$.&lt;br /&gt;
&lt;br /&gt;
Суррогатные модели обучаются только на $P_{i, new}$, а следующий $\theta_{i}$ поулчается путем нахождения средневзвешенного expected improvement $P_{i, new}$ и предсказанных улучшений на всех предшествующих $P_{i, j}$.&lt;br /&gt;
Веса предшествующих задач могут быть переопределены через точность суррогатной модели или через relative landmarks.&lt;br /&gt;
Вес ожидаемого улучшения (expected improvement) постепенно возрастает с каждой итерацией (с увеличением собранного эвиденса $P_{i, new}$).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Обучение на свойствах задачи (learning on task properties)&amp;lt;/h3&amp;gt;&lt;br /&gt;
Каждая задача $t_{j} \in T$ может быть описана вектором $m(t_j) = (m_{j,1}, ...,m_{j,K})$ из $K$ мета-фичей $m_{j, k} \in M$ $M$ {{---}} множество мета-фичей. Можно определить меру &amp;quot;похожести&amp;quot; задач, основанную, например, на Евклидовом расстоянии между $m(t_i)$ и $m(t_j)$, тогда можно будет использовать информацию из наиболее похожей задачи на новую задачу $t_{new}$. Более того, используя предшествующие вычисления $\textbf{P}$ можно обучить meta-learner'a $L$ предсказывать производительность $P_{i, new}$ конфигураций $\theta_{i}$ на новых задачах $t_{new}$.&lt;br /&gt;
&lt;br /&gt;
$L: \Theta \times M \rightarrow \textbf{P}$&lt;br /&gt;
&lt;br /&gt;
В таблице представлен обзор наиболее используемых мета-фичей.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Meta-feature&lt;br /&gt;
|-&lt;br /&gt;
! '''Name''' !! '''Formula''' !! '''Rationale''' !! '''Variants'''&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''simple'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr instances || $n$ || Speed, Scalability \citep{Michie1994} || $p/n$, $log(n)$, log(n/p)&lt;br /&gt;
|-&lt;br /&gt;
| Nr features || $p$ || Curse of dimensionality \citep{Michie1994} || $log(p)$, % categorical&lt;br /&gt;
|-&lt;br /&gt;
| Nr classes || $c$ || Complexity, imbalance \citep{Michie1994} || ratio min/maj class&lt;br /&gt;
|-&lt;br /&gt;
| Nr missing values || $m$ || Imputation effects \citep{kalousis02} || % missing&lt;br /&gt;
|-&lt;br /&gt;
| Nr outliers || $o$ || Data noisiness \citep{Rousseeuw2011} || $o/n$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''statistical'''&lt;br /&gt;
|-&lt;br /&gt;
| Skewness || $\frac{E(X-\mu_{X})^{3}}{\sigma_{X}^{3}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Kurtosis || $\frac{E(X-\mu_{X})^{4}}{\sigma_{X}^{4}}$ || Feature normality \citep{Michie1994} || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Correlation || $\rho_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$\rho_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Covariance || $cov_{X_{1}X_{2}}$ || Feature interdependence \citep{Michie1994} || min,max,$\mu$,$\sigma$,$cov_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Concentration || $\tau_{X_{1}X_{2}}$ || Feature interdependence \citep{Kalousis2001a} || min,max,$\mu$,$\sigma$,$\tau_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Sparsity || sparsity(X) || Degree of discreteness \citep{Salama2013} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Gravity || gravity(X) || Inter-class dispersion \citep{Ali2006} ||&lt;br /&gt;
|-&lt;br /&gt;
| ANOVA p-value || $p_{val_{\texttt{X}_{1}X_{2}}}$ || Feature redundancy \citep{kalousis02} || $p_{val_{XY}}$\citep{soares+04}&lt;br /&gt;
|-&lt;br /&gt;
| Coeff. of variation || $\frac{\sigma_{Y}}{\mu_{Y}}$ || Variation in target \citep{soares+04} ||&lt;br /&gt;
|-&lt;br /&gt;
| PCA $\rho_{\lambda_{1}}$ || $\sqrt{\frac{\lambda_{1}}{1+\lambda_{1}}}$ || Variance in first PC \citep{Michie1994} || $\frac{\lambda_{1}}{\sum_{i} \lambda_{i}}$\citep{Michie1994}&lt;br /&gt;
|-&lt;br /&gt;
| PCA skewness || || Skewness of first PC \citep{feurer2014using} || PCA kurtosis&lt;br /&gt;
|-&lt;br /&gt;
| PCA 95\% || $\frac{dim_{95\% var}}{p}$ || Intrinsic dimensionality \citep{bardenet2013collaborative} ||&lt;br /&gt;
|-&lt;br /&gt;
| Class probability || $P(\texttt{C})$ || Class distribution \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''informational-theoretic'''&lt;br /&gt;
|-&lt;br /&gt;
| Class entropy  || $H(\texttt{C})$ || Class imbalance \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Norm. entropy || $\frac{H(\texttt{X})}{log_{2}n}$ || Feature informativeness \citep{Castiello2005} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Mutual inform. || $MI(\texttt{C},\texttt{X})$ || Feature importance \citep{Michie1994} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Uncertainty coeff. || $\frac{MI(\texttt{C},\texttt{X})}{H(\texttt{C})}$ || Feature importance \citep{Agresti:2002p7509} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Equiv. nr. feats || $\frac{H(C)}{\overline{MI(C,X)}}$ || Intrinsic dimensionality \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| Noise-signal ratio || $\frac{\overline{H(X)}-\overline{MI(C,X)}}{\overline{MI(C,X)}}$ || Noisiness of data \citep{Michie1994} ||&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''complexity'''&lt;br /&gt;
|-&lt;br /&gt;
| Fisher's discrimin. || $\frac{(\mu_{c1}-\mu_{c2})^{2}}{\sigma_{c1}^{2}-\sigma_{c2}^{2}}$ || Separability classes $c_{1},c_{2}$ \citep{Ho:2002} || See \citet{}{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Volume of overlap || || Class distribution overlap \citep{Ho:2002} || See \citet{Ho:2002}&lt;br /&gt;
|-&lt;br /&gt;
| Concept variation || || Task complexity \citep{Vilalta:2002p5805} || See \citet{Vilalta:1999p5745}&lt;br /&gt;
|-&lt;br /&gt;
| Data consistency || || Data quality \citep{Kopf:2002p5864} || See \citet{Kopf:2002p5864}&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''model-based'''&lt;br /&gt;
|-&lt;br /&gt;
| Nr nodes, leaves || &amp;lt;tex&amp;gt;|\eta|,|\psi|&amp;lt;/tex&amp;gt; || Concept complexity \citep{Peng:2002p705} || Tree depth&lt;br /&gt;
|-&lt;br /&gt;
| Branch length || || Concept complexity \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Nodes per feature || &amp;lt;tex&amp;gt;|\eta_{X}|&amp;lt;/tex&amp;gt; || Feature importance \citep{Peng:2002p705} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves per class || &amp;lt;tex&amp;gt;\frac{|\psi_{c}|}{|\psi|}&amp;lt;/tex&amp;gt; ||  Class complexity \citep{Filchenkov2015} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Leaves agreement || &amp;lt;tex&amp;gt;\frac{n_{\psi_{i}}}{n}&amp;lt;/tex&amp;gt; ||  Class separability \citep{Bensusan2000} || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Information gain || || Feature importance \citep{Bensusan2000} || min,max,$\mu$,$\sigma$, gini&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot; | '''landmarks'''&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(1NN) || $P(\theta_{1NN},t_{j})$ || Data sparsity \citep{Pfahringer:2000p553} || See \citet{Pfahringer:2000p553}&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Tree) || $P(\theta_{Tree},t_{j})$ || Data separability \citep{Pfahringer:2000p553} || Stump,RandomTree&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Lin) || $P(\theta_{Lin},t_{j})$ || Linear separability \citep{Pfahringer:2000p553} || Lin.Disciminant&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(NB) || $P(\theta_{NB},t_{j})$ || Feature independence \citep{Pfahringer:2000p553} || See \citet{Ler:2005p1680}&lt;br /&gt;
|-&lt;br /&gt;
| Relative LM || $P_{a,j} - P_{b,j}$ || Probing performance \citep{Furnkranz:2001p1278} ||&lt;br /&gt;
|-&lt;br /&gt;
| Subsample LM || $P(\theta_{i},t_{j},s_{t})$ || Probing performance \citep{Soares:2001p708} ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Непрерывные фичи $X$ и таргет $Y$ имеют медиану $\mu_{X}$, stdev $\sigma_{X}$, variance $\sigma^{2}_{X}$. Категориальные фичи $\texttt{X}$ и класс $\texttt{C}$ имеют категориальные значения  $\pi_{i}$, условные вероятности $\pi_{i|j}$, совместные вероятности $\pi_{i,j}$, предельные вероятности $\pi_{i+}=\sum_{j}\pi_{ij}$, энтропию $H(\texttt{X})=-\sum_{i}\pi_{i+}log_{2}(\pi_{i+})$.&lt;br /&gt;
&lt;br /&gt;
Многие мета-фичи вычисляются по одиночным фичам или комбинации фичей, и должны быть агрегированы через min,max,$\mu$,$\sigma$,quartiles или гистограммами [kalousis]&lt;br /&gt;
&lt;br /&gt;
Во время вычисления похожести задач важно нормализовывать все мета-фичи [bardnet], использовать feature selection [todorovski] или использовать dimensionality reduction (PCA, например).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Примечания&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html#define-the-meta-learning-problem&lt;br /&gt;
https://arxiv.org/pdf/1810.03548.pdf&lt;br /&gt;
https://www.ml4aad.org/wp-content/uploads/2018/09/chapter2-metalearning.pdf&lt;br /&gt;
https://openreview.net/pdf?id=rJY0-Kcll&lt;br /&gt;
https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf&lt;br /&gt;
Alexandros Kalousis and Melanie Hilario. Model selection v&lt;br /&gt;
ia meta-learning: a comparative&lt;br /&gt;
study.&lt;br /&gt;
Intl Journ. on Artificial Intelligence Tools&lt;br /&gt;
, 10(4):525–554, 2001.&lt;br /&gt;
R ́emi Bardenet, M ́aty ́as Brendel, Bal ́azs K ́egl, and Michele Sebag. Collaborative hyperparameter tuning. In Proceedings of ICML 2013, pages 199–207, 2013&lt;br /&gt;
L Todorovski and S Dzeroski. Experiments in meta-level learning with ILP.&lt;br /&gt;
Lecture Notes in Computer Science, 1704:98–106, 1999.&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68733</id>
		<title>Сверточные нейронные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68733"/>
				<updated>2019-01-21T17:33:34Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: Добавлены ссылки на источники картинок, а также категории&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сверточная нейронная сеть''' (англ. ''convolutional neural network'', ''CNN'') {{---}} специальная архитектура нейронных сетей, предложенная Яном Лекуном&amp;lt;ref name=LeNet5&amp;gt;[http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf Yann LeCun — Gradient-Based Learning Applied to Document Recognition, 1998]&amp;lt;/ref&amp;gt;, изначально нацеленная на эффективное распознавание изображений.&lt;br /&gt;
&lt;br /&gt;
== Свертка ==&lt;br /&gt;
[[Файл:Convolution_example.png|upright=1.0|thumb|[https://arxiv.org/abs/1603.07285 Пример свертки двух матриц размера 5x5 и 3x3]]]&lt;br /&gt;
'''Свертка''' (англ. ''convolution'') {{---}} операция над парой матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;n_x\times n_y&amp;lt;/math&amp;gt;) и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;m_x \times m_y&amp;lt;/math&amp;gt;), результатом которой является матрица &amp;lt;math&amp;gt;C = A * B&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;(n_x-m_x+1)\times (n_y-m_y+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Каждый элемент результата вычисляется как скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и некоторой подматрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; такого же размера (подматрица определяется положением элемента в результате).&lt;br /&gt;
То есть, &amp;lt;math&amp;gt;C_{i,j} = \sum_{u = 0}^{m_x-1}\sum_{v = 0}^{m_y - 1}A_{i+u,j+v}B_{u,v}&amp;lt;/math&amp;gt;. На изображении справа можно видеть, как матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; «двигается» по матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и в каждом положении считается скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и той части матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, на которую она сейчас наложена. Получившееся число записывается в соответствующий элемент результата.&lt;br /&gt;
&lt;br /&gt;
Логический смысл свертки такой {{---}} чем больше величина элемента свертки, тем больше эта часть матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; была похожа на матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (похожа в смысле скалярного произведения). Поэтому матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; называют ''изображением'', а матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; {{---}} ''фильтром'' или ''образцом''.&lt;br /&gt;
&lt;br /&gt;
== Структура сверточной нейронной сети ==&lt;br /&gt;
В сверточной нейронной сети выходы промежуточных слоев образуют матрицу (изображение) или набор матриц (несколько слоёв изображения). Так, например, на вход сверточной нейронной сети можно подавать три слоя изображения (R-, G-, B-каналы изображения). Основными видами слоев в сверточной нейронной сети являются сверточные слои (англ. ''convolutional layer''), пулинговые слои (англ. ''pooling layer'') и [[:Нейронные_сети,_перцептрон|полносвязные слои]] (англ. ''fully-connected layer'').&lt;br /&gt;
&lt;br /&gt;
=== Сверточный слой ===&lt;br /&gt;
[[Файл:Padding.png|upright=1.0|thumb|[https://arxiv.org/abs/1603.07285 Пример свертки двух матриц с дополнением нулями и сдвигом 2]]]&lt;br /&gt;
[[Файл:Convolution-operation-on-volume5.png|upright=1.0|thumb|[http://www.machinelearning.ru/wiki/images/1/1b/DL16_lecture_3.pdf Пример свертки с трехмерным ядром]]]&lt;br /&gt;
Сверточный слой нейронной сети представляет из себя применение операции свертки к выходам с предыдущего слоя, где веса ядра свертки являются обучаемыми параметрами. Еще один обучаемый вес используется в качестве константного сдвига (англ. ''bias''). При этом есть несколько важных деталей:&lt;br /&gt;
&lt;br /&gt;
* В одном сверточном слое может быть несколько сверток. В этом случае для каждой свертки на выходе получится своё изображение. Например, если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а в слое было &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сверток с ядром размерности &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;n\times(w - k_x + 1)\times(h - k_y + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Ядра свертки могут быть трёхмерными. Свертка трехмерного входа с трехмерным ядром происходит аналогично, просто скалярное произведение считается еще и по всем слоям изображения. Например, для усреднения информации о цветах исходного изображения, на первом слое можно использовать свертку размерности &amp;lt;math&amp;gt;3\times w \times h&amp;lt;/math&amp;gt;. На выходе такого слоя будет уже одно изображение (вместо трёх).&lt;br /&gt;
&lt;br /&gt;
* Можно заметить, что применение операции свертки уменьшает изображение. Также пиксели, которые находятся на границе изображения учавствуют в меньшем количестве сверток, чем внутренние. В связи с этим в сверточных слоях используется дополнение изображения (англ. ''padding''). Выходы с предыдущего слоя дополняются пикселями так, чтобы после свертки сохранился размер изображения. Такие свертки называют ''одинаковыми'' (англ. ''same convolution''), а свертки без дополнения изображения называются ''правильными'' (англ. ''valid convolution''). Среди способов, которыми можно заполнить новые пиксели, можно выделить следующие:&lt;br /&gt;
** ''zero shift'': &amp;lt;code&amp;gt;00[ABC]00&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''border extension'': &amp;lt;code&amp;gt;AA[ABC]CC&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''mirror shift'': &amp;lt;code&amp;gt;BA[ABC]CB&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''cyclic shift'': &amp;lt;code&amp;gt;BC[ABC]AB&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Еще одним параметром сверточного слоя является ''сдвиг'' (англ. ''stride''). Хоть обычно свертка применяется подряд для каждого пикселя, иногда используется сдвиг, отличный от единицы {{---}} скалярное произведение считается не со всеми возможными положениями ядра, а только с положениями, кратными некоторому сдвигу &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;. Тогда, если если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а ядро свертки имело размерность &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt; и использовался сдвиг &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;\lfloor\frac{w - k_x}{s} + 1\rfloor\times\lfloor\frac{h - k_y}{s} + 1\rfloor&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Пулинговый слой ===&lt;br /&gt;
[[Файл:Maxpool.jpeg|upright=1.0|thumb|[https://www.slideshare.net/YUNGKUEICHEN/convolutional-neural-network-cnn-image-recognition Пример операции пулинга с функцией максимума]]]&lt;br /&gt;
Пулинговый слой призван снижать размерность изображения. Исходное изображение делится на блоки размером &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt; и для каждого блока вычисляется некоторая функция. Чаще всего используется функция максимума (англ. ''max pooling'') или (взвешенного) среднего (англ. ''(weighted) average pooling''). Обучаемых параметров у этого слоя нет. Основные цели пулингового слоя:&lt;br /&gt;
* уменьшение изображения, чтобы последующие свертки оперировали над большей областью исходного изображения;&lt;br /&gt;
* увеличение инвариантности выхода сети по отношению к малому переносу входа;&lt;br /&gt;
* ускорение вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Inception module ===&lt;br /&gt;
[[Файл:Inception.png|upright=1.0|thumb|[https://arxiv.org/abs/1409.4842 Inception module]]]&lt;br /&gt;
[[Файл:Inception_red.png|upright=1.0|thumb|[https://arxiv.org/pdf/1409.4842.pdf Inception module с сокращением размерностей]]]&lt;br /&gt;
''Inception module'' {{---}} это специальный слой нейронной сети, который был предложен в работе&amp;lt;ref name=GoogLeNet&amp;gt;[https://arxiv.org/pdf/1409.4842.pdf Going deeper with convolutions]&amp;lt;/ref&amp;gt;, в которой была представлена сеть GoogLeNet. Основная цель этого модуля заключается в следующем. Авторы предположили, что каждый элемент предыдущего слоя соответствует определенной области исходного изображения. Каждая свертка по таким элементам будет увеличивать область исходного изображения, пока элементы на последних слоях не будут соответствовать всему изображению целиком. Однако, если с какого-то момента все свертки станут размером &amp;lt;math&amp;gt;1\times 1&amp;lt;/math&amp;gt;, то не найдется элементов, которые покрывали бы все исходное изображение, поэтому было бы невозможно находить большие признаки на изображении. Чтобы решить эту проблему, авторы предложили так называемый inception module {{---}} конкатенацию выходов для сверток размера &amp;lt;math&amp;gt;1\times 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;3\times 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;5\times 5&amp;lt;/math&amp;gt;, а также операции max pooling'а с ядром &amp;lt;math&amp;gt;3\times 3&amp;lt;/math&amp;gt;. К сожалению, подобный наивный подход (англ. ''naive inception module'') приводит к резкому увеличению слоев изображения, что не позволяет построить с его использованием глубокую нейронную сеть. Для этого авторы предложили использовать модифицированный inception module с дополнительным уменьшением размерности {{---}} дополнительно к каждому фильтру они добавили слой свертки &amp;lt;math&amp;gt;1\times 1&amp;lt;/math&amp;gt;, который схлопывает все слои изображения в один. Это позволяет сохранить малое число слоев, с сохранением полезной информации о изображении.&lt;br /&gt;
&lt;br /&gt;
=== Residual block ===&lt;br /&gt;
[[Файл:Residual.png|upright=1.0|thumb|[https://arxiv.org/pdf/1512.03385.pdf Устройство residual block]]]&lt;br /&gt;
Двумя серьезными проблемами в обучении глубоких нейронных сетей являются исчезающий градиент (англ. ''vanishing gradient'') и взрывающийся градиент (англ. ''exploding gradient''). Они возникают из-за того, что при дифференцировании по цепному правилу, до глубоких слоев нейронной сети доходит очень маленькая величина градиента (из-за многократного домножения на небольшие величины на предыдущих слоях). Для борьбы с этой проблемой был предложен так называемый ''residual block''&amp;lt;ref name=ResNet&amp;gt;[https://arxiv.org/pdf/1512.03385.pdf Deep residual learning for image recognition]&amp;lt;/ref&amp;gt;. Идея заключается в том, чтобы взять пару слоёв (например, сверточных), и добавить дополнительную связь, которая проходит мимо этих слоёв. Пусть &amp;lt;math&amp;gt;z^{(k)}&amp;lt;/math&amp;gt; {{---}} выход &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ого слоя до применения функции активации, а &amp;lt;math&amp;gt;a^{(k)}&amp;lt;/math&amp;gt; {{---}} выход после. Тогда residual block будет выполнять следующее преобразование: &amp;lt;math&amp;gt;a^{(k + 2)} = g(z^{(k + 2)} + a^{(k)})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; {{---}} функция активации.&lt;br /&gt;
&lt;br /&gt;
На самом деле, такая нейронная сеть обучается предсказывать функцию &amp;lt;math&amp;gt;\mathcal{F}(x) - x&amp;lt;/math&amp;gt;, вместо функции &amp;lt;math&amp;gt;\mathcal{F}(x)&amp;lt;/math&amp;gt;, которую изначально нужно было предсказывать. Для компенсации этой разницы и вводится это замыкающее соединение (англ. ''shortcut connection''), которое добавляет недостающий &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; к функции. Предположение авторов, которые предложили residual block, заключалось в том, что такую разностную функцию будет проще обучать, чем исходную. Если рассматривать крайние случаи, то если &amp;lt;math&amp;gt;\mathcal{F}(x) = x&amp;lt;/math&amp;gt;, такую сеть обучить нулю всегда возможно, в отличие от обучения множества нелинейных слоёв линейному преобразованию.&lt;br /&gt;
&lt;br /&gt;
== Известные архитектуры сверточных нейронных сетей ==&lt;br /&gt;
=== LeNet-5 ===&lt;br /&gt;
[[Файл:Lenet5.png|upright=1.0|thumb|[http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf Архитектура LeNet-5]]]&lt;br /&gt;
Нейронная сеть, предложенная Яном Лекуном&amp;lt;ref name=LeNet5/&amp;gt;, для распознавания рукописных цифр MNIST.&lt;br /&gt;
&lt;br /&gt;
=== AlexNet ===&lt;br /&gt;
[[Файл:Alexnet.png|upright=1.0|thumb|[https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf Архитектура AlexNet]]]&lt;br /&gt;
Победитель соревнования ImageNet 2012-ого года, набравший точность 84.6%&amp;lt;ref name=AlexNet&amp;gt;[https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf ImageNet Classification with Deep Convolutional Neural Networks]&amp;lt;/ref&amp;gt;. Была реализована с использованием CUDA для повышения производительности. Состоит из двух отдельных частей, которые слабо взаимодействуют друг с другом, что позволяет исполнять их параллельно на разных GPU с минимальным обменом данными.&lt;br /&gt;
&lt;br /&gt;
=== VGG ===&lt;br /&gt;
Семейство архитектур нейронных сетей, которое включает в себя, в частности, VGG-11, VGG-13, VGG-16 и VGG-19&amp;lt;ref name=VGG&amp;gt;[https://arxiv.org/pdf/1409.1556.pdf Very Deep Convolutional Networks for Large-Scale Image Recognition]&amp;lt;/ref&amp;gt;. Победитель соревнования ImageNet 2013-ого года (VGG-16), набравший точность 92.7%. Одной из отличительных особенностей является использование ядер свертки небольшого размера (3x3, в отличие от больших ядер размера 7x7 или 11x11).&lt;br /&gt;
&lt;br /&gt;
=== GoogLeNet ===&lt;br /&gt;
Также известный как ''inception network'' {{---}} победитель соревнования ImageNet 2014-ого года, набравший 93.3% точности&amp;lt;ref name=GoogLeNet/&amp;gt;. Состоит в основном из inception модулей. В сумме содержит 22 слоя с настраиваемыми параметрами (+5 пулинговых слоев).&lt;br /&gt;
&lt;br /&gt;
=== ResNet ===&lt;br /&gt;
Победитель соревнования ImageNet 2015-ого года. Сеть-победитель содержала более 150 слоёв&amp;lt;ref name=ResNet/&amp;gt; и набрала 96.43% точности.&lt;br /&gt;
&lt;br /&gt;
=== Сравнение известных нейронных сетей ===&lt;br /&gt;
[[Файл:Net-comparison.png|border|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
===Scala===&lt;br /&gt;
Пример кода с библиотекой DeepLearning.scala&amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/index.html DeepLearning.scala]&amp;lt;/ref&amp;gt;&lt;br /&gt;
    // Загрузка датасета&lt;br /&gt;
    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
    // Определение слоёв&lt;br /&gt;
    def myNeuralNetwork(input: INDArray):  INDArrayLayer = {&lt;br /&gt;
        val cnnLayer = maxPool(relu(conv2d(input.reshape(input.shape()(0), Cifar10.NumberOfChannels, PixelHeight, PixelWidth), cnnWeight, cnnBias, (KernelHeight, KernelWidth), (Stride, Stride), (Padding, Padding))), (PoolSize, PoolSize))&lt;br /&gt;
        val affineRuleOfCnnLayer = relu(affine(cnnLayer.reshape(input.shape()(0), NumFilters * (PixelHeight / PoolSize) * (PixelWidth / PoolSize)), affineWeight, affineBias))&lt;br /&gt;
        val affineOfaffineRuleOfCnnLayer = affine(affineRuleOfCnnLayer.reshape(input.shape()(0), HiddenDim), affineLastWeight, affineLastBias)&lt;br /&gt;
        val softmaxValue = softmax(affineOfaffineRuleOfCnnLayer)&lt;br /&gt;
        softmaxValue&lt;br /&gt;
    }&lt;br /&gt;
    // Определение функции потерь&lt;br /&gt;
    def lossFunction(input: INDArray, expectOutput: INDArray): DoubleLayer = { &lt;br /&gt;
        val probabilities = myNeuralNetwork(input)&lt;br /&gt;
        -(hyperparameters.log(probabilities) * expectOutput).mean   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    class Trainer(batchSize: Int, numberOfEpoches: Int = 5) {&lt;br /&gt;
        import scalaz.std.anyVal._&lt;br /&gt;
        import scalaz.syntax.all._&lt;br /&gt;
        @volatile&lt;br /&gt;
        private var isShuttingDown: Boolean = false&lt;br /&gt;
        private val lossBuffer = scala.collection.mutable.Buffer.empty[Double]&lt;br /&gt;
        def plotLoss(): Unit = Seq(Scatter(lossBuffer.indices, lossBuffer)).plot(title = &amp;quot;loss by time&amp;quot;)&lt;br /&gt;
        def interrupt(): Unit = isShuttingDown = true&lt;br /&gt;
        def startTrain(): Unit = {&lt;br /&gt;
            @monadic[Future]&lt;br /&gt;
            def trainTask: Future[Unit] = {&lt;br /&gt;
                isShuttingDown = false&lt;br /&gt;
                var epoch = 0&lt;br /&gt;
            &lt;br /&gt;
                while (epoch &amp;lt; numberOfEpoches &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
                    val iterator = cifar10.epoch(batchSize).zipWithIndex&lt;br /&gt;
                    while (iterator.hasNext &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                        val (Cifar10.Batch(labels, batch), i) = iterator.next()&lt;br /&gt;
                        val loss = lossFunction(batch, labels).train.each&lt;br /&gt;
                        lossBuffer += loss&lt;br /&gt;
                        hyperparameters.logger.info(s&amp;quot;epoch=epoch iteration=i batchSize=batchSize loss=loss&amp;quot;)&lt;br /&gt;
                    }&lt;br /&gt;
                    epoch += 1&lt;br /&gt;
                }&lt;br /&gt;
                hyperparameters.logger.info(&amp;quot;Done&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
            trainTask.onComplete { tryUnit: scala.util.Try[Unit] =&amp;gt; tryUnit.get }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]&lt;br /&gt;
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]&lt;br /&gt;
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Нейронные сети]]&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68589</id>
		<title>Сверточные нейронные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68589"/>
				<updated>2019-01-20T13:56:57Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сверточная нейронная сеть''' (англ. ''convolutional neural network'', ''CNN'') {{---}} специальная архитектура нейронных сетей, предложенная Яном Лекуном&amp;lt;ref&amp;gt;[http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf Yann LeCun — Gradient-Based Learning Applied to Document Recognition, 1998]&amp;lt;/ref&amp;gt;, изначально нацеленная на эффективное распознавание изображений.&lt;br /&gt;
&lt;br /&gt;
== Свертка ==&lt;br /&gt;
[[Файл:Convolution_example.png|upright=1.0|thumb|Пример свертки двух матриц размера 5x5 и 3x3]]&lt;br /&gt;
'''Свертка''' (англ. ''convolution'') {{---}} операция над парой матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;n_x\times n_y&amp;lt;/math&amp;gt;) и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;m_x \times m_y&amp;lt;/math&amp;gt;), результатом которой является матрица &amp;lt;math&amp;gt;C = A * B&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;(n_x-m_x+1)\times (n_y-m_y+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Каждый элемент результата вычисляется как скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и некоторой подматрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; такого же размера (подматрица определяется положением элемента в результате).&lt;br /&gt;
То есть, &amp;lt;math&amp;gt;C_{i,j} = \sum_{u = 0}^{m_x-1}\sum_{v = 0}^{m_y - 1}A_{i+u,j+v}B_{u,v}&amp;lt;/math&amp;gt;. На изображении справа можно видеть, как матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; «двигается» по матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и в каждом положении считается скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и той части матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, на которую она сейчас наложена. Получившееся число записывается в соответствующий элемент результата.&lt;br /&gt;
&lt;br /&gt;
Логический смысл свертки такой {{---}} чем больше величина элемента свертки, тем больше эта часть матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; была похожа на матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (похожа в смысле скалярного произведения). Поэтому матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; называют ''изображением'', а матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; {{---}} ''фильтром'' или ''образцом''.&lt;br /&gt;
&lt;br /&gt;
== Структура сверточной нейронной сети ==&lt;br /&gt;
В сверточной нейронной сети выходы промежуточных слоев образуют матрицу (изображение) или набор матриц (несколько слоёв изображения). Так, например, на вход сверточной нейронной сети можно подавать три слоя изображения (R-, G-, B-каналы изображения). Основными видами слоев в сверточной нейронной сети являются сверточные слои (англ. ''convolutional layer''), пулинговые слои (англ. ''pooling layer'') и [[:Нейронные_сети,_перцептрон|полносвязные слои]] (англ. ''fully-connected layer'').&lt;br /&gt;
&lt;br /&gt;
=== Сверточный слой ===&lt;br /&gt;
[[Файл:Padding.png|upright=1.0|thumb|Пример свертки двух матриц с дополнением нулями и сдвигом 2]]&lt;br /&gt;
[[Файл:Convolution-operation-on-volume5.png|upright=1.0|thumb|Пример свертки с трехмерным ядром]]&lt;br /&gt;
Сверточный слой нейронной сети представляет из себя применение операции свертки к выходам с предыдущего слоя, где веса ядра свертки являются обучаемыми параметрами. Еще один обучаемый вес используется в качестве константного сдвига (англ. ''bias''). При этом есть несколько важных деталей:&lt;br /&gt;
&lt;br /&gt;
* В одном сверточном слое может быть несколько сверток. В этом случае для каждой свертки на выходе получится своё изображение. Например, если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а в слое было &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сверток с ядром размерности &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;n\times(w - k_x + 1)\times(h - k_y + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Ядра свертки могут быть трёхмерными. Свертка трехмерного входа с трехмерным ядром происходит аналогично, просто скалярное произведение считается еще и по всем слоям изображения. Например, для усреднения информации о цветах исходного изображения, на первом слое можно использовать свертку размерности &amp;lt;math&amp;gt;3\times w \times h&amp;lt;/math&amp;gt;. На выходе такого слоя будет уже одно изображение (вместо трёх).&lt;br /&gt;
&lt;br /&gt;
* Можно заметить, что применение операции свертки уменьшает изображение. Также пиксели, которые находятся на границе изображения учавствуют в меньшем количестве сверток, чем внутренние. В связи с этим в сверточных слоях используется дополнение изображения (англ. ''padding''). Выходы с предыдущего слоя дополняются пикселями так, чтобы после свертки сохранился размер изображения. Такие свертки называют ''одинаковыми'' (англ. ''same convolution''), а свертки без дополнения изображения называются ''правильными'' (англ. ''valid convolution''). Среди способов, которыми можно заполнить новые пиксели, можно выделить следующие:&lt;br /&gt;
** ''zero shift'': &amp;lt;code&amp;gt;00[ABC]00&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''border extension'': &amp;lt;code&amp;gt;AA[ABC]CC&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''mirror shift'': &amp;lt;code&amp;gt;BA[ABC]CB&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''cyclic shift'': &amp;lt;code&amp;gt;BC[ABC]AB&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Еще одним параметром сверточного слоя является ''сдвиг'' (англ. ''stride''). Хоть обычно свертка применяется подряд для каждого пикселя, иногда используется сдвиг, отличный от единицы {{---}} скалярное произведение считается не со всеми возможными положениями ядра, а только с положениями, кратными некоторому сдвигу &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;. Тогда, если если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а ядро свертки имело размерность &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt; и использовался сдвиг &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;\lfloor\frac{w - k_x}{s} + 1\rfloor\times\lfloor\frac{h - k_y}{s} + 1\rfloor&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Пулинговый слой ===&lt;br /&gt;
[[Файл:Maxpool.jpeg|upright=1.0|thumb|Пример операции пулинга с функцией максимума]]&lt;br /&gt;
Пулинговый слой призван снижать размерность изображения. Исходное изображение делится на блоки размером &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt; и для каждого блока вычисляется некоторая функция. Чаще всего используется функция максимума (англ. ''max pooling'') или (взвешенного) среднего (англ. ''(weighted) average pooling''). Обучаемых параметров у этого слоя нет. Основные цели пулингового слоя:&lt;br /&gt;
* уменьшение изображения, чтобы последующие свертки оперировали над большей областью исходного изображения;&lt;br /&gt;
* увеличение инвариантности выхода сети по отношению к малому переносу входа;&lt;br /&gt;
* ускорение вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Inception module ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Известные архитектуры сверточных нейронных сетей ==&lt;br /&gt;
=== LeNet-5 ===&lt;br /&gt;
[[Файл:Lenet5.png|upright=1.0|thumb|Архитектура LeNet-5]]&lt;br /&gt;
Нейронная сеть, предложенная Яном Лекуном, для распознавания рукописных цифр MNIST.&lt;br /&gt;
&lt;br /&gt;
=== AlexNet ===&lt;br /&gt;
[[Файл:Alexnet.png|upright=1.0|thumb|Архитектура AlexNet]]&lt;br /&gt;
Победитель соревнования ImageNet 2012-ого года, набравший точность 84.6%. Была реализована с использованием CUDA для повышения производительности. Состоит из двух отдельных частей, которые слабо взаимодействуют друг с другом, что позволяет исполнять их параллельно на разных GPU с минимальным обменом данными.&lt;br /&gt;
&lt;br /&gt;
=== VGG ===&lt;br /&gt;
Семейство архитектур нейронных сетей, которое включает в себя, в частности, VGG-11, VGG-13, VGG-16 и VGG-19. Победитель соревнования ImageNet 2013-ого года (VGG-16), набравший точность 92.7%. Одной из отличительных особенностей является использование ядер свертки небольшого размера (3x3, в отличие от больших ядер размера 7x7 или 11x11).&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
===Scala===&lt;br /&gt;
Пример кода с библиотекой DeepLearning.scala&amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/index.html DeepLearning.scala]&amp;lt;/ref&amp;gt;&lt;br /&gt;
    // Загрузка датасета&lt;br /&gt;
    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
    // Определение слоёв&lt;br /&gt;
    def myNeuralNetwork(input: INDArray):  INDArrayLayer = {&lt;br /&gt;
        val cnnLayer = maxPool(relu(conv2d(input.reshape(input.shape()(0), Cifar10.NumberOfChannels, PixelHeight, PixelWidth), cnnWeight, cnnBias, (KernelHeight, KernelWidth), (Stride, Stride), (Padding, Padding))), (PoolSize, PoolSize))&lt;br /&gt;
        val affineRuleOfCnnLayer = relu(affine(cnnLayer.reshape(input.shape()(0), NumFilters * (PixelHeight / PoolSize) * (PixelWidth / PoolSize)), affineWeight, affineBias))&lt;br /&gt;
        val affineOfaffineRuleOfCnnLayer = affine(affineRuleOfCnnLayer.reshape(input.shape()(0), HiddenDim), affineLastWeight, affineLastBias)&lt;br /&gt;
        val softmaxValue = softmax(affineOfaffineRuleOfCnnLayer)&lt;br /&gt;
        softmaxValue&lt;br /&gt;
    }&lt;br /&gt;
    // Определение функции потерь&lt;br /&gt;
    def lossFunction(input: INDArray, expectOutput: INDArray): DoubleLayer = { &lt;br /&gt;
        val probabilities = myNeuralNetwork(input)&lt;br /&gt;
        -(hyperparameters.log(probabilities) * expectOutput).mean   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    class Trainer(batchSize: Int, numberOfEpoches: Int = 5) {&lt;br /&gt;
        import scalaz.std.anyVal._&lt;br /&gt;
        import scalaz.syntax.all._&lt;br /&gt;
        @volatile&lt;br /&gt;
        private var isShuttingDown: Boolean = false&lt;br /&gt;
        private val lossBuffer = scala.collection.mutable.Buffer.empty[Double]&lt;br /&gt;
        def plotLoss(): Unit = Seq(Scatter(lossBuffer.indices, lossBuffer)).plot(title = &amp;quot;loss by time&amp;quot;)&lt;br /&gt;
        def interrupt(): Unit = isShuttingDown = true&lt;br /&gt;
        def startTrain(): Unit = {&lt;br /&gt;
            @monadic[Future]&lt;br /&gt;
            def trainTask: Future[Unit] = {&lt;br /&gt;
                isShuttingDown = false&lt;br /&gt;
                var epoch = 0&lt;br /&gt;
            &lt;br /&gt;
                while (epoch &amp;lt; numberOfEpoches &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
                    val iterator = cifar10.epoch(batchSize).zipWithIndex&lt;br /&gt;
                    while (iterator.hasNext &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                        val (Cifar10.Batch(labels, batch), i) = iterator.next()&lt;br /&gt;
                        val loss = lossFunction(batch, labels).train.each&lt;br /&gt;
                        lossBuffer += loss&lt;br /&gt;
                        hyperparameters.logger.info(s&amp;quot;epoch=epoch iteration=i batchSize=batchSize loss=loss&amp;quot;)&lt;br /&gt;
                    }&lt;br /&gt;
                    epoch += 1&lt;br /&gt;
                }&lt;br /&gt;
                hyperparameters.logger.info(&amp;quot;Done&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
            trainTask.onComplete { tryUnit: scala.util.Try[Unit] =&amp;gt; tryUnit.get }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]&lt;br /&gt;
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]&lt;br /&gt;
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68587</id>
		<title>Сверточные нейронные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68587"/>
				<updated>2019-01-20T13:34:07Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сверточная нейронная сеть''' (англ. ''convolutional neural network'', ''CNN'') {{---}} специальная архитектура нейронных сетей, предложенная [https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BA%D1%83%D0%BD,_%D0%AF%D0%BD Яном Лекуном], изначально нацеленная на эффективное распознавание изображений.&lt;br /&gt;
&lt;br /&gt;
== Свертка ==&lt;br /&gt;
[[Файл:Convolution_example.png|upright=1.0|thumb|Пример свертки двух матриц размера 5x5 и 3x3]]&lt;br /&gt;
'''Свертка''' (англ. ''convolution'') {{---}} операция над парой матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;n_x\times n_y&amp;lt;/math&amp;gt;) и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;m_x \times m_y&amp;lt;/math&amp;gt;), результатом которой является матрица &amp;lt;math&amp;gt;C = A * B&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;(n_x-m_x+1)\times (n_y-m_y+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Каждый элемент результата вычисляется как скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и некоторой подматрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; такого же размера (подматрица определяется положением элемента в результате).&lt;br /&gt;
То есть, &amp;lt;math&amp;gt;C_{i,j} = \sum_{u = 0}^{m_x-1}\sum_{v = 0}^{m_y - 1}A_{i+u,j+v}B_{u,v}&amp;lt;/math&amp;gt;. На изображении справа можно видеть, как матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; «двигается» по матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и в каждом положении считается скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и той части матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, на которую она сейчас наложена. Получившееся число записывается в соответствующий элемент результата.&lt;br /&gt;
&lt;br /&gt;
Логический смысл свертки такой {{---}} чем больше величина элемента свертки, тем больше эта часть матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; была похожа на матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (похожа в смысле скалярного произведения). Поэтому матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; называют ''изображением'', а матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; {{---}} ''фильтром'' или ''образцом''.&lt;br /&gt;
&lt;br /&gt;
== Структура сверточной нейронной сети ==&lt;br /&gt;
В сверточной нейронной сети выходы промежуточных слоев образуют матрицу (изображение) или набор матриц (несколько слоёв изображения). Так, например, на вход сверточной нейронной сети можно подавать три слоя изображения (R-, G-, B-каналы изображения). Основными видами слоев в сверточной нейронной сети являются сверточные слои (англ. ''convolutional layer''), пулинговые слои (англ. ''pooling layer'') и [[:Нейронные_сети,_перцептрон|полносвязные слои]] (англ. ''fully-connected layer'').&lt;br /&gt;
&lt;br /&gt;
=== Сверточный слой ===&lt;br /&gt;
[[Файл:Padding.png|upright=1.0|thumb|Пример свертки двух матриц с дополнением нулями и сдвигом 2]]&lt;br /&gt;
[[Файл:Convolution-operation-on-volume5.png|upright=1.0|thumb|Пример свертки с трехмерным ядром]]&lt;br /&gt;
Сверточный слой нейронной сети представляет из себя применение операции свертки к выходам с предыдущего слоя, где веса ядра свертки являются обучаемыми параметрами. Еще один обучаемый вес используется в качестве константного сдвига (англ. ''bias''). При этом есть несколько важных деталей:&lt;br /&gt;
&lt;br /&gt;
* В одном сверточном слое может быть несколько сверток. В этом случае для каждой свертки на выходе получится своё изображение. Например, если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а в слое было &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сверток с ядром размерности &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;n\times(w - k_x + 1)\times(h - k_y + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Ядра свертки могут быть трёхмерными. Свертка трехмерного входа с трехмерным ядром происходит аналогично, просто скалярное произведение считается еще и по всем слоям изображения. Например, для усреднения информации о цветах исходного изображения, на первом слое можно использовать свертку размерности &amp;lt;math&amp;gt;3\times w \times h&amp;lt;/math&amp;gt;. На выходе такого слоя будет уже одно изображение (вместо трёх).&lt;br /&gt;
&lt;br /&gt;
* Можно заметить, что применение операции свертки уменьшает изображение. Также пиксели, которые находятся на границе изображения учавствуют в меньшем количестве сверток, чем внутренние. В связи с этим в сверточных слоях используется дополнение изображения (англ. ''padding''). Выходы с предыдущего слоя дополняются пикселями так, чтобы после свертки сохранился размер изображения. Такие свертки называют ''одинаковыми'' (англ. ''same convolution''), а свертки без дополнения изображения называются ''правильными'' (англ. ''valid convolution''). Среди способов, которыми можно заполнить новые пиксели, можно выделить следующие:&lt;br /&gt;
** ''zero shift'': &amp;lt;code&amp;gt;00[ABC]00&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''border extension'': &amp;lt;code&amp;gt;AA[ABC]CC&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''mirror shift'': &amp;lt;code&amp;gt;BA[ABC]CB&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''cyclic shift'': &amp;lt;code&amp;gt;BC[ABC]AB&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Еще одним параметром сверточного слоя является ''сдвиг'' (англ. ''stride''). Хоть обычно свертка применяется подряд для каждого пикселя, иногда используется сдвиг, отличный от единицы {{---}} скалярное произведение считается не со всеми возможными положениями ядра, а только с положениями, кратными некоторому сдвигу &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;. Тогда, если если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а ядро свертки имело размерность &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt; и использовался сдвиг &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;\lfloor\frac{w - k_x}{s} + 1\rfloor\times\lfloor\frac{h - k_y}{s} + 1\rfloor&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Пулинговый слой ===&lt;br /&gt;
[[Файл:Maxpool.jpeg|upright=1.0|thumb|Пример операции пулинга с функцией максимума]]&lt;br /&gt;
Пулинговый слой призван снижать размерность изображения. Исходное изображение делится на блоки размером &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt; и для каждого блока вычисляется некоторая функция. Чаще всего используется функция максимума (англ. ''max pooling'') или (взвешенного) среднего (англ. ''(weighted) average pooling''). Обучаемых параметров у этого слоя нет. Основные цели пулингового слоя:&lt;br /&gt;
* уменьшение изображения, чтобы последующие свертки оперировали над большей областью исходного изображения;&lt;br /&gt;
* увеличение инвариантности выхода сети по отношению к малому переносу входа;&lt;br /&gt;
* ускорение вычислений.&lt;br /&gt;
&lt;br /&gt;
== Известные архитектуры сверточных нейронных сетей ==&lt;br /&gt;
=== LeNet-5 ===&lt;br /&gt;
[[Файл:Lenet5.png|upright=1.0|thumb|Архитектура LeNet-5]]&lt;br /&gt;
Нейронная сеть, предложенная Яном Лекуном, для распознавания рукописных цифр MNIST.&lt;br /&gt;
&lt;br /&gt;
=== AlexNet ===&lt;br /&gt;
[[Файл:Alexnet.png|upright=1.0|thumb|Архитектура AlexNet]]&lt;br /&gt;
Победитель соревнования ImageNet 2012-ого года, набравший точность 84.6%. Была реализована с использованием CUDA для повышения производительности. Состоит из двух отдельных частей, которые слабо взаимодействуют друг с другом, что позволяет исполнять их параллельно на разных GPU с минимальным обменом данными.&lt;br /&gt;
&lt;br /&gt;
=== VGG ===&lt;br /&gt;
Семейство архитектур нейронных сетей, которое включает в себя, в частности, VGG-11, VGG-13, VGG-16 и VGG-19. Победитель соревнования ImageNet 2013-ого года (VGG-16), набравший точность 92.7%. Одной из отличительных особенностей является использование ядер свертки небольшого размера (3x3, в отличие от больших ядер размера 7x7 или 11x11).&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
===Scala===&lt;br /&gt;
Пример кода с библиотекой DeepLearning.scala&amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/index.html DeepLearning.scala]&amp;lt;/ref&amp;gt;&lt;br /&gt;
    // Загрузка датасета&lt;br /&gt;
    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
    // Определение слоёв&lt;br /&gt;
    def myNeuralNetwork(input: INDArray):  INDArrayLayer = {&lt;br /&gt;
        val cnnLayer = maxPool(relu(conv2d(input.reshape(input.shape()(0), Cifar10.NumberOfChannels, PixelHeight, PixelWidth), cnnWeight, cnnBias, (KernelHeight, KernelWidth), (Stride, Stride), (Padding, Padding))), (PoolSize, PoolSize))&lt;br /&gt;
        val affineRuleOfCnnLayer = relu(affine(cnnLayer.reshape(input.shape()(0), NumFilters * (PixelHeight / PoolSize) * (PixelWidth / PoolSize)), affineWeight, affineBias))&lt;br /&gt;
        val affineOfaffineRuleOfCnnLayer = affine(affineRuleOfCnnLayer.reshape(input.shape()(0), HiddenDim), affineLastWeight, affineLastBias)&lt;br /&gt;
        val softmaxValue = softmax(affineOfaffineRuleOfCnnLayer)&lt;br /&gt;
        softmaxValue&lt;br /&gt;
    }&lt;br /&gt;
    // Определение функции потерь&lt;br /&gt;
    def lossFunction(input: INDArray, expectOutput: INDArray): DoubleLayer = { &lt;br /&gt;
        val probabilities = myNeuralNetwork(input)&lt;br /&gt;
        -(hyperparameters.log(probabilities) * expectOutput).mean   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    class Trainer(batchSize: Int, numberOfEpoches: Int = 5) {&lt;br /&gt;
        import scalaz.std.anyVal._&lt;br /&gt;
        import scalaz.syntax.all._&lt;br /&gt;
        @volatile&lt;br /&gt;
        private var isShuttingDown: Boolean = false&lt;br /&gt;
        private val lossBuffer = scala.collection.mutable.Buffer.empty[Double]&lt;br /&gt;
        def plotLoss(): Unit = Seq(Scatter(lossBuffer.indices, lossBuffer)).plot(title = &amp;quot;loss by time&amp;quot;)&lt;br /&gt;
        def interrupt(): Unit = isShuttingDown = true&lt;br /&gt;
        def startTrain(): Unit = {&lt;br /&gt;
            @monadic[Future]&lt;br /&gt;
            def trainTask: Future[Unit] = {&lt;br /&gt;
                isShuttingDown = false&lt;br /&gt;
                var epoch = 0&lt;br /&gt;
            &lt;br /&gt;
                while (epoch &amp;lt; numberOfEpoches &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
                    val iterator = cifar10.epoch(batchSize).zipWithIndex&lt;br /&gt;
                    while (iterator.hasNext &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                        val (Cifar10.Batch(labels, batch), i) = iterator.next()&lt;br /&gt;
                        val loss = lossFunction(batch, labels).train.each&lt;br /&gt;
                        lossBuffer += loss&lt;br /&gt;
                        hyperparameters.logger.info(s&amp;quot;epoch=epoch iteration=i batchSize=batchSize loss=loss&amp;quot;)&lt;br /&gt;
                    }&lt;br /&gt;
                    epoch += 1&lt;br /&gt;
                }&lt;br /&gt;
                hyperparameters.logger.info(&amp;quot;Done&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
            trainTask.onComplete { tryUnit: scala.util.Try[Unit] =&amp;gt; tryUnit.get }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]&lt;br /&gt;
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]&lt;br /&gt;
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68586</id>
		<title>Сверточные нейронные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68586"/>
				<updated>2019-01-20T13:32:44Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сверточная нейронная сеть''' (англ. ''convolutional neural network'', ''CNN'') {{---}} специальная архитектура нейронных сетей, предложенная [https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BA%D1%83%D0%BD,_%D0%AF%D0%BD Яном Лекуном], изначально нацеленная на эффективное распознавание изображений.&lt;br /&gt;
&lt;br /&gt;
== Свертка ==&lt;br /&gt;
[[Файл:Convolution_example.png|upright=1.0|thumb|Пример свертки двух матриц размера 5x5 и 3x3]]&lt;br /&gt;
'''Свертка''' (англ. ''convolution'') {{---}} операция над парой матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;n_x\times n_y&amp;lt;/math&amp;gt;) и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;m_x \times m_y&amp;lt;/math&amp;gt;), результатом которой является матрица &amp;lt;math&amp;gt;C = A * B&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;(n_x-m_x+1)\times (n_y-m_y+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Каждый элемент результата вычисляется как скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и некоторой подматрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; такого же размера (подматрица определяется положением элемента в результате).&lt;br /&gt;
То есть, &amp;lt;math&amp;gt;C_{i,j} = \sum_{u = 0}^{m_x-1}\sum_{v = 0}^{m_y - 1}A_{i+u,j+v}B_{u,v}&amp;lt;/math&amp;gt;. На изображении справа можно видеть, как матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; «двигается» по матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и в каждом положении считается скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и той части матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, на которую она сейчас наложена. Получившееся число записывается в соответствующий элемент результата.&lt;br /&gt;
&lt;br /&gt;
Логический смысл свертки такой {{---}} чем больше величина элемента свертки, тем больше эта часть матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; была похожа на матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (похожа в смысле скалярного произведения). Поэтому матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; называют ''изображением'', а матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; {{---}} ''фильтром'' или ''образцом''.&lt;br /&gt;
&lt;br /&gt;
== Структура сверточной нейронной сети ==&lt;br /&gt;
В сверточной нейронной сети выходы промежуточных слоев образуют матрицу (изображение) или набор матриц (несколько слоёв изображения). Так, например, на вход сверточной нейронной сети можно подавать три слоя изображения (R-, G-, B-каналы изображения). Основными видами слоев в сверточной нейронной сети являются сверточные слои (англ. ''convolutional layer''), пулинговые слои (англ. ''pooling layer'') и [[:Нейронные_сети,_перцептрон|полносвязные слои]] (англ. ''fully-connected layer'').&lt;br /&gt;
&lt;br /&gt;
=== Сверточный слой ===&lt;br /&gt;
[[Файл:Padding.png|upright=1.0|thumb|Пример свертки двух матриц с дополнением нулями и сдвигом 2]]&lt;br /&gt;
[[Файл:Convolution-operation-on-volume5.png|upright=1.0|thumb|Пример свертки с трехмерным ядром]]&lt;br /&gt;
Сверточный слой нейронной сети представляет из себя применение операции свертки к выходам с предыдущего слоя, где веса ядра свертки являются обучаемыми параметрами. Еще один обучаемый вес используется в качестве константного сдвига (англ. ''bias''). При этом есть несколько важных деталей:&lt;br /&gt;
&lt;br /&gt;
* В одном сверточном слое может быть несколько сверток. В этом случае для каждой свертки на выходе получится своё изображение. Например, если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а в слое было &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сверток с ядром размерности &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;n\times(w - k_x + 1)\times(h - k_y + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Ядра свертки могут быть трёхмерными. Свертка трехмерного входа с трехмерным ядром происходит аналогично, просто скалярное произведение считается еще и по всем слоям изображения. Например, для усреднения информации о цветах исходного изображения, на первом слое можно использовать свертку размерности &amp;lt;math&amp;gt;3\times w \times h&amp;lt;/math&amp;gt;. На выходе такого слоя будет уже одно изображение (вместо трёх).&lt;br /&gt;
&lt;br /&gt;
* Можно заметить, что применение операции свертки уменьшает изображение. Также пиксели, которые находятся на границе изображения учавствуют в меньшем количестве сверток, чем внутренние. В связи с этим в сверточных слоях используется дополнение изображения (англ. ''padding''). Выходы с предыдущего слоя дополняются пикселями так, чтобы после свертки сохранился размер изображения. Такие свертки называют ''одинаковыми'' (англ. ''same convolution''), а свертки без дополнения изображения называются ''правильными'' (англ. ''valid convolution''). Среди способов, которыми можно заполнить новые пиксели, можно выделить следующие:&lt;br /&gt;
** ''zero shift'': &amp;lt;code&amp;gt;00[ABC]00&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''border extension'': &amp;lt;code&amp;gt;AA[ABC]CC&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''mirror shift'': &amp;lt;code&amp;gt;BA[ABC]CB&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''cyclic shift'': &amp;lt;code&amp;gt;BC[ABC]AB&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Еще одним параметром сверточного слоя является ''сдвиг'' (англ. ''stride''). Хоть обычно свертка применяется подряд для каждого пикселя, иногда используется сдвиг, отличный от единицы {{---}} скалярное произведение считается не со всеми возможными положениями ядра, а только с положениями, кратными некоторому сдвигу &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;. Тогда, если если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а ядро свертки имело размерность &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt; и использовался сдвиг &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;\lfloor\frac{w - k_x}{s} + 1\rfloor\times\lfloor\frac{h - k_y}{s} + 1\rfloor&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Пулинговый слой ===&lt;br /&gt;
[[Файл:Maxpool.jpeg|upright=1.0|thumb|Пример операции пулинга с функцией максимума]]&lt;br /&gt;
Пулинговый слой призван снижать размерность изображения. Исходное изображение делится на блоки размером &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt; и для каждого блока вычисляется некоторая функция. Чаще всего используется функция максимума (англ. ''max pooling'') или (взвешенного) среднего (англ. ''(weighted) average pooling''). Обучаемых параметров у этого слоя нет. Основные цели пулингового слоя:&lt;br /&gt;
* уменьшение изображения, чтобы последующие свертки оперировали над большей областью исходного изображения;&lt;br /&gt;
* увеличение инвариантности выхода сети по отношению к малому переносу входа;&lt;br /&gt;
* ускорение вычислений.&lt;br /&gt;
&lt;br /&gt;
== Известные архитектуры сверточных нейронных сетей ==&lt;br /&gt;
=== LeNet-5 ===&lt;br /&gt;
[[Файл:Lenet5.png|upright=1.0|thumb|Архитектура LeNet-5]]&lt;br /&gt;
Нейронная сеть, предложенная Яном Лекуном, для распознавания рукописных цифр MNIST.&lt;br /&gt;
&lt;br /&gt;
=== AlexNet ===&lt;br /&gt;
[[Файл:Alexnet.png|upright=1.0|thumb|Архитектура AlexNet]]&lt;br /&gt;
Победитель соревнования ImageNet 2012-ого года, набравший точность 84.6%. Была реализована с использованием CUDA для повышения производительности. Состоит из двух отдельных частей, которые слабо взаимодействуют друг с другом, что позволяет исполнять их параллельно на разных GPU с минимальным обменом данными.&lt;br /&gt;
&lt;br /&gt;
=== VGG ===&lt;br /&gt;
Семейство архитектур нейронных сетей, которое включает в себя, в частности, VGG-11, VGG-13, VGG-16 и VGG-19. Победитель соревнования ImageNet 2013-ого года (VGG-16), набравший точность 92.7%. Одной из отличительных особенностей является использование ядер свертки небольшого размера (3x3, в отличие от больших ядер размера 7x7 или 11x11).&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
===Scala===&lt;br /&gt;
Пример кода с библиотекой DeepLearning.scala&amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/index.html DeepLearning.scala]&amp;lt;/ref&amp;gt;&lt;br /&gt;
    // Загрузка датасета&lt;br /&gt;
    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
    // Определение слоёв&lt;br /&gt;
    def myNeuralNetwork(input: INDArray):  INDArrayLayer = {&lt;br /&gt;
        val cnnLayer = maxPool(relu(conv2d(input.reshape(input.shape()(0), Cifar10.NumberOfChannels, PixelHeight, PixelWidth), cnnWeight, cnnBias, (KernelHeight, KernelWidth), (Stride, Stride), (Padding, Padding))), (PoolSize, PoolSize))&lt;br /&gt;
        val affineRuleOfCnnLayer = relu(affine(cnnLayer.reshape(input.shape()(0), NumFilters * (PixelHeight / PoolSize) * (PixelWidth / PoolSize)), affineWeight, affineBias))&lt;br /&gt;
        val affineOfaffineRuleOfCnnLayer = affine(affineRuleOfCnnLayer.reshape(input.shape()(0), HiddenDim), affineLastWeight, affineLastBias)&lt;br /&gt;
        val softmaxValue = softmax(affineOfaffineRuleOfCnnLayer)&lt;br /&gt;
        softmaxValue&lt;br /&gt;
    }&lt;br /&gt;
    // Определение функции потерь&lt;br /&gt;
    def lossFunction(input: INDArray, expectOutput: INDArray): DoubleLayer = { &lt;br /&gt;
        val probabilities = myNeuralNetwork(input)&lt;br /&gt;
        -(hyperparameters.log(probabilities) * expectOutput).mean   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    class Trainer(batchSize: Int, numberOfEpoches: Int = 5) {&lt;br /&gt;
        import scalaz.std.anyVal._&lt;br /&gt;
        import scalaz.syntax.all._&lt;br /&gt;
        @volatile&lt;br /&gt;
        private var isShuttingDown: Boolean = false&lt;br /&gt;
        private val lossBuffer = scala.collection.mutable.Buffer.empty[Double]&lt;br /&gt;
        def plotLoss(): Unit = Seq(Scatter(lossBuffer.indices, lossBuffer)).plot(title = &amp;quot;loss by time&amp;quot;)&lt;br /&gt;
        def interrupt(): Unit = isShuttingDown = true&lt;br /&gt;
        def startTrain(): Unit = {&lt;br /&gt;
            @monadic[Future]&lt;br /&gt;
            def trainTask: Future[Unit] = {&lt;br /&gt;
                isShuttingDown = false&lt;br /&gt;
                var epoch = 0&lt;br /&gt;
            &lt;br /&gt;
                while (epoch &amp;lt; numberOfEpoches &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
                    val iterator = cifar10.epoch(batchSize).zipWithIndex&lt;br /&gt;
                    while (iterator.hasNext &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                        val (Cifar10.Batch(labels, batch), i) = iterator.next()&lt;br /&gt;
                        val loss = lossFunction(batch, labels).train.each&lt;br /&gt;
                        lossBuffer += loss&lt;br /&gt;
                        hyperparameters.logger.info(s&amp;quot;epoch=epoch iteration=i batchSize=batchSize loss=loss&amp;quot;)&lt;br /&gt;
                    }&lt;br /&gt;
                    epoch += 1&lt;br /&gt;
                }&lt;br /&gt;
                hyperparameters.logger.info(&amp;quot;Done&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
            trainTask.onComplete { tryUnit: scala.util.Try[Unit] =&amp;gt; tryUnit.get }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]&lt;br /&gt;
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]&lt;br /&gt;
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68585</id>
		<title>Сверточные нейронные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68585"/>
				<updated>2019-01-20T13:30:53Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сверточная нейронная сеть''' (англ. ''convolutional neural network'', ''CNN'') {{---}} специальная архитектура нейронных сетей, предложенная [https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BA%D1%83%D0%BD,_%D0%AF%D0%BD Яном Лекуном], изначально нацеленная на эффективное распознавание изображений.&lt;br /&gt;
&lt;br /&gt;
== Свертка ==&lt;br /&gt;
[[Файл:Convolution_example.png|upright=1.0|thumb|Пример свертки двух матриц размера 5x5 и 3x3]]&lt;br /&gt;
'''Свертка''' (англ. ''convolution'') {{---}} операция над парой матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;n_x\times n_y&amp;lt;/math&amp;gt;) и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;m_x \times m_y&amp;lt;/math&amp;gt;), результатом которой является матрица &amp;lt;math&amp;gt;C = A * B&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;(n_x-m_x+1)\times (n_y-m_y+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Каждый элемент результата вычисляется как скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и некоторой подматрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; такого же размера (подматрица определяется положением элемента в результате).&lt;br /&gt;
То есть, &amp;lt;math&amp;gt;C_{i,j} = \sum_{u = 0}^{m_x-1}\sum_{v = 0}^{m_y - 1}A_{i+u,j+v}B_{u,v}&amp;lt;/math&amp;gt;. На изображении справа можно видеть, как матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; «двигается» по матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и в каждом положении считается скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и той части матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, на которую она сейчас наложена. Получившееся число записывается в соответствующий элемент результата.&lt;br /&gt;
&lt;br /&gt;
Логический смысл свертки такой {{---}} чем больше величина элемента свертки, тем больше эта часть матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; была похожа на матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (похожа в смысле скалярного произведения). Поэтому матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; называют ''изображением'', а матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; {{---}} ''фильтром'' или ''образцом''.&lt;br /&gt;
&lt;br /&gt;
== Структура сверточной нейронной сети ==&lt;br /&gt;
В сверточной нейронной сети выходы промежуточных слоев образуют матрицу (изображение) или набор матриц (несколько слоёв изображения). Так, например, на вход сверточной нейронной сети можно подавать три слоя изображения (R-, G-, B-каналы изображения). Основными видами слоев в сверточной нейронной сети являются сверточные слои (англ. ''convolutional layer''), пулинговые слои (англ. ''pooling layer'') и [[:Нейронные_сети,_перцептрон|полносвязные слои]] (англ. ''fully-connected layer'').&lt;br /&gt;
&lt;br /&gt;
=== Сверточный слой ===&lt;br /&gt;
[[Файл:Padding.png|upright=1.0|thumb|Пример свертки двух матриц с дополнением нулями и сдвигом 2]]&lt;br /&gt;
[[Файл:Convolution-operation-on-volume5.png|upright=1.0|thumb|Пример свертки с трехмерным ядром]]&lt;br /&gt;
Сверточный слой нейронной сети представляет из себя применение операции свертки к выходам с предыдущего слоя, где веса ядра свертки являются обучаемыми параметрами. Еще один обучаемый вес используется в качестве константного сдвига (англ. ''bias''). При этом есть несколько важных деталей:&lt;br /&gt;
&lt;br /&gt;
* В одном сверточном слое может быть несколько сверток. В этом случае для каждой свертки на выходе получится своё изображение. Например, если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а в слое было &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сверток с ядром размерности &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;n\times(w - k_x + 1)\times(h - k_y + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Ядра свертки могут быть трёхмерными. Свертка трехмерного входа с трехмерным ядром происходит аналогично, просто скалярное произведение считается еще и по всем слоям изображения. Например, для усреднения информации о цветах исходного изображения, на первом слое можно использовать свертку размерности &amp;lt;math&amp;gt;3\times w \times h&amp;lt;/math&amp;gt;. На выходе такого слоя будет уже одно изображение (вместо трёх).&lt;br /&gt;
&lt;br /&gt;
* Можно заметить, что применение операции свертки уменьшает изображение. Также пиксели, которые находятся на границе изображения учавствуют в меньшем количестве сверток, чем внутренние. В связи с этим в сверточных слоях используется дополнение изображения (англ. ''padding''). Выходы с предыдущего слоя дополняются пикселями так, чтобы после свертки сохранился размер изображения. Такие свертки называют ''одинаковыми'' (англ. ''same convolution''), а свертки без дополнения изображения называются ''правильными'' (англ. ''valid convolution''). Среди способов, которыми можно заполнить новые пиксели, можно выделить следующие:&lt;br /&gt;
** ''zero shift'': &amp;lt;code&amp;gt;00[ABC]00&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''border extension'': &amp;lt;code&amp;gt;AA[ABC]CC&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''mirror shift'': &amp;lt;code&amp;gt;BA[ABC]CB&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''cyclic shift'': &amp;lt;code&amp;gt;BC[ABC]AB&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Еще одним параметром сверточного слоя является ''сдвиг'' (англ. ''stride''). Хоть обычно свертка применяется подряд для каждого пикселя, иногда используется сдвиг, отличный от единицы {{---}} скалярное произведение считается не со всеми возможными положениями ядра, а только с положениями, кратными некоторому сдвигу &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;. Тогда, если если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а ядро свертки имело размерность &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt; и использовался сдвиг &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;\lfloor\frac{w - k_x}{s} + 1\rfloor\times\lfloor\frac{h - k_y}{s} + 1\rfloor&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Пулинговый слой ===&lt;br /&gt;
[[Файл:Maxpool.jpeg|upright=1.0|thumb|Пример операции пулинга с функцией максимума]]&lt;br /&gt;
Пулинговый слой призван снижать размерность изображения. Исходное изображение делится на блоки размером &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt; и для каждого блока вычисляется некоторая функция. Чаще всего используется функция максимума (англ. ''max pooling'') или (взвешенного) среднего (англ. ''(weighted) average pooling''). Обучаемых параметров у этого слоя нет. Основные цели пулингового слоя:&lt;br /&gt;
* уменьшение изображения, чтобы последующие свертки оперировали над большей областью исходного изображения;&lt;br /&gt;
* увеличение инвариантности выхода сети по отношению к малому переносу входа;&lt;br /&gt;
* ускорение вычислений.&lt;br /&gt;
&lt;br /&gt;
== Известные архитектуры сверточных нейронных сетей ==&lt;br /&gt;
=== LeNet-5 ===&lt;br /&gt;
[[Файл:Lenet5.png|upright=1.0|thumb|Архитектура LeNet-5]]&lt;br /&gt;
Нейронная сеть, предложенная Яном Лекуном, для распознавания рукописных цифр MNIST.&lt;br /&gt;
&lt;br /&gt;
=== AlexNet ===&lt;br /&gt;
[[Файл:Alexnet.png|upright=1.0|thumb|Архитектура AlexNet]]&lt;br /&gt;
Победитель соревнования ImageNet 2012-ого года, набравший точность 84.6%. Была реализована с использованием CUDA для повышения производительности. Состоит из двух отдельных частей, которые слабо взаимодействуют друг с другом, что позволяет исполнять их параллельно на разных GPU с минимальным обменом данными.&lt;br /&gt;
&lt;br /&gt;
=== VGG ===&lt;br /&gt;
Семейство архитектур нейронных сетей, которое включает в себя, в частности, VGG-11, VGG-13, VGG-16 и VGG-19. Победитель соревнования ImageNet 2013-ого года (VGG-16), набравший точность 92.7%. Одной из отличительных особенностей является использование ядер свертки небольшого размера (3x3, в отличие от больших ядер размера 7x7 или 11x11).&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
===Scala===&lt;br /&gt;
Пример кода с библиотекой DeepLearning.scala&amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/index.html DeepLearning.scala]&amp;lt;/ref&amp;gt;&lt;br /&gt;
    // Загрузка датасета&lt;br /&gt;
    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
    // Определение слоёв&lt;br /&gt;
    def myNeuralNetwork(input: INDArray):  INDArrayLayer = {&lt;br /&gt;
        val cnnLayer = maxPool(relu(conv2d(input.reshape(input.shape()(0), Cifar10.NumberOfChannels, PixelHeight, PixelWidth), cnnWeight, cnnBias, (KernelHeight, KernelWidth), (Stride, Stride), (Padding, Padding))), (PoolSize, PoolSize))&lt;br /&gt;
        val affineRuleOfCnnLayer = relu(affine(cnnLayer.reshape(input.shape()(0), NumFilters * (PixelHeight / PoolSize) * (PixelWidth / PoolSize)), affineWeight, affineBias))&lt;br /&gt;
        val affineOfaffineRuleOfCnnLayer = affine(affineRuleOfCnnLayer.reshape(input.shape()(0), HiddenDim), affineLastWeight, affineLastBias)&lt;br /&gt;
        val softmaxValue = softmax(affineOfaffineRuleOfCnnLayer)&lt;br /&gt;
        softmaxValue&lt;br /&gt;
    }&lt;br /&gt;
    // Определение функции потерь&lt;br /&gt;
    def lossFunction(input: INDArray, expectOutput: INDArray): DoubleLayer = { &lt;br /&gt;
        val probabilities = myNeuralNetwork(input)&lt;br /&gt;
        -(hyperparameters.log(probabilities) * expectOutput).mean   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    class Trainer(batchSize: Int, numberOfEpoches: Int = 5) {&lt;br /&gt;
        import scalaz.std.anyVal._&lt;br /&gt;
        import scalaz.syntax.all._&lt;br /&gt;
        @volatile&lt;br /&gt;
        private var isShuttingDown: Boolean = false&lt;br /&gt;
        private val lossBuffer = scala.collection.mutable.Buffer.empty[Double]&lt;br /&gt;
        def plotLoss(): Unit = Seq(Scatter(lossBuffer.indices, lossBuffer)).plot(title = &amp;quot;loss by time&amp;quot;)&lt;br /&gt;
        def interrupt(): Unit = isShuttingDown = true&lt;br /&gt;
        def startTrain(): Unit = {&lt;br /&gt;
            @monadic[Future]&lt;br /&gt;
            def trainTask: Future[Unit] = {&lt;br /&gt;
                isShuttingDown = false&lt;br /&gt;
                var epoch = 0&lt;br /&gt;
            &lt;br /&gt;
                while (epoch &amp;lt; numberOfEpoches &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
                    val iterator = cifar10.epoch(batchSize).zipWithIndex&lt;br /&gt;
                    while (iterator.hasNext &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                        val (Cifar10.Batch(labels, batch), i) = iterator.next()&lt;br /&gt;
                        val loss = lossFunction(batch, labels).train.each&lt;br /&gt;
                        lossBuffer += loss&lt;br /&gt;
                        hyperparameters.logger.info(s&amp;quot;epoch=epoch iteration=i batchSize=batchSize loss=loss&amp;quot;)&lt;br /&gt;
                    }&lt;br /&gt;
                    epoch += 1&lt;br /&gt;
                }&lt;br /&gt;
                hyperparameters.logger.info(&amp;quot;Done&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
            trainTask.onComplete { tryUnit: scala.util.Try[Unit] =&amp;gt; tryUnit.get }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
_&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Convolution-operation-on-volume5.png&amp;diff=68584</id>
		<title>Файл:Convolution-operation-on-volume5.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Convolution-operation-on-volume5.png&amp;diff=68584"/>
				<updated>2019-01-20T13:28:44Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Источник: http://www.machinelearning.ru/wiki/images/1/1b/DL16_lecture_3.pdf&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Alexnet.png&amp;diff=68583</id>
		<title>Файл:Alexnet.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Alexnet.png&amp;diff=68583"/>
				<updated>2019-01-20T13:26:40Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Архитектура сверточной нейронной сети AlexNet.&lt;br /&gt;
Источник: https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lenet5.png&amp;diff=68582</id>
		<title>Файл:Lenet5.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lenet5.png&amp;diff=68582"/>
				<updated>2019-01-20T13:25:37Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Архитектура сверточной нейронной сети LeNet-5.&lt;br /&gt;
Источник: http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Maxpool.jpeg&amp;diff=68581</id>
		<title>Файл:Maxpool.jpeg</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Maxpool.jpeg&amp;diff=68581"/>
				<updated>2019-01-20T13:25:10Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пример операции пулинга с функцией максимума.&lt;br /&gt;
Источник: https://www.slideshare.net/YUNGKUEICHEN/convolutional-neural-network-cnn-image-recognition&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Padding.png&amp;diff=68580</id>
		<title>Файл:Padding.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Padding.png&amp;diff=68580"/>
				<updated>2019-01-20T13:20:29Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пример свертки с дополнением изображения нулями и сдвигом 2.&lt;br /&gt;
Источник: https://arxiv.org/abs/1603.07285&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Convolution_example.png&amp;diff=68579</id>
		<title>Файл:Convolution example.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Convolution_example.png&amp;diff=68579"/>
				<updated>2019-01-20T13:20:12Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пример свертки двух матриц&lt;br /&gt;
Источник: https://arxiv.org/abs/1603.07285&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68566</id>
		<title>Сверточные нейронные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68566"/>
				<updated>2019-01-19T21:50:00Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сверточная нейронная сеть''' (англ. ''convolutional neural network'', ''CNN'') {{---}} специальная архитектура нейронных сетей, предложенная [https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BA%D1%83%D0%BD,_%D0%AF%D0%BD Яном Лекуном], изначально нацеленная на эффективное распознавание изображений.&lt;br /&gt;
&lt;br /&gt;
== Свертка ==&lt;br /&gt;
[[Файл:Convolution_example.png|upright=1.0|thumb|Пример свертки двух матриц размера 5x5 и 3x3]]&lt;br /&gt;
'''Свертка''' (англ. ''convolution'') {{---}} операция над парой матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;n_x\times n_y&amp;lt;/math&amp;gt;) и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;m_x \times m_y&amp;lt;/math&amp;gt;), результатом которой является матрица &amp;lt;math&amp;gt;C = A * B&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;(n_x-m_x+1)\times (n_y-m_y+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Каждый элемент результата вычисляется как скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и некоторой подматрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; такого же размера (подматрица определяется положением элемента в результате).&lt;br /&gt;
То есть, &amp;lt;math&amp;gt;C_{i,j} = \sum_{u = 0}^{m_x-1}\sum_{v = 0}^{m_y - 1}A_{i+u,j+v}B_{u,v}&amp;lt;/math&amp;gt;. На изображении справа можно видеть, как матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; «двигается» по матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и в каждом положении считается скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и той части матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, на которую она сейчас наложена. Получившееся число записывается в соответствующий элемент результата.&lt;br /&gt;
&lt;br /&gt;
Логический смысл свертки такой {{---}} чем больше величина элемента свертки, тем больше эта часть матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; была похожа на матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (похожа в смысле скалярного произведения). Поэтому матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; называют ''изображением'', а матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; {{---}} ''фильтром'' или ''образцом''.&lt;br /&gt;
&lt;br /&gt;
== Структура сверточной нейронной сети ==&lt;br /&gt;
В сверточной нейронной сети выходы промежуточных слоев образуют матрицу (изображение) или набор матриц (несколько слоёв изображения). Так, например, на вход сверточной нейронной сети можно подавать три слоя изображения (R-, G-, B-каналы изображения). Основными видами слоев в сверточной нейронной сети являются сверточные слои (англ. ''convolutional layer''), пулинговые слои (англ. ''pooling layer'') и [[:Нейронные сети, перцептрон|полносвязные слои]]&amp;lt;sup&amp;gt;[на 09.01.19 не создан]&amp;lt;/sup&amp;gt; (англ. ''fully-connected layer'').&lt;br /&gt;
&lt;br /&gt;
=== Сверточный слой ===&lt;br /&gt;
[[Файл:Padding.png|upright=1.0|thumb|Пример свертки двух матриц с дополнением нулями и сдвигом 2]]&lt;br /&gt;
[[Файл:Convolution-operation-on-volume5.png|upright=1.0|thumb|Пример свертки с трехмерным ядром]]&lt;br /&gt;
Сверточный слой нейронной сети представляет из себя применение операции свертки к выходам с предыдущего слоя, где веса ядра свертки являются обучаемыми параметрами. Еще один обучаемый вес используется в качестве константного сдвига (англ. ''bias''). При этом есть несколько важных деталей:&lt;br /&gt;
&lt;br /&gt;
* В одном сверточном слое может быть несколько сверток. В этом случае для каждой свертки на выходе получится своё изображение. Например, если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а в слое было &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сверток с ядром размерности &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;n\times(w - k_x + 1)\times(h - k_y + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Ядра свертки могут быть трёхмерными. Свертка трехмерного входа с трехмерным ядром происходит аналогично, просто скалярное произведение считается еще и по всем слоям изображения. Например, для усреднения информации о цветах исходного изображения, на первом слое можно использовать свертку размерности &amp;lt;math&amp;gt;3\times w \times h&amp;lt;/math&amp;gt;. На выходе такого слоя будет уже одно изображение (вместо трёх).&lt;br /&gt;
&lt;br /&gt;
* Можно заметить, что применение операции свертки уменьшает изображение. Также пиксели, которые находятся на границе изображения учавствуют в меньшем количестве сверток, чем внутренние. В связи с этим в сверточных слоях используется дополнение изображения (англ. ''padding''). Выходы с предыдущего слоя дополняются пикселями так, чтобы после свертки сохранился размер изображения. Такие свертки называют ''одинаковыми'' (англ. ''same convolution''), а свертки без дополнения изображения называются ''правильными'' (англ. ''valid convolution''). Среди способов, которыми можно заполнить новые пиксели, можно выделить следующие:&lt;br /&gt;
** ''zero shift'': &amp;lt;code&amp;gt;00[ABC]00&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''border extension'': &amp;lt;code&amp;gt;AA[ABC]CC&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''mirror shift'': &amp;lt;code&amp;gt;BA[ABC]CB&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''cyclic shift'': &amp;lt;code&amp;gt;BC[ABC]AB&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Еще одним параметром сверточного слоя является ''сдвиг'' (англ. ''stride''). Хоть обычно свертка применяется подряд для каждого пикселя, иногда используется сдвиг, отличный от единицы {{---}} скалярное произведение считается не со всеми возможными положениями ядра, а только с положениями, кратными некоторому сдвигу &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;. Тогда, если если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а ядро свертки имело размерность &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt; и использовался сдвиг &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;\lfloor\frac{w - k_x}{s} + 1\rfloor\times\lfloor\frac{h - k_y}{s} + 1\rfloor&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Пулинговый слой ===&lt;br /&gt;
[[Файл:Maxpool.jpeg|upright=1.0|thumb|Пример операции пулинга с функцией максимума]]&lt;br /&gt;
Пулинговый слой призван снижать размерность изображения. Исходное изображение делится на блоки размером &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt; и для каждого блока вычисляется некоторая функция. Чаще всего используется функция максимума (англ. ''max pooling'') или (взвешенного) среднего (англ. ''(weighted) average pooling''). Обучаемых параметров у этого слоя нет. Основные цели пулингового слоя:&lt;br /&gt;
* уменьшение изображения, чтобы последующие свертки оперировали над большей областью исходного изображения;&lt;br /&gt;
* увеличение инвариантности выхода сети по отношению к малому переносу входа;&lt;br /&gt;
* ускорение вычислений.&lt;br /&gt;
&lt;br /&gt;
== Известные архитектуры сверточных нейронных сетей ==&lt;br /&gt;
=== LeNet-5 ===&lt;br /&gt;
[[Файл:Lenet5.png|upright=1.0|thumb|Архитектура LeNet-5]]&lt;br /&gt;
Нейронная сеть, предложенная Яном Лекуном, для распознавания рукописных цифр MNIST.&lt;br /&gt;
&lt;br /&gt;
=== AlexNet ===&lt;br /&gt;
[[Файл:Alexnet.png|upright=1.0|thumb|Архитектура AlexNet]]&lt;br /&gt;
Победитель соревнования ImageNet 2012-ого года, набравший точность 84.6%. Была реализована с использованием CUDA для повышения производительности. Состоит из двух отдельных частей, которые слабо взаимодействуют друг с другом, что позволяет исполнять их параллельно на разных GPU с минимальным обменом данными.&lt;br /&gt;
&lt;br /&gt;
=== VGG ===&lt;br /&gt;
Семейство архитектур нейронных сетей, которое включает в себя, в частности, VGG-11, VGG-13, VGG-16 и VGG-19. Победитель соревнования ImageNet 2013-ого года (VGG-16), набравший точность 92.7%. Одной из отличительных особенностей является использование ядер свертки небольшого размера (3x3, в отличие от больших ядер размера 7x7 или 11x11).&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
===Scala===&lt;br /&gt;
Пример кода с библиотекой DeepLearning.scala&amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/index.html DeepLearning.scala]&amp;lt;/ref&amp;gt;&lt;br /&gt;
    // Загрузка датасета&lt;br /&gt;
    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
    // Определение слоёв&lt;br /&gt;
    def myNeuralNetwork(input: INDArray):  INDArrayLayer = {&lt;br /&gt;
        val cnnLayer = maxPool(relu(conv2d(input.reshape(input.shape()(0), Cifar10.NumberOfChannels, PixelHeight, PixelWidth), cnnWeight, cnnBias, (KernelHeight, KernelWidth), (Stride, Stride), (Padding, Padding))), (PoolSize, PoolSize))&lt;br /&gt;
        val affineRuleOfCnnLayer = relu(affine(cnnLayer.reshape(input.shape()(0), NumFilters * (PixelHeight / PoolSize) * (PixelWidth / PoolSize)), affineWeight, affineBias))&lt;br /&gt;
        val affineOfaffineRuleOfCnnLayer = affine(affineRuleOfCnnLayer.reshape(input.shape()(0), HiddenDim), affineLastWeight, affineLastBias)&lt;br /&gt;
        val softmaxValue = softmax(affineOfaffineRuleOfCnnLayer)&lt;br /&gt;
        softmaxValue&lt;br /&gt;
    }&lt;br /&gt;
    // Определение функции потерь&lt;br /&gt;
    def lossFunction(input: INDArray, expectOutput: INDArray): DoubleLayer = { &lt;br /&gt;
        val probabilities = myNeuralNetwork(input)&lt;br /&gt;
        -(hyperparameters.log(probabilities) * expectOutput).mean   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    class Trainer(batchSize: Int, numberOfEpoches: Int = 5) {&lt;br /&gt;
        import scalaz.std.anyVal._&lt;br /&gt;
        import scalaz.syntax.all._&lt;br /&gt;
        @volatile&lt;br /&gt;
        private var isShuttingDown: Boolean = false&lt;br /&gt;
        private val lossBuffer = scala.collection.mutable.Buffer.empty[Double]&lt;br /&gt;
        def plotLoss(): Unit = Seq(Scatter(lossBuffer.indices, lossBuffer)).plot(title = &amp;quot;loss by time&amp;quot;)&lt;br /&gt;
        def interrupt(): Unit = isShuttingDown = true&lt;br /&gt;
        def startTrain(): Unit = {&lt;br /&gt;
            @monadic[Future]&lt;br /&gt;
            def trainTask: Future[Unit] = {&lt;br /&gt;
                isShuttingDown = false&lt;br /&gt;
                var epoch = 0&lt;br /&gt;
            &lt;br /&gt;
                while (epoch &amp;lt; numberOfEpoches &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
                    val iterator = cifar10.epoch(batchSize).zipWithIndex&lt;br /&gt;
                    while (iterator.hasNext &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                        val (Cifar10.Batch(labels, batch), i) = iterator.next()&lt;br /&gt;
                        val loss = lossFunction(batch, labels).train.each&lt;br /&gt;
                        lossBuffer += loss&lt;br /&gt;
                        hyperparameters.logger.info(s&amp;quot;epoch=epoch iteration=i batchSize=batchSize loss=loss&amp;quot;)&lt;br /&gt;
                    }&lt;br /&gt;
                    epoch += 1&lt;br /&gt;
                }&lt;br /&gt;
                hyperparameters.logger.info(&amp;quot;Done&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
            trainTask.onComplete { tryUnit: scala.util.Try[Unit] =&amp;gt; tryUnit.get }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
_&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68256</id>
		<title>Сверточные нейронные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=68256"/>
				<updated>2019-01-10T09:49:29Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сверточная нейронная сеть''' (англ. ''convolutional neural network'', ''CNN'') {{---}} специальная архитектура нейронных сетей, предложенная [https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BA%D1%83%D0%BD,_%D0%AF%D0%BD Яном Лекуном], изначально нацеленная на эффективное распознавание изображений.&lt;br /&gt;
&lt;br /&gt;
== Свертка ==&lt;br /&gt;
[[Файл:Convolution_example.png|upright=1.5|thumb|Пример свертки двух матриц размера 5x5 и 3x3]]&lt;br /&gt;
'''Свертка''' (англ. ''convolution'') {{---}} операция над парой матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;n_x\times n_y&amp;lt;/math&amp;gt;) и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;m_x \times m_y&amp;lt;/math&amp;gt;), результатом которой является матрица &amp;lt;math&amp;gt;C = A * B&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;(n_x-m_x+1)\times (n_y-m_y+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Каждый элемент результата вычисляется как скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и некоторой подматрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; такого же размера (подматрица определяется положением элемента в результате).&lt;br /&gt;
То есть, &amp;lt;math&amp;gt;C_{i,j} = \sum_{u = 0}^{m_x-1}\sum_{v = 0}^{m_y - 1}A_{i+u,j+v}B_{u,v}&amp;lt;/math&amp;gt;. На изображении справа можно видеть, как матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; «двигается» по матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и в каждом положении считается скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и той части матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, на которую она сейчас наложена. Получившееся число записывается в соответствующий элемент результата.&lt;br /&gt;
&lt;br /&gt;
Логический смысл свертки такой {{---}} чем больше величина элемента свертки, тем больше эта часть матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; была похожа на матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (похожа в смысле скалярного произведения). Поэтому матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; называют ''изображением'', а матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; {{---}} ''фильтром'' или ''образцом''.&lt;br /&gt;
&lt;br /&gt;
== Структура сверточной нейронной сети ==&lt;br /&gt;
В сверточной нейронной сети выходы промежуточных слоев образуют матрицу (изображение) или набор матриц (несколько слоёв изображения). Так, например, на вход сверточной нейронной сети можно подавать три слоя изображения (R-, G-, B-каналы изображения). Распространенными видами слоев в сверточной нейронной сети являются сверточные слои (англ. ''convolutional layer''), пулинговые слои (англ. ''pooling layer'') и [[:Нейронные сети, перцептрон|полносвязные слои]]&amp;lt;sup&amp;gt;[на 09.01.19 не создан]&amp;lt;/sup&amp;gt; (англ. ''fully-connected layer'').&lt;br /&gt;
&lt;br /&gt;
=== Сверточный слой ===&lt;br /&gt;
[[Файл:Padding.png|upright=1.5|thumb|Пример свертки двух матриц с дополнением нулями и сдвигом 2]]&lt;br /&gt;
Сверточный слой нейронной сети представляет из себя применение операции свертки к выходам с предыдущего слоя, где веса ядра свертки являются обучаемыми параметрами. Еще один обучаемый вес используется в качестве константного сдвига (англ. bias). При этом есть несколько важных деталей:&lt;br /&gt;
&lt;br /&gt;
* В одном сверточном слое может быть несколько сверток. В этом случае для каждой свертки на выходе получится своё изображение. Например, если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а в слое было &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сверток с ядром размерности &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;n\times(w - k_x + 1)\times(h - k_y + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Ядра свертки могут быть трёхмерными. Свертка трехмерного входа с трехмерным ядром происходит аналогично, просто скалярное произведение считается еще и по всем слоям изображения. Например, для усреднения информации о цветах исходного изображения, на первом слое можно использовать свертку размерности &amp;lt;math&amp;gt;3\times w \times h&amp;lt;/math&amp;gt;. На выходе такого слоя будет уже одно изображение (вместо трёх).&lt;br /&gt;
&lt;br /&gt;
* Можно заметить, что применение операции свертки уменьшает изображение. Также пиксели, которые находятся на границе изображения учавствуют в меньшем количестве сверток, чем внутренние. В связи с этим в сверточных слоях используется дополнение изображения (англ. padding). Выходы с предыдущего слоя дополняются пикселями так, чтобы после свертки сохранился размер изображения (распространенной практикой является дополнять изображение нулями (англ. zero padding), но возможны и другие подходы). Такие свертки называют ''одинаковыми'' (англ. same convolution), а свертки без дополнения изображения называются ''правильными'' (англ. valid convolution).&lt;br /&gt;
&lt;br /&gt;
* Еще одним параметром сверточного слоя является ''сдвиг'' (англ. stride). Хоть обычно свертка применяется подряд для каждого пикселя, иногда используется сдвиг, отличный от единицы {{---}} скалярное произведение считается не со всеми возможными положениями ядра, а только с положениями, кратными некоторому сдвигу &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;. Тогда, если если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а ядро свертки имело размерность &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt; и использовался сдвиг &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;\lfloor\frac{w - k_x}{s} + 1\rfloor\times\lfloor\frac{h - k_y}{s} + 1\rfloor&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Пулинговый слой ===&lt;br /&gt;
Пулинговый слой призван снижать размерность изображения. Исходное изображение делится на блоки размером &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt; и для каждого блока вычисляется некоторая функция (например, максимум в случае max pooling или (взвешенное) среднее в случае (weighted) average pooling). Обучаемых параметров у этого слоя нет, его основная цель {{---}} уменьшить изображение, чтобы последующие свертки оперировали над большей областью исходного изображения. Также он призван увеличить инвариантность выхода сети по отношению к малому переносу входа.&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Padding.png&amp;diff=68252</id>
		<title>Файл:Padding.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Padding.png&amp;diff=68252"/>
				<updated>2019-01-10T09:22:45Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.218.179: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пример свертки с дополнением изображения нулями и сдвигом 2.&lt;/div&gt;</summary>
		<author><name>5.18.218.179</name></author>	</entry>

	</feed>