Краткое изложение обработки естественного языка

искусственный интеллект

Базовые знания

контролируемое обучение

Более конкретно:

one-hot representation

представление слова

Элемент, соответствующий слову, равен 1, остальные элементы вектора равны 0, а размерность вектора равна количеству слов в тезаурусе.

  • Все векторы ортогональны друг другу, мы не можем эффективно выразить сходство между двумя векторами
  • Слишком большой размер вектора.

модель мешка слов

Мешок слов (Bag of Words, сокращенно BoW). Модель мешка слов предполагает, что мы не рассматриваем контекстуальные отношения между словами в тексте, а учитываем только веса всех слов. Вес зависит от того, как часто слово встречается в тексте.

Модель мешка слов сначала выполнит сегментацию слов. После сегментации слов, подсчитав, сколько раз каждое слово появляется в тексте, мы можем получить характеристики текста на основе слов. Если слова каждого образца текста соединить вместе с соответствующую частоту слов, которую мы часто называем векторизацией. После того, как векторизация завершена, TF-IDF обычно используется для корректировки веса признаков, а затем признаки стандартизируются. После некоторой дополнительной разработки функций данные могут быть введены в алгоритм машинного обучения для классификации и кластеризации.

Обобщите трилогию модели мешка слов: токенизация, статистическая проверка значения признака слова (подсчет) и нормализация.

Моделью, очень похожей на модель мешка слов, является модель набора слов (SoW). Единственное отличие от модели мешка слов заключается в том, что она учитывает только то, появляются ли слова в тексте, а не частоту слов. То есть обработка признаков слова, встречающегося в тексте один и несколько раз, одинакова. В большинстве случаев мы используем модель мешка слов, и последующее обсуждение также основано на модели мешка слов.

Конечно, у модели мешка слов есть большие ограничения, потому что она учитывает только частотность слов и не учитывает контекстную связь, поэтому она потеряет семантику части текста. Но в большинстве случаев, если нашей целью является категориальная кластеризация, модель мешка слов работает хорошо.

Следующее использует CountVectorizer sklearn для реализации модели набора слов и модели мешка слов соответственно.

код модели набора слов

from sklearn.feature_extraction.text import CountVectorizer
import seaborn as sns
import matplotlib.pyplot as plt

corpus = ['Time flies flies like an arrow.',
          'Fruit flies like a banana.']

vocab = set([word for sen in corpus for word in sen.split(" ")])

one_hot_vectorizer = CountVectorizer(binary=True)
one_hot = one_hot_vectorizer.fit_transform(corpus).toarray()

print(one_hot_vectorizer.vocabulary_)
print(one_hot)

sns.heatmap(one_hot, annot=True,cbar=False, xticklabels=vocab, yticklabels=['Sentence 2'])
plt.show()

Выходной результат:

{'time': 6, 'flies': 3, 'like': 5, 'an': 0, 'arrow': 1, 'fruit': 4, 'banana': 2}
[[1 1 0 1 0 1 1]
 [0 0 1 1 1 1 0]]

пакет слов кода

Если установлено значение False, то также будет включена информация о частоте слов, которая представляет собой модель мешка слов. Результат выглядит следующим образом:

{'time': 6, 'flies': 3, 'like': 5, 'an': 0, 'arrow': 1, 'fruit': 4, 'banana': 2}
[[1 1 0 2 0 1 1]
 [0 0 1 1 1 1 0]]

Hash Trick

При крупномасштабной обработке текста, поскольку размер признака соответствует размеру словаря сегментации слова, размер может быть очень страшным.В настоящее время требуется уменьшение размера, и метод векторизации нельзя использовать напрямую. Наиболее часто используемый метод уменьшения размерности текста — это Hash Trick.

Мы не знаем названия и значения этой функции после уменьшения размерности Hash Trick, поэтому объяснительная сила Hash Trick невелика.

TF-IDF

