深層学習とその他

機械学習したいマン

chainerで文書分類する その1

アドベントカレンダー18日目です。
今日はchainerのexampleにあるtext_classificationを使って文書分類していきたいと思います。
adventar.org

examplesのtext_classificationを動かす

このソースコードを動かします。
chainer/examples/text_classification at master · chainer/chainer · GitHub

あらかじめよく用いられるネットワークである、LSTMやCNNが含まれていて、使いやすいようにデータセットも簡単にダウンロードできるようになっています。
train_text_classifier.pyを動かすことで学習ができます。

python train_text_classifier.py -g 0 --dataset dbpedia


学習に使うモデルを変える

これらのモデルが含まれています。

・LSTM
・CNN + MLP
・BoW + MLP
・Character-based variant models of those

https://github.com/chainer/chainer/tree/master/examples/text_classification

モデルを切り替える際は、以下のように引数を渡します。

python train_text_classifier.py -g 0  --model bow


含まれているデータセット

データセットは以下のものが含まれています。

・DBPedia Ontology dataset (dbpedia): Predict its ontology class from the abstract of an Wikipedia article.
IMDB Movie Review Dataset (imdb.binary, imdb.fine): Predict its sentiment from a review about a movie. .binary's classes are positive/negative. .fine's classes are ratings [0-1]/[2-3]/[7-8]/[9-10].
・TREC Question Classification (TREC): Predict the type of its answer from a factoid question.
Stanford Sentiment Treebank (stsa.binary, stsa.fine): Predict its sentiment from a review about a movie. .binary's classes are positive/negative. .fine's classes are [negative]/[somewhat negative]/[neutral]/[somewhat positive]/[positive].
・Customer Review Datasets (custrev): Predict its sentiment (positive/negative) from a review about a product.
・MPQA Opinion Corpus (mpqa): Predict its opinion polarity from a phrase.
・Scale Movie Review Dataset (rt-polarity): Predict its sentiment (positive/negative) from a review about a movie.
・Subjectivity datasets (subj): Predict subjectivity (subjective/objective) from a sentnece about a movie.

https://github.com/chainer/chainer/tree/master/examples/text_classification

学習の際に使うデータセットを切り替える場合は、
'dbpedia', 'imdb.binary', 'imdb.fine','TREC', 'stsa.binary', 'stsa.fine','custrev', 'mpqa', 'rt-polarity', 'subj'のどれかを引数として渡すことで切り替えることができます。

python train_text_classifier.py -g 0 --dataset subj


実際に動かしてみる

今回もcolaboratoryで動かしてみました。
ただ動かすだけなら、以下のコマンドだけで十分です。

!curl https://colab.chainer.org/install | sh -
!git clone https://github.com/chainer/chainer.git
cd chainer/examples/text_classification/
python train_text_classifier.py -g 0

今回はデータを少し確認したかったので、colaboratoryに学習部分のコードを移しました。
自分のデータに変えて分類するのも簡単そうです。


まとめ

文書分類を簡単にするだけならtext_classificationをいじるのが楽そうです。

scikit-learnのSVMの処理時間を比較する

アドベントカレンダー17日目です。
今日はscikit-learnのSVMの処理時間を比較してみたいと思います。

adventar.org

kernelごとの速度を計測する

今回は、「linear」「rbf」「poly」「sigmoid」の処理時間を計測してみます。
計測に使用するデータは、当初sklearnについてるdigitsを考えていたのですが、より大きなデータで試したかったので、mnistを使います。

 

自分でmnistのデータを拾って準備するのは面倒なので、chainerをimportして、get_mnist関数を使ってデータを取得します。
データの件数は6万件あり、データの件数が多すぎるので、今回は10分の1のデータを使います。
データとラベルを切り分ける方法があるのかわからなかったので、とりあえず無理やり分けました。

 

SVMのその他のパラメータは今回は特に指定しません。

 

計測結果

linear

CPU times: user 5.92 s, sys: 23.4 ms, total: 5.94 s Wall time: 5.95 s

rbf

CPU times: user 15.8 s, sys: 3.52 ms, total: 15.8 s Wall time: 15.8 s

poly

CPU times: user 57.8 s, sys: 15.5 ms, total: 57.9 s Wall time: 57.9 s

sigmoid

CPU times: user 20.1 s, sys: 5.94 ms, total: 20.1 s Wall time: 20.2 s

 

あとは意味もなく比較のグラフを作りました。googleスプレッドシートはグラフがきれいでいいですね。

 

実際の計測結果は以下から確認できます。

 

一眼レフのススメ

アドベントカレンダー16日目です。
今日は技術的なことではなく、カメラについて書いていきたいと思います。

adventar.org

カメラ選び

普段からよくスマホで写真を撮っていたのですが、夜景を撮るときや遠くものを撮るときに不満があり、それで思い切って一眼レフを買いました。

 

買ったのは、EOS Kiss X9のダブルズームキットです。

キヤノン デジタル一眼レフカメラ「EOS Kiss X9」ダブルズームキット (ブラック) EOSKISSX9BK-WKIT
 

スマホの写真はXperia Z5で撮りました。
わかりやすいのは動物園でズームして撮るときです。

ズームでの撮影

f:id:looseleaf0727:20181216231021j:plain

これはスマホでズームして撮ったのですが、油絵のようになってしまっています。

 

 

f:id:looseleaf0727:20181216231723j:plain

こちらは一眼で撮ったものです。
スマホで撮った時より距離が遠くてもくっきりとしているし、ボケ感も出ています。

 

イルミネーションの撮影

また、夜景やイルミネーションでもかなりの差が出ます。
今回は青の洞窟での写真の比較です。

 

f:id:looseleaf0727:20181216232404j:plain

ちゃんとぶれないように頑張って撮っても若干光がぶれてしまいます。
また、明るさをあげてもかなり暗い感じになってしまいます。

 

f:id:looseleaf0727:20181216232918j:plain

こちらは三脚なしで一眼で撮ったものです。
光のぶれも少なく、遠くまできれいに映っています。

 

カメラのメリットとデメリット

メリットとしてはやはりきれいに写真が撮れることです。
アルバムにするために印刷をしたり、トリミングをしたりしても高画質のままです。
ボケ感を楽しんだり、高倍率でも画質が悪くなったりせず、暗いところでもきれいにとることが可能です。

 

デメリットとしては、まずは重いことだと思います。
レンズも持ち歩くと1kgくらいにはなってしまいます。
鞄に入れるときにも結構かさばってしまいます。
持ち歩きやすさを重視する人は、ミラーレスのほうがいいかも知れません。

 

まとめ

一眼レフを買って、写真を撮るのがより楽しくなったので、ぜひ皆さんも検討してみてください。

最近ブックマークした深層学習関連の記事

アドベントカレンダー15日目です。
今日は、チェックせずに埋もれていくのを防ぐという意味合いも含めて、
最近ブックマークした深層学習関連の記事を貼っていきたいと思います。

adventar.org

 

最近ブックマークした記事

ツイッターとかで結構話題になっていた要約エンジンの話です。
深層学習かどうかまではわからないですが、AIっぽいので貼っておきます。

qhapaq.hatenablog.com

 

BERT、話題にはなっていましたがなかなか動かせる人がいませんでしたね。
その中でクックパッドが動かして話題になっていました。

techlife.cookpad.com

 

自然言語処理でよく使われるSeq2Seqとかの説明記事です。
比較的優しい言葉で書かれていると思います。

gigazine.net

 

イラストでわかるBERTやELMOです。
内部まで細かく説明されてます。

jalammar.github.io

 

 

AI×医用画像についてのスライドです。
どういう風に応用されているのか、現状どんな研究が行われているのか、
事細かに書かれています。

speakerdeck.com

 

 

深層学習かは微妙ですが、Kaggle Meetupの資料です。
Kaggleをやる際の参考になると思います。

connpass.com

はてな記法で数式を書く

アドベントカレンダー13日目です。
今日ははてな記法で数式を書く方法を紹介したいと思います。
adventar.org

数式の書き方

数式の関数自体はlatexの書き方が使えるようです。

