はじめに

近年、人工知能は世界中で幅広く使われています。また最近では、全大学生に人工知能の基本を理解させよ、という方針が文科省から出ています。そのため、あと3回の授業で人工知能の簡単な部分を行います。今日のコードは次の授業でも使うので、保存しておいてください。


基本的な用語

教師データ:

人工知能に対して与える学習教材のことです。問題と解答のペアで構成されます。例えば、あなたがラーメン屋さんだとして、「お店の綺麗さ」、「値段」、「味」から「繁盛するか否か」を予測する人工知能を構築したい場合は、「お店の綺麗さ」、「値段」、「味」が問題になり、「繁盛する/しない」のラベリングが解答になります。

機械学習:

機械に対して「知能」を生成させる一連の手法を指します。文字通り、機械がガリガリと勉強することを、機械学習と呼びます。機械学習によって構築された知的な判断機構のことを、人工知能と呼びます。有名どころでいうと、ニューラルネットワーク(ディープラーニング)、決定木、サポートベクターマシン、ランダムフォレスト、k-ニアレストネイバー法、ベイジアンネットワークなどがあります。

評価関数:

「人工知能の頭の良さ」を測定する関数のことです。一般に、「予測結果と実際の結果のずれ」により定義されるので、値が低いほど良い知能であることを表します。教師データ(人工知能の勉強用教材)を使って算出します。

モデルパラメータ:

人工知能の頭の中身(あるいは、人工知能の思考方法)を規定する数字の集まりのことです。モデルパラメータを変えると、人工知能の判断が変化します。一般に、機械学習により、教師データ(人工知能の学習用教材)によく正解できるパラメータを探します。パラメータの探し方として、遺伝的アルゴリズム、最急勾配効果法、モーメンタム、AdaGrad、タブーサーチなどがあります。

回帰問題とクラス分類問題

回帰問題とは、予測対象が実数値である問題を指します。たとえば、テストで何点取れるか?という予測は実数値(50点だとか、94点だとか)なので、回帰問題となります。

一方、ある特定の選択肢があり、どれが正解かを予測する問題を、クラス分類問題と言います。例えば、あるお店が「繁盛するか、しないか」を予測する問題は、二択問題なので、クラス分類問題となります。


問題1(紙に書く)

以下は、人工知能の分野では、なんと呼ぶか?

  1. 勉強を行うための教材
  2. 与えられた教材の出来具合をはかるもの
  3. 教材を解けるように勉強する行為
  4. 知能が持つ思考(考え方)を決めるもの


今日やること

今日は、エクセルを使用して、人工知能の一つであるニューラルネットワークを作ってみます(普通はエクセルでこんなことしません。pythonなど人工知能の構築が得意なプログラミング言語でやります)。

ニューラルネットワークとは:

機械学習・人工知能を実現する方法の一つです。人間の脳みその中にある神経細胞を数理的に模倣することにより生まれた手法です。最近、ニュースや新聞でよく見る「ディープラーニング」だとか、「深層学習」だとかは、主にこれをベースにしたものです。

ニューラルネットワークの数学的背景はややこしいので、理論面は授業ではやりません(もし将来、人工知能の専門家になりたい人は、暇なときに大前の研究室(30-509)に来てもらえれば教えます。人工知能が入ったwebサービスを作りたいみたいな人もきてもらえれば教えます)。

そういうわけで、コードをコピペすると動くものを下の方に用意しているので、それを写して実装してもらいます。

今回は、以下の目的を達成する人工知能を、ニューラルネットワークにより作ってみます。

  • あるお店が繁盛するのかしないのか、予測する知能を作る。
  • 入力は、「綺麗さ」「価格帯」「味」とする。
  • 「綺麗さ」「価格帯」「味」は、「0ほど悪く、1ほど良い」とする。
  • 出力は、0に近ければ「繁盛しない」、1に近ければ「繁盛する」とする。
  • 教師データとして、7件分のデータをすでに集めているものとする。

さて、これを踏まえて以下の画像を見てください。

入力側(黄色いところ):

黄色がユーザの入力緑色がプログラムの出力です。なので、黄色を入れていないのに動かないとか言わないようにしてください。

B列からE列は、教師データとなります。7つのお店が、綺麗だとか、汚いとか、価格が高いとか、味が良いだとか、そんな情報が含まれています。そして、そのお店が実際に繁盛しているのかどうかを表しています。お店1は、汚くて、価格も高くて、味も悪いお店で、繁盛していない、ということを意味しています。

人工知能は、知能ですから、勉強用の教材がなければ頭をよくすることはできません。なので、B列からE列は実際にデータを集めて、入力してあげる必要があります。

下の方にある学習回数とは、ニューラルネットワークに何回学習させるかを表すものです。好きな数字を入れてください。ただし、10億回など莫大な数字を入れると3時間くらいパソコンがうなりつづけるので、初めのうちは10回とか100回を入れます。

出力側(緑色のところ):

