Обратное распространение

редактировать
Алгоритм оптимизации для искусственных нейронных сетей

В машинном обучении, обратном распространении (backprop,BP) - широко используемый алгоритм в обучении нейронных сетей прямого распространения для контролируемого обучения. Обобщения обратного распространения существуют для искусственных нейронных сетей (ИНС) и других функций в целом. Все эти классы алгоритмов обычно называются «обратным распространением». В подгонке нейронной сети, обратное распространение вычисляет градиент функции потерь относительно весов сети для одного входа –Пример вывода, и делает это эффективно, в отличие от наивного прямого градиента по отношению к каждому весу индивидуально. Эта эффективность делает возможным использование градиентных методов для обучения многослойных сетей, обновления весов для минимизации потерь; Обычно используются градиентный спуск или варианты, такие как стохастический градиентный спуск. Алгоритм обратного распространения работает путем вычисления градиента функций потерь по отношению к каждому весу по правиламуочки , вычисляя градиент по одному слою за раз, повторяя назад от последнего уровня к повторных вычислений промежуточных членов в цепном правиле; это пример динамического программирования.

Термин обратное распространение строго относится только к алгоритму вычисления градиента, а не к тому, как градиент используется; однако этот термин часто используется в широком смысле слова алгоритма обучения, включая способ использования градиента, например, стохастический градиентный спуск. Обратное распространение вычисление градиента в правиле дельты, которое является однослойной версией обратного распространения, и, в свою очередь, обобщается с помощью автоматического дифференцирования, где обратное распространение является частным случаем обратное накопление (или «обратный режим»). Термин обратное распространение и его общее использование в нейронных сетях было объявлено в Rumelhart, Hinton Williams (1986a), разработано и популяризировано в Rumelhart, Hinton Williams (1986b), но техника была открыта заново много раз и имеет много предшественников, начиная с 1960-х годов; см. § История. Современный обзор дан в учебнике по глубокому обучению от Goodfellow, Bengio Courville (2016).

Содержание
  • 1 Обзор
  • 2 Умножение матриц
  • 3 Присоединенный граф
  • 4 Интуиция
    • 4.1 Мотивация
    • 4.2 Обучение как задача оптимизации
  • 5 Выведение
    • 5.1 Нахождение производной ошибки
  • 6 Функция потерь
    • 6.1 Допущения
    • 6.2 Пример потери функция
  • 7 Ограничения
  • 8 История
  • 9 См. также
  • 10 Примечания
  • 11 Ссылки
  • 12 Дополнительная литература
  • 13 Внешние ссылки
Обзор

