Читать книгу AI для PHP-разработчиков: интуитивно и на практике (Самуэль Акопян) онлайн бесплатно на Bookz (3-ая страница книги)
AI для PHP-разработчиков: интуитивно и на практике
AI для PHP-разработчиков: интуитивно и на практике
Оценить:

4

Полная версия:

AI для PHP-разработчиков: интуитивно и на практике

Шаг 7: Сборка и запуск контейнеров Docker

Выполните следующую команду для сборки и запуска контейнеров Docker:


docker-compose up -d --build

Шаг 8: Установка зависимостей PHP

После запуска контейнеров установите зависимости PHP:


docker-compose exec app composer install

Шаг 9: Проверка Настройки

Откройте веб-браузер и перейдите по адресу `http://localhost`. Вы должны увидеть страницу с информацией о PHP, подтверждающую правильность вашей настройки.

Шаг 10: Создание простого тестового скрипта для машинного обучения

Мы создадим два тестовых скрипта, по одному для каждой библиотеки, чтобы проверить правильность работы PHP-ML и Rubix ML.


Тестовый скрипт для PHP-ML

Создайте файл с именем php_ml_test.php в вашей директории public:


require_once __DIR__ . '/../vendor/autoload.php';


use Phpml\Classification\KNearestNeighbors;


$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];

$labels = ['a', 'a', 'a', 'b', 'b', 'b'];


$classifier = new KNearestNeighbors();

$classifier->train($samples, $labels);


$prediction = $classifier->predict([3, 2]);

echo "Предсказание: " . $prediction;


Тестовый скрипт Rubix ML

Создайте еще один файл с именем rubix_ml_test.php в вашей директории public:


require_once __DIR__ . '/../vendor/autoload.php';


use Rubix\ML\Classifiers\KNearestNeighbors;

use Rubix\ML\Datasets\Labeled;

use Rubix\ML\Datasets\Unlabeled;


$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];

$labels = ['a', 'a', 'a', 'b', 'b', 'b'];


$dataset = new Labeled($samples, $labels);

$estimator = new KNearestNeighbors(3);

$estimator->train($dataset);


$testSamples = new Unlabeled([[3, 2]]);

$prediction = $estimator->predict($testSamples);

echo "Rubix ML Prediction: " . $prediction[0] . "\n";


Для запуска этих скриптов используйте следующие команды:


docker-compose exec app php public/php_ml_test.php

docker-compose exec app php public/rubix_ml_test.php


Если все настроено правильно, вы должны увидеть результат прогнозирования.

Дополнительные команды Docker

Вот несколько полезных команд Docker для управления вашей средой:


* Остановка контейнеров: docker-compose down

* Просмотр логов контейнеров: docker-compose logs

* Доступ к оболочке контейнера PHP: docker-compose exec app bash

* Запуск скриптов PHP: docker-compose exec app php your_script.php

Заключение

Теперь у вас есть среда PHP 8 на основе Docker для разработки машинного обучения. Эта настройка включает PHP 8.5, Nginx, MySQL, PHP-ML и библиотеки Rubix ML. В этой изолированной и воспроизводимой среде вы можете начать разработку приложений машинного обучения на PHP.


Не забудьте пересобрать образ Docker, если внесете изменения в Docker file:


docker-compose up -d --build


3d. Примечания

Дополнительные примечания

Вы можете запускать все примеры из книги напрямую на моём сайте:

https://aiwithphp.org/books/ai-for-php-developers/examples/

Дополнительные примечания о PHP-ML и Rubix ML


PHP-ML:

1. Предоставляет широкий спектр алгоритмов машинного обучения и инструментов предварительной обработки.

2. Подходит для небольших наборов данных и более простых задач машинного обучения.

3. Прост в использовании благодаря простому API.


Rubix ML:

1. Предлагает более полный набор алгоритмов и инструментов машинного обучения.

