深層学習の埋め込み層

埋め込み層を開始する前に、バイナリ ワンホット エンコーディング (ワンホット ベクトル) について説明します。

1. バイナリ ワンホット エンコーディングの概要

ニューラル ネットワークへの入力用のベクトルとして単語を表すための簡単な方法は、バイナリ ワンホット エンコーディング (ワンホット ベクトル) を使用することです。辞書内の異なる文字の数が N であると仮定すると (つまり、辞書サイズ vocab_size=N)、各文字は 0 から N-1 までの連続する整数値のインデックスと 1 対 1 に対応します。たとえば、N=10 用に構築した辞書は次のとおりです。

我  从  哪  里  来  要  到  何  处  去
0   1   2   3   4   5   6   7   8   9  # 索引

したがって、実際には、ベクトルを使用して、次の 10 個の単語で構成される単語を表現できます。

例: 私はどこから来てどこへ行くのですか ——>>>[0 1 2 3 4 5 6 7 8 9]

または: 私はどこから来てどこへ行くのですか ——>>>[0 1 7 8 4 5 6 2 3 9]

バイナリワンホットエンコード方式とは、文字を表現する際、インデックスに相当する位置が1で、それ以外の位置はすべて0になることを意味します。各単語を (サンプルの総数/単語の総数) 要素の配列/リストに対応させます。各単語は一意の対応する配列/リストに対応し、配列/リストの一意性は 1 で表されます。上記のように、「い」は[1 0 0 0...]、「ご」は[... 0 0 0 1]と表現され、各一連のテキストが疎行列に統合されます( 0 行列以上です)。

バイナリ ワンホット エンコーディングを使用すると、これら 2 つの文は次のように表現できます。

# 私はどこから来てどこへ行くのですか
[
[1 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0 0]
[0 0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 0 1 0]
[0 0 0 0 0 0 0 0 0 1]
]

# 私はどこから来てどこへ行くのですか
[
[1 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 0 1 0]
[0 0 0 0 1 0 0 0 0 0]
[0 0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 1 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0 0 ]
[0 0 0 0 0 0 0 0 0 1]
]

2. 埋め込みレイヤーがあるのはなぜですか?

問題は、リスト (1 次元) に比べてスパース行列 (2 次元) の利点は何なのかということです。

もちろん、計算は簡単です。疎行列の行列計算を行う場合は、1 に対応する数値を乗算して合計するだけです。頭の中で計算できるかもしれません。1 次元のリストの場合はすぐに計算できるでしょうか。さらに、このリストはまだ 1 行ですが、それが 100 行、1000 行、または 1000 列だったらどうなるでしょうか?

したがって、ワンホットエンコーディングの利点が反映され、計算が便利で高速であり、表現能力が強力です

ただし、デメリットもあります。

たとえば、中国語の簡体字と繁体字の大小のフォントが約 10 万個あり、文字数が 100W の小説を 100W*10W の行列で表現したいとします。? ?

これが最も明白な欠点です。まばらすぎると、リソースが過度に占有されてしまいます

例: 実際、私たちの小説には 100W の単語がありますが、実際に統合すると、99W の単語が繰り返され、まったく繰り返されないのは 1W の単語だけです。そうすると、100W X 10W を使用しますが、99W * 10W のマトリックス ストレージ スペースの無駄ではないでしょうか。

また、バイナリエンコードの最大の問題は、異なる単語間の類似度を表現できないことです. 正面から見てわかるように、各文字が表すベクトルは互いに直交しています. 一般的に使用されるコサイン類似度を使用すると、類似度は任意の 2 つの文字の間の度はすべて 0 です。

\frac{x^{T}y}{\left \|  x \右 \|\左 \|  y \right \|}\in \left [ -1,1 \right ]

これら 2 つの問題を解決するために、Embedding レイヤーを導入します。

3. Embedding の 2 つの機能 - 次元削減と次元拡張

(1) 次元削減

まず行列の乗算を見てみましょう。

2 x 6 の行列があり、6 x 3 の行列を乗算すると、2 x 3 の行列になります。

