トップページ人工知能,実世界DB人工知能の基本(探索,知識表現,プロダクションシステム,Prolog,自然言語処理,ニューラルネットワーク)

人工知能の基本(探索,知識表現,プロダクションシステム,Prolog,自然言語処理,ニューラルネットワーク)

「人工知能の基本」では, 入門者を対象として,人工知能でできること,人工知能の仕組みを幅広く学べるようにしている.実演も交えている.実習もできる.

お断り:福山大学情報工学科で開講している授業「人工知能」の資料を、一部、手直しの上公開している。

【サイト内の関連ページ】

YouTube の再生リスト「人工知能の基本」
https://youtube.com/playlist?list=PLwoDcGBEg9WG65t7aoLki9JWAZdgauI8

資料

動画は,このページの後半にまとめている

1. 人工知能でできること,人工知能の種類,人工知能の現状,人工知能による社会の変化

[PDF], [パワーポイント]

この回で学ぶこと

外部ページへのリンク(作者に感謝します).

2. 知的なゲームのルール,コンピュータプレイヤーがゲームに参加,状態空間表現

[PDF], [パワーポイント]

この回で学ぶこと.

外部ページへのリンク(作者に感謝します).

Python プログラムのソースコード

a = 0
while(True):
    print('a = %d' % a)
    r = int(input())
    if (r == 1) and (a < 21):
        a = a + 1
    if (r == 2) and (a < 21):
        a = a + 2
    if (r == 3) and (a < 21):
        a = a + 3

Python プログラムのソースコード

def computer(a):
    if( a == 1 ):
        return 3
    elif( a == 2 ):
        return 2
    elif( a == 3 ):
        return 1
    elif( a == 5 ):
        return 3
    elif( a == 6 ):
        return 2
    elif( a == 7 ):
        return 1
    elif( a == 9 ):
        return 3
    elif( a == 10 ):
        return 2
    elif( a == 11 ):
        return 1
    elif( a == 13 ):
        return 3
    elif( a == 14 ):
        return 2
    elif( a == 15 ):
        return 1
    elif( a == 17 ):
        return 3
    elif( a == 18 ):
        return 2
    elif( a == 19 ):
        return 1
    else:
        return 0
       
def move(a, r):
    if (r == 1) and (a < 21):
        a = a + 1
    if (r == 2) and (a < 21):
        a = a + 2
    if (r == 3) and (a < 21):
        a = a + 3
       
    return a

a = 0
while(True):
    print('a = %d' % a)
    r = int(input())
    a = move(a, r)
    print('a = %d' % a)
    r = computer(a)
    print('computer: %d' % r)
    a = move(a, r)

3. 総当り,総当りのパス,状態空間表現での総当り,パスと木

[PDF], [パワーポイント]

この回で学ぶこと.

外部ページへのリンク(作者に感謝します).

Python プログラムのソースコード

import itertools
import sys
def move(x, y, r):
    success = False
    if (r == 1) and (x < 1):
        x = x + 1
        success = True
    if (r == 2) and (x > 0):
        x = x - 1
        success = True
    if (r == 3) and (y < 2):
        y = y + 1
        success = True
    if (r == 4) and (y > 0):
        y = y - 1
        success = True
    return(x, y, success)

nsteps = 3
seq = [1, 2, 3, 4]
success = False
for j in list(itertools.product(seq, repeat=nsteps)):
    x, y = 0, 0
    for i in j:
        x, y, success = move(x, y, i)
        if(not(success)):
            break

    if(success):
        print("%s %d %d" % (str(j), x, y))

Python プログラムのソースコード

パスの長さ 2 で,総当りで調べるプログラム

import itertools
import sys

def move(x, y, r):
    success = False
    if (r == 1) and (x < 4):
        x = 4
        success = True
    if (r == 2) and (x > 0):
        x = 0
        success = True
    if (r == 3) and ((x + y) >= 3) and (y < 3):
        x, y = x + y - 3, 3
        success = True
    if (r == 4) and ((x + y) <= 3) and (x > 0):
        x, y = 0,  x + y
        success = True
    if (r == 5) and (y < 3):
        y = 3
        success = True
    if (r == 6) and (y > 0):
        x = 0
        success = True
    if (r == 7) and ((x + y) >= 4) and (x < 4):
        x, y = 4, x + y - 4
        success = True
    if (r == 8) and ((x + y) <= 4) and (y > 0):
        x, y = x + y, 0
        success = True
       
    return(x, y, success)

