渡るネットは嘘ばかり

元文系、米国大学院CS修士号持ちITエンジニア。自称エンジニアが撒き散らすゴミを少しでもキレイにしたい

AIエンジニアとソフトウェアエンジニア

AIベンチャーに入って数月が過ぎました。Qiita書いたり発表もしたんですが、いかんせんインプットが多くて、咀嚼しきれてない。アウトプットが少なくてすみません。
以前書くと言ってたNoteもそろそろ始めようと思っています。内容としては、無料版でよくあるプログラミングの入門をできるだけわかりやすく、有料版でその裏側のコンピュータ・サイエンス的な知識や原理を説明して、無料でもとりあえずコードは書けるように、有料なら一生エンジニアとして生きていく土台になるような知識や手法が身につくようにかければ、と。そこら中にある入門レベルと同じような技術書をなぞるようなプログラミング教室に行く必要ないよう、有料部分も100〜200円で販売予定です。3000円程度の本と同等の内容で10万以上取ってるところが多くて、正直、今はやっと日本も技術書のレベルが少しずつ上ってきて、すでに難しめの技術書はプログラミング教室以上の内容が書いてあることも増えてきています。言語は無料ではpython辺り、有料版では深く理解できるようCやC++も追加しようかと。需要ありそうなら、無料か会場費だけ出してもらって、初心者向けのもくもく会やってもいいんですけどね。わからないことを聞いたり、どう学んでいいかわからなければレベルややりたいことに応じて課題をあげたり、というような。

英会話とかはネイティブスピーカーと話さないと身につかない部分があるんですが、プログラミングはそういうものではないので、どうも自分の好きなプログラミングを餌に金稼ぎをしてるだけに見えてどうにかしたい気持ちが強いです。そもそも、プログラミングは初心者から踏み出すと視界が変わります(数学的要素が入った瞬間世界を表すことができるようになります)が、そういう魅力を伝える経験や技術力を持ってない人が経営してるパターンが多くて。初心者レベルなのに、少しかじっただけでプログラミングは難しくない、誰でもできるとか言ってる代表を見るとため息が出ます。そんなに浅くないぞ、と。高校から20年位いじっててもまだまだ底が見えない。むしろ、どんどん深くなっていっています。プログラミングは残酷なほどにセンスで、初心者から先はセンスか数学力かのどちらかが強く求められる。趣味として教えるならいいけど、それで即戦力とかありえないから、と思ったりするわけで、その辺がこのブログを始めたモチベーションになってたりします。

数式ベースのいわゆるコンピュータ・サイエンス的な領域だと、経験や知識が一定量あるエンジニアが本を読んでも、論文を読んでも一回で把握できない。何回か読んだり、参照実装見たり、自分でいじってみたり、土台となる論文を読んだりしてやっと理解できる。そして、理解した瞬間に一気に全体が見える。ジグソーパズルみたいです。語学もそうなんですが、一定の理解まで霧がかかってよく見えないけど、突然視界が晴れて一気にわかる。そんな感覚です。

AIベンチャーに入ってから確率変数と戦ったり、ディープラーニング系の案件にも関わっていますが、そんなこんなで今回はAIエンジニアに関するエントリーです。
AIエンジニアは年収のレンジがかなり高く、人材不足という情報もよく目にすると思います。とはいえ、実際のところ、AIエンジニアを名乗って情報発信しているAI領域のソフトウェアエンジニア(AIに特化した技術や先端AI技術の理解力はないもののAI系APIは叩ける人)やデータ分析の人がすごく多いなぁ、と思う今日此の頃。
ちょっとその辺を話したいと思います。AIエンジニア風の普通のエンジニアだと年収も普通のソフトウェアエンジニアと大差ないので、非常に情報が錯綜して、さらにそこにAIスクールが便乗して金稼ぎをしてる印象を受けます。というか、アフィリエイトのせいで、ネットのIT業界に関する情報は9割5部間違ってると言ってもいいと思います。