TF-IDF (термин частотно-обратная частота документа, термин частотно-обратная частота документа) является широко используемым методом взвешивания для поиска информации (информационного поиска) и интеллектуального анализа текста (интеллектуального анализа текста). Важность слова увеличивается пропорционально количеству раз, которое оно встречается в документе, но уменьшается обратно пропорционально частоте его появления в корпусе.

TF - частота терминов (Term Frequency)Частота терминов (TF) представляет собой частоту появления терминов (ключевых слов) в тексте. Это число обычно нормализовано (обычно частота слов делится на общее количество слов в статье), чтобы предотвратить перекос в сторону длинных файлов.

IDF — обратная частота документаОбратная частота документов (IDF): общее количество документов, деленное на количество документов, содержащих термин, и полученное частное берется логарифмически. Редкие слова имеют высокие IDF, а высокочастотные слова имеют низкие IDF.

TF-IDF на самом деле: TF*IDF

применение

  • Ключевые слова: после вычисления значения TF-IDF для каждого слова в статье отсортируйте его и выберите слова с наивысшими значениями в качестве ключевых слов.
  • Сходство статей: вычислить ключевые слова каждой статьи, выбрать одинаковое количество ключевых слов из каждой, объединить их в набор, вычислить частоту слов каждой статьи для слов в этом наборе и сгенерировать соответствующие векторы частоты слов двух статьи , а затем получить косинусное сходство двух векторов через евклидово расстояние или косинусное расстояние Чем больше значение, тем больше оно похоже.

Рассчитать tfidf с помощью sklearn

from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer,TfidfVectorizer
from pprint import pprint
import seaborn as sns
from matplotlib.pylab import plt

corpus = ['Time flies flies like an arrow.',
          'Fruit flies like a banana.']

one_hot_vectorizer = CountVectorizer()
one_hot = one_hot_vectorizer.fit_transform(corpus).toarray()

pprint(one_hot) #输出词频

transformer = TfidfTransformer()
tfidf = transformer.fit_transform(one_hot)

vocab = one_hot_vectorizer.get_feature_names()

print(vocab) #打印词典
pprint(transformer.idf_ ) #输出逆文档频率
pprint(tfidf.toarray()) #输出TFIDF

sns.heatmap(tfidf.toarray(), annot=True, cbar=False, xticklabels=vocab,
            yticklabels= ['Sentence 1', 'Sentence 2'])

plt.show()

Результат выглядит следующим образом:

array([[1, 1, 0, 2, 0, 1, 1],
       [0, 0, 1, 1, 1, 1, 0]], dtype=int64)
['an', 'arrow', 'banana', 'flies', 'fruit', 'like', 'time']
array([1.40546511, 1.40546511, 1.40546511, 1.        , 1.40546511,
       1.        , 1.40546511])
array([[0.42519636, 0.42519636, 0.        , 0.60506143, 0.        ,
        0.30253071, 0.42519636],
       [0.        , 0.        , 0.57615236, 0.40993715, 0.57615236,
        0.40993715, 0.        ]])

Простая проверка

Возьмите частоту слов документа 1 как TF, и формула для расчета IDF будет

вn_{d}общее количество документов,df(d,t)– количество документов, содержащих термин t. Сначала по словарю подсчитывается количество документов, содержащих слово t. Затем рассчитывается и нормализуется TFIDF.

import numpy as np
tf = np.array([1, 1, 0, 2, 0, 1, 1])
x = np.array([1, 1, 1, 2, 1, 2, 1])

idf = np.log(3/(1+x))+1

print(idf)
tfidf = tf * idf
print(tfidf / np.linalg.norm(tfidf))

Результат выглядит следующим образом:

[1.40546511 1.40546511 1.40546511 1.         1.40546511 1.
 1.40546511]
[0.42519636 0.42519636 0.         0.60506143 0.         0.30253071
 0.42519636]

В реальном использовании это также можно сделать за один шаг:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf2 = TfidfVectorizer()
result = tfidf2.fit_transform(corpus)
print(result)

