～AIに自我を宿らせることはできるのか？～　PDCA型自立思考AI 初期アイディア

#自己紹介
皆さんこんにちは。
山中（さんちゅう）で,はちわれ猫たちと,一緒に生息しているWebエンジニア,ほげふがーです。
また,最近は自立思考型AIの仕組みを考えることが趣味になっています。
気になったら,何かコメントいただけると嬉しいです(^^
＃要約版のページ
作りました！
https://qiita.com/TiresiasGit/items/259c0b116a0c2c21f235

#～きっかけ～
僕がこの古くて新しい問題に,なぜ,取り組むようになったかというと,きっかけがいくつかあります。

  
1.漫画：アトム・ザ・ビギニング　A106くん(アトムくん)　を見て。
　かっこいい態度に感化されて←(◎ここ重要ね。)
　自己進化できる。この子の自我システム作ったウマタロウくん,すごい。

<img width="200" alt="9784864684170.jpg"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559034/f5d3bd49-630f-cb0d-017a-5e2140f860c6.jpeg">
出典元：https://www.heros-web.com/works/atom-tb/comics/

2.ドラえもんのような,人間くさいけど,優しいAIも欲しい。←(◎これも重要ね。)

3.アニメ：PsychoPass　のシビュラシステム,ラウンドロビン　を見て。
「なにこれ,かっこいい！実現できるかな？」と思ったから。(本作にある,犯罪行為加担には断固反対。)

<img width="800" alt="nuEFsgFQ1BnEhf51571934381_1571934435.jpg"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559034/e65e8f80-0452-0b9b-5a92-1f9051adf0e5.jpeg">
出典元：https://dorama-navigate.com/psycho-pass3-consideration-what-is-bifrost

4.中学のころから,慈悲を持ったAIが,国民を各パラメータで正確に分類し,公正公平に管理し,AIが国会をすべき。という思想をもっているから。(日本の国会の答弁、見るに堪えないですよね？)

この4つが,僕を取り組ませる原動力です。

#PDCA型自立思考AI　アイディア
さて,本題です。
思いついたのは,下記のデータフロー(包括的フレームワーク)です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559034/28fefe09-1256-31e1-abb1-5302559bc00a.png)
(Azureでほとんど実現できるかも？)
#理想状態テーブルと現実状況テーブル
現実世界は複雑なので,DBのテーブル同士の演算ができるRDB（SQL Server,transact-SQL,Postgresなど)が望ましい。
それぞれのテーブルは,
　いつ,
　どこで,
　だれ1が,
　だれ2に,
　何を,
　どのようする,
　なぜ,
　優先度,
　実行可能flag(初期値0:実行不可)
の列を持つ。

##処理start!
##理想状態テーブル
理想の世界を満たすための条件(状態)が羅列された上記の列をもつテーブル。

##現実状況テーブル
現実の状況が羅列された上記の列をもつテーブル。

##各列の定義
　いつ・・・タイムスタンプや予定時刻、もしくは、抽象的な時刻
　どこで・・・緯度経度の座標、もしくは、抽象的な位置
　だれ1が・・・能動的に動く人やモノの名前
　だれ2に・・・だれ1により、受動的に動く人やモノの名前
　何を・・・物体の名前
　どのようする・・・具体的方向にある、他レコードid
　　　具体的な方向に文を展開できるよう,他のレコードと紐づけていく。(デーモンのようなものがいるかも。)
　　　このとき,逆にたどれるよう,なぜ列にも,元のレコードのIDを入れておく。
　なぜ・・・抽象的方向にある、他レコードid,
　優先度・・・未検討。
　実行可能flag(初期値0:実行不可)・・・どのようにする方向へ展開した結果,目標レベルのレコードから手法のレコードへ,一貫したら,実行可能flagに1:実行可能 をたてる

#主語述語モデル文章生成＋具体化+制約文付与
上記の最新状況保存用DBの各テーブルについて,それぞれ,優先度の高い理想状態のレコード集合と,優先度の高い現実状況を取り出す。
　↓
理想状態についてどのように列のIDを再帰的に展開する。(この展開の程度は,日本語を逸脱しない程度に。,)
　↓
「理想状態は[Ａ]だが,現実状況は[Ｂ]であるから」
と,現状を表し、動作を促す1文を作成する。
　　A・・・理想状態のどのように列をたどった展開結果
　　B・・・現実状態のどのように列をたどった展開結果
がそれぞれ入る。
　↓
1文1文,生成していき,文章生成言語モデルに入力できる形に加工,集約していく。
　↓
以下を「XかつYかつZ」の形式で結合した文字列を作成する。
　・他人を絶対に傷つけないを具体化した条件(マシンの中ではペナルティで表現する)
　・他人を守る名誉欲を最大限に満たすを具体化した条件(マシンの中では報酬で表現する)
　・上記で生成したタスク1文
　

#シナリオ生成ユニット
1文から,行動シナリオを自動生成する
　例：DeepLearningのGPT-3,ALBARTなど。日本語圏で動かすなら日本語で動作する方が良い。

