Дані рядка розбору нейронної мережі?


28

Отже, я тільки починаю дізнаватися, як нейронна мережа може діяти для розпізнавання шаблонів і категоризації входів, і я бачила, як штучна нейронна мережа може розбирати дані зображення та класифікувати зображення ( демонстрацію з convnetjs ) та ключ там полягає в тому, щоб зменшити вибірку зображення, і кожен піксель стимулює один вхідний нейрон в мережу.

Однак я намагаюся обернути голову, якщо це можливо зробити за допомогою рядкових входів? Випадок використання, який я отримав, - це "механізм рекомендацій" для фільмів, які користувач переглянув. У фільмах є багато рядкових даних (назва, сюжет, теги), і я міг би уявити, як "зменшити розмір" тексту до кількох ключових слів, які описують цей фільм, але навіть якщо я розбираю п’ять перших слів, які описують цей фільм, я думаю, мені потрібні вхідні нейрони для кожного англійського слова, щоб порівняти набір фільмів? Я міг би обмежити вхідні нейрони лише словами, що використовуються в наборі, але чи міг би він рости / навчатися, додаючи нові фільми (користувач дивиться новий фільм, з новими словами)? Більшість бібліотек, які я бачив, не дозволяють додавати нові нейрони після навчання системи?

Чи є стандартний спосіб відображення даних рядка / слова / символів на входи в нейронну мережу? Або нейронна мережа насправді не є правильним інструментом для розбору подібних рядкових даних (який кращий інструмент для відповідності шаблонів у рядкових даних)?

Відповіді:


19

Використання нейронної мережі для прогнозування природних мовних даних може бути складним завданням, але існують перевірені і справжні методи, що дозволяють зробити це можливим.

У полі "Обробка природних мов" (НЛП) текст часто представляється за допомогою моделі мішок слів. Іншими словами, у вас вектор довжини n , де n - кількість слів у вашому словнику, а кожному слову відповідає елемент у векторі. Для того, щоб перетворити текст у числові дані, ви просто підраховуєте кількість входів кожного слова та розміщуєте це значення в індексі вектора, що відповідає слову. Вікіпедія чудово справляється з описом цього процесу перетворення. Оскільки довжина вектора є фіксованою, важко впоратися з новими словами, які не відображаються в індексі, але є способи полегшити цю проблему ( хешування функції пошуку ).

Цей спосіб представлення має багато недоліків - він не зберігає зв’язок між сусідніми словами, і призводить до дуже рідких векторів. Перегляд n-грамів допомагає виправити проблему збереження співвідношень слів, але поки зосередимось на другій проблемі, розрідженості.

Важко мати справу з цими розрідженими векторами (багато лінійних бібліотек алгебри роблять погану роботу з поводженням з обмеженими входами), тому часто наступним кроком є ​​зменшення розмірності. Для цього ми можемо звернутися до області моделювання тем : Такі методи, як розподіл латентного Діріхле (LDA) та латентний семантичний аналіз (LSA), дозволяють стиснути ці розріджені вектори в щільні вектори, представляючи документ у вигляді комбінації тем. Ви можете зафіксувати кількість використовуваних тем і, тим самим, зафіксувати розмір вихідного вектора, виробленого LDA або LSA. Цей процес зменшення розмірності різко зменшує розмір вхідного вектора, намагаючись втратити мінімальну кількість інформації.

Нарешті, після всіх цих перетворень, ви можете подати результати результатів моделювання теми на входи вашої нейронної мережі.


1
Повідомте мене, якщо у вас є додаткові запитання, і я зроблю все можливе, щоб надати ще детальну інформацію.
Медісон, травень

Дякую, що це дає мені чудові умови, щоб продовжувати досліджувати!
опівночіЗасвітлення

Між іншим, я можу сказати про "хешування функції", оскільки це здається дуже схожим на фільтр розквітання , який я знайомий з роботи з кодом криптовалюти. Цікаво, чи ефективніше хеш-функція співвідносити функцію введення з декількома позиціями індексу (стиль цвітіння-фільтр), а не потрібна друга хеш-функція для встановлення знаку індексу ...
MidnightLightning

6

І відповіді від @Emre та @Madison May можуть зробити хороші моменти щодо проблеми. Проблема полягає в тому, щоб представити рядок як вектор функції для введення в NN.

По-перше, проблема залежить від розміру рядка, який ви хочете обробити. Довгі рядки, що містять лексеми можуть (зазвичай слова), часто називаються документами в цьому налаштуванні. Існують окремі методи поводження з окремими лексемами / словами.

