предисловие
С ростом популярности фронтенд-аналитики машинное обучение ИИ вошло в поле зрения фронтенд-разработчиков. ИИ может решать проблемы, которые нельзя решить напрямую с помощью правил и операций в области программирования, и генерировать оптимальные стратегии с помощью автоматических рассуждений, что стало еще одним мощным инструментом для фронтенд-инженеров для решения задач.
Многие студенты могут захотеть попробовать, открытьTensorFlow
илиPytorch
Официальный сайт, а затем следуйте документации, чтобы написать машинное обучениеHello World
, и тогда вы столкнетесь с некоторыми функциями, о которых вы не знаете, но вы в недоумении после запуска примера, это потому, чтоTensorFlow
иPytorch
Это инструмент, который использует машинное обучение без указания, что такое машинное обучение. Итак, эта статья начинается с практики в качестве конечной цели, представляет некоторые основные принципы ввода машинного обучения, а также немного свертки обработки изображений, я надеюсь, что это поможет вам понять.
Базовые концепты
Во-первых, что такое машинное обучение? Машинное обучение заключается в поиске такой функции, например, в распознавании речи, вводе фрагмента речи и выводе текстового содержимого.
При распознавании изображений введите изображение, выведите объект на изображении,
В Го вводите данные шахматной доски, выводите, как двигаться дальше,
В диалоговой системе введите приветствие и выведите ответ,
И эта функция представляет собой написанную вами программу плюс большое количество данных, а затем выученную самой машиной.
Как найти такую функцию, начнем с линейной модели. Линейная модель проста по форме и легко моделируется, но она содержит некоторые важные базовые идеи машинного обучения.Многие нелинейные модели с более мощными функциями можно получить, вводя иерархические структуры или многомерные отображения на основе линейных моделей.
Линейная модель
Давайте посмотрим на классификацию кошек и собак.Когда мы учим ребенка различать кошек и собак, мы не будем давать определение Викпедии, а будем постоянно давать ребенку видеть кошек и собак и пусть он судит. правильный ответ, запутавшись в неправильном восприятии. То же самое и с машинным обучением, которое постоянно говорит компьютеру, что правильно, и корректирует познание компьютера, разница в том, что детское познание автоматически обрабатывается человеческим мозгом, а компьютер не может автоматически конструировать память кошек и собак. знать числа.
Итак, нам нужно извлечь признаки, которые представляют кошек и собак, а затем использовать числа для их представления. Чтобы упростить пример, мы используем здесь только две характеристики: размер носа и форму ушей.Вообще говоря, у кошек нос меньше и уши более острые, а у собак нос больше и уши круглее.
Мы подсчитали признаки ушей и носа на картинках и выразили их в двумерной координате.Мы видим, что кошки и собаки распределены в разных областях системы координат.
Невооруженным глазом мы можем различить прямую линию, но компьютер не может увидеть, где можно провести линию. Как передать информацию компьютеру, давайте определим две переменные,x1
указывает размер носа,x2
Представьте форму уха, а затем определите такое уравнение прямой линииW1 · X1 + W2 · X2 - b = 0
, что эквивалентноy=W1 · X1 + W2 · X2 - b
,когдаy
больше, чем0
, признанный кошкой, когдаy
меньше, чем0
, считается собакой.
Теперь, с точки зрения компьютера, у него есть куча данных,
и линейная модель,
Одна цель/задача, мы ожидаем, что когда она будет поставлена перед невидимымx
,пройти черезf(x)
, мы можем получить предсказанное значениеy
,этоy
Таким образом, чтобы быть как можно ближе к реальной стоимости, существует полезная машина для классификации милых домашних животных! Как такую цель можно представить в цифрах, что требует введения концептуальной функции потерь (Loss function
), функция потерь вычисляет разницу между прогнозируемым значением и истинным значением.
Обычно используемые функции потерь - это функция потерь абсолютного значения (Absolute value loss
), то есть абсолютное значение разницы между двумя значениями.
Существуют также квадратичные функции потерь (наименьшие квадраты,Least squares loss
)
Цель функции квадрата потерь — минимизировать расстояние между каждой точкой и линией регрессии, которое рассчитывается как евклидово расстояние. Теперь нашей целью для компьютера становится поиск минимального значения,
Чтобы найти это значение, давайте вспомним давно утерянное исчисление (опять же, для упрощения до двумерной системы координат предположим, что существует только однаw
), производная0
максимальное или минимальное значение функции.
Для такого простого квадратного уравнения с одной переменной, как показано на рисунке, мы можем непосредственноw
Производная, найти минимальное значение. Однако, если это функция, как на рисунке ниже, ее трудно найти, и для разных функций есть разные формулы, то это более хлопотно, ведь наша цель - дать машине научиться самой. правильно.
Итак, нам нужен более общий метод расчета, а именно градиентный спуск (Gradient descent
,
Основной процесс градиентного спуска заключается в следующем: сначала мы случайным образом берем точку в качестве начального значения и вычисляем наклон этой точки, то есть производную.
Когда наклон отрицательный, сделайте небольшой шаг вправо,
Когда наклон положительный, сделайте небольшой шаг влево,
Повторите в каждой точке, рассчитайте новый наклон и сделайте соответствующий небольшой шаг, он будет приближаться к локальному минимуму функции, точно так же, как маленький шарик, катящийся с горы, но с разными начальными положениями, он будет достигать разных Локальный минимум нельзя гарантировать, что он будет глобальным минимумом.Однако в большинстве случаев функции, которые мы абстрагируем в соответствии с задачей, в основном являются выпуклыми функциями, и можно получить минимальное значение.Если минимальное значение не является уникальным, также могут быть добавлены случайные функции , чтобы дать возможность выпрыгнуть из области текущего минимального значения. Нам нужно четко понимать, что теоретической поддержкой машинного обучения является теория вероятностей и статистика.Ответы на вопросы, которые мы ищем с помощью машинного обучения, часто являются не оптимальными решениями, а отличным решением.
Представьте себе более сложную бинарную функцию с двумя входами и одним выходом, нашаloss function
Его можно представить как поверхность в трехмерном пространстве, и проблема становится в том, в каком направлении должна двигаться точка на поверхности в пространстве, чтобы результат упал быстрее всего.
Шаги по-прежнему: вычислить градиент, обновить, вычислить, обновить... Публичное представление выглядит следующим образом:
В этот момент мы сталкиваемся с первым гиперпараметромη
, что является скоростью обучения (Learning rate
), параметры в машинном обучении делятся на две категории, параметры модели и гиперпараметры, параметры моделиw
Таким образом, машина обучается сама, а гиперпараметры задаются разработчиком до обучения модели.
Из приведенной выше формулы видно, что
даLoss function
функция для аргументовw
Производная определяет направление, в котором мы идем, а скорость обучения определяет расстояние каждой маленькой части в этом направлении.
когдаη
слишком мало, процесс достижения минимального значения будет очень медленным, и еслиη
Если он слишком велик, он будет пересекать самую низкую точку, потому что темп слишком велик. Так,η
Как получить значение ,
Более традиционный подход заключается в0.1
Такое значение начинается, а затем экспоненциально уменьшается, принимая0.01
,0.001
, когда мы используем большую скорость обучения, мы обнаружим, что значение функции потерь почти не снижается, что может быть колебанием Когда мы берем небольшое значение, функция потерь может быть уменьшена, а затем продолжать снижаться, постоянно сужаясь, этот процесс также может выполняться компьютером автоматически, если доступны вычислительные ресурсы.
Поняв градиентный спуск и скорость обучения, мы уже можем использовать линейные модели для решения относительно простых задач.
Основные шаги:
- Извлечь функции
- установить модель
- Рассчитать градиент, обновить
Хочешь попробовать!
Вот простой каштан для прогнозирования цен на жилье, вы можете запустить его локально, попробуйте настроить разные скорости обучения, см.loss function
Перемена.GitHub.com/hour7/машина…
Код ключа следующий:
# 损失函数
def lossFunction(x,y,w,b):
cost=np.sum(np.square(x*w+b-y))/(2*x.shape[0])
return cost
# 求导
def derivation(x,y,w,b):
#wd=((x*w+b-y)*x)/x.shape[0]
wd=x.T.dot(x.dot(w)+b-y)/x.shape[0]
bd=np.sum(x*w+b-y)/x.shape[0]
return wd,bd
# 线性回归模型
def linearRegression(x_train,x_test,y_train,y_test,delta,num_iters):
w=np.zeros(x.shape[1]) # 初始化 w 参数
b=0 # 初始化 b 参数
trainCost=np.zeros(num_iters) # 初始化训练集上的loss
validateCost=np.zeros(num_iters) # 初始化验证集上的loss
for i in range(num_iters): # 开始迭代啦
trainCost[i]=lossFunction(x_train,y_train,w,b) # 计算训练集上loss
validateCost[i]=lossFunction(x_test,y_test,w,b) # 计算测试集上loss
Gw,Gb=derivation(x_train,y_train,w,b); # 计算训练集上导数
Dw=-Gw # 斜率>0 往负方向走,所以需要加负号
Db=-Gb # 同上
w=w+delta*Dw # 更新参数w
b=b+delta*Db # 更新参数b
return trainCost,validateCost,w,b
Многослойный персептрон
Линейная модель, которую мы только что упомянули, на самом деле представляет собой однослойную сеть, которая включает в себя основные элементы машинного обучения, модель, обучающие данные, функцию потерь и алгоритм оптимизации. Однако он ограничен линейными операциями и не может решать более сложные задачи.
Нам нужны более общие модели, чтобы соответствовать различным данным. Как дополнительный слой? Эффект добавления слоя примерно эквивалентен преобразованию оси координат, что может решить более сложные задачи.
Тем не менее, это все еще линейная модель, и нет возможности решить нелинейную задачу.Например, на следующем рисунке нет возможности разделить ее прямой линией, но сy= x2
Такое квадратное линейное уравнение можно легко смягчить, что является преимуществом нелинейности.
Добавление нелинейной структуры также вводит в нейронную сеть еще одно базовое понятие — функцию активации (Activation Function
), общая функция активации выглядит следующим образом
Relu
Функция сохраняет только положительные элементы, очищает отрицательные элементы,sigmoid
Функция может преобразовать значение элемента в0~1
между,tanh
Функция может преобразовать значение элемента в-1~1
между. Наиболее широко используется самый простойRelu
,Relu
Функция подобна нейрону в человеческом мозгу: при достижении порога стимуляции нейрона выдается выходной сигнал, а если порог не достигнут, он обнуляется.
При выборе функции активации следует учитывать изменения входных и выходных данных и данных, например, обычно используетсяsigmoid
В качестве функции активации выходного слоя, например, при выполнении задач классификации результаты сопоставляются с0~1
, для каждой предустановленной категории дается0~1
Прогнозируемое значение вероятности .
Можно понять, что мы предоставляем нелинейную функцию, а затем нейронная сеть учится сама, используя предоставленные нами нелинейные элементы, может аппроксимировать любую нелинейную функцию, поэтому ее можно применять ко многим нелинейным моделям.
После добавления функции активации мы имеем многослойный персептрон (multi layer perceptron
), многослойный персептрон — это нейронная сеть, состоящая из полностью связанных слоев, по крайней мере, с одним скрытым слоем, и выход каждого скрытого слоя преобразуется функцией активации.
Подобно приведенному выше рисунку, формируется простая многослойная перцептивная сеть, то есть глубокая нейронная сеть. После усложнения уровня сети градиентный спуск по-прежнему используется для итеративной оптимизации, но вычисление градиента усложняется, и каждая линия в сети имеетw
параметр веса, необходимо использоватьloss function
для каждогоw
Найдите градиент и грубо оцените его, предполагая, что входной слой имеет10
узлы, есть два скрытых слоя, каждый скрытый слой от входного слоя до скрытого слоя1
на скрытый слой2
имеют30000*3
параметры, и между параметрами существует функциональная связь, конечный результатloss
для первого скрытого слояw
Вывод нужно получать послойно, а объем вычислений++++++n
, прямой вывод абсолютно невозможен, поэтому нам нужен алгоритм обратного распространения (Backpropagation
,bp
алгоритм).
Алгоритм обратного распространения
Алгоритм обратного распространения используется для быстрого расчета градиента в многослойной сети.Его вывод относительно сложен.При использовании фреймворка можно напрямую вызывать API, и нет ничего, что могли бы настраивать разработчики.Каждый должен.. не хочу писать код для вычисления частных производных.. как расширенный контент, сначала выкопайте дыру.. в следующий раз, чтобы заполнить..
промежуточное резюме
К настоящему времени у нас должно быть общее представление о вычислении нейронных сетей. Он заключается в том, чтобы дать модель многослойной сетевой структуры, а затем ввести данные, постоянно искать градиент для обновления параметров модели и постоянно уменьшать ошибку прогнозирования модели. Скорость, с которой параметры обновляются с использованием градиента, определяется скоростью обучения гиперпараметров, которая выражается в псевдокоде как:
for i in 迭代次数:
loss = 预测值和真实值的差距
d = loss 对 w求导
w = w - d * 学习率
На данный момент мы уже знаем базовую структуру и процесс вычислений глубокой нейронной сети и можем понять некоторые простые коды для использования нейронных сетей.Pytorch
Официальный учебник, результатыdemo
В нем полно изображений, так что... давайте посмотрим, что такое сверточная нейронная сеть.
Сверточная нейронная сеть
В модели сети, о которой мы упоминали ранее, существует связь между любыми двумя узлами между двумя соседними уровнями, которая называется полносвязной сетью (Fully Connected Layer
). Когда мы обрабатываем изображения с помощью модели глубокой сети, мы можемrgb
значения используются в качестве входных данных,100*100
изображение, входной слой сети имеет100*100*3
узлов, даже если задан только один скрытый слой, входной слой для скрытого слоя уже имеет30000*100
Если вы добавите еще несколько слоев или измените изображение на немного большее, количество параметров резко возрастет. Объем данных, которые необходимо обработать изображению, слишком велик, стоимость использования полносвязной сети слишком высока, а эффективность очень низка. пока сверточная нейронная сеть (Convolutional Neural Network
, CNN
) появился для решения проблемы обработки изображений.
Давайте посмотрим, как выглядит сверточная нейронная сеть, а именно:
Типичная сверточная нейронная сеть состоит из трех частей.
- сверточный слой
- объединяющий слой
- полносвязный слой
Среди них сверточный слой используется для извлечения признаков изображения, слой пула используется для уменьшения параметров, а полносвязный слой используется для вывода желаемого результата.
Сначала рассмотрим свертки.
Введите изображение и передайте его ядру свертки (kernel
,Также известен какfilter
фильтр)
Сдвиньте фильтр по изображению, умножьте и просуммируйте соответствующие позиции,
После скольжения вы можете получить новый двумерный массив, который является операцией свертки, да. Это такое простое дополнение.
Если вы добавите ядро свертки, то после операции вы получите массив из двух каналов.
Двумерный массив, выдаваемый двумерным сверточным слоем, можно рассматривать как представление определенного уровня ввода в пространственном измерении (ширина и высота), также называемое картой признаков (feature map
).
Входная исходная область узла называется его рецептивным полем (receptive field
), например, первый узел в графе объектов3
Поле ввода — левый верхний угол входного изображения.3*3
Площадь.
Если мы снова свернем результат, первый узел в результирующей карте объектов17
, его рецептивное поле становится объединением рецептивных полей его входных узлов, то есть левым верхним углом картинки4*4
Площадь. Мы можем сделать восприимчивое поле одного элемента на карте объектов шире с помощью более глубоких сверточных нейронных сетей, чтобы захватывать на входе объекты большего размера.
На самом деле это имитирует принцип человеческого зрения.Когда мы получаем визуальные сигналы, некоторые клетки коры головного мозга выполняют предварительную обработку, чтобы найти границу и направление, а затем абстрагируются, чтобы определить, является ли форма объекта перед нами круглый или квадратный, а потом дальше Какая абстракция. Через многослойную нейронную сеть нейроны нижнего слоя идентифицируют первичные признаки изображения, а несколько низкоуровневых признаков формируют признаки верхнего уровня, и, наконец, получается самый высокий абстрактный признак для получения результата классификации.
Поняв, что многоуровневая свертка — это процесс распознавания от локальной абстракции к глобальной абстракции, давайте вернемся к самому ядру свертки.
С функциональной точки зрения процесс свертки представляет собой процесс линейного преобразования каждой позиции изображения и сопоставления его с новым значением, а также выполнения послойного сопоставления для формирования сложной функции в целом. С точки зрения сопоставления с шаблоном ядро свертки определяет определенный шаблон, а операция свертки вычисляет, насколько каждая позиция похожа на шаблон или сколько компонентов каждое местоположение имеет с шаблоном, а текущее местоположение совпадает с шаблоном. , Чем более похож шаблон, тем сильнее отклик.
Например, используя оператор обнаружения края для выполнения свертки,sobel
Оператор состоит из двух групп3*3
Матрица , соответственно по горизонтали и вертикали, свернута с плоскостью изображения, если A представляет исходное изображение,G(x)
иG(y)
Представьте изображения с обнаружением горизонтального и вертикального края соответственно:
sobel
частичныйx
Результат расчета обнаружения края направления следующий:
Давайте посмотрим на некоторые каштаны, которые интуитивно выражают эффекты различных операторов свертки.
Считаете ли вы, что свертка это хорошо? Конечно, мы можем напрямую найти некоторые интересные ядра свертки для использования, такие как использование свертки для обнаружения краев изображения, или мы можем изучить ядра свертки через данные и позволить нейронной сети изучить различные операторы.
Просто при расчете свертки каждый раз сдвигалась маленькая сетка, т.е.stride
темп1
, на самом деле, вы также можете увеличивать темп, каждый раз, когда вы скользите2
Вы также можете перейти к значениям, чтобы расширить восприимчивое поле.Вы также можете добавить круг к краю исходного изображения, чтобы длина и ширина выходного массива соответствовали входным.padding
, как самая основная запись, она не будет здесь расширяться.
Возвращаясь к нашей сетевой структуре, мы видим, что между нейронами в двух слоях есть только частичные связи, и чем меньше связей, тем меньше параметров.
Но этого мало.Слишком много пикселей на картинке.Даже если брать только локальные признаки,все равно нужно много параметров,поэтому нам еще и пулинг(pooling
).
Функцией слоя объединения является собственно понижение разрешения и уменьшение изображения.Расчет объединения также очень прост.Вычисляются элементы окна фиксированного размера выходных данных, а затем вывод, и максимальное объединение (Max Pooling
) должен брать максимальное значение элементов в окне пула, а средний пул должен брать среднее значение элементов входного окна.
В дополнение к субдискретизации и уменьшению размера изображения объединение также может снизить чрезмерную чувствительность сверточных слоев к положению и избежать переобучения модели.Для предельного примера изображение имеет только четыре пикселя.Если пиксель в определенная позиция255
, мы определяем, что это определенный тип элемента.Если мы вводим изображения обучающей выборки для обучения, каждая картинка является первым пикселем в верхнем левом углу255
, если нет объединения, результатом обучения модели является то, что когда первый пиксель в верхнем левом углу255
, то результат считается элементом.Когда мы используем эту модель для прогнозирования изображения с пикселем 255 в правом верхнем углу, модель будет думать, что это не объект, и суждение неверно. И если есть объединение, независимо от255
Где бы он ни появился, он будет взят после объединения255
, считается предметом.
После нескольких сверточных слоев и объединенных слоев для уменьшения размерности данные поступают на полносвязный слой для классификации высокоуровневых абстрактных признаков.
Наконец
На этом этапе он должен был быть представлен и понятPytorch
/ Tensorflow
Большинство основных знаний, необходимых для вводного руководства по официальному веб-сайту, вы можете с радостью запустить пример классификации изображений на официальном веб-сайте и написать свою собственную сеть.
Подробнее об использовании фреймворка см. в следующей статье «Введение в ультрабазовое машинное обучение — практика».
последний из последних
Проект смарт-кода Deco - это исследование Bump Labs в направлении «интерфейсного интеллекта».Мы пытаемся начать с точки входа в код генерации эскиза проекта (DesignToCode) и дополнить существующий дизайн ссылкой на НИОКР, а затем Повысить эффективность производства и исследований. Среди них многие возможности ИИ используются для анализа и идентификации эскизного проекта.
Внешняя среда бета-тестирования была открыта, пожалуйста, нажмитеDecoСсылка на опыт~
Заинтересованных детской обувью приглашаем подписаться на наш аккаунт "Bump Lab" (Знай почти,Наггетс).
использованная литература
- речь, о, о, почва, квота.
- Как оценить оптимальную скорость обучения для глубоких нейронных сетей
- Расчет свертки, функция и идея сверточной нейронной сети
- Цифровое изображение — Принципы обнаружения границ — операторы Собеля, Лапласа, Кэнни
- Это.Wikipedia.org/wiki/%E7%B4…
- medium.com/@PKstrong49/…
- cs231n.stanford.edu/