人工知能の基礎(全15回)
大学で使用した自作の資料等を,手直しの上公開している. クリエイティブ・コモンズ BY NC SA.
【目次】
- aa-1. データサイエンス・AIでできること、社会の変化(人工知能社会の到来、最新の技術、産業の変化、社会や生活の変化など)
- aa-2. データサイエンス・AIの事例、技術(散布図、データの分布や密度、AIによる分類や特徴抽出や生成など)
- aa-3. 実データによるデータサイエンス・AIの演習(オープンデータ、政府統計データ、クロス集計表、相関
- aa-4. 機械学習,ニューラルネットワーク
- aa-5. 深層学習(ディープラーニング)
- aa-6. 画像分類システム
- aa-7. 学習と検証,学習不足,過学習,学習曲線
- aa-8. 人工知能とコンピュータビジョン
- aa-9. 遷移関数、知的なゲーム世界の実現
- aa-10. 遷移関数、探索、総当たり
- aa-11. パス、木、発見的探索
- aa-12. プロダクションシステム,知識表現,推論エンジン
- aa-13. 述語、Prolog
- aa-14. 自然言語処理
- aa-15. 全体まとめ,発展
その他の関連資料
【サイト内の関連ページ】
資料
aa-1. データサイエンス・AIでできること、社会の変化(クリックにより中身が表示されます)
スライド資料
[PDF], [パワーポイント] (同じ内容, クリックしてダウンロード), [動画]
概要
人工知能(AI)はコンピュータが知的能力を持つ技術で、思考、判断、学習などの機能を有する。 AIは医療、金融、製造、農業など幅広い分野で用いられ、仕事の補助や代行といった役割を果たす。 AIの種類には機械学習や知的なITシステムがあり、用途によって選択する。 AIによる合成や生成は偽情報の拡散や倫理的な問題を引き起こす可能性があるため、注意が必要である。 AIの技術は急激に進歩してる。AIが引き起こす社会への影響や倫理的な問題も注視が必要である。 AIの発達は人間がよりクリエイティブになるためのツールともなり得る。
演習について
以下の演習では,説明部分で学んだAIの概念を,オンラインデモを通じて体験する.各デモの結果を観察し,考察すること.
ブラウザの種類・バージョンによっては動作しない可能性もある。
習っていない言葉(例:隠れ層)などが出てくるが、将来の授業で説明予定なので心配しないでほしい。演習8から11は注意書きを確認の上で実行してほしい。
演習1. CNN 3D Visualization(Adam Harley)(機械学習・ニューラルネットワーク)
説明の「ニューラルネットワークの基本構造」に対応する演習である.畳み込みニューラルネットワーク(CNN)の内部構造を3Dで可視化し,各層がどのように入力を処理しているかを観察する.
URL: https://adamharley.com/nn_vis/cnn/3d.html
操作手順
- ページを開く(使用するWebブラウザの種類・バージョンによって動作しない場合がある)
- 左下の描画パッドに数字(0〜9)をマウスで描く
- 3D表示されたネットワークの各層のニューロンの活性化(色の変化)をリアルタイムに観察する
- 各ニューロンにマウスカーソルを合わせると,そのニューロンが何を検出しているか確認できる
- 異なる数字を描き,ネットワークの反応の違いを比較する
観察と考察
- ニューラルネットワークの入力層(画像入力)から出力層(0から9の10通りの反応)に向かって,構造が確認できるか
- 反応の有無が、画素の有無(反応がない場合には黒)になっていることが確認できるか
演習2. TensorFlow Playground(機械学習・ニューラルネットワーク)
説明の「ニューラルネットワークの基本構造」に対応する演習である.ニューラルネットワークの構造やパラメータを変更しながら,学習過程の変化を観察する.
URL: https://playground.tensorflow.org
操作手順
- ページを開く
- 画面左上の「DATA」セクションで,データセット(円形,XOR,渦巻き等)を選択する
- 必要に応じて、「FEATURES」セクションで入力特徴量(X1,X2等)を選択する
- 必要に応じて、「HIDDEN LAYERS」の「+」「-」ボタンで隠れ層の数を変更する.各層のニューロン数も「+」「-」で変更できる
- 画面上部の再生ボタン(▶)をクリックして学習を開始する
- 学習が進む様子と,出力領域の色分けの変化を観察する
- Learning rateやActivation関数を変更し,学習結果の違いを比較する
観察と考察
- 渦巻き型のデータを正しく分類するには,どのような構造が必要か
演習3. PathFinding.js Visual(知的なITシステム)
説明の「探索による問題解決」に対応する演習である.探索アルゴリズムが経路を見つける過程を可視化し,コンピュータによる探索の仕組みを理解する.
URL: https://qiao.github.io/PathFinding.js/visual/
操作手順
- ページを開く
- グリッド上でマウスをドラッグして壁(障害物)を配置する
- 緑色のノード(スタート地点)と赤色のノード(ゴール地点)はドラッグで移動できる
- 画面上部のドロップダウンからアルゴリズム(A*,BFS,DFS等)を選択する
- 「Start Search」ボタンをクリックする
- 探索対象のセル(水色)と最短経路(黄色)がアニメーションで表示される
- アルゴリズムを変更して,探索の仕方の違いを比較する
観察と考察
- アルゴリズムによって,探索するセルの数や順序はどのように異なるか
- 壁の配置を変えると,探索結果はどのように変化するか
演習4. DeepL(AIでできること)
説明の「自動翻訳サービス」に対応する演習である.AIによる自動翻訳の精度と自然さを体験する.
URL: https://www.deepl.com/ja/translator
操作手順
- ページを開く
- 左側の入力エリアに日本語のテキスト(例:「人工知能は,コンピュータが人間のような知的能力を持つことを目指す技術である」)を入力する
- 右側に翻訳言語(例:英語)を選択する
- リアルタイムに翻訳結果が表示される
- 翻訳言語を変更し(フランス語,中国語等),複数言語への翻訳を試す
観察と考察
- 専門用語を含む文章と日常的な文章で,翻訳の精度に違いはあるか
- 翻訳結果を再度日本語に翻訳し直すと,元の文章とどの程度一致するか
演習5. AutoDraw(Google)(AIによる合成)
説明の「人間の下書きをAIが清書する」に対応する演習である.手描きの下書きをAIが認識し,候補イラストを提示する仕組みを体験する.
URL: https://www.autodraw.com/
操作手順
- ページを開く li>最初、緑色の「Start Drawing」をクリック
- 画面左側のツールバーから「AutoDraw」ツール(魔法の杖アイコン)を選択する
- キャンバスに絵(例:猫,車,花等)を手描きする
- 画面上部にAIが推測した候補イラストが表示される
- 候補の中から適切なものをクリックすると,手描きが清書に置き換わる
観察と考察
- 下書きの丁寧さによって,候補の正確さは変わるか
- AIが正しく認識できない絵には,どのような特徴があるか
演習6. Sketch RNN VAE Demo(Magenta)(AIによる合成)
説明の「AIでスケッチを増やす」に対応する演習である.VAEにより,描いたスケッチに似たスケッチを複数生成する技術を体験する.
URL: https://magenta.tensorflow.org/assets/sketch_rnn_demo/multi_vae.html
操作手順
- ページを開く
- 画面右下のドロップダウンからカテゴリ(例:bird,cat等)を選択する
- 左側のキャンバスにお題の絵を描く
- 描き終えたら「auto-encode」ボタンをクリックする
- 右側の小さなボックスに,元のスケッチに似た(ただし同一ではない)スケッチが複数生成される
観察と考察
- 生成されたスケッチは,元のスケッチとどの程度似ているか
- 生成されたスケッチは,元のスケッチの特徴を捉えたものになっているか
演習7. GAN-play(MIT Media Lab)(AIによる合成)
説明の「手書きの線画から画像を生成する」に対応する演習である.pix2pix(GAN技術)を使用して,手書きの線画からカラー画像を生成する技術を体験する.
URL: https://mitmedialab.github.io/GAN-play/
操作手順
- ページを開く
- Step 1 のキャンバスに線画を描く(画像をアップロードすることも可能)
- Step 2 からモデル(Birds,Flowers,Cats,Shoes等)を選択する
- リアルタイムに右側にpix2pixモデルが生成したカラー画像が表示される
- 線画を修正すると,生成画像も即座に変化する
観察と考察
- 線画の精度によって,生成画像の品質はどのように変化するか
- 選択したモデルとは異なる対象の線画を描くと,どのような画像が生成されるか
ここから先は、余裕のある人向け(自分でWebカメラや画像ファイルを準備して、自力で進める人向け)である。
演習8〜11はWebカメラや画像ファイルが必要である(どちらになるかは演習によって違う).
演習8. Teachable Machine(Google)(機械学習・ニューラルネットワーク)
説明の「訓練データと学習の仕組み」に対応する演習である.自分のデータで訓練データの作成,学習,推論の一連の流れを体験する.
URL: https://teachablemachine.withgoogle.com/
操作手順
- ページを開き,「使ってみる (Get Started)」をクリックする
- 「画像プロジェクト(Image Project)」を選択し,「標準の画像モデル (Standard image model)」をクリックする
- Web カメラを使う場合には、「Class 1」の「ウエブカメラ (Webcam)」ボタンを押し,カメラで対象物(例:ペン)を映しながら「長押しして録画 (Hold to Record)」で画像を撮影する(20枚程度)
- 「Class 2」でも同様に別の対象物(例:消しゴム)の画像を撮影する
- 「モデルをトレーニング (Train Model)」ボタンをクリックし,学習が完了するまで待つ
- 「プレビュー (Preview)」パネルでカメラに対象物を映し,分類結果がリアルタイムに表示されることを確認する
観察と考察
- 訓練時に使用していない対象物を映すと,どのような結果になるか
演習9. Google Cloud Vision API Demo(AIでできること)
説明の「画像分類」に対応する演習である.画像をアップロードし,AIによるラベル付けや物体検出を体験する.
URL: https://cloud.google.com/vision/docs/drag-and-drop
操作手順
- ページを開く
- デモエリアに画像ファイルをドラッグ&ドロップする
- 「Labels」タブで,AIが画像に付けたラベル(例:Glasses 98%,Smile 95%等)を確認する
- 「Objects」タブで,画像内の物体検出結果を確認する
- 「Properties」タブで,支配的な色を確認する
- 「Safe Search」タブで,画像の安全性判定結果を確認する
- 「Faces」ボタンで表情推定結果を確認する
観察と考察
- 異なる種類の画像(風景,人物,食べ物等)で,ラベルの付き方はどのように異なるか
- 確信度(パーセンテージ)が低いラベルは,実際に正確か
演習10. Modern Face API Demo(AIでできること)
説明の「顔検知」「顔のキーポイント検出」「表情の自動判定」に対応する演習である.1つのデモで顔に関する複数のAI技術を体験する.
URL: https://modern-face-api.vercel.app/
操作手順
- ページを開き,右側で「Face Detection」を選ぶ
- 「Choose Image】をクリック。自分の顔画像をアップロードする,
- 検出された顔にバウンディングボックスが表示される
- 右側で「Landmarks」をクリック。同じように顔画像をアップロード。目・鼻・口等のキーポイントが点で表示されることを確認する
- 「Expressions」タブに切り替え,表情の分析結果(各感情の確率)を確認する
- 「Age & Gender」についても試し,推定年齢と性別を確認する
観察と考察
- 意図的に表情を変えると,表情の判定結果はどのように変化するか
- 顔の一部を手で隠した場合,検出精度にどのような影響があるか
演習11. MediaPipe Pose Estimation(Hugging Face)(AIでできること)
説明の「人体の姿勢の読み取り」に対応する演習である.人体の関節位置を検出し,骨格を可視化する技術を体験する.
URL: https://huggingface.co/spaces/hysts/mediapipe-pose-estimation
操作手順
- ページを開く
- 人物が写った画像をアップロードする。
- 検出された関節(キーポイント)が点で,関節を結んだ骨格が線で表示される
- 設定パネルでModel Complexity(モデルの複雑さ)を変更し,検出精度の違いを観察する
観察と考察
- 人物のポーズ(立位,座位,運動中等)によって,検出精度に違いはあるか
- Model Complexityの値を変えると,検出結果はどのように変化するか
aa-2. データサイエンス・AIの事例、技術(散布図、データの分布や密度、AIによる分類や特徴抽出や生成など)
【トピックス】
人工知能, データサイエンス, 表計算ソフトウエア Excel, 散布図(Excel を使用), 合計, 平均(Excel を使用), 分布, 密度(Excel を使用), 人工知能と機械学習
【概要】
データサイエンスとAIは、データ活用に欠かせない分野である。 データサイエンスはデータから有益な情報を導き出す学問で、機械学習は大量のデータからパターンを学び、未知のデータに対する予測能力を持つ。 Excelを用いてデータを視覚的に表現し分析するという実践的なスキルを身につけることも重要。 これらを理解し、実践的経験を積むことが将来の活躍につながる。
【関連するページ等】
- YouTube 動画 https://www.youtube.com/watch?v=bJjGqTGXUZI
【関連する外部ページ】
Excel ファイル(各自の演習に活用)
- 散布図: birth.xlsx
- 散布図,ヒストグラム: iris.xlsx
aa-3. 実データによるデータサイエンス・AIの演習(オープンデータ、政府統計データ、クロス集計表、相関
【トピックス】
人工知能, オープンデータ, 政府統計データ, クロス集計表(Excel を使用), 相関(Excel を使用)
【概要】
データサイエンスとAI、特にオープンデータとその利用について説明する。 オープンデータは公開されたデータで、一定の条件下で自由に利用できる。 これらは新しいビジネスやサービスの創造、コスト節約、透明性の向上に寄与する。 しかし、データの信頼性やプライバシーを確認し、著作権を尊重する必要がある。 また、オープンデータはAI、特に機械学習の重要なデータソースであり、AI研究者向けに公開されたサイトもあります。 政府統計データがどのように取得し利用されるかを示す。 そして、クロス集計表と相関の概念を紹介し、それらを使用した分析の例を見ていく。
【関連するページ等】
- YouTube 動画 https://www.youtube.com/watch?v=nV-OlL7M3fU
【関連する外部ページ】
- e-Stat は, 政府統計の総合窓口 https://www.e-stat.go.jp/
- OpenStreetMap オンラインの地図サービス https://www.openstreetmap.org/
- Citymapper.com 世界中の大都市の乗り換え案内サービス https://citymapper.com/
- 気象庁強振観測データ https://www.data.jma.go.jp/eqev/data/kyoshin/jishin/index.html
- 気象庁震度データ https://www.data.jma.go.jp/svd/eqev/data/bulletin/shindo.html
- 環境省大気汚染状況データ https://www.env.go.jp/air/osen/
- 環境省水環境総合情報サイト https://water-pub.env.go.jp/water-pub/mizu-site/mizu/kousui/dataMap.asp
- 国立がん研究センターがん情報サービス https://ganjoho.jp/public/index.html
- WikiPedia https://ja.wikipedia.org/wiki
- 政府統計データダウンロードページ https://www.stat.go.jp/data/guide/download/index.html
- Office 365 オンライン版 https://portal.office.com
Excel ファイル(各自の演習に活用)
- クロス集計表(ピボットテーブル): 32.xlsx
aa-4. 機械学習,ニューラルネットワーク
【トピックス】
人工知能, ニューラルネットワーク, ニューラルネットワークの種類, 線形近似, 最適化
【概要】
機械学習は、コンピュータがデータを使用して学習し、知的能力を向上させる技術である。 そのメリットとして、パターンや関連性を抽出し、複雑なプログラミングを省略でき、問題解決への他の手法の限界を超える可能性がある。 ニューラルネットワークは、生物の脳を模倣し、多くのユニットとその間の結合からなるネットワークであり、機械学習に広く活用されている。 自己符号化や分類、予測などの技術を利用して、データの特徴を抽出や予測結果を導くことが可能である。 また、線形近似は、データの特徴を把握する手法の一つであり、最適化は、目的関数を最小化または最大化するための調整を行う重要なプロセスである。
【関連するページ等】
- YouTube 動画 https://www.youtube.com/watch?v=yK3A4I9phu8
【関連する外部ページ】
- Office 365 オンライン版 https://portal.office.com
Excel ファイル(各自の演習に活用)
Python プログラム
最適化の用途
謝辞:https://docs.scipy.org/doc/scipy/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)
aa-5. 深層学習(ディープラーニング)
【トピックス】
人工知能, ニューラルネットワーク, ディープラーニング, ユニット, 活性化, 結合の重み, 活性化関数, 伝搬, ニューラルネットワークを用いた分類, ニューラルネットワークを用いた学習
【概要】
ニューラルネットワークは、複数のユニットが結合し、各ユニットは入力の重み付けや活性化関数の適用を行う。 構造は、層構造で全結合のものが最もシンプルで、データは入力から出力への一方向に流れ、各層のユニットは全結合される。 結合の重みやバイアスの調整により望みの出力を得る。 ディープニューラルネットワークは層が多いニューラルネットワークで、多層でも学習が成功するためのさまざまな工夫が必要とされる。
【関連するページ等】
- YouTube 動画 https://www.youtube.com/watch?v=spEQ_kztHAQ
【関連する外部ページ】
- Office 365 オンライン版 https://portal.office.com
- TensorFlow の仕組み https://playground.tensorflow.org
Excel ファイル(各自の演習に活用)
- 活性化関数: 53.xlsx
aa-6. 画像分類システム
【トピックス】
人工知能, 画像と画素, 濃淡画像のデータ, ニューラルネットワークを用いた分類, 画像分類システム, ニューラルネットワークの作成, 学習, 画像分類
【概要】
画像分類システムは、画像を特定のカテゴリに分類するもので、 手書き文字認識やパターン認識等に応用される。 画像分類は、ニューラルネットワークを使用して可能である。 ニューラルネットワークは機械学習の一種で、パターンや関連性を学習する。 画像分類システムでは、ニューラルネットワークの最終層のユニットで最も活性度の高いものを選択するという仕組みで分類が行われる。 画像分類システムは広範に活用されており、具体的な学習はTensorFlowの公式チュートリアル等を通じて可能である。
【関連するページ等】
- 手書き文字認識(Google Colaboratory) 実行結果とプログラムと説明を見るだけなら, Google アカウントは不要 https://colab.research.google.com/drive/1IfArIvhh-FsvJIE9YTNO8T44Qhpi0rIJ?usp=sharing
- YouTube 動画 https://www.youtube.com/watch?v=WYoevH_C1Is
【関連する外部ページ】
- 画像分類(TensorFlowの公式チュートリアル) 左側のメニューで「KerasによるMLの基本」を展開し, 「基本的な画像分類」をクリック 画像を10種類に分類。訓練データは60,000枚の画像と正解。検証データは10,000枚の画像と正解 https://www.tensorflow.org/tutorials
aa-7. 学習と検証,学習不足,過学習,学習曲線
【トピックス】
人工知能, 機械学習, 汎化, 汎化の失敗, 学習の繰り返し, 学習曲線
【概要】
機械学習は訓練データから学習し、未知のデータに対しても適切に処理できる「汎化」能力を持つ。 学習の過程は、訓練データでの誤差を減らすよう重み調整し繰り返すものだが、過学習となり未知データでの誤答が増える場合がある。 そのため、検証データを用いて過学習の確認が必要で、学習曲線はその一助となる。 最近の技術進展により過学習防止の技術が進展している。過学習の防止には大量データによる学習も大切である、コンピュータの高速化も一定の助けとなっている。
【関連するページ等】
- 手書き文字認識(Google Colaboratory) 実行結果とプログラムと説明を見るだけなら, Google アカウントは不要 https://colab.research.google.com/drive/1IfArIvhh-FsvJIE9YTNO8T44Qhpi0rIJ?usp=sharing
- YouTube 動画 https://www.youtube.com/watch?v=Qh-pu3Fvvuc
【関連する外部ページ】
- オーバーフィットとアンダーフィット(TensorFlowの公式チュートリアル) https://www.tensorflow.org/tutorials/keras/overfit_and_underfit?hl=ja
aa-8. 人工知能とコンピュータビジョン
【トピックス】
人工知能, コンピュータビジョン, 畳み込み, プーリング, 畳み込みニューラルネットワーク, 物体検出, セグメンテーション, 顔情報処理, 姿勢推定
【概要】
コンピュータビジョンはコンピュータが実世界を理解・活用する技術で、 画像理解、物体検出、セグメンテーションなどが重要な要素である。 ディープニューラルネットワークや畳み込みにより、これらの精度向上が進んでいる。 畳み込みはデータとカーネルを重ね合わせて一つの値にまとめる手法である。 コンピュータビジョンは他にもある。 顔情報処理は顔検出、顔ランドマーク、顔のコード化、顔識別などがあり、 本人確認や表情推定、年齢判定など多岐にわたり利用される。 姿勢推定は人体の姿勢をAIで把握する技術で、 状況把握、行動予測、行動検知、危険察知などに応用される。
【関連するページ等】
- 畳み込みニューラルネットワーク, 学習, 検証, 学習曲線について https://colab.research.google.com/drive/18IPPkY96Oc6jkYD2su4cFgWcoYAskLo_?usp=sharing
- YouTube 動画 https://www.youtube.com/watch?v=8e6YqUl32gQ
【関連する外部ページ】
- CNN Explainer ジョージア工科大学 Polo Club 畳み込み層などの仕組みをビジュアルに学ぶことができるサイト https://poloclub.github.io/cnn-explainer/
- OneFormer のデモサイト 画像のセグメンテーション https://huggingface.co/spaces/shi-labs/OneFormer
- コンピュータビジョンのデモサイト https://cloud.google.com/vision/docs/drag-and-drop
aa-9. 遷移関数、知的なゲーム世界の実現
【トピックス】
人工知能の種類、知的なゲームのルール、状態空間表現
YouTube 動画: https://www.youtube.com/watch?v=ftSktLFJ3y4
- 知的なゲームのルール,コンピュータプレイヤーがゲームに参加,状態空間表現
- 知的なゲーム(ゲームのルールと勝利条件が定まっているもの)で, コンピュータが,ゲームのプレイヤーになる.
- そのための基礎として「状態空間表現」という方法を使い,コンピュータでもゲームのルールを扱えるようにすることを学ぶ.
- 9-3. ゲームのルールのプログラミング
【関連する外部ページ】
OnlineGDB の URL: https://www.onlinegdb.com/
右上の「language」で「Python 3」を選ぶこと.
プログラムの実行開始は「Run」,実行停止は「Stop」
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- 9-4. コンピュータ・プレイヤーがゲームに参加
GDB online: https://www.onlinegdb.com/右上の「language」で「Python 3」を選ぶこと.
プログラムの実行開始は「Run」,実行停止は「Stop」
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)aa-10. 遷移関数、探索、総当たり
【トピックス】
総当たり、総当たりのパス、状態空間表現での総当たり、パスと木、Python による総当たり
YouTube 動画: https://www.youtube.com/watch?v=o_Ms27QaSsg
この回で学ぶこと.- 総当たりにより,正解を探索する.
- 総当たりは「正解を確実に探索できる方法」とも考えることができる.
- 状態空間表現(世界の状態が変数で表されている)でのルールをもとに 変数値を変化させてゴール(目的とする変数の値)に至ることを探索.
- 10-4. 状態空間表現での総当たりをコンピュータで動かす
GDB online: https://www.onlinegdb.com/
右上の「language」で「Python 3」を選ぶこと.
プログラムの実行開始は「Run」,実行停止は「Stop」
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))- 10-6. 2つの水差しを総当たりで扱う
GDB online: https://www.onlinegdb.com/右上の「language」で「Python 3」を選ぶこと.
プログラムの実行開始は「Run」,実行停止は「Stop」
Python プログラムのソースコード
パスの長さ 2 で,総当りで調べるプログラム
- 2つの水差し(4リットルと,3リットル).
- 初期状態: x=0, y=0
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))- 10-6. 2つの水差しを総当たりで扱う
パスの長さ 3 の総当りにより,ゴール状態にできるかを調べるプログラム
- 2つの水差し(4リットルと,3リットル).
- 初期状態: x=0, y=0
- ゴール状態: x=3, y=0
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))aa-11. パス、木、発見的探索
YouTube 動画: https://www.youtube.com/watch?v=72AKU8Nh8tY
この回で学ぶこと- パス,木,グラフは,情報を見通し良く扱えるための考え方
- 総当たりはすべての経路(パス)を試すもの.経路 (パス)の情報を見通し良く扱うには,木が有効.
- 探索は,木の中のスタートの場所と,ゴールの状態 を指定して経路(パス)を探す.
- 探索は,正解に至る経路(パス)があるのであれば,必ず経路(パス)を見つけることができる.
- 探索には,種々の方法があるが,正解に至る経路(パス)があるのであれば,必ず経路(パス)を見つけることができることに変わりはない.
外部ページへのリンク(作者に感謝します).- VisuAlgo の URL: https://visualgo.net/ja
最小全域木を選ぶ.全域木は,グラフの全ノードを網羅する木
- qito.github.io の URL: https://qiao.github.io/PathFinding.js/visual/
迷路作成,A* 法と総当たりでの迷路探索の違いを見る
- https://www.growingwiththeweb.com/projects/pathfinding-visualiser/
- パスと木
aa-12. プロダクションシステム,知識表現,推論エンジン
YouTube 動画: https://www.youtube.com/watch?v=72AKU8Nh8tY
この回で学ぶこと.プロダクションシステム
- 作業領域
作業領域には「知識」のデータを置く。知識は、変化するものである。 知識は、次のような形で書くことができる。
['体毛', 'ある']
['肉食', 'する']
- 推論エンジン
ルールを用いて作業領域を変化させるという推論を行う
- ルール
ルールは既存の知識から新しい知識を生み出したり、知識を変化させるためのルールである。 次のように書くことができる。
'体毛' = 'ある'→ ['種類', '哺乳類']
'種類' = '哺乳類' and '肉食' = 'する' → ['種類', '肉食動物']
- 12-1. 知識表現
m = {'x': 0, 'y': 0} print(m) - 12-2. 知識表現の例
m = {'taimou': True, 'nikusyoku': True} print(m) - 12-3 プロダクションシステム
m = {'taimou': True, 'nikusyoku': True} def rule(m): changed = False if m['taimou'] == True: m['syurui'] = 'honyurui' changed = True if m['syurui'] == 'honyurui' and m['nikusyoku'] == True: m['syurui'] = 'nikusyokudoubutsu' changed = True print('----start----') print(m) while(True): if rule(m) != True: break print('----finished----') print(m) - 12-4. 知識表現のバリエーション
m = {'ichiro': {'has': 'ball'}, 'jiro': {'has': 'none'}, 'saburo': {'has': 'none'}} print(m)別のプログラム
m = {'ichiro': {'has': 'ball'}, 'jiro': {'has': 'none'}, 'saburo': {'has': 'none'}} def rule(m): changed = False if m['ichiro']['has'] == 'ball': m['ichiro']['has'] = 'none' m['jiro']['has'] = 'ball' changed = True return changed print('----start----') print(m) while(True): if rule(m) != True: break print('----finished----') print(m)
aa-13. 述語、Prolog
今回の授業で学ぶこと.- 事実を述語の形で書くことができる.述語は,1項,あるいは,複数項の関係のこと
- john は男である
male(john). 1項
- mike は john の親である
parent(mike, john). 2項
複数項のときは,カンマで区切る
- john は男である
- 述語でのルールの例
X が Y の parent (親) ならば, Y は X の child (子供) である
child(Y, X) :- parent(X, Y).
X,Y は変数
- Prolog
Prolog では,問い合わせに対し事実との照合や推論を行う. 問い合わせでは, 値 false, trueを回答したり, 変数値 X = hanako, X = taro を回答する能力を持つ
aa-14. 自然言語処理
この回で学ぶこと- 自然言語処理
人間の言葉を、コンピュータが処理すること
- 自然言語処理の種類
- 単語の切り出し
- 品詞の判定
- 構文解析(係り受けなどの関係の分析)
- 意味解析
aa-15. 全体まとめ,発展
Python プログラムのソースコードなど
- ニューラルネットワークを作るプログラム (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]- 11. グラフと全域木
外部ページへのリンク(作者に感謝します).- VisuAlgo の URL: https://visualgo.net/ja
最小全域木を選ぶ.全域木は,グラフの全ノードを網羅する木
- 11. A*法の実演(迷路作成,A*法と総当たりでの探索の違い)
外部ページへのリンク(作者に感謝します).- qito.github.io の URL: https://qiao.github.io/PathFinding.js/visual/
迷路作成,A* 法と総当たりでの迷路探索の違いを見る
- https://www.growingwiththeweb.com/projects/pathfinding-visualiser/
- パスと木
GDB online: https://www.onlinegdb.com/右上の「language」で「Python 3」を選ぶこと.
プログラムの実行開始は「Run」,実行停止は「Stop」
m = [['x', 0], [y', 0]] print(m)- 13. Prolog の実演
外部ページへのリンク(作者に感謝します).- SWISH のページ: https://swish.swi-prolog.org/
Prolog プログラムのソースコード
human(hanako). human(taro). think(X) :- human(X).- 13. Prolog の実演(true, false を得る問い合わせ)
外部ページへのリンク(作者に感謝します).- SWISH のページ: https://swish.swi-prolog.org/
Prolog プログラムのソースコード
male(ali). female(zeyn). female(anne). parent(ali, anne). parent(zeyn, anne). child(Y, X) :- parent(X, Y).- 15. 強化学習
強化学習により,コンピュータは,迷路からの脱出に上達する.
迷路は配列(アレイ)で作っている.サイズは 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) )
人工知能デモサイトの紹介
- スタイル変換
- AutoDraw, https://www.autodraw.com/
- Variational AutoEncoder https://magenta.tensorflow.org/sketch-rnn-demo
- edges2cats: https://affinelayer.com/pixsrv/index.html
- 画像分類: https://clarifai.com/demo
- 11. グラフと全域木
- 10-6. 2つの水差しを総当たりで扱う
- 9-4. コンピュータ・プレイヤーがゲームに参加