Дълбокото обучение е технология, която се превърна в съществена част от работните процеси на машинното обучение. Възползвайки се от подобрения на паралелни изчислителни мощности и поддържащи инструменти, сложни и дълбоки невронни мрежи, които някога са били непрактични, сега стават жизнеспособни.
Появата на мощни и достъпни библиотеки като Tensorflow , Факла , и Deeplearning4j също отвори разработка за потребители извън академичните среди и изследователските отдели на големи технологични компании. В свидетелство за нарастващото му разпространение, компании като Huawei и Apple вече включват специални процесори, оптимизирани за задълбочено обучение, в своите най-нови устройства за захранване на приложения за дълбоко обучение.
Дълбокото обучение доказа своята сила в много области. Най-вече Google AlphaGo успя да победи човешки играчи в игра на Go, игра, чиято умопомрачителна сложност някога се смяташе за почти непреодолима бариера пред компютрите в съревнованието му срещу човешките играчи. Проект Flow Machines от Sony разработи невронна мрежа, която може да композира музика в стила на известни музиканти от миналото. FaceID , функция за сигурност, разработена от Apple, използва дълбоко обучение за разпознаване на лицето на потребителя и за проследяване на промените в лицето на потребителя с течение на времето.
В тази статия ще приложим задълбочено обучение към две от любимите ми теми: обработка на естествен език и вино. Ще изградим модел за разбиране на прегледите на естествения език от експерти и ще изведем сорта на виното, което те преглеждат.
Дълбокото обучение се използва широко в обработка на естествен език (NLP), защото е много подходящ за изучаване на сложната основна структура на изречението и семантична близост на различни думи. Например, настоящото състояние на техниката за анализ на настроенията използва дълбоко обучение, за да улови трудно моделируеми лингвистични понятия като отрицания и смесени настроения.
Дълбокото обучение има няколко предимства пред другите алгоритми за НЛП:
Днес ще изградим алгоритъм за задълбочено обучение, за да определим сорта на виното, което се преглежда, въз основа на текста на рецензията. Ще използваме набора от данни за списанието за вино на адрес https://www.kaggle.com/zynicide/wine-reviews което се предоставя от потребителя на Kaggle zackthoutt .
Концептуално въпросът е, можем ли да вземем преглед на виното като ...
Ароматите включват тропически плодове, метла, жупел и сушена билка. Небцето не е прекалено изразително, предлагайки неузрели ябълки, цитрусови плодове и изсушен градински чай заедно с оживена киселинност.
... и да разберете, че става въпрос за бяла смес? Някои ентусиасти на виното може да разпознаят издайническите белези на бели вина като ябълка, цитрусови плодове и подчертана киселинност, но можем ли да обучим нашата невронна мрежа да разпознава тези сигнали? Освен това, можем ли да обучим нашата невронна мрежа да разпознава фините разлики между преглед на бяла смес и преглед на пино гриджио?
Проблемът, с който работим днес, е по същество проблем с класификацията на НЛП. Има няколко алгоритми за класификация на NLP, които са приложени към различни проблеми в NLP. Например, наивен Байес са били използвани в различни алгоритми за откриване на нежелана поща, и поддържащи векторни машини (SVM) са използвани за класифициране на текстове като бележки за напредъка в здравните институции. Би било интересно да се приложи проста версия на тези алгоритми, която да служи като изходна линия за нашия модел за дълбоко обучение.
Популярно изпълнение на наивни Bayes за NLP включва предварителна обработка на текста с помощта на TF-IDF и след това стартиране на многочленни наивни Bayes на предварително обработените изходи. Това позволява алгоритъмът да се изпълнява на най-изявените думи в документа. Можем да приложим наивния Bayes, както следва:
import numpy as np from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import CountVectorizer import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfTransformer df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() varietal_list = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = np.array(varietal_list) count_vect = CountVectorizer() x_train_counts = count_vect.fit_transform(description_list) tfidf_transformer = TfidfTransformer() x_train_tfidf = tfidf_transformer.fit_transform(x_train_counts) train_x, test_x, train_y, test_y = train_test_split(x_train_tfidf, varietal_list, test_size=0.3) clf = MultinomialNB().fit(train_x, train_y) y_score = clf.predict(test_x) n_right = 0 for i in range(len(y_score)): if y_score[i] == test_y[i]: n_right += 1 print('Accuracy: %.2f%%' % ((n_right/float(len(test_y)) * 100)))
Изпълнете горния код и трябва да видите нещо като следното: 73,56%
Като се има предвид, че разглеждаме 10 класа, това е доста добър резултат.
Можем също да използваме машина за поддръжка на вектори и да видим как би се справил. За да видите как се представя, просто заменете дефиницията на класификатора с
clf = SVC(kernel='linear').fit(train_x, train_y)
Изпълнете това и трябва да видите следния изход:
какво мога да направя с ruby on rails
Точност: 80,66%
Не е твърде изтъркан.
Нека видим дали можем да изградим модел за задълбочено обучение, който да надмине или поне да съответства на тези резултати. Ако се справим с това, това би било чудесна индикация, че нашият модел за задълбочено обучение е ефективен поне за възпроизвеждане на резултатите от популярните модели за машинно обучение, информирани от експертизата на домейна.
Днес ще използваме Трудно с Tensorflow за изграждане на нашия модел. Keras е библиотека на Python, която прави изграждането на модели за дълбоко обучение много лесно в сравнение с относително ниското ниво на интерфейса на API на Tensorflow. В допълнение към плътните слоеве, ние също ще използваме вграждащи и конволюционни слоеве, за да научим основната семантична информация на думите и потенциалните структурни модели в данните.
Първо, ще трябва да преструктурираме данните по начин, който може лесно да бъде обработен и разбран от нашата невронна мрежа. Можем да направим това, като заменим думите с уникално идентифициращи числа. В комбинация с вектор за вграждане, ние можем да представим думите по начин, който е едновременно гъвкав и семантично чувствителен.
На практика ще искаме да бъдем малко по-умни по отношение на тази предварителна обработка. Би имало смисъл да се съсредоточим върху често използваните думи и също така да филтрираме най-често използваните думи (напр. The, this, a).
Можем да приложим тази функционалност, като използваме Defaultdict и NLTK. Напишете следния код в отделен модул Python. Поставих го в lib/get_top_x_words.py
.
from nltk import word_tokenize from collections import defaultdict def count_top_x_words(corpus, top_x, skip_top_n): count = defaultdict(lambda: 0) for c in corpus: for w in word_tokenize(c): count[w] += 1 count_tuples = sorted([(w, c) for w, c in count.items()], key=lambda x: x[1], reverse=True) return [i[0] for i in count_tuples[skip_top_n: skip_top_n + top_x]] def replace_top_x_words_with_vectors(corpus, top_x): topx_dict = {top_x[i]: i for i in range(len(top_x))} return [ [topx_dict[w] for w in word_tokenize(s) if w in topx_dict] for s in corpus ], topx_dict def filter_to_top_x(corpus, n_top, skip_n_top=0): top_x = count_top_x_words(corpus, n_top, skip_n_top) return replace_top_x_words_with_vectors(corpus, top_x)
Сега сме готови да изградим модела. Искаме слой за вграждане, конволюционен слой и плътен слой, за да се възползваме от всички функции за дълбоко обучение, които могат да бъдат полезни за нашето приложение. С Keras можем да изградим модела много просто:
from keras.models import Sequential from keras.layers import Dense, Conv1D, Flatten from keras.layers.embeddings import Embedding from keras.preprocessing import sequence from keras.utils import to_categorical import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from lib.get_top_xwords import filter_to_top_x df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() mapped_list, word_list = filter_to_top_x(description_list, 2500, 10) varietal_list_o = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = to_categorical(varietal_list_o) max_review_length = 150 mapped_list = sequence.pad_sequences(mapped_list, maxlen=max_review_length) train_x, test_x, train_y, test_y = train_test_split(mapped_list, varietal_list, test_size=0.3) max_review_length = 150 embedding_vector_length = 64 model = Sequential() model.add(Embedding(2500, embedding_vector_length, input_length=max_review_length)) model.add(Conv1D(50, 5)) model.add(Flatten()) model.add(Dense(100, activation='relu')) model.add(Dense(max(varietal_list_o) + 1, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(train_x, train_y, epochs=3, batch_size=64) y_score = model.predict(test_x) y_score = [[1 if i == max(sc) else 0 for i in sc] for sc in y_score] n_right = 0 for i in range(len(y_score)): if all(y_score[i][j] == test_y[i][j] for j in range(len(y_score[i]))): n_right += 1 print('Accuracy: %.2f%%' % ((n_right/float(len(test_y)) * 100)))
Изпълнете кода и трябва да видите следния изход.
Точност: 77,20%
Спомнете си, че точността на наивните Bayes и SVC беше съответно 73,56% и 80,66%. Така че нашата невронна мрежа се държи много против някои от най-често срещаните методи за класификация на текста там.
Днес разгледахме изграждането на класификационен модел за задълбочено обучение, за да анализираме отзиви за вино.
Установихме, че успяхме да изградим модел, който е в състояние да се конкурира и да надмине някои от другите алгоритми за машинно обучение. Надяваме се, че сте вдъхновени да използвате тази информация за изграждане на приложения, които анализират по-сложни набори от данни и генерират по-сложни резултати!
Забележка: Можете да намерите кода, който използвах за тази статия GitHub .
Обработката на естествен език е гамата от изчислителни техники, използвани за анализ или създаване на човешки език и реч.