Skip to content

Рефакторинг шаблона архитектуры Практической HW-2#190

Open
nevermorrow wants to merge 17 commits into
esokolov:masterfrom
nevermorrow:phw-2-fall-fix-template
Open

Рефакторинг шаблона архитектуры Практической HW-2#190
nevermorrow wants to merge 17 commits into
esokolov:masterfrom
nevermorrow:phw-2-fall-fix-template

Conversation

@nevermorrow

@nevermorrow nevermorrow commented Oct 9, 2025

Copy link
Copy Markdown
Contributor

NB: пуллреквест предлагается принять в имплементации домашки следующего потока курса.

По предложению @AlbinaBurlova отрефакторил файлы linear_regression.py и descents.py в соответствии с принципами SOLID, и также описал в документации к классам и методам логику связи между их интерфейсами, на которую могут опираться студенты. В файле usage_example.py описаны примеры использования предлагаемой архитектуры и логика вызовов.

Highlights

LearningRateSchedule при инициализации Оптимизаторов

  • теперь передаётся как инициализированный объект, чтобы была возможность проводить инъекции любых LRS с любыми интерфейсами инициализации (в частности, теперь не нужно делать сабкласс, чтобы поменять дефолтные параметры).

Градиентным спуском теперь управляет Оптимизатор

В текущей master-версии итерационный процесс градиентного спуска студентам предлагается распилить между классами линейной регрессии и оптимизатора, где каждый шаг совершается в оптимизаторе, а процесс сходимости контролируется в регрессии. Кажется, это нарушает SRP.

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

Соответственно, часть методов оптимизаторов сделана (условно) приватной

Отдельная иерархия классов LossFunction

В текущей master-версии предлагается переключение функций потерь внутри класса LinearRegression, что очеидно нарушает OCP.

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

Общий интерфейс оптимизатора для аналитических и итерационных решений

Чтобы метод LinearRegression.fit имел общий код и для итерационных решений, и для аналитических, я сделал упор на LSP. Для этого введен дополнительный неабстрактный класс AnalyticSolutionOptimizer, который следует публичному интерфейсу BaseDescent. Фактически это адаптер, который при запуске оптимизации вместо запуска итерационного процесса получает аналитическое решение и сразу же выполняет с ним все последующие операции. Обратите внимание, что AnalyticSolutionOptimizer ничего не знает про выбранную функцию потерь, и её аналитическое решение на самом деле считается при вызове соответствующего метода объекта функции потерь, присвоенного модели.

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

Итого

LinearRegression действительно становится просто обёрткой над отдельными иерархиями, которые полностью владеют своим контекстом, и следуют OCP, SRP и всему SOLID.

Это драфт!

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

Потраченного времени

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

@m4tveevm m4tveevm left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@AlbinaBurlova
AlbinaBurlova marked this pull request as ready for review February 9, 2026 17:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants