AIエンジニアに必要なスキル

AIエンジニアになって1年以上経ったので、これからAIエンジニアになりたい人に参考になるように情報をまとめました。

まず技術スキルについて
1.機械学習
2.数学
3.バックエンド

次に技術以外の話として
4.必要な仕事環境
5.コミュニケーション
6.AIエンジニアの定義
7.未経験からAIエンジニアになる際の注意点
8.最後に

という構成で話していきます。

またこの記事を読むにあたって注意点として
<この記事が満たせること>
・AIエンジニアにとって必要なスキルがざっくりと分かる
・AIエンジニアになりたい人が目指すべきレベルの目安が分かる
<この記事が満たせないこと>
・AIエンジニアになる具体的な方法が分かる
・AIエンジニアになりたい人が絶対に満たすレベルが分かる
になります。

書いているうちに長くなったのでリラックスして読んでいただければと思います。

1.機械学習

まず、AIなので機械学習の知識が必要になります。AIは何でもできるものではなく、機械学習という技術を使って人間の作業を一部置き換えるものです。この機械学習というのが中核となり、物事の分類や予測をします。機械学習は手法がいくつもあり、一番有名なのはディープラーニングです。ただディープラーニングもメディアが取り上げて有名になった総称のようなもので、実際にはニューラルネットワークという手法になります。他には、k近傍法、決定木、ロジスティック回帰やサポートベクターマシン、さらにはベイズなど色々な手法があります。

機械学習のスキルレベルを次のような段階に分けます。
<理解のレベル>
・どんな手法があるか名前を知っている
・いくつかの手法について数式や理論を知っている
・いくつかの手法について数式や理論を他人に説明できる
・論文などを読んで最新の手法を理解できる
<プログラミングのレベル>
・とりあえずライブラリを使えばプログラミングできる
・適切な手法を選択してライブラリを使ったプログラミングできる
・ライブラリも使いつつ、独自の実装をプログラミングできる
・論文をもとに実装をプログラミングできる

このうちAIエンジニアとしては、理解のレベルは2番目の「いくつかの手法について数式や理論を知っていている」、プログラミングのレベルも2番目の「適切な手法を選択してライブラリを使ったプログラミングできる」までできると良いかと思います。
会社や仕事によるので、どのレベルで十分かを断定はできませんが一つ言えるのはサイエンティストより高いレベルを求められることはないことです。"エンジニア"というのは、サイエンティストや研究者ではないため、後述するバックエンドシステムも含め、いかに要件を満たす動くものを作れるかが問われる職業です。
サイエンティストは機械学習する前のデータを深く分析し、機械学習させた結果も深く考察します。例え精度が高くてもそれがゴールではありません。
エンジニアはデータをとりあえず機械学習させて動くことに喜びます。上手くいかなかったら(ある程度の論理立てはした上で)データを足そうとします。例え精度自体が満足するものでなくても、システム全体の要件を満たす方法を考えます。機械学習が十分でないんら、それを別の方法で補う方法(固定のルールのプログラムを書くなど)も考えてシステムとして完成を目指します。
ですので、AIエンジニアというのは機械学習という手段も検討した上で最適なものを期間内に作ることを目指します。期間内に確実に実現できるものを作るわけです。書店に並んでいるようなCNNやRNNといった基本的な(何年も前に確立された)技術の本を理解していれば良いと思います。
どちらかというと、後述するバックエンドスキルが求められる比率が多いので、機械学習については数学的理解を完璧にしていないとか最新の論文読んでないといけない訳ではないと思います。
ただし、できればですが「手法の数式や理論を他人に説明できる」については、中身の話ではなく機械学習を知らない人に機械学習を使うと何が解決できるのか抽象化して話せたら良かったりします。これについては後述の「5.コミュニケーション」でも触れます。

ということで、機械学習については、数式や理論を突き詰めすぎる必要はなく、むしろそれを業務中にしてたら、一生懸命勉強して成果は出ませんでしたになる可能性が高く、ある程度理解してライブラリを正しく使えるレベルまであれば良いかと思います。

2.数学

次に数学のスキルについてですが、参考になるサイトを貼っておきました。

ここに書いてることが一通り理解できれば十分かと思います。ただし、高校数学レベルに大学数学レベルが少し混じっていると思ってください。
そもそもなぜ数学が必要かというと、エンジニアリングのためではなく、機械学習のためです。機械学習の数式や理論を理解するためには一定の数学の知識が必要です。機械学習の数式や理論を突き詰めすぎなくても良いと同じく、数学も高校数学レベルまで理解しておけば良いと思います。機械学習で出てくる数学が全て高校レベルではないですが、高校レベルまで理解していれば自力で十分に調べたり考えたりすることができます。

高校レベルの数学についてどういうものがあるかというと
微分、行列、ベクトル、確率といったあたりになります。
これらがなぜ機械学習に必要か非常にざっくりと言うと、

・微分を使うとある瞬間に増えているのか減っているのかが分かる
 → 予測と正解の誤差を計算するのに使う
・行列を使うとデータを行と列に並べて表現できる
 → 現実の複雑なデータを、多次元配列で表現できて計算しやすい
・ベクトルを使うと方向性と大きさを表現できる
 → データとデータの性質の違いを表現できる

確率については、その基礎的な考え方は機械学習にも必要ですがどちらかというと統計モデルというものの方で必要になってきそうです。
ちょっと面白い記事を拾ったので貼ります。統計モデルは広い意味では機械学習と言えますが、前の項目で話した機械学習とは別物なのであまり気にしないで良いかと思います。気になる方は要約の部分を読んでみてください。

ここまで説明したように高校数学が分かっていれば、あとは都度必要に応じて調べることをすれば良いです。これも機械学習と同じで全部完璧に知らないとAIエンジニアになれないということではなく、自分で調べて解決できる下地があるかどうかが重要です。下地とは論理的思考と知識へのインデックスです。論理的思考は普段の勉学や仕事で鍛えるしかありませんが、知識に対しては検索するためのインデックスを頭の中に持っているかどうかが重要です。微分をちょっとでも知ってる人と、微分を聞いたこともない人では次のアクションが取れるかという点で物凄い差がつきます。(そういう意味では、高校でひたすら解かされる式の微分の計算ではなく、偏微分といった言葉の概念をまず知っておく方が重要です。)

3.バックエンド

さて、AIエンジニアにとって、実は一番大事で仕事の比率としても最も大きいのはバックエンドになります。これについて話していきます。
バックエンドというのは裏という意味で、ユーザの目に見えるWebやアプリが表であれば、目に見えないバックエンドが裏になります。裏側でデータの処理をしているシステムになります。例えばTwitterはツイートが表示されますがアプリでは並べ替えをしているだけで、実際には裏側で大量のツイートデータを保存したりアプリに返したりするバックエンドシステムが動いているのです。
一般的にWebやアプリはデバイスに依存してあまり性能が高くなく大量のデータを処理できません。なのでユーザから見えない裏側のバックエンドシステムで大量のデータを処理して、ユーザに必要なデータだけ返しているのです。

AIを支える中核の機械学習は大量のデータがあってこそ成り立つものなので

・大量のデータを集める仕組み
・大量のデータを蓄積する仕組み
・大量のデータを学習する仕組み
・大量のデータを推論する仕組み

といった仕組みが必要になり、自ずとバックエンドを作る必要があるのです。もちろん、アプリで機械学習もできますが、やれることも収益もまだ規模が小さいはずです。作った機械学習モデルをスマホやパソコンだけで動かしてビジネス活用するには限界がありますし、処理できるデータもたいした数でないはずです。比較的大きなビジネスではバックエンドシステムが必須になってくるかと思います。