nsteps = 2
seq = [1, 2, 3, 4, 5, 6, 7, 8]
success = False
for j in list(itertools.product(seq, repeat=nsteps)):
    x, y = 0, 0
    for i in j:
        x, y, success = move(x, y, i)
        if(not(success)):
            break
   
    if(success):
        print("%s %d %d" % (str(j), x, y))

4. パス,木,グラフ,探索,発見的探索

[PDF], [パワーポイント]

この回で学ぶこと

外部ページへのリンク(作者に感謝します).

5. プロダクションシステム

[PDF], [パワーポイント]

この回で学ぶこと.

プロダクションシステム

外部ページへのリンク(作者に感謝します).

m = [['x', 0], [y', 0]]
print(m)

6. 述語,Prolog

[PDF], [パワーポイント]

今回の授業で学ぶこと.

外部ページへのリンク(作者に感謝します).

Prolog プログラムのソースコード

human(hanako).
human(taro).
think(X) :- human(X).

Prolog プログラムのソースコード

male(ali).
female(zeyn).
female(anne). 
parent(ali, anne).
parent(zeyn, anne).
child(Y, X) :- parent(X, Y).

7. 自然言語処理,品詞,構文解析

[PDF], [パワーポイント]

この回で学ぶこと

8. 機械学習,ニューラルネットワーク

[PDF], [パワーポイント]

9. ニューラルネットワークの学習,最適化

[PDF], [パワーポイント]

10. ニューラルネットワークの基礎(訓練データ,検証データ,学習,学習不足,過学習)

[PDF], [パワーポイント]

今回説明したプログラムは,Google Colaboratory というオンラインサービスで実行できる.  (この授業では,Google Colaboratory の説明は行わない).

Google Colaboratory に慣れている人のために,次のページを作成しているので, 活用してほしい.

https://colab.research.google.com/drive/18Nf9FPFhOvx8_V30z8PdBD2kcyDap8b7?usp=sharing

このリンクをクリックすると,Google Colaboratory のノートブックが開く. そして,Google アカウントでログインすると,Google Colaboratory のノートブック内のコードを実行することができる.

11. ニューラルネットワークの使い方(作成,学習の設定,学習の実行,利用)

[PDF], [パワーポイント]

今回説明したプログラムは,Google Colaboratory というオンラインサービスで実行できる.  (この授業では,Google Colaboratory の説明は行わない).

Google Colaboratory に慣れている人のために,次のページを作成しているので, 活用してほしい.

https://colab.research.google.com/drive/1IfArIvhh-FsvJIE9YTNO8T44Qhpi0rIJ?usp=sharing

このリンクをクリックすると,Google Colaboratory のノートブックが開く. そして,Google アカウントでログインすると,Google Colaboratory のノートブック内のコードを実行することができる.

12. ニューラルネットワークによる画像分類(配列と次元,ニューラルネットワークの作成,学習の設定,学習の実行,検証,画像分類の実施)

[PDF], [パワーポイント]

13. 中間まとめ

[PDF], [パワーポイント]

動画(上の資料と同じ内容)

YouTube の再生リスト「人工知能の基本」 https://youtube.com/playlist?list=PLwoDcGBEg9WG65t7aoLki9JWAZdgauI8

1. 人工知能でできること,人工知能の種類,人工知能の現状,人工知能による社会の変化

外部ページへのリンク(作者に感謝します).

2. 知的なゲームのルール,コンピュータプレイヤーがゲームに参加,状態空間表現

3. 総当り,総当りのパス,状態空間表現での総当り,パスと木

4. パス,木,グラフ,探索,発見的探索

5. プロダクションシステム

6. 述語,Prolog

7. 自然言語処理,品詞,構文解析

8. 機械学習,ニューラルネットワーク

9. ニューラルネットワークの学習,最適化

10. ニューラルネットワークの基礎(訓練データ,検証データ,学習,学習不足,過学習)

今回説明したプログラムは,Google Colaboratory というオンラインサービスで実行できる.  (この授業では,Google Colaboratory の説明は行わない).

Google Colaboratory に慣れている人のために,次のページを作成しているので, 活用してほしい.

https://colab.research.google.com/drive/18Nf9FPFhOvx8_V30z8PdBD2kcyDap8b7?usp=sharing

このリンクをクリックすると,Google Colaboratory のノートブックが開く. そして,Google アカウントでログインすると,Google Colaboratory のノートブック内のコードを実行することができる.

11. ニューラルネットワークの使い方(作成,学習の設定,学習の実行,利用)

今回説明したプログラムは,Google Colaboratory というオンラインサービスで実行できる.  (この授業では,Google Colaboratory の説明は行わない).

Google Colaboratory に慣れている人のために,次のページを作成しているので, 活用してほしい.

https://colab.research.google.com/drive/1IfArIvhh-FsvJIE9YTNO8T44Qhpi0rIJ?usp=sharing

このリンクをクリックすると,Google Colaboratory のノートブックが開く. そして,Google アカウントでログインすると,Google Colaboratory のノートブック内のコードを実行することができる.

12. ニューラルネットワークによる画像分類(配列と次元,ニューラルネットワークの作成,学習の設定,学習の実行,検証,画像分類の実施)

13. 中間まとめ

人工知能デモサイト

プログラムのソースコードなど

ニューラルネットワーク

ニューラルネットワークを作るプログラム (Python)

import tensorflow as tf 
import keras 
from keras.models import Sequential
m = Sequential()

from keras.layers import Dense, Activation, Dropout
import keras.optimizers
m.add(Dense(units=64, activation='relu'))', input_dim=4))
m.add(Dense(units=3, activation='softmax'))'))
m.compile(loss=keras.losses.categorical_crossentropy,
          optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))

ニューラルネットワークの確認表示 (Python)

print(m.summary())

ニューラルネットワークの学習を行うプログラム (Python)


import numpy as np
x = np.array(
[[0, 0, 0, 0],
 [0, 0, 0, 1],
 [0, 0, 1, 0],
 [0, 0, 1, 1],
 [0, 1, 0, 0],
 [0, 1, 0, 1],
 [0, 1, 1, 0],
 [0, 1, 1, 1],
 [1, 0, 0, 0],
 [1, 0, 0, 1],
 [1, 0, 1, 0],
 [1, 0, 1, 1],
 [1, 1, 0, 0],
 [1, 1, 0, 1],
 [1, 1, 1, 0],
 [1, 1, 1, 1]])

y = np.array(
[0, 
 0, 
 0, 
 2,
 0,
 1, 
 0,
 0, 
 0,
 0,
 1,
 0,
 2,
 0,
 0,
 0])

m.fit(x, keras.utils.to_categorical(y), epochs=500)

ニューラルネットワークによる分類 (Python)

m.predict( np.array([[0, 1, 0, 1]]) )
m.predict( np.array([[1, 0, 1, 0]]) )
m.predict( np.array([[1, 1, 0, 0]]) )
m.predict( np.array([[0, 0, 1, 1]]) )

第1層と第2層の間の結合の重みを表示 (Python)

m.get_weights()[2]

説明資料:

最適化

謝辞:https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html のプログラムをそのまま使用しています.

import numpy as np
from scipy.optimize import minimize
def rosen(x):
    """The Rosenbrock function"""
    return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)

