Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 7:02Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -7:02 1xСкорость воспроизведения2x1.75x1.5x1.25x1x, выбрано0.75x0.5xГлавыГлавыОписанияОтключить описания, выбраноСубтитрынастройки субтитров, откроется диалог настройки субтитровСубтитры выкл., выбраноЗвуковая дорожкаPicture-in-PictureПолноэкранный режимThis is a modal window.Начало диалоговго окна. Кнопка Escape закроет или отменит окноТекстColorБелыйЧерныйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачностьПолупрозрачныйФонColorЧерныйБелыйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачностьПолупрозрачныйПрозрачныйОкноColorЧерныйБелыйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачныйПолупрозрачныйПрозрачностьРазмер шрифта50%75%100%125%150%175%200%300%400%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Признаки мы подготовили, на метки посмотрели, дело осталось за малым — собственно, обучить модельку. Но сначала мы обернём наши матрицы признаков в "Dataset" — это специальная идиома в pytorch, которая призвана повысить удобство подключения различных датасетов, которые могут подгружаться с жёсткого диска, из памяти; загружаться сразу все — в память, или читаться по чуть-чуть... Здесь мы используем "SparseFeaturesDataset". Он описан в наши библиотечке. Давайте посмотрим, как он работает. Вот он — это очень простой класс, который принимает на вход в конструктор две матрицы — это матрица признаков, которая разрежена, и матрица меток. По контракту, Dataset должен реализовывать два метода — первый метод "len", он должен возвращать длину датасета, то есть количество примеров в нём, и второй — метод "get item", он должен возвращать один обучающий пример, то есть, в случае нашего семинара — это вектор признаков и метка. Предлагаю вам обратить внимание на выделенный фрагмент кода. Это то, ради чего мы вообще написали этот класс. Особенность в том, что "features" — это разреженная матрица, а pytorch не умеет работать с разреженными матрицами. Но, с другой стороны, мы не хотим конвертировать всю матрицу обучающего датасета в плотное представление, потому что у нас памяти не хватит. Поэтому мы храним весь dataset в разреженном виде, но, когда нам нужно выбрать один пример из датасета, мы выбираем только его из разреженной матрицы, конвертируем в плотное представление и заворачиваем в "torch.Tensor". Аналогично поступаем и с метками. Ну что же, давайте теперь опишем нашу модель. Наша модель — это логистическая регрессия. Как вы помните, логистическая регрессия — это линейная регрессия, выход который сжимается в диапазон от нуля до единицы с помощью логистической функции, то есть сигмоиды. Таким образом, сама модель состоит всего лишь из одного слоя — это линейный слой, у которого количество входов соответствует количеству уникальных токенов, то есть размеру словаря, и количество выходов соответствует количеству меток в датасете. Эту нашу модель мы обучаем с помощью функции "train_eval_loop", которая реализует цикл обучения нейросети. Это функция общего назначения, сюда можно подавать модели не только для классификации, не только текстов, в ней реализованы некоторые стандартные фишки, которые используются при обучении нейросетей. Давайте посмотрим, как она работает. Эта функция принимает целую кучу параметров, но среди этих параметров есть четыре главных — это экземпляр нашей модели, это обучающий датасет, валидационный датасет и наша функция потерь, то есть критерий, минимизируя значение которого мы будем настраивать параметры нашей модели. Что делают остальные параметры — предлагаю пока не рассматривать. Сначала мы переносим нашу модель на то устройство, на котором мы будем производить вычисления — это может быть центральный процессор, либо видеокарта. Затем мы создаём оптимизатор, то есть — говорим, как именно мы должны делать градиентный шаг на каждой итерации. Затем, опционально, мы настраиваем расписание изменения скорости обучения. Менять длину градиентного шага в процессе обучения — это часто хорошая идея, которая приводит к получению лучших значений метрик и функции потерь. Затем мы берём наши Dataset-ы, которые умеют возвращать обучающий пример по индексу (как мы только что рассмотрели), и передаём эти "Dataset" в "DataLoader" — это объект из pytorch, который умеет в многопоточном режиме собирать батчи примеров. В этом семинаре многопоточный режим нам, в принципе, не нужен, но, в общем случае (и в дальнейших семинарах) он вам может пригодиться. Основной смысл использования многопоточного режима — в том, чтобы всегда загружать видеокарты на 100% — таким образом, максимально быстро учить. Далее мы определяем набор переменных, которые позволят нам, в ходе обучения, выбрать лучшую модель. То есть, процесс обучения — стохастический, и модель может как улучшаться в ходе обучения, так и ухудшаться, и не всегда нужно брать последнюю модель. Хорошая практика для выбора лучшей модели в процессе обучения заключается в том, чтобы иметь отложенную выборку, состоящую из некоторого количества примеров, не входящих в обучающих выборку. И, после некоторого количества шагов по обучающей выборке, оценивать качество модели на валидационной выборке (то есть на этой отложенной выборке) и сравнивать качество моделей именно по значениям метрик, вычисленных на отложенной выборке. Далее начинается цикл — обучение состоит из нескольких эпох. Эпоха, в данном случае, носит условный характер — это некоторое количество градиентных шагов. Не обязательно эпоха — это полный проход по датасету. Наша эпоха начинается с того, что мы переводим модель в режим обучения. В данном семинаре это не так важно, но если в нашей нейросети есть такие модули, как dropout или batch norm, критически важно не забывать переводить модель в режим обучения или в режим применения. Далее идёт цикл, реализующий одну эпоху обучения. Мы делаем заданное количество градиентных шагов по обучающей выборке, на каждом шаге мы берём батч примеров — DataLoader нам возвращает уже не отдельные примеры, а целые пачки примеров. Таким образом, в настоящем семинаре, переменная "batch_x" — это прямоугольная матрица, в которой количество строк равно количеству примеров в батче, то есть размеру батча, а количество столбцов — это количество признаков. Мы копируем данные на то же, устройство на котором была и модель, выполняем прямой проход по модели, получаем предсказания, находим значение критерия (то есть значение функции потерь), очищаем оценки градиента с предыдущего шага, находим новое значение градиентов, и делаем градиентный шаг. Также мы запоминаем среднее значение функции потерь на эпохе. Это полезно для мониторинга процесса обучения.
К сожалению, у нас пока нет статистики ответов на данный вопрос,
но мы работаем над этим.