
Полная версия
AI для PHP-разработчиков: интуитивно и на практике
Выполните следующую команду для сборки и запуска контейнеров 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;


