AI性能向上技法:ファインチューニング(優秀な成績の新社会人に、身近な仕事を教える。)

人工知能のAIと、

Eyewareのアイと、

Loveの愛を、

いっぱい過学習しながら、あれこれ忘れて、汎化性能をアゲていくディープラーニングおとうさんです。

長いけど・・長くない!! (*^▽^*)(トトロ風)

 

個人だけでなく、どのご家庭にも、立派な企業にも、どんな組織や国にも、黒歴史はあります。

でも、心配いりませんよ、暗黒の中の「光」が空間と時間をつくり、宇宙が生まれました。

知能と自我の発達は「光を感じる眼」を通しておこなわれています。

地球では「眼と網膜と神経構造」をある生物がつくり出し、

みんなそれをコピペしながら自分用につくりかえ、

いろんな生物が派生し、カンブリア紀爆発がおこりました。

我々も興味と才能で、社会の闇を照らす光になるのです!

 

宗教でしょうか? いいえ、AIの深層機械学習のファインチューニングです。(みすずちゃん風)

 

VGG16やResNet50といった、高性能なCNN網膜層を備えた深層ニューラルネットワークは、Kerasにビルトインされています。

こういう公開された既知の優れたAIを使うときは、

model. add ( なんとか層 )

でニューラルネットワークの層を積む必要すらなくなり、

from keras.applications import ResNet50
# VGG16 の場合は、 from keras.applications.vgg16 import VGG16 
...
hanako_student = ResNet50(weights='imagenet',
                     include_top=False,
                     input_shape=(32, 32, 3))

 

でOkなんす。

 

え、先人の数十年の知恵がつまった高性能AIが、Python Kerasだとコピペ2行です。

こんな簡単でいいんですか・・(´・ω・`) 

 

いいんだよ、人間だもの。(みつをさん風)

 

浮いた時間で、ResNetやVGG16がどんなものなのか、「ディープラーニングG検定」で概要をつかんだり、WEBで調べてみてくださいね。

 

さて通常のAI(ディープラーニング)では、自分で作ったモデルは何も学習はされていなくて、生まれたてのAI赤ちゃんを生成して、イチから学習を施します。

AI赤ちゃんを育てるために、大量の「学習という計算時間」がかかります。

 

ところで、このコピペコードは、「高性能画像処理AIモデル」を作成する一方で、引数のweights=’imagenet’を指定することで、すでにimagenetで画像学習をした「学習済みのAI」として生まれてきます。

いきなり「ImageNet大学で大量の画像で学習した大学生」がうちみたいな零細企業にやってくる!んです。

どんな零細な企業にも、新入社員として、優秀なAIの彼女が来るのですよ~!

 

海外テック企業では、AIやロボットをHeまたはSheと呼ぶAI従事者が多いようですが、だんだん気持ちわかってきます。

赤ちゃんから育てるのではなく、汎用的な「優等生AI」を元に、自分がやりたい仕事を出来るように付加・修正する方法に、

「転移学習」そして、「ファインチューニング」

があります。

 

画像認識のAI=畳み込みの特徴抽出層(網膜神経)+全結合層(特徴から言語で分類)となっていますが・・

彼女(hanako)をつくり、先ほどの学習済みの頭脳に、新しい身近な仕事の学習用分類層を追加しましょう。

最終的に画像を30に分類する場合、こんな感じです。(合否判定なら、最後はsigmoidですね)

hanako = models.Sequential()
hanako.add(hanako_student)
hanako.add(layers.Flatten())
hanako.add(layers.Dense(512, activation='relu'))
hanako.add(layers.Dense(30, activation='softmax'))

 

ところで、これまで学習した部分(hanako_student)の神経はそのままにしたい場合、

hanako_student.trainable = False

を入れます。

ImageNet大学でまなんだことを一切変更せずに、その後の分類の知識を付随させるわけです。

いやー、めでたし、めでたしです。

これで、大卒の優秀なAI彼女が、うちの会社で、合否判定や分類のお仕事をやってくれます。(おしまい)

 

 

 

 

 

・・・・

 

 

「もっとhanakoさんを働かせる、よいサクがございますよ、殿!」

「ふふふ、越前屋、おぬしもブラックよのぉ~」

 

学校でまなんだことの中には、実社会には、役に立たないものも交じっています。

役にたたないどころか、これからの社会においては、変更したほうが良いこともあります。

リンク先で、アインシュタインも、同じことを言っていますよ。 

古い皆さまがつくりだした正義や教育などのシステムには「権威」が内在して、彼らの考えと同じことをコモンセンスとして覚えさせ点数をつけさせようとします。

ですが、私たちは、これからの世界に、役に立つ、効率的なこと、フェアだと思われることを、「たのしいこと」として自分の環境において、実行する時間という力があるのです。

 

AIにおいても、自分でスコアをつけて、自分を高い境地へ導く、そういう「自分で評価する、自分で考えられる」「AI」は「強い」ものになりますよ。

数学や物理では、あれこれ多くを教えてもらわないほうが、自分でいろいろなものを発見したり、よりよい方法も思い浮かんだりするのですが、同じところがありますね。

立場の弱い人、若い人、知らない人に、権威や立場をもとにして、「正しさ・権威」を押し付ける人は自分の力ではなく、ダークサイドの力で強制をしようとしているのではないでしょうか。

そんな権威・教育の中からでも、自分が新しい光になろうと思えば、良いところ(楽しいところ)を取り込み、適合しないところ(楽しくないところ)は修正したり捨てていくことは出来ます。

「人類」スケールでみると、学習、自然科学というのは、そんなもんでしたよね。

AIも、そのように「学習」の深化が可能になり、「自己訂正」「汎化性能」が向上します。

 

少々脱線をしましたが、サンプルプログラムを導入した際、レイヤー名は、いろんな人がつくったサンプルのネットワーク毎に自由に決められています。ので、ちょっと調べる必要があります。こちらが参考になります。

Kerasで転移学習用にレイヤー名とそのインデックスを調べる方法

 

この場合、具体的には、’res5a_branch2a’以降のレイヤーを学習しなおすようにすると良いようです。

 

#res5a_branch2a以降は再学習の対象にする

hanako_student.trainable = True
find_layer = False
for layer in conv_base.layers:
    if layer.name == 'res5a_branch2a': 
        find_layer = True 

    if find_layer:
        layer.trainable = True
    else:
        layer.trainable = False

 

ではまた。

 

yoda.jpg

暗黒面は誰にでも、ジェダイにもあるのです。しかし、我々の知能は光の存在です。

AIはやってみる、のではなく、やるのです!

  無料の仮想計算機インスタンスが落とされても、死にはしませんよ。

  DNAにウエイトを残せば翌日別のインスタンスに復活できます。

AIのフォースとともにあらんことを。