Използвайте Keras, за да класифицирате отзивите въз основа на настроението.

Ракшит Радж

11 юли · 8 минути четене

Бинарната класификация се отнася до класифициране на проби в една от двете категории.

рецензии

В този пример ще проектираме невронна мрежа за извършване на двукласна класификация или двоична класификация на рецензии от набора от данни за рецензии на IMDB, за да определим дали рецензиите са положителни или отрицателни. Ще използваме библиотеката на Python, Keras.

Ако търсите по-основен проблем, разгледайте решаването на набора от данни MNIST. Съдържанието, което следва, се основава предимно на решаването на MNIST, „здравей, свят! на дълбоко обучение.

Решете проблема с класификацията на изображения MNIST

„Здравей, светът!“ На Deep Learning и Keras за по-малко от 10 минути

към datadacience.com

Наборът от данни IMDB представлява набор от 50 000 силно поляризирани рецензии от базата данни на Internet Movie. Те са разделени на 25000 рецензии, всяка за обучение и тестване. Всеки набор съдържа равен брой (50%) положителни и отрицателни отзиви.

Наборът от данни IMDB се доставя в комплект с Keras. Състои се от рецензии и съответните им етикети (0 за отрицателна и 1 за положителна рецензия). Отзивите са поредица от думи. Те се обработват предварително като последователност от цели числа, където всяко цяло число означава определена дума в речника.

Наборът от данни IMDB може да се зареди директно от Keras и обикновено ще изтегли около 80 MB на вашата машина.

Нека да заредим предварително опакованите данни от Keras. Ще включим само 10 000 от най-често срещаните думи.

За ритници, нека декодираме първия преглед.

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

За да подготвим данните си, ще кодираме списъците с едно горещо и ще ги превърнем във вектори на 0 и 1. Това би взривило всичките ни последователности в 10 000-мерни вектори, съдържащи 1 при всички индекси, съответстващи на цели числа, присъстващи в тази последователност. Този вектор ще има елемент 0 при всички индекси, който не присъства в целочислената последователност.

Най-просто казано, 10 000-измерният вектор, съответстващ на всеки преглед, ще има

  • Всеки индекс, съответстващ на дума
  • Всеки индекс със стойност 1 е дума, която присъства в рецензията и се обозначава с нейното цяло число.
  • Всеки индекс, съдържащ 0, е дума, която не присъства в рецензията.

Ние ще векторизираме нашите данни ръчно за максимална яснота. Това ще доведе до тензор на форма (25000, 10000).

Нашите входни данни са вектори, които трябва да бъдат съпоставени с етикети за скалиране (0s и 1s). Това е една от най-лесните настройки и обикновеният набор от напълно свързани, Плътни слоеве с активиране на relu се представят доста добре.

Скрити слоеве

В тази мрежа ще използваме скритите слоеве. Ние ще определим нашите слоеве като такива.

Аргументът, който се предава на всеки Плътен слой, (16) е броят на скритите единици на слой.

Изходът от плътен слой с активиране на relu се генерира след верига от тензорни операции. Тази верига от операции се изпълнява като

Където W е матрицата на теглото, а b е пристрастието (тензор).

Наличието на 16 скрити единици означава, че матрицата W ще бъде с формата (input_Dimension, 16). В този случай, когато размерът на входния вектор е 10 000, формата на матрицата за тегло ще бъде (10000, 16). Ако трябва да представите тази мрежа като графика, ще видите 16 неврона в този скрит слой.

Казано по-неспециалистично, в този слой ще има 16 топки.

Всяка от тези топки или скрити единици е измерение в пространството за представяне на слоя. Представителното пространство е съвкупността от всички жизнеспособни представяния за данните. Всеки скрит слой, съставен от скритите му единици, има за цел да научи една специфична трансформация на данните или една характеристика/модел от данните.

DeepAI.org има много информативна информация за скритите слоеве.

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

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

Архитектура на модела

За нашия модел ще използваме

  1. Два междинни слоя с по 16 скрити единици всеки
  2. Трети слой, който ще изведе скаларното предвиждане на настроението
  3. Междинните слоеве ще използват функцията за активиране на relu. relu или коригирана линейна единична функция ще нулира отрицателните стойности.
  4. Активиране на сигмоида за крайния слой или изходния слой. Сигмоидната функция „смачква“ произволни стойности в диапазона [0,1].

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

В тази стъпка ще изберем оптимизатор, функция за загуба и показатели, които да наблюдаваме. Ще продължим напред с

  • binary_crossentropy функция за загуба, често използвана за двоична класификация
  • rmsprop оптимизатор и
  • точността като мярка за изпълнение

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

Човек би могъл да използва персонализирана функция за загуба или оптимизатор, като предаде потребителски екземпляр на клас като аргумент на полетата за загуба, оптимизатор или метрика.

