機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

2018-01-01から1年間の記事一覧

Stan:LDA

はじめに 自然言語処理の領域では広く知られいるLDA(Latent Dirichlet Allocation)について復習する。LDAはトピックモデルの1種であり、文書がどのようなトピックから構成されているかを推論するモデル。 推論するパラメータは以下の2つ。 トピック分布:…

Pretrained language modelsを理解する

はじめに 少し前に「A Review of the Neural History of Natural Language Processing」というまとめ記事を見ました。 blog.aylien.com自然言語処理の発展の歴史みたいなもので、近年のブレイクスルーをまとめてくれています。2018年の注目はELMoに代表され…

Pytorch:テキストの前処理(torchtext)③

はじめに torchtextの使い方メモ第三弾。前回の内容は下記参照 kento1109.hatenablog.com今回の内容は1つだけ。 POSやNERなどのTaggingを考える場合、どのようにtorchtextで読み込めばよいか。前回まではtorchtextでデータをファイルから読む際、想定されて…

Neo4jを触ってみる

はじめに 自然言語処理を勉強していると、オントロジーやシソーラスってのが出てくる。 オントロジーやシソーラスを勉強すると、グラフ理論ってのが出てくる。 グラフ理論を勉強すると、グラフDBとして有名な「Neo4j」が出てくる。ということで、今回はNeo4j…

Stan:NMF

はじめに 今回はNMF(Non-negative Matrix Factorization)について勉強する。 日本語では「非負値行列因子分解」と言い、線形次元手法の1つ。 その名前の通り「観測データの非負性」を仮定したモデル。 「非負性」の制約を設けることで、これに適用可能な観…

Pytorch:ライブラリの誤差関数の構造を理解する

はじめに 今まで当たり前のように誤差関数を使っていた。 既に用意されたものであればそれで問題ない。しかし、誤差関数を自作したいと思った場合、 ライブラリの誤差関数の構造を理解している必要がある。そんなわけでライブラリの誤差関数について調べたの…

Stan:TwoCountryQuiz②

はじめに 前回は「コワイ本」のTwoCountryQuizのタスクに取り組んだ。今回はこの続きについてまとめる。 ラベルスイッチング 前回のモデルは事後分布が二峰性をもつような分布となっていた。 この原因として「ラベルスイッチング」が原因だと述べた。 混合モ…

Stan:TwoCountryQuiz①

はじめに 前回は「コワイ本」のTwentyQuestionsを取り組んだ。 kento1109.hatenablog.com今回はそれをもう少し難しくした「TwoCountryQuiz」に取り組む。 TwentyQuestionsのコードを少し変えるだけと思っていたが、実はとても難しく嵌りどころがたくさんだっ…

Stan:TwentyQuestions

はじめに 最近、色々なモデリング例を知りたくて「ベイズ統計で実践モデリング(通称コワイ本)」を呼んだ。 まだ途中だが、面白そうな内容があったのでまとめる。 今回、紹介するのは「第六章 潜在混合モデル」の「TwentyQuestions(二十の問題)」というス…

Stan:混合モデルとラベルスイッチング

はじめに 前に混合ポアソンモデルについて勉強したが、混合モデルではラベルスイッチングの問題を考える必要がある。詳しくはユーザーガイド・リファレンスマニュアル「24.2. 混合分布モデルでのラベルスイッチング」参照。一番簡単な対策方法は、ポアソン分…

Stan:隠れマルコフモデル②

はじめに 前回は教師ありHMMについて勉強した。 kento1109.hatenablog.com今回は教師なしHMMについて勉強する。 今回のデータはセンサーデータのようなものを想定したものを用いる。例えば、以下のような時系列データがあったとする。 時点と 時点で何かしら…

Stan:隠れマルコフモデル①

はじめに 今回は隠れマルコフモデルをStanで実装する。 隠れマルコフモデル自体は以前に書いた。 kento1109.hatenablog.com今回は教師ありモデルを考える。 教師あり「隠れ状態」が既知のモデル。 前回の例で考えると、「晴れ→雨」などの遷移状態が与えられ…

Stan:階層モデルに関する考察

はじめに 今回もStanを使って階層モデルを勉強していく。今回は階層モデル(というよりベイズ学習そのもの)の基本的なことに関する疑問の解消を目指す。最尤推定ではなく、ベイズ推論を用いる目的の1つとして「ベイズ推論による機械学習」では以下のように…

Pytorch:CNNでテキスト分類

はじめに かなり前にTheanoでの実装例を解説した。TheanoでSentiment analysis (CNN)① - 機械学習・自然言語処理の勉強メモ今回は、Pytorchでの実装例を解説する。下記のコードを実装例としてみていく。 github.com前処理や学習のところは今回の本質ではない…

Stan:離散パラメータの扱い

隠れ変数の扱い 前回、ポアソン混合モデルを勉強した。kento1109.hatenablog.com前回は触れなかったが、ポアソン混合モデルのグラフィカルモデルは一般的に書きのように書ける。観測データは、k番目クラスタのパラメータのポアソン分布によって生成される。 …

Stan:階層モデル②

はじめに 前回は階層モデルの基本的なことを書いた。 kento1109.hatenablog.com今回は実際のデータでもう少し基本を確認する。 過分散 今回は緑本(データ解析のための統計モデリング入門)で紹介されている階層モデルの導入部分を実践する。データとしては…

Stan:階層モデル①

はじめに 今回は「アヒル本」第8章について整理する。 階層モデルは簡単に説明すると、「説明変数だけでは説明がつかない、グループ(個人)に由来する差異」を扱うための手法。推定に使えるデータは大量にあるが、グループや個人当たりのデータは少ない場合…

Pytorch:テキストの前処理(torchtext)②

前回のtorchtextの使い方の続き。kento1109.hatenablog.com今回、実際の処理でどうすれば良いんだってなったところを確認する。 訓練用と検証用 訓練用と検証用のデータを取り込む。 Datasetクラスのsplitsメソッドが使用できる。使い方は以下の通り TEXT = …

Stan:ポアソン混合モデル

はじめに 今回は、アヒル本から離れて「ポアソン混合モデル」をモデリングする。 今回は前回の対数事後確率の計算が必要となる。 kento1109.hatenablog.com ポアソン混合モデル 例えば、ある非負の値を取る観測データが以下のような分布になったとする。 ヒ…

Stan:ベルヌーイ分布(対数事後確率計算)

はじめに 前回は、ベルヌーイ分布を用いて事前確率のことを書いた。 kento1109.hatenablog.com今回は、高度なモデルを作る際に避けては通れない「対数事後確率計算」についてまとめる。 対数事後確率計算 対数事後確率とは何なのか。 これはサンプル結果に出…

Stan:ベルヌーイ分布(事前分布の導入)

はじめに 前回は単回帰分析を見ながら基本的なことを確認した。 kento1109.hatenablog.com今回は、確率分布の問題としてなじみのある「ベルヌーイ分布」を見ていく。 また、事前分布の違いについても確認する。 無情報事前分布 まずは、以下のようにデータを…

Stan:単回帰分析

はじめに 統計モデリングの勉強の一環に「Stan」を触ってみる。 書籍は「アヒル本」(StnaとRでベイズ統計モデリング)を参考とする。初回は、統計モデリングの「Hello world」と言われる単回帰分析を扱う。(アヒル本のChapter.4) 前処理 データは、社員の…

Pytorch:RNNで名前を生成する(文章生成)

はじめに PytorchでのSeq2Seqの練習として、名前生成プログラムを実装する。実装は以下のチュートリアルを参考に進めた。Generating Names with a Character-Level RNN — PyTorch Tutorials 0.3.1.post2 documentation目標はSeq2Seqの理解であるが、まずは基…

Pytorch:単語のベクトル表現をセットする(torchtext)

はじめに Pytorchの処理で学習済みの単語分散表現(Word2Vec, Glove等)を使いたい場合がある。直接、Embedding層にセットする場合が以下の方法で問題ない。 kento1109.hatenablog.com前処理として、torchtextを利用する場合はそうはいかない。 torchtextは…

Pytorch:テキストのバッチ化(BucketIterator)

前回、torchtextに関する基本をまとめた。kento1109.hatenablog.com今回、もう少し実用的なことをメモする。 BucketIterator テキストを学習データとする場合、当然、文章の系列長は異なる。文章をバッチ化する場合、パディングして系列長を揃える必要がある…

Pytorch:Embeddingに学習済みの重みを使う

やりたいこと 事前にWord2Vecなどで学習した分散表現をネットワークの重みとして用いる。結論としては、Embedding層の重みにテンソル型に変換した分散表現行列をセットするだけで良かった。備忘録としてコードを残しておく。 (ここでは、Googleの学習済みの…

PyTorch:Bi-LSTM+CRF②(予測)

はじめに 前回は学習に関するコードを読んだ。 kento1109.hatenablog.com今回は「予測」の部分を読んでいく。 予測 予測時は、viterbi algorithm を用いて効率的に計算する。 最後に_viterbi_decode関数を確認する。 _viterbi_decode グラフの最短経路を求め…

PyTorch:Bi-LSTM+CRF①(学習)

はじめに 今回は、Bi-LSTM+CRFに関して整理する。 最近の深層学習を用いた系列ラベリングに関する論文は、この手法でSOTAを達成していることが多い。尚、Bi-LSTM+CRFの基本的なことに関しては、以前のTheanoでの記事で述べた。 kento1109.hatenablog.comTh…

PyTorch:LSTMの実践(CoNLL)

はじめに 前回、LSTMの基礎的な使い方を整理した。 kento1109.hatenablog.comだいたい、使い方は分かったので実際にタスクに取り組んでみる。今回は「固有表現抽出」で試してみる。 CoNLLについて CoNLLは、「Conference on Computational Natural Language …

PyTorch:LSTMの基礎

はじめに 今回はNLPでよく使われるLSTMネットワークについて整理する。 自分で各ゲートのパラメータを記述したTheanoに比べると簡単。 下記のTutorialのコードを説明しながらLSTMの書き方について理解していく。 Sequence Models and Long-Short Term Memory…