2. Лучшая производительность для больших наборов данных и более сложных задач.

3. Предоставляет более продвинутые функции, такие как перекрестная проверка и настройка гиперпараметров.

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

Устранение неполадок

Если у вас возникли проблемы с установкой или использованием этих библиотек, выполните следующие действия:


1. Убедитесь, что установлены все необходимые расширения PHP. Возможно, потребуется изменить Dockerfile, чтобы включить дополнительные расширения, необходимые для Rubix ML.

2. Проверьте версии библиотек в файле `composer.json` и обновите их при необходимости.

3. Если вы работаете с большими наборами данных, возможно, потребуется увеличить лимит памяти в конфигурации PHP.

4. Для Rubix ML может потребоваться установить дополнительные системные библиотеки. Добавьте следующее, если возникнут проблемы:


Для установки напрямую (запустите в терминале):

apt-get install -y libopenblas-dev liblapacke-dev && docker-php-ext-install gd


Для Docker (в Dockerfile):

RUN apt-get install -y libopenblas-dev liblapacke-dev && docker-php-ext-install gd


4. О книге

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

Также во всей книге используется десятичная нотация с точкой в качестве десятичного разделителя, принятая в международной научно-технической и программной практике.

Кроме этого

В математических выражениях используется стандартная нотация линейной алгебры: обычное умножение записывается без дополнительных символов (например wx, или Xw), а скалярное произведение векторов – либо через транспонирование (например, wTx), либо через точку (например, w x ).

О чём будет речь

Сам текст написан с точки зрения инженерного подхода. В нём не будет академической математики ради математики и абстрактных примеров, оторванных от реальных задач (ну, или практически не будет). Мы будем постепенно разбирать, как устроено машинное обучение, начиная с самых базовых идей и доходя до современных подходов вроде embeddings и attention.

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

В общем, мы будем продвигаться по следующей схеме:

1. Базовые понятия ML без академического перегруза

2. Работа с числами, векторами и матрицами на PHP

3. Простые модели – линейная регрессия, классификация

4. Embeddings и семантический поиск

5. Нейросети и attention на уровне понимания, а не магии

6. Интеграция с готовыми моделями

7. Архитектура, ограничения и безопасность

Все примеры в книге:

- написаны на чистом PHP или с минимальным количеством зависимостей

- в основном используют библиотеку RubixML

- отдельные разделы показывают работу с TransformersPHP, LLPhant и NeuronAI

- несколько примеров приведены исключительно в демонстрационных целях с PHP-ML

- ориентированы на реальные backend-задачи

- объяснены с инженерной точки зрения

Кому эта книга особенно подойдет

- PHP-разработчикам, которые хотят понимать AI, а не просто использовать его

- тимлидам и архитекторам, принимающим технические решения

- backend-инженерам, работающим с текстами, поиском и данными

- тем, кто устал от "AI магии" и хочет разобраться, как все устроено внутри

Бесплатная и полная версия книги

Эта книга распространяется бесплатно и доступна для чтения всем желающим.

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

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


4a. Лицензия и авторские права

© 2026, Samuel Akopyan

Email: admin@apphp.com

Сайт: https://apphp.com


Эта книга распространяется по лицензии

Creative Commons Attribution 4.0 International (CC-BY-4.0).

Любой вклад (pull request), принятый в репозиторий книги, считается предоставленным на условиях лицензии CC-BY-4.0, если иное не указано явно.

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

При внесении изменений необходимо указать, что оригинальный материал был изменён.

Полный текст лицензии доступен по адресу:

https://creativecommons.org/licenses/by/4.0/


Бесплатная и полная версия книги

Текущая версия книги распространяется бесплатно и доступна для свободного чтения.

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

Лицензия CC-BY-4.0 распространяется на весь открытый контент книги. Материалы, доступные только в полной версии, могут распространяться на отдельных условиях.


4b. Что дальше

