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

Разработчиците често казват: „Ако искате да научите машинно обучение, първо научете как работят алгоритмите.“ Но опитът ми показва обратното.

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

Как да развием интуицията и да разберем всички нюанси на машинното обучение? Добър вариант е да се създаде модел на такова обучение. Ако все още нямате опит в писането на алгоритми от нулата, можете да използвате библиотека, в която те вече са внедрени. Например TensorFlow.

Забележка. пер. Можете да намерите полезни материали по темата за невронните мрежи в нашата селекция. И разгледайте измамните листове по техните видове: първата и втората част.

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

TensorFlow

TensorFlow е библиотека за машинно обучение с отворен код, създадена от Google. Името помага да се разбере как да се работи с него: тензорите са многомерни масиви, които преминават през възлите на графика.

Всяко изчисление в TensorFlow се представя като графика на потока от данни. Той има два елемента:

  1. Набор tf.Operation, който представлява изчислителни единици.
  2. tf.Tensor, който представлява единици данни.

За да видите как работи всичко това, нека създадем следната графика на потока от данни:

Графика прави x+y

Нека дефинираме x = [1, 3, 6] и y = [1, 1, 1] . Тъй като графиката работи с tf.Tensor за представяне на единици данни, нека създадем постоянни тензори:

Сега нека дефинираме единицата на работа:

Имаме всички елементи на графиката. Време му еизграждане:

Ето как работи работният процес на TensorFlow: първо създавате графика и след това извършвате изчисления, като наистина „пускате“ възлите на графиката с операции. За да направите това, трябва да създадете tf.Session.

Обектът tf.Session капсулира средата, в която обектите Operation се изпълняват и обектите Tensor се оценяват (поне това се казва в документацията). За да направим това, трябва да дефинираме коя графика ще използваме в сесията:

Методът tf.Session.run() се използва за извършване на операции. Той изпълнява една „стъпка“ от изчислението на TensorFlow, като изпълнява необходимия фрагмент от графика, за да изпълни всеки обект Operation и да оцени всеки тензор, предаден в аргумента fetches. В нашия случай се стартира стъпката на операцията за добавяне:

Предсказуем модел

След като вече знаете как работи TensorFlow, трябва да създадете прогнозен модел. Накратко:

Алгоритъм за машинно обучение + Данни = Предсказуем модел

Процесът на изграждане е:

Процесът на създаване на прогнозен модел

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

Работен процес за прогнозиране

Използваме невронни мрежи, за да създадем модел.

Невронни мрежи

Невронната мрежа е изчислителен модел (начин за описване на система с помощта на математически език и неговите принципи). Тази система е по-скоро самообучаваща се и обучавана, отколкото изрично програмирана.

Невронните мрежи имитират човешката централна нервна система. Те имат свързани възли, които са подобни на нашите неврони:

За да разберем как работят невронните мрежи, нека изградим архитектурата на еднаот тях с помощта на TensowFlow. Можете да разгледате пример за такова изпълнение.

Архитектура на невронна мрежа

Нашата невронна мрежа ще има 2 скрити слоя (трябва да изберете колко от тях ще бъдат във вашия модел - това е част от архитектурния дизайн). Задачата на всеки скрит слой е да превърне входа в нещо, което изходният слой може да използва.

Първи скрит слой

Входен слой и първи скрит слой

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

Във входния слой един възел съответства на дума от набора от данни. Нека да разгледаме това малко по-късно.

Както е обяснено в тази статия, всеки възел (неврон) се умножава по тегло, т.е. теглото има значение. По време на обучението невронната мрежа коригира тези показатели, за да произведе правилния резултат. Мрежата също добавя отместване.

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

Има много видове функции за активиране. Използваме пресечена линейна трансформация (ReLu). Тази функция се дефинира, както следва:

f(x) = max(0,x) [изходът е x или 0 (нула), което от двете е по-голямо]

Примери: ако x = −1, тогава f(x) = 0 (нула); ако x = 0,7 тогава f(x) = 0,7.