ちなみに、DIVE INTO CODEのAIコースがほぼほぼオライリーの本と同じ内容と気づいて吹きました。1万円ちょいを100万にする錬金術と言うか、入門書理解できない人達を機械学習エンジニアを名乗る、実態はソフトウェアエンジニアとして、AI風ベンチャーに入れられるという…。DIVE社はまともな方だと思いますけどね。特に非エンジニアが技術を知る、というレベルなら最適だと思います。ちなみに、某社はAI導入1年延期した上50億で訴えられてました…。AIコース出身ってそういうところの送り込まれてそう。ちなみに下記の本は初心者から抜け出したエンジニアなら独学で理解できます。独学で理解できない人のための教室になってるんだろうけど、一線のお金も良くて有望なAIベンチャーはソフトウェアエンジニアでも論文読んだりします。
カリキュラム↓
diveintocode.jp
オライリーの本
www.oreilly.co.jp
www.oreilly.co.jp
www.oreilly.co.jp

目次見ると内容がほぼほぼ一緒。スクレイピングがカリキュラムから消えましたが、これの1冊目を見たんだろうか。スクレイピングってデータ分析寄りで、そもそもwebサイトにとって情報は資産なので、robots.txtGoogle以外弾いたりとかしたり、データ資産を守るために、途中からログインさせてページ伸ばさないと全部表示されないところも増えましたね。webサイト作る側からするとスクレイピングってして欲しくないし、データ提供の意志があればAPI公開するのが普通です。分析でバッチで1日1回セールス系でとかならギリギリなレベルな気がするけど、普通はデータセットが提供されるか、お客さんに作ってもらったり支援したりなので、現場でスクレイピングって聞いたことないです。少なくともうちでは。どちらかというとデータ分析とか情報収集が目的な印象。機械学習だと、教師データの場合ラベルを付けないといけないので、無作為に取ってきた場合、結局ラベル付けにかなりの時間がかかるので、データセット使ったほうがいいし、スクレイピングで集めたデータはデータセットとして売れない可能性高いし…。正直、あまり魅力感じないです。

数学は、偏微分とかできないと数式わからないけど、高校レベルって書いてますね。前提だから、授業では大学レベルなんでしょうか。偏微分は高校のカリキュラムにないです。ちなみに解析学もわからないとちょっときつい気がする。ラグランジュの未定乗数法とか、KLダイバージェンス統計学か。その辺は高校では習わないはず。線形代数微積はゼロからだとそのレベルでしか出してない気はしますが。機械学習で求められる数学は大学レベルです。数学科レベルではありませんが…。大学の多くの理系学部が専門領域をやる土台になる共通の数学クラスって感じですね。

自分の肌感では、実はAI業界に関してはガッツリプログラム書いてきた人より、物理とか別の数式バリバリの領域でシミュレーション程度にプログラム書いてたとかって人の方が強いです。当然AI/機械学習を専攻してた情報工学の学生は別物です。数式とか論文(当然英語)の理解がベースになってくるので、コードの量は業務システムよりだいぶ少ないと思います。手を動かせばいいわけじゃないのがこの領域です。まぁ、理論の理解が正しいかは書いて確認して行った方がいいと思うけど。

目次

AIエンジニアに関する混乱

まずはこの記事を読んで下さい。
gendai.ismedia.jp

ここでAIエンジニアやAI企業として許容されているのはAIの技術自体を"作っている"エンジニアや企業です。これはその通りだと思っていて、AI系ライブラリを使ってAPIを叩いてるだけだったり、データをAPIを使って分析してるだけでAIエンジニアを名乗ってる人が非常に多いです。フリーランスでAIエンジニアを名乗ってる9割がAPI使いですね…。実際のところ、フリーランスで、業務委託で個人で稼げる(数式完全理解レベルと思われる)だと年収3000〜5000万いっておかしくないです。人月500万とか聞く話で。大概が依頼する側が価値基準がなくて出しちゃってる場合が多い気がしますが。こういう人は引き合いが多く、「AIエンジニアになれた理由」、的なブログエントリー書くより、技術系のことを書いてることが多いです。未経験から、文系でAIエンジニアになれた、的なことを書いてる人はアフィリエイトか、実際はAIを扱ってるところでAIの技術自体は作らずに、誰かが作ったものを使っている、いわゆるただのソフトウェアエンジニアの可能性が高いので注意が必要です。AIエンジニアを目指す人がそういう記事を見ても違うところにたどり着きます。
ちなみに今の会社ではAPIと言っても言語的に速度が実用レベルじゃないので、学習はpythonフレームワークでやって、結局のところ学習した重みデータが有れば、同じ構造で組めれば言語またいでも問題ないので、C++とかで推論はやってたりします。