繁盛(予測)は、ニューラルネットワークの予測結果となります。0に近ければ「繁盛しない」、1に近ければ「繁盛する」と予測することを意味します。0.5のときは、どちらかわからない、という予測結果になったことを意味します。

評価関数は、先ほど述べたように、人工知能の頭の良さを測定した結果です。予測と実測のズレにより定義されるので、低いほど頭がいい知能であることを意味します。これが0になったとき、すべての問題を完全に正解したことを意味します。

人工知能の頭の中身は、ニューラルネットワークの考え方(思考方法)を表現する数字の集まりです。この数字が変化することで、知能の判断(すなわち、予測結果)が変わります。先ほど述べたモデルパラメータというやつです。今回のプログラムでは、評価関数を改善させるように、この値を変えていきます。皆さんも勉強すれば思考方法が変わるように、人工知能も、この値を変えると思考方法が変わります。

以下が、ニューラルネットワークの(機械)学習を行うコードです。コピペし、黄色い部分を全て埋め、ボタンを押してみてください。

Private Sub CommandButton1_Click()

    DataSize = 7
    InputDim = 3
    Dim W(4) As Double
    Dim X(7, 4) As Double
    Dim DifW(4) As Double
    Dim EstDif(7) As Double
    Dim Update(4) As Double
    
    '教師データの取得
    For i = 1 To DataSize
        For j = 1 To InputDim
            X(i, j) = Cells(i + 2, j + 1)
        Next j
    Next i
    
    '人工知能の学習回数を取得
    NumLearning = Cells(12, 3)
    
    '初期のモデルパラメータを決定
    For i = 1 To InputDim + 1
        Cells(1 + i, 8) = 0
    Next i
    
    '勉強開始
    For t = 1 To NumLearning
    
        '現在のモデルパラメータを取得
        For i = 1 To InputDim + 1
            W(i) = Cells(1 + i, 8)
        Next i
    
        '現在のパラメータによる予測結果を算出
        For i = 1 To DataSize
            Est = 0
            For j = 1 To InputDim
                Est = Est + X(i, j) * W(j)
            Next j
            Est = Est + W(4)
            Est = 1 / (1 + Exp(-Est))
            Cells(2 + i, 6) = Est
        Next i
        
        '現在のパラメータの評価値を算出
        Eval = 0
        For i = 1 To DataSize
            Eval = Eval + Abs(Cells(2 + i, 5) - Cells(2 + i, 6))
        Next i
        Eval = Eval / DataSize
        Cells(10, 6) = Eval
    
        '頭がよくなる方法を検索
        gam = 10
        For k = 1 To InputDim + 1
            W(k) = W(k) + gam
            For i = 1 To DataSize
                EstDif(i) = 0
                For j = 1 To InputDim
                    EstDif(i) = EstDif(i) + X(i, j) * W(j)
                Next j
                EstDif(i) = EstDif(i) + W(4)
                EstDif(i) = 1 / (1 + Exp(-EstDif(i)))
            Next i
            EvalTemp = 0
            For i = 1 To DataSize
                EvalTemp = EvalTemp + Abs(Cells(2 + i, 5) - EstDif(i))
            Next i
            EvalTemp = EvalTemp / DataSize
            Update(k) = EvalTemp - Eval
            W(k) = W(k) - gam
        Next k
    
        'モデルパラメータ更新(人工知能の頭の中身を変更)
        For i = 1 To InputDim + 1
            W(i) = W(i) - Update(i)
            Cells(1 + i, 8) = W(i)
        Next i
    Next t
    
End Sub


問題2(紙に書く)

  1. 学習回数を0にしたときの「繁盛(予測)、評価関数、人工知能の頭の中身」を求めてください。
  2. 学習回数を5回にしたときは?
  3. 学習回数を10回にしたときは?
  4. 学習回数を100回にしたときは?
  5. 学習回数を、あなたの学籍番号としたときは?
  6. 上の試行において、一番まともな予測結果を得ているのはどれですか?
  7. 頭の良さが0.01を下回るには、最低何回勉強すればいい?
  8. 10万回勉強させるには、あなたのパソコンではどれくらい時間がかかる?
  9. あなたは今、ある外食店を開きたいと考えているとします。このとき、「綺麗さ、価格帯、味」から「繁盛する/しない」を予測する人工知能があるとすると、どのように役立てることができそうか、自由に書いてください。

注意:「2.93 E-10」などエクセルでEが出ることがあります。これは、2.93に対し、10のマイナス10乗を掛け算する、という意味で、ほぼ0であることを意味しています。逆に、「2.93 E+10」の場合は、2.93に10の10乗を掛け算するという意味で、莫大に大きな値です、ということを意味しています。


応用問題(紙の裏に書く)

やりたい人だけやってください。まともなことを書いていれば加点します。

  1. 何から何を予測できる人工知能があると、社会に役立てられるか?(入力と出力を書くこと。例えば今回やった例では、「綺麗さ」などが入力で、「繁盛する/しない」が出力です。)
  2. 上の回答理由を書いてください。