Втори скрит слой

Вторият скрит слой прави същото като първия, но сега входът е изходът на първия слой:

Първи и втори скрити слоеве

изходен слой

Получаваме, че броят на изходните възли е равен на числотовходни набори от данни.

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

Сега имаме графика на потока от данни на невронна мрежа. Ако преведете всичко в код, ще получите нещо подобно:

Обучение на невронни мрежи

Както показа предишният опит, стойностите на теглата се актуализират, докато мрежата се обучава. Сега нека анализираме процеса в средата TensorFlow.

tf.Променлива

Теглата и отклоненията се съхраняват в tf.Variables, които държат състоянието в графиката между извикванията на run(). При машинното обучение е обичайно да се работи с тегла и отклонения, получени чрез нормално разпределение:

Нека стартираме мрежата за първи път с теглата, получени от нормалното разпределение:

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

Нека направим това с TensorFlow, като използваме метода tf.nn.softmax_cross_entropy_with_logits() (функция за активиране на softmax) и изчислим средната грешка tf.reduced_mean() :

Искаме да намерим най-добрите стойности за тегла и отклонения, за да сведем до минимум грешките в изхода - разликата между получените и правилните стойности. За целта използваме метода на градиентно спускане. И за да бъдем по-точни, тогава стохастичен градиентен низход:

Има много алгоритми за изчисляване на градиентно спускане, ние ще използваме адаптивна оценка на момента. Нека предадем стойността на learning_rate, която определя стъпката на стойностите за намиране на най-доброто тегло.

Методът tf.train.AdamOptimizer(learning_rate).minimize(loss) е синтактична захар,което прави две неща:

Като актуализираме стойностите на всички tf.Variables, не е нужно да предаваме списък с променливи. И сега има код за обучение на мрежата:

Управление на данни

Наборът от данни, който ще използваме (между другото, съдържа много английски текстове), трябва да бъде манипулиран, за да бъде предаден на невронната мрежа. За да го приложите, трябва да направите две неща:

  1. Създайте индекс за всяка дума.
  2. Създайте матрица за всеки текст, където стойността е единица, ако думата е в текста, и нула в противен случай.

Нека да разгледаме кода, за да разберем процеса:

В примера по-горе текстът „Здравей от Бразилия“ доведе до матрицата [ 1. 1. 1.] . Ами ако текстът беше само „Здравей“:

Изпълнение на графиката и получаване на резултата

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

Набор от данни

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

Ето как зареждате своите набори от данни:

Модел обучение

В терминологията на невронната мрежа, една епоха = едно преминаване напред (получаване на изходни стойности) и едно преминаване назад (актуализиране на тегла) на всички примери за обучение.

Помните ли метода tf.Session.run()? Нека го разгледаме по-подробно:

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

Параметърът feed_dict указва къде предаваме данните.всеки етап от работата. Трябва също да дефинирате tf.placeholders, за да попълните feed_dict.

Както се казва в документацията на TensorFlow:

Заместителят е необходим единствено като цел за запълване. Не е инициализирано и не съдържа данни.

Така че ще дефинираме заместители по следния начин:

Нека разделим данните за обучението на блокове според официалния уебсайт:

Ако използвате контейнер за въвеждане, можете да дефинирате размер на променлив блок с tf.placeholder(. shape=[None. ]) . Елементът None указва променливо измерение.

За да тестваме модела, ще попълним речника с голям блок, така че трябва да дефинираме неговото променливо измерение.

Функцията get_batches() показва броя на текстовете заедно с размера на блока. Сега можем да стартираме модела:

Имаме обучен модел. За да го тествате, трябва да създадете графични елементи. Ще измерим точността, трябва да получим индексите на прогнозираната стойност и индекса на правилната стойност, защото използваме унитарно кодиране. След това проверете дали са равни и изчислете средната стойност за целия тестов набор от данни:

Можете да видите крайния код на страницата на GitHub.

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