RNNSharp - это инструментарий глубокой рекуррентной нейронной сети, который широко используется для множества различных задач, таких как маркировка последовательности, seq2seq и так далее. Он написан на языке C# и основан на .NET framework 4.6 или выше.
На этой странице представлено, что такое RNNSharp, как он работает и как его использовать. Чтобы получить демонстрационный пакет, вы можете обратиться к странице выпуска
RNNSharp поддерживает множество различных типов структур глубокой рекуррентной нейронной сети (aka DeepRNN).
Для структуры сети он поддерживает прямой RNN и двунаправленный RNN. Вперед RNN рассматривает историческую информацию до текущего токена, однако двунаправленный RNN рассматривает как информацию о предыстории, так и информацию в будущем.
Для скрытой структуры слоев он поддерживает LSTM и Dropout. По сравнению с BPTT, LSTM очень хорош в сохранении долговременной памяти, так как у нее есть некоторые ворота для потоковой передачи информации. Выпадение используется для добавления шума во время обучения, чтобы избежать переобучения.
С точки зрения структуры выходного уровня поддерживаются простые, softmax, выборочные softmax и повторяющиеся CRF [1]. Softmax - это тип tranditional, который широко используется во многих видах задач. Сэмплированный softmax особенно используется для задач с большим выходным лексиконом, таких как задачи генерации последовательности (модель последовательности к последовательности). Простой тип обычно используется с повторяющимся CRF вместе. Для повторного CRF, основанного на простых переходах выходов и тегов, он вычисляет вывод CRF для всей последовательности. Для задач маркировки последовательностей в автономном режиме, таких как сегментация слов, распознавание имен объектов и т. Д., Рекуррентный CRF имеет лучшую производительность, чем softmax, дискретный softmax и линейный CRF.
Вот пример глубокой двунаправленной сети RNN-CRF. Он содержит 3 скрытых слоя, 1 собственный RNN-выход и 1 CRF-выход.
Вот внутренняя структура одного двунаправленного скрытого слоя.
Вот нейронная сеть для задачи seq2seq. «TokenN» - из исходной последовательности, а «ELayerX-Y» - скрытые слои автокодера. Автокодер определяется в файле конфигурации функции. & Lt; & s GT; всегда является началом целевого предложения, а «DLayerX-Y» означает скрытые слои декодера. В декодере он генерирует один токен за один раз, пока </s> генерируется.
RNNSharp поддерживает множество различных типов объектов, поэтому в следующем параграфе будет показано, как работают эти функции.
Шаблонные функции создаются с помощью шаблонов. Благодаря заданным шаблонам и корпусу эти функции могут автоматически генерироваться. В RNNSharp функции шаблона - редкие функции, поэтому, если функция существует в текущем токене, значение функции будет равно 1 (или частоте функции), в противном случае это будет 0. Это похоже на функции CRFSharp. В RNNSharp TFeatureBin.exe является консольным инструментом для создания этого типа функций.
В файле шаблона каждая строка описывает один шаблон, который состоит из префикса, id и строки правил. Префикс указывает тип шаблона. Пока что RNNSharp поддерживает функцию U-типа, поэтому префикс всегда равен «U». Идентификатор используется для различения разных шаблонов. Правило-строка - это тело объекта.
# Unigram
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[-1,0]/%x[0,0]
U05:%x[0,0]/%x[1,0]
U06:%x[-1,0]/%x[1,0]
U07:%x[-1,1]
U08:%x[0,1]
U09:%x[1,1]
U10:%x[-1,1]/%x[0,1]
U11:%x[0,1]/%x[1,1]
U12:%x[-1,1]/%x[1,1]
U13:C%x[-1,0]/%x[-1,1]
U14:C%x[0,0]/%x[0,1]
U15:C%x[1,0]/%x[1,1]
Строка правил имеет два типа: одна - постоянная строка, а другая - переменная. Простейший переменный формат {“%x[row,col]”}. Строка определяет смещение между текущим токеном фокусировки и генерирует токен функции в строке. Col указывает абсолютную позицию столбца в корпусе. Более того, переменная комбинация также поддерживается, например: {“%x[row1, col1]/%x[row2, col2]”}. Когда мы создадим набор функций, переменная будет расширена до определенной строки. Ниже приведен пример обучения данных для задачи с именем entity.
Word | Pos | Tag |
---|---|---|
! | PUN | S |
Tokyo | NNP | S_LOCATION |
and | CC | S |
New | NNP | B_LOCATION |
York | NNP | E_LOCATION |
are | VBP | S |
major | JJ | S |
financial | JJ | S |
centers | NNS | S |
. | PUN | S |
---empty line--- | ||
! | PUN | S |
p | FW | S |
' | PUN | S |
y | NN | S |
h | FW | S |
44 | CD | S |
University | NNP | B_ORGANIZATION |
of | IN | M_ORGANIZATION |
Texas | NNP | M_ORGANIZATION |
Austin | NNP | E_ORGANIZATION |
Согласно вышеприведенным шаблонам, если текущий токен фокусировки - «York NNP E_LOCATION», ниже генерируются функции:
U01:New
U02:York
U03:are
U04:New/York
U05:York/are
U06:New/are
U07:NNP
U08:NNP
U09:are
U10:NNP/NNP
U11:NNP/VBP
U12:NNP/VBP
U13:CNew/NNP
U14:CYork/NNP
U15:Care/VBP
Хотя строки правил U07 и U08, U11 и U12 одинаковы, мы все равно можем различать их по строке id.
Функции контекстного шаблона основаны на шаблонных функциях и объединены с контекстом. В этом примере, если параметр контекста равен «-1,0,1», эта функция объединит функции текущего токена с его предыдущим токеном и следующим токеном. Например, если предложение «как вы». сгенерированный набор функций будет {Feature ("how"), Feature ("are"), Feature ("you")}.
RNNSharp поддерживает два типа предварительно обработанных функций. Один из них - встроенные функции, а другой - функции автоматического кодирования. Оба они могут представить данный токен вектором фиксированной длины. Эта функция является плотной функцией в RNNSharp.
Для внедрения функций они обучаются из несвязанного корпуса проектом Text2Vec. И RNNSharp использует их как статические функции для каждого заданного токена. Однако для функций автоматического кодирования они также обучаются RNNSharp, а затем они могут использоваться как плотные функции для других тренировок. Обратите внимание, что гранулярность маркера в предварительно обработанных элементах должна соответствовать учебному корпусу в основном обучении, в противном случае некоторые жетоны будут неправильно совпадать с предварительной процедурой.
Любит шаблоны, функция встраивания также поддерживает функцию контекста. Он может объединить все функции заданных контекстов в единую функцию внедрения. Для функций автоматического кодирования он пока не поддерживается.
По сравнению с другими функциями, созданными в автономном режиме, эта функция генерируется во время выполнения. Он использует результат предыдущих токенов в качестве функции времени выполнения для текущего токена. Эта функция доступна только для прямого RNN, двунаправленная RNN не поддерживает ее.
Эта функция предназначена только для последовательности к последовательности. В задаче последовательности-последовательности RNNSharp кодирует заданную исходную последовательность в вектор фиксированной длины и затем передает ее как плотную функцию для генерации целевой последовательности.
Файл конфигурации описывает структуру и функции модели. В консольном инструменте используйте параметр -cfgfile в качестве параметра для указания этого файла. Ниже приведен пример задачи по маркировке последовательностей:
#Working directory. It is the parent directory of below relatived paths.
CURRENT_DIRECTORY = .
#Network type. Four types are supported:
#For sequence labeling tasks, we could use: Forward, BiDirectional, BiDirectionalAverage
#For sequence-to-sequence tasks, we could use: ForwardSeq2Seq
#BiDirectional type concatnates outputs of forward layer and backward layer as final output
#BiDirectionalAverage type averages outputs of forward layer and backward layer as final output
NETWORK_TYPE = BiDirectional
#Model file path
MODEL_FILEPATH = Data\Models\ParseORG_CHS\model.bin
#Hidden layers settings. LSTM and Dropout are supported. Here are examples of these layer types.
#Dropout: Dropout:0.5 -- Drop out ratio is 0.5 and layer size is the same as previous layer.
#If the model has more than one hidden layer, each layer settings are separated by comma. For example:
#"LSTM:300, LSTM:200" means the model has two LSTM layers. The first layer size is 300, and the second layer size is 200.
HIDDEN_LAYER = LSTM:200
#Output layer settings. Simple, Softmax ands sampled softmax are supported. Here is an example of sampled softmax:
#"SampledSoftmax:20" means the output layer is sampled softmax layer and its negative sample size is 20.
#"Simple" means the output is raw result from output layer. "Softmax" means the result is based on "Simple" result and run softmax.
OUTPUT_LAYER = Simple
#CRF layer settings
#If this option is true, output layer type must be "Simple" type.
CRF_LAYER = True
#The file name for template feature set
TFEATURE_FILENAME = Data\Models\ParseORG_CHS\tfeatures
#The context range for template feature set. In below, the context is current token, next token and next after next token
TFEATURE_CONTEXT = 0,1,2
#The feature weight type. Binary and Freq are supported
TFEATURE_WEIGHT_TYPE = Binary
#Pretrained features type: 'Embedding' and 'Autoencoder' are supported.
#For 'Embedding', the pretrained model is trained by Text2Vec, which looks like word embedding model.
#For 'Autoencoder', the pretrained model is trained by RNNSharp itself. For sequence-to-sequence task, "Autoencoder" is required, since source sequence needs to be encoded by this model at first, and then target sequence would be generated by decoder.
PRETRAIN_TYPE = Embedding
#The following settings are for pretrained model in 'Embedding' type.
#The embedding model generated by Txt2Vec (https://github.com/zhongkaifu/Txt2Vec). If it is raw text format, we should use WORDEMBEDDING_RAW_FILENAME instead of WORDEMBEDDING_FILENAME as keyword
WORDEMBEDDING_FILENAME = Data\WordEmbedding\wordvec_chs.bin
#The context range of word embedding. In below example, the context is current token, previous token and next token
#If more than one token are combined, this feature would use a plenty of memory.
WORDEMBEDDING_CONTEXT = -1,0,1
#The column index applied word embedding feature
WORDEMBEDDING_COLUMN = 0
#The following setting is for pretrained model in 'Autoencoder' type.
#The feature configuration file for pretrained model.
AUTOENCODER_CONFIG = D:\RNNSharpDemoPackage\config_autoencoder.txt
#The following setting is the configuration file for source sequence encoder which is only for sequence-to-sequence task that MODEL_TYPE equals to SEQ2SEQ.
#In this example, since MODEL_TYPE is SEQLABEL, so we comment it out.
#SEQ2SEQ_AUTOENCODER_CONFIG = D:\RNNSharpDemoPackage\config_seq2seq_autoencoder.txt
#The context range of run time feature. In below example, RNNSharp will use the output of previous token as run time feature for current token
#Note that, bi-directional model does not support run time feature, so we comment it out.
#RTFEATURE_CONTEXT = -1
В обучающем файле каждая последовательность представляется как матрица признаков и заканчивается пустой строкой. В матрице каждая строка предназначена для одного символа последовательности и ее функций, а каждый столбец предназначен для одного типа объектов. Во всем учебном корпусе число столбцов должно быть фиксированным.
Задача маркировки последовательности и последовательность для последовательности задают разные форматы учебного корпуса.
Для задач маркировки последовательностей первые столбцы N-1 являются входными функциями для обучения, а N-й столбец (последний столбец) является ответом текущего токена. Вот пример для задачи распознавания имен по имени (полный учебный файл находится в разделе выпуска, вы можете скачать его там):
Word | Pos | Tag |
---|---|---|
! | PUN | S |
Tokyo | NNP | S_LOCATION |
and | CC | S |
New | NNP | B_LOCATION |
York | NNP | E_LOCATION |
are | VBP | S |
major | JJ | S |
financial | JJ | S |
centers | NNS | S |
. | PUN | S |
---empty line--- | ||
! | PUN | S |
p | FW | S |
' | PUN | S |
y | NN | S |
h | FW | S |
44 | CD | S |
University | NNP | B_ORGANIZATION |
of | IN | M_ORGANIZATION |
Texas | NNP | M_ORGANIZATION |
Austin | NNP | E_ORGANIZATION |
Он имеет две записи, разделенные полосой. Для каждого токена он имеет три столбца. Первые два столбца - это набор функций ввода, которые являются словом и позиционным тегом для токена. Третий столбец является идеальным выходом модели, которая называется типом сущности для токена.
Именованный тип объекта выглядит как «Position_NamedEntityType». «Позиция» - это позиция слова в названном объекте, а «NamedEntityType» - это тип объекта. Если «NamedEntityType» пуст, это означает, что это общее слово, а не именованный объект. В этом примере «Позиция» имеет четыре значения:
S : the single word of the named entity
B : the first word of the named entity
M : the word is in the middle of the named entity
E : the last word of the named entity
"NamedEntityType" has two values:
ORGANIZATION : the name of one organization
LOCATION : the name of one location
Для задачи seq2seq формат учебного корпуса отличается. Для каждой пары последовательностей она состоит из двух секций, одна из которых является исходной, другая - целевой. Вот пример:
Word |
---|
What |
is |
your |
name |
? |
---empty line--- |
I |
am |
Zhongkai |
Fu |
В приведенном выше примере: «Как тебя зовут?» является исходным предложением, а «Я - Zhongkai Fu» является целевым предложением, созданным моделью Seq-to-seq RNNSharp. В исходном предложении, помимо функций слова, другие функции могут также применяться для обучения, такие как функция postag в задаче последовательности, указанная выше.
Тестовый файл имеет такой же формат, как и файл тренировки. Для задачи маркировки последовательностей, единственная разница между ними - последний столбец. В тестовом файле все столбцы являются функциями для декодирования модели. Для задачи последовательности к последовательности она содержит только исходную последовательность. Целевое предложение будет сгенерировано моделью.
Для задачи маркировки последовательностей этот файл содержит набор выходных тегов. Для задачи последовательности к последовательности это выходной лексический файл.
RNNSharpConsole.exe - консольный инструмент для повторной кодировки и декодирования нейронной сети. Инструмент имеет два режима работы. Режим «train» предназначен для обучения модели, а режим «test» предназначен для прогнозирования выходного тега из тестового корпуса по заданной кодированной модели.
В этом режиме консольный инструмент может кодировать модель RNN с помощью заданного набора функций и обучения / проверенного корпуса. Использование:
RNNSharpConsole.exe -mode train <параметры>
Parameters for training RNN based model.
-trainfile : Training corpus file
-validfile : Validated corpus for training
-cfgfile : Configuration file
-tagfile : Output tag or vocabulary file
-inctrain : Incremental training. Starting from output model specified in configuration file. Default is false
-alpha : Learning rate, Default is 0.1
-maxiter : Maximum iteration for training. 0 is no limition, Default is 20
-savestep : Save temporary model after every sentence, Default is 0
-vq : Model vector quantization, 0 is disable, 1 is enable. Default is 0
-minibatch : Updating weights every sequence. Default is 1
Example: RNNSharpConsole.exe -mode train -trainfile train.txt -validfile valid.txt -cfgfile config.txt -tagfile tags.txt -alpha 0.1 -maxiter 20 -savestep 200K -vq 0 -grad 15.0 -minibatch 128
В этом режиме, при заданном тестовом корпусе, RNNSharp предсказывает выходные теги в задаче последовательности пометок или генерирует целевую последовательность в последовательности-последовательности.
RNNSharpConsole.exe -mode test
Parameters for predicting iTagId tag from given corpus
-testfile : test corpus file
-tagfile : output tag or vocabulary file
-cfgfile : configuration file
-outfile : result output file
Example: RNNSharpConsole.exe -mode test -testfile test.txt -tagfile tags.txt -cfgfile config.txt -outfile result.txt
Он используется для создания набора шаблонов, заданных с помощью данного шаблона и файлов корпусов. Для высокопроизводительного доступа и экономии памяти индексный набор функций встроен в массив float в trie-tree от AdvUtils. Инструмент поддерживает три режима следующим образом:
TFeatureBin.exe
The tool is to generate template feature from corpus and index them into file
-mode : support extract,index and build modes
extract : extract features from corpus and save them as raw text feature list
index : build indexed feature set from raw text feature list
build : extract features from corpus and generate indexed feature set
Этот режим предназначен для извлечения функций из данного корпуса в соответствии с шаблонами, а затем для создания индексированного набора функций. Использование этого режима следующим образом:
TFeatureBin.exe -mode build
This mode is to extract feature from corpus and generate indexed feature set
-template : feature template file
-inputfile : file used to generate features
-ftrfile : generated indexed feature file
-minfreq : min-frequency of feature
Example: TFeatureBin.exe -mode build -template template.txt -inputfile train.txt -ftrfile tfeature -minfreq 3
In above example, feature set is extracted from train.txt and build them into tfeature file as indexed feature set.
Этот режим предназначен только для извлечения функций из данного корпуса и сохранения их в исходный текстовый файл. Разница между режимом сборки и режимом извлечения заключается в том, что функция сборки режима экстракции устанавливается как формат необработанного текста, а не индексированный двоичный формат. Использование режима извлечения следующим образом:
TFeatureBin.exe -mode extract
This mode is to extract features from corpus and save them as text feature list
-template : feature template file
-inputfile : file used to generate features
-ftrfile : generated feature list file in raw text format
-minfreq : min-frequency of feature
Example: TFeatureBin.exe -mode extract -template template.txt -inputfile train.txt -ftrfile features.txt -minfreq 3
В приведенном выше примере, в соответствии с шаблонами, набор функций извлекается из train.txt и сохраняет их в feature.txt как формат необработанного текста. Формат выходного текстового файла - «строка функции \t частота в корпусе». Вот несколько примеров:
U01:仲恺 \t 123
U01:仲文 \t 10
U01:仲秋 \t 12
U01:仲恺 is feature string and 123 is the frequency that this feature in corpus.
Этот режим предназначен только для создания индексированной функции, заданной заданными шаблонами и набором функций в формате необработанного текста. Использование этого режима следующим образом:
TFeatureBin.exe -mode index
This mode is to build indexed feature set from raw text feature list
-template : feature template file
-inputfile : feature list in raw text format
-ftrfile : indexed feature set
Example: TFeatureBin.exe -mode index -template template.txt -inputfile features.txt -ftrfile features.bin
В приведенном выше примере, согласно шаблонам, набор функций сырого текста, feature.txt, будет индексироваться как файл features.bin в двоичном формате.
Вот качественные результаты по китайской задаче распознавания сущностей. Файлы корпуса, конфигурации и параметров доступны в файле демонстрационного пакета RNNSharp в разделе [release] (https://github.com/zhongkaifu/RNNSharp/releases). Результат основан на двунаправленной модели. Первый скрытый размер слоя - 200, а второй размер скрытого слоя - 100. Вот результаты теста:
Parameter | Token Error | Sentence Error |
---|---|---|
1-hidden layer | 5.53% | 15.46% |
1-hidden layer-CRF | 5.51% | 13.60% |
2-hidden layers | 5.47% | 14.23% |
2-hidden layers-CRF | 5.40% | 12.93% |
RNNSharp - это чистый проект C #, поэтому он может быть скомпилирован .NET Core и Mono и без изменений в Linux / Mac.
RNNSharp также предоставляет некоторые API для разработчиков, чтобы использовать его в своих проектах. Загрузив исходный пакет кода и откройте проект RNNSharpConsole, вы увидите, как использовать API в своем проекте для кодирования и декодирования моделей RNN. Обратите внимание, что перед использованием API RNNSharp вы должны добавить RNNSharp.dll в качестве ссылки в свой проект.