fastTextで取り組める3つのことfastTextが従来手法に比べて精度を落とさず高速に処理出来ることは分かった。元の技術を辿ると利用用途は大きく3つに分けることが出来る。ベクトル表現を構築することは実用の一歩手前だ。開発者や研究者が素早く対象の単語や文章におけるベクトル表現をつくることによって、分類や推薦といったことに応用されていく。以下では、同様の技術で開発された実用例を紹介していく。Facebookはニュースフィードから釣り見出しを排除するためにfastTextをつくった?Facebookでは8月3日に、クリックベイトと呼ばれるタイトルを誇張しクリックを誘発する「釣り記事」を撲滅するアルゴリズムを導入することを発表した。「ベッドの下を覗くとなんとこれがいました。「ニンニクを靴に入れてみた。「犬が配達人に吠えた!その瞬間に・・・」といった続きが気になるタイトルを付け、中身を見たら「ガッカリ」といったユーザー体験をニュースフィードから排除することが狙いだ。ここに、fastTextが利用されている可能性が高い。文書分類は商業界でとても重要です。スパムやクリックベイドを排除することはひょっとしたら最も普及している応用例かもしれません。書いてあるので、fastTextが応用されていることは間違いないだろう。誇張したタイトルでクリックさせ、期待したコンテンツではない記事は排除対象となる。fastTextを使って人力でこういったコンテンツのデータセットを構築し、「釣り記事」判定をしていると思われる。こちらは「分類」の例だ。リクルートテクノロジーズでは、レコメンドに応用こちらは「推薦」の例だ。リクルートテクノロジーズの自然言語処理の適応事例というスライドを参考にすると単語のベクトル表現を学習し、類似度を計算することで、アイテムレコメンドの精度が向上しCVRが31%改善したサービスと156%改善した事例があるのだそう。その後、ユーザーの行動履歴を学習し、合成ベクトルを計算することでユーザーの嗜好をかなりの精度で理解するようになりCVRが27%改善したそうだ。サイバーエージェントが実用化したAWAでのアーティストレコメンドこれも「推薦」の例だ。サイバーエージェントとエイベックス・デジタルが提供しているAWAという音楽配信アプリでは、アーティストのレコメンドの機能に同様の技術を使っているようだ。ユーザーの音楽視聴履歴から、類似アーティストを計算できるようにするartist2vecというベクトル表現を構築し、レコメンドに応用している。音楽聴き放題サービスAWAにおけるレコメンド手法の検討という論文中には、1.7%のレコメンド精度向上4倍のレコメンドするアーティスト数と、「新たな楽曲・アーティストに出会える」というサービスの思想に貢献したようだ。Yahoo!はレシートメールの文章から製品をオススメするこれも「推薦」の例だ。Yahoo!メールではメールのレシートに記載された内容を利用して、購買履歴を特定し広告ターゲティングするシステムを構築したようだ。AmazonなどのECサイトのメールを判定し、単語や文章を利用している。2900万人を対象に実験してみたところ、CTR(クリック率)が9%改善したそうだ。◯2Vecを考えれば推薦に応用できる「推薦」に関して言えば、同様のことは他の領域でも可能だろう。商品・アーティストといったものを、不動産・映画...としていけば同様のレコメンド方式を構築することは可能なはずだ。従来手法よりも精度が高くなっているものも多いので、fastTextで高速化されればもっと施策を試しやすくなり応用先も広がると考えられる。fastTextを安全に使うために必要な理論そんなfastTextを使うためにはある程度知識があると役に立つだろう。単語が分からなければ何をしていいか分からず、不安な気持ちになるはずだ。そこで、特に不自由なく利用できるようになるために、最低限の知識を紹介する。単語をベクトル表現化するWord2VecWord2Vecという単語を聞いたことがあるだろうか?これは、単語の意味や文法を捉えるために単語をベクトル表現化したものだ。「プログラマー」という単語は、何らかの数値を持たないので単にラベル付することが多い。100万単語あるとしたら、100万次元のベクトルとして各要素をそれぞれの単語に割り当てるといった具合だ。「イチロー、プログラマー、パリ、道頓堀、打つ」という5単語をワードセットとして、プログラマーを表すベクトルは以下のようになる。このように「プログラマー」の要素だけ1となっており、他の要素はすべて0とする。これを「one-hotベクトル」と呼ぶ。これだと同一単語かどうかの比較以外に演算処理しても全く意味が無い。そこで、もっと表現豊かなベクトルにして、演算処理までできるように単語の分散表現というものを提案した。分散表現では通常200〜1000次元くらいのベクトルであり、先ほどのような各要素ごとにマッピングするのではなく、単語の定義によってベクトル化していく。自分で定義する必要はないが、想像しやすくするために定義するとといった具合に抽象的な意味を表現するようなベクトルになっていると考えて欲しい。「東京」のような演算をすることが出来るようになり、単語間の意味に基いて関係性を理解することができるようになる。意味のあるベクトルをニューラルネットワークの入力層として利用することもできる。詳しくは以下を参考にして欲しい。Word2Vec:発明した本人も驚く単語ベクトルが持つ驚異的な力ベクトル表現を構築するアーキテクチャでは、そんな単語の意味ベクトルを構築するためにはどうすればいいのだろうか?モデルを構築するためのアーキテクチャとしてfastTextにも備わっている2つのオプションがある。CBoWとSkip-gramだ。Bag-of-Wordsの略である。文脈中の単語から対象単語が現れる条件付き確率を最大化することである。前後の単語から対象単語を推測していくことになる。ひとたびフルスピードで回り始めたなら、それを動かし続けるのに努力は必要ない。いう文を考えてみよう。必要]の単語リストそれぞれのone-hotベクトルを入力として、真ん中の「続ける」が来る確率を最大にするように学習させたい。そこで、このような単層ニューラルネットワークを構築するとW2の重み行列がスコアを計算するためのモデルとなる。Skip-gramSkip-gramはCBoWの逆だ。単語からその周辺単語を予測する。出力層における周辺単語予測のエラー率の合計を最小化することである。必要]を予測することだ。Skip-gramは学習データが少なくてもある程度の精度がでるとされている。CBoWよりもSkip-gramの方が実験では意味的な精度が高くなり、構文の精度ではあまり大差はないようだ。fastTextを使ってみようそれではfastTextを使ってみよう。fastTextはGitHubでオープンソースとして公開されているので無料で利用できる。fastTextをインストールする以下のコマンドでダウンロードすると実行できるようになる。学習するためのデータセットを準備するために、Twitterからツイートを取得してみる。Streamingからツイートを収集してみよう。spark-twitter-stream-exampleというScalaプロジェクトがあったのでちょっと修正して使えるようにする。Twitterのトークン等が必要になることに注意しよう。build.sbtにkuromojiを追加して形態素解析できるようにする。"1.2.1")TweetExampleは日本語を取得して形態素解析するように修正する。runとして、数十分から数時間待つと十分なデータ量が手に入る。収集したデータを最後にPythonでfastTextが読み込める形にしよう。スペース区切りにすればいいようだ。tweet.txtとするとfastTextが読める形になる。単語のベクトル表現の構築これでようやく辞書構築することができる。Proで1万2791単語をたったの2秒で学習した。IPythonで確認IPythonでチェックしてみよう。'なせ']Twitterでの頻出単語だとより多くのデータを学習しているので、精度高く近い単語が得られそうだ。「フォロー」という単語のコサイン類似度を取ってみると、「フォロリク」や「リフォロー」などTwitterでよく利用される単語が出てきた。ディズニーもなんとなく(?)似通った単語になっている。「こんにちは」も同じような文脈で使われそうな単語が取れた。大量のデータで学習するとより幅広い単語にも対応できそうだ。文書分類に挑戦するlivedoorのニュースコーパスを使ってみよう。リンク先からldcc-20140209.tar.gzという名前のファイルをダウンロードしてdata/textディレクトリに展開する。今回もfastTextで読める形に直そう。単語をスペース区切りにした本文を行とする。livedoor.pyというファイル名で以下のコードを書いた。data/livedoor.txtとして実行しよう。訓練用のデータセットと学習用のデータ・セットに分ける。rand_split.pyというファイル名で以下のコードを実行する。rand_split.pyこれで学習の準備が整ったのでfastTextを使ってみよう。今回は、合計でも7000記事程度しかないのでepochを上げて学習させてみる。771それでも56秒で学習は終わった。94.7%の精度で分類することができたようだ。まとめここまで、Facebookが公開したfastTextというライブラリを使って分散表現を作る方法と簡単な解説をした。fastTextは自然言語処理におけるビッグデータを処理するタスクを実用レベルにまで高速化したものだ。ビッグデータは幅広いニーズや特徴を掴みに行くことができる。学習も速く、分類処理もリアルタイムで返せるとなると利用価値が高いのではないだろうか。自然言語処理とベクトルを使うことで、ユーザーの趣味・趣向に合った推薦やスパムといった悪意のあるデータを取り除くこともできる。サービス運営者としては、こういった技術を活用していくことでコスト削減やユーザーをより安心に快適な環境を整えてあげるという価値提供できる。今後、データ活用こそ企業の競争力になるはずだ。自然言語データ・行動データを活用して今後の役に立てて頂きたい。音楽聴き放題サービスAWAにおけるレコメンド手法の検討TweetDeepAgeではAIに関する厳選した内容を記事にしてお届けします。Learningの火付け役となったDropout。過学習を簡単な実装で防ぐことができるその実力と正則化について解説しました。2016-Oct-17TensorFlowのデータフォーマットTFRecordの書き込みと読み込み方法TensorFlowが推奨するデータフォーマットはTFRecordです。本記事では、TFRecordを使う理由、メリット、使い方を徹底的に解説しました。APIは、TensorFlow1.2から新しく追加された機能です。APIの使い方を徹底解説しました。