x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead',
    options={'xtol': 1e-8, 'disp': True})
print(res.x)

強化学習

強化学習により,コンピュータは,迷路からの脱出に上達する.

迷路は配列(アレイ)で作っている.サイズは 9 × 9. 値「1」は壁で,値「0」が通路.迷路の出口は,一番右下の「0」としている.

下のプログラムでは 200回の学習を繰り返している

強化学習による迷路脱出プログラム.「下に行くべき」のスコア算出 (Python)

import numpy as np
from scipy import *
import sys, time

from pybrain.rl.environments.mazes import Maze, MDPMazeTask
from pybrain.rl.learners.valuebased import ActionValueTable
from pybrain.rl.agents import LearningAgent
from pybrain.rl.learners import Q, SARSA
from pybrain.rl.experiments import Experiment
from pybrain.rl.environments import Task

structure = array([[1, 1, 1, 1, 1, 1, 1, 1, 1],
                   [1, 0, 0, 1, 0, 0, 0, 0, 1],
                   [1, 0, 0, 1, 0, 0, 1, 0, 1],
                   [1, 0, 0, 1, 0, 0, 1, 0, 1],
                   [1, 0, 0, 1, 0, 1, 1, 0, 1],
                   [1, 0, 0, 0, 0, 0, 1, 0, 1],
                   [1, 1, 1, 1, 1, 1, 1, 0, 1],
                   [1, 0, 0, 0, 0, 0, 0, 0, 1],
                   [1, 1, 1, 1, 1, 1, 1, 1, 1]])

