はじめに
Googleの「Teachable Machine」は、画像や音声、ポーズなどを使って、かなり手軽に機械学習モデルを作れるWebサービスです。
画像分類なら、
- 「グー」の画像を登録
- 「チョキ」の画像を登録
- 「パー」の画像を登録
- モデルを学習
これだけで、Webカメラに映した手を分類できるようになります。
使うだけなら簡単なんですが、
「なんでこんなに簡単に学習できるんだろう?」
と考えてみると、ニューラルネットワークの基本がけっこう詰まっています。
この記事では、Teachable Machineの画像分類を例に、裏側で何をやっているのかをざっくり分解してみます。
1. Teachable Machineは何をしてる?
画像分類をかなりシンプルにすると、こんな流れです。
画像
↓
特徴を取り出す
↓
分類する
↓
グー / チョキ / パー
これをもう少し機械学習っぽく書くと、次のようになります。
入力画像
↓
ニューラルネットワーク
↓
特徴抽出
↓
分類
Teachable Machineは、この一連の処理をほぼ全部隠してくれています。
そのため、ユーザー側は
画像を登録
↓
学習
↓
完成
という操作だけで済みます。
では、この中で実際に何が起きているのか、順番に見ていきます。
2. 画像をクラスごとに登録する
最初に行うのは、分類したい画像をクラスごとに登録することです。
例えば、
グーの画像 → Class 1
チョキの画像 → Class 2
パーの画像 → Class 3
という形で画像を分けていきます。
このとき、単に画像を渡しているだけではありません。画像と一緒に、それが何を表す画像なのかという正解ラベルも渡しています。
画像 + 正解ラベル
このように、正解を付けたデータを使って学習する方法が教師あり学習です。
つまり、Teachable Machineではあまり意識しないうちに、クラスごとに画像を登録することで、自分で教師データを作っていることになります。
3. 画像はただの数字
では、登録した画像をコンピューターはどのように見ているのでしょうか。
人間なら画像を見て、
指が2本出てるからチョキ
のように判断できます。
一方、コンピューターから見ると、画像は数字の集まりです。RGB画像なら、各ピクセルがR・G・Bそれぞれの値を持っています。
そのため、ニューラルネットワークに最初から「手」や「チョキ」が見えているわけではありません。大量の数値を受け取り、そこから分類に使えそうな特徴を見つけていきます。
4. 画像認識とCNN
画像から特徴を見つける処理で、よく使われるのが**CNN(畳み込みニューラルネットワーク)**です。
CNNは、画像全体をいきなり理解しようとするのではなく、画像の一部分を見ながら特徴を拾っていきます。
その結果、ざっくり言えば、
線
↓
エッジ
↓
模様
↓
形
のように、単純な特徴から少しずつ複雑な特徴を扱えるようになります。
浅い層では線やエッジのような単純な特徴を扱い、深い層に進むにつれて、より抽象的な特徴を扱うようになる、くらいの理解でまずは十分です。
5. 特徴抽出って何?
CNNなどのニューラルネットワークに画像を入力すると、画像の特徴は内部で数値として表現されます。
イメージとしては、
画像
↓
ニューラルネットワーク
↓
[0.12, -0.81, 0.34, 0.92, ...]
のような形です。
この数値のまとまりは、特徴ベクトルとして扱われます。
つまり、画像をそのまま分類するのではなく、いったん分類に使いやすい数値の形へ変換してから、その特徴を使って分類するわけです。
画像
↓
特徴に変換
↓
その特徴を使って分類
この「分類に使う特徴」自体を、データから学習できるのがディープラーニングの大きな特徴の一つです。
6. なんであんなに学習が速いの?
ここまでの話だけを見ると、画像から特徴を見つけるだけでも、かなり大変そうに思えます。
実際、Teachable Machineを触ると、かなり少ない画像でも短時間で学習できます。ここ、少し不思議ですよね?
ニューラルネットワークをゼロから学習するなら、本来はもっと大量のデータや計算量が必要になるはずです。
それでもTeachable Machineが速く動く理由の一つは、
すでに学習済みのモデルを使っているから
です。
7. 事前学習済みモデル
画像から特徴を見つけるところまで、毎回ゼロから学習する必要はありません。
あらかじめ大量の画像で学習したモデルを使えば、
大量の画像
↓
事前学習
↓
画像の特徴を取り出せるモデル
という形で、特徴を取り出すための部分を再利用できます。
あとは、そのモデルが取り出した特徴を使って、
グー
チョキ
パー
を分類できるように学習すればよいわけです。
このように、すでに学習済みの部分を利用することで、少ない画像でもそれなりに動くモデルを作れます。
8. 転移学習
このように、すでに学習した知識を別の問題に利用することを転移学習と呼びます。
一般的な画像で学習したモデルなら、
- 輪郭
- 模様
- 形
- 質感
など、画像を扱うための基本的な特徴をすでに学習しています。
そこで、その知識をグー・チョキ・パーの分類にも利用します。
大量の画像で学習
↓
学習済みモデル
↓
特徴抽出
↓
少量の自分のデータ
↓
分類
この仕組みがあるため、Teachable Machineでは、少ないデータでも分類モデルを作りやすくなっています。
9. ファインチューニングとは少し違う
転移学習と一緒によく出てくるのがファインチューニングです。
どちらも学習済みモデルを利用しますが、モデルをどこまで調整するかに違いがあります。
ざっくり分けると、
転移学習
学習済みモデルの知識を別の問題で使う
ファインチューニング
学習済みモデル自体も、新しいデータに合わせて調整する
という違いです。
転移学習
├─ 学習済みモデルを特徴抽出に使う
└─ 学習済みモデルも追加学習する
↓
ファインチューニング
つまり、ファインチューニングは、転移学習の中でも学習済みモデルの一部または全体を追加で調整する方法だと考えると分かりやすいです。
10. わざと変な学習をさせてみる
ここまでの仕組みを実感するには、あえて変なデータで学習させてみるのも面白いです。
例えば、
ペットボトル → 白い机
スマホ → 黒い机
という組み合わせだけで学習させます。
この状態で、今度は背景を入れ替えて、
ペットボトル → 黒い机
スマホ → 白い机
のような画像を見せると、急に間違えることがあります。
物体そのものではなく、背景の違いを手がかりにして学習していた可能性があるからです。
モデルの中では、実際には次のような関係を覚えていたのかもしれません。
白い背景 → ペットボトル
黒い背景 → スマホ
11. AIはこっちの意図を知らない
人間としては、
ペットボトルとスマホの形を見てほしい
と思ってデータを用意しています。
しかし、モデルはその意図を知りません。
背景だけを見ても正解できるなら、モデルにとっては、背景を使って分類することも十分に合理的です。
つまり、
モデルが何を見て判断しているかは、こちらの想像と同じとは限りません。
このことが、学習データの集め方が大事になる理由の一つです。
12. 学習データで正解できればOKではない
ここで、学習した画像に対する正解率だけを見てしまうと、別の問題が起きます。
学習に使った画像で99%当たっていても、初めて見る画像で全然当たらなければ、実際には使いにくいモデルです。
大事なのは、
未知のデータでもちゃんと当たること
です。
このように、学習していないデータに対しても正しく予測できる性質を汎化と呼びます。
逆に、学習データに合わせすぎた結果、未知のデータに弱くなるのが過学習です。
そのため、実際の機械学習では、データを次のように分けて性能を確認します。
訓練データ
検証データ
テストデータ
学習に使うデータと、学習の途中や最後に性能を確認するデータを分けることで、未知のデータに対しても使えるモデルかどうかを確かめます。
13. Teachable Machineが簡単な理由
ここまでの内容を、Teachable Machineでの操作に沿ってまとめると、次のようになります。
画像を登録
↓
教師データを作る
↓
学習済みモデルで特徴抽出
↓
自分のクラス向けに分類
↓
予測
Teachable Machineは、この流れに
- GUI
- 事前学習済みモデル
- 転移学習
- ブラウザ上の機械学習環境
を組み合わせています。
その結果、モデルの内部で行われている複雑な処理を意識せずに、画像の登録と学習だけで試せるようになっています。
なので、
AIが簡単なのではなく、簡単に使えるように作られている
という方が近いです。
14. G検定の内容とつなげると
ここまで出てきた言葉は、G検定でもよく登場します。
Teachable Machineで行っていることと対応させると、次のように整理できます。
画像をクラスごとに登録
↓
教師あり学習
画像から特徴を取り出す
↓
CNN
↓
特徴抽出
学習済みモデルを使う
↓
事前学習
↓
転移学習
学習データに合わせすぎる
↓
過学習
未知のデータでも当てる
↓
汎化
G検定では、それぞれ別の用語として登場します。
ただ、Teachable Machineという一つの例に沿って見ていくと、これらの言葉がどの処理と関係しているのかをまとめて理解しやすくなります。
特に、
入力
↓
特徴抽出
↓
分類
という流れを頭に置いておくと、CNNや転移学習も整理しやすくなります。
まとめ
Teachable Machineを分解してみると、画像分類の裏側には、
教師あり学習
↓
ニューラルネットワーク
↓
特徴抽出
↓
事前学習
↓
転移学習
↓
分類
という流れがあることが分かります。
さらに、ちょっと意地悪なデータで試してみると、
- 過学習
- 汎化
- データの偏り
といった現象も体感できます。
Teachable Machineを触ったときに、
「なんでこれだけの画像で動くんだろう?」
と少し中身を覗いてみると、ニューラルネットワークの仕組みもかなり見えやすくなります。