Обратное распространение вычисляет градиент в весовом пространстве нейронной сети прямого распространения по отношению к функциям потерь . Обозначьте:

  • x {\ displaystyle x}x : вход (векторные характеристики)
  • y {\ displaystyle y}y : целевой выход
    для классификации, выходными данными будет вектор вероятностей классов (например, (0,1, 0,7, 0,2) {\ displaystyle (0,1,0.7,0.2)}{\ displaystyle (0.1,0.7,0.2)} , а целевым выходом будет конкретный класс, закодированный горячая / фиктивная переменная (например, (0, 1, 0) {\ displaystyle (0,1,0)}(0,1,0) ).
  • C {\ displaystyle C}C : функция потерь или «функция стоимости»
    Для классификации это обычно перекрестная энтропия (XC, логарифм потерь ), а для регрессии это обычно квадрат ошибки потери (SEL).
  • L {\ displaystyle L}L : количество слоев
  • W l = (wjkl) {\ displaystyle W ^ {l} = (w_ {jk} ^ {l})}{\ displaystyle W ^ {l} = (w_ {jk} ^ {l})} : между весом слоем l - 1 {\ displaystyle l-1}{\ displaystyle l-1} и l {\ displaystyle l}l , где wjkl {\ displaystyle w_ {jk} ^ {l}}{\ displaystyle w_ {jk} ^ {l}} - вес между k {\ disp laystyle k}k -й узел в слое l - 1 {\ displaystyle l-1}{\ displaystyle l-1} и j {\ displaystyle j}j - й узел в слое l {\ displaystyle l}l
  • fl {\ displaystyle f ^ {l}}{\ displaystyle f ^ {l}} : функции активации на уровне l {\ displaystyle l}l
    Для классификации последний обычно является логистическая функция для двоичной классификации и softmax (softargmax) для многоклассовой классификации, в то время как для скрытых слоев это традиционно была сигмоидальная функция (логистическая функция или другие) на каждом узле (координаты), но сегодня более разнообразен, с обычным выпрямителем (пандус, ReLU ).

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

Вся сеть представляет собой комбинацию композиции функций и умножения матриц :

g (x): = f L (WL f L - 1 (WL - 1 ⋯ f 1 ( W 1 Икс) ⋯)) {\ Displaystyle g (x): = f ^ {L} (W ^ {L} f ^ {L-1} (W ^ {L-1} \ cdots f ^ {1} ( W ^ {1} x) \ cdots))}{\ Displaystyle г (х): = е ^ {L} (W ^ {L} f ^ {L-1} (W ^ {L -1} \ cdots f ^ {1} (W ^ {1} x) \ cdots))}

Для обучающего набора будет набор пар ввода-вывода, {(xi, yi)} {\ displaystyle \ left \ {(x_ {i}, y_ { i}) \ right \}}{\ displaystyle \ left \ {(x_ {i }, y_ {i}) \ right \}} . Для каждой пары ввода-вывода (xi, yi) {\ displaystyle (x_ {i}, y_ {i})}(x_ {i}, y_ {i}) в обучающем наборе потеря модели в этой паре является стоимостью разницы между прогнозируемым выводом г (xi) {\ displaystyle g (x_ {i})}{\ displaystyle g (x_ {i})} и целевым выводом yi {\ displaystyle y_ {i}}y_ {i} :

C (yi, g (xi)) {\ displaystyle C (y_ {i}, g (x_ {i}))}{\ displaystyle C (y_ {i}, g (x_ {i}))}

Обратите внимание на различие: во время оценки модели веса фиксируются, а входные данные меняются (и конечный выход может быть неизвестен), и сеть заканчивается выходным слоем (он не включает функцию потерь). Во время обучения модели пара вход-выход фиксирована, веса меняются, и сеть функций потерь.

Обратное распространение вычисляет градиент для фиксированной пары вход-выход (xi, yi) {\ displaystyle (x_ {i}, y_ {i})}(x_ {i}, y_ {i}) , где вес wjkl {\ displaystyle w_ {jk} ^ {l}}{\ displaystyle w_ {jk} ^ {l}} может изменяться. Каждый отдельный компонент градиента, ∂ C / ∂ вес J К l, {\ displaystyle \ partial C / \ partial w_ {jk} ^ {l},}{\ displaystyle \ частичное C / \ частичное w_ {jk} ^ {l},} , может быть вычислен по цепочному правилу; однако делать это отдельно для каждого веса неэффективно. Обратное распространение вычисляет градиент, обратное сравнение вычислений и вычисляет ненужных промежуточных значений, вычисляя градиент каждого слоя - в частности, градиентного взвешивания каждого слоя, обозначаемый δ l {\ displaystyle \ delta ^ {l}}{\ displaystyle \ delta ^ {l}} - сзади наперед.

Неформально, ключевой момент заключается в том, что является единственным способом, которым используется вес в W l {\ displaystyle W ^ {l}}{\ displaystyle W ^ {l}} влияет на потерю, - это его влияние на следующие слои, и он делает это линейно, δ l {\ displaystyle \ delta ^ {l}}{\ displaystyle \ delta ^ {l}} - единственные данные, которые вам нужны для вычислений градиентов весов на слое l { \ displaystyle l}l , а затем вы можете вычислить предыдущий слой δ l - 1 {\ displaystyle \ delta ^ {l-1}}{\ displaystyle \ delta ^ {l-1}} и повторить рекурсивно. Это позволяет избежать неэффективности двумя способами. Во-первых, это позволяет избежать дублирования, потому что при вычислении градиента на слое l {\ displaystyle l}l вам не нужно повторно вычислять все производные на более поздних слоях l + 1, l + 2,… {\ Displaystyle l + 1, l + 2, \ ldots}{\ displaystyle l + 1, l + 2, \ ldots} каждый раз. Во-вторых, он позволяет избежать ненужных промежуточных вычислений, потому что на каждом этапе он вычисляет градиент весов относительно конечного результата (потерь), а не без необходимости вычисляет производные значения скрытых слоев относительно изменений весов ∂ aj ′ l ′ / ∂ wjkl {\ displaystyle \ partial a_ {j '} ^ {l'} / \ partial w_ {jk} ^ {l}}{\displaystyle \partial a_{j'}^{l'}/\partial w_{jk}^{l}}.

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

Матричное умножение

Для базового случая прямой сети, где узлы на каждом уровне подключены только к узлам в ближайшем следующем слое (без пропуска каких-либо слоев), и есть функция потерь, вычисляет скалярные потери для окончательного вывода, обратное распространение можно понять как просто умножение матриц. По сути, обратное распространение оценивает выражение для каждого слоя в обратном направлении - с градиентом весов между слоем, имеющимся простым модификацией частичных произведений («ошибка, распространяющаяся в обратном направлении»). 429>

Для пары вход-выход (x, y) {\ displaystyle (x, y)}(x, y) , потеря составляет:

C (y, f L (WL е L - 1 (WL - 1 ⋯ е 2 (W 2 f 1 (W 1 x)) ⋯))) {\ displaystyle C (y, f ^ {L} (W ^ {L} f ^ {L- 1} ( W ^ {L-1} \ cdots f ^ {2} (W ^ {2} f ^ {1} (W ^ {1} x)) \ cdots)))}{\ displaystyle C (y, f ^ {L} (W ^ {L} f ^ {L-1} (W ^ {L-1} \ cdots f ^ {2} (W ^ {2} f ^ {1} (W ^ {1 } x)) \ cdots)))}

Чтобы вычислить это, один начинается с ввода x {\ displaystyle x}x и идет вперед; обозначим взвешенный ввод каждого слоя как zl {\ displaystyle z ^ {l}}{\ displaystyle z ^ {l}} , а вывод слоя l {\ displaystyle l}l как активация аль {\ displaystyle a ^ {l}}{\ displaystyle a ^ {l}} ошибки. Для обратного распространения активация al {\ displaystyle a ^ {l}}{\ displaystyle a ^ {l}} , а также производные (fl) ′ {\ displaystyle (f ^ {l}) '}{\displaystyle (f^{l})'}(оценивается как zl {\ displaystyle z ^ {l}}{\ displaystyle z ^ {l}} ) должен быть кэширован для использования во время обратного прохода.

Производная цепная потеря по входам определяет правилаомочки; обратите внимание, что каждый член - это полная производная, вычисленная по значению сети (в каждом узле) на входе x {\ displaystyle x}x :

d C da L ⋅ da L dz L ⋅ dz L да L - 1 ⋅ da L - 1 dz L - 1 ⋅ dz L - 1 da L - 2 ⋯ da 1 dz 1 ⋅ ∂ z 1 ∂ x. {\ displaystyle {\ frac {dC} {da ^ {L}}} \ cdot {\ frac {da ^ {L}} {dz ^ {L}}} \ cdot {\ frac {dz ^ {L}} { da ^ {L-1}}} \ cdot {\ frac {da ^ {L-1}} {dz ^ {L-1}}} \ cdot {\ frac {dz ^ {L-1}} {da ^ {L-2}}} \ cdots {\ frac {da ^ {1}} {dz ^ {1}}} \ cdot {\ frac {\ partial z ^ {1}} {\ partial x}}.}{\ displaystyle {\ frac {dC} {da ^ { L}}} \ cdot {\ frac {da ^ {L}} {dz ^ {L}}} \ cdot {\ frac {dz ^ {L}} {da ^ {L-1}}} \ cdot {\ гидроразрыв {da ^ {L-1}} {dz ^ {L -1}}} \ cdot {\ гидроразрыв {dz ^ {L-1}} {da ^ {L-2}}} \ cdots {\ frac {da ^ {1}} {dz ^ {1}}} \ cdot {\ frac {\ partial z ^ {1}} {\ partial x}}.}

Этими членами: производственная функция потерь; производные функции активации; и матрицы весов:

d C da L ⋅ (f L) ′ ⋅ WL ⋅ (f L - 1) ′ ⋅ WL - 1 ⋯ (f 1) ′ ⋅ W 1. {\ displaystyle {\ frac {dC} {da ^ {L}}} \ cdot (f ^ {L}) '\ cdot W ^ {L} \ cdot (f ^ {L-1})' \ cdot W ^ {L-1} \ cdots (f ^ {1}) '\ cdot W ^ {1}.}{\displaystyle {\frac {dC}{da^{L}}}\cdot (f^{L})'\cdot W^{L}\cdot (f^{L-1})'\cdot W^{L-1}\cdots (f^{1})'\cdot W^{1}.}

Градиент ∇ {\ displaystyle \ nabla}\ nabla - это транспонировать производной вывода в терминах ввода, так что матрицы транспонируются и порядок умножения меняется на противоположный, но элементы остаются теми же:

∇ x C = (W 1) T ⋅ (f 1) ′ ⋯ ⋅ (WL - 1) T ⋅ (f L - 1) ′ ⋅ (WL) T ⋅ (f L) ′ ⋅ ∇ a LC. {\ displaystyle \ nabla _ {x} C = (W ^ {1}) ^ {T} \ cdot (f ^ {1}) '\ cdots \ cdot (W ^ {L-1}) ^ {T} \ cdot (f ^ {L-1}) '\ cdot (W ^ {L}) ^ {T} \ cdot (f ^ {L})' \ cdot \ nabla _ {a ^ {L}} C.}{\displaystyle \nabla _{x}C=(W^{1})^{T}\cdot (f^{1})'\cdots \cdot (W^{L-1})^{T}\cdot (f^{L-1})'\cdot (W^{L})^{T}\cdot (f^{L})'\cdot \nabla _{a^{L}}C.}

Обратное распространение в этом случае по существу, в оценке выражения этого справа налево (эквивалентно умножении выражения для производной направо слева), вычислении градиента на каждом слое на пути; есть дополнительный шаг, потому что градиент весов - это не просто подвыражение: есть дополнительное умножение.

Представляемую вспомогательную функцию δ l {\ displaystyle \ delta ^ {l}}{\ displaystyle \ delta ^ {l}} для частичных произведений (умножение справа налево), интерпретируемую как «ошибка на уровне l { \ displaystyle l}l "и определяет как градиент входных значений на уровне l {\ displaystyle l}l :

δ l: = (fl) ′ ⋅ (W l + 1) T ⋯ ⋅ ( WL - 1) T ⋅ (е L - 1) ′ ⋅ (WL) T ⋅ (f L) ′ ⋅ ∇ LC. {\ Displaystyle \ delta ^ {l}: = (е ^ {l}) '\ cdot (W ^ {l + 1}) ^ {T} \ cdots \ cdot (W ^ {L-1}) ^ {T} \ cdot (f ^ {L-1}) '\ cdot (W ^ {L}) ^ {T} \ cdot (f ^ {L}) '\ cdot \ nabla _ {a ^ {L}} C.}{\displaystyle \delta ^{l}:=(f^{l})'\cdot (W^{l+1})^{T}\cdots \cdot (W^{L-1})^{T}\cdot (f^{L-1})'\cdot (W^{L})^{T}\cdot (f^{L})'\cdot \nabla _{a^{L}}C.}

Обратите внимание, что δ l {\ displaystyle \ delta ^ {l }}{\ displaystyle \ delta ^ {l}} - это вектор, длина которого равна количеству узлов на уровне l {\ displaystyle l}l ; каждый термин интерпретируется как «стоимость, относящаяся к (значению) этого узла».

Градиент весов в слое l {\ displaystyle l}l тогда равенство:

∇ W l C = δ l (al - 1) T. {\ displaystyle \ набла _ {W ^ {l}} C = \ delta ^ {l} (a ^ {l-1}) ^ {T}.}{\ displaystyle \ nabla _ {W ^ {l}} C = \ delta ^ {l} (a ^ {l-1}) ^ {T}.}

Фактор al - 1 {\ displaystyle a ^ {l-1} }{\ displaystyle a ^ {l-1}} потому, что вес W l {\ displaystyle W ^ {l}}{\ displaystyle W ^ {l}} между уровнем l - 1 {\ displaystyle l-1}{\ displaystyle l-1} и l {\ displaystyle l}l влиять на уровень l {\ displaystyle l}l пропорционально входам (активам): входы фиксированные, вес меняются.

δ l {\ displaystyle \ delta ^ {l}}{\ displaystyle \ delta ^ {l}} может быть легко вычислено рекурсивно как:

δ l - 1: = (fl - 1) ′ ⋅ (W l) T ⋅ δ l. {\ displaystyle \ delta ^ {l-1}: = (f ^ {l-1}) '\ cdot (W ^ {l}) ^ {T} \ cdot \ delta ^ {l}.}{\displaystyle \delta ^{l-1}:=(f^{l-1})'\cdot (W^{l})^{T}\cdot \delta ^{l}.}

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

По сравнению с наивным расчетом вперед (с <использованием δ l {\ displaystyle \ delta ^ {l}}{\ displaystyle \ delta ^ {l}} для иллюстрации):

δ 1 = (f 1) ′ ⋅ (W 2) T ⋅ (f 2) ′ ⋯ ⋅ (WL - 1) T ⋅ (f L - 1) ′ ⋅ (WL) T ⋅ (f L) ′ ⋅ ∇ a LC δ 2 = (f 2) ′ ⋯ ⋅ (WL - 1) T ⋅ (f L - 1) ′ ⋅ (WL) T ⋅ (f L) ′ ⋅ ∇ a LC ⋮ δ L - 1 = (f L - 1) ′ ⋅ (WL) T ⋅ (е L) ′ ⋅ ∇ LC δ L = (е L) ′ ⋅ ∇ LC, {\ displaystyle {\ begin {align} \ delta ^ {1} = (f ^ {1}) '\ cdot ( W ^ {2}) ^ {T} \ cdot (f ^ {2}) '\ cdots \ cdot (W ^ {L-1}) ^ {T} \ cdot (f ^ {L-1})' \ cdot (W ^ {L}) ^ {T} \ cdot (f ^ {L}) '\ cdot \ nabla _ {a ^ {L}} C \\\ delta ^ {2} = (f ^ {2 }) '\ cdots \ cdot (W ^ {L-1}) ^ {T} \ cdot (f ^ {L-1})' \ cdot (W ^ {L}) ^ {T} \ cdot (f ^ {L}) '\ cdot \ nabla _ {a ^ {L}} C \\ \ vdots \\\ delta ^ {L-1} = (f ^ {L-1})' \ cdot (W ^ {L}) ^ {T} \ cdot (f ^ {L}) '\ cdot \ nabla _ {a ^ {L}} C \\\ delta ^ {L} = (f ^ {L})' \ cdot \ nabla _ {a ^ {L}} C, \ end {align}}}{\displaystyle {\begin{aligned}\delta ^{1}=(f^{1})'\cdot (W^{2})^{T}\cdot (f^{2})'\cdots \cdot (W^{L-1})^{T}\cdot (f^{L-1})'\cdot (W^{L})^{T}\cdot (f^{L})'\cdot \nabla _{a^{L}}C\\\delta ^{2}=(f^{2})'\cdots \cdot (W^{L-1})^{T}\cdot (f^{L-1})'\cdot (W^{L})^{T}\cdot (f^{L})'\cdot \nabla _{a^{L}}C\\\vdots \\\delta ^{L-1}=(f^{L-1})'\cdot (W^{L})^{T}\cdot (f^{L})'\cdot \nabla _{a^{L}}C\\\delta ^{L}=(f^{L})'\cdot \nabla _{a^{L}}C,\end{aligned}}}

есть два ключевых отличия от обратного распро странения:

  1. Вычисление δ l - 1 {\ displaystyle \ delta ^ {l-1}}{\ displaystyle \ delta ^ {l-1}} через δ l {\ displaystyle \ delta ^ {l}}{\ displaystyle \ delta ^ {l}} позволяет избежать очевидного дублирования слоев l {\ displaystyle l}l и выше.
  2. Умножение, начиная с ∇ a LC {\ displaystyle \ nabla _ {a ^ {L}} C}ошибки {\ displaystyle \ nabla _ {a ^ {L}} C} - распространение в обратном направлении - означает, что каждый шаг просто умножает вектор (δ l {\ displaystyle \ delta ^ {l}}{\ displaystyle \ delta ^ {l}} ) по матрицам весов (W l) T {\ displaystyle (W ^ {l}) ^ {T} }{\ displaystyle (W ^ {l}) ^ {T}} и производные от активаций (fl - 1) ′ {\ displaystyle (f ^ {l-1}) '}{\displaystyle (f^{l-1})'}. Напротив, умножение вперед, начиная с изменений на более раннем уровне, означает, что каждое умножение умножает матрицу на матрицу. Это намного дороже и соответствует отслеживанию всех путей изменений в одном слое l {\ displaystyle l}l вперед до изменений в слое l + 2 {\ displaystyle l +2}{\ displaystyle l + 2} (для умножения W l + 1 {\ displaystyle W ^ {l + 1}}{\ displaystyle W ^ {l + 1}} на W l + 2 {\ displaystyle W ^ {l + 2}}{\ displaystyle W ^ {l + 2}} , с дополнительными умножениями для производных активаций), который без необходимости вычисляет промежуточные величины того, как изменения веса на значения скрытых узлов.
Присоединенный граф

Для более общих графиков и других расширенных вариантов обратное распространение можно понять в терминах автоматического дифференцирования, где обратное распространение - это частный случай обратного накопления ( или «обратного режима»).

Интуиция

Мотивация

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

Обучение как задача оптимизации

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

Простая нейронная сеть с двумя входными блоками (каждый с одним входом) и одним выходным блоком (с двумя входами)

Первоначально, перед обучением, веса будут установлены случайным образом. Затем нейрон учится на обучающих примерах, в данном случае состоят из набора кортежей (x 1, x 2, t) {\ displaystyle (x_ {1}, x_ { 2}, t)}{\ displaystyle (x_ {1}, x_ {2}, t)} где x 1 {\ displaystyle x_ {1}}x_ {1} и x 2 {\ displaystyle x_ {2}}x_ {2} - это входы в сеть, а t - правильный выход (выход, который должна выдавать с этими входами, когда она была обучена). Исходная сеть, заданная x 1 {\ displaystyle x_ {1}}x_ {1} и x 2 {\ displaystyle x_ {2}}x_ {2} , вычислит выход y который, вероятно, отличается от t (с учетом случайных весов). функция потерь L (t, y) {\ displaystyle L (t, y)}{\ displaystyle L (t, y)} используется для измерения несоответствия между целевым выходом t и вычисленным выходом y.. Для задач регрессионного рейтинга номер сообщения как функция потерь, для классификации может быть категориальная кроссэнтропия.

В качестве примера рассмотрим задачу регрессии, используя квадратную ошибку как потерю:

L (t, y) = (t - y) 2 = E, {\ displaystyle L (t, y) = (ty) ^ {2} = E,}{\ Displaystyle L (t, y) = (ty) ^ {2} = E,}

где E - несоответствие или ошибка.

Рассмотрим сеть на одном примере примера: (1, 1, 0) {\ displaystyle (1,1,0)}(1, 1, 0) . Таким образом, входные данные x 1 {\ displaystyle x_ {1}}x_ {1} и x 2 {\ displaystyle x_ {2}}x_ {2} равны 1 и 1 соответственно, а правильный выход, t равно 0. Теперь, если соотношение между выходом y сети по горизонтальной оси и ошибкой E по вертикальной оси, результатом будет парабола. минимум параболы соответствует выходному значению y, которое минимизирует ошибку E. Для обучающего случая минимум также касается горизонтальной оси, что означает, что ошибка будет равна выходной нулю и сеть может выдавать сигнал y, точно соответствующий целевому выходу t. Следовательно, проблема отображения входов в выходы может быть сведена к задаче оптимизации поиска функции, которая будет выполнять минимальную ошибку.

Поверхность ошибок линейного нейрона для одного обучающего случая

Однако выход нейрона зависит от взвешенной суммы всех его входов:

y = x 1 w 1 + x 2 w 2, {\ displaystyle y = x_ {1} w_ {1} + x_ {2} w_ {2},}{\ displaystyle y = x_ {1} w_ {1} + x_ {2} w_ {2},}

где w 1 {\ displaystyle w_ {1}}w_ {1} и w 2 {\ displaystyle w_ {2} }w_ {2} - весовые коэффициенты на соединении модулей ввода к модулю вывод. Следовательно, ошибка также зависит от входящих в нейрон весов. Если каждый вес нанесен на отдельную горизонтальную ось, а ошибка - на вертикальную, результатом будет параболическая чаша. Для нейрона с k весами тот же график потребует эллиптического параболоида k + 1 {\ displaystyle k + 1}к + 1 измерений.

Поверхностьлинейного нейрона с двумя входными весами

Одним из часто используемых алгоритмов для поиска набора весов, который минимизирует ошибку, градиентный спуск. Метод для расчета направления наискорейшего спуска используется обратное распространение.

Выведение

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

E = L (t, y) {\ displaystyle E = L (t, y)}{\ displaystyle E = L (t, y)}

где

E {\ displaystyle E}E - потеря для вывода y {\ displaystyle y}y и целевого значения t {\ displaystyle t}t ,
t {\ displaystyle t}t - целевой вывод для обучающей выборки, а
y {\ displaystyle y}y - фактический вывод выходного нейрона.

Для каждого нейрона j {\ displaystyle j}j , его вывод oj {\ displaystyle o_ {j}}o_j определяется как

oj = φ (чистая j) знак равно φ (∑ К = 1 nwkjok), {\ displaystyle o_ {j} = \ varphi ({\ text {net}} _ {j}) = \ varphi \ left (\ sum _ {k = 1 } ^ {n} w_ {kj} o_ {k} \ right),}{\ displaystyle o_ {j} = \ varphi ({\ text {net}} _ {j}) = \ varphi \ left (\ sum _ {k = 1} ^ {n} w_ {kj} o_ {k} \ right),}

, где функция активации φ {\ displaystyle \ varphi}\ varphi является нелинейной и дифференцируемой (даже если ReLU не в одной точке). Исторически используемая функция активации является логистическая функция :

φ (z) = 1 1 + e - z {\ displaystyle \ varphi (z) = {\ frac {1} {1 + e ^ {- z}}} }{\ displaystyle \ varphi (z) = {\ frac {1} {1 + e ^ {- z}}}}

который имеет удобную производную от:

d φ (z) dz = φ (z) (1 - φ (z)) {\ displaystyle {\ frac {d \ varphi (z)} {dz}} = \ varphi (z) (1- \ varphi (z))}{\ displaystyle {\ frac {d \ varphi (z)} {dz}} = \ varphi ( z) (1- \ varphi (z))}

Входные данные net j {\ displaystyle {\ text {net}} _ {j}}{\ displaystyle {\ text {net}} _ {j}} к нейрону - это взвешенная сумма выходных сигналов ok {\ displaystyle o_ {k}}o_kпредыдущих нейронов. Если нейрон находится в первом слое после входного, то ok {\ displaystyle o_ {k}}o_kвходного слоя - это просто входы xk {\ displaystyle x_ {k}}x_ {k} в сети. Количество входных единиц нейрона составляет n {\ displaystyle n}n . Переменная wkj {\ displaystyle w_ {kj}}{\ displaystyle w_ {kj}} обозначает вес между нейроном k {\ displaystyle k}k предыдущий слой и нейроном j. {\ displaystyle j}j текущий слой.

Нахождение производной ошибки

Схема искусственной нейронной сети для используемых здесь обозначений.

Вычисление частной производной ошибки по весу wij {\ displaystyle w_ {ij}}w_ {ij} выполнено с использованием цепного правила дважды:

∂ E ∂ wij знак равно ∂ E ∂ oj ∂ oj ∂ wij = ∂ E ∂ oj ∂ oj ∂ net j ∂ net j ∂ wij {\ displaystyle {\ frac {\ partial E} {\ partial w_ {ij}}} = {\ frac {\ partial E} {\ partial o_ {j}}} {\ frac {\ partial o_ {j}} {\ partial w_ {ij}}} = {\ frac {\ partial E} {\ partial o_ {j }}} {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ {j}}} {\ frac {\ partial {\ text {net}} _ {j}} {\ частичный w_ {ij}}}}{\ displaystyle {\ frac {\ partial E} {\ partial w_ {ij}}} = {\ frac {\ partial E} {\ partial o_ {j}}} {\ frac {\ partial o_ {j}} {\ partial w_ {ij}}} = {\ frac {\ partial E} {\ partial o_ {j}}} {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ {j}}} {\ frac {\ partial {\ text {net}} _ {j}} {\ partial w_ {ij}}}}