Існує ряд способів подання документів. Багато з них роблять припущення про сумні слова . Найпростіші типи представляють документ у вигляді вектору відліків слів або термінальної частоти (tf). Для усунення наслідків довжини документа зазвичай люди вважають за краще нормалізувати кількість документів, у яких відображається термін, частота документа ( tf-idf ).

Інший підхід - моделювання тем, в якому вивчається приховане нижньомірне представлення даних. LDA та LSI / LSA - типовий вибір, але важливо пам’ятати, що це не контролюється. Вивчене представництво не обов'язково буде ідеальним для того, що б ви контролювали навчання, яке ви робите зі своїм NN. Якщо ви хочете займатися моделюванням тем, ви можете також спробувати моделі, що контролюються .

Для окремих слів можна використовувати word2vec , який використовує NN для вбудовування слів у простір довільного розміру. Подібність двох векторів слів у цьому вивченому просторі, як правило, відповідає семантичній подібності.

Останнім піонерським підходом є такий у векторах абзацу , який спочатку вивчає модель слова, схожу на word2vec, а потім будує на цьому поданні, щоб вивчити розподілене подання наборів слів (документів будь-якого розміру). Це показало найсучасніші результати у багатьох програмах.

Використовуючи NN в NLP, люди часто використовують різні архітектури, наприклад, періодичні нейронні мережі (наприклад, мережі довготривалої пам'яті ). В деяких випадках люди навіть використовували конволюційні нейронні мережі в тексті.


Я думаю, що word2Vec - це справді найточніша відповідь на питання. Існує дуже хороший підручник Kaggle про те, як тренувати та використовувати його: kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner

Дякую, я забув посилання word2vec, додам ще одне (крім того, яке ви тут перераховуєте!)
jamesmf

3

Це не проблема нейронних мереж як такої, а представлення текстуальних даних у машинному навчанні. Ви можете представляти фільми, фільми та теми як категоричні змінні. Сюжет складніший; Ви, мабуть, хочете тематичну модель для цього, але я покину це, поки ви не причепите речі. Це робиться саме тим текстовим "пониженням", яке ви згадали.

Погляньте на цей підручник, щоб дізнатися, як кодувати категоричні змінні для нейронних мереж. І удачі!


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

Яке машинне навчання не використовує функції?
Емре

Випадковий ліс - хороший приклад того, для чого отримання особливих векторів такого типу, які ви бачите в нейронних мережах, не є проблемою. Дуже багато непідконтрольних методів також працюють над «сировинними словами», а не за допомогою векторів. Примітка. Я не сказав, що існують методи, які не використовують функції, лише існують методи, які не покладаються на строго структуровані вектори.
Слейтер Вікторофф

Я не знаю, що ви маєте на увазі під "суворо структурованою".
Емре

суворо структурований - 1-й вектор unint8's на відміну від списку, що містить словник, вагову матрицю та ряд рядків
Slater Victoroff

0

Я спробував наступні два способи пробної n-тестової реалізації нейронних мереж з текстом. Останній працює досить добре, але з обмеженнями.

  1. Створіть словниковий запас, використовуючи word2vect або NLTK / користувацькі лексеми слова та призначте індекс кожному слову. Саме цей індекс представляє слово як число.

    Виклики:

    • Індекси повинні бути "нормалізовані" за допомогою масштабування функцій.
    • Якщо вихід нейронної мережі має навіть незначну зміну, то вихід може бути індексом несподіваного слова (наприклад, якщо очікуваний вихід становить 250; але NN виводить 249 або 251, то це може бути близький вихід з числового контексту; але вони є покажчиками до різних слів). Тут можна скористатись повторним NN для генерування вихідного індексу.
    • Якщо до словника додаються нові слова, то індекси лексем слід повторно масштабувати. Модель, навчена попередньо масштабованими значеннями, може стати недійсною і повинна бути перепідготовлена.
  2. Використовуйте матрицю ідентичності, наприклад для "n" слів використовуйте матрицю "nx n" або (n-1 x n-1), де кожен рядок і стовпець являє собою слово. Поставте "1" в клітинку перетину і "0" в місцях відпочинку. ( довідник )

    Виклики:

    • Кожне значення вводу та виводу - вектор "nx 1". Для словника великого розміру його об'ємні обчислення і повільніше.
    • Якщо до словника додаються нові слова, то матрицю ідентичності (тобто вектор слова) слід перерахувати. Модель, що навчається з попередньо обчисленими векторами, може стати недійсною і повинна бути перепідготовлена.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.