KLDivergenceとJSDivergence

Pythonのコード作成したのでメモ

KLダイバージェンス

$$D_{KL}(P||Q) = \sum_x p(x) \, \log \frac{P(x)}{Q(x)}$$

JSダイバージェンス

$$D_{JS}(P||Q)=\frac{1}{2}\bigg\{ D_{KL}(P \, || \, R)+D_{KL}(Q \, || \, R) \bigg\}$$
$$R = \frac{P + Q}{2}$$

プログラム

ここを参考に

データ

まずはデータの準備

ヒストグラム

KLダイバージェンス

JSダイバージェンス

実験

まずはaとbの分布を調べます。

KLダイバージェンスはaとbを入れ替えると値が変わりますが、JSダイバージェンスでは同じです。

つぎに、分布間でのKLダイバージェンスとJSダイバージェンスの値を調べます

結果を見ると、距離の遠い順にKLダイバージェンス、JSダイバージェンスの値が大きくなっています。KLダイバージェンスの場合には、どちらを基準にするかによって変わってくるので注意が必要みたいですね。

BERTモデルをPytorchのモデルへ変換

Tensorflowで作成したBERTモデルを、Pytorchへ変換します。

こちらに方法が書いています。

モデル

モデルを自分で計算して作ってもいいのですが、公開しているものがあるので、そちらを使います。

KNP

こちらはKNPを使って分かち書きしたWikipedia日本語版を元に作成しています。
あまりKNPを使ったことはないのですが、実際に使うときにはMeCabで分かち書きをしても大丈夫でしょう。

SentencePiece

こちらのものは同じく日本語Wikipediaを用いて、SentencePieceによる分かち書きをしたものです。

Transformers

Pytorchで用いるのライブラリです。以下のコマンドでインストールしておきます。

変換

SentencePieceで作成したモデルにはPytorch用のモデルがついていませんので、変換してみます。
こちらには以下のファイルが含まれています。

このコマンドでpytorch_model.binというファイルへ変換します。

リモートサーバのtensorflowの結果を表示する

大学のサーバなどで計算した後の結果を確認する時に、
わざわざ計算結果のデータをローカルに持ってくるのは面倒だったりします。
リモートの結果を表示できないかと言うことで、SSHポートフォワードを使って
ローカルでも表示できるようにします。

tensorflowダウンロード

使用しているtensorflowは1.15なのでバージョンを合わせます

これで1.15のブランチになります。以下のコマンドで確認。

mnist

mnistを計算してみます

logs以下にファイルが作成されていることを確認します

ポートフォワード

サーバが外部公開されていないなど、ローカルPCから直接ブラウザでアクセスできないときのために、SSH
ポートフォワードを使用します。
こちらを参考に、
macから繋ぐためにはターミナルから以下のコマンドを打ち込みます。

これは、リモートサーバの10010ポートをローカルの8081ポートで見れるようにするためのものだと思えばいいです。

まずは、動くかどうか確認です。
リモートでpython簡易サーバを立ち上げます

ブラウザでhttp://localhost:8081にアクセスし確認します。
ディレクトリリストが見えることがわかります。
Ctrl+Cでシャットダウンします

tensorboardによる可視化

先ほど計算した、mnistの計算結果を表示してみます。

ブラウザでhttp://localhost:8081にアクセスします

表示されました。

numpyのエラー

tensorflowのサンプルを動かそうとしたときのエラー

どうやら、numpyが壊れているらしい?

これで解決

Rstudioの環境変数

RStudioを好んで使っています。

Mac版RStudioはHomeBrewでインストールすることができます

この時、アプリケーションフォルダ内にRStudioのアイコンが表示されます。
このアイコンをクリックして起動すると、Bashシェルの環境変数を読み込んでくれません。

自分の場合、データフォルダをDATA環境変数に入れることにより、大学で使っている
サーバのデータフォルダとの物理ディレクトリの違いを吸収するようにしています。
例えば

こんな感じで記述しておけば、
サーバでは /work/user/data/sample.txtのディレクトリにあるファイル
ローカルPCでは /home/user/data/sample.txtのディレクトリにあるファイルでも、
環境変数DATAにサーバでは/work/user/data/、ローカルPCでは/home/user/data/
を設定しておけば、プログラムを変更する必要がありません。

しかし、Rstudioを入れたそのままではこの環境変数が使えません。

これを解決するには、~/.Renvironに環境変数を記述しておけばOKです。

~/.Renviron

chainerでCRFを用いて固有表現抽出

このあたりを参考に書き直してみました。
CRFなどの解説はリンク先を参照のこと

仕様

単語列から名詞の塊を抜き出す。
英語で複合名詞など複数の名詞で構成される名詞の塊にフラグをつける。
下記の例では、Oが名詞以外、Bが名詞の開始位置、Iが複合名詞の2個目以降を示している。

これを、Linearの1層で学習し、CRFで出力する

コード

実行結果

ちゃんと学習できているようです

LSTMでSIN波を学習させる

このあたりを参考に書き直してみました。

プログラム

xが0から2πまでをN=100等分し、その時のyの値を学習します

出力

テスト結果

青い線が正解で赤い線が学習したのちの予測結果です。
Xの値を与えて、Yを予測した結果ですが、あまりうまく予測できていませんね

VAEを用いたなりすまし検知を書き直してみる

こちらの記事「VAEを用いたUNIXセッションのなりすまし検出」はソースコードが完全に公開されていないので、補完してみました。

環境

  • macOS 10.14
  • python 3.7

データ準備

まず、データを準備します。こちらからダウンロードします。ダウンロードしたら、解凍し、Fasttext用にデータを結合します。各ユーザの前半の5000は訓練用のデータで、なりすましがないデータですので、これをすべてのユーザから抽出します。ユーザごとに一行にコマンドをスペースでつないで作成します。全部で五十行になります。

Fasttextによるベクトル化

単語をfasttextによりベクトル化します。50次元を使っています。fasttextはpipでインストールしたものでもOKです。

UMAPによる可視化

元記事では出現頻度の高いコマンドから200取り出して、可視化していますが、面倒なので、modelの単語列から上位50単語を抜き出して可視化します。

モデル

元記事のものではそのままでは動かなかったので多少修正しています。

入力データ

入力データを作成します。ファイルから再度読み込んで、訓練データを上位4000コマンド、テストデータを4001から5000コマンドで作成します。また、元記事と同様にUser2を使っています。

訓練

Earlystoppingを入れました。訓練は100コマンドをひとかたまりとして訓練しています。

結果の可視化

訓練データでのLossを可視化します

テスト

最後に、1%の確率でなりすましが入っているという各ユーザの5001行目からのデータをつかって、Lossを可視化します。同様に100コマンドをひとかたまりとして、100個分をテストしています

chainerでsin関数を学習させてみたをtrainerで書き直す

chainerのサンプルを探していると,古いものではtrainerを使っていないものも結構あります。
そこで,chainerでsin関数を学習させてみた
を書き直してみました。

ポイントは,extensionを使って,エポックごとにsinの学習結果を画像で保存しているところです。
結構いい加減に作っているので,画像保存ディレクトリやファイル名などは外から与えるようにするといいでしょう。

chainerでattentionモデルを実装

chainerで実装してみた

こちらを参考に,実装してみた。

実行結果

あまり,結果が良くないが,訓練データを増やし,Epochを増やすと良くなるかもしれない。