たくさん調べたことをまとめるブログ

エンジニア系で様々なことを調べてまとめるブログです

機械学習の超初心者が、みんなが良いと言う記事を読んでまとめてみた

機械学習について勉強したいので調べてみたのですが、同じ情報源を良いと言ってる人が多い印象でした。 それだけ実践的な情報が少ないのかもしれませんが。。

「この本、さっき読んだ記事でもおすすめしてたな。あれ、この記事もだ。」
なんてことが多々。

そこで、機械学習をやる前に情報を整理したいと思い、この記事に集約してみました。

私は数学も機械学習も無知だし、まだ何も機械学習のコードを書いてません。 ただのリンク集になってるところもあります。

機械学習をやるまえに

最初に機械学習で何をしたいのかを決めることが重要

ゴールを持つことが学習の進み具合を変えるらしい。
たしかに、やりたいことがあれば、勉強量も定着量も全然違う気がする。
無駄な知識を学ばないことも大切なんでしょう。

すべての理論を理解しようとしない。

機械学習は難しすぎるのでまず理解できないし、少しずつ簡単なものを実践して理解していくことが大切。

まずはコードを書く!

コードを書いていけば、なぜ動くのかをおおまかに理解していける。
数式や理論の理解は後回し、慣れろ、ってことですね。

「次元の呪い」というものがある

学習データをすべて学習させようとしても精度が出ないことが多々ある。
データを分類するために「データのどこに注目すればいいか」が、プログラムは判断できない。

特徴抽出

対象データから特徴となる量を抽出することが特徴抽出。
これで「データのどこに注目すればいいか」をプログラムに教えることができる。
よって、特徴抽出 → 特徴抽出したデータで学習させる という流れになる。

機械学習の流れ

  1. データ収集 少なくとも100,000件くらいあるといいらしい。
    深層学習では、数万件のパラメータは当然という程のビッグデータがあることで機能するという。
    膨大なデータを処理するためには、高速な計算環境が必要。

  2. データの整理 収集したデータは、一部欠落や不正データが入ってる場合があるため、情報を整理しなければならない。
    SQLやBigData処理(分散処理など)のスキルが必要。

  3. 分析・分類 整理したデータの特徴を見極めたり、予測に必要なデータを推測する。
    定量評価。

  4. 学習モデル作成 整理したデータから予測するモデルを作成する。
    Pythonなどの開発言語で使う。
    データの種類や目的によってアルゴリズムを選択(パラメータのチューニングなどのおすすめを出してくれるのもある)。
    正規化も必要。

  5. データの予測と実験 訓練データからつくった学習モデルで予測する。
    学習〜テスト予測の実験を何度も繰り返す。
    精度が良くても過学習の可能性がある。

AIは人間をアシストするもの

特徴抽出を行わなければならないという点からもわかるとおり、機械学習などAIは勝手に「こういう課題があるから、こういうことをやりたい」と考えて答えを導き出すことはない。
人間が膨大な量のデータを揃え、課題を与えることでしか機能しない。
課題を持った人間がやらなければならない大量のデータに対する分析を自動で行ってくれることで仕事をアシストしてくれるのがAIなんでしょう。

スライドで「機械学習とは」を感じよう

パラパラっと読んでみて、なんとなく機械学習がどういうものなのか、どう動いてるのかがわかるためのスライドです。 公式が出てきますが、まずは完璧に理解せずになんとなくこういうものがあるのかと知る程度でいいかも。

必ずと言っていいほど紹介されてる動画

courseraの機械学習コース

関連する記事はこちら。

機械学習を1ヵ月で実践レベルにする #2 (オンライン講座)
Courseraの機械学習コースのススメ 前編

日本語なので聞きやすそうな動画

schoo: 現場で使えるデータ分析 講座
gacco: 社会人のためのデータサイエンス講座

これだけは読んでおきたい初心者向けの本

この2冊は、いろんな記事でオススメされてる頻出度高めの本だった。
なので、私もこの2冊は絶対読んでおく。