AI – это инструмент. Сильный, гибкий, но не универсальный по своей природе и, конечно, не всемогущий. PHP – это язык, на котором строятся надежные и понятные системы. Вместе они позволяют решать задачи, которые еще недавно требовали больших команд и сложной инфраструктуры.

Эта книга – не про хайп и не про обещания "умного" кода. Она про понимание, контроль и осознанное применение технологий.

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

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

А если вам интересны новости, практические примеры и реальные кейсы по машинному обучению и AI в PHP, присоединяйтесь к моему Telegram-каналу: https://t.me/aimlphp

5. Глоссарий


6. Ресурсы и литература


Часть I. Математический язык AI


7. Что такое модель в математическом смысле

Функция, параметры, ошибка.

Когда мы говорим о модели в машинном обучении, полезно сразу отбросить все ассоциации с "искусственным интеллектом" и сложными абстракциями. В математическом смысле модель – это функция. Не больше и не меньше. Она принимает какие-то входные данные и возвращает результат. Различие заключается в том, что эта функция не является жёстко заданной и допускает настройку параметров.

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

В самом общем виде модель можно записать так: f(x) = ŷ

Здесь x – входные данные, а ŷ – предсказание модели. Черта над y неслучайна: это не истинное значение, а лишь попытка его угадать.

Функция как основа модели

Допустим, мы хотим предсказывать цену квартиры по ее площади. В простейшем случае модель можно взять линейную:

ŷ = w⋅x+b

Это уже полноценная модель. Она говорит: "Цена ŷ примерно равна площади x, умноженной на некий коэффициент w, плюс некий сдвиг b.

Если переписать это на PHP, получится почти банальный код:


class LinearModel {

private float $w;

private float $b;


public function __construct(float $w, float $b) {

$this->w = $w;

$this->b = $b;

}


public function predict(float $x): float {

return $this->w * $x + $this->b;

}

}


Пример:


$model = new LinearModel(2.0, 0.0);

echo $model->predict(3.0);


// Результат: 6

// Объяснение: 2 * 3 + 0 = 6


С точки зрения PHP это обычный класс. Никакой магии. Но с точки зрения машинного обучения – это модель.


Параметры модели

Ключевой момент здесь – параметры. В нашем примере это w и b. Они не являются входными данными, но именно от них зависит поведение модели. Если изменить w или b, функция начнет выдавать другие результаты.

Важно четко разделять:

- входные данные x – то, что приходит "снаружи"

- параметры w, b – то, что живет внутри модели и настраивается

- выход ŷ – результат работы модели

В обычном программировании вы чаще всего жестко задаете параметры в коде. В машинном же обучении все наоборот: структура функции фиксирована, а параметры подбираются автоматически (во время обучения модели).

Ошибка как мера качества

Теперь возникает главный вопрос: как понять, что одни параметры лучше других? Для этого вводится понятие ошибки, или функции потерь.

Ошибка – это функция (общепринятое название - функция потерь (Loss function)), которая сравнивает предсказание модели с реальным значением и возвращает число, показывающее, насколько сильно модель ошиблась. Чем меньше это число, тем лучше модель.

Например, самая простая функция потерь – разница между предсказанием и реальным значением: ŷ - y


function error(float $yTrue, float $yPredicted): float {

return $yPredicted - $yTrue;

}


Пример:


echo error(yTrue: 10.0, yPredicted: 7.0);


// Результат: -3

// Объяснение: 7 - 10 = -3


На практике чаще используют квадрат ошибки (Squared Error или SE), потому что он всегда положительный и сильнее наказывает большие промахи: (ŷ − y) 2


function squaredError(float $yTrue, float $yPredicted): float {

return ($yPredicted - $yTrue) ** 2;

}


Пример:


echo squaredError(yTrue: 4.0, yPredicted: 6.0);


// Результат: 4

// Объяснение: (6 - 4)² = 4


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

Обучение как минимизация ошибки

