fasttext

Word2Vecの延長線上として、Facebookが開発したのがfasttext
-> より精度の高い計算を高速に実行
-> 字面の近しい単語同士により意味のまとまりをもたせるという手法を提案

基本的なアルゴリズムはWord2Vecと一緒そうですね。。
毎回計算するのではなく、キャッシュ化して計算を高速化しているのでしょうか。

論文
Enriching Word Vectors with Subword Information
skip-gram model is to maximize the log-likelihood
TΣt=1 ΣceCt log[p](wc|wt)
where the context Ct is the set of indices of words surrounding wt

-> 自然言語処理の歴史やコミュニティの勉強をかなりしている
-> 論文読む予備知識がかなり必要
-> とは言え、論文も身近な存在

自然言語処理の論文って言うと、勝手に院卒エンジニアの専門領域って先入観があったけど、別に誰でも読めるしアクセスできるんだなー

Word2Vec

Word2Vecの使い方
-> テキストや発話を大規模に集めてデータベース化した言語資料の活用
-> それまでは、表現方法としてone-hotベクトルや単語文脈行列をSVDで次元圧縮したベクトルなどが使われていた
-> one-hotベクトルは単語の数だけ次元を持つ方法
-> 分散表現では単語の意味をベクトル化する

word2vec

It was recently shown that the word vectors capture many linguistic regularities, for example vector operations vector('Paris') - vector('France') + vector('Italy') results in a vector that is very close to vector('Rome'), and vector('king') - vector('man') + vector('woman') is close to vector('queen') 

Word Cosine distance と記載があるので、cosineの距離でしょう。
word2vecでは、単語が文中で交換可能かに注目している

Continuous Bag-of-Words
前後の単語から単語を推測する

Skip-gram
単語から周辺単語を推測する

なるほどー、アルゴリズムの仕組みとしては、”前後の関係性”で単語をベクトル化しているのか。。
それを膨大な量でやるのね。

ただし、日本語の場合は、形態素分析をしないといけない。あれ、mecabと組み合わせるのかな。

線形代数、ベクトル

データを複数個収めることができるように、要素を1列に並べたものをベクトルと呼ぶ

単語をベクトル化するWord2Vecという概念がある
Word2Vecは、単語一つ一つを1列に並べたベクトルに変換
ベクトルに変換すると、足し算、引き算を行うことができる

同じような意味の単語群から、同じような周辺語を予測している??

ベクトルは有向線分で視覚化できる。スカラー倍も考えうる。
ベクトルの足し算、引き算は矢印で考える

Fast Artificial Neural Network Libraryを使ってみる

まず、libraryを入れます。

[vagrant@localhost fann]$ sudo yum install fann-devel
あれ、全然うまくいってない。。

$num_input = 2;
$num_output = 1;
$num_layers = 3;
$num_neurons_hidden = 3;
$desired_error = 0.001;
$max_epochs = 500000;
$epochs_between_reports = 1000;

$ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);

if ($ann) {
    fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

    $filename = dirname(__FILE__) . "/xor.data";
    if (fann_train_on_file($ann, $filename, $max_epochs, $epochs_between_reports, $desired_error))
        fann_save($ann, dirname(__FILE__) . "/xor_float.net");

    fann_destroy($ann);
}

ぬ、やっぱり。
[Fri Aug 30 08:52:09 2019] 192.168.33.1:60110 [500]: / – Call to undefined function fann_create_standard() in /home/vagrant/local/fann/index.php on line 10

ぐ。。