FORCIA CUBEフォルシアの情報を多面的に発信するブログ

AI開発ってなんだろう

2020.12.18

アドベントカレンダー2020 テクノロジー

FORCIAアドベントカレンダー2020 18日目の記事です。

検索プラットフォーム部 エンジニアの石川です。
2019年にキャリア入社し、それ以前はカーナビゲーションのアルゴリズム開発や自動運転技術の開発に従事していました。

ここ数年、AI(人工知能)を搭載した製品やサービスがとても増えており、エンジニアでなくともAIに興味を持つ方が増えているように感じています。
また、AIエンジニアに対する需要も増しており、AIエンジニアを目指す方も増えているようです。

今日はAIがどういうものかをあまり知らない方や、AIエンジニアを目指そうとしている方へ向けた記事を書きたいと思います。とはいっても自分もまだまだ勉強中なので、あくまで私個人の解釈と意見になります。

近年のAIというと機械学習を指すことが多いのですが、これは「コンピュータが一定のルールに基づいて大量のデータを分析して、特徴やパターンを学習する」というもので、代表的なものではスパムメールの判定やECサイトでの商品のレコメンドなどに使われています。

特にこの「一定のルールに基づいて」の部分に人間の脳の構造を模した仕組みを応用したものは深層学習(ディープラーニング)と呼ばれ、画像認識や音声認識、自然言語処理などに使われており、この数年で飛躍的に精度が向上して、人間に近い判断ができるようになってきたように思います。
その一方で、学習した結果コンピュータが内部でどのように判断したか、ということが非常にわかりにくくなってしまったという側面もあります。

ちなみにそれ以前のAIはどういったものかというと、人間が大量のデータを分析して特徴やパターンを見出してそのパターン通りに動くようにプログラムしていました。これはこれで開発者が意図した通りに動くため管理がしやすく、きめ細やかな設計をしていればむしろ高性能な面もあり、日本製品のクオリティの高さの一因でもあるので、決して古いから使えない、というものではないのです。特に乗り物の制御などの安全に関わる分野においては、動作する状況を限定的にして間違いのない判断をさせることの方が重視されるように思います。

ディープラーニングとは

ここ数年AIが注目を集めている最大の理由の一つは、上記の深層学習(ディープラーニング)の発達にあります。 先ほど説明したとおり「人間の脳の構造をコンピュータで疑似的に作り出して学習させる」ということなのですが、これだけではよくわからないと思うので、ここでは具体的に、子供に勉強させる、という例で解説してみようと思います。

さて、親が子供(幼稚園児か小学校低学年くらいの子としましょう)に色々な動物を見分けられるように教えようとする場面を想像してみてください(動物のことは知らないけど、計算はめちゃめちゃ早くて記憶力も抜群な子供です)。
親は子供のために子供部屋や学習机などの学習環境を用意して、カリキュラム(どんな教材をどのくらい、どんなふうに勉強するか)を考えて、教材として図鑑を用意します。このあとどのように勉強させるでしょうか?
ひとりで図鑑が読める子なので逐一教えなくても自分で学んでいきます。親は定期的に「これ、なーんだ」と問題を出してテストしてあげるだけです(教えるのではなく、自分で学習していくやり方は公文式に似ていますね)。

こうしてめでたく子供は動物を見分けられるようになり、正面だけでなく後ろ姿だったり体の一部しか見えなくても正解するレベルになりましたが、「なんでそう判断したの?」と尋ねても、「そう思ったからだよ」としか答えてくれず、うまく言葉で表現はできません。なので、これ以上カリキュラムやテキストをどう直したらもっとできるようになるのか親にはさっぱりわかりませんし、その子に合わせてカスタマイズしていかないとこれ以上のレベルに到達するのは無理そうです。 また、最初は楽しんで学習していた子供もあんまり「お勉強」をさせすぎると、テストでいい点とれればいいや、という考えになり丸暗記に走ってしまって応用が効かなくなることもあります(機械学習ではこれは過学習と呼ばれます)。

逐一教えなくていいのは良いのですが、この無限の可能性を秘めた子供に何をどうどこまで学習させたら良いのかは親にもわかりません。ちなみに私も一児の親ですが、ウチの子にどんな才能があるのか誰か教えて欲しいです!

AI開発とは

さて、今度は上記の話を専門用語を交えつつAI開発について説明してみます(必ずしも1対1で専門用語と結びつくわけではないので正確性を欠いているところもありますが、イメージで捉えていただければと思います)。

まず親(AIエンジニア)は子供(モデル)に何ができるようになって欲しいのかを考えます。
次に学習環境(フレームワーク)や筆記用具(ライブラリ)を用意し、その子どもの脳の特性(ニューラルネットワーク)に応じたカリキュラム(ハイパーパラメータ)を設定し、テキスト(学習データ)を用意し勉強させ、定期的にテスト(検証データ)を実施することを何度も繰り返すことで学習を進めます。

これを開発フローにすると、まずAIで解決したい課題をきちんと設定することから始まります。
次にその課題を解決するために必要な環境や道具を選定し、手に入れます。
幸い、AI開発に必要なフレームワークやライブラリの多くは無料で提供されています。
ただし、多くの種類がありますし、モデルや目的に合わせたものを選ぶ必要があります。
そして課題解決のための要となる学習・検証用のデータが必要になりますが、実際にこれを入手、作成するのが非常に大変です。
研究用に使われている学習データはたくさんありますが、あくまで研究用なので商用利用ができなかったり、それで学習したモデルに現実の問題を解かせても十分な精度がでないこともあります。
それだけでなく、自分で作成したデータはあらかじめ手作業で分類したり、学習に適した形に加工したりする必要があるので非常に手間がかかる作業です。

こうして必要なものが一通り揃ったら、実際に学習させ精度を確認します。
一度で十分な精度が出ることはほぼないので、何度何度もモデルを見直したりパラメータのチューニングをして学習を繰り返して精度を向上させていきます。

簡単にですが機械学習を用いない場合のアルゴリズム開発フローと機械学習によるモデル開発フローを図にしてみました。

flow4.png

大きな流れは変わらないのですが、機械学習ではデータの加工(学習データの作成)とモデルの学習が必要となることが特徴です(図のピンク枠の部分)。

もちろん、機械学習でない場合でもデータの加工をすることはありますが、多少データが粗かったり不足したりしていてもエンジニアのKKD(経験、勘、度胸)でロジックを直接調整できるのに対して、機械学習では学習データを介してモデルを学習させるためデータの質がモデルの精度に直結するというところが大きな違いになります(学習データの作成、加工の部分ではエンジニアのKKDを発揮することは大いにあるようです)。

エンジニアの在り方

さて、冒頭にお話したようにAIエンジニアへの需要は高まっているらしいのですが、AIエンジニアには何が求められているのでしょうか。
AIエンジニアになるためには、と調べると概ね以下の3つを学びましょうと出てきます。

  • プログラミング言語(Pythonなど)
  • 数学(統計学、微分積分、行列など)
  • 機械学習(フレームワークやライブラリ、ニューラルネットワークなど)

たしかに技術スキルとしてはこれらになるのですが、個人的には

  • AIで解決できる課題を発見すること
  • AIが解決できるレベルに課題を単純化すること

が重要だと思っており、これらはAIでは代替できないものです。
現在AIはあらゆる業界で使える道具になってきているので、趣味でも、他職種でも良いので様々な経験やバックグラウンドを併せ持つことで色々な視点から課題を解決していけるエンジニアが求められるのではないかと思います。

あくまで私見となりますが、製品やサービスの開発においてはAIについて論理的に精通していることよりも技術をうまく使いこなせることの方が大事だと思っています。

ディープラーニングが流行し始めた頃であれば、そのロジックに精通していることは重要だったかもしれませんが、今はフレームワークやライブラリもかなり使いやすくなっていますし、AmazonやGoogleのクラウド上でモデルの学習やAIによる判断も提供されていますので技術としてAIを使う敷居はかなり低くなってきたのではないかと思います。

どのような技術も、導入時と発展時ではエンジニアに求められるスキルは異なるものです。
どうしてもAIというワードが独り歩きしてしまいがちですが、AIはあくまでビジネス上の課題を解決するためのツールであるという意識で捉えてもらうと良いと思います。

最後に

AI開発について、エンジニアではない方にも理解していただけるように書いてみましたが、いかがでしたでしょうか。

今後もAIの活用は続いていくと思いますがその開発の背景には、子を想う親の気持ちが詰まっている(!?)と理解していただければ幸いです。

この記事を書いた人

石川 真生

検索プラットフォーム部エンジニア。
バーチャルマラソンはもう飽きたので、リアル大会が待ち遠しいサブ4ランナー。