客先常駐さんの機械学習のおしごと

# はじめに

客先常駐でお仕事をすることが多いのですが、行った客先で知らない技術を指定されて「こんなの作って！」と言われて、あわてて勉強していろんな技術を覚えるというのを繰り返しています。（業界あるあるですよね？）

いろんなお客さまのところで、Windows、Linux、Mac、Android、iOS、Web系、組み込み系、大きい機械、小さいデバイス、画像、音声、動画、ドライバなど幅広い技術を客先常駐さんとしておぼえてきました。

ここ３年くらいは機械学習をやらせてもらうことが多く、客先常駐さんが機械学習をやることになったときにどんな感じだったかをまとめてみます。

Advent Calendarのカテゴリの意図からはすこしズレるかもしれませんが、機械学習をやったことがない客先常駐さんが機械学習に挑戦したくなるような記事にしたいと思っています。



# 機械学習エンジンを使ったシステム開発

「次の客先ではＡＩの仕事をやってもらうよ」とだけ聞いていった客先で初めて機械学習というものに触れました。

行った客先では、お客さまが開発した機械学習のエンジンを使ってシステムを開発しました。

機械学習のエンジンを提供している会社は、公開したＡＰＩのみで機械学習を利用できるようにしているので、内部でどのように機械学習が動作しているかは隠蔽されていてわからないことが多いです。

フロントエンドの開発や学習データの作成などの作業だったので、ＡＰＩを呼ぶだけで機械学習を使ったシステムの開発を行うことができました。

内部の動作はわかりませんでしたが、機械学習とはどういう動作をするのか、できること、できないことを理解することができました。


こういう案件では以下のことを把握しているとよいと思います。

## 学習データの作成

学習データを作るのはすごく大変でした。
開発するより、データ作成の方が大変な場合もありました。

人間がアノテーションしたので非常に多くの時間がかかりますし、ミスも発生しやすいです。

アノテーションしやすいツールを作成したり、少ないデータを効率よくデータ拡張して学習データを作成する必要があります。


## 学習データの管理

学習データを更新したけれど判定の精度が下がるということがよくあるので、ロールバックしたり、過去バージョンと比較したりできるようにデータ管理をしないといけません。

大量のテキストデータとバイナリデータを、学習結果と合わせてバージョン管理していくのは非常に面倒です。

開発中の運用を事前にきめておかないとミスを連発してしまうことになりがちです。


## テストの方法

機械学習で100%の判定をすることはできないので、これまでのテスト仕様書のままだと実現できないテストになってしまうことがあります。

乱数固定してテスト結果を固定させたり、テスト仕様書を見直して実現可能なテスト項目にして対応していました。



## ユーザービリティ

テストの方法でも記載しましたが100%の判定をすることができないので、間違って判定してもユーザーに不利益がない設計にする必要があります。

画面遷移やメッセージ表示で対応しましたが、これまでの開発にはなかったところに気を付ける必要がありました。


## ログ

機械学習は、学習データをアップデートすることで判定の精度を上げることができます。

これは既存のシステムにはない観点だと思います。
判定に失敗したログを解析して、学習データに追加学習させて精度を上げていくことを繰り返していくことがシステムとして重要です。

追加学習することを前提としたログ出力にする必要があるので、これまでの障害調査にしか使っていなかったログとは考え方を変える必要があります。

操作性を悪くせずにログをうまく取得できるようなUIにする必要もあるので設計の腕の見せ所かもしれません。



# 機械学習ライブラリを使ったエンジン開発

機械学習エンジンを使った開発ができるようになったら、機械学習ライブラリをつかってエンジンを作る案件に参加することができました。

機械学習エンジンを使うのと、機械学習ライブラリでエンジンを開発するのでは必要な知識が違いましたが、大学で機械学習を研究されていた方からいろいろ教えていただけたので環境に恵まれました。
私はGPUコンピューティングの経験があったので、お客様の機械学習の知識と、私のGPUコンピューティング開発の知識をうまく交換したような感じになりました。

機械学習とはどういうものかをインプットしてから、ネット上にあるチュートリアルや、解説サイトを参考にいろいろ動かして学習しました。
学習時はtorchやchainerをライブラリとして使うことが多かったです。
知識をインプットしてからchainerのMINISTのサンプルを１行ずつ確認しながら動作させていくのがいい感じに理解が深まったと思います。

動きが面白いGANとかから学習したくなりますが、ソースが難しすぎて解析できなくなるので単純なクラス分けのサンプルソースから始めるのが良さそうです。


こういう案件では以下のことを把握しているとよいと思います。


## 機械学習の知識

私は作業を開始してから機械学習のことを勉強しましたが、作業開始前に概要は把握しておくべきでした。

知識がなかったのでネットワークや、ハイパーパラメータの調整などで苦労しましたが、事前に知識があればスマートに対応できたと思います。

当時と違って今はネットや書籍の資料が充実してきたので勉強するのも難しくないと思います。Web上で動かせるサンプルも多いので動きを確認しながら学習できるようになってきたのも良いですよね。

