Как да разберем Gradient Descent, най-популярният алгоритъм за ML

Gradient Descent е един от най-популярните и широко използвани алгоритми за обучение на модели за машинно обучение.

Моделите за машинно обучение обикновено имат параметри (тегла и пристрастия) и функция на разходите, за да се оцени колко добър е определен набор от параметри. Много проблеми с машинното обучение се свеждат до намиране на набор от тежести за модела, което минимизира функцията на разходите.

Например, ако прогнозата е p , целта е t и нашата метрика за грешка е квадратна грешка, тогава разходната функция J (W) = (p - t) ² .

Имайте предвид, че прогнозната стойност р зависи от вход X , както и модела на машинно обучение и (текущи) стойности на параметрите W . По време на обучението, нашата цел е да намерим набор от стойности за W, така че (p - t) ² да е малък. Това означава, че нашата прогноза p ще бъде близо до целта t .

Градиентното спускане е итеративен метод. Започваме с някакъв набор от стойности за нашите параметри на модела (тегла и отклонения) и ги подобряваме бавно.

За да подобрим даден набор от тегла, ние се опитваме да разберем стойността на функцията на разходите за тегла, подобни на текущите тегла (чрез изчисляване на градиента). След това се движим в посоката, която намалява функцията на разходите.

Повтаряйки тази стъпка хиляди пъти, ние непрекъснато ще минимизираме нашата функция на разходите.

Псевдокод за Gradient Descent

Градиент спускане се използва за минимизиране на функцията на разходите J (W) параметризиран чрез модел параметри W .

Градиентът (или производната) ни казва наклона или наклона на разходната функция. Следователно, за да сведем до минимум разходната функция, ние се движим в посока, обратна на градиента.

  1. Инициализирайте тежестите W произволно.
  2. Изчислете градиентите G на параметрите на функцията за разходи. Това се прави с помощта на частична диференциация: G = ∂J (W) / ∂W. Стойността на градиента G зависи от входовете, текущите стойности на параметрите на модела и функцията на разходите. Може да се наложи да преразгледате темата за диференциацията, ако изчислявате градиента на ръка.
  3. Актуализирайте тежестите с количество, пропорционално на G, т.е. W = W - ηG
  4. Повторете, докато разходите J ( w ) спрат да намаляват или не бъдат изпълнени някои други предварително определени критерии за прекратяване .

В стъпка 3 η е скоростта на обучение, която определя размера на стъпките, които предприемаме, за да достигнем минимум. Трябва да бъдем много внимателни по отношение на този параметър. Високите стойности на η могат да надхвърлят минимума, а много ниските стойности ще достигнат минимума много бавно.

Популярен избор за критериите за прекратяване е, че цената J ( w ) спира да намалява за валидиращ набор от данни.

Интуиция за градиентно спускане

Представете си, че сте със завързани очив неравен терен и вашата цел е да достигнете най-ниската надморска височина.

Една от най-простите стратегии, които можете да използвате, е да почувствате земята във всяка посока и да направите крачка в посоката, където земята се спуска най-бързо.

Ако продължавате да повтаряте този процес, може да се окажете на езерото или дори по-добре някъде в огромната долина.

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

Вие сте сгънати на сляпо, тъй като нямаме лукса да оценяваме (или „виждаме“) стойността на функцията за всеки възможен набор от параметри.

Усещането на наклона на терена около вас е аналогично на изчисляването на градиента и предприемането на стъпка е аналогично на една итерация на актуализация на параметрите.

Между другото - като малко настрана - този урок е част от безплатния курс за наука за данни и безплатен курс за машинно обучение на Commonlounge. Курсовете включват много практически задачи и проекти. Ако се интересувате от изучаване на Data Science / ML, определено препоръчваме да го проверите.

Варианти на градиентно спускане

Има множество варианти на градиентно спускане, в зависимост от това колко от данните се използват за изчисляване на градиента.

Основната причина за тези вариации е изчислителната ефективност. Наборът от данни може да има милиони точки от данни и изчисляването на градиента върху целия набор от данни може да бъде изчислително скъпо.

  • Пакетно градиентно спускане изчислява градиента на разходната функция wrt към параметър W за цели данни за обучение . Тъй като трябва да изчислим градиентите за целия набор от данни, за да извършим актуализация на един параметър, партидният градиент може да бъде много бавен.
  • Стохастичен градиентно спускане (SGD) изчислява градиента за всяка актуализация, използвайки една точка от данните за обучение x_i (избрана на случаен принцип). Идеята е, че градиентът, изчислен по този начин, е стохастично приближение към градиента, изчислен с помощта на всички данни за обучение. Всяка актуализация вече е много по-бърза за изчисляване, отколкото при спускане с градиент на партида и при много актуализации ще се насочим в същата обща посока.
  • При градиентно спускане с мини-партида изчисляваме градиента за всяка малка мини-партида от данни за обучение. Тоест, първо разделяме данните за обучението на малки партиди (да речем М проби на партида). Извършваме по една актуализация на мини-партида. М обикновено е в диапазона 30–500, в зависимост от проблема. Обикновено се използва мини-пакетна GD, тъй като изчислителната инфраструктура - компилатори, процесори, графични процесори - често е оптимизирана за извършване на векторни добавяния и векторни умножения.

От тях най-популярни са SGD и GD с мини партиди.

В типичен сценарий правим няколко преминавания на данните за обучение, преди да бъдат изпълнени критериите за прекратяване. Всеки проход се нарича епоха . Също така имайте предвид, че тъй като стъпката на актуализация е много по-изчислително ефективна в SGD и мини-пакетната GD, обикновено извършваме 100-1000 актуализации между проверките за изпълнени критерии за прекратяване

Избор на степен на обучение

Обикновено стойността на скоростта на обучение се избира ръчно. Обикновено започваме с малка стойност като 0,1, 0,01 или 0,001 и я адаптираме въз основа на това дали функцията на разходите намалява много бавно (увеличаване на скоростта на обучение) или експлодира / е непостоянна (намаляване на скоростта на обучение).

Въпреки че ръчният избор на скорост на обучение все още е най-често срещаната практика, няколко метода като Adam optimizer, AdaGrad и RMSProp са предложени за автоматично избиране на подходяща скорост на обучение.

Съавтори на Keshav Dhandhania и Savan Visalpara.

Първоначално публикуван като част от безплатния курс за машинно обучение и безплатен курс за наука за данни на www.commonlounge.com.