ホーム » 自然言語処理

自然言語処理」カテゴリーアーカイブ

Variational Bayes 入門

こんにちは。kzです。

本日は変分ベイズやります。ちなみに呼び方はいくつかありまして、変文ベイズ、変分推論、Variational Approximation(変分近似)など。

変分とは?

そもそも変分ってなに!って感じですよね。実はこれ微分方程式とか汎関数とかが関わってます。

例えば点推定である最尤法はスコア関数(対数尤度)を微分して解を求めますよね。変分法はこれを拡張した概念です。

つまり、関数の関数の微分が変分です。
変分とは汎関数の微分です。詳しくは調べていただくとすぐわかりますが例えば最短曲線など求めるときはオイラーラグランジュ方程式と変分法を用いたりします。

変分ベイズとは?

事後分布p(\theta, X)を求める手法の一つです。MCMCと同じ感じ?と思った方もおられると思います。はい、MCMCも事後分布を求める手法です。

ではもういきなりですがVBとMCMCどっちがいいの?という疑問が生まれます。
ずばり、一番の違いは速度です。一般的にはVBの方が早く、計算の多いMCMCは遅いです。データXが多いときはVBの方がいいかもしれません。ただ上にあるようにVBは漸近的に分布を保証するわけではありません。

まずは変分下限の登場です。EMアルゴリズムの時と似てます。
zは潜在変数(パラメータ)です。H[z] = - \mathbb{E}_q[\log q(z)]は前回登場したShannon entropyですね。最後の式が変分下限です、Lと置くことにします。
せっかくなのでKLダイバージェンスとの関係も見てみます。
目的は事後分布p(z|X)を近似することです。なのでq(z)でKL最小化を目指します。式の最後で出てきたLは先程と同じ。つまり、KLの最小化は変分下限の最大化に等しいことがわかりました。

しかもよくみてください、KLって汎関数ですよね。

Mean-Field Approximation

変分ベイズでは平均場近似という重要なポイントがあります。これはq(z)に与える次の仮定です。

つまり、各潜在変数が独立であると仮定します。すると変分下限は次のように書き直せます。
計算を整理するために次を用います。対象の変数以外での期待値です。
これを用いて先程の式をさらに展開していきます。
iに注目していただければわかりますが、くくりあげています。第二項はiを除くjの項です。ラグランジュを用いて次の目的関数を得ます。
ここで変分法を使います。具体的にはq_j(z_i)に関してEuler-Lagrangeを用います。
ここで、Z_iは正規化定数と呼ばれるものです。以上からわかるようにq_iの最適化には他のすべてのq_jが必要になるのでイテラティブな更新になります。

一変数ガウスの例

次のような例を考えます。

変分ベイズを用いてパラメーラ\mu, \tauの分布を逐次的に求めます。まず以下の尤度をばらしておきます。
また平均場近似より次を仮定します。
では先程の計算を用いてq_\muを計算します。
\muに関して平方完成して以下を得ます。
同様の作業を次は\tauについて行います。
ガンマ分布に注意して
以上より
がわかりました。これより各期待値も簡単にもとまります。
したがって
を用いて更新すればいいことがわかります。
もう一つの例として混合ガウス分布をVBを使ったEMで求める例がありますが、非常に難しいので詳しくは以下をご覧ください。

応用

難しすぎて実装できませんでしたが変分ベイズを使った応用はたとえば自然言語処理におけるLDAがあります。とても難しい、、、、でわ

References

Feature Importanceを知る

こんにちは。kzです。

世の中ではやはり解釈性が重要らしいです。

前回、SHAP含めてモデル解釈の指標についていくつか触れました。やはり一度では僕は残念ながら理解できないので復習も含めて今回この記事を書きます。

前回の復習

上記のリンク先が前回の記事になります。

  • Permutation Importance
  • Partial Dependence
  • LIME
  • SHAP
雑におさらいするとPIは対象の変数をシャッフルして精度の変化からその変数の影響力を見る手法。PDは対象の変数以外を周辺化で消すことによってその変数のみの影響力を見る手法。LIMEは対象の入力データ周辺でブラックボックスモデルを線形近似しその重みでそれぞれの変数の寄与具合を見る手法。SHAPはLIMEのモデルに複数の制約(Consistencyなど)を与えてできた特殊な距離を使った手法(LIMEの上位互換)

ちなみに他にもDrop-Column Importanceとかもあるらしいです。

Feature Importance

順番的には逆になってしまいましたが、決定木自体にはFeature Importanceというものがあります。ご存知ですよね。どうやって算出されてるのや?と思ったので調べました。結論から言えばあまりにも式が複雑で完全に理解し切るのはかなりハードです。。

なのでその計算の核となるGini Impurityから始めます。

Gini不純度

あるノードにおけるGini不純度は上のように定義されます。記号については以下の通り

  • Cはクラスの総数
  • p_iはクラスiの割合
分類においては各ノードではできるだけ少数のクラスであって欲しいですよね。具体的に計算してみます。
         二郎系   家系     まぜそば 
count = 4 4 4
p = 4/12 4/12 4/12
= 1/3 1/3 1/3
GI = 1 - [ (1/3)^2 + (1/3)^2 + (1/3)^2 ]
= 1 - [ 1/9 + 1/9 + 1/9 ]
= 1 - 1/3
= 2/3
= 0.667
各クラスから均等な量の場合とあるクラスに偏りがある場合
         二郎系   家系     まぜそば 
count = 3 3 6
p = 3/12 3/12 6/12
= 1/4 1/4 1/2
GI = 1 - [ (1/4)^2 + (1/4)^2 + (1/2)^2 ]
= 1 - [ 1/16 + 1/16 + 1/4 ]
= 1 - 6/16
= 10/16
= 0.625
少し小さくなりました。ではあるノードにおいて単一のクラスのみある場合はどうでしょうか。
         二郎系   家系     まぜそば 
count = 0 12 0
p = 0/12 12/12 0/12
= 0 1 0
GI = 1 - [ 0^2 + 1^2 + 0^2 ]
= 1 - [ 0 + 1 + 0 ]
= 1 - 1
= 0.00
0となりました。きれいに分類できている証拠ですね。決定木のFeature ImportanceはこのGiniを用いて算出されているようです。 参考文献によると
とありました。難しいですが、要は最後の式だけ見ればなんとなくわかります。分母は前ノードにおけるImpurity Reductionの総和であり、分子は対象の特徴量jによる分岐ノードでのImpurity Reductionの総和となっています。

つまり、対象の特徴量が木全体においてどれだけGini不純度の減少に寄与できたかという指標でFeature Importanceが算出されているということです。

ということはです。分岐点を多く作りやすい変数の方が相対的にFeature Importanceが大きくなるのは直感的ですよね。単純に考えるとカテゴリカル変数よりも連続値変数の方がFeature Importanceが相対的に高まってしまうということです。さらに木を深めることで多くの分岐点が生成されるのであればその効果は莫大です。

実際Feature ImportanceにはCardinalityが密接に関係します。次にCardinalityについてみてみます。

Cardinality

みんな大好きKaggleにおいて次のような質問があった。
タイタニックデータをxgboostでバイナリ分類したのちfeature importanceをみた結果、特徴量の1つであるSexは目的変数と高い相関があるにもかかわらず、比較的低いimportaceが得られたらしい。 これに対して気になるコメントがあった。
なにを言っているのかというと。カーディナリティによってfeature importanceにバイアスが生じる。high-cardinalityはhigh-importanceを持つ。これが原因でSexが相対的にlow-importaceになっている。

ここでカーディナリティとは、対象の変数の多様性のこと。つまり性別のようなカテゴリカル変数よりは連続値の変数の方がカーディナリティは相対的に高い。

これはまさに上記のGiniの定義より得られた考えのことだ。よってさきほどのFeature Importanceに対する理解は正しかったということだ。

Information Gain

実は決定木における重要な指標はGini Impurityだけではなく、Information Gain(平均情報量)というものが別であります。
じゃあ、どっちを決定木では使うの?どっちのほうがいいの?という問に対する答えはGini Impurityです。理由は簡単で計算が楽だからです。後者を選んでしまうと対数の計算が必要になります。詳しくは次のリンクへどうぞ

LIME

じゃあ、どうしたらちゃんとした、まともな、直感的なFeature Importanceが得られるのか。という問に対する答えは僕の知るベストだとSHAPだ。もうSHAPしかない。

上述した理由から決定木におけるFeature Importanceに信憑性はない、結果的に重回帰がやはり好かれている。しかし、分類という点においては決定木やNNには重回帰では残念ながら勝てない。

最高に分類できる状態を保ちつつ、重回帰のように最高の形でFeature Importanceがほしい、という欲求を満たしてくれるのがSHAPだ。LIMEの上位互換なのでやってることはほぼ同じ。

記事の最後になりましたがここでは低次元空間においてLIMEの振る舞いを簡単に実装してSHAP(LIMEの上位互換)のイメージを理解します。下のような非線形データを考えます。
可視化に力をいれたいのでgridでデータを再度作成し、とあるインプット(青)を考えます。このインプットしたいするlimeを求めます。
LIMEもSHAPもローカルなので局所的な空間を考えます。多様体の言葉でいうとチャート、または局所座標近傍です。
距離関数としてL2距離を算出します。実際にロス関数を定義して重みを最適化するのではなく、この距離を線形回帰のライブラリのweightというパラメータに用いて外れ値を考慮した線形モデルを構築します。
前述通り今回はロス関数を定義して計算しているわけではないので厳密なLIMEの実装ではないので注意。あとは線形回帰モデルを作って重みを取得するだけです。
両軸を特徴量として扱っているので線形モデルの直線は可視化できませんが上のマークより、その振る舞いは理解できたのでわないかと思います。ピンクの部分はプラスでグレーの部分はマイナスと分類されています。その時の切片、係数も取得できます。これがlimeです。 厳密ではないですがLIMEのやっていることは理解できたかな?と思います。

ちなみにSHAPの凄いところは制約3つめのConsistencyです。これによって対象の特徴量のFIがより重み付されます。これによって決定木におけるFIの相対的なつぶれよりも直感的なFIを得ることができます。
SHAPの距離のところがよくわからない。でわ

Reference

モデル評価 入門

こんにちは。kzです。

本日は機械学習のモデルの評価方法についてまとめます。Gistsがかなり重くなってしまったので一発で見れない場合はColabで開くか、Gistsに飛んだのちページを何度か更新してみてください。

分類指標

この記事では分類問題に焦点を当てます。なので回帰におけるMSEとかは話しません。

  • TP / TN / FP / FN (真陽性 / 真陰性 / 偽陽性 / 偽陰性)
  • confusion matrix (混同行列)
  • simple accuracy (正解率)
  • recall (再現率) (sensitivity)
  • precision (適合率)
  • f1 measure (F値)
  • f1 beta measure (重み付きF値)
  • threshold (閾値)
  • ROC / AUC (受信者操作特性 / AUC下部の面積)
  • MCC (マシューズ相関係数)
これらのベーシックな指標についてまとめます。またF-betaについては少し深入りします。でわやっていきましょう。

分類指標の必要性

もちろん、汎用性がめちゃくちゃ高いものがあればそれでいいんですが残念ながら私は知らないです。。。他にも具体例で考えてみましょう。

たとえば、100枚のラーメンの写真をデータセットとします。モデルf

  1. 二郎系だ
  2. 二郎系ではない
という分類をしたとするじゃないですか、Accuracy=99%となったとするじゃないですか、この数値だけ見ればすごく上出来なんですけど仮に100枚中1枚しか二郎系がなかったとしたらfはなにも考えず1を出力するだけで99%とれちゃいますよね。これってfはまともな学習をしていないことになりますよね。つまり、このモデルfよくないですよね。

Confusion Matrix

クラス分類の結果をまとめた表のこと。各要素がTP / TN / FP / FNとなる。ただし、これは二値の場合。しかし多値分類でも同様に作れます。
Pythonで実装する際はパーセンテージも表示させるといいですね。
で、Confusion Matrixの中の指標を一個づつ見ていきます。

Accuracy

もっとも、シンプルかつ、直感的な正答率

Precision

少しの外れを許すが機会損失したくない時に使う

Recall (Sensitivity)

機会損失してでもとにかく正確に当てたい時に使う

PrecisionとRecallの具体例

たとえば全国の二郎系を制覇したいという目的に対してはRecallよりもPrecisionを重視します。なぜならば行ったラーメン店が高い確率で二郎系あっても素通りしてしまっては目標が達成できないからです。

逆にRecallを重視するのはたとえば病気を判別するときです。病気なのに病気ではない、と判断すると大変ですよね

とはいえ、完璧な分類は共に高いのでどうせならこの二つの指標を同時に見たいですよね。つまり。2つの指標を同時に加味して「全体としての良さ」を測りたい時にF_1の登場です。

F1 measure

RecallとPrecisionを同時に考慮する指標です。調和平均という見方もできますがFP + FNが「外れの総数」であることに注意すると外れの平均を考慮した正解率と考えることができます。
しかしです。先程の例のようにどっちかを特別重要視してモデルを評価したい時多いですよね。つまり、recallとprecisionを同じくらい重視して全体の良さを図るのではなくどちらかを相対的に重視したモデルの良さの指標が欲しい時の方がぼくは多い気がします、そこでF-betaの登場です。

F-beta measure

RecallとPrecisionに重みを加えたF measureです。いわば一般化です。
Precisionを重視したいなら  (F_0 = Precision)

    \[ \beta \in (0,1) \]


Recallを重視したいなら  (F_\infty = Recall)

    \[ \beta \in (1,\infty) \]


\beta=1のときはまさにF1となります。 しかしです、この式おかしいと思いませんか?相対的に重みづけするならば一方がw_1 \in [0,1]でもう片方はw_2 \in [0,1]だと思いませんか?つまり
のほうが自然なF-betaですよね?え?ぼくだけ、、?笑。まあそういうことにしてちょっと聞いてください。

van Rijsbergen’s E (effectiveness) function

F-measureは実は別の指標から導出されたものらしいです。起源は次のもの
前述のF_\betaの定義が[Chinchor, 1992]なのに対してこれは[van Rijsbergen, 1979]です。たしかに古い。

代入して変形します。
この関数ER, P \in [0,1]でプロットしてみます。

次は\betaを動かしていってF_\betaを見てみます。Eではないことに注意。
で、このグラフを頭に置いたまま話を戻すと関数E(R, P)\alphaはなぜあのような形なのか?気になります。調べますと次の条件を満たすようにされているらしいです。
真実を確かめるために計算していきます。
ここで \beta=R/P なので R を \beta P^2と置き換えて
と、確かに導出されました。しかし、勾配が等しくなるという条件にどういう意味があり、なぜ必要なのかは理解できませんでした。すいません、、

とはいえ、わかったことをまとめると直感的な加重調和平均は\alphaの方だということ。重み\alphaに戻して考えると\betasqrt{2}のとき重みが1/3対2/3になり、たしかに直感的に2倍の重みを置いていることになりますね。

ROCとAUC

確率出力に対して最もいい閾値を見つけると同時に、モデルを比較するための指標をグラフ化したものです。

グラフ上の点は特定の閾値を用いてラベリングされたのちの混合行列から算出されたspecificity, sensitivityである。次の動画がかなりわかりやすいので絶対見てください。

簡単にまとめると、例えばロジスティック回帰を用いた2値分類を考えます。この時に閾値をいくつにするかが問題ですよね。出力の確率と閾値を比較して大きければ1,小さければ0のようにラベルを振る必要があるからです。つまり実数からカテゴリカルに変換する必要性。

ということはです、もちろん閾値と混合行列は一対一対応します。

どの閾値がもっともいい分類をしてくれるのか?という問に答えてくれるのがROCです。

そしていくつかのモデルに対してどのモデルがいいか、つまりどのROCがいいかという問に答えてくれるのがAUCです。
各軸はTPR、FPRとよばれます。言い換えると縦がRecallで横が(1-Sepecificity)です。つまり左上に近づくほど理想的であることがこの定義よりわかります。

そして上の図中の点ですが、これひとつひとつが特定の閾値によって算出された混合行列を用いて計算されたTPR、FPRです。

ここでわかったこととして他クラスのROCはそう単純ではないということです。sklearnに実装はありますがバイナリ で実装されているのか閾値をクラス数で分割しているのかわかりませんが、理論上はそう簡単にROCが作れないことは気にかけておいた方がいいと思います。

MCC

各クラスのサイズが非常に異なっていても使用できる評価指標です。

この記事の冒頭で極端な例をあげましたが、実世界の分析においてはよくあることだと思います。ですのでその点ではいい指標だなと思います。
でわコードを貼って終わりにします。
パラメータ空間は位相空間。でわ

レコメンデーション 入門

こんにちは。kzです。

本日はレコメンデーションやります。大昔にチラッと見たんですけどあの頃は興味がなくて全然してませんでした。ということで気が向いたのでやってみます。MFをメインに3つの手法を紹介します。発展版は次回の記事にします。

まずは用語からまとめます。どうやらレコメンデーションには2種類があるようです。

Recommendation System

Recommendationには2種類あります。

  • User Based Recommender Systems
  • Item Based Recommender Systems
まずUser Based Collaborative Filteringについてです。Collaborative filteringは上からわかるように自分と他のユーザーの経験をデータにレコメンドします。手順は次の通りです。

  1. [ USER x ITEM ] 行列を作成
  2. USER間の似ている具合を計算
  3. 似ているUSERを選択
  4. そのUSERの過去の経験からレコメンド
例えばAさんが二郎系がめっちゃ好きで通い詰めてるとします。Bさんは最近二郎系にハマり出したとします。Cさんはラーメンが好きじゃないとします。ラーメン屋の数が10とすると行列は3 \times 10になります。ここでたとえばコサインを使って距離を測ります。するとBさんはAさんと距離が近くなります。そこでAさんが過去に行った二郎系をBさんにレコメンドするという流れです。

他にも購入履歴だったり、欲しい物リストとかですね。

ただ、このユーザーベースはたとえば年齢の変化につれて趣味も変わりますし、環境によっても変わりますよね。そこでアイテムベースという考え方を紹介します。これは先ほどとステップはほぼ同じですが異なる点は距離の対象です。先ほどはユーザー間の距離を測りましたが今回はアイテム間の距離を測ります。なのでたとえば相関をとって同じようなラーメンをレコメンドしようといった流れです。

なので動画のratingやジャンルはこちらにあたります。(ratingがこっちにくるのはイマイチふに落ちませんが)

もちろん長所と短所はそれぞれあります。ここでは一部だけ紹介します。詳しくは次のリンクへどうぞ。

行列のサイズをイメージすればわかりますが例えばアイテムが少なければコンテンツベースの方がいいです、逆にアイテムについて事前知識がなければ(ラーメンの具材など)ユーザーベースの方がいいのは自明でしょう。

ではこのくらいにして今回扱う3つの手法を簡単に説明します。他にも強強な手法がありますがまだよくわかっていないので次の記事で深入りできればなと思います。今回は触りです。

データ

その前にデータの説明ですがUser \times Movieの行列になります。kaggleからとってきました。各要素にはratingが入ります。たとえばaさんのスターウォーズに対するratingは4といった感じです。評価なしの要素は0で埋めます。これが今回の欠損値処理になります。今回はおすすめの映画をレコメンドすることを目的に話を進めていきます。

Correlationをとるだけの作戦

まず一つ目はcorrelationをとる方法です。映画同士の相関を計算して同じような映画をレコメンドする作戦です。簡単すぎるのでスキップします。

SVDを使う作戦

二つ目はSVDを用いて潜在的な特徴を作成し、それを使って未知のratingを計算してレコメンドする作戦です。
上の図がSVD分解といわれる行列の分解です。PCAの一般化です。なぜなら非正方行列でも分解できるからです。Xがデータの行列になります。これを三つの行列の積に分解します。

まず注目してほしいところはkです。これが潜在的な特徴量の次元になります。特異値と固有値の関係を考えると、固有値が寄与率なら関与することから特異値の最小値が0になるように選べばいいのではないかと個人的に思ってます。解釈についてはたとえば今回の例だとitemはmovieなのでk=genreの数とすれば理解しやすくなるんじゃないかと思ってます。

次にUVです。これは簡単な計算から固有ベクトルが並ぶことがわかります。これはPCAと同様で重要な軸と捉えればいいと思います。特徴量ベクトルとも言われます。というのはたとえばUの行ベクトルは各ユーザーの特徴を持ったベクトルになるということです。

分解後に行列の積を取ることで未知のratingを計算して映画をレコメンドする手法です。計算については次のmfの方がわかりやすいのでそちらで解説します。ちなみにSVDは自然言語処理でもつかわれます。

ただ、勘のいい人なら気づくと思いますが今回の行列ってかなりスパースなんですよね。SVDはスパースだとよくないらしい。そこで強強のMFが登場するわけです。

Matrix Factorizationを使う作戦

先ほどとは異なり。元の行列Xを二つの行列の積で近似します。この二つの行列がそれぞれユーザー行列、アイテム行列的なイメージです。つまり、画像の白い部分がそれぞれの特徴量ベクトルになります。(SVDと同じです。)たとえばaさんの映画に対する特徴量ベクトルとスターウォーズの特徴量ベクトルの内積をとることでaさんのスターウォーズに対するratingを計算しようということです。ここでのrは先ほどのkと思ってもらえればよくて、つまりジャンルの数的なものです。こちらが指定するハイパーパラメータです。

これはMatrix Factorizationというアルゴリズムですがこれが凄すぎたので解説します。

もともとネットフリックスの映画のレコメンドのコンペがあったようで、その優勝者が提案したアルゴリズムらしいです。
先ほどのSVDはスパースが問題でした、というのは見てない映画はratingは存在しないつまりゼロ埋めですし、見ていても評価していない可能性もあります。しかし、MFはそんな欠損値を無視できます。なぜならば上の図のデータ集合を見てください。observedつまりratingがある要素のみを行列から取り出して学習データにします。

MFのアルゴリズムは単純です。勾配法を使ってユーザー行列、アイテム行列を更新していき、元の行列Xに近似しようというものです。なので上の図で目的がそれぞれの行列の最小化になっています。(v_{ui}はXのrating成分です。)

で、このままやってもいいんですけど、正規化項を付与しちゃいます。
すると更新式は結局つぎのようになります。
\lambdaは正規化項パラメータ、\gammaが学習率です。

まとめますと
とはいえやってみましょう。
他にもK-平均法とかRNNを使った方法とかいろいろあります。それにしてもMFを考えた人ほんとうに天才だと思いました。でわ

Reference

ハイパラ最適化に困ってるんやろ?Optunaやで

こんにちは。kzです。

久しぶりに欲しいものができたんですよね。無印の「軽量オーストラリアダウンポケッタブルマフラー」なんですけどオンラインでも全部在庫がないみたいで入荷を心待ちにしています。

そんなことはおいておいて、本日はハイパーパラメータ最適化についてです。

ハイパーパラメータとは

ハイパーパラメータの前にパラメータがありますよね、違いはなんでしょう?LassoとRidgeを例に取りましょう。

上の記事で解説したのでそちらもみていただきたいのですが、モデルを定義する際に学習させる変数がありますよね。よく\thetaで表されるやつです。例えばRidgeの場合だと
となり、Lassoの場合だと
となりました。このように学習(よくfitやtrainと言われる)において学習される変数をパラメータといいます。ではハイパーパラメータとはなんでしょう?これは我々が手動で設定する必要があるパラメータのことです。例えば次のLassoの目的関数を見てみましょう。
先ほど通り、\thetaがパラメータです。一方で、\lambdaがありますよね。これは我々が決めるパラメータなのでハイパーパラメータになります。

これでパラメータとハイパーパラメータの違いが理解できたと思います。真相学習や機械学習の問題の一つはこのハイパーパラメータの最適化です。例えばニューラルネットワークにおいて活性化関数に何を使うかや決定木において深さをどうするかめっちゃ悩みますよね?それを最適化したいんです。

Grid Search

よくある手法の一つがグリッドサーチです。これは格子状にハイパーパラメータの候補を作り、総当たりしてその結果を見てハイパーパラメータを選ぶという手法です。sklearnにあるのでみてみましょう。
いいんです、これでもいいんですけど「探索の最適化」したいですよね?紹介しましょう。オプチュナを。

Optuna

あの最強のPreferred Networks, Inc.さんが開発しました。
Optuna はハイパーパラメータの最適化を自動化するためのソフトウェアフレームワークです。ハイパーパラメータの値に関する試行錯誤を自動的に行いながら、優れた性能を発揮するハイパーパラメータの値を自動的に発見します。現在は Python で利用できます。
Optuna は次の試行で試すべきハイパーパラメータの値を決めるために、完了している試行の履歴を用いています。そこまでで完了している試行の履歴に基づき、有望そうな領域を推定し、その領域の値を実際に試すということを繰り返します。そして、新たに得られた結果に基づき、更に有望そうな領域を推定します。具体的には、Tree-structured Parzen Estimator というベイズ最適化アルゴリズムの一種を用いています。

これがすごいんです。論文にもなったようです。

使い方

テンプレは上の感じです。超シンプルなんですよね。ちなみに最後にgistsを貼りますが、出力も多く、plotもplotlyを用いているのでnotebookでは表示されませんので注意です。
例えばSVCのパラメータ探索をしたいときのコードは上の感じ。
時にはLightGBMとXGboostのように異なるアルゴリズムで比較したいときもありますよね。できるんです。
で、このOptunaの最大の魅力だと個人的に思っているのがPlotでして、plot自体が魅力的ではなくて、plotからOptunaが使っているアルゴリズムがすごいということがわかるんです。
これをみていただくとわかるかもしれませんが、ベイズ最適化を使っているんですよね。デフォルトだとTPEと呼ばれるアルゴリズムを使用されているようです。僕もベイズ最適化あたりは勉強しないといけないので良さそうなリンクを上げておきます。

で、まだ特徴があってデータベースに学習記録が保存できるらしいです。使い道はよくわかりませんが、、コメントください、

Code

Optunaはすごいですね、これからさらに追加される機能も気になりますし、gitからベイズ最適化のアルゴリズムの勉強もさせてもらえそうです。勉強頑張りましょう。でわ

References

GiNZAとpyLDAvisを使ってみる

こんにちは。

いきなりですが上の画像カッコよくないですか?かっこいいですよね。この記事を読めばあなたもこのかっこいいプロットができるようになります。

GiNZA

本日使うライブラリの一つ目です。

係り受け解析器 です。ちなみに似たもので

があります。MeCabは形態素解析器です。つまり、MeCabの出力を使ってGiNZAやCaboChaを使うみたいな感じです。

spaCy

超有名ライブラリです。GiNZAをこれにかまします。

  • spaCy is a free open-source library for Natural Language Processing in Python. 

よくない点

GiNZAを使ってみた感想としてはsimilarityがあまりよくないかな?と思いました。
これは良い感じです。
これも良い感じです。一方で
んー、とった感じですよね。そもそもsimilarityの定義によってはこの結果も悪くないかもしれないんですが、期待していた感じではないので使う際は注意が必要かもしれません。

pyLDAvis

3つ目のライブラリです。genismを合わせれば4ですが、以前紹介したのでスキップです。このライブラリはトピックモデリングの結果をインタラクティブに触れるものです。

上は画像なので触れませんが良ければ下からダウンロードしてhtmlをダブルクリックで開いてみてください。
ちなみに、使い方は次のとおりです。

  • 左側の円はそれぞれトピック
  • 円の大きさはトピックに含まれる文書数
  • 円と円の距離はトピック間の距離
  • 右側は単語の発生頻度
  • トピックを選択するとそのトピック内での単語の発生頻度を見ることができる
では最後にコード貼っておきます。

コード

次はとうとうネットワーク解析の記事行きます!

word2vecやってみたらアーノルドシュワルツネッガーが出てきた

こんにちは。

本日はMeCabというライブラリを用いてword2vecをやってみました。調べるとどうやらにニューラルネットワークを使っているようです。なのでニューラルネットワークを知ってる人ならすぐわかります。もし知らないのであればこちらへ。ではみていきましょう。

word2vecとは

単語をベクトル化してさらに次元圧縮したもの

とはいえ、単語をベクトル化?と疑問が出ると思うのでまずはそこから話していきます。

昔、One-Hot-Vectorについてお話ししました。ズバリそれです。例えばN単語ある場合、それをどうやって数値化、つまりベクトル化するのかというとOne-Hot-Vectorを使います。以下が例です。
とりあえずコレでベクトル化できました。しかし、コレは明らかに問題です。なぜなら形態素解析を行う際にN=4なんてことはあり得ないからです。何百、何千、何万といったワードを扱うことになります。加えて、ベクトルの四則にがないのでコレでは分析どころではありません。ではどうすればうまく単語を扱えるのか?そこで「分散表現」が現れます。
分散表現は先ほど問題だった
  • 次元
  • 四則
を解決します。つまり、次元は300ほどに落ち(300がポピュラー?)、ベクトルの演算が意味を持ちます。有名は例としては

[王子様ベクトル] – [男ベクトル] + [女様ベクトル] = [王女様ベクトル]

といった感じです。とはいえこの分散表現はOne-Hot-Vectorから計算されます。ではアルゴリズムの紹介に移りたいと思います。

CBOWとSkip-gram

word2vecで使われる考え方は上の2つです。多対一または一対多ですね。

  • CBOW: 周辺の単語から対象の単語を学習
  • Skip-gram: 対象の単語から周辺の単語を学習
ここで窓(window)というワードが大切、コレは周辺の大きさを定義するもの。下の例はプロテインを対象の単語としています。
Skip-gramに焦点を当てて解説していきます。こっちの方が精度が良いようです。そのためにはSoftmax関数を知る必要があります。

    \[ p\left(v | v_{c}\right)=\frac{\exp \left(v^{T} v_{c}\right)}{\sum_{w=1}^{N} \exp \left(v_{w}^{T} v_{c}\right)}\]

vがとある周辺の単語、Vは単語数、v_{c}が対象の単語、v_{w}は周辺の単語、v^{T}は周辺のある単語の特徴ベクトルです。コレから分かるように出力は確率ですね。word2vecを解説しているサイトの多くが横ベクトルを用いていますが、基本的にベクトルといえば縦です。別にどっちが正しいとかそういうことはないのですが縦に慣れておいた方がいいと僕は個人的に思います。(論文は横ベクトルだった、汗)
上のものは一例です。入出力が4次元ですがコレは4単語の場合の学習です。隠れ層のサイズも例として3にしました。Skip-gramではソフトマックスを用いて確率を出力するのでした。つまり重み更新時は実際に周辺単語であるWindowに基づいて学習されていきます。つまり、Word2vecを使うときの注意点は前述した

  • CBOW: 周辺の単語から対象の単語を学習
  • Skip-gram: 対象の単語から周辺の単語を学習
の選び方とWindowのサイズですね。では実際に使ってみるんですが今回はツイートを約1ヶ月分(パンプというワードが含まれるもの)を用いました。そして分かち書き(単語ごとに具ぎり空白を置くこと)の前処理を行なってあとは形態素解析してTSNEとUMAPで可視化してみました。TSNEは非常にうポピュラーなアルゴリズムですが噂によるとUMAPとかなり熱いということなので今回、比較のために使ってみました。ではまず結果から
‘胸’というワードと近しい150単語を2次元に落とし込みました。(パンプでやるべきだったのかもしれない)

コレトレーニングしてる人だと分かると思うんですけど、例えば「二頭・三頭」が近いのは恐らく「スーパーセットなんだな」とか考えちゃうんですよね。あとはトレーニング部位は密集していますし、スクワットやフライなどの種目も密集しているのでやはり精度は高そうですね。ではTSNEとUMAP、どちらがいいのか、という問に対してですが僕的には今回の場合はTSNEだと思います。理由はグループごとの塊がしっかりしているように見えるからです。

では、最後にコードを貼っておきます。
今回自然言語処理を初めてやってみましたがニューラルネットワークがベースになっているのは少し驚きでした。今後も勉強していきたいと思いました。でわ

References