機械学習とは
wikipediaによると
機械学習(きかいがくしゅう、英: machine learning)とは、人工知能における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のことである。
コンピュータに大量のデータを放り込んで自動的に特徴を発見させ、未知のデータに対してもその特徴から何に該当するかを推測させる手法……だと思う。
大量のデータがなくても学習させる方法も研究されているみたいだけど、タイトルにもある通り細かいことは気にしない。
独断と偏見による他のバズワードとの関係
あくまで機械学習との関係でという話で、個々の文脈において機械学習が大きな割合を占めているとは限らないので悪しからず。
ドローン
姿勢制御とか自動操縦に活用。
ビッグデータ
機械学習のために放り込むデータで、これがないと始められない。
IoT
ビッグデータを集めるための端末。
機械学習による予測データに基づく自動制御。
ブロックチェーン
リアルタイムに送られ続けるビッグデータをうまく処理できそうな仕組み。
あるいは機械学習で生成した予測モデルを利用した自動化に使えそうな仕組み。
人工知能(AI)
強いAIと弱いAIがあり、機械学習は弱いAIを実現するための手法。
機械学習を用いないチェスプログラムなども弱いAIに含まれる(ような含まれないような)ので、弱いAI=機械学習というわけでもない。
何も修飾語をつけずに人工知能とかAIという場合は、ディープラーニングに触発されて強いAIを妄想しているのだと思う。
ディープラーニング
機械学習の精度にブレークスルーをもたらした手法。
(実運用にはGPU必須で学習時間も結構かかるなど)大量のリソースが必要な札束で殴れる人余裕のある人向けのものだが、クラウドとかプロセッサのスペック向上とかで遅くとも数年内にはお手頃に(なってほしい)。
チャットボット
人間の入力を適切なシナリオに振り分けるのに機械学習が使われる。(シナリオ対話型)
あらかじめ決められたシナリオに従うのではなく、入力に対して適切なアクションを実行したり提案したりするのにも機械学習が使われるが、その場合のリアクションはチャットに限らないのでチャットボットより広いボットの文脈だと思う。
VR・AR
直接の関係はなさそうだが、自動運転の訓練とか強化学習を利用した人工生命の開発だとか、ちょっと斜め上な使い方をすることがある。
その他
fMRIの読み取り画像から思い浮かべたものを推定したり、見ている映像を復元したりできてきているし、ヘッドバンド型の脳波計(いわゆるブレイン・マシン・インタフェース)なんかが入力デバイスになると面白いことになるのかもしれない。(fMRIでは脳波は読み取れてないだろうとか細かいことは気にしない)
fMRIの解像度の問題もあるのか、映像の復元なんかは微妙な結果に見えるかもしれないけど、元画像と縮小画像の差を学習させて解像度を上げる手法もあるし、正解データと読み取りデータの組み合わせが増えてくると多少はマシになるんじゃないかと思う。
機械学習への入門方法
正直、まだ入門してないので色々な情報を集めて、良さげなものを選定。
とりあえず何ができるのか試してみる
自分で機械学習をやったとは言えないが、事例や他人が機械学習を使って作ったサービスを利用してみると、何ができそうかイメージが湧く。
最初はやるべきでないことを認識する
全体像からすると、最初に押さえるべきことよりも、最初に手を出すべきではないことの方が多いはず。
そこは最初はスルーしていいよってところを確認しておくと、どこまでも手を伸ばして挫折する確率が下がりそう。
機械学習をこれから始める人に押さえておいてほしいこと
機械学習クソ素人の俺がプロダクトをリリースするまでの2ヶ月で覚えたこと
あと、機械学習におけるプログラミングの位置づけって、デザイナーにおけるそれと同じような気がする。
新しい言語やフレームワークを習得するのとは全く違う領域に足を踏み入れようとしているんだという認識が必要かも。
教材を利用する
機械学習の前提知識として必要な数学・統計1
全体的なイメージをつかむ
- 機械学習チュートリアル@Jubatus Casual Talks
 - scikit-learnを用いた機械学習チュートリアル
 - データサイエンティスト養成読本 機械学習入門編 - ある程度の前提知識があったほうがわかりやすいので、スタンフォード大学のオンライン講座とかを終えた後で読むといいかもしれない
 
動画学習
- Machine Learning(スタンフォード大学のオンライン講座で内容は英語だけど日本語字幕あり)(アーカイブ・補足資料)
 - Intro to Machine Learning(ディープラーニングではない機械学習のオンライン講座でアルゴリズムの中身よりは実際に機械学習を適用するのに必要な知識・技術が中心。日本語字幕は用意されていないが、Youtubeの自動翻訳は使える)
 - Deep Learning - Take machine learning to the next level(Googleの寄付講座でDeep Learningの概要紹介。初学者で内容を理解するのは難しいので勉強すべき分野の用語を知ったり、ある程度ディープラーニングの勉強が進んでから見ると良さそう)(日本語字幕動画(最初のほうだけ))
 
その他参考になりそうな書籍(初心者向けではないものもあり)
- ITエンジニアのための機械学習理論入門
 - イラストで学ぶ 機械学習 最小二乗法による識別モデル学習を中心に
 - 入門 機械学習
 - はじめてのパターン認識
 - 言語処理のための機械学習入門
 - フリーソフトでつくる音声認識システム-パターン認識・機械学習の初歩から対話システムまで-
 - 集合知プログラミング
 - 入門 ソーシャルデータ
 - イラストで学ぶ ディープラーニング
 - 初めてのディープラーニング
 - 深層学習 (機械学習プロフェッショナルシリーズ)
 - 深層学習 Deep Learning
 - パターン認識と機械学習(数学的背景に関する資料)
 - 統計的学習の基礎 ―データマイニング・推論・予測―
 - Caffeをはじめよう――深層学習による画像解析の実践
 - word2vecによる自然言語処理
 
参考にしたのは以下の記事
- 数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路
 - 機械学習の基礎知識としての数学
 - 機械学習はじめの一歩に役立つ記事のまとめ
 - 文系でも機械学習がわかるようになる教科書
 - Tensorflow勉強会(3) が開催されました!
 
他人の遊びを真似てみる
- TensorFlowでのDeep Learningによるアイドルの顔識別 のためのデータ作成
 - TensorFlowによるDCGANでアイドルの顔画像生成
 - ディープラーニングで本田翼を見分けたい。初歩編
 - ディープラーニングで「顔が似ているAV女優を教えてくれるbot」を構築
 - 男のための機械学習〜RBMでA◯女優さんの共通特徴量を得よう〜
 - ディープラーニングで顔写真から巨乳かどうかを判別してみる (うまくいったか微妙)
 - ねこと画像処理 part 3 – Deep Learningで猫の品種識別
 - TensorFlowで趣味の画像収集サーバーをつくる
 - Chainerを使ってコンピュータにイラストを描かせる
 - Chainerで顔イラストの自動生成
 - 最新の画像生成技術に衝撃を受けたので、その基礎技術をTensorFlowで実装してみる
 - ナイーブベイズでツンデレ判定してみた
 - ライトノベルの感想をDoc2Vecで解析してみた
 - 今季見るべきアニメを機械学習で推薦する, アニメ推薦くんの精度について
 - TensorFlowで会話AIを作ってみた。
 - 大量のニュースから興味関心のある話題をベイジアン分類で抽出する
 - twitter streamingAPIで突発的な流行語を抽出
 - ディープラーニング(TensorFlow)を使用した株価予想 ~その2~
 - 機械学習を使った株価予想(回帰編)
 - 東京都議会議員選挙の党派マニフェストを自動分類したよ
 - 金貨が本物かどうか見極める
 - 食べられるキノコを見分ける(山菜やキノコを見分けるアプリは必要だと思う)
 - 自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる
 - 青空文庫のデータを使って、遅ればせながらword2vecと戯れてみた
 - 自然言語処理をなにも知らない私がword2vecを走らせるまで
 - 【SEO×自然言語処理】 SEOに使えるテキストマイニングの最新手法
 - 光の早さでsentence2vec使ってみた。
 - sentence2vec 動かした
 - ディープラーニングを活用したマイクロサービスを構築し、画像から商品カテゴリの分類をしてみる
 - ディープラーニングで洋服を整理してみました
 - ディープラーニングであり得そうな間取り画像を生成させてみる
 - ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換)
 - DeepDreamを動かすまで
 - 画風を変換するアルゴリズム
 
再現するのは難しいけど、専門家になるとこういう遊び研究もできるという例
- ラフスケッチの自動線画化
 - 
ディープネットワークを用いた大域特徴と局所特徴の学習による
白黒写真の自動色付け(関係ないがPython用のcolornetというディープラーニングで白黒画像をカラー化するライブラリがある) - 自分の声を他人そっくりに変換する
 - AIが訓練結果に基づいてベートーヴェン(EUのテーマ曲)をビートルズふうに演奏
 - RNN-RBMによる旋律の予測と生成と音楽情報処理に関する紹介
 - DeNAの機械学習・深層学習活用した体験提供の挑戦
 
機械学習の実践方法
ライブラリを利用する
機械学習一般ならscikit-learn、ディープラーニングならTensorFlowかChainerなのかな。
- scikit-learn(Python向け機械学習用オープンソースライブラリ)
 - Torch(機械学習用フレームワーク)
 - TensorFlow(Google製のディープラーニング用オープンソースフレームワーク)
 - SkFlow(TensorFlowをscikit-learnのように使えるインターフェース)
 - SyntaxNet(TensorFlow用のオープンソース自然言語解析モデル)
 - Parsey McParseface(SyntaxNetに含まれる英語用の構文解析ツール)
 - Chainer(ディープラーニング用フレームワーク)
 - Keras(Python向けディープラーニング用ライブラリで裏側にTheanoやTensorFlowを利用)
 - Caffe(ディープラーニング用フレームワーク)
 - theano(Python向けディープラーニング用ライブラリ)
 - DSSTNE(Amazon製のディープラーニング用オープンソースライブラリ)
 - CNTK(Microsoft製のディープラーニング用ツールキットで、Network Description Language (NDL)というものを使用)
 
チュートリアル
- 特にプログラマーでもデータサイエンティストでもないけど、Tensorflowを1ヶ月触ったので超分かりやすく解説
 - Tensorflowを2ヶ月触ったので"手書きひらがな"の識別95.04%で畳み込みニューラルネットワークをわかりやすく解説
 - TensorFlowチュートリアル - TensorFlowメカニクス101(翻訳)
 - TensorFlow 畳み込みニューラルネットワークで手書き認識率99.2%の分類器を構築
 - 「TensorFlow Tutorialの数学的背景」シリーズ
 - 言語処理100本ノック 2015
 
どうしても慣れ親しんだ言語を離れたくない人のために
- DL4J - Java
 - Swift-Brain - Swift
 - Swift-AI - Swift
 - LearnKit - iOS
 - ConvNetJS - JavaScript
 - sukiyaki - JavaScript
 - その他
 
クラウドサービスを利用する
- Azure Machine Learning
 - Google Cloud Machine Learning - TensorFlowを提供しているGoogleなのにクラウドはまだLimited Preview(2016年5月現在)
 - Amazon Machine Learning
 
補足
オープンデータ(ライセンスは確認してください)
- UCI Machine Learning Repository
 - Kaggle Datasets
 - List of Public Data Sources Fit for Machine Learning
 - Internet Archive Book Images
 
画像加工
自然言語
で、結局どこから入門するの?
今回は、Azure Machine Learningを使って入門。
理由は、学習コストが一番低そうだから。一番やりたいディープラーニングを試してみるまでに数学だの統計だの他の機械学習手法だの色々やるとかひたすら面倒くさい他の入り口だと挫折しそうな予感がするので。
あと、GUIで機械学習の流れが直感的に把握できそうなのも理由の一つ。
DataRobotが実運用レベルになったらもっと楽できるかもしれないが、一切機械学習の勉強にはならなさそうな気もする。
機械学習入門
機械学習における"Hello World"的な位置づけのMNISTまでは既にまとめているので、そちらを参照。
Azure Machine LearningでMNIST入門
その後は、Sample1から自分に必要ないところは飛ばしながら順に進めていき、Neural Networkの手前まで進めば、基本的な機械学習の手法は押さえられるはず。
アルゴリズムチートシート2

Microsoft Azure Machine Learning のアルゴリズムの選択方法
とりあえず、一番大きい分類のどこに該当するかわかれば、少ないサンプルで試して精度と学習時間から適したアルゴリズムを選んで、実際の学習データでパラメータを調整すればいいと思う。
2クラス分類(TWO-CLASS CLASSIFICATION)
教師データから学習し、与えられたデータを2つの項目に振り分けるモデルを作成
| 特徴量 | 線形性 | 学習時間 | 精度 | メモリ使用量 | アルゴリズム | 
|---|---|---|---|---|---|
| 100より多い | 線形モデル | Two-class SVM | |||
| 線形モデル | Two-class averaged perceptron | ||||
| 線形モデル | 短い | Two-class logistic regression | |||
| 線形モデル | 短い | Two-class Bayes point machine | |||
| 短い | 高い | Two-class decision forest | |||
| 短い | 高い | 多い | Two-class boosted decision tree | ||
| 高い | 少ない | Two-class decision jungle | |||
| 100より多い | Two-class locally deep SVM | ||||
| 長い | 高い | Two-class neural network | 
多クラス分類(MULTI-CLASS CLASSIFICATION)
教師データから学習し、与えられたデータを任意の3つ以上の項目に振り分けるモデルを作成
| 線形性 | 学習時間 | 精度 | メモリ使用量 | アルゴリズム | 
|---|---|---|---|---|
| 線形モデル | 短い | Multiclass logistic regression | ||
| 長い | 高い | Multiclass neural network | ||
| 短い | 高い | Multiclass decision forest | ||
| 高い | 少ない | Multiclass decision jungle | ||
| * | * | * | * | One-v-all multiclass | 
| * One-v-all multiclassの特徴は、選択された2クラス分類のアルゴリズムに依存 | 
回帰(REGRESSION)
教師データから学習し、与えられたデータから数値を推測するモデルを作成
| 線形性 | 学習時間 | 精度 | メモリ使用量 | その他 | アルゴリズム | 
|---|---|---|---|---|---|
| ランク順序予測 | Ordinal regression | ||||
| カウント予測 | Poisson regression | ||||
| 分布予測 | Fast forest quantile regression | ||||
| 線形モデル | 短い | Linear regression | |||
| 線形モデル | データ量少 | Bayesian linear regression | |||
| 長い | 高い | Neural network regression | |||
| 短い | 高い | Decision forest regression | |||
| 短い | 高い | 多い | Boosted decision tree regression | 
クラスタリング(CLUSTERING)
データの類似度を元に、与えられたデータを任意の複数個の項目に振り分けるモデルを作成
| アルゴリズム | 
|---|
| K-means | 
異常検出(ANOMALY DETECTION)
多数の正常データと少数の異常データから正常な行為がどのようなものか学習し、そこから異常に外れたものを検出するモデルを作成
| 特徴量 | 学習時間 | アルゴリズム | 
|---|---|---|
| 100より多い | One-class SVM | |
| 短い | PCA-based anomaly detection | 
- 
動画学習のところで紹介しているスタンフォード大学の講座も、最低限必要な数学に関する知識は解説があり、高校文系数学までの知識でも乗り越えられたので、最初は数学やらなくてもいいかもしれない ↩