ではバックエンドについて説明したところで、AIエンジニアになるために必要なバックエンドのスキルに何があるか話していきます。

バックエンドは機械学習以上に知識が多岐に渡り、下記のようになります。
・アプリケーション★★
・ミドルウェア  ★★
・データベース  ★★
・OS      ★
・ネットワーク  ★
・インフラ    ★
・セキュリティ  ★★
・アーキテクチャ設計★★★
横に★をつけましたが目安として★3つは3年以上、★2つは1年以上、★1つは触れたことがある経験が必要になります。
下の図で説明します。

バックエンドシステム

この図はコンピュータの中身のイメージです。バックエンドではサーバという単位になるので、一つ一つのサーバの中がこうなっていると思ってください。
アプリケーションは要はプログラミングです。一般的にプログラミングと言った時にここのアプリケーション(プログラムの集まり)を作ることになります。言語も様々でJavaやKotlin、PHP、Go、Rubyなどがあります。一つの言語を書けるようになるまでは多少苦労しますが、一つ書ければ他の言語もある程度似ていて書くことができるので気負う必要はないです。ただスペシャリストでもない限り、一つの言語しか書けないのはAIエンジニアとしては厳しいです。その理由は機械学習をどう使いたいかによって、柔軟にアプリケーションを変えるため、最適な言語も変わるからです。(そもそも機械学習はPythonかC++になるので一つの言語しか書きませんは通じません)。
次にミドルウェアですが、アプリケーションが外部から通信を受ける場合はそれだけでは動かないので通信を受ける仕組みが必要です。ApacheやTomcatなどになります。またアプリケーションだけではデータは長期保存できないのでMySQLといったデータベースが必要になります。昔だとミドルウェアの選定やチューニングも仕事の一つになっていましたが、近年はハードウェアの性能がぐっと上がったので、有名なものをそのまま使えば良くあまり時間をかけてやることでもないでしょう。ただし、データベースに関してはMySQLなどのRDBにするのか、CassandraなどのNoSQLにするのかは検討することもあるので違いを多少知っておくべきです。
OSはLinuxが主なので、少なくともLinux上でコマンドを打ったことがある経験は必須、できれば自力で調べてパッケージをインストールしたり、コマンドでのファイル操作・文字列操作ができるとベターです。
ハードウェア、ネットワークについては今はクラウドサービス(AWSなど)が全部用意してくれるのであまり知らなくても大丈夫です。
セキュリティはこの図にはありませんが、例えばユーザの個人情報を扱うなどのsensitiveなシステムになると必須です。
最後にアーキテクチャ設計ですがこれは家を建てる時の全体の設計図を作るようなものです。コンピュータ(実際にはサーバ)に置き換えると、OSは何で、どこに何台置いて、経路はこうなって、ミドルウェアはTomcatを使って、プログラムはJavaで書いて、データはMySQLに蓄積するようにして…と今まで上げたスキルのどれも駆使して行うものです。これを誰かが最初に決めないと、バラバラで作ったものが動くことはできません。たいていはチームの中で一番経験のある人が作るので、自分で全部できなくても良いですができあがった全体設計図は理解しておくのは重要です。このアーキテクチャ設計に関わった経験があるかないかで、AIエンジニアとしての幅を大きく変えることを知っておくべきです。もし誰かから「AI作りたいんだけどシステムどうする?」と聞かれて「Javaでプログラムを書きます」としか言えなかったら話が進まないですよね。