データ構造とかわからないと話にならない

実務レベルの速度を出す部分ですが、C++いじるポジションだと、当然ですが、データの量が膨大なので、データ構造というかSTLを使いこなせないと結構話しにならないと思います。Eigenライブラリ使ったりもします。初心者が書いたら学習終わらない、推論が実務で使い物にならない、というのは頻発しそう。
www.amazon.co.jp
この辺熟知してる人もいます。データ量的にもアルゴリズムやデータ構造わからないとちょっとつらいですね。pythonでのサーベイ(論文の再現実験)とかだとある程度フレームワークが吸収してくれますが、英語の論文を理解して、数式からコードに変換するような能力が求められます。正直、こっちの方がデータ構造とか理解するより遥かに難易度高いです。

C++ポジションは(ちゃんとできる)人材が少ないようですが、C++をEffectiveシリーズ(技術書)とかのレベルで使えることを望まれます。C++やっててよかった(というか、Cできるからいけるだろ、とゲーム会社で使って、すごい人にレビューで鍛えられたら自然にEffective的な書き方になってた)と思ったりします。まぁ、正直言語はなんでもいいけど、最近はWebとかUI寄りよりネイティブ寄りな言語の方が楽しいです。ちなみにWeb系はUIに近づくほど修正が多くなって残業に繋がります。ここ、もう少し寄せたいね、で見せたら、寄せ過ぎだから少し戻そうか、なんてやり取りがあったり、UIはカチッと決めても画面で見たら変わることが多いので結構稼働は上がりがちです。デザインが上がってくるの待ってたら納期ギリギリできて巻き込み事故の被害にあったり…。

AI業界で必要なこと

学ぶ意欲はかなり必要だと思います。今の会社でも情報工学系の修士上がりが多いです。それでも皆毎日勉強して(会社でもできる)、どんどん知識を広げて、アンテナもすごいから新しい情報をシェアして皆で高めあっています。多分、数式は最低限何を意図しているのか位わからないと辛いです。自分で書いて解いてできるレベルの人はそこまで多くない印象。コードを書くのには、コーディング力というより、必要な技術を知っていて理解することの方が重要かもしれない。先端技術なので、基本技術はほとんど知ってる前提で書かれてるし、基本的には統計的手法をプログラムに落とすので統計的な書き方が何を意味してるのかわからないと厳しいです。つまり、社会に出た時点でだいぶ前を走ってた、速い人達がその後も結構全力で走り続けてる業界です。好きでないと怖い(皆頭良すぎ)業界なので、覚悟して飛び込みましょう。

というわけで、ただ書いてある通りに、言われた通りに実装するとかでなく、何を意図して何をする必要があるのか、ということを理解しないと実装できません。実装時間より準備時間が長いです。そういう意味でも、数式や数学的な表現に慣れてる別領域の博士とかが一線にいるのがこの業界の特徴ですね。

未経験からAIエンジニアを目指す人に対して

他の理系領域での経験がある人はガンガン挑戦した方がいいです。そういう人にはプログラミング部分教えてでも来て欲しい気持ちはあります。理系の素養がない人はまずはそこから始めましょう。システム業界でもいいから、まずはプログラミングの仕事に慣れつつ、コンピュータ・サイエンスの基礎となるアルゴリズムであったり、データ構造から始めて、同時に微積分、線形代数解析学統計学辺りの本で基礎数学力を付けて、5年後位を目指すといいと思います。今のエンジニアの半数以上が従事してる、データを変更したり加工したりして表示して出し入れするだけのコーダーの仕事はどんどん自動化が進むと思います。ただ、問題解決の領域は自動化が難しいので、そこを目指して、プログラミングコンテストとかも楽しんで、本当のプログラミングに触れていって欲しいと思います。