(Ур. 1)

В последнем множителе правой части приведенного выше одного члена в сумме net j {\ displaystyle {\ text {net}} _ {j} }{\ displaystyle {\ text {net}} _ {j}} зависит от wij {\ displaystyle w_ {ij}}w_ {ij} , так что

∂ net j ∂ wij = ∂ ∂ wij (∑ k = 1 nwkjok) = ∂ ∂ wijwijoi = oi. {\ displaystyle {\ frac {\ partial {\ text {net}} _ {j}} {\ partial w_ {ij}}} = {\ frac {\ partial} {\ partial w_ {ij}}} \ left ( \ sum _ {k = 1} ^ {n} w_ {kj} o_ {k} \ right) = {\ frac {\ partial} {\ partial w_ {ij}}} w_ {ij} o_ {i} = o_ {i}.}{\ отображает tyle {\ frac {\ partial {\ text {net}} _ {j}} {\ partial w_ {ij}}} = {\ frac {\ partial} {\ partial w_ {ij}}} \ left (\ sum _ {k = 1} ^ {n} w_ {kj} o_ {k} \ right) = {\ frac {\ partial} {\ partial w_ {ij}}} w_ {ij} o_ {i} = o_ {i}.}

(уравнение 2)

Если нейрон находится в первом слое после входного, oi {\ displaystyle o_ {i}}o_i просто xi {\ displaystyle x_ {i}}x_ {i} .

Производная выход нейрона j {\ displaystyle j}j по отношению к его входу - это просто частная производная функция активации:

∂ oj ∂ net j = ∂ φ (чистая j) ∂ net j {\ displaystyle {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ {j}}} = {\ frac {\ partial \ varphi ({\ text {net}} _ {j})} {\ partial {\ text {net}} _ {j}}}}{\ displaystyle {\ frac {\ partial o_ {j}} {\ partial {\ text {net} } _ {j}}} = {\ гидроразрыва {\ partial \ v arphi ({\ text {net}} _ {j})} {\ partial {\ text {net}} _ {j}}}}

(уравнение 3)

что для случая логистической функции активации :

∂ oj ∂ net j = ∂ ∂ net j φ (net j) = φ (net j) (1 - φ (net j)) = oj (1 - oj) {\ displaystyle {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ {j}}} = { \ frac {\ partial} {\ partial {\ text {net}} _ {j}}} \ varphi ({\ text {net}} _ {j}) = \ varphi ({\ text {net}} _ { j}) (1- \ varphi ({\ text {net}} _ {j})) = o_ {j} (1-o_ {j})}{\ displaystyle {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ {j}}} = {\ frac {\ partial} {\ partial {\ text { net}} _ {j}}} \ varphi ({\ text {net}} _ {j}) = \ varphi ({\ text {net}} _ {j}) (1- \ varphi ({\ text { net}} _ {j})) = o_ {j} (1-o_ {j})}