environment = Maze(structure, (7, 7))
controller = ActionValueTable(81, 4)
controller.initialize(1.)

learner = Q()
agent = LearningAgent(controller, learner)

task = MDPMazeTask(environment)
experiment = Experiment(task, agent)

for i in range(200):
    experiment.doInteractions(100)
    agent.learn()
    agent.reset()
    print( np.round( controller.params.reshape(81,4)[:,0].reshape(9,9), 2) )

強化学習による迷路脱出プログラム.「右に行くべき」のスコア算出

import numpy as np
from scipy import *
import sys, time

from pybrain.rl.environments.mazes import Maze, MDPMazeTask
from pybrain.rl.learners.valuebased import ActionValueTable
from pybrain.rl.agents import LearningAgent
from pybrain.rl.learners import Q, SARSA
from pybrain.rl.experiments import Experiment
from pybrain.rl.environments import Task

structure = array([[1, 1, 1, 1, 1, 1, 1, 1, 1],
                   [1, 0, 0, 1, 0, 0, 0, 0, 1],
                   [1, 0, 0, 1, 0, 0, 1, 0, 1],
                   [1, 0, 0, 1, 0, 0, 1, 0, 1],
                   [1, 0, 0, 1, 0, 1, 1, 0, 1],
                   [1, 0, 0, 0, 0, 0, 1, 0, 1],
                   [1, 1, 1, 1, 1, 1, 1, 0, 1],
                   [1, 0, 0, 0, 0, 0, 0, 0, 1],
                   [1, 1, 1, 1, 1, 1, 1, 1, 1]])

environment = Maze(structure, (7, 7))
controller = ActionValueTable(81, 4)
controller.initialize(1.)

learner = Q()
agent = LearningAgent(controller, learner)

task = MDPMazeTask(environment)
experiment = Experiment(task, agent)

for i in range(200):
    experiment.doInteractions(100)
    agent.learn()
    agent.reset()
    print( np.round( controller.params.reshape(81,4)[:,1].reshape(9,9), 2) )

知識表現

Python プログラム

ルールのプログラム (Python)

m = [[['name', 'ichiro'], ['has', 'ball']], 
     [['name', 'jiro'], ['has', 'nil']], 
     [['name', 'saburo'], ['has', 'ball']], 
     [['name', 'shiro'], ['has', 'nil']]]
print(m)

ルールの探索 (Python)

m = [[['name', 'ichiro'], ['has', 'ball']], 
     [['name', 'jiro'], ['has', 'nil']], 
     [['name', 'saburo'], ['has', 'ball']], 
     [['name', 'shiro'], ['has', 'nil']]]

for i in m:
    for j in i:
        if j[0] == 'name':
            if j[1] == 'ichiro':
                print(i)

ルールの探索 (Python)

m = [[['name', 'ichiro'], ['has', 'ball']], 
     [['name', 'jiro'], ['has', 'nil']], 
     [['name', 'saburo'], ['has', 'ball']], 
     [['name', 'shiro'], ['has', 'nil']]]

for i in m:
    for j in i:
        if j[0] == 'has':
            if j[1] == 'ball':
                print(i)

プロダクションシステム

2つの水差しについて,総当りで調べる

パスの長さ 3 の総当りにより,ゴール状態にできるかを調べるプログラム

import itertools
import sys
nsteps = 3
goal = (3, 0)
path=[1,2,3,4,5,6,7,8]
for j in list(itertools.product(path, repeat=nsteps)):
    x, y = 0, 0
    for i in j:
        if i == 1 and x < 4:
            x, y = 4, y
        elif i == 2 and y < 3:
            x, y = x, 3
        elif i == 3 and x > 0:
            x, y = 0, y
        elif i == 4 and y > 0:
            x, y = x, 0
        elif i == 5 and (x + y) >= 3 and y < 3:
            x, y = x + y - 3, 3
        elif i == 6 and (x + y) >= 4 and x < 4:
            x, y = 4, x + y - 4
        elif i == 7 and (x + y) <= 3 and x < 0:
            x, y = 0, x + y
        elif i == 8 and (x + y) <= 4 and y > 0:
            x, y = x + y, 0
    if ( goal == (x, y) ): 
        print("%s %d %d" % (str(j), x, y))