Рефакторинг шаблона архитектуры Практической HW-2#190
Open
nevermorrow wants to merge 17 commits into
Open
Conversation
…ions-fork into phw-2-fall-fix-template
AlbinaBurlova
marked this pull request as ready for review
February 9, 2026 17:47
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
NB: пуллреквест предлагается принять в имплементации домашки следующего потока курса.
По предложению @AlbinaBurlova отрефакторил файлы
linear_regression.pyиdescents.pyв соответствии с принципами SOLID, и также описал в документации к классам и методам логику связи между их интерфейсами, на которую могут опираться студенты. В файлеusage_example.pyописаны примеры использования предлагаемой архитектуры и логика вызовов.Highlights
LearningRateScheduleпри инициализации ОптимизаторовГрадиентным спуском теперь управляет Оптимизатор
В текущей master-версии итерационный процесс градиентного спуска студентам предлагается распилить между классами линейной регрессии и оптимизатора, где каждый шаг совершается в оптимизаторе, а процесс сходимости контролируется в регрессии. Кажется, это нарушает SRP.
В этой версии весь процесс градиентного спуска контролируется в оптимизаторах, включая ранний останов и сохранение лосса, параметры связанные с этим тоже теперь инициализируют оптимизаторы.
LinearRegressionтеперь только запускает оптимизатор с переданными данными, и становится получателем результата, когда оптимизатор по ссылке записывает в модель веса и историю лосса.Соответственно, часть методов оптимизаторов сделана (условно) приватной
Отдельная иерархия классов LossFunction
В текущей master-версии предлагается переключение функций потерь внутри класса
LinearRegression, что очеидно нарушает OCP.Всякую функцию потерь предлагается реализовывать как имплементацию интерфейса
LossFunction, который включает в себя подсчёт градиента и лосса в точке для передаваемых весов и данных, а также подсчёт аналитического решения. Для случаев существования нескольких аналитических решений предусмотрен вариант использования метода интерфейса как диспатчера к истинной функции, которая выбирается и передаётся по ссылке при инициализации объекта (стоит также рассмотреть сеттер) .Общий интерфейс оптимизатора для аналитических и итерационных решений
Чтобы метод
LinearRegression.fitимел общий код и для итерационных решений, и для аналитических, я сделал упор на LSP. Для этого введен дополнительный неабстрактный классAnalyticSolutionOptimizer, который следует публичному интерфейсуBaseDescent. Фактически это адаптер, который при запуске оптимизации вместо запуска итерационного процесса получает аналитическое решение и сразу же выполняет с ним все последующие операции. Обратите внимание, чтоAnalyticSolutionOptimizerничего не знает про выбранную функцию потерь, и её аналитическое решение на самом деле считается при вызове соответствующего метода объекта функции потерь, присвоенного модели.Так при инициализации можно передать оптимизатор любого типа с любой функцией потерь, и для них отработает один и тот же код класса
LinearRegression, который просто задиспатчит вызовы на переданные объекты.Итого
LinearRegressionдействительно становится просто обёрткой над отдельными иерархиями, которые полностью владеют своим контекстом, и следуют OCP, SRP и всему SOLID.Это драфт!
Если все предложения будут приняты, то под новые интерфейсы нужно будет переписать непосредственно ноутбук с заданиями, и вот тогда всё будет хорошо
Потраченного времени
честно говоря, не жаль, потому что я уже пару лет как не возился с архитектурой, приятно было вспомнить прошлую жизнь :)