AI勉強での恥ずかしい勘違い(1)


背景

  • 画像分類するAIを勉強しようと思い、EfficientNetを使った画像分類のデータコンペに挑戦した。しかし、大量の画像と数字ばかりで、何を作っているのかわからなくなった。

勘違いしたこと

AI開発はアプリ開発ではなかった

  • 持ったイメージ
    • 例えば、夏休みに旅行で山に行き、見慣れない昆虫を見つけた。何の昆虫か知りたくなって、昆虫を分類できる画像分類AIに画像を送り、何の昆虫か調べさせた。AIは何の昆虫か答え、その昆虫の特徴など詳しく説明してくれた。
  • 実際
    • AIは入力に対して何か結果を得ることができる。しかし、すべての機能を備えたAIは現時点で存在しない。画像を分類するAIが言葉や文字で説明したり、より詳しい情報をインターネットなどで調べるようなことはしない。1000種類の昆虫のどれに近いかを見分けるAIなら、AIがもっとも近いを考える昆虫の確率が高くなるように計算できる機能を作り出すことがAI開発

AI開発はプログラム開発ではなかった

  • 持ったイメージ
    • 例えば、分類するため画像の情報を様々にAIに抽出させたあと、そのデータを分析してAIが正しく分類できているかをチェックし、よりよい結果を返すようにプログラムに修正を加えることを考えた
  • 実際
    • AIの学習に使うデータ数は数万件。どの画像が正しく分類できなかったのか、正しく分類できなかった画像が分かったとしても、それをどのようにすれば正しく分類できるようになるのかはわからない。プログラム開発のように人間が間違いを見つけコードを修正しない。プログラムは書くが、それはAIがデータを自動学習するような仕組みをプログラムで記述する。データの与え方を変えてよりよい結果を返すようなパターンを見つける

AIを成長させる旅ではなかった

  • 持ったイメージ
    • ロープレのキャラクターを成長させるイメージを持ってしまった。例えば、何か大量のデータがあって、それを使って学習させれば、きっとAIが成長してくれる。質問にYes、Noぐらいであれば解答できる(できれば日本語で)ようなイメージを考えた。意味なくAIにデータを送り込んでもAIは成長しない(将来的には・・?)
  • 実際
    • 人が旅して成長するようなゲームの疑似体験がAI学習で得られることはない。目的がなければAIは成長しないし、画像処理や自然言語処理など研究開発された分野のみAI開発が可能。目的にあったAIモデルを選択し、準備したデータを投入するプログラムを書くことでAIを学習させることはできる。期待の機能を得る(これを成長と言う?)まで、よいデータの与え方、訓練回数など、試行錯誤は人間が行う

AI開発の具体例

アプリ開発ではなかった

  • 準備(学習)
    • フォルダに学習させたいデータと正解ラベルのセットを用意
    • データを読み込んでネットワークに投入し結果を得るまでを自動化したPythonプログラムを作成
    • 利用するネットワークのチュートリアルを読み、自身の環境で動作できるようカスタマイズする
    • 学習がうまくいっているかは評価用のデータの正解率など数値の変動を見る
  • どうなれば終わり?
    • 正解率が90%超えればOK?
    • どこまでAIが理解できたか?
    • 100%はないので、辞め時は難しい
    • 反対に性能が下がることもある
  • 試行錯誤(AIの返す数値=正解率など がどう変わるかを見る)
    • データがよくない?
      • 数万件のデータを加工するプログラムを作る
      • 良い結果が得られるデータのみを抽出
    • パラメータがよくない?
      • チューニングパラメータ(ハイパーパラメータ)を様々に変更
      • Epoch数は何回がいい?
  • 実行中はひたすら待つ
    • 行った思考錯誤の結果が得られるまでには時間が必要
    • 待ち時間減らすなら小さいモデルに切り替えるが、精度が下がる
    • GPU実行環境使って早く学習させる

プログラムでの機能開発が目的ではなかった

  • 作成したAIプログラムが正しく動作することは大前提
    • プログラムバグがあると言うことはAIが学習すらできてない状況
    • 目的のタスクを行うAI開発のスタート地点にも立っていない
    • 手を加えるのはデータ、それをプログラムのパラメータで調整する
  • データの与え方を工夫する
    • なぜ学習が進まないか(例えば正解率が上がらない)の理由は様々
      • 限られた計算リソース(CPUやGPU)や時間の中で、できる方法を試す
      • そして最適解に近づく
    • 試すこと
      • データを加工
      • 正則化
      • 転移学習 など
  • 例えると
    • 研究開発されたエンジン(AIモデル)を搭載した飛行機を操舵している
    • 暗闇で何も見えない中を、計器の数値を頼りに無事着陸できるよう操作する

AIは勝手に成長しない

  • 今作れるのは”弱いAI”
    • 何にでもなるAIを作ってるのではない
    • 何かタスクを決めて、それに特化した機能を発揮するAIを作っている
  • 期待の性能を発揮できるようにするには
    • 偏ったデータにならないように配慮
    • データが少ないと学習が進まないので、適切(多様性が必要)に増やす
    • データ多くても時間かかる。適度を見極める
    • 自分で考えられる手段を試し終わったら、あきらめる
  • ロープレで例えると
    • 物語を解き明かすような取り組み。試行錯誤で設定したゴールに近づく
    • 計算リソースを性能の高いGPUにレベルUPさせるような感じか・・(成長と言うよりお金をかけるだけど)


Posted by futa