プログラムや理論がわからなくても、サンプルプログラムをコピペして動かすことが何よりも重要です。 マルコフ連鎖やLSTMなどを用いたテキスト解析、チャットボットの作成、深層学習による牛丼の認識、機械学習・深層学習に必須なデータ収集テクニックまで網羅。

以下の本も初心者にわかりやすそうな書評がありましたので記載。

(参考)

実際に簡単なサンプルを試してみよう!(すぐできる!)

Docker上で、TensorFlowを使って画風変換してみた。

画風変換とは、要は『画像Aを画像B風にした画像Cをつくる』というもの。 画像Aをもとに、画像Bのスタイルを引き継いだ画像C出力するらしい。

まずDockerを起動して、以下のコマンドをたたいていくだけ! 超初心者の私でもすぐにできた!

git clone https://github.com/n-kats/tf-gogh.git
cd tf-gogh
docker build -t test-tf-gogh ./docker/
wget https://www.dropbox.com/s/0cidxafrb2wuwxw/nin_imagenet.caffemodel
wget http://www.robots.ox.ac.uk/~vgg/software/very_deep/caffe/VGG_ILSVRC_16_layers.caffemodel
docker run -v $(pwd):/workspace --rm -it nkats/mln:20170513 \
    python3 main.py -i ./images/cat.png \
                   -s ./images/gogh.png \
                   -m nin \
                   --iteration 5000 \
                   --lr 4.0 \
                   --lam 0.005 \
                   --height 300 \
                   --width 300

なんで動いてるのか

  1. 画風を抽出
  2. 画風を適用

画風を抽出したい画像を、魔法のCNN(ここに公開されてる)に入力すると特徴を取れるようです。 VGG_ILSVRC_16_layers.caffemodel がそうなのかな。

CNNに画像を入力すると、いくつもの層ができる。
この層には入力画像の特徴ごとにチャネルがわかれていて、層が深まるごとにそれらの特徴が強調されていく。

http://cdn-ak.f.st-hatena.com/images/fotolife/e/eeveeTuna/20151123/20151123115452.png

画風をあらわす"スタイル行列"

こちらでは"スタイル行列"なるものが導入されてる。

同じ中間層の各チャネル間の相関を計算したもの。 チャネルはRGBの赤と緑の相関など、どんな色が使われているのかを表す。 層が深まると、線の太さや「どの色とどの色が隣り合って描かれやすいか」、使われてるテクスチャなとが反映される。

CNNが画像の特徴を抽出すると、特徴Bに対する特徴Aの相関を表すベクトルができる。
層には特徴ごとにチャネルがあるので、さらに特徴Cに対する特徴Bの相関のベクトルができ、特徴Dに対する..と続く。
これらすべてのベクトルを合わせた行列が、ここでいうスタイル行列 なのだろう。
層ごとに特徴の相関を計算したベクトルができるイメージ。

http://cdn-ak.f.st-hatena.com/images/fotolife/e/eeveeTuna/20151123/20151123120020.png

どうやって相関を求めてるのかというと、

2つの特徴’の相関は,同じ位置のピクセルうしの積をもとめて,それをすべて足し合わせることにより求まります。

  • 相関が上がる → 同じピクセル上の特徴Aと特徴Bが現れやすい
  • 相関が下がる → 同じピクセル上の特徴Aと特徴Bが現れにくい

http://cdn-ak.f.st-hatena.com/images/fotolife/e/eeveeTuna/20151123/20151123130818.png

同じ中間層で、上記の過程を踏んだ結果、

「画像中に含まれる(すべての)特徴間の相関」を表すベクトル

つまり "スタイル行列" ができあがり、これが画風として扱われることとなる。

http://cdn-ak.f.st-hatena.com/images/fotolife/e/eeveeTuna/20151122/20151122232454.png

画風をあてたい画像もCNNに入力します。

細かい筆のタッチのような情報は浅い層で、大きめの空間パターンは深い層で取り出す ということで、画風をあてたい画像については、深い層の出力を使えばよさそう。

よって、

  • 画風画像と、スタイル行列の差
  • 画風をあてたい画像と、中間層出力画像の差

これらが最小になる画像をつくっていくことがゴールであり、そのゴールこそが画風変換された画像になる。

