この実験ベンチマークは、SO -Caled言語モデルを構築するという単純化されたタスクで、単語を表現するさまざまな方法を比較します。
言語モデルは、テキストの特定のフラグメント(単語チェーン)の確率を計算する方法です。 NLPは、N-GramsとSmoothing(Smoothing)のカウントに基づいてLMを構築するために、以前に広く使用されていました。たとえば、NLTKにはKneser-Neyメソッドの実装があります。また、https://github.com/kpu/kenlmなど、大量のn-gramer情報の保存とテキスト処理の速度に関する技術的な詳細が異なるさまざまな実装もあります。
過去数年間で、神経言語モデル(NLM)のさまざまなオプションが広範囲にわたる使用を受けており、再発や輝きを含むさまざまな神経酸塩の構造を使用しています。 NLMは、単語のレベル(単語認識NLM)と文字のレベル(文字認識NLM)で作業するという2つのグループに分けることができます。 2番目のオプションは、モデルが形態素で動作できるようにするという点で特に興味深いものです。これは、豊かな形態を持つ言語では非常に重要です。いくつかの言葉では、ロシア語の形容詞の場合のように、何百もの文法形態が潜在的に存在する可能性があります。非常に大きなテキストケースでさえ、単語の認識NLMの語彙にすべての単語形式が含まれることを保証するものではありません。一方、形態素構造はほとんど常に通常のルールに従うため、単語の基礎または基本形式の知識により、文法的およびセマンティックなオプションを生成することができます:大胆、太字、噛みつき、太字など、対応する単語が初めての統計に定着していても、同じルートの単語間のセマンティックなつながりを決定します。最後の発言は、動的な単語形成を備えたNLPのフィールドにとって非常に重要になります。まず第一に、それはあらゆる種類のソーシャルメディアです。
ベンチマークのフレームワーク内で、必要なすべてのコードが、両方のNLMオプションを研究および比較するために準備されており、LM-Characte-AwareとWord-Awareの他の方法とともに。
この形式でタスクを設定して、Langageモデルを少し簡素化します。事前に選択された長さのNグラムがあります(DataSetVectionizersモジュールのngram_order定数を参照)。テキストケースから取得された場合(スティックされたUTF-8ファイルへのパスが_get_corpus_path class basevectorizerで縫い付けられています)、これは単語とターゲット値y = 1の有効な組み合わせであると考えています。n-gramは単語の1つのランダムな置換によって取得され、そのようなチェーンが測定されない場合、ターゲット値はy = 0です。
容認できないn-gramは、有効な場合と同じ量のケースの分析中に生成されます。バランスの取れたデータセットが判明し、タスクを容易にします。また、手動マーキングの必要性がないため、トレーニングデータセットのレコードの数などのパラメーターを簡単に「再生」できます。
したがって、バイナリ分類問題は解決されます。分類器は、Xgboostの勾配ブーストとKerasに実装されたニューラルネットワークの実装と、異なるプログラミング言語とDLフレームワークに関する他のいくつかのオプションの実装です。
この研究の目的は、入力マトリックスXの単語を分類の精度に及ぼす単語を表す方法の影響です。
同様のタスクを含むNLPへのさまざまなアプローチの詳細な分析は、この記事にあります:自然言語処理のためのニューラルネットワークモデルの入門書。
次のオプションはxgboostについてチェックされています。
W2V-コアトレーニングされたWord2Vecを使用し、単語の単語を1つの長いベクトルに接着します
W2V_TAGS- W2V表現の拡張、最終ベクトルの追加カテゴリは、単語の形態学的タグから取得されます。 Factored Languageモデルのようなものであることがわかります
SDR -Word2Vectorモデルの因数分解によって得られたスパース分散表現単語
random_bitvector-各単語は、特定の割合が0/1のランダムなバイナリ固定 - 長さベクトルに起因します
BC-茶色のクラスタリングの作業の結果として作成されたベクター(説明https://en.wikipedia.org/wiki/bron_clusteringを参照し、実装https://github.com/percyliang/brunki)を使用して使用します。
CHARS-各単語は、シンボルの1ホット表現のチェーンとしてエンコードされます
Hashing_trick-ハッシュトリックを使用して、限られた数のインデックスビットで単語をエンコードします(説明https://en.wikipedia.org/wiki/feature_hashingおよび実装https://radimrehurek.com/gensim/corpora/hashdictionary.html)
AE-単語の単語は、自動エンコーダーの内層のアクティベーションとして得られます。自動エンコーダーでのトレーニングとワードベクトルの取得は、pymodels/wordautoencodersフォルダーのword_autoencoder3.pyスクリプトによって実行されます。
ニューラルネットワークには2つの追加のプレゼンテーション方法が利用可能で、埋め込み層を使用して特定のベクトル表現に変換されます(または使用されているライブラリと同様です。
word_indeces-語彙がコンパイルされ、各単語に一意の整数インデックスが割り当てられます。したがって、3グレードは整数のトリプルのようです。
char_indeces-アルファベットがコンパイルされ、各シンボルには一意の整数インデックスが割り当てられます。さらに、シンボルインデックスのチェーンは、同じ長さ(単語の最大長)のサンプルインデックスによって補足され、結果のシンボルインデックスのチェーンがn-gramの提示として返されます。埋め込み層(ケラスなどに埋め込む)を使用して、シンボルは、ニューラルネットワークの残りの部分が機能する密なベクトル形式に変換されます。キャラクターを認識しているニューラル言語モデルのバージョンがわかります。
問題を解決するために、マトリックスコンピューティングのための機械学習、ニューラルネットワーク、ライブラリのさまざまなライブラリが使用されました。
ケラス(シアノバックエンド付き)
ラザニア(シアノ)
nolearn(theano)
Tensorflow
Pythonソリューション:
pymodels/wr_xgboost.py- xgboostに基づいてリゾルバー
pymodels/wr_catboost.py-単語のキャットブーストリゾルバーインデックスのndolverデータセット内のカテゴリ機能のインデックスを示す機能を使用して、トレーニング中にブースターが独立してそれらを学習するように
Pymodels/wr_keras.py-ケラスに実装されたフィードフォワードニューロセットに基づくリゾルバー
pymodels/wr_keras_sdr2.py-ケラスで、学習と検証のためのマトリックスの分配された生成を伴う大きな次元(1024から)のまばらな分布表現をチェックするための別のソリューション。 Pymodels/wr_lasagne.py-ラザニアに実装されたフィードフォワードニューロセットに基づくリゾルバー(Theano)
Pymodels/wr_nolearn.py- nolearn+lasagne(Theano)に実装されたフィードフォワードニューロセットに基づくリゾルバー
pymodels/wr_tensorflow.py- tensorflowに実装されたFed Forward Neurosetteに基づくソルバー
C#のソリューション:
csharpmodels/withaccordnet/program.cs -Feed Forward Grids Accord.net(C#、VS 2015のプロジェクト)に基づくリゾルバー)
csharpmodels/mybaseline/program.cs-私の実装に基づくソリューションVanilla MLP(C#、Project for VS 2015)
C ++のソリューション:
cxxmodels/tinydnn_model/tinydn_model.cpp -mlp Resolution、Tiny -DNN Library(C ++、Project for VS 2015)が実装
cxxmodels/singa_model/alexnet.cc- apache.singaによって実装されたニューラルネットワークに基づいたリゾルバー(C ++、プロジェクトのためのVS 2015)
cxxmodels/opennn_model/main.cpp- opennnが実装したニューロセットに基づくリゾルバー(c ++、プロジェクトVS 2015)
Java javamodelsのソリューション/with4j/src/main/java/wordrepresentationstest.java -mlpリゾルバー、deeplearning4jライブラリによって実装
内部クラスとツール:
pymodels/corpusreaders.py-さまざまな形式のテキストビルから行(ziptip | plain txt)からの行を読み取ります。
pymodels/store_dataset_file.py-データセットの生成とC#およびC ++モデルの保存
ニューラルネットワークの場合、Kerasに基づいて2人の建築家が実装されました。 MLPは、完全な層を備えたシンプルなフィードフォワードネフェートです。 Convnetは、バンドルレイヤーを使用するメッシュです。
Switchingアーキテクチャは、wr_keras.pyファイルのnet_archパラメーターでnet_archによって実行されます。
しばしば、剛毛のオプションはより正確なソリューションを提供することに注意してください。しかし、対応するモデルはより大きなバリアントを持っていることがわかります。単純に言えば - 同じパラメーターを持ついくつかのモデルの最終的な精度は大きくジャンプします。
実験のアーキテクチャと数値結果の詳細な説明は、https://kelijah.livejournal.com/224925.htmlにあります。
すべてのベンチマークオプションは、UTF-8エンコードのテキストファイルを使用して、n-Gramリストを受信します。テキストを言葉に分割し、下位登録簿に導入することは、3番目のパーティコードによって事前に作成されると想定されています。したがって、スクリプトはこのファイルから行を読み取り、スペースで単語に分割します。
実験の利便性のために、データフォルダーに10万回のサイズの大きなケースの圧縮された露出を配置しました。これは、すべての測定を繰り返すのに十分です。大きなファイルでリポジトリを過負荷にしないために、それは刻まれています。 basevectionizer._load_ngramsメソッド自体は、そのコンテンツをその場で開梱するため、手動操作を行う必要はありません。
W2V_TAGSのベクトル化のバリアントでは、形態学的特徴がW2V静脈に追加されます。各単語のこれらの標識は、私の文法辞書(http://solarix.ru/sql-dictionary-sdk.shtml)の変換によって取得されるデータサブカタールのword2tags_bin.zipファイルから取得されます。変換の結果は165 MBに引き付けられますが、これはGITリポジトリには少し多すぎます。したがって、私は文法辞書の結果のファイルを叫び、データセット自体のベクトル化の対応するクラスは、操作中にその場でそれを解きました。
文法形式の同種のため、多くの単語には複数のタグがあることに注意してください。たとえば、「ベアーズ」という言葉は、それぞれ属格または主格のケースでは、それぞれ単一または複数形の形になります。単語のタグを形成するとき、私は同音異義語のタグを組み合わせます。
2つのステージプロセスが使用されます。最初に、単語のW2Vベクトルを取得します。 Python上の小さなスクリプトは、ベクトルをCSV形式のテキストファイルにアンロードします。
次に、ユーティリティhttps://github.com/mfaruqui/sparse-codingを使用して、コマンドが実行されます。
./nonneg.o input_vectors.txt 16 0.2 1E-5 4 out_vecs.txt
指定されたパラメーターを持つSDR単語を含むOUT_VECS.TXTファイルが生成されます。Size= 16*Vector W2V、Filling = 0.2このファイルにはSDR_Vectorizerクラスがロードされます。
https://habrahabr.ru/post/335838/
http://kelijah.livejournal.com/217608.html
チェックとして、トレーニングセットからのn-gramsの暗記と、テストセットの記憶されているn-grams間の検索を使用します。トレーニングセットの小さなサイズは、テストセットでは、モデルが単にランダムな推測器として動作し、0.50の精度を与えるという事実につながります。
結果のメインテーブルは、リンクで利用できます。次の残りの結果は、1.000,000 3グラムのセットについて得られました。
xgboost(wr_xgboost.py)に基づいてリゾルバーの場合、次の結果が得られました。
1.000,000トリグラムを含むデータセットの場合:w2v_tags(word2vector + morphタグ)==> 0.81
w2v(word2vector dim = 32)==> 0.80
SDR(スパース分散を表す、長さ512、20%単位)==> 0.78 BC(茶色のクラスタリング)==> 0.70
chars(char one-hot encoding)==> 0.71
Random_bitvector(ランダムビットベクトル、ユニットのシェア16%)==> 0.696
Hashing_trick(32,000スロットでハッシュトリック)==> 0.64
Lasagne MLPに基づくソルバーの場合:
精度= 0.71
Nolearn+Lasagne MLPに基づくソルバーの場合:
精度= 0.64
Tiny-DNN MLPに基づくリゾルバーの場合:
精度= 0.58
Accord.netフィードフォワードニューラルネットに基づくソルバーの場合:
word2vector ==> 0.68
「単語インデックス」のカテゴリ特性に関するキャットブースト解像度の場合:
精度= 0.50
apache.singa MLPに基づくソルバーの場合:
精度= 0.74
ベースラインソリューション - トレーニングデータセットからn -gramsを暗記する
精度= 0.50