見出し画像

Word2Vec から始めよう

[友近] 今の技術トレンドに乗るためにW2Vを習得しよう。
[鴨井] それって本当に必要なんですか?
[友近] 必要というか必須だよ。なくてはならないレベルだね。
[鴨井] はあ。
[友近] この技術の特徴は、文書集合から単語の意味を学習する、学習した単語が密なベクトルで表現される、の二点かな。
[鴨井] そんなの実装できるんですか?
[友近] それが実現できたことがブレークスルーになったんだよね。ここで重要になる考え方として、“単語は近くの単語と似たような意味を持つ”という仮定を用いることなんだ。
[鴨井] え、それはおかしくないですか。だって違う意味の単語が並ぶはずでしょう?
[友近] 単語レベルではそうだ。だが文書のレベルでいえば一つの共通の意味を表現するためのパーツだから何かしらの共通性を持つ、とも考えられる。…この部分については理論的な保証があるわけではないんだ。だからあくまで“直感的にはそうだよね”くらいの位置付けだね。
[鴨井] なんだかなぁ。
[友近] それでも上手く性能は折り紙つきだから避けては通れないよ?さて、では次のステップとして共通性を持つことを共起確率が高いと考えよう。その考え方の一つとして、“ある単語が出現する時には、その前後に似た意味を持つ単語が出現する可能性が高い”と。これをskip-gramという。
[鴨井] はあ。
[友近]そしてこの確率を目的関数として最大化することでとあるシステムが得られる。
[鴨井] とある?
[友近] そのシステムの全体像はこんな感じだ。

w2vのシステムの図

[鴨井] え、これでなんの意味があるんですか?
[友近] ここで図の中央の部分に注目するんだ。…どう思う?
[鴨井] どうもこうも、よくわかりませんよ。
[友近] うん、それじゃあ、単語の情報がどのように処理されていくのかを追っていこうか。

単語→ワンホット→線型結合→隠れ層→線型結合→各単語の出現率を表すベクトル

[友近] ここで重要なのは隠れ層の部分だ。まず左から順に追っていくと、まず単語はワンホットベクトルに変換される。
[鴨井] とりあえず、ベクトル表現になるんですね。
[友近] 次にそこに重み行列をかけて、隠れ層が出力される。
[鴨井] 隠れ層ってなんですか?
[友近] ここではベクトルだね。
[鴨井] あれ?さっきもベクトルでしたよね。
[友近] それでは今度は右から考えよう。各単語の出現率を表すベクトルは重み行列を隠れ層にかけて得られる。ここで意識するべきは、計算によって得られるベクトルは二種類あるということだ。
[鴨井] 二種類ですか?
[友近] 一つは単語のボキャブラリを長さにした、出現率を表すベクトル。そしてもう一つは隠れ層だ。
[鴨井] いまいちピンとこないんですけど。
[友近] これはボキャブラリのベクトルが異なる次元の特徴空間へと射影されているということだ。
[鴨井] ちょっとついていけないんですけど。
[友近] そして共起確率が高いということは特徴空間で近い位置に存在していると理解できる。
[鴨井] はあ。
[友近] とすると、この隠れ層での状態は特徴空間に射影された後の状態ということだ。隠れ層が一つだけの簡単なNNを学習するだけで、特徴空間への射影を実現するシステムが得られるんだ。
[鴨井] つまり?
[友近] ワンホットベクトルを密ベクトルにするシステムが作れた。
[鴨井] なるほど。
[友近] まあ、一度自分で計算の流れを図にしてみるといいよ。それほど複雑ではないからゆっくりとやればわかるさ。
[鴨井] それで、w2vはいつ出てくるんですか?
[友近] うん?もう説明は終わったよ。
[鴨井] は?えっと、どの部分ですか?
[友近] この“ワンホットベクトルを密ベクトルにする”って部分。
[鴨井] え、こんな簡単そうな話がブレークスルーなんですか!?
[友近] 得てして知識というものは分かってしまうと簡単に思えるものさ。
[鴨井] えぇ…。
[友近] まあ、簡単なモデルだから自分で作ってみようか。
[鴨井] 作れるんですか?
[友近] 作れるとも。まあ、君はNNの仕組みの専門家ではなく利用者になるんだから、ある程度のツールは活用させてもらうけどね。
[鴨井] ツール?
[友近] 今回はpythonとそのライブラリのpytorch を使って実装してみよう。
[鴨井] 僕、プログラミングとかあまり得意じゃないんですけど。
[友近] 大丈夫。ちゃんと助けてあげるから!以下の教材でね!


私にカフェオレを飲ませるためにサポートしてみませんか?