機械学習について勉強したいので調べてみたのですが、同じ情報源を良いと言ってる人が多い印象でした。 それだけ実践的な情報が少ないのかもしれませんが。。
「この本、さっき読んだ記事でもおすすめしてたな。あれ、この記事もだ。」
なんてことが多々。
そこで、機械学習をやる前に情報を整理したいと思い、この記事に集約してみました。
私は数学も機械学習も無知だし、まだ何も機械学習のコードを書いてません。 ただのリンク集になってるところもあります。
機械学習をやるまえに
最初に機械学習で何をしたいのかを決めることが重要
ゴールを持つことが学習の進み具合を変えるらしい。
たしかに、やりたいことがあれば、勉強量も定着量も全然違う気がする。
無駄な知識を学ばないことも大切なんでしょう。
すべての理論を理解しようとしない。
機械学習は難しすぎるのでまず理解できないし、少しずつ簡単なものを実践して理解していくことが大切。
まずはコードを書く!
コードを書いていけば、なぜ動くのかをおおまかに理解していける。
数式や理論の理解は後回し、慣れろ、ってことですね。
「次元の呪い」というものがある
学習データをすべて学習させようとしても精度が出ないことが多々ある。
データを分類するために「データのどこに注目すればいいか」が、プログラムは判断できない。
特徴抽出
対象データから特徴となる量を抽出することが特徴抽出。
これで「データのどこに注目すればいいか」をプログラムに教えることができる。
よって、特徴抽出 → 特徴抽出したデータで学習させる という流れになる。
機械学習の流れ
データ収集 少なくとも100,000件くらいあるといいらしい。
深層学習では、数万件のパラメータは当然という程のビッグデータがあることで機能するという。
膨大なデータを処理するためには、高速な計算環境が必要。データの整理 収集したデータは、一部欠落や不正データが入ってる場合があるため、情報を整理しなければならない。
SQLやBigData処理(分散処理など)のスキルが必要。分析・分類 整理したデータの特徴を見極めたり、予測に必要なデータを推測する。
定量評価。学習モデル作成 整理したデータから予測するモデルを作成する。
Pythonなどの開発言語で使う。
データの種類や目的によってアルゴリズムを選択(パラメータのチューニングなどのおすすめを出してくれるのもある)。
正規化も必要。データの予測と実験 訓練データからつくった学習モデルで予測する。
学習〜テスト予測の実験を何度も繰り返す。
精度が良くても過学習の可能性がある。
AIは人間をアシストするもの
特徴抽出を行わなければならないという点からもわかるとおり、機械学習などAIは勝手に「こういう課題があるから、こういうことをやりたい」と考えて答えを導き出すことはない。
人間が膨大な量のデータを揃え、課題を与えることでしか機能しない。
課題を持った人間がやらなければならない大量のデータに対する分析を自動で行ってくれることで仕事をアシストしてくれるのがAIなんでしょう。
スライドで「機械学習とは」を感じよう
パラパラっと読んでみて、なんとなく機械学習がどういうものなのか、どう動いてるのかがわかるためのスライドです。 公式が出てきますが、まずは完璧に理解せずになんとなくこういうものがあるのかと知る程度でいいかも。
必ずと言っていいほど紹介されてる動画
関連する記事はこちら。
機械学習を1ヵ月で実践レベルにする #2 (オンライン講座)
Courseraの機械学習コースのススメ 前編
日本語なので聞きやすそうな動画
schoo: 現場で使えるデータ分析 講座
gacco: 社会人のためのデータサイエンス講座
これらの本は読んでおきたい
この2冊は、いろんな記事でオススメされてる頻出度高めの本だった。
なので、私もこの2冊は絶対読んでおく。
プログラムや理論がわからなくても、サンプルプログラムをコピペして動かすことが何よりも重要です。 マルコフ連鎖やLSTMなどを用いたテキスト解析、チャットボットの作成、深層学習による牛丼の認識、機械学習・深層学習に必須なデータ収集テクニックまで網羅。
以下の本も初心者にわかりやすそうな書評がありましたので記載。
(参考)
- 機械学習をこれから始める人に押さえておいてほしいこと
- 機械学習を始めて2週間、機械学習を始めるのに必要だったこと
- AIはproblem solvingマシンではない - ニューロサイエンスとマーケティングの間 - Being between Neuroscience and Marketing
- 数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路
- 機械学習を1ヵ月で実践レベルにする #1 (とっかかり編)
- 【機械学習入門】基礎から実践まで学び尽くそうを参考
- 【人工知能初心者向け】機械学習・Deep Learningプログラミング学習の道筋と参考書籍
- 機械学習を始めて2週間、機械学習を始めるのに必要だったこと
- データサイエンティストに興味があるならまずこの辺りを見ておきな、って文献・動画のまとめ(随時追加)
実際に簡単なサンプルを試してみよう!(すぐできる!)
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
なんで動いてるのか
- 画風を抽出
- 画風を適用
画風を抽出したい画像を、魔法のCNN(ここに公開されてる)に入力すると特徴を取れるようです。 VGG_ILSVRC_16_layers.caffemodel がそうなのかな。
CNNに画像を入力すると、いくつもの層ができる。
この層には入力画像の特徴ごとにチャネルがわかれていて、層が深まるごとにそれらの特徴が強調されていく。
画風をあらわす"スタイル行列"
こちらでは"スタイル行列"なるものが導入されてる。
同じ中間層の各チャネル間の相関を計算したもの。 チャネルはRGBの赤と緑の相関など、どんな色が使われているのかを表す。 層が深まると、線の太さや「どの色とどの色が隣り合って描かれやすいか」、使われてるテクスチャなとが反映される。
CNNが画像の特徴を抽出すると、特徴Bに対する特徴Aの相関を表すベクトルができる。
層には特徴ごとにチャネルがあるので、さらに特徴Cに対する特徴Bの相関のベクトルができ、特徴Dに対する..と続く。
これらすべてのベクトルを合わせた行列が、ここでいうスタイル行列 なのだろう。
層ごとに特徴の相関を計算したベクトルができるイメージ。
どうやって相関を求めてるのかというと、
2つの特徴’の相関は,同じ位置のピクセルどうしの積をもとめて,それをすべて足し合わせることにより求まります。
同じ中間層で、上記の過程を踏んだ結果、
「画像中に含まれる(すべての)特徴間の相関」を表すベクトル
つまり “スタイル行列” ができあがり、これが画風として扱われることとなる。
画風をあてたい画像もCNNに入力します。
細かい筆のタッチのような情報は浅い層で、大きめの空間パターンは深い層で取り出す ということで、画風をあてたい画像については、深い層の出力を使えばよさそう。
よって、
- 画風画像と、スタイル行列の差
- 画風をあてたい画像と、中間層出力画像の差
これらが最小になる画像を画像をつくっていくこととなる。 これが画風変換後の画像になる。
これは、損失関数というらしい。
L(X)=αLorig(X)+βLstyle(X).
(参考) 【Deep Learning 画風変換】ポケモンを大神の世界に連れて行ってみた という面白い記事があり、こちらで詳しく画風変換について紹介されてます。 TensorFlowで絵を描いてみた(機械学習名古屋第9回勉強会) で、
機械学習にはたくさんの手法があることを知る
機械学習の情報を手法を中心にざっくり整理 機械学習を始めたくなる!機械学習アルゴリズム解説スライドまとめ
上記の記事は、機械学習の手法を網羅し、簡潔にまとめてある素晴らしい記事です。
以下、抜粋である。
送られてきたメールがスパムメールか否かを判別する」といったように、与えられたデータを2つに分類する際に用いられる。 2択の予測において ( 活性 / 非活性 ) 、要因となる入力値に重みを付けて合算し、それが閾値 ( バイアス ) を超えると片方 ( 活性 ) と判定する手法。脳のニューロンの仕組みを模している。
- ロジスティック回帰
2択の予測において ( 負け / 勝ち , 売れない / 売れる ) 、ロジスティック曲線を使用して片方 ( 勝ち・売れる ) になる確率を0から1の値で算出する。
パーセプトロンの発展形ともされるアルゴリズム。精度の高い分類ができる。
データを分類するための境界線を決定する際に、境界線から一番近いサンプルデータまでのマージンの和が最大になる線を境界線とする手法。分類も回帰にも利用できる。
- K-means(K平均法)
性質の近い分類同士でグループ分けするアルゴリズム。 クラスタリング。
クラスタの個数を決めておき、訓練データからクラスタ個数分、ランダムなデータを選び、一旦、代表点と定める。他のデータは代表点との距離が1番近いクラスタに属させる。 クラスタにデータが追加された時、その中心点を新しいクラスタの代表点とする。これを、代表点が動かなくなるまで繰り返すことで、クラスタが作られる。 未知のデータに対して、同じく、各代表点との距離が1番近いクラスタに分類する手法。
- トピックモデル
文章から話題のトピックを抽出、文章とトピックの関連付けを行える。 分類されたデータが複数のグループに重複することを許す。
- 決定木学習(樹木モデル) 条件ごとに枝分かれ。 コンピュータがどう分類したか、という過程を理解しやすい。
- Random Forest
ランダムに選んだデータで複数の決定木を作成し、それぞれの決定木の結果を多数決する。 なんと「Kinect」の人体パーツ識別技術に使われてるそう。
- (多腕/マルチアーム)バンディットアルゴリズム
限られた試行回数の中でより良い選択をする。 学習用データなしで、目的変数を最大化させるために試行錯誤し、学習する。
スライドで「Deep learningとは」を感じよう
勉強のための 環境構築 をしよう
- ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換)
- Python で機械学習しよう!(環境構築 on Mac編)
勉強のためのプログラムを書こう
- タイタニック生存者予測Tutorialの一覧
- 機械学習の Python との出会い| 機械学習の Python との出会い
- pythonの機械学習ライブラリscikit-learnの紹介 - 唯物是真 @Scaled_Wurm
- 機械学習 はじめよう - 第18回 ロジスティック回帰
以下のコードを用意し、こちらより実装する
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy import optimize plt.style.use('ggplot')
(参考)
ライブラリごとの初歩記事
TensorFlow
- TensorFlowを始める知識準備の手順
- 多分もっともわかりやすいTensorFlow 入門 (Introduction)
- TensorFlowのチュートリアルを通して、人工知能の原理について学習する
Theano
THeano のチュートリアル
Weka
とある大学院生がこれを使って、GUIをポチポチして実装されたアルゴリズムでデータを自動分類していってたらしい。
Keras
真似していろいろつくってみよう
感情分析(Sentiment Analysis)
- PythonでTwitterでのツイートをネガポジ判定してみた結果。。。
- 深層学習でツイートの感情分析
- Twitter Stream APIデータに対して初歩的な感情分析を試みる。
- ディープラーニングを使って転職会議の企業クチコミデータを感情分析してみる
画像認識
- OpenCVでアニメ顔検出をやってみた
- ご注文はDeep Learningですか?
- ご注文は機械学習ですか?
- ディープラーニングでおそ松さんの六つ子は見分けられるのか?
- 機械学習で芸能人の顔を分類してみよう!
- ねこと画像処理 part 2 – 猫検出 (モデル配布) « Rest Term
- 「顔以外」のものを画像認識する on iOS
- ディープラーニングによる姿勢推定openposeで「男子の夢な(衣服の下を透視する)妄撮カメラ」を作ってみよう!?
- Googleの猫認識 (Deep Learning) - 大人になってからの再学習
- 画像認識によって焼きたてパンの種類を判断できるレジ装置
- 低解像度の画像から、自動車のナンバープレートのナンバーを識別
- 金貨が本物かどうか見極める - Qiita
- 食べられるキノコを見分ける - Qiita
テキスト処理
- 大量のニュースから興味関心のある話題をベイジアン分類で抽出する - Qiita
- twitter streamingAPIで突発的な流行語を抽出 - Qiita
- 英文の誤りを見つけ出し、ネイティブが書いたかのような文章に校正
- 指し手を「機械学習」することで将棋アルゴリズムを自動生成
- 最新記事のいいね!数を予測してみる - Qiita
- ナイーブベイズでツンデレ判定してみた - Qiita
- 東京都議会議員選挙の党派マニフェストを自動分類したよ - sleeping vote