Software Design 2017年8月号に掲載された「私も機械学習エンジニアになりたい」を読みました。
現在機械学習やビッグデータ関連技術を活用している企業を中心に転職活動をしているので私的に刺さる内容だと思います。
![ソフトウェアデザイン 2017年 08 月号 [雑誌] ソフトウェアデザイン 2017年 08 月号 [雑誌]](https://images-fe.ssl-images-amazon.com/images/I/51hCVCPp1NL._SL160_.jpg)
- 出版社/メーカー: 技術評論社
- 発売日: 2017/07/18
- メディア: 雑誌
- この商品を含むブログ (2件) を見る
第1章 ビジネスの変革をもたらす機械学習
機械学習とは
機械学習でできることは大きくわけて2つある。
- 予測
- 過去から現在までのデータをもとに未来・未知のデータに対して予測する
- 機械学習の枠組みでは「教師あり学習」と呼ばれる
- おもに「分類」「回帰」というタスクを実行できる
- 分類は過去のデータの傾向に基いて未来のデータではどのように分類されるかを予測する方法
- 回帰は過去のデータの連続値(時系列データ)の推移から未来のデータがどのような値になるかを予測する方法
- 発見
- 過去から現在までのデータから未知のパターンを発見する
- 機械学習の枠組みでは「教師なし学習」と呼ばれる
- おもに「クラスタリング」というタスクを実行できる
現在は様々なビジネス領域で機械学習が利用されているが、その背景としてはビッグデータの重要性が叫ばれる中、データの蓄積と活用のためのインフラが整えられてきたことが大きな要因である。また、オープンソースソフトウェア(OSS)の発展も機械学習を容易に使えることになった理由の1つである。
機械学習による学習は「直線を引くイメージ」があり、何か2つのクラスで分けられているデータがあったとすると、それを上手く自動で分けられるような直線を引くことであるといえる。この学習と予測に利用できるアルゴリズムは様々あり、「決定木」「ロジスティック回帰」「ランダムフォレスト」「ニューラルネットワーク」など多数存在している。
とはいえ、上図のようなクラス分けなら人でも簡単に判断できるような法則ではある。ではなぜ機械学習という技術を使うのかというと下記のような特徴がある。
- 機械学習の得意なところ
- 人手で処理できる量以上に「大量に処理」できる
- 人の処理速度以上に「高速に処理」できる
- 人が判断するよりも「高精度に判断」できる
- 機械学習の苦手なところ
- 少ない情報から推論すること
- 状況の変化に対して柔軟に対応すること
深層学習とは
深層学習は機械学習の一分野であるニューラルネットワークが発展した分野であり、機械学習(その中でもニューラルネットワーク)を理解した後に取り組むべきものであって、機械学習初心者がいきなり学習する分野ではない。
深層学習は画像認識や音声認識、機械翻訳などのさまざまな領域で精度向上できたため、従来の機械学習と置き換わるものという感じがするが、決してそうではない。商品の売上予測やレコメンデーション、広告のクリック予測などの特徴量の作り込みによって精度が決まるような領域では従来の機械学習でも高精度なモデルを構築できる。適用したいタスクの性質を理解して深層学習を適用するか検討する必要がある。
人工知能とは
人工知能は大きく分けると次の2つになる。
- 汎用人工知能
- 異なる領域で多様で複雑な課題を解決する知能
- 設計時の想定を越えて新しい問題を解決できることが可能とされている
- 特化型人工知能
- 特定の領域で知的に振る舞う人工知能
- 自律的に学習する能力は持っていない
- 人間が課題を発見して、人口知能の能力を高めていく必要がある
第2章 ディープラーニング入門
ディープラーニング以前は画像の機械学習を行う際に画像から何らかの特徴量を抽出する必要があった。しかしどのような特徴量を利用するかを決めるのは専門家の判断が必要で初心者が特徴量を決めるのは難しいことだった。
畳み込みニューラルネットワーク(Convolutional Neural Network、CNNと略される)は画像そのものを入力として使うことができるので、特徴量の抽出そのものをニューラルネットワークに任せることができるという特徴がある。しかも性能も良いので、現在は画像を扱う機械学習は畳み込みニューラルネットワークの独壇場となっている。
畳み込みニューラルネットワークは畳み込み層とプーリング層を組み合わせて使う。畳み込み層は特徴抽出をする層で、プーリング層は画像の歪みや移動に対して強くする層である。画像分類を行う場合はこの畳み込み層とプーリング層を交互に多層に重ねるのが普通である。
畳み込み層とプーリング層から抽出された特徴マップは全結合層に渡される。全結合層も複数重ねるのが一般的である。
第3章 機械学習自作マシンのポイント
GPUとは
GPUはGraphical Processing Unitの略で、コンピュータグラフィックス(CG)処理を高速に行うための専用機器として開発されたもの。CGではポリゴン処理やテクスチャマッピングといった処理を行うが、これらの処理は浮動小数点演算などの数学的処理を一度に大量に行うため、たくさんの計算コアが必要になってくる。
CPUはCentral Processing Unitの略で、複雑な命令を駆使して様々なことを汎用的に行うことができる反面1つのCPUコアのサイズが大きいため、コア数を増やすのは難しい。また、トランジスタの数が増えるため消費電力も増えてしまう。
GPUは様々なことを汎用的に処理する部分を省き、数学的計算処理に絞ることで1つのGPUコアのサイズを小さくし、代わりに非常に多くのコアを搭載したデバイスである。トランジスタの数も減らせるため消費電力も少なくて済む。
CUDAコアを搭載したGPUの種類
NVIDIAがCUDAというGPUのグラフィック処理機能を汎用的な数学計算用途に活用できる技術を発表した。CUDAはNVIDIA社のGPUのみで利用可能なGPGPUアーキテクチャだが、現在、機械学習を行ううえで世界的に一般的な基礎技術となっている。
CUDAにはGPUごとに使える機能が異なる。そのため利用する機械学習フレームワークの対応バージョンをもとに、適切なGPUを選ぶ必要がある。
主要なNVIDIAのGPU製品ラインナップは下記の通り。
- GeForce
- コンシューマ向けのGPU
- 主にPCゲーム用のGPUとして販売されている
- GPGPUとしても利用可能なので、自宅でGPUを使った機械学習を行うには最適
- NVIDIA Quadro
- ハイエンドなCG製作が必要な開発者向け
- NVLinkというデータ転送バスを搭載しており、複数のGPUを使ったCG処理のスピードが大幅に向上している
- 機種によっては半精度の浮動小数点演算に対応しており、単精度に比べて高速演算ができる
- NVIDIA Tesla
- サーバ向けGPU
- クラウド事業者が提供するGPUインスタンスにはこのGPUが搭載されている
- NVIDIA Quadroからビデオ出力を除いたり、2Uサーバ*1に搭載可能なように小型化されている
- 半精度が利用可能な機種もある
自宅で使うGPUの選び方
GPUを選ぶ際のポイントを列挙する。
- CUDAコア数
- コアの数が多ければ多いほど一度にたくさんの計算ができる
- 同じCUDAコアでもCUDAアーキテクチャによって基本性能が異なるので、アーキテクチャが異なる場合は単純に比較はできない
- クロック
- クロックが高ければ計算処理時間が短くなる
- クロックが高いと消費電力も増えるため注意が必要
- メモリ
- メモリが多いほど大きなニューラルネットワークを処理できる
- 消費電力
- 消費電力が少ないほどランニングコストが下がる
- 消費電力の少ないGPUの場合、補助電源が不要になることが多いので、増設作業の負担が減る
第4章 機械学習エンジニアを目指すには
機械学習エンジニアが企業に求められるスキルと役割
数式がある英語論文を読むのに抵抗がある人は将来に渡って活躍していく機械学習エンジニアになるのは難しい。機械学習の進歩を正しく理解するためには最低限の数学リテラシを身につけることが必要。
今後機械学習エンジニアの需要は増加していくが、ツールを使うだけの機械学習タスクはSaaSなどに置き換えられていき、実際のデータを観察してその時々に応じて必要な学習モデルを組み立てられるような機械学習エンジニアだけが生き残っていくと予想される。
機械学習エンジニアとして企業で働く場合、その会社のビジネス上での位置付けを理解していることが重要で、自分の会社はどのようなビジネスモデルで収益を上げようとしているのか、事業計画やビジネスモデルの中でなぜ機械学習を活用しようとしているのか、ということを考えなければならない。ここの認識を誤ると会社が求めていたアウトプットとはかけ離れたものとなり、会社と自分の双方が不幸な状態になってしまう。
一般的に機械学習のモデルを複雑にすればするほどその精度は上昇するが、モデルの解釈性は低下してしまう。少しでも精度の高いモデルを優先するべきか、人間が解釈しやすいモデルを優先するべきかなどの、取るべき手段も変わってくる。
機械学習エンジニアを目指す学生が知っておきたい話
有名な機械学習アルゴリズムについてGoogleで検索すると多くの場合、元の論文ではなくそれらを解説したブログがヒットする。しかし、それらのブログを読んだだけで理解したつもりになってはいけない。大抵の場合、何かしら間違っていたり詳細を省かれていたりする。
機械学習エンジニアが相対する問題はブログ記事を参考にした程度の実装で解決することはできない。実際には問題の定義から始まり、それに対する適切なアルゴリズムを探し、チューニング等の試行錯誤を繰り返すことが求められる。ブログ記事だけを読んで仕入れたような付け焼き刃の知識では歯が立たないのでしっかりと元の論文を読みアルゴリズムの本質を理解することが必要。
新卒エンジニアに必要とされる能力・知識について
- 心構え
- 休日であろうと常に勉強し続ける姿勢が求められる
- 興味のあるテーマは元の論文を当たったり、関連論文を読んで引き出しを広げていく
- 英語面
- 数式の入った英語論文が読めることは機械学習エンジニアとして生き残るのに必要条件である
- 数学面
- 理系学部で習うような基礎的な数学を理解している必要がある
- 具体的には下記の項目
- 行列を中心とした線形代数
- 多変数の微分積分の知識
- 基本的な確率論
- コーディングスキル
- データ取得・前処理・整形・モデルの作成・精度評価まで一通りこなせる必要がある
- 場合によっては簡単なWebアプリを作成できる程度の実装力
- 機械学習の知識
- 与えられた問題に対して必要な知識はその場で仕入れていけばよい
- 下記表に記載した、基礎的なモデルや統計学に親しんでいること(知っている程度ではなく、自由に実装して試行錯誤できる状態)
分野 | 入門書籍・Webサイト |
機械学習全般 | |
Naive Bayes | 機械学習のPythonとの出会い |
ロジスティック回帰 | |
ランダムフォレスト | はじめてのパターン認識 |
サポートベクターマシン | |
ニューラルネットワーク | Neural Networks and Deep Learning |
階層ベイズモデル | StanとRでベイズ統計モデリング |
状態空間モデル | |
自然言語処理関連 | |
Bag of Words | 言語処理のための機械学習入門 |
tf-idf | |
CBoW/Skip-gram | 深層学習による自然言語処理 |
トピックモデル | StanとRでベイズ統計モデリング |
統計学 | |
ベイズの定理 | ベイズ統計の理論と方法 |
推定手法(MCMC・変分ベイズ) | |
情報量基準 | |
漸近理論 |
*1:ラックサーバの厚さのことで、2Uは約8.8cm