несколько вопросов

  • Почему размер idf всегда ограничен?
  • Каково значение IDF терминов, встречающихся во всех документах?
  • Может ли вес термина tfidf превышать 1?
  • Какое влияние лог-база idf оказывает на tfidf?
  • Дано простое приближение к idf, предполагая, что idf является основанием 2.

Векторная космическая модель (VSM)

Документы могут быть представлены в виде векторов с использованием TF-IDF, где каждый компонент представляет термин, но это представление игнорирует относительный порядок слов. Представление различных документов с помощью векторов называется моделью векторного пространства. Тогда сходство документов может быть выражено как косинусное сходство:

Другие функции расстояния:

  • Евклидово расстояние
d = \sqrt{\sum_{i=1}^{n}(x_{i}-y_{i})^{2}}
  • Манхэттенское расстояние
d = \sum_{i=1}^{n}|x_{i}-y_{i}|

Расчет сходства и оптимизация Topk

тематическая модель

В области традиционного поиска информации на самом деле существует множество методов измерения сходства документов, таких как классическая модель VSM. Однако эти методы часто основаны на основном предположении: чем больше слов повторяется в документах, тем выше вероятность их сходства. На практике это не всегда так. Во многих случаях степень родства зависит от семантической связи, стоящей за ней, а не от очевидного повторения слов. Например: Имея два предложения, мы хотим знать, связаны ли они между собой:

   Первый был: «Джобс покинул нас».

   Второй: «Упадут ли цены на яблоки?»

Хотя между этими двумя предложениями нет общих слов, они все же очень связаны.

тематическая модель, как следует из названия, представляет собой метод моделирования неявной темы в тексте.темаЭто условное распределение вероятностей слов в словаре. Чем теснее связана тема, тем выше ее условная вероятность, и наоборот.

Тематическая модель использует большое количество известных матриц «слово-документ» и посредством серии тренировок выводит правильную матрицу «слово-тема» Φ и матрицу «тема-документ» Θ.

тематическая модельпреимущество:

1) Он может измерять семантическое сходство между документами. Для документа найденное нами распределение тем можно рассматривать как его абстрактное представление. Для распределения вероятностей мы можем рассчитать семантическое расстояние двух документов с помощью некоторых формул расстояния (например, расстояния KL), чтобы получить сходство между ними.

2) Это может решить проблему полисемии. Вспомните первый пример: «яблоко» может быть фруктом или относиться к яблочной компании. Благодаря полученному нами распределению вероятностей «слово-тема» мы можем узнать, к каким темам относится «яблоко», и мы можем вычислить сходство между ним и другими словами посредством сопоставления тем.

3) Это может исключить влияние шума в документе. Вообще говоря, шумы в документах имеют тенденцию быть во второстепенных темах, мы можем игнорировать их и оставить в документе только основные темы.

4) Работает без присмотра и полностью автоматизирован. Нам нужно только предоставить учебные документы, и он может автоматически обучать различные вероятности без какого-либо ручного процесса маркировки.

5) Не зависит от языка. Любой язык можно обучить, чтобы получить свое тематическое распределение, если он может его сегментировать.

Вывод обучения тематической моделиСуществует два основных метода: pLSA (вероятностный латентный семантический анализ) и LDA (латентное распределение Дирихле). pLSA в основном использует алгоритм EM (максимизация ожидания), LDA использует метод выборки Гиббса.

pLSA

Метод, используемый pLSA, называется алгоритмом EM (максимизация ожидания), который состоит из двух итерационных процессов: процесса E (ожидания) и процесса M (максимизации).

LDA