Это причина, по которой обратное распространение требует, чтобы функция активации была дифференцируемой. (Тем не менее, функция активации ReLU, которая недифференцируема в 0, стала довольно популярной, например, в AlexNet )

. Первый фактор легко оценить, находится ли нейрон в выходном слое, потому что тогда что тогда oj = y {\ displaystyle o_ {j} = y}o_j = y и

∂ E ∂ oj = ∂ E ∂ y {\ displaystyle {\ frac {\ partial E} {\ partial o_ {j}}} = {\ frac {\ partial E} {\ partial y}}}{\ displaystyle {\ frac {\ partial E} {\ partial o_ {j}}} = {\ frac {\ partial E} {\ partial y}}}

(уравнение 4)

Если половина квадратной клетки используется как функция потерь, мы можем переписать это как

∂ E ∂ oj знак равно ∂ E ∂ Y = ∂ ∂ Y 1 2 (t - y) 2 = y - t {\ displaystyle {\ frac {\ partial E} {\ partial o_ {j}}} = {\ frac {\ partial E} {\ partial y}} = {\ frac {\ partial} {\ partial y}} {\ frac {1} {2}} (ty) ^ {2} = yt}\ frac {\ partial E} { \ partial o_j} = \ frac {\ partial E} {\ partial y} = \ frac {\ partial} {\ partial y} \ frac {1} {2} (t - y) ^ 2 = y - t

Однако, если j {\ displaystyle j}j находится на произвольном внутреннем уровне сети, нахождение производной E {\ displaystyle E}E с учетом oj {\ displaystyle o_ {j }}o_j менее очевидно.

Рассмотрение E {\ displaystyle E}E как функции с входными данными являются все нейроны L = {u, v,…, w} {\ displaystyle L = \ {u, v, \ dots, w \} }{\ displaystyle L = \ {и, v, \ точка, w \}} получение входных данных от нейрона j {\ displaystyle j}j ,

∂ E (oj) ∂ oj = ∂ E (netu, net v,…, netw) ∂ oj {\ displaystyle { \ frac {\ partial E (o_ {j})} {\ частичный o_ {j}}} = {\ frac {\ partial E (\ mathrm {net} _ {u}, {\ text {net}} _ { v}, \ dots, \ mathrm {net} _ {w})} {\ partial o_ {j}}}}{\ displaystyle {\ frac {\ partial E (o_ {j})} {\ partial o_ {j}}} = {\ frac {\ partial E (\ mathrm {net} _ {u}, {\ text {net}} _ {v }, \ dots, \ mathrm {net} _ {w})} {\ partial o_ {j}}}}

и взяв полную производную по oj {\ displaystyle o_ { j}}o_j , рекурсивный образуется выражение для производной:

∂ E ∂ oj = ∑ ℓ ∈ L (∂ E ∂ net ℓ ∂ net ℓ ∂ oj) = ∑ ∈ L (∂ E ∂ o ℓ ∂ o ℓ ∂ net ℓ ∂ net ℓ ∂ oj) знак равно ∑ ℓ ∈ L (∂ E ∂ о ℓ ∂ o ℓ ∂ net ℓ wj ℓ) {\ displaystyle {\ frac {\ partial E} {\ partial o_ {j }}} = \ sum _ {\ ell \ in L} \ left ({\ frac {\ partial E} {\ partial {\ text {net}} _ {\ ell}}} {\ frac {\ partial {\ текст {net}} _ {\ ell}} {\ partial o_ {j}}} \ right) = \ sum _ {\ ell \ in L} \ le ft ({\ frac {\ partial E} {\ partial o _ {\ ell}}} {\ frac {\ partial o _ {\ ell}} {\ partial {\ text {net}} _ {\ ell}} } {\ frac {\ partial {\ text {net}} _ {\ ell}} {\ partial o_ {j}}} \ right) = \ sum _ {\ ell \ in L} \ left ({\ frac { \ partial E} {\ partial o _ {\ ell}}} {\ frac {\ partial o _ {\ ell}} {\ partial {\ text {net}} _ {\ ell}}} w_ {j \ ell } \ right)}{\ displaystyle {\ frac {\ partial E} {\ partial o_ {j}}} = \ sum _ {\ ell \ in L} \ left ( {\ frac {\ partial E} {\ partial {\ text {net}} _ {\ ell}}} {\ frac {\ partial {\ text {net}} _ {\ ell}} {\ partial o_ {j }}} \ right) = \ sum _ {\ ell \ in L} \ left ({\ frac {\ partial E} {\ partial o_ {\ ell}}} {\ frac {\ partial o _ {\ ell} } {\ partial {\ text {net}} _ {\ ell}}} {\ frac {\ partial {\ text {net}} _ {\ ell}} {\ partial o_ {j}}} \ right) = \ sum _ {\ ell \ in L} \ left ({\ frac {\ partial E} {\ partial o _ {\ ell}}} {\ frac {\ partial o _ {\ ell}} {\ partial {\ текст {net}} _ {\ ell}}} w_ {j \ ell} \ right)}

(Ур. 5)

Следовательно, производная по oj {\ displaystyle o_ {j}}o_j может быть вычислена, если все производные по выходам o ℓ {\ displaystyle o _ {\ ell} }{\ displaystyle o _ {\ ell}} следующего слоя - те, что ближе к выходному нейрону - известны. [Обратите внимание: если какой-либо из нейронов в наборе L {\ displaystyle L}L не был подключен к нейрону j {\ displaystyle j}j , они были бы независимыми из wij {\ displaystyle w_ {ij}}w_ {ij} и соответствующая частная производная при суммировании обращается в нуль до 0.]

Подстановка Ур. 2, Ур. 3 уравнение 4 и уравнение. 5 в Ур. 1 получаем:

∂ E ∂ wij = ∂ E ∂ oj ∂ oj ∂ net j ∂ net j ∂ wij = ∂ E ∂ oj ∂ oj ∂ net joi {\ displaystyle {\ frac {\ частичный E} {\ partial w_ {ij}}} = {\ frac {\ partial E} {\ partial o_ {j}}} {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ {j}}} {\ frac {\ partial {\ text {net}} _ {j}} {\ partial w_ {ij}}} = {\ frac {\ partial E} {\ partial o_ {j}} } {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ {j}}} o_ {i}}{\ displaystyle {\ frac {\ partial E} {\ partial w_ {ij}}} = {\ frac { \ partial E} {\ partial o_ {j}}} {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ {j}}} {\ frac {\ partial {\ text { net}} _ {j}} {\ partial w_ {ij}}} = {\ frac {\ partial E} {\ partial o_ {j}}} {\ frac {\ partial o_ {j}} {\ partial { \ text {net}} _ {j}}} o_ {i}}
∂ E ∂ wij = oi δ j {\ displaystyle {\ frac {\ partial E} {\ partial w_ {ij}}} = o_ {i} \ delta _ {j}}{\ displaystyle {\ frac {\ partial E} {\ partial w_ {ij}}} = o_ {i} \ delta _ {j}}

с

δ j = ∂ E ∂ oj ∂ oj ∂ net j = {∂ L ( oj, t) ∂ ojd φ (net j) d net j, if j - выходной нейрон, (∑ ℓ ∈ L wj ℓ δ ℓ) d φ (net j) d net j, if j - внутренний нейрон. {\ displaystyle \ delta _ {j} = {\ frac {\ partial E} {\ partial o_ {j}}} {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ { j}}} = {\ begin {cases} {\ frac {\ partial L (o_ {j}, t)} {\ partial o_ {j}}} {\ frac {d \ varphi ({\ text {net} } _ {j})} {d {\ text {net}} _ {j}}} {\ text {if}} j {\ text {- выходной нейрон,}} \\ (\ sum _ {\ ell \ in L} w_ {j \ ell} \ delta _ {\ ell}) {\ frac {d \ varphi ({\ text {net}} _ {j})} {d {\ text {net}} _ { j}}} {\ text {if}} j {\ text {- это внутренний нейрон.}} \ end {ases}}}{\ displaystyle \ delta _ {j} = {\ frac {\ partial E} {\ partial o_ {j}}} {\ frac {\ partial o_ {j}} {\ partial {\ text {net }} _ {j}}} = {\ begin {cases} {\ frac {\ partial L (o_ {j}, t)} {\ partial o_ {j}}} {\ frac {d \ varphi ({\ text {net}} _ {j })} {d {\ text {net}} _ {j}}} {\ text {if}} j {\ text {- выходной нейрон,}} \\ (\ sum _ {\ ell \ in L} w_ {j \ ell} \ delta _ {\ ell}) {\ frac {d \ varphi ({\ text {net}} _ {j})} {d {\ text {net}} _ {j}}} {\ text {if}} j {\ text {- внутренний нейрон.}} \ end {case}}}

если φ {\ displaystyle \ varphi}\ varphi - это логистическая функция, а ошибка - это квадратная ошибка:

δ j = ∂ E ∂ oj ∂ oj ∂ net j = {(oj - tj) oj (1 - oj), if j - нейрон, (∑ ℓ ∈ L wj ℓ δ ℓ) oj (1 - oj), если j - внутренний нейрон. {\ displaystyle \ delta _ {j} = {\ frac {\ partial E} {\ partial o_ {j}}} {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ { j}}} = {\ begin {cases} (o_ {j} -t_ {j}) o_ {j} (1-o_ {j}) {\ text {if}} j {\ text {- вывод нейрон,}} \\ (\ sum _ {\ ell \ in L} w_ {j \ ell} \ delta _ {\ ell}) o_ {j} (1-o_ {j}) {\ text {if}} j {\ text {- внутренний нейрон.}} \ end {cases}}{\ displaystyle \ delta _ {j} = {\ frac {\ partial E} {\ partial o_ {j}}} {\ frac {\ partial o_ {j}} {\ partial {\ text {net}} _ {j}}} = {\ begin {cases} ( o_ {j} -t_ {j}) o_ {j} (1-o_ {j}) {\ text {if}} j {\ text {- выходной нейрон,}} \\ (\ sum _ {\ ell \ in L} w_ {j \ ell} \ delta _ {\ ell}) o_ {j} (1-o_ {j}) {\ text {if}} j {\ text {- это внутренний нейрон. }} \ end {case}}}

Чтобы обновить вес wij {\ displaystyle w_ {ij}}w_ {ij} с помощью градиентного спуска, один необходимо выбрать скорость обучения, η>0 {\ displaystyle \ eta>0}{\displaystyle \eta>0} . Изменение веса отражать влияние на E {\ displaystyle E}E увеличение или уменьшение в wij {\ displaystyle w_ {ij}}w_ {ij} . Если ∂ E ∂ wij>0 {\ displaystyle {\ frac {\ partial E} {\ partial w_ {ij}}}>0}{\displaystyle {\frac {\partial E}{\partial w_{ij}}}>0} , увеличение wij {\ displaystyle w_ {ij}}w_ {ij} увеличивает E {\ displaystyle E}E ; и наоборот, если ∂ E ∂ wij < 0 {\displaystyle {\frac {\partial E}{\partial w_{ij}}}<0}{\ displaystyle {\ frac {\ partial E} {\ partial w_ {ij}}} <0} , увеличение wij {\ displaystyle w_ {ij}}w_ {ij} уменьшает E {\ displaystyle E}E . Новый Δ wij {\ displaystyle \ Delta w_ {ij}}{\ displaystyle \ Delta w_ {ij}} добавляется к старому весу и произведению скорости обучения и градиента, умноженному на - 1 {\ displaystyle -1}-1 гарантирует, что wij {\ displaystyle w_ {ij}}w_ {ij} изменяется так, что всегда уменьшается E {\ displaystyle E}E . Другими словами, в уравнении непосредственно ниже - η ∂ E ∂ wij {\ displaystyle - \ eta {\ frac {\ partial E} {\ partial w_ {ij}}}}{\ displaystyle - \ eta {\ frac {\ partial E} {\ partial w_ {ij}}}} всегда изменяет wij {\ displaystyle w_ {ij}}w_ {ij} таким образом, что E {\ displaystyle E}E уменьшается:

Δ wij = - η ∂ E ∂ wij = - η oi δ J {\ Displaystyle \ Delta w_ {ij} = - \ eta {\ frac {\ partial E} {\ partial w_ {ij}}} = - \ eta o_ {i} \ delta _ {j}}{\ displaystyle \ Delta w_ {ij} = - \ eta {\ frac {\ partial E}) {\ partial w_ {ij}}} = - \ eta o_ {i} \ delta _ {j}}
Функция потерь

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

Допущения

Математическое выражение функции потерь должно удовлетворять двум условиям, чтобы его можно было использовать при обратном распространении. Во-первых, его можно записать как среднее E = 1 n ∑ x E x {\ textstyle E = {\ frac {1} {n}} \ sum _ {x} E_ {x}}{\ textstyle E = {\ frac {1} {n}} \ sum _ {x} E _ {x}} над функциями ошибок E x {\ textstyle E_ {x}}{\ textstyle E_ {x}} , для n {\ textstyle n}{\ textstyle n} отдельных примеров обучения, х {\ textstyle x}{\ textstyle x} . Причина этого предположения заключается в том, что алгоритм обратного распространения ошибки вычисляет градиент функции ошибок для одного обучающего примера, который необходимо обобщить на общую функцию ошибок. Второе предположение состоит в том, что его можно записать как функцию выходных данных нейронной сети.

Пример функции потерь

Пусть y, y ′ {\ displaystyle y, y '}{\displaystyle y,y'}будут векторами в R n {\ displaystyle \ mathbb {R} ^ {n}}\ mathbb {R} ^ {n} .

Выберите функцию ошибки E (y, y ′) {\ displaystyle E (y, y ')}{\displaystyle E(y,y')}, измеряющую разницу между двумя выходными данными. Стандартный выбор - квадрат евклидова расстояния между векторами y {\ displaystyle y}y и y ′ {\ displaystyle y '}y':

E (Y, Y ') = 1 2 ‖ Y - Y' ‖ 2 {\ Displaystyle E (y, y ') = {\ tfrac {1} {2}} \ lVert y-y' \ rVert ^ {2}}{\displaystyle E(y,y')={\tfrac {1}{2}}\lVert y-y'\rVert ^{2}}Функция ошибок для n {\ textstyle n}{\ textstyle n} обучающих примеров может быть записана как среднее значение потерь для отдельных примеров: E = 1 2 n ∑ x ‖ (y (Икс) - Y ′ (x)) ‖ 2 {\ Displaystyle E = {\ frac {1} {2n}} \ sum _ {x} \ lVert (y (x) -y '(x)) \ rVert ^ {2}}{\displaystyle E={\frac {1}{2n}}\sum _{x}\lVert (y(x)-y'(x))\rVert ^{2}}
Ограничения
Градиентный спуск может найти локальный минимум вместо глобального минимума.
  • Градиентный спуск с обратным распространением не гарантирует нахождение глобального минимума функции ошибок, но только местный минимум; Кроме того, у него есть проблемы с переходом плато в ландшафте функции ошибок. Эта проблема, вызванная невыпуклостью функций ошибок в нейронных сетях, долгое время считалась серьезным недостатком, но Янн ЛеКун и др. утверждают, что во многих практических задачах это не так.
  • Обучение с обратным распространением не требует нормализации входных векторов; однако нормализация может улучшить производительность.
  • Обратное распространение требует, чтобы производные функции активации были известны во время проектирования сети.
История

Был объявлен термин обратное распространение и его общее использование в нейронных сетях в Rumelhart, Hinton Williams (1986a), затем развита и популяризирована в Rumelhart, Hinton Williams (1986b), но метод был повторно открыт независимо много раз, и многие предшественники датировали его к 1960-м годам.

Основы непрерывного обратного распространения ошибки были получены в контексте теории управления Генри Дж. Келли в 1960 году и Артуром Э. Брайсона в 1961 г. Они использовали принципы динамического программирования. В 1962 году Стюарт Дрейфус опубликовал более простой вывод, основанный только на правиле цепочки. Брайсон и Хо описали его как многоступенчатый метод оптимизации динамической системы в 1969 году. Обратное распространение ошибок было получено исследователями в начале 60-х годов и реализовано для работы на компьютере еще в 1970 году Сеппо Линнаинмаа. Пол Вербос был первым в США. предположить, что его можно использовать для нейронных сетей, после его глубокого анализа в своей диссертации 1974 года. Хотя это и не применяется к нейронным сетям, в 1970 году Линнаинмаа опубликовал общий метод автоматического дифференцирования (AD). Хотя это вызывает споры, некоторые ученые, что на самом деле это первый шаг к разработке алгоритма обратного распространения. В 1973 году Дрейфус адаптирует параметры контроллеров пропорционально градиентам ошибок. В 1974 году Вербос показал возможность применения этого принципа к искусственным нейронным сетям, а в 1982 году он применил AD-метод Линнаинмаа к нелинейным функциям.

Позже метод Вербоса был переоткрыт и описан в 1985 году Паркером, в 1986 году - Рамельхарт, Хинтон и Уильямс. Ром Элхарт, Хинтон и Уильямс экспериментально показали, что метод может генерировать полезные внутренние представления данных в скрытых слоях нейронных сетей. Янн ЛеКун, изобретатель сверточной нейронной сети, современную форму обратной связи. алгоритм обученияронных сетей в своей докторской диссертации в 1987 году. В 1993 году Эрик Ван выиграл международный по распознаванию образов с помощью обратного распространения. дешевые, мощные вычислительные системы на базе GPU. Это особенно заметно в исследованиях распознавания речи, машинного зрения, обработки естественного языка и изучение языковых структур, которые они использовались для объяснения множества явлений, связанных с изучением первого и второго языков.).

Обратное распространение ошибок было предложено для объяснения компонентов человеческого мозга ERP, таких как N400 и P600.

См. Также
Примечания
Ссылки
Дополнительная литература
Внешние ссылки
Последняя правка сделана 2021-05-11 05:36:10
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте