コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

身の程知らずの初心者が機械学習を学んでみたでござるの巻

なぜ "身の程知らずの初心者" である僕は機械学習をやりたいと言ってしまうのか

おはようございます。これから機械学習についてのあれこれやろうとする "身の程知らずの初心者" の僕です。僕がリスペクトしているサービスでは "身の程知らずの初心者" は機械学習をするべきでないなんて言われています。実際その通りで "身の程知らずの初心者" は機械学習なんてものに手を出してはいけないんだと思います。でも、そんな "身の程知らずの初心者" である僕でもワンチャンあるんじゃないかなってことで機械学習について学べるサービスがあったのでやってみました。

サービス
aidemy.net

この記事が投稿されている頃には有料化しているだろうから実際ワンチャンかもしれない。まあ、結論を言ってしまえば、"身の程知らずの初心者" である僕にはワンチャンもなかったんですけどね (笑)。

前回記事はこちら
inujini.hatenablog.com

似たようなタイトルにしてるせいで連投してるみたいになってるけど、内容はちゃんと違いますからね。まあ、どうせ誰も見てないしどうでもいいか。

やってみた

f:id:andron:20180401120919p:plain
今回は前回よりも難しい雰囲気出してるやつに挑戦しました。今回の話はデータ処理の方法と深層学習についての話です。

自然言語処理

自然言語処理(しぜんげんごしょり、英語: natural language processing、略称:NLP)は、人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術であり、人工知能言語学の一分野である。「計算言語学」(computational linguistics)との類似もあるが、自然言語処理は工学的な視点からの言語処理をさすのに対して、計算言語学言語学的視点を重視する手法をさす事が多い。データベース内の情報を自然言語に変換したり、自然言語の文章をより形式的な(コンピュータが理解しやすい)表現に変換するといった処理が含まれる。応用例としては予測変換、IMEなどの文字変換が挙げられる。

こんなやつです。コンピュータってやつはやっぱり数値計算が得意で人間の話言葉はよくわかんにゃいわけです。それをコンピュータが理解できるように処理する作業のことです。形態素解析などを用いて言語を処理するのがスタンダードなやり方らしいですよ。

形態素解析(けいたいそかいせき、Morphological Analysis)とは、文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの形態素の品詞等を判別する作業である

聞きなれない形態素解析は上記のようなやつです。利用するツールは以下のやつが一般的だそうです。
Mecab
MeCab: Yet Another Part-of-Speech and Morphological Analyzer

Janome
Welcome to janome’s documentation! (Japanese) — Janome v0.3 documentation (ja)

これで処理するにしても一部はうまくいかないようですが、以下のテキスト前処理用モジュールも併用するとよくなるそうですね。
NEologd
GitHub - neologd/mecab-ipadic-neologd: Neologism dictionary based on the language resources on the Web for mecab-ipadic

形態素解析だけだと文字の分類で終わってしまう話になって終わりなんですけど、Pythonだとgenismを使うことでその分析も容易になっちゃうらしいです。強い……。
genism
gensim: Topic modelling for humans




・時系列解析

ある現象の時間的な変化を、連続的に(または一定間隔をおいて不連続に)観測して得られた値の系列(一連の値)の解析のこと。

引用しただけだと、ざっくりとした感じになってしまってわけわからんですね。物体の動きや、温度や株の変動のようなデータに対して行う解析のことを指すそうです。解析のツールとしては以下のようなものを使うと良い感じになったりするのかもしれない。
StatsModels
StatsModels: Statistics in Python — statsmodels 0.8.0 documentation

上記ツールは分析ツールで、「この時々刻々と変化するデータをどのように処理していくのか?」なんてことを推測してくれるまではやってくれません。