LDA использует модель мешка слов. Так называемая модель мешка слов — это документ, в котором мы рассматриваем только то, появляется ли слово, независимо от того, в каком порядке оно появляется. В модели мешка слов «ты мне нравишься» и «я тебе нравлюсь» эквивалентны. Противоположностью модели мешка слов является n-грамма, учитывающая порядок появления слов. LDA (латентное распределение Дирихле) — это модель генерации темы документа, также известная как трехуровневая байесовская вероятностная модель, которая включает трехслойную структуру слов, тем и документов. Так называемая генеративная модель означает, что каждое слово статьи получается в процессе «выбора темы с определенной вероятностью и выбора слова из этой темы с определенной вероятностью». Документы в темы следуют полиномиальному распределению, а темы в слова следуют полиномиальному распределению.

SVD

LSA

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.pipeline import Pipeline
documents = ["doc1.txt", "doc2.txt", "doc3.txt"] 
  
# raw documents to tf-idf matrix: 
vectorizer = TfidfVectorizer(stop_words='english', 
                             use_idf=True, 
                             smooth_idf=True)
# SVD to reduce dimensionality: 
svd_model = TruncatedSVD(n_components=100,         // num dimensions
                         algorithm='randomized',
                         n_iter=10)
# pipeline of tf-idf + SVD, fit to and applied to documents:
svd_transformer = Pipeline([('tfidf', vectorizer), 
                            ('svd', svd_model)])
svd_matrix = svd_transformer.fit_transform(documents)

NMF

разработка функций

Разработка признаков в основном включает сегментацию слов, лемматизацию, удаление стоп-слов и т. д. Эта часть китайского отличается от английского. Это в основном на китайском языке.

Категоризация текста

Индикатор классификации

TP, FP, FN, TN можно понимать как

  • ТП: Прогноз равен 1, фактически равен 1, прогноз верен.
  • FP: Прогнозируемый 1, фактический 0, неверный прогноз.
  • FN: Прогнозируемый 0, фактический 1, неправильный прогноз.
  • TN: Предсказание равно 0, фактическое значение равно 0, предсказание верно.

Точность

Определение Точности, то есть процент правильных результатов в общей выборке

В случае несбалансированных выборок это не лучший показатель для измерения результатов.

точность

Точность предназначена для результатов прогнозирования, и ее значением является вероятность того, что это действительно положительный образец среди всех образцов, которые, по прогнозам, будут положительными.Выражение:

отзывать

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

Оценка F1

F1-Оценка. Оценка F1 учитывает как скорость точности, так и скорость отзыва, так что они могут одновременно достичь самого высокого уровня и достичь баланса. Оценка F1 выражается как

Roc, кривая AUC

Истинный положительный показатель TPR и ложноположительный показатель FPR определяются как:

\text{TPR} = \frac{\text{TP}}{\text{TP} + \text{FN}} \\ \text{FPR} = \frac{\text{FP}}{\text{FP} + \text{TN}}

График кривой ROC показан ниже, где абсцисса — это частота ложных срабатываний (FPR), а ордината — истинная частота (TPR).

AUC (площадь под кривой) представляет собой площадь под кривой в ROC, которая используется для оценки качества модели. Как показано на кривой ROC, площадь соединительной диагональной линии составляет ровно 0,5. Значение диагональной линии — это результат прогнозирования случайного суждения, а охват положительных и отрицательных выборок должен составлять 50%. Кроме того, чем круче кривая ROC, тем лучше, поэтому идеальное значение равно 1, то есть квадрату. Таким образом, значение AUC обычно находится в диапазоне от 0,5 до 1.

Вероятностная интерпретация AUC: случайным образом взять пару положительных и отрицательных образцов и определить вероятность того, что оценка положительного образца больше, чем у отрицательного образца. AUC не зависит от доли положительных и отрицательных образцов, поэтому его часто используют в качестве критерия оценки модели для несбалансированных наборов данных.

Критерии оценки AUC можно назвать следующими:

  • 0,5-0,7: Менее эффективен.
  • 0,7-0,85: Эффект средний.
  • 0,85–0,95: работает хорошо.
  • 0,95-1: Эффект очень хороший.

Focal Loss

TextCNN

Бумажные сверточные нейронные сети для классификации предложений

Реализация Кераса

TextRNN

Бумажная рекуррентная нейронная сеть для классификации текста с многозадачным обучением

Реализация Кераса

RCNN

Бумажные рекуррентные сверточные нейронные сети для классификации текста Реализация Кераса

HAN

Бумага: Иерархические сети внимания для классификации документов

HAN в основном нацелен на классификацию на уровне документа.Во-первых, он выполняет кодирование BiGRU для каждого слова в предложении, затем соединяется с вниманием, затем выполняет кодирование BiGRU на уровне предложения, затем соединяется с вниманием и, наконец, выполняет классификацию.

Реализация Кераса

Sequence Labeling

HMM

Условное случайное поле CRF

расшифровка Витерби

языковая модель

Учитывая словарь V, предложение можно рассматривать как последовательность словx_1 x_2 … x_n (x_i \in V) Запишите вероятность появления предложения в видеp(x_1, x_2, … x_n), такое совместное распределение вероятностей является языковой моделью. Словарный запас языка очень велик, например, словарный запас китайского языка составляет порядка 100 000 слов. Вышеупомянутое совместное распределение имеет|V|^nТакая величина, такая модель большая и разреженная, что неудобно подсчитывать. Чтобы сделать языковую модель более компактной, можно ввести предположение Маркова.

Модель языка Ngram

Сначала разложите совместное распределение на произведение условных вероятностей:

p(x_1, x_2, … x_n)
= p(x_1) p(x_2|x_1) p(x_3|x_1, x_2) ... p(x_n|x_1, x_2, ..., x_{n-1})

В этих условных вероятностях вероятность каждого слова должна учитывать все слова перед ним Фактически, два слова, которые находятся слишком далеко друг от друга, слабо связаны. Гипотеза Маркова относится к предположению, что вероятность появления каждого слова связана только с несколькими словами, предшествующими ему.

Когда n = 1, модель униграммы:

Когда n = 2, модель биграммы:

При n=3 модель триграммы

недоумение

Недоумение обычно используется для оценки качества языковых моделей. Основная идея недоумения такова: языковая модель, которая присваивает более высокое значение вероятности предложениям в тестовом наборе, лучше После того, как языковая модель обучена, предложения в тестовом наборе являются нормальными предложениями, тогда обученная модель находится в Чем выше вероятность на тестовом наборе, тем лучше, формула выглядит следующим образом:

После логарифмирования:

PPL=\sqrt[n]{\frac{1}{P(w_1,w_2,...,w_N)}}\\=e^{\frac{1}{N}ln\frac{1}{P(w_1,w_2,...,w_N)}}\\=e^{-\frac{1}{N}\sum_{i=1}^NlnP(w_i)}
  • В лучшем случае модель всегда предсказывает вероятность категории метки как 1, а недоумение равно 1;
  • В худшем случае модель всегда предсказывает вероятность категории метки как 0, а недоумение равно положительной бесконечности;
  • В базовом случае модель всегда предсказывает все классы с одинаковой вероятностью, а недоумение — это количество классов.

Очевидно, что недоумение любой действительной модели должно быть меньше, чем количество категорий. В языковой модели недоумение должно быть меньше размера словаря vocab_size.

Seq2seq

Как следует из названия, модель Seq2Seq вводит последовательность, кодирует ее в вектор u с помощью RNN (кодировщик) и декодирует ее в выходную последовательность с помощью другого RNN (декодера), а длина выходной последовательности является переменной.

Форсирование учителя используется на этапе обучения, чтобы предотвратить распространение ошибок из предыдущего момента на этот момент. Использование форсирования учителей может блокировать накопление ошибок, корректировать обучение модели и ускорять сходимость параметров.

После того, как модель обучена, на этапе тестирования вы не можете использовать форсирование учителей, потому что ожидаемая последовательность вывода не может быть видна на этапе тестирования, поэтому вы должны подождать, чтобы вывести слово в предыдущий момент, а затем вы можете определить, что делать. ввод в следующий момент.

Beam Search

Поиск луча — это параметр, который полезен только на этапе тестирования. Когда предыдущая версия seq2seq выводит последовательность, в каждый момент времени в качестве выходного слова в этот момент (эквивалентно локальному оптимальному решению) выбирается только слово с вероятностью 1, а затем эти слова объединяются для получения окончательного вывода. последовательность. На самом деле это жадная стратегия.

Но если используется поиск по лучу, слова из топ-К будут выбираться в качестве вывода этого момента в каждый момент, и они будут использоваться в качестве ввода следующего момента один за другим для участия в предсказании следующего момента, а затем из этого размера K * L (L — список словарного запаса) выберите верхний K в качестве вывода в следующий момент и так далее. В последний момент в качестве окончательного результата выбирается топ 1. По сути, это стратегия глубокого поиска после обрезки.

Sequence Loss

На самом деле вычисление потерь на "_PAD" бесполезно, потому что сам "_PAD" не имеет смысла, и декодер не должен выводить этот символ. Поэтому вам нужно умножить потери на матрицу маски, которая может отфильтровать потери в позиции «_PAD».

Attention

Механизм внимания в Seq2Seq

Краткое описание функции оценки внимания

Transformer

В этой части в основном описываются учебные программы г-на Ли Хунъи. Давайте сначала рассмотрим традиционную модель Seq2Seq.

  • RNN: Сложно распараллелить, есть проблема долговременной зависимости
  • CNN: лежащей в основе CNN трудно увидеть удаленную информацию.

Само-внимание может заменить CNN и RNN, а также является моделью Seq.

Для расчета собственного внимания ввод x линейно преобразуется для получения q, k, v.

Затем Q и K производят скалярное произведение, чтобы получить матрицу внимания.

Выполнить нормализацию softmax

Затем вычислите произведение внимания и V, чтобы получить результат.

Векторизация процесса внимания

Внимание с несколькими головками, сначала разделите вход, выполните внимание, а затем отключите вывод.

код местоположения

Норма слоя и остаточные соединения

BERT

Контекстное встраивание слов (динамическое встраивание слов)

ELMo: многослойная двунаправленная RNN, использующая выходные данные RNN в качестве динамического вектора слов, соединяющая вперед и назад и добавляющая веса в разных слоях.

BERT

другие знания

  • дискриминационная модель: KNN, SVM, дерево решений, перцептрон, линейный дискриминантный анализ (LDA), LR (линейная регрессия, логистическая регрессия), нейронная сеть, CRF (условное случайное поле), бустинг;генеративная модель: Наивный байесовский метод, HMM, GMM (модель гауссовой смеси), модель генерации тематических документов (LDA), ограниченная машина Больцмана

  • Функция raw_input была удалена в Python3. Используйте функцию ввода, чтобы получить пользовательский ввод.

  • Неизменяемые объекты: числа, строки, кортежи (tuple) Изменяемые объекты: списки, словари. Неизменяемые объекты — это объекты, которые не могут быть изменены их ссылками.

  • Бэггинг — это интеграция многих отдельно обученных машин обучения; отсев — это интеграция многих отдельно обученных подсетей, а некоторые веса являются общими. Бустирование не обучается отдельно, а обучается в определенном порядке, со взаимными зависимостями. Стекирование — это обучение, выполняемое двумя уровнями обучающихся машин.

  • Разница между бэггингом и бустингом: 1) Выборка выборки: бэггинг: тренировочный набор выбирается с заменой в исходном наборе, и каждый раунд тренировочных наборов, выбранных из исходного набора, независим. Повышение: тренировочный набор каждого раунда неизменен, но меняется вес каждого примера в тренировочном наборе в классификаторе. Веса корректируются в соответствии с результатами классификации предыдущего раунда. 2) Вес образца: Упаковка в мешки: используйте равномерную выборку, и все образцы имеют одинаковый вес. Повышение: постоянно регулируйте вес образца в соответствии с частотой ошибок, чем больше частота ошибок, тем больше вес. 3) Функции прогнозирования: Бэггинг: Все функции прогнозирования имеют одинаковые веса. Повышение: каждый слабый классификатор имеет соответствующий вес, а классификатор с небольшой ошибкой классификации будет иметь больший вес. 4) Параллельные вычисления: Бэггинг: каждая функция прогнозирования может генерироваться параллельно. Повышение: каждая функция прогнозирования может генерироваться только последовательно, поскольку для последних параметров модели требуются результаты предыдущего раунда моделей.

QA

  1. Зачем Transformer нужно позиционное кодирование и нужно ли это CNN?

Если информация о положении не добавлена, модель Transformer не имеет возможности фиксировать последовательные последовательности, а это означает, что независимо от того, насколько структура предложения нарушена, Transformer получит аналогичные результаты. Другими словами, Transformer — это просто более мощная модель набора слов. Поскольку RNN представляет собой структуру линейной последовательности, в ней естественно кодировать информацию о положении; ядро ​​свертки CNN может сохранять относительное положение между признаками.

  1. Какая польза от остаточной структуры Transformer?

  1. Зачем вам Multi-Head Attention?

Если вход рассматривается как совокупность многомерной информации, многоголовое внимание эквивалентно ансамблю n различных само-вниманий; если вход рассматривается как единое целое, то он относится к разным частям вектора. .

  1. Формула собственного внимания, почему она должна быть разделена на квадратный корень из d?
(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V

Чтобы результат не был слишком большим, он будет разделен по шкале

  1. LSTM, структура GRU и расчет параметров

  2. Умирающий Релу Феномен Dying Relu означает, что когда Relu используется в качестве функции активации, смещение определенного слоя получает большое отрицательное значение из-за большой скорости обучения или по некоторым причинам, так что слой имеет большое отрицательное значение после прохождения активации Relu. Выход всегда равен 0. При входе в это состояние практически невозможно вернуться в нормальное состояние. Потому что при возврате значение 0 приводит к тому, что градиент также равен 0.

  3. CRF и HMM?

  4. L2 обычный и L1 обычный? Почему L1 разреженный?

  5. Закон больших чисел и центральная предельная теорема?

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

  1. Инверсия матрицы?
  2. Разложение СВД?
  3. метод кластеризации?
  4. Расчет условной вероятности?
  5. Отбор проб пруда?

Описание проблемы: когда память не может загрузить все данные, как случайным образом выбрать k данных из потока данных, содержащего неизвестный размер, и гарантировать, что вероятность извлечения всех данных одинакова.

простой алгоритм выборкиЭто случайный выбор k элементов из фиксированных n элементов, так что вероятность того, что каждый элемент будет выбран, равна k/n. Простая выборка — это простейший алгоритм выборки, а также наиболее часто используемый алгоритм. Предпосылкой простой выборки является то, что размер n целевой совокупности должен быть известен заранее.

В отличие от простой выборки,Отбор проб прудаЭто метод динамической выборки.Конкретные доказательства и алгоритмы

  1. слияние деревьев
  2. Подстрока с наибольшим произведением?
  3. Two Sum?

код

  1. Keras Attention
from keras import backend as K
from keras.engine.topology import Layer
from keras import initializers, regularizers, constraints
from keras.layers.merge import _Merge


class Attention(Layer):
    def __init__(self, step_dim,
                 W_regularizer=None, b_regularizer=None,
                 W_constraint=None, b_constraint=None,
                 bias=True, **kwargs):
        """
        Keras Layer that implements an Attention mechanism for temporal data.
        Supports Masking.
        Follows the work of Raffel et al. [https://arxiv.org/abs/1512.08756]
        # Input shape
            3D tensor with shape: `(samples, steps, features)`.
        # Output shape
            2D tensor with shape: `(samples, features)`.
        :param kwargs:
        Just put it on top of an RNN Layer (GRU/LSTM/SimpleRNN) with return_sequences=True.
        The dimensions are inferred based on the output shape of the RNN.
        Example:
            model.add(LSTM(64, return_sequences=True))
            model.add(Attention())
        """
        self.supports_masking = True
        # self.init = initializations.get('glorot_uniform')
        self.init = initializers.get('glorot_uniform')

        self.W_regularizer = regularizers.get(W_regularizer)
        self.b_regularizer = regularizers.get(b_regularizer)

        self.W_constraint = constraints.get(W_constraint)
        self.b_constraint = constraints.get(b_constraint)

        self.bias = bias
        self.step_dim = step_dim
        self.features_dim = 0
        super(Attention, self).__init__(**kwargs)

    def build(self, input_shape):
        assert len(input_shape) == 3

        self.W = self.add_weight((input_shape[-1],),
                                 initializer=self.init,
                                 name='{}_W'.format(self.name),
                                 regularizer=self.W_regularizer,
                                 constraint=self.W_constraint)
        self.features_dim = input_shape[-1]

        if self.bias:
            self.b = self.add_weight((input_shape[1],),
                                     initializer='zero',
                                     name='{}_b'.format(self.name),
                                     regularizer=self.b_regularizer,
                                     constraint=self.b_constraint)
        else:
            self.b = None

        self.built = True

    def compute_mask(self, input, input_mask=None):
        # do not pass the mask to the next layers
        return None

    def call(self, x, mask=None):
        input_shape = K.int_shape(x)

        features_dim = self.features_dim
        # step_dim = self.step_dim
        step_dim = input_shape[1]

        eij = K.reshape(K.dot(K.reshape(x, (-1, features_dim)), K.reshape(self.W, (features_dim, 1))), (-1, step_dim))

        if self.bias:
            eij += self.b[:input_shape[1]]

        eij = K.tanh(eij)

        a = K.exp(eij)

        # apply mask after the exp. will be re-normalized next
        if mask is not None:
            # Cast the mask to floatX to avoid float64 upcasting in theano
            a *= K.cast(mask, K.floatx())

        # in some cases especially in the early stages of training the sum may be almost zero
        # and this results in NaN's. A workaround is to add a very small positive number ε to the sum.
        a /= K.cast(K.sum(a, axis=1, keepdims=True) + K.epsilon(), K.floatx())

        a = K.expand_dims(a)
        weighted_input = x * a
        # print weigthted_input.shape
        return K.sum(weighted_input, axis=1)

    def compute_output_shape(self, input_shape):
        # return input_shape[0], input_shape[-1]
        return input_shape[0], self.features_dim
# end Attention
  1. Attention RNN Model
import keras
from keras import Model
from keras.layers import *
import Attention

class TextClassifier():

    def model(self, embeddings_matrix, maxlen, word_index, num_class):
        inp = Input(shape=(maxlen,))
        encode = Bidirectional(CuDNNGRU(128, return_sequences=True))
        encode2 = Bidirectional(CuDNNGRU(128, return_sequences=True))
        attention = Attention(maxlen)
        x_4 = Embedding(len(word_index) + 1,
                        embeddings_matrix.shape[1],
                        weights=[embeddings_matrix],
                        input_length=maxlen,
                        trainable=True)(inp)
        x_3 = SpatialDropout1D(0.2)(x_4)
        x_3 = encode(x_3)
        x_3 = Dropout(0.2)(x_3)
        x_3 = encode2(x_3)
        x_3 = Dropout(0.2)(x_3)
        avg_pool_3 = GlobalAveragePooling1D()(x_3)
        max_pool_3 = GlobalMaxPooling1D()(x_3)
        attention_3 = attention(x_3)
        x = keras.layers.concatenate([avg_pool_3, max_pool_3, attention_3], name="fc")
        x = Dense(num_class, activation="sigmoid")(x)

        adam = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08,amsgrad=True)
        model = Model(inputs=inp, outputs=x)
        model.compile(
            loss='categorical_crossentropy',
            optimizer=adam)
        return model