Если собрать все вместе, у нас получается довольно простая и приземленная картина.

В целом мы имеем:

- модель – функция с параметрами

- данные – пары входов и правильных ответов

- ошибка – способ измерить качество предсказаний

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



Даже в PHP это легко представить в виде цикла. Примитивно и неэффективно, но концептуально верно:


$dataset = [

[1.0, 2.0],

[2.0, 4.0],

];


$model = new LinearModel(w: 0.0, b: 0.0);


foreach ($dataset as [$x, $yTrue]) {

$yPredicted = $model->predict($x);

$loss = squaredError($yTrue, $yPredicted);


// здесь в реальных алгоритмах параметры

// изменяются так, чтобы loss уменьшился

}


// Результат:

x = 1, yTrue = 2, yPredicted = 0, loss = 4

x = 2, yTrue = 4, yPredicted = 0, loss = 16


Пример:


// Плохая модель (до обучения)

$model = new LinearModel(w: 0.0, b: 0.0)

// y = 0 * x

// Результат:

// x = 1, yTrue = 2, yPredicted = 0, loss = 4

// x = 2, yTrue = 4, yPredicted = 0, loss = 16


// Улучшенная модель (после нескольких "шагов обучения")

$model = new LinearModel(w: 0.8, b: 0.0);

// y = 0.8 * x

// Результат:

// x = 1, yTrue = 2, yPredicted = 0.8, loss = 1.44

// x = 2, yTrue = 4, yPredicted = 2.4, loss = 5.76

// и так далее, параметры изменяются так, чтобы loss уменьшился


Конкретный способ изменения параметров – это уже вопрос алгоритмов оптимизации, о которых мы будем говорить отдельно. Здесь важно уловить саму идею: никто не "объясняет" модели правила. Мы лишь говорим ей, насколько она ошиблась, и позволяем постепенно уменьшать эту ошибку.

Почему это понимание критично

Для PHP-разработчика такое представление особенно важно. Оно показывает, что машинное обучение не противоречит классическому программированию и не заменяет его. Напротив, оно опирается на те же самые базовые идеи: функции, параметры, вычисления.

Модель – это не черный ящик. Это функция.

Обучение – это не магия. Это оптимизация.

Ошибка – это не абстракция. Это обычная функция, возвращающая число.

Если вы это поняли, то страх перед машинным обучением должен исчезнуть. Дальше начинается инженерия: какие функции брать, какие ошибки использовать и как эффективно подбирать параметры.


👉 Чтобы самостоятельно протестировать этот код, воспользуйтесь [онлайн-демонстрацией] для его запуска.


8. Векторы, размерности и пространства признаков

Почему данные – это точки в пространстве.

Если убрать из машинного обучения все сложные слова и модные термины, то в сухом остатке почти всегда останется одна и та же идея: мы представляем реальные объекты числами и работаем с этими числами математически. Именно здесь на сцену выходят векторы, размерности и пространства признаков. Как PHP-разработчикам вам особенно важно понять это интуитивно, а не формально, потому что в коде вы постоянно будете иметь дело не с абстрактной линейной алгеброй, а с массивами чисел, матрицами и операциями над ними.

Вектор как способ описать объект

Вектор в контексте машинного обучения – это просто упорядоченный набор чисел. Каждое число описывает какой-то аспект объекта. Если объект простой, вектор короткий. Если объект сложный, вектор может быть очень длинным.

Представим пользователя интернет-магазина. Мы можем описать его так: возраст, количество покупок за год, средний чек. Тогда один пользователь – это вектор из трех чисел: (возраст, покупки, средний чек)

В PHP это будет выглядеть максимально приземленно:

$userVector = [35, 12, 78.5];

Важно понять: вектор – это не просто массив. Порядок элементов имеет смысл. Если вы перепутаете местами возраст и средний чек, модель не "догадается", что вы имели в виду. Для нее это будут другие данные.

