30過ぎて機械学習エンジニアになって3年経ったので理想と現実について書いてみる

完全なるポエムなのですが、32歳から機械学習エンジニアに挑戦してあれよあれよという間に3年が経ちました。現在私はフリーランスとして活動しております。
これまでのキャリアを振り返えってみたいと思います。

# これまでの遍歴
理系大学院で修士まで取っていて(not情報系)、もともとは情シスで社内の管理部系のシステムの企画や保守をする部署にいたのですが、2019年にキャリアチェンジ、テキストから機械学習をスタートして途中でフリーランスに転向し、時系列解析や画像解析にも関わりました。
現在は二案件に参画していて、一つ自然言語系のプロジェクト(始まったばかりなのでまだキャッチアップ段階)、もう一つは画像の案件に携わっています。
基本的に最近は深層学習に携わることが多いです。

# スキルセット
現在アクティブで触っているものは以下の通り。

|||
|:---|:---|
|言語|Python|
|FW ライブラリ等|Pytorch, Scikit-learn, numpy, pandas, matplotlib, Transformers, OpenCV|
|インフラ・OS|AWS EC2, Ubuntu|

二案件を掛け持ちしている関係で言語系のパッケージのTransformersと画像/動画系のOpenCVを同時に触っていたりします。

# キャリアチェンジ前と今で感じている理想と現実
ここではこれまで機械学習エンジニアと活動してきて感じたことをつらつらと書いてみたいと思います。
## 1. 意外と総合力勝負
AI人材といわれると、一般の方はAIに特化した専門家だったり専門的な仕事をしているというイメージが強いかもしれないですが、意外と周辺領域が重要だったりします。
具体的には対象としているビジネス領域だったり、周辺のエンジニアリングの技術です。

ビジネス領域として挙げられるのが

- 業務知識
- ドキュメンテーション能力
- ロジカルシンキング
- 根性ｗ

このあたりかなと思います。業務知識については言うまでもないことで、野球の予測をしたいのに野球のルールを知らない状態だとまともに結果を評価したりアルゴリズム構築ができないですし、
最終的な結果を相手に伝える能力として、ドキュメンテーションやロジカルシンキングも重要になります。意外と資料を作ったり調査している時間も長いので、ビジネスのソフトスキル(というより大学院とかで研究を進めていくスキルなのですが、そこまで大きな差はないです)も大事になってくるなと思います。
根性についても半分冗談なのですが、基本的に汚いデータが多いので、それを修正したり成形したりすることや、パラメータチューニングやルールベースの場合アルゴリズムの構築の試行錯誤が多く、多少のことでへこたれないことが大事だと思います。
この辺りがアプリ開発と異なり絶対の正解がないので、周りの意見を参考にしながらも試してみるしかないという難しさだと思います。

エンジニアリング能力としては機械学習回り以外だと

- LinuxやDockerなどのインフラの基本的な知識
- Git
- コードを散らかさないように整理しながら開発を進めていけること

私がDeep Learning領域を対象としているのもありますが、GPUを使用したりすることも多いですし、大きいデータを扱うことも多いので最低限のLinuxの知識は必須です。
チーム開発となればGitが扱えることも必要ですし(ぶっちゃけ、独力で身につくと思えないのでやりながら覚えることになると思いますが)、
意外と三つ目のコードを整理しながら仕事をしていくのが大事な気がしています。
上記の通り試行錯誤になることが多く、Jupyterで対話型コードを書きながら進めていくことが多いかと思うのですが、
性質上コードが散らかりやすく(ゴミになるかもしれないコードを綺麗に書いてられっかと思って適当に書いていて、それが溜まって大変なことになることが多い)、このあたりを適宜片付けながら仕事をしていくことになります。

余談になりますが、この業界DBやSQLが大事という意見を見ますが、私はほとんど使ってないです。ここ一年以上全く触れてないです。テキストや画像を扱うことが多いからかもしれないですが、あまり書く機会がないですね。正直情シス時代の方がよく使っていました。

## 2.モデルを構築している時間が多くない
R&Dタスクなど例外はありますが、基本的にデータを加工したり、前処理のコードを書いたり、結果を評価したり、モデルをチューニングしたりしている時間のほうが長いです。
モデルについては一回作るとそのまま使いまわすことも多く、意外とゼロからTensorFlowやPytorchでモデルを作っている時間はそんなに長くないことが多いです。
あと、大体似たようなタスクを探れば先人の知恵があることが多くコードも公開されているので、そのあたりを拝借すればここはあまり悩むところではなかったりするので、仕事の割合として多くないことが多いです(ライブラリのverが古かったり、自分たちの問題に置き換えるにあたって書き直すことはある)。

## 3. 機械学習のライブラリできること多過ぎ
DeepLearning用ならTensorFlowやPytorch、それ以外だとnumpy pandas、scikit-learnなど様々なライブラリが存在しますが、私レベルがやりたいことは大体実装されていることが多いです。
評価指標なんかもググればやり方が出てきますｗAPIなんかも発達していてTensorBoardなど使えば学習中の結果も可視化してくれます。
こういったものを使いこなすということのほうが大事だよなと思います。もちろん原理を知らなくていいというわけではないです。