差を最小にしていくのを、損失関数というらしい。

L(X)=αLorig(X)+βLstyle(X).

(参考) 【Deep Learning 画風変換】ポケモンを大神の世界に連れて行ってみた という面白い記事があり、こちらで詳しく画風変換について紹介されてます。 TensorFlowで絵を描いてみた(機械学習名古屋第9回勉強会) が、ここで取り扱ってる画風変換の元となるライブラリを作られた記事です。

機械学習にはたくさんの手法があることを知る

機械学習の情報を手法を中心にざっくり整理 機械学習を始めたくなる!機械学習アルゴリズム解説スライドまとめ

上記の記事は、機械学習の手法を網羅し、簡潔にまとめてある素晴らしい記事です。

以下、抜粋である。

  1. パーセプトロン

送られてきたメールがスパムメールか否かを判別する」といったように、与えられたデータを2つに分類する際に用いられる。 2択の予測において ( 活性 / 非活性 ) 、要因となる入力値に重みを付けて合算し、それが閾値 ( バイアス ) を超えると片方 ( 活性 ) と判定する手法。脳のニューロンの仕組みを模している。

speakerdeck.com

  1. ロジスティック回帰

2択の予測において ( 負け / 勝ち , 売れない / 売れる ) 、ロジスティック曲線を使用して片方 ( 勝ち・売れる ) になる確率を0から1の値で算出する。

  1. SVMサポートベクターマシン

パーセプトロンの発展形ともされるアルゴリズム。精度の高い分類ができる。

データを分類するための境界線を決定する際に、境界線から一番近いサンプルデータまでのマージンの和が最大になる線を境界線とする手法。分類も回帰にも利用できる。

  1. K-means(K平均法)

性質の近い分類同士でグループ分けするアルゴリズムクラスタリング

クラスタの個数を決めておき、訓練データからクラスタ個数分、ランダムなデータを選び、一旦、代表点と定める。他のデータは代表点との距離が1番近いクラスタに属させる。 クラスタにデータが追加された時、その中心点を新しいクラスタの代表点とする。これを、代表点が動かなくなるまで繰り返すことで、クラスタが作られる。 未知のデータに対して、同じく、各代表点との距離が1番近いクラスタに分類する手法。

  1. トピックモデル

文章から話題のトピックを抽出、文章とトピックの関連付けを行える。 分類されたデータが複数のグループに重複することを許す。

  1. ナイーブベイズ(単純ベイズ分類器) テキスト分類アルゴリズム。 メールのスパム/非スパム判定やWebに投稿された記事のタグ付けなどに活用。 ベイズの定理と呼ばれる確率の概念が持ち込まれている。

  1. 決定木学習(樹木モデル) 条件ごとに枝分かれ。 コンピュータがどう分類したか、という過程を理解しやすい。

  1. Random Forest

ランダムに選んだデータで複数の決定木を作成し、それぞれの決定木の結果を多数決する。 なんと「Kinect」の人体パーツ識別技術に使われてるそう。

  1. (多腕/マルチアーム)バンディットアルゴリズム

限られた試行回数の中でより良い選択をする。 学習用データなしで、目的変数を最大化させるために試行錯誤し、学習する。

スライドで「Deep learningとは」を感じよう

勉強のための 環境構築 をしよう

勉強のためのプログラムを書こう

以下のコードを用意し、こちらより実装する

import numpy as np
import pandas as pd
import matplotlib.pyplot  as plt
from scipy import optimize

plt.style.use('ggplot')

(参考)

ライブラリごとの初歩記事

Deep Learning

TensorFlow

Theano

Theano の 基本メモ

THeano のチュートリアル

Weka

Weka入門 ~決定木とデータセットの作り方~ in松村研

機械学習データマイニング)ソフト

とある大学院生がこれを使って、GUIをポチポチして実装されたアルゴリズムでデータを自動分類していってたらしい。

Keras

真似していろいろつくってみよう

感情分析(Sentiment Analysis)

画像認識

テキスト処理

最後に、なんだかすごそうな人の紹介

http://qiita.com/tsunaki