предисловие
В эту эпоху стремительного технологического развития любимцы и изгои индустрии подобны двум сторонам ладони: одним махом положение практиков кардинально изменится.
Как популярная область, признанная в отрасли за последние два года, искусственный интеллект отличается от предыдущей горячей разработки мобильных терминалов или разработки интерфейса, он далек от традиционной индустрии разработки программного обеспечения и имеет высокий порог входа, который никогда не появились раньше.Разочарованы инженеры-программисты, которые надеются, что смогут учиться всю жизнь и продолжать уделять внимание развитию отрасли.
Прежде чем мы продолжим обсуждение барьеров, мешающих традиционным инженерам-программистам перейти в область ИИ, давайте определим несколько терминов:
- Искусственный интеллект: человеческий интеллект, отображаемый машинами, например, распознавание изображений и другие задачи, которые традиционные компьютеры не могут выполнить.
- Машинное обучение: способ реализации искусственного интеллекта
- Глубокое обучение: метод реализации машинного обучения
Итак, какие барьеры мешают традиционным инженерам-программистам войти в область искусственного интеллекта?
- Математика: в отличие от различий между различными областями, такими как серверная часть, внешний интерфейс, мобильные устройства и т. д., искусственный интеллект или глубокое обучение, на которых мы сосредоточимся далее, — это наука, основанная на математике. Изучение его предварительных условий больше не связано с созданием определенной среды разработки и пониманием определенной структуры, а с пониманием некоторых математических концепций, таких как матрицы, обратное распространение ошибки и градиентный спуск.
- Экология. В течение долгого времени академические круги использовали Python в качестве языка по умолчанию для своих исследований, создаваяNumPy,MatplotlibИ ряд превосходных инструментов для научных вычислений. Для веб-разработчиков, которые целыми днями работают с пользовательскими интерфейсами, отсутствие ряда базовых инструментов напрямую затрудняет построение даже самой базовой модели глубокого обучения.
Чтобы устранить два препятствия, упомянутых выше, автор использовал TypeScript для первоначального завершения фреймворка глубокого обучения на основе JavaScript с нулевыми зависимостями:deeplearning-js, я надеюсь предоставить вам способ глубокого обучения начального уровня с более низким порогом в языке и экологии, с которыми знакомы веб-разработчики.Учебники по глубокому обучению для веб-разработчиковЭта серия статей поможет вам понять основные идеи глубокого обучения и связанные с ним математические концепции.
Общая структура
src/
├── activationFunction // 激活函数
│ ├── index.ts
│ ├── linear.spec.ts
│ ├── linear.ts
│ ├── linearBackward.spec.ts
│ ├── linearBackward.ts
│ ├── relu.spec.ts
│ ├── relu.ts
│ ├── reluBackward.spec.ts
│ ├── reluBackward.ts
│ ├── sigmoid.spec.ts
│ ├── sigmoid.ts
│ ├── sigmoidBackward.spec.ts
│ ├── sigmoidBackward.ts
│ ├── softmax.spec.ts
│ ├── softmax.ts
│ ├── softmaxBackward.spec.ts
│ └── softmaxBackward.ts
├── costFunction // 损失函数
│ ├── crossEntropyCost.spec.ts
│ ├── crossEntropyCost.ts
│ ├── crossEntropyCostBackward.spec.ts
│ ├── crossEntropyCostBackward.ts
│ ├── index.ts
│ ├── quadraticCost.spec.ts
│ ├── quadraticCost.ts
│ ├── quadraticCostBackward.spec.ts
│ └── quadraticCostBackward.ts
├── data // 数据结构:矩阵 & 标量
│ ├── Array2D.spec.ts
│ ├── Array2D.ts
│ ├── Scalar.spec.ts
│ ├── Scalar.ts
│ └── index.ts
├── index.ts
├── math // 计算:矩阵计算函数 & 生成随机数矩阵 & 生成零矩阵
│ ├── add.spec.ts
│ ├── add.ts
│ ├── divide.spec.ts
│ ├── divide.ts
│ ├── dot.spec.ts
│ ├── dot.ts
│ ├── index.ts
│ ├── multiply.spec.ts
│ ├── multiply.ts
│ ├── randn.spec.ts
│ ├── randn.ts
│ ├── subtract.spec.ts
│ ├── subtract.ts
│ ├── transpose.spec.ts
│ ├── transpose.ts
│ ├── zeros.spec.ts
│ └── zeros.ts
├── model // 模型:初始化参数 & 正向传播 & 反向传播 & 更新参数
│ ├── Cache.ts
│ ├── backPropagation.ts
│ ├── forwardPropagation.ts
│ ├── index.ts
│ ├── initializeParameters.spec.ts
│ ├── initializeParameters.ts
│ ├── train.ts
│ └── updateParameters.ts
├── preprocess // 数据预处理:数据标准化
│ ├── index.ts
│ └── normalization
│ ├── index.ts
│ ├── meanNormalization.spec.ts
│ ├── meanNormalization.ts
│ ├── rescaling.spec.ts
│ └── rescaling.ts
└── utils // 帮助函数:数据结构转换 & 矩阵广播
├── broadcasting.spec.ts
├── broadcasting.ts
├── convertArray1DToArray2D.ts
├── convertArray2DToArray1D.ts
└── index.ts
Как фреймворк, ориентированный на глубокое обучение, deeplearning-js отвечает только за создание и обучение моделей глубокого обучения. Пользователи могут использовать предоставленный API для создания моделей глубокого обучения на основе любого набора данных и получения результатов после обучения. Конкретные примеры Вы можете Ссылаться наLogistic regression.
Мы будем использовать скорость обучения, количество итераций, количество нейронов в скрытом слое и т.д.ГиперпараметрыПредставленный конечным пользователям, deeplearning-js автоматически настраивает модель для получения различных результатов. На основе этих выходных данных мы можем использовать любой график или библиотеку визуализации для отображения результатов обучения модели.
Кроме того, при чтении этой серии статей рекомендуется сотрудничать с deeplearning-js.исходный кодПрочтите его вместе, я считаю, что таким образом у вас будет более эмоциональное понимание того, что делает глубокое обучение.
векторизация
В отличие от других руководств по машинному обучению, мы не хотим с самого начала внушать всем много математических терминов и понятий, а начнем с первого шага обработки данных для обучения моделей глубокого обучения.
Давайте будем очень известными в академических кругахIrisнабор данных в качестве примера.
Теперь у нас есть 150 выборочных данных о длине чашелистиков, ширине и длине лепестков, а также ширине радужной оболочки, принадлежащих 3 видам, чтобы судить, является ли это одним из трех разновидностей, то есть логистической регрессией.
Хотя наша окончательная модель состоит в том, чтобы вводить любые данные выборки для получения результата, мы не хотим вводить только одну выборку данных за раз во время обучения, а надеемся ввести все выборки данных за один раз, чтобы получить результат обучения и фактический результат. результат различий, а затем использовать обратное распространение, чтобы скорректировать эти различия.
Поэтому нам нужно объединить несколько выборочных данных в матрицу, как показано на следующем рисунке:
После векторизации данных у нас есть возможность обрабатывать большие наборы данных, т.е. обучать модель на всем наборе данных, а не на определенной выборке данных. Вот почему графические процессоры намного быстрее, чем процессоры, в глубоком обучении. При обучении модели глубокого обучения все расчеты выполняются на основе матриц, поэтому GPU архитектуры параллельных вычислений (время вычислений при обработке нескольких задач равно времени выполнения самой сложной задачи) быстрее архитектуры последовательных вычислений (вычисления при обработке нескольких задач) время, равное сумме времени выполнения всех задач) намного быстрее.
Внимательные читатели могут заметить, что данные разной размерности в выборке данных на приведенном выше рисунке расположены вертикально, что прямо противоположно горизонтальному расположению данных в традиционных массивах, то есть нам нужно
[5.1, 3.5, 1.4, 0.2]
преобразовать в
[
[5.1],
[3.5],
[1.4],
[0.2],
]
Внимательные читатели могут еще раз спросить, например набор данных Iris, почему исходные данные должны быть преобразованы в матрицу из 4 строк и 150 столбцов, неужели это не может быть удобной для обработки матрицей из 150 строк и 4 столбцов?
Есть два соображения по этому вопросу. Когда следующие входные данные и скрытый слой делают скалярное произведение матрицы
Количество столбцов матрицы скрытого слоя (W) должно быть равно количеству строк входного слоя (A), поэтому, чтобы уменьшить ненужные вычисления, мы хотим, чтобы количество строк входного слоя было как как можно меньше, поэтому мы сравниваем количество размерностей выборки данных с Сравнивая количество выборок, нетрудно сделать вывод, что в большинстве случаев количество измерений выборок данных намного меньше, чем количество образцы. С другой стороны, после скалярного произведения количество столбцов результирующей матрицы будет равно количеству столбцов входного слоя, а это означает, что если мы хотим, чтобы наш вывод был матрицей [X, 150], входной слой должен быть матрицей [4, 150].
Так как же быстро сделать такое преобразование между исходным набором данных и используемым набором данных? Это включает в себя общую операцию с матрицами, транспонирование матрицы.
матрица
Говоря о матрицах, многие их странные свойства, такие как транспонирование, скалярное произведение и т. д., должны быть кошмаром для многих друзей в колледже. Мы не будем здесь говорить о конкретных математических понятиях, а сначала попробуем описать матрицу и ее основные операции в нескольких предложениях.
С наиболее интуитивной точки зрения, какая информация необходима для определения матрицы? Один — форма матрицы, то есть система координат (пространство), а другой — значение (положение) матрицы в каждом измерении в этой системе координат.
- Матрица (Array2D): объект в N-мерном пространстве с определенным положением в каждом измерении.
- Добавление матрицы (добавить): растяните исходный объект в одном или нескольких измерениях.
- Матричное вычитание (вычитание): обрезка исходного объекта в одном или нескольких измерениях
- Матричное умножение (умножение): пропорционально увеличить исходный объект на основе определенного происхождения исходного объекта.
- Матричное деление (деление): пропорционально масштабировать исходный объект на основе источника исходного объекта.
- Матричное транспонирование (транспонирование): отражение исходного объекта на основе исходного объекта.
- Матричный скалярный продукт (точечный): Выполните преобразование положения, описанное левой матрицей на исходном объекте, то есть переместите
В deeplearning-js мы используем структуру данных двумерных массивов для представления матриц, Для конкретной реализации кода вышеперечисленных операций вы можете обратиться кArray2D.
Пример простого преобразования данных выглядит следующим образом:
function formatDataSet(dataset: Array<any>) {
const datasetSize = dataset.length;
let inputValues: Array<number> = [];
map(dataset, (example: {
"sepalLength": number,
"sepalWidth": number,
"petalLength": number,
"petalWidth": number,
"species": string,
}) => {
const input: any = omit(example, 'species');
inputValues = inputValues.concat(values(input));
});
const input = new Array2D(
[datasetSize, inputValues.length / datasetSize],
inputValues,
).transpose();
return input;
}
резюме
После понимания концепций векторизации данных и матриц я считаю, что вы уже можете преобразовать большие размеры выборки и данные, хранящиеся в форме массива, в большие матрицы, подходящие для обучения модели глубокого обучения.Давайте начнем с того, как инициализировать параметры.Шаг за шагом, чтобы построить наш первая модель глубокого обучения.