## 4. 論文のコードが汚い
これは完全に実装者によるのですが、概して論文のコードの可読性が悪いことが多いです。
全く人のことは言えないのですが、ライブラリ一発でできることをくどくど書いていたり、
素敵な変数名になっていたり、あれっ？これ論文の内容と違くね？みたいなこともあります。
この仕事の難しいところではあるのですが、絶対的な正解のロジックがないことと出力が不定のため間違えを検知しにくいことと、
いろんなスキル感の方がいることと上記の通りコードが散らかりやすいというのもあると思います。人が試行錯誤してできたものなのでしょうがないのかなと思います。

## 5. 3年やっても入門書見ても知らないことがあるｗ
はい、これは私の勉強不足が起こしていることなのですが、機械学習やデータサイエンス領域もかなり広く、正直自分の領域外の知識については何もわからないということも多いですし、
すべてを原理レベルで理解するというのが現実的に難しいというのもあります。
ある程度知っていることを増やす努力をしつつも、まずは真似して使ってみる、必要な時と暇なときに基礎に立ち返って勉強するというのが現実ラインなのかなと思います。
評価指標なども、今使っているものに限定しても、原理からわかっていないものもあり、この辺りは現場で肌感覚を教えてもらいながら慣れていく、そして必要に応じてネットや書籍で学ぶというサイクルとなっております。
原理から知らないと使えませんでは何もできなくなってしまうなと感じますので、こういった態度も必要悪かなと思います。範囲も多岐にわたりますし、そこの背景の概念や数学的知識の量も多くすべてが頭に入っているという状態になるのはほぼ不可能です。


## 6. 英語ができないと詰む
最近ではDeepLなど翻訳機能が充実してきているとはいえ、まだまだ論文を読むとなると苦しいですし、仕事柄外国人とやり取りをすることも少なくないです。
質問なども機械学習の情報は日本語では少なく、英語でしてしまった方が早かったりします。
最低限読めるのは必須、チャットができるくらいは書けた方がいい、話せればいうことないという感じですかね。
日々の仕事をする上では数学ができるより、英語ができる方がよほど大事な気すらします。

# キャリアチェンジして変わったこと
ここからはキャリアを変えてみて変化したことについて書いてみたいと思います。
## 1. 技術に敏感になった
Webのエンジニアほどではないにしろ、Dockerを触ったり最低限のインフラ知識は必須となりますし、ソフトウェアエンジニアの人と協業することも多いので、最低限の技術的なリテラシーは必須となります。
そりゃ上流やっていたときも同じでしょ？という意見もあるかと思うのですが、実際に手を動かすのが自分なのでその辺りの感度が変わります。
あと、オープンソースの技術が増えるので、情報のアクセス性が格段にいいというのもあるのかなとは感じます。この辺りはWeb系とSIerの比較にも通じるのですが、オープンなカルチャでネット上でも活発な議論がされている世界と、ベンダの中で技術スタックが閉じている世界の違いなのかなと思います。
機械学習の世界なら日々論文が出ていて、GitHubに実験のコードが公開されていたり、エラーが出たときに、ググったら先人のハマった知恵が大量に出てくる世界なのに対して、かつてはエラーが出たら知らなかったらベンダに問い合わせるしかないという世界なので、仕事のやり方にも結構差が出るのかなと思います。

## 2. Microsoft Officeに触れることが減る
PowerPointは使う機会が結構あるのですが、それ以外のOffice製品に触れることがほぼないですね。
かつてはExcelでVLOOKとかしていたのですが、もうExcel関数ほとんど覚えていないですし、MacのNumbersとかをViewerとして使うことが時々あるのと、共有が必要な場合にGoogleスプレッドシートを触る機会があるくらいですね。
MS製品触るのは個人利用で株のポートフォリオ管理する時と、iPadでOneNoteをメモ帳代わりにするだけですね。


## 3. 正しさの担保が難しい
これはこの業界ならではだと思うのですが、入力に対して出力が一意に決まらないものを作ることや、アプリというよりアルゴリズムを構築するという世界になるので、間違えに気づきにくかったり、そもそも絶対的な正解が存在しないことも多い仕事になります。
間違えて実装していてもそれなりに精度が出てしまうことがあれば、その逆も然りだったりします。
技術職というより、研究に近い毛色が強い仕事なので、正しさとか、期限の中でどこで折り合いをつけるか？とか悩むことが多い仕事だなとは感じます。


# これからについて
しばらくはこのまま機械学習エンジニアを継続することになると思うのですが、先についてはわからないですね。
上にも書いたのですが、意外と総合的格闘技的な要素が強い職業なので、どこかのタイミングでエンジニアに吸収されたりアナリストやビジネス寄りの分野に移行することになるのかなとボヤっと思っていたりします。
元々全然手を動かさない仕事をしていた年数が長いのに、今はML業界にいるくらいなんて、
今後のキャリアなんてわからないと思います。