少しバックエンドのハードルを上げすぎたと思うので補足します。
AIエンジニアもどのポジションを目指すかで必要なバックエンドスキルは変わります。ここまでバックエンドで話したことは、比較的リーダーポジションに近い人に要求されるスキルです(実際リードする存在であればもっと経験年数やスキルは必要でしょうが)。ですので、そうでないポジションであればアプリケーションのスキルしかなくても、機械学習のスキルと掛け合わせてAIエンジニアとして仕事できます。
ただAIのシステム開発という特性を考えた時にバックエンドができるだけ広くできた方がよく、その理由として「AIの導入実績がある会社が少ないので、プロジェクトの立ち上げメンバー、もしくは立ち上げ時に幅広く仕事できるメンバーが求められる」からです。
仮にバックエンドの経験がなくても、機械学習という一芸に秀でていれば機械学習を作る役割として働き始め、ゆくゆくバックエンドに詳しくなっていくこともできるかと思います。

バックエンドは10~20年前はそれだけで役割分担するほどタスクがたくさんありましたが、今はAWSやGCPといったクラウドサービスがありサーバを立てて開発することが段違いに簡単になりました。ですので、新人でもすぐに開発に取り掛かれますし1年ぐらいバックエンドをしっかりと経験すれば、AIエンジニアも目指せるかもしれません。その際に気をつけることは、システムの全体感を知ること・知れる立場に居ることです。アプリケーションだけ頑張りましたでは1年どころか3年でもAIエンジニアとしては頼りない印象を与えると思います。

余談ですがJavaなどのプログラミングには切っても切り離せない「オブジェクト指向」という概念があります。これだけで1冊の本が何種類も出ているぐらいの重要な概念になります。結構前は必ず勉強する概念でしたが、最近は薄れてきている気がします。思うに

・フレームワークによる構築が主流になっている(ゼロから設計する必要がないし、チュートリアルなどに沿ってオブジェクト指向で書ける)
・必要な知識が莫大に増え、一つの知識を伸ばせば良い時代が終わった

ことから、オブジェクト指向をじっくりやる必要性と時間がなくなってきている気がします。新卒でも最低限、クラスとメソッドや変数のスコープなどは知っておいて論理的思考ができればフレームワークや先輩のコードに沿って、オブジェクト指向ぽくプログラミングできたりします。ですので、アプリケーションの経験値を積むのにオブジェクト指向の本を勉強しすぎる必要はない気がします。オブジェクト指向に限らずバックエンドは、本で勉強しすぎるより、なるべく手を動かした方が良いです。アプリケーションでいえばフレームワークが、OS・ハードウェアで言えばAWSがある程度のことをしてくれますので、それに慣れて後から必要なことを本を学ぶのでもいいかもしれません。AIエンジニアに必要なスキルを考えたときにバックエンド以外にも機械学習スキルの習得、必要に応じて数学の勉強と、悠長に腰を据えて一つに取り組むとはいかないのかなと思います。(もちろん学生など時間のあるうちは一つをしっかり勉強することでそれだけで武器になります。社会人になると、時間がないので一旦全体を把握して必要なところだけ深掘りするしかありません)

最後にバックエンドでなきゃいけないのかということについて少し話すと、バックエンド以外に機械学習を実現する仕組みとして
・Web
・アプリ
・IoTデバイス
があり、Webで言えばTensorflow.jsなどで機械学習を動かすことができますし、アプリならCoreML、IoTデバイスならTensorflow Liteや単純にLinuxOSをインストールすればバックエンドと同じように機械学習もできます。
共通して重い処理や大量データの蓄積はできませんが、仕事によってバックエンドでなくても良いならこのあたりのスキルが代わりに必要でしょう。

さて、ここまで必要な技術スキルについて、持てる経験・知識の限りを話させていただきました。
普段はYoutubeの方で発信をしているのでそちらもチェックしていただけると嬉しいです。

またこの後の有料コンテンツを買っていただけると、技術以外の周辺話や未経験からAIエンジニアになる注意点なども読めるのでよろしければご購入ください。私の励みにもなります。
Youtubeの方では本記事を動画用にアレンジして分割した上で最後まで話す予定ですので(2020年3月以降順次)、そちらもチェックしていただければと思います。

ここから先は

4,080字

¥ 290

この記事が気に入ったらサポートをしてみませんか?