機械学習ライブラリの学習データを共有可能にするONNXも実用レベルになってきたみたいなので、今後は複数のライブラリの使い方を覚える必要はなさそうなのも良い傾向だと思います。


## Python

Pythonも仕事が始まってから覚えたのですが、これは事前に覚えておいたほうが良かったと思います。

現在、機械学習をやるにはPythonの習得は必須といってよいです。
提供される機械学習ライブラリのほぼすべてがPythonのインターフェースを提供しています。
ネットのサンプルや論文もPythonが中心になります。

開発言語がPython以外でもPythonを理解していないと開発は難しいと思います。

言語としては覚えやすいですしライブラリも優秀なものが多いので、複数の開発言語を使える人ならそんなに苦労せずに覚えられると思います。


## GPUコンピューティング

学習時間短縮や、判定の高速化のためにGPUの利用が必須になります。
時間をお金で買えるのだからGPUを使わない手はないです。

Pythonの機械学習ライブラリがGPUに対応しているので、GPUコンピューティングの細かいところを把握していなくても開発はできますが、概要くらいは把握していないとうまく作業できないとい思います。
cuda関連だとnvidiaのドライババージョンで動きが違ったり、環境構築もコツが必要だったりすることがまだ多いのです。

私は動画の案件で高速に画像処理するためにcudaを使った経験があったので知識が役に立ちました。


# Ｇ検定

機械学習の知識を得るためにＧ検定を受けてみました。

仕事でエンジン開発やってるから楽勝と思ってあんまり対策しなかったら落ちました。
実務の知識だけで受けると歴史や人名の問題がわからなくてつらかったです。

お客さんからは当然受かるよね！っていう感じで見られていたのでちょっと胃が痛くなりました。

ちなみに、３回目に合格できました。
（育児で勉強時間がとれなかったと言い訳しておきます）

一発合格できる頭を持つ人なら機械学習の仕事やるの簡単なんじゃないすかね。

Ｇ検定で学習した知識は、実践で使えるものも多いです。
エンジンを使うだけの人は機械学習の概要やテスト手法の知識が実務で使えると思います。
エンジンを作る人は、理論や数式が覚えられます。

それ以外だと、特許や法律の知識は実務では覚えにくいですが、必要な知識になるので参考になりました。

試験料金高く感じるけど、そこそこ実践で使う知識が得られ、経歴に箔付けできるからコスパは良いと思います。（一発合格できれば。。。）


## Ｇ検定の推薦図書、勉強に使った書籍

技術書を買うのは趣味みたいなものなので、書籍類はいろいろ買って読みました。

試験３回の受験料と書籍代を足すと結構おおきな出費だったので効率よく勉強したい人向けに書籍の特徴をまとめておきます。

- 公式テキスト

  -  深層学習教科書 ディープラーニング G検定

 広く浅くわかりやすく問題を解説しています。試験対策にこの本は必須です。時事問題には対応できないので別のところから知識を仕入れる必要があります。


- 問題集

  - 徹底攻略 ディープラーニングG検定 ジェネラリスト 問題集 徹底攻略シリーズ

通称、黒本。問題集としてはこちらの方が公式テキストより良いと思いました。暗記系の重要なポイントがよくわかります。短期決戦で挑む人はこの問題集をやればよいと思います。


- 人工知能は人間を超えるか ディープラーニングの先にあるもの

ベストセラーなので読んだことある人多いと思います。わかりやすくディープラーニングが解説されています。発売当初は最新の状況を解説する本だったのですが、今はちょっと古くなってきてるところもあります。テスト対策にはＡＩ白書の方が効果的な気がしますが、厚くて大きく値段が高いＡＩ白書を読みたくない人はこちらから入りましょう。


- ＡＩ白書
  - ＡＩ白書　２０１９
  - ＡＩ白書　２０１７

Ｇ検定では、最近の時事問題が出されてびっくりして時間ロスしてしまうことが多いです。ＡＩ白書はわりと最新の状況が書かれているので、時事問題にも対応できます。全部は覚える必要ないですが、世の中の流れをざっくり読んで把握しておくとよいと思います。
置いていない本屋さんが多いので、技術書が揃っている大きめな本屋さんかネット通販で買うことになると思います。私は近くの書店に無かったので秋葉原の書泉で買いました。


- 深層学習 (機械学習プロフェッショナルシリーズ)

通称、青本。数式系の問題はこの本をみて覚える感じになると思います。ですが、歴史問題や名前問題を正解できれば数式の問題は全部捨てても受かるらしいですよ？

個人的にはオライリーの「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」を読んだほうが理解が深まりました。数式だけでなくソースコードがあるほうが理解しやすいプログラマ脳なんだと思います。


# 知っていると良い知識

現場で役に立った知識や技術をまとめておきます。

## 自然言語処理

チャットボットのような案件では自然言語処理の知識があるとよいです。

私は学生のときに形態素解析とかのライブラリをつかったプログラミングをしたことがあったので、自然言語処理について理解がしやすかったです。

学習データを作成するときに、いろんな文章を学習させるのですが、効率よく学習データを作るためには、日本語をうまく仕分けして処理するための知識があるとよいと感じました。


## 画像処理

画像を使った機械学習の案件も多いと思います。
写っている物体を特定するようなエンジンは、製品化されているものも多いです。

学習させる画像データを作成する以外にも、学習結果の可視化したりいろんな作業で画像処理の知識が必要になります。

学習データを作成するための前処理として、クロップ、色変換、各種フィルタの適用などを行いますので、それらの知識があると効率よく作業ができます。

opencvはすごく有能なライブラリだと思いますので、最低限の使い方を把握しておくとよいと思います。
昔C++ですごく苦労して実装した画像処理をopencvで数行で実装できるのに気づいたときは複雑な気分になりました。


## カメラ

画像を入手するためにはカメラを使う必要があります。
効率よく作業をすすめるために、学習データ作成の前処理がなるべく少なくなるような画像を撮影するための知識があるとよいです。

シャッタースピード、ISO、ホワイトバランスなどカメラの一般的な設定を知らない人は把握しておきましょう。

産業用カメラは接続用のAPIから制御することが多いですが、DirectShowやOpenCVからカメラ制御することもあるので、いろんな接続方法になれておくとよいと思います。


## オーディオ

私は音声系の機械学習はやったことないですが、スマートスピーカーとかの調査ではWAVファイルをいじったりしたので、オーディオ関連の知識は役に立つでしょう。

オーディオは入力と出力のＰＣＭデータの流れを一度理解してしまえば、ライブラリが代わってもそんなに違和感なく使えることが多いので、学習しておくと後日別なところで役に立つことが多いですね。


## Linux

Windowsでも開発できるのですが、Python + GPUコンピューティングをやろうとするとLinuxで環境構築するのが楽だと思います。
docker上でGPUが使えるのもLinuxを推す理由です。（Macは知らない）

Linux上でVS Code + anaconda(or docker) で開発すればWindowsで開発するのとそんなに変わらないと思います。

学習データのアノテーションを人に依頼する場合にLinuxの知識がない人に頼むことが多くなってきました。
Linux上での作業を依頼するために、GUIで操作できるPythonスクリプトを用意したりしてLinuxスキルがなくても作業できるように敷居を下げています。そういう工夫ができる知識とスキルがあるとよさそうです。


# 機械学習のおしごとに役立っていないけどやっていること

やっていることをいつくか紹介しますが、機械学習のおしごとの役には立っていないような気がしています。

## Qiitaの新着チェック

Qiitaの「機械学習」、「ディープラーニング」タグは新着をチェックするようにしています。
英語の論文は読む気がしないので、翻訳、解説記事が上がるとうれしくなってじっくり読んでしまいます。

最新の技術ネタはビジネスで使うのは難しいですが、研究者の人たちと話したときにネタとして使えるので、印象がよくなって情報が引き出しやすくなるくらいのメリットはあるかなと思っています。


## Pythonのお勉強

Pythonでやれること広げようと思い、ツールを作成したり、Qiitaに記事あげたりしてます。

覚えた小技で処理速度のアップや、操作性向上につなげたいと思っていますが、まだ知識がいかされたことはないです。
結局、性能が良いGPUを買えば解決できることが多いような気がしています。

Pythonの勉強の流れで強化学習を使った将棋や麻雀にはいつか挑戦したいと思っていますが、まだまだ先になりそうです。


# これからのこと

今後も機械学習の案件がさらに増えていくことと思います。
技術者不足になると思いますので、早急な人材の育成が必要になります。

エンジンやライブラリが優秀なのでプログラマーやテスターとしての作業はそんな機械学習の知識はいらないと思います。
機械学習が未経験な人でも積極的に挑戦して欲しいと思います。
そして実作業で機械学習の概要が把握できたら、作業範囲を広げられるようにレベルアップを目指してほしいです。


設計ができる人を育成するのはかなり大変だとおもいます。
システムを設計する立場の人は、これまでとは違う観点の知識が必要になります。
Ｇ検定や各社が作成している学習カリキュラムでも十分とは思えませんし、研究もどんどん進んでいくので最先端に追いつくのも難しいと思います。

ＡＩに職を奪われない稼げる客先常駐さんになるためには、今が機械学習を勉強する時だと思います。技術力に差をつけるチャンスですよ！


# おわりに

Qiitaの機械学習の記事を見ていると専門的な情報が多く、これから機械学習の実務をする開発者は難しすぎると感じてしまうかもしれません。

しかし現在の優秀なエンジンやライブラリは、使い方を覚えてしまえば仕事に使える動作をしてくれます。
「機械学習やディープラーニングって難しそう」、「やったことないから挑戦しない」なんてもったいないです。

私のような機械学習の知識が無かったアラフォーでも機械学習のおしごとで食べていけてますので、みなさんもどんどん機械学習に挑戦してみてください。