そのための考え方として以下のようなモデルが存在するとのことです。
・ARモデル(自己回帰モデル
・MAモデル(移動平均モデル)
・ARMAモデル(自己回帰移動平均モデル
・ARIMAモデル(自己回帰和分移動平均モデル)
・SARIMAモデル(季節自己回帰和分移動平均モデル)

そのモデルの中身については……今回駆け足気味で解いてたのであまり深く理解してなかったりします。どうせ、また似たようなことやって記事にするだろうからいいよね。




ディープラーニング基礎

ディープラーニングまたは深層学習(しんそうがくしゅう、英: deep learning)とは、(狭義には4層以上の)多層のニューラルネットワーク(ディープニューラルネットワーク、英: deep neural network)による機械学習手法である。深層学習登場以前、4層以上の深層ニューラルネットは、局所最適解や勾配消失などの技術的な問題によって充分学習させられず、性能も芳しくなかった。しかし、近年、ヒントンらによる多層ニューラルネットワークの学習の研究や、学習に必要な計算機の能力向上、および、Webの発達による訓練データ調達の容易化によって、充分学習させられるようになった。その結果、音声・画像・自然言語を対象とする問題に対し、他の手法を圧倒する高い性能を示し、2010年代に普及した。しかしながら、多層ニューラルネットが高い性能を示す要因の理論的な解明は進んでいない

ディープラーニングってこんなのです。機械学習との関連を図にするとこんな感じです。
f:id:andron:20180403083348p:plain
ノリでディープラーニングとの間にニューラルネットワークを入れてしまいましたが、多分ディープラーニングをやるには避けては通れないやつだと思われます。

ニューラルネットワーク(神経回路網、英: neural network、略称: NN)は、脳機能に見られるいくつかの特性を計算機上のシミュレーションによって表現することを目指した数学モデルである。研究の源流は生体の脳のモデル化であるが、神経科学の知見の改定などにより次第に脳モデルとは乖離が著しくなり、生物学や神経科学との区別のため、人工ニューラルネットワーク(artificial neural network、ANN)とも呼ばれる。

こんなのです。ザックリいうと「入力 ⇒ 推測 ⇒ 出力」の流れの推測部分でわちゃわちゃやりましたってやつです。例えば、りんごをみてりんごだと認識するまでに「赤くて丸くて手のひらぐらいの大きさだから」みたいなわちゃわちゃした処理やってますよね。それがニューラルネットワークです。ディープラーニングはこのわちゃわちゃの粒度が細かくなった感じです。当然その粒度とかは数式やなんかなんですけど、ツールを利用することでその辺りはある程度カバーできてしまうようです。

そんなディープラーニングの練習にはKerasってライブラリがディープラーニングやるときに使うと良い感じらしいです。
Keras
Keras Documentation
これだけでなんとかなっちゃうってPython強い……。




・CNNを用いた画像認識

機械学習において、畳み込みニューラルネットワーク(たたみこみニューラルネットワーク、英: Convolutional neural network、略称: CNNまたはConvNet)は、順伝播型(英語版)人工ディープニューラルネットワークの一種である。画像や動画認識に広く使われているモデルである。

CNNはこんなやつです。画像に対して扱うニューラルネットワークってノリでいいと思われる。ニューラルネットワークについては上の方でなんか書き残したのでここでは省略します。CNNでは上記のわちゃわちゃした処理に「畳み込み処理(入力データの特徴を調べる)」と「プーリング処理(畳み込み処理のデータを削減する)」なんてのが使われてます。

画像認識で学習させるためには大量のデータが必要になるんですけど、それで遊ぶためのデータがMNISTやCIFAR-10に用意されているそうです。こうやって初学者に向けてデータまで用意してくれるなんて至れり尽くせりですね。
MNIST
MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

CIFAR-10
CIFAR-10 and CIFAR-100 datasets




そんで、深層学習関連でもう一個。やってみた。
f:id:andron:20180402010828p:plain

・Cognitive Toolkit(CNTK) 実践

Microsoft Cognitive Toolkitはマイクロソフトリサーチによって開発されたディープラーニングフレームワークで以前はCNTKと呼ばれていた。ディープラーニングを容易に利用するためのライブラリであり、GPUやネットワークの利用による並列処理により実行効率を向上させる機能が実装されている。

Microsoft Cognitive Toolkit
Microsoft Cognitive Toolkit

これのこと。何ができるかまではかなり飛ばしてやっているので深くはよくわかんにゃい。画像認識だけでなくGANなんてものもいけるそうです。

敵対的生成ネットワーク (てきたいてきせいせいネットワーク、英: Generative adversarial networks、略称: GANs)は、2014年にイアン・グッドフェローらによって発表された教師なし機械学習で使用される人工知能アルゴリズムの一種であり、ゼロサムゲームフレームワークで互いに競合する2つのニューラルネットワークのシステムによって実装される。

GANはこんなやつです。表記はGANで良いのかGANsで良いのかよくわかんない。ここでは学習データからそれっぽいデータをつくることができるみたいな認識。画像で言ったら、それっぽいデータを生成できるよ見たいな感じ。例としては、偽札を作る人と取り締まる警察の話がよく出てきます。


これに関しては内容がかなり多いからかなり飛ばしてやっちゃいました。復習っぽい内容も割とあるので、総まとめとして利用するのもありかもしれない……?最悪ツール使い方についてのドキュメント読めばなんとかなるでしょうとかいう感じでやってます。ツールとして使うだけならパターン化されてるのとググれるワードさえ分かればこっちのものみたいなところありますよね、この手の専門的な話って…。あと微妙にわかるワードがでてくるのは僕が中途半端に統計やってたりするせいなのだろうか……。まあ、そんな感じです。


おわりに

駆け足で進めてしまったので全然内容理解も足りてないしコードもそんなに書いてないしですが、そういった感じで機械学習関連の項目をやってみました。ただ、やはり "身の程知らずの初心者" がこんなことをやっても無駄なんだなってのが結論です。なお、これは "身の程知らずの初心者" である僕の場合はそうだったということで、これから機械学習をはじめる優秀なみなさまには関係のない話ということはご留意いただきたいです。


まあ、それでもどっかで機械学習に関するコードや記事を書くなどはしてしまうのだと思う。身の程知らずだから……。