圧縮されたverや,逐次学習,転移学習が可能なモデルが出れば,ようやく実現可能となると思われる。2020/7/4地点では,まだそのようなモデルは出現していない。
GPT-3に関するGigazineの記事はこちら。
　https://gigazine.net/news/20200612-openai-release-api/

#実行可能タスク抽出器
生成されたシナリオを一時テーブルに最新状況保存DBと同じ形式の列で保存
　（入れた時点で,シナリオタスク,と呼称する。）
　↓
一時テーブル内のシナリオタスク1つ1つを,最新状況保存DBにある,もっとも近い状況を検索,実行可能なタスクか,不可能なタスクかを1つ1つ判定し,一時テーブルの実行可能flagを更新する

#順序決めユニット
まずは,実行順序がどうなるか？を,一時テーブル内のシナリオタスク同士のコスト計算を,何らかの関数を使って算出する。
　↓
巡回セールスマン問題(TSP)ソルバなどで,最適なパスを解かせ,算出する。

#タスク(主語+述語)を実行可能なデータやコードに変換するユニット
 算出されたパスの通りに並んでいるシナリオタスク集合があるが,このままでは日本語のレベルであるため,機械が実行できない。
　そこで,機械が実行可能なデータやコードに変換をする。
　（アクチュエータなら,送り出し量,動作角度,ヒーターなら,設定温度など,仮想空間をクロールするプログラムなら,どうクロールするか？のコードやデータなど）

#現実世界(or 仮想世界)で実行するユニット
　アクチュエータや,クローラプログラム,デーモンプログラム,など,ロボットやRPAの動作部分となる箇所へ,上記で変換されたデータやコードを受け取り,実行する

#現実世界(or 仮想世界)をセンシングするユニット
　上記での実行結果を,
　　・センサーやプローブ,検出プログラムでセンシング
　　・Azure Machine Learning やAzure Cognitive Services,AWSや,エッジPCなどでセンシングされた値を言語化
　　・行動認識機能は必須！(まだ2020/7　地点では発展途上)
 例：富士通研究所さんの行動認識AI
　　https://japan.zdnet.com/article/35146104/
#外れ値,例外値の除去ユニット
　AIやコグニティブから話はそれるが,いわゆるデータクレンジングというものである。外れ値や,例外値は,後々蓄積されるナレッジに悪影響を及ぼす危険性があるため,ここでフィルタリングしておく必要がある。

#結果を保存するDB
　現実世界や仮想世界は,結果と呼ばれる事象を,無限ともいえるようなデータ量を吐き出し続ける。
　それらをなるべく高速なDB(必要であればNoSQL)に接続し,取りこぼしのなく,新鮮なまま保存し続ける必要がある。
現実状況テーブルへ流し込み,最新の状況に更新する。

#問題分析_理想状態改善ユニット
品質管理の手法ではあるが、物事を改善するには、何がよくて、なにが悪かったか？を精密に分析する必要がある。
上記のDBで収集されたデータを、このユニットに流し込む。
改善点を導き出せるなら、手段を問わない。(因子分析やPCAやベイズ推定など...)
計算時間がかかるはずなので、非同期でバックグラウンドジョブで実行。
(Azureに都合の良い解析APIのようなものがあればうれしいと思ったり。)

得られた現実状況から、評価スコアを算出。
↓
改善点を割り出す。
↓
原因となった理想状態を特定し、可能な限り更新する。

処理start!に戻り、上記を,永遠に繰り返す。

#結局何をしていたのか？
　何をしていたかというと,端に,PDCAだったのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559034/cc8f6c00-4b91-3bf8-52e9-ef225f7851c7.png)

現状,今僕が考えた,PDCAは,リアルタイムにA(改善)をすることができないのです。したがって,暴走する危険性は十分にあります。（理想状態のDBの適切な改善方法の考察ができていない。特にgpt-3のユニットも改善方法が不明。）
まだまだ,自我と呼ぶには稚拙だと思います。
なぜリアルタイムにできないか？というと,今起きた結果に対して,どう改善したらいいか？という処理を挟んだ場合,人間だとどうなるでしょう？
常時そんな思考をすると,無数の改善候補案が導出され,それが脳内で起き,思考がぐるぐると際限なく回り続け、結果が出るまで何時間or何日もかかってしまうからです。（より良いの結果を得るため,もうしばらくお待ちください。というような職場のメールを,開発者の皆さんも見たことあるかと思います。）
いわゆる,「フレーム問題」のような状況が,十中八九起こりえるのです。
https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E5%95%8F%E9%A1%8C
そうなると,動きが停止したようになり,次の動作がリアルタイムにできなくなってしまうのです。
そこで「改善をリアルタイムにすることをやめる」という選択を,今回しました。

その場合、
　先に綿密な計画を練る(自分の頭の中の理想状態DBを完璧に近い形に仕上げる)→実行

が,僕の経験則上,最もうまく動作(仕事)を進められる,と記憶しています。
#もっといいのがあるよ！という方へ
もし,「もっといい理想的な自立思考AIができるよ！思いついた！」or「一部分だけど作れたよ！」という方がいらっしゃいましたら,コメント欄を自由に使っていただいて結構ですので,ご教授をよろしくお願いします。m(_ _)m