Profi.ruでのクライアントルーティング/セマンティック検索の構築

Profi.ruでのクライアントルーティング/セマンティック検索の構築および任意の外部コーパスのクラスタリング



TLDR



これは、Profi.ru DS部門で約2か月で何をしたかについての非常に短いエグゼクティブサマリー(またはティーザー)です(もう少し長くいましたが、自分自身とチームをオンボーディングすることは別のことでした最初に行われます)。







予測される目標



  1. クライアントの入力/意図を理解し、それに応じてクライアントをルーティングします(最終的には入力品質にとらわれない分類子を選択しましたが、先行入力文字レベルモデルと言語モデルも考慮しました。簡易ルール)。
  2. まったく新しいサービスと既存のサービスの同義語を見つけます。
  3. (2)のサブゴールとして-任意の外部コーパスで適切なクラスターを構築することを学ぶ。


達成された目標



明らかに、これらの結果の一部は私たちのチームだけでなく、いくつかのチームによっても達成されました(つまり、ドメインコーパスと手動注釈のスクレイピング部分は明らかにしませんでしたが、スクレイピングはチームでも解決できると信じていますが、十分なプロキシ+セレンのおそらくいくつかの経験)。







ビジネス目標:







  1. 88+%



    (vs〜60 88+%



    対エラスティック検索)クライアントルーティング/インテント分類の精度( 5k



    クラス);
  2. 検索は入力品質(ミスプリント/部分的な入力)に依存しません。
  3. 分類子は一般化され、言語の形態学的構造が活用されます。
  4. 分類子は、さまざまなベンチマークで弾性検索を大幅に下回ります(以下を参照)。
  5. 安全のために-少なくとも1,000



    新しいサービスが見つかった+少なくとも15,000



    同義語(対5,000



    の現在の状態+ 30,000



    )。 この数字は、トリプルの2倍になると予想しています。


最後の箇条書きは概算ですが、保守的なものです。

また、ABテストが続きます。 しかし、これらの結果には自信があります。







「科学的な」目標:







  1. ダウンストリーム分類タスク+ KNNとサービス同義語のデータベースを使用して、現代の文埋め込み技術の多くを徹底的に比較しました。
  2. UNSUPERVISEDメソッドを使用して、このベンチマーク(以下の詳細を参照)で、弱監視(基本的に分類子はn-gram)の弾性検索に勝ちました
  3. 適用されたNLPモデルを構築する新しい方法を開発しました(プレーンバニラbi-LSTM +埋め込みのバッグ、基本的に高速テキストはRNNに適合)-これはロシア語の形態を考慮し、一般化します。
  4. 最先端の教師なしアルゴリズム(UMAP + HDBSCAN)と組み合わせた最終的な埋め込み手法(最高の分類器からのボトルネックレイヤー)が星のクラスターを生成できることを実証しました。
  5. 実際に、以下の可能性、実現可能性、使いやすさを実証しました。

    • 知識の蒸留;
    • テキストデータの拡張(sic!);
  6. 動的増強を使用したテキストベースの分類子のトレーニングは、より大きな静的データセットの生成と比較して、収束時間を大幅に短縮しました(つまり、CNNは、極端に少ない増強された文で示される誤りを一般化することを学習します);


全体的なプロジェクト構造



これには最終分類子は含まれません。

また、最終的に、分類器のボトルネックを支持して、偽のRNNモデルとトリプレット損失モデルを放棄しました。













現在NLPで機能しているのは何ですか?



鳥瞰図:







また、NLPが現在Imagenetの瞬間を経験していることを知っているかもしれません。







大規模なUMAPハック



クラスターを構築するときに、基本的にUMAPを100m +ポイント(または場合によっては10億)のサイズのデータ​​セットに適用する方法/ハックを見つけました。 基本的にFAISSで KNNグラフを作成し、GPUを使用してメインUMAPループをPyTorchに書き換えるだけです。 私たちはそれを必要とせず、概念を放棄しました(結局10〜15mポイントしかありませんでした)が、詳細についてはこのスレッドに従ってください。







最適なもの





最高の分類器ベンチマーク



手動で注釈が付けられた開発セット







左から右:

(トップ1の精度)









手動注釈付きの開発セット+クエリごとに1〜3個のエラー







左から右:

(トップ1の精度)









手動注釈付きの開発セット+部分入力







左から右:

(トップ1の精度)









大規模コーパス/ N-gram選択





100万語彙での100万n-gramのストレステスト:

画像







テキスト拡張



一言で言えば:









私たちはこのようなサービスに多くのクエリを強引に強制し(本質的にデータセットをリバースエンジニアリングするために)、内部には非常に小さな辞書があります(また、このサービスはn-gram機能を備えたツリー分類器によって強化されています)。 彼らが私たちがいくつかのコーパスで持っていた単語の30-50%しかカバーていないのを見るのはちょっと面白かったです







大規模なドメイン語彙にアクセスできる場合、私たちのアプローチははるかに優れています







最良の教師なし/半教師ありの結果



KNNは、さまざまな埋め込み方法を比較するためのベンチマークとして使用されました。







(ベクターサイズ)テストされたモデルのリスト:









デフォルト







リークを避けるために、すべてのランダムな文がランダムにサンプリングされました。 彼らの言葉の長さは、彼らが比較されたサービス/同義語の長さと同じでした。 また、ボキャブラリーを分離することでモデルが学習するだけではないことを確認するための対策が講じられました(埋め込みは凍結され、Wikipediaは各ウィキペディアの文に少なくとも1つのドメインワードがあることを確認するためにアンダーサンプリングされました)。







クラスターの可視化



3D







2D







クラスター探索「インターフェース」



緑-新しい単語/同義語。

灰色の背景-おそらく新しい単語。

灰色のテキスト-既存の同義語。













アブレーションテストと何が機能するのか、何を試したのか、何をしなかったのか



  1. 上記のチャートをご覧ください。
  2. 高速テキスト埋め込みの単純平均/ tf-idf平均-非常に手ごわいベースライン
  3. Fast-text>ロシア語のWord2Vec。
  4. 偽の文章検出による文章の埋め込みは一種の作品ですが、他の方法と比較すると見劣りします。
  5. BPE(センテンスピース)は、ドメインの改善を示しませんでした。
  6. charレベルのモデルは、Googleからの紙切れにもかかわらず、一般化するのに苦労しました。
  7. マルチヘッドトランスフォーマー(分類子と言語モデリングヘッドを使用)を試しましたが、手元にある注釈では、プレーンバニラLSTMベースのモデルとほぼ同じ性能を発揮しました。 悪いアプローチの埋め込みに移行したときに、LMヘッドと埋め込みバッグレイヤーの両方を使用するトランスの実用性と実用性が低いため、この一連の研究を放棄しました。
  8. BERT-やりすぎのようです。また、変圧器は文字通り何週間も訓練すると主張する人もいます。
  9. ELMO -AllenNLPのようなライブラリを使用することは、私がここで提供しない理由のために、研究/制作および教育環境の両方で私の意見では逆効果であると思われます。


展開する



使用済み:










All Articles