«Это 20-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г.".
Ранее мы нарисовали схему нейронной сети, похожую на следующую. Для каждого слоя рисуется только один прямоугольник, представляющий весь слой, а не каждый нейрон, хотя на самом деле нейронов в нем довольно много, и использовать линии для представления отношений действительно сложно. Но, к счастью, нам на самом деле не нужно иметь точный контроль над каждым нейроном, у нас есть единый метод обработки, который представляет собой матрицу.
Рассмотрим подобную ситуацию, предположив, что входные данные представляют собой образец с n функциями, он проходит через слой. И эти m нейронов, выход этих нейронов будет использоваться как вход следующего слоя.
Ради единообразия естественной идеей является то, что характеристики формы входных данных одного слоя должны быть такими же, как характеристики формы входных данных следующего слоя (слово, используемое здесь, может быть неточным, пожалуйста, поймите).
Например, форма вводаВыход слоя — это m нейронов, и веса их нейронов будут соответствовать входным данным. Так что теперь нужно рассмотреть этовсе еще.
Что касается входных данных, каждый нейрон должен выполнить с ними вычисления и, наконец, получить значение (сейчас не обращайте внимания на смещение b).
И этот расчет эквивалентен скалярному произведению векторов. Обратите внимание на вышеупомянутую форму и скалярное произведение, которое очень напоминает умножение матриц.
Проверку можно пересмотреть.Для рассчитанного результата учитывать значение первой позиции
где относится к строке 1 A и столбцу 1 B. Для B в этот момент его столбцы — это все значения нейрона. То есть результат проверки правильный.
Зная это, вы можете подумать об этом с более простой точки зрения. Умножение матриц — это просто преобразование, преобразование из пространства в пространство. Это эквивалентно преобразованию данных из n-мерного пространства в m-мерное пространство. В середине, естественно, используется матричное умножение.
Понять смещение проще, потому что на самом деле это дополнение, и после того, как вышеуказанное преобразование завершено, добавление может быть выполнено.
Теперь давайте немного изменим его, предположим, что на входе r выборок, а затем рассмотрим, как это сделать. Дело все же в консистенции, наблюдайте за процессом ее умножения, вы можете обнаружить, что умножение матриц вообще не заботится о вашем числе, вы даете ему несколько, и оно выводит несколько. Это хорошая новость, это означает, что процесс здесь такой же, как и предыдущий, и это также означает, что обработка без линейных слоев такая же.
Немного более хлопотной является операция b, которую необходимо понять, хотя для этого слоя расчет приводит к форме, но обычно форма b, здесь будет задействована широковещательная операция (хорошая новость в том, что все числовые операции поддерживают эту операцию по умолчанию), а конкретная операция заключается в добавлении b для каждой строки. эквивалентно тому, что b во время операции являетсяматрица.
Мы уточнили процесс работы выборочных функций каждой строки. Однако иногда есть ребята, которые не разыгрывают карты по формуле, они будут использовать способ вектор-столбца для организации данных, а это означает, что предыдущий ввод будет таким.
Практика по-прежнему заключается в том, чтобы учитывать согласованность, входные данные для следующего уровня должны быть. Так что середина должна быть. Операция по-прежнему является умножением матриц, но порядок должен быть изменен, чтобы стать, объекты отображаются.
Еще один момент, который следует учитывать, - это смещение б. Если вы хотите сохранить смещение одного нейрона в каждой строке, например матрицу весов, вы можете напрямую использовать умножение матриц. И если вы используете строки для хранения m смещений, вам нужно сначала транспонировать, а затем подгонять операцию вещания.
Давайте используем numpy для этого:
def linear(features: Tensor, weight: Tensor, b: Tensor, style='row'):
if style == 'row':
return features @ weight + b
elif style.startswith('col'):
return weight @ features + b
else:
raise ValueError("没有这种样式")
Прямая операция рассмотрена выше, а другая вещь, которую следует рассмотреть, — это обратная операция, то есть конкретная матричная операция при обратном распространении.
Также из соображений согласованности для линейного слоя он имеет n входных объектов и m выходных. Теперь дайте ему r входных данных с n функциями, затем он сопоставляет данные с. Предположим, что тот, который передается этому слою во время обратного распространения, также является, то учитывая, что форма градиента, который необходимо распространить в этом слое, также должна быть.
И форма весовой матрицы этого слоя. Умножение здесь очевидно.
Матричные операции, распространяющие градиенты на нижние слои
И для обновления весов это будет зависеть от ввода, вы получаете одно и то же представление независимо от того, считаете ли вы, что оно должно быть независимым от r или что оно должно соответствовать форме W .
Другая часть, которую следует рассмотреть, — это b , для которого, в только что сделанном предположении, он должен быть, и было передано, а это значит, что размерность должна быть уменьшена (это можно понять так: прямое направление достигается широковещательной передачей, а обратное направление тоже нуждается в способе сделать его работоспособным). Конкретный подход может заключаться в снижении размерности с помощью операций агрегирования, таких как суммирование.
Код здесь больше не используется.
В целом, каждый слой в нейронной сети можно рассматривать отдельно, и упор делается на согласованность, которую, как правило, легче понять.