<?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=Dariyakovleva</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=Dariyakovleva"/>
		<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/Dariyakovleva"/>
		<updated>2026-06-11T20:17:36Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=69691</id>
		<title>Логистическая регрессия</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=69691"/>
				<updated>2019-01-30T20:39:50Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''Логистическая регрессия''' (англ. ''logistic regression'') — метод построения линейного классификатора, позволяющий оценивать апостериорные вероятности принадлежности объектов классам.&lt;br /&gt;
== Описание ==&lt;br /&gt;
Логистическая регрессия применяется для прогнозирования вероятности возникновения некоторого события по значениям множества признаков. Для этого вводится зависимая переменная $y$, принимающая значения $0$ и $1$ и множество [[Независимые случайные величины|независимых]] переменных &amp;lt;tex&amp;gt;x_1, ... x_n&amp;lt;/tex&amp;gt; на основе значений которых требуется вычислить вероятность принятия того или иного значения зависимой переменной.&lt;br /&gt;
&lt;br /&gt;
Итак, пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ {{---}} конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим случай двух классов: $Y = \{-1, +1\}$. В логистической регрессии строится линейный алгоритм классификации $a: X \to Y$ вида &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x, w) = \mathrm{sign}\left(\sum\limits_{j=1}^n w_j f_j(x) - w_0 \right)=\mathrm{sign}\left&amp;lt;x, w\right&amp;gt;&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
где $w_j$ $-$ вес $j$-го признака, $w_0$ $-$ порог принятия решения, $w=\left(w_0, ..., w_n\right)$ $-$ вектор весов, $\left&amp;lt;x, w\right&amp;gt;$ $-$ скалярное произведение признакового описания объекта на вектор весов. Предполагается, что искусственно введён нулевой признак: $f_{0}(x)=-1$.&lt;br /&gt;
&lt;br /&gt;
Задача обучения линейного классификатора заключается в том, чтобы по выборке  $X^m$ настроить вектор весов $w$. В логистической регрессии для этого решается задача минимизации эмпирического риска с функцией потерь специального вида: &amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^m \ln\left( 1 + \exp( -y_i \langle x_i,w \rangle ) \right) \to \min_{w}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После того, как решение $w$ найдено, становится возможным не только вычислять классификацию $a(x) = \mathrm{sign}\langle x,w \rangle$ для произвольного объекта $x$, но и оценивать апостериорные вероятности его принадлежности классам:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
где $\sigma(z) = \frac1{1+e^{-z}}$ {{---}} сигмоидная функция.&lt;br /&gt;
&lt;br /&gt;
== Обоснование ==&lt;br /&gt;
'''С точки зрения [[Байесовский классификатор|байесовского классификатора]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Наиболее строгое обоснование логистической регрессии опирается на следующую теорему&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть&lt;br /&gt;
*выборка прецедентов $\mathrm{X}^l=\{\left(x_1, y_1\right), ... ,\left(x_l, y_l\right)\}$  получена согласно вероятностному распределению с плотностью &lt;br /&gt;
&amp;lt;tex&amp;gt;p\left(x, y\right)=\mathrm{P}_yp_y\left(x\right)=\mathrm{P}\left(y|x\right)p\left(x\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
где $\mathrm{P}_y$ {{---}} ''априорные вероятности'',&lt;br /&gt;
$p_y(x)$ $-$ ''функции правдоподобия'', принадлежащие экспонентному семейству плотностей (т.е. $p_y(x) = \exp \left( \langle\theta,x\rangle \cdot a(\delta) + b(\delta,\theta) + d(x,\delta) \right)$, где $a, b, d$ $-$ произвольные функции);&lt;br /&gt;
*функции правдоподобия имеют равные знаения параметра разброса $\delta$ и отличаются только значениями параметра сдвига $\theta_y$;&lt;br /&gt;
*среди признаков есть константа, скажем, $f_0(x) = -1$;&lt;br /&gt;
Тогда &lt;br /&gt;
*линейный классификатор является оптимальным байесовским классификатором;&lt;br /&gt;
*апостериорные вероятности классов оценивается по формуле &amp;lt;tex&amp;gt;\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Напомним, что оптимальный байесовский классификатор для двух классов выглядит следущим образом:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a\left(x\right)=&lt;br /&gt;
\mathrm{sign}\left(\lambda_+\mathrm{P}\left(+1|x\right)-\lambda_-\mathrm{P}\left(-1|x\right)\right)=&lt;br /&gt;
\mathrm{sign}\left(\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)}-\frac{\lambda_-}{\lambda_+}\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим отношение апостериорных вероятностей классов  &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
и распишем функции правдоподобия, используя экспонентную формулу с параметрами $\theta_y$ и $\delta$:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)} = \exp\left(\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle+b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-}\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим получившуюся под экспонентой сумму: &lt;br /&gt;
*$\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle = \langle w, x\rangle$. Вектор $w$ не зависит от $x$ и является вектором свободных коэффициентов(весов) при константных признаках;&lt;br /&gt;
*$b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-} = \mathrm{const}\left(x\right)$. Можно считать данные слагаемые аддитивной добавкой к коэффициенту при признаке. Но так как свободные коэффициенты настраиваются по обучающей выборке, вычислять эту добавку не имеет смысла и ее можно включить в $\langle w, x\rangle$.&lt;br /&gt;
&lt;br /&gt;
Таким образом, &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \mathrm{e}^{\langle w, x\rangle}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разделяющая поверхность в байесовском решающем правиле определяется уравнением &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\lambda_- \mathrm{P}\left(-1|x\right) = \lambda_+ \mathrm{P}\left(+1|x\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
которое равносильно &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\langle w, x\rangle - \ln\frac{\lambda_-}{\lambda_+} = 0&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следовательно, разделяющая поверхность линейна и первый пункт теоремы доказан.&lt;br /&gt;
&lt;br /&gt;
Используя [[Формула полной вероятности|формулу полной вероятности]] получаем следующее равенство&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{P}\left(+1|x\right) + \mathrm{P}\left(-1|x\right) = \sigma\left(+\langle w ,x\rangle\right) + \sigma\left(-\langle w ,x\rangle\right) = 1&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откуда следует:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{P}\left(y|x\right)=\sigma\left(\langle w, x\rangle y\right), y = \{-1, +1\}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
Таким образом, второй пункт теоремы доказан.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
==== scikit-learn ====&lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.'''LogisticRegression'''] имеет несколько параметров, например:&lt;br /&gt;
* '''solver''' $-$ алгоритм, использующийся для оптимизации;&lt;br /&gt;
* '''multi_class''' $-$ классификация на 2 или много классов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки:&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' LogisticRegression&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества:&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение:&lt;br /&gt;
 clf = LogisticRegression(random_state='''0''', solver='lbfgs', multi_class='multinomial')&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание:&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
==== [[Примеры кода на Scala#Логистическая регрессия|Пример кода на Scala]] ====&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Линейная регрессия]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Вариации регрессии]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Уменьшение размерности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
#[http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F Логистическая регрессия] $-$ курс лекций Воронцова&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Logistic_regression Logistic regression] $-$ Wikipedia&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.LogisticRegression] $-$ реализация алгоритма на scikit-learn.org&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=69690</id>
		<title>Логистическая регрессия</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=69690"/>
				<updated>2019-01-30T20:39:17Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''Логистическая регрессия''' (англ. ''logistic regression'') — метод построения линейного классификатора, позволяющий оценивать апостериорные вероятности принадлежности объектов классам.&lt;br /&gt;
== Описание ==&lt;br /&gt;
Логистическая регрессия применяется для прогнозирования вероятности возникновения некоторого события по значениям множества признаков. Для этого вводится зависимая переменная $y$, принимающая значения $0$ и $1$ и множество [[Независимые случайные величины|независимых]] переменных &amp;lt;tex&amp;gt;x_1, ... x_n&amp;lt;/tex&amp;gt; на основе значений которых требуется вычислить вероятность принятия того или иного значения зависимой переменной.&lt;br /&gt;
&lt;br /&gt;
Итак, пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ {{---}} конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим случай двух классов: $Y = \{-1, +1\}$. В логистической регрессии строится линейный алгоритм классификации $a: X \to Y$ вида &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x, w) = \mathrm{sign}\left(\sum\limits_{j=1}^n w_j f_j(x) - w_0 \right)=\mathrm{sign}\left&amp;lt;x, w\right&amp;gt;&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
где $w_j$ $-$ вес $j$-го признака, $w_0$ $-$ порог принятия решения, $w=\left(w_0, ..., w_n\right)$ $-$ вектор весов, $\left&amp;lt;x, w\right&amp;gt;$ $-$ скалярное произведение признакового описания объекта на вектор весов. Предполагается, что искусственно введён нулевой признак: $f_{0}(x)=-1$.&lt;br /&gt;
&lt;br /&gt;
Задача обучения линейного классификатора заключается в том, чтобы по выборке  $X^m$ настроить вектор весов $w$. В логистической регрессии для этого решается задача минимизации эмпирического риска с функцией потерь специального вида: &amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^m \ln\left( 1 + \exp( -y_i \langle x_i,w \rangle ) \right) \to \min_{w}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После того, как решение $w$ найдено, становится возможным не только вычислять классификацию $a(x) = \mathrm{sign}\langle x,w \rangle$ для произвольного объекта $x$, но и оценивать апостериорные вероятности его принадлежности классам:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
где $\sigma(z) = \frac1{1+e^{-z}}$ {{---}} сигмоидная функция.&lt;br /&gt;
&lt;br /&gt;
== Обоснование ==&lt;br /&gt;
'''С точки зрения [[Байесовский классификатор|байесовского классификатора]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Наиболее строгое обоснование логистической регрессии опирается на следующую теорему&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть&lt;br /&gt;
*выборка прецедентов $\mathrm{X}^l=\{\left(x_1, y_1\right), ... ,\left(x_l, y_l\right)\}$  получена согласно вероятностному распределению с плотностью &lt;br /&gt;
&amp;lt;tex&amp;gt;p\left(x, y\right)=\mathrm{P}_yp_y\left(x\right)=\mathrm{P}\left(y|x\right)p\left(x\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
где $\mathrm{P}_y$ {{---}} ''априорные вероятности'',&lt;br /&gt;
$p_y(x)$ $-$ ''функции правдоподобия'', принадлежащие экспонентному семейству плотностей (т.е. $p_y(x) = \exp \left( \langle\theta,x\rangle \cdot a(\delta) + b(\delta,\theta) + d(x,\delta) \right)$, где $a, b, d$ $-$ произвольные функции);&lt;br /&gt;
*функции правдоподобия имеют равные знаения параметра разброса $\delta$ и отличаются только значениями параметра сдвига $\theta_y$;&lt;br /&gt;
*среди признаков есть константа, скажем, $f_0(x) = -1$;&lt;br /&gt;
Тогда &lt;br /&gt;
*линейный классификатор является оптимальным байесовским классификатором;&lt;br /&gt;
*апостериорные вероятности классов оценивается по формуле &amp;lt;tex&amp;gt;\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Напомним, что оптимальный байесовский классификатор для двух классов выглядит следущим образом:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a\left(x\right)=&lt;br /&gt;
\mathrm{sign}\left(\lambda_+\mathrm{P}\left(+1|x\right)-\lambda_-\mathrm{P}\left(-1|x\right)\right)=&lt;br /&gt;
\mathrm{sign}\left(\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)}-\frac{\lambda_-}{\lambda_+}\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим отношение апостериорных вероятностей классов  &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
и распишем функции правдоподобия, используя экспонентную формулу с параметрами $\theta_y$ и $\delta$:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)} = \exp\left(\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle+b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-}\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим получившуюся под экспонентой сумму: &lt;br /&gt;
*$\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle = \langle w, x\rangle$. Вектор $w$ не зависит от $x$ и является вектором свободных коэффициентов(весов) при константных признаках;&lt;br /&gt;
*$b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-} = \mathrm{const}\left(x\right)$. Можно считать данные слагаемые аддитивной добавкой к коэффициенту при признаке. Но так как свободные коэффициенты настраиваются по обучающей выборке, вычислять эту добавку не имеет смысла и ее можно включить в $\langle w, x\rangle$.&lt;br /&gt;
&lt;br /&gt;
Таким образом, &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \mathrm{e}^{\langle w, x\rangle}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разделяющая поверхность в байесовском решающем правиле определяется уравнением &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\lambda_- \mathrm{P}\left(-1|x\right) = \lambda_+ \mathrm{P}\left(+1|x\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
которое равносильно &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\langle w, x\rangle - \ln\frac{\lambda_-}{\lambda_+} = 0&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следовательно, разделяющая поверхность линейна и первый пункт теоремы доказан.&lt;br /&gt;
&lt;br /&gt;
Используя [[Формула полной вероятности|формулу полной вероятности]] получаем следующее равенство&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{P}\left(+1|x\right) + \mathrm{P}\left(-1|x\right) = \sigma\left(+\langle w ,x\rangle\right) + \sigma\left(-\langle w ,x\rangle\right) = 1&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откуда следует:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{P}\left(y|x\right)=\sigma\left(\langle w, x\rangle y\right), y = \{-1, +1\}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
Таким образом, второй пункт теоремы доказан.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
==== scikit-learn ====&lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.'''LogisticRegression'''] имеет несколько параметров, например:&lt;br /&gt;
* '''solver''' $-$ алгоритм, использующийся для оптимизации&lt;br /&gt;
* '''multi_class''' $-$ классификация на 2 или много классов&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' LogisticRegression&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение&lt;br /&gt;
 clf = LogisticRegression(random_state='''0''', solver='lbfgs', multi_class='multinomial')&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
==== [[Примеры кода на Scala#Логистическая регрессия|Пример кода на Scala]] ====&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Линейная регрессия]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Вариации регрессии]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Уменьшение размерности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
#[http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F Логистическая регрессия] $-$ курс лекций Воронцова&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Logistic_regression Logistic regression] $-$ Wikipedia&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.LogisticRegression] $-$ реализация алгоритма на scikit-learn.org&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=69689</id>
		<title>Логистическая регрессия</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=69689"/>
				<updated>2019-01-30T20:37:04Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''Логистическая регрессия''' (англ. ''logistic regression'') — метод построения линейного классификатора, позволяющий оценивать апостериорные вероятности принадлежности объектов классам.&lt;br /&gt;
== Описание ==&lt;br /&gt;
Логистическая регрессия применяется для прогнозирования вероятности возникновения некоторого события по значениям множества признаков. Для этого вводится зависимая переменная $y$, принимающая значения $0$ и $1$ и множество [[Независимые случайные величины|независимых]] переменных &amp;lt;tex&amp;gt;x_1, ... x_n&amp;lt;/tex&amp;gt; на основе значений которых требуется вычислить вероятность принятия того или иного значения зависимой переменной.&lt;br /&gt;
&lt;br /&gt;
Итак, пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ $-$ конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим случай двух классов: $Y = \{-1, +1\}$. В логистической регрессии строится линейный алгоритм классификации $a: X \to Y$ вида &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x, w) = \mathrm{sign}\left(\sum\limits_{j=1}^n w_j f_j(x) - w_0 \right)=\mathrm{sign}\left&amp;lt;x, w\right&amp;gt;&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
где $w_j$ $-$ вес $j$-го признака, $w_0$ $-$ порог принятия решения, $w=\left(w_0, ..., w_n\right)$ $-$ вектор весов, $\left&amp;lt;x, w\right&amp;gt;$ $-$ скалярное произведение признакового описания объекта на вектор весов. Предполагается, что искусственно введён нулевой признак: $f_{0}(x)=-1$.&lt;br /&gt;
&lt;br /&gt;
Задача обучения линейного классификатора заключается в том, чтобы по выборке  $X^m$ настроить вектор весов $w$. В логистической регрессии для этого решается задача минимизации эмпирического риска с функцией потерь специального вида: &amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^m \ln\left( 1 + \exp( -y_i \langle x_i,w \rangle ) \right) \to \min_{w}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
После того, как решение $w$ найдено, становится возможным не только вычислять классификацию $a(x) = \mathrm{sign}\langle x,w \rangle$ для произвольного объекта $x$, но и оценивать апостериорные вероятности его принадлежности классам:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
где $\sigma(z) = \frac1{1+e^{-z}}$ {{---}} сигмоидная функция.&lt;br /&gt;
&lt;br /&gt;
== Обоснование ==&lt;br /&gt;
'''С точки зрения [[Байесовский классификатор|байесовского классификатора]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Наиболее строгое обоснование логистической регрессии опирается на следующую теорему&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть&lt;br /&gt;
*выборка прецедентов $\mathrm{X}^l=\{\left(x_1, y_1\right), ... ,\left(x_l, y_l\right)\}$  получена согласно вероятностному распределению с плотностью &lt;br /&gt;
&amp;lt;tex&amp;gt;p\left(x, y\right)=\mathrm{P}_yp_y\left(x\right)=\mathrm{P}\left(y|x\right)p\left(x\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
где $\mathrm{P}_y$ $-$ ''априорные вероятности'',&lt;br /&gt;
$p_y(x)$ $-$ ''функции правдоподобия'', принадлежащие экспонентному семейству плотностей (т.е. $p_y(x) = \exp \left( \langle\theta,x\rangle \cdot a(\delta) + b(\delta,\theta) + d(x,\delta) \right)$, где $a, b, d$ $-$ произвольные функции);&lt;br /&gt;
*функции правдоподобия имеют равные знаения параметра разброса $\delta$ и отличаются только значениями параметра сдвига $\theta_y$;&lt;br /&gt;
*среди признаков есть константа, скажем, $f_0(x) = -1$;&lt;br /&gt;
Тогда &lt;br /&gt;
*линейный классификатор является оптимальным байесовским классификатором;&lt;br /&gt;
*апостериорные вероятности классов оценивается по формуле &amp;lt;tex&amp;gt;\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Напомним, что оптимальный байесовский классификатор для двух классов выглядит следущим образом:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a\left(x\right)=&lt;br /&gt;
\mathrm{sign}\left(\lambda_+\mathrm{P}\left(+1|x\right)-\lambda_-\mathrm{P}\left(-1|x\right)\right)=&lt;br /&gt;
\mathrm{sign}\left(\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)}-\frac{\lambda_-}{\lambda_+}\right)&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Рассмотрим отношение апостериорных вероятностей классов  &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
и распишем функции правдоподобия, используя экспонентную формулу с параметрами $\theta_y$ и $\delta$:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)} = \exp\left(\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle+b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-}\right)&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Рассмотрим получившуюся под экспонентой сумму: &lt;br /&gt;
*$\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle = \langle w, x\rangle$. Вектор $w$ не зависит от $x$ и является вектором свободных коэффициентов(весов) при константных признаках;&lt;br /&gt;
*$b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-} = \mathrm{const}\left(x\right)$. Можно считать данные слагаемые аддитивной добавкой к коэффициенту при признаке. Но так как свободные коэффициенты настраиваются по обучающей выборке, вычислять эту добавку не имеет смысла и ее можно включить в $\langle w, x\rangle$.&lt;br /&gt;
&lt;br /&gt;
Таким образом, &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \mathrm{e}^{\langle w, x\rangle}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Разделяющая поверхность в байесовском решающем правиле определяется уравнением &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\lambda_- \mathrm{P}\left(-1|x\right) = \lambda_+ \mathrm{P}\left(+1|x\right)&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
которое равносильно &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\langle w, x\rangle - \ln\frac{\lambda_-}{\lambda_+} = 0&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
Следовательно, разделяющая поверхность линейна и первый пункт теоремы доказан.&lt;br /&gt;
&lt;br /&gt;
Используя [[Формула полной вероятности|формулу полной вероятности]] получаем следующее равенство&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{P}\left(+1|x\right) + \mathrm{P}\left(-1|x\right) = \sigma\left(+\langle w ,x\rangle\right) + \sigma\left(-\langle w ,x\rangle\right) = 1&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Откуда следует:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{P}\left(y|x\right)=\sigma\left(\langle w, x\rangle y\right), y = \{-1, +1\}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
Таким образом, второй пункт теоремы доказан.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
==== scikit-learn ====&lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.'''LogisticRegression'''] имеет несколько параметров, например:&lt;br /&gt;
* '''solver''' $-$ алгоритм, использующийся для оптимизации&lt;br /&gt;
* '''multi_class''' $-$ классификация на 2 или много классов&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' LogisticRegression&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение&lt;br /&gt;
 clf = LogisticRegression(random_state='''0''', solver='lbfgs', multi_class='multinomial')&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
==== [[Примеры кода на Scala#Логистическая регрессия|Пример кода на Scala]] ====&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Линейная регрессия]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Вариации регрессии]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Уменьшение размерности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
#[http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F Логистическая регрессия] $-$ курс лекций Воронцова&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Logistic_regression Logistic regression] $-$ Wikipedia&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.LogisticRegression] $-$ реализация алгоритма на scikit-learn.org&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69688</id>
		<title>Стохастический градиентный спуск</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69688"/>
				<updated>2019-01-30T20:35:18Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Стохастический градиентный спуск''' (англ. ''stochastic gradient descent'') $-$ оптимизационный алгоритм, отличающийся от обычного [https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA градиентного спуска] тем, что градиент оптимизируемой функции считается на каждом шаге не как сумма градиентов от каждого элемента выборки, а как градиент от одного, случайно выбранного элемента.&lt;br /&gt;
&lt;br /&gt;
== Обычный градиентный спуск ==&lt;br /&gt;
Для начала вспомним, как работает обычный градиентный спуск. Пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ $-$ конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;\{(x_1,y_1),\dots,(x_l,y_l)\}.&amp;lt;/tex&amp;gt; Пусть семейство алгоритмов $a(x, {\bf w})$ имеет параметр вектор весов $\bf w$. И пускай мы выбрали какую-нибудь функцию потерь. Для $i$-го объекта выборки для алгоритма с весами ${\bf w}$ обозначим ее &amp;lt;tex&amp;gt; \mathscr{L}_i({\bf w}) &amp;lt;/tex&amp;gt;. Необходимо минимизировать эмпирический риск, т.е. &amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^l \mathscr{L}_i(w) \,\to\, \min\limits_{\bf w}&amp;lt;/tex&amp;gt;. Если функция потерь принадлежит классу $C_1(X)$, то можно применить метод градиентного спуска. Выберем ${\bf w}^{(0)}$ $-$ начальное приближение. Тогда каждый следующий вектор параметров будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} - h\sum\limits_{i=1}^{l}\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $h$ - градиентный шаг, смысл которого заключается в том, насколько сильно менять вектор весов в направлении градиента. Остановка алгоритма будет определяться сходимостью $Q$ или $\bf w$.&lt;br /&gt;
&lt;br /&gt;
== Стохастический градиентный спуск ==&lt;br /&gt;
Проблема предыдущего алгоритма заключается в том, что чтобы определить новое приближение вектора весов необходимо вычислить градиент от каждого элемента выборки, что может сильно замедлять алгоритм. Идея ускорения алгоритма заключается в использовании только одного элемента, либо некоторой подвыборки для подсчета нового приближения весов. То есть теперь новое приближение будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} $-$ h\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $i$ $-$ случайно выбранный индекс. Так как теперь направление изменения $\bf w$ будет определяться за $O(1)$, подсчет $Q$ на каждом шаге будет слишком дорогостоящим. Для того, чтобы ускорить оценку $Q$, будем использовать приближенную рекуррентную формулу. Можно выбрать одну из следующих формул:&lt;br /&gt;
* среднее арифметическое: $\overline{Q}_m = \dfrac{1}{m}\varepsilon_m + \dfrac{1}{m}\varepsilon_{m - 1} + \dfrac{1}{m}\varepsilon_{m - 2} + \dots = \dfrac{1}{m}\varepsilon_m + (1 - \dfrac{1}{m})\overline{Q}_{m-1}$;&lt;br /&gt;
* экспоненциальное скользящее среднее: $\overline{Q}_m = \lambda\varepsilon_m + (1 - \lambda)\varepsilon_{m - 1} + (1 - \lambda)^2\varepsilon_{m - 2} + \dots = \lambda\varepsilon_m + (1-\lambda)\overline{Q}_{m - 1},$ где $\lambda$ $-$ темп забывания предыстории ряда.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
 '''def''' SGD(X, h, $\lambda$)''':''' &amp;lt;font color=green&amp;gt; # где X $-$ выборка, h $-$ градиентный шаг, а $\lambda$ $-$ темп забывания &amp;lt;/font&amp;gt;&lt;br /&gt;
    ${\bf w} =$ initialize_weights() &amp;lt;font color=green&amp;gt; # инициализировать веса &amp;lt;/font&amp;gt;&lt;br /&gt;
    $\overline{Q} = \frac{1}{l} \sum_{i=1}^{l}\mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt;# инициализировать оценку функционала &amp;lt;/font&amp;gt;&lt;br /&gt;
    '''while''' $Q$ not converges '''or''' ${\bf w}$ not converges''':'''&lt;br /&gt;
        $i =$ rand() % $l$ &amp;lt;font color=green&amp;gt; # случайно выбрать элемент, по которому будет считаться градиент &amp;lt;/font&amp;gt;&lt;br /&gt;
        $\varepsilon = \mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt; # вычислить потерю &amp;lt;/font&amp;gt;&lt;br /&gt;
        ${\bf w} = {\bf w} - h \nabla \mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt;# обновить вектор весов в направлении градиента&amp;lt;/font&amp;gt;&lt;br /&gt;
        $\overline{Q} = \lambda\varepsilon + (1 - \lambda)\overline{Q}$ &amp;lt;font color=green&amp;gt;# оценить функционал&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''return''' w&lt;br /&gt;
&lt;br /&gt;
== Эвристики ==&lt;br /&gt;
Существует несколько способов инициализировать веса:&lt;br /&gt;
* ${\bf w} = {\bf 0}$;&lt;br /&gt;
* $w_j = random(-\dfrac{1}{2n}, \dfrac{1}{2n})$. Стоит брать небольшие случайные веса, так как если выбрать их слишком большими, в некоторых случаях (к примеру в случае нейрона с [[Нейронные_сети,_перцептрон|функцией активациии]] равной арктангенсу) большие начальные значения веса могут привести в область с малыми по модулю производными, в связи с чем из такой области будет трудно выбраться;&lt;br /&gt;
* $w_j = \dfrac{\langle y, f_j \rangle}{\langle f_j, f_j \rangle}$, где $f_j = (f_j(x_i))_{i=1}^l$. Оценка оптимальная в случае, если функция потерь квадратична и признаки нескоррелированы, то есть $\langle f_j, f_k \rangle = 0, j \neq k$.&lt;br /&gt;
Так же можно запустить спуск несколько раз с разными начальными приближениями и выбрать лучшее решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При выборе случайного элемента можно использовать следующие эвристики:&lt;br /&gt;
* брать объекты из разных классов;&lt;br /&gt;
* брать объекты, на которых ошибка больше, то есть чем меньше отступ (в метрических классификаторах расстояние от разделяющей поверхности до объекта) i-го объекта $M_i$, тем больше вероятность взять этот объект;&lt;br /&gt;
* брать объекты, на которых уверенность меньше, то есть чем меньше $|M_i|$, тем больше вероятность взять этот объект;&lt;br /&gt;
* не брать объекты, на которых уже высокая уверенность ($M_i &amp;gt; \mu_+$) либо не брать объекты-выбросы ($M_i&amp;lt;\mu_i$);&lt;br /&gt;
&lt;br /&gt;
Выбирать величину градиентного шага можно следующими способами:&lt;br /&gt;
* $h_t = \dfrac{1}{t}$;&lt;br /&gt;
* метод скорейшего градиентного спуска: $\mathscr{L}_i({\bf w} - h\nabla \mathscr{L}_i({\bf w})) \rightarrow \min\limits_h$;&lt;br /&gt;
* при квадратичной функции потерь можно использовать $h = ||x_i||^2$;&lt;br /&gt;
* иногда можно выполнять пробные шаги, а именно увеличивать $h$ для выбивания процесса из локальных минимумов;&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D0%B1%D0%B5%D1%80%D0%B3%D0%B0_%E2%80%94_%D0%9C%D0%B0%D1%80%D0%BA%D0%B2%D0%B0%D1%80%D0%B4%D1%82%D0%B0 метод Левенберга-Марквардта];&lt;br /&gt;
&lt;br /&gt;
== Регуляризация ==&lt;br /&gt;
Основным способом уменьшить переобучение является [[Регулярищация|регуляризация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, т.е. сокращение весов. Будем штрафовать за увеличение нормы вектора весов, для этого перепишем функцию потерь $\tilde{\mathscr{L}}_i({\bf w}) = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2}||w||^2 = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2} \sum\limits_{j=1}^nw_j^2 \rightarrow \min\limits_w$, где $\tau$ $-$ коэффициент регуляризации.&lt;br /&gt;
&lt;br /&gt;
Тогда градиент будет следующим: $\nabla \tilde{\mathscr{L}}_i({\bf w}) = \nabla \mathscr{L}_i({\bf w}) + \tau {\bf w}$, а градиентный шаг будет выглядеть так: ${\bf w} = {\bf w}(1 - h\tau) - h\nabla \mathscr{L}_i({\bf w})$.&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;
* нет универсального набора эвристик, их нужно выбирать для конкретной задачи отдельно;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пример кода scikit-learn == &lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/sgd.html sklearn.linear_model.'''SGDClassifier'''] имеет несколько параметров, например: &lt;br /&gt;
&lt;br /&gt;
'''loss''' $-$ функция потерь. По умолчанию используется &amp;quot;hinge&amp;quot;, дающая алгоритм линейного SVM;&lt;br /&gt;
&lt;br /&gt;
'''penalty''' $-$ метод регуляризации. По умолчанию &amp;quot;l2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
'''alpha''' $-$ $\tau$, коэффициент регуляризации;&lt;br /&gt;
&lt;br /&gt;
'''learning_rate''' $-$ алгоритм изменения градиентного шага;&lt;br /&gt;
&lt;br /&gt;
'''eta0''' $-$ начальный градиентный шаг;&lt;br /&gt;
&lt;br /&gt;
'''shuffle''' перемешивать тренировочную выборку после каждой итерации;&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки:&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' SGDClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества:&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение:&lt;br /&gt;
 clf = SGDClassifier(shuffle = True)&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание:&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
#[http://www.machinelearning.ru/wiki/images/5/53/Voron-ML-Lin-SG.pdf Метод стохастического градиента] $-$ презентация Воронцова&lt;br /&gt;
#[https://www.youtube.com/watch?v=4BKQ3GZR32w&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=4 Метод стохастического градиента] $-$ запись лекции Воронцова&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Logistic_regression Logistic regression] $-$ Wikipedia&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier.decision_function sklearn.linear_model.SGDClassifier] $-$ описание алгоритма на scikit-learn.org&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69687</id>
		<title>Стохастический градиентный спуск</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69687"/>
				<updated>2019-01-30T20:34:58Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Стохастический градиентный спуск''' (англ. ''stochastic gradient descent'') $-$ оптимизационный алгоритм, отличающийся от обычного [https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA градиентного спуска] тем, что градиент оптимизируемой функции считается на каждом шаге не как сумма градиентов от каждого элемента выборки, а как градиент от одного, случайно выбранного элемента.&lt;br /&gt;
&lt;br /&gt;
== Обычный градиентный спуск ==&lt;br /&gt;
Для начала вспомним, как работает обычный градиентный спуск. Пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ $-$ конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;\{(x_1,y_1),\dots,(x_l,y_l)\}.&amp;lt;/tex&amp;gt; Пусть семейство алгоритмов $a(x, {\bf w})$ имеет параметр вектор весов $\bf w$. И пускай мы выбрали какую-нибудь функцию потерь. Для $i$-го объекта выборки для алгоритма с весами ${\bf w}$ обозначим ее &amp;lt;tex&amp;gt; \mathscr{L}_i({\bf w}) &amp;lt;/tex&amp;gt;. Необходимо минимизировать эмпирический риск, т.е. &amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^l \mathscr{L}_i(w) \,\to\, \min\limits_{\bf w}&amp;lt;/tex&amp;gt;. Если функция потерь принадлежит классу $C_1(X)$, то можно применить метод градиентного спуска. Выберем ${\bf w}^{(0)}$ $-$ начальное приближение. Тогда каждый следующий вектор параметров будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} - h\sum\limits_{i=1}^{l}\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $h$ - градиентный шаг, смысл которого заключается в том, насколько сильно менять вектор весов в направлении градиента. Остановка алгоритма будет определяться сходимостью $Q$ или $\bf w$.&lt;br /&gt;
&lt;br /&gt;
== Стохастический градиентный спуск ==&lt;br /&gt;
Проблема предыдущего алгоритма заключается в том, что чтобы определить новое приближение вектора весов необходимо вычислить градиент от каждого элемента выборки, что может сильно замедлять алгоритм. Идея ускорения алгоритма заключается в использовании только одного элемента, либо некоторой подвыборки для подсчета нового приближения весов. То есть теперь новое приближение будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} $-$ h\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $i$ $-$ случайно выбранный индекс. Так как теперь направление изменения $\bf w$ будет определяться за $O(1)$, подсчет $Q$ на каждом шаге будет слишком дорогостоящим. Для того, чтобы ускорить оценку $Q$, будем использовать приближенную рекуррентную формулу. Можно выбрать одну из следующих формул:&lt;br /&gt;
* среднее арифметическое: $\overline{Q}_m = \dfrac{1}{m}\varepsilon_m + \dfrac{1}{m}\varepsilon_{m - 1} + \dfrac{1}{m}\varepsilon_{m - 2} + \dots = \dfrac{1}{m}\varepsilon_m + (1 - \dfrac{1}{m})\overline{Q}_{m-1}$&lt;br /&gt;
* экспоненциальное скользящее среднее: $\overline{Q}_m = \lambda\varepsilon_m + (1 - \lambda)\varepsilon_{m - 1} + (1 - \lambda)^2\varepsilon_{m - 2} + \dots = \lambda\varepsilon_m + (1-\lambda)\overline{Q}_{m - 1},$ где $\lambda$ $-$ темп забывания предыстории ряда.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
 '''def''' SGD(X, h, $\lambda$)''':''' &amp;lt;font color=green&amp;gt; # где X $-$ выборка, h $-$ градиентный шаг, а $\lambda$ $-$ темп забывания &amp;lt;/font&amp;gt;&lt;br /&gt;
    ${\bf w} =$ initialize_weights() &amp;lt;font color=green&amp;gt; # инициализировать веса &amp;lt;/font&amp;gt;&lt;br /&gt;
    $\overline{Q} = \frac{1}{l} \sum_{i=1}^{l}\mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt;# инициализировать оценку функционала &amp;lt;/font&amp;gt;&lt;br /&gt;
    '''while''' $Q$ not converges '''or''' ${\bf w}$ not converges''':'''&lt;br /&gt;
        $i =$ rand() % $l$ &amp;lt;font color=green&amp;gt; # случайно выбрать элемент, по которому будет считаться градиент &amp;lt;/font&amp;gt;&lt;br /&gt;
        $\varepsilon = \mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt; # вычислить потерю &amp;lt;/font&amp;gt;&lt;br /&gt;
        ${\bf w} = {\bf w} - h \nabla \mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt;# обновить вектор весов в направлении градиента&amp;lt;/font&amp;gt;&lt;br /&gt;
        $\overline{Q} = \lambda\varepsilon + (1 - \lambda)\overline{Q}$ &amp;lt;font color=green&amp;gt;# оценить функционал&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''return''' w&lt;br /&gt;
&lt;br /&gt;
== Эвристики ==&lt;br /&gt;
Существует несколько способов инициализировать веса:&lt;br /&gt;
* ${\bf w} = {\bf 0}$;&lt;br /&gt;
* $w_j = random(-\dfrac{1}{2n}, \dfrac{1}{2n})$. Стоит брать небольшие случайные веса, так как если выбрать их слишком большими, в некоторых случаях (к примеру в случае нейрона с [[Нейронные_сети,_перцептрон|функцией активациии]] равной арктангенсу) большие начальные значения веса могут привести в область с малыми по модулю производными, в связи с чем из такой области будет трудно выбраться;&lt;br /&gt;
* $w_j = \dfrac{\langle y, f_j \rangle}{\langle f_j, f_j \rangle}$, где $f_j = (f_j(x_i))_{i=1}^l$. Оценка оптимальная в случае, если функция потерь квадратична и признаки нескоррелированы, то есть $\langle f_j, f_k \rangle = 0, j \neq k$.&lt;br /&gt;
Так же можно запустить спуск несколько раз с разными начальными приближениями и выбрать лучшее решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При выборе случайного элемента можно использовать следующие эвристики:&lt;br /&gt;
* брать объекты из разных классов;&lt;br /&gt;
* брать объекты, на которых ошибка больше, то есть чем меньше отступ (в метрических классификаторах расстояние от разделяющей поверхности до объекта) i-го объекта $M_i$, тем больше вероятность взять этот объект;&lt;br /&gt;
* брать объекты, на которых уверенность меньше, то есть чем меньше $|M_i|$, тем больше вероятность взять этот объект;&lt;br /&gt;
* не брать объекты, на которых уже высокая уверенность ($M_i &amp;gt; \mu_+$) либо не брать объекты-выбросы ($M_i&amp;lt;\mu_i$);&lt;br /&gt;
&lt;br /&gt;
Выбирать величину градиентного шага можно следующими способами:&lt;br /&gt;
* $h_t = \dfrac{1}{t}$;&lt;br /&gt;
* метод скорейшего градиентного спуска: $\mathscr{L}_i({\bf w} - h\nabla \mathscr{L}_i({\bf w})) \rightarrow \min\limits_h$;&lt;br /&gt;
* при квадратичной функции потерь можно использовать $h = ||x_i||^2$;&lt;br /&gt;
* иногда можно выполнять пробные шаги, а именно увеличивать $h$ для выбивания процесса из локальных минимумов;&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D0%B1%D0%B5%D1%80%D0%B3%D0%B0_%E2%80%94_%D0%9C%D0%B0%D1%80%D0%BA%D0%B2%D0%B0%D1%80%D0%B4%D1%82%D0%B0 метод Левенберга-Марквардта];&lt;br /&gt;
&lt;br /&gt;
== Регуляризация ==&lt;br /&gt;
Основным способом уменьшить переобучение является [[Регулярищация|регуляризация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, т.е. сокращение весов. Будем штрафовать за увеличение нормы вектора весов, для этого перепишем функцию потерь $\tilde{\mathscr{L}}_i({\bf w}) = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2}||w||^2 = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2} \sum\limits_{j=1}^nw_j^2 \rightarrow \min\limits_w$, где $\tau$ $-$ коэффициент регуляризации.&lt;br /&gt;
&lt;br /&gt;
Тогда градиент будет следующим: $\nabla \tilde{\mathscr{L}}_i({\bf w}) = \nabla \mathscr{L}_i({\bf w}) + \tau {\bf w}$, а градиентный шаг будет выглядеть так: ${\bf w} = {\bf w}(1 - h\tau) - h\nabla \mathscr{L}_i({\bf w})$.&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;
* нет универсального набора эвристик, их нужно выбирать для конкретной задачи отдельно;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пример кода scikit-learn == &lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/sgd.html sklearn.linear_model.'''SGDClassifier'''] имеет несколько параметров, например: &lt;br /&gt;
&lt;br /&gt;
'''loss''' $-$ функция потерь. По умолчанию используется &amp;quot;hinge&amp;quot;, дающая алгоритм линейного SVM;&lt;br /&gt;
&lt;br /&gt;
'''penalty''' $-$ метод регуляризации. По умолчанию &amp;quot;l2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
'''alpha''' $-$ $\tau$, коэффициент регуляризации;&lt;br /&gt;
&lt;br /&gt;
'''learning_rate''' $-$ алгоритм изменения градиентного шага;&lt;br /&gt;
&lt;br /&gt;
'''eta0''' $-$ начальный градиентный шаг;&lt;br /&gt;
&lt;br /&gt;
'''shuffle''' перемешивать тренировочную выборку после каждой итерации;&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки:&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' SGDClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества:&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение:&lt;br /&gt;
 clf = SGDClassifier(shuffle = True)&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание:&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
#[http://www.machinelearning.ru/wiki/images/5/53/Voron-ML-Lin-SG.pdf Метод стохастического градиента] $-$ презентация Воронцова&lt;br /&gt;
#[https://www.youtube.com/watch?v=4BKQ3GZR32w&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=4 Метод стохастического градиента] $-$ запись лекции Воронцова&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Logistic_regression Logistic regression] $-$ Wikipedia&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier.decision_function sklearn.linear_model.SGDClassifier] $-$ описание алгоритма на scikit-learn.org&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&amp;diff=69686</id>
		<title>Нейронные сети, перцептрон</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&amp;diff=69686"/>
				<updated>2019-01-30T20:33:51Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.&lt;br /&gt;
&lt;br /&gt;
[[File:Нейронная_сеть.png|700px|thumb|[https://neuralnet.info/chapter/%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5/#%D0%92-%D1%86%D0%B5%D0%BB%D0%BE%D0%BC-%D0%BE%D0%B1-%D0%98%D0%9D%D0%A1 Упрощение биологической нейронной сети]]]&lt;br /&gt;
&lt;br /&gt;
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]&amp;lt;/ref&amp;gt;. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]&amp;lt;/ref&amp;gt;, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.&lt;br /&gt;
&lt;br /&gt;
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.&lt;br /&gt;
&lt;br /&gt;
==Структура нейронной сети==&lt;br /&gt;
&lt;br /&gt;
[[File:Искусственный_нейрон_схема.png|700px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD Схема искусственного нейрона]]]&lt;br /&gt;
&lt;br /&gt;
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.&lt;br /&gt;
&lt;br /&gt;
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция &amp;lt;tex&amp;gt;\mathbb{R}^n \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt;, которая преобразует несколько входных параметров в один выходной.&lt;br /&gt;
&lt;br /&gt;
Как видно на рисунке справа, у нейрона есть &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; входов &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, у каждого из которого есть вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы &amp;lt;tex&amp;gt;x_i \cdot w_i&amp;lt;/tex&amp;gt; направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют &amp;lt;tex&amp;gt;net&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Просто так передавать взвешенную сумму &amp;lt;tex&amp;gt;net&amp;lt;/tex&amp;gt; на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается &amp;lt;tex&amp;gt;\phi(net)&amp;lt;/tex&amp;gt;. Таким образом, выходов искусственного нейрона является &amp;lt;tex&amp;gt;\phi(net)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:&lt;br /&gt;
* Функция единичного скачка. Если &amp;lt;tex&amp;gt;net &amp;gt; threshold&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\phi(net) = 1&amp;lt;/tex&amp;gt;, а иначе &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* Сигмоидальная функция. &amp;lt;tex&amp;gt;\phi(net) = \frac{1}{1 + exp(-a \cdot net)}&amp;lt;/tex&amp;gt;, где параметр &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; характеризует степень крутизны функции;&lt;br /&gt;
* Гиперболический тангенс. &amp;lt;tex&amp;gt;\phi(net) = tanh(\frac{net}{a})&amp;lt;/tex&amp;gt;, где параметр &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; также определяет степень крутизны графика функции;&lt;br /&gt;
* Rectified linear units (ReLU). &amp;lt;tex&amp;gt;ReLU(x) = \begin{cases}&lt;br /&gt;
      x &amp;amp; x \geq 0 \\&lt;br /&gt;
      0 &amp;amp; x &amp;lt; 0&lt;br /&gt;
   \end{cases} = \max(x, 0)&amp;lt;/tex&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;
[[File:Single-layer-neural-net-scheme.png|500px|thumb|[https://studfiles.net/preview/3170620/page:3/ Схема однослойной нейронной сети]]]&lt;br /&gt;
&lt;br /&gt;
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.&lt;br /&gt;
&lt;br /&gt;
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы &amp;lt;tex&amp;gt;x_1, x_2, \ldots x_n&amp;lt;/tex&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Многослойные нейронные сети===&lt;br /&gt;
&lt;br /&gt;
[[File:Multi-layer-neural-net-scheme.png|500px|thumb|[https://wiki.loginom.ru/articles/multilayer-neural-net.html Схема многослойной нейронной сети]]]&lt;br /&gt;
&lt;br /&gt;
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.&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;
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.&lt;br /&gt;
&lt;br /&gt;
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.&lt;br /&gt;
&lt;br /&gt;
Однако сигнал в нейронных сетях может идти и в обратную сторону.&lt;br /&gt;
&lt;br /&gt;
===Сети с обратными связями===&lt;br /&gt;
&lt;br /&gt;
[[File:Сети_с_обратными_связями.png|400px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%A1%D0%B5%D1%82%D0%B8-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8-%D1%81%D0%B2%D1%8F%D0%B7%D1%8F%D0%BC%D0%B8 Схема сети с обратными связями]]]&lt;br /&gt;
&lt;br /&gt;
'''[[Рекуррентные нейронные сети|Сети с обратными связями]]''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.&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;
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ», а как только мы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности ''обобщать'' какие-то признаки и решать задачу на различных входных данных. Именно с этой целью и создаются ''обучающие выборки''.&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;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и [[Обучение без учителя|обучение без учителя]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.&lt;br /&gt;
&lt;br /&gt;
==Перцептрон==&lt;br /&gt;
&lt;br /&gt;
[[File:Перцептрон.png|350px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9F%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема перцептрона]]]&lt;br /&gt;
&lt;br /&gt;
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.&lt;br /&gt;
&lt;br /&gt;
===История===&lt;br /&gt;
&lt;br /&gt;
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.&lt;br /&gt;
&lt;br /&gt;
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.&lt;br /&gt;
&lt;br /&gt;
===Описание===&lt;br /&gt;
&lt;br /&gt;
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.&lt;br /&gt;
&lt;br /&gt;
Принцип работы перцептрона следующий:&lt;br /&gt;
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'');&lt;br /&gt;
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1'';&lt;br /&gt;
# Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами;&lt;br /&gt;
#* Одному A-элементу может соответствовать несколько S-элементов;&lt;br /&gt;
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог ​&amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;​, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';&lt;br /&gt;
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал;&lt;br /&gt;
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей);&lt;br /&gt;
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем&lt;br /&gt;
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';&lt;br /&gt;
#* eсли порог не превышен, то выход перцептрона равен ''-1''.&lt;br /&gt;
&lt;br /&gt;
Для элементов перцептрона используют следующие названия:&lt;br /&gt;
* S-элементы называют сенсорами;&lt;br /&gt;
* A-элементы называют ассоциативными;&lt;br /&gt;
* R-элементы называют реагирующими.&lt;br /&gt;
&lt;br /&gt;
===Классификация перцептронов===&lt;br /&gt;
&lt;br /&gt;
[[File:Однслойный_перцептрон.png|300px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема однослойного перцептрона]]]&lt;br /&gt;
&lt;br /&gt;
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}}  перцептрон, у которого имеется только по одному слою S, A и R элементов.&lt;br /&gt;
&lt;br /&gt;
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.&lt;br /&gt;
&lt;br /&gt;
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.&lt;br /&gt;
&lt;br /&gt;
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.&lt;br /&gt;
&lt;br /&gt;
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.&lt;br /&gt;
&lt;br /&gt;
'''Многослойный перцептрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:&lt;br /&gt;
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;&lt;br /&gt;
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.&lt;br /&gt;
&lt;br /&gt;
===Обучение перцептрона===&lt;br /&gt;
&lt;br /&gt;
Задача обучения перцептрона {{---}} подобрать такие &amp;lt;tex&amp;gt;w_0, w_1, w_2, \ldots, w_n&amp;lt;/tex&amp;gt;, чтобы &amp;lt;tex&amp;gt;sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))&amp;lt;/tex&amp;gt; как можно чаще совпадал с &amp;lt;tex&amp;gt;y(x)&amp;lt;/tex&amp;gt; {{---}} значением в обучающей выборке (здесь &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член &amp;lt;tex&amp;gt;w_0&amp;lt;/tex&amp;gt;, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что &amp;lt;tex&amp;gt;x = (1, x_1, x_2, \ldots, x_n)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n&amp;lt;/tex&amp;gt; можно заменить на &amp;lt;tex&amp;gt;w^T \cdot x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': &amp;lt;tex&amp;gt;E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; {{---}} множество примеров, которые перцептрон с весами &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; классифицирует неправильно.&lt;br /&gt;
&lt;br /&gt;
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на &amp;lt;tex&amp;gt;y(x)&amp;lt;/tex&amp;gt; здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.&lt;br /&gt;
&lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;E_P(w)&amp;lt;/tex&amp;gt; можно оптимизировать градиентным спуском. На очередном шаге получаем: &amp;lt;tex&amp;gt;w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм такой {{---}} мы последовательно проходим примеры &amp;lt;tex&amp;gt;x_1, x_2, \ldots&amp;lt;/tex&amp;gt; из обучающего множества, и для каждого &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* если он классифицирован правильно, не меняем ничего;&lt;br /&gt;
* а если неправильно, прибавляем &amp;lt;tex&amp;gt;\eta \triangledown_w E_P(w)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ошибка на примере &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt; при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.&lt;br /&gt;
&lt;br /&gt;
===Применение===&lt;br /&gt;
&lt;br /&gt;
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости;&lt;br /&gt;
* Прогнозирование и распознавание образов;&lt;br /&gt;
* Управление агентами&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Пример использования с помощью scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org Библиотека scikit-learn для Python]&amp;lt;/ref&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Будем классифицировать с помощью перцептрона датасет MNIST&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
  # Load required libraries&lt;br /&gt;
  from sklearn import datasets&lt;br /&gt;
  from sklearn.preprocessing import StandardScaler&lt;br /&gt;
  from sklearn.linear_model import Perceptron      #Single-layer perceptron&lt;br /&gt;
  from sklearn.neural_network import MLPClassifier #Multilayer perceptron &lt;br /&gt;
  from sklearn.model_selection import train_test_split&lt;br /&gt;
  from sklearn.metrics import accuracy_score&lt;br /&gt;
  import numpy as np&lt;br /&gt;
&lt;br /&gt;
  # Load the mnist dataset&lt;br /&gt;
  mnist = datasets.load_digits()&lt;br /&gt;
&lt;br /&gt;
  # Create our X and y data&lt;br /&gt;
  n_samples = len(mnist.images)&lt;br /&gt;
  X = mnist.images.reshape((n_samples, -1))&lt;br /&gt;
  y = mnist.target&lt;br /&gt;
&lt;br /&gt;
  # Split the data into 70% training data and 30% test data&lt;br /&gt;
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)&lt;br /&gt;
&lt;br /&gt;
  # Train the scaler, which standarizes all the features to have mean=0 and unit variance&lt;br /&gt;
  sc = StandardScaler()&lt;br /&gt;
  sc.fit(X_train)&lt;br /&gt;
&lt;br /&gt;
  # Apply the scaler to the X training data&lt;br /&gt;
  X_train_std = sc.transform(X_train)&lt;br /&gt;
&lt;br /&gt;
  # Apply the SAME scaler to the X test data&lt;br /&gt;
  X_test_std = sc.transform(X_test)&lt;br /&gt;
&lt;br /&gt;
  # Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1&lt;br /&gt;
  ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)&lt;br /&gt;
  # Create a multilayer perceptron object&lt;br /&gt;
  mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(256, 512, 128), random_state=1)&lt;br /&gt;
&lt;br /&gt;
  # Train the perceptrons&lt;br /&gt;
  ppn.fit(X_train_std, y_train)&lt;br /&gt;
  mppn.fit(X_train_std, y_train)&lt;br /&gt;
&lt;br /&gt;
  # Apply the trained perceptrons on the X data to make predicts for the y test data&lt;br /&gt;
  y_pred = ppn.predict(X_test_std)&lt;br /&gt;
  multi_y_pred = mppn.predict(X_test_std)&lt;br /&gt;
&lt;br /&gt;
  # View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)&lt;br /&gt;
  print('Single-layer perceptron accuracy: %.4f' % accuracy_score(y_test, y_pred))&lt;br /&gt;
  print('Multilayer perceptron accuracy: %.4f' % accuracy_score(y_test, multi_y_pred))&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
  Single-layer perceptron accuracy: 0.9574&lt;br /&gt;
  Multilayer perceptron accuracy: 0.9759&lt;br /&gt;
&lt;br /&gt;
===Пример использования с помощью tensorflow&amp;lt;ref&amp;gt;[https://www.tensorflow.org/ Библиотека tensorflow для Python]&amp;lt;/ref&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Будем классифицировать цифры из того же датасета MNIST.&lt;br /&gt;
&lt;br /&gt;
  # Load required libraries&lt;br /&gt;
  import tensorflow as tf&lt;br /&gt;
  from tensorflow.examples.tutorials.mnist import input_data&lt;br /&gt;
&lt;br /&gt;
  #Load MNIST dataset&lt;br /&gt;
  mnist = input_data.read_data_sets(&amp;quot;MNIST_data/&amp;quot;, one_hot=True)&lt;br /&gt;
&lt;br /&gt;
  #placeholder for test data&lt;br /&gt;
  x = tf.placeholder(tf.float32, [None, 784])&lt;br /&gt;
  #placeholder for weights and bias&lt;br /&gt;
  W = tf.Variable(tf.zeros([784, 10]))&lt;br /&gt;
  b = tf.Variable(tf.zeros([10]))&lt;br /&gt;
  #tensorflow model&lt;br /&gt;
  y = tf.nn.softmax(tf.matmul(x, W) + b)&lt;br /&gt;
  &lt;br /&gt;
  #loss function&lt;br /&gt;
  y_ = tf.placeholder(tf.float32, [None, 10])&lt;br /&gt;
  cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))&lt;br /&gt;
&lt;br /&gt;
  #gradient descent step&lt;br /&gt;
  train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)&lt;br /&gt;
&lt;br /&gt;
  init = tf.initialize_all_variables()&lt;br /&gt;
  sess = tf.Session()&lt;br /&gt;
  sess.run(init)&lt;br /&gt;
  for i in range(1000):&lt;br /&gt;
    batch_xs, batch_ys = mnist.train.next_batch(100)&lt;br /&gt;
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})&lt;br /&gt;
  correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))&lt;br /&gt;
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))&lt;br /&gt;
  print(&amp;quot;Accuracy: %s&amp;quot; % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))&lt;br /&gt;
&lt;br /&gt;
[[File:Tensorflow-mnist-failures.png|400px|thumb|Правильные метки {{---}} 5, 4, 9, 7. Результат классификации {{---}} 6, 6, 4, 4.]]&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
  Accuracy: 0.9164&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;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.&lt;br /&gt;
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Нейронные сети]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</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=69685</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=69685"/>
				<updated>2019-01-30T20:32:29Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &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;
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;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;br /&gt;
[[Категория: Сверточные нейронные сети]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%80%D0%B5%D0%BD%D1%82%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=69684</id>
		<title>Рекуррентные нейронные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%80%D0%B5%D0%BD%D1%82%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=69684"/>
				<updated>2019-01-30T20:31:02Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Рекуррентная нейронная сеть''' (англ. ''recurrent neural network'', ''RNN'') {{---}} вид [[:Нейронные_сети,_перцептрон|нейронных сетей]], где связи между элементами образуют направленную последовательность.&lt;br /&gt;
&lt;br /&gt;
== Описание ==&lt;br /&gt;
[[File:RNN.png|450px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ RNN и ее развернутое представление]]]&lt;br /&gt;
[[File:RNN_layer.png|450px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Схема слоя рекуррентной сети]]]&lt;br /&gt;
Рекуррентные нейронные сети {{---}} сети с циклами, которые хорошо подходят для обработки последовательностей.&lt;br /&gt;
[[File:RNN_BP.jpg|450px|thumb|RNN с задержкой на скрытом слое]]&lt;br /&gt;
[[File:RNN_BPTT.jpg|450px|thumb|Развертка RNN]]&lt;br /&gt;
Обучение RNN аналогично обучению обычной нейронной сети. Мы также используем [[:Обратное_распространение_ошибки|алгоритм обратного распространения ошибки (backpropagation)]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, но с небольшим изменением. Поскольку одни и те же параметры используются на всех временных этапах в сети, градиент на каждом выходе зависит не только от расчетов текущего шага, но и от предыдущих временных шагов. Например, чтобы вычислить градиент для четвертого элемента последовательности, нам нужно было бы «распространить ошибку» на 3 шага и суммировать градиенты. Этот алгоритм называется «алгоритмом обратного распространения ошибки сквозь время» (англ. Backpropagation Through Time, BPTT).&amp;lt;ref name=BPTT_1&amp;gt;[http://andrew.gibiansky.com/blog/machine-learning/recurrent-neural-networks/ Backpropagation Through Time]&amp;lt;/ref&amp;gt;&amp;lt;ref name=BPTT_2&amp;gt;[http://www.wildml.com/2015/10/recurrent-neural-networks-tutorial-part-3-backpropagation-through-time-and-vanishing-gradients/ Backpropagation Through Time]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм обратного распространения ошибки сквозь время:&lt;br /&gt;
&lt;br /&gt;
[[File:RNN_BPTT_GRAD.png|400px|frameless]]&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;
** Прогнозирование следующего кадра на основе предыдущих;&lt;br /&gt;
** Распознавание эмоций;&lt;br /&gt;
* Обработка изображений:&lt;br /&gt;
** Прогнозирование следующего пикселя на основе окружения;&lt;br /&gt;
** Генерация описания изображений.&lt;br /&gt;
&lt;br /&gt;
== Виды RNN ==&lt;br /&gt;
=== Один к одному ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[File:RNN_OTO.jpg|100px|left]]&lt;br /&gt;
|Архитектура по сути является обычной нейронной сетью.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Один ко многим ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[File:RNN_OTM.jpg|100px|left]]&lt;br /&gt;
|Один вход ко многим выходам может применяться, например, для генерации аудиозаписи. На вход подаем жанр музыки, который хотим получить, на выходе получаем последовательность аудиозаписи.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Многие к одному ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[File:RNN_MTO.jpg|100px|left]]&lt;br /&gt;
|Много входов и один выход может применяться, если мы хотим оценить тональность рецензии. На вход подаем слова рецензии, на выходе получаем оценку ее тональности: позитивная рецензия или негативная.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Многие ко многим ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[File:RNN_MTM1.jpg|100px|left]]&lt;br /&gt;
|Данную архитектуру можно использовать для перевода текста с одного языка на другой.&lt;br /&gt;
|-&lt;br /&gt;
|[[File:RNN_MTM2.jpg|100px|left]]&lt;br /&gt;
|Такой вариант подойдет для определения для классификации каждого слова в предложении в зависимости от контекста.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Архитектуры ==&lt;br /&gt;
=== Полностью рекуррентная сеть ===&lt;br /&gt;
Это базовая архитектура, разработанная в 1980-х. Сеть строится из узлов, каждый из которых соединён со всеми другими узлами. У каждого нейрона порог активации меняется со временем и является вещественным числом. Каждое соединение имеет переменный вещественный вес. Узлы разделяются на входные, выходные и скрытые.&lt;br /&gt;
&lt;br /&gt;
=== Рекурсивная сеть ===&lt;br /&gt;
[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; представляют собой более общий случай рекуррентных сетей, когда сигнал в сети проходит через структуру в виде дерева (обычно бинарные деревья). Те же самые матрицы весов используются рекурсивно по всему графу в соответствии с его топологией.&lt;br /&gt;
&lt;br /&gt;
=== Нейронная сеть Хопфилда ===&lt;br /&gt;
Тип рекуррентной сети, когда все соединения симметричны. Изобретена Джоном Хопфилдом в 1982 году и гарантируется, что динамика такой сети сходится к одному из положений равновесия.&lt;br /&gt;
&lt;br /&gt;
=== Двунаправленная ассоциативная память (BAM) ===&lt;br /&gt;
Вариацией сети Хопфилда является двунаправленная ассоциативная память (BAM). BAM имеет два слоя, каждый из которых может выступать в качестве входного, находить (вспоминать) ассоциацию и генерировать результат для другого слоя.&lt;br /&gt;
[[File:Elman_RNN.jpg|450px|thumb|Сеть Элмана]]&lt;br /&gt;
&lt;br /&gt;
=== Сеть Элмана ===&lt;br /&gt;
Нейронная сеть Элмана состоит из трёх слоев: x, y, z (см рис. Сеть Элмана). Дополнительно к сети добавлен набор «контекстных блоков»: u (см рис. Сеть Элмана). Средний (скрытый) слой соединён с контекстными блоками с фиксированным весом, равным единице. С каждым шагом времени на вход поступает информация, которая проходит прямой ход к выходному слою в соответствии с правилами обучения. Фиксированные обратные связи сохраняют предыдущие значения скрытого слоя в контекстных блоках (до того как скрытый слой поменяет значение в процессе обучения). Таким способом сеть сохраняет своё состояние, что может использоваться в предсказании последовательностей, выходя за пределы мощности многослойного перцептрона.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h_t = \sigma_h(W_h x_t + U_h h_{t-1} + b_h)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;y_t = \sigma_y(W_y h_t + b_y)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Обозначения переменных и функций:&lt;br /&gt;
* &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt;: вектор входного слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;h_t&amp;lt;/math&amp;gt;: вектор скрытого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;y_t&amp;lt;/math&amp;gt;: вектор выходного слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;W, U, b&amp;lt;/math&amp;gt;: матрица и вектор параметров;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_h, \sigma_y&amp;lt;/math&amp;gt;: функция активации.&lt;br /&gt;
&lt;br /&gt;
=== Сеть Джордана ===&lt;br /&gt;
Нейронная сеть Джордана подобна сети Элмана, но контекстные блоки связаны не со скрытым слоем, а с выходным слоем. Контекстные блоки таким образом сохраняют своё состояние. Они обладают рекуррентной связью с собой.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h_t = \sigma_h(W_h x_t + U_h y_{t-1} + b_h)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;y_t = \sigma_y(W_y h_t + b_y)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
=== Эхо-сети ===&lt;br /&gt;
Эхо-сеть (англ. Echo State Network, ESN) характеризуется одним скрытым слоем (который называется резервуаром) со случайными редкими связями между нейронами. При этом связи внутри резервуара фиксированы, но связи с выходным слоем подлежат обучению. Состояние резервуара (state) вычисляется через предыдущие состояния резервуара, а также предыдущие состояния входного и выходного сигналов. Так как эхо-сети обладают только одним скрытым слоем, они обладают достаточно низкой вычислительной сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Нейронный компрессор истории ===&lt;br /&gt;
Нейронный компрессор исторических данных {{---}} это блок, позволяющий в сжатом виде хранить существенные исторические особенности процесса, который является своего рода стеком рекуррентной нейронной сети, формируемым в процессе самообучения.&lt;br /&gt;
[[File:LSTM.png|450px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Схема слоев рекуррентной сети долго-краткосрочной памяти]]]&lt;br /&gt;
&lt;br /&gt;
=== Сети долго-краткосрочной памяти ===&lt;br /&gt;
[[:Долгая_краткосрочная_память|Сеть долго-краткосрочной памяти]] (англ. Long short-term memory, LSTM) является самой популярной архитектурой рекуррентной нейронной сети на текущий момент, такая архитектура способна запоминать данные на долгое время.&amp;lt;ref name=LSTM&amp;gt;[https://www.bioinf.jku.at/publications/older/2604.pdf Sepp Hochreiter, Jurgen Schmidhuber. Long short-term memory (1997). Neural Computation.]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Управляемые рекуррентные блоки ===&lt;br /&gt;
Управляемые рекуррентные блоки (англ. Gated Recurrent Units, GRU) {{---}} обладает меньшим количеством параметров, чем у LSTM, и в ней отсутствует выходное управление. При этом производительность в моделях речевого сигнала или полифонической музыки оказалась сопоставимой с LSTM.&lt;br /&gt;
&lt;br /&gt;
== Пример кода ==&lt;br /&gt;
Пример кода на Python с использованием библиотеки Keras.&amp;lt;ref name=KerasRNN&amp;gt;[https://keras.io/layers/recurrent/ Keras RNN]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Импорты&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''from''' keras.preprocessing '''import''' sequence&lt;br /&gt;
  '''from''' keras.models '''import''' Sequential&lt;br /&gt;
  '''from''' keras.layers '''import''' Dense, Activation, Embedding&lt;br /&gt;
  '''from''' keras.layers '''import''' LSTM&lt;br /&gt;
  '''from''' keras.datasets '''import''' imdb&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Устанавливаем seed для обеспечения повторяемости результатов&amp;lt;/font&amp;gt;&lt;br /&gt;
  np.random.seed(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Указываем количество слов из частотного словаря, которое будет использоваться (отсортированы по частоте использования)&amp;lt;/font&amp;gt;&lt;br /&gt;
  max_features = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5000&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Загружаем данные (датасет IMDB содержит 25000 рецензий на фильмы с правильным ответом для обучения и 25000 рецензий на фильмы с правильным ответом для тестирования)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words = max_features)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Устанавливаем максимальную длину рецензий в словах, чтобы они все были одной длины&amp;lt;/font&amp;gt;&lt;br /&gt;
  maxlen = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;80&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Заполняем короткие рецензии пробелами, а длинные обрезаем&amp;lt;/font&amp;gt;&lt;br /&gt;
  X_train = sequence.pad_sequences(X_train, maxlen = maxlen)&lt;br /&gt;
  X_test = sequence.pad_sequences(X_test, maxlen = maxlen)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Создаем модель последовательной сети&amp;lt;/font&amp;gt;&lt;br /&gt;
  model = Sequential()&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Добавляем слой для векторного представления слов (5000 слов, каждое представлено вектором из 32 чисел, отключаем входной сигнал с вероятностью 20% для предотвращения переобучения)&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.add(Embedding(max_features, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;, dropout = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Добавляем слой долго-краткосрочной памяти (100 элементов для долговременного хранения информации, отключаем входной сигнал с вероятностью 20%, отключаем рекуррентный сигнал с вероятностью 20%)&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.add(LSTM(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;100&amp;lt;/font&amp;gt;, dropout_W = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;, dropout_U = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Добавляем полносвязный слой из 1 элемента для классификации, в качестве функции активации будем использовать сигмоидальную функцию&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.add(Dense(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, activation = &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'sigmoid'&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Компилируем модель нейронной сети&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.compile(loss = &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'binary_crossentropy'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                optimizer = &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'adam'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                metrics = [&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'accuracy'&amp;lt;/font&amp;gt;])&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Обучаем нейронную сеть (данные для обучения, ответы к данным для обучения, количество рецензий после анализа которого будут изменены веса, число эпох обучения, тестовые данные, показывать progress bar или нет)&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.fit(X_train, y_train, &lt;br /&gt;
            batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;,&lt;br /&gt;
            nb_epoch = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7&amp;lt;/font&amp;gt;,&lt;br /&gt;
            validation_data = (X_test, y_test),&lt;br /&gt;
            verbose = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Проверяем качество обучения на тестовых данных (если есть данные, которые не участвовали в обучении, лучше использовать их, но в нашем случае таковых нет)&amp;lt;/font&amp;gt;&lt;br /&gt;
  scores = model.evaluate(X_test, y_test, batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Точность на тестовых данных: %.2f%%'&amp;lt;/font&amp;gt; % (scores[1] * &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;100&amp;lt;/font&amp;gt;))&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Сверточные_нейронные_сети|Сверточные нейронные сети]]&lt;br /&gt;
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]&lt;br /&gt;
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;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;br /&gt;
[[Категория: Рекуррентные нейронные сети]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Generative_Adversarial_Nets_(GAN)&amp;diff=69683</id>
		<title>Generative Adversarial Nets (GAN)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Generative_Adversarial_Nets_(GAN)&amp;diff=69683"/>
				<updated>2019-01-30T20:29:22Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Арх_ган.png|450px|thumb|Оригинальная архитектура GAN]]&lt;br /&gt;
&lt;br /&gt;
'''Порождающие состязательные сети''' (англ. ''Generative Adversarial Nets, GAN'') {{---}} алгоритм машинного обучения, входящий в семейство [[:Порождающие модели|порождающих моделей]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и построенный на комбинации из двух нейронных сетей, одна из которых генерирует образцы, другая пытается отличить настоящие образцы от сгенерированных. Впервые такие сети были представлены Иэном Гудфеллоу в 2014 году. &lt;br /&gt;
&lt;br /&gt;
==Постановка задачи и метод==&lt;br /&gt;
Имеется множество образцов &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; из распределения &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt;, заданного на &amp;lt;tex&amp;gt; \mathbb R^n &amp;lt;/tex&amp;gt;, а также некоторое пространство латентных факторов &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; из распределения &amp;lt;tex&amp;gt;p_{z}&amp;lt;/tex&amp;gt;, например, случайные вектора из равномерного распределения &amp;lt;tex&amp;gt; \mathbb U^t(0,1) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две нейронные сети: первая $-$ ''генератор'' &amp;lt;tex&amp;gt; G: Z \rightarrow \mathbb R^n &amp;lt;/tex&amp;gt; с параметрами &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;, цель которой сгенерировать похожий образец из &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt;, и вторая $-$ ''дискриминатор'' &amp;lt;tex&amp;gt;D: \mathbb R^n \rightarrow \mathbb [0,1] &amp;lt;/tex&amp;gt; с параметрами &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;, цель которой выдавать максимальную оценку на образцах из &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и минимальную на сгенерированных образцах из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Распределение, порождаемое генератором будем обозначать &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt;. Так же заметим, что в текущем изложении не принципиальны архитектуры нейронных сетей, поэтому можно считать, что параметры &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; являются просто параметрами многослойных персептронов.&lt;br /&gt;
&lt;br /&gt;
В качестве примера можно рассматривать генерацию реалистичных фотографий: в этом случае, входом для генератора может быть случайный многомерный шум, а выходом генератора (и входом для дискриминатора) RGB-изображение; выходом же для дискриминатора будет вероятность, что фотография настоящая, т.е число от 0 до 1. &lt;br /&gt;
&lt;br /&gt;
Наша задача выучить распределение &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; так, чтобы оно как можно лучше описывало &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt;. Зададим функцию ошибки для получившейся модели. Со стороны дискриминатора мы хотим распознавать образцы из &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; как правильные, т.е в сторону единицы, и образцы из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; как неправильные, т.е в сторону нуля, таким образом нужно максимизировать следующую величину:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;\mathop{E}\limits_{x \sim p_{data}}[logD(x)] + \mathop{E}\limits_{x \sim p_{gen}}[log(1-D(x))]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathop{E}\limits_{x \sim p_{gen}}[log(1-D(x))] = \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z))]&amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Со стороны же генератора требуется научиться &amp;quot;обманывать&amp;quot; дискриминатор, т.е минимизировать по &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; второе слагаемое предыдущего выражения. Другими словами, &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; играют в так называемую ''минимаксную игру'', решая следующую задачу оптимизации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; \min\limits_{G}\max\limits_{D} \mathop{E}\limits_{x \sim p_{data}}[logD(x)]  + \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z))]  &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
Теоретическое обоснование того, что такой метод заставляет &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; сходится к &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt; описано в исходной статье. &amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1406.2661.pdf  Ian J. Goodfellow {{---}} Generative Adversarial Nets]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Оригинальный алгоритм обучения GAN==&lt;br /&gt;
[[File:Обучение_ган.png|450px|thumb|right|Визуализация генерирования фотографии с помощью DCGAN по одному и тому же шуму в зависимости от итерации обучения. Источник: https://arxiv.org/pdf/1701.07875.pdf]]&lt;br /&gt;
&lt;br /&gt;
В процессе обучения требуется делать два шага оптимизации поочередно: сначала обновлять веса генератора &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; при фиксированном &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;, а затем веса дискриминатора &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; при фиксированном &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;. На практике дискриминатор обновляется &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; раз вместо одного; &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; является гиперпараметром.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// num_iteration {{---}} число итераций обучения &amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' GAN:&lt;br /&gt;
   '''for''' i = 1..num_iteration '''do'''&lt;br /&gt;
     '''for''' j = 1..k '''do'''&lt;br /&gt;
       $z$ = getBatchFromNoisePrior($p_z$)  &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ &amp;lt;/font&amp;gt;&lt;br /&gt;
       $x$ = getBatchFromDataGeneratingDistibution($p_{data}$)  &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{x_1, . . . , x_m\}$ из распределения $p_{data}$ &amp;lt;/font&amp;gt;       &lt;br /&gt;
       &amp;lt;tex&amp;gt;d_w \leftarrow \mathop{\nabla}_{\gamma} { \frac{1}{m} \sum_{t = 1}^m \limits} [logD(x_t)]  + [log(1-D(G(z_t))] &amp;lt;/tex&amp;gt; &amp;lt;font color=green&amp;gt;//Обновляем дискриминатор в сторону возрастания его градиента &amp;lt;/font&amp;gt;&lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
     $z$ = getBatchFromNoisePrior($p_z$)  &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ &amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g_w \leftarrow \mathop{\nabla}_{\theta}  { \frac{1}{m} \sum_{t = 1}^m \limits} [log(1-D(G(z_t))] &amp;lt;/tex&amp;gt; &amp;lt;font color=green&amp;gt;//Обновляем генератор в сторону убывания его градиента &amp;lt;/font&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
Обновления на основе градиента могут быть сделаны любым стандартным способом, например, в оригинальной статье использовался [[:Cтохастический градиентный спуск|стохастический градиентный спуск]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; с импульсом.&lt;br /&gt;
&lt;br /&gt;
==Улучшение обучения GAN==&lt;br /&gt;
&lt;br /&gt;
Большинство GAN'ов подвержено следующим проблемам:&lt;br /&gt;
* Несходимость (non-convergence): параметры модели дестабилизируются и не сходятся;&lt;br /&gt;
* Схлопывание мод распределения (mode collapse): генератор коллапсирует, т.е выдает ограниченное количество разных образцов;&lt;br /&gt;
* Исчезающий градиент (diminished gradient): дискриминатор становится слишком &amp;quot;сильным&amp;quot;, а градиент генератора исчезает и обучение не происходит;&lt;br /&gt;
* Высокая чувствительность к гиперпараметрам.&lt;br /&gt;
&lt;br /&gt;
Универсального подхода к их решению нет, но существуют практические советы&amp;lt;ref&amp;gt; [https://github.com/soumith/ganhacks  How to Train a GAN? Tips and tricks to make GANs work]&amp;lt;/ref&amp;gt;, которые могут помочь. Основными из них являются:&lt;br /&gt;
# Нормализация данных. Все признаки в диапазоне $[-1; 1]$;&lt;br /&gt;
# Замена функции ошибки для $G$ с $\min log (1-D)$ на $\max log D$, потому что исходный вариант имеет маленький градиент на раннем этапе обучения и большой градиент при сходимости, а предложенный наоборот;&lt;br /&gt;
# Сэмплирование из многомерного нормального распределения вместо равномерного;  &lt;br /&gt;
# Использовать нормализационные слои (например, batch normalization или layer normalization) в $G$ и $D$;&lt;br /&gt;
# Использовать метки для данных, если они имеются, т.е обучать дискриминатор еще и классифицировать образцы.&lt;br /&gt;
&lt;br /&gt;
==Применение==&lt;br /&gt;
&lt;br /&gt;
[[File:прогресс_ганов.jpg|450px|thumb|right|Прогресс в генерации фотографий с помощью GAN. Источник: https://twitter.com/goodfellow_ian]]&lt;br /&gt;
&lt;br /&gt;
Чаще всего GAN'ы используются для генерации реалистичных фотографий. Серьезные улучшения в этом направлении были сделаны следующими работами:&lt;br /&gt;
&lt;br /&gt;
* Auxiliary GAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1610.09585.pdf Augustus Odena {{---}} Conditional Image Synthesis with Auxiliary Classifier GANs]&amp;lt;/ref&amp;gt;: вариант GAN-архитектуры, использующий метки данных;&lt;br /&gt;
* SN-GAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1802.05957.pdf Takeru Miyato {{---}} SPECTRAL NORMALIZATION FOR GENERATIVE ADVERSARIAL NETWORKS]&amp;lt;/ref&amp;gt;: GAN с новым подходом решения проблемы нестабильного обучения через спектральную нормализацию;&lt;br /&gt;
* SAGAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1805.08318.pdf Han Zhang {{---}} Self-Attention Generative Adversarial Networks]&amp;lt;/ref&amp;gt;: GAN, основанный на механизме внимания;&lt;br /&gt;
* BigGAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1809.11096.pdf Andrew Brock {{---}} LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS]&amp;lt;/ref&amp;gt;: GAN с ортогональной регуляризацией, позволившей разрешить проблему коллапсирования при долгом обучении;&lt;br /&gt;
&lt;br /&gt;
Кроме простой генерации изображений, существуют достаточно необычные применения, дающие впечатляющие результаты не только на картинках, но и на звуке:&lt;br /&gt;
&lt;br /&gt;
* CycleGAN&amp;lt;ref&amp;gt; [https://junyanz.github.io/CycleGAN/ Jun-Yan Zhu &amp;amp; Taesung Park {{---}} Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks]&amp;lt;/ref&amp;gt;: меняет изображения c одного домена на другой, например, лошадей на зебр;&lt;br /&gt;
* SRGAN&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1609.04802 Christian Ledig {{---}} Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network]&amp;lt;/ref&amp;gt;: создает изображения с высоким разрешением из более низкого разрешения;&lt;br /&gt;
* Pix2Pix&amp;lt;ref&amp;gt; [https://phillipi.github.io/pix2pix/ Phillip Isola {{---}} Image-to-Image Translation with Conditional Adversarial Nets]&amp;lt;/ref&amp;gt;: создает изображения по семантической окраске;&lt;br /&gt;
* StackGAN&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1612.03242 Han Zhang {{---}} StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks]&amp;lt;/ref&amp;gt;: создает изображения по заданному тексту;&lt;br /&gt;
* MidiNet&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1703.10847 Li-Chia Yang {{---}} MIDINET: A CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORK FOR SYMBOLIC-DOMAIN MUSIC GENERATION]&amp;lt;/ref&amp;gt;: генерирует последовательность нот, таким образом, создает мелодию.&lt;br /&gt;
&lt;br /&gt;
==CGAN (Conditional Generative Adversarial Nets)==&lt;br /&gt;
&lt;br /&gt;
[[File:CGAN_architecture.png|450px|thumb|Архитектура CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''Условные порождающие состязательные сети''' (англ. ''Conditional Generative Adversarial Nets, CGAN'') $-$ это модифицированная версия алгоритма GAN, которая позволяет &lt;br /&gt;
генерировать объекты с дополнительными условиями '''y'''. '''y''' может быть любой дополнительной информацией, например, меткой класса или данными из других моделей. Добавление данных условий в существующую архитектуру осуществляется с помощью расширения вектором '''y''' входных данных генератора и дискриминатора.&lt;br /&gt;
&lt;br /&gt;
В таком случае задача оптимизации будет выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; \min\limits_{G}\max\limits_{D} \mathop{E}\limits_{x \sim p_{data}}[logD(x|y)]  + \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z|y))]  &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве примера использования данного алгоритма можно рассмотреть задачу генерации рукописных цифр. ''CGAN'' был натренирован на датасете ''MNIST'' с метками классов представленных в виде ''one-hot'' векторов.&lt;br /&gt;
&lt;br /&gt;
[[File:CGAN_generated.png|450px|thumb|Цифры, сгенерированные с помощью CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]&lt;br /&gt;
&lt;br /&gt;
==DCGAN (Deep Convolutional Generative Adversarial Nets)==&lt;br /&gt;
&lt;br /&gt;
[[File:DCGAN_generator.png|450px|thumb|Архитектура генератора в DCGAN. Источник: https://arxiv.org/pdf/1511.06434.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''DCGAN''' $-$ модификация алгоритма ''GAN'', основными архитектурными изменениями которой являются:&lt;br /&gt;
* Замена всех пулинговых слоев на страйдинговые свертки (''strided convolutions'') в дискриминаторе и частично-страйдинговые свертки (''fractional-strided''&lt;br /&gt;
''convolutions'') в генераторе;&lt;br /&gt;
* Использование батчинговой нормализации для генератора и дискриминатора;&lt;br /&gt;
* Удаление всех полносвязных скрытых уровней для более глубоких архитектур;&lt;br /&gt;
* Использование ''ReLU'' в качестве функции активации в генераторе для всех слоев, кроме последнего, где используется ''tanh'';&lt;br /&gt;
* Использование ''LeakyReLU'' в качестве функции активации в дискриминаторе для всех слоев.&lt;br /&gt;
&lt;br /&gt;
Помимо задачи генерации объектов, данный алгоритм хорошо показывает себя в качестве ''feature extractor'''а.&lt;br /&gt;
Данный алгоритм был натренирован на датасете ''Imagenet-1k'', после чего были использованы значения со сверточных слоев дискриминатора, подвергнутые ''max-pooling'''у, чтобы образовать матрицы &lt;br /&gt;
&amp;lt;tex&amp;gt; 4 \times 4 &amp;lt;/tex&amp;gt; и получить общий вектор признаков на их основе. ''L2-SVM'' с данным ''feature extractor'''ом на датасете ''CIFAR-10'' превосходит по точности решения, основанные на алгоритме&lt;br /&gt;
''K-Means''. Более подробно об этом вы можете прочитать в статье. &amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1511.06434.pdf  Alec Radford, Luke Metz, Soumith Chintala {{---}} Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Порождающие модели|Порождающие модели]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Variational autoencoder (VAE)|Variational autoencoder (VAE)]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 348-360.&lt;br /&gt;
* [https://medium.com/@jonathan_hui/gan-why-it-is-so-hard-to-train-generative-advisory-networks-819a86b3750b Medium | GAN — Why it is so hard to train Generative Adversarial Networks! ]&lt;br /&gt;
* [https://arxiv.org/pdf/1411.1784.pdf CGAN Paper]&lt;br /&gt;
* [https://arxiv.org/pdf/1511.06434.pdf DCGAN Paper]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Порождающие модели]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA&amp;diff=69682</id>
		<title>Вариационный автокодировщик</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA&amp;diff=69682"/>
				<updated>2019-01-30T20:26:11Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Вариационный автокодировщик''' (англ. ''Variational Autoencoder'', ''VAE'') {{---}} [[автокодировщик]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&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;
'''Порождающее моделирование''' (англ. ''Generative modelling'') {{---}} область машинного обучения, имеющая дело с распределением &amp;lt;math&amp;gt;P(X)&amp;lt;/math&amp;gt;, определенном на датасете &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; из пространства (возможно многомерного) &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Так, например, популярные задачи генерации картинок имеют дело с огромным количеством измерений (пикселей). &lt;br /&gt;
&lt;br /&gt;
Также как и в обыкновенных кодировщиках у нас имеется скрытое вероятностное пространство &amp;lt;math&amp;gt;Z&amp;lt;/math&amp;gt; соответствующее случайной величине &amp;lt;math&amp;gt;(z, P(z))&amp;lt;/math&amp;gt; (распределенной как-нибудь фиксированно, здесь &amp;lt;math&amp;gt;\sim N(0, 1)&amp;lt;/math&amp;gt;). И мы хотим иметь декодер &amp;lt;math&amp;gt;f(z, \theta) \colon Z \times \Theta \to X &amp;lt;/math&amp;gt;. При этом мы хотим найти такие &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, чтобы после разыгрывания &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; по &amp;lt;math&amp;gt;P(z)&amp;lt;/math&amp;gt; мы получили &amp;quot;что-то похожее&amp;quot; на элементы &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вообще, для любого &amp;lt;math&amp;gt;x \in X&amp;lt;/math&amp;gt; мы хотим считать &amp;lt;math&amp;gt;P(x) = \int P(x|z; \theta)P(z)dz&amp;lt;/math&amp;gt;, здесь мы заменили &amp;lt;math&amp;gt;f(z, \theta)&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;P(x|z; \theta)&amp;lt;/math&amp;gt;, чтобы явно показать зависимость между &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; и после этого применить формулу полной вероятности. Обычно &amp;lt;math&amp;gt;P(x|z; \theta)&amp;lt;/math&amp;gt; около нуля почти для всех пар &amp;lt;math&amp;gt;(x, z)&amp;lt;/math&amp;gt;. Основная идея в том, что мы хотим теперь генерировать &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, который бы давали что-то около &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и только их суммировать в &amp;lt;math&amp;gt;P(x)&amp;lt;/math&amp;gt;. Для этого нам требуется ввести еще одно распределение &amp;lt;math&amp;gt;Q(z|X)&amp;lt;/math&amp;gt;, которое будет получать &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и говорить распределение на &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; которое наиболее вероятно будет генерировать нам такой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. Теперь нам нужно как-то сделать похожими распределения &amp;lt;math&amp;gt;E_{z\sim Q}P(X|z)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P(X)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим следующую дивергенцию Кульбака-Лейблера (''Kullback–Leibler divergence'', ''KL-div'').&lt;br /&gt;
:&amp;lt;math&amp;gt;D[Q(z)||P(z|X)] = E_{z∼Q} [log Q(z|X) − log P(z|X)]&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Распишем &amp;lt;math&amp;gt;P(z|X)&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;P(X|z) * P(z) / P(X)&amp;lt;/math&amp;gt;.&lt;br /&gt;
:&amp;lt;math&amp;gt;D[Q(z)||P(z|X)] = E_{z∼Q} [log Q(z) − log P(X|z) - log P(z)] + log P(X)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Что эквивалентно:&lt;br /&gt;
:&amp;lt;math&amp;gt;logP(x) - D[Q(z)||P(z|X)] = E_{z∼Q}[log P(X|z)] - D[Q(z)||P(z)]&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Рассмотрим эту штуку для &amp;lt;math&amp;gt;Q(z|X)&amp;lt;/math&amp;gt;, тогда:&lt;br /&gt;
:&amp;lt;math&amp;gt;logP(x) - D[Q(z|X)||P(z|X)] = E_{z∼Q}[log P(X|z)] - D[Q(z|X)||P(z)]&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Посмотрим, на это равенство. Правую часть мы можем оптимизировать градиентным спуском (пусть пока и не совсем понятно как).&lt;br /&gt;
В левой же части первое слагаемое {{---}} то, что мы хотим максимизировать. В то же время &amp;lt;math&amp;gt;D[Q(z|X)||P(z|X)]&amp;lt;/math&amp;gt; мы хотим минимизировать. Если у нас &amp;lt;math&amp;gt;Q(z|X)&amp;lt;/math&amp;gt; {{---}} достаточно сильная модель, то в какой-то момент она будет хорошо матчить &amp;lt;math&amp;gt;P(z|X)&amp;lt;/math&amp;gt;, а значит их дивергенция Кульбака-Лейблера будет почти 0. Значит, при оптимизации можно исключить эту часть и стараться максимизировать только правую. В качестве бонуса мы еще получили более &amp;quot;податливую&amp;quot; &amp;lt;math&amp;gt;P(z|X)&amp;lt;/math&amp;gt;, вместо нее можно смотреть на &amp;lt;math&amp;gt;Q(z|X)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь разберемся как оптимизировать правую часть. Сначала нужно определиться с моделью для &amp;lt;math&amp;gt;Q(z|X)&amp;lt;/math&amp;gt;. Обычно ее берут равной &amp;lt;math&amp;gt;N(z|\mu(X, \theta), \sigma(X, \theta))&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; какие-то детерминированные функции на X с обучаемыми параметрами &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, которые мы впредь будем опускать (обычно используются нейронные сети). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Нетрудно проверить, что для дивергенция Кульбака-Лейблера двух нормальных распределений имеет следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;D_{K}[N(\mu_1, \Sigma_0)||N(\mu_1, \Sigma_0)]&amp;lt;/math&amp;gt;, KLD есть &amp;lt;math&amp;gt;\frac{1}{2} (tr(\Sigma_1^{-1}\Sigma_0) + (\mu_1 - \mu_0)^T\Sigma_1^{-1}(\mu_1 - \mu_0) - k + log(\frac{det\Sigma_1}{det\Sigma_0})) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это значит, что&lt;br /&gt;
:&amp;lt;math&amp;gt;D[Q(z|X)||P(z)] = D[N(\mu(X), \Sigma(X))||N(0, I)] = \frac12 (tr(\Sigma(X)) + \mu(X)^T\mu(X) - k - log(det\Sigma(X)))&amp;lt;/math&amp;gt;. &lt;br /&gt;
Теперь здесь &lt;br /&gt;
можно считать градиенты, для BackPropagation. С первым слагаемым в правой части все немного сложнее. &amp;lt;math&amp;gt;E_{z∼Q}[log P(X|z)]&amp;lt;/math&amp;gt; мы можем считать методом Монте-Карло(МК), но тогда такая штука (из-за того, что переменные спрятаны в распределении, из которого мы генерируем себе выборку, для МК) не является гладкой относительно них, а значит непонятно, как проталкивать через это градиент. Для того, чтобы все-таки можно было протолкнуть градиент, применяется так называемый ''трюк репараметризации'', который базируется на простой формуле &amp;lt;math&amp;gt;N(\Sigma(X), \mu(X)) = \mu(X) + \Sigma^{\frac12}(X) * N(0, I) &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;E_{z∼Q}[log P(X|z)] = E_{\epsilon \sim N(0, I)}[log P(X = f(\mu(X) + \Sigma^{\frac12}(X) * \epsilon), \theta)]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В такой форме мы уже можем использовать BackPropagation для переменных из функций &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Следующая картинка лучше поможет осознать структуру VAE и, в частности, зачем нужен (и как работает) трюк репараметризации.&lt;br /&gt;
&lt;br /&gt;
На левой части диаграмма без использования reparameterization trick. &lt;br /&gt;
На правой части диаграмма с использованием reparameterization trick. &lt;br /&gt;
&lt;br /&gt;
[[Файл:VAE.PNG]]&lt;br /&gt;
&lt;br /&gt;
взято из https://arxiv.org/pdf/1606.05908.pdf&lt;br /&gt;
&lt;br /&gt;
== Пример реализации ==&lt;br /&gt;
Ниже приведена реализация частного случая VAE на языке Python с использованием библиотеки Pytorch.&lt;br /&gt;
Эта реализация работает с датасетом MNIST.&lt;br /&gt;
Размерность скрытого слоя {{---}} 2. &lt;br /&gt;
Координаты в нем считаются независимыми (из-за этого, например, матрица &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; диагональная, и формула для расчета KLD немного другая).&lt;br /&gt;
&lt;br /&gt;
 class VariationalAutoencoder(nn.Module):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        super().__init__()&lt;br /&gt;
        self.mu = nn.Linear(32, 2)&lt;br /&gt;
        self.gamma = nn.Linear(32, 2)&lt;br /&gt;
        self.encoder = nn.Sequential(nn.Linear(784, 32), nn.ReLU(True))&lt;br /&gt;
        self.decoder = nn.Sequential(nn.Linear(2, 32), nn.ReLU(True), nn.Linear(32, 784), nn.Sigmoid())&lt;br /&gt;
 &lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        mu, gamma = self.encode(x)&lt;br /&gt;
        encoding = self.reparameterize(mu, gamma)&lt;br /&gt;
        x = self.decoder(encoding)&lt;br /&gt;
        return x, mu, gamma&lt;br /&gt;
 &lt;br /&gt;
    def reparameterize(self, mu, gamma):&lt;br /&gt;
        if self.training:&lt;br /&gt;
            sigma = torch.exp(0.5*gamma)&lt;br /&gt;
            std_z = Variable(torch.from_numpy(np.random.normal(0, 1, size=sigma.size())).float())&lt;br /&gt;
            encoding = std_z.mul(sigma).add(mu)&lt;br /&gt;
            return encoding&lt;br /&gt;
        else:&lt;br /&gt;
            return mu&lt;br /&gt;
 &lt;br /&gt;
    def encode(self, x):&lt;br /&gt;
        x = self.encoder(x)&lt;br /&gt;
        mu = self.mu(x)&lt;br /&gt;
        gamma = self.gamma(x)&lt;br /&gt;
        return mu, gamma&lt;br /&gt;
  &lt;br /&gt;
    def decode(self, x):&lt;br /&gt;
        return self.decoder(x)&lt;br /&gt;
 &lt;br /&gt;
    def latent(self, x):&lt;br /&gt;
        mu, gamma = self.encode(x)&lt;br /&gt;
        encoding = self.reparameterize(mu, gamma)&lt;br /&gt;
        return encoding&lt;br /&gt;
 &lt;br /&gt;
 def loss_function(input, output, mu, gamma, batch_size=batch_size):&lt;br /&gt;
    BCE = F.binary_cross_entropy(output, input)&lt;br /&gt;
    KLD = -0.5*torch.sum(1 + gamma - mu.pow(2) - gamma.exp())&lt;br /&gt;
    KLD /= batch_size*784&lt;br /&gt;
    return BCE + KLD&lt;br /&gt;
&lt;br /&gt;
== Применение ==&lt;br /&gt;
Область применения вариационных автокодировщиков совпадает с областью применения обыкновенных автокодировщиков. А именно:&lt;br /&gt;
* Каскадное обучение глубоких сетей (хотя сейчас применяется все реже, в связи с появлением новых методов инициализации весов);&lt;br /&gt;
* Уменьшение шума в данных;&lt;br /&gt;
* Уменьшение размерности данных (иногда работает лучше, чем [[метод главных компонент]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Благодаря тому, что пользователь сам устанавливает нужное распределение скрытого вектора, вариационный кодировщик хорошо подходит для генерации новых объектов (например, картинок). Для этого достаточно разыграть скрытый вектор согласно его распределению и подать на вход декодера. Получится объект из того же распределения, что и датасет.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[:Автокодировщик|Автокодировщик]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; &lt;br /&gt;
*[[:Generative Adversarial Nets (GAN)|Порождающие состязательные сети]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
*[https://habr.com/ru/post/429276/ Вариационные автокодировщики: теория и рабочий код]&lt;br /&gt;
*[https://jaan.io/what-is-variational-autoencoder-vae-tutorial/ Tutorial - What is a variational autoencoder?]&lt;br /&gt;
*[https://towardsdatascience.com/intuitively-understanding-variational-autoencoders-1bfe67eb5daf Intuitively Understanding Variational Autoencoders]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://arxiv.org/abs/1606.05908 Tutorial on Variational Autoencoders]&lt;br /&gt;
*Datalore презентация Дениса Степанова&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Порождающие модели]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B5%D1%81%D1%82%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0&amp;diff=69681</id>
		<title>Обработка естественного языка</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B5%D1%81%D1%82%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0&amp;diff=69681"/>
				<updated>2019-01-30T20:23:59Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обработка естественного языка''' (''Natural Language Processing, NLP'') {{---}} пересечение [[Машинное обучение | машинного обучения]] и математической лингвистики&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0 Математическая лингвистика]&amp;lt;/ref&amp;gt;, направленное на изучение методов анализа и синтеза естественного языка. Сегодня NLP применяется во многих сферах, в том числе в голосовых помощниках, автоматических переводах текста и фильтрации текста. Основными тремя направлениями являются: [[Распознавание речи | распознавание речи]]  (Speech Recognition), понимание естественного языка (Natural Language Understanding&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Natural-language_understanding  Natural Language Understanding]&amp;lt;/ref&amp;gt; ) и генерация естественного языка (Natural Language Generation&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Natural-language_generation Natural Language Generation]&amp;lt;/ref&amp;gt;).&lt;br /&gt;
== Задачи ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Корпус''' {{---}} подобранная и обработанная по определённым правилам совокупность текстов, используемых в качестве базы для исследования языка.&lt;br /&gt;
}}&lt;br /&gt;
NLP решает большой набор задач, который можно разбить по уровням (в скобках). Среди этих задач, можно выделить следующие:&lt;br /&gt;
* Распознавание текста, речи, синтез речи (сигнал);&lt;br /&gt;
* Морфологический анализ, канонизация (слово);&lt;br /&gt;
* POS-тэгирование, распознавание именованных сущностей, выделение слов (словосочетание);&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;
* Удаление цифр (чисел) или замена на текстовый эквивалент (обычно используются регулярные выражения);&lt;br /&gt;
* Удаление пунктуации. Обычно реализуется как удаление из текста символов из заранее заданного набора;&lt;br /&gt;
* Удаление пробельных символов (whitespaces);&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;
=== Лемматизация ===&lt;br /&gt;
Данный подход является альтернативой стемминга. Основная идея в приведении слова к словарной форме {{---}} лемме. Например для русского языка:&lt;br /&gt;
* для существительных — именительный падеж, единственное число;&lt;br /&gt;
* для прилагательных — именительный падеж, единственное число, мужской род;&lt;br /&gt;
* для глаголов, причастий, деепричастий {{---}} глагол в инфинитиве несовершенного вида.&lt;br /&gt;
&lt;br /&gt;
=== Векторизация ===&lt;br /&gt;
Большинство математических моделей работают в векторных пространствах больших размерностей, поэтому необходимо отобразить текст в векторном пространстве. Основным походом является мешок слов (bag-of-words): для документа формируется вектор размерности словаря, для каждого слова выделяется своя размерность, для документа записывается признак насколько часто слово встречается в нем, получаем вектор. Наиболее распространенным методом для вычисления признака является TF-IDF&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/TF-IDF TF-IDF]&amp;lt;/ref&amp;gt; (TF {{---}} частота слова, term frequency, IDF {{---}} обратная частота документа, inverse document frequency). TF вычисляется, например, счетчиком вхождения слова. IDF обычно вычисляют как логарифм от числа документов в корпусе, разделённый на количество документов, где это слово представлено. Таким образом, если какое-то слово встретилось во всех документах корпуса, то такое слово не будет никуда добавлено. Плюсами мешка слов является простая реализация, однако данный метод теряет часть информации, например, порядок слов. &lt;br /&gt;
Для уменьшения потери информации можно использовать мешок N-грамм (добавлять не только слова, но и словосочетания), или использовать методы векторных представлений слов это, например, позволяет снизить ошибку на словах с одинаковыми написаниями, но разными значениями.&lt;br /&gt;
&lt;br /&gt;
=== Дедубликация ===&lt;br /&gt;
Так как количество схожих документов в большом корпусе может быть велико, необходимо избавляться от дубликатов. Так как каждый документ может быть представлен как вектор, то мы можем определить их близость, взяв косинус или другую метрику. Минусом является то, что для больших корпусов полный перебор по всем документам будет невозможен. Для оптимизации можно использовать локально-чувствительный хеш, который поместит близко похожие объекты.&lt;br /&gt;
&lt;br /&gt;
=== Семантический анализ ===&lt;br /&gt;
Семантический (смысловой) анализ текста {{---}} выделение семантических отношений, формировании семантического представления. В общем случае семантическое представление является графом, семантической сетью, отражающим бинарные отношения между двумя узлами — смысловыми единицами текста. Глубина семантического анализа может быть разной, а в реальных системах чаще всего строится только лишь синтаксико-семантическое представление текста или отдельных предложений.&lt;br /&gt;
Семантический анализ применяется в задачах анализа тональности текста&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Sentiment_analysis Анализ тональности текста]&amp;lt;/ref&amp;gt;(Sentiment analysis), например, для автоматизированного определения положительности отзывов.&lt;br /&gt;
&lt;br /&gt;
=== Распознование именованных сущностей и извлечение отношений ===&lt;br /&gt;
Именованные сущности {{---}} объекты из текста, которые могут быть отнесены к одной из заранее заявленных категорий (например, организации, личности, адреса). Идентификация ссылок на подобные сущности в тексте является задачей распознавания именованных сущностей.&lt;br /&gt;
 Станкевич Андрей Сергеевич {{---}} лауреат специальной премии корпорации IBM.&lt;br /&gt;
 '''Станкевич Андрей Сергеевич'''[личность] {{---}} лауреат специальной премии корпорации '''IBM'''[компания].&lt;br /&gt;
Определение семантических отношений между именованными сущностями или другими объектами текста, является задачей извлечения отношений. Примеры отношений: (автор,книга), (организация,главный_офис).&lt;br /&gt;
&lt;br /&gt;
Эти два подхода применяются во многих задачах, например, извлечение синонимов из текста, автоматическом построении онтологий и реализованы во многих работающих системах, например, NELL&amp;lt;ref&amp;gt;[http://rtw.ml.cmu.edu/rtw/ NELL]&amp;lt;/ref&amp;gt; и Snowball&amp;lt;ref&amp;gt;[http://www.mathcs.emory.edu/~eugene/papers/dl00.pdf Snowball]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Использование N-грамм ===&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''N-грамма''' {{---}} последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов.&lt;br /&gt;
}}&lt;br /&gt;
В NLP N-граммы используются для построения вероятностных моделей, задач схожести текстов, категоризации текста и языка. &lt;br /&gt;
&lt;br /&gt;
Построив N-граммную модель можно определить вероятность употребления заданной фразы в тексте. N-граммная модель рассчитывает вероятность последнего слова N-граммы, если известны все предыдущие, при этом полагается, что вероятность появления каждого слова зависит только от предыдущих слов.&lt;br /&gt;
&lt;br /&gt;
Использование N-грамм применяется в задаче выявления плагиата. Текст разбивается на несколько фрагментов, представленных N-граммами. Сравнение N-грамм друг с другом позволяет определить степень сходства документов. Аналогичным способом можно решать задачу исправления орфографических ошибок, подбирая слова кандидаты для замены.&lt;br /&gt;
&lt;br /&gt;
== Библиотеки для NLP ==&lt;br /&gt;
=== NLTK (Natural Language ToolKit)&amp;lt;ref&amp;gt;[https://www.nltk.org/ NLTK]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
Пакет библиотек и программ для символьной и статистической обработки естественного языка, написанных на Python. Содержит графические представления и примеры данных. Поддерживает работу с множеством языков, в том числе, русским.&lt;br /&gt;
&lt;br /&gt;
Плюсы:&lt;br /&gt;
* Самая известная и полная по функционалу библиотека для NLP;&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;
&lt;br /&gt;
=== spaCy&amp;lt;ref&amp;gt;[https://spacy.io/ spaCy]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
Библиотека, написанная на языке Cypthon, позиционируется как самая быстрая NLP библиотека. Имеет множество возможностей, в том числе, разбор зависимостей на основе меток, распознавание именованных сущностей, пометка частей речи, векторы расстановки слов. Не поддерживает русский язык.&lt;br /&gt;
&lt;br /&gt;
Плюсы:&lt;br /&gt;
* Самая быстрая библиотека для NLP;&lt;br /&gt;
* Простая в изучении и использовании;&lt;br /&gt;
* Работает с объектами, а не строками;&lt;br /&gt;
* Есть встроенные вектора слов;&lt;br /&gt;
* Использует нейронные сети для тренировки моделей.&lt;br /&gt;
Минусы&lt;br /&gt;
* Менее гибкая по сравнению с NLTK;&lt;br /&gt;
* Токенизация предложений медленнее, чем в NLTK;&lt;br /&gt;
* Поддерживает маленькое количество языков.&lt;br /&gt;
&lt;br /&gt;
=== scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org scikit-learn]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
Библиотека scikit-learn предоставляет реализацию целого ряда алгоритмов для обучения с учителем и обучения без учителя через интерфейс для Python. Построена поверх SciPy. Ориентирована в первую очередь на моделирование данных, имеет достаточно функций, чтобы использоваться для NLP в связке с другими библиотеками.&lt;br /&gt;
&lt;br /&gt;
Плюсы:&lt;br /&gt;
* Большое количество алгоритмов для построения моделей;&lt;br /&gt;
* Содержит функции для работы с Bag-of-Words моделью;&lt;br /&gt;
* Хорошая документация.&lt;br /&gt;
Минусы&lt;br /&gt;
* Плохой препроцессинг, что вынуждает использовать ее в связке с другой библиотекой (например, NLTK);&lt;br /&gt;
* Не использует нейронные сети для препроцессинга текста.&lt;br /&gt;
&lt;br /&gt;
=== gensim&amp;lt;ref&amp;gt;[https://radimrehurek.com/gensim/ gensim]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
Python библиотека для моделирования, тематического моделирования документов и извлечения подобия для больших корпусов. В gensim реализованы популярные NLP алгоритмы, например, word2vec. Большинство реализаций могут использовать несколько ядер.&lt;br /&gt;
&lt;br /&gt;
Плюсы:&lt;br /&gt;
* Работает с большими датасетами;&lt;br /&gt;
* Поддерживает глубокое обучение;&lt;br /&gt;
* word2vec, tf-idf vectorization, document2vec.&lt;br /&gt;
Минусы&lt;br /&gt;
* Заточена под модели без учителя;&lt;br /&gt;
* Не содержит достаточного функционала, необходимого для NLP, что вынуждает использовать ее вместе с другими библиотеками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Балто-славянские языки имеют сложную морфологию, что может ухудшить качество обработки текста, а также ограничить использование ряда библиотек. Для работы со специфичной русской морфологией можно использовать, например, морфологический анализатор '''pymorphy2'''&amp;lt;ref&amp;gt;[https://github.com/kmike/pymorphy2 pymorphy2]&amp;lt;/ref&amp;gt; и библиотеку для поиска и извлечения именованных сущностей '''Natasha'''&amp;lt;ref&amp;gt;[https://github.com/natasha/natasha Natasha]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примеры использования NLTK ==&lt;br /&gt;
* Разбиение на предложения:&lt;br /&gt;
 text = &amp;quot;Предложение. Предложение, которое содержит запятую. Восклицательный знак! Вопрос?&amp;quot; &lt;br /&gt;
 sents = nltk.sent_tokenize(text)&lt;br /&gt;
 print(sents)&lt;br /&gt;
 '''output:''' ['Предложение.', 'Предложение, которое содержит запятую.', 'Восклицательный знак!', 'Вопрос?']&lt;br /&gt;
* Токенизация:&lt;br /&gt;
 from nltk.tokenize import RegexpTokenizer&lt;br /&gt;
 sent = &amp;quot;В этом предложении есть много слов, мы их разделим.&amp;quot;&lt;br /&gt;
 tokenizer = RegexpTokenizer(r'\w+')&lt;br /&gt;
 print(tokenizer.tokenize(sent))&lt;br /&gt;
 '''output:''' ['В', 'этом', 'предложении', 'есть', 'много', 'слов', 'мы', 'их', 'разделим']&lt;br /&gt;
&lt;br /&gt;
 from nltk import word_tokenize&lt;br /&gt;
 sent = &amp;quot;В этом предложении есть много слов, мы их разделим.&amp;quot;&lt;br /&gt;
 print(word_tokenize(sent))&lt;br /&gt;
 '''output:''' ['В', 'этом', 'предложении', 'есть', 'много', 'слов', ',', 'мы', 'их', 'разделим', '.']&lt;br /&gt;
* Стоп слова:&lt;br /&gt;
 from nltk.corpus import stopwords&lt;br /&gt;
 stop_words=set(stopwords.words('english'))&lt;br /&gt;
 print(stop_words)&lt;br /&gt;
 '''output:''' {'should', 'wouldn', 'do', 'over', 'her', 'what', 'aren', 'once', 'same', 'this', 'needn', 'other', 'been', 'with', 'all' ...&lt;br /&gt;
&lt;br /&gt;
* Стемминг и лемматизация:&lt;br /&gt;
 from nltk.stem.porter import PorterStemmer&lt;br /&gt;
 porter_stemmer = PorterStemmer()&lt;br /&gt;
 print(porter_stemmer.stem(&amp;quot;crying&amp;quot;))&lt;br /&gt;
 '''output:''' cri&lt;br /&gt;
&lt;br /&gt;
 from nltk.stem.lancaster import LancasterStemmer&lt;br /&gt;
 lancaster_stemmer = LancasterStemmer()&lt;br /&gt;
 print(lancaster_stemmer.stem(&amp;quot;crying&amp;quot;))&lt;br /&gt;
 '''output:''' cry&lt;br /&gt;
&lt;br /&gt;
 from nltk.stem import SnowballStemmer&lt;br /&gt;
 snowball_stemmer = SnowballStemmer(&amp;quot;english&amp;quot;)&lt;br /&gt;
 print(snowball_stemmer.stem(&amp;quot;crying&amp;quot;)) &lt;br /&gt;
 '''output:''' cri&lt;br /&gt;
&lt;br /&gt;
 from nltk.stem import WordNetLemmatizer&lt;br /&gt;
 wordnet_lemmatizer = WordNetLemmatizer()&lt;br /&gt;
 print(wordnet_lemmatizer.lemmatize(&amp;quot;came&amp;quot;, pos=&amp;quot;v&amp;quot;))&lt;br /&gt;
 '''output:''' come&lt;br /&gt;
&lt;br /&gt;
== Пример кода на языке Scala ==&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/nlp/TrainViveknSentiment.scala Пример реализации алгоримтма NLP] на основе Apache Spark ML&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-guide.html Apache Spark MLlib]&amp;lt;/ref&amp;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;
# [https://en.wikipedia.org/wiki/Natural_language_processing] {{---}} статья на Википедии&lt;br /&gt;
# [http://www.nltk.org/book/ Natural Language Processing with Python] {{---}} Analyzing Text with the Natural Language Toolkit&lt;br /&gt;
# [http://www.cs.colorado.edu/~martin/slp2.html Speech and Language Processing]&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Обработка естественного языка]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=69680</id>
		<title>Настройка глубокой сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=69680"/>
				<updated>2019-01-30T20:20:52Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Глубокое обучение|Глубокая сеть]] состоит из нескольких слоев, где каждый слой организован таким образом, что каждый нейрон в одном слое получает свою копию всех выходных данных предыдущего слоя. Эта модель идеально подходит для определенных типов задач, например, обучение на ограниченном количестве более или менее неструктурированных параметров. Существует множество способов изменения параметров (весов) в такой модели, когда ей на вход поступают необработанные данные. &lt;br /&gt;
&lt;br /&gt;
== Инициализация сети ==&lt;br /&gt;
&lt;br /&gt;
Принцип выбора начальных значений весов для слоев, составляющих модель очень важен: установка всех весов в 0 будет серьезным препятствием для обучения, так как ни один из весов изначально не будет активен. Присваивать весам значения из интервала &amp;lt;tex&amp;gt;[-1, 1]&amp;lt;/tex&amp;gt; — тоже обычно не лучший вариант — на самом деле, иногда (в зависимости от задачи и сложности модели) от правильной инициализации модели может зависеть, достигнет она высочайшей производительности или вообще не будет сходиться. Даже если задача не предполагает такой крайности, удачно выбранный способ инициализации весов может значительно влиять на способность модели к обучению, так как он предустанавливает параметры модели с учетом функции потерь&amp;lt;ref&amp;gt;[https://habr.com/company/wunderfund/blog/315476/ Тонкая настройка нейронной сети, Habr]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Всегда можно выбрать случайно начальное приближение, но лучше выбирать определённым образом, ниже приведены самые распространённые из них:&lt;br /&gt;
&lt;br /&gt;
* Метод инициализации Завьера (Xavier) (иногда — метод Glorot’а)&amp;lt;ref&amp;gt;[http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf Understanding the difficulty of training deep feedforward neural networks]&amp;lt;/ref&amp;gt;. Основная идея этого метода — упростить прохождение сигнала через слой во время как прямого, так и обратного распространения ошибки для линейной функции активации (этот метод также хорошо работает для сигмоидной функции, так как участок, где она ненасыщена, также имеет линейный характер). При вычислении весов этот метод опирается на вероятностное распределение (равномерное или нормальное) с дисперсией, равной &amp;lt;tex&amp;gt;\mathrm{Var}(W) = {2 \over{n_{in} + n_{out}}}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n_{in}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;n_{out}&amp;lt;/tex&amp;gt; — количества нейронов в предыдущем и последующем слоях соответственно;&lt;br /&gt;
&lt;br /&gt;
* Метод инициализации Ге (He) — вариация метода Завьера, больше подходящая функции активации ReLU, компенсирующая тот факт, что эта функция возвращает нуль для половины области определения. А именно, в этом случае &amp;lt;tex&amp;gt;\mathrm{Var}(W) = {2 \over{n_{in}}}&amp;lt;/tex&amp;gt;&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1502.01852.pdf Delving Deep into Rectifiers]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Граф вычислений ==&lt;br /&gt;
Глубокие сети являются особенной формой графа вычиcлений.&lt;br /&gt;
[[Файл: tree-def.png|450px|thumb|Рис.1. Граф вычислений для функции &amp;lt;tex&amp;gt;f(a,b)=(a+b)*(b+1)&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Граф вычислений — ориентированный граф, узлы которого соответствуют операциям или переменным. Переменные могут передавать свое значение в операции, а операции могут передавать свои результаты в другие операции. Таким образом, каждый узел в графе определяет функцию переменных.&lt;br /&gt;
&lt;br /&gt;
Значения, которые вводятся в узлы и выходят из узлов, называются тензорами (т.е. многомерными массивами). На рисунке 1 представлен граф вычислений для функции &amp;lt;tex&amp;gt;f(a,b)=(a+b)*(b+1)&amp;lt;/tex&amp;gt;. В нейронах сетях функций имеют больше аргументов и сложнее, но смысл операций остаётся прежним.&lt;br /&gt;
&lt;br /&gt;
Процесс передачи значений от входных нейронов к выходным называется прямым распространением (от англ. Forward pass). После чего мы вычисляем ошибку обработанных сетью данных на выходном нейроне и, основываясь на её значении, делаем обратную передачу ошибки ([[Обратное распространение ошибки|Back propagation]]). Обратное распространение ошибки заключается в том, чтобы последовательно менять веса нейронной сети, начиная с весов выходного нейрона. Значения весов будут меняться в сторону уменьшения ошибки.&lt;br /&gt;
&lt;br /&gt;
[[Файл: C_graph.png|400px|thumb|Рис.2. Граф вычислений для функции &amp;lt;tex&amp;gt;f(x,y,z)=(x+y)*z&amp;lt;/tex&amp;gt;. Зелёные цифры — значения вычислений по ходу выполнения операций графа, красные — значения производной выходной функции по текущей переменной в точке &amp;lt;tex&amp;gt;(x_0=-2, y_0=5, z_0=-4)&amp;lt;/tex&amp;gt;]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Преимуществом такого представления функции является простота вычисления производных. Используя следующие правила вычисления частных производных: &lt;br /&gt;
*&amp;lt;tex&amp;gt;q=x+y:\frac{\partial q}{\partial x}=1, \frac{\partial q}{\partial y}=1;&amp;lt;/tex&amp;gt;;&lt;br /&gt;
*&amp;lt;tex&amp;gt;q=xy:\frac{\partial q}{\partial x}=y, \frac{\partial q}{\partial y}=x;&amp;lt;/tex&amp;gt;;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial y}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим граф вычислений на рисунке 2 с поданными на вход значениями &amp;lt;tex&amp;gt;(x_0=-2, y_0=5, z_0=-4)&amp;lt;/tex&amp;gt;. Подсчёт производных по графу вычислений производим от значения функции к значениям независимых переменных-входов.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;\frac{\partial f}{\partial f} = 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\frac{\partial f}{\partial q} = z_0 = -4&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\frac{\partial f}{\partial z} = q_0 = 3&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\frac{\partial f}{\partial x} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial x} = -4&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\frac{\partial f}{\partial y} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial y} = -4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Граф вычислений является частью нейронной сети, у которой &amp;lt;tex&amp;gt;x_{n_{in}}&amp;lt;/tex&amp;gt; {{---}} входные значения, &amp;lt;tex&amp;gt;y_{n_{out}}&amp;lt;/tex&amp;gt; {{---}} выходные с сети значения, &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; {{---}} матрица весов, приводящая значения предыдущего слоя к выходным значениям.&lt;br /&gt;
&lt;br /&gt;
Зная производные, можно искать матрицы весов &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; (числа, на которые умножаются входные для этого слоя значения) с помощью [[Настройка глубокой сети#Способы настройки параметров|градиентного спуска]] сдвигаемся&lt;br /&gt;
в сторону градиента (при максимизации) или обратную ему&lt;br /&gt;
(при минимизации) &amp;lt;tex&amp;gt;w^{(k+1)}=w^{(k)}-\eta \frac{\partial L(w^{(k)})}{\partial w^{(k)}}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; — функция потерь, а &amp;lt;tex&amp;gt;w^{(k)}&amp;lt;/tex&amp;gt; — веса после &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ой итерации, или его модификаций&amp;lt;ref&amp;gt;[http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BF%D1%83%D1%81%D0%BA%D0%B0 Метод градиентного спуска]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Способы настройки параметров ==&lt;br /&gt;
[[File:basins.png|450px|thumb|right|Рис.3. Сравение мотификаций метода градиентного спуска на ландшафте &amp;quot;бассейны и стены&amp;quot;&amp;lt;ref&amp;gt;[https://habr.com/post/318970/ Методы оптимизации нейронных сетей, Habr]&amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
[[File:wolby.png|450px|thumb|right|Рис.4. Сравение мотификаций метода градиентного спуска на &amp;quot;шатком&amp;quot; ландшафте&amp;lt;ref&amp;gt;[https://habr.com/post/318970/ Методы оптимизации нейронных сетей, Habr]&amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
Ниже представлены различные вариации градиентного спуска (более подробное сравнение, применительно к данной задаче &amp;lt;ref&amp;gt;[https://habr.com/post/318970/ Методы оптимизации нейронных сетей, Habr]&amp;lt;/ref&amp;gt;). Градиентный спуск — итеративный алгоритм поиска минимума или максимума функции, метриками качества алгоритма этого семейства методов являются скорость сходимости и сходимость в глобальный оптимум. Методы имеют различные преимущества на различных функциях. Так например на рисунке 3 из локального минимума метод adam и метод Нестерова не могут достигнуть глобального, а в случае &amp;quot;шаткого&amp;quot; ландшафта (рисунок 4) эти методы сходятся быстрее.&lt;br /&gt;
&lt;br /&gt;
* [[Стохастический градиентный спуск|Метод стохастического градиентного спуска]] заключается в том, что алгоритм делает шаг постоянной величины в направлении, указанном градиентом в текущей точке: &amp;lt;tex&amp;gt;w^{(k+1)}=w^{(k)}-\mu\frac{\partial L(w^{(k)})}{\partial w^{(k)}}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Модификация Momentum &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Momentum Momentum, Wikipedia]&amp;lt;/ref&amp;gt; запоминает скорость на предыдущем шаге и добавляет в &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; раз меньшую величину на следующем шаге: &amp;lt;tex&amp;gt; v^{(k+1)}=\alpha v^{(k)} -\eta \frac{\partial L(w^{(k)})}{\partial w^{(k)}}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; w^{(k+1)}=w^{(k)}+v^{(k)}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Метод Нестерова (англ. Nesterov accelerated gradient, NAG)&amp;lt;ref&amp;gt;[https://jlmelville.github.io/mize/nesterov.html#nag Nesterov accelerated gradient]&amp;lt;/ref&amp;gt; добавляет к методу Momentum идею &amp;quot;заглядывания вперёд&amp;quot;, используя производную не в текущей точке, а в следующей (если бы мы продолжали двигаться в этом же направлении без измений): &amp;lt;tex&amp;gt; w^{(k+1)} = w^{(k)}-v^{(k)}; v^{(k+1)}=\gamma v^{(k)}+\mu\frac{\partial L(w^{(k)}-v^{(k)})}{\partial w}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Adagrad имеет преимущество в плане обучения нейронных сетей в предположении, что процесс обучения должен сходится (т.е. не нужно сильно менять веса сети, когда мы уже немного научились). В процессе обучения после каждого прецендента алгоритм будет уменьшать шаг за счёт суммы квадратов координат градиента предыдущих итераций&amp;lt;ref&amp;gt;[http://akyrillidis.github.io/notes/AdaGrad AdaGrad]&amp;lt;/ref&amp;gt;: &amp;lt;tex&amp;gt;g_i^{(k)}=\frac{\partial L(w_i^{(k)})}{\partial w_i^{(k)}}, w_i^{(k+1)}=w_i^{(k)}-\frac{\mu}{\sqrt{G^{(k)}_{i,i}+\epsilon}}g_{i}^{(k)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — диагональная матрица, элементы которой, суммы квадратов координат градиента к &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ой итерации алгоритма: &amp;lt;tex&amp;gt;G_{i,i}^{(k)} = \sum_{t=0}^k (g_i^{(t)})^2&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*RMSProp&amp;lt;ref&amp;gt;[https://towardsdatascience.com/a-look-at-gradient-descent-and-rmsprop-optimizers-f77d483ef08b RMSProp]&amp;lt;/ref&amp;gt; основан на идее Adagrad'a, но с учётом того элементы матрицы &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; могут быть большими величинами и начать препятствовать обучению. Для этого RMSProp делит шаг не на полную сумму градиентов, а на скользящую, т.е. &amp;lt;tex&amp;gt;E_i^{(k)} = \gamma E_i^{(k-1)}+(1-\gamma)(g_{i}^{(k)})^2&amp;lt;/tex&amp;gt;, обновление весов осталось таким же как в Adagrad : &amp;lt;tex&amp;gt; w_i^{(k+1)} = w_i^{(k)}-\frac{\mu}{\sqrt{E_i^{(k)}+\epsilon}}g_{i}^{(k)}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Adadelta&amp;lt;ref&amp;gt;[https://arxiv.org/abs/1212.5701 Adadelta]&amp;lt;/ref&amp;gt; устраняет &amp;quot;нефизичность&amp;quot; методов Adagrad и RMSProp, добавка с градиентом в которых не имеет размерности весов(точнее вообще безразмерна). Умножение этого слагаемого на любую величину правильной размерности — не самая хорошая идея. Используем разложение ряда Тейлора в точке с большим числом членов, тогда появится матрица &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; вторых производных функции потерь: &amp;lt;tex&amp;gt;w^{(k+1)}=w^{(k)}-\mu(Q(w^{(k)})^{-1}Q(w^{(k)}))&amp;lt;/tex&amp;gt;, рассчёт которой повлечёт за собой дополнительные затраты на её расчёт (сами градиенты мы получаем сразу при обратном распространии ошибки), поэтому вместо неё можно брать приближение (из сложных выводов получаем необходимиый множитель &amp;lt;tex&amp;gt;RMS^{(k-1)}[\delta w_i]&amp;lt;/tex&amp;gt;), однако в данном случае знание предыдущей скорости не добавляет алгоритму &amp;quot;инерции&amp;quot; методов Momentum и NAG): &amp;lt;tex&amp;gt;w^{(k+1)}=w^{(k)}-\frac{RMS^{(k-1)}[\delta w_i]}{RMS^{(k)}[g_i]}g_i^{(k)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;RMS^{(k)}[x_i]=\sqrt{E^{(k)}[x^2_i]+\epsilon}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Adam&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1412.6980.pdf Adam]&amp;lt;/ref&amp;gt; сочетает в себе преимущества NAG и Adadelta над обычным градиентным спуском: &amp;lt;tex&amp;gt; w^{(k+1)}_i = w_i^{(k)}-\frac{\mu}{\sqrt{\hat{b}^2_{(k)}+\epsilon}}\hat{m}_{(k)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\hat{m}_{(k)}=\frac{\gamma_1 E^{(k-1)}[g_i]+(1-\gamma_1)g_{i,(k)}}{1-\gamma_1^k}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\hat{b}^2_{(k)}= \frac{\gamma_2 E^{(k-1)}[g^2_i]+(1-\gamma_2)g:2_{i,(k)}}{1-\gamma_2^k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==См.также==&lt;br /&gt;
* [[Глубокое обучение]]&lt;br /&gt;
* [[Стохастический градиентный спуск]]&lt;br /&gt;
* [[Обратное распространение ошибки]]&amp;lt;sup&amp;gt;[на 28.01.19 страница не создана]&amp;lt;/sup&amp;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;br /&gt;
#[http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%28%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9A.%D0%92.%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2%29 Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
# Riedmiller, M., &amp;amp; Braun, H. (1993). A direct adaptive method for faster backpropagation learning: The RPROP algorithm. In Neural Networks, 1993., IEEE International Conference on (pp. 586-591). IEEE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Глубокое обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Batch-normalization&amp;diff=69679</id>
		<title>Batch-normalization</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Batch-normalization&amp;diff=69679"/>
				<updated>2019-01-30T20:18:30Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Пакетная нормализация''' (англ. batch-normalization) {{---}} метод, который позволяет повысить производительность и стабилизировать работу [[Нейронные сети, перцептрон | искусственных нейронных сетей]]. Суть данного метода заключается в том, что некоторым слоям нейронной сети на вход подаются данные, предварительно обработанные и имеющие нулевое [[Математическое ожидание случайной величины|математическое ожидание]] и единичную [[Дисперсия случайной величины|дисперсию]]. Впервые данный метод был представлен в &amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1502.03167.pdf Ioffe S., Szegedy C. {{---}} Batch normalization: Accelerating deep network training by reducing internal covariate shift, 2016]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея==&lt;br /&gt;
Нормализация входного слоя нейронной сети обычно выполняется путем масштабирования данных, подаваемых в функции активации. Например, когда есть признаки со значениями от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и некоторые признаки со значениями от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;1000&amp;lt;/tex&amp;gt;, то их необходимо нормализовать, чтобы ускорить обучение. Нормализацию данных можно выполнить и в скрытых слоях нейронных сетей, что и делает метод пакетной нормализации.&lt;br /&gt;
===Пакет===&lt;br /&gt;
Предварительно, напомним, что такое '''пакет''' (англ. batch). Возможны два подхода к реализации алгоритма градиентного спуска для обучения нейросетевых моделей: стохастический и пакетный&amp;lt;ref&amp;gt;[http://www.machinelearning.ru/wiki/index.php?title=Метод_стохастического_градиента Метод стохастического градиента]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
* [[Стохастический градиентный спуск|Стохастический градиентный спуск]] (англ. stochastic gradient descent) {{---}} реализация, в которой на каждой итерации алгоритма из обучающей выборки каким-то (случайным) образом выбирается только один объект; &lt;br /&gt;
* Пакетный (батч) (англ. batch gradient descent) {{---}} реализация градиентного спуска, когда на каждой итерации обучающая выборка просматривается целиком, и только после этого изменяются веса модели. &lt;br /&gt;
&lt;br /&gt;
Также существует &amp;quot;золотая середина&amp;quot; между стохастическим градиентным спуском и пакетным градиентным спуском {{---}} когда просматривается только некоторое подмножество обучающей выборки фиксированного размера (англ. batch-size). В таком случае такие подмножества принято называть мини-пакетом (англ. mini-batch). Здесь и далее, мини-пакеты будем также называть пакетом.&lt;br /&gt;
&lt;br /&gt;
===Ковариантный сдвиг===&lt;br /&gt;
[[Файл:covariate-shift1.png|600px|thumb|Рисунок 1. Верхние две строки роз показывают первое подмножество данных, а нижние две строки показывают другое подмножество. Два подмножества имеют разные пропорции изображения роз. На графиках показано распределение двух классов в пространстве объектов с использованием красных и зеленых точек. Синяя линия показывает границу между двумя классами. Иллюстрация из [https://www.learnopencv.com/batch-normalization-in-deep-networks/ статьи].]]&lt;br /&gt;
Пакетная нормализация уменьшает величину, на которую смещаются значения узлов в скрытых слоях (т.н. '''[[Ковариация случайных величин|ковариантный]] сдвиг''' (англ. covariance shift)). &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;tex&amp;gt;X&amp;lt;/tex&amp;gt; в множество &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; и если пропорция элементов в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; изменяется, то появляется необходимость обучить модель заново, чтобы &amp;quot;выровнять&amp;quot; пропорции элементов в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Когда пакеты содержат изображения разных классов, распределенные в одинаковой пропорции на всем множестве, то ковариантный сдвиг незначителен. &lt;br /&gt;
Однако, когда пакеты выбираются только из одного или двух подмножеств (в данном случае, красные розы и розы различных цветов), то ковариантный сдвиг возрастает. &lt;br /&gt;
Это довольно сильно замедляет процесс обучения модели. На Рисунке 1 изображена разница в пропорциях.&lt;br /&gt;
&lt;br /&gt;
Простой способ решить проблему ковариантного сдвига для входного слоя {{---}} это случайным образом перемешать данные перед созданием пакетов. &lt;br /&gt;
Но для скрытых слоев нейронной сети такой метод не подходит, так как распределение входных данных для каждого узла скрытых слоев изменяется каждый раз, когда происходит обновление параметров в предыдущем слое. &lt;br /&gt;
Эта проблема называется '''внутренним ковариантным сдвигом''' (англ. internal covariate shift). &lt;br /&gt;
Для решения данной проблемы часто приходится использовать низкий [[Стохастический градиентный спуск|темп обучения]] (англ. learning rate) и методы [[wikipedia:ru:Регуляризация_(математика)|регуляризации]] при обучении модели. &lt;br /&gt;
Другим способом устранения внутреннего ковариантного сдвига является метод пакетной нормализации.&lt;br /&gt;
&lt;br /&gt;
===Свойства пакетной нормализации===&lt;br /&gt;
Кроме того, использование пакетной нормализации обладает еще несколькими дополнительными полезными свойствами:&lt;br /&gt;
* достигается более быстрая сходимость моделей, несмотря на выполнение дополнительных вычислений;&lt;br /&gt;
* пакетная нормализация позволяет каждому слою сети обучатся более независимо от других слоев;&lt;br /&gt;
* становится возможным использование более высокого темпа обучения, так как пакетная нормализация гарантирует, что выходы узлов нейронной сети не будут иметь слишком больших или малых значений;&lt;br /&gt;
* пакетная нормализация в каком-то смысле также является механизмом регуляризации: данный метод привносит в выходы узлов скрытых слоев некоторый шум, аналогично методу [[Практики реализации нейронных сетей#Dropout|dropout]];&lt;br /&gt;
* модели становятся менее чувствительны к начальной инициализации весов.&lt;br /&gt;
&lt;br /&gt;
==Описание метода==&lt;br /&gt;
Опишем устройство метода пакетной нормализации. Пусть на вход некоторому слою нейронной сети поступает вектор размерности &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;x = (x^{(1)}, \ldots, x^{(d)})&amp;lt;/tex&amp;gt;. Нормализуем данный вектор по каждой размерности &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\hat{x}^{(k)} = \displaystyle \frac{x^{(k)} - E(x^{(k)})}{\sqrt{D(x^{(k)})}}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где математическое ожидание и дисперсия считаются по всей обучающей выборке. Такая нормализация входа слоя нейронной сети может изменить представление данных в слое. Чтобы избежать данной проблемы, вводятся два параметра сжатия и сдвига нормализованной величины для каждого &amp;lt;tex&amp;gt;x^{(k)}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; {{---}} которые действуют следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;y^{(k)} = \gamma^{(k)} \hat{x}^{(k)} + \beta^{(k)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данные параметры настраиваются в процессе обучения вместе с остальными [[Модель_алгоритма_и_ее_выбор|параметрами модели]].&lt;br /&gt;
&lt;br /&gt;
Пусть обучение модели производится с помощью пакетов &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; размера &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;B = \{x_{1},\ldots, x_{m}\}&amp;lt;/tex&amp;gt;. Здесь нормализация применяется к каждому элементу входа с номером &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; отдельно, поэтому в &amp;lt;tex&amp;gt;x^{(k)}&amp;lt;/tex&amp;gt; индекс опускается для ясности изложения. Пусть были получены нормализованные значения пакета &amp;lt;tex&amp;gt;\hat{x}_{1},\ldots, \hat{x}_{m}&amp;lt;/tex&amp;gt;. После применения операций сжатия и сдвига были получены &amp;lt;tex&amp;gt;y_{1},\ldots, y_{m}&amp;lt;/tex&amp;gt;. Обозначим данную функцию пакетной нормализации следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;BN_{\gamma, \beta}: \{x_{1},\ldots, x_{m}\} \rightarrow \{y_{1},\ldots, y_{m}\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда алгоритм пакетной нормализации можно представить так:&lt;br /&gt;
&lt;br /&gt;
 '''Вход''': значения &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из пакета &amp;lt;tex&amp;gt;B = \{x_{1},\ldots, x_{m}\}&amp;lt;/tex&amp;gt;; настраиваемые параметры &amp;lt;tex&amp;gt;\gamma, \beta&amp;lt;/tex&amp;gt;; константа &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; для вычислительной устойчивости.&lt;br /&gt;
 '''Выход''': &amp;lt;tex&amp;gt;\{y_{i} = BN_{\gamma, \beta}(x_{i})\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\mu_{B} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} x_{i}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// математическое ожидание пакета&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\sigma_{B}^{2} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} (x_{i} - \mu_{B})^{2}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// дисперсия пакета&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\hat{x}_{i} = \displaystyle \frac{x_{i} - \mu_{B}}{\sqrt{\sigma_{B}^{2} + \epsilon}}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// нормализация&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;y_{i} = \gamma \hat{x}_{i} + \beta \equiv BN_{\gamma, \beta}(x_{i}) &amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// сжатие и сдвиг&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что если &amp;lt;tex&amp;gt;\beta=\mu_{B}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\gamma=\sqrt{\sigma_{B}^{2} + \epsilon}&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;y_{i}&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;x_{i}&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;BN_{\gamma, \beta}(\cdot)&amp;lt;/tex&amp;gt; является тождественным отображением.&lt;br /&gt;
Таким образом, использование пакетной нормализации не может привести к снижению точности, поскольку оптимизатор просто может использовать нормализацию как тождественное отображение.&lt;br /&gt;
&lt;br /&gt;
==Обучение нейронных сетей с пакетной нормализацией==&lt;br /&gt;
[[Файл:BNcircuit.png|700px|thumb|Рисунок 2. [[Настройка_глубокой_сети#Граф вычислений|Граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки. Слева-направо черными стрелками показана работа алгоритма в прямом направлении. А справа-налево красными стрелками {{---}} в обратном направлении, где вычисляется градиент функции потерь. Здесь &amp;lt;tex&amp;gt;N=m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D=d&amp;lt;/tex&amp;gt;. Иллюстрация из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи].]]&lt;br /&gt;
&lt;br /&gt;
Для обучения нейронных сетей необходимо вычислять [[wikipedia:ru:Градиент|градиент]] [[wikipedia:en:Loss_function|функции потерь]] &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;. В случае использования метода пакетной нормализации градиент вычисляется следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \hat{x}_{i}} = \frac{\partial l}{\partial y_{i}} \cdot \gamma&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \sigma_{B}^{2}} = \sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot (x_{i} - \mu_{B}) \cdot \frac{-1}{2}(\sigma_{B}^{2} + \epsilon)^{-3/2}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \mu_{B}} = \left(\sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{-1}{\sqrt{\sigma_{B}^{2} + \epsilon}}\right) + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{\sum_{i=1}^{m}-2(x_{i}-\mu_{B})}{m}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (3)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial x_{i}} = \frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{1}{\sqrt{\sigma_{B}^{2} + \epsilon}} + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{2(x_{i}-\mu_{B})}{m} + \frac{\partial l}{\partial \mu_{B}} \cdot \frac{1}{m}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (4)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \gamma} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}} \cdot \hat{x}_{i}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (5)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \beta} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (6)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На Рисунке 2 изображен [[Настройка_глубокой_сети#Граф вычислений|граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки.&lt;br /&gt;
&lt;br /&gt;
В прямом направлении, как и описано в алгоритме метода, из входа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; вычисляется среднее значение по каждой размерности признакового пространства. Затем полученный вектор средних значение вычитается из каждого элемента обучающей выборки. Далее вычисляется дисперсия,  и с помощью нее вычисляется знаменатель для нормализации. Затем полученное значение инвертируется и умножается на разницу входа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и средних значений. В конце применяются параметры &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В обратном направлении вычисляются производные необходимых функций. В следующей таблице подробнее изображены шаги вычисления градиента функции потерь (иллюстрации из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи], здесь &amp;lt;tex&amp;gt;N=m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D=d&amp;lt;/tex&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| cellpadding = &amp;quot;20&amp;quot; class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаг !! Изображение !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 1&lt;br /&gt;
|[[Файл:step9.png|300px]]&lt;br /&gt;
|Сначала вычисляется производная по параметру &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, как в уравнении &amp;lt;tex&amp;gt;(6)&amp;lt;/tex&amp;gt;, так как к нему применяется только операции суммирования. И значение градиента выхода передается без изменений.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 2&lt;br /&gt;
|[[Файл:step8.png|300px]]&lt;br /&gt;
|Далее, пользуясь правилом вычисления производной при умножении, как в уравнении &amp;lt;tex&amp;gt;(5)&amp;lt;/tex&amp;gt;, вычисляется градиент по параметру &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;. Градиент выхода умножается на данную константу, получая уравнение &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;, и передается в следующий узел.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 3&lt;br /&gt;
|[[Файл:step7.png|300px]]&lt;br /&gt;
|Данный шаг вычисляется аналогично предыдущему, применяя правило вычисления производной при умножении.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 4&lt;br /&gt;
|[[Файл:step6.png|300px]]&lt;br /&gt;
|Пользуясь производной обратной величины, вычисляем следующий узел графа.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 5&lt;br /&gt;
|[[Файл:step5.png|300px]]&lt;br /&gt;
|Вычисляем производную квадратного корня с добавлением &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 6&lt;br /&gt;
|[[Файл:step4.png|300px]]&lt;br /&gt;
|Вычисляем производную суммы по всем компонентам входного вектора, получая матрицу.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 7&lt;br /&gt;
|[[Файл:step3.png|300px]]&lt;br /&gt;
|Получаем производную квадрата входящей функции.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 8&lt;br /&gt;
|[[Файл:step2.png|300px]]&lt;br /&gt;
|На данном шаге в одном узле сходятся ветки, поэтому полученные производные просто складываются, получая уравнение &amp;lt;tex&amp;gt;(2)&amp;lt;/tex&amp;gt; для производной по дисперсии.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 9&lt;br /&gt;
|[[Файл:step1.png|300px]]&lt;br /&gt;
|Аналогично шагу 6 вычисляем матрицу по сумме для производной по математическому ожиданию, получая формулу &amp;lt;tex&amp;gt;(3)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 10&lt;br /&gt;
|[[Файл:step0.png|300px]]&lt;br /&gt;
|В начальной вершине получаем уравнение &amp;lt;tex&amp;gt;(4)&amp;lt;/tex&amp;gt;, складывая входящие производные.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Пакетная нормализация в [[Сверточные нейронные сети | свёрточных сетях]]==&lt;br /&gt;
Пакетная нормализация может быть применена к любой функции активации. Рассмотрим подробнее случай аффинного преобразования с некоторой нелинейной функцией:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;z = g(Wu + b)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;W&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} настраиваемые параметры модели, а &amp;lt;tex&amp;gt;g(\cdot)&amp;lt;/tex&amp;gt; {{---}} некоторая нелинейная функция, например [[Практики реализации нейронных сетей#Sigmoid function|cигмоида]] или [[Практики реализации нейронных сетей#Rectified Linear Units (ReLU)|ReLU]]. Данной функцией можно описать как обычные, так и сверточные слои нейронных сетей. Пакетная нормализация применяется сразу перед функцией &amp;lt;tex&amp;gt;g(\cdot)&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;x = Wu + b&amp;lt;/tex&amp;gt;. Параметр &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; может быть опущен, так как в дальнейших вычислениях его роль будет играть параметр &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. Поэтому &amp;lt;tex&amp;gt;z = g(Wu + b)&amp;lt;/tex&amp;gt; может быть записано так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;z = g(BN(Wu))&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;BN&amp;lt;/tex&amp;gt; применяется отдельно к каждой размерности &amp;lt;tex&amp;gt;x=Wu&amp;lt;/tex&amp;gt; с отдельной парой параметров &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; для каждой размерности.&lt;br /&gt;
&lt;br /&gt;
В случае свёрточных сетей, дополнительно необходима нормализация, чтобы удовлетворить свойство свёрточных сетей, что различные элементы в разных местах одной карты признаков (образ операции свёртки, англ. feature map) должны быть нормализованы одинаково. Чтобы этого добиться, нормализация выполняется совместно над всеми значениями в пакете. Пусть &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; {{---}} множество всех значений в карте признаков по всему пакету и всем точкам в карте признаков. Тогда для пакета размера &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; и карты признаков размера &amp;lt;tex&amp;gt;p \times q&amp;lt;/tex&amp;gt; размер &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;m'=|B|=m \cdot pq&amp;lt;/tex&amp;gt;. Тогда параметры &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; настраиваются для каждой карты признаков отдельно.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
[[File:bn_exp_1.png|300px|thumb|Рисунок 3. Точность распознавания в зависимости от итерации обучения. Оранжевая кривая изображает результаты для модели с использованием пакетной нормализации, синяя кривая {{---}} без. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]]&lt;br /&gt;
[[File:bn_exp_2.png|300px|thumb|Рисунок 4. Точность распознавания в зависимости от итерации обучения c использованием сигмоиды в качетсве функции активации. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]]&lt;br /&gt;
&lt;br /&gt;
Приведем пример демонстрирующий работу пакетной нормализации. &lt;br /&gt;
Рассмотрим задачу распознавания рукописных цифр на известном датасете MNIST &amp;lt;ref&amp;gt;[http://yann.lecun.com/exdb/mnist/ Датасет MNIST]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
Для решения задачи будет использоваться обычная нейронная сеть с &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; скрытыми полносвязными слоями по &amp;lt;tex&amp;gt;100&amp;lt;/tex&amp;gt; узлов в каждом. &lt;br /&gt;
Функция активации {{---}} ReLU. &lt;br /&gt;
Выходной слой содержит &amp;lt;tex&amp;gt;10&amp;lt;/tex&amp;gt; узлов. &lt;br /&gt;
Размер пакета равен &amp;lt;tex&amp;gt;60&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Сравниваются две одинаковые модели, но в первой перед каждым скрытым слоем используется пакетная нормализация, а во второй {{---}} нет. &lt;br /&gt;
Темп обучения равен &amp;lt;tex&amp;gt;0.01&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Веса инициализированы значениями с малой дисперсией. &lt;br /&gt;
&lt;br /&gt;
На Рисунке 3 изображены два графика, показывающие разницу между моделями. &lt;br /&gt;
Как видно, обе модели достигли высокой точности, но модель с использованием пакетной нормализации достигла точности более &amp;lt;tex&amp;gt;90\%&amp;lt;/tex&amp;gt; быстрее, почти сразу, и достигла максимума, примерно, уже на &amp;lt;tex&amp;gt;10000&amp;lt;/tex&amp;gt; итераций. Однако, модель без пакетной нормализации достигла скорости обучения примерно &amp;lt;tex&amp;gt;510&amp;lt;/tex&amp;gt; пакетов в секунду, а модель с использованием пакетной нормализации {{---}} &amp;lt;tex&amp;gt;270&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Однако, как можно видеть, пакетная нормализация позволяет выполнить меньшее количество итераций и, в итоге, сойтись за меньшее время.&lt;br /&gt;
&lt;br /&gt;
На Рисунке 4 изображен график, сравнивающий точно такие же модели, но с использованием сигмоиды в качестве функции активации. &lt;br /&gt;
Такая конфигурация моделей требует большего времени, чтобы начать обучение. &lt;br /&gt;
В итоге, модель обучается, но на это потребовалось более &amp;lt;tex&amp;gt;45000&amp;lt;/tex&amp;gt; итераций, чтобы получить точность более &amp;lt;tex&amp;gt;80\%&amp;lt;/tex&amp;gt;. &lt;br /&gt;
При использовании пакетной нормализации получилось достичь точность более &amp;lt;tex&amp;gt;90\%&amp;lt;/tex&amp;gt; примерно за &amp;lt;tex&amp;gt;1000&amp;lt;/tex&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
==Реализации==&lt;br /&gt;
Механизм пакетной нормализации реализован практически во всех современных инструментариях для машинного обучения, таких как: TensorFlow &amp;lt;ref&amp;gt;[https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization TensorFlow]&amp;lt;/ref&amp;gt;, Keras &amp;lt;ref&amp;gt;[https://keras.io/layers/normalization/ Keras]&amp;lt;/ref&amp;gt;, CNTK &amp;lt;ref&amp;gt;[https://docs.microsoft.com/en-us/cognitive-toolkit/BatchNormalization CNTK]&amp;lt;/ref&amp;gt;, Theano &amp;lt;ref&amp;gt;[http://deeplearning.net/software/theano/library/tensor/nnet/bn.html Theano]&amp;lt;/ref&amp;gt;, PyTorch &amp;lt;ref&amp;gt;[https://pytorch.org/docs/stable/_modules/torch/nn/modules/batchnorm.html PyTorch]&amp;lt;/ref&amp;gt; и т.д.&lt;br /&gt;
&lt;br /&gt;
Приведем пример&amp;lt;ref&amp;gt;[https://towardsdatascience.com/batch-normalization-theory-and-how-to-use-it-with-tensorflow-1892ca0173ad Batch normalization: theory and how to use it with Tensorflow]&amp;lt;/ref&amp;gt; применения пакетной нормализации с использованием библиотеки TensorFlow на языке программирования Python &amp;lt;ref&amp;gt;[https://www.python.org/ Язык программирования Python]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''import''' tensorflow '''as''' tf&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  is_train = tf.placeholder(tf.bool, name=&amp;quot;is_train&amp;quot;);&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  x_norm = tf.layers.batch_normalization(x, training=is_train)&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)&lt;br /&gt;
  '''with''' tf.control_dependencies(update_ops):&lt;br /&gt;
      train_op = optimizer.minimize(loss)&lt;br /&gt;
&lt;br /&gt;
==Модификации==&lt;br /&gt;
Существует несколько модификаций и вариаций метода пакетной нормализации:&lt;br /&gt;
# Тим Койманс&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1603.09025.pdf Cooijmans T. {{---}} Recurrent batch normalization, 2016]&amp;lt;/ref&amp;gt; в 2016 г. предложил способ применения пакетной нормализации к [[Рекуррентные нейронные сети|рекуррентным нейронным сетям]];&lt;br /&gt;
# Расширение метода пакетной нормализации было предложено Ликси Хуангом&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1804.08450.pdf Huang L. {{---}} Decorrelated Batch Normalization, 2018]&amp;lt;/ref&amp;gt; в 2018 г. Метод получил название декоррелированная пакетная нормализация (англ. Decorrelated Batch Normalization). В данном методе кроме операций масштабирования и сдвига была предложено использование специальной функции затирания данных; &lt;br /&gt;
# Джимми Лей Ба&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1607.06450.pdf Ba J. L., Kiros J. R., Hinton G. E. {{---}} Layer normalization, 2016]&amp;lt;/ref&amp;gt; в 2016 г. предложил метод нормализации слоев (англ. Layer Normalization), который решает проблему выбора размера пакета;&lt;br /&gt;
# В работе Сергея Иоффе&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1702.03275.pdf Ioffe S. {{---}} Batch renormalization: Towards reducing minibatch dependence in batch-normalized models, 2017]&amp;lt;/ref&amp;gt; в 2017 г. было представлено расширение метода пакетной нормализации: пакетная ренормализация (англ. Batch Renormalization). Данный метод улучшает пакетную нормализацию, когда размер пакетов мал и не состоит из независимых данных;&lt;br /&gt;
# Метод потоковой нормализации (англ. Streaming Normalization) был предложен Кифэном Ляо&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1610.06160.pdf Liao Q., Kawaguchi K., Poggio T. {{---}} Streaming normalization: Towards simpler and more biologically-plausible normalizations for online and recurrent learning, 2016]&amp;lt;/ref&amp;gt; в 2016 г. Данный метод убирает два ограничения пакетной нормализации: использование при [[wikipedia:ru:Онлайновое_обучение_машин|online-обучении]] и использование в рекуррентных нейронных сетях.&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;
* [https://arxiv.org/pdf/1502.03167.pdf Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift]&lt;br /&gt;
* [https://towardsdatascience.com/batch-normalization-in-neural-networks-1ac91516821c Glossary of Deep Learning: Batch Normalisation]&lt;br /&gt;
* [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html Understanding the backward pass through Batch Normalization Layer]&lt;br /&gt;
* [https://medium.com/@SeoJaeDuk/deeper-understanding-of-batch-normalization-with-interactive-code-in-tensorflow-manual-back-1d50d6903d35 Deeper Understanding of Batch Normalization with Interactive Code in Tensorflow]&lt;br /&gt;
* [https://www.learnopencv.com/batch-normalization-in-deep-networks/ Batch Normalization in Deep Networks]&lt;br /&gt;
* [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb Batch Normalization {{---}} Lesson]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69678</id>
		<title>Глубокое обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69678"/>
				<updated>2019-01-30T20:16:39Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Ml_areas.jpg|thumb|250px|Глубокое обучение как часть машинного обучения.]]&lt;br /&gt;
&lt;br /&gt;
'''Глубокое обучение''' (англ. deep learning) {{---}} совокупность широкого семейства методов машинного обучения, основанных на имитации работы человеческого мозга в процессе обработки данных и создания паттернов, используемых для принятия решений&amp;lt;ref&amp;gt;[https://www.investopedia.com/terms/d/deep-learning.asp Deep Learning, Investopedia]&amp;lt;/ref&amp;gt;. Как правило, глубокое обучение предназначено для работы с большими объемами данных и использует сложные алгоритмы для обучения модели&amp;lt;ref&amp;gt;[https://www.quora.com/What-is-the-difference-between-Neural-Networks-and-Deep-Learning The difference between neural networks and deep learning]&amp;lt;/ref&amp;gt;. На больших датасетах глубокое обучение показывает более высокую точность результатов в сравнении с традиционным машинным обучением. Зависимость производительности (качества результатов) от объема данных представлена на рисунке ниже.&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Perfm_data.jpg|border|450px|thumb|left|Зависимость производительности от объема данных.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что данный раздел машинного обучения появился еще в 1980-х, до недавнего времени его применение было сильно ограничено из-за недостатка вычислительных мощностей существовавших компьютеров. Ситуация изменилась только в середине 2000-х.&lt;br /&gt;
&lt;br /&gt;
На создание моделей глубокого обучения оказали влияние некоторые процессы и паттерны, происходящие в биологических нейронных системах. Несмотря на это, данные модели во многом отличаются от биологического мозга (и в структуре и в функциях), что делает невозможным использование теорем и доказательств, применяющихся в нейробиологии.&lt;br /&gt;
&lt;br /&gt;
== История ==&lt;br /&gt;
* 1943 {{---}} Искусственный нейрон Маккаллока — Питтса&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} узел искусственной нейронной сети, являющийся упрощённой моделью естественного нейрона;&lt;br /&gt;
* 1949 {{---}} Принцип обучения нейронов Хебба&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hebbian_theory Hebbian theory, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} изначально наблюдаемая причинно-следственная связь между активациями пре- и постсинаптического нейрона имеет тенденцию к усилению;&lt;br /&gt;
* 1957 {{---}} Модель перцептрона предложена Фрэнком Розенблаттом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} математическая или компьютерная модель восприятия информации мозгом;&lt;br /&gt;
* 1960 {{---}} Дельта-правило обучения перцептрона&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Delta_rule Delta rule, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} метод обучения перцептрона по принципу градиентного спуска по поверхности ошибки;&lt;br /&gt;
* 1969 {{---}} Выход книги Марвина Минска и Сеймура Паперта &amp;quot;Перцептроны&amp;quot;&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptrons_(book) Perceptrons book, WIkipedia]&amp;lt;/ref&amp;gt;. В данной книге математически показаны ограничения перцептронов;&lt;br /&gt;
* 1974 {{---}} Метод обратного распространения ошибки впервые предложен А. И. Галушкиным и Дж. Вербосом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Backpropagation Backpropagation, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} метод вычисления градиента, который используется при обновлении весов многослойного перцептрона;&lt;br /&gt;
* 1980 {{---}} Первая свёрточная нейронная сеть предложена Кунихико Фукусимой&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Convolutional_neural_network Convolutional_neural_network, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} специальная архитектура искусственных нейронных сетей использующая некоторые особенности зрительной коры;&lt;br /&gt;
* 1982 {{---}} Рекуррентные нейронные сети предложены Д. Хопфилдом {{---}} вид нейронных сетей, где связи между элементами образуют направленную последовательность;&lt;br /&gt;
* 1991 {{---}} Проблема &amp;quot;исчезающего&amp;quot; градиента была сформулирована С. Хочрейтом. Проблема &amp;quot;исчезающего&amp;quot; градиента заключается в быстрой потере информации с течением времени;&lt;br /&gt;
* 1997 {{---}} Долгая краткосрочная память предложена С. Хочрейтом и Ю. Шмидхубером&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Long_short-term_memory Long short-term memory, Wikipedia]&amp;lt;/ref&amp;gt;. В отличие от традиционных рекуррентных нейронных сетей, LSTM-сеть хорошо приспособлена к обучению на задачах классификации, обработки и прогнозирования временных рядов в случаях, когда важные события разделены временными промежутками с неопределённой продолжительностью и границами;&lt;br /&gt;
* 1998 {{---}} Градиентный спуск для сверточных нейронных сетей предложен Я. Лекуном;&lt;br /&gt;
* 2006 {{---}} Публикации Г. Хинтона, С. Осиндера и Я. Теха об обучении сетей глубокого доверия. Данные публикации, а также их активное освещение в средствах массовой информации смогли привлечь внимание ученых и разработчиков со всего мира к глубоким сетям;&lt;br /&gt;
* 2012 {{---}} Предложение дропаута Г. Хинтоном, А. Крижевски и И. Шутковичем&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Dropout_(neural_networks) Dropout, Wikipedia]&amp;lt;/ref&amp;gt;. Дропаут (от англ. dropout) {{---}} метод регуляризации искусственных нейронных сетей, предназначен для предотвращения переобучения сети;&lt;br /&gt;
* 2012 {{---}} Нейронные сети побеждают в ImageNet Challenge&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/ImageNet#ImageNet_Challenge ImageNet Challenge, Wikipedia]&amp;lt;/ref&amp;gt;. Данное событие ознаменовало начало эры нейронных сетей и глубокого обучения;&lt;br /&gt;
* 2014 {{---}} Группа исследователей под руководством Зеппа Хохрейтера использовала глубокое обучение для определения токсичного воздействия лекарств и бытовых средств на окружающую среду. Данна работа была отмечена первым местом на соревновании &amp;quot;Tox21 Data Challenge&amp;quot;&amp;lt;ref&amp;gt;[https://tripod.nih.gov/tox21/challenge/leaderboard.jsp Tox21 Data Challenge Winners]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* 2016 {{---}} Программа для игры в го Google AlphaGo выиграла со счётом 4:1 у Ли Седоля, лучшего международного игрока в эту игру. AlphaGo, разработанная DeepMind, использует глубокое обучение с помощью многоуровневых нейронных сетей;&lt;br /&gt;
* 2018 {{---}} Глубокое обучение впервые используется для планирования лучевой терапии&amp;lt;ref&amp;gt;[https://aapm.onlinelibrary.wiley.com/doi/abs/10.1002/mp.13271 Automatic treatment planning based on three‐dimensional dose distribution predicted from deep learning technique]&amp;lt;/ref&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;
* Может сочетать алгоритмы [[Обучение с учителем | обучения с учителем]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (пример {{---}} классификация) и [[Обучение без учителя | без учителя ]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;  (пример {{---}} анализ образца);&lt;br /&gt;
* Формирует в процессе обучения слои выявления признаков на нескольких уровнях представлений, которые соответствуют различным уровням абстракции; при этом признаки организованы иерархически {{---}} признаки более высокого уровня являются производными от признаков более низкого уровня;&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Network_dif.png|border|550px|thumb|left|Глубокие и неглубокие нейронные сети.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
== Применения ==&lt;br /&gt;
* Распознавание речи&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Speech_recognition Speech recognition, Wikipedia]&amp;lt;/ref&amp;gt;. Все основные коммерческие системы распознавания речи (например, Microsoft Cortana, Xbox, Skype Translator, Amazon Alexa, Google Now, Apple Siri, Baidu и iFlyTek) основаны на глубоком обучении;&lt;br /&gt;
* [[:Задача нахождения объектов на изображении | Компьютерное зрение]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. На сегодняшний день системы распознавания образов основанные на глубоком обучении уже умеют давать более точные результаты, чем человеческий глаз&amp;lt;ref&amp;gt;[https://www.sciencedirect.com/science/article/pii/S0893608012000524 Multi-column deep neural network for traffic sign classification]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* Обработка естественного языка&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Natural_language_processing Natural language processing, Wikipedia]&amp;lt;/ref&amp;gt;. Нейронные сети использовались для реализации языковых моделей еще с начала 2000-х годов. Изобретение LSTM помогло улучшить машинный перевод и языковое моделирование&amp;lt;ref&amp;gt;[https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf Sequence to Sequence Learning with Neural Networks]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* Обнаружение новых лекарственных препаратов. К примеру, нейронная сеть AtomNet использовалась для прогнозирования новых биомолекул {{---}} кандидатов для лечения таких заболевания, как вирус Эбола и рассеянный склероз;&lt;br /&gt;
* Рекомендательные системы&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Recommender_system Recommender system, Wikipedia]&amp;lt;/ref&amp;gt;. На сегодняшний день глубокое обучение применяется для изучения пользовательских предпочтений во многих доменах;&lt;br /&gt;
* Предсказание генномных онтологий в биоинформатике&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deep_learning#Bioinformatics Deep learning in bioinformatics, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полный список возможных применений глубокого обучения&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deep_learning#Applications Applications of deep learning, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Transfer learning ==&lt;br /&gt;
[[Файл:Transfer.jpeg|border|450px|thumb|Transfer learning. Иллюстрация из [https://habr.com/company/binarydistrict/blog/428255/ статьи] на habr.com.]]&lt;br /&gt;
'''Transfer learning''' {{---}} это применение к решению задачи знаний, извлеченных нейронной сетью при решении другой задачи. &lt;br /&gt;
&lt;br /&gt;
Глубокие нейронные сети требуют больших объемов данных для сходимости обучения. Поэтому часто встречается ситуация, когда для решаемой задачи недостаточно данных для того, чтобы хорошо натренировать все слои нейросети. Для решения этой проблемы и используется '''transfer learning'''&amp;lt;ref&amp;gt;[https://habr.com/company/binarydistrict/blog/428255/ Transfer Learning: как быстро обучить нейросеть на своих данных, habr.com]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Чаще всего '''transfer learning''' выглядит следующим образом: к натренированной на определенную задачу нейросети добавляется еще несколько скрытый слоев, которые позволяют использовать уже полученные знания для решения более конкретной задачи. Например, знания, полученные при обучении распознаванию различных предметов, могут применяться при решении задачи распознавания еды.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:{{{1|both}}};&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Фреймворки для глубокого обучения ==&lt;br /&gt;
* TensorFlow&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/TensorFlow TensorFlow, Wikipedia]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* Microsoft Cognitive Toolkit&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Microsoft_Cognitive_Toolkit Microsoft Cognitive Toolkit, Wikipedia]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* Wolfram Mathematica&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Wolfram_Mathematica Wolfram Mathematica, Wikipedia]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* Keras&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Keras Keras, Wikipedia]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* Deeplearning4j&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deeplearning4j Deeplearning4j, Wikipedia]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* Caffe&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Caffe_(software) Caffe, Wikipedia]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* Torch/PyTorch&amp;lt;ref&amp;gt;[https://habr.com/post/334380 PyTorch — ваш новый фреймворк глубокого обучения, habr]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* MXNet&amp;lt;ref&amp;gt;[https://mxnet.apache.org MXNet, official site]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* Chainer&amp;lt;ref&amp;gt;[https://chainer.org Chainer, official site]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Сопоставление фреймворков, библиотек и отдельных программ для глубокого обучения&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Comparison_of_deep_learning_software Comparison of deep learning software, Wikipedia]&amp;lt;/ref&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;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Deep_learning Deep learning, Wikipedia]&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/Глубокое_обучение Глубокое обучение, Wikipedia]&lt;br /&gt;
* [http://www.deeplearningbook.org/ Deep Learning Book, MIT]&lt;br /&gt;
* [https://towardsdatascience.com/multi-layer-neural-networks-with-sigmoid-function-deep-learning-for-rookies-2-bf464f09eb7f Multi-Layer Neural Networks with Sigmoid Function, Towards Data Science]&lt;br /&gt;
* [https://www.kaggle.com/dansbecker/rectified-linear-units-relu-in-deep-learning Rectified Linear Units (ReLU) in Deep Learning, Kaggle]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=69677</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=69677"/>
				<updated>2019-01-30T20:13:40Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики {{---}} неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей''' (англ. kNN {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; Nearest Neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших к нему объектов обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает и ситуации неоднозначности всё равно могут возникать. Тогда &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-му соседу приписывается вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, как правило, убывающий с ростом ранга соседа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Объект относится к тому классу, который набирает больший суммарный вес среди &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot; &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция не отрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; (поскольку чем дальше объект, тем меньший вклад он должен вносить в пользу своего класса).&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается константа &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
[[Файл:SimpleKnnExample.png|frame|none|super|upright=1|Пример классификации, методом 5 ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании линейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило, используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 28.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей можно обобщить с помощью функции ядра. Рассмотрим два способа, которыми это можно сделать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
# Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке;&lt;br /&gt;
&lt;br /&gt;
# Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|frame|none|super|upright=1|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известна хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать преобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеять лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим использование алгоритма &amp;lt;tex&amp;gt;kNN&amp;lt;/tex&amp;gt; на примере [https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29 реального набора данных].&lt;br /&gt;
Предположим, что мы загрузили &amp;lt;tex&amp;gt;wdbc.data&amp;lt;/tex&amp;gt; и сохранили как &amp;lt;tex&amp;gt;tr.csv&amp;lt;/tex&amp;gt; с заголовком {{---}} описанием признаков.&lt;br /&gt;
&lt;br /&gt;
* Загружаем данные&lt;br /&gt;
&lt;br /&gt;
  '''import''' pandas '''as''' pd    &lt;br /&gt;
  '''from''' sklearn.preprocessing '''import''' StandardScaler    &lt;br /&gt;
&lt;br /&gt;
  '''def''' load_data(data_path):&lt;br /&gt;
      ds = pd.read_csv(data_path, names=[&amp;quot;id&amp;quot;, &amp;quot;diagnosis&amp;quot;, &amp;quot;radius_mean&amp;quot;, &amp;quot;texture_mean&amp;quot;, &amp;quot;perimeter_mean&amp;quot;, &amp;quot;area_mean&amp;quot;,&lt;br /&gt;
                                       &amp;quot;smoothness_mean&amp;quot;, &amp;quot;compactness_mean&amp;quot;, &amp;quot;concavity_mean&amp;quot;, &amp;quot;concave points_mean&amp;quot;,&lt;br /&gt;
                                       &amp;quot;symmetry_mean&amp;quot;, &amp;quot;fractal_dimension_mean&amp;quot;, &amp;quot;radius_se&amp;quot;, &amp;quot;texture_se&amp;quot;,&lt;br /&gt;
                                       &amp;quot;perimeter_se&amp;quot;, &amp;quot;area_se&amp;quot;, &amp;quot;smoothness_se&amp;quot;, &amp;quot;compactness_se&amp;quot;, &amp;quot;concavity_se&amp;quot;,&lt;br /&gt;
                                       &amp;quot;concave points_se&amp;quot;, &amp;quot;symmetry_se&amp;quot;, &amp;quot;fractal_dimension_se&amp;quot;, &amp;quot;radius_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;texture_worst&amp;quot;, &amp;quot;perimeter_worst&amp;quot;, &amp;quot;area_worst&amp;quot;, &amp;quot;smoothness_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;compactness_worst&amp;quot;, &amp;quot;concavity_worst&amp;quot;, &amp;quot;concave points_worst&amp;quot;, &amp;quot;symmetry_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;fractal_dimension_worst&amp;quot;])&lt;br /&gt;
      y = ds['diagnosis']&lt;br /&gt;
      X = ds.drop('diagnosis', axis=1)&lt;br /&gt;
      X = X.drop('id', axis=1)&lt;br /&gt;
      i = len(X.columns)&lt;br /&gt;
      X = X.drop(X.columns[i - 1], axis=1)&lt;br /&gt;
      y.replace(('M', 'B'), (1, 0), inplace=True)&lt;br /&gt;
      sc = StandardScaler()&lt;br /&gt;
      sc.fit(X)&lt;br /&gt;
      X_ans = sc.transform(X)&lt;br /&gt;
      return X_ans, y&lt;br /&gt;
&lt;br /&gt;
  X, y = load_data(&amp;quot;tr.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} нормированные значения признаков и соответствующие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество:&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор:&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся:&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation):&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 model_params = best_model.get_params()&lt;br /&gt;
 tuned_params = {}&lt;br /&gt;
 for k, v in model_params.items():&lt;br /&gt;
     tuned_params[k] = [v]&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора:&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 predicted = best_model.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
* Выводим результат:&lt;br /&gt;
 print('Used params:', best_params)&lt;br /&gt;
 print('Evaluation:\n', metrics.classification_report(y_test, predicted))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Used params''': {'metric_params': None, 'metric': 'euclidean', 'weights': 'distance', 'n_neighbors': 9, 'leaf_size': 30, 'n_jobs': 4, 'p': 2, 'algorithm': 'auto'}&lt;br /&gt;
   '''Evaluation:'''&lt;br /&gt;
                   precision    recall  f1-score   support&lt;br /&gt;
               0       0.90      1.00      0.95        69&lt;br /&gt;
               1       1.00      0.82      0.90        45&lt;br /&gt;
       micro avg       0.93      0.93      0.93       114&lt;br /&gt;
       macro avg       0.95      0.91      0.92       114&lt;br /&gt;
    weighted avg       0.94      0.93      0.93       114&lt;br /&gt;
&lt;br /&gt;
==Пример на языке Scala==&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.knn&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#knn Smile, KNN]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''toy: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = toy.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = toy.y().map(_.toInt)&lt;br /&gt;
  '''val '''KNN: KNN[Array['''Double''']] = knn(x, y, 3)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(KNN.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, KNN)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Уменьшение размерности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN kNN] - статья на machinelearning.ru про kNN&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про kNN] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;br /&gt;
# [https://www.kaggle.com/jeffbrown/knn-classifier/data kaggle example] - пример по работе с датасетом с kaggle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Метрический классификатор]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BB%D0%B5%D1%81&amp;diff=69676</id>
		<title>Дерево решений и случайный лес</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BB%D0%B5%D1%81&amp;diff=69676"/>
				<updated>2019-01-30T20:07:24Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Дерево решений {{---}} логический алгоритм классификации, решающий задачи классификации и регрессии. Представляет собой объединение логических условий в структуру дерева.&lt;br /&gt;
&lt;br /&gt;
==Дерево решений==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1. &lt;br /&gt;
|neat = &lt;br /&gt;
|definition=&lt;br /&gt;
'''Дерево решений''' (англ. ''decision tree, DT'') {{---}} алгоритм классификации &amp;lt;tex&amp;gt;a(x) = (V_{внутр}, v_0, V_{лист}, S_v, \beta_v)&amp;lt;/tex&amp;gt;, задающийся деревом (связным ациклическим графом), где:&lt;br /&gt;
* &amp;lt;tex&amp;gt; V = V_{внутр} \cup V_{лист} &amp;lt;/tex&amp;gt; {{---}} множество вершин , &amp;lt;tex&amp;gt;v_0 \in V&amp;lt;/tex&amp;gt; {{---}} корень дерева;&lt;br /&gt;
* &amp;lt;tex&amp;gt; S_v : D_v \rightarrow V_v &amp;lt;/tex&amp;gt; {{---}} функция перехода по значению предиката в множество детей вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \beta_v : X \rightarrow D_v &amp;lt;/tex&amp;gt; {{---}} предикат ветвления, &amp;lt;tex&amp;gt;v \in V_{внутр}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|D_v| &amp;lt; \infty&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* Для листьев &amp;lt;tex&amp;gt;v \in V_{лист}&amp;lt;/tex&amp;gt; определена метка класса &amp;lt;tex&amp;gt;y_v \in Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Бинарное дерево решений''' {{---}}  частный случай дерева решений, для которого &amp;lt;tex&amp;gt; D_v = \{0,1\} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:BinDT.jpg |300px|thumb|right|Классификация объекта &amp;lt;tex&amp;gt; x \in X &amp;lt;/tex&amp;gt; бинарным решающим деревом]]&lt;br /&gt;
&lt;br /&gt;
 '''function''' classify(x):&lt;br /&gt;
   &amp;lt;tex&amp;gt;v = v_0&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\beta_v(x) = 1 &amp;lt;/tex&amp;gt; &lt;br /&gt;
      &amp;lt;tex&amp;gt;v := R_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''else'''&lt;br /&gt;
      &amp;lt;tex&amp;gt;v := L_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информативность ветвления===&lt;br /&gt;
Для того, чтобы оценивать качество разбиения объектов по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, введем понятие ''информационного выигрыша'' разбиения. &amp;lt;br&amp;gt;&lt;br /&gt;
Сначала оценим распределение значений классов объектов внутри каждого множества из разбиения, введя понятие ''меры неопределенности распределения''.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Частотная оценка вероятности класса &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; в вершине &amp;lt;tex&amp;gt;v \in V_{внутр}&amp;lt;/tex&amp;gt; ''': &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;p_y = P(y | x \in U) = \frac{1}{|U|} \sum\nolimits_{x_i \in U}[y_i = y]&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Мера неопределенности (англ. ''impurity'') распределения &amp;lt;tex&amp;gt;p_y&amp;lt;/tex&amp;gt;''': &amp;lt;br&amp;gt;&lt;br /&gt;
* минимальна, когда &amp;lt;tex&amp;gt;p_y \in \{0,1\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* максимальна, когда &amp;lt;tex&amp;gt;p_y = \frac{1}{|Y|}&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* не зависит от перенумерации классов&lt;br /&gt;
&amp;lt;tex&amp;gt;Ф(U) = \sum\nolimits_{y \in Y} p_y L(p_y) = \frac{1}{|U|} \sum\nolimits_{x_i \in U}L(P(y_i | x_i \in U)) \rightarrow min&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt; где &amp;lt;tex&amp;gt;L(p)&amp;lt;/tex&amp;gt; убывает и &amp;lt;tex&amp;gt;L(1) = 0&amp;lt;/tex&amp;gt;, например: &amp;lt;tex&amp;gt;-log_2(p)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;1 - p&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;1 - p^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Примерами мер неопределенности распределения являются: &lt;br /&gt;
* Энтропия: &amp;lt;tex&amp;gt;Ф(U) = -\sum\limits_{i}^N p_i log_2p_i&amp;lt;/tex&amp;gt;, определяется для каждого множества из разбиения, &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; {{---}} количество возможных классов, и &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; {{---}} вероятность объекта принадлежать &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt;-ому классу.&lt;br /&gt;
* Критерий Джини: &amp;lt;tex&amp;gt;Ф(U) = \sum\nolimits_{i != j}p_i p_j = \sum\nolimits_{i}p_i*(1-p_i)&amp;lt;/tex&amp;gt;, максимизацию этого критерия можно интерпретировать как максимизацию числа пар объектов одного класса, оказавшихся после разбиения в одном множестве. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь определим суммарную ''неопределенность распределения'' в разбиении.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Неопределенность распределения &amp;lt;tex&amp;gt;P(y_i | x_i \in U_{\beta(x_i)})&amp;lt;/tex&amp;gt; после ветвления вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; и разбиения &amp;lt;tex&amp;gt;U = \bigcup_{k \in D_v} U_k&amp;lt;/tex&amp;gt;''': &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Ф(U_0, ... ,U_{D_v}) = \frac{1}{|U|} \sum\nolimits_{k \in D_v} \sum\nolimits_{x_i \in U_k}L(P(y_i | x_i \in U_k)) = \sum\nolimits_{k \in D_v} \frac{|U_k|}{|U|}Ф(U_k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
''Информационный выигрыш'' от разбиения определяется как изменение неопределенности в системе.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Информационный выигрыш от разбиения по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;''' &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Gain(\beta, U) = Ф(U) - Ф(U_1, ... ,U_{|D_v|}) = Ф(U) - \sum\nolimits_{k \in D_v} \frac{|U_k|}{|U|}Ф(U_k) \rightarrow max_{\beta \in B} &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Рекурсивный алгоритм построения бинарного дерева решений ID3 ===&lt;br /&gt;
Покажем идею построения дерева решения на частном случае бинарного дерева. Алгоритм &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt; (англ. ''Induction of Decision Tree'') заключается в последовательном дроблении выборки на две части до тех пор, пока в каждой части не окажутся объекты только одного класса. Разделение производится по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, который выбирается из множества элементарных предикатов. На практике в качестве элементарных предикатов чаще всего берут простые пороговые условия вида &amp;lt;tex&amp;gt;\beta(x) = [f_j(x) &amp;gt;= d_j]&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;Проще всего записать этот алгоритм в виде рекурсивной процедуры &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt;, которая строит дерево по заданной подвыборке &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; и возвращает его корневую вершину. &lt;br /&gt;
&lt;br /&gt;
 1:'''function''' ID3(&amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;):&lt;br /&gt;
 2:   '''if''' &amp;lt;tex&amp;gt;for all&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;u \in U&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;y_u = y&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// создать листовую вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; c меткой класса &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 3:      v = createLeafVertex(&amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 4:      '''return''' v&lt;br /&gt;
      &amp;lt;font color=green&amp;gt;// найти предикат с максимальным информационным выигрышом &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;\beta= \mathrm{arg}\max_{\beta\in B} &amp;lt;/tex&amp;gt; Gain(&amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;)&lt;br /&gt;
      &amp;lt;font color=green&amp;gt;// разбить выборку на две части &amp;lt;tex&amp;gt;U = U_0 \cup U_1&amp;lt;/tex&amp;gt; по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 5:   &amp;lt;tex&amp;gt;U_0 := \{x \in U: \beta(x) = 0\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 6:   &amp;lt;tex&amp;gt;U_1 := \{x \in U: \beta(x) = 1\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 7:   '''if''' &amp;lt;tex&amp;gt;U_0 = \emptyset&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;U_1 = \emptyset&amp;lt;/tex&amp;gt; &lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// найти класс, в котором находится большинство объектов из &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 8:      &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; = majorClass(&amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 9:      v = createLeafVertex(&amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;)&lt;br /&gt;
      '''else'''&lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// создать внутреннюю вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 10:     v = createVertex()&lt;br /&gt;
 11:     &amp;lt;tex&amp;gt;\beta_v = \beta&amp;lt;/tex&amp;gt;&lt;br /&gt;
 12:     &amp;lt;tex&amp;gt;S_0&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;U_0&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 13:     &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;U_1&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 14:  '''return''' &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Редукция решающих деревьев ==&lt;br /&gt;
Суть редукции (англ. ''pruning'') состоит в удалении поддеревьев, имеющих недостаточную статистическую надёжность. При этом дерево перестаёт безошибочно классифицировать обучающую выборку, зато качество классификации новых объектов, как правило, улучшается. Рассмотрим наиболее простые варианты редукции.&lt;br /&gt;
&lt;br /&gt;
===Предредукция===&lt;br /&gt;
Предредукция (англ. ''pre-pruning'') или критерий раннего останова досрочно прекращает дальнейшее ветвление в вершине дерева, если информативность &amp;lt;tex&amp;gt;I(\beta, U)&amp;lt;/tex&amp;gt; для всех возможных предикатов &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; не дотягивает до заданного порогового значения &amp;lt;tex&amp;gt;I_0&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Для этого на шаге 8 алгоритма &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt; условие &amp;lt;tex&amp;gt;U_0 = \emptyset&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;U_1 = \emptyset&amp;lt;/tex&amp;gt;  заменяется условием &amp;lt;tex&amp;gt;I(\beta, U) &amp;lt;= I_0 &amp;lt;/tex&amp;gt;. Порог &amp;lt;tex&amp;gt;I_0 &amp;lt;/tex&amp;gt; является управляющим параметром метода. &amp;lt;br&amp;gt;&lt;br /&gt;
Предредукция считается не самым эффективным способом избежать переобучения, так как жадное ветвление по-прежнему остаётся глобально неоптимальным. Более эффективной считается cтратегия постредукции.&lt;br /&gt;
&lt;br /&gt;
===Постредукция===&lt;br /&gt;
Постредукция (англ. ''post-pruning'') просматривает все внутренние вершины дерева и заменяет отдельные вершины либо одной из дочерних вершин (при этом вторая дочерняя удаляется), либо терминальной вершиной. Процесс замен продолжается до тех&lt;br /&gt;
пор, пока в дереве остаются вершины, удовлетворяющие критерию замены. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
''Критерием замены'' является сокращение числа ошибок на контрольной выборке, отобранной заранее, и не участвовавшей в обучении дерева. Стандартная рекомендация — оставлять в контроле около 30% объектов. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Для реализации постредукции контрольная выборка &amp;lt;tex&amp;gt;X^k&amp;lt;/tex&amp;gt; пропускается через&lt;br /&gt;
построенное дерево. При этом в каждой внутренней вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; запоминается подмножество &amp;lt;tex&amp;gt;S_v \subseteq X_k&amp;lt;/tex&amp;gt; попавших в неё контрольных объектов. Если &amp;lt;tex&amp;gt;S_v = \emptyset &amp;lt;/tex&amp;gt;, то вершина &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; считается ненадёжной и заменяется терминальной по ''мажоритарному правилу'': &amp;lt;br&amp;gt;&lt;br /&gt;
в качестве &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; берётся тот класс, объектов которого больше всего в обучающей подвыборке &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;, пришедшей в вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Затем для каждой внутренней вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; вычисляется число ошибок, полученных при классификации выборки &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; следующими способами: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r(v)&amp;lt;/tex&amp;gt; — классификация поддеревом, растущим из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_L(v)&amp;lt;/tex&amp;gt; — классификация поддеревом левой дочерней вершины &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_R(v)&amp;lt;/tex&amp;gt; — классификация поддеревом правой дочерней вершины &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_c(v)&amp;lt;/tex&amp;gt; — отнесение всех объектов выборки &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; к классу &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Эти величины сравниваются, и в зависимости от того, какая из них оказалась&lt;br /&gt;
минимальной, принимается, соответственно, одно из четырёх решений: &amp;lt;br&amp;gt;&lt;br /&gt;
* сохранить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; поддеревом левой дочерней вершины &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; поддеревом правой дочерней вершины &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; терминальной вершиной класса &amp;lt;tex&amp;gt;y_v = \mathrm{arg}\min_{y\in Y}r_c(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы построения деревьев решения ==&lt;br /&gt;
Недостатки рассмотренного алгоритма ID3: &lt;br /&gt;
* Применим только для дискретных значений признаков;&lt;br /&gt;
* Переобучение;&lt;br /&gt;
* На каждом шаге решение принимается по одному атрибуту.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм [https://en.wikipedia.org/wiki/Predictive_analytics#Classification_and_regression_trees_.28CART.29 CART] (англ. ''Classification And Regression Trees'')===&lt;br /&gt;
* В отличие от ID3 работает и с непрерывными значениями признаков: на каждом шаге построения дерева последовательно сравнивает все возможные разбиения для всех атрибутов и выбирает наилучший атрибут и наилучшее разбиение для него. Разбивает объекты на две части;&lt;br /&gt;
* Использует редукцию для избежания переобучения;&lt;br /&gt;
* Обрабатывает пропущенные или аномальные значения признаков.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм [https://en.wikipedia.org/wiki/C4.5_algorithm C4.5] ===&lt;br /&gt;
* Также работает и с непрерывными значениями признаков: на каждом шаге построения дерева выбирает правило разбиения по одному из признаков. Разбивает объекты на несколько частей по этому правилу, рекурсивно запускается из полученных подмножеств;&lt;br /&gt;
* Использует редукцию для избежания переобучения;&lt;br /&gt;
* Обрабатывает пропущенные или аномальные значения признаков.&lt;br /&gt;
&lt;br /&gt;
== Случайный лес ==&lt;br /&gt;
Случайный лес {{---}} один из примеров объединения классификаторов в [[Виды_ансамблей|ансамбль]]. &amp;lt;br&amp;gt;&lt;br /&gt;
Алгоритм построения случайного леса, состоящего из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; деревьев на основе обучающей выборки &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; такой:&lt;br /&gt;
 '''for''' (n: 1,...,N):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// сгенерировать выборку &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; c помощью [[Виды_ансамблей#Бутстрэп|бутстрэпа]]&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; = bootstrap(&amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// построить решающее дерево &amp;lt;tex&amp;gt;t_n&amp;lt;/tex&amp;gt; по выборке &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;t_n&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итоговый классификатор {{---}} &amp;lt;tex&amp;gt;a(x) = \frac{1}{N} \sum\limits_{i = 1}^{N} t_i(x)&amp;lt;/tex&amp;gt;. Для задачи классификации мы выбираем решение по большинству результатов, выданных классификаторами, а в задаче регрессии {{---}} по их среднему значению. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, случайный лес {{---}} бэггинг над решающими деревьями, при обучении которых для каждого разбиения признаки выбираются из некоторого случайного подмножества признаков.&lt;br /&gt;
&lt;br /&gt;
== Примеры использования (в scikit-learn) ==&lt;br /&gt;
*Для решения задач классификации и регрессии используют [https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier DecisionTreeClassifier], [https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html#sklearn.tree.DecisionTreeRegressor DecisionTreeRegressor];&lt;br /&gt;
&lt;br /&gt;
*В '''sklearn.ensemble''' также представлены методы классификации, основанные на ансамблях, в том числе: [https://scikit-learn.org/stable/modules/ensemble.html#bagging бэггинг] и [https://scikit-learn.org/stable/modules/ensemble.html#forest случайный лес], которые были описаны выше. &lt;br /&gt;
&amp;lt;br&amp;gt;Так, в этом примере создается бэггинг ансамбль из классификаторов '''KNeighborsClassifier''', каждый из которых обучен на случайных подмножествах из 50% объектов из обучающей выборки, и 50% случайно выбранных признаков.&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' BaggingClassifier&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
 bagging = BaggingClassifier(KNeighborsClassifier(), max_samples=0.5, max_features=0.5)&lt;br /&gt;
&lt;br /&gt;
Пример использования классификатора на случайном лесе:&lt;br /&gt;
Полную версию кода можно найти [https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html#sphx-glr-download-auto-examples-classification-plot-classifier-comparison-py| здесь]&lt;br /&gt;
 '''from''' sklearn '''import''' RandomForestClassifier&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_classification&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// сгенерируем случайную обучающую выборку с классификацией по n_classes классам&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,&lt;br /&gt;
                           random_state=1, n_clusters_per_class=1, n_classes=2)&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// разбиваем выборку на обучающую и тестовую &amp;lt;/font&amp;gt;&lt;br /&gt;
 X = StandardScaler().fit_transform(X)&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// создадим классификатор на случайном лесе, состоящим из n_estimators деревьев&amp;lt;/font&amp;gt;&lt;br /&gt;
 RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 score = clf.score(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
Результат классификации показан на рисунке. &lt;br /&gt;
&lt;br /&gt;
[[Файл:RFC.png |800px|thumb|center|Классификация RandomForestClassifier. Кружочками изображены объекты обучающей выборки, крестиками тестовой выборки. Справа цветом выделены границы принятия решений, в правом нижнем углу {{---}} значение accuracy.]]&lt;br /&gt;
&lt;br /&gt;
== Пример на языке Scala ==&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.cart&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#cart Smile, Decision Trees]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''dt: DecisionTree = cart(x, y, 1000)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(dt.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, dt)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Виды ансамблей]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/images/3/3e/Voron-ML-Logic.pdf Логические алгоритмы классификации] {{---}} Лекция К. В. Воронцова&lt;br /&gt;
# [https://medium.com/open-machine-learning-course/open-machine-learning-course-topic-5-ensembles-of-algorithms-and-random-forest-8e05246cbba7 Случайный лес] {{---}} статья на Medium, Yury Kashnitskiy&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/tree.html Деревья решений] {{---}} scikit-learn.org&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/ensemble.html Ансамбли классификаторов] — scikit-learn.org.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация и регрессия]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=69675</id>
		<title>Кластеризация</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=69675"/>
				<updated>2019-01-30T19:59:17Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:clusters.png|thumb|300px|Пример кластеризации]]&lt;br /&gt;
'''Кластеризация''' (англ. ''cluster analysis'') {{---}} задача группировки множества объектов на подмножества ('''кластеры''') таким образом,&lt;br /&gt;
чтобы объекты из одного кластера были более похожи друг на друга, чем на объекты из других кластеров по какому-либо критерию.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к классу задач обучения без учителя.&lt;br /&gt;
== Постановка задачи кластеризации ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; {{---}} множество объектов, &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; {{---}} множество идентификаторов (меток) кластеров.&lt;br /&gt;
На множестве &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; задана функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Дана конечная обучающая выборка объектов &amp;lt;tex&amp;gt;X^m = \{ x_1, \dots, x_m \} \subset X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Необходимо разбить выборку на подмножества (кластеры), то есть каждому объекту &amp;lt;tex&amp;gt;x_i \in X^m&amp;lt;/tex&amp;gt; сопоставить метку &amp;lt;tex&amp;gt;y_i \in Y&amp;lt;/tex&amp;gt;,&lt;br /&gt;
таким образом чтобы объекты внутри каждого кластера были близки относительно метрики &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt;, а объекты из разных кластеров значительно различались.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Алгоритм кластеризации''' — функция &amp;lt;tex&amp;gt;a\colon X\to Y&amp;lt;/tex&amp;gt;, которая любому объекту &amp;lt;tex&amp;gt;x\in X&amp;lt;/tex&amp;gt; ставит в соответствие идентификатор кластера &amp;lt;tex&amp;gt;y\in Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Множество &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; в некоторых случаях известно заранее, однако чаще ставится задача&lt;br /&gt;
определить оптимальное число кластеров, с точки зрения того или иного ''критерия качества'' кластеризации.&lt;br /&gt;
&lt;br /&gt;
Кластеризация (обучение без учителя) отличается от классификации (обучения с учителем) тем,&lt;br /&gt;
что метки объектов из обучающей выборки &amp;lt;tex&amp;gt;y_i&amp;lt;/tex&amp;gt; изначально не заданы, и даже может быть неизвестно само множество &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Решение задачи кластеризации объективно неоднозначно по ряду причин:&lt;br /&gt;
* Не существует однозначного критерия качества кластеризации. Известен ряд алгоритмов, осуществляющих разумную кластеризацию &amp;quot;по построению&amp;quot;, однако все они могут давать разные результаты. Следовательно, для определения качества кластеризации и оценки выделенных кластеров необходим эксперт предметной области;&lt;br /&gt;
* Число кластеров, как правило, заранее не известно и выбирается по субъективным критериям. Даже если алгоритм не требует изначального знания о числе классов, конкретные реализации зачастую требуют указать этот параметр&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/clustering.html scikit-learn {{---}} Clustering]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* Результат кластеризации существенно зависит от метрики. Однако существует ряд рекомендаций по выбору метрик для определенных классов задач.&amp;lt;ref&amp;gt;Cornwell, B. (2015). Linkage Criteria for Agglomerative Hierarchical Clustering. Social Sequence Analysis, 270–274&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Число кластеров фактически является гиперпараметром для алгоритмов кластеризации. Подробнее про другие гиперпараметры и их настройку можно прочитать в статье&amp;lt;ref&amp;gt;Shalamov Viacheslav, Valeria Efimova, Sergey Muravyov, and Andrey Filchenkov. &amp;quot;Reinforcement-based Method for Simultaneous Clustering Algorithm Selection and its Hyperparameters Optimization.&amp;quot; Procedia Computer Science 136 (2018): 144-153.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Теорема невозможности Клейнберга ==&lt;br /&gt;
Для формализации алгоритмов кластеризации была использована аксиоматическая теория. Клейнберг постулировал три простых свойства в качестве аксиом кластеризации и доказал теорему, связывающую эти свойства.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Алгоритм кластеризации &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; является '''масштабно инвариантным''' (англ. ''scale-invariant''), если для любой функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt; и любой константы &amp;lt;tex&amp;gt;\alpha &amp;gt; 0&amp;lt;/tex&amp;gt; результаты кластеризации с использованием расстояний &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\alpha\cdot\rho&amp;lt;/tex&amp;gt; совпадают.&lt;br /&gt;
}} &lt;br /&gt;
Первая аксиома интуитивно понятна. Она требует, чтобы функция кластеризации не зависела от системы счисления функции расстояния и была нечувствительна к линейному растяжению и сжатию метрического пространства обучающей выборки.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Полнота''' (англ. ''Richness''). Множество результатов кластеризации алгоритма &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в зависимости от изменения функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt; должно совпадать со множеством всех возможных разбиений множества объектов &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
Вторая аксиома утверждает, что алгоритм кластеризации должен уметь кластеризовать обучающую выборку на любое фиксированное разбиение для какой-то функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Функция расстояния &amp;lt;tex&amp;gt;{\rho}'&amp;lt;/tex&amp;gt; является '''допустимым преобразованием''' функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt;, если&lt;br /&gt;
#&amp;lt;tex&amp;gt;{\rho}'(x_i, x_j) \leqslant \rho(x_i, x_j)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_j&amp;lt;/tex&amp;gt; лежат в одном кластере;&lt;br /&gt;
#&amp;lt;tex&amp;gt;{\rho}'(x_i, x_j) \geqslant \rho(x_i, x_j)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_j&amp;lt;/tex&amp;gt; лежат в разных кластерах.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Алгоритм кластеризации является '''согласованным''' (англ. ''consistent''), если результат кластеризации не изменяется после допустимого преобразования функции расстояния.&lt;br /&gt;
}} &lt;br /&gt;
Третья аксиома требует сохранения кластеров при уменьшении внутрикластерного расстояния и увеличении межкластерного расстояния.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; font-weight:bold;&amp;quot; colspan=3|Примеры преобразований с сохранением кластеров&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:cluster_0.png|300px]]&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:clusters_scale_inv.png|300px]]&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:cluster_consist.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;width:305px;&amp;quot; | Исходное расположение объектов и их кластеризация&lt;br /&gt;
| style=&amp;quot;text-align:center;width:305px;&amp;quot; | Пример масштабной инвариантности. Уменьшен масштаб по оси ординат в два раза.&lt;br /&gt;
| style=&amp;quot;text-align:center;width:305px;&amp;quot; | Пример допустимого преобразования. Каждый объект в два раза приближен к центроиду своего класса. Внутриклассовое расстояние уменьшилось, межклассовое увеличилось.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из этих аксиом Клейнберг сформулировал и доказал теорему:&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Клейнберга&lt;br /&gt;
|about=о невозможности&lt;br /&gt;
|statement=Для множества объектов, состоящего из двух и более элементов, не существует алгоритма кластеризации, который был бы одновременно масштабно-инвариантным, согласованным и полным.&lt;br /&gt;
}}&lt;br /&gt;
Несмотря на эту теорему Клейнберг показал&amp;lt;ref&amp;gt;[https://www.cs.cornell.edu/home/kleinber/nips15.pdf Kleinberg J. An Impossibility Theorem for Clustering]&amp;lt;/ref&amp;gt;, &lt;br /&gt;
что иерархическая кластеризация по методу одиночной связи с различными критериями останова удовлетворяет любым двум из трех аксиом.&lt;br /&gt;
&lt;br /&gt;
== Типология задач кластеризации ==&lt;br /&gt;
=== Типы входных данных ===&lt;br /&gt;
* Признаковое описание объектов. Каждый объект описывается набором своих характеристик, называемых признаками (англ. ''features''). Признаки могут быть как числовыми, так и категориальными;&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;
&lt;br /&gt;
=== Методы кластеризации ===&lt;br /&gt;
* Графовые алгоритмы кластеризации. Наиболее примитивный класс алгоритмов. В настоящее время практически не применяется на практике;&lt;br /&gt;
* Вероятностные алгоритмы кластеризации. Каждый объект из обучающей выборки относится к каждому из кластеров с определенной степенью вероятности:&lt;br /&gt;
** [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;;&lt;br /&gt;
* [[Иерархическая_кластеризация|Иерархические алгоритмы кластеризации]]. Упорядочивание данных путем создания иерархии вложенных кластеров;&lt;br /&gt;
* [[K-средних|Алгоритм &amp;lt;tex&amp;gt;\mathrm{k}&amp;lt;/tex&amp;gt;-средних]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (англ. ''&amp;lt;tex&amp;gt;\mathrm{k}&amp;lt;/tex&amp;gt;-means''). Итеративный алгоритм, основанный на минимизации суммарного квадратичного отклонения точек кластеров от центров этих кластеров;&lt;br /&gt;
* Распространение похожести (англ. ''affinity propagation''). Распространяет сообщения о похожести между парами объектов для выбора типичных представителей каждого кластера;&lt;br /&gt;
* Сдвиг среднего значения (англ. ''mean shift''). Выбирает центроиды кластеров в областях с наибольшей плотностью;&lt;br /&gt;
* Спектральная кластеризация (англ. ''spectral clustering''). Использует собственные значения матрицы расстояний для понижения размерности перед использованием других методов кластеризации;&lt;br /&gt;
* Основанная на плотности пространственная кластеризация для приложений с шумами (англ. ''Density-based spatial clustering of applications with noise'', ''DBSCAN''). Алгоритм группирует в один кластер точки в области с высокой плотностью. Одиноко расположенные точки помечает как шум.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:cluster_comparison.png|thumb|800px|center|&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;Сравнение алгоритмов кластеризации из пакета scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/auto_examples/cluster/plot_cluster_comparison.html scikit-learn {{---}} Comparing different clustering algorithms on toy datasets]&amp;lt;/ref&amp;gt;&amp;lt;/div&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== Меры качества кластеризации ==&lt;br /&gt;
Для оценки качества кластеризации задачу можно переформулировать в терминах задачи дискретной оптимизации. &lt;br /&gt;
Необходима так сопоставить объектам из множества &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; метки кластеров, чтобы значение выбранного функционала качества приняло наилучшее значение. &lt;br /&gt;
В качестве примера, стремятся достичь минимума среднего внутрикластерного расстояния &amp;lt;tex&amp;gt;F_0 = \dfrac{\sum_{i&amp;lt;j}{[y_i=y_j]\cdot\rho(x_i, x_j)}}{\sum_{i&amp;lt;j}[y_i=y_j]}&amp;lt;/tex&amp;gt; или максимума среднего межкластерного расстояния &amp;lt;tex&amp;gt;F_1 = \dfrac{\sum_{i&amp;lt;j}{[y_i\neq y_j]\cdot\rho(x_i, x_j)}}{\sum_{i&amp;lt;j}[y_i\neq y_j]}&amp;lt;/tex&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;
=== Медицина ===&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;
* Кластеризация используется в сегментации изображений для определения границ и распознавания объектов;&lt;br /&gt;
* Кластерный анализ применяется для определения образовавшихся популяционных ниш в ходе работы эволюционных алгоритмов для улучшения параметров эволюции;&lt;br /&gt;
* Подбор рекомендаций для пользователя на основе предпочтений других пользователей в данном кластере;&lt;br /&gt;
* Определение аномалий путем построения кластеров и выявления неклассифицированных объектов.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Оценка_качества_в_задаче_кластеризации|Оценка качества в задаче кластеризации]]&lt;br /&gt;
* [[EM-алгоритм|EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Иерархическая_кластеризация|Иерархическая кластеризация]]&lt;br /&gt;
* [[k-средних|&amp;lt;tex&amp;gt;\mathrm{k}&amp;lt;/tex&amp;gt;-средних]]&amp;lt;sup&amp;gt;[на 28.01.18 не создан]&amp;lt;/sup&amp;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;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7 Википедия {{---}} Кластерный анализ]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Cluster_analysis Wikipedia {{---}} Cluster analysis]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F MachineLearning {{---}} Кластеризация] &lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/c/ca/Voron-ML-Clustering.pdf К.В.Воронцов Лекции по алгоритмам кластеризации и многомерного шкалирования]&lt;br /&gt;
* [https://www.cs.cornell.edu/home/kleinber/nips15.pdf Kleinberg J. An Impossibility Theorem for Clustering]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Кластеризация]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69674</id>
		<title>Бустинг, AdaBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69674"/>
				<updated>2019-01-30T19:55:36Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание==&lt;br /&gt;
'''Бустинг''' (англ. ''boosting'') {{---}} [[Мета-обучение|мета-алгоритм машинного обучения]]. Основной идеей бустинга является комбинирование слабых функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. Сильный обучающий алгоритм является классификатором, хорошо [[Корреляция случайных величин|коррелирующим]] с верной классификацией, в отличие от слабого. Наравне с бустингом в мета-обучении также рассматривают такие понятия, как [[Виды ансамблей|бэггинг]] (англ. ''bagging'') и стэкинг&amp;lt;ref&amp;gt;[https://dyakonov.org/2017/03/10/c%D1%82%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3-stacking-%D0%B8-%D0%B1%D0%BB%D0%B5%D0%BD%D0%B4%D0%B8%D0%BD%D0%B3-blending/#more-4558 Стекинг {{---}} Дьяконов Александр]&amp;lt;/ref&amp;gt; (англ. ''stacking''). Бэггинг, в отличии от бустинга, использует параллельное обучение базовых классификаторов. Стэкинг же комбинирует результаты различных алгоритмов, получая тем самым более точный ответ. &lt;br /&gt;
&lt;br /&gt;
Одним из недостатков бустинга является то, что он может приводить к построению громоздких композиций, состоящих из сотен алгоритмов. Такие композиции исключают возможность содержательной интерпретации, требуют больших объёмов памяти для хранения базовых алгоритмов и существенных затрат времени на вычисление классификаций.&lt;br /&gt;
&lt;br /&gt;
==Алгоритмы бустинга==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Композицией''' $T$ '''алгоритмов''' &amp;lt;tex&amp;gt;a_t(x) = C(b_t(x)),\ t = 1,...,T&amp;lt;/tex&amp;gt; называется [[Суперпозиции|суперпозиция]] алгоритмических операторов &amp;lt;tex&amp;gt;b_t\ :\ X\to R&amp;lt;/tex&amp;gt;, корректирующей операции &amp;lt;tex&amp;gt;F\ :\ R^T\to R&amp;lt;/tex&amp;gt; и решающего правила &amp;lt;tex&amp;gt; C\ :\ R\to Y&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; {{---}} пространство оценок,&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))), x \in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;br&amp;gt;, Алгоритмы $a_t$ называют ''базовыми алгоритмами''.}}&lt;br /&gt;
Бустинг представляет собой композицию алгоритмов, в которых ошибки отдельных алгоритмов взаимно компенсируются. Например, в задаче классификации на два класса $Y = {-1, +1}$ в качестве пространства оценок принимают $R = \mathbb{R}$ и &amp;lt;tex&amp;gt;C(b(x)) = \textrm{sign}(b(x))&amp;lt;/tex&amp;gt;. Тогда базовые алгоритмы возвращают ответы $−1, 0, +1$. Ответ $b_t(x) = 0$ означает, что базовый алгоритм $b_t$ отказывается от классификации объекта $x$, и ответ $b_t(x)$ не учитывается в композиции. Получаем искомую композицию:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))) = \textrm{sign}\left(\sum\limits_{t=1}^T \alpha_t b_t(x)\right),\ x\in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Большая часть алгоритмов бустинга основывается на итеративном обучении слабых классификаторов с дальнейшей сборкой их в сильный классификатор. Когда они добавляются, им обычно приписываются веса, обычно связанные с [[Общие понятия|точностью обучения]]. После добавления слабого классификатора, веса пересчитываются ('''«пересчёт весовых коэффициентов»'''). Неверно классифицированные входные данные получают больший вес, а правильно классифицированные экземпляры теряют вес. Таким образом, дальнейшее слабое обучение фокусируется на примерах, где предыдущие слабые обучения дали ошибочную классификацию.&lt;br /&gt;
&lt;br /&gt;
Основное расхождение между многими алгоритмами бустинга заключается в методах определения весовых коэффициентов точек [[Общие понятия|тренировочных данных]] и гипотез. Первым алгоритмом, который смог адаптироваться к слабому обучению был '''AdaBoost'''&amp;lt;ref&amp;gt;[http://rob.schapire.net/papers/explaining-adaboost.pdf Explaining AdaBoost {{---}} Robert E. Schapire]&amp;lt;/ref&amp;gt; (сокр. ''Adaptive Boosting''), предложенный Шапире и Фройндом.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы бустинга могут использовать выпуклую или невыпуклую функцию потерь. Алгоритмы с выпуклой функцией, такие как AdaBoost и LogitBoost&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/LogitBoost Wikipedia {{---}} LogitBoost]&amp;lt;/ref&amp;gt;, могут некорректно классифицировать из-за случайного шума, так как не могут обучить базовым и поддающимся научению комбинациям слабых гипотез. Алгоритмы бустинга, основанные на невыпуклой функции потерь, такие как BrownBoost&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/BrownBoost Википедия {{---}} BrownBoost]&amp;lt;/ref&amp;gt;, позволяют избежать переобучения на данных с большим количеством &amp;quot;шума&amp;quot;, откидывая зашумленные элементы.&lt;br /&gt;
&lt;br /&gt;
==Прикладное использование алгоритмов бустинга==&lt;br /&gt;
===Задача классификации объектов===&lt;br /&gt;
Если даны изображения, содержащие различные известные в мире объекты, классификатор может быть обучен на основе них для автоматической классификации объектов в будущих неизвестных изображениях. Простые классификаторы, построенные на основе некоторых признаков изображения объекта, обычно оказываются малоэффективными в классификации. Использование методов бустинга для классификации объектов {{---}} путь объединения слабых классификаторов специальным образом для улучшения общей возможности классификации.&lt;br /&gt;
&lt;br /&gt;
Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нет. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение [[Общие понятия|признаков]], обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели '''«мешок слов»''', с помощью локальных описателей, таких как '''SIFT'''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Wikipedia {{---}} Scale-invariant feature transform]&amp;lt;/ref&amp;gt;, и так далее. Примерами классификаторов с учителем служат наивные [[Байесовская классификация|байесовские классификаторы]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Метод опорных векторов (SVM)|методы опорных векторов]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, смесь гауссиан и [[Нейронные сети, перцептрон|нейронные сети]]. Однако исследования показали, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.&lt;br /&gt;
&lt;br /&gt;
===Задача ранжирования выдачи поисковых систем===&lt;br /&gt;
Благодаря AdaBoost в мире появился [[CatBoost|градиентный бустинг]] (англ. ''gradient boosting'') или GBM. Задачу ранжирования выдачи поисковых запросов рассмотрели с точки зрения функции потерь, которая штрафует за ошибки в порядке выдачи, поэтому было удобно внедрить GBM в ранжирование.&lt;br /&gt;
&lt;br /&gt;
==AdaBoost==&lt;br /&gt;
===Описание===&lt;br /&gt;
Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.&lt;br /&gt;
&lt;br /&gt;
AdaBoost вызывает слабые классификаторы &amp;lt;tex&amp;gt;h_i^t&amp;lt;/tex&amp;gt; в цикле &amp;lt;tex&amp;gt;t = 1,...,T&amp;lt;/tex&amp;gt;. После каждого вызова обновляется распределение весов &amp;lt;tex&amp;gt;D_t&amp;lt;/tex&amp;gt;, которые отвечают важности каждого из объектов обучающего множества для классификации. На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах.&lt;br /&gt;
&lt;br /&gt;
===Описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;x_i \in X, y_i \in Y = \{-1,+1\}, size(x) = size(y) = m&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' AdaBoost($X$, $Y$, $m$):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;//Инициализируем&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = 1..m '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_i^1 = \frac{1}{m}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &lt;br /&gt;
   '''for''' t = 1..T '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;h_t = \arg \min\limits_{h_j \in \mathcal{H}} \epsilon_j = \sum\limits_{i=1}^{m} D_i^t〚y_i\neq h_j(x_i)〛&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$\epsilon$ {{---}} Взвешенная ошибка классификации, классификатор &amp;lt;tex&amp;gt;h_t:X\to \{-1,+1\}&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;\alpha_t = \frac{1}{2}\ln\frac{1-\epsilon_t}{\epsilon_t}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' i = 1..m '''do''':&lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;Z_t&amp;lt;/tex&amp;gt; {{---}} нормализующий параметр, выбранный так, чтобы &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt; являлось распределением вероятностей, то есть &amp;lt;tex&amp;gt;\sum\limits_{i-1}^{m} D_i^{t+1} = 1&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;t=1,...,T&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
       &amp;lt;tex&amp;gt;D_i^{t+1} = \dfrac{D_i^t \textrm{exp}(-\alpha_t y_i h_t(x_i))}{Z_t}&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &amp;lt;tex&amp;gt;H(x) = \textrm{sign}\left(\sum\limits_{t=1}^{T} \alpha_t h_t(x)\right)&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$H(x)$ {{---}} результирующий классификатор&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' $H$&lt;br /&gt;
Выражение для обновления распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt; должно быть сконструировано таким образом, чтобы выполнялось условие:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\exp^{\alpha_t y_i h_t(x_i)} \begin{cases}&amp;lt;1,\ y(i) = h_t(x_i) \\ &amp;gt;1,\ y(i) \neq h_t(x_i)\end{cases}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Таким образом, после выбора оптимального классификатора &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; для распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt;, объекты &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, которые классификатор &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt;, он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором.&lt;br /&gt;
&lt;br /&gt;
===Пример работы===&lt;br /&gt;
Рассмотрим набор данных, которые пометим как $-$ и $+$.&lt;br /&gt;
[[Файл:Adaboost1.jpg|600px|thumb|center|Результат после первой итерации]]&lt;br /&gt;
Для всех ошибочно классифицированных объектов увеличим веса, а для верно классифицированных уменьшим&lt;br /&gt;
[[Файл:Adaboost2.jpg|1000px|thumb|center|Результат после пересчета весов и второй итерации]]&lt;br /&gt;
Рассмотрим результат после $2$-х итераций:&lt;br /&gt;
[[Файл:Adaboost_result12.jpg|1000px|thumb|center|Итоговый результат после $2$-х итераций]]&lt;br /&gt;
Как видно из последнего изображения, все, что находиться в &amp;quot;цветной&amp;quot; зоне, мы можем однозначно классифицировать, но тогда у нас появляются ошибки и &amp;quot;белые&amp;quot; зоны, которые мы не можем однозначно классифицировать. Рассмотрим алгоритм после $30$-ти итераций:&lt;br /&gt;
[[Файл:Adaboost_resultfinal.jpg|300px|thumb|center|Результат работы алгоритма после $30$-ти итераций]]&lt;br /&gt;
Теперь у нас все объекты классифицируются верно и число ошибок на выборке равно нулю.&lt;br /&gt;
&lt;br /&gt;
===Достоинства и недостатки===&lt;br /&gt;
'''Достоинства:'''&lt;br /&gt;
# Простота реализации;&lt;br /&gt;
# Хорошая обобщающая способность. В реальных задачах удаётся строить композиции, превосходящие по качеству базовые алгоритмы. Обобщающая способность может улучшаться по мере увеличения числа базовых алгоритмов;&lt;br /&gt;
# Время построения композиции практически полностью определяется временем обучения базовых алгоритмов;&lt;br /&gt;
# Возможность идентифицировать выбросы. Это наиболее «трудные» объекты $x_i$, для которых в процессе наращивания композиции веса $w_i$ принимают наибольшие значения.&lt;br /&gt;
'''Недостатки:'''&lt;br /&gt;
# Склонен к переобучению при наличии значительного уровня шума в данных;&lt;br /&gt;
# Требует достаточно длинных обучающих выборок. Другие методы линейной коррекции, в частности, бэггинг, способны строить алгоритмы сопоставимого качества по меньшим выборкам данных.&lt;br /&gt;
&lt;br /&gt;
===Пример кода на python для scikit-learn===&lt;br /&gt;
Классификатор sklearn.ensemble.'''AdaBoostClassifier'''&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html Документация AdaBoostClassifier]&amp;lt;/ref&amp;gt; имеет 5 параметров: '''base_estimator''', '''n_estimators''', '''learning_rate''', '''algorithm''', '''random_state'''.&lt;br /&gt;
Наиболее важными являются: &lt;br /&gt;
# '''base_estimator''' {{---}} базовый алгоритм. По умолчанию используется DecisionTreeClassifier(max_depth=1);&lt;br /&gt;
# '''n_estimators''' {{---}} максимальное количество оценок, после которого бустинг прекращается. Если произойдет полное совпадение, то закончится раньше;&lt;br /&gt;
# '''learning_rate''' {{---}} вклад каждой модели в весовые коэффициенты и значение по умолчанию равно $1$. Снижение этого параметра будет означать, что весовые коэффициенты буду увеличиваться или уменьшаться в небольшой степени, вынуждая модель дольше обучаться (но иногда повышается производительность).&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' AdaBoostClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
 &lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 &lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
 abc = AdaBoostClassifier(n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.8888888888888888&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим алгоритм с SVC в качестве базы:&lt;br /&gt;
 '''from''' sklearn.svm '''import''' SVC&lt;br /&gt;
 &lt;br /&gt;
 svc=SVC(probability='''True''', kernel=''''linear'''')&lt;br /&gt;
 &lt;br /&gt;
 abc = AdaBoostClassifier(base_estimator='''svc''', n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.9555555555555556&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Scala===&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.adaboost&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#adaboost Smile, AdaBoost]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''ada: AdaBoost = adaboost(x, y, ntrees = 500, maxNodes = 2)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(ada.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, ada)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Метод опорных векторов (SVM)|Метод опорных векторов]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Байесовская классификация|Байесовская классификация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Мета-обучение|Мета-обучение]]&lt;br /&gt;
*[[Нейронные сети, перцептрон|Нейронные сети]]&lt;br /&gt;
*[[Оценка качества в задаче кластеризации|Оценка качества в задаче кластеризации]]&lt;br /&gt;
*[[CatBoost|CatBoost]]&lt;br /&gt;
&lt;br /&gt;
== Примечания==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=AdaBoost AdaBoost] {{---}} статья на machinelearning.ru&lt;br /&gt;
# [http://cmp.felk.cvut.cz/~sochmj1/adaboost_talk.pdf AdaBoost] {{---}} презентация по AdaBoost&lt;br /&gt;
# [https://ru.coursera.org/lecture/ml-classification/example-of-adaboost-in-action-um0cX Example of AdaBoost in action] {{---}} презентация на coursera.org&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9A.%D0%92.%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2) Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=69673</id>
		<title>Сегментация изображений</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=69673"/>
				<updated>2019-01-30T19:51:39Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''Сегментация изображения''' {{---}} задача поиска групп пикселей, каждая из которых характеризует один смысловой объект. В статистике эта проблема известна как кластерный анализ и является широко изученной областью с сотнями различных алгоритмов. В компьютерном зрении сегментация изображения является одной из старейших и широко изучаемых проблем.&lt;br /&gt;
&lt;br /&gt;
В более ранних техниках используется ''расщепление'' и ''слияние'' регионов, что соответствует ''разделительным'' и ''агломерационным'' алгоритмам в литературе по [[Кластеризация|кластеризации]]. Современные алгоритмы чаще оптимизируют некоторые глобальные критерии, такие как внутрирегиональная согласованность и межрегиональные длины границ.&lt;br /&gt;
&lt;br /&gt;
Ниже будут рассмотрены два алгоритма {{---}} графо-ориентированная сегментация и метод нормализованных срезов. Первый из них является базовым алгоритмом сегментации, который прост и понятен в реализации, но медленный и результаты недостаточно хороши. Второй алгоритм является продвинутой версией первого со множеством эвристик. Что отражается, как на производительности, так и на результатах. &lt;br /&gt;
&lt;br /&gt;
== Графо-ориентированная сегментация (англ. Graph-based segmentation) ==  &lt;br /&gt;
&lt;br /&gt;
Это алгоритм объединения, который использует относительные различия между регионами, чтобы определить, какие из них следует объединить. Кроме того, он доказуемо оптимизирует глобальную метрику группировки. Введем ''меру отличия'' одного пикселя от другого &amp;lt;tex&amp;gt;w(e)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;e = (v_1, v_2)&amp;lt;/tex&amp;gt; {{---}} пара соседних по стороне или по углу пикселей. ''Мера отличия'' может показывать, например, разницу цветовой интенсивности между соседями, которых у пикселя максимум восемь. &lt;br /&gt;
&lt;br /&gt;
Для любого региона ''R'', его внутренняя разница определяется как наибольшая ''мера отличия'' в минимальном остовном дереве региона,&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;Int(R) = \displaystyle\min_{e \in MST(R)} w(e)&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Для любых двух соседних областей, по крайней мере, с одним смежным ребром, соединяющим их вершины, разность между этими регионами определяется как ребро минимального веса, соединяющее эти два региона,&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;Dif(R_1, R_2) = \displaystyle\min_{e = (v_1, v_2) | v_1 \in R_1, v_2 \in R_2} w(e)&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Алгоритм объединяет любые две соседние области, разница которых меньше минимальной внутренней разности этих двух областей, &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;MInt(R_1, R_2) = \min(Int(R_1) + \tau(R_1), Int(R_2) +\tau(R_2)),&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;\tau(R)&amp;lt;/tex&amp;gt; {{---}} эвристический штраф по региону, который был установлен &amp;lt;tex&amp;gt;k / |R|&amp;lt;/tex&amp;gt;, однако, он может быть установлен как любая специфическая для области применения мера.&lt;br /&gt;
&lt;br /&gt;
Объединяя области в порядке убывания разделяющих их ребер (можно эффективно оценить с использованием алгоритма минимального остовного дерева Крускала), они доказуемо дают сегментацию. Причем такую, в которой присутствуют как области, которые могли бы быть объединены, так и те, которые могут быть разделены, но в небольших количествах. Для окрестностей пикселей фиксированного размера время работы этого алгоритма составляет &amp;lt;tex&amp;gt;O (N \log N)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; {{---}} количество пикселей изображения, что делает его одним из самых быстрых алгоритмов сегментации.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;[[Файл:beforeAfterGraphBased.png|800px|thumb|center|Источник: Felzenszwalb, P. F. and Huttenlocher, D. P. «Efficient graph-based image segmentation.»[http://people.cs.uchicago.edu/~pff/papers/seg-ijcv.pdf]]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;На рисунке слева {{---}} исходное изображение, справа {{---}} сегментированное после применения данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Метод нормализованных срезов (англ.  Normalized cuts) ==&lt;br /&gt;
&lt;br /&gt;
Mетод нормализованных срезов, исследует сходство между соседними пикселями и пытается разделить их на группы, которые в свою очередь связаны слабо. &lt;br /&gt;
Рассмотрим простой пример.&lt;br /&gt;
[[Файл:graphNormalizedCut.png|800px|thumb|center|Источник: Richard Szeliski «Computer Vision: Algorithms and Applications.»[http://szeliski.org/Book/drafts/SzeliskiBook_20100903_draft.pdf]]]&lt;br /&gt;
&amp;lt;br&amp;gt;Все пиксели в группе A имеют высокое сходство, показанное в виде толстых красных линий, как и пиксели в группе B. Соединения между этими двумя группами, показанные в виде более тонких синих линий, намного слабее. ''Нормализованный разрез'' между двумя группами, показанный пунктирной линией, разделяет их на два кластера.&lt;br /&gt;
&lt;br /&gt;
Разрез между двумя группами A и B определяется как сумма всех взвешенных весов,&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;cut(A, B) = \displaystyle\sum_{i \in A, j \in B}w_{ij},&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где веса между двумя пикселями &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; соответствуют их сходству. Однако использование минимального среза в качестве критерия сегментации не приводит к разумным кластерам, поскольку наименьшие срезы обычно предусматривают выделение одного пикселя.&lt;br /&gt;
&lt;br /&gt;
Лучшей мерой сегментации является нормализованный срез, который определяется как&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;Ncut(A,B)=\frac{cut(A,B)}{assoc(A, V)}+\frac{cut(A,B)}{assoc(B,V)},&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;assoc(A,A)=\sum_{i \in A, j \in A}w_{ij}&amp;lt;/tex&amp;gt; это ''ассоциация'' (сумма всех весов) в кластере и &amp;lt;tex&amp;gt;assoc(A,V)=assoc(A,A)+cut(A,B)&amp;lt;/tex&amp;gt; это сумма всех весов ассоциированных с &amp;lt;tex&amp;gt;А&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;Нормализованные разрезы могут быть довольно медленными, поскольку это требует решения больших разреженных задач. Однако существует способ ускорить вычисление нормализованных разрезов, используя подход, основанный на алгебраической сетке. Можно выбирать меньшее количество переменных, чтобы оставшиеся переменные более нижнего уровня были ''сильно связаны'' по крайней мере с одной переменной грубого уровня. Подмножество  &amp;lt;tex&amp;gt;C \subset V&amp;lt;/tex&amp;gt; считается ''сильно связанным'', если выполняется&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\sum_{j \in C}w_{ij}}{\sum_{j \in V}w_{ij}} &amp;gt; \phi, [*]&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt; &lt;br /&gt;
обычно &amp;lt;tex&amp;gt;\phi = 0.2.&amp;lt;/tex&amp;gt; Данный рисунок схематично показывает этот процесс.&lt;br /&gt;
&lt;br /&gt;
[[Файл:grephEdges.png|880px|thumb|center|''на первом изображении'' {{---}} исходная пиксельная сетка черно-белого изображения; ''на втором'' {{---}} межпиксельные связи, где более толстые линии указывают на более сильные связи; ''на третьем'' {{---}} сетка после одного уровня огрубления, когда каждый исходный пиксель сильно связан с одним из узлов грубого уровня; ''на четвертом'' {{---}} после двух уровней огрубления. Источник: Shaw, D. and Barnes, N. «Perspective rectangle detection. In Workshop on Applications of Computer Vision.» [https://www.researchgate.net/publication/6975028_Hierarchy_and_adaptivity_in_segmenting_visual_scenes]]]&lt;br /&gt;
&lt;br /&gt;
Каждый пиксель на первом изображении соответствует вершине графа на втором изображении, которая связана с каждым из ее четырех соседей в соответствии с их сходством по уровню яркости. Цель состоит в том, чтобы «разрезать» этот граф на части. Далее можно найти ''сильно связное'' подмножество, которое минимизирует отношение &amp;lt;tex&amp;gt;[*]&amp;lt;/tex&amp;gt;. Но несмотря на свою концептуальную значимость, минимизация этого ''нормализованного разреза'' является вычислительно непомерной, а стоимость увеличивается экспоненциально с размером изображения. Приближения к оптимальному разрезу могут быть получены с использованием спектральных методов, при этом наиболее эффективное на сегодняшний день приближение имеет вычислительную стоимость, пропорциональную &amp;lt;tex&amp;gt;n^{\frac{2}{3}}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество пикселей. Эта сверхлинейная сложность может быть чрезвычайно полезна, когда дело касается очень больших изображений. &lt;br /&gt;
&lt;br /&gt;
Так как количество вершин графа на втором изображении велико и работать с каждым из них чрезвычайно дорого, необходимо выделить подмножество вершин-предводителей для каждого из подмножеств и далее работать уже с ними. Мы начнем с выбора примерно половины пикселей в качестве представителей, которые назовем ''начальными числами'': они выбираются таким образом, чтобы каждый пиксель в исходном изображении был ''сильно связан'' по крайней мере с одним соседним с ним ''начальным числом'' (см. третье изображение). Далее процесс продолжается рекурсивно (см. четвертое изображение), количество вершин на каждом новом более грубом уровне уменьшается. Значения узлов более нижнего уровня вычисляются путем интерполяции родительских значений и сопоставления значений &amp;lt;tex&amp;gt; \epsilon = 0,1&amp;lt;/tex&amp;gt; в пределах от 0 и 1 до Boolean значений. Выраженные сегменты появляются на соответствующем уровне как узлы, которые слабо связаны со своими соседями. Следовательно, задача минимизации упрощается до поиска вершин-предводителей на всех уровнях. &lt;br /&gt;
&lt;br /&gt;
Результат работы данного алгоритма:&lt;br /&gt;
[[Файл:watches.png|880px|thumb|center|Источник: Shaw, D. and Barnes, N. «Perspective rectangle detection. In Workshop on Applications of Computer Vision.» [https://www.researchgate.net/publication/6975028_Hierarchy_and_adaptivity_in_segmenting_visual_scenes]]]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
[[Задача нахождения объектов на изображении]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* Richard Szeliski «Computer Vision: Algorithms and Applications.» - «Springer», 2010. - С. 286-300&lt;br /&gt;
* Felzenszwalb, P. F. and Huttenlocher, D. P. (2004b). Efficient graph-based image segmentation.[http://people.cs.uchicago.edu/~pff/papers/seg-ijcv.pdf]&lt;br /&gt;
* Shaw, D. and Barnes, N. (2006). Perspective rectangle detection. In Workshop on Applications of Computer Vision at ECCV’2006.&lt;br /&gt;
* Brandt, A. (1986). Algebraic multigrid theory: The symmetric case. Applied Mathematics and Computation, 19(1-4):23–56.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Компьютерное зрение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=69672</id>
		<title>Уменьшение размерности</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=69672"/>
				<updated>2019-01-30T19:47:41Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Под '''уменьшением размерности''' (англ. ''dimensionality reduction'') в машинном обучении подразумевается уменьшение числа признаков набора данных. Наличие в нем признаков избыточных, неинформативных или слабо информативных может понизить эффективность модели, а после такого преобразования она упрощается, и соответственно уменьшается размер набора данных в памяти и ускоряется работа алгоритмов ML на нем. Уменьшение размерности может быть осуществлено методами выбора признаков (англ. ''feature selection'') или выделения признаков (англ. ''feature extraction'').&lt;br /&gt;
==Выбор признаков==&lt;br /&gt;
Методы '''выбора признаков''' оставляют некоторое подмножество исходного набора признаков, избавляясь от признаков избыточных и слабо информативных. Основные преимущества этого класса алгоритмов:&lt;br /&gt;
*Уменьшение вероятности [[переобучение|переобучения]];&lt;br /&gt;
*Увеличение точности предсказания модели;&lt;br /&gt;
*Сокращение времени обучения;&lt;br /&gt;
*Увеличивается семантическое понимание модели.&lt;br /&gt;
&lt;br /&gt;
Все методы выбора признаков можно разделить на 5 типов, которые отличаются алгоритмами выбора лишних признаков.&lt;br /&gt;
===Фильтры===&lt;br /&gt;
'''Фильтры''' (англ. ''filter methods'') измеряют релевантность признаков на основе функции $\mu$, и затем решают по правилу $\kappa$, какие признаки оставить в результирующем множестве.&lt;br /&gt;
&lt;br /&gt;
Фильтры могут быть:&lt;br /&gt;
*Одномерные (англ. ''univariate'') {{---}} функция $\mu$ определяет релевантность одного признака по отношению к выходным меткам. В таком случае обычно измеряют &amp;quot;качество&amp;quot; каждого признака и удаляют худшие;&lt;br /&gt;
*Многомерные (англ. ''multivariate'') {{---}} функция $\mu$ определяет релевантность некоторого подмножества исходного множества признаков относительно выходных меток.&lt;br /&gt;
&lt;br /&gt;
Распространенными вариантами для $\mu$ являются:&lt;br /&gt;
*Коэффициент ранговой корреляции Спирмена &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient Определение коэффициента ранговой корреляции Спирмена]&amp;lt;/ref&amp;gt;(англ. ''Spearman's rank correlation coefficient''): $p(x, y)=\displaystyle \frac{\sum_{i, j}(x_{ij}-\bar{x_j})(y_i-\bar{y})}{\sqrt{\sum_{i, j}(x_{ij}-\bar{x_j})^2\sum_i(y_i-\bar{y})^2}}$;&lt;br /&gt;
*Information gain&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Information_gain_in_decision_trees Определение information gain]&amp;lt;/ref&amp;gt;: $IG(x, y)=\displaystyle -\sum_{i=1}^kp(c_i)\log_2{(p(c_i))}+\sum_{i=1}^{n}p(t_i)\sum_{j=1}^kp(c_j|t_i)log_2{(p(c_j|t_i))}$, и другие.&lt;br /&gt;
&lt;br /&gt;
Преимуществом группы фильтров является простота вычисления релевантности признаков в наборе данных, но недостатком в таком подходе является игнорирование возможных зависимостей между признаками.&lt;br /&gt;
===Оберточные методы===&lt;br /&gt;
[[File:Feature_selection_wrapper_rus.png|450px|thumb|right|Процесс работы оберточных методов]]&lt;br /&gt;
'''Оберточные методы''' (англ. ''wrapper methods'') находят подмножество искомых признаков последовательно, используя некоторый классификатор как источник оценки качества выбранных признаков, т.е. этот процесс является циклическим и продолжается до тех пор, пока не будут достигнуты заданные условия останова. Оберточные методы учитывают зависимости между признаками, что является преимуществом по сравнению с фильтрами, к тому же показывают большую точность, но вычисления занимают длительное время, и повышается риск [[переобучение|переобучения]]. &lt;br /&gt;
&lt;br /&gt;
Существует несколько типов оберточных методов: детерминированные, которые изменяют множество признаков по определенному правилу, а также рандомизированные, которые используют генетические алгоритмы для выбора искомого подмножества признаков. Среди детерминированных алгоритмов самыми простыми являются:&lt;br /&gt;
*SFS (Sequential Forward Selection) {{---}} жадный алгоритм, который начинает с пустого множества признаков, на каждом шаге добавляя лучший из еще не выбранных признаков в результирующее множество;&lt;br /&gt;
*SBS (Sequential Backward Selection) {{---}} алгоритм обратный SFS, который начинает с изначального множества признаков, и удаляет по одному или несколько худших признаков на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Популярным оберточным методом является SVM-RFE (SVM-based Recursive Feature Elimination), который иногда также обозначается как встроенный &amp;lt;ref&amp;gt;[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117/ C. Embedded method]&amp;lt;/ref&amp;gt;. Этот метод использует как классификатор [[Метод опорных векторов (SVM)| SVM]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и работает итеративно: начиная с полного множества признаков обучает классификатор, ранжирует признаки по весам, которые им присвоил классификатор, убирает какое-то число признаков и повторяет процесс с оставшегося подмножества фичей, если не было достигнуто их требуемое количество. Таким образом, этот метод очень похож на встроенный, потому что непосредственно использует знание того, как устроен классификатор.&lt;br /&gt;
&lt;br /&gt;
===Встроенные методы===&lt;br /&gt;
[[File:Feature_selection_embedded_rus.png|450px|thumb|right|Процесс работы встроенных методов]]&lt;br /&gt;
Группа '''встроенных методов''' (англ. ''embedded methods'') очень похожа на оберточные методы, но для выбора признаков используется непосредственно структуру некоторого классификатора. В оберточных методах классификатор служит только для оценки работы на данном множестве признаков, тогда как встроенные методы используют какую-то информацию о признаках, которую классификаторы присваивают во время обучения. &lt;br /&gt;
&lt;br /&gt;
Одним из примеров встроенного метода является реализация на [[Дерево решений и случайный лес| случайном лесе]]: каждому дереву на вход подаются случайное подмножество данных из датасета с каким-то случайным набор признаков, в процессе обучения каждое из деревьев решений производит &amp;quot;голосование&amp;quot; за релевантность его признаков, эти данные агрегируются, и на выходе получаются значения важности каждого признака набора данных. Дальнейший выбор нужных нам признаков уже зависит от выбранного критерия отбора.&lt;br /&gt;
&lt;br /&gt;
Встроенные методы используют преимущества оберточных методов и являются более эффективными, при этом на отбор тратится меньше времени, уменьшается риск [[переобучение|переобучения]], но т.к. полученный набор признаков был отобран на основе знаний о классификаторе, то есть вероятность, что для другого классификатора это множество признаков уже не будет настолько же релевантным.&lt;br /&gt;
&lt;br /&gt;
===Другие методы===&lt;br /&gt;
[[File:Feature_selection_ensemble_rus.png|thumb|Один из примеров процесса работы ансамблевых методов]]&lt;br /&gt;
Есть и другие методы выбора признаков: '''гибридные''' (англ. ''hybrid methods'') и '''ансамблевые''' (англ. ''ensemble methods''). '''Гибридные методы''' комбинируют несколько разных методов выбора признаков, например, некоторое множество фильтров, а потом запускают оберточный или встроенный метод. Таким образом, гибридные методы сочетают в себе преимущества сразу нескольких методов, и на практике повышают эффективность выбора признаков.&lt;br /&gt;
&lt;br /&gt;
'''Ансамблевые методы''' применяются больше для наборов данных с очень большим числом признаков. В данном подходе для начального множества признаков создается несколько подмножеств признаков, и эти группы каким-то образом объединяются, чтобы получить набор самых релевантных признаков. Это довольно гибкая группа методов, т.к. для нее можно применять различные способы выбора признаков и объединения их подмножеств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:{{{1|both}}};&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Примеры кода scikit-learn===&lt;br /&gt;
Пример кода, реализующего функцию оценки фильтра на основе коэффициента ранговой корреляции:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  &lt;br /&gt;
  # Вспомогательная функция для расчета корреляции&lt;br /&gt;
  def correlation(X, Y):&lt;br /&gt;
      return np.cov(X, Y) / np.sqrt(np.var(X) * np.var(Y))&lt;br /&gt;
&lt;br /&gt;
  # Сам фильтр на основе метрики ранговой корреляции&lt;br /&gt;
  # Аргументы X -- значения объектов датасета для какой-то фичи, Y -- метки этих объектов&lt;br /&gt;
  def measure_spearmans(X, Y):&lt;br /&gt;
      xr = pd.Series(X).rank()&lt;br /&gt;
      yr = pd.Series(Y).rank()&lt;br /&gt;
      return correlation(xr, yr)&lt;br /&gt;
&lt;br /&gt;
Пример кода, реализующего SVM-RFE wrapper:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  from sklearn import svm&lt;br /&gt;
&lt;br /&gt;
  # X -- наш датасет, Y -- массив меток&lt;br /&gt;
  # N -- число признаков, которые хотим оставить, step -- сколько фичей удаляется на каждой итерации&lt;br /&gt;
  # Возвращает массив из булевых переменных размерностью 1x[число признаков], показывающий, отбрасываем признак или нет&lt;br /&gt;
  def RFE(X, Y, N, step = 10):&lt;br /&gt;
        # cache_size нужен, если набор данных большой, иначе можно опустить&lt;br /&gt;
        clfRFE = svm.SVC(kernel='linear', cache_size=1024)&lt;br /&gt;
        featureCount = X.shape[1]&lt;br /&gt;
        featureList = np.arange(0, featureCount )&lt;br /&gt;
        included = np.full(featureCount, True)&lt;br /&gt;
        curCount = featureCount&lt;br /&gt;
        while curCount &amp;gt; N:&lt;br /&gt;
            actualFeatures = featureList[included]&lt;br /&gt;
            Xnew = X[:, actualFeatures]&lt;br /&gt;
            &lt;br /&gt;
            clfRFE.fit(Xnew, Y)&lt;br /&gt;
            curStep = min(step, curCount - N)&lt;br /&gt;
            elim = np.argsort(np.abs(clfRFE.coef_[0]))[:curStep]&lt;br /&gt;
            included[actualFeatures[elim]] = False&lt;br /&gt;
            curCount -= curStep&lt;br /&gt;
        return included&lt;br /&gt;
==Выделение признаков==&lt;br /&gt;
Другим способом уменьшить размерность входных данных является выделение признаков. Эти методы каким-то образом составляют из уже исходных признаков новые, все также полностью описывающие пространство набора данных, но уменьшая его размерность и теряя в репрезентативности данных, т.к. становится непонятно, за что отвечают новые признаки.&lt;br /&gt;
Все методы feature extraction можно разделить на '''линейные''' и '''нелинейные'''.&lt;br /&gt;
&lt;br /&gt;
Одним из самых известных методов '''линейного''' выделения признаков является [[Метод главных компонент (PCA)| PCA]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (Principal Component Analysis, рус. ''метод главных компонент''). Основной идеей этого метода является поиск такой гиперплоскости, на которую при ортогональной проекции всех признаков максимизируется дисперсия. Данное преобразование может быть произведено с помощью сингулярного разложения матриц и создает проекцию только на линейные многомерные плоскости, поэтому и метод находится в категории линейных.&lt;br /&gt;
&lt;br /&gt;
К '''нелинейным''' методам, например, могут быть отнесены методы отображающие исходное пространство признаков на нелинейные поверхности или топологические многообразия. Одним из таких алгоритмов является [[Стохастическое вложение соседей с t-распределением |t-SNE]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (t-distributed Stochastic Neighbor Embedding, рус. ''стохастическое вложение соседей с t-распределением''). Данный метод состоит из двух шагов: изначально строится распределение вероятностей по всем парам точек набора данных, каждая условная вероятность $p_{j|i}$ которого означает насколько точка $X_j$ близка к точке $X_i$ при гауссовом распределении вокруг $X_i$. Данное распределение как метрику похожести использует евклидово расстояние. Алгоритм старается получить отображение из точек размерности $\mathbb{R}^k$ в меньшую размерность $\mathbb{R}^d$, для этого вводится еще одно распределение, описывающее насколько точки из нового пространства похожи друг на друга, но используя при этом t-распределение Стьюдента с одной степенью свободы. Как метрику похожести двух распределений используется дивергенция Кульбака-Лейблера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence Дивергенция Кульбака-Лейблера]&amp;lt;/ref&amp;gt;, и чтобы найти точки новой размерности $d$ запускается градиентный спуск для минимизации этой величины. &lt;br /&gt;
===Пример кода scikit-learn===&lt;br /&gt;
Пример выделения признаков с помощью PCA в scikit-learn:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  from sklearn.decomposition import PCA&lt;br /&gt;
  from sklearn.model_selection import train_test_split&lt;br /&gt;
&lt;br /&gt;
  X = ... # загрузка X&lt;br /&gt;
  Y = ... # загрузка Y&lt;br /&gt;
  # Разделение данных на train и test&lt;br /&gt;
  Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y)&lt;br /&gt;
&lt;br /&gt;
  clf = ... # берем какой-то классификатор&lt;br /&gt;
  # Обучаем PCA для выделения 5 признаков&lt;br /&gt;
  pca = PCA(n_components=5)&lt;br /&gt;
  pca.fit(Xtrain)&lt;br /&gt;
  # Изменяем наши наборы данных под выбранные признаки&lt;br /&gt;
  Xtrain = pca.transform(Xtrain)&lt;br /&gt;
  Xtest = pca.transform(Xtest)&lt;br /&gt;
  # Обучаем классификатор и проверяем точность его работы&lt;br /&gt;
  clf.fit(Xtrain, Ytrain)&lt;br /&gt;
  print (&amp;quot;Score: %.6f&amp;quot; % clf.score(Xtest, Ytest))&lt;br /&gt;
  &lt;br /&gt;
===Пример на языке Scala===&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример уменьшение размерности используя smile.feature.GAFeatureSelection&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/feature.html#genetic-algorithm-feature-selection Smile, Genetic Algorithm Based Feature Selection]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.feature.GAFeatureSelection&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.Accuracy&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Загрузка данных&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''data = read.arff(&amp;quot;data/weka/segment-test.arff&amp;quot;, 19)&lt;br /&gt;
  '''val '''(x, y) = data.unzipInt&lt;br /&gt;
  '''val '''trainer = '''new '''GradientTreeBoost.Trainer(100)&lt;br /&gt;
  '''val '''measure = '''new '''Accuracy&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Cоздание генетического алгоритма и его настройка.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''selector = '''new '''GAFeatureSelection&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Размер популяции - 50, количество поколений - 20 &amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Каждая возращаемая BitString содержит фичи и их качество.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''result = selector.learn(50, 20, trainer, measure, x, y, 5)&lt;br /&gt;
  result.foreach { bits =&amp;gt;&lt;br /&gt;
    print(100*bits.fitness)&lt;br /&gt;
    println(bits.bits.mkString(&amp;quot; &amp;quot;))&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Переобучение]]&lt;br /&gt;
*[[Метод опорных векторов (SVM)| SVM]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Дерево решений и случайный лес| Случайный лес]]&lt;br /&gt;
*[[Метод главных компонент (PCA)| PCA]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Стохастическое вложение соседей с t-распределением |t-SNE]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
==Источники информации==&lt;br /&gt;
#[http://research.cs.tamu.edu/prism/lectures/pr/pr_l11.pdf Sequential feature selection] {{---}} курс ML Texas A&amp;amp;M University&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Feature_selection Feature selection] {{---}} статья про Feature Selection в Wikipedia&lt;br /&gt;
#[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117 Публикация про feature selection]&lt;br /&gt;
#[https://towardsdatascience.com/feature-selection-using-random-forest-26d7b747597f Embedded random forest]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Уменьшение размерности]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=69671</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=69671"/>
				<updated>2019-01-30T19:43:48Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обучение с подкреплением == &lt;br /&gt;
&lt;br /&gt;
В обучении с подкреплением существует агент (''agent'') взаимодействует с окружающей средой (''environment''), предпринимая действия (''actions''). Окружающая среда дает награду (''reward'') за эти действия, а агент продолжает их предпринимать.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти стратегию, приписывающую состояниям (''states'') окружающей среды действия, одно из которых может выбрать агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit о многоруком бандите].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения (''states'')  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* множества действий (''actions'') &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot; (''rewards'').&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|link=https://econophysica.ru/services/machine-learning/|Взаимодействие агента со средой]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;:&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите (''The multi-armed bandit problem'') == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|link=http://toppromotion.ru/blog/seo-category/novyij-algoritm-pod-nazvaniem-%C2%ABmnogorukij-bandit%C2%BB.html|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата),&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;:&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
=== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии (''greedy &amp;amp; &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy'') === &lt;br /&gt;
&lt;br /&gt;
==== Жадная (''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания;&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
=== Стратегия Softmax === &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
=== Метод UCB (''upper confidence bound'') === &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний,&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий,&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; {{---}} функция награды,&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; {{---}} функция перехода,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; {{---}} learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; {{---}} discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий.&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q is not converged:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s is not terminal:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[https://login.cs.utexas.edu/sites/default/files/legacy_files/research/documents/1%20intro%20up%20to%20RL%3ATD.pdf Sutton, Richard S., and Andrew G. Barto. Introduction to reinforcement learning. Vol. 135. Cambridge: MIT press, 1998.]&lt;br /&gt;
*[https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf Sutton R. S., Barto A. G. Reinforcement learning: An introduction. – 2011.]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Обучение с подкреплением]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=69670</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=69670"/>
				<updated>2019-01-30T19:39:20Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обучение с подкреплением == &lt;br /&gt;
&lt;br /&gt;
В обучении с подкреплением существует агент (''agent'') взаимодействует с окружающей средой (''environment''), предпринимая действия (''actions''). Окружающая среда дает награду (''reward'') за эти действия, а агент продолжает их предпринимать.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти стратегию, приписывающую состояниям (''states'') окружающей среды действия, одно из которых может выбрать агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit о многоруком бандите].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения (''states'')  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* множества действий (''actions'') &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot; (''rewards'').&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|link=https://econophysica.ru/services/machine-learning/|Взаимодействие агента со средой]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите (''The multi-armed bandit problem'') == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|link=http://toppromotion.ru/blog/seo-category/novyij-algoritm-pod-nazvaniem-%C2%ABmnogorukij-bandit%C2%BB.html|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
=== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии (''greedy &amp;amp; &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy'') === &lt;br /&gt;
&lt;br /&gt;
==== Жадная (''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания;&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
=== Стратегия Softmax === &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
=== Метод UCB (''upper confidence bound'') === &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; {{---}} функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; {{---}} функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; {{---}} learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; {{---}} discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q is not converged:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s is not terminal:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[https://login.cs.utexas.edu/sites/default/files/legacy_files/research/documents/1%20intro%20up%20to%20RL%3ATD.pdf Sutton, Richard S., and Andrew G. Barto. Introduction to reinforcement learning. Vol. 135. Cambridge: MIT press, 1998.]&lt;br /&gt;
*[https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf Sutton R. S., Barto A. G. Reinforcement learning: An introduction. – 2011.]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Обучение с подкреплением]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_policy_gradient_%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D0%BA%D0%B0&amp;diff=69669</id>
		<title>Методы policy gradient и алгоритм асинхронного актора-критика</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_policy_gradient_%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D0%BA%D0%B0&amp;diff=69669"/>
				<updated>2019-01-30T19:35:40Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В алгоритме [[Обучение_с_подкреплением#Q-learning|Q-learning]] агент обучает функцию полезности действия &amp;lt;tex&amp;gt;Q_{\theta}(s, a)&amp;lt;/tex&amp;gt;. Стратегия агента &amp;lt;tex&amp;gt;\pi_{\theta}(a|s)&amp;lt;/tex&amp;gt; определяется согласно текущим значениям &amp;lt;tex&amp;gt;Q(s, a)&amp;lt;/tex&amp;gt; с использованием жадного, &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-жадного или softmax подхода. Однако существуют методы, которые позволяют оптимизировать стратегию &amp;lt;tex&amp;gt;\pi_{\theta}(s|a)&amp;lt;/tex&amp;gt; напрямую. Такие алгоритмы относятся к классу алгоритмов ''policy gradient''.&lt;br /&gt;
&lt;br /&gt;
== Простой policy gradient алгоритм (REINFORCE) ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим Марковский процесс принятия решений (МППР), имеющий терминальное состояние. Задача {{---}} максимизировать сумму всех выигрышей &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_T&amp;lt;/tex&amp;gt;, где T {{---}} шаг, на котором произошел переход в терминальное состояние.&lt;br /&gt;
&lt;br /&gt;
Будем использовать букву &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; для обозначения некоторого ''сценария'' {{---}} последовательности состояний и произведенных в них действий: &amp;lt;tex&amp;gt;\tau = (s_1, a_1, s_2, a_2, ... s_T, a_T)&amp;lt;/tex&amp;gt;. Будем обозначать сумму всех выигрышей, полученных в ходе сценария, как &amp;lt;tex&amp;gt;R_{\tau} = \sum_{\tau} {r(s_t, a_t)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не все сценарии равновероятны. Вероятность реализации сценария зависит от поведения среды, которое задается вероятностями перехода между состояниями &amp;lt;tex&amp;gt;p(s_{t+1}|s_{t}, a_{t})&amp;lt;/tex&amp;gt;, распределением начальных состояний &amp;lt;tex&amp;gt;p(s_1)&amp;lt;/tex&amp;gt; и поведения агента, которое определяется его стохастической стратегией &amp;lt;tex&amp;gt;\pi_{\theta}(a_t|s_t)&amp;lt;/tex&amp;gt;. Вероятностное распределение над сценариями, таким образом, задается как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;p_{\theta}(\tau) = p_{\theta}(s_1, a_1, ... s_T, a_T) = p(s_1) \prod_{t=1}^{T} {\pi_{\theta}(a_t|s_t) p(s_{t+1}|s_t, a_t)}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что вероятности переходов между состояниями агенту неизвестны, то есть у агента нет модели поведения окружающей среды (''model-free learning'').&lt;br /&gt;
&lt;br /&gt;
Нам нужно выбрать такой набор параметров агента &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;, задающий &amp;lt;tex&amp;gt;\pi_{\theta}(a|s)&amp;lt;/tex&amp;gt;, чтобы максимизировать матожидание суммы полученных выигрышей:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;J(\theta) = E_{\tau \sim p_{\theta}(\tau)} \left[ R_{\tau} \right] = \int {p_{\theta}(\tau) R_{\tau} d\tau}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Пусть мы хотим максимизировать функцию &amp;lt;tex&amp;gt;J(\theta)&amp;lt;/tex&amp;gt; методом градиентного подъема. Для этого нам необходимо уметь рассчитывать ее градиент:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta) = \int {\nabla_{\theta}p_{\theta}(\tau) R_{\tau} d\tau} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Мы не можем подсчитать &amp;lt;tex&amp;gt;\nabla_{\theta}p_{\theta}(\tau)&amp;lt;/tex&amp;gt; напрямую, потому что в выражение для &amp;lt;tex&amp;gt;p_{\theta}(\tau)&amp;lt;/tex&amp;gt; входят вероятности переходов между состояниями, которые агенту неизвестны. Однако, так как&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt;p_{\theta}(\tau) \nabla_{\theta} \log p_{\theta}(\tau) = p_{\theta}(\tau) \frac{\nabla_{\theta}p_{\theta}(\tau)}{p_{\theta}(\tau)} = \nabla_{\theta}p_{\theta}(\tau)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
то мы можем заменить &amp;lt;tex&amp;gt;\nabla_{\theta}p_{\theta}(\tau)&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;p_{\theta}(\tau) \nabla_{\theta} \log p_{\theta}(\tau)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta) = \int {p_{\theta}(\tau) \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} d\tau} = E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} \right]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt;\log p_{\theta}(\tau)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;tex&amp;gt; \log p_{\theta}(\tau) = \log \left( p(s_1) \prod_{t=1}^{T} {\pi_{\theta}(a_t|s_t) p(s_{t+1}|s_t, a_t)} \right) = \log p(s_1) + \sum_{t=1}^{T} {\left( \log \pi_{\theta}(a_t|s_t) + \log p(s_{t+1}|s_t, a_t) \right)} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Тогда:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; \nabla_{\theta} \log p_{\theta}(\tau) = \underbrace{\nabla_{\theta} \log p(s_1)}_{=0} + \sum_{t=1}^{T} {\left( \nabla_{\theta} \log \pi_{\theta}(a_t|s_t) + \underbrace{\nabla_{\theta} \log p(s_{t+1}|s_t, a_t)}_{=0} \right)} = \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Подставляя в определение &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; \nabla_{\theta} J(\theta) = E_{\tau \sim p_{\theta}(\tau)} \left[ \left( \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} \right) R_{\tau} \right] &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
[[File:Policy-gradient-reinforce.png|thumb|313px|link=http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_4_policy_gradient.pdf|Схема алгоритма REINFORCE]]&lt;br /&gt;
&lt;br /&gt;
Заметим, что в получившееся выражение для &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt; уже не входят напрямую значения &amp;lt;tex&amp;gt;p(s_{t+1}|s_{t}, a_{t})&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p(s_1)&amp;lt;/tex&amp;gt;, которые нам неизвестны. Таким образом, если у нас есть в наличии сценарий &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; и соответствующее ему значение &amp;lt;tex&amp;gt;R_\tau&amp;lt;/tex&amp;gt;, мы можем вычислить величину &amp;lt;tex&amp;gt;\left( \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} \right) R_{\tau}&amp;lt;/tex&amp;gt;. Значит, если у нас есть выборка из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; уже известных сценариев &amp;lt;tex&amp;gt;\tau^i = (s_1^i, a_1^i, ... s_{T^i}^i, a_{T^i}^i)&amp;lt;/tex&amp;gt;, полученная из распределения &amp;lt;tex&amp;gt;\tau \sim p_{\theta}(\tau)&amp;lt;/tex&amp;gt;, то мы можем приблизить посчитать приблизительное значение &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt; по методу Монте-Карло {{---}} вычислив выборочное среднее случайной величины:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^N { \left( \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i)} \right) R_{\tau^i}} = \frac{1}{N} \sum_{i=1}^N { \left( \sum_{t=1}^{T^i} {\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i)} \right) \left( \sum_{t=1}^{T^i} { r(s_t^i, a_t^i) } \right)} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Осталось понять, как получить несмещенную выборку сценариев &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; из вероятностного распределения &amp;lt;tex&amp;gt;p_{\theta}(\tau)&amp;lt;/tex&amp;gt;. Однако это очень просто {{---}} нам всего лишь нужно зафиксировать параметр &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; и провзаимодействовать со средой, так как распределение &amp;lt;tex&amp;gt;p_{\theta}(\tau)&amp;lt;/tex&amp;gt; задает именно вероятность реализации сценария &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; при взаимодействии агента с фиксированной стратегией со средой. &lt;br /&gt;
&lt;br /&gt;
Таким образом, оптимизировать &amp;lt;tex&amp;gt;J(\theta)&amp;lt;/tex&amp;gt; можно с помощью следующего простого алгоритма (REINFORCE):&lt;br /&gt;
&lt;br /&gt;
# Прогнать &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; сценариев &amp;lt;tex&amp;gt;\tau_i&amp;lt;/tex&amp;gt; со стратегией &amp;lt;tex&amp;gt;\pi_{\theta}(a|s)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# Посчитать среднее арифметическое &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta) \leftarrow \frac{1}{N} \sum_{i=1}^N { \left( \sum_{t=1}^{T^i} {\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i)} \right) \left( \sum_{t=1}^{T^i} { r(s_t^i, a_t^i) } \right)}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \theta \leftarrow \theta + \alpha \nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# Если не сошлись к экстремуму, повторить с пункта 1.&lt;br /&gt;
&lt;br /&gt;
=== Интуитивное объяснение принципа работы ===&lt;br /&gt;
&lt;br /&gt;
[[File:Policy-gradient-trajectories.png|thumb|313px|link=http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_4_policy_gradient.pdf|Иллюстрация выбора наилучшего сценария]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_{\theta}(\tau)&amp;lt;/tex&amp;gt; {{---}} это вероятность того, что будет реализован сценарий &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; при условии параметров модели &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;, т. е. функция ''правдоподобия''. Нам хочется увеличить правдоподобие &amp;quot;хороших&amp;quot; сценариев (обладающих высоким &amp;lt;tex&amp;gt;R_{\tau}&amp;lt;/tex&amp;gt;) и понизить правдоподобие &amp;quot;плохих&amp;quot; сценариев (с низким &amp;lt;tex&amp;gt;R_{\tau}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Взглянем еще раз на полученное определение градиента функции полного выигрыша:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta) = E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} \right]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Двигаясь вверх по этому градиенту, мы повышаем логарифм функции правдоподобия для сценариев, имеющих большой положительный &amp;lt;tex&amp;gt;R_{\tau}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки policy gradient по сравнению с Q-learning ==&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
&lt;br /&gt;
* Легко обобщается на задачи с большим множеством действий, в том числе на задачи с непрерывным множеством действий;&lt;br /&gt;
* По большей части избегает конфликта между эксплуатацией (exploitation) и исследованием (exploration), так как оптимизирует напрямую стохастическую стратегию &amp;lt;tex&amp;gt;\pi_{\theta}(a|s)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* Имеет более сильные гарантии сходимости: если Q-learning гарантированно сходится только для МППР с конечными множествами действий и состояний, то policy gradient, при достаточно точных оценках &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt; (т. е. при достаточно больших выборках сценариев), сходится к локальному оптимуму всегда, в том числе в случае бесконечных множеств действий и состояний, и даже для частично наблюдаемых Марковских процессов принятия решений (ЧНМППР, англ. ''partially observed Markov decision process, POMDP'').&lt;br /&gt;
&lt;br /&gt;
Недостатки:&lt;br /&gt;
&lt;br /&gt;
* Очень низкая скорость работы {{---}} требуется большое количество вычислений для оценки &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt; по методу Монте-Карло, так как:&lt;br /&gt;
** для получения всего одного семпла требуется произвести &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; взаимодействий со средой;&lt;br /&gt;
** случайная величина &amp;lt;tex&amp;gt;\nabla_{\theta} \log p_{\theta}(\tau) R_{\tau}&amp;lt;/tex&amp;gt; имеет большую дисперсию, так как для разных &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; значения &amp;lt;tex&amp;gt;R_{\tau}&amp;lt;/tex&amp;gt; могут очень сильно различаться, поэтому для точной оценки &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta) = E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} \right]&amp;lt;/tex&amp;gt; требуется много семплов;&lt;br /&gt;
** cемплы, собранные для предыдущих значений &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;, никак не переиспользуются на следующем шаге, семплирование нужно делать заново на каждом шаге градиентного спуска.&lt;br /&gt;
* В случае конечных МППР Q-learning сходится к глобальному оптимуму, тогда как policy gradient может застрять в локальном.&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;tex&amp;gt;b&amp;lt;/tex&amp;gt; - константа относительно &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt;E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) (R_{\tau} - b) \right] = E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} \right] &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
так как&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt;E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) b \right] = \int {p_{\theta}(\tau) \nabla_{\theta} \log p_{\theta}(\tau) b d\tau} = \int {\nabla_{\theta} p_{\theta}(\tau) b d\tau} = b \nabla_{\theta} \int {p_{\theta}(\tau) d\tau} = b \nabla_{\theta} 1 = 0&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Таким образом, изменение &amp;lt;tex&amp;gt;R_{\tau}&amp;lt;/tex&amp;gt; на константу не меняет оценку &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt;. Однако ''дисперсия'' &amp;lt;tex&amp;gt; Var_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) (R_{\tau} - b) \right]&amp;lt;/tex&amp;gt; зависит от &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; Var_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) (R_{\tau} - b) \right] = \underbrace{E_{\tau \sim p_{\theta}(\tau)} \left[ \left( \nabla_{\theta} \log p_{\theta}(\tau) (R_{\tau} - b) \right)^2 \right]}_{\text{depends on } b} - \underbrace{E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) (R_{\tau} - b) \right]^2}_{= E \left[ \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} \right]^2} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
поэтому, регулируя &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, можно достичь более низкой дисперсии, а значит, более быстрой сходимости метода Монте-Карло к истинному значению &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt;. Значение &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; называется ''опорным значением''. Способы определения опорных значений будут рассмотрены далее, в рамках рассмотрения алгоритма актора-критика (Actor-Critic).&lt;br /&gt;
&lt;br /&gt;
=== Использование будущего выигрыша вместо полного выигрыша ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим еще раз выражение для градиента полного выигрыша:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; \nabla_{\theta} J(\theta) = E_{\tau \sim p_{\theta}(\tau)} \left[ \left( \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} \right) R_{\tau} \right] = E_{\tau \sim p_{\theta}(\tau)} \left[ \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} \left( \sum_{t=1}^{T} {r(s_t, a_t)} \right) \right]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Так как в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; от действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; зависят только &amp;lt;tex&amp;gt;r(s_{t'}, a_{t'})&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; t' \leq t&amp;lt;/tex&amp;gt;, это выражение можно переписать как&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; \nabla_{\theta} J(\theta) \approx E_{\tau \sim p_{\theta}(\tau)} \left[ \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} \underbrace{\left( \sum_{t'=t}^{T} {r(s_{t'}, a_{t'})} \right)}_{= Q_{\tau, t}} \right]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Величина &amp;lt;tex&amp;gt;Q_{\tau, t}&amp;lt;/tex&amp;gt; {{---}} ''будущий выигрыш'' (reward-to-go) на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в сценарии &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Алгоритм актора-критика с преимуществом (англ. Advantage Actor Critic, A2C) ==&lt;br /&gt;
&lt;br /&gt;
Из предыдущего абзаца:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i) Q_{\tau_i, t} } &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt;Q_{\tau_i, t}&amp;lt;/tex&amp;gt; {{---}} оценка будущего выигрыша из состояния &amp;lt;tex&amp;gt;s_t^i&amp;lt;/tex&amp;gt; при условии действия &amp;lt;tex&amp;gt;a_t^i&amp;lt;/tex&amp;gt;, которая базируется только на одном сценарии &amp;lt;tex&amp;gt;\tau_i&amp;lt;/tex&amp;gt;. Это плохое приближение ожидаемого будущего выигрыша {{---}} истинный ожидаемый будущий выигрыш выражается формулой&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; Q^{\pi}(s_t, a_t) = \sum_{t'=t}^{T} {E_{\pi_{\theta}} [r(s_{t'}, a_{t'}) | s_t, a_t] } &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Также, в целях уменьшения дисперсии случайной величины, введем опорное значение для состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt;, которое назовем ''ожидаемой ценностью'' (value) этого состояния. Ожидаемая ценность состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; {{---}} ожидаемый будущий выигрыш при совершении некоторого действия в этом состоянии согласно стратегии &amp;lt;tex&amp;gt;\pi_{\theta}(a|s)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; V^{\pi}(s_t) = E_{a_t \sim \pi_{\theta}(a_t | s_t)} [Q^{\pi}(s_t, a_t)] = \sum_{t'=t}^{T} {E_{\pi_{\theta}} [r(s_{t'}, a_{t'}) | s_t]}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Таким образом, вместо ожидаемого будущего выигрыша при оценке &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt; будем использовать функцию ''преимущества'' (advantage):&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; A^{\pi}(s_t, a_t) = Q^{\pi}(s_t, a_t) - V^{\pi}(s_t) &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Преимущество действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; {{---}} величина, характеризующая то, насколько выгоднее в состоянии &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; выбрать именно действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итого:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i) A^{\pi}(s_t^i, a_t^i) } &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Как достаточно точно и быстро оценить &amp;lt;tex&amp;gt;A^{\pi}(s_t^i, a_t^i)&amp;lt;/tex&amp;gt;? Сведем задачу к оценке &amp;lt;tex&amp;gt;V^{\pi}(s_t)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; Q^{\pi}(s_t, a_t) = r(s_t, a_t) + E_{s_{t+1} \sim p(s_{t+1} | s_t, a_t)} [V^{\pi}(s_{t+1})] \approx r(s_t, a_t) + V^{\pi}(s_{t+1}) &amp;lt;/tex&amp;gt;,&lt;br /&gt;
: &amp;lt;tex&amp;gt; A^{\pi}(s_t^i, a_t^i) = Q^{\pi}(s_t, a_t) - V^{\pi}(s_t) \approx r(s_t, a_t) + V^{\pi}(s_{t+1}) - V^{\pi}(s_t) &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Теперь нам нужно уметь оценивать &amp;lt;tex&amp;gt;V^{\pi}(s_t) = \sum_{t'=t}^{T} {E_{\pi_{\theta}} [r(s_{t'}, a_{t'}) | s_t] }&amp;lt;/tex&amp;gt;. Мы можем делать это, опять же, с помощью метода Монте-Карло {{---}} так мы получим несмещенную оценку. Но это будет работать не существенно быстрее, чем обычный policy gradient. Вместо этого заметим, что при фиксированных &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; выполняется:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; V^{\pi}(s_t) = r(s_t, a_t) + V^{\pi}(s_{t+1})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Таким образом, если мы имеем некоторую изначальную оценку &amp;lt;tex&amp;gt;V^{\pi}(s)&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, то мы можем обновлять эту оценку путем, аналогичным алгоритму Q-learning:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt; V^{\pi}(s_t) \leftarrow (1 - \beta) V^{\pi}(s_t) + \beta (r(s_t, a_t) + V^{\pi}(s_{t+1})) &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; {{---}} коэффициент обучения (''learning rate'') для функции ценности. Такой пересчет мы можем производить каждый раз, когда агент получает вознаграждение за действие. Так мы получим оценку ценности текущего состояния, не зависящую от выбранного сценария развития событий &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;, а значит, и оценка функции преимущества не будет зависеть от выбора конкретного сценария. Это сильно снижает дисперсию случайной величины &amp;lt;tex&amp;gt;\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i) A^{\pi}(s_t^i, a_t^i)&amp;lt;/tex&amp;gt;, что делает оценку &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt; достаточно точной даже в том случае, когда мы используем всего один сценарий для ее подсчета:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta) \approx \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t) A^{\pi}(s_t, a_t) }&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
На практике же мы можем аппроксимировать &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt; на каждом шаге (в онлайне), основываясь на всего одном действии каждый раз. Алгоритм в итоге будет следующим:&lt;br /&gt;
&lt;br /&gt;
# производим действие &amp;lt;tex&amp;gt;a \sim \pi_{\theta}(a|s)&amp;lt;/tex&amp;gt;, переходим в состояние &amp;lt;tex&amp;gt;s'&amp;lt;/tex&amp;gt; и получаем вознаграждение &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;V^{\pi}(s) \leftarrow (1 - \beta) V^{\pi}(s) + \beta (r + V^{\pi}(s'))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;A_{\pi}(s, a) \leftarrow r + V^{\pi}(s') - V^{\pi}(s) &amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\nabla_{\theta} J(\theta) \leftarrow \nabla_{\theta} \log \pi_{\theta}(a|s) A^{\pi}(s, a)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\theta \leftarrow \theta + \alpha \nabla_{\theta} J(\theta)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# Если не сошлись к экстремуму, повторить с пункта 1.&lt;br /&gt;
&lt;br /&gt;
Такой алгоритм называется алгоритмом актора-критика с преимуществом (Advantage Actor-Critic). Актором здесь называется компонента, которая оптимизирует стратегию &amp;lt;tex&amp;gt;\pi_{\theta}(a|s)&amp;lt;/tex&amp;gt;, а критиком {{---}} компонента, которая подсчитывает ценности состояний &amp;lt;tex&amp;gt;V^{\pi}(s)&amp;lt;/tex&amp;gt;. Актор определяет дальнейшее действие, а критик оценивает, насколько то или иное действие выгодно, основываясь на функции преимущества (advantage).&lt;br /&gt;
&lt;br /&gt;
Алгоритм актора-критика считается гибридным, так как актор работает в соответствии с принципом policy gradient, а критик работает аналогично алгоритму Q-routing.&lt;br /&gt;
&lt;br /&gt;
=== Асинхронный актор-критик (англ. Asynchronous Advantage Actor-Critic, A3C) ===&lt;br /&gt;
&lt;br /&gt;
[[File:Async-actor-critic.png|thumb|313px|link=http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_5_actor_critic_pdf.pdf|Иллюстрация работы алгоритма асинхронного актора-критика]]&lt;br /&gt;
&lt;br /&gt;
Проблема с обучением с подкреплением в онлайне заключается в том, что данные, поступающие на вход алгоритму обучения, сильно скоррелированы: каждое следующее состояние непосредственно зависит от предпринятых агентом действий. Обучение на сильно скоррелированных данных приводит к переобучению. Таким образом, для того, чтобы успешно обучить стратегию, обобщаемую на большое количество состояний среды, нам все еще необходимо обучаться на эпизодах из различных сценариев.&lt;br /&gt;
&lt;br /&gt;
Одним из способов достичь этого является запуск множества агентов параллельно. Все агенты находятся в разных состояниях и выбирают различные конкретные действия согласно стохастической стратегии &amp;lt;tex&amp;gt;\pi_{\theta}(a|s)&amp;lt;/tex&amp;gt;, тем самым достигается устранение корреляции между наблюдаемыми данными. Однако все агенты используют и оптимизируют один и тот же набор параметров &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма асинхронного актора-критика заключается в том, чтобы запустить &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; агентов параллельно, при этом на каждом шаге каждый из агентов рассчитывает обновления для значений &amp;lt;tex&amp;gt;V^{\pi}(s)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;. Однако, вместо того, чтобы просто продолжить работу, каждый агент обновляет &amp;lt;tex&amp;gt;V^{\pi}(s)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;, общие для всех агентов. Перед обработкой каждого нового эпизода агент копирует текущие глобальные значения параметра &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; и использует его, чтобы определить собственную стратегию на этот эпизод. Агенты не ждут, пока остальные агенты завершат обработку своих эпизодов, чтобы обновить глобальные параметры (отсюда ''асинхронный''). Поэтому пока один из агентов обрабатывает один эпизод, глобальное значение &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; может изменяться вследствие действий других агентов.&lt;br /&gt;
&lt;br /&gt;
=== Реализация асинхронного актора-критика на основе нейронных сетей ===&lt;br /&gt;
&lt;br /&gt;
[[File:Actor-critic-nn.png|thumb|313px|link=http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_5_actor_critic_pdf.pdf|Совместная архитектура нейросети для алгоритма актора-критика]]&lt;br /&gt;
&lt;br /&gt;
В большинстве современных исследований стратегия &amp;lt;tex&amp;gt;\pi_{\theta}(a|s)&amp;lt;/tex&amp;gt; и функция ценности &amp;lt;tex&amp;gt;V^{\pi}(s)&amp;lt;/tex&amp;gt; задаются с помощью нейросетей. Каждая из функций может в принципе использовать отдельную нейросеть, но на практике чаще всего применяется совмещенная нейросеть с двумя выходными слоями {{---}} для стратегии и для функции ценности. Такой подход, как правило, приводит к лучшим результатам, так как функция ценности, вообще говоря, зависит от текущей стратегии.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма асинхронного актора-критика инициализирует глобальную нейросеть (master network) и запускает N дочерних процессов (workers), в каждом из которых агент взаимодействует со средой. Нейросеть каждого агента является копией материнской нейросети. Перед началом каждого эпизода веса из материнской нейросети заново копируются в нейросеть агента. Градиенты, посчитанные по агентской нейросети, применяются в итоге к материнской.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Обучение с подкреплением]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
&lt;br /&gt;
* [https://link.springer.com/content/pdf/10.1007/BF00992696.pdf Williams, Ronald J. &amp;quot;Simple statistical gradient-following algorithms for connectionist reinforcement learning.&amp;quot; Machine learning 8.3-4 (1992): 229-256.]&lt;br /&gt;
* [http://papers.nips.cc/paper/1713-policy-gradient-methods-for-reinforcement-learning-with-function-approximation.pdf Sutton, Richard S., et al. &amp;quot;Policy gradient methods for reinforcement learning with function approximation.&amp;quot; Advances in neural information processing systems. 2000.]&lt;br /&gt;
* [http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_4_policy_gradient.pdf Policy Gradients. CS 294-112: Deep Reinforcement Learning, Sergey Levine.] &lt;br /&gt;
* [http://rail.eecs.berkeley.edu/deeprlcourse-fa17/f17docs/lecture_5_actor_critic_pdf.pdf Actor-Critic Algorithms. CS 294-112: Deep Reinforcement Learning, Sergey Levine.]&lt;br /&gt;
* [https://medium.com/emergent-future/simple-reinforcement-learning-with-tensorflow-part-8-asynchronous-actor-critic-agents-a3c-c88f72a5e9f2 Simple Reinforcement Learning with Tensorflow Part 8: Asynchronous Actor-Critic Agents (A3C)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Обучение с подкреплением]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Scala&amp;diff=69668</id>
		<title>Примеры кода на Scala</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Scala&amp;diff=69668"/>
				<updated>2019-01-30T19:19:46Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]&lt;br /&gt;
&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* Breeze&amp;lt;ref&amp;gt;[https://github.com/scalanlp/breeze Breeze]&amp;lt;/ref&amp;gt; {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]&amp;lt;/ref&amp;gt; и NumPy&amp;lt;ref&amp;gt;;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]&amp;lt;/ref&amp;gt;. Breeze позволяет быстро манипулировать данными и позволяет реализовать матричные и векторные операции, решать задачи оптимизации, обрабатывать сигналы устройств;&lt;br /&gt;
* Epic&amp;lt;ref&amp;gt;[http://www.scalanlp.org/ ScalaNLP, Epic]&amp;lt;/ref&amp;gt; {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста;&lt;br /&gt;
* Smpile&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} развивающийся проект, похожий на scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/ scikit-learn]&amp;lt;/ref&amp;gt;, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого;&lt;br /&gt;
* Apache Spark MLlib&amp;lt;ref&amp;gt;[https://spark.apache.org/mllib/ Apache Spark MLlib]&amp;lt;/ref&amp;gt; {{---}} построенная на Spark&amp;lt;ref&amp;gt;[https://spark.apache.org/ Apache Spark]&amp;lt;/ref&amp;gt; имеет большой набор алгоритмов, написанный на Scala;&lt;br /&gt;
* DeepLearning.scala &amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/ DeppLearning.scala]&amp;lt;/ref&amp;gt; {{---}} набор инструментов для глубокого обучения&amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокое обучение]&amp;lt;/ref&amp;gt;. Позволяет создавать динамические нейронные сети, давая возможность параллельных вычеслений.&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
===Линейная регрессия===&lt;br /&gt;
{{main|Линейная регрессия|l1=Линейная регрессия&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''val '''training = spark.read.format(&amp;quot;libsvm&amp;quot;)&lt;br /&gt;
    .load(&amp;quot;linear_regression.txt&amp;quot;)&lt;br /&gt;
  '''val '''lr = '''new '''LinearRegression()&lt;br /&gt;
    .setMaxIter(10)&lt;br /&gt;
    .setRegParam(0.3)&lt;br /&gt;
    .setElasticNetParam(0.8)&lt;br /&gt;
  '''val '''lrModel = lr.fit(training)&lt;br /&gt;
Вывод итоговых параметров модели:&lt;br /&gt;
  println(lrModel.coefficients)&lt;br /&gt;
  println(lrModel.intercept)&lt;br /&gt;
  '''val '''trainingSummary = lrModel.summary&lt;br /&gt;
  println(trainingSummary.totalIterations)&lt;br /&gt;
  println(trainingSummary.objectiveHistory.mkString(&amp;quot;,&amp;quot;))&lt;br /&gt;
  trainingSummary.residuals.show()&lt;br /&gt;
  println(trainingSummary.rootMeanSquaredError)&lt;br /&gt;
  println(trainingSummary.r2)&lt;br /&gt;
&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример ридж и лассо регрессии c применением smile.regression&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/regression.html Smile, Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge}&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;regression.txt&amp;quot;, delimiter = &amp;quot; &amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 0)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Double'''] = data.y()&lt;br /&gt;
  '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)&lt;br /&gt;
  '''val '''lassoRegression: LASSO = lasso(x, y, 10)&lt;br /&gt;
  println(ridgeRegression)&lt;br /&gt;
  println(lassoRegression)&lt;br /&gt;
&lt;br /&gt;
===Логистическая регрессия===&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример логистической регрессии c применением spark.mllib.classification&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}&lt;br /&gt;
  '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics&lt;br /&gt;
  '''import '''org.apache.spark.mllib.regression.LabeledPoint&lt;br /&gt;
  '''import '''org.apache.spark.mllib.util.MLUtils&lt;br /&gt;
&lt;br /&gt;
  '''val '''data = MLUtils.loadLibSVMFile(sc, &amp;quot;logisticRegresion.txt&amp;quot;)&lt;br /&gt;
  '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)&lt;br /&gt;
  '''val '''training = splits(0).cache()&lt;br /&gt;
  '''val '''test = splits(1)&lt;br /&gt;
  '''val '''model = '''new '''LogisticRegressionWithLBFGS()&lt;br /&gt;
    .setNumClasses(10)&lt;br /&gt;
    .run(training)&lt;br /&gt;
&lt;br /&gt;
  '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) =&amp;gt;&lt;br /&gt;
    '''val '''prediction = model.predict(features)&lt;br /&gt;
    (prediction, label)&lt;br /&gt;
  }&lt;br /&gt;
  '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels)&lt;br /&gt;
  '''val '''accuracy = metrics.accuracy&lt;br /&gt;
  println(accuracy)&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации c применением smile.classification.mlp&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.classification.mlp&lt;br /&gt;
  '''import '''smile.plot.plot&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = data.y().map(_.toInt)&lt;br /&gt;
  '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)&lt;br /&gt;
  plot(x, y, mlpModel)&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{main|Рекуррентные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Пример кода, с использованием библиотеки DeepLearning.scala&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание слоёв&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''tanh(x: INDArrayLayer): INDArrayLayer = {&lt;br /&gt;
      '''val '''exp_x = hyperparameters.exp(x)&lt;br /&gt;
      '''val '''exp_nx = hyperparameters.exp(-x)&lt;br /&gt;
      (exp_x - exp_nx) / (exp_x + exp_nx)&lt;br /&gt;
    }&lt;br /&gt;
    '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {&lt;br /&gt;
        '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)&lt;br /&gt;
        '''val '''yraw = why.dot(hnext) + by&lt;br /&gt;
        '''val '''yraw_exp = hyperparameters.exp(yraw)&lt;br /&gt;
        '''val '''prob = yraw_exp / yraw_exp.sum&lt;br /&gt;
        '''val '''loss = -hyperparameters.log((prob * y).sum)&lt;br /&gt;
        (loss, prob, hnext)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Определение структуры&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''val '''batches = data.zip(data.tail).grouped(seqLength).toVector&lt;br /&gt;
    type WithHiddenLayer[A] = (A, INDArrayLayer)&lt;br /&gt;
    type Batch = IndexedSeq[(Char, Char)]&lt;br /&gt;
    type Losses = Vector['''Double''']&lt;br /&gt;
    '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {&lt;br /&gt;
      batch '''match '''{&lt;br /&gt;
        '''case '''(batchseq, hprev) =&amp;gt; batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {&lt;br /&gt;
          (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =&amp;gt;&lt;br /&gt;
            (bstate, xy) '''match '''{&lt;br /&gt;
              '''case '''((tot, localhprev), (x, y)) =&amp;gt; {&lt;br /&gt;
                charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{&lt;br /&gt;
                  '''case '''(localloss, _, localhnext) =&amp;gt; {&lt;br /&gt;
                    (tot + localloss, localhnext)&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;span style=&amp;quot;color:#3D9970&amp;gt;// Определение одного шага обучения&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)&lt;br /&gt;
    '''def '''singleRound(initprevloss: Losses): Future[Losses] =&lt;br /&gt;
      (batches.foldLeftM((initprevloss, initH)) {&lt;br /&gt;
        (bstate: WithHiddenLayer[Losses], batch: Batch) =&amp;gt;&lt;br /&gt;
          bstate '''match '''{&lt;br /&gt;
            '''case '''(prevloss, hprev) =&amp;gt; singleBatch(batch, hprev) '''match '''{&lt;br /&gt;
              '''case '''(bloss, hnext) =&amp;gt; bloss.train.map {&lt;br /&gt;
                (blossval: '''Double''') =&amp;gt; {&lt;br /&gt;
                    '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    (loss_seq, hnext)&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
      }).map {&lt;br /&gt;
        (fstate: WithHiddenLayer[Losses]) =&amp;gt;&lt;br /&gt;
          fstate '''match '''{&lt;br /&gt;
            '''case '''(floss, _) =&amp;gt; floss&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
    '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {&lt;br /&gt;
      (ploss: Losses, round: '''Int''') =&amp;gt; {&lt;br /&gt;
          singleRound(ploss)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Обучение сети&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)&lt;br /&gt;
    '''val '''losses = unsafePerformFuture(allRounds)&lt;br /&gt;
&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
Основная статья: [[Долгая краткосрочная память]].&lt;br /&gt;
&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j&amp;lt;ref&amp;gt;[https://deeplearning4j.org/ DeepLearning4j]&amp;lt;/ref&amp;gt; и ND4J&amp;lt;ref&amp;gt;[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Обработка естественного языка===&lt;br /&gt;
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
Основная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
Основная статья: [[Метод опорных векторов (SVM)]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.svm&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(SVM.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, SVM)&lt;br /&gt;
&lt;br /&gt;
===Дерево решений и случайный лес===&lt;br /&gt;
Основная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
Основная статья: [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.tsukaby&amp;quot; '''%%''' &amp;quot;naive-bayes-classifier-scala&amp;quot; '''%''' &amp;quot;0.2.0&amp;quot;&lt;br /&gt;
Пример классификации используя smile.classification.cart&amp;lt;ref&amp;gt;[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Создание модели&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''bayes = '''new '''BayesClassifier[String, String]()&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание соотвествия категория - слово&amp;lt;/span&amp;gt;&lt;br /&gt;
  bayes.learn(&amp;quot;technology&amp;quot;, &amp;quot;github&amp;quot; :: &amp;quot;git&amp;quot; :: &amp;quot;tech&amp;quot; :: &amp;quot;technology&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;weather&amp;quot;, &amp;quot;sun&amp;quot; :: &amp;quot;rain&amp;quot; :: &amp;quot;cloud&amp;quot; :: &amp;quot;weather&amp;quot; :: &amp;quot;snow&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;government&amp;quot;, &amp;quot;ballot&amp;quot; :: &amp;quot;winner&amp;quot; :: &amp;quot;party&amp;quot; :: &amp;quot;money&amp;quot; :: &amp;quot;candidate&amp;quot; :: Nil)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Тестовые примеры&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''unknownText1 = &amp;quot;I use git&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText2 = &amp;quot;Today's weather is snow&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText3 = &amp;quot;I will vote '''for '''that party&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Классификация&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText1).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// technology&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText2).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// weather&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText3).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// government&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
Основная статья: [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации используя smile.clustering.kmeans&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.clustering._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)&lt;br /&gt;
  '''val '''y = kMeans.getClusterLabel&lt;br /&gt;
  plot(x, y, '.', Palette.COLORS)&lt;br /&gt;
&lt;br /&gt;
===Бустинг, AdaBoost===&lt;br /&gt;
Основная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
Основная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Scala&amp;diff=69667</id>
		<title>Примеры кода на Scala</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Scala&amp;diff=69667"/>
				<updated>2019-01-30T19:19:02Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]&lt;br /&gt;
&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* Breeze&amp;lt;ref&amp;gt;[https://github.com/scalanlp/breeze Breeze]&amp;lt;/ref&amp;gt; {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]&amp;lt;/ref&amp;gt; и NumPy&amp;lt;ref&amp;gt;;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]&amp;lt;/ref&amp;gt;. Breeze позволяет быстро манипулировать данными и позволяет реализовать матричные и векторные операции, решать задачи оптимизации, обрабатывать сигналы устройств;&lt;br /&gt;
* Epic&amp;lt;ref&amp;gt;[http://www.scalanlp.org/ ScalaNLP, Epic]&amp;lt;/ref&amp;gt; {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста;&lt;br /&gt;
* Smpile&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} развивающийся проект, похожий на scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/ scikit-learn]&amp;lt;/ref&amp;gt;, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого;&lt;br /&gt;
* Apache Spark MLlib&amp;lt;ref&amp;gt;[https://spark.apache.org/mllib/ Apache Spark MLlib]&amp;lt;/ref&amp;gt; {{---}} построенная на Spark&amp;lt;ref&amp;gt;[https://spark.apache.org/ Apache Spark]&amp;lt;/ref&amp;gt; имеет большой набор алгоритмов, написанный на Scala;&lt;br /&gt;
* DeepLearning.scala &amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/ DeppLearning.scala]&amp;lt;/ref&amp;gt; {{---}} набор инструментов для глубокого обучения&amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокое обучение]&amp;lt;/ref&amp;gt;. Позволяет создавать динамические нейронные сети, давая возможность параллельных вычеслений.&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
===Линейная регрессия===&lt;br /&gt;
{{main|Линейная регрессия|l1=Линейная регрессия&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''val '''training = spark.read.format(&amp;quot;libsvm&amp;quot;)&lt;br /&gt;
    .load(&amp;quot;linear_regression.txt&amp;quot;)&lt;br /&gt;
  '''val '''lr = '''new '''LinearRegression()&lt;br /&gt;
    .setMaxIter(10)&lt;br /&gt;
    .setRegParam(0.3)&lt;br /&gt;
    .setElasticNetParam(0.8)&lt;br /&gt;
  '''val '''lrModel = lr.fit(training)&lt;br /&gt;
Вывод итоговых параметров модели:&lt;br /&gt;
  println(lrModel.coefficients)&lt;br /&gt;
  println(lrModel.intercept)&lt;br /&gt;
  '''val '''trainingSummary = lrModel.summary&lt;br /&gt;
  println(trainingSummary.totalIterations)&lt;br /&gt;
  println(trainingSummary.objectiveHistory.mkString(&amp;quot;,&amp;quot;))&lt;br /&gt;
  trainingSummary.residuals.show()&lt;br /&gt;
  println(trainingSummary.rootMeanSquaredError)&lt;br /&gt;
  println(trainingSummary.r2)&lt;br /&gt;
&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример ридж и лассо регрессии c применением smile.regression&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/regression.html Smile, Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge}&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;regression.txt&amp;quot;, delimiter = &amp;quot; &amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 0)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Double'''] = data.y()&lt;br /&gt;
  '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)&lt;br /&gt;
  '''val '''lassoRegression: LASSO = lasso(x, y, 10)&lt;br /&gt;
  println(ridgeRegression)&lt;br /&gt;
  println(lassoRegression)&lt;br /&gt;
&lt;br /&gt;
===Логистическая регрессия===&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример логистической регрессии c применением spark.mllib.classification&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}&lt;br /&gt;
  '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics&lt;br /&gt;
  '''import '''org.apache.spark.mllib.regression.LabeledPoint&lt;br /&gt;
  '''import '''org.apache.spark.mllib.util.MLUtils&lt;br /&gt;
&lt;br /&gt;
  '''val '''data = MLUtils.loadLibSVMFile(sc, &amp;quot;logisticRegresion.txt&amp;quot;)&lt;br /&gt;
  '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)&lt;br /&gt;
  '''val '''training = splits(0).cache()&lt;br /&gt;
  '''val '''test = splits(1)&lt;br /&gt;
  '''val '''model = '''new '''LogisticRegressionWithLBFGS()&lt;br /&gt;
    .setNumClasses(10)&lt;br /&gt;
    .run(training)&lt;br /&gt;
&lt;br /&gt;
  '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) =&amp;gt;&lt;br /&gt;
    '''val '''prediction = model.predict(features)&lt;br /&gt;
    (prediction, label)&lt;br /&gt;
  }&lt;br /&gt;
  '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels)&lt;br /&gt;
  '''val '''accuracy = metrics.accuracy&lt;br /&gt;
  println(accuracy)&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации c применением smile.classification.mlp&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.classification.mlp&lt;br /&gt;
  '''import '''smile.plot.plot&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = data.y().map(_.toInt)&lt;br /&gt;
  '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)&lt;br /&gt;
  plot(x, y, mlpModel)&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{main|Рекуррентные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Пример кода, с использованием библиотеки DeepLearning.scala&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание слоёв&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''tanh(x: INDArrayLayer): INDArrayLayer = {&lt;br /&gt;
      '''val '''exp_x = hyperparameters.exp(x)&lt;br /&gt;
      '''val '''exp_nx = hyperparameters.exp(-x)&lt;br /&gt;
      (exp_x - exp_nx) / (exp_x + exp_nx)&lt;br /&gt;
    }&lt;br /&gt;
    '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {&lt;br /&gt;
        '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)&lt;br /&gt;
        '''val '''yraw = why.dot(hnext) + by&lt;br /&gt;
        '''val '''yraw_exp = hyperparameters.exp(yraw)&lt;br /&gt;
        '''val '''prob = yraw_exp / yraw_exp.sum&lt;br /&gt;
        '''val '''loss = -hyperparameters.log((prob * y).sum)&lt;br /&gt;
        (loss, prob, hnext)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Определение структуры&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''val '''batches = data.zip(data.tail).grouped(seqLength).toVector&lt;br /&gt;
    type WithHiddenLayer[A] = (A, INDArrayLayer)&lt;br /&gt;
    type Batch = IndexedSeq[(Char, Char)]&lt;br /&gt;
    type Losses = Vector['''Double''']&lt;br /&gt;
    '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {&lt;br /&gt;
      batch '''match '''{&lt;br /&gt;
        '''case '''(batchseq, hprev) =&amp;gt; batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {&lt;br /&gt;
          (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =&amp;gt;&lt;br /&gt;
            (bstate, xy) '''match '''{&lt;br /&gt;
              '''case '''((tot, localhprev), (x, y)) =&amp;gt; {&lt;br /&gt;
                charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{&lt;br /&gt;
                  '''case '''(localloss, _, localhnext) =&amp;gt; {&lt;br /&gt;
                    (tot + localloss, localhnext)&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;span style=&amp;quot;color:#3D9970&amp;gt;// Определение одного шага обучения&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)&lt;br /&gt;
    '''def '''singleRound(initprevloss: Losses): Future[Losses] =&lt;br /&gt;
      (batches.foldLeftM((initprevloss, initH)) {&lt;br /&gt;
        (bstate: WithHiddenLayer[Losses], batch: Batch) =&amp;gt;&lt;br /&gt;
          bstate '''match '''{&lt;br /&gt;
            '''case '''(prevloss, hprev) =&amp;gt; singleBatch(batch, hprev) '''match '''{&lt;br /&gt;
              '''case '''(bloss, hnext) =&amp;gt; bloss.train.map {&lt;br /&gt;
                (blossval: '''Double''') =&amp;gt; {&lt;br /&gt;
                    '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    (loss_seq, hnext)&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
      }).map {&lt;br /&gt;
        (fstate: WithHiddenLayer[Losses]) =&amp;gt;&lt;br /&gt;
          fstate '''match '''{&lt;br /&gt;
            '''case '''(floss, _) =&amp;gt; floss&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
    '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {&lt;br /&gt;
      (ploss: Losses, round: '''Int''') =&amp;gt; {&lt;br /&gt;
          singleRound(ploss)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Обучение сети&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)&lt;br /&gt;
    '''val '''losses = unsafePerformFuture(allRounds)&lt;br /&gt;
&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
Основная статья: [[Долгая краткосрочная память]].&lt;br /&gt;
&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j&amp;lt;ref&amp;gt;[https://deeplearning4j.org/ DeepLearning4j]&amp;lt;/ref&amp;gt; и ND4J&amp;lt;ref&amp;gt;[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Обработка естественного языка===&lt;br /&gt;
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
Освновная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
Освновная статья: [[Метод опорных векторов (SVM)]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.svm&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(SVM.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, SVM)&lt;br /&gt;
&lt;br /&gt;
===Дерево решений и случайный лес===&lt;br /&gt;
Основная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
Основная статья: [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.tsukaby&amp;quot; '''%%''' &amp;quot;naive-bayes-classifier-scala&amp;quot; '''%''' &amp;quot;0.2.0&amp;quot;&lt;br /&gt;
Пример классификации используя smile.classification.cart&amp;lt;ref&amp;gt;[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Создание модели&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''bayes = '''new '''BayesClassifier[String, String]()&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание соотвествия категория - слово&amp;lt;/span&amp;gt;&lt;br /&gt;
  bayes.learn(&amp;quot;technology&amp;quot;, &amp;quot;github&amp;quot; :: &amp;quot;git&amp;quot; :: &amp;quot;tech&amp;quot; :: &amp;quot;technology&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;weather&amp;quot;, &amp;quot;sun&amp;quot; :: &amp;quot;rain&amp;quot; :: &amp;quot;cloud&amp;quot; :: &amp;quot;weather&amp;quot; :: &amp;quot;snow&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;government&amp;quot;, &amp;quot;ballot&amp;quot; :: &amp;quot;winner&amp;quot; :: &amp;quot;party&amp;quot; :: &amp;quot;money&amp;quot; :: &amp;quot;candidate&amp;quot; :: Nil)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Тестовые примеры&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''unknownText1 = &amp;quot;I use git&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText2 = &amp;quot;Today's weather is snow&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText3 = &amp;quot;I will vote '''for '''that party&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Классификация&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText1).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// technology&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText2).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// weather&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText3).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// government&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
Основная статья: [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации используя smile.clustering.kmeans&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.clustering._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)&lt;br /&gt;
  '''val '''y = kMeans.getClusterLabel&lt;br /&gt;
  plot(x, y, '.', Palette.COLORS)&lt;br /&gt;
&lt;br /&gt;
===Бустинг, AdaBoost===&lt;br /&gt;
Основная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
Основная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Python&amp;diff=69666</id>
		<title>Обзор библиотек для машинного обучения на Python</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Python&amp;diff=69666"/>
				<updated>2019-01-30T19:15:48Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:python-logo.png|auto|thumb|Python: https://www.python.org]]&lt;br /&gt;
&lt;br /&gt;
==Scikit-learn==&lt;br /&gt;
===Описание===&lt;br /&gt;
Scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/ Библиотека scikit-learn]&amp;lt;/ref&amp;gt; {{---}} библиотека машинного обучения на языке программирования Python с открытым исходным кодом. Содержит реализации практически всех возможных преобразований, и нередко ее одной хватает для полной реализации модели. В данной библиотеки реализованы методы разбиения датасета на тестовый и обучающий, вычисление основных метрик над наборами данных, проведение [[кросс-валидации|Кросс-валидация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. В библиотеке также есть основные алгоритмы машинного обучения: [[Линейная регрессия|линейной регрессии]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и её модификаций Лассо, гребневой регрессии, [[Метод опорных векторов (SVM)|опорных векторов]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Дерево решений и случайный лес|решающих деревьев и лесов]] и др. Есть и реализации основных методов [[Кластеризация|кластеризации]]. Кроме того, библиотека содержит постоянно используемые исследователями методы работы с признаками: например, понижение размерности [[Метод главных компонент (PCA)|методом главных компонент]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. Частью пакета является библиотека imblearn&amp;lt;ref&amp;gt;[https://imbalanced-learn.readthedocs.io/en/stable/index.html Библиотека imbalanced-learn]&amp;lt;/ref&amp;gt;, позволяющая работать с разбалансированными выборками и генерировать новые значения.&lt;br /&gt;
&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{Main|Линейная регрессия|l1=Линейная регрессия&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Add required imports&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''import''' matplotlib.pyplot '''as''' plt&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''from''' sklearn '''import''' datasets&lt;br /&gt;
  '''from''' sklearn.linear_model '''import''' LinearRegression&lt;br /&gt;
  '''from''' sklearn.metrics '''import''' mean_squared_error, r2_score&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  diabetes = datasets.load_diabetes()&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Use only one feature&amp;lt;/font&amp;gt;&lt;br /&gt;
  diabetes_X = diabetes.data[:, np.newaxis, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тренировочный и тестовый:&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Split the data into training/testing sets&amp;lt;/font&amp;gt;&lt;br /&gt;
  x_train = diabetes_X[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;]&lt;br /&gt;
  x_test = diabetes_X[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;:]&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Split the targets into training/testing sets&amp;lt;/font&amp;gt;&lt;br /&gt;
  y_train = diabetes.target[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;]&lt;br /&gt;
  y_test = diabetes.target[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;:]&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  lr = LinearRegression()&lt;br /&gt;
  lr.fit(x_train, y_train)&lt;br /&gt;
  predictions = lr.predict(x_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# The mean squared error&amp;lt;/font&amp;gt;&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Mean squared error: %.2f&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
        % mean_squared_error(y_test, predictions))&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Explained variance score: 1 is perfect prediction&amp;lt;/font&amp;gt;&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Variance score: %.2f'&amp;lt;/font&amp;gt; % r2_score(y_test, predictions))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Mean squared error: 2548.07'''&lt;br /&gt;
    '''Variance score: 0.47'''&lt;br /&gt;
&lt;br /&gt;
Построение графика прямой, получившейся в результате работы линейной регрессии:&lt;br /&gt;
  plt.scatter(x_test, y_test,  color=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'black'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.plot(x_test, predictions, color=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'blue'&amp;lt;/font&amp;gt;, linewidth=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.xticks(())&lt;br /&gt;
  plt.yticks(())&lt;br /&gt;
  plt.show()&lt;br /&gt;
&lt;br /&gt;
[[File:Diabetes-sklearn.png|400px|none|super]]&lt;br /&gt;
&lt;br /&gt;
====Логистическая регрессия====&lt;br /&gt;
{{Main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn.datasets '''import''' load_digits&lt;br /&gt;
  digits = load_digits()&lt;br /&gt;
&lt;br /&gt;
Вывод первых трех тренировочных данных для визуализации:&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''import''' matplotlib.pyplot '''as''' plt&lt;br /&gt;
  &lt;br /&gt;
  plt.figure(figsize=(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;,&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;))&lt;br /&gt;
  '''for''' index, (image, label) '''in''' enumerate(zip(digits.data[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;], digits.target[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;])):&lt;br /&gt;
    plt.subplot(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;, index + &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;)&lt;br /&gt;
    plt.imshow(np.reshape(image, (&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;8&amp;lt;/font&amp;gt;,&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;8&amp;lt;/font&amp;gt;)), cmap=plt.cm.gray)&lt;br /&gt;
    plt.title(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Training: %i\n'&amp;lt;/font&amp;gt; % label, fontsize = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
[[File:Digits-sklearn.png|800px|none|super]]&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тренировочный и тестовый:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
  x_train, x_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.25&amp;lt;/font&amp;gt;, random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  '''from''' sklearn.linear_model '''import''' LogisticRegression&lt;br /&gt;
  lr = LogisticRegression()&lt;br /&gt;
  lr.fit(x_train, y_train)&lt;br /&gt;
  predictions = lr.predict(x_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  score = lr.score(x_test, y_test)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % score)&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Score: 0.953'''&lt;br /&gt;
&lt;br /&gt;
====Перцептрон====&lt;br /&gt;
{{Main|Нейронные сети, перцептрон}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn '''import''' datasets&lt;br /&gt;
  iris = datasets.load_iris()&lt;br /&gt;
  X = iris.data&lt;br /&gt;
  y = iris.target&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тренировочный и тестовый:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.20&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Трансформация признаков:&lt;br /&gt;
  '''from''' sklearn.preprocessing '''import''' StandardScaler&lt;br /&gt;
  scaler = StandardScaler()&lt;br /&gt;
  scaler.fit(X_train)&lt;br /&gt;
  X_train = scaler.transform(X_train)&lt;br /&gt;
  X_test = scaler.transform(X_test)&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  '''from''' sklearn.neural_network '''import''' MLPClassifier&lt;br /&gt;
  mlp = MLPClassifier(hidden_layer_sizes=(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;), max_iter=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1000&amp;lt;/font&amp;gt;)&lt;br /&gt;
  mlp.fit(X_train, y_train.values.ravel())&lt;br /&gt;
  predictions = mlp.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  '''from''' sklearn.metrics '''import''' classification_report, confusion_matrix&lt;br /&gt;
  print(confusion_matrix(y_test,predictions))&lt;br /&gt;
  print(classification_report(y_test,predictions))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''[[ 7  0  0]'''&lt;br /&gt;
     '''[ 0  8  1]'''&lt;br /&gt;
     '''[ 0  2 12]]'''&lt;br /&gt;
                  '''precision    recall  f1-score   support'''&lt;br /&gt;
  &lt;br /&gt;
               '''0       1.00      1.00      1.00         7'''&lt;br /&gt;
               '''1       0.80      0.89      0.84         9'''&lt;br /&gt;
               '''2       0.92      0.86      0.89        14'''&lt;br /&gt;
  &lt;br /&gt;
       '''micro avg       0.90      0.90      0.90        30'''&lt;br /&gt;
       '''macro avg       0.91      0.92      0.91        30'''&lt;br /&gt;
    '''weighted avg       0.90      0.90      0.90        30'''&lt;br /&gt;
&lt;br /&gt;
====Метрический классификатор и метод ближайших соседей====&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример использования (через scikit-learn)|l1=Метрический классификатор и метод ближайших соседей: пример через scikit-learn}}&lt;br /&gt;
&lt;br /&gt;
====Дерево решений и случайный лес====&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Примеры использования (в scikit-learn)|l1=Дерево решений и случайный лес: пример через scikit-learn}}&lt;br /&gt;
&lt;br /&gt;
====Обработка естественного языка====&lt;br /&gt;
{{Main|Обработка естественного языка}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn '''import''' fetch_20newsgroups&lt;br /&gt;
  twenty_train = fetch_20newsgroups(subset=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'train'&amp;lt;/font&amp;gt;, shuffle='''True''', random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Вывод первых трех строк первого тренивочного файла и его класса:&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/font&amp;gt;.join(twenty_train.data[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;].split(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/font&amp;gt;)[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;]))&lt;br /&gt;
  print(twenty_train.target_names[twenty_train.target[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;]])&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''From: lerxst@wam.umd.edu (where's my thing)'''&lt;br /&gt;
    '''Subject: WHAT car is this!?'''&lt;br /&gt;
    '''Nntp-Posting-Host: rac3.wam.umd.edu'''&lt;br /&gt;
  &lt;br /&gt;
    '''rec.autos'''&lt;br /&gt;
&lt;br /&gt;
Построение и обучение двух моделей. Первая на основе [[Байесовская классификация | Байесовской классификации]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, а вторая использует метод опорных векторов:&lt;br /&gt;
  '''from''' sklearn.pipeline '''import''' Pipeline&lt;br /&gt;
  '''from''' sklearn.feature_extraction.text '''import''' CountVectorizer, TfidfTransformer&lt;br /&gt;
  &lt;br /&gt;
  '''from''' sklearn.naive_bayes '''import''' MultinomialNB&lt;br /&gt;
  text_clf1 = Pipeline([&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'vect'&amp;lt;/font&amp;gt;, CountVectorizer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tfidf'&amp;lt;/font&amp;gt;, TfidfTransformer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'clf'&amp;lt;/font&amp;gt;, MultinomialNB()),&lt;br /&gt;
  ])&lt;br /&gt;
  &lt;br /&gt;
  '''from''' sklearn.linear_model '''import''' SGDClassifier&lt;br /&gt;
  text_clf2 = Pipeline([&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'vect'&amp;lt;/font&amp;gt;, CountVectorizer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tfidf'&amp;lt;/font&amp;gt;, TfidfTransformer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'clf'&amp;lt;/font&amp;gt;, SGDClassifier(loss=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'hinge'&amp;lt;/font&amp;gt;, penalty=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'l2'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                          alpha=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1e-3&amp;lt;/font&amp;gt;, random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;,&lt;br /&gt;
                          max_iter=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, tol='''None''')),&lt;br /&gt;
  ])&lt;br /&gt;
  &lt;br /&gt;
  text_clf1.fit(twenty_train.data, twenty_train.target)&lt;br /&gt;
  text_clf2.fit(twenty_train.data, twenty_train.target)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритмов:&lt;br /&gt;
  twenty_test = fetch_20newsgroups(subset=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'test'&amp;lt;/font&amp;gt;, shuffle='''True''', random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;)&lt;br /&gt;
  docs_test = twenty_test.data&lt;br /&gt;
  predicted1 = text_clf1.predict(docs_test)&lt;br /&gt;
  predicted2 = text_clf2.predict(docs_test)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % np.mean(predicted1 == twenty_test.target))&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % np.mean(predicted2 == twenty_test.target))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Score for naive Bayes: 0.774'''&lt;br /&gt;
    '''Score for SVM: 0.824'''&lt;br /&gt;
&lt;br /&gt;
====Кросс-валилация и подбор параметров====&lt;br /&gt;
{{Main|Кросс-валидация}}&lt;br /&gt;
&lt;br /&gt;
Возьмем предыдущий пример с обработкой естественного языка и попробуем увеличить точность алгоритма за счет кросс-валидации и подбора параметров:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
  parameters = {&lt;br /&gt;
      &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'vect__ngram_range'&amp;lt;/font&amp;gt;: [(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;), (&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)],&lt;br /&gt;
      &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tfidf__use_idf'&amp;lt;/font&amp;gt;: ('''True''', '''False'''),&lt;br /&gt;
      &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'clf__alpha'&amp;lt;/font&amp;gt;: (&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1e-2&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1e-3&amp;lt;/font&amp;gt;),&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  gs_clf = GridSearchCV(text_clf2, parameters, cv=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, iid='''False''', n_jobs=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;)&lt;br /&gt;
  gs_clf = gs_clf.fit(twenty_train.data, twenty_train.target)&lt;br /&gt;
  &lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Best score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % gs_clf.best_score_)&lt;br /&gt;
  &lt;br /&gt;
  '''for''' param_name '''in''' sorted(parameters.keys()):&lt;br /&gt;
    print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;%s: %r&amp;quot;&amp;lt;/font&amp;gt; % (param_name, gs_clf.best_params_[param_name]))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Best score: 0.904'''&lt;br /&gt;
    '''clf__alpha: 0.001'''&lt;br /&gt;
    '''tfidf__use_idf: True'''&lt;br /&gt;
    '''vect__ngram_range: (1, 2)'''&lt;br /&gt;
&lt;br /&gt;
====Метод опорных векторов (SVM)====&lt;br /&gt;
{{Main|Метод опорных векторов (SVM)|l1=Метод опорных векторов (SVM) &amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn '''import''' datasets&lt;br /&gt;
  iris = datasets.load_iris()&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тестовый и тренировочный:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
  x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.25&amp;lt;/font&amp;gt;, random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  clf = svm.SVC(kernel=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'linear'&amp;lt;/font&amp;gt;, C=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;)&lt;br /&gt;
  clf.fit(x_train, y_train)&lt;br /&gt;
  predictions = clf.predict(x_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  '''from''' sklearn.metrics '''import''' classification_report, confusion_matrix&lt;br /&gt;
  print(confusion_matrix(y_test,predictions))&lt;br /&gt;
  print(classification_report(y_test,predictions))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''[[13  0  0]'''&lt;br /&gt;
     '''[ 0 15  1]'''&lt;br /&gt;
     '''[ 0  0  9]]'''&lt;br /&gt;
                  '''precision    recall  f1-score   support'''&lt;br /&gt;
  &lt;br /&gt;
               '''0       1.00      1.00      1.00        13'''&lt;br /&gt;
               '''1       1.00      0.94      0.97        16'''&lt;br /&gt;
               '''2       0.90      1.00      0.95         9'''&lt;br /&gt;
  &lt;br /&gt;
       '''micro avg       0.97      0.97      0.97        38'''&lt;br /&gt;
       '''macro avg       0.97      0.98      0.97        38'''&lt;br /&gt;
    '''weighted avg       0.98      0.97      0.97        38'''&lt;br /&gt;
&lt;br /&gt;
====EM-алгоритм====&lt;br /&gt;
{{Main|EM-алгоритм|l1=EM-алгоритм&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''import''' matplotlib.pyplot '''as''' plt&lt;br /&gt;
  '''from''' matplotlib.colors '''import''' LogNorm&lt;br /&gt;
  '''from''' sklearn '''import''' mixture&lt;br /&gt;
  &lt;br /&gt;
  n_samples = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;300&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# generate random sample, two components&amp;lt;/font&amp;gt;&lt;br /&gt;
  np.random.seed(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# generate spherical data centered on (20, 20)&amp;lt;/font&amp;gt;&lt;br /&gt;
  shifted_gaussian = np.random.randn(n_samples, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;) + np.array([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;])&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# generate zero centered stretched Gaussian data&amp;lt;/font&amp;gt;&lt;br /&gt;
  C = np.array([[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-0.7&amp;lt;/font&amp;gt;], [&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3.5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;.7&amp;lt;/font&amp;gt;]])&lt;br /&gt;
  stretched_gaussian = np.dot(np.random.randn(n_samples, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;), C)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# concatenate the two datasets into the final training set&amp;lt;/font&amp;gt;&lt;br /&gt;
  X_train = np.vstack([shifted_gaussian, stretched_gaussian])&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# fit a Gaussian Mixture Model with two components&amp;lt;/font&amp;gt;&lt;br /&gt;
  clf = mixture.GaussianMixture(n_components=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;, covariance_type=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'full'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  clf.fit(X_train)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# display predicted scores by the model as a contour plot&amp;lt;/font&amp;gt;&lt;br /&gt;
  x = np.linspace(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20.&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;30.&amp;lt;/font&amp;gt;)&lt;br /&gt;
  y = np.linspace(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20.&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;40.&amp;lt;/font&amp;gt;)&lt;br /&gt;
  X, Y = np.meshgrid(x, y)&lt;br /&gt;
  XX = np.array([X.ravel(), Y.ravel()]).T&lt;br /&gt;
  Z = -clf.score_samples(XX)&lt;br /&gt;
  Z = Z.reshape(X.shape)&lt;br /&gt;
  &lt;br /&gt;
  CS = plt.contour(X, Y, Z, norm=LogNorm(vmin=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;, vmax=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1000.0&amp;lt;/font&amp;gt;),&lt;br /&gt;
                   levels=np.logspace(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;))&lt;br /&gt;
  CB = plt.colorbar(CS, shrink=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.8&amp;lt;/font&amp;gt;, extend=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'both'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.scatter(X_train[:, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;], X_train[:, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;], &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;.8&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  plt.title(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Negative log-likelihood predicted by a GMM'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.axis(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tight'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.show()&lt;br /&gt;
&lt;br /&gt;
[[File:Em.png|400px|none|super]]&lt;br /&gt;
&lt;br /&gt;
====Уменьшение размерности====&lt;br /&gt;
{{Main|Уменьшение размерности#Пример кода scikit-learn|l1=Уменьшение размерности: пример через scikit-learn}}&lt;br /&gt;
&lt;br /&gt;
==Tensorflow==&lt;br /&gt;
===Описание===&lt;br /&gt;
Tensorflow&amp;lt;ref&amp;gt;[https://www.tensorflow.org Библиотека Tensorflow]&amp;lt;/ref&amp;gt; {{---}} библиотека, разработанная корпорацией Google для работы с тензорами, используется для построения нейронных сетей. Поддержка вычислений на видеокартах имеет поддержку языка программирования C++. На основе данной библиотеки строятся более высокоуровневые библиотеки для работы с нейронными сетями на уровне целых слоев. Так, некоторое время назад популярная библиотека Keras стала использовать Tensorflow как основной бэкенд для вычислений вместо аналогичной библиотеки Theano. Для работы на видеокартах NVIDIA используется библиотека cuDNN. Если вы работаете с картинками (со сверточными нейросетями), скорее всего, придется использовать данную библиотеку.&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Сверточная нейронная сеть====&lt;br /&gt;
{{Main|Сверточные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Реализация сверточной нейронной сети для классификации цифр из датасета MNIST:&lt;br /&gt;
  '''from''' __future__ '''import''' division, print_function, absolute_import&lt;br /&gt;
  '''import''' tensorflow '''as''' tf&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Import MNIST data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''from''' tensorflow.examples.tutorials.mnist '''import''' input_data&lt;br /&gt;
  mnist = input_data.read_data_sets(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;/tmp/data/&amp;quot;&amp;lt;/font&amp;gt;, one_hot='''True''')&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Training Parameters&amp;lt;/font&amp;gt;&lt;br /&gt;
  learning_rate = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.001&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_steps = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;200&amp;lt;/font&amp;gt;&lt;br /&gt;
  batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;128&amp;lt;/font&amp;gt;&lt;br /&gt;
  display_step = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Network Parameters&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_input = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;784&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MNIST data input (img shape: 28*28)&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_classes = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MNIST total classes (0-9 digits)&amp;lt;/font&amp;gt;&lt;br /&gt;
  dropout = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.75&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Dropout, probability to keep units&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# tf Graph input&amp;lt;/font&amp;gt;&lt;br /&gt;
  X = tf.placeholder(tf.float32, ['''None''', num_input])&lt;br /&gt;
  Y = tf.placeholder(tf.float32, ['''None''', num_classes])&lt;br /&gt;
  keep_prob = tf.placeholder(tf.float32) &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# dropout (keep probability)&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Create some wrappers for simplicity&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''def''' conv2d(x, W, b, strides=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;):&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Conv2D wrapper, with bias and relu activation&amp;lt;/font&amp;gt;&lt;br /&gt;
    x = tf.nn.conv2d(x, W, strides=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, strides, strides, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;], padding=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'SAME'&amp;lt;/font&amp;gt;)&lt;br /&gt;
    x = tf.nn.bias_add(x, b)&lt;br /&gt;
    '''return''' tf.nn.relu(x)&lt;br /&gt;
  &lt;br /&gt;
  '''def''' maxpool2d(x, k=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;):&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MaxPool2D wrapper&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''return''' tf.nn.max_pool(x, ksize=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, k, k, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;], strides=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, k, k, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;],&lt;br /&gt;
                          padding=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'SAME'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Create model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''def''' conv_net(x, weights, biases, dropout):&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MNIST data input is a 1-D vector of 784 features (28*28 pixels)&lt;br /&gt;
    # Reshape to match picture format [Height x Width x Channel]&lt;br /&gt;
    # Tensor input become 4-D: [Batch Size, Height, Width, Channel]&amp;lt;/font&amp;gt;&lt;br /&gt;
    x = tf.reshape(x, shape=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;28&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;28&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;])&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Convolution Layer&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv1 = conv2d(x, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc1'&amp;lt;/font&amp;gt;], biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc1'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Max Pooling (down-sampling)&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv1 = maxpool2d(conv1, k=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Convolution Layer&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv2 = conv2d(conv1, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc2'&amp;lt;/font&amp;gt;], biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc2'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Max Pooling (down-sampling)&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv2 = maxpool2d(conv2, k=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Fully connected layer&lt;br /&gt;
    # Reshape conv2 output to fit fully connected layer input&amp;lt;/font&amp;gt;&lt;br /&gt;
    fc1 = tf.reshape(conv2, [&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wd1'&amp;lt;/font&amp;gt;].get_shape().as_list()[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;]])&lt;br /&gt;
    fc1 = tf.add(tf.matmul(fc1, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wd1'&amp;lt;/font&amp;gt;]), biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bd1'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    fc1 = tf.nn.relu(fc1)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Apply Dropout&amp;lt;/font&amp;gt;&lt;br /&gt;
    fc1 = tf.nn.dropout(fc1, dropout)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Output, class prediction&amp;lt;/font&amp;gt;&lt;br /&gt;
    out = tf.add(tf.matmul(fc1, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;]), biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    '''return''' out&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Store layers weight &amp;amp; bias&amp;lt;/font&amp;gt;&lt;br /&gt;
  weights = {&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# 5x5 conv, 1 input, 32 outputs&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# 5x5 conv, 32 inputs, 64 outputs&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc2'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# fully connected, 7*7*64 inputs, 1024 outputs&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wd1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7&amp;lt;/font&amp;gt;*&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7&amp;lt;/font&amp;gt;*&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1024&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# 1024 inputs, 10 outputs (class prediction)&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1024&amp;lt;/font&amp;gt;, num_classes]))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  biases = {&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc2'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bd1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1024&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([num_classes]))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Construct model&amp;lt;/font&amp;gt;&lt;br /&gt;
  logits = conv_net(X, weights, biases, keep_prob)&lt;br /&gt;
  prediction = tf.nn.softmax(logits)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Define loss and optimizer&amp;lt;/font&amp;gt;&lt;br /&gt;
  loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(&lt;br /&gt;
    logits=logits, labels=Y))&lt;br /&gt;
  optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)&lt;br /&gt;
  train_op = optimizer.minimize(loss_op)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Evaluate model&amp;lt;/font&amp;gt;&lt;br /&gt;
  correct_pred = tf.equal(tf.argmax(prediction, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;), tf.argmax(Y, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;))&lt;br /&gt;
  accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Initialize the variables (i.e. assign their default value)&amp;lt;/font&amp;gt;&lt;br /&gt;
  init = tf.global_variables_initializer()&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Start training&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''with''' tf.Session() '''as''' sess:&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Run the initializer&amp;lt;/font&amp;gt;&lt;br /&gt;
    sess.run(init)&lt;br /&gt;
    '''for''' step '''in''' '''range'''(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, num_steps+&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;):&lt;br /&gt;
      batch_x, batch_y = mnist.train.next_batch(batch_size)&lt;br /&gt;
      &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Run optimization op (backprop)&amp;lt;/font&amp;gt;&lt;br /&gt;
      sess.run(train_op, feed_dict={X: batch_x, Y: batch_y, keep_prob: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.8&amp;lt;/font&amp;gt;})&lt;br /&gt;
      '''if''' step % display_step == &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt; '''or''' step == &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;:&lt;br /&gt;
        &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Calculate batch loss and accuracy&amp;lt;/font&amp;gt;&lt;br /&gt;
        loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x,&lt;br /&gt;
                                                             Y: batch_y,&lt;br /&gt;
                                                             keep_prob: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;})&lt;br /&gt;
        print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Step &amp;quot;&amp;lt;/font&amp;gt; + str(step) + &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;, Minibatch Loss= &amp;quot;&amp;lt;/font&amp;gt; + \&lt;br /&gt;
              &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;{:.4f}&amp;quot;&amp;lt;/font&amp;gt;.format(loss) + &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;, Training Accuracy= &amp;quot;&amp;lt;/font&amp;gt; + \&lt;br /&gt;
              &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;{:.3f}&amp;quot;&amp;lt;/font&amp;gt;.format(acc))&lt;br /&gt;
    print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Optimization Finished!&amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Calculate accuracy for 256 MNIST test images&amp;lt;/font&amp;gt;&lt;br /&gt;
    print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Testing Accuracy:&amp;quot;&amp;lt;/font&amp;gt;, \&lt;br /&gt;
      sess.run(accuracy, feed_dict={X: mnist.test.images[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;256&amp;lt;/font&amp;gt;],&lt;br /&gt;
                                    Y: mnist.test.labels[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;256&amp;lt;/font&amp;gt;],&lt;br /&gt;
                                    keep_prob: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;}))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Step 1, Minibatch Loss= 41724.0586, Training Accuracy= 0.156'''&lt;br /&gt;
    '''Step 10, Minibatch Loss= 17748.7500, Training Accuracy= 0.242'''&lt;br /&gt;
    '''Step 20, Minibatch Loss= 8307.6162, Training Accuracy= 0.578'''&lt;br /&gt;
    '''Step 30, Minibatch Loss= 3108.5703, Training Accuracy= 0.766'''&lt;br /&gt;
    '''Step 40, Minibatch Loss= 3273.2749, Training Accuracy= 0.727'''&lt;br /&gt;
    '''Step 50, Minibatch Loss= 2754.2861, Training Accuracy= 0.820'''&lt;br /&gt;
    '''Step 60, Minibatch Loss= 2467.7925, Training Accuracy= 0.844'''&lt;br /&gt;
    '''Step 70, Minibatch Loss= 1423.8140, Training Accuracy= 0.914'''&lt;br /&gt;
    '''Step 80, Minibatch Loss= 1651.4656, Training Accuracy= 0.875'''&lt;br /&gt;
    '''Step 90, Minibatch Loss= 2105.9263, Training Accuracy= 0.867'''&lt;br /&gt;
    '''Step 100, Minibatch Loss= 1153.5090, Training Accuracy= 0.867'''&lt;br /&gt;
    '''Step 110, Minibatch Loss= 1751.1400, Training Accuracy= 0.898'''&lt;br /&gt;
    '''Step 120, Minibatch Loss= 1446.2119, Training Accuracy= 0.922'''&lt;br /&gt;
    '''Step 130, Minibatch Loss= 1403.7135, Training Accuracy= 0.859'''&lt;br /&gt;
    '''Step 140, Minibatch Loss= 1089.7897, Training Accuracy= 0.930'''&lt;br /&gt;
    '''Step 150, Minibatch Loss= 1147.0751, Training Accuracy= 0.898'''&lt;br /&gt;
    '''Step 160, Minibatch Loss= 1963.3733, Training Accuracy= 0.883'''&lt;br /&gt;
    '''Step 170, Minibatch Loss= 1544.2725, Training Accuracy= 0.859'''&lt;br /&gt;
    '''Step 180, Minibatch Loss= 977.9219, Training Accuracy= 0.914'''&lt;br /&gt;
    '''Step 190, Minibatch Loss= 857.7977, Training Accuracy= 0.930'''&lt;br /&gt;
    '''Step 200, Minibatch Loss= 430.4735, Training Accuracy= 0.953'''&lt;br /&gt;
    '''Optimization Finished!'''&lt;br /&gt;
    '''Testing Accuracy: 0.94140625'''&lt;br /&gt;
&lt;br /&gt;
==Keras==&lt;br /&gt;
===Описание===&lt;br /&gt;
Keras&amp;lt;ref&amp;gt;[https://keras.io Библиотека Keras]&amp;lt;/ref&amp;gt; {{---}} библиотека для построения нейронных сетей, поддерживающая основные виды слоев и структурные элементы. Поддерживает как рекуррентные, так и сверточные нейросети, имеет в своем составе реализацию известных архитектур нейросетей (например, VGG16). Некоторое время назад слои из данной библиотеки стали доступны внутри библиотеки Tensorflow. Существуют готовые функции для работы с изображениями и текстом. Интегрирована в Apache Spark с помощью дистрибутива dist-keras. Данная библиотека позволяет на более высоком уровне работать с нейронными сетями. В качестве библиотеки для бэкенда может использоваться как Tensorflow, так и Theano.&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Сверточная нейронная сеть====&lt;br /&gt;
{{Main|Сверточные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Реализация сверточной нейронной сети для классификации текста:&lt;br /&gt;
  '''from''' __future__ '''import''' print_function&lt;br /&gt;
  '''from''' keras.preprocessing '''import''' sequence&lt;br /&gt;
  '''from''' keras.models '''import''' Sequential&lt;br /&gt;
  '''from''' keras.layers '''import''' Dense, Dropout, Activation&lt;br /&gt;
  '''from''' keras.layers '''import''' Embedding&lt;br /&gt;
  '''from''' keras.layers '''import''' Conv1D, GlobalMaxPooling1D&lt;br /&gt;
  '''from''' keras.datasets '''import''' imdb&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# set parameters:&amp;lt;/font&amp;gt;&lt;br /&gt;
  max_features = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5000&amp;lt;/font&amp;gt;&lt;br /&gt;
  maxlen = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;400&amp;lt;/font&amp;gt;&lt;br /&gt;
  batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;&lt;br /&gt;
  embedding_dims = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;50&amp;lt;/font&amp;gt;&lt;br /&gt;
  filters = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;250&amp;lt;/font&amp;gt;&lt;br /&gt;
  kernel_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;&lt;br /&gt;
  hidden_dims = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;250&amp;lt;/font&amp;gt;&lt;br /&gt;
  epochs = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)&lt;br /&gt;
  print(len(x_train), &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'train sequences'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  print(len(x_test), &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'test sequences'&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''25000 train sequences'''&lt;br /&gt;
    '''25000 test sequences'''&lt;br /&gt;
&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Pad sequences (samples x time)'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  x_train = sequence.pad_sequences(x_train, maxlen=maxlen)&lt;br /&gt;
  x_test = sequence.pad_sequences(x_test, maxlen=maxlen)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'x_train shape:'&amp;lt;/font&amp;gt;, x_train.shape)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'x_test shape:'&amp;lt;/font&amp;gt;, x_test.shape)&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Pad sequences (samples x time)'''&lt;br /&gt;
    '''x_train shape: (25000, 400)'''&lt;br /&gt;
    '''x_test shape: (25000, 400)'''&lt;br /&gt;
&lt;br /&gt;
  model = Sequential()&lt;br /&gt;
  &lt;br /&gt;
  model.add(Embedding(max_features,&lt;br /&gt;
                      embedding_dims,&lt;br /&gt;
                      input_length=maxlen))&lt;br /&gt;
  model.add(Dropout(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))  &lt;br /&gt;
  model.add(Conv1D(filters,&lt;br /&gt;
                   kernel_size,&lt;br /&gt;
                   padding=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'valid'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                   activation=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'relu'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                   strides=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(GlobalMaxPooling1D())&lt;br /&gt;
  model.add(Dense(hidden_dims))&lt;br /&gt;
  model.add(Dropout(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(Activation(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'relu'&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(Dense(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(Activation(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'sigmoid'&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &lt;br /&gt;
  model.compile(loss=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'binary_crossentropy'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                optimizer=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'adam'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                metrics=[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'accuracy'&amp;lt;/font&amp;gt;])&lt;br /&gt;
  model.fit(x_train, y_train,&lt;br /&gt;
            batch_size=batch_size,&lt;br /&gt;
            epochs=epochs,&lt;br /&gt;
            validation_data=(x_test, y_test))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Train on 25000 samples, validate on 25000 samples'''&lt;br /&gt;
    '''Epoch 1/2'''&lt;br /&gt;
    '''25000/25000 [==============================] - 136s 5ms/step - loss: 0.4107 - acc: 0.7923 - val_loss: 0.2926 - val_acc: 0.8746'''&lt;br /&gt;
    '''Epoch 2/2'''&lt;br /&gt;
    '''25000/25000 [==============================] - 136s 5ms/step - loss: 0.2294 - acc: 0.9082 - val_loss: 0.3200 - val_acc: 0.8652'''&lt;br /&gt;
&lt;br /&gt;
==Другие библиотеки для машинного обучения на Python==&lt;br /&gt;
===Вспомогательные библиотеки===&lt;br /&gt;
* NumPy&amp;lt;ref&amp;gt;[http://www.numpy.org Библиотека NumPy]&amp;lt;/ref&amp;gt; {{---}} библиотека, добавляющая поддержку больших многомерных массивов и матриц вместе с большой библиотекой  высокоуровневых математических функций для операций с этими массивами. Данная библиотека предоставляет реализации вычислительных алгоритмов (в виде функций и операторов), оптимизированные для работы с многомерными массивами. В результате любой алгоритм, который может быть выражен в виде последовательности операций над массивами (матрицами) и реализованный с использованием NumPy, работает так же быстро, как эквивалентный код, выполняемый в MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/products/matlab.html MATLAB]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* SciPy&amp;lt;ref&amp;gt;[https://www.scipy.org Библиотека SciPy]&amp;lt;/ref&amp;gt; {{---}} открытая библиотека высококачественных научных инструментов для языка программирования Python. SciPy содержит модули для оптимизации, интегрирования, специальных функций, обработки сигналов, обработки изображений, генетических алгоритмов, решения обыкновенных дифференциальных уравнений и других задач, обычно решаемых в науке и при инженерной разработке;&lt;br /&gt;
* Pandas&amp;lt;ref&amp;gt;[https://pandas.pydata.org Библиотека Pandas]&amp;lt;/ref&amp;gt; {{---}} библиотека Python, которая является мощным инструментом для анализа данных. Пакет дает возможность строить сводные таблицы, выполнять группировки, предоставляет удобный доступ к табличным данным и позволяет строить графики на полученных наборах данных при помощи библиотеки Matplotlib;&lt;br /&gt;
* Matplotlib&amp;lt;ref&amp;gt;[https://matplotlib.org Библиотека Matplotlib]&amp;lt;/ref&amp;gt; {{---}} библиотека Python для построения качественных двумерных графиков. Matplotlib является гибким, легко конфигурируемым пакетом, который вместе с NumPy, SciPy и IPython&amp;lt;ref&amp;gt;[https://ipython.org IPython Notebook]&amp;lt;/ref&amp;gt; предоставляет возможности, подобные MATLAB.&lt;br /&gt;
&lt;br /&gt;
===Библиотеки для глубокого обучения===&lt;br /&gt;
* PyTorch&amp;lt;ref&amp;gt;[https://pytorch.org Библиотека PyTorch]&amp;lt;/ref&amp;gt; {{---}} библиотека для глубокого обучения, созданная на базе Torch&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Torch_(machine_learning) Torch]&amp;lt;/ref&amp;gt; и развиваемая компанией Facebook. Две ключевые функциональности данной библиотеки {{---}} тензорные вычисления с развитой поддержкой ускорения на GPU и глубокие нейронные сети на базе системы autodiff;&lt;br /&gt;
* Theano&amp;lt;ref&amp;gt;[http://deeplearning.net/software/theano/ Библиотека Theano]&amp;lt;/ref&amp;gt; {{---}} расширение языка программирования Python, позволяющее эффективно вычислять математические выражения, содержащие многомерные массивы. Библиотека предоставляет базовый набор инструментов для конфигурации нейронных сетей и их обучения. Наибольшее признание данная библиотека получила в задачах машинного обучения при решении задач оптимизации. Она позволяет использовать возможности GPU без изменения кода программы, что делает ее незаменимой при выполнении ресурсоемких задач;&lt;br /&gt;
* Caffe&amp;lt;ref&amp;gt;[http://caffe.berkeleyvision.org Библиотека Caffe]&amp;lt;/ref&amp;gt; {{---}} фреймворк для обучения нейронных сетей, созданный университетом Беркли. Как и Tensorflow, использует cuDNN для работы с видеокартами NVIDIA;&lt;br /&gt;
* Microsoft Cognitive Toolkit (CNTK)&amp;lt;ref&amp;gt;[https://www.microsoft.com/en-us/cognitive-toolkit/ Библиотека CNTK]&amp;lt;/ref&amp;gt; {{---}} фреймворк от корпорации Microsoft, предоставляющий реализации архитектур различных нейронных сетей.&lt;br /&gt;
&lt;br /&gt;
===Библиотеки для обработки естественного языка===&lt;br /&gt;
* NLTK&amp;lt;ref&amp;gt;[https://www.nltk.org Библиотека NLTK]&amp;lt;/ref&amp;gt; {{---}} пакет библиотек и программ для символьной и статистической обработки естественного языка, написанных на языке программирования Python;&lt;br /&gt;
* Gensim&amp;lt;ref&amp;gt;[https://radimrehurek.com/gensim/ Библиотека Gensim]&amp;lt;/ref&amp;gt; {{---}} инструмент для автоматической обработки языка, основанный на машинном обучении. В Gensim реализованы алгоритмы дистрибутивной семантики word2vec и doc2vec, он позволяет решать задачи тематического моделирования и выделять основные темы текста или документа.&lt;br /&gt;
&lt;br /&gt;
===Библиотеки для градиентного бустинга===&lt;br /&gt;
* [[XGBoost|Xgboost]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&amp;lt;ref&amp;gt;[https://xgboost.readthedocs.io/en/latest/python/index.html Библиотека Xgboost]&amp;lt;/ref&amp;gt; {{---}} библиотека с реализацией градиентного бустинга, которая для выбора разбиения использует сортировку и модели, основанные на анализе гистограмм;&lt;br /&gt;
* LightGBM&amp;lt;ref&amp;gt;[http://www.dmtk.io Библиотека LightGBM]&amp;lt;/ref&amp;gt; {{---}} фреймворк с реализацией градиентного бустинга от корпорации Microsoft. Является частью проекта Microsoft DMTK, посвященного реализации подходов машинного обучения для .Net;&lt;br /&gt;
* [[CatBoost|CatBoost]]&amp;lt;ref&amp;gt;[https://catboost.ai Библиотека CatBoost]&amp;lt;/ref&amp;gt; {{---}} библиотека с градиентным бустингом от компании Яндекс, в которой реализуется особый подход к обработке категориальных признаков, основанный на подмене категориальных признаков статистиками на основе предсказываемого значения.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=CatBoost&amp;diff=69665</id>
		<title>CatBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=CatBoost&amp;diff=69665"/>
				<updated>2019-01-30T19:09:18Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Библиотека CatBoost {{---}} метод машинного обучения, основанный на градиентном бустинге (англ. ''gradient boosting'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Практически любой современный метод на основе градиентного бустинга работает с числовыми признаками. Если у нас в наборе данных присутствуют не только числовые, но и категориальные признаки (англ. ''categorical features''), то необходимо переводить категориальные признаки в числовые. Это приводит к искажению их сути и потенциальному снижению точности работы модели.&lt;br /&gt;
Именно поэтому было важно разработать алгоритм, который умеет работать не только с числовыми признаками, но и с категориальными напрямую, закономерности между которыми этот алгоритм будет выявлять самостоятельно, без ручной «помощи».&lt;br /&gt;
CatBoost {{---}} библиотека для градиентного бустинга, главным преимуществом которой является то, что она одинаково хорошо работает «из коробки» как с числовыми признаками, так и с категориальными. &lt;br /&gt;
&lt;br /&gt;
Документацию по CatBoost можно найти на сайте&amp;lt;ref&amp;gt;[https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/ Документация CatBoost]&amp;lt;/ref&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;
=== Бустинг ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Идея бустинг-подхода заключается в комбинации слабых (с невысокой обобщающей способностью) функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с  использованием  данных  об  ошибках  предыдущих. Результирующая функция представляет собой линейную комбинацию базовых, слабых моделей. Более подробно можно посмотреть в статье про градиентный бустинг&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Gradient_boosting |Gradient Boosting, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее будет рассматриваться бустинг деревьев решений. Будем строить несколько деревьев, чтобы добавление новых деревьев уменьшало ошибку. Итого при достаточно большом количестве деревьев мы сможем сильно уменьшить ошибку, однако не стоит забывать, что чем больше деревьев, тем дольше обучается модель и в какой-то момент прирост качества становится незначительным.&lt;br /&gt;
&lt;br /&gt;
=== Градиентный бустинг ===&lt;br /&gt;
&lt;br /&gt;
* В основе CatBoost лежит градиентный бустинг.&lt;br /&gt;
&lt;br /&gt;
* Градиент функции ошибки {{---}} все производные по всем значениям функции&lt;br /&gt;
Градиентный бустинг {{---}} метод машинного обучения, который создает решающую модель прогнозирования в виде ансамбля слабых моделей прогнозирования, обычно деревьев решений. Он строит модель поэтапно, позволяя оптимизировать произвольную дифференцируемую функцию потерь.&lt;br /&gt;
&lt;br /&gt;
== Особенности CatBoost ==&lt;br /&gt;
&lt;br /&gt;
=== Режимы работы ===&lt;br /&gt;
&lt;br /&gt;
* Регрессия (англ. ''regression''); &lt;br /&gt;
* Классификация (англ. ''classification'');&lt;br /&gt;
 Функция потерь (англ. ''loss function'') {{---}} максимизируем вероятность того, что все объекты в обучающей выборке классифицированы правильно, вероятность - это сигмоида над значением формулы.&lt;br /&gt;
 Функция ''predict_proba'' {{---}} на выходе получаем готовые вероятности. Нужно отметить, что складывать их уже нельзя.&lt;br /&gt;
 Функция ''predict'' {{---}} выдает необработанный результат. Такой результат можно складывать, например, с результатами других моделей.&lt;br /&gt;
* Мультиклассификация (англ. ''multiclass classification'');&lt;br /&gt;
* Ранжирование (англ. ''ranking'').&lt;br /&gt;
Объекты с попарной классификацией (??)&lt;br /&gt;
&lt;br /&gt;
=== Метрики ===&lt;br /&gt;
&lt;br /&gt;
Поддерживает множество [[Оценка_качества_в_задачах_классификации_и_регрессии|метрик]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (англ. ''metrics''), таких как:&lt;br /&gt;
* Регрессия: ''MAE, MAPE, RMSE, SMAPE'' etc.;&lt;br /&gt;
* Классификация: ''Logloss , Precision, Recall, F1, CrossEntropy, BalancedAccuracy'' etc.;&lt;br /&gt;
* Мультиклассификация: ''MultiClass, MultiClassOneVsAll, HammingLoss, F1'' etc.;&lt;br /&gt;
* Ранжирование: ''NDCG, PrecisionAt, RecallAt, PFound, PairLogit'' etc.&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;
Процесс построения происходит жадно. &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;
&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;
&lt;br /&gt;
=== Рандомизация ===&lt;br /&gt;
&lt;br /&gt;
Есть рандомизация метрики, по которой выбирается лучшее дерево. &lt;br /&gt;
 ''Score += random_strength *  Rand (0, lenofgrad * q)'' &lt;br /&gt;
&lt;br /&gt;
''q'' {{---}} множитель, уменьшающийся при увеличении итерации. &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;
CatBoost поддерживает несколько режимов выборки данных&lt;br /&gt;
&lt;br /&gt;
* Бутстрап (англ. ''bootstrap'') Бернулли {{---}} выбираем документ с вероятностью ''p''. Регулируется параметром ''sample_rate'';&lt;br /&gt;
* Байесовский бутстрап {{---}} байесовское распределение. Регулируется параметром ''bagging_temp''.&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;
* Uniform. Равномерно разбиваем отрезок от минимума значения для данного признака до максимума;&lt;br /&gt;
* Медианная сетка. Задаем количество разбиений над множеством значений, далее идем по объектам в порядке сортировки и разбиваем на группы по k объектов, где k {{---}} количество объектов в одном слоте разбиения;&lt;br /&gt;
* UniformAndQuantiles. Комбинация 1 и 2 пунктов;&lt;br /&gt;
* MaxSumLog {{---}} в основе лежит динамика, работает долго;&lt;br /&gt;
* GreedyLogSum {{---}} аналог MaxSumLog, используется жадный алгоритм, поэтому работает не точно, однако быстрее чем MaxSumLog.&lt;br /&gt;
&lt;br /&gt;
=== Работа с категориальными признаками ===&lt;br /&gt;
&lt;br /&gt;
* LabelEncoding {{---}} на реальных примерах точность работы низкая, так как появляется отношения порядка между объектами;&lt;br /&gt;
* One-hot encoding {{---}} дает неплохую точность, если различных значений признаков не много. Иначе один признак размножится на множество признаков и будет влиять на модель заведомо сильнее остальных признаков.&lt;br /&gt;
&lt;br /&gt;
 Лучше не делать препроцессинг самим из-за проблем, описанных выше. В CatBoost можно задать параметр cat_features, передав туда индексы категориальных признаков. Также можно отрегулировать параметр ''one_hot_max_size'' {{---}} максимальное количество различных значений у категориального признака, чтобы он мог в последствии быть подвержен one-hot encoding.&lt;br /&gt;
&lt;br /&gt;
== Подбор параметров ==&lt;br /&gt;
&lt;br /&gt;
Ниже описаны гиперпараметры (англ. ''hyperparameters''), на которые стоит обратить внимание при использовании библиотеки.&lt;br /&gt;
&lt;br /&gt;
* cat_features;&lt;br /&gt;
* Overfitting detector;&lt;br /&gt;
* Число итераций и learning rate;&lt;br /&gt;
* L2_reg;&lt;br /&gt;
* Random_srength;&lt;br /&gt;
* Bagging_temp;&lt;br /&gt;
* Глубина дерева (стоит попробовать 10 и 6).&lt;br /&gt;
&lt;br /&gt;
== Полезная функциональность ==&lt;br /&gt;
&lt;br /&gt;
* Snapshots;&lt;br /&gt;
* Overfitting detector;&lt;br /&gt;
* CV;&lt;br /&gt;
* eval_metrics.&lt;br /&gt;
&lt;br /&gt;
== Бенчмарки ==&lt;br /&gt;
&lt;br /&gt;
Сравнение библиотеки CatBoost с открытыми аналогами XGBoost, LightGBM и H20 на наборе публичных датасетов&amp;lt;ref&amp;gt;[https://catboost.yandex/#benchmark| Benchmarks]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример использования ==&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.5, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' catboost '''import''' CatBoostClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = CatBoostClassifier(&lt;br /&gt;
    '''bagging_temperature'''=1,&lt;br /&gt;
    '''random_strength'''=1,&lt;br /&gt;
    '''thread_count'''=3,&lt;br /&gt;
    '''iterations'''=500,&lt;br /&gt;
    '''l2_leaf_reg''' = 4.0, &lt;br /&gt;
    '''learning_rate''' = 0.07521709965938336,&lt;br /&gt;
    '''save_snapshot'''=True,&lt;br /&gt;
    '''snapshot_file'''='snapshot_best.bkp',&lt;br /&gt;
    '''random_seed'''=63,&lt;br /&gt;
    '''od_type'''='Iter',&lt;br /&gt;
    '''od_wait'''=20,&lt;br /&gt;
    '''custom_loss'''=['AUC', 'Accuracy'],&lt;br /&gt;
    '''use_best_model'''=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(&lt;br /&gt;
    X_train, y_train,&lt;br /&gt;
    '''cat_features'''=cat_features,&lt;br /&gt;
    '''eval_set'''=(X_validation, y_validation),&lt;br /&gt;
    '''logging_level'''='Silent',&lt;br /&gt;
    '''plot'''=True&lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
* Вывод числа деревьев в модели&lt;br /&gt;
&lt;br /&gt;
 '''print'''('Resulting tree count:', best_model.tree_count_)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Resulting tree count: 217'''&lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль (англ. cross validation)&lt;br /&gt;
 '''from''' catboost '''import''' cv&lt;br /&gt;
&lt;br /&gt;
 params = best_model.get_params()&lt;br /&gt;
 params['iterations'] = 10&lt;br /&gt;
 params['custom_loss'] = 'AUC'&lt;br /&gt;
 del params['use_best_model']&lt;br /&gt;
 pool1 = Pool(X, '''label'''=y, '''cat_features'''=cat_features)&lt;br /&gt;
&lt;br /&gt;
 cv_data = cv(&lt;br /&gt;
    '''params''' = params,&lt;br /&gt;
    '''pool''' = pool1,&lt;br /&gt;
    '''fold_count'''=2,&lt;br /&gt;
    '''inverted'''=False,&lt;br /&gt;
    '''shuffle'''=True,&lt;br /&gt;
    '''stratified'''=False,&lt;br /&gt;
    '''partition_random_seed'''=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Выводим результат&lt;br /&gt;
 best_value = np.max(cv_data['AUC_test_avg'])&lt;br /&gt;
 best_iter = np.argmax(cv_data['AUC_test_avg'])&lt;br /&gt;
 '''print'''('Best validation AUC score: {:.2f}±{:.2f} on step {}'.format(&lt;br /&gt;
    best_value,&lt;br /&gt;
    cv_data['AUC_test_stddev'][best_iter],&lt;br /&gt;
    best_iter&lt;br /&gt;
 ))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Best validation AUC score: 0.91±0.00 on step 9'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Больше примеров&amp;lt;ref&amp;gt;[https://tech.yandex.com/catboost/doc/dg/concepts/python-usages-examples-docpage Примеры ипользования CatBoost]&amp;lt;/ref&amp;gt; можно найти на сайте библиотеки''.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Дерево_решений_и_случайный_леc|Дерево решений и случайный леc]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Бустинг,_AdaBoost|Бустинг, AdaBoost]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/| Overview of CatBoost]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Gradient_boosting| Gradient Boosting, WIkipedia]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=CatBoost&amp;diff=69664</id>
		<title>CatBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=CatBoost&amp;diff=69664"/>
				<updated>2019-01-30T19:08:39Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Библиотекой CatBoost {{---}} метод машинного обучения, основанный на градиентном бустинге (англ. ''gradient boosting'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Практически любой современный метод на основе градиентного бустинга работает с числовыми признаками. Если у нас в наборе данных присутствуют не только числовые, но и категориальные признаки (англ. ''categorical features''), то необходимо переводить категориальные признаки в числовые. Это приводит к искажению их сути и потенциальному снижению точности работы модели.&lt;br /&gt;
Именно поэтому было важно разработать алгоритм, который умеет работать не только с числовыми признаками, но и с категориальными напрямую, закономерности между которыми этот алгоритм будет выявлять самостоятельно, без ручной «помощи».&lt;br /&gt;
CatBoost {{---}} библиотека для градиентного бустинга, главным преимуществом которой является то, что она одинаково хорошо работает «из коробки» как с числовыми признаками, так и с категориальными. &lt;br /&gt;
&lt;br /&gt;
Документацию по CatBoost можно найти на сайте&amp;lt;ref&amp;gt;[https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/ Документация CatBoost]&amp;lt;/ref&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;
=== Бустинг ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Идея бустинг-подхода заключается в комбинации слабых (с невысокой обобщающей способностью) функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с  использованием  данных  об  ошибках  предыдущих. Результирующая функция представляет собой линейную комбинацию базовых, слабых моделей. Более подробно можно посмотреть в статье про градиентный бустинг&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Gradient_boosting |Gradient Boosting, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее будет рассматриваться бустинг деревьев решений. Будем строить несколько деревьев, чтобы добавление новых деревьев уменьшало ошибку. Итого при достаточно большом количестве деревьев мы сможем сильно уменьшить ошибку, однако не стоит забывать, что чем больше деревьев, тем дольше обучается модель и в какой-то момент прирост качества становится незначительным.&lt;br /&gt;
&lt;br /&gt;
=== Градиентный бустинг ===&lt;br /&gt;
&lt;br /&gt;
* В основе CatBoost лежит градиентный бустинг.&lt;br /&gt;
&lt;br /&gt;
* Градиент функции ошибки {{---}} все производные по всем значениям функции&lt;br /&gt;
Градиентный бустинг {{---}} метод машинного обучения, который создает решающую модель прогнозирования в виде ансамбля слабых моделей прогнозирования, обычно деревьев решений. Он строит модель поэтапно, позволяя оптимизировать произвольную дифференцируемую функцию потерь.&lt;br /&gt;
&lt;br /&gt;
== Особенности CatBoost ==&lt;br /&gt;
&lt;br /&gt;
=== Режимы работы ===&lt;br /&gt;
&lt;br /&gt;
* Регрессия (англ. ''regression''); &lt;br /&gt;
* Классификация (англ. ''classification'');&lt;br /&gt;
 Функция потерь (англ. ''loss function'') {{---}} максимизируем вероятность того, что все объекты в обучающей выборке классифицированы правильно, вероятность - это сигмоида над значением формулы.&lt;br /&gt;
 Функция ''predict_proba'' {{---}} на выходе получаем готовые вероятности. Нужно отметить, что складывать их уже нельзя.&lt;br /&gt;
 Функция ''predict'' {{---}} выдает необработанный результат. Такой результат можно складывать, например, с результатами других моделей.&lt;br /&gt;
* Мультиклассификация (англ. ''multiclass classification'');&lt;br /&gt;
* Ранжирование (англ. ''ranking'').&lt;br /&gt;
Объекты с попарной классификацией (??)&lt;br /&gt;
&lt;br /&gt;
=== Метрики ===&lt;br /&gt;
&lt;br /&gt;
Поддерживает множество [[Оценка_качества_в_задачах_классификации_и_регрессии|метрик]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (англ. ''metrics''), таких как:&lt;br /&gt;
* Регрессия: ''MAE, MAPE, RMSE, SMAPE'' etc.;&lt;br /&gt;
* Классификация: ''Logloss , Precision, Recall, F1, CrossEntropy, BalancedAccuracy'' etc.;&lt;br /&gt;
* Мультиклассификация: ''MultiClass, MultiClassOneVsAll, HammingLoss, F1'' etc.;&lt;br /&gt;
* Ранжирование: ''NDCG, PrecisionAt, RecallAt, PFound, PairLogit'' etc.&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;
Процесс построения происходит жадно. &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;
&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;
&lt;br /&gt;
=== Рандомизация ===&lt;br /&gt;
&lt;br /&gt;
Есть рандомизация метрики, по которой выбирается лучшее дерево. &lt;br /&gt;
 ''Score += random_strength *  Rand (0, lenofgrad * q)'' &lt;br /&gt;
&lt;br /&gt;
''q'' {{---}} множитель, уменьшающийся при увеличении итерации. &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;
CatBoost поддерживает несколько режимов выборки данных&lt;br /&gt;
&lt;br /&gt;
* Бутстрап (англ. ''bootstrap'') Бернулли {{---}} выбираем документ с вероятностью ''p''. Регулируется параметром ''sample_rate'';&lt;br /&gt;
* Байесовский бутстрап {{---}} байесовское распределение. Регулируется параметром ''bagging_temp''.&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;
* Uniform. Равномерно разбиваем отрезок от минимума значения для данного признака до максимума;&lt;br /&gt;
* Медианная сетка. Задаем количество разбиений над множеством значений, далее идем по объектам в порядке сортировки и разбиваем на группы по k объектов, где k {{---}} количество объектов в одном слоте разбиения;&lt;br /&gt;
* UniformAndQuantiles. Комбинация 1 и 2 пунктов;&lt;br /&gt;
* MaxSumLog {{---}} в основе лежит динамика, работает долго;&lt;br /&gt;
* GreedyLogSum {{---}} аналог MaxSumLog, используется жадный алгоритм, поэтому работает не точно, однако быстрее чем MaxSumLog.&lt;br /&gt;
&lt;br /&gt;
=== Работа с категориальными признаками ===&lt;br /&gt;
&lt;br /&gt;
* LabelEncoding {{---}} на реальных примерах точность работы низкая, так как появляется отношения порядка между объектами;&lt;br /&gt;
* One-hot encoding {{---}} дает неплохую точность, если различных значений признаков не много. Иначе один признак размножится на множество признаков и будет влиять на модель заведомо сильнее остальных признаков.&lt;br /&gt;
&lt;br /&gt;
 Лучше не делать препроцессинг самим из-за проблем, описанных выше. В CatBoost можно задать параметр cat_features, передав туда индексы категориальных признаков. Также можно отрегулировать параметр ''one_hot_max_size'' {{---}} максимальное количество различных значений у категориального признака, чтобы он мог в последствии быть подвержен one-hot encoding.&lt;br /&gt;
&lt;br /&gt;
== Подбор параметров ==&lt;br /&gt;
&lt;br /&gt;
Ниже описаны гиперпараметры (англ. ''hyperparameters''), на которые стоит обратить внимание при использовании библиотеки.&lt;br /&gt;
&lt;br /&gt;
* cat_features;&lt;br /&gt;
* Overfitting detector;&lt;br /&gt;
* Число итераций и learning rate;&lt;br /&gt;
* L2_reg;&lt;br /&gt;
* Random_srength;&lt;br /&gt;
* Bagging_temp;&lt;br /&gt;
* Глубина дерева (стоит попробовать 10 и 6).&lt;br /&gt;
&lt;br /&gt;
== Полезная функциональность ==&lt;br /&gt;
&lt;br /&gt;
* Snapshots;&lt;br /&gt;
* Overfitting detector;&lt;br /&gt;
* CV;&lt;br /&gt;
* eval_metrics.&lt;br /&gt;
&lt;br /&gt;
== Бенчмарки ==&lt;br /&gt;
&lt;br /&gt;
Сравнение библиотеки CatBoost с открытыми аналогами XGBoost, LightGBM и H20 на наборе публичных датасетов&amp;lt;ref&amp;gt;[https://catboost.yandex/#benchmark| Benchmarks]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример использования ==&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.5, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' catboost '''import''' CatBoostClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = CatBoostClassifier(&lt;br /&gt;
    '''bagging_temperature'''=1,&lt;br /&gt;
    '''random_strength'''=1,&lt;br /&gt;
    '''thread_count'''=3,&lt;br /&gt;
    '''iterations'''=500,&lt;br /&gt;
    '''l2_leaf_reg''' = 4.0, &lt;br /&gt;
    '''learning_rate''' = 0.07521709965938336,&lt;br /&gt;
    '''save_snapshot'''=True,&lt;br /&gt;
    '''snapshot_file'''='snapshot_best.bkp',&lt;br /&gt;
    '''random_seed'''=63,&lt;br /&gt;
    '''od_type'''='Iter',&lt;br /&gt;
    '''od_wait'''=20,&lt;br /&gt;
    '''custom_loss'''=['AUC', 'Accuracy'],&lt;br /&gt;
    '''use_best_model'''=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(&lt;br /&gt;
    X_train, y_train,&lt;br /&gt;
    '''cat_features'''=cat_features,&lt;br /&gt;
    '''eval_set'''=(X_validation, y_validation),&lt;br /&gt;
    '''logging_level'''='Silent',&lt;br /&gt;
    '''plot'''=True&lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
* Вывод числа деревьев в модели&lt;br /&gt;
&lt;br /&gt;
 '''print'''('Resulting tree count:', best_model.tree_count_)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Resulting tree count: 217'''&lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль (англ. cross validation)&lt;br /&gt;
 '''from''' catboost '''import''' cv&lt;br /&gt;
&lt;br /&gt;
 params = best_model.get_params()&lt;br /&gt;
 params['iterations'] = 10&lt;br /&gt;
 params['custom_loss'] = 'AUC'&lt;br /&gt;
 del params['use_best_model']&lt;br /&gt;
 pool1 = Pool(X, '''label'''=y, '''cat_features'''=cat_features)&lt;br /&gt;
&lt;br /&gt;
 cv_data = cv(&lt;br /&gt;
    '''params''' = params,&lt;br /&gt;
    '''pool''' = pool1,&lt;br /&gt;
    '''fold_count'''=2,&lt;br /&gt;
    '''inverted'''=False,&lt;br /&gt;
    '''shuffle'''=True,&lt;br /&gt;
    '''stratified'''=False,&lt;br /&gt;
    '''partition_random_seed'''=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Выводим результат&lt;br /&gt;
 best_value = np.max(cv_data['AUC_test_avg'])&lt;br /&gt;
 best_iter = np.argmax(cv_data['AUC_test_avg'])&lt;br /&gt;
 '''print'''('Best validation AUC score: {:.2f}±{:.2f} on step {}'.format(&lt;br /&gt;
    best_value,&lt;br /&gt;
    cv_data['AUC_test_stddev'][best_iter],&lt;br /&gt;
    best_iter&lt;br /&gt;
 ))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Best validation AUC score: 0.91±0.00 on step 9'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Больше примеров&amp;lt;ref&amp;gt;[https://tech.yandex.com/catboost/doc/dg/concepts/python-usages-examples-docpage Примеры ипользования CatBoost]&amp;lt;/ref&amp;gt; можно найти на сайте библиотеки''.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Дерево_решений_и_случайный_леc|Дерево решений и случайный леc]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Бустинг,_AdaBoost|Бустинг, AdaBoost]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/| Overview of CatBoost]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Gradient_boosting| Gradient Boosting, WIkipedia]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D1%8B%D0%B1%D1%80%D0%BE%D1%81&amp;diff=69654</id>
		<title>Выброс</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D1%8B%D0%B1%D1%80%D0%BE%D1%81&amp;diff=69654"/>
				<updated>2019-01-30T00:03:53Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Outlier_boxplot.png|upright=1.0|thumb|Рис 1.График boxplot населения регионов России в 1990 году, где можно заметить 5 выбросов]]&lt;br /&gt;
'''Выброс''' (англ. ''outlier'') {{---}} небольшая доля объектов во входных данных, которая сильно выделяется из общей выборки. Многие алгоритмы машинного обучения чувствительны к разбросу и распределению значений признаков обрабатываемых объектов. Соответственно, выбросы во входных данных могут исказить и ввести в заблуждение процесс обучения алгоритмов машинного обучения, что приводит к увеличению времени обучения, снижению точности моделей и, в конечном итоге, к снижению результатов. Даже до подготовки предсказательных моделей на основе обучающих данных выбросы могут приводить к ошибочным представлениям и в дальнейшем к ошибочной интерпретации собранных данных.&lt;br /&gt;
===Виды выбросов===&lt;br /&gt;
Выбросы могут быть двух видов: одномерные и многомерные. Одномерные выбросы можно найти при рассмотрении распределения значений объектов в одномерном пространстве. Многомерные выбросы можно найти в &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-мерном пространстве (из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; объектов). Рассмотрение распределений в &amp;lt;tex&amp;gt;n&amp;lt;/tex&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;
* и др.&lt;br /&gt;
==Примеры==&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Outlier_norm.png|200px|thumb|Рис 2. Хорошо обученная модель с выбросами]]&lt;br /&gt;
 |[[Файл:Outlier_bad.png|200px|thumb|Рис 3. Переобученная модель на выбросах]]&lt;br /&gt;
 |}&lt;br /&gt;
Рис 2 показывает хорошо обученную модель, в которой присутствуют два выброса. Как видно из рисунка данная модель показала себя устойчивой к выбросам, либо же вовремя прекратила своё обучение. Обратная ситуация обстоит с Рис 3, где модель сильно переобучилась из-за присутствующих в ней выбросов. &lt;br /&gt;
==Методы обнаружения и борьбы с выбросами== &lt;br /&gt;
===Методы обнаружения выбросов===&lt;br /&gt;
[[Файл:Outlier_normal_distribution.png|upright=1.0|thumb|[http://work.thaslwanter.at/Stats/html/statsDistributions.html Рис 4. Так как t-распределение имеет более длинный хвост, нежели у нормального распределения, поэтому t-распределение менее чувствительно к выбросам.]]]&lt;br /&gt;
# Экстремальный анализ данных(англ. ''extreme value analysis''). При таком анализе не применяются какие-либо специальные статистические методы. Обычно этот метод применим для одномерного случая. Алгоритм использования таков:&lt;br /&gt;
#* Визуализировать данные, используя диаграммы и гистограммы для нахождения экстремальных значений; &lt;br /&gt;
#* Задействовать распределение, например Гауссовское, и найти значения, чье стандартное отклонение отличается в 2-3 раза от математического ожидания или в полтора раза от первой либо третьей квартилей; &lt;br /&gt;
#* Отфильтровать предполагаемые выбросы из обучающей выборки и оценить работу модели;&lt;br /&gt;
# Аппроксимирующий метод (англ. ''proximity method''). Чуть более сложный метод, заключающийся в применении кластеризующих методов;&lt;br /&gt;
#* Использовать метод кластеризации для определения кластеров в данных;&lt;br /&gt;
#* Идентифицировать и отметить центроиды каждого кластера;&lt;br /&gt;
#* Соотнести кластеры с экземплярами данных, находящимися на фиксированном расстоянии или на процентном удалении от центроида соответствующего кластера;&lt;br /&gt;
#* Отфильтровать предполагаемые выбросы из обучающей выборки и оценить работу модели;&lt;br /&gt;
# Проецирующие методы (англ. ''projections methods''). Эти методы довольно быстро и просто определяют выбросы в выборке; &lt;br /&gt;
#* Использовать один из проецирующих методов, например, метод главных компонент (англ. ''principal component analysis'', ''PCA''&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D1%8B%D1%85_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82 Метод главных компонент]&amp;lt;/ref&amp;gt;) или самоорганизующиеся карты Кохонена(англ. ''self-organizing map'', ''SOM''&amp;lt;ref&amp;gt;[https://habr.com/post/338868/ Самоорганизующиеся карты Кохонена]&amp;lt;/ref&amp;gt;) или проекцию Саммона(англ. ''Sammon mapping'', ''Sammon projection''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Sammon_mapping Проекция Саммона]&amp;lt;/ref&amp;gt;), для суммирования обучающих данных в двух измерениях;&lt;br /&gt;
#* Визуализировать отображение;&lt;br /&gt;
#* Использовать критерий близости от проецируемых значений или от вектора таблицы кодирования (англ. ''codebook vector'') для идентифицирования выбросов;&lt;br /&gt;
#* Отфильтровать предполагаемые выбросы из обучающей выборки и оценить работу модели.&lt;br /&gt;
&lt;br /&gt;
===Локально взвешенное сглаживание===&lt;br /&gt;
Локально взвешенное сглаживание (англ. ''LOcally WEighted Scatter plot Smoothing'', ''LOWESS'')&amp;lt;ref&amp;gt;[http://www.aliquote.org/cours/2012_biomed/biblio/Cleveland1979.pdf Локально взвешенное сглаживание]&amp;lt;/ref&amp;gt;. Данная методика была предложена Кливлендом (Cleveland) в 1979 году для моделирования и сглаживания двумерных данных &amp;lt;math&amp;gt;X^m={(x_i, y_i)}_{i=1}^m&amp;lt;/math&amp;gt;. Эта техника предоставляет общий и гибкий подход для приближения двумерных данных. Локально-линейная модель может быть записана в виде: &amp;lt;math&amp;gt;y_t=\alpha_t+\beta_t x_t + \varepsilon_t&amp;lt;/math&amp;gt;. Эта модель может быть расширена на случай локально-квадратичной зависимости и на модель с бо‘льшим числом независимых переменных. Параметры &amp;lt;math&amp;gt;\alpha_t&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\beta_t&amp;lt;/math&amp;gt; локально линейной модели оцениваются с помощью локально взвешенной регрессии, которая присваивает объекту тем больший вес, чем более близок он к объекту t. Степень сглаживания определяется параметром сглаживания &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, который выбирает пользователь. Параметр &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; указывает какая доля (англ. ''fraction'') данных используется в процедуре. Если &amp;lt;math&amp;gt;f = 0.5&amp;lt;/math&amp;gt;, то только половина данных используется для оценки и влияет на результат, и тогда мы получим умеренное сглаживание. С другой стороны, если &amp;lt;math&amp;gt;f = 0.8&amp;lt;/math&amp;gt;, то используются восемьдесят процентов данных, и сглаживание намного сильнее. Во всех случаях веса данных тем больше, чем они ближе к объекту &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
====Постановка задачи====&lt;br /&gt;
Пусть задано пространство объектов $X$ и множество возможных ответов &amp;lt;math&amp;gt;Y = \mathbb{R}&amp;lt;/math&amp;gt;. Существует неизвестная зависимость &amp;lt;math&amp;gt;y^*\colon X \to Y&amp;lt;/math&amp;gt;, значения которой известны только на объектах обучающией выборки &amp;lt;math&amp;gt;X^l = (x_i\ ,\ y_i)^l_{i=1},\ y_i = y^*(x_i)&amp;lt;/math&amp;gt;. Требуется построить алгоритм &amp;lt;math&amp;gt;a\colon X\to Y&amp;lt;/math&amp;gt;, аппроксимирующий неизвестную зависимость &amp;lt;math&amp;gt;y^*&amp;lt;/math&amp;gt;. Предполагается, что на множестве $X$ задана метрика &amp;lt;math&amp;gt;\rho(x,x')&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также стоит определить следующее. Для вычисления &amp;lt;math&amp;gt;a(x) = \alpha&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;\forall x \in X&amp;lt;/math&amp;gt; воспользуемся методом наименьших квадратов:&lt;br /&gt;
&amp;lt;math&amp;gt;Q(\alpha;X^l) = \sum_{i=1}^l \omega_i(x)(\alpha-y_i)^2 \rightarrow \underset{\alpha \in \mathbb{R}}{min}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\omega_i&amp;lt;/math&amp;gt; {{---}} это вес $i$-ого объекта. &lt;br /&gt;
&lt;br /&gt;
Веса &amp;lt;math&amp;gt;\omega_i&amp;lt;/math&amp;gt; разумно задать так, чтобы они убывали по мере увеличения расстояния &amp;lt;math&amp;gt;\rho(x,x_i)&amp;lt;/math&amp;gt;. Для этого можно ввести невозрастающую, гладкую, ограниченную функцию &amp;lt;math&amp;gt;K:[0, \infty) \rightarrow [0, \infty)&amp;lt;/math&amp;gt;, называемую [[Ядра|ядром]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, и представить &amp;lt;math&amp;gt;\omega_i&amp;lt;/math&amp;gt; в следующем виде:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\omega_i(x) = K\left(\frac{\rho(x,x_i)}{h} \right )&amp;lt;/math&amp;gt;, где $h$ {{---}} ширина окна.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Приравняв равной нулю производную &amp;lt;math&amp;gt;\frac{\partial Q}{\partial \alpha} = 0&amp;lt;/math&amp;gt; и выразив &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, получаем ''формулу Надарая-Ватсона''&amp;lt;ref&amp;gt;[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D1%86%D0%B5%D0%BD%D0%BA%D0%B0_%D0%9D%D0%B0%D0%B4%D0%B0%D1%80%D0%B0%D1%8F-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0 Формула Надарая-Ватсона]&amp;lt;/ref&amp;gt; :&lt;br /&gt;
&amp;lt;math&amp;gt;a_h(x;X^l) = \frac{\sum_{i=1}^{l} y_i\omega_i(x)}{\sum_{i=1}^{l} \omega_i(x)} = \frac{\sum_{i=1}^{l} y_iK\left(\frac{\rho(x,x_i)}{h} \right )}{\sum_{i=1}^{l} K\left(\frac{\rho(x,x_i)}{h} \right )}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Проблема выбросов в этой задаче====&lt;br /&gt;
Большие случайные ошибки в значениях &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; сильно искажают оценку Надарая-Ватсона.&lt;br /&gt;
&lt;br /&gt;
====Идея====&lt;br /&gt;
Чем больше величина невязки &amp;lt;math&amp;gt;\varepsilon_i = \left | a_h\left (x_i;X^\ell\backslash\left \{x_i\right \} \right )-y_i\right |&amp;lt;/math&amp;gt;, тем меньше должен быть вес i-го объекта &amp;lt;math&amp;gt;\omega_i(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
====Эвристика====&lt;br /&gt;
Домножить веса &amp;lt;math&amp;gt;\omega_i(x)&amp;lt;/math&amp;gt; на коэффиценты &amp;lt;math&amp;gt;\gamma_i = \widetilde{K}\left ( \varepsilon_i \right )&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\widetilde{K}\left ( \varepsilon \right )&amp;lt;/math&amp;gt; — ещё одно ядро, вообще говоря, отличное от &amp;lt;math&amp;gt;K\left ( \rho \right )&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Псевдокод====&lt;br /&gt;
 INPUT: &amp;lt;math&amp;gt;X^\ell&amp;lt;/math&amp;gt; - training sample;&lt;br /&gt;
 OUTPUT: coefficents &amp;lt;math&amp;gt;\gamma_i, i = 1,...,\ell&amp;lt;/math&amp;gt;;&lt;br /&gt;
 ________________________________________________________&lt;br /&gt;
 1: initialization: &amp;lt;math&amp;gt;\gamma_i := 1, i = 1,...,\ell&amp;lt;/math&amp;gt;; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;//инициализация коэффициентов&amp;lt;/span&amp;gt;&lt;br /&gt;
 2: do&lt;br /&gt;
 3:   for each object &amp;lt;math&amp;gt;i = 1,...,\ell&amp;lt;/math&amp;gt;;&lt;br /&gt;
 4:     calculate cross-validation estimates: &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;//вычислить оценки скользящего контроля&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;math&amp;gt;a_i := a_h(x_i;X^\ell\setminus{x_i}) = \frac{\sum\limits^{\ell}_{j=1,j\ne i} {y_j\gamma_j K \left ( \tfrac{\rho\left (x_i,x_j \right )}{h\left (x_i \right)} \right )}}{\sum\limits^{\ell}_{j=1,j\ne i}{\gamma_j K\left(\tfrac{\rho\left (x_i,x_j \right )}{h\left (x_i\right )}\right )} }&amp;lt;/math&amp;gt;&lt;br /&gt;
 5:   for each object &amp;lt;math&amp;gt;i = 1,...,\ell&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6:     &amp;lt;math&amp;gt;\gamma_i := \widetilde{K}\left (\left | a_i-y_i \right | \right );&amp;lt;/math&amp;gt;&lt;br /&gt;
 7: while coefficents &amp;lt;math&amp;gt;\gamma_i&amp;lt;/math&amp;gt; not stabilized; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;//пока коэффициенты не стабилизируются&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример на языке R==== &lt;br /&gt;
В этом примере мы попытаемся локально регрессировать и сгладить среднюю продолжительность безработицы на основе набора экономических данных из пакета $ggplot2$ языка $R$. Мы рассматриваем только первые 80 строк для этого анализа, чтобы легче было наблюдать степень сглаживания на приведенных ниже графиках.&amp;lt;br&amp;gt;&lt;br /&gt;
 data(economics, package=&amp;quot;ggplot2&amp;quot;)      &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;# загрузка данных&amp;lt;/span&amp;gt;&lt;br /&gt;
 economics$index &amp;lt;- 1:nrow(economics)    &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;# создание индексной переменной&amp;lt;/span&amp;gt;&lt;br /&gt;
 economics &amp;lt;- economics[1:80, ]          &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;# усечение до 80 строк для более наглядного демонстрирования&amp;lt;/span&amp;gt;&lt;br /&gt;
 loessMod10 &amp;lt;- loess(uempmed ~ index, data=economics, span=0.10) &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;# 10% параметр сглаживания span&amp;lt;/span&amp;gt;&lt;br /&gt;
 loessMod25 &amp;lt;- loess(uempmed ~ index, data=economics, span=0.25) &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;# 25% параметр сглаживания span&amp;lt;/span&amp;gt;&lt;br /&gt;
 loessMod50 &amp;lt;- loess(uempmed ~ index, data=economics, span=0.50) &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;# 50% параметр сглаживания span&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;# получить сглаженный результат&amp;lt;/span&amp;gt;&lt;br /&gt;
 smoothed10 &amp;lt;- predict(loessMod10) &lt;br /&gt;
 smoothed25 &amp;lt;- predict(loessMod25) &lt;br /&gt;
 smoothed50 &amp;lt;- predict(loessMod50)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;# Нарисовать&amp;lt;/span&amp;gt;&lt;br /&gt;
 plot(economics''$''uempmed, x=economics''$''date, type=&amp;quot;l&amp;quot;, main=&amp;quot;Локально взвешенное сглаживание&amp;quot;, xlab=&amp;quot;Дата&amp;quot;, ylab=&amp;quot;Длительность безработицы&amp;quot;)&lt;br /&gt;
 lines(smoothed10, x=economics''$''date, col=&amp;quot;red&amp;quot;)&lt;br /&gt;
 lines(smoothed25, x=economics''$''date, col=&amp;quot;green&amp;quot;)&lt;br /&gt;
 lines(smoothed50, x=economics''$''date, col=&amp;quot;blue&amp;quot;)&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:LOWESS.png|400px|thumb|Рис 5. На приведенном графике показано, что чем больше параметр сглаживания span, тем более сглаженной выглядит восстановленная регрессия]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Другие алгоритмы борьбы с выбросами===&lt;br /&gt;
В статистике методы, устойчивые к нарушениям модельных предположений о данных, называются ''робастными''. Метод локально взвешенного сглаживания относится к ''робастным'' методам, так как он устойчив к наличию небольшого количества выбросов. &lt;br /&gt;
* [[Дерево решений и случайный лес|Дерево принятия решения]] (англ. ''decision tree''&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9 Дерево принятия решения]&amp;lt;/ref&amp;gt;). Это дерево, как и уже описанный алгоритм локально взвешенного сглаживания, относится к ''робастным'' методам;&lt;br /&gt;
* [[Вариации регрессии|Робастная регрессия]] (англ. ''robust regression''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Robust_regression Робастная регрессия]&amp;lt;/ref&amp;gt;). В отличии от регрессии, использующей, например, метод наименьших квадратов, в этом алгоритме не строится идеализированное предположение, что вектор ошибок &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; распределен согласно нормальному закону. Однако на практике зачастую имеют место отклонения от этого предположения. Тогда можно применить метод наименьших модулей (англ. ''Least Absolute Deviation, LAD ''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Least_absolute_deviations Метод наименьших модулей]&amp;lt;/ref&amp;gt;) в случае, если распределение ошибок измерений подчиняется распределению Лапласа (англ. Laplace distribution &amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%9B%D0%B0%D0%BF%D0%BB%D0%B0%D1%81%D0%B0 Распределение Лапласа]&amp;lt;/ref&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;
&amp;lt;references/&amp;gt;&lt;br /&gt;
==Источники информации==&lt;br /&gt;
# https://machinelearningmastery.com/how-to-identify-outliers-in-your-data/&lt;br /&gt;
# https://ru.coursera.org/lecture/vvedenie-mashinnoe-obuchenie/obnaruzhieniie-vybrosov-t9PG4&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Статистика]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%80%D0%BE%D1%81%D1%81-%D0%B2%D0%B0%D0%BB%D0%B8%D0%B4%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=69653</id>
		<title>Кросс-валидация</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%80%D0%BE%D1%81%D1%81-%D0%B2%D0%B0%D0%BB%D0%B8%D0%B4%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=69653"/>
				<updated>2019-01-29T23:53:28Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Кросс-валидация''' или '''скользящий контроль''' {{---}} процедура эмпирического оценивания обобщающей способности алгоритмов. &lt;br /&gt;
С помощью кросс-валидации эмулируется наличие тестовой выборки, которая не участвует в обучении, но для которой известны правильные ответы. &lt;br /&gt;
&lt;br /&gt;
=== Определения и обозначения === &lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; {{---}} множество [[Общие понятия | признаков]], описывающих объекты, а &amp;lt;tex&amp;gt; Y &amp;lt;/tex&amp;gt; {{---}} конечное множество меток.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T^l = {(x_i, y_i)}_{i=1}^{l}, x_i \in X, y_i \in Y&amp;lt;/tex&amp;gt; {{---}} обучающая выборка,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; {{---}} мера качества,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} [[Модель алгоритма и ее выбор | модель]],&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mu: (X \times Y)^l \to A, &amp;lt;/tex&amp;gt; {{---}} алгоритм обучения.&lt;br /&gt;
&lt;br /&gt;
== Разновидности кросс-валидации ==&lt;br /&gt;
&lt;br /&gt;
=== Валидация на отложенных данных (Hold-Out Validation) ===&lt;br /&gt;
&lt;br /&gt;
Обучающая выборка один раз случайным образом разбивается на две части &amp;lt;tex&amp;gt; T^l = T^t \cup T^{l-t} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Hold-out.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После чего решается задача оптимизации: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;HO(\mu, T^t, T^{l-t}) = Q(\mu(T^t), T^{l-t}) \to min &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Метод Hold-out применяется в случаях больших датасетов, т.к. требует меньше вычислительных мощностей по сравнению с другими методами кросс-валидации. &lt;br /&gt;
Недостатком метода является то, что оценка существенно зависит от разбиения, тогда как желательно, чтобы она характеризовала только алгоритм обучения.&lt;br /&gt;
&lt;br /&gt;
=== Полная кросс-валидация (Complete cross-validation) ===&lt;br /&gt;
# Выбирается значение &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# Выборка разбивается всеми возможными способами на две части &amp;lt;tex&amp;gt; T^l = T^t \cup T^{l-t} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:CompleteCrossValidation.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;CVV_t = \frac{1}{C_l^{l-t}} &lt;br /&gt;
\displaystyle\sum_{T^l = T^t \cup T^{l-t}} Q(\mu(T^t), T^{l-t}) \to min &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Здесь число разбиений &amp;lt;tex&amp;gt;C_l^{l-t}&amp;lt;/tex&amp;gt; становится слишком большим даже при сравнительно малых значениях t, что затрудняет практическое применение данного метода.&lt;br /&gt;
&lt;br /&gt;
=== k-fold кросс-валидация ===&lt;br /&gt;
&lt;br /&gt;
# Обучающая выборка разбивается на &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; непересекающихся одинаковых по объему частей;&lt;br /&gt;
# Производится &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; итераций. На каждой итерации происходит следующее:&lt;br /&gt;
## Модель обучается на &amp;lt;tex&amp;gt; k - 1 &amp;lt;/tex&amp;gt; части обучающей выборки;&lt;br /&gt;
## Модель тестируется на части обучающей выборки, которая не участвовала в обучении.&lt;br /&gt;
Каждая из &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; частей единожды используется для тестирования. &lt;br /&gt;
Как правило, &amp;lt;tex&amp;gt;k = 10&amp;lt;/tex&amp;gt; (5 в случае малого размера выборки).&lt;br /&gt;
&lt;br /&gt;
[[Файл:K-fold-validation.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T^l = F_1 \cup \dots \cup F_k, |F_i| \approx \frac{l}{k}, &lt;br /&gt;
\\ CV_k = \frac{1}{k} \sum_{i=1}^{k} Q(\mu(T^l \setminus F_i),F_i) \to min &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== t×k-fold кросс-валидация === &lt;br /&gt;
# Процедура выполняется &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; раз: &lt;br /&gt;
## Обучающая выборка случайным образом разбивается на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; непересекающихся одинаковых по объему частей;&lt;br /&gt;
## Производится &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; итераций. На каждой итерации происходит следующее:&lt;br /&gt;
### Модель обучается на &amp;lt;tex&amp;gt; k - 1 &amp;lt;/tex&amp;gt; части обучающей выборки;&lt;br /&gt;
### Модель тестируется на части обучающей выборки, которая не участвовала в обучении.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T^l = F_{(1,1)} \cup \dots \cup F_{(k,1)} = \dots = F_{(1,t)} \cup \dots \cup F_{(k,t)}, |F_{(i,j)}| \approx \frac{l}{k}  &amp;lt;/tex&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; CV_{t \times k} = \frac{1}{tk} \sum_{j=1}^t \sum_{i=1}^{k} Q(\mu(T^l \setminus F_{(i,j)}),F_{(i,j)}) \to min &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Кросс-валидация по отдельным объектам (Leave-One-Out) === &lt;br /&gt;
Выборка разбивается на &amp;lt;tex&amp;gt;l-1&amp;lt;/tex&amp;gt; и 1 объект &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; раз.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LeaveOneOut.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;LOO = \frac{1}{l} \sum_{i=1}^{l} Q(\mu(T^l \setminus p_i),p_i) \to min &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;p_i = (x_i, y_i)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Преимущества LOO в том, что каждый объект ровно один раз участвует в контроле, а длина обучающих подвыборок лишь на единицу меньше длины полной выборки.&lt;br /&gt;
&lt;br /&gt;
Недостатком LOO является большая ресурсоёмкость, так как обучаться приходится &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; раз. Некоторые методы обучения позволяют достаточно быстро перенастраивать внутренние параметры алгоритма при замене одного обучающего объекта другим. В этих случаях вычисление LOO удаётся заметно ускорить.&lt;br /&gt;
&lt;br /&gt;
=== Случайные разбиения (Random subsampling) === &lt;br /&gt;
Выборка разбивается в случайной пропорции. Процедура повторяется несколько раз.&lt;br /&gt;
&lt;br /&gt;
[[Файл:CompleteCrossValidation.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== Критерий целостности модели (Model consistency criterion) === &lt;br /&gt;
Не переобученый алгоритм должен показывать одинаковую эффективность на каждой части.&lt;br /&gt;
&lt;br /&gt;
[[Файл:ModelConsistencyCriterion.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; D_1 = (\mu, T^{l-t}) = \frac{1}{l} \sum_{i=1}^l (\mu(T^t)(x_i)-\mu(T^{l-t})(x_i)) &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Метод может быть обобщен как аналог &amp;lt;tex&amp;gt; CV_{t \times 2} &amp;lt;/tex&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;
# [https://en.wikipedia.org/wiki/Cross-validation_(statistics) Кросс-валидация]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%A1%D0%BA%D0%BE%D0%BB%D1%8C%D0%B7%D1%8F%D1%89%D0%B8%D0%B9_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C Скользящий контроль] -  статья на MachineLearning.ru&lt;br /&gt;
# [https://drive.google.com/open?id=1p9CTAa1_gJpj94RXBEcQ09aVOa-KTlrd Model assessment and selection]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69652</id>
		<title>Переобучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69652"/>
				<updated>2019-01-29T23:48:59Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Переобучение''' (англ. overfitting) {{---}} негативное явление, возникающее, когда алгоритм обучения вырабатывает предсказания, которые слишком близко или точно соответствуют конкретному набору данных и поэтому не подходят для применения алгоритма к дополнительным данным или будущим наблюдениям.&lt;br /&gt;
&lt;br /&gt;
'''Недообучение''' (англ. underfitting) {{---}} негативное явление, при котором алгоритм обучения не обеспечивает достаточно малой величины средней ошибки на обучающей выборке. Недообучение возникает при использовании недостаточно сложных моделей.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
=== На примере [[Линейная регрессия | линейной регрессии]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; ===&lt;br /&gt;
Представьте задачу [[Линейная регрессия | линейной регрессии]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. Красные точки представляют исходные данные. Синии линии являются графиками полиномов различной степени M, аппроксимирующих исходные данные.&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:High_bias_reg.png|200px|thumb|Рис 1. Недообучение. M=1]]&lt;br /&gt;
 |[[Файл:Normal_bias_reg.png|200px|thumb|Рис 2. Норма. M=2]]&lt;br /&gt;
 |[[Файл:High_variance_reg.png|200px|thumb|Рис 3. Переобучение. M=4]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Как видно из Рис. 1, данные не поддаются линейной зависимости при небольшой степени полинома и по этой причине модель, представленная на данном рисунке, не очень хороша.&lt;br /&gt;
&lt;br /&gt;
На Рис. 2 представленна ситуация, когда выбранная полиномиальная функция подходит для описания исходных данных.&lt;br /&gt;
&lt;br /&gt;
Рис. 3 иллюстрирует случай, когда высокая степень полинома ведет к тому, что модель слишком заточена на данные обучающего датасета.&lt;br /&gt;
&lt;br /&gt;
=== На примере [[Логистическая регрессия | логистической регрессии]] ===&lt;br /&gt;
Представьте задачу классификации размеченых точек. Красные точки представляют данные класса 1. Голубые круглые точки {{---}} класса 2. Синии линии являются представлением различных моделей, которыми производится классификация данных. &lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:High_bias_cla.png|200px|thumb|Рис 4. Недообучение]]&lt;br /&gt;
 |[[Файл:Normal_bias_cla.png|200px|thumb|Рис 5. Подходящая модель]]&lt;br /&gt;
 |[[Файл:High_variance_cla.png|200px|thumb|Рис 6. Переобучение]]&lt;br /&gt;
 |}&lt;br /&gt;
Рис. 4 показывает результат использования слишком простой модели для представленного датасета. Как видно из рисунка, данные плохо классифицируются такой моделью.&lt;br /&gt;
&lt;br /&gt;
При выявлении недообучения следует выбрать более сложную модель (Рис. 5), которая бы смогла лучше описать представленные данные.&lt;br /&gt;
&lt;br /&gt;
Выбор слишком сложной модели приводит к ситуации, когда модель максимально точно классифицирует обучающую выборку, но сильно ошибается на новых измерениях. Данная ситуация представлена на Рис. 6.&lt;br /&gt;
&lt;br /&gt;
== Кривые обучения ==&lt;br /&gt;
'''Кривая обучения''' {{---}} графическое представление того, как изменение меры обученности (по вертикальной оси) зависит от определенной единицы измерения опыта (по горизонтальной оси)&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Learning_curve Learning curve, Wikipedia]&amp;lt;/ref&amp;gt;. Например, в примерах ниже представлена зависимость средней ошибки от объема датасета.&lt;br /&gt;
&lt;br /&gt;
=== Кривые обучения при переобучении ===&lt;br /&gt;
При переобучении небольшая средняя ошибка на обучающей выборке не обеспечивает такую же малую ошибку на тестовой выборке. &lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:High_variance_learning_curve.png|border|400px|Кривые обучения при переобучении|thumb|Рис 7. Кривые обучения при переобучении]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Рис. 7 демонстрирует зависимость средней ошибки для обучающей и тестовой выборок от объема датасета при переобучении.&lt;br /&gt;
&lt;br /&gt;
=== Кривые обучения при недообучении ===&lt;br /&gt;
При недообучении независимо от объема обучающего датасета как на обучающей выборке, так и на тестовой выборке небольшая средняя ошибка не достигается. &lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:High_bias_learning_curve.png|border|400px|Кривые обучения при переобучении|thumb|Рис 8. Кривые обучения при недообучении]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Рис. 8 демонстрирует зависимость средней ошибки для обучающей и тестовой выборок от объема датасета при недообучении.&lt;br /&gt;
&lt;br /&gt;
== High variance и high bias ==&lt;br /&gt;
'''Bias''' {{---}} ошибка неверных предположений в алгоритме обучения. Высокий '''bias''' может привести к недообучению.&lt;br /&gt;
&lt;br /&gt;
'''Variance''' {{---}} ошибка, вызванная большой чувствительностью к небольшим отклонениям в тренировочном наборе. Высокая дисперсия может привести к переобучению.&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:High_bias.jpg|border|300px|thumb|right|Рис 9. High variance и high bias]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
При использовании нейронных сетей '''variance''' увеличивается, а '''bias''' уменьшается с увеличением количества скрытых слоев.&lt;br /&gt;
&lt;br /&gt;
Для устранения '''high variance''' и '''high bias''' можно использовать смеси и ансамбли. Например, можно составить ансамбль ('''boosting''') из нескольких моделей с высоким '''bias''' и получить модель с небольшим '''bias'''. В другом случае при '''bagging''' соединяются несколько моделей с низким '''bias''', а результирующая модель позволяет уменьшить '''variance'''.&lt;br /&gt;
&lt;br /&gt;
===Дилемма bias–variance ===&lt;br /&gt;
'''Дилемма bias–variance''' {{---}} конфликт в попытке одновременно минимизировать '''bias''' и '''variance''', тогда как уменьшение одного из негативных эффектов, приводит к увеличению другого. Данная дилемма проиллюстрирована на Рис 10.&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Bias-Variance-Tradeoff.png|border|400px|thumb|right|Рис 10. Дилемма bias–variance]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
При небольшой сложности модели мы наблюдаем '''high bias'''. При усложнении модели '''bias''' уменьшается, но '''variance''' увеличится, что приводит к проблеме '''high variance'''.&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;
* Использование для описания модели функций с более высокой степенью;&lt;br /&gt;
* Уменьшение коэффициента регуляризации.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Модель алгоритма и ее выбор]]&lt;br /&gt;
* [[Оценка качества в задачах классификации и регрессии]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Оценка качества в задаче кластеризации]]&lt;br /&gt;
* [https://www.coursera.org/lecture/machine-learning/the-problem-of-overfitting-ACpTQ The Problem of Overfitting on Coursera, Andrew Ng]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
* [http://blog.lokad.com/journal/2009/4/22/overfitting-when-accuracy-measure-goes-wrong.html Overfitting: when accuracy measure goes wrong]&lt;br /&gt;
* [http://www3.cs.stonybrook.edu/~skiena/jaialai/excerpts/node16.html The Problem of Overfitting Data]&lt;br /&gt;
* [https://elitedatascience.com/overfitting-in-machine-learning Overfitting in Machine Learning]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Overfitting Overfitting] - статься на Википедии&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=Переобучение Переобучение] - вводная статься на MachineLearning.ru&lt;br /&gt;
# [https://www.coursera.org/lecture/machine-learning/the-problem-of-overfitting-ACpTQ The Problem of Overfitting] - курс Andrew Ng&lt;br /&gt;
# ''Hastie, T., Tibshirani, R., Friedman, J. '' [http://www-stat.stanford.edu/~tibs/ElemStatLearn The Elements of Statistical Learning, 2nd edition.] — Springer, 2009. — 533 p.&lt;br /&gt;
# ''Vapnik V.N. '' [http://lib.mexmat.ru/books/9220 Statistical learning theory.] — N.Y.: John Wiley &amp;amp; Sons, Inc., 1998. &lt;br /&gt;
# ''Воронцов, К. В. '' [http://www.machinelearning.ru/wiki/images/b/b6/Voron10doct.pdf Комбинаторная теория надёжности обучения по прецедентам]: Дис. док. физ.-мат. наук: 05-13-17. — Вычислительный центр РАН, 2010. — 271 с.&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</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=69651</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=69651"/>
				<updated>2019-01-29T23:40:51Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &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;Обзор&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}$ для $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}$. &lt;br /&gt;
&lt;br /&gt;
Можно определить &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&amp;lt;ref&amp;gt;[https://www1.maths.leeds.ac.uk~charlesstatlogwhole.pdf Donald Michie, David J. Spiegelhalter, Charles C. Taylor, and John Campbell. Machine Learning, Neural and Statistical Classification, 1994]&amp;lt;/ref&amp;gt; || $p/n$, $log(n)$, log(n/p)&lt;br /&gt;
|-&lt;br /&gt;
| Nr features || $p$ || Curse of dimensionality || $log(p)$, % categorical&lt;br /&gt;
|-&lt;br /&gt;
| Nr classes || $c$ || Complexity, imbalance || ratio min/maj class&lt;br /&gt;
|-&lt;br /&gt;
| Nr missing values || $m$ || Imputation effects &amp;lt;ref&amp;gt;A. Kalousis. Algorithm Selection via Meta-Learning. PhD thesis, University of Geneva, Department of Computer Science, 2002&amp;lt;/ref&amp;gt; || % missing&lt;br /&gt;
|-&lt;br /&gt;
| Nr outliers || $o$ || Data noisiness &amp;lt;ref&amp;gt;Peter J. Rousseeuw and Mia Hubert. Robust statistics for outlier detection. Wiley Interdisciplinary Reviews: Data Mining and Knowledge Discovery, 2011.&amp;lt;/ref&amp;gt; || $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 || 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 || min,max,$\mu$,$\sigma$,$q_{1},q_{3}$&lt;br /&gt;
|-&lt;br /&gt;
| Correlation || $\rho_{X_{1}X_{2}}$ || Feature interdependence || min,max,$\mu$,$\sigma$,$\rho_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Covariance || $cov_{X_{1}X_{2}}$ || Feature interdependence || min,max,$\mu$,$\sigma$,$cov_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Concentration || $\tau_{X_{1}X_{2}}$ || Feature interdependence &amp;lt;ref&amp;gt;Alexandros Kalousis and Melanie Hilario. Model selection via meta-learning: a comparative study.Intl Journ. on Artificial Intelligence Tools, 2001.&amp;lt;/ref&amp;gt; || min,max,$\mu$,$\sigma$,$\tau_{XY}$&lt;br /&gt;
|-&lt;br /&gt;
| Sparsity || sparsity(X) || Degree of discreteness &amp;lt;ref&amp;gt;Mostafa A. Salama, Aboul~Ella Hassanien, and Kenneth Revett. Employment of neural network and rough set in meta-learning, 2013.&amp;lt;/ref&amp;gt; || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Gravity || gravity(X) || Inter-class dispersion &amp;lt;ref&amp;gt;Shawkat Ali and Kate~A. Smith-Miles. On learning algorithm selection for classification. Applied Soft Computing, 2006.&amp;lt;/ref&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| ANOVA p-value || $p_{val_{\texttt{X}_{1}X_{2}}}$ || Feature redundancy || $p_{val_{XY}}$\citep{soares+04}&lt;br /&gt;
|-&lt;br /&gt;
| Coeff. of variation || $\frac{\sigma_{Y}}{\mu_{Y}}$ || Variation in target &amp;lt;ref&amp;gt;C. Soares, P. Brazdil, and P. Kuba. A meta-learning method to select the kernel width in support vector   regression, 2004.&amp;lt;/ref&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| PCA $\rho_{\lambda_{1}}$ || $\sqrt{\frac{\lambda_{1}}{1+\lambda_{1}}}$ || Variance in first PC || $\frac{\lambda_{1}}{\sum_{i} \lambda_{i}}$\citep{&amp;lt;re[https://www1.maths.leeds.ac.uk~charlesstatlogwhole.pdf]&amp;lt;/ref&amp;gt;f&amp;gt;}&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 &amp;lt;ref&amp;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&amp;lt;/ref&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Class probability || $P(\texttt{C})$ || Class distribution || 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 ||&lt;br /&gt;
|-&lt;br /&gt;
| Norm. entropy || $\frac{H(\texttt{X})}{log_{2}n}$ || Feature informativeness &amp;lt;ref&amp;gt;Ciro Castiello, Giovanna Castellano, and Anna~Maria Fanelli. Meta-data: {C}haracterization of input features for meta-learning, pages 457 -- 468, 2005.&amp;lt;/ref&amp;gt; || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Mutual inform. || $MI(\texttt{C},\texttt{X})$ || Feature importance || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Uncertainty coeff. || $\frac{MI(\texttt{C},\texttt{X})}{H(\texttt{C})}$ || &amp;lt;ref&amp;gt;Feature importance A. Agresti. Categorical Data Analysis. Wiley Interscience, 2002.&amp;lt;/ref&amp;gt; || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Equiv. nr. feats || $\frac{H(C)}{\overline{MI(C,X)}}$ || Intrinsic dimensionality ||&lt;br /&gt;
|-&lt;br /&gt;
| Noise-signal ratio || $\frac{\overline{H(X)}-\overline{MI(C,X)}}{\overline{MI(C,X)}}$ || Noisiness of data ||&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}$ || &lt;br /&gt;
|-&lt;br /&gt;
| Volume of overlap || || Class distribution overlap &amp;lt;ref&amp;gt;Tin Kam Ho and Mitra Basu. Complexity measures of supervised classification problems. Pattern Analysis and Machine Intellig, 2002.&amp;lt;/ref&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| Concept variation || || Task complexity &amp;lt;ref&amp;gt;R. Vilalta. Understanding accuracy performance through concept characterization and algorithm analysis. ICML Workshop on Recent Advances in Meta-Learning and Future Work, 1999.&amp;lt;/ref&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Data consistency || || Data quality &amp;lt;ref&amp;gt;C K{\&amp;quot;o}pf and I Iglezakis. Combination of task description strategies and case base properties for meta-learning, 2002.&amp;lt;/ref&amp;gt; ||&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 &amp;lt;ref&amp;gt;Y Peng, P Flach, C Soares, and P Brazdil. Improved dataset characterisation for meta-learning, 2002.&amp;lt;/ref&amp;gt; || Tree depth&lt;br /&gt;
|-&lt;br /&gt;
| Branch length || || Concept complexity || 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 || 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 &amp;lt;ref&amp;gt;Andray Filchenkov and Arseniy Pendryak. Dataset metafeature description for recommending feature selection. In \emph{ISMW FRUCT}, pages 11--18, 2015.&amp;lt;/ref&amp;gt; || 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 &amp;lt;ref&amp;gt;Bernhard Pfahringer, Hilan Bensusan, and Christophe G. Giraud-Carrier. Meta-learning by landmarking various learning algorithms.In \emph{17th International Conference on Machine Learning (ICML), 2000.&amp;lt;/ref&amp;gt; || min,max,$\mu$,$\sigma$&lt;br /&gt;
|-&lt;br /&gt;
| Information gain || || Feature importance || 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 &amp;lt;ref&amp;gt;Bernhard Pfahringer, Hilan Bensusan, and Christophe G. Giraud-Carrier. Meta-learning by landmarking various learning algorithms.In \emph{17th International Conference on Machine Learning (ICML)}, pages 743 -- 750, 2000.&amp;lt;/ref&amp;gt; || See \citet{Pfahringer:2000p553}&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Tree) || $P(\theta_{Tree},t_{j})$ || Data separability || Stump,RandomTree&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(Lin) || $P(\theta_{Lin},t_{j})$ || Linear separability || Lin.Disciminant&lt;br /&gt;
|-&lt;br /&gt;
| Landmarker(NB) || $P(\theta_{NB},t_{j})$ || Feature independence || See &amp;lt;ref&amp;gt;Daren Ler, Irena Koprinska, and Sanjay Chawla. Utilizing regression-based landmarkers within a meta-learning framework for algorithm selection. \emph{Technical Report 569. University of Sydney}, pages 44--51, 2005.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Relative LM || $P_{a,j} - P_{b,j}$ || Probing performance &amp;lt;ref&amp;gt;J F{\&amp;quot;u}rnkranz and J Petrak. An evaluation of landmarking variants. \emph{ECML/PKDD 2001 Workshop on Integrating Aspects of Data Mining, Decision Support and Meta-Learning}, pages 57--68, 2001.&amp;lt;/ref&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Subsample LM || $P(\theta_{i},t_{j},s_{t})$ || Probing performance &amp;lt;ref&amp;gt;Taciana AF Gomes, Ricardo BC Prud{\^e}ncio, Carlos Soares, Andr{\'e} LD Rossi and Andr{\'e} Carvalho. Combining meta-learning and search techniques to select parameters for support vector machines, 2012.&amp;lt;/ref&amp;gt; ||&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 или гистограммами.&lt;br /&gt;
&lt;br /&gt;
Во время вычисления похожести задач важно нормализовать все мета-фичи [bardnet], использовать feature selection &amp;lt;ref&amp;gt;L Todorovski and S Dzeroski. Experiments in meta-level learning with ILP. Lecture Notes in Computer Science, 1704:98–106, 1999.&amp;lt;/ref&amp;gt; или использовать 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://www1.maths.leeds.ac.uk/~charles/statlog/whole.pdf&lt;br /&gt;
* https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%B8_%D0%B5%D1%91_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80&amp;diff=69650</id>
		<title>Модель алгоритма и её выбор</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%B8_%D0%B5%D1%91_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80&amp;diff=69650"/>
				<updated>2019-01-29T23:18:49Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Понятие модели==&lt;br /&gt;
Пусть дана обучающая выборка &amp;lt;tex&amp;gt;(X, Y)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; {{---}} множество признаков, описывающих объекты, а &amp;lt;tex&amp;gt; Y &amp;lt;/tex&amp;gt; {{---}} конечное множество меток.&lt;br /&gt;
&lt;br /&gt;
Пусть задана функция &amp;lt;tex&amp;gt; g: X \times \Theta \rightarrow Y &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; \Theta &amp;lt;/tex&amp;gt; {{---}} множество дополнительных параметров (весов) функции.&lt;br /&gt;
&lt;br /&gt;
Описанная выше функция &amp;lt;tex&amp;gt; g &amp;lt;/tex&amp;gt; для фиксированного значения весов &amp;lt;tex&amp;gt; \theta \in \Theta &amp;lt;/tex&amp;gt; называется '''решающим правилом'''.&lt;br /&gt;
&lt;br /&gt;
'''Модель''' {{---}} совокупность всех решающих правил, которые получаются путем присваивания весам всех возможных допустимых значений. &lt;br /&gt;
&lt;br /&gt;
Формально модель &amp;lt;tex&amp;gt; A = \{g(x, \theta) | \theta \in \Theta\} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Модель определяется множеством допустимых весов &amp;lt;tex&amp;gt; \Theta &amp;lt;/tex&amp;gt; и структурой решающего правила &amp;lt;tex&amp;gt; g(x,\theta) &amp;lt;/tex&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;
Для нахождения оптимальных гиперпараметров модели могут применяться различные алгоритмы [[Настройка гиперпараметров | настройки гиперпараметров]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
[[Файл:Linear-regression.png|300px|thumb|[http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%29 Рис 1. Пример линейной регрессии]]]&lt;br /&gt;
В качестве примера модели приведем [[Линейная регрессия | линейную регрессию]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан].&lt;br /&gt;
&lt;br /&gt;
Линейная регрессия задается следующей формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; g(x, \theta) = \theta_0 + \theta_1x_1 + ... + \theta_kx_k = \theta_0 + \sum_{i=1}^k \theta_ix_i = \theta_0 + x^T\theta&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; x^T = (x_1, x_2, ..., x_k) &amp;lt;/tex&amp;gt; {{---}} вектор признаков, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \theta = (\theta_1, \theta_2, ..., \theta_k)&amp;lt;/tex&amp;gt; {{---}} веса модели, настраиваемые в процессе обучения.&lt;br /&gt;
&lt;br /&gt;
Гиперпараметром модели является число слагаемых в функции &amp;lt;tex&amp;gt; g(x, \theta) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Более подробный пример линейной регрессии можно посмотреть в статье [[Переобучение | переобучение]].&lt;br /&gt;
&lt;br /&gt;
== Задача выбора модели ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} модель алгоритма, характеризующаяся гиперпараметрами &amp;lt;tex&amp;gt; \lambda = \{\lambda_1, ..., \lambda_m\}, \lambda_1 \in \Lambda_1, ..., \lambda_m \in \Lambda_m &amp;lt;/tex&amp;gt;. Тогда с ней связано пространство гиперпараметров &amp;lt;tex&amp;gt; \Lambda = \Lambda_1 \times ... \times \Lambda_m &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
За &amp;lt;tex&amp;gt; A_{\lambda}&amp;lt;/tex&amp;gt; обозначим алгоритм, то есть модель алгоритма, для которой задан вектор гиперпараметров &amp;lt;tex&amp;gt; \lambda \in \Lambda &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для выбора наилучшего алгоритма необходимо зафиксировать меру качества работы алгоритма. Назовем эту меру &amp;lt;tex&amp;gt; Q(A_{\lambda}, D) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задачу выбора наилучшего алгоритма можно разбить на две подзадачи: подзадачу выбора лучшего алгоритма из портфолио и подзадачу настройки гиперпараметров.&lt;br /&gt;
&lt;br /&gt;
==== Подзадача выбора лучшего алгоритма из портфолио ====&lt;br /&gt;
Дано некоторое множество алгоритмов с фиксированными структурными параметрами &amp;lt;tex&amp;gt; \mathcal{A} = \{A^1_{\lambda_1}, ..., A^m_{\lambda_m}\}&amp;lt;/tex&amp;gt; и обучающая выборка &amp;lt;tex&amp;gt; D = \{d_1, ..., d_n\}&amp;lt;/tex&amp;gt;. Здесь &amp;lt;tex&amp;gt; d_i = (x_i, y_i) \in (X, Y)&amp;lt;/tex&amp;gt;. Требуется выбрать алгоритм &amp;lt;tex&amp;gt; A^*_{\lambda_*} &amp;lt;/tex&amp;gt;, который окажется наиболее эффективным с точки зрения меры качества &amp;lt;tex&amp;gt; Q &amp;lt;/tex&amp;gt;.&lt;br /&gt;
==== Подзадача оптимизации гиперпараметров ====&lt;br /&gt;
Подзадача оптимизации гиперпараметров заключается в подборе таких &amp;lt;tex&amp;gt; \lambda^* \in \Lambda &amp;lt;/tex&amp;gt;, при которых заданная модель алгоритма &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; будет наиболее эффективна.&lt;br /&gt;
&lt;br /&gt;
Гиперпараметры могут выбираться из ограниченного множества или с помощью перебора из неограниченного множества гиперпараметров, это зависит от непосредственной задачи. Во втором случае актуален вопрос максимального времени, которое можно потратить на поиск наилучших гиперпараметров, так как чем больше времени происходит перебор, тем лучше гиперпараметры можно найти, но при этом может быть ограничен временной бюджет, из-за чего перебор придется прервать.&lt;br /&gt;
&lt;br /&gt;
=== Методы выбора модели ===&lt;br /&gt;
Модель можно выбрать из некоторого множества моделей, проверив результат работы каждой модели из множества с помощью ручного тестирования, но ручное тестирование серьезно ограничивает количество моделей, которые можно перебрать, а также требует больших трудозатрат. Поэтому в большинстве случаев используются алгоритмы, позволяющие автоматически выбирать модель. Далее будут рассмотрены некоторые из таких алгоритмов.&lt;br /&gt;
[[Файл:Scikit-learn-scheme.png|900px|thumb|[https://www.codeastar.com/choose-machine-learning-models-python/ Рис 2. Схема выбора модели в библиотеке scikit-learn для Python]]]&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;
Целью мета-обучения является решение задачи выбора алгоритма из портфолио алгоритмов для решения поставленной задачи без непосредственного применения каждого из них. Решение этой задачи в рамках мета-обучения сводится к задаче [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D1%83%D1%87%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%BC обучения с учителем]. Для этого используется заранее отобранное множество наборов данных &amp;lt;tex&amp;gt; D &amp;lt;/tex&amp;gt;. Для каждого набора данных &amp;lt;tex&amp;gt; d \in D &amp;lt;/tex&amp;gt; вычисляется вектор мета-признаков, которые описывают свойства этого набора данных. Ими могут быть: число категориальных или численных признаков объеков в &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;, число возможных меток, размер &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt; и [https://ieeexplore.ieee.org/document/7382962 многие другие], а еще эту статью можно найти вот [https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf тут]. Каждый алгоритм запускается на всех наборах данных из &amp;lt;tex&amp;gt; D &amp;lt;/tex&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;
&lt;br /&gt;
'''Емкость модели для задачи классификации''' {{---}} максимальное число объектов обучающей выборки, для которых при любом их разбиении на классы найдется хотя бы одно решающее правило, безошибочно их классифицирующее.&lt;br /&gt;
&lt;br /&gt;
По аналогии емкость обобщается на другие задачи машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что чем больше емкость, тем более «гибкой» является модель и, соответственно, тем хуже. Значит нужно добиваться минимально возможного количества ошибок на обучении при минимальной возможной емкости.&lt;br /&gt;
&lt;br /&gt;
Существует формула Вапника, связывающая ошибку на обучении &amp;lt;tex&amp;gt; P_{train}(\theta) &amp;lt;/tex&amp;gt;, емкость &amp;lt;tex&amp;gt; h(\theta) &amp;lt;/tex&amp;gt; и ошибку на генеральной совокупности &amp;lt;tex&amp;gt; P_{test}(\theta) &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; P_{test}(\theta) &amp;lt;= P_{train}(\theta) + \sqrt{\frac{h(\Theta) * (\log{(\frac{2d}{h(\Theta)})} + 1) - \log{(\frac{\eta}{4})}}{n}} &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt; {{---}} размерность пространства признаков.&lt;br /&gt;
&lt;br /&gt;
Неравенство верно с вероятностью &amp;lt;tex&amp;gt; 1 - \eta &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \forall \theta \in \Theta &amp;lt;/tex&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;
# Многие модели с бесконечной емкостью показывают хорошие результаты на практике.&lt;br /&gt;
&lt;br /&gt;
== Существующие системы автоматического выбора модели ==&lt;br /&gt;
===Автоматизированный выбор модели в библиотеке [https://www.ml4aad.org/wp-content/uploads/2018/07/automl_book_draft_auto-weka.pdf auto-WEKA] для Java===&lt;br /&gt;
Библиотека используется для одновременного поиска оптимальной модели и оптимальных гиперпараметров модели для задач классификации и регрессии (начиная с версии 2.0).&lt;br /&gt;
&lt;br /&gt;
Библиотека позволяет автоматически выбирать из 27 базовых алгоритмов, 10 мета-алгоритмов и 2 ансамблевых алгоритмов лучший, одновременно настраивая его гиперпараметры при помощи алгоритма [https://www.ml4aad.org/automated-algorithm-design/algorithm-configuration/smac/ SMAC]. Решение достигается полным перебором: оптимизация гиперпараметров запускается на всех алгоритмах по очереди. Недостатком такого подхода является слишком большое время выбора модели.&lt;br /&gt;
===Автоматизированный выбор модели в библиотеке [https://epistasislab.github.io/tpot/ Tree-base Pipeline Optimization Tool (TPOT)] для Python.===&lt;br /&gt;
[[Файл:TPOT-scheme.jpeg|500px|thumb|[https://raw.githubusercontent.com/EpistasisLab/tpot/master/images/tpot-ml-pipeline.png Рис 3. Схема выбора модели в библиотеке TPOT]]]&lt;br /&gt;
Библиотека используется для одновременного поиска оптимальной модели и оптимальных гиперпараметров модели для задачи классификации.&lt;br /&gt;
&lt;br /&gt;
Выбор модели осуществляется на основе конвейера, организованного в древовидной структуре. Каждая вершина дерева {{---}} один из четырех операторов конвейера (preprocessing, decomposition, feature selection, modelling). Каждый конвейер начинается с одной или нескольких копий входного набора данных, которые являются листьями дерева и которые подаются в операторы в соответствии со структурой конвейера. Данные модифицируются оператором в вершине и поступают на вход следующей вершины. В библиотеке используются генетические алгоритмы для нахождения лучших конвейеров.&lt;br /&gt;
&lt;br /&gt;
После поиска конвейера его также можно экспортировать в файл Python.&lt;br /&gt;
&lt;br /&gt;
===Автоматизированный выбор модели в библиотеке [https://automl.github.io/auto-sklearn/stable/ auto-sklearn] для Python===&lt;br /&gt;
[[Файл:Auto-sklearn-scheme.png|500px|thumb|[https://papers.nips.cc/paper/5872-efficient-and-robust-automated-machine-learning.pdf Рис 4. Схема выбора модели в библиотеке auto-sklearn]]]&lt;br /&gt;
Библиотека используется для одновременного поиска оптимальной модели и оптимальных гиперпараметров модели для задачи классификации.&lt;br /&gt;
&lt;br /&gt;
Сначала используется мета-обучение на основе различных признаков и мета-признаков набора данных, чтобы найти наилучшие модели. После этого используется подход [https://en.wikipedia.org/wiki/Bayesian_optimization Байесовской оптимизации], чтобы найти наилучшие гиперпараметры для наилучших моделей.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Настройка гиперпараметров]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Переобучение]]&lt;br /&gt;
* [[Мета-обучение]]&lt;br /&gt;
* [[Линейная регрессия]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%92%D0%B0%D0%BF%D0%BD%D0%B8%D0%BA%D0%B0-%D0%A7%D0%B5%D1%80%D0%B2%D0%BE%D0%BD%D0%B5%D0%BD%D0%BA%D0%B8%D1%81%D0%B0 Теория Вапника-Червоненкинса]&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Cross-validation_(statistics) Кросс-валидация]&lt;br /&gt;
# [https://link.springer.com/article/10.1023/B:MACH.0000015878.60765.42 Мета-обучение]&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D1%83%D1%87%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%BC Обучение с учителем]&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F Линейная регрессия]&lt;br /&gt;
# [https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf Datasets Meta-Feature Description for Recommending Feature Selection Algorithm]&lt;br /&gt;
# [https://www.ml4aad.org/automated-algorithm-design/algorithm-configuration/smac/ SMAC]&lt;br /&gt;
# [https://7bce9816-a-62cb3a1a-s-sites.googlegroups.com/site/automl2017icml/accepted-papers/AutoML_2017_paper_23.pdf?attachauth=ANoY7cr6uPaUoNh3gc3A-A1UbLXQgNEATEkfZmKD8kozB3hpCYtM9JwnOevEsW9W42CwurzJKrxxEatcB4DCjWNB_Ndvy1uC0lbQyCTlDIfrW6eYJXvdbFJPilYfmf8_ryilH0IwG0ddntLYy-VA3Fm1JeM495fTZxorYth0DDKiqtKvSR92dGl8CM_mUB7sun0R6wurCxM36QqcYEaf5kIm13MM0reWlR3aPZVNe_-AefOCpoXznR-wH04mSWjH8jmlk5Bw51AN&amp;amp;attredirects=0 Fast Automated Selection of Learning Algorithm And its Hyperparameters by Reinforcement Learning]&lt;br /&gt;
# Shalamov V., Efimova V., Muravyov S., and Filchenkov A. &amp;quot;Reinforcement-based Method for Simultaneous Clustering Algorithm Selection and its Hyperparameters Optimization.&amp;quot; Procedia Computer Science 136 (2018): 144-153.&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/images/0/05/BMMO11_4.pdf Выбор модели] - презентация на MachineLearning.ru&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Hyperparameter_(machine_learning) Гиперпараметры] - статья на Википедии&lt;br /&gt;
# [https://machinelearningmastery.com/difference-between-a-parameter-and-a-hyperparameter/ Разница между параметрами и гиперпараметрами] - описание разницы между параметрами и гиперпараметрами модели&lt;br /&gt;
# [http://jmlda.org/papers/doc/2016/no2/Efimova2016Reinforcement.pdf Применение обучения с подкреплением для одновременного выбора модели алгоритма классификации и ее структурных параметров]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%89%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D1%8F&amp;diff=69649</id>
		<title>Общие понятия</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%89%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D1%8F&amp;diff=69649"/>
				<updated>2019-01-29T23:09:14Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Понятие машинного обучения в искусственном интеллекте ==&lt;br /&gt;
Одним из первых, кто использовал термин &amp;quot;машинное обучение&amp;quot;, был изобретатель первой самообучающейся компьютерной программы игры в шашки А. Л. Самуэль в 1959 г. &amp;lt;ref&amp;gt;[https://www.cs.virginia.edu/~evans/greatworks/samuel.pdf A.L. Samuel &amp;quot;Some Studies in Machine Learning Using the Game of Checkers&amp;quot; (IBM Journal. July 1959. P. 210–229)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Машинное обучение''' (англ. ''Machine learning'') {{---}} процесс, который даёт возможность компьютерам обучаться выполнять что-то без явного написания кода.&lt;br /&gt;
}}&lt;br /&gt;
Это определение не выдерживает критики, так как не понятно, что означает наречие &amp;quot;явно&amp;quot;. Более точное определение дал намного позже Т. М. Митчелл. &amp;lt;ref&amp;gt;[https://www.cs.ubbcluj.ro/~gabis/ml/ml-books/McGrawHill%20-%20Machine%20Learning%20-Tom%20Mitchell.pdf T.M. Mitchell &amp;quot;Machine Learning&amp;quot; (McGraw-Hill, 1997) ]&amp;lt;/ref&amp;gt;&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Компьютерная '''программа обучается''' на основе опыта $E$ по отношению к некоторому классу задач $T$ и меры качества $P$, если качество решения задач из $T$, измеренное на основе $P$, улучшается с приобретением опыта $E$. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Задача обучения ==&lt;br /&gt;
$X$ {{---}} множество объектов (англ. '''object set''', or ''input set'') &amp;lt;br /&amp;gt;&lt;br /&gt;
$Y$ {{---}} множество меток классов (англ. '''label set''', or ''output set'') &amp;lt;br /&amp;gt;&lt;br /&gt;
$\hat y∶ X → Y$ {{---}} неизвестная зависимость  (англ. '''unknown target function''' ''(dependency)'') &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Дано''' &amp;lt;br /&amp;gt;&lt;br /&gt;
${x_1, . . . , x_l} ⊂ X$ {{---}} обучающая выбока (англ. ''training sample set'') &amp;lt;br /&amp;gt;&lt;br /&gt;
$y_i = \hat y(x_i), i = 1, . . . , l $ {{---}} известные метки классов &amp;lt;br /&amp;gt;&lt;br /&gt;
'''Найти''' &amp;lt;br /&amp;gt;&lt;br /&gt;
Найти $ a ∶ X → Y $ {{---}} алгоритм, решающую функцию (англ. '''decision function'''), приближающую $y$ на всём множестве $X$.&lt;br /&gt;
=== Признаки ===&lt;br /&gt;
Компьютер всегда имеет дело с признаковым описанием объектов. ''Например,'' пациента можно описать признаками: имя, возраст, номер полиса, жалобы, давление, температура, результаты анализов. &amp;lt;br /&amp;gt;&lt;br /&gt;
$f_j∶ X → D_j,j = 1, ... , n$ {{---}} признаки (англ. '''features''', or ''attributes'').&lt;br /&gt;
&lt;br /&gt;
Типы признаков:&lt;br /&gt;
* бинарный (''binary''): $D_j = \{0, 1\}$;&lt;br /&gt;
* номинальный, или категориальный (''categorical): $D_j$ конечно;&lt;br /&gt;
* упорядоченный (''ordinal''): $D_j$ конечно и упорядоченно;&lt;br /&gt;
* числовой (''numerical''): $D_j = \mathbb{R}$.&lt;br /&gt;
&lt;br /&gt;
т.е. объект представляется как набор признаков $(f_1(x),... ,f_n(x))$. Данные обычно представляются в виде матрицы объектов-признаков &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
F = ||f_j(x_i)||_{[l \times n]} = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
f_1(x_1) &amp;amp; \cdots &amp;amp; f_n(x_1) \\&lt;br /&gt;
\cdots &amp;amp; \cdots &amp;amp; \cdots \\&lt;br /&gt;
f_1(x_l) &amp;amp; \cdots &amp;amp; f_n(x_l) \\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Типы задач ===&lt;br /&gt;
'''Задачи классификации''' (англ. ''classification''):&lt;br /&gt;
* $Y = \{−1, +1\}$ — классификация на 2 класса;&lt;br /&gt;
* $Y = \{1, . . . , M\}$ — на $M$ непересекающихся классов;&lt;br /&gt;
* $Y = \{0, 1\}^M$— на $M$ классов, которые могут пересекаться.&lt;br /&gt;
''Примеры:'' распознавание текста по рукописному вводу, определение того, находится на фотографии человек или кот.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Задачи восстановления регрессии''' (англ. ''regression''):&lt;br /&gt;
{{main|Восстановление регрессии|l1=Восстановление регрессии&amp;lt;sup&amp;gt;[на 28.01.2019 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
* $Y = \mathbb{R}$ или $Y = \mathbb{R}^m$.&lt;br /&gt;
''Примеры:'' предсказание стоимости акции через полгода, предсказание прибыли магазина в следующем месяце, предсказание качества вина на слепом тестировании.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Задачи ранжирования''' (англ. ''ranking''):&lt;br /&gt;
* $Y$ {{---}} конечное упорядоченное множество.&lt;br /&gt;
''Пример:'' выдача поискового запроса.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Задачи уменьшения размерности'''  (англ. ''dimensionality reduction'') &amp;lt;br/&amp;gt;&lt;br /&gt;
{{main|Уменьшение размерности}}&lt;br /&gt;
Научиться описывать данные не $N$ признаками, а меньшим числом для повышения точности модели или последующей визуализации. В качестве примера помимо необходимости для визуализации можно привести сжатие данных. &amp;lt;br/&amp;gt;&lt;br /&gt;
'''Задачи кластеризации'''  (англ. ''cluster analysis'')&amp;lt;br/&amp;gt;&lt;br /&gt;
{{main|Кластеризация}}&lt;br /&gt;
Разбиение данных множества объектов на подмножества ('''кластеры''') таким образом, чтобы объекты из одного кластера были более похожи друг на друга, чем на объекты из других кластеров по какому-либо критерию.  &amp;lt;br/&amp;gt;&lt;br /&gt;
''Примеры:'' разбиение клиентов сотового оператора по платёжеспособности, разбиение космических объектов на похожие (галактики, планеты, звезды и так далее). &amp;lt;br/&amp;gt;&lt;br /&gt;
'''Задачи выявления аномалий''' (англ. ''anomaly detection'')&amp;lt;br/&amp;gt;&lt;br /&gt;
{{main|Выброс}}&lt;br /&gt;
На основании признаков научиться различать отличать аномалии. Кажется, что от задачи классификации эта задача ничем не отличается. Но особенность выявления аномалий состоит в том, что примеров аномалий для тренировки модели у нас либо очень мало, либо нет совсем, поэтому мы не можем решать такую задачу как задачу классификации. &amp;lt;br/&amp;gt;&lt;br /&gt;
''Пример:'' определение мошеннических транзакций по банковской карте.&lt;br /&gt;
&lt;br /&gt;
== Классификация задач машинного обучения ==&lt;br /&gt;
&lt;br /&gt;
==== Обучение с учителем (англ. ''Supervised learning'' &amp;lt;ref&amp;gt; [http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D1%83%D1%87%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%BC Обучение с учителем]&amp;lt;/ref&amp;gt;) ====&lt;br /&gt;
Метки классов $y_i$ доступны все сразу (известны ответы для поставленной задачи).&amp;lt;br/&amp;gt;&lt;br /&gt;
''Задачи которые могут решаться этим способом:'' классификация, регрессия.&lt;br /&gt;
&lt;br /&gt;
==== Обучение без учителя (англ. ''Unsupervised learning'') ====&lt;br /&gt;
Изучает широкий класс задач обработки данных, в которых известны только описания множества объектов (обучающей выборки), и требуется обнаружить внутренние взаимосвязи, зависимости, закономерности, существующие между объектами. Т.е. тренировочные данные доступны все сразу, но ответы для поставленной задачи неизвестны. &lt;br /&gt;
&lt;br /&gt;
''Задачи, которые могут решаться этим способом:'' кластеризация, нахождение ассоциативных правил, выдача рекомендаций (например, реклама), уменьшение размерности датасета.&lt;br /&gt;
&lt;br /&gt;
==== Обучение с частичным привлечением учителя (англ. ''Semi-supervised learning''&amp;lt;ref&amp;gt;[http://www.machinelearning.ru/wiki/index.php?title=%D0%A7%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Semi-supervised learning]&amp;lt;/ref&amp;gt;) ====&lt;br /&gt;
Занимает промежуточное положение между обучением с учителем и без учителя. Каждый прецедент представляет собой пару «объект, ответ», но ответы известны только на части прецедентов (Размечено мало, либо малоинформативная часть).&amp;lt;br/&amp;gt;&lt;br /&gt;
''Примером частичного обучения может послужить сообучение:'' два или более обучаемых алгоритма используют один и тот же набор данных, но каждый при обучении использует различные — в идеале некоррелирующие — наборы признаков объектов.&lt;br /&gt;
&lt;br /&gt;
==== Обучение с подкреплением (англ. ''Reinforcement learning'') ====&lt;br /&gt;
{{main|Обучение с подкреплением}}&lt;br /&gt;
Частный случай обучения с учителем, сигналы подкрепления (правильности ответа) выдаются не учителем, а некоторой средой, с которой взаимодействует программа. Размеченность данных зависит от среды.&lt;br /&gt;
&lt;br /&gt;
Окружение обычно формулируется как марковский процесс принятия решений (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием. Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие суб оптимальных решений (дающих локальный экстремум) не ограничивается явно. Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний.&lt;br /&gt;
&lt;br /&gt;
==== Активное обучение (англ. ''Active learning'') ====&lt;br /&gt;
{{main|Активное обучение}}&lt;br /&gt;
Отличается тем, что обучаемый имеет возможность самостоятельно назначать следующий прецедент, который станет известен. Применяется когда получение истиной метки для объекта затруднительно. Поэтому алгоритм должен уметь определять, на каких объектах ему надо знать ответ,&lt;br /&gt;
чтобы лучше всего обучиться, построить наилучшую модель.&lt;br /&gt;
&lt;br /&gt;
==== Обучение в реальном времени (англ. ''Online learning'') ====&lt;br /&gt;
Может быть как обучением с учителем, так и без учителя. Специфика в том, что тренировочные данные поступают последовательно. Требуется немедленно принимать решение по каждому прецеденту и одновременно доучивать модель зависимости с учётом новых прецедентов. Здесь существенную роль играет фактор времени.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач ==&lt;br /&gt;
*  '''Предсказание месторождений полезных ископаемых''' &amp;lt;br/&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;
При поиске редких полезных ископаемых количество объектов может оказаться намного меньше, чем количество признаков. В этой ситуации плохо работают классические статистические методы. Задача решается путём поиска закономерностей в имеющемся массиве данных. В процессе решения выделяются короткие наборы признаков, обладающие наибольшей ''информативностью'' — способностью наилучшим образом разделять классы (''&amp;quot;синдромы&amp;quot;'' месторождений). &lt;br /&gt;
* '''Оценивание кредитоспособности заёмщиков''' &amp;lt;br/&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;
* ''Порядковые признаки:'' образование, занимаемая должность; &lt;br /&gt;
* ''Числовые признаки:''сумма кредита, возраст, стаж работы, доход семьи, размер задолженностей в других банках.&lt;br /&gt;
&lt;br /&gt;
''Обучающая выборка'' составляется из заёмщиков с известной кредитной историей. &lt;br /&gt;
&lt;br /&gt;
На стадии обучения производится синтез и отбор информативных признаков и определяется, сколько баллов назначать за каждый признак, чтобы риск принимаемых решений был минимален. Чем выше суммарное число баллов заёмщика, набранных по совокупности информативных признаков, тем более надёжным считается заёмщик. &lt;br /&gt;
* '''Задачи медицинской диагностики''' &amp;lt;br/&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;
* классифицировать вид заболевания (дифференциальная диагностика);&lt;br /&gt;
* определять наиболее целесообразный способ лечения;&lt;br /&gt;
* предсказывать длительность и исход заболевания;&lt;br /&gt;
* оценивать риск осложнений;&lt;br /&gt;
* находить наиболее характерные для данного заболевания совокупности симптомов. &lt;br /&gt;
&lt;br /&gt;
Ценность такого рода систем в том, что они способны мгновенно анализировать и обобщать огромное количество прецедентов — возможность, недоступная специалисту-врачу. &lt;br /&gt;
&lt;br /&gt;
* '''Задача классификации видов ириса (Фишер 1936)''' &amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%98%D1%80%D0%B8%D1%81%D1%8B_%D0%A4%D0%B8%D1%88%D0%B5%D1%80%D0%B0 Задача классификации видов ириса]&amp;lt;/ref&amp;gt; &amp;lt;ref&amp;gt;[http://edu.mmcs.sfedu.ru/pluginfile.php/17198/mod_resource/content/1/01%20%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5%20%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D1%8F.pdf Презентация &amp;quot;Основные понятия машинного обучения&amp;quot;]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt; &lt;br /&gt;
[[Файл:Iris_classification.png|650px]]&lt;br /&gt;
&lt;br /&gt;
== Открытые наборы данных для обучения ==&lt;br /&gt;
{{main|Известные наборы данных|l1=Известные наборы данных&amp;lt;sup&amp;gt;[на 28.01.2019 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
==== Компьютерное зрение ====&lt;br /&gt;
*  [https://pjreddie.com/projects/mnist-in-csv/ MNIST]: один из самых востребованных наборов для проверки работоспособности. Есть датасеты 25x25, отцентрованные, рукописные чёрно-былые цифры;&lt;br /&gt;
*  [https://www.cs.toronto.edu/~kriz/cifar.html CIFAR10 &amp;amp; CIFAR100]: цветные изображения 32x32. Сегодня используется нечасто, но может быть хорошим вариантов для проверки работоспособности;&lt;br /&gt;
*  [http://image-net.org/ ImageNet]: датасет изображений для проверки новых алгоритмов.&lt;br /&gt;
&lt;br /&gt;
==== Естественные языки ====&lt;br /&gt;
* [https://blog.einstein.ai/the-wikitext-long-term-dependency-language-modeling-dataset/ WikiText]: большой свод данных для языкового моделирования из статей Википедии, собранный Salesforce MetaMind.&lt;br /&gt;
==== Речь ====&lt;br /&gt;
*  [http://www.openslr.org/12/ LibriSpeech]: около 500 часов начитки аудиокниг, в исполнении разных людей. Данные организованы по главам книг, содержат текст и записи.&lt;br /&gt;
==== Системы рекомендаций и ранжирования ====&lt;br /&gt;
* [https://www.kaggle.com/c/msdchallenge Million Song Dataset]: большой open source-датасет [https://www.kaggle.com/ Kaggle], насыщенный метаданными. Хороший вариант для тех, кто экспериментирует с гибридными системами рекомендаций.&lt;br /&gt;
==== Сети и графы ====&lt;br /&gt;
* [http://snap.stanford.edu/data/#amazon Amazon Co-Purchasing] и [http://snap.stanford.edu/data/amazon-meta.html Amazon Reviews]: данные, собранные из раздела «Пользователи, купившие это, также выбирают…» на Amazon, а также обзоры сопутствующих товаров. Хорош для экспериментов рекомендательными системами в соцсетях.&lt;br /&gt;
==== Геопространственные данные ====&lt;br /&gt;
* [http://wiki.openstreetmap.org/wiki/Planet.osm OpenStreetMap]: векторные картографические данные для всей планеты, с бесплатной лицензией. Включает в себя старую версию данных TIGER Бюро переписи США.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Переобучение]]&lt;br /&gt;
* [[Модель алгоритма и ее выбор]]&lt;br /&gt;
* [[Оценка качества в задаче кластеризации]]&lt;br /&gt;
* [[Кросс-валидация]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Machine_learning Машинное обучение] {{---}} Wiki&lt;br /&gt;
#[http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%28%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9A.%D0%92.%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2%29 Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
#[https://newtonew.com/tech/machine-learning-novice Статья &amp;quot;Машинное обучение для чайников&amp;quot;]&lt;br /&gt;
#[https://golos.io/ru--programmirovanie/@randall/kak-ii-nauchit-vsemu-luchshie-otkrytye-nabory-dannykh-dlya-obucheniya Статья &amp;quot;Лучшие наборы данных для обучения&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68754</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68754"/>
				<updated>2019-01-21T22:06:38Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обучение с подкреплением == &lt;br /&gt;
&lt;br /&gt;
В обучении с подкреплением существует агент (''agent'') взаимодействует с окружающей средой (''environment''), предпринимая действия (''actions''). Окружающая среда дает награду (''reward'') за эти действия, а агент продолжает их предпринимать.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти стратегию, приписывающую состояниям (''states'') окружающей среды действия, одно из которых может выбрать агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit о многоруком бандите].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения (''states'')  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий (''actions'') &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot; (''rewards'')&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|link=https://econophysica.ru/services/machine-learning/|Взаимодействие агента со средой]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите (''The multi-armed bandit problem'') == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|link=http://toppromotion.ru/blog/seo-category/novyij-algoritm-pod-nazvaniem-%C2%ABmnogorukij-bandit%C2%BB.html|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
=== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии (''greedy &amp;amp; &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy'') === &lt;br /&gt;
&lt;br /&gt;
==== Жадная (''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
=== Стратегия Softmax === &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
=== Метод UCB (''upper confidence bound'') === &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; {{---}} функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; {{---}} функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; {{---}} learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; {{---}} discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q is not converged:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s is not terminated:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[https://login.cs.utexas.edu/sites/default/files/legacy_files/research/documents/1%20intro%20up%20to%20RL%3ATD.pdf Sutton, Richard S., and Andrew G. Barto. Introduction to reinforcement learning. Vol. 135. Cambridge: MIT press, 1998.]&lt;br /&gt;
*[https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf Sutton R. S., Barto A. G. Reinforcement learning: An introduction. – 2011.]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68752</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68752"/>
				<updated>2019-01-21T22:03:24Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обучение с подкреплением == &lt;br /&gt;
&lt;br /&gt;
В обучении с подкреплением существует агент (''agent'') взаимодействует с окружающей средой (''environment''), предпринимая действия (''actions''). Окружающая среда дает награду (''reward'') за эти действия, а агент продолжает их предпринимать.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти стратегию, приписывающую состояниям (''states'') окружающей среды действия, одно из которых может выбрать агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit о многоруком бандите].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения (''states'')  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий (''actions'') &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot; (''rewards'')&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|link=https://econophysica.ru/services/machine-learning/|Взаимодействие агента со средой]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите (''The multi-armed bandit problem'') == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|link=http://toppromotion.ru/blog/seo-category/novyij-algoritm-pod-nazvaniem-%C2%ABmnogorukij-bandit%C2%BB.html|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
=== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии (''greedy &amp;amp; &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy'') === &lt;br /&gt;
&lt;br /&gt;
==== Жадная (''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
=== Стратегия Softmax === &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
=== Метод UCB (''upper confidence bound'') === &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[https://login.cs.utexas.edu/sites/default/files/legacy_files/research/documents/1%20intro%20up%20to%20RL%3ATD.pdf Sutton, Richard S., and Andrew G. Barto. Introduction to reinforcement learning. Vol. 135. Cambridge: MIT press, 1998.]&lt;br /&gt;
*[https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf Sutton R. S., Barto A. G. Reinforcement learning: An introduction. – 2011.]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:RL.png&amp;diff=68751</id>
		<title>Файл:RL.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:RL.png&amp;diff=68751"/>
				<updated>2019-01-21T22:01:24Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: Dariyakovleva загрузил новую версию Файл:RL.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68750</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68750"/>
				<updated>2019-01-21T21:56:04Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обучение с подкреплением == &lt;br /&gt;
&lt;br /&gt;
В обучении с подкреплением существует агент (''agent'') взаимодействует с окружающей средой (''environment''), предпринимая действия (''actions''). Окружающая среда дает награду (''reward'') за эти действия, а агент продолжает их предпринимать.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти стратегию, приписывающую состояниям (''states'') окружающей среды действия, одно из которых может выбрать агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit о многоруком бандите].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения (''states'')  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий (''actions'') &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot; (''rewards'')&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|link=https://skymind.ai/wiki/deep-reinforcement-learning|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите (''The multi-armed bandit problem'') == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|link=http://toppromotion.ru/blog/seo-category/novyij-algoritm-pod-nazvaniem-%C2%ABmnogorukij-bandit%C2%BB.html|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
=== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии (''greedy &amp;amp; &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy'') === &lt;br /&gt;
&lt;br /&gt;
==== Жадная (''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
=== Стратегия Softmax === &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
=== Метод UCB (''upper confidence bound'') === &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[https://login.cs.utexas.edu/sites/default/files/legacy_files/research/documents/1%20intro%20up%20to%20RL%3ATD.pdf Sutton, Richard S., and Andrew G. Barto. Introduction to reinforcement learning. Vol. 135. Cambridge: MIT press, 1998.]&lt;br /&gt;
*[https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf Sutton R. S., Barto A. G. Reinforcement learning: An introduction. – 2011.]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68749</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68749"/>
				<updated>2019-01-21T21:55:38Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обучение с подкреплением == &lt;br /&gt;
&lt;br /&gt;
В обучении с подкреплением существует агент (''agent'') взаимодействует с окружающей средой (''environment''), предпринимая действия (''actions''). Окружающая среда дает награду (''reward'') за эти действия, а агент продолжает их предпринимать.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти стратегию, приписывающую состояниям (''states'') окружающей среды действия, одно из которых может агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit о многоруком бандите].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения (''states'')  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий (''actions'') &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot; (''rewards'')&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|link=https://skymind.ai/wiki/deep-reinforcement-learning|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите (''The multi-armed bandit problem'') == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|link=http://toppromotion.ru/blog/seo-category/novyij-algoritm-pod-nazvaniem-%C2%ABmnogorukij-bandit%C2%BB.html|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
=== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии (''greedy &amp;amp; &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy'') === &lt;br /&gt;
&lt;br /&gt;
==== Жадная (''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
=== Стратегия Softmax === &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
=== Метод UCB (''upper confidence bound'') === &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[https://login.cs.utexas.edu/sites/default/files/legacy_files/research/documents/1%20intro%20up%20to%20RL%3ATD.pdf Sutton, Richard S., and Andrew G. Barto. Introduction to reinforcement learning. Vol. 135. Cambridge: MIT press, 1998.]&lt;br /&gt;
*[https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf Sutton R. S., Barto A. G. Reinforcement learning: An introduction. – 2011.]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68743</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68743"/>
				<updated>2019-01-21T21:12:43Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обучение с подкреплением == &lt;br /&gt;
&lt;br /&gt;
В обучении с подкреплением существует агент (''agent'') взаимодействует с окружающей средой (''environment''), предпринимая действия (''actions''). Окружающая среда дает награду (''reward'') за эти действия, а агент продолжает их предпринимать.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти стратегию, приписывающую состояниям (''states'') окружающей среды действия, которые должен предпринять агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения (''states'')  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий (''actions'') &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot; (''rewards'')&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|link=https://skymind.ai/wiki/deep-reinforcement-learning|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите (''The multi-armed bandit problem'') == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|link=http://toppromotion.ru/blog/seo-category/novyij-algoritm-pod-nazvaniem-%C2%ABmnogorukij-bandit%C2%BB.html|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
=== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии (''greedy &amp;amp; &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy'') === &lt;br /&gt;
&lt;br /&gt;
==== Жадная (''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
=== Стратегия Softmax === &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
=== Метод UCB (''upper confidence bound'') === &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[https://login.cs.utexas.edu/sites/default/files/legacy_files/research/documents/1%20intro%20up%20to%20RL%3ATD.pdf Sutton, Richard S., and Andrew G. Barto. Introduction to reinforcement learning. Vol. 135. Cambridge: MIT press, 1998.]&lt;br /&gt;
*[https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf Sutton R. S., Barto A. G. Reinforcement learning: An introduction. – 2011.]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68742</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68742"/>
				<updated>2019-01-21T21:11:00Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обучение с подкреплением == &lt;br /&gt;
&lt;br /&gt;
В обучении с подкреплением существует агент (''agent'') взаимодействует с окружающей средой (''environment'')), предпринимая действия (''actions''). Окружающая среда дает награду (''reward'') за эти действия, а агент продолжает их предпринимать.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти ''стратегию'', приписывающую ''состояниям'' (''states'')) окружающей среды действия, которые должен предпринять агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (англ. ''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения (''states'')  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий (''actions'') &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot; (''rewards'')&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|link=https://skymind.ai/wiki/deep-reinforcement-learning|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите (''The multi-armed bandit problem'') == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|link=http://toppromotion.ru/blog/seo-category/novyij-algoritm-pod-nazvaniem-%C2%ABmnogorukij-bandit%C2%BB.html|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
=== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии (''greedy &amp;amp; &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy'') === &lt;br /&gt;
&lt;br /&gt;
==== Жадная (''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
=== Стратегия Softmax === &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
=== Метод UCB (''upper confidence bound'') === &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[https://login.cs.utexas.edu/sites/default/files/legacy_files/research/documents/1%20intro%20up%20to%20RL%3ATD.pdf Sutton, Richard S., and Andrew G. Barto. Introduction to reinforcement learning. Vol. 135. Cambridge: MIT press, 1998.]&lt;br /&gt;
*[https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf Sutton R. S., Barto A. G. Reinforcement learning: An introduction. – 2011.]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68741</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68741"/>
				<updated>2019-01-21T21:10:30Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обучение с подкреплением == &lt;br /&gt;
&lt;br /&gt;
В обучении с подкреплением существует агент (''agent'') взаимодействует с окружающей средой (''environment'')), предпринимая действия (''actions''). Окружающая среда дает награду (''reward'') за эти действия, а агент продолжает их предпринимать.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти ''стратегию'', приписывающую ''состояниям'' (''states'')) окружающей среды действия, которые должен предпринять агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (англ. ''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения (''states'')  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий (''actions'') &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot; (''rewards'')&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|link=https://skymind.ai/wiki/deep-reinforcement-learning|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите (''The multi-armed bandit problem'') == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|link=http://toppromotion.ru/blog/seo-category/novyij-algoritm-pod-nazvaniem-%C2%ABmnogorukij-bandit%C2%BB.html|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
=== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии (''''greedy &amp;amp; &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy) === &lt;br /&gt;
&lt;br /&gt;
==== Жадная (''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-''greedy'') стратегия ====&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
=== Стратегия Softmax === &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
=== Метод UCB (''upper confidence bound'') === &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[https://login.cs.utexas.edu/sites/default/files/legacy_files/research/documents/1%20intro%20up%20to%20RL%3ATD.pdf Sutton, Richard S., and Andrew G. Barto. Introduction to reinforcement learning. Vol. 135. Cambridge: MIT press, 1998.]&lt;br /&gt;
*[https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf Sutton R. S., Barto A. G. Reinforcement learning: An introduction. – 2011.]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68740</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68740"/>
				<updated>2019-01-21T20:59:45Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&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;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (англ. ''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|link=https://skymind.ai/wiki/deep-reinforcement-learning|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями].&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|link=http://toppromotion.ru/blog/seo-category/novyij-algoritm-pod-nazvaniem-%C2%ABmnogorukij-bandit%C2%BB.html|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
=== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии === &lt;br /&gt;
&lt;br /&gt;
==== Жадная (greedy) стратегия ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy) стратегия ====&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
=== Стратегия Softmax === &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
=== Метод UCB (upper confidence bound) === &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68738</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68738"/>
				<updated>2019-01-21T20:52:36Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&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;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (англ. ''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями].&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии == &lt;br /&gt;
&lt;br /&gt;
=== Жадная (greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
== Стратегия Softmax == &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
== Метод UCB (upper confidence bound) == &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68737</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68737"/>
				<updated>2019-01-21T20:50:57Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Обучение с подкреплением''' (англ. ''reinforcement learning'') {{---}} способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.&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;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (англ. ''exploration vs exploitation'').&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 1&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma \in (0, 1)&amp;lt;/tex&amp;gt; {{---}} усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; \in (0, 1)&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями].&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий'' (ручек автомата)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие (ручку) &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; {{---}} средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; {{---}} ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; ручек автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.&lt;br /&gt;
&lt;br /&gt;
== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии == &lt;br /&gt;
&lt;br /&gt;
=== Жадная (greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
== Стратегия Softmax == &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
== Метод UCB (upper confidence bound) == &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68360</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68360"/>
				<updated>2019-01-13T21:59:08Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Обучение с подкреплением == &lt;br /&gt;
'''Обучение с подкреплением''' {{---}} подраздел [[машинное обучение|машинного обучения]], изучающий как ''агент'' должен ''действовать'' в ''среде'', чтобы максимизировать некоторый долговременный ''выигрыш''.&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти ''стратегию'', приписывающую ''состояниям'' окружающей среды действия, которые должен предпринять агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний.&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 0&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; 0&amp;lt;/tex&amp;gt; — усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; 0&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями].&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; — средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; — ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; рук автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation'' (применение, эксплуатация) и ''exploration'' (изучение, исследование).&lt;br /&gt;
&lt;br /&gt;
== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии == &lt;br /&gt;
&lt;br /&gt;
=== Жадная (greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выбирем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
== Стратегия Softmax == &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (режим исследования).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (режим эксплуатации).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
== Метод UCB (upper confidence bound) == &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68359</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68359"/>
				<updated>2019-01-13T21:54:51Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Обучение с подкреплением == &lt;br /&gt;
'''Обучение с подкреплением''' {{---}} подраздел [[машинное обучение|машинного обучения]], изучающий как ''агент'' должен ''действовать'' в ''среде'', чтобы максимизировать некоторый долговременный ''выигрыш''.&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти ''стратегию'', приписывающую ''состояниям'' окружающей среды действия, которые должен предпринять агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний.&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 0&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; 0&amp;lt;/tex&amp;gt; — усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; 0&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями].&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; — средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; — ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; рук автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a) \forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO пока очень тупо&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation'' (применение, эксплуатация) и ''exploration'' (изучение, исследование).&lt;br /&gt;
&lt;br /&gt;
== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии == &lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=== Жадная (greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выбирем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
== Стратегия Softmax == &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (режим исследования).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (режим эксплуатации).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
== Метод UCB (upper confidence bound) == &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68358</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68358"/>
				<updated>2019-01-13T21:53:34Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Обучение с подкреплением == &lt;br /&gt;
'''Обучение с подкреплением''' {{---}} подраздел [[машинное обучение|машинного обучения]], изучающий как ''агент'' должен ''действовать'' в ''среде'', чтобы максимизировать некоторый долговременный ''выигрыш''.&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти ''стратегию'', приписывающую ''состояниям'' окружающей среды действия, которые должен предпринять агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний.&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 0&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; 0&amp;lt;/tex&amp;gt; — усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; 0&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями].&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; — средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; — ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; рук автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a) \forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO пока очень тупо&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation'' (применение, эксплуатация) и ''exploration'' (изучение, исследование).&lt;br /&gt;
&lt;br /&gt;
== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии == &lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=== Жадная (greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax\limits_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выбирем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
== Стратегия Softmax == &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (режим исследования).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (режим эксплуатации).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
== Метод UCB (upper confidence bound) == &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68357</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68357"/>
				<updated>2019-01-13T21:46:55Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Обучение с подкреплением == &lt;br /&gt;
'''Обучение с подкреплением''' {{---}} подраздел [[машинное обучение|машинного обучения]], изучающий как ''агент'' должен ''действовать'' в ''среде'', чтобы максимизировать некоторый долговременный ''выигрыш''.&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти ''стратегию'', приписывающую ''состояниям'' окружающей среды действия, которые должен предпринять агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний.&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 0&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; 0&amp;lt;/tex&amp;gt; — усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; 0&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями].&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; — средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; — ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; рук автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a) \forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO пока очень тупо&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation'' (применение, эксплуатация) и ''exploration'' (изучение, исследование).&lt;br /&gt;
&lt;br /&gt;
== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии == &lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=== Жадная (greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax \limits_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выбирем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
== Стратегия Softmax == &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (режим исследования).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (режим эксплуатации).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
== Метод UCB (upper confidence bound) == &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68356</id>
		<title>Обучение с подкреплением</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=68356"/>
				<updated>2019-01-13T21:45:08Z</updated>
		
		<summary type="html">&lt;p&gt;Dariyakovleva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Обучение с подкреплением == &lt;br /&gt;
'''Обучение с подкреплением''' {{---}} подраздел [[машинное обучение|машинного обучения]], изучающий как ''агент'' должен ''действовать'' в ''среде'', чтобы максимизировать некоторый долговременный ''выигрыш''.&lt;br /&gt;
Алгоритмы с частичным обучением пытаются найти ''стратегию'', приписывающую ''состояниям'' окружающей среды действия, которые должен предпринять агент в этих состояниях.&lt;br /&gt;
&lt;br /&gt;
Среда обычно формулируется как [http://en.wikipedia.org/wiki/Markov_decision_process марковский процесс принятия решений] (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием.&lt;br /&gt;
Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.&lt;br /&gt;
&lt;br /&gt;
При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары &amp;quot;входные данные-ответ&amp;quot;, а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно.&lt;br /&gt;
Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний.&lt;br /&gt;
Баланс изучения-применения при обучении с подкреплением исследуется в задаче [http://en.wikipedia.org/wiki/Multi-armed_bandit многорукого бандита].&lt;br /&gt;
&lt;br /&gt;
Формально простейшая модель обучения с подкреплением состоит из:&lt;br /&gt;
* множества состояний окружения  &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества действий &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;&lt;br /&gt;
* множества вещественнозначных скалярных &amp;quot;выигрышей&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В произвольный момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент характеризуется состоянием &amp;lt;tex&amp;gt;s_t \in S&amp;lt;/tex&amp;gt; и множеством возможных действий &amp;lt;tex&amp;gt;A(s_t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Выбирая действие &amp;lt;tex&amp;gt;a \in A(s_t)&amp;lt;/tex&amp;gt;, он переходит в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt; и получает выигрыш &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию &amp;lt;tex&amp;gt;\pi: S \to A&amp;lt;/tex&amp;gt;, которая максимизирует величину &amp;lt;tex&amp;gt;R=r_0 + r_1+\cdots+r_n&amp;lt;/tex&amp;gt; в случае МППР, имеющего терминальное состояние, или величину:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;R=\sum_t \gamma^t r_t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для МППР без терминальных состояний (где &amp;lt;tex&amp;gt;0 \leq \gamma \leq 1&amp;lt;/tex&amp;gt; {{---}} дисконтирующий множитель для &amp;quot;предстоящего выигрыша&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи обучения с подкреплением ===&lt;br /&gt;
&lt;br /&gt;
[[File:RL.png|thumb|RL-схема]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} множество состояний среды&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a | s)&amp;lt;/tex&amp;gt; и состояния среды &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a | s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_{t + 1} ∼ p(r | a_t, s_t)&amp;lt;/tex&amp;gt; и новое состояние &amp;lt;tex&amp;gt;s_{t + 1} ∼ p(s | a_t, s_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t + 1}(a | s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это марковский процесс принятия решений (МППР), если &lt;br /&gt;
&amp;lt;tex&amp;gt;P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
МППР называется финитным, если &amp;lt;tex&amp;gt;|A| &amp;lt; \infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|S| &amp;lt; \infty&amp;lt;/tex&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;
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.&lt;br /&gt;
Вторая проблема возникает, если выигрыши стохастические — чтобы точно оценить выигрыш от каждой стратегии потребуется многократно применить каждую из них.&lt;br /&gt;
Этих проблем можно избежать, если допустить некоторую структуризацию и, возможно, позволить результатам, полученным от пробы одной стратегии, влиять на оценку для другой.&lt;br /&gt;
Двумя основными подходами для реализации этих идей являются оценка функций полезности и прямая оптимизация стратегий.&lt;br /&gt;
&lt;br /&gt;
Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; (либо текущей, либо оптимальной).&lt;br /&gt;
При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, при дальнейшем следовании стратегии &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;V(s) = E[R|s, \pi]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо ожидаемый выигрыш, при принятии решения &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в состоянии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и дальнейшем соблюдении &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = E[R|s, \pi, a]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если для выбора оптимальной стратегии используется функция полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.&lt;br /&gt;
&lt;br /&gt;
Если же мы пользуемся функцией &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, необходимо либо иметь модель окружения в виде вероятностей &amp;lt;tex&amp;gt;P(s'|s, a)&amp;lt;/tex&amp;gt;, что позволяет построить функцию полезности вида&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;Q(s, a) = \sum_{s'}V(s')P(s'|s, a)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и исполнитель, выбирающий подходящее действие в каждом состоянии.&lt;br /&gt;
&lt;br /&gt;
Имея фиксированную стратегию &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, оценить &amp;lt;tex&amp;gt;E[R|\cdot]&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\gamma = 0&amp;lt;/tex&amp;gt; можно просто усреднив непосредственные выигрыши.&lt;br /&gt;
Наиболее очевидный способ оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; 0&amp;lt;/tex&amp;gt; — усреднить суммарный выигрыш после каждого состояния.&lt;br /&gt;
Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).&lt;br /&gt;
&lt;br /&gt;
Поэтому построение искомой оценки при &amp;lt;tex&amp;gt;\gamma &amp;gt; 0&amp;lt;/tex&amp;gt; неочевидно. Однако, можно заметить, что &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; образуют рекурсивное уравнение Беллмана:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;E[R|s_t]=r_t + \gamma E[R|s_{t+1}]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подставляя имеющиеся оценки, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями].&lt;br /&gt;
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.&lt;br /&gt;
&lt;br /&gt;
Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), [http://en.wikipedia.org/wiki/SARSA SARSA] и Q-обучение ([http://en.wikipedia.org/wiki/Q-Learning Q-learning]).&lt;br /&gt;
&lt;br /&gt;
== Задача о многоруком бандите == &lt;br /&gt;
&lt;br /&gt;
[[File:bandit.jpg|thumb|Многорукий бандит]]&lt;br /&gt;
&lt;br /&gt;
=== Формулировка ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} множество возможных ''действий''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p_a(r)&amp;lt;/tex&amp;gt; {{---}} неизвестное распределение ''награды'' &amp;lt;tex&amp;gt;r \in R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_t(a)&amp;lt;/tex&amp;gt; {{---}} ''стратегия'' агента в момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in A&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Игра агента со средой:&lt;br /&gt;
* инициализация стратегии &amp;lt;tex&amp;gt;\pi_1(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* для всех &amp;lt;tex&amp;gt;t = 1 \ldots T&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент выбирает действие &amp;lt;tex&amp;gt;a_t ∼ \pi_t(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** среда генерирует награду &amp;lt;tex&amp;gt;r_t ∼ p_{a_t}(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
** агент корректирует стратегию &amp;lt;tex&amp;gt;\pi_{t+1}(a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max &amp;lt;/tex&amp;gt; — средняя награда в &amp;lt;i&amp;gt;t&amp;lt;/i&amp;gt; играх &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max &amp;lt;/tex&amp;gt; — ценность действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть автомат {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;-рукий бандит, на каждом шаге мы выбираем за какую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; рук автомата дернуть,&lt;br /&gt;
т.е. множество действий &amp;lt;tex&amp;gt;A = {1,2 \ldots ,N}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; влечет награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt; при этом &amp;lt;tex&amp;gt;R(a) \forall a \in A&amp;lt;/tex&amp;gt; есть случайная величина, распределение которой неизвестно.&lt;br /&gt;
 &lt;br /&gt;
Состояние среды у нас от шага к шагу не меняется, а значит множество состояний &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; тривиально, ни на что не влияет, поэтому его можно проигнорировать.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины &amp;lt;tex&amp;gt;\xi&amp;lt;/tex&amp;gt; c неизвестным распределением. Для &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; экспериментов &amp;lt;tex&amp;gt;\xi_k&amp;lt;/tex&amp;gt;, оценка математического ожидания это среднее арифметическое результатов экспериментов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO пока очень тупо&lt;br /&gt;
&lt;br /&gt;
Задача является модельной для понимания конфликта между ''exploitation'' (применение, эксплуатация) и ''exploration'' (изучение, исследование).&lt;br /&gt;
&lt;br /&gt;
== Жадные и &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадные стратегии == &lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=== Жадная (greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;P_a = 0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\} &amp;lt;/tex&amp;gt; {{---}} сколько раз было выбрано действие &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q_a = 0&amp;lt;/tex&amp;lt; &amp;lt;tex&amp;gt;\forall a \in \{1 \ldots N\}&amp;lt;/tex&amp;gt; {{---}} текущая оценка математического ожидания награды для действия &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Выбираем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_t = argmax \limits_{a \in A} Q_a &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Выполняем действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt; и получаем награду &amp;lt;tex&amp;gt;R(a_t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Обновляем оценку математического ожидания для действия &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;P_{a_t} = P_{a_t} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В чем проблема?&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;quot;двурукий&amp;quot; бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до &amp;lt;tex&amp;gt;Q_1 = 1&amp;lt;/tex&amp;gt;. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.&lt;br /&gt;
&lt;br /&gt;
В данном случае достаточно попробовать в начале каждую из ручек вместо того, чтобы фокусироваться только на одной.&lt;br /&gt;
Но если награда случайная величина, то единичной попытки будет не достаточно. Поэтому модифицируем жадную стратегию следующим образом:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-жадная (&amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-greedy) стратегия ===&lt;br /&gt;
&lt;br /&gt;
[[File:Eps-greedy.png|thumb|313px|Пример. Награда для стратегии с различными &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Введем параметр &amp;lt;tex&amp;gt;\epsilon \in (0,1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждом шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Получим значение &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} случайной величины равномерно распределенной на отрезке &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;\alpha \in (0, \epsilon)&amp;lt;/tex&amp;gt;, то выберем действие &amp;lt;tex&amp;gt;a_t \in A&amp;lt;/tex&amp;gt; случайно и равновероятно, иначе как в жадной стратегии выбирем действие с максимальной оценкой математического ожидания:&lt;br /&gt;
* Обновляем оценки так же как в жадной стратегии&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\epsilon = 0&amp;lt;/tex&amp;gt;, то это обычная жадная стратегия. Однако если &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt;, то в отличии от жадной стратегии на каждом шаге с вероятностью &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; присходит &amp;quot;исследование&amp;quot; случайных действий.&lt;br /&gt;
&lt;br /&gt;
== Стратегия Softmax == &lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше &amp;lt;tex&amp;gt;Q_t(a)&amp;lt;/tex&amp;gt;, тем больше вероятность выбора &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\tau \in (0, \infty)&amp;lt;/tex&amp;gt; {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow \infty&amp;lt;/tex&amp;gt;  стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (режим исследования).&lt;br /&gt;
&lt;br /&gt;
При &amp;lt;tex&amp;gt;\tau \rightarrow 0&amp;lt;/tex&amp;gt; стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (режим эксплуатации).&lt;br /&gt;
&lt;br /&gt;
Экспонента используется для того, чтобы данный вес был ненулевым даже у действий, награда от которых пока нулевая.&lt;br /&gt;
&lt;br /&gt;
Эвристика: параметр &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; имеет смысл уменьшать со временем.&lt;br /&gt;
&lt;br /&gt;
== Метод UCB (upper confidence bound) == &lt;br /&gt;
&lt;br /&gt;
Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.&lt;br /&gt;
&lt;br /&gt;
Алгоритм верхнего доверительного интервала (''upper confidence bound'' или UCB) {{---}} семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.&lt;br /&gt;
&lt;br /&gt;
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{t+1}(a) = Q_t(a) + b_a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} &amp;lt;/tex&amp;gt; {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
Доказательство [http://banditalgs.com/2016/09/18/the-upper-confidence-bound-algorithm здесь]&lt;br /&gt;
&lt;br /&gt;
В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.&lt;br /&gt;
&lt;br /&gt;
Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.&lt;br /&gt;
&lt;br /&gt;
== Q-learning == &lt;br /&gt;
&lt;br /&gt;
На основе получаемого от среды вознаграждения агент формирует функцию полезности &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;-обучения {{---}} то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм это функция качества от состояния и действия:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q: S \times A \to \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед обучением &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; инициализируется случайными значениями. После этого в каждый момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; агент выбирает действие &amp;lt;tex&amp;gt;a_t&amp;lt;/tex&amp;gt;, получает награду &amp;lt;tex&amp;gt;r_t&amp;lt;/tex&amp;gt;, переходит в новое состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, которое может зависеть от предыдущего состояния &amp;lt;tex&amp;gt;s_t&amp;lt;/tex&amp;gt; и выбранного действия, и обновляет функцию &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;. Обновление функции использует взвешенное среднее между старым и новым значениями:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot  \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''&amp;lt;tex&amp;gt;r_{t}&amp;lt;/tex&amp;gt;'' это награда, полученная при переходе из состояния &amp;lt;tex&amp;gt;s_{t}&amp;lt;/tex&amp;gt; в состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; это скорость обучения (&amp;lt;tex&amp;gt;0 &amp;lt; \alpha \le 1&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Алгоритм заканчивается, когда агент переходит в терминальное состояние &amp;lt;tex&amp;gt;s_{t+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Aлгоритм Q-learning ===&lt;br /&gt;
&lt;br /&gt;
[[File:Q-Learning.png|thumb|313px|Процесс Q-обучения]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — множество состояний&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; — множество действий&lt;br /&gt;
* &amp;lt;tex&amp;gt;R = S \times A \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt; — функция награды&lt;br /&gt;
* &amp;lt;tex&amp;gt;T = S \times A \rightarrow S&amp;lt;/tex&amp;gt; — функция перехода&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha \in [0, 1]&amp;lt;/tex&amp;gt; — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gamma \in [0, 1]&amp;lt;/tex&amp;gt; — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий&lt;br /&gt;
&lt;br /&gt;
 '''fun''' Q-learning(&amp;lt;tex&amp;gt;S, A, R, T, \alpha, \gamma&amp;lt;/tex&amp;gt;):&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt; s \in S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
        '''for''' &amp;lt;tex&amp;gt; a \in A&amp;lt;/tex&amp;gt;:&lt;br /&gt;
             Q(s, a) = rand()&lt;br /&gt;
    '''while''' Q не сошелся:&lt;br /&gt;
        s = &amp;lt;tex&amp;gt; \forall s \in S&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''while''' s не конечное состояние:&lt;br /&gt;
           &amp;lt;tex&amp;gt;\pi(s) = argmax_{a}{Q(s, a)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
           a = &amp;lt;tex&amp;gt;\pi(s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
           r = R(s, a)&lt;br /&gt;
           s' = T(s, a)&lt;br /&gt;
           &amp;lt;tex&amp;gt;Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma * \max\limits_{a'}{Q(s', a')})&amp;lt;/tex&amp;gt;&lt;br /&gt;
           s = s'&lt;br /&gt;
    return Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Reinforcement_learning Wikipedia: Reinforcement learning]&lt;br /&gt;
*[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC Обучение с подкреплением]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Multi-armed_bandit Многорукий бандит]&lt;br /&gt;
* [https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html Задача о многоруком бандите]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/archive/3/35/20121120213057%21Voron-ML-RL-slides.pdf Обучение с подкреплением (Reinforcement Learning) К.В.Воронцов]&lt;br /&gt;
* [https://pryazhnikov.com/ru/bandit-algorithms-for-website-optimization/ Обзор книги «Bandit Algorithms for Website Optimization»]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]&lt;br /&gt;
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]&lt;/div&gt;</summary>
		<author><name>Dariyakovleva</name></author>	</entry>

	</feed>