機械学習において、特徴ハッシュ化(カーネルトリックになぞらえてハッシュトリックとも呼ばれる)は、特徴をベクトル化する高速かつ省スペースな方法であり、任意の特徴をベクトルまたは行列のインデックスに変換します。[ 1 ] [ 2 ]これは、ハッシュ関数を特徴に適用し、連想配列でインデックスを検索するのではなく、ハッシュ値をインデックスとして直接(剰余演算の後)使用することで機能します。特徴ハッシュ化は、非数値のエンコードに加えて、次元削減にも使用できます。[ 2 ]
このトリックはしばしばWeinbergerら(2009)[ 2 ]によるものとされているが、1989年にJohn Moodyによって発表されたこの方法の記述はそれよりずっと以前に存在している。[ 1 ]
一般的な文書分類タスクでは、機械学習アルゴリズムへの入力(学習時と分類時の両方)は自由形式のテキストです。このテキストから、単語の袋(BOW)表現が構築されます。個々のトークンが抽出され、カウントされます。そして、トレーニングセット内の各トークンは、トレーニングセットとテストセットの両方に含まれる各文書の特徴(独立変数)を定義します。
しかし、機械学習アルゴリズムは通常、数値ベクトルで定義されます。したがって、一連の文書の単語のバッグは、各行が単一の文書、各列が単一の特徴/単語である用語文書行列とみなされます。このような行列のエントリi、j は、文書iにおける語彙のj番目の用語の頻度(または重み)を捉えます。(別の慣習では、行列の行と列を入れ替えますが、この違いは重要ではありません。)通常、これらのベクトルは、ジップの法則に従って非常に疎です。
一般的なアプローチは、学習時またはそれ以前に、トレーニングセットの語彙の辞書表現を構築し、それを使用して単語をインデックスにマッピングすることです。ハッシュテーブルとトライは、辞書実装の一般的な候補です。例:3つのドキュメント
辞書を使用して変換できます
用語-文書マトリックスへ
(文書の分類やクラスタリングではよくあることですが、句読点は削除されています。)
このプロセスの問題点は、このような辞書が大量のストレージ容量を占有し、トレーニング セットが大きくなるにつれてサイズが大きくなることです。[ 3 ] 逆に、語彙が固定され、トレーニング セットの増加に合わせて増やされない場合、攻撃者は機械学習フィルターを回避するために、保存されている語彙にない新しい単語やスペルミスを考案しようとする可能性があります。この課題に対処するために、Yahoo! Research はスパム フィルターに特徴ハッシュを使用しようと試みました。[ 4 ]
ハッシュ化の手法は、文書レベルでのテキスト分類や同様のタスクに限定されるものではなく、多数の(場合によっては無制限の)特徴量を含むあらゆる問題に適用できることに注意してください。
数学的に言えば、トークンは要素である。有限集合(または可算無限集合)において有限のコーパスのみを処理する必要があると仮定すると、コーパスに現れるすべてのトークンをつまり、有限です。しかし、英語の文字で構成されるすべての可能な単語を処理したいと仮定すると、可算無限である。
ほとんどのニューラルネットワークは実数ベクトル入力のみを扱うことができるため、「辞書」関数を構築する必要があります。。
いつ有限で、サイズはそうすれば、ワンホットエンコーディングを使用して、それを次のようにマッピングできます。まず、任意に列挙します次に定義するつまり、一意のインデックスを割り当てるということです。各トークンに対して、次にトークンをインデックスでマッピングします。単位基底ベクトルへ。
ワンホットエンコーディングは解釈しやすいが、任意の列挙を維持する必要がある。トークンが与えられた場合計算するためにインデックスを見つけなければなりませんトークンのしたがって、実装するには効率的に、高速に計算できる全単射が必要ですすると、。
実際、要件を少し緩和できます。計算が速いインジェクションがあれば十分です。、次に。
実際には、効率的な注入を構築する簡単な方法はありませんしかし、厳密な注入は必要なく、近似的な注入だけで十分です。つまり、おそらく私たちはおそらく。
この時点で、私たちは次のように指定しました。これはハッシュ関数であるべきである。こうして特徴ハッシュという概念にたどり着く。
(Weinberger et al. 2009) [ 2 ]で提示された基本的な特徴ハッシュアルゴリズムは、次のように定義されます。
まず、2 つのハッシュ関数を指定します。カーネルハッシュ、そしてサインハッシュ次に、特徴ハッシュ関数を定義します。最後に、この特徴ハッシュ関数をトークンの文字列に拡張します。どこは、トークンで構成されるすべての有限文字列の集合です。。
同様に、
幾何学的性質について何か言いたいのですが、 しかしそれ自体は単なるトークンの集合であり、離散的な距離によって生成される離散的なトポロジーを除いて、幾何学的な構造を課すことはできません。より分かりやすくするために、それを に持ち上げます。、そして持ち上げるからに :\mathbb {R} ^{T}\to \mathbb {R} ^{n}} 線形拡張による:そこには無限和があり、すぐに処理しなければなりません。無限を扱う方法は基本的に2つしかありません。1つは、適切な無限和を許容するために、計量を課し、その完備化を取る方法、もう1つは、実際には何も無限ではなく、潜在的に無限であるだけであると要求する方法です。ここでは、潜在的無限の方法を採用し、制限します。有限サポートを持つベクトルのみを含む:有限個のエントリのみゼロではない。
内積を定義する明白な方法で:余談ですが、もし無限の場合、内積空間はこれは完全ではありません。これを完全化すると、性質の良い無限級数を許容するヒルベルト空間が得られます。
これで、特徴ハッシュ関数の幾何学的構造を記述するのに十分な構造を持つ内積空間が得られました。 :\mathbb {R} ^{T}\to \mathbb {R} ^{n}} .
まず、その理由がわかります。これは「カーネルハッシュ」と呼ばれ、カーネルを定義することを可能にします。による「カーネルトリック」という言葉で言えば、これは「特徴マップ」によって生成されたカーネルです。これは私たちが使用していたフィーチャマップではないことに注意してください。実際、私たちは 別のカーネルを使用してきました定義されるカーネルハッシュを拡張する利点バイナリハッシュを使用次の定理は、は「平均的に」等長変換である。
定理(直感的に述べたもの)—バイナリハッシュが偏見がない(つまり、価値を考慮しない)等しい確率で)、 :\mathbb {R} ^{T}\to \mathbb {R} ^{n}} は期待値に関する等長写像です。
期待値の線形性により、今、我々は想定していたので偏りがない。だから我々は続ける。
上記の記述と証明はバイナリハッシュ関数を解釈するものである決定論的な関数としてではなくしかし、ランダムなバイナリベクトルとして偏りのないエントリとは、つまりいかなる場合でも。
これは直感的に理解しやすい図だが、厳密ではない。厳密な記述と証明については[ 2 ]を参照のこと。
ハッシュ法を用いる特徴ベクトル化器は、辞書を保持する代わりに、ハッシュ関数hを特徴量(単語など)に適用し、ハッシュ値を直接特徴量インデックスとして使用して、結果のベクトルをそのインデックスで更新することにより、あらかじめ定義された長さのベクトルを構築できます。ここで、特徴量とは実際には特徴量ベクトルを意味するものとします。
function hashing_vectorizer ( features :文字列の配列, N :整数) : x := new vector [ N ] for f in features : h := hash ( f ) x [ h mod N ] += 1 return xしたがって、特徴ベクトルが ["cat","dog","cat"] でハッシュ関数がもし「猫」であり、もしは「dog」です。出力特徴ベクトルの次元(N)を4とします。すると出力xは[0,2,1,0]になります。ハッシュ衝突の影響を打ち消すために、更新値の符号を決定するために2番目の1ビット出力ハッシュ関数ξを使用することが提案されています。[ 2 ]このようなハッシュ関数を使用すると、アルゴリズムは次のようになります。
function hashing_vectorizer ( features :文字列の配列, N :整数) : x := new vector [ N ] for f in features : h := hash ( f ) idx := h mod N if ξ ( f ) == 1 : x [ idx ] += 1 else : x [ idx ] -= 1 return x上記の擬似コードは、実際には各サンプルをベクトルに変換します。最適化されたバージョンでは、代わりにストリームのみを生成します。ペアを作成し、学習アルゴリズムと予測アルゴリズムがそのようなストリームを消費するようにします。その後、線形モデルは係数ベクトルを表す単一のハッシュテーブルとして実装できます。
特徴ハッシュは一般的にハッシュ衝突の問題を抱えており、これは異なるトークンのペアが同じハッシュ値を持つことを意味します。特徴ハッシュ化された単語でトレーニングされた機械学習モデルは、そして基本的に、多義的である。
もしまれなケースであれば、モデルは常にまれなケースを無視して、すべてのケースがまれなケースであると仮定できるため、パフォーマンスの低下は小さい。手段しかし、両方が共通して見られる場合、劣化は深刻になる可能性がある。
これに対処するために、共通のトークンを同じ特徴ベクトルにマッピングしないようにする教師ありハッシュ関数を訓練することができる。[ 5 ]
GanchevとDredzeは、ランダムハッシュ関数と出力ベクトルに数万列を持つテキスト分類アプリケーションでは、符号付きハッシュ関数がなくても、特徴ハッシュが分類性能に悪影響を与える必要はないことを示した。[ 3 ]
Weinberger ら (2009) は、特徴ハッシュ法の独自のバージョンをマルチタスク学習、特にスパムフィルタリングに適用しました。入力特徴は (ユーザー、特徴) のペアであるため、単一のパラメータベクトルでユーザーごとのスパムフィルタと数十万人のユーザーに対するグローバルフィルタの両方を捉えることができ、フィルタの精度が向上しました。[ 2 ]
Chenら(2015)は、特徴ハッシュと疎行列のアイデアを組み合わせて「仮想行列」、つまりストレージ要件の少ない大きな行列を構築した。このアイデアは、行列を扱うことである。辞書として、キーは、および値はそして、ハッシュ辞書で通常行われるように、ハッシュ関数を使用することができます。行列をベクトルとして表現するどんなに大きくても仮想行列を用いて、彼らは少量のストレージしか必要としない大規模なニューラルネットワークであるHashedNetsを構築した。 [ 6 ]
ハッシュトリックの実装は以下に存在する。
ハッシュトリックを使用して、用語のシーケンスをその用語頻度にマッピングします。
テキストを固定サイズのハッシュ空間内のインデックスのシーケンスに変換します。