意味はともかく、この処理では要素 12 の行列を要素 6 の行列に変更しますが、感覚的にはサイズが半分になるでしょうか。埋め込み層は次元をある程度削減するために使用され、次元削減の原理は行列の乗算です。畳み込みネットワークでは、これは 1x1 畳み込みカーネルに似た特別な全結合層の操作として理解できます。

つまり、目の前に 100W X10W のマトリクスがあり、これに 10W X 20 のマトリクスを掛けると、100W X 20 になり、瞬時に元の 1/5000 になります。

これは埋め込み層の役割の 1 つである次元削減です。中央の 10W X 20 のマトリックスは、ルックアップ テーブル、マッピング テーブル、または遷移テーブルとして理解できます。

(2) 次元アップグレード

違いを見つけるために別の写真を見てください。

この絵では、10 メートル離れたところから 5 つの違いを見つける必要があります。何?質問者に二歩近づいてください、私が先にナイフを出します、あなたがもう一度質問を言ったとき、私は聞こえませんでした。

もちろん、これは目視検査では不可能です。でも、もし私があなたを1メートル離れたら、おそらくあなたはすぐに服のハートが違うことに気づくだろう、そして0.5メートル歩いて近づくと、左上隅と右上隅も違うことに気づくだろう。20センチほど近づくと、耳も違うことがわかり、最後に画面から10センチ離れたところで、耳の少し下に5つ目の異なる雲を見つけました。

ただし、限りなく近いからといって認識が高いわけではなく、例えば画面から1cm離れたところを見ただけで違いが5つ見つかる…このときは緑色の塊か、もしくは緑色の塊しか見えません。青い塊 ...質問者さん、ドアで頭を圧迫されていませんか...

距離が観察効果に影響を与えることがわかります。同じ理由で同じことが当てはまります。低次元データに含まれる可能性のある特徴は非常に一般的です。この画像上にさまざまな観察点を置くことができるように、ズームインとズームアウトを続けて受容野を変更する必要がありますあなたが望む無精ひげを出します。

埋め込みの別の役割が反映されています。低次元データをアップグレードする場合、他のいくつかの特徴が拡大されたり、一般的な特徴が分離される場合があります。同時に、この埋め込みは常に学習と最適化を行っているため、ゆっくりとズームインおよびズームアウトするプロセス全体が優れた観察ポイントを形成します。例: 画面に近づいたり遠ざかったりしたところ、45 cm の位置が最適な観察ポイントであることがわかりました。この距離では、最短時間で 5 つの異なるポイントを見つけることができます。

CNN 層の数が深くなるほど精度が高くなる理由を思い出してください。畳み込み層はロールアップしてロールアップし、プール層プールは上げ下げし、全結合層は接続して接続します。いつ突然便利な機能を学習したのか分からないからです。しかしいずれにせよ、学習するのは良いことです。だから、機械にもう 1 つロールさせて、さらに接続してください。とにかく、クロス エントロピーによってどれだけの間違いが発生するかを教えます。正しく行う方法を教えます。勾配降下法アルゴリズムによって教えてくれます。時間が経てば、遅かれ早かれ学習できるでしょう。したがって、理論的には、層の数が深く、パラメーターが十分である限り、ネットワークはあらゆる特徴に適合できます。つまり、現在のデータをマッピングするために関係を仮想化することに似ています。

4. 埋め込みの実装

上で挙げた 2 番目の問題を解決するには、次に、バイナリ ワンホット エンコーディングを使用して、「王女はとても美しいです」という文と、「王女はとても美しいです」という別の文があると仮定します。 「プリンセスはとても美しい」ということは不可能です。「プリンセス」との類似点は何ですか。しかし、中国語の表現から判断すると、皇女は皇帝の娘であり、皇女は皇帝の側室であるなど、「皇帝」という言葉からも連想できるように、実は皇女と皇女は密接な関係にあることがすぐに感じられます。 ; 王女は宮殿に住んでおり、王女は宮殿に住んでおり、「宮殿」という言葉から連想できます; 王女は女性であり、王女も女性であり、「女性」という言葉から連想できます」。

「皇帝」、「宮殿」、「女性」という言葉を連想したので、王女と側室を次のように定義してみましょう。

皇女は皇帝の娘である必要があります。彼女と皇帝の類似性は 1.0 であると仮定します。皇女は生まれてから 20 歳になるまで宮殿に住んでいました。関係の類似性は 0.25、皇女は女性である必要があります。 、女性との関係の類似性は 1.0 です。

側室は皇帝の側室であり、血縁関係はありませんが、一定の関係があります。彼女と皇帝の類似度が 0.6 であると仮定しましょう。側室は 20 歳の頃から宮殿に住んでおり、住んでいます年齢は80歳、宮殿との関係の類似度は0.75、王女は女性である必要があり、女性との関係の類似度は1.0、

したがって、プリンセスとプリンセスの 4 つの単語は次のように表現できます。

Imperial Palace
Dili Girl
Princess [ 1.0 0.25 1.0]
Wangfei [ 0.6 0.75 1.0]
このように、皇女、側室という言葉と、皇帝、宮殿、女性という言葉(特徴)を結びつけると、次のように考えることができます。

王女=1.0*皇帝+0.25*ゴンリ+1.0*女性

王女=0.6*皇帝+0.75*ゴンリ+1.0*女性

または、このようにして、歌詞のないすべての単語が同等であると仮定します (注: 説明を簡単にするため、単なる仮定にすぎません)。

Imperial
Palace Dili 女性
王女 [ 0.5 0.125 0.5]
主 [ 0.5 0.125 0.5]
国王 [ 0.3 0.375 0.5]
側室 [ 0.3 0.375 0.5]
このようにして、いくつかの単語、または 3 つの特性を持つ単語を特徴付けることができます。次に、皇帝をフィーチャー (1) と呼び、宮殿をフィーチャー (2) と呼び、女性をフィーチャー (3) と呼びます。したがって、プリンセスとプリンセスの間の暗黙のフィーチャー関係が得られます。

側室=王女の特徴(1)×0.6 +王女の特徴(2)×3+王女の特徴(3)×1

それ以来、私たちはテキストのワンホット エンコーディングを疎な状態から密な状態に変更し、独立したベクトルを本質的に関連した関係のあるベクトルに変えました。

では、Embedding レイヤーは何をするのでしょうか? これは、いくつかの線形変換を通じて疎行列を密行列に変換します (CNN の全結合層で変換され、テーブル ルックアップ操作とも呼ばれます)。この密行列は N を使用します (この例では N=3)。この密行列では、見た目は密行列と単一の単語との 1 対 1 の対応を表していますが、実際には多数の文字、単語、さらには文章も含まれています。そして私たちが手に入れたプリンセス)。それらの間の関係は、埋め込み層によって学習されたパラメータによって表されます。疎行列から密行列へのプロセスは埋め込みと呼ばれますが、それらの間には 1 対 1 のマッピング関係もあるため、多くの人はこれをテーブル ルックアップとも呼びます。

さらに重要なことは、この関係はバックプロパゲーションのプロセスで常に更新されるため、複数回の反復 (エポック) の後、この関係は比較的成熟し、セマンティクス全体と文間の各関係を正しく表現できるようになります。この成熟した関係は、埋め込み層のすべての重みパラメーターです。

埋め込みは、独立したベクトルを一度に関連付ける自然言語処理 (NLP) の分野で最も重要な発明の 1 つです。これは何に相当しますか? あなたはあなたの父親の息子、あなたの父親はAの同僚、BはAの息子であり、彼らはあなたと密接な関係にあるようです。その結果、B を見ると、それはあなたのデスクメイトです。埋め込みレイヤーは、この秘密を発見するために使用される武器です。

Pytorch には、直接呼び出すことができる特別な埋め込みがあります。

nn.Embedding(vocab_size, embed_size)

おすすめ

転載: blog.csdn.net/qq_54708219/article/details/129331889