以下のように書くことで数式として表示されます。

[tex:x+2]

実際の表示例:x+2

ディスプレイ数式

数式をディスプレイ数式にするにはdisplaystyleを使います。

[tex: \displaystyle \sum^{\infty}_{n=1}]

実際の表示例:
 \displaystyle \sum^{\infty}_{n=1}


数式を大きくする

少し数式は小さく見えるので、文字の大きさを変えることをお勧めします。

<span style="font-size: 150%">
[tex: \displaystyle \sum^{\infty}_{n=1}]
</span>

実際の表示例:

 \displaystyle \sum^{\infty}_{n=1}

自然言語処理における評価尺度

アドベントカレンダー12日目です。
今回はメモ的な意味も含めて、自然言語処理における評価尺度を書いていこうと思います。
adventar.org

WER

WERは(Word Error Rate)の略で、機械翻訳音声認識などで使われており、エラー率なので低いほうがいい評価になります。
計算式は以下のとおり。



WER = \frac{S+D+I}{N} = \frac{S+D+I}{S+D+C}

Sは置換の数、
Dは削除数、
Iは挿入数、
Cは正しい単語の数、
N(S+D+C)の単語の数
とのことだがこれだけ聞いてもよくわかりません。

音声認識の場合では、人間の発言した単語のうちいくつ聞き取ることができなかったかの割合になるとのこと。
詳しくは以下を参照。
Word Error Rate Calculation · Martin Thoma

Hunt's WER

Hunt's WERはWERを改良したもので、weighted measureを採用している。



\displaystyle
 \frac{(S+0.5D+0.5I)}{N}

BLEU

BLEUは(BiLingual Evaluation Understudy)の略です。
翻訳でよく見かける評価で、日本ではよく使われていると思います。

生成した翻訳と、元の翻訳文を比較したときに、単語の重複している数を計算し、中でも連続している単語には高いスコアを与えます。

計算式は、以下のとおりです。


 \displaystyle 
BLEU = BP_{BLEU} * exp(\frac{1}{N}\sum_{n=1}^{N}{logP_{n}})

日本語のわかりやすい解説は以下から。
http://www2.nict.go.jp/astrec-att/member/mutiyama/corpmt/4.pdf
BLEU

GLEU

GLEUは(Google-BLEU)の略。

Generalized BLEU

BLEUよりも人間の判断に近いらしい?

ROUGE

ROUGEは(Recall-Oriented Understudy for Gisiting Evaluation)の略。
要約に使われているイメージ。

METEOR

METEORは(Metric for Evaluation of Translation with Explicit ORdering)の略。名前の通り、翻訳や要約に使われている。

TER

TER(Translation Edit Rate)の略。
おそらく翻訳の評価に用いられる?

CIDEr

CIDEr(Consensus-based Image Description Evaluation)の略。
イメージキャプションの評価に用いられる。

まとめ

書きかけですが、かなり長くなりそうなので途中で公開します・・。
いつか追記します。

scikit-learnでConfusion Matrixを見やすく表示する

アドベントカレンダー11日目です。
今日はscikit-learnでConfusion Matrixを表示したいと思います。
adventar.org

Confusion Matrixの書き方

基本的な書き方は以下に乗っているコードをほぼそのまま動かすだけです。
https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html

少しだけ応用

今回は見やすさを上げるためにいくつか試そうと思います。
まず、デフォルトでは図のサイズが小さいので、figsizeを設定します。

plt.figure(figsize=(10,10))


色を変えたい場合には、cmapを変更します。

cmap=plt.cm.Reds


色の一覧はここを参照してください。
color example code: colormaps_reference.py — Matplotlib 2.0.2 documentation

たまに以下のように一部が見えにくい色になることがあります。
f:id:looseleaf0727:20181211230206p:plain

そういうときは、threshの値を調整するか、colorの色を設定するといいです。
背景が白いときに文字が白くなったり、逆が起こらないようにthreshの値を設定しましょう。

thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, format(cm[i, j], fmt),
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")

今回のソースコードはこちらです。
Colaboratoryだとなぜか十字が入っていますが気にしないでください。