Размерность вектора

Размерность вектора – это количество чисел в нем. В примере выше размерность равна 3. Если вы добавите еще один признак, например, "дней с последней покупки", размерность станет 4.

Размерность напрямую связана с тем, насколько подробно вы описываете объект. Низкая размерность означает грубое описание, высокая – более детальное. Но высокая размерность не всегда лучше. Каждый дополнительный признак – это новая степень свободы для модели и в то же время новый источник шума.

Для лучшего понимания, полезно думать о размерности как о фиксированном контракте. Если модель ожидает вектор длины 10, вы обязаны всегда передавать ровно 10 чисел, в одном и том же порядке.


function predict(array $features): float {

if (count($features) !== 10) {

throw new InvalidArgumentException("Ожидается вектор размерности 10");

}


// дальнейшие вычисления

}


Пример:


$features = [0.12, 0.85, 0.33, 0.67, 0.91, 0.44, 0.58, 0.76, 0.29, 0.50];


try {

$result = predict($features);

echo "Скор модели: " . round($result, 3) . PHP_EOL;


// Интерпретация результата

if ($result > 0.7) {

echo "Высокая вероятность положительного исхода";

} elseif ($result > 0.4) {

echo "Средняя вероятность";

} else {

echo "Низкая вероятность";

}

} catch (Exception $e) {

echo "Ошибка: " . $e->getMessage();

}


// Скор модели: 0.75

// Высокая вероятность положительного исхода


Пространство признаков

Формально пространство признаков обычно обозначают как как , что означает, что каждый объект описывается вектором из вещественных чисел, а совокупность всех таких векторов образует единое абстрактное пространство. Именно в этом -мерном пространстве "живут" данные, с которыми работают большинство моделей машинного обучения: в нём определены операции сложения векторов и умножения на число, что позволяет применять инструменты линейной алгебры. И хотя в практическом машинном обучении формальные аксиомы отходят на второй план, критически важно понимать, что любая модель всегда функционирует внутри фиксированного пространства, заданного структурой входных признаков.

Если размерность равна 2, пространство признаков – это обычная плоскость. Если 3 – привычное трехмерное пространство. Если больше, то визуализировать его уже фактически невозможно, но математически это то же самое пространство .

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

Пространство признаков – это среда, в которой работает алгоритм машинного обучения. Всё, что раньше было строками, датами, категориями и JSON, после feature engineering превращается в чистую математику – набор чисел.

Признаки как оси координат

Каждый признак – это отдельная ось координат в пространстве. Математически это означает, что значение признака – это координата точки вдоль -й оси.

Например, вектор (35, 12, 78.5) – это точка в трехмерном пространстве, где первая ось – возраст, вторая – количество покупок, третья – средний чек.

Это сразу объясняет несколько важных вещей.

Во-первых, признаки должны быть сопоставимы по масштабу (ещё одна причина, почему мы используем преобразование признаков в числа). Если одна ось измеряется в десятках, а другая – в сотнях тысяч, то расстояния и углы, вычисляемые выбранной метрикой, перестают отражать реальное сходство объектов.

Во-вторых, добавление нового признака – это добавление новой оси. Пространство становится более размерным (плюс ещё один размер), а каждая точка получает еще одну координату. Модель вынуждена учитывать еще одно направление при принятии решений.

Нормализация и масштабирование

На практике почти всегда приходится приводить признаки к сопоставимым масштабам по порядку величины. Это можно сделать разными способами: нормализацией (приведение значений к фиксированному диапазону, например от 0 до 1) или стандартизацией (приведение распределения к нулевому среднему и единичному стандартному отклонению). Оба подхода решают одну и ту же инженерную задачу – сделать признаки сопоставимыми для алгоритма.

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

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

Нормализация

Простейший пример – нормализация в диапазон от 0 до 1:


function normalize(float $value, float $min, float $max): float {

$range = $max - $min;

bannerbanner