В този пример ще приложим нашия избор по подразбиране, но ще го направим чрез предаване на инстанции на класа. Точно така бихме го направили, ако имахме персонализирани параметри.

Ще отделим част от нашите данни за обучение за валидиране на точността на модела, докато се обучава. Комплектът за валидиране ни позволява да наблюдаваме напредъка на нашия модел върху невиждани досега данни, докато той преминава през епохи по време на обучението.

Стъпките за валидиране ни помагат да прецизираме параметрите на обучение на функцията model.fit, за да избегнем прекомерно и недостатъчно оборудване на данни.

Първоначално ще обучим нашите модели за 20 епохи в мини партиди от 512 проби. Също така ще предадем нашия комплект за валидиране на метода на годни.

Извикването на метода fit връща обект History. Този обект съдържа история на членовете, която съхранява всички данни за тренировъчния процес, включително стойностите на наблюдаваните или наблюдавани величини, докато епохите продължават. Ще запазим този обект, за да определим по-добре фината настройка, която да се приложи към стъпката на обучение.

В края на обучението постигнахме точност на обучение от 99,85% и точност на валидиране от 86,57%

След като обучихме нашата мрежа, ще наблюдаваме нейните показатели за ефективност, съхранявани в обекта History.

Извикването на метода fit връща обект History. Този обект има история на атрибути, която представлява речник, съдържащ четири записа: по един за наблюдавана метрика.

history_dict съдържа стойности на

  • Загуба на тренировка
  • Точност на обучението
  • Загуба на валидиране
  • Точност на валидиране

в края на всяка епоха.

Нека използваме Matplotlib за начертаване на загуби от обучение и валидиране и Точност на обучение и валидиране рамо до рамо.

Наблюдаваме, че минималната загуба на валидиране и максималната точност на валидиране се постигат за около 3-5 епохи. След това наблюдаваме две тенденции:

  • увеличаване на загубата на валидиране и намаляване на загубата на обучение
  • намаляване на точността на валидиране и увеличаване на точността на обучението

Това предполага, че моделът се подобрява при класифицирането на настроенията на данните за обучението, но прави постоянно по-лоши прогнози, когато среща нови, невиждани досега данни. Това е отличителен белег на Overfitting. След 5-та епоха моделът започва да се вписва твърде близо до данните за обучението.

За да се справим с Overfitting, ще намалим броя на епохите до някъде между 3 и 5. Тези резултати могат да варират в зависимост от вашата машина и поради самия характер на произволното разпределение на тежестите, които могат да варират от модел до модел.

В нашия случай ще спрем да тренираме след 3 епохи.

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

В крайна сметка постигаме точност на обучение от 99% и точност на валидиране от 86%. Това е доста добре, като се има предвид, че използваме много наивен подход. По-висока степен на точност може да бъде постигната чрез използване на по-добър алгоритъм за обучение.

Ще използваме нашия обучен модел, за да правим прогнози за данните от теста. Резултатът е масив от плаващи цели числа, които обозначават вероятността прегледът да бъде положителен. Както можете да видите, в някои случаи мрежата е абсолютно сигурна, че прегледът е положителен. В други случаи - не толкова!

Можете да опитате да намерите някои показатели за грешка за броя на настроенията, които са били грешно класифицирани, като използвате метрика като средна квадратна грешка, както направих тук. Но би било глупаво да го направя! Анализът на резултата не е нещо, което ще разгледаме тук. Все пак ще хвърля малко светлина върху това защо използването на mse е безполезно в този случай.

Резултатът от нашия модел е мярката за това колко моделът възприема рецензията като положителна. Вместо да ни казва абсолютния клас на извадката, моделът ни казва по това колко възприема настроението да бъде изкривено от едната или от другата страна. MSE е твърде проста метрика и не успява да улови сложността на решението.

Не визуализирах тази невронна мрежа. Бих, но това отнема много време. Наистина визуализирах невронната мрежа, която използвах при решаването на проблема MNIST. Ако искате, можете да разгледате този проект на GitHub за визуализиране на ANN

Prodicode/ann-визуализатор

Страхотна библиотека за визуализация на python, използвана за работа с Keras. Той използва библиотеката Graphviz на python, за да създаде презентабилен ...

github.com

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

Препоръчвам ви да работите заедно със статията. Можете да решите повечето бинарни класификационни проблеми, използвайки подобна стратегия. Ако все пак сте го решили, опитайте да потърсите дизайна и параметрите на мрежата и нейните слоеве. Това ще ви помогне да разберете по-добре целостта на архитектурата на модела, която сте избрали.

Обсъждам отделна тема с допълнителни подробности във всяка от статиите си. В този, ние се ровихме малко в скрити слоеве. Изчерпателно обяснение на дадена тема никога не е в обхвата на моята статия; обаче ще намерите достатъчно бързи страни.

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

Чувствайте се свободни да проверите изпълнението на